diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
new file mode 100644
index 0000000..4b76211
--- /dev/null
+++ b/.idea/codeStyles/Project.xml
@@ -0,0 +1,56 @@
+
" + junkItem.description + "
", - "unidentified": "" - }, - "source": "Populator", - "type": "", - "quantity": 1, - "bulk": "L", - "price": 0, - "level": 1, - "attuned": false, - "equipped": false, - "equippable": false, - "identified": true, - "attributes": { - "sturdy": false, - "customBuilt": false, - "size": "medium", - "dex": { - "mod": "" - }, - "hp": { - "value": 6, - "max": "" - }, - "hardness": { - "value": "" - }, - "ac": { - "value": "" - } - }, - "modifiers": [], - "damage": { - "parts": [] - }, - "critical": { - "parts": [] - }, - "abilityMods": { - "parts": [] - } - }, - "flags": {}, - "effects": [] - }; - } -} -//# sourceMappingURL=ItemFactory.js.map \ No newline at end of file diff --git a/dist/ItemFactory.js.map b/dist/ItemFactory.js.map deleted file mode 100644 index d9bd8ce..0000000 --- a/dist/ItemFactory.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ItemFactory.js","sourceRoot":"","sources":["../src/ItemFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAExC,MAAM,OAAO,WAAW;IAEpB,eAAe;IACf,MAAM,CAAC,kBAAkB,CAAC,IAAI,GAAG,CAAC;QAE9B,IAAI,cAAc,GAAG,EAAE,CAAC;QACxB,qDAAqD;QACrD,KAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE;YAE1B,IAAI,KAAK,GAAG;gBACR,EAAC,IAAI,EAAE,KAAK,CAAC,iBAAiB,EAAE,UAAU,EAAE,IAAI,EAAC;gBACjD,EAAC,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,UAAU,EAAE,IAAI,EAAC;gBAC3C,EAAC,IAAI,EAAE,KAAK,CAAC,eAAe,EAAE,UAAU,EAAE,IAAI,EAAC;gBAC/C,EAAC,IAAI,EAAE,KAAK,CAAC,eAAe,EAAE,UAAU,EAAE,IAAI,EAAC;gBAC/C,EAAC,IAAI,EAAE,KAAK,CAAC,uBAAuB,EAAE,UAAU,EAAE,IAAI,EAAC;gBACvD,EAAC,IAAI,EAAE,WAAW,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,IAAI,EAAC;aACnD,CAAA;YAED,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,IAAI,CAAE,CAAC;SAChE;QACD,OAAO,cAAc,CAAC;IAC1B,CAAC;IAED,MAAM,CAAC,QAAQ;QAEX,IAAI,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAEzE,OAAO;YACH,MAAM,EAAE,QAAQ,CAAC,IAAI;YACrB,MAAM,EAAE,OAAO;YACf,MAAM,EAAE;gBACJ,aAAa,EAAE;oBACX,MAAM,EAAE,EAAE;oBACV,SAAS,EAAE,EAAE;oBACb,OAAO,EAAE,EAAE;oBACX,OAAO,EAAE,KAAK,GAAG,QAAQ,CAAC,WAAW,GAAG,MAAM;oBAC9C,cAAc,EAAE,EAAE;iBACrB;gBACD,QAAQ,EAAE,WAAW;gBACrB,MAAM,EAAE,EAAE;gBACV,UAAU,EAAE,CAAC;gBACb,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,CAAC;gBACV,OAAO,EAAE,CAAC;gBACV,SAAS,EAAE,KAAK;gBAChB,UAAU,EAAE,KAAK;gBACjB,YAAY,EAAE,KAAK;gBACnB,YAAY,EAAE,IAAI;gBAClB,YAAY,EAAE;oBACV,QAAQ,EAAE,KAAK;oBACf,aAAa,EAAE,KAAK;oBACpB,MAAM,EAAE,QAAQ;oBAChB,KAAK,EAAE;wBACH,KAAK,EAAE,EAAE;qBACZ;oBACD,IAAI,EAAE;wBACF,OAAO,EAAE,CAAC;wBACV,KAAK,EAAE,EAAE;qBACZ;oBACD,UAAU,EAAE;wBACR,OAAO,EAAE,EAAE;qBACd;oBACD,IAAI,EAAE;wBACF,OAAO,EAAE,EAAE;qBACd;iBACJ;gBACD,WAAW,EAAE,EAAE;gBACf,QAAQ,EAAE;oBACN,OAAO,EAAE,EAAE;iBACd;gBACD,UAAU,EAAE;oBACR,OAAO,EAAE,EAAE;iBACd;gBACD,aAAa,EAAE;oBACX,OAAO,EAAE,EAAE;iBACd;aACJ;YACD,OAAO,EAAE,EAAE;YACX,SAAS,EAAE,EAAE;SAChB,CAAA;IACL,CAAC;CACJ"} \ No newline at end of file diff --git a/dist/MainArrayRow.js b/dist/MainArrayRow.js new file mode 100644 index 0000000..5ccde06 --- /dev/null +++ b/dist/MainArrayRow.js @@ -0,0 +1,2 @@ +"use strict"; +//# sourceMappingURL=MainArrayRow.js.map \ No newline at end of file diff --git a/dist/MainArrayRow.js.map b/dist/MainArrayRow.js.map new file mode 100644 index 0000000..4d3fad2 --- /dev/null +++ b/dist/MainArrayRow.js.map @@ -0,0 +1 @@ +{"version":3,"file":"MainArrayRow.js","sourceRoot":"","sources":["../src/models/MainArrayRow.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/dist/NPCFactory.js b/dist/NPCFactory.js deleted file mode 100644 index 741d353..0000000 --- a/dist/NPCFactory.js +++ /dev/null @@ -1,383 +0,0 @@ -import { Utils } from "./utils/Uils.js"; -import { Grafts } from "./data/Grafts.js"; -import { ItemFactory } from "./ItemFactory.js"; -import { MonsterCreation } from "./data/MonsterCreation.js"; -import { BundledRaces, Races } from "./data/Races.js"; -import { Randomizer } from "./Randomizer.js"; -import { WeaponFactory } from "./WeaponFactory.js"; -export class NPCFactory { - // Produces a non-hostile NPC from a subset of races - static async makeNonHostile(options = { CR: "1/3", dynamicTokenImages: false, race: null, gender: null }) { - let actorData = { name: "Generated Actor", type: "npc" }; - let actor = await Actor.create(actorData); - let actorDescription = {}; - actorDescription["data.details.biography.value"] = "Created by Populator.
"; - await actor.update(actorDescription); - let context = { - options: options, - itemsToAdd: [], - arrays: { main: null, attack: null }, - // Skills - masterSkill: [], - goodSkill: [], - // Attacks - hasNaturalWeapons: false - }; - // Look up array - context.arrays.main = MonsterCreation.arrays.expert.main[options.CR]; - context.arrays.attack = MonsterCreation.arrays.expert.attack[options.CR]; - // Fill in details - await this.setNameGenderAndRace(actor, context); - await this.setDetails(actor, context); - await this.setAttributes(actor, context); - await this.setGrafts(actor, context); - await this.setSkills(actor, context); - await this.setWeapons(actor, context); - await this.setInventory(actor, context); - await this.setToken(actor, context); - // Add all items - let actorUpdate = {}; - actorUpdate["items"] = context.itemsToAdd; - await actor.update(actorUpdate); - } - static async setNameGenderAndRace(actor, context) { - if (!context.options.race) { - context.options.race = Randomizer.randomRace(); - } - if (!context.options.gender) { - context.options.gender = Randomizer.randomGender(); - } - let actorUpdate = {}; - var raceData; - // We stub in gnolls until they are included in sfrpg - if (context.options.race.name == "gnoll") { - raceData = BundledRaces.gnoll; - } - else { - raceData = await Utils.fuzzyFindRaceAsync(context.options.race.name); - } - // Race item - await this.clean(raceData); - context.itemsToAdd.push(raceData); - // Gender - actorUpdate["data.details.raceAndGrafts"] = context.options.gender + " " + context.options.race.name + ", grafts:"; // Grafts will be filled in as applied - // Name - actorUpdate["name"] = Randomizer.randomName(context.options.race.name, context.options.gender); - // Update actor - await actor.update(actorUpdate); - } - static async setDetails(actor, context) { - let race = Races.nonCombatantRaces[context.options.race.name]; - let actorUpdate = {}; - // Source - actorUpdate["data.details.source"] = "Populator"; - // CR - var CR = context.options.CR; - if (CR === "1/3") { - CR = (1 / 3); - } - if (CR === "1/2") { - CR = 0.5; - } - actorUpdate["data.details.cr"] = CR; - // Alignment - actorUpdate["data.details.alignment"] = Randomizer.randomAlignment(); - // Languages - var languages = ["common"]; - if (race.languages) { - languages.push(...race.languages); - } - actorUpdate["data.traits.languages.value"] = languages; - // Update actor - await actor.update(actorUpdate); - } - static async setAttributes(actor, context) { - var _a; - let array = context.arrays.main; - let actorUpdate = {}; - // Size - actorUpdate["data.traits.size"] = context.options.race.size; - // Hands - if (context.options.race.arms != undefined) { - actorUpdate["data.attributes.arms"] = context.options.race.arms; - } - // Reach - // TODO: Reach should be decided by grafts - actorUpdate["data.attributes.reach"] = 5; - // Set HP - actorUpdate["data.attributes.hp.value"] = array.HP; - actorUpdate["data.attributes.hp.max"] = array.HP; - // Set SP (should be 0) - actorUpdate["data.attributes.sp.max"] = 0; - // Set RP (should be 0) - actorUpdate["data.attributes.rp.max"] = 0; - // Set KAC - actorUpdate["data.attributes.kac.value"] = array.KAC; - // Set EAC - actorUpdate["data.attributes.eac.value"] = array.EAC; - // Set reflex save - actorUpdate["data.attributes.reflex.bonus"] = array.reflex; - // Set fort save - actorUpdate["data.attributes.fort.bonus"] = array.fort; - // Set will save - actorUpdate["data.attributes.will.bonus"] = array.will; - // Set ability modifiers - var attributes = ["cha", "con", "dex", "int", "str", "wis"]; - // We randomize which abilities are buffed - Utils.shuffleArray(attributes); - actorUpdate["data.abilities." + attributes[0] + ".mod"] = array.abilityMods[0]; - actorUpdate["data.abilities." + attributes[1] + ".mod"] = array.abilityMods[1]; - actorUpdate["data.abilities." + attributes[2] + ".mod"] = array.abilityMods[2]; - // Set initiative modifier (be dex modifier) - actorUpdate["data.attributes.init.total"] = (_a = actorUpdate["data.abilities.dex.mod"]) !== null && _a !== void 0 ? _a : 0; - // Update actor - await actor.update(actorUpdate); - } - static async setGrafts(actor, context) { - let actorUpdate = {}; - let race = context.options.race; - await this.applyCreatureTypeGraft(actor, context, race.creatureTypeGraft); - if (race.creatureSubtypeGraft) { - await this.applyCreatureSubtypeGraft(actor, context, race.creatureSubtypeGraft); - // Apply type in "An unarmed strike can be dealt with any limb or appendage. Unarmed strikes deal nonlethal damage, and the damage from an unarmed strike is considered weapon damage for the purposes of effects that give you a bonus to weapon damage rolls.
", - "unidentified": "" - }, - "source": "CRB pg. 190", - "type": "", - "quantity": null, - "bulk": "-", - "price": 0, - "level": 0, - "attuned": false, - "equipped": true, - "equippable": false, - "identified": true, - "attributes": { - "sturdy": false, - "customBuilt": false, - "size": "medium", - "dex": { - "mod": "" - }, - "hp": { - "value": 6, - "max": "" - }, - "hardness": { - "value": "" - }, - "ac": { - "value": "" - } - }, - "activation": { - "type": "action", - "cost": 1, - "condition": "" - }, - "duration": { - "value": "", - "units": "" - }, - "target": { - "value": "", - "type": "" - }, - "area": { - "value": null, - "units": null, - "shape": "", - "effect": "" - }, - "range": { - "value": null, - "units": "touch", - "additional": "", - "per": "" - }, - "uses": { - "value": 0, - "max": 0, - "per": "" - }, - "isActive": null, - "ability": "", - "actionType": "mwak", - "attackBonus": 0, - "chatFlavor": "", - "critical": { - "parts": [], - "effect": "" - }, - "damage": { - "parts": [ - [ - "1d3", - "bludgeoning" - ] - ] - }, - "formula": "", - "save": { - "type": "", - "dc": "", - "descriptor": "negate" - }, - "descriptors": [], - "capacity": { - "value": 0, - "max": 0 - }, - "usage": { - "value": 0, - "per": "" - }, - "modifiers": [], - "container": { - "contents": [], - "storage": [], - "isOpen": true - }, - "weaponType": "basicM", - "weaponCategory": "", - "special": "", - "properties": { - "one": false, - "two": false, - "amm": false, - "aeon": false, - "analog": false, - "antibiological": false, - "archaic": true, - "aurora": false, - "automatic": false, - "blast": false, - "block": false, - "boost": false, - "breach": false, - "breakdown": false, - "bright": false, - "cluster": false, - "conceal": false, - "deconstruct": false, - "deflect": false, - "disarm": false, - "double": false, - "drainCharge": false, - "echo": false, - "entangle": false, - "explode": false, - "extinguish": false, - "feint": false, - "fiery": false, - "firstArc": false, - "flexibleLine": false, - "force": false, - "freeHands": false, - "fueled": false, - "grapple": false, - "gravitation": false, - "guided": false, - "harrying": false, - "holyWater": false, - "hybrid": false, - "ignite": false, - "indirect": false, - "injection": false, - "integrated": false, - "line": false, - "living": false, - "lockdown": false, - "mind-affecting": false, - "mine": false, - "mire": false, - "modal": false, - "necrotic": false, - "nonlethal": true, - "operative": false, - "penetrating": false, - "polarize": false, - "polymorphic": false, - "powered": false, - "professional": false, - "punchGun": false, - "qreload": false, - "radioactive": false, - "reach": false, - "recall": false, - "regrowth": false, - "relic": false, - "reposition": false, - "shape": false, - "shatter": false, - "shells": false, - "shield": false, - "sniper": false, - "stun": false, - "subtle": false, - "sunder": false, - "swarm": false, - "tail": false, - "teleportive": false, - "thought": false, - "throttle": false, - "thrown": false, - "trip": false, - "unbalancing": false, - "underwater": false, - "unwieldy": false, - "variantBoost": false, - "wideLine": false - }, - "proficient": true, - "abilityMods": { - "parts": [] - } - }, - "flags": {}, - "effects": [] -}; -const naturalWeaponsTemplate = { - "name": "Unarmed strike (natural weapons)", - "type": "weapon", - "data": { - "description": { - "chat": "", - "gmnotes": "", - "short": "", - "value": "A special unarmed strike that deals lethal damage, doesn’t count as archaic, and threatens squares. Gain a special version of the Weapon Specialization feat with this unarmed strike at 3rd level, allowing them to add 1–1/2 × their character level to their damage rolls for this unarmed strike (instead of just adding their character level, as usual).
", - "unidentified": "" - }, - "source": "CRB pg. 190", - "type": "", - "quantity": null, - "bulk": "-", - "price": 0, - "level": 0, - "attuned": false, - "equipped": true, - "equippable": false, - "identified": true, - "attributes": { - "sturdy": false, - "customBuilt": false, - "size": "medium", - "dex": { - "mod": "" - }, - "hp": { - "value": 6, - "max": "" - }, - "hardness": { - "value": "" - }, - "ac": { - "value": "" - } - }, - "activation": { - "type": "action", - "cost": 1, - "condition": "" - }, - "duration": { - "value": "", - "units": "" - }, - "target": { - "value": "", - "type": "" - }, - "area": { - "value": null, - "units": null, - "shape": "", - "effect": "" - }, - "range": { - "value": null, - "units": "touch", - "additional": "", - "per": "" - }, - "uses": { - "value": 0, - "max": 0, - "per": "" - }, - "isActive": null, - "ability": "", - "actionType": "mwak", - "attackBonus": 0, - "chatFlavor": "", - "critical": { - "parts": [], - "effect": "" - }, - "damage": { - "parts": [ - [ - "1d3", - "bludgeoning" - ] - ] - }, - "formula": "", - "save": { - "type": "", - "dc": "", - "descriptor": "negate" - }, - "descriptors": [], - "capacity": { - "value": 0, - "max": 0 - }, - "usage": { - "value": 0, - "per": "" - }, - "modifiers": [], - "container": { - "contents": [], - "storage": [], - "isOpen": true - }, - "weaponType": "basicM", - "weaponCategory": "", - "special": "", - "properties": { - "one": false, - "two": false, - "amm": false, - "aeon": false, - "analog": false, - "antibiological": false, - "archaic": false, - "aurora": false, - "automatic": false, - "blast": false, - "block": false, - "boost": false, - "breach": false, - "breakdown": false, - "bright": false, - "cluster": false, - "conceal": false, - "deconstruct": false, - "deflect": false, - "disarm": false, - "double": false, - "drainCharge": false, - "echo": false, - "entangle": false, - "explode": false, - "extinguish": false, - "feint": false, - "fiery": false, - "firstArc": false, - "flexibleLine": false, - "force": false, - "freeHands": false, - "fueled": false, - "grapple": false, - "gravitation": false, - "guided": false, - "harrying": false, - "holyWater": false, - "hybrid": false, - "ignite": false, - "indirect": false, - "injection": false, - "integrated": false, - "line": false, - "living": false, - "lockdown": false, - "mind-affecting": false, - "mine": false, - "mire": false, - "modal": false, - "necrotic": false, - "nonlethal": false, - "operative": false, - "penetrating": false, - "polarize": false, - "polymorphic": false, - "powered": false, - "professional": false, - "punchGun": false, - "qreload": false, - "radioactive": false, - "reach": false, - "recall": false, - "regrowth": false, - "relic": false, - "reposition": false, - "shape": false, - "shatter": false, - "shells": false, - "shield": false, - "sniper": false, - "stun": false, - "subtle": false, - "sunder": false, - "swarm": false, - "tail": false, - "teleportive": false, - "thought": false, - "throttle": false, - "thrown": false, - "trip": false, - "unbalancing": false, - "underwater": false, - "unwieldy": false, - "variantBoost": false, - "wideLine": false - }, - "proficient": true, - "abilityMods": { - "parts": [] - } - }, - "flags": {}, - "img": "icons/svg/mystery-man.svg", - "effects": [] -}; -//# sourceMappingURL=WeaponFactory.js.map \ No newline at end of file diff --git a/dist/WeaponFactory.js.map b/dist/WeaponFactory.js.map deleted file mode 100644 index cdcdc20..0000000 --- a/dist/WeaponFactory.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"WeaponFactory.js","sourceRoot":"","sources":["../src/WeaponFactory.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/controllers/MonsterWizardPanel1Controller.js b/dist/controllers/MonsterWizardPanel1Controller.js index 6239e33..bb02cd8 100644 --- a/dist/controllers/MonsterWizardPanel1Controller.js +++ b/dist/controllers/MonsterWizardPanel1Controller.js @@ -9,6 +9,7 @@ export default class MonsterWizardPanel1Controller extends FormApplication { static get defaultOptions() { return mergeObject(super.defaultOptions, { id: "populator-panel", + classes: ["sfrpg"], template: "modules/foundryvtt-sfrpg-populator/templates/MonsterWizardPanel_1.html", width: 300, height: 300, @@ -24,7 +25,10 @@ export default class MonsterWizardPanel1Controller extends FormApplication { */ activateListeners(html) { // Listener for when a day is clicked - html.find(".nextButton").on('click', this.onNextButtonClicked.bind(this)); + ; + html + .find(".nextButton") + .on("click", this.onNextButtonClicked.bind(this)); //html.find('select[name="selectedArray"]').change(this.onSelectedArrayChanged.bind(this)); } /** diff --git a/dist/controllers/MonsterWizardPanel1Controller.js.map b/dist/controllers/MonsterWizardPanel1Controller.js.map index ec944e8..2d831b8 100644 --- a/dist/controllers/MonsterWizardPanel1Controller.js.map +++ b/dist/controllers/MonsterWizardPanel1Controller.js.map @@ -1 +1 @@ -{"version":3,"file":"MonsterWizardPanel1Controller.js","sourceRoot":"","sources":["../../src/controllers/MonsterWizardPanel1Controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,EAAE,EAAE,eAAe,EAAC,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,OAAO,6BAA6B,MAAM,oCAAoC,CAAC;AAE/E,MAAM,CAAC,OAAO,OAAO,6BAA8B,SAAQ,eAAe;IAGtE,YAAY,OAA2B;QACnC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;IAED,MAAM,KAAK,cAAc;QACrB,OAAO,WAAW,CAAC,KAAK,CAAC,cAAc,EAAG;YACtC,EAAE,EAAE,iBAAiB;YACrB,QAAQ,EAAE,wEAAwE;YAClF,KAAK,EAAE,GAAG;YACV,MAAM,EAAE,GAAG;YACX,WAAW,EAAE,IAAI;YACjB,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,sBAAsB;SAChC,CAAC,CAAC;IACP,CAAC;IAED;;;;OAIG;IACI,iBAAiB,CAAC,IAAyB;QAC9C,qCAAqC;QAC5B,IAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACpF,2FAA2F;IAC/F,CAAC;IAED;;;;;OAKG;IACH,OAAO,CAAC,OAAO,GAAG,EAAE;QAChB,OAAO,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE;YAChC,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;YACpB,MAAM,EAAE,eAAe,CAAC,MAAM;YAC9B,GAAG,EAAE,EAAE;YACP,aAAa,EAAE,MAAM,CAAC,YAAY;SACrC,CAAC,CAAC;IACP,CAAC;IAED,mBAAmB,CAAC,CAAQ;QAExB,IAAI,4BAA4B,GAAG,IAAI,6BAA6B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnF,4BAA4B,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAE9C,CAAC;IACD,KAAK,CAAC,sBAAsB,CAAC,CAAQ;QACjC,gBAAgB;QAChB,0DAA0D;QAC1D,oBAAoB;QACpB,EAAE;IACN,CAAC;CACJ"} \ No newline at end of file +{"version":3,"file":"MonsterWizardPanel1Controller.js","sourceRoot":"","sources":["../../src/controllers/MonsterWizardPanel1Controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAE1C,OAAO,6BAA6B,MAAM,oCAAoC,CAAA;AAE9E,MAAM,CAAC,OAAO,OAAO,6BAA8B,SAAQ,eAAe;IAGtE,YAAY,OAA2B;QACnC,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IAC1B,CAAC;IAED,MAAM,KAAK,cAAc;QACrB,OAAO,WAAW,CAAC,KAAK,CAAC,cAAc,EAAE;YACrC,EAAE,EAAE,iBAAiB;YACrB,OAAO,EAAE,CAAC,OAAO,CAAC;YAClB,QAAQ,EACJ,wEAAwE;YAC5E,KAAK,EAAE,GAAG;YACV,MAAM,EAAE,GAAG;YACX,WAAW,EAAE,IAAI;YACjB,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,sBAAsB;SAChC,CAAC,CAAA;IACN,CAAC;IAED;;;;OAIG;IACI,iBAAiB,CAAC,IAAyB;QAC9C,qCAAqC;QACrC,CAAC;QAAS,IAAK;aACV,IAAI,CAAC,aAAa,CAAC;aACnB,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QACrD,2FAA2F;IAC/F,CAAC;IAED;;;;;OAKG;IACH,OAAO,CAAC,OAAO,GAAG,EAAE;QAChB,OAAO,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE;YAChC,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;YACpB,MAAM,EAAE,eAAe,CAAC,MAAM;YAC9B,GAAG,EAAE,EAAE;YACP,aAAa,EAAE,MAAM,CAAC,YAAY;SACrC,CAAC,CAAA;IACN,CAAC;IAED,mBAAmB,CAAC,CAAQ;QACxB,IAAI,4BAA4B,GAAG,IAAI,6BAA6B,CAChE,IAAI,CAAC,OAAO,CACf,CAAA;QACD,4BAA4B,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC7C,CAAC;IACD,KAAK,CAAC,sBAAsB,CAAC,CAAQ;QACjC,gBAAgB;QAChB,0DAA0D;QAC1D,oBAAoB;QACpB,EAAE;IACN,CAAC;CACJ"} \ No newline at end of file diff --git a/dist/controllers/MonsterWizardPanel2Controller.js b/dist/controllers/MonsterWizardPanel2Controller.js index 7ab5541..444a84d 100644 --- a/dist/controllers/MonsterWizardPanel2Controller.js +++ b/dist/controllers/MonsterWizardPanel2Controller.js @@ -5,6 +5,7 @@ export default class MonsterWizardPanel2Controller extends FormApplication { static get defaultOptions() { return mergeObject(super.defaultOptions, { id: "populator-panel", + classes: ["sfrpg"], template: "modules/foundryvtt-sfrpg-populator/templates/MonsterWizardPanel_2.html", width: 300, height: 300, diff --git a/dist/controllers/MonsterWizardPanel2Controller.js.map b/dist/controllers/MonsterWizardPanel2Controller.js.map index b90964a..275480b 100644 --- a/dist/controllers/MonsterWizardPanel2Controller.js.map +++ b/dist/controllers/MonsterWizardPanel2Controller.js.map @@ -1 +1 @@ -{"version":3,"file":"MonsterWizardPanel2Controller.js","sourceRoot":"","sources":["../../src/controllers/MonsterWizardPanel2Controller.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAO,6BAA8B,SAAQ,eAAe;IAEtE,YAAY,OAA2B;QACnC,KAAK,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,cAAc;QACrB,OAAO,WAAW,CAAC,KAAK,CAAC,cAAc,EAAG;YACtC,EAAE,EAAE,iBAAiB;YACrB,QAAQ,EAAE,wEAAwE;YAClF,KAAK,EAAE,GAAG;YACV,MAAM,EAAE,GAAG;YACX,WAAW,EAAE,IAAI;YACjB,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,sBAAsB;SAChC,CAAC,CAAC;IACP,CAAC;IAED;;;;OAIG;IACI,iBAAiB,CAAC,IAAyB,IAAG,CAAC;IAEtD;;;;;OAKG;IACH,OAAO,CAAC,OAAO,GAAG,EAAE;QAChB,OAAO,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE;YAChC,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;SACvB,CAAC,CAAC;IACP,CAAC;CAEJ"} \ No newline at end of file +{"version":3,"file":"MonsterWizardPanel2Controller.js","sourceRoot":"","sources":["../../src/controllers/MonsterWizardPanel2Controller.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAO,6BAA8B,SAAQ,eAAe;IACtE,YAAY,OAA2B;QACnC,KAAK,EAAE,CAAA;IACX,CAAC;IAED,MAAM,KAAK,cAAc;QACrB,OAAO,WAAW,CAAC,KAAK,CAAC,cAAc,EAAE;YACrC,EAAE,EAAE,iBAAiB;YACrB,OAAO,EAAE,CAAC,OAAO,CAAC;YAClB,QAAQ,EACJ,wEAAwE;YAC5E,KAAK,EAAE,GAAG;YACV,MAAM,EAAE,GAAG;YACX,WAAW,EAAE,IAAI;YACjB,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,sBAAsB;SAChC,CAAC,CAAA;IACN,CAAC;IAED;;;;OAIG;IACI,iBAAiB,CAAC,IAAyB,IAAG,CAAC;IAEtD;;;;;OAKG;IACH,OAAO,CAAC,OAAO,GAAG,EAAE;QAChB,OAAO,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE;YAChC,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;SACvB,CAAC,CAAA;IACN,CAAC;CACJ"} \ No newline at end of file diff --git a/dist/controllers/PopulatorPanelController.js b/dist/controllers/PopulatorPanelController.js index c51de95..140d6f4 100644 --- a/dist/controllers/PopulatorPanelController.js +++ b/dist/controllers/PopulatorPanelController.js @@ -1,18 +1,27 @@ import { Races } from "../data/Races.js"; -import { NPCFactory } from "../NPCFactory.js"; -import MonsterWizardPanel1Controller from "./MonsterWizardPanel1Controller.js"; +import { NPCFactory } from "../factories/NPCFactory.js"; import NPCCreationContext from "../models/NPCCreationContext.js"; +import { Grafts } from "../data/Grafts.js"; +import { CreatureTypeGenerationOptions } from "../data/Generator.js"; +import { Subtype, Type } from "../data/Types.js"; export default class PopulatorPanelController extends Application { static get defaultOptions() { return mergeObject(super.defaultOptions, { id: "populator-panel", + classes: ["sfrpg"], template: "modules/foundryvtt-sfrpg-populator/templates/PopulatorPanel.html", width: 300, - height: 300, + height: 350, minimizable: true, resizable: true, title: "Populator", - tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "description" }] + tabs: [ + { + navSelector: ".sheet-tabs", + contentSelector: ".sheet-body", + initial: "description" + } + ] }); } /** @@ -25,7 +34,8 @@ export default class PopulatorPanelController extends Application { return mergeObject(super.getData(), { options: options, isGM: game.user.isGM, - NPCRaces: Races.nonCombatantRaces + NPCRaces: Races.nonCombatantRaces, + supportedCreatureTypes: CreatureTypeGenerationOptions }); } /** @@ -35,29 +45,75 @@ export default class PopulatorPanelController extends Application { */ activateListeners(html) { // Listener for when a day is clicked - html.find(".npcGenerationButton").on('click', this.npcGenerationButtonClicked.bind(this)); - html.find(".monsterGenerationButton").on('click', this.monsterGenerationButtonClicked.bind(this)); + ; + html + .find(".npcGenerationButton") + .on("click", this.npcGenerationButtonClicked.bind(this)); + html + .find(".monsterGenerationButton") + .on("click", this.monsterGenerationButtonClicked.bind(this)); } /** - * Click event when a users clicks on a test button + * Click event when a users clicks on the NPC button * @param {Event} e The click event */ async npcGenerationButtonClicked(e) { - let npcRaceSelectValue = this.element.find('#npcRaceSelect').find(":selected").val(); + let npcRaceSelectValue = this.element + .find("#npcRaceSelect") + .find(":selected") + .val(); let selectedRace = npcRaceSelectValue; // Settings const defaultCR = game.settings.get("foundryvtt-sfrpg-populator", "defaultCR"); const dynamicTokenImages = game.settings.get("foundryvtt-sfrpg-populator", "dynamicTokenImages"); - let options = { CR: defaultCR, dynamicTokenImages: dynamicTokenImages, race: null, gender: null }; - // Quickly creates a specific race - as selected by user - options.race = Races.nonCombatantRaces[selectedRace]; - await NPCFactory.makeNonHostile(options); + // Context + let context = new NPCCreationContext(); + context.CR = defaultCR; + // Validates selected race name + if (Races.nonCombatantRaces[selectedRace]) { + context.race = selectedRace; + } + context.tokenOptions.dynamicImage = dynamicTokenImages; + await NPCFactory.makeNonHostile(context); ui.notifications.info("NPC created.", { permanent: false }); } - monsterGenerationButtonClicked(e) { + /** + * Click event when a users clicks on the Monster button + * @param {Event} e The click event + */ + async monsterGenerationButtonClicked(e) { + var _a; + let monsterTypeSelectValue = this.element + .find("#monsterTypeSelect") + .find(":selected") + .val(); + let selectedType = monsterTypeSelectValue; + // Settings + const defaultCR = game.settings.get("foundryvtt-sfrpg-populator", "defaultCR"); + const dynamicTokenImages = game.settings.get("foundryvtt-sfrpg-populator", "dynamicTokenImages"); + // Context + let context = new NPCCreationContext(); + context.CR = defaultCR; + // Validates selected type + if (Grafts.creatureType[selectedType]) { + let generatorOption = CreatureTypeGenerationOptions[selectedType]; + let typeKey = Type[generatorOption.type]; + context.creatureTypeGraft = Grafts.creatureType[typeKey]; + // TODO: For now we just use the 1st (and only) subttype associated with type + if (((_a = generatorOption.subtypes) === null || _a === void 0 ? void 0 : _a.length) == 1) { + let subtypeKey = Subtype[generatorOption.subtypes[0]]; + context.creatureSubtypeGrafts = [ + Grafts.creatureSubtype[subtypeKey] + ]; + } + context.universalCreatureRules = + generatorOption.universalCreatureRules; + } + await NPCFactory.makeHostile(context); + ui.notifications.info("NPC created.", { permanent: false }); // Open monster wizard panel - let monsterWizardPanelController = new MonsterWizardPanel1Controller(new NPCCreationContext()); - monsterWizardPanelController.render(true); + //let monsterWizardPanelController = new MonsterWizardPanel1Controller(new NPCCreationContext()); + //monsterWizardPanelController.render(true); } } //# sourceMappingURL=PopulatorPanelController.js.map \ No newline at end of file diff --git a/dist/controllers/PopulatorPanelController.js.map b/dist/controllers/PopulatorPanelController.js.map index 7d820a1..472ff4a 100644 --- a/dist/controllers/PopulatorPanelController.js.map +++ b/dist/controllers/PopulatorPanelController.js.map @@ -1 +1 @@ -{"version":3,"file":"PopulatorPanelController.js","sourceRoot":"","sources":["../../src/controllers/PopulatorPanelController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,6BAA6B,MAAM,oCAAoC,CAAC;AAC/E,OAAO,kBAAkB,MAAM,iCAAiC,CAAC;AAEjE,MAAM,CAAC,OAAO,OAAO,wBAAyB,SAAQ,WAAW;IAE7D,MAAM,KAAK,cAAc;QACrB,OAAO,WAAW,CAAC,KAAK,CAAC,cAAc,EAAG;YACtC,EAAE,EAAE,iBAAiB;YACrB,QAAQ,EAAE,kEAAkE;YAC5E,KAAK,EAAE,GAAG;YACV,MAAM,EAAE,GAAG;YACX,WAAW,EAAE,IAAI;YACjB,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,WAAW;YAClB,IAAI,EAAE,CAAC,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;SACjG,CAAC,CAAC;IACP,CAAC;IACD;;;;;OAKG;IACH,OAAO,CAAC,OAAO,GAAG,EAAE;QAChB,OAAO,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE;YAChC,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;YACpB,QAAQ,EAAE,KAAK,CAAC,iBAAiB;SACpC,CAAC,CAAC;IACP,CAAC;IAED;;;;OAIG;IACI,iBAAiB,CAAC,IAAyB;QAC9C,qCAAqC;QAC5B,IAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3F,IAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAChH,CAAC;IACD;;;OAGG;IACK,KAAK,CAAC,0BAA0B,CAAC,CAAQ;QAE7C,IAAI,kBAAkB,GAAY,IAAI,CAAC,OAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,EAAE,CAAC;QAC/F,IAAI,YAAY,GAAW,kBAA4B,CAAC;QAExD,WAAW;QACX,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,4BAA4B,EAAE,WAAW,CAAC,CAAC;QAC/E,MAAM,kBAAkB,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,4BAA4B,EAAE,oBAAoB,CAAC,CAAC;QAEjG,IAAI,OAAO,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAC,CAAC;QAEjG,wDAAwD;QACxD,OAAO,CAAC,IAAI,GAAG,KAAK,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;QAErD,MAAM,UAAU,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QACzC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IAChE,CAAC;IAEO,8BAA8B,CAAC,CAAQ;QAC3C,4BAA4B;QAC5B,IAAI,4BAA4B,GAAG,IAAI,6BAA6B,CAAC,IAAI,kBAAkB,EAAE,CAAC,CAAC;QAC/F,4BAA4B,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;CACJ"} \ No newline at end of file +{"version":3,"file":"PopulatorPanelController.js","sourceRoot":"","sources":["../../src/controllers/PopulatorPanelController.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/data/AbilityScore.js b/dist/data/AbilityScore.js new file mode 100644 index 0000000..3fe7eb3 --- /dev/null +++ b/dist/data/AbilityScore.js @@ -0,0 +1,10 @@ +export var AbilityScore; +(function (AbilityScore) { + AbilityScore["charisma"] = "cha"; + AbilityScore["constituion"] = "con"; + AbilityScore["dexterity"] = "dex"; + AbilityScore["intelligence"] = "int"; + AbilityScore["strength"] = "str"; + AbilityScore["wisdom"] = "wis"; +})(AbilityScore || (AbilityScore = {})); +//# sourceMappingURL=AbilityScore.js.map \ No newline at end of file diff --git a/dist/data/AbilityScore.js.map b/dist/data/AbilityScore.js.map new file mode 100644 index 0000000..36639c1 --- /dev/null +++ b/dist/data/AbilityScore.js.map @@ -0,0 +1 @@ +{"version":3,"file":"AbilityScore.js","sourceRoot":"","sources":["../../src/data/AbilityScore.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,YAOX;AAPD,WAAY,YAAY;IACpB,gCAAgB,CAAA;IAChB,mCAAmB,CAAA;IACnB,iCAAiB,CAAA;IACjB,oCAAoB,CAAA;IACpB,gCAAgB,CAAA;IAChB,8BAAc,CAAA;AAClB,CAAC,EAPW,YAAY,KAAZ,YAAY,QAOvB"} \ No newline at end of file diff --git a/dist/data/AbilityScores.js b/dist/data/AbilityScores.js new file mode 100644 index 0000000..4a8e2c5 --- /dev/null +++ b/dist/data/AbilityScores.js @@ -0,0 +1,10 @@ +export var AbilityScore; +(function (AbilityScore) { + AbilityScore["charisma"] = "cha"; + AbilityScore["constituion"] = "con"; + AbilityScore["dexterity"] = "dex"; + AbilityScore["intelligence"] = "int"; + AbilityScore["strength"] = "str"; + AbilityScore["wisdom"] = "wis"; +})(AbilityScore || (AbilityScore = {})); +//# sourceMappingURL=AbilityScores.js.map \ No newline at end of file diff --git a/dist/data/AbilityScores.js.map b/dist/data/AbilityScores.js.map new file mode 100644 index 0000000..53f9332 --- /dev/null +++ b/dist/data/AbilityScores.js.map @@ -0,0 +1 @@ +{"version":3,"file":"AbilityScores.js","sourceRoot":"","sources":["../../src/data/AbilityScores.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,YAOX;AAPD,WAAY,YAAY;IACpB,gCAAgB,CAAA;IAChB,mCAAmB,CAAA;IACnB,iCAAiB,CAAA;IACjB,oCAAoB,CAAA;IACpB,gCAAgB,CAAA;IAChB,8BAAc,CAAA;AAClB,CAAC,EAPW,YAAY,KAAZ,YAAY,QAOvB"} \ No newline at end of file diff --git a/dist/data/Biography.js b/dist/data/Biography.js index 53059e4..3ae204a 100644 --- a/dist/data/Biography.js +++ b/dist/data/Biography.js @@ -2,6 +2,134 @@ export const Biography = { // Collection of professions (inspired by the Alien Character Cards from Paizo) professions: [], // Collection of personality traits (inspired by the Alien Character Cards from Paizo) - personalityTraits: [] + personalityTraits: [ + "abrasive", + "abrupt", + "absentminded", + "adaptable", + "adventurous", + "aggressive", + "agreeable", + "alert", + "aloof", + "ambitious", + "amoral", + "amusing", + "angry", + "anxious", + "apathetic", + "argumentative", + "articulate", + "artificial", + "ascetic", + "assertive", + "athletic", + "attractive", + "authoritarian", + "avant-garde", + "barbaric", + "benevolent", + "bizarre", + "blunt", + "boisterous", + "brilliant", + "businesslike", + "busy", + "calculating", + "callous", + "calm", + "captivating", + "careless", + "caring", + "casual", + "cautious", + "cerebral", + "charismatic", + "charming", + "cheerful", + "childish", + "clean", + "clever", + "clumsy", + "coarse", + "cold", + "compassionate", + "competitive", + "compulsive", + "confident", + "conformist", + "confused", + "conscientious", + "conservative", + "considerate", + "contemplative", + "conventional", + "cooperative", + "courageous", + "courteous", + "cowardly", + "crafty", + "crass", + "creative", + "cruel", + "cultured", + "curious", + "cute", + "cynical", + "daring", + "decadent", + "deceitful", + "decisive", + "dedicated", + "delicate", + "demanding", + "desperate", + "despondent", + "destructive", + "determined", + "devious", + "disloyal", + "disobedient", + "disorderly", + "disrespectful", + "dissolute", + "domineering", + "dramatic", + "dull", + "dutiful", + "ebullient", + "educated", + "egocentric", + "elegant", + "eloquent", + "emotional", + "empathetic", + "energetic", + "enigmatic", + "enthusiastic", + "envious", + "erratic", + "erudite", + "excitable", + "extravagant", + "faithful", + "faithless", + "fanatical", + "fatalistic", + "fickle", + "focused", + "foolish", + "forgetful", + "forgiving", + "formal", + "forthright", + "friendly", + "generous", + "glamorous", + "gloomy", + "greedy", + "grim", + "gullible" + ] }; //# sourceMappingURL=Biography.js.map \ No newline at end of file diff --git a/dist/data/Biography.js.map b/dist/data/Biography.js.map index f334c62..79ac9e9 100644 --- a/dist/data/Biography.js.map +++ b/dist/data/Biography.js.map @@ -1 +1 @@ -{"version":3,"file":"Biography.js","sourceRoot":"","sources":["../../src/data/Biography.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAG;IAErB,+EAA+E;IAC/E,WAAW,EAAE,EAAE;IACf,sFAAsF;IACtF,iBAAiB,EAAC,EAAE;CACvB,CAAA"} \ No newline at end of file +{"version":3,"file":"Biography.js","sourceRoot":"","sources":["../../src/data/Biography.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAG;IACrB,+EAA+E;IAC/E,WAAW,EAAE,EAAE;IACf,sFAAsF;IACtF,iBAAiB,EAAE;QACf,UAAU;QACV,QAAQ;QACR,cAAc;QACd,WAAW;QACX,aAAa;QACb,YAAY;QACZ,WAAW;QACX,OAAO;QACP,OAAO;QACP,WAAW;QACX,QAAQ;QACR,SAAS;QACT,OAAO;QACP,SAAS;QACT,WAAW;QACX,eAAe;QACf,YAAY;QACZ,YAAY;QACZ,SAAS;QACT,WAAW;QACX,UAAU;QACV,YAAY;QACZ,eAAe;QACf,aAAa;QACb,UAAU;QACV,YAAY;QACZ,SAAS;QACT,OAAO;QACP,YAAY;QACZ,WAAW;QACX,cAAc;QACd,MAAM;QACN,aAAa;QACb,SAAS;QACT,MAAM;QACN,aAAa;QACb,UAAU;QACV,QAAQ;QACR,QAAQ;QACR,UAAU;QACV,UAAU;QACV,aAAa;QACb,UAAU;QACV,UAAU;QACV,UAAU;QACV,OAAO;QACP,QAAQ;QACR,QAAQ;QACR,QAAQ;QACR,MAAM;QACN,eAAe;QACf,aAAa;QACb,YAAY;QACZ,WAAW;QACX,YAAY;QACZ,UAAU;QACV,eAAe;QACf,cAAc;QACd,aAAa;QACb,eAAe;QACf,cAAc;QACd,aAAa;QACb,YAAY;QACZ,WAAW;QACX,UAAU;QACV,QAAQ;QACR,OAAO;QACP,UAAU;QACV,OAAO;QACP,UAAU;QACV,SAAS;QACT,MAAM;QACN,SAAS;QACT,QAAQ;QACR,UAAU;QACV,WAAW;QACX,UAAU;QACV,WAAW;QACX,UAAU;QACV,WAAW;QACX,WAAW;QACX,YAAY;QACZ,aAAa;QACb,YAAY;QACZ,SAAS;QACT,UAAU;QACV,aAAa;QACb,YAAY;QACZ,eAAe;QACf,WAAW;QACX,aAAa;QACb,UAAU;QACV,MAAM;QACN,SAAS;QACT,WAAW;QACX,UAAU;QACV,YAAY;QACZ,SAAS;QACT,UAAU;QACV,WAAW;QACX,YAAY;QACZ,WAAW;QACX,WAAW;QACX,cAAc;QACd,SAAS;QACT,SAAS;QACT,SAAS;QACT,WAAW;QACX,aAAa;QACb,UAAU;QACV,WAAW;QACX,WAAW;QACX,YAAY;QACZ,QAAQ;QACR,SAAS;QACT,SAAS;QACT,WAAW;QACX,WAAW;QACX,QAAQ;QACR,YAAY;QACZ,UAAU;QACV,UAAU;QACV,WAAW;QACX,QAAQ;QACR,QAAQ;QACR,MAAM;QACN,UAAU;KACb;CACJ,CAAA"} \ No newline at end of file diff --git a/dist/data/Generator.js b/dist/data/Generator.js new file mode 100644 index 0000000..55403f6 --- /dev/null +++ b/dist/data/Generator.js @@ -0,0 +1,27 @@ +import { Subtype, Type } from "./Types.js"; +import { MonsterCreation } from "./MonsterCreation.js"; +/// Used to store mapping between +export class CreatureTypeGenerationOption { + constructor(type, subtypes, + // We've hard coded the first creature rule to be natural weapons + // TODO: Only spend one special ability on natural weapons if no other weapon profile generation option is selected + universalCreatureRules = [ + MonsterCreation.specialAbilities.universalCreatureRule + .naturalWeapons + ]) { + this.type = type; + this.subtypes = subtypes; + this.universalCreatureRules = universalCreatureRules; + } +} +/// Generator Settings +export const CreatureTypeGenerationOptions = { + animal: new CreatureTypeGenerationOption(Type.animal), + ooze: new CreatureTypeGenerationOption(Type.ooze), + vermin: new CreatureTypeGenerationOption(Type.vermin), + construct: new CreatureTypeGenerationOption(Type.construct, [Subtype.technological], [ + MonsterCreation.specialAbilities.universalCreatureRule + .integratedWeapons + ]) +}; +//# sourceMappingURL=Generator.js.map \ No newline at end of file diff --git a/dist/data/Generator.js.map b/dist/data/Generator.js.map new file mode 100644 index 0000000..75f22a7 --- /dev/null +++ b/dist/data/Generator.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Generator.js","sourceRoot":"","sources":["../../src/data/Generator.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAE1C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAEtD,iCAAiC;AACjC,MAAM,OAAO,4BAA4B;IAKrC,YACI,IAAU,EACV,QAAgC;IAChC,iEAAiE;IACjE,mHAAmH;IACnH,yBAAkD;QAC9C,eAAe,CAAC,gBAAgB,CAAC,qBAAqB;aACjD,cAAc;KACtB;QAED,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,sBAAsB,GAAG,sBAAsB,CAAA;IACxD,CAAC;CACJ;AAED,sBAAsB;AACtB,MAAM,CAAC,MAAM,6BAA6B,GAAG;IACzC,MAAM,EAAE,IAAI,4BAA4B,CAAC,IAAI,CAAC,MAAM,CAAC;IACrD,IAAI,EAAE,IAAI,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC;IACjD,MAAM,EAAE,IAAI,4BAA4B,CAAC,IAAI,CAAC,MAAM,CAAC;IACrD,SAAS,EAAE,IAAI,4BAA4B,CACvC,IAAI,CAAC,SAAS,EACd,CAAC,OAAO,CAAC,aAAa,CAAC,EACvB;QACI,eAAe,CAAC,gBAAgB,CAAC,qBAAqB;aACjD,iBAAiB;KACzB,CACJ;CACJ,CAAA"} \ No newline at end of file diff --git a/dist/data/Grafts.js b/dist/data/Grafts.js index 564befb..3649b5b 100644 --- a/dist/data/Grafts.js +++ b/dist/data/Grafts.js @@ -1,24 +1,56 @@ import CreatureTypeGraft from "../models/CreatureTypeGraft.js"; +import CreatureSubtypeGraft from "../models/CreatureSubtypeGraft.js"; +import { Subtype, Type } from "./Types.js"; export const Grafts = { creatureType: { - animal: new CreatureTypeGraft("animal"), - humanoid: new CreatureTypeGraft("humanoid"), - monstrousHumanoid: new CreatureTypeGraft("monstrous humanoid") + animal: new CreatureTypeGraft(Type[Type.animal], "An animal is a living, nonhumanoid creature, usually a vertebrate with no magical abilities and no innate capacity for language or culture.\n" + + "Fortunately, the widespread use of the credstick circumvents
issues related to spending and storing currency. Flat and roughly
the size of a @Compendium[sfrpg.races.AMBcyDZDtJ1OOzh3]{Human} finger, ranging from cheap and disposable to
elaborate works of art, credsticks are a convenient way to carry
and spend money.
When wearing a properly fitted consumer backpack, you treat your Strength score as 1 higher for the purpose of determining your carrying capacity.
', + unidentified: "" + }, + source: "Core Rulebook, pg 230", + type: "", + quantity: 1, + bulk: "1", + price: 3, + level: 1, + attuned: false, + equipped: false, + equippable: false, + identified: true, + attributes: { + sturdy: false, + customBuilt: false, + size: "medium", + dex: { + mod: "" + }, + hp: { + value: 6, + max: "" + }, + hardness: { + value: "" }, - "source": "CRB pg. 166", - "type": "", - "quantity": 1, - "bulk": "L", - "price": 25, - "level": 1, - "attuned": false, - "equipped": false, - "equippable": false, - "identified": true, - "attributes": { - "sturdy": false, - "customBuilt": false, - "size": "medium", - "dex": { - "mod": "" - }, - "hp": { - "value": 6, - "max": "" - }, - "hardness": { - "value": "" - }, - "ac": { - "value": "" + ac: { + value: "" + } + }, + modifiers: [ + { + name: "Backpack, Consumer", + modifier: 1, + type: "enhancement", + effectType: "bulk", + valueAffected: "", + enabled: true, + source: "Core Rulebook, pg 230", + notes: "", + modifierType: "constant", + condition: "", + subtab: "misc", + _id: "395f0b72-1b0a-4845-ac86-f5dc5ce847f8" + } + ], + container: { + contents: [], + storage: [ + { + type: "bulk", + subtype: "", + amount: 2, + acceptsType: [ + "weapon", + "equipment", + "goods", + "consumable", + "container", + "technological", + "fusion", + "upgrade", + "augmentation", + "magic" + ], + affectsEncumbrance: true, + weightProperty: "bulk" } + ], + isOpen: true + }, + equippedBulkMultiplier: 0, + acceptedItemTypes: { + weapon: true, + equipment: true, + goods: true, + consumable: true, + container: true, + technological: true, + fusion: true, + upgrade: true, + augmentation: true + }, + damage: { + parts: [] + }, + critical: { + parts: [] + }, + abilityMods: { + parts: [] + } + }, + flags: {}, + img: "systems/sfrpg/icons/equipment/goods/backpack-consumer.jpg", + effects: [], + storage: { + type: "bulk", + amount: 2, + affectsEncumbrance: true + }, + weapon: true, + equipment: true, + consumable: true, + goods: true, + container: true, + hybrid: false, + magic: true, + technological: true, + fusion: true, + upgrade: true, + spell: false, + augmentation: true, + shield: false, + weaponAccessory: false, + vehicleAttack: false, + vehicleSystem: false +}; +export const canteenTemplate = { + name: "Canteen", + type: "goods", + data: { + description: { + chat: "", + gmnotes: "", + short: "", + value: 'This hollow plastic or metal container can hold up to a half gallon of liquid.
', + unidentified: "" + }, + source: "Armory", + type: "", + quantity: 1, + bulk: "L", + price: 1, + level: 1, + attuned: false, + equipped: false, + equippable: false, + identified: true, + attributes: { + sturdy: false, + customBuilt: false, + size: "medium", + dex: { + mod: "" }, - "modifiers": [], - "damage": { - "parts": [] + hp: { + value: 6, + max: "" }, - "critical": { - "parts": [] + hardness: { + value: "" }, - "abilityMods": { - "parts": [] + ac: { + value: "" } }, - "flags": {}, - "img": "systems/sfrpg/icons/equipment/goods/credstick.jpg", - "effects": [] + modifiers: [], + damage: { + parts: [] + }, + critical: { + parts: [] + }, + abilityMods: { + parts: [] + } }, - upbTemplate: { - "name": "UPB (25)", - "type": "goods", - "data": { - "description": { - "chat": "", - "gmnotes": "", - "short": "", - "value": "A universal polymer base, or UPB, is the basis for most technology in the Pact Worlds, the Veskarium, and many other systems. Each UPB is a tiny multifunction component, not much larger than a grain of rice, capable of being configured to act as a brace, capacitor, circuit, diode, fastener, insulator, lens, modulator, pipe, resistor, and dozens of other constituent parts. UPBs can even be spun out into fabric, broken down into component chemicals, reconstituted into new chemicals, or supplemented with base materials (such as dirt or sand) to form massive braces or walls. The right combination of hundreds or even thousands of UPBs can create everything from a comm unit to a laser weapon to powered armor. In their raw form, UPBs have a bulk of 1 per 1,000 UPBs, though when aligned and configured they can easily take up less bulk, and when configured for a specific purpose that calls for a minimum size and bracing (possibly combining them with inert materials), they can have a higher bulk.
UPBs are so ubiquitous that they are usable as currency in many major settlements and trade hubs. While credsticks are a more convenient and secure way to carry value, UPBs have the advantage of direct utility and untraceability. They are a popular way to pay smugglers and criminals, but they are also useful for trade missions to systems with UPB technology that don’t use credits as currency. The value of the Pact Worlds’ credit is based on the economic utility of a single UPB.
Fortunately, the widespread use of the credstick circumvents
issues related to spending and storing currency. Flat and roughly
the size of a @Compendium[sfrpg.races.AMBcyDZDtJ1OOzh3]{Human} finger, ranging from cheap and disposable to
elaborate works of art, credsticks are a convenient way to carry
and spend money.
A lighter is a small canister containing a pressurized flammable liquid gas. When the lighter is activated, an electric arc ignites the gas, creating a tiny flame. You can light a small flame (such as a candle) as a swift action. Lighting a full fire is at least a full action or more, depending on the size and fuel of the fire.
", - "unidentified": "" + flags: {}, + img: "systems/sfrpg/icons/equipment/goods/credstick.jpg", + effects: [] +}; +export const upbTemplate = { + name: "UPB (25)", + type: "goods", + data: { + description: { + chat: "", + gmnotes: "", + short: "", + value: "A universal polymer base, or UPB, is the basis for most technology in the Pact Worlds, the Veskarium, and many other systems. Each UPB is a tiny multifunction component, not much larger than a grain of rice, capable of being configured to act as a brace, capacitor, circuit, diode, fastener, insulator, lens, modulator, pipe, resistor, and dozens of other constituent parts. UPBs can even be spun out into fabric, broken down into component chemicals, reconstituted into new chemicals, or supplemented with base materials (such as dirt or sand) to form massive braces or walls. The right combination of hundreds or even thousands of UPBs can create everything from a comm unit to a laser weapon to powered armor. In their raw form, UPBs have a bulk of 1 per 1,000 UPBs, though when aligned and configured they can easily take up less bulk, and when configured for a specific purpose that calls for a minimum size and bracing (possibly combining them with inert materials), they can have a higher bulk.
UPBs are so ubiquitous that they are usable as currency in many major settlements and trade hubs. While credsticks are a more convenient and secure way to carry value, UPBs have the advantage of direct utility and untraceability. They are a popular way to pay smugglers and criminals, but they are also useful for trade missions to systems with UPB technology that don’t use credits as currency. The value of the Pact Worlds’ credit is based on the economic utility of a single UPB.
A lighter is a small canister containing a pressurized flammable liquid gas. When the lighter is activated, an electric arc ignites the gas, creating a tiny flame. You can light a small flame (such as a candle) as a swift action. Lighting a full fire is at least a full action or more, depending on the size and fuel of the fire.
', + unidentified: "" + }, + source: "Armory", + type: "", + quantity: 1, + bulk: "L", + price: 1, + level: 1, + attuned: false, + equipped: false, + equippable: false, + identified: true, + attributes: { + sturdy: false, + customBuilt: false, + size: "medium", + dex: { + mod: "" + }, + hp: { + value: 6, + max: "" + }, + hardness: { + value: "" }, - "abilityMods": { - "parts": [] + ac: { + value: "" } }, - "flags": {}, - "img": "systems/sfrpg/icons/equipment/goods/lighter.jpg", - "effects": [] + modifiers: [], + damage: { + parts: [] + }, + critical: { + parts: [] + }, + abilityMods: { + parts: [] + } }, - purfumeTemplate: { - "name": "Perfume, Standard", - "type": "goods", - "data": { - "description": { - "chat": "", - "gmnotes": "", - "short": "", - "value": "There is an immeasurable variety of perfumes and colognes in the galaxy, most tailored to the aesthetics of specific races with olfactory senses. A single dose of perfume lasts 1 hour, and a typical bottle of perfume contains 10 doses.
\n\n
Standard aromas have a pleasant smell and can convey an air of hygiene, status, and wealth.
", - "unidentified": "" + flags: {}, + img: "systems/sfrpg/icons/equipment/goods/lighter.jpg", + effects: [] +}; +export const purfumeTemplate = { + name: "Perfume, Standard", + type: "goods", + data: { + description: { + chat: "", + gmnotes: "", + short: "", + value: "There is an immeasurable variety of perfumes and colognes in the galaxy, most tailored to the aesthetics of specific races with olfactory senses. A single dose of perfume lasts 1 hour, and a typical bottle of perfume contains 10 doses.
\n\n
Standard aromas have a pleasant smell and can convey an air of hygiene, status, and wealth.
", + unidentified: "" + }, + source: "AR pg. 131", + type: "", + quantity: 1, + bulk: "L", + price: 50, + level: 1, + attuned: false, + equipped: false, + equippable: false, + identified: true, + attributes: { + sturdy: false, + customBuilt: false, + size: "medium", + dex: { + mod: "" }, - "source": "AR pg. 131", - "type": "", - "quantity": 1, - "bulk": "L", - "price": 50, - "level": 1, - "attuned": false, - "equipped": false, - "equippable": false, - "identified": true, - "attributes": { - "sturdy": false, - "customBuilt": false, - "size": "medium", - "dex": { - "mod": "" - }, - "hp": { - "value": 6, - "max": "" - }, - "hardness": { - "value": "" - }, - "ac": { - "value": "" - } + hp: { + value: 6, + max: "" + }, + hardness: { + value: "" + }, + ac: { + value: "" + } + }, + modifiers: [], + damage: { + parts: [] + }, + critical: { + parts: [] + }, + abilityMods: { + parts: [] + } + }, + flags: {}, + img: "systems/sfrpg/icons/equipment/magic%20items/serum-of-appearance-change.jpg", + effects: [] +}; +export const intoxicantMinorTemplate = { + name: "Intoxicant, Minor", + type: "goods", + data: { + description: { + chat: "", + gmnotes: "", + short: "", + value: 'The price and bulk listed here is of a single serving of an intoxicating beverage or inhaled substance, which in the Pact Worlds is most often alcohol or tobacco. An intoxicant’s potency can be minor or superior. A minor intoxicant might be beer or wine, which takes a few servings to cause any physiological effects. A superior intoxicant is usually a strong spirit, such as whiskey, that can start producing effects after a single serving. Unlike @Compendium[sfrpg.rules.aKqRtg165rAly1Cc]{Drugs}, intoxicants are usually not addictive, although a GM might rule that a PC who partakes of too much of an intoxicant on a regular basis might begin to suffer the effects of an addictive @Compendium[sfrpg.rules.aKqRtg165rAly1Cc]{Drug} (as described in @Compendium[sfrpg.rules.JaRMioj4isNp7r1P]{Afflictions} on page 417).
', + unidentified: "" + }, + source: "Core Rulebook", + type: "", + quantity: 1, + bulk: "L", + price: 1, + level: 1, + attuned: false, + equipped: false, + equippable: false, + identified: true, + attributes: { + sturdy: false, + customBuilt: false, + size: "medium", + dex: { + mod: "" }, - "modifiers": [], - "damage": { - "parts": [] + hp: { + value: 6, + max: "" }, - "critical": { - "parts": [] + hardness: { + value: "" }, - "abilityMods": { - "parts": [] + ac: { + value: "" } }, - "flags": {}, - "img": "systems/sfrpg/icons/equipment/magic%20items/serum-of-appearance-change.jpg", - "effects": [] + modifiers: [], + damage: { + parts: [] + }, + critical: { + parts: [] + }, + abilityMods: { + parts: [] + } }, - intoxicantMinorTemplate: { - "name": "Intoxicant, Minor", - "type": "goods", - "data": { - "description": { - "chat": "", - "gmnotes": "", - "short": "", - "value": "The price and bulk listed here is of a single serving of an intoxicating beverage or inhaled substance, which in the Pact Worlds is most often alcohol or tobacco. An intoxicant’s potency can be minor or superior. A minor intoxicant might be beer or wine, which takes a few servings to cause any physiological effects. A superior intoxicant is usually a strong spirit, such as whiskey, that can start producing effects after a single serving. Unlike @Compendium[sfrpg.rules.aKqRtg165rAly1Cc]{Drugs}, intoxicants are usually not addictive, although a GM might rule that a PC who partakes of too much of an intoxicant on a regular basis might begin to suffer the effects of an addictive @Compendium[sfrpg.rules.aKqRtg165rAly1Cc]{Drug} (as described in @Compendium[sfrpg.rules.JaRMioj4isNp7r1P]{Afflictions} on page 417).
", - "unidentified": "" + flags: {}, + img: "systems/sfrpg/icons/equipment/goods/intoxicant.jpg", + effects: [] +}; +export const religiousSymbolTemplate = { + name: "Religious Symbol", + type: "goods", + data: { + description: { + chat: "", + gmnotes: "", + short: "", + value: 'A religious symbol is a physical representation of a sacred image associated with a specific deity or religion, often worn as an amulet or badge. Each deity and religion has its own unique religious symbol. Religious symbols are usually mass-produced from cheap materials, such as plastic or thin metal, but they can be crafted out of other materials as well, with prices dependent on the material used. This item can also be used to represent badges or symbols of nonreligious organizations and groups.
', + unidentified: "" + }, + source: "Armory", + type: "", + quantity: 1, + bulk: "L", + price: 2, + level: 1, + attuned: false, + equipped: false, + equippable: false, + identified: true, + attributes: { + sturdy: false, + customBuilt: false, + size: "medium", + dex: { + mod: "" }, - "source": "Core Rulebook", - "type": "", - "quantity": 1, - "bulk": "L", - "price": 1, - "level": 1, - "attuned": false, - "equipped": false, - "equippable": false, - "identified": true, - "attributes": { - "sturdy": false, - "customBuilt": false, - "size": "medium", - "dex": { - "mod": "" - }, - "hp": { - "value": 6, - "max": "" - }, - "hardness": { - "value": "" - }, - "ac": { - "value": "" - } + hp: { + value: 6, + max: "" }, - "modifiers": [], - "damage": { - "parts": [] + hardness: { + value: "" }, - "critical": { - "parts": [] + ac: { + value: "" + } + }, + modifiers: [], + damage: { + parts: [] + } + }, + flags: {}, + img: "systems/sfrpg/icons/equipment/goods/religious-symbol.jpg", + effects: [] +}; +export const ropeTemplate = { + name: "Rope", + type: "goods", + data: { + description: { + chat: "", + gmnotes: "", + short: "", + value: 'Synthetic rope is exceptionally durable, elastic, and specifically designed to be easy to grip and climb. Although it lacks the strength and durability of cable lines, synthetic rope is significantly cheaper and lighter than those alternatives.
', + unidentified: "" + }, + source: "AR pg. 131", + type: "", + quantity: 1, + bulk: "L", + price: 1, + level: 1, + attuned: false, + equipped: false, + equippable: false, + identified: true, + attributes: { + sturdy: false, + customBuilt: false, + size: "medium", + dex: { + mod: "" + }, + hp: { + value: 6, + max: "" }, - "abilityMods": { - "parts": [] + hardness: { + value: "" + }, + ac: { + value: "" } }, - "flags": {}, - "img": "systems/sfrpg/icons/equipment/goods/intoxicant.jpg", - "effects": [] - } + modifiers: [], + damage: { + parts: [] + } + }, + flags: {}, + img: "systems/sfrpg/icons/equipment/goods/rope.jpg", + effects: [] }; //# sourceMappingURL=Items.js.map \ No newline at end of file diff --git a/dist/data/Items.js.map b/dist/data/Items.js.map index ddbbe4d..5ba6042 100644 --- a/dist/data/Items.js.map +++ b/dist/data/Items.js.map @@ -1 +1 @@ -{"version":3,"file":"Items.js","sourceRoot":"","sources":["../../src/data/Items.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"Items.js","sourceRoot":"","sources":["../../src/data/Items.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,KAAK,GAAG;IACjB,IAAI,EAAE;QACF,EAAE,IAAI,EAAE,2CAA2C,EAAE,WAAW,EAAE,EAAE,EAAE;QACtE;YACI,IAAI,EAAE,yBAAyB;YAC/B,WAAW,EACP,mEAAmE;SAC1E;QACD,EAAE,IAAI,EAAE,yCAAyC,EAAE,WAAW,EAAE,EAAE,EAAE;QACpE,EAAE,IAAI,EAAE,mBAAmB,EAAE,WAAW,EAAE,mBAAmB,EAAE;QAC/D,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,EAAE;QACtC,EAAE,IAAI,EAAE,kBAAkB,EAAE,WAAW,EAAE,EAAE,EAAE;QAC7C,EAAE,IAAI,EAAE,eAAe,EAAE,WAAW,EAAE,EAAE,EAAE;QAC1C;YACI,IAAI,EAAE,iBAAiB;YACvB,WAAW,EAAE,0CAA0C;SAC1D;QACD;YACI,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,oDAAoD;SACpE;QACD;YACI,IAAI,EAAE,aAAa;YACnB,WAAW,EACP,yDAAyD;SAChE;QACD,EAAE,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,yBAAyB,EAAE;QAChE,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,yBAAyB,EAAE;QAC9D,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,yBAAyB,EAAE;QAC/D,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,yBAAyB,EAAE;QAC/D;YACI,IAAI,EAAE,qBAAqB;YAC3B,WAAW,EAAE,oDAAoD;SACpE;QACD;YACI,IAAI,EAAE,UAAU;YAChB,WAAW,EACP,gEAAgE;SACvE;QACD,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,4BAA4B,EAAE;QACjE;YACI,IAAI,EAAE,kBAAkB;YACxB,WAAW,EAAE,uDAAuD;SACvE;QACD;YACI,IAAI,EAAE,MAAM;YACZ,WAAW,EAAE,gDAAgD;SAChE;QACD;YACI,IAAI,EAAE,SAAS;YACf,WAAW,EACP,6DAA6D;SACpE;QACD;YACI,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,sDAAsD;SACtE;QACD,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,kBAAkB,EAAE;QACxD,EAAE,IAAI,EAAE,gBAAgB,EAAE,WAAW,EAAE,wBAAwB,EAAE;QACjE;YACI,IAAI,EAAE,oBAAoB;YAC1B,WAAW,EAAE,qCAAqC;SACrD;KACJ;CACJ,CAAA;AAED,YAAY;AACZ,6GAA6G;AAC7G,0DAA0D;AAC1D,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC5B,IAAI,EAAE,oBAAoB;IAC1B,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE;QACF,WAAW,EAAE;YACT,IAAI,EAAE,EAAE;YACR,OAAO,EAAE,EAAE;YACX,KAAK,EAAE,EAAE;YACT,KAAK,EACD,wOAAwO;YAC5O,YAAY,EAAE,EAAE;SACnB;QACD,MAAM,EAAE,uBAAuB;QAC/B,IAAI,EAAE,EAAE;QACR,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,GAAG;QACT,KAAK,EAAE,CAAC;QACR,KAAK,EAAE,CAAC;QACR,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,KAAK;QACf,UAAU,EAAE,KAAK;QACjB,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE;YACR,MAAM,EAAE,KAAK;YACb,WAAW,EAAE,KAAK;YAClB,IAAI,EAAE,QAAQ;YACd,GAAG,EAAE;gBACD,GAAG,EAAE,EAAE;aACV;YACD,EAAE,EAAE;gBACA,KAAK,EAAE,CAAC;gBACR,GAAG,EAAE,EAAE;aACV;YACD,QAAQ,EAAE;gBACN,KAAK,EAAE,EAAE;aACZ;YACD,EAAE,EAAE;gBACA,KAAK,EAAE,EAAE;aACZ;SACJ;QACD,SAAS,EAAE;YACP;gBACI,IAAI,EAAE,oBAAoB;gBAC1B,QAAQ,EAAE,CAAC;gBACX,IAAI,EAAE,aAAa;gBACnB,UAAU,EAAE,MAAM;gBAClB,aAAa,EAAE,EAAE;gBACjB,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,uBAAuB;gBAC/B,KAAK,EAAE,EAAE;gBACT,YAAY,EAAE,UAAU;gBACxB,SAAS,EAAE,EAAE;gBACb,MAAM,EAAE,MAAM;gBACd,GAAG,EAAE,sCAAsC;aAC9C;SACJ;QACD,SAAS,EAAE;YACP,QAAQ,EAAE,EAAE;YACZ,OAAO,EAAE;gBACL;oBACI,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,EAAE;oBACX,MAAM,EAAE,CAAC;oBACT,WAAW,EAAE;wBACT,QAAQ;wBACR,WAAW;wBACX,OAAO;wBACP,YAAY;wBACZ,WAAW;wBACX,eAAe;wBACf,QAAQ;wBACR,SAAS;wBACT,cAAc;wBACd,OAAO;qBACV;oBACD,kBAAkB,EAAE,IAAI;oBACxB,cAAc,EAAE,MAAM;iBACzB;aACJ;YACD,MAAM,EAAE,IAAI;SACf;QACD,sBAAsB,EAAE,CAAC;QACzB,iBAAiB,EAAE;YACf,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,IAAI;YACX,UAAU,EAAE,IAAI;YAChB,SAAS,EAAE,IAAI;YACf,aAAa,EAAE,IAAI;YACnB,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,IAAI;YACb,YAAY,EAAE,IAAI;SACrB;QACD,MAAM,EAAE;YACJ,KAAK,EAAE,EAAE;SACZ;QACD,QAAQ,EAAE;YACN,KAAK,EAAE,EAAE;SACZ;QACD,WAAW,EAAE;YACT,KAAK,EAAE,EAAE;SACZ;KACJ;IACD,KAAK,EAAE,EAAE;IACT,GAAG,EAAE,2DAA2D;IAChE,OAAO,EAAE,EAAE;IACX,OAAO,EAAE;QACL,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,CAAC;QACT,kBAAkB,EAAE,IAAI;KAC3B;IACD,MAAM,EAAE,IAAI;IACZ,SAAS,EAAE,IAAI;IACf,UAAU,EAAE,IAAI;IAChB,KAAK,EAAE,IAAI;IACX,SAAS,EAAE,IAAI;IACf,MAAM,EAAE,KAAK;IACb,KAAK,EAAE,IAAI;IACX,aAAa,EAAE,IAAI;IACnB,MAAM,EAAE,IAAI;IACZ,OAAO,EAAE,IAAI;IACb,KAAK,EAAE,KAAK;IACZ,YAAY,EAAE,IAAI;IAClB,MAAM,EAAE,KAAK;IACb,eAAe,EAAE,KAAK;IACtB,aAAa,EAAE,KAAK;IACpB,aAAa,EAAE,KAAK;CACvB,CAAA;AACD,MAAM,CAAC,MAAM,eAAe,GAAG;IAC3B,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,OAAO;IACb,IAAI,EAAE;QACF,WAAW,EAAE;YACT,IAAI,EAAE,EAAE;YACR,OAAO,EAAE,EAAE;YACX,KAAK,EAAE,EAAE;YACT,KAAK,EACD,oKAAoK;YACxK,YAAY,EAAE,EAAE;SACnB;QACD,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,EAAE;QACR,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,GAAG;QACT,KAAK,EAAE,CAAC;QACR,KAAK,EAAE,CAAC;QACR,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,KAAK;QACf,UAAU,EAAE,KAAK;QACjB,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE;YACR,MAAM,EAAE,KAAK;YACb,WAAW,EAAE,KAAK;YAClB,IAAI,EAAE,QAAQ;YACd,GAAG,EAAE;gBACD,GAAG,EAAE,EAAE;aACV;YACD,EAAE,EAAE;gBACA,KAAK,EAAE,CAAC;gBACR,GAAG,EAAE,EAAE;aACV;YACD,QAAQ,EAAE;gBACN,KAAK,EAAE,EAAE;aACZ;YACD,EAAE,EAAE;gBACA,KAAK,EAAE,EAAE;aACZ;SACJ;QACD,SAAS,EAAE,EAAE;QACb,MAAM,EAAE;YACJ,KAAK,EAAE,EAAE;SACZ;QACD,QAAQ,EAAE;YACN,KAAK,EAAE,EAAE;SACZ;QACD,WAAW,EAAE;YACT,KAAK,EAAE,EAAE;SACZ;KACJ;IACD,KAAK,EAAE,EAAE;IACT,GAAG,EAAE,iDAAiD;IACtD,OAAO,EAAE,EAAE;CACJ,CAAA;AACX,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC7B,IAAI,EAAE,wBAAwB;IAC9B,IAAI,EAAE,OAAO;IACb,IAAI,EAAE;QACF,WAAW,EAAE;YACT,IAAI,EAAE,EAAE;YACR,OAAO,EAAE,EAAE;YACX,KAAK,EAAE,EAAE;YACT,KAAK,EACD,iXAAiX;YACrX,YAAY,EAAE,EAAE;SACnB;QACD,MAAM,EAAE,aAAa;QACrB,IAAI,EAAE,EAAE;QACR,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,GAAG;QACT,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,CAAC;QACR,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,KAAK;QACf,UAAU,EAAE,KAAK;QACjB,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE;YACR,MAAM,EAAE,KAAK;YACb,WAAW,EAAE,KAAK;YAClB,IAAI,EAAE,QAAQ;YACd,GAAG,EAAE;gBACD,GAAG,EAAE,EAAE;aACV;YACD,EAAE,EAAE;gBACA,KAAK,EAAE,CAAC;gBACR,GAAG,EAAE,EAAE;aACV;YACD,QAAQ,EAAE;gBACN,KAAK,EAAE,EAAE;aACZ;YACD,EAAE,EAAE;gBACA,KAAK,EAAE,EAAE;aACZ;SACJ;QACD,SAAS,EAAE,EAAE;QACb,MAAM,EAAE;YACJ,KAAK,EAAE,EAAE;SACZ;QACD,QAAQ,EAAE;YACN,KAAK,EAAE,EAAE;SACZ;QACD,WAAW,EAAE;YACT,KAAK,EAAE,EAAE;SACZ;KACJ;IACD,KAAK,EAAE,EAAE;IACT,GAAG,EAAE,mDAAmD;IACxD,OAAO,EAAE,EAAE;CACJ,CAAA;AACX,MAAM,CAAC,MAAM,WAAW,GAAG;IACvB,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,OAAO;IACb,IAAI,EAAE;QACF,WAAW,EAAE;YACT,IAAI,EAAE,EAAE;YACR,OAAO,EAAE,EAAE;YACX,KAAK,EAAE,EAAE;YACT,KAAK,EACD,4+CAA4+C;YACh/C,YAAY,EAAE,EAAE;SACnB;QACD,MAAM,EAAE,aAAa;QACrB,IAAI,EAAE,EAAE;QACR,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,GAAG;QACT,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,CAAC;QACR,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,KAAK;QACf,UAAU,EAAE,KAAK;QACjB,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE;YACR,MAAM,EAAE,KAAK;YACb,WAAW,EAAE,KAAK;YAClB,IAAI,EAAE,QAAQ;YACd,GAAG,EAAE;gBACD,GAAG,EAAE,EAAE;aACV;YACD,EAAE,EAAE;gBACA,KAAK,EAAE,CAAC;gBACR,GAAG,EAAE,EAAE;aACV;YACD,QAAQ,EAAE;gBACN,KAAK,EAAE,EAAE;aACZ;YACD,EAAE,EAAE;gBACA,KAAK,EAAE,EAAE;aACZ;SACJ;QACD,SAAS,EAAE,EAAE;QACb,MAAM,EAAE;YACJ,KAAK,EAAE,EAAE;SACZ;QACD,QAAQ,EAAE;YACN,KAAK,EAAE,EAAE;SACZ;QACD,WAAW,EAAE;YACT,KAAK,EAAE,EAAE;SACZ;KACJ;IACD,KAAK,EAAE,EAAE;IACT,GAAG,EAAE,6CAA6C;IAClD,OAAO,EAAE,EAAE;CACJ,CAAA;AACX,MAAM,CAAC,MAAM,eAAe,GAAG;IAC3B,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,OAAO;IACb,IAAI,EAAE;QACF,WAAW,EAAE;YACT,IAAI,EAAE,EAAE;YACR,OAAO,EAAE,EAAE;YACX,KAAK,EAAE,EAAE;YACT,KAAK,EACD,+ZAA+Z;YACna,YAAY,EAAE,EAAE;SACnB;QACD,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,EAAE;QACR,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,GAAG;QACT,KAAK,EAAE,CAAC;QACR,KAAK,EAAE,CAAC;QACR,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,KAAK;QACf,UAAU,EAAE,KAAK;QACjB,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE;YACR,MAAM,EAAE,KAAK;YACb,WAAW,EAAE,KAAK;YAClB,IAAI,EAAE,QAAQ;YACd,GAAG,EAAE;gBACD,GAAG,EAAE,EAAE;aACV;YACD,EAAE,EAAE;gBACA,KAAK,EAAE,CAAC;gBACR,GAAG,EAAE,EAAE;aACV;YACD,QAAQ,EAAE;gBACN,KAAK,EAAE,EAAE;aACZ;YACD,EAAE,EAAE;gBACA,KAAK,EAAE,EAAE;aACZ;SACJ;QACD,SAAS,EAAE,EAAE;QACb,MAAM,EAAE;YACJ,KAAK,EAAE,EAAE;SACZ;QACD,QAAQ,EAAE;YACN,KAAK,EAAE,EAAE;SACZ;QACD,WAAW,EAAE;YACT,KAAK,EAAE,EAAE;SACZ;KACJ;IACD,KAAK,EAAE,EAAE;IACT,GAAG,EAAE,iDAAiD;IACtD,OAAO,EAAE,EAAE;CACJ,CAAA;AACX,MAAM,CAAC,MAAM,eAAe,GAAG;IAC3B,IAAI,EAAE,mBAAmB;IACzB,IAAI,EAAE,OAAO;IACb,IAAI,EAAE;QACF,WAAW,EAAE;YACT,IAAI,EAAE,EAAE;YACR,OAAO,EAAE,EAAE;YACX,KAAK,EAAE,EAAE;YACT,KAAK,EACD,0YAA0Y;YAC9Y,YAAY,EAAE,EAAE;SACnB;QACD,MAAM,EAAE,YAAY;QACpB,IAAI,EAAE,EAAE;QACR,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,GAAG;QACT,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,CAAC;QACR,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,KAAK;QACf,UAAU,EAAE,KAAK;QACjB,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE;YACR,MAAM,EAAE,KAAK;YACb,WAAW,EAAE,KAAK;YAClB,IAAI,EAAE,QAAQ;YACd,GAAG,EAAE;gBACD,GAAG,EAAE,EAAE;aACV;YACD,EAAE,EAAE;gBACA,KAAK,EAAE,CAAC;gBACR,GAAG,EAAE,EAAE;aACV;YACD,QAAQ,EAAE;gBACN,KAAK,EAAE,EAAE;aACZ;YACD,EAAE,EAAE;gBACA,KAAK,EAAE,EAAE;aACZ;SACJ;QACD,SAAS,EAAE,EAAE;QACb,MAAM,EAAE;YACJ,KAAK,EAAE,EAAE;SACZ;QACD,QAAQ,EAAE;YACN,KAAK,EAAE,EAAE;SACZ;QACD,WAAW,EAAE;YACT,KAAK,EAAE,EAAE;SACZ;KACJ;IACD,KAAK,EAAE,EAAE;IACT,GAAG,EACC,4EAA4E;IAChF,OAAO,EAAE,EAAE;CACJ,CAAA;AACX,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACnC,IAAI,EAAE,mBAAmB;IACzB,IAAI,EAAE,OAAO;IACb,IAAI,EAAE;QACF,WAAW,EAAE;YACT,IAAI,EAAE,EAAE;YACR,OAAO,EAAE,EAAE;YACX,KAAK,EAAE,EAAE;YACT,KAAK,EACD,u4BAAu4B;YAC34B,YAAY,EAAE,EAAE;SACnB;QACD,MAAM,EAAE,eAAe;QACvB,IAAI,EAAE,EAAE;QACR,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,GAAG;QACT,KAAK,EAAE,CAAC;QACR,KAAK,EAAE,CAAC;QACR,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,KAAK;QACf,UAAU,EAAE,KAAK;QACjB,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE;YACR,MAAM,EAAE,KAAK;YACb,WAAW,EAAE,KAAK;YAClB,IAAI,EAAE,QAAQ;YACd,GAAG,EAAE;gBACD,GAAG,EAAE,EAAE;aACV;YACD,EAAE,EAAE;gBACA,KAAK,EAAE,CAAC;gBACR,GAAG,EAAE,EAAE;aACV;YACD,QAAQ,EAAE;gBACN,KAAK,EAAE,EAAE;aACZ;YACD,EAAE,EAAE;gBACA,KAAK,EAAE,EAAE;aACZ;SACJ;QACD,SAAS,EAAE,EAAE;QACb,MAAM,EAAE;YACJ,KAAK,EAAE,EAAE;SACZ;QACD,QAAQ,EAAE;YACN,KAAK,EAAE,EAAE;SACZ;QACD,WAAW,EAAE;YACT,KAAK,EAAE,EAAE;SACZ;KACJ;IACD,KAAK,EAAE,EAAE;IACT,GAAG,EAAE,oDAAoD;IACzD,OAAO,EAAE,EAAE;CACJ,CAAA;AACX,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACnC,IAAI,EAAE,kBAAkB;IACxB,IAAI,EAAE,OAAO;IACb,IAAI,EAAE;QACF,WAAW,EAAE;YACT,IAAI,EAAE,EAAE;YACR,OAAO,EAAE,EAAE;YACX,KAAK,EAAE,EAAE;YACT,KAAK,EACD,6kBAA6kB;YACjlB,YAAY,EAAE,EAAE;SACnB;QACD,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,EAAE;QACR,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,GAAG;QACT,KAAK,EAAE,CAAC;QACR,KAAK,EAAE,CAAC;QACR,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,KAAK;QACf,UAAU,EAAE,KAAK;QACjB,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE;YACR,MAAM,EAAE,KAAK;YACb,WAAW,EAAE,KAAK;YAClB,IAAI,EAAE,QAAQ;YACd,GAAG,EAAE;gBACD,GAAG,EAAE,EAAE;aACV;YACD,EAAE,EAAE;gBACA,KAAK,EAAE,CAAC;gBACR,GAAG,EAAE,EAAE;aACV;YACD,QAAQ,EAAE;gBACN,KAAK,EAAE,EAAE;aACZ;YACD,EAAE,EAAE;gBACA,KAAK,EAAE,EAAE;aACZ;SACJ;QACD,SAAS,EAAE,EAAE;QACb,MAAM,EAAE;YACJ,KAAK,EAAE,EAAE;SACZ;KACJ;IACD,KAAK,EAAE,EAAE;IACT,GAAG,EAAE,0DAA0D;IAC/D,OAAO,EAAE,EAAE;CACJ,CAAA;AACX,MAAM,CAAC,MAAM,YAAY,GAAG;IACxB,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,OAAO;IACb,IAAI,EAAE;QACF,WAAW,EAAE;YACT,IAAI,EAAE,EAAE;YACR,OAAO,EAAE,EAAE;YACX,KAAK,EAAE,EAAE;YACT,KAAK,EACD,0UAA0U;YAC9U,YAAY,EAAE,EAAE;SACnB;QACD,MAAM,EAAE,YAAY;QACpB,IAAI,EAAE,EAAE;QACR,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,GAAG;QACT,KAAK,EAAE,CAAC;QACR,KAAK,EAAE,CAAC;QACR,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,KAAK;QACf,UAAU,EAAE,KAAK;QACjB,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE;YACR,MAAM,EAAE,KAAK;YACb,WAAW,EAAE,KAAK;YAClB,IAAI,EAAE,QAAQ;YACd,GAAG,EAAE;gBACD,GAAG,EAAE,EAAE;aACV;YACD,EAAE,EAAE;gBACA,KAAK,EAAE,CAAC;gBACR,GAAG,EAAE,EAAE;aACV;YACD,QAAQ,EAAE;gBACN,KAAK,EAAE,EAAE;aACZ;YACD,EAAE,EAAE;gBACA,KAAK,EAAE,EAAE;aACZ;SACJ;QACD,SAAS,EAAE,EAAE;QACb,MAAM,EAAE;YACJ,KAAK,EAAE,EAAE;SACZ;KACJ;IACD,KAAK,EAAE,EAAE;IACT,GAAG,EAAE,8CAA8C;IACnD,OAAO,EAAE,EAAE;CACJ,CAAA"} \ No newline at end of file diff --git a/dist/data/MonsterCreation.js b/dist/data/MonsterCreation.js index afbbee8..8914ede 100644 --- a/dist/data/MonsterCreation.js +++ b/dist/data/MonsterCreation.js @@ -1,37 +1,393 @@ -export const CR = ["1/3", "1/2", "1", "2"]; +import { UniversalCreatureRules } from "./universal creature rules/UniversalCreatureRules.js"; +import AdjustmentSpecialAbility from "../models/AdjustmentSpecialAbility.js"; +/// List of creature combat ratings +export const CR = [ + "1/3", + "1/2", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10" +]; +// List of creature save types +export var Save; +(function (Save) { + Save["fortitude"] = "fort"; + Save["reflex"] = "reflex"; + Save["willpower"] = "will"; +})(Save || (Save = {})); +/// List of creature gender identities +export var Gender; +(function (Gender) { + Gender["male"] = "male"; + Gender["female"] = "female"; + Gender["nonBinary"] = "non-binary"; +})(Gender || (Gender = {})); +/// List of creature sizes +export var Size; +(function (Size) { + Size[Size["small"] = 0] = "small"; + Size[Size["medium"] = 1] = "medium"; + Size[Size["large"] = 2] = "large"; +})(Size || (Size = {})); +/// List of Monster Reference Symbols +export var MonsterReferenceSymbol; +(function (MonsterReferenceSymbol) { + MonsterReferenceSymbol[MonsterReferenceSymbol["combatant"] = 0] = "combatant"; + MonsterReferenceSymbol[MonsterReferenceSymbol["expert"] = 1] = "expert"; + MonsterReferenceSymbol[MonsterReferenceSymbol["spellcaster"] = 2] = "spellcaster"; +})(MonsterReferenceSymbol || (MonsterReferenceSymbol = {})); +export var MonsterSkillType; +(function (MonsterSkillType) { + MonsterSkillType[MonsterSkillType["good"] = 0] = "good"; + MonsterSkillType[MonsterSkillType["master"] = 1] = "master"; +})(MonsterSkillType || (MonsterSkillType = {})); +/// Collection of monster creation statistics and special abilities used to generate new creatures export const MonsterCreation = { arrays: { // Expert Arrays expert: { - name: "expert", + name: MonsterReferenceSymbol.expert, main: { - "1/3": { CR: CR[0], EAC: 10, KAC: 11, fort: 0, reflex: 0, will: 2, HP: 6, abilityMods: [3, 1, 0], masterSkill: { count: 3, mod: 7 }, goodSkill: { count: 2, mod: 3 } }, - "1/2": { CR: CR[1], EAC: 10, KAC: 11, fort: 0, reflex: 0, will: 3, HP: 12, abilityMods: [3, 2, 1], masterSkill: { count: 3, mod: 9 }, goodSkill: { count: 2, mod: 4 } }, - "1": { CR: CR[2], EAC: 11, KAC: 12, fort: 1, reflex: 1, will: 4, HP: 17, abilityMods: [4, 2, 1], masterSkill: { count: 3, mod: 10 }, goodSkill: { count: 2, mod: 5 } }, - "2": { CR: CR[3], EAC: 13, KAC: 14, fort: 1, reflex: 1, will: 5, HP: 23, abilityMods: [4, 2, 1], masterSkill: { count: 3, mod: 12 }, goodSkill: { count: 2, mod: 7 } } + "1/3": { + CR: CR[0], + EAC: 10, + KAC: 11, + fort: 0, + reflex: 0, + will: 2, + HP: 6, + abilityMods: [3, 1, 0], + specialAbilities: 1, + masterSkill: { count: 3, mod: 7 }, + goodSkill: { count: 2, mod: 3 } + }, + "1/2": { + CR: CR[1], + EAC: 10, + KAC: 11, + fort: 0, + reflex: 0, + will: 3, + HP: 12, + abilityMods: [3, 2, 1], + specialAbilities: 1, + masterSkill: { count: 3, mod: 9 }, + goodSkill: { count: 2, mod: 4 } + }, + "1": { + CR: CR[2], + EAC: 11, + KAC: 12, + fort: 1, + reflex: 1, + will: 4, + HP: 17, + abilityMods: [4, 2, 1], + specialAbilities: 1, + masterSkill: { count: 3, mod: 10 }, + goodSkill: { count: 2, mod: 5 } + }, + "2": { + CR: CR[3], + EAC: 13, + KAC: 14, + fort: 1, + reflex: 1, + will: 5, + HP: 23, + abilityMods: [4, 2, 1], + specialAbilities: 1, + masterSkill: { count: 3, mod: 12 }, + goodSkill: { count: 2, mod: 7 } + }, + "3": { + CR: CR[4], + EAC: 14, + KAC: 15, + fort: 2, + reflex: 2, + will: 6, + HP: 35, + abilityMods: [4, 2, 1], + specialAbilities: 2, + masterSkill: { count: 3, mod: 13 }, + goodSkill: { count: 2, mod: 8 } + }, + "4": { + CR: CR[5], + EAC: 16, + KAC: 17, + fort: 3, + reflex: 3, + will: 7, + HP: 45, + abilityMods: [5, 3, 1], + specialAbilities: 2, + masterSkill: { count: 3, mod: 15 }, + goodSkill: { count: 2, mod: 10 } + }, + "5": { + CR: CR[6], + EAC: 17, + KAC: 18, + fort: 4, + reflex: 4, + will: 8, + HP: 65, + abilityMods: [5, 3, 2], + specialAbilities: 2, + masterSkill: { count: 3, mod: 16 }, + goodSkill: { count: 2, mod: 11 } + } }, attack: { - "1/3": { high: 2, low: 0, energy: "1d4", kinetic: "1d4", standard: "1d4 + @abilities.str.mod" }, - "1/2": { high: 4, low: 2, energy: "1d4", kinetic: "1d4", standard: "1d4 + @abilities.str.mod" }, - "1": { high: 6, low: 4, energy: "1d4+1", kinetic: "1d4+1", standard: "1d4 + 1 + @abilities.str.mod" }, - "2": { high: 8, low: 6, energy: "1d4+2", kinetic: "1d4+2", standard: "1d4 + 2 + @abilities.str.mod" } + "1/3": { + high: 2, + low: 0, + energy: "1d4", + kinetic: "1d4", + standard: "1d4 + @abilities.str.mod" + }, + "1/2": { + high: 4, + low: 2, + energy: "1d4", + kinetic: "1d4", + standard: "1d4 + @abilities.str.mod" + }, + "1": { + high: 6, + low: 4, + energy: "1d4+1", + kinetic: "1d4+1", + standard: "1d4 + 1 + @abilities.str.mod" + }, + "2": { + high: 8, + low: 6, + energy: "1d4+2", + kinetic: "1d4+2", + standard: "1d4 + 2 + @abilities.str.mod" + }, + "3": { + high: 9, + low: 7, + energy: "1d4+3", + kinetic: "1d4+3", + standard: "1d4 + 3 + @abilities.str.mod" + }, + "4": { + high: 10, + low: 8, + energy: "1d4+4", + kinetic: "1d4+4", + standard: "1d4 + 4 + @abilities.str.mod" + }, + "5": { + high: 12, + low: 10, + energy: "1d4+5", + kinetic: "1d6+5", + standard: "1d4 + 5 + @abilities.str.mod" + }, + "6": { + high: 14, + low: 12, + energy: "1d6+6", + kinetic: "1d8+6", + standard: "1d6 + 6 + @abilities.str.mod" + }, + "7": { + high: 15, + low: 13, + energy: "1d8+7", + kinetic: "1d12+7", + standard: "1d8 + 7 + @abilities.str.mod" + } } }, combatant: { - name: "combatant", + name: MonsterReferenceSymbol.combatant, main: { - "1/3": { CR: CR[0], EAC: 10, KAC: 12, fort: 1, reflex: 1, will: 0, HP: 6, abilityMods: [3, 1, 0], masterSkill: { count: 1, mod: 7 }, goodSkill: { count: 2, mod: 3 } }, - "1/2": { CR: CR[1], EAC: 10, KAC: 12, fort: 2, reflex: 2, will: 0, HP: 13, abilityMods: [3, 2, 1], masterSkill: { count: 1, mod: 9 }, goodSkill: { count: 2, mod: 4 } }, - "1": { CR: CR[2], EAC: 11, KAC: 13, fort: 3, reflex: 3, will: 1, HP: 20, abilityMods: [4, 2, 1], masterSkill: { count: 1, mod: 10 }, goodSkill: { count: 2, mod: 5 } }, - "2": { CR: CR[3], EAC: 13, KAC: 15, fort: 4, reflex: 4, will: 1, HP: 25, abilityMods: [4, 2, 1], masterSkill: { count: 1, mod: 12 }, goodSkill: { count: 2, mod: 7 } } + "1/3": { + CR: CR[0], + EAC: 10, + KAC: 12, + fort: 1, + reflex: 1, + will: 0, + HP: 6, + abilityMods: [3, 1, 0], + specialAbilities: 1, + masterSkill: { count: 1, mod: 7 }, + goodSkill: { count: 2, mod: 3 } + }, + "1/2": { + CR: CR[1], + EAC: 10, + KAC: 12, + fort: 2, + reflex: 2, + will: 0, + HP: 13, + abilityMods: [3, 2, 1], + specialAbilities: 1, + masterSkill: { count: 1, mod: 9 }, + goodSkill: { count: 2, mod: 4 } + }, + "1": { + CR: CR[2], + EAC: 11, + KAC: 13, + fort: 3, + reflex: 3, + will: 1, + HP: 20, + abilityMods: [4, 2, 1], + specialAbilities: 1, + masterSkill: { count: 1, mod: 10 }, + goodSkill: { count: 2, mod: 5 } + }, + "2": { + CR: CR[3], + EAC: 13, + KAC: 15, + fort: 4, + reflex: 4, + will: 1, + HP: 25, + abilityMods: [4, 2, 1], + specialAbilities: 2, + masterSkill: { count: 1, mod: 12 }, + goodSkill: { count: 2, mod: 7 } + }, + "3": { + CR: CR[4], + EAC: 14, + KAC: 16, + fort: 5, + reflex: 5, + will: 2, + HP: 40, + abilityMods: [4, 2, 1], + specialAbilities: 2, + masterSkill: { count: 1, mod: 13 }, + goodSkill: { count: 2, mod: 8 } + }, + "4": { + CR: CR[5], + EAC: 16, + KAC: 18, + fort: 6, + reflex: 6, + will: 3, + HP: 50, + abilityMods: [5, 3, 1], + specialAbilities: 2, + masterSkill: { count: 1, mod: 15 }, + goodSkill: { count: 2, mod: 10 } + }, + "5": { + CR: CR[6], + EAC: 17, + KAC: 19, + fort: 7, + reflex: 7, + will: 4, + HP: 70, + abilityMods: [5, 3, 2], + specialAbilities: 2, + masterSkill: { count: 1, mod: 16 }, + goodSkill: { count: 2, mod: 11 } + } }, attack: { - "1/3": { high: 4, low: 1, energy: "1d4", kinetic: "1d4", standard: "1d6 + @abilities.str.mod" }, - "1/2": { high: 6, low: 3, energy: "1d4", kinetic: "1d6", standard: "1d6 + @abilities.str.mod" }, - "1": { high: 8, low: 5, energy: "1d4+1", kinetic: "1d6+1", standard: "1d6 + 1 + @abilities.str.mod" }, - "2": { high: 10, low: 7, energy: "1d4+2", kinetic: "1d6+2", standard: "1d6 + 2 + @abilities.str.mod" } + "1/3": { + high: 4, + low: 1, + energy: "1d4", + kinetic: "1d4", + standard: "1d6 + @abilities.str.mod" + }, + "1/2": { + high: 6, + low: 3, + energy: "1d4", + kinetic: "1d6", + standard: "1d6 + @abilities.str.mod" + }, + "1": { + high: 8, + low: 5, + energy: "1d4+1", + kinetic: "1d6+1", + standard: "1d6 + 1 + @abilities.str.mod" + }, + "2": { + high: 10, + low: 7, + energy: "1d4+2", + kinetic: "1d6+2", + standard: "1d6 + 2 + @abilities.str.mod" + }, + "3": { + high: 11, + low: 8, + energy: "1d4+3", + kinetic: "1d6+3", + standard: "1d6 + 3 + @abilities.str.mod" + }, + "4": { + high: 12, + low: 9, + energy: "1d4+4", + kinetic: "1d6+4", + standard: "1d6 + 4 + @abilities.str.mod" + }, + "5": { + high: 14, + low: 11, + energy: "1d6+5", + kinetic: "1d8+5", + standard: "1d6 + 5 + @abilities.str.mod" + }, + "6": { + high: 16, + low: 13, + energy: "1d10+6", + kinetic: "2d6+6", + standard: "1d8 + 6 + @abilities.str.mod" + }, + "7": { + high: 17, + low: 14, + energy: "2d6+7", + kinetic: "2d8+7", + standard: "2d6 + 7 + @abilities.str.mod" + } } } + }, + specialAbilities: { + universalCreatureRule: { + ferocity: UniversalCreatureRules.ferocity, + naturalWeapons: UniversalCreatureRules.naturalWeapons, + integratedWeapons: UniversalCreatureRules.integratedWeapons + }, + adjustment: { + brute: new AdjustmentSpecialAbility("brute", "Use the low attack value for the NPC’s main attack, but determine the attack’s damage as if the NPC’s CR were 2 higher (adding the extra damage from weapon specialization). This special ability has a greater impact at higher CRs."), + extraHitPoints: new AdjustmentSpecialAbility("extra hit points", "Increase the NPC’s HP by 20%."), + saveBoost: new AdjustmentSpecialAbility("save boost", "Increase all saving throw bonuses by 1 or one saving throw bonus by 3."), + //TODO: Secondary Magic + skillful: new AdjustmentSpecialAbility("skillful", "Increase all master and good skill bonuses by 1.") + } } }; //# sourceMappingURL=MonsterCreation.js.map \ No newline at end of file diff --git a/dist/data/MonsterCreation.js.map b/dist/data/MonsterCreation.js.map index 4c32d20..8652f7c 100644 --- a/dist/data/MonsterCreation.js.map +++ b/dist/data/MonsterCreation.js.map @@ -1 +1 @@ -{"version":3,"file":"MonsterCreation.js","sourceRoot":"","sources":["../../src/data/MonsterCreation.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"MonsterCreation.js","sourceRoot":"","sources":["../../src/data/MonsterCreation.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/data/Names.js b/dist/data/Names.js index 5f6d70f..ab9c5a3 100644 --- a/dist/data/Names.js +++ b/dist/data/Names.js @@ -2,41 +2,366 @@ export const Names = {}; // TODO: Currently best suited in JavaScript, too much boilerplate involved in expressing in TypeScript. Should re-evaluate in future when more experienced. // NOTE: Default is also used for human names // Default -Names.default = { male: {}, female: {}, other: {} }; -Names.default.format = "{0} {1}"; +Names.default = { format: "{0} {1}", male: {}, female: {}, other: {} }; Names.default.other.first = ["Sam", "Riley"]; -Names.default.male.first = ["Adrian", "Alex", "Alfred", "Bob", "Dale", "George", "John", "Jordan", "Jovan", "Tom", "Reginald", "Ryan"].concat(Names.default.other.first); -Names.default.female.first = ["Alice", "Cara", "Jenn", "Tess", "Rachel", "Rebecca", "Tina", "Trish"].concat(Names.default.other.first); -Names.default.last = ["Adamson", "Black", "Johnson", "Mason", "Thompson", "Slat", "Stone", "Richards", "Ronson", "Watson", "White"]; +Names.default.male.first = [ + "Adrian", + "Alex", + "Alfred", + "Bob", + "Dale", + "George", + "John", + "Jordan", + "Jovan", + "Tom", + "Reginald", + "Ryan" +].concat(Names.default.other.first); +Names.default.female.first = [ + "Alice", + "Cara", + "Jenn", + "Tess", + "Rachel", + "Rebecca", + "Tina", + "Trish" +].concat(Names.default.other.first); +Names.default.last = [ + "Adamson", + "Black", + "Johnson", + "Mason", + "Thompson", + "Slat", + "Stone", + "Richards", + "Ronson", + "Watson", + "White" +]; // Exotic Names.exotic = { male: {}, female: {}, other: {} }; Names.exotic.format = "{0}{1}"; -Names.exotic.other.first = ["Abrog", "Amiell", "Egnils", "Eskas", "Folta", "Kusi", "Lessaith", "Nukteins", "Oltah", "Qharruits", "Qhihrer", "Sea", "Sugik", "Tasosh", "Throlphirs", "Vu"]; +Names.exotic.other.first = [ + "Abrog", + "Amiell", + "Egnils", + "Eskas", + "Folta", + "Kusi", + "Lessaith", + "Nukteins", + "Oltah", + "Qharruits", + "Qhihrer", + "Sea", + "Sugik", + "Tasosh", + "Throlphirs", + "Vu" +]; Names.exotic.male.first = Names.exotic.other.first; Names.exotic.female.first = Names.exotic.other.first; -Names.exotic.denominator = ["'a", "-a", " a", "a", "bo", "cha", "'o", "oyo", "s", "", "", "", "", "", "", "", ""]; // Denominators are appended onto name without a space +Names.exotic.denominator = [ + "'a", + "-a", + " a", + "a", + "bo", + "cha", + "'o", + "oyo", + "s", + "", + "", + "", + "", + "", + "", + "", + "" +]; // Denominators are appended onto name without a space Names.exotic.last = [""]; // No last names // Android Names.android = { male: {} }; Names.android.format = "{0}{1}"; -Names.android.male.first = ["Article", "Avoph", "Burst", "Clarity", "Fluke", "Mercy", "Magic", "Mode", "Requiem", "Simple", "Wisdom", "Union"]; -Names.android.denominator = ["-0", "-1", "-2", "-3", "-4", "-55", "-7", "-12", "-64", "-99", "", "", "", ""]; // Denominators are appended onto name without a space +Names.android.male.first = [ + "Article", + "Avoph", + "Burst", + "Clarity", + "Fluke", + "Mercy", + "Magic", + "Mode", + "Requiem", + "Simple", + "Wisdom", + "Union" +]; +Names.android.denominator = [ + "-0", + "-1", + "-2", + "-3", + "-4", + "-55", + "-7", + "-12", + "-64", + "-99", + "", + "", + "", + "" +]; // Denominators are appended onto name without a space Names.android.last = [""]; // No last names // Dwarf Names.dwarf = { male: {}, female: {} }; -Names.dwarf.male.first = ["Luldream", "Ginik", "Grolgulir", "Nodrac", "Turgrol", "Yarbud"]; -Names.dwarf.female.first = ["Lokhubela", "Hozzida", "Gotribera", "Sarsolda", "Yagraeda", "Yarohilda"]; -Names.dwarf.last = ["Barrelshoulder", "Bristleshield", "Bronzemaker", "Coalstone", "Ironcview", "Koboldbow", "Largebrow", "Orebreaker", "Wraithgranite"]; +Names.dwarf.male.first = [ + "Luldream", + "Ginik", + "Grolgulir", + "Nodrac", + "Turgrol", + "Yarbud" +]; +Names.dwarf.female.first = [ + "Lokhubela", + "Hozzida", + "Gotribera", + "Sarsolda", + "Yagraeda", + "Yarohilda" +]; +Names.dwarf.last = [ + "Barrelshoulder", + "Bristleshield", + "Bronzemaker", + "Coalstone", + "Ironcview", + "Koboldbow", + "Largebrow", + "Orebreaker", + "Wraithgranite" +]; +// Drow Names.drow = { male: {}, female: {} }; -Names.drow.male.first = ["Arcavato", "Dantrag", "Dresmorlin", "Dro", "Drovic", "Duagloth", "Durdyn", "Firyin", "Kaelmourn", "Gogloth", "Nyloth", "Merrryn", "Mirrendier", "Naltel", "Pharnox", "Syrendross", "Rizraen", "Zov"]; -Names.drow.female.first = ["Ahlysaaria", "Belmarniss", "Cylellinth", "Drada", "Dralia", "Drisinil", "Ilvaria", "Johysis", "Jysdra", "Jhaelnitra", "Loscivia", "Ghina", "Neerda", "Tyvorhan", "Ulumbralya", "Volundeil"]; -Names.drow.last = ["Abaeir", "Abbylan", "Argith", "Baenre", "Beltaulur", "Blaerabban", "Blundyth", "Chaulssin", "Coborel", "Coloara", "Cormrael", "Daevion'lyr", "Dalael", "Dhalmass", "Dryaalis", "Dyrr", "Duskryn", "Mizzrarran", "Mizzrear", "T'orgh", "Vrinn", "Zaphresz", "Zauviir", "Zolond"]; -Names.drow.denominator = [" of House Zeizerer", " of House Arabani", " of House Cyrocaust", " of House Xicton", " of House Blasfamus", "", "", "", "", "", "", "", "", "", "", ""]; // Denominators are appended onto name without a space +Names.drow.male.first = [ + "Arcavato", + "Dantrag", + "Dresmorlin", + "Dro", + "Drovic", + "Duagloth", + "Durdyn", + "Firyin", + "Kaelmourn", + "Gogloth", + "Nyloth", + "Merrryn", + "Mirrendier", + "Naltel", + "Pharnox", + "Syrendross", + "Rizraen", + "Zov" +]; +Names.drow.female.first = [ + "Ahlysaaria", + "Belmarniss", + "Cylellinth", + "Drada", + "Dralia", + "Drisinil", + "Ilvaria", + "Johysis", + "Jysdra", + "Jhaelnitra", + "Loscivia", + "Ghina", + "Neerda", + "Tyvorhan", + "Ulumbralya", + "Volundeil" +]; +Names.drow.last = [ + "Abaeir", + "Abbylan", + "Argith", + "Baenre", + "Beltaulur", + "Blaerabban", + "Blundyth", + "Chaulssin", + "Coborel", + "Coloara", + "Cormrael", + "Daevion'lyr", + "Dalael", + "Dhalmass", + "Dryaalis", + "Dyrr", + "Duskryn", + "Mizzrarran", + "Mizzrear", + "T'orgh", + "Vrinn", + "Zaphresz", + "Zauviir", + "Zolond" +]; +Names.drow.denominator = [ + " of House Zeizerer", + " of House Arabani", + " of House Cyrocaust", + " of House Xicton", + " of House Blasfamus", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" +]; // Denominators are appended onto name without a space +// Elf +Names.elf = { male: {}, female: {} }; +Names.elf.male.first = [ + "Cul", + "Elvoss", + "Fin", + "Keis", + "Krel", + "Hom", + "Icvin", + "Mas", + "Mass", + "Nem", + "Nothi", + "Sass", + "Tasil", + "Utham", + "Vir", + "Zeis", + "Zemuglogom" +]; +Names.elf.female.first = [ + "Arri", + "Acae", + "Alle", + "Ila", + "Phali", + "Phaves", + "Saahhil", + "Sinnis", + "Sumanrin", + "Yarnis", + "Vuha", + "Ulma" +]; +Names.elf.last = [ + "Car", + "Das", + "Essu", + "Kor", + "Kos", + "Jier", + "Mis", + "Oreldlun", + "Sam", + "Sharliphos", + "Veeclor", + "Yurayu", + "Vam", + "Vuna" +]; +// Half-elf (uses default names) +// Half-orc +Names.halfOrc = { male: {}, female: {} }; +Names.halfOrc.male.first = [ + "Bazzosk", + "Bros", + "Buk", + "Hezrulm", + "Ogdig", + "Purg" +]; +Names.halfOrc.female.first = [ + "Rabla", + "Habre", + "Hedli", + "Ohralru", + "Rzela", + "Vabla" +]; +Names.halfOrc.last = [ + "Bak", + "Ber", + "Dazro", + "Dom", + "Ekaxle", + "Jirvi", + "Jom", + "Juxlanrev", + "Revomutsky", + "Rozkum", + "Tondrerem", + "Som", + "Soshky", + "Wiz", + "Vux" +]; // Halfling Names.halfling = { male: {}, female: {} }; -Names.halfling.male.first = ["Balderic", "Drogo", "Filbo", "Samwise", "Sorbo"].concat(Names.default.male.first); //Default first names are appropriate for halflings as well -Names.halfling.female.first = ["Berenga", "Hilda", "Lalia", "Sherry", "Pamphila"].concat(Names.default.female.first); //Default first names are appropriate for halflings as well -Names.halfling.last = ["Biggums", "Boulderhill", "Gardner", "Goodchild", "Langham", "Oakbottom", "Smallburrow", "Thornburrow", "Underhill", "Undertree"]; +Names.halfling.male.first = [ + "Balderic", + "Drogo", + "Filbo", + "Samwise", + "Sorbo" +].concat(Names.default.male.first); //Default first names are appropriate for halflings as well +Names.halfling.female.first = [ + "Berenga", + "Hilda", + "Lalia", + "Sherry", + "Pamphila" +].concat(Names.default.female.first); //Default first names are appropriate for halflings as well +Names.halfling.last = [ + "Biggums", + "Boulderhill", + "Gardner", + "Goodchild", + "Langham", + "Oakbottom", + "Smallburrow", + "Thornburrow", + "Underhill", + "Undertree" +]; +// Hobgoblin +Names.hobgoblin = { male: {} }; +Names.hobgoblin.male.first = [ + "Dithik", + "Drarud", + "Ettod", + "Ketreng", + "Ditrer", + "Kerdun", + "Nogtod", + "Relbim", + "Radret", + "Sakhang", + "Talbin" +]; +Names.hobgoblin.last = [""]; // No last names // Gnoll Names.gnoll = { male: {}, female: {}, other: {} }; Names.gnoll.other.first = ["Ot", "Sru", "Gnet"]; @@ -45,15 +370,71 @@ Names.gnoll.female.first = ["Byz", "Meih", "Nyhn", "Thiar"].concat(Names.gnoll.o Names.gnoll.last = [""]; // No last names // Gnome Names.gnome = { male: {}, female: {}, other: {} }; -Names.gnome.other.first = ["Glakpap", "Gnefipnoc", "Hednibyl", "Mansbikuc", "Mawugbert", "Zulmen"]; -Names.gnome.male.first = ["Blakweda", "Clilbefut", "Shaimbess", "Shelben", "Wanudlym"].concat(Names.gnome.other.first); -Names.gnome.female.first = ["Boovikort", "Gobkirt", "Slunsmat", "Wupnic", "Zemzap"].concat(Names.gnome.other.first); +Names.gnome.other.first = [ + "Glakpap", + "Gnefipnoc", + "Hednibyl", + "Mansbikuc", + "Mawugbert", + "Zulmen" +]; +Names.gnome.male.first = [ + "Blakweda", + "Clilbefut", + "Shaimbess", + "Shelben", + "Wanudlym" +].concat(Names.gnome.other.first); +Names.gnome.female.first = [ + "Boovikort", + "Gobkirt", + "Slunsmat", + "Wupnic", + "Zemzap" +].concat(Names.gnome.other.first); Names.gnome.last = [""]; // No last names // Kasatha Names.kasatha = { male: {} }; -Names.kasatha.male.first = ["Cas", "De Holetif", "Gotaldus", "Jatsol", "Jiltof", "Maecran", "Mahas", "Nilaltrom", "Tursal", "Tyemsil", "Zuna"]; // All Kasatha names are non-gendered +Names.kasatha.male.first = [ + "Cas", + "De Holetif", + "Gotaldus", + "Jatsol", + "Jiltof", + "Maecran", + "Mahas", + "Nilaltrom", + "Tursal", + "Tyemsil", + "Zuna" +]; // All Kasatha names are non-gendered Names.kasatha.last = [""]; // No last names // Lashunta (uses default names) +Names.lashunta = { male: {} }; +Names.lashunta.male.first = [ + "All", + "Dasel", + "Doles", + "Eieny", + "Iss", + "Ma", + "Mekafi", + "Niamas", + "Novo", + "Os", + "Thirenes", + "Seva", + "Taeoss", + "Te", + "Thofudol", + "Tonell", + "Vila", + "Zhaloloss", + "Zhefuh", + "Zinell", + "Zhohi" +]; // All Lashunta names are non-gendered +Names.lashunta.last = [""]; // No last names // Naur (uses exotic names) Names.nuar = Names.exotic; // Shirren (uses exotic names) @@ -63,4 +444,90 @@ Names.skittermander = Names.exotic; // Vesk (uses exotic names) Names.vesk = Names.exotic; // Ysoki (uses default names) +// Creature type names +Names.animal = { male: {} }; +Names.animal.format = "{0}{1}"; +Names.animal.male.first = [ + "Astra", + "Barnn", + "Coyo", + "Cy", + "Flam", + "Hippo", + "Mega", + "Neo", + "Ovi", + "Omni" +]; // Used for first half of animal name +Names.animal.last = ["iguano", "raptor", "aroo", "", ""]; // Used for second half of animal name +Names.animal.denominator = [ + "don", + "saur", + "oda", + "opus", + "amimus", + "mander", + "", + "", + "", + "", + "", + "" +]; // Used as an optional suffix in the animal name +// +Names.construct = { male: {} }; +Names.construct.format = "{0}{1}"; +Names.construct.male.first = ["Buzz", "Zap", "Shoot", "Swoosh"]; +Names.construct.last = ["bot", "inator"]; +Names.construct.denominator = [ + "", + " 0", + " 1", + " 2", + " 3", + " 4", + " 5", + " 6", + " 2000", + " 3000" +]; +// +Names.ooze = { male: {} }; +Names.ooze.format = "{0}"; +Names.ooze.male.first = [ + "Bloop", + "Boop", + "Brupp", + "Brzz", + "Floop", + "Froop", + "Fzzz", + "Goop", + "Gzzz", + "Sloop", + "Szzz", + "Zoop", + "Zzt" +]; +Names.ooze.last = []; // Only uses first names +// +Names.vermin = { male: {} }; +Names.vermin.format = "{0}{1}"; +Names.vermin.male.first = [ + "Archae", + "Anthi", + "Anobi", + "Bembi", + "Cleri", + "Chrysi", + "Evani", + "Ichneu", + "Lepido", + "Manto", + "Mega", + "Trogo", + "Xylo" +]; // Used for first half of animal name +Names.vermin.last = ["bio", "dea", "mero", "somelidae", "tera"]; // Used for second half of vermin name +Names.vermin.denominator = ["pede", " spider", " worm", "", "", ""]; //# sourceMappingURL=Names.js.map \ No newline at end of file diff --git a/dist/data/Names.js.map b/dist/data/Names.js.map index 12bdae2..34cfd75 100644 --- a/dist/data/Names.js.map +++ b/dist/data/Names.js.map @@ -1 +1 @@ -{"version":3,"file":"Names.js","sourceRoot":"","sources":["../../src/data/Names.js"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"Names.js","sourceRoot":"","sources":["../../src/data/Names.js"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,CAAA;AACvB,4JAA4J;AAC5J,6CAA6C;AAE7C,UAAU;AACV,KAAK,CAAC,OAAO,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;AACtE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;AAC5C,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG;IACvB,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,KAAK;IACL,MAAM;IACN,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,OAAO;IACP,KAAK;IACL,UAAU;IACV,MAAM;CACT,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;AACnC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG;IACzB,OAAO;IACP,MAAM;IACN,MAAM;IACN,MAAM;IACN,QAAQ;IACR,SAAS;IACT,MAAM;IACN,OAAO;CACV,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;AACnC,KAAK,CAAC,OAAO,CAAC,IAAI,GAAG;IACjB,SAAS;IACT,OAAO;IACP,SAAS;IACT,OAAO;IACP,UAAU;IACV,MAAM;IACN,OAAO;IACP,UAAU;IACV,QAAQ;IACR,QAAQ;IACR,OAAO;CACV,CAAA;AACD,SAAS;AACT,KAAK,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;AAClD,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAA;AAC9B,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG;IACvB,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,OAAO;IACP,MAAM;IACN,UAAU;IACV,UAAU;IACV,OAAO;IACP,WAAW;IACX,SAAS;IACT,KAAK;IACL,OAAO;IACP,QAAQ;IACR,YAAY;IACZ,IAAI;CACP,CAAA;AACD,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAA;AAClD,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAA;AACpD,KAAK,CAAC,MAAM,CAAC,WAAW,GAAG;IACvB,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,GAAG;IACH,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,KAAK;IACL,GAAG;IACH,EAAE;IACF,EAAE;IACF,EAAE;IACF,EAAE;IACF,EAAE;IACF,EAAE;IACF,EAAE;IACF,EAAE;CACL,CAAA,CAAC,sDAAsD;AACxD,KAAK,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAA,CAAC,gBAAgB;AACzC,UAAU;AACV,KAAK,CAAC,OAAO,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,CAAA;AAC5B,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAA;AAC/B,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG;IACvB,SAAS;IACT,OAAO;IACP,OAAO;IACP,SAAS;IACT,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,OAAO;CACV,CAAA;AACD,KAAK,CAAC,OAAO,CAAC,WAAW,GAAG;IACxB,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,KAAK;IACL,KAAK;IACL,KAAK;IACL,EAAE;IACF,EAAE;IACF,EAAE;IACF,EAAE;CACL,CAAA,CAAC,sDAAsD;AACxD,KAAK,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAA,CAAC,gBAAgB;AAC1C,QAAQ;AACR,KAAK,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;AACtC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG;IACrB,UAAU;IACV,OAAO;IACP,WAAW;IACX,QAAQ;IACR,SAAS;IACT,QAAQ;CACX,CAAA;AACD,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG;IACvB,WAAW;IACX,SAAS;IACT,WAAW;IACX,UAAU;IACV,UAAU;IACV,WAAW;CACd,CAAA;AACD,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG;IACf,gBAAgB;IAChB,eAAe;IACf,aAAa;IACb,WAAW;IACX,WAAW;IACX,WAAW;IACX,WAAW;IACX,YAAY;IACZ,eAAe;CAClB,CAAA;AACD,OAAO;AACP,KAAK,CAAC,IAAI,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;AACrC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG;IACpB,UAAU;IACV,SAAS;IACT,YAAY;IACZ,KAAK;IACL,QAAQ;IACR,UAAU;IACV,QAAQ;IACR,QAAQ;IACR,WAAW;IACX,SAAS;IACT,QAAQ;IACR,SAAS;IACT,YAAY;IACZ,QAAQ;IACR,SAAS;IACT,YAAY;IACZ,SAAS;IACT,KAAK;CACR,CAAA;AACD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG;IACtB,YAAY;IACZ,YAAY;IACZ,YAAY;IACZ,OAAO;IACP,QAAQ;IACR,UAAU;IACV,SAAS;IACT,SAAS;IACT,QAAQ;IACR,YAAY;IACZ,UAAU;IACV,OAAO;IACP,QAAQ;IACR,UAAU;IACV,YAAY;IACZ,WAAW;CACd,CAAA;AACD,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG;IACd,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,WAAW;IACX,YAAY;IACZ,UAAU;IACV,WAAW;IACX,SAAS;IACT,SAAS;IACT,UAAU;IACV,aAAa;IACb,QAAQ;IACR,UAAU;IACV,UAAU;IACV,MAAM;IACN,SAAS;IACT,YAAY;IACZ,UAAU;IACV,QAAQ;IACR,OAAO;IACP,UAAU;IACV,SAAS;IACT,QAAQ;CACX,CAAA;AACD,KAAK,CAAC,IAAI,CAAC,WAAW,GAAG;IACrB,oBAAoB;IACpB,mBAAmB;IACnB,qBAAqB;IACrB,kBAAkB;IAClB,qBAAqB;IACrB,EAAE;IACF,EAAE;IACF,EAAE;IACF,EAAE;IACF,EAAE;IACF,EAAE;IACF,EAAE;IACF,EAAE;IACF,EAAE;IACF,EAAE;IACF,EAAE;CACL,CAAA,CAAC,sDAAsD;AACxD,MAAM;AACN,KAAK,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;AACpC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG;IACnB,KAAK;IACL,QAAQ;IACR,KAAK;IACL,MAAM;IACN,MAAM;IACN,KAAK;IACL,OAAO;IACP,KAAK;IACL,MAAM;IACN,KAAK;IACL,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,KAAK;IACL,MAAM;IACN,YAAY;CACf,CAAA;AACD,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG;IACrB,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;IACL,OAAO;IACP,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,UAAU;IACV,QAAQ;IACR,MAAM;IACN,MAAM;CACT,CAAA;AACD,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG;IACb,KAAK;IACL,KAAK;IACL,MAAM;IACN,KAAK;IACL,KAAK;IACL,MAAM;IACN,KAAK;IACL,UAAU;IACV,KAAK;IACL,YAAY;IACZ,SAAS;IACT,QAAQ;IACR,KAAK;IACL,MAAM;CACT,CAAA;AACD,gCAAgC;AAChC,WAAW;AACX,KAAK,CAAC,OAAO,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;AACxC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG;IACvB,SAAS;IACT,MAAM;IACN,KAAK;IACL,SAAS;IACT,OAAO;IACP,MAAM;CACT,CAAA;AACD,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG;IACzB,OAAO;IACP,OAAO;IACP,OAAO;IACP,SAAS;IACT,OAAO;IACP,OAAO;CACV,CAAA;AACD,KAAK,CAAC,OAAO,CAAC,IAAI,GAAG;IACjB,KAAK;IACL,KAAK;IACL,OAAO;IACP,KAAK;IACL,QAAQ;IACR,OAAO;IACP,KAAK;IACL,WAAW;IACX,YAAY;IACZ,QAAQ;IACR,WAAW;IACX,KAAK;IACL,QAAQ;IACR,KAAK;IACL,KAAK;CACR,CAAA;AACD,WAAW;AACX,KAAK,CAAC,QAAQ,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;AACzC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,GAAG;IACxB,UAAU;IACV,OAAO;IACP,OAAO;IACP,SAAS;IACT,OAAO;CACV,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA,CAAC,2DAA2D;AAC9F,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,GAAG;IAC1B,SAAS;IACT,OAAO;IACP,OAAO;IACP,QAAQ;IACR,UAAU;CACb,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,CAAC,2DAA2D;AAChG,KAAK,CAAC,QAAQ,CAAC,IAAI,GAAG;IAClB,SAAS;IACT,aAAa;IACb,SAAS;IACT,WAAW;IACX,SAAS;IACT,WAAW;IACX,aAAa;IACb,aAAa;IACb,WAAW;IACX,WAAW;CACd,CAAA;AACD,YAAY;AACZ,KAAK,CAAC,SAAS,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,CAAA;AAC9B,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,GAAG;IACzB,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,QAAQ;CACX,CAAA;AACD,KAAK,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAA,CAAC,gBAAgB;AAC5C,QAAQ;AACR,KAAK,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;AACjD,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;AAC/C,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,MAAM,CAChE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAC1B,CAAA;AACD,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,MAAM,CAC9D,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAC1B,CAAA;AACD,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAA,CAAC,gBAAgB;AACxC,QAAQ;AACR,KAAK,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;AACjD,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG;IACtB,SAAS;IACT,WAAW;IACX,UAAU;IACV,WAAW;IACX,WAAW;IACX,QAAQ;CACX,CAAA;AACD,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG;IACrB,UAAU;IACV,WAAW;IACX,WAAW;IACX,SAAS;IACT,UAAU;CACb,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;AACjC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG;IACvB,WAAW;IACX,SAAS;IACT,UAAU;IACV,QAAQ;IACR,QAAQ;CACX,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;AACjC,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAA,CAAC,gBAAgB;AACxC,UAAU;AACV,KAAK,CAAC,OAAO,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,CAAA;AAC5B,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG;IACvB,KAAK;IACL,YAAY;IACZ,UAAU;IACV,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,OAAO;IACP,WAAW;IACX,QAAQ;IACR,SAAS;IACT,MAAM;CACT,CAAA,CAAC,qCAAqC;AACvC,KAAK,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAA,CAAC,gBAAgB;AAC1C,gCAAgC;AAChC,KAAK,CAAC,QAAQ,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,CAAA;AAC7B,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,GAAG;IACxB,KAAK;IACL,OAAO;IACP,OAAO;IACP,OAAO;IACP,KAAK;IACL,IAAI;IACJ,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,IAAI;IACJ,UAAU;IACV,MAAM;IACN,QAAQ;IACR,IAAI;IACJ,UAAU;IACV,QAAQ;IACR,MAAM;IACN,WAAW;IACX,QAAQ;IACR,QAAQ;IACR,OAAO;CACV,CAAA,CAAC,sCAAsC;AACxC,KAAK,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAA,CAAC,gBAAgB;AAC3C,2BAA2B;AAC3B,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,MAAM,CAAA;AACzB,8BAA8B;AAC9B,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,MAAM,CAAA;AAC5B,oCAAoC;AACpC,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC,MAAM,CAAA;AAClC,2BAA2B;AAC3B,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,MAAM,CAAA;AACzB,6BAA6B;AAC7B,sBAAsB;AACtB,KAAK,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,CAAA;AAC3B,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAA;AAC9B,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG;IACtB,OAAO;IACP,OAAO;IACP,MAAM;IACN,IAAI;IACJ,MAAM;IACN,OAAO;IACP,MAAM;IACN,KAAK;IACL,KAAK;IACL,MAAM;CACT,CAAA,CAAC,qCAAqC;AACvC,KAAK,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA,CAAC,sCAAsC;AAC/F,KAAK,CAAC,MAAM,CAAC,WAAW,GAAG;IACvB,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,EAAE;IACF,EAAE;IACF,EAAE;IACF,EAAE;IACF,EAAE;IACF,EAAE;CACL,CAAA,CAAC,gDAAgD;AAClD,EAAE;AACF,KAAK,CAAC,SAAS,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,CAAA;AAC9B,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,QAAQ,CAAA;AACjC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;AAC/D,KAAK,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;AACxC,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG;IAC1B,EAAE;IACF,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,OAAO;IACP,OAAO;CACV,CAAA;AACD,EAAE;AACF,KAAK,CAAC,IAAI,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,CAAA;AACzB,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;AACzB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG;IACpB,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,KAAK;CACR,CAAA;AACD,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAA,CAAC,wBAAwB;AAC7C,EAAE;AACF,KAAK,CAAC,MAAM,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,CAAA;AAC3B,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAA;AAC9B,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG;IACtB,QAAQ;IACR,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;CACT,CAAA,CAAC,qCAAqC;AACvC,KAAK,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,CAAA,CAAC,sCAAsC;AACtG,KAAK,CAAC,MAAM,CAAC,WAAW,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA"} \ No newline at end of file diff --git a/dist/data/Personality.js b/dist/data/Personality.js deleted file mode 100644 index 8e86cb4..0000000 --- a/dist/data/Personality.js +++ /dev/null @@ -1 +0,0 @@ -//# sourceMappingURL=Personality.js.map \ No newline at end of file diff --git a/dist/data/Personality.js.map b/dist/data/Personality.js.map deleted file mode 100644 index cef0b7b..0000000 --- a/dist/data/Personality.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"Personality.js","sourceRoot":"","sources":["../../src/data/Personality.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/dist/data/Probabilities.js b/dist/data/Probabilities.js index a450ad3..a72f4e8 100644 --- a/dist/data/Probabilities.js +++ b/dist/data/Probabilities.js @@ -1,3 +1,4 @@ +import { Gender } from "./MonsterCreation.js"; export const Probabilities = { // This distribution is based on my assumption that 50% of characters are good, 40% are bad and 10% are evil. // TODO: Allow customization of these values @@ -14,8 +15,8 @@ export const Probabilities = { // Evil { name: "LE", percentage: 0.4 }, { name: "NE", percentage: 0.3 }, - { name: "CE", percentage: 0.3 } - ] + { name: "CE", percentage: 0.3 }, + ], }, // The default distribution of races in a neutral environment when generating a humanoid // NOTE: Currently based on Absalom Station settlement distribution @@ -25,29 +26,32 @@ export const Probabilities = { default: [ { name: "android", percentage: 0.09 }, { name: "dwarf", percentage: 0.04 }, - { name: "drow", percentage: 0.02 }, - { name: "human", percentage: 0.46 }, + { name: "drow", percentage: 0.01 }, + { name: "elf", percentage: 0.01 }, { name: "kasatha", percentage: 0.04 }, - { name: "gnoll", percentage: 0.02 }, + { name: "gnoll", percentage: 0.01 }, { name: "gnome", percentage: 0.02 }, + { name: "halfElf", percentage: 0.01 }, + { name: "halfOrc", percentage: 0.01 }, { name: "halfling", percentage: 0.04 }, + { name: "human", percentage: 0.46 }, { name: "lashunta", percentage: 0.07 }, { name: "nuar", percentage: 0.01 }, { name: "shirren", percentage: 0.05 }, - { name: "skittermander", percentage: 0.02 }, + { name: "skittermander", percentage: 0.01 }, { name: "ysoki", percentage: 0.09 }, - { name: "vesk", percentage: 0.03 } - ] + { name: "vesk", percentage: 0.03 }, + ], }, // NOTE: Extrapolated from 2019 Canadian census: https://www12.statcan.gc.ca/census-recensement/2021/ref/98-20-0002/982000022020002-eng.cfm // TODO: Allow customization if your world has a different distribution // NOTE: Should consider gender distributions by race, ie. Drow is a matriarchal society genderDistributions: { default: [ - { name: "male", percentage: 0.49 }, - { name: "female", percentage: 0.50 }, - { name: "non-binary", percentage: 0.01 } - ] - } + { name: Gender.male, percentage: 0.49 }, + { name: Gender.female, percentage: 0.5 }, + { name: Gender.nonBinary, percentage: 0.01 }, + ], + }, }; //# sourceMappingURL=Probabilities.js.map \ No newline at end of file diff --git a/dist/data/Probabilities.js.map b/dist/data/Probabilities.js.map index c6b4975..ba6db79 100644 --- a/dist/data/Probabilities.js.map +++ b/dist/data/Probabilities.js.map @@ -1 +1 @@ -{"version":3,"file":"Probabilities.js","sourceRoot":"","sources":["../../src/data/Probabilities.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG;IAEzB,6GAA6G;IAC7G,4CAA4C;IAC5C,sBAAsB,EAAG;QACrB,OAAO,EAAE;YACL,OAAO;YACP,EAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAC;YAC9B,EAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAC;YAC9B,EAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAC;YAC9B,UAAU;YACV,EAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAC;YAC9B,EAAC,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAC;YAC7B,EAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAC;YAC9B,OAAO;YACP,EAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAC;YAC7B,EAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAC;YAC7B,EAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAC;SAChC;KACJ;IACD,wFAAwF;IACxF,mEAAmE;IACnE,oEAAoE;IACpE,4CAA4C;IAC5C,iBAAiB,EAAE;QACf,OAAO,EAAE;YACL,EAAC,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAC;YACnC,EAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAC;YACjC,EAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAC;YAChC,EAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAC;YACjC,EAAC,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAC;YACnC,EAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAC;YACjC,EAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAC;YACjC,EAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAC;YACpC,EAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAC;YACpC,EAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAC;YAChC,EAAC,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAC;YACnC,EAAC,IAAI,EAAE,eAAe,EAAE,UAAU,EAAE,IAAI,EAAC;YACzC,EAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAC;YACjC,EAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAC;SACnC;KACJ;IACD,2IAA2I;IAC3I,uEAAuE;IACvE,wFAAwF;IACxF,mBAAmB,EAAE;QACjB,OAAO,EAAE;YACL,EAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAC;YAChC,EAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAC;YAClC,EAAC,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAC;SACzC;KACJ;CACJ,CAAC"} \ No newline at end of file +{"version":3,"file":"Probabilities.js","sourceRoot":"","sources":["../../src/data/Probabilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAE7C,MAAM,CAAC,MAAM,aAAa,GAAG;IACzB,6GAA6G;IAC7G,4CAA4C;IAC5C,sBAAsB,EAAE;QACpB,OAAO,EAAE;YACL,OAAO;YACP,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE;YAChC,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE;YAChC,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE;YAChC,UAAU;YACV,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE;YAChC,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE;YAC/B,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE;YAChC,OAAO;YACP,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE;YAC/B,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE;YAC/B,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE;SAClC;KACJ;IACD,wFAAwF;IACxF,mEAAmE;IACnE,oEAAoE;IACpE,4CAA4C;IAC5C,iBAAiB,EAAE;QACf,OAAO,EAAE;YACL,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE;YACrC,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE;YACnC,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE;YAClC,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE;YACjC,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE;YACrC,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE;YACnC,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE;YACnC,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE;YACrC,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE;YACrC,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE;YACtC,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE;YACnC,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE;YACtC,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE;YAClC,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE;YACrC,EAAE,IAAI,EAAE,eAAe,EAAE,UAAU,EAAE,IAAI,EAAE;YAC3C,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE;YACnC,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE;SACrC;KACJ;IACD,2IAA2I;IAC3I,uEAAuE;IACvE,wFAAwF;IACxF,mBAAmB,EAAE;QACjB,OAAO,EAAE;YACL,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE;YACvC,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE;YACxC,EAAE,IAAI,EAAE,MAAM,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE;SAC/C;KACJ;CACJ,CAAA"} \ No newline at end of file diff --git a/dist/data/Races.js b/dist/data/Races.js index 9016bad..6c27641 100644 --- a/dist/data/Races.js +++ b/dist/data/Races.js @@ -1,21 +1,27 @@ import { Grafts } from "./Grafts.js"; +import Race from "../models/Race.js"; +import { Size } from "./MonsterCreation.js"; export const Races = { // A list of humanoid type races which will randomly be generated (generally for non-combat NPCs) nonCombatantRaces: { - "android": { name: "android", size: "medium", creatureTypeGraft: Grafts.creatureType.humanoid, creatureSubtypeGraft: Grafts.creatureSubtype.android }, - "dwarf": { name: "dwarf", size: "medium", languages: ["dwarven"], creatureTypeGraft: Grafts.creatureType.humanoid, creatureSubtypeGraft: Grafts.creatureSubtype.dwarf }, - "drow": { name: "drow", size: "medium", languages: ["drow"], creatureTypeGraft: Grafts.creatureType.humanoid, creatureSubtypeGraft: Grafts.creatureSubtype.elf }, - "gnome": { name: "gnome", size: "small", languages: ["gnome"], creatureTypeGraft: Grafts.creatureType.humanoid, creatureSubtypeGraft: Grafts.creatureSubtype.gnome }, - "gnoll": { name: "gnoll", size: "medium", customLanguages: ["gnoll"], creatureTypeGraft: Grafts.creatureType.humanoid, creatureSubtypeGraft: Grafts.creatureSubtype.gnoll }, - "human": { name: "human", size: "medium", creatureTypeGraft: Grafts.creatureType.humanoid, creatureSubtypeGraft: Grafts.creatureSubtype.human }, - "halfling": { name: "halfling", size: "small", languages: ["halfling"], creatureTypeGraft: Grafts.creatureType.humanoid, creatureSubtypeGraft: Grafts.creatureSubtype.halfling }, - "kasatha": { name: "kasatha", size: "medium", arms: 4, languages: ["kasatha"], creatureTypeGraft: Grafts.creatureType.humanoid, creatureSubtypeGraft: Grafts.creatureSubtype.kasatha }, - "lashunta": { name: "lashunta", size: "medium", languages: ["castrovelian"], creatureTypeGraft: Grafts.creatureType.humanoid, creatureSubtypeGraft: Grafts.creatureSubtype.lashunta }, - "nuar": { name: "nuar", size: "medium", creatureTypeGraft: Grafts.creatureType.monstrousHumanoid }, - "skittermander": { name: "skittermander", size: "small", arms: 6, creatureTypeGraft: Grafts.creatureType.humanoid, creatureSubtypeGraft: Grafts.creatureSubtype.skittermander }, - "shirren": { name: "shirren", size: "medium", languages: ["shirren"], creatureTypeGraft: Grafts.creatureType.humanoid, creatureSubtypeGraft: Grafts.creatureSubtype.shirren }, - "vesk": { name: "vesk", size: "medium", languages: ["vesk"], creatureTypeGraft: Grafts.creatureType.humanoid, creatureSubtypeGraft: Grafts.creatureSubtype.vesk }, - "ysoki": { name: "ysoki", size: "small", languages: ["akiton", "ysoki"], creatureTypeGraft: Grafts.creatureType.humanoid, creatureSubtypeGraft: Grafts.creatureSubtype.ysoki } + android: new Race("android", Size.medium, Grafts.creatureType.humanoid, Grafts.creatureSubtype.android), + dwarf: new Race("dwarf", Size.medium, Grafts.creatureType.humanoid, Grafts.creatureSubtype.dwarf, ["dwarven"]), + drow: new Race("drow", Size.medium, Grafts.creatureType.humanoid, Grafts.creatureSubtype.elf, ["drow"]), + elf: new Race("elf", Size.medium, Grafts.creatureType.humanoid, Grafts.creatureSubtype.elf, ["elven"]), + gnome: new Race("gnome", Size.small, Grafts.creatureType.humanoid, Grafts.creatureSubtype.gnome, ["gnome"]), + gnoll: new Race("gnoll", Size.medium, Grafts.creatureType.humanoid, Grafts.creatureSubtype.gnoll, undefined, ["gnoll"]), + hobgoblin: new Race("hobgoblin", Size.medium, Grafts.creatureType.humanoid, Grafts.creatureSubtype.goblinoid, undefined, ["goblin"]), + human: new Race("human", Size.medium, Grafts.creatureType.humanoid, Grafts.creatureSubtype.human), + halfOrc: new Race("half-orc", Size.medium, Grafts.creatureType.humanoid, [Grafts.creatureSubtype.human, Grafts.creatureSubtype.orc], ["orc"]), + halfElf: new Race("half-elf", Size.medium, Grafts.creatureType.humanoid, [Grafts.creatureSubtype.human, Grafts.creatureSubtype.elf], ["elven"]), + halfling: new Race("halfling", Size.small, Grafts.creatureType.humanoid, Grafts.creatureSubtype.halfling, ["halfling"]), + kasatha: new Race("kasatha", Size.medium, Grafts.creatureType.humanoid, Grafts.creatureSubtype.kasatha, ["kasatha"], undefined, 4), + lashunta: new Race("lashunta", Size.medium, Grafts.creatureType.humanoid, Grafts.creatureSubtype.lashunta, ["castrovelian"]), + nuar: new Race("nuar", Size.medium, Grafts.creatureType.monstrousHumanoid), + skittermander: new Race("skittermander", Size.small, Grafts.creatureType.humanoid, Grafts.creatureSubtype.skittermander, undefined, undefined, 6), + shirren: new Race("shirren", Size.medium, Grafts.creatureType.humanoid, Grafts.creatureSubtype.shirren, ["shirren"]), + vesk: new Race("vesk", Size.medium, Grafts.creatureType.humanoid, Grafts.creatureSubtype.vesk, ["vesk"]), + ysoki: new Race("ysoki", Size.small, Grafts.creatureType.humanoid, Grafts.creatureSubtype.ysoki, ["akiton", "ysoki"]) } }; // The version of sfrpg the player is using may not have the new races included in the Alien Races Cards @@ -23,66 +29,57 @@ export const Races = { // (as the version of sfrpg which is compatible with 0.8.X will have these races) export const BundledRaces = { gnoll: { - "name": "Gnoll", - "type": "race", - "data": { - "description": { - "chat": "", - "gmnotes": "", - "short": "", - "value": "Gnolls are hyena-headed humanoids with reputation as bloodthirsty raiders, scavengers, and cannibals. They are capable hunters who respect pwoer and strength over station or role, and most gnolls would believe their own survival takes precedence over any kind of morality.
\nAbility Adjustments +2 Str, +2 Con, -2 Int
Hit Points 6
Gnolls are Medium humanoids with the gnoll subtype.
\nGnolls receive a +2 racial bonus to Surival checks.
\nGnolls have blindsense (scent) with a range of 30 feet.
\nGnolls can see up to 60 feet in the dark. See page 263 for more information.
\nEach time they move, gnolls can move through the first square of nonmagical difficult terrain at their normal speed.
\nGnolls can attack with a special unarmed strike that deals lethal damage, doesn’t count as archaic, and threatens squares. Gnoll gain a special version of the Weapon Specialization feat with this unarmed strike at 3rd level, allowing them to add 1–1/2 × their character level to their damage rolls for this unarmed strike (instead of just adding their character level, as usual).
\n", - "unidentified": "" + name: "Gnoll", + type: "race", + data: { + description: { + chat: "", + gmnotes: "", + short: "", + value: "
Gnolls are hyena-headed humanoids with reputation as bloodthirsty raiders, scavengers, and cannibals. They are capable hunters who respect pwoer and strength over station or role, and most gnolls would believe their own survival takes precedence over any kind of morality.
\nAbility Adjustments +2 Str, +2 Con, -2 Int
Hit Points 6
Gnolls are Medium humanoids with the gnoll subtype.
\nGnolls receive a +2 racial bonus to Surival checks.
\nGnolls have blindsense (scent) with a range of 30 feet.
\nGnolls can see up to 60 feet in the dark. See page 263 for more information.
\nEach time they move, gnolls can move through the first square of nonmagical difficult terrain at their normal speed.
\nGnolls can attack with a special unarmed strike that deals lethal damage, doesn’t count as archaic, and threatens squares. Gnoll gain a special version of the Weapon Specialization feat with this unarmed strike at 3rd level, allowing them to add 1–1/2 × their character level to their damage rolls for this unarmed strike (instead of just adding their character level, as usual).
\n", + unidentified: "" }, - "source": "ACD", - "type": "humanoid", - "modifiers": [ + source: "ACD", + type: "humanoid", + modifiers: [ { - "name": "Self-sufficient", - "modifier": "2", - "type": "racial", - "effectType": "skill", - "valueAffected": "sur", - "enabled": true, - "source": "Racial", - "notes": "Gnolls gain a +2 racial bonus to Survival checks.", - "modifierType": "constant", - "condition": "", - "subtab": "misc", - "max": 2, - "_id": "58a26466-6333-4d6b-91f0-49ef03c52fb6" + name: "Self-sufficient", + modifier: "2", + type: "racial", + effectType: "skill", + valueAffected: "sur", + enabled: true, + source: "Racial", + notes: "Gnolls gain a +2 racial bonus to Survival checks.", + modifierType: "constant", + condition: "", + subtab: "misc", + max: 2, + _id: "58a26466-6333-4d6b-91f0-49ef03c52fb6" } ], - "hp": { - "value": 6, - "min": 1 + hp: { + value: 6, + min: 1 }, - "abilityMods": { - "parts": [ - [ - 2, - "str" - ], - [ - 2, - "con" - ], - [ - -2, - "int" - ] + abilityMods: { + parts: [ + [2, "str"], + [2, "con"], + [-2, "int"] ] }, - "size": "medium", - "subtype": "gnoll", - "damage": { - "parts": [] + size: "medium", + subtype: "gnoll", + damage: { + parts: [] }, - "critical": { - "parts": [] + critical: { + parts: [] } }, - "flags": {}, - "effects": [] + flags: {}, + effects: [] } }; //# sourceMappingURL=Races.js.map \ No newline at end of file diff --git a/dist/data/Races.js.map b/dist/data/Races.js.map index ff5d49b..06f69c3 100644 --- a/dist/data/Races.js.map +++ b/dist/data/Races.js.map @@ -1 +1 @@ -{"version":3,"file":"Races.js","sourceRoot":"","sources":["../../src/data/Races.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"Races.js","sourceRoot":"","sources":["../../src/data/Races.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/data/Skills.js b/dist/data/Skills.js new file mode 100644 index 0000000..d3b08b5 --- /dev/null +++ b/dist/data/Skills.js @@ -0,0 +1,23 @@ +export var Skill; +(function (Skill) { + Skill["acrobatics"] = "acr"; + Skill["athletics"] = "ath"; + Skill["bluff"] = "blu"; + Skill["computers"] = "com"; + Skill["culture"] = "cul"; + Skill["diplomacy"] = "dip"; + Skill["disguise"] = "dis"; + Skill["engineering"] = "eng"; + Skill["intimidate"] = "int"; + Skill["lifeSience"] = "lsc"; + Skill["medicine"] = "med"; + Skill["mysticism"] = "mys"; + Skill["perception"] = "per"; + Skill["physicalScience"] = "phs"; + Skill["piloting"] = "pil"; + Skill["senseMotive"] = "sen"; + Skill["sleightOfHand"] = "sle"; + Skill["stealth"] = "ste"; + Skill["survival"] = "sur"; +})(Skill || (Skill = {})); +//# sourceMappingURL=Skills.js.map \ No newline at end of file diff --git a/dist/data/Skills.js.map b/dist/data/Skills.js.map new file mode 100644 index 0000000..e1bda9f --- /dev/null +++ b/dist/data/Skills.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Skills.js","sourceRoot":"","sources":["../../src/data/Skills.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,KAoBX;AApBD,WAAY,KAAK;IACb,2BAAkB,CAAA;IAClB,0BAAiB,CAAA;IACjB,sBAAa,CAAA;IACb,0BAAiB,CAAA;IACjB,wBAAe,CAAA;IACf,0BAAiB,CAAA;IACjB,yBAAgB,CAAA;IAChB,4BAAmB,CAAA;IACnB,2BAAkB,CAAA;IAClB,2BAAkB,CAAA;IAClB,yBAAgB,CAAA;IAChB,0BAAiB,CAAA;IACjB,2BAAkB,CAAA;IAClB,gCAAuB,CAAA;IACvB,yBAAgB,CAAA;IAChB,4BAAmB,CAAA;IACnB,8BAAqB,CAAA;IACrB,wBAAe,CAAA;IACf,yBAAgB,CAAA;AACpB,CAAC,EApBW,KAAK,KAAL,KAAK,QAoBhB"} \ No newline at end of file diff --git a/dist/data/Types.js b/dist/data/Types.js new file mode 100644 index 0000000..c0c7ae2 --- /dev/null +++ b/dist/data/Types.js @@ -0,0 +1,38 @@ +/// List of creature types +export var Type; +(function (Type) { + Type[Type["aberration"] = 0] = "aberration"; + Type[Type["animal"] = 1] = "animal"; + Type[Type["construct"] = 2] = "construct"; + Type[Type["dragon"] = 3] = "dragon"; + Type[Type["fey"] = 4] = "fey"; + Type[Type["humanoid"] = 5] = "humanoid"; + Type[Type["magical beast"] = 6] = "magical beast"; + Type[Type["monstrous humanoid"] = 7] = "monstrous humanoid"; + Type[Type["ooze"] = 8] = "ooze"; + Type[Type["outsider"] = 9] = "outsider"; + Type[Type["plant"] = 10] = "plant"; + Type[Type["undead"] = 11] = "undead"; + Type[Type["vermin"] = 12] = "vermin"; +})(Type || (Type = {})); +/// List of creature subtypes +export var Subtype; +(function (Subtype) { + Subtype[Subtype["android"] = 0] = "android"; + Subtype[Subtype["dwarf"] = 1] = "dwarf"; + Subtype[Subtype["elf"] = 2] = "elf"; + Subtype[Subtype["gnome"] = 3] = "gnome"; + Subtype[Subtype["gnoll"] = 4] = "gnoll"; + Subtype[Subtype["goblinoid"] = 5] = "goblinoid"; + Subtype[Subtype["halfling"] = 6] = "halfling"; + Subtype[Subtype["human"] = 7] = "human"; + Subtype[Subtype["kasatha"] = 8] = "kasatha"; + Subtype[Subtype["lashunta"] = 9] = "lashunta"; + Subtype[Subtype["orc"] = 10] = "orc"; + Subtype[Subtype["shirren"] = 11] = "shirren"; + Subtype[Subtype["skittermander"] = 12] = "skittermander"; + Subtype[Subtype["technological"] = 13] = "technological"; + Subtype[Subtype["vesk"] = 14] = "vesk"; + Subtype[Subtype["ysoki"] = 15] = "ysoki"; +})(Subtype || (Subtype = {})); +//# sourceMappingURL=Types.js.map \ No newline at end of file diff --git a/dist/data/Types.js.map b/dist/data/Types.js.map new file mode 100644 index 0000000..ed61dd2 --- /dev/null +++ b/dist/data/Types.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Types.js","sourceRoot":"","sources":["../../src/data/Types.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,MAAM,CAAN,IAAY,IAcX;AAdD,WAAY,IAAI;IACZ,2CAAU,CAAA;IACV,mCAAM,CAAA;IACN,yCAAS,CAAA;IACT,mCAAM,CAAA;IACN,6BAAG,CAAA;IACH,uCAAQ,CAAA;IACR,iDAAe,CAAA;IACf,2DAAoB,CAAA;IACpB,+BAAI,CAAA;IACJ,uCAAQ,CAAA;IACR,kCAAK,CAAA;IACL,oCAAM,CAAA;IACN,oCAAM,CAAA;AACV,CAAC,EAdW,IAAI,KAAJ,IAAI,QAcf;AAED,6BAA6B;AAC7B,MAAM,CAAN,IAAY,OAiBX;AAjBD,WAAY,OAAO;IACf,2CAAO,CAAA;IACP,uCAAK,CAAA;IACL,mCAAG,CAAA;IACH,uCAAK,CAAA;IACL,uCAAK,CAAA;IACL,+CAAS,CAAA;IACT,6CAAQ,CAAA;IACR,uCAAK,CAAA;IACL,2CAAO,CAAA;IACP,6CAAQ,CAAA;IACR,oCAAG,CAAA;IACH,4CAAO,CAAA;IACP,wDAAa,CAAA;IACb,wDAAa,CAAA;IACb,sCAAI,CAAA;IACJ,wCAAK,CAAA;AACT,CAAC,EAjBW,OAAO,KAAP,OAAO,QAiBlB"} \ No newline at end of file diff --git a/dist/data/UniversalCreatureRules.js b/dist/data/UniversalCreatureRules.js new file mode 100644 index 0000000..fb62547 --- /dev/null +++ b/dist/data/UniversalCreatureRules.js @@ -0,0 +1,12 @@ +/// Collection of universal creature rules which are applied by various means (creature type grafts, special abilities, etc) +import UniversalCreatureRule from "../models/UniversalCreatureRule.js"; +export const UniversalCreatureRules = { + ferocity: new UniversalCreatureRule("ferocity", "When the creature is brought to 0 Hit Points, it can fight on for 1 more round. It can act normally until the end of its next turn; if it has 0 HP at that point, it dies. If it would lose further Hit Points before this, it ceases to be able to act and dies."), + integratedWeapons: new UniversalCreatureRule("integrated weapons", "The creature’s weapons are manufactured weapons, not natural weapons, and they are integrated into its frame. A creature can’t be disarmed of these weapons, though they can be removed and used if the creature is dead."), + mindless: new UniversalCreatureRule("mindless", "The creature has no Intelligence score or modifier and is immune to mind-affecting effects. Any DCs or other statistics that rely on an Intelligence score treat the creature as having a score of 10 (+0).\n" + + "Guidelines: Mindless creatures usually have fewer good skills and no master skills. Their skills should be based on inborn abilities, since they’re incapable of training."), + naturalWeapons: new UniversalCreatureRule("natural weapons", "Natural weapons (and natural attacks), such as acid spit, bite, claw, or slam don’t require ammunition and can’t be disarmed or sundered."), + sightless: new UniversalCreatureRule("sightless", "The creature does not use any visual senses and is thus never subject to any effect that requires the creature to see a target or effect. Sightless creatures normally have some form of blindsight to compensate for their sightlessness, but if not, they are assumed to be able to operate as well as a creature with normal vision unless the creature’s description says otherwise."), + unliving: new UniversalCreatureRule("unliving", "The creature has no Constitution score or modifier. Any DCs or other statistics that rely on a Constitution score treat the creature as having a score of 10 (+0). The creature is immediately destroyed when it reaches 0 Hit Points. An unliving creature doesn’t heal damage naturally, but a construct can be repaired with the right tools. Spells such as make whole can heal constructs, and magic effects can heal undead. An unliving creature with fast healing (see page 154) still benefits from that ability. Unliving creatures don’t breathe, eat, or sleep. They can’t be raised or resurrected, except through the use of miracle, wish, or a similar effect that specifically works on unliving creatures.") +}; +//# sourceMappingURL=UniversalCreatureRules.js.map \ No newline at end of file diff --git a/dist/data/UniversalCreatureRules.js.map b/dist/data/UniversalCreatureRules.js.map new file mode 100644 index 0000000..b7f80d9 --- /dev/null +++ b/dist/data/UniversalCreatureRules.js.map @@ -0,0 +1 @@ +{"version":3,"file":"UniversalCreatureRules.js","sourceRoot":"","sources":["../../src/data/UniversalCreatureRules.ts"],"names":[],"mappings":"AAAA,4HAA4H;AAC5H,OAAO,qBAAqB,MAAM,oCAAoC,CAAA;AAEtE,MAAM,CAAC,MAAM,sBAAsB,GAAG;IAClC,QAAQ,EAAE,IAAI,qBAAqB,CAC/B,UAAU,EACV,mQAAmQ,CACtQ;IACD,iBAAiB,EAAE,IAAI,qBAAqB,CACxC,oBAAoB,EACpB,2NAA2N,CAC9N;IACD,QAAQ,EAAE,IAAI,qBAAqB,CAC/B,UAAU,EACV,+MAA+M;QAC3M,4KAA4K,CACnL;IACD,cAAc,EAAE,IAAI,qBAAqB,CACrC,iBAAiB,EACjB,2IAA2I,CAC9I;IACD,SAAS,EAAE,IAAI,qBAAqB,CAChC,WAAW,EACX,0XAA0X,CAC7X;IACD,QAAQ,EAAE,IAAI,qBAAqB,CAC/B,UAAU,EACV,8rBAA8rB,CACjsB;CACJ,CAAA"} \ No newline at end of file diff --git a/dist/data/Weapons.js b/dist/data/Weapons.js new file mode 100644 index 0000000..001b443 --- /dev/null +++ b/dist/data/Weapons.js @@ -0,0 +1,407 @@ +// Weapon Templates +// Some weapons are easier to store as template which are modified/customized rather than searching compendiums +export const unarmedStrikeTemplate = { + name: "Unarmed strike", + type: "weapon", + data: { + description: { + chat: "", + gmnotes: "", + short: "", + value: "
An unarmed strike can be dealt with any limb or appendage. Unarmed strikes deal nonlethal damage, and the damage from an unarmed strike is considered weapon damage for the purposes of effects that give you a bonus to weapon damage rolls.
", + unidentified: "" + }, + source: "CRB pg. 190", + type: "", + quantity: null, + bulk: "-", + price: 0, + level: 0, + attuned: false, + equipped: true, + equippable: false, + identified: true, + attributes: { + sturdy: false, + customBuilt: false, + size: "medium", + dex: { + mod: "" + }, + hp: { + value: 6, + max: "" + }, + hardness: { + value: "" + }, + ac: { + value: "" + } + }, + activation: { + type: "action", + cost: 1, + condition: "" + }, + duration: { + value: "", + units: "" + }, + target: { + value: "", + type: "" + }, + area: { + value: null, + units: null, + shape: "", + effect: "" + }, + range: { + value: null, + units: "touch", + additional: "", + per: "" + }, + uses: { + value: 0, + max: 0, + per: "" + }, + isActive: null, + ability: "", + actionType: "mwak", + attackBonus: 0, + chatFlavor: "", + critical: { + parts: [], + effect: "" + }, + damage: { + parts: [["1d3", "bludgeoning"]] + }, + formula: "", + save: { + type: "", + dc: "", + descriptor: "negate" + }, + descriptors: [], + capacity: { + value: 0, + max: 0 + }, + usage: { + value: 0, + per: "" + }, + modifiers: [], + container: { + contents: [], + storage: [], + isOpen: true + }, + weaponType: "basicM", + weaponCategory: "", + special: "", + properties: { + one: false, + two: false, + amm: false, + aeon: false, + analog: false, + antibiological: false, + archaic: true, + aurora: false, + automatic: false, + blast: false, + block: false, + boost: false, + breach: false, + breakdown: false, + bright: false, + cluster: false, + conceal: false, + deconstruct: false, + deflect: false, + disarm: false, + double: false, + drainCharge: false, + echo: false, + entangle: false, + explode: false, + extinguish: false, + feint: false, + fiery: false, + firstArc: false, + flexibleLine: false, + force: false, + freeHands: false, + fueled: false, + grapple: false, + gravitation: false, + guided: false, + harrying: false, + holyWater: false, + hybrid: false, + ignite: false, + indirect: false, + injection: false, + integrated: false, + line: false, + living: false, + lockdown: false, + "mind-affecting": false, + mine: false, + mire: false, + modal: false, + necrotic: false, + nonlethal: true, + operative: false, + penetrating: false, + polarize: false, + polymorphic: false, + powered: false, + professional: false, + punchGun: false, + qreload: false, + radioactive: false, + reach: false, + recall: false, + regrowth: false, + relic: false, + reposition: false, + shape: false, + shatter: false, + shells: false, + shield: false, + sniper: false, + stun: false, + subtle: false, + sunder: false, + swarm: false, + tail: false, + teleportive: false, + thought: false, + throttle: false, + thrown: false, + trip: false, + unbalancing: false, + underwater: false, + unwieldy: false, + variantBoost: false, + wideLine: false + }, + proficient: true, + abilityMods: { + parts: [] + } + }, + flags: {}, + effects: [] +}; +export const naturalWeaponsTemplate = { + name: "Unarmed strike (natural weapons)", + type: "weapon", + data: { + description: { + chat: "", + gmnotes: "", + short: "", + value: "Natural weapons (and natural attacks) such as acid spit, bite, claw, or slam don’t require ammunition and can’t be disarmed or sundered.\n" + + "In addition, a player character with this ability can attack with a special unarmed strike that deals lethal damage, doesn’t count as archaic, and threatens squares. They also gain a special version of the Weapon Specialization feat with this unarmed strike at 3rd level, allowing them to add 1–1/2 × their character level to their damage rolls for this unarmed strike (instead of just adding their character level as usual).
", + unidentified: "" + }, + source: "CRB pg. 190", + type: "", + quantity: null, + bulk: "-", + price: 0, + level: 0, + attuned: false, + equipped: true, + equippable: false, + identified: true, + attributes: { + sturdy: false, + customBuilt: false, + size: "medium", + dex: { + mod: "" + }, + hp: { + value: 6, + max: "" + }, + hardness: { + value: "" + }, + ac: { + value: "" + } + }, + activation: { + type: "action", + cost: 1, + condition: "" + }, + duration: { + value: "", + units: "" + }, + target: { + value: "", + type: "" + }, + area: { + value: null, + units: null, + shape: "", + effect: "" + }, + range: { + value: null, + units: "touch", + additional: "", + per: "" + }, + uses: { + value: 0, + max: 0, + per: "" + }, + isActive: null, + ability: "", + actionType: "mwak", + attackBonus: 0, + chatFlavor: "", + critical: { + parts: [], + effect: "" + }, + damage: { + parts: [["1d3", "bludgeoning"]] + }, + formula: "", + save: { + type: "", + dc: "", + descriptor: "negate" + }, + descriptors: [], + capacity: { + value: 0, + max: 0 + }, + usage: { + value: 0, + per: "" + }, + modifiers: [], + container: { + contents: [], + storage: [], + isOpen: true + }, + weaponType: "basicM", + weaponCategory: "", + special: "", + properties: { + one: false, + two: false, + amm: false, + aeon: false, + analog: false, + antibiological: false, + archaic: false, + aurora: false, + automatic: false, + blast: false, + block: false, + boost: false, + breach: false, + breakdown: false, + bright: false, + cluster: false, + conceal: false, + deconstruct: false, + deflect: false, + disarm: false, + double: false, + drainCharge: false, + echo: false, + entangle: false, + explode: false, + extinguish: false, + feint: false, + fiery: false, + firstArc: false, + flexibleLine: false, + force: false, + freeHands: false, + fueled: false, + grapple: false, + gravitation: false, + guided: false, + harrying: false, + holyWater: false, + hybrid: false, + ignite: false, + indirect: false, + injection: false, + integrated: false, + line: false, + living: false, + lockdown: false, + "mind-affecting": false, + mine: false, + mire: false, + modal: false, + necrotic: false, + nonlethal: false, + operative: false, + penetrating: false, + polarize: false, + polymorphic: false, + powered: false, + professional: false, + punchGun: false, + qreload: false, + radioactive: false, + reach: false, + recall: false, + regrowth: false, + relic: false, + reposition: false, + shape: false, + shatter: false, + shells: false, + shield: false, + sniper: false, + stun: false, + subtle: false, + sunder: false, + swarm: false, + tail: false, + teleportive: false, + thought: false, + throttle: false, + thrown: false, + trip: false, + unbalancing: false, + underwater: false, + unwieldy: false, + variantBoost: false, + wideLine: false + }, + proficient: true, + abilityMods: { + parts: [] + } + }, + flags: {}, + img: "icons/svg/mystery-man.svg", + effects: [] +}; +//# sourceMappingURL=Weapons.js.map \ No newline at end of file diff --git a/dist/data/Weapons.js.map b/dist/data/Weapons.js.map new file mode 100644 index 0000000..f66369c --- /dev/null +++ b/dist/data/Weapons.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Weapons.js","sourceRoot":"","sources":["../../src/data/Weapons.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/data/adjusters/CommonAdjusters.js b/dist/data/adjusters/CommonAdjusters.js new file mode 100644 index 0000000..621f1a5 --- /dev/null +++ b/dist/data/adjusters/CommonAdjusters.js @@ -0,0 +1,20 @@ +import SenseAdjuster from "../../models/adjusters/SenseAdjuster.js"; +import ImmunityAdjuster from "../../models/adjusters/ImmunityAdjuster.js"; +export const CommonAdjusters = { + Immunities: { + constructImmunities: new ImmunityAdjuster({ + addConditionImmunity: ["construct immunities"] + }), + drowImmunities: new ImmunityAdjuster({ + addConditionImmunity: ["drow immunities"] + }), + elvenImmunities: new ImmunityAdjuster({ + addConditionImmunity: ["elven immunities"] + }) + }, + Senses: { + darkVision60ft: new SenseAdjuster({ addSense: ["darkvision 60 ft."] }), + lowLightVision: new SenseAdjuster({ addSense: ["low-light vision"] }) + } +}; +//# sourceMappingURL=CommonAdjusters.js.map \ No newline at end of file diff --git a/dist/data/adjusters/CommonAdjusters.js.map b/dist/data/adjusters/CommonAdjusters.js.map new file mode 100644 index 0000000..791e01e --- /dev/null +++ b/dist/data/adjusters/CommonAdjusters.js.map @@ -0,0 +1 @@ +{"version":3,"file":"CommonAdjusters.js","sourceRoot":"","sources":["../../../src/data/adjusters/CommonAdjusters.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,yCAAyC,CAAA;AACnE,OAAO,gBAAgB,MAAM,4CAA4C,CAAA;AAEzE,MAAM,CAAC,MAAM,eAAe,GAAG;IAC3B,UAAU,EAAE;QACR,mBAAmB,EAAE,IAAI,gBAAgB,CAAC;YACtC,oBAAoB,EAAE,CAAC,sBAAsB,CAAC;SACjD,CAAC;QACF,cAAc,EAAE,IAAI,gBAAgB,CAAC;YACjC,oBAAoB,EAAE,CAAC,iBAAiB,CAAC;SAC5C,CAAC;QACF,eAAe,EAAE,IAAI,gBAAgB,CAAC;YAClC,oBAAoB,EAAE,CAAC,kBAAkB,CAAC;SAC7C,CAAC;KACL;IACD,MAAM,EAAE;QACJ,cAAc,EAAE,IAAI,aAAa,CAAC,EAAE,QAAQ,EAAE,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACtE,cAAc,EAAE,IAAI,aAAa,CAAC,EAAE,QAAQ,EAAE,CAAC,kBAAkB,CAAC,EAAE,CAAC;KACxE;CACJ,CAAA"} \ No newline at end of file diff --git a/dist/data/adjusters/SharedAdjusters.js b/dist/data/adjusters/SharedAdjusters.js new file mode 100644 index 0000000..ff5a0be --- /dev/null +++ b/dist/data/adjusters/SharedAdjusters.js @@ -0,0 +1,36 @@ +import SenseAdjuster from "../../models/adjusters/SenseAdjuster.js"; +import ImmunityAdjuster from "../../models/adjusters/ImmunityAdjuster.js"; +import SaveAdjuster from "../../models/adjusters/SaveAdjuster.js"; +import { Save } from "../MonsterCreation.js"; +export const SharedAdjusters = { + Immunities: { + constructImmunities: new ImmunityAdjuster({ + addConditionImmunity: "construct immunities" + }), + drowImmunities: new ImmunityAdjuster({ + addConditionImmunity: "drow immunities" + }), + elvenImmunities: new ImmunityAdjuster({ + addConditionImmunity: "elven immunities" + }), + mindAffectingEffects: new ImmunityAdjuster({ + addConditionImmunity: "mind-affecting effects" + }) + }, + Saves: { + // Quickly add 2 to saves + fortitudePlus2: new SaveAdjuster({ mutateSave: [Save.fortitude, 2] }), + reflexPlus2: new SaveAdjuster({ mutateSave: [Save.reflex, 2] }), + willpowerPlus2: new SaveAdjuster({ mutateSave: [Save.willpower, 2] }), + // Quickly removes 2 to saves + fortitudeMinus2: new SaveAdjuster({ mutateSave: [Save.fortitude, -2] }), + reflexMinus2: new SaveAdjuster({ mutateSave: [Save.reflex, -2] }), + willpowerMinus2: new SaveAdjuster({ mutateSave: [Save.willpower, -2] }) + }, + Senses: { + blindsight: new SenseAdjuster({ addSense: ["blindsight"] }), + darkVision60ft: new SenseAdjuster({ addSense: ["darkvision 60 ft."] }), + lowLightVision: new SenseAdjuster({ addSense: ["low-light vision"] }) + } +}; +//# sourceMappingURL=SharedAdjusters.js.map \ No newline at end of file diff --git a/dist/data/adjusters/SharedAdjusters.js.map b/dist/data/adjusters/SharedAdjusters.js.map new file mode 100644 index 0000000..6231329 --- /dev/null +++ b/dist/data/adjusters/SharedAdjusters.js.map @@ -0,0 +1 @@ +{"version":3,"file":"SharedAdjusters.js","sourceRoot":"","sources":["../../../src/data/adjusters/SharedAdjusters.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,yCAAyC,CAAA;AACnE,OAAO,gBAAgB,MAAM,4CAA4C,CAAA;AACzE,OAAO,YAAY,MAAM,wCAAwC,CAAA;AACjE,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAA;AAE5C,MAAM,CAAC,MAAM,eAAe,GAAG;IAC3B,UAAU,EAAE;QACR,mBAAmB,EAAE,IAAI,gBAAgB,CAAC;YACtC,oBAAoB,EAAE,sBAAsB;SAC/C,CAAC;QACF,cAAc,EAAE,IAAI,gBAAgB,CAAC;YACjC,oBAAoB,EAAE,iBAAiB;SAC1C,CAAC;QACF,eAAe,EAAE,IAAI,gBAAgB,CAAC;YAClC,oBAAoB,EAAE,kBAAkB;SAC3C,CAAC;QACF,oBAAoB,EAAE,IAAI,gBAAgB,CAAC;YACvC,oBAAoB,EAAE,wBAAwB;SACjD,CAAC;KACL;IACD,KAAK,EAAE;QACH,yBAAyB;QACzB,cAAc,EAAE,IAAI,YAAY,CAAC,EAAE,UAAU,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC;QACrE,WAAW,EAAE,IAAI,YAAY,CAAC,EAAE,UAAU,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC;QAC/D,cAAc,EAAE,IAAI,YAAY,CAAC,EAAE,UAAU,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC;QACrE,6BAA6B;QAC7B,eAAe,EAAE,IAAI,YAAY,CAAC,EAAE,UAAU,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,YAAY,EAAE,IAAI,YAAY,CAAC,EAAE,UAAU,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,eAAe,EAAE,IAAI,YAAY,CAAC,EAAE,UAAU,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1E;IACD,MAAM,EAAE;QACJ,UAAU,EAAE,IAAI,aAAa,CAAC,EAAE,QAAQ,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC;QAC3D,cAAc,EAAE,IAAI,aAAa,CAAC,EAAE,QAAQ,EAAE,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACtE,cAAc,EAAE,IAAI,aAAa,CAAC,EAAE,QAAQ,EAAE,CAAC,kBAAkB,CAAC,EAAE,CAAC;KACxE;CACJ,CAAA"} \ No newline at end of file diff --git a/dist/data/universal creature rules/UniversalCreatureRules.js b/dist/data/universal creature rules/UniversalCreatureRules.js new file mode 100644 index 0000000..2f169ec --- /dev/null +++ b/dist/data/universal creature rules/UniversalCreatureRules.js @@ -0,0 +1,12 @@ +/// Collection of universal creature rules which are applied by various means (creature type grafts, special abilities, etc) +import UniversalCreatureRule from "../../models/UniversalCreatureRule.js"; +export const UniversalCreatureRules = { + ferocity: new UniversalCreatureRule("ferocity", "When the creature is brought to 0 Hit Points, it can fight on for 1 more round. It can act normally until the end of its next turn; if it has 0 HP at that point, it dies. If it would lose further Hit Points before this, it ceases to be able to act and dies."), + integratedWeapons: new UniversalCreatureRule("integrated weapons", "The creature’s weapons are manufactured weapons, not natural weapons, and they are integrated into its frame. A creature can’t be disarmed of these weapons, though they can be removed and used if the creature is dead."), + mindless: new UniversalCreatureRule("mindless", "The creature has no Intelligence score or modifier and is immune to mind-affecting effects. Any DCs or other statistics that rely on an Intelligence score treat the creature as having a score of 10 (+0).\n" + + "Guidelines: Mindless creatures usually have fewer good skills and no master skills. Their skills should be based on inborn abilities, since they’re incapable of training."), + naturalWeapons: new UniversalCreatureRule("natural weapons", "Natural weapons (and natural attacks), such as acid spit, bite, claw, or slam don’t require ammunition and can’t be disarmed or sundered."), + sightless: new UniversalCreatureRule("sightless", "The creature does not use any visual senses and is thus never subject to any effect that requires the creature to see a target or effect. Sightless creatures normally have some form of blindsight to compensate for their sightlessness, but if not, they are assumed to be able to operate as well as a creature with normal vision unless the creature’s description says otherwise."), + unliving: new UniversalCreatureRule("unliving", "The creature has no Constitution score or modifier. Any DCs or other statistics that rely on a Constitution score treat the creature as having a score of 10 (+0). The creature is immediately destroyed when it reaches 0 Hit Points. An unliving creature doesn’t heal damage naturally, but a construct can be repaired with the right tools. Spells such as make whole can heal constructs, and magic effects can heal undead. An unliving creature with fast healing (see page 154) still benefits from that ability. Unliving creatures don’t breathe, eat, or sleep. They can’t be raised or resurrected, except through the use of miracle, wish, or a similar effect that specifically works on unliving creatures.") +}; +//# sourceMappingURL=UniversalCreatureRules.js.map \ No newline at end of file diff --git a/dist/data/universal creature rules/UniversalCreatureRules.js.map b/dist/data/universal creature rules/UniversalCreatureRules.js.map new file mode 100644 index 0000000..ee3de11 --- /dev/null +++ b/dist/data/universal creature rules/UniversalCreatureRules.js.map @@ -0,0 +1 @@ +{"version":3,"file":"UniversalCreatureRules.js","sourceRoot":"","sources":["../../../src/data/universal creature rules/UniversalCreatureRules.ts"],"names":[],"mappings":"AAAA,4HAA4H;AAC5H,OAAO,qBAAqB,MAAM,uCAAuC,CAAA;AAEzE,MAAM,CAAC,MAAM,sBAAsB,GAAG;IAClC,QAAQ,EAAE,IAAI,qBAAqB,CAC/B,UAAU,EACV,mQAAmQ,CACtQ;IACD,iBAAiB,EAAE,IAAI,qBAAqB,CACxC,oBAAoB,EACpB,2NAA2N,CAC9N;IACD,QAAQ,EAAE,IAAI,qBAAqB,CAC/B,UAAU,EACV,+MAA+M;QAC3M,4KAA4K,CACnL;IACD,cAAc,EAAE,IAAI,qBAAqB,CACrC,iBAAiB,EACjB,2IAA2I,CAC9I;IACD,SAAS,EAAE,IAAI,qBAAqB,CAChC,WAAW,EACX,0XAA0X,CAC7X;IACD,QAAQ,EAAE,IAAI,qBAAqB,CAC/B,UAAU,EACV,8rBAA8rB,CACjsB;CACJ,CAAA"} \ No newline at end of file diff --git a/dist/dialogs/PopulateDialog.js b/dist/dialogs/PopulateDialog.js deleted file mode 100644 index e927e15..0000000 --- a/dist/dialogs/PopulateDialog.js +++ /dev/null @@ -1,3 +0,0 @@ -export class PopulateDialog extends Dialog { -} -//# sourceMappingURL=PopulateDialog.js.map \ No newline at end of file diff --git a/dist/dialogs/PopulateDialog.js.map b/dist/dialogs/PopulateDialog.js.map deleted file mode 100644 index 5737634..0000000 --- a/dist/dialogs/PopulateDialog.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"PopulateDialog.js","sourceRoot":"","sources":["../../src/dialogs/PopulateDialog.ts"],"names":[],"mappings":"AACA,MAAM,OAAO,cAAe,SAAQ,MAAM;CAEzC"} \ No newline at end of file diff --git a/dist/factories/BiographyFactory.js b/dist/factories/BiographyFactory.js new file mode 100644 index 0000000..1db5222 --- /dev/null +++ b/dist/factories/BiographyFactory.js @@ -0,0 +1,25 @@ +import { Utils } from "../utils/Uils.js"; +import { Biography } from "../data/Biography.js"; +export class BiographyFactory { + // NOTE: Consider refactoring to only provide needed parameters and remove dependancy on `NPCCreationContext` + static makeBiography(actor, context) { + var biography = ""; + if (context.generatePersonality) { + let personalityTraits = Biography.personalityTraits; + Utils.shuffleArray(personalityTraits); + biography += + "" + + actor.name + + " is a " + + personalityTraits[0] + + " " + + context.race + + " who identifies as " + + context.gender + + ".
"; + } + biography += "Created by Populator.
"; + return biography; + } +} +//# sourceMappingURL=BiographyFactory.js.map \ No newline at end of file diff --git a/dist/factories/BiographyFactory.js.map b/dist/factories/BiographyFactory.js.map new file mode 100644 index 0000000..d34b058 --- /dev/null +++ b/dist/factories/BiographyFactory.js.map @@ -0,0 +1 @@ +{"version":3,"file":"BiographyFactory.js","sourceRoot":"","sources":["../../src/factories/BiographyFactory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAEhD,MAAM,OAAO,gBAAgB;IACzB,6GAA6G;IACtG,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,OAA2B;QAC1D,IAAI,SAAS,GAAW,EAAE,CAAA;QAE1B,IAAI,OAAO,CAAC,mBAAmB,EAAE;YAC7B,IAAI,iBAAiB,GAAG,SAAS,CAAC,iBAAiB,CAAA;YACnD,KAAK,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAA;YAErC,SAAS;gBACL,KAAK;oBACL,KAAK,CAAC,IAAI;oBACV,QAAQ;oBACR,iBAAiB,CAAC,CAAC,CAAC;oBACpB,GAAG;oBACH,OAAO,CAAC,IAAI;oBACZ,qBAAqB;oBACrB,OAAO,CAAC,MAAM;oBACd,OAAO,CAAA;SACd;QAED,SAAS,IAAI,qCAAqC,CAAA;QAClD,OAAO,SAAS,CAAA;IACpB,CAAC;CACJ"} \ No newline at end of file diff --git a/dist/factories/ItemFactory.js b/dist/factories/ItemFactory.js new file mode 100644 index 0000000..6ff0d54 --- /dev/null +++ b/dist/factories/ItemFactory.js @@ -0,0 +1,119 @@ +import { Randomizer } from "../Randomizer.js"; +import { backpackTemplate, canteenTemplate, credStickTemplate, intoxicantMinorTemplate, Items, lighterTemplate, purfumeTemplate, religiousSymbolTemplate, ropeTemplate, upbTemplate } from "../data/Items.js"; +import { Utils } from "../utils/Uils.js"; +export class ItemFactory { + // Default size is 3 + static makeItemCollection(size = 3) { + var itemCollection = []; + // Every NPC has 2 random items (for now, may change) + for (var i = 0; i < size; i++) { + let items = [ + { item: backpackTemplate, percentage: 0.03 }, + { item: canteenTemplate, percentage: 0.03 }, + { item: credStickTemplate, percentage: 0.03 }, + { item: upbTemplate, percentage: 0.03 }, + { item: lighterTemplate, percentage: 0.03 }, + { item: ropeTemplate, percentage: 0.03 }, + { item: purfumeTemplate, percentage: 0.03 }, + { item: intoxicantMinorTemplate, percentage: 0.03 }, + { item: ItemFactory.makeReligiousSymbol(), percentage: 0.06 }, + { item: ItemFactory.makeJunk(), percentage: 0.7 } + ]; + let winning = Randomizer.pickWinningItem(items).item; + itemCollection.push(winning); + } + return itemCollection; + } + static makeReligiousSymbol() { + let religiousSymbol = Object.assign({}, religiousSymbolTemplate); + var gods = [ + "Abadar", + "Angradd", + "Arshea", + "Asmodeus", + "Besmara", + "Calistria", + "Damoritosh", + "Desna", + "Eldest", + "Eloritu", + "Groetus", + "Hylax", + "Ibra", + "Iomedae", + "Lamashtu", + "Lao Shu Po", + "Lissala", + "Nyarlathotep", + "Oras", + "Pharasma", + "Sarenrae", + "Talavet", + "The Devourer", + "Urgathoa", + "Weydan", + "Yaraesa", + "Zon-Kuthon" + ]; + Utils.shuffleArray(gods); + religiousSymbol.name += " (" + gods[0] + ")"; + return religiousSymbol; + } + static makeJunk() { + var junkItem = Items.junk[Math.floor(Math.random() * Items.junk.length)]; + return { + name: junkItem.name, + type: "goods", + data: { + description: { + chat: "", + gmnotes: "", + short: "", + value: "" + junkItem.description + "
", + unidentified: "" + }, + source: "Populator", + type: "", + quantity: 1, + bulk: "L", + price: 0, + level: 1, + attuned: false, + equipped: false, + equippable: false, + identified: true, + attributes: { + sturdy: false, + customBuilt: false, + size: "medium", + dex: { + mod: "" + }, + hp: { + value: 6, + max: "" + }, + hardness: { + value: "" + }, + ac: { + value: "" + } + }, + modifiers: [], + damage: { + parts: [] + }, + critical: { + parts: [] + }, + abilityMods: { + parts: [] + } + }, + flags: {}, + effects: [] + }; + } +} +//# sourceMappingURL=ItemFactory.js.map \ No newline at end of file diff --git a/dist/factories/ItemFactory.js.map b/dist/factories/ItemFactory.js.map new file mode 100644 index 0000000..ce43468 --- /dev/null +++ b/dist/factories/ItemFactory.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ItemFactory.js","sourceRoot":"","sources":["../../src/factories/ItemFactory.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/factories/NPCFactory.js b/dist/factories/NPCFactory.js new file mode 100644 index 0000000..49059f7 --- /dev/null +++ b/dist/factories/NPCFactory.js @@ -0,0 +1,1128 @@ +import { Utils } from "../utils/Uils.js"; +import { Grafts } from "../data/Grafts.js"; +import { ItemFactory } from "./ItemFactory.js"; +import { CR, MonsterCreation, MonsterReferenceSymbol, MonsterSkillType, Save, Size } from "../data/MonsterCreation.js"; +import { BundledRaces, Races } from "../data/Races.js"; +import { Randomizer } from "../Randomizer.js"; +import { WeaponFactory } from "./WeaponFactory.js"; +import { BiographyFactory } from "./BiographyFactory.js"; +import { CreatureTypeGenerationOptions } from "../data/Generator.js"; +import { UniversalCreatureRules } from "../data/universal creature rules/UniversalCreatureRules.js"; +import SkillAdjuster from "../models/adjusters/SkillAdjuster.js"; +import { Skill } from "../data/Skills.js"; +import SenseAdjuster from "../models/adjusters/SenseAdjuster.js"; +import { apply } from "../models/Interfaces/IApplyable.js"; +import { SharedAdjusters } from "../data/adjusters/SharedAdjusters.js"; +import SaveAdjuster from "../models/adjusters/SaveAdjuster.js"; +import AbilityScoreAdjuster from "../models/adjusters/AbilityScoreAdjuster.js"; +import { AbilityScore } from "../data/AbilityScores.js"; +export class NPCFactory { + // Produces a non-hostile NPC from a subset of races + static async makeNonHostile(context) { + let actorData = { name: "Generated Actor", type: "npc" }; + let actor = await Actor.create(actorData); + // Non-combatants are always experts + context.monsterReferenceSymbol = MonsterReferenceSymbol.expert; + await this.setRace(actor, context); + await this.makeNPC(actor, context); + } + static async makeHostile(context) { + let actorData = { name: "Generated Actor", type: "npc" }; + let actor = await Actor.create(actorData); + // If no type set we randomly generate + if (!context.creatureTypeGraft) { + // Randomizes creature type + let supportedMonsterTypes = CreatureTypeGenerationOptions; + Utils.shuffleArray(supportedMonsterTypes); + context.creatureTypeGraft = supportedMonsterTypes[0].typeGraft; + } + // TODO: Pick a random subtype (or none) + // We don't generate "junk" items for monsters + context.generateAdditionalItems = false; + // Monsters generally don't have personalities + context.generatePersonality = false; + await this.makeNPC(actor, context); + } + // Private + static async makeNPC(actor, context) { + // Grab appropriate array rows + let monsterReferenceSymbol = MonsterReferenceSymbol[context.monsterReferenceSymbol]; + let mainArrayRow = Object.assign({}, MonsterCreation.arrays[monsterReferenceSymbol].main[context.CR]); + let attackArrayRow = Object.assign({}, MonsterCreation.arrays[monsterReferenceSymbol].attack[context.CR]); + context.mainArrayRow = mainArrayRow; + context.attackArrayRow = attackArrayRow; + // Fill in details + await this.setGenderAndName(actor, context); + await this.setDetails(actor, context); + await this.setGrafts(actor, context); + await this.setSpecialAbilities(actor, context); + await this.setAttributes(actor, context); + await this.setVulnerabilitiesAndImmunities(actor, context); + await this.setSkills(actor, context); + await this.setWeapons(actor, context); + await this.setInventory(actor, context); + await this.setSenses(actor, context); + await this.setToken(actor, context); + await this.setAbout(actor, context); + } + static async setRace(actor, context) { + let actorUpdate = {}; + let logEntries = []; + if (!context.race) { + let randomRace = Randomizer.randomRace(); + context.race = randomRace.name; + logEntries.push([ + "Chose race " + randomRace.name + " at random.", + "" + ]); + } + else { + logEntries.push(["Race " + context.race + " chosen.", ""]); + } + // Set grafts for race + let race = Races.nonCombatantRaces[context.race]; + context.creatureTypeGraft = race.creatureTypeGraft; + context.creatureSubtypeGrafts = race.creatureSubtypeGrafts; + var raceData; + // We stub in gnolls until they are included in sfrpg + if (context.race == "gnoll") { + raceData = BundledRaces.gnoll; + } + else { + raceData = await Utils.fuzzyFindRaceAsync(race.name); + } + // Race item + await this.clean(raceData); + context.itemsToAdd.push(raceData); + // Update actor + await actor.update(actorUpdate); + // Update log + context.log.push(...logEntries); + } + static async setGenderAndName(actor, context) { + let actorUpdate = {}; + let logEntries = []; + // Gender + if (!context.gender) { + let randomGender = Randomizer.randomGender(); + context.gender = randomGender; + logEntries.push([ + "Chose gender " + randomGender + " at random.", + "" + ]); + } + else { + logEntries.push(["Gender " + context.gender + " chosen.", ""]); + } + // Race and Grafts label + let raceText = context.race + ? " " + Races.nonCombatantRaces[context.race].name + : ""; + actorUpdate["data.details.raceAndGrafts"] = + context.gender + raceText + ", grafts:"; // Grafts will be filled in as applied + // Name + let randomName = Randomizer.randomName(context); + actorUpdate["name"] = randomName; + logEntries.push([" Generated name " + randomName + " at random.", ""]); + // Update actor + await actor.update(actorUpdate); + // Update log + context.log.push(...logEntries); + } + static async setDetails(actor, context) { + var _a; + let logEntries = []; + var race; + if (context.race) + race = Races.nonCombatantRaces[context.race]; + let actorUpdate = {}; + // Source + actorUpdate["data.details.source"] = "Populator"; + // CR + var CR; + if (context.CR === "1/3") { + CR = 1 / 3; + } + else if (context.CR === "1/2") { + CR = 0.5; + } + else { + CR = parseFloat(context.CR); + } + actorUpdate["data.details.cr"] = CR; + // Alignment + let randomAlignment = Randomizer.randomAlignment(); + actorUpdate["data.details.alignment"] = randomAlignment; + logEntries.push([ + "Chose alignment " + randomAlignment + " at random.", + "" + ]); + // Languages + // NOTE: Only applies languages if this creature type has the intelligence capacity for language + if ((_a = context.creatureTypeGraft) === null || _a === void 0 ? void 0 : _a.capicityForLanguage) { + var languages = ["common"]; + if (race === null || race === void 0 ? void 0 : race.languages) { + languages.push(...race.languages); + } + actorUpdate["data.traits.languages.value"] = languages; + } + // Update actor + await actor.update(actorUpdate); + // Update log + context.log.push(...logEntries); + } + static async setGrafts(actor, context) { + if (!context.creatureTypeGraft) + return; + let logEntries = []; + let actorUpdate = {}; + try { + await this.applyCreatureTypeGraft(actor, context, context.creatureTypeGraft); + if (context.creatureSubtypeGrafts) { + let subtypes = []; + for (let creatureSubtypeGraft of context.creatureSubtypeGrafts) { + // Adds subtypes to an array to construct type + subtypes.push(creatureSubtypeGraft.name); + await this.applyCreatureSubtypeGraft(actor, context, creatureSubtypeGraft); + } + // Apply type in "" + entry[0] + "
"; + if (entry[1] != "") { + gmNotes += "" + entry[1] + ""; + } + } + actorUpdate["data.details.biography.gmNotes"] = gmNotes; + // Update actor + await actor.update(actorUpdate); + } + static async applyCreatureTypeGraft(actor, context, graft) { + let logEntries = []; + let actorUpdate = {}; + if (graft === Grafts.creatureType.animal) { + // Applies either a -4 or -5 (randomly) as intelligence score + let intelligenceMods = [-4, -5]; + Utils.shuffleArray(intelligenceMods); + await apply(actor, context, + //Senses + SharedAdjusters.Senses.lowLightVision, + // Applies a +2 to reflex & fortitude + SharedAdjusters.Saves.reflexPlus2, SharedAdjusters.Saves.fortitudePlus2, new AbilityScoreAdjuster({ + setAbilityScore: [ + AbilityScore.intelligence, + intelligenceMods[0] + ] + })); + // TODO: This has a chance of overwriting one of the randomly boosted ability scores, we should reassign the overwritten value to another stat + logEntries.push([ + "Applied animal type graft. Added low-light vision, +2 to reflex/fort save, set " + + intelligenceMods[0] + + " to intelligence (chosen at random between -4 and -5).", + Grafts.creatureType.animal.description + ]); + } + else if (graft === Grafts.creatureType.construct) { + await apply(actor, context, + //Senses + SharedAdjusters.Senses.darkVision60ft, SharedAdjusters.Senses.lowLightVision, + // Immunities + SharedAdjusters.Immunities.constructImmunities, + // Saves (-2 to all) + SharedAdjusters.Saves.reflexMinus2, SharedAdjusters.Saves.willpowerMinus2, SharedAdjusters.Saves.fortitudeMinus2); + // Constitution + context.abilities.push(["con", 0]); // NOTE: Should be no constitution but sfrpg doesn't yet support + // Unliving + await this.applyUniversalCreatureRule(actor, context, UniversalCreatureRules.unliving); + // Attacks + context.attackArrayRow.high += 1; + context.attackArrayRow.low += 1; + logEntries.push([ + "Applied construct type graft. Added darkvision 60 ft. and low-light vision, -2 to all saves, +1 to all attacks, added unliving universal creature rule.", + Grafts.creatureType.construct.description + ]); + } + else if (graft === Grafts.creatureType.humanoid) { + // Applies a +2 to a random saving throw + var saves = [Save.reflex, Save.fortitude, Save.willpower]; + Utils.shuffleArray(saves); + let save = saves[0]; // random save + await new SaveAdjuster({ mutateSave: [save, 2] }).apply(actor, context); + logEntries.push([ + "Applied humanoid type graft. Added +2 to " + + saves[0] + + " save (chosen at random).", + Grafts.creatureType.humanoid.description + ]); + } + else if (graft === Grafts.creatureType.monstrousHumanoid) { + await apply(actor, context, + // Senses + SharedAdjusters.Senses.darkVision60ft, + // Applies a +2 to reflex & will + SharedAdjusters.Saves.reflexPlus2, SharedAdjusters.Saves.willpowerPlus2); + // Add +1 to all attacks + context.attackArrayRow.high += 1; + context.attackArrayRow.low += 1; + logEntries.push([ + "Applied monstrous humanoid type graft. Added darkvision, +2 to reflex/will saves and +1 to all attacks.", + Grafts.creatureType.monstrousHumanoid.description + ]); + } + else if (graft === Grafts.creatureType.ooze) { + apply(actor, context, + //Senses + SharedAdjusters.Senses.blindsight, + // Saves (+2 to fortitude save, -2 reflex save) + SharedAdjusters.Saves.fortitudePlus2, SharedAdjusters.Saves.reflexMinus2, + // Skills (No master or good skills, except perception which everything usually has) + new SkillAdjuster({ + setMonsterSkillCount: [MonsterSkillType.master, 0] + }), new SkillAdjuster({ + setMonsterSkillCount: [MonsterSkillType.good, 0] + }), + // Mindless - no intelligence + // TODO: This has a chance of overwriting one of the randomly boosted ability scores, we should reassign the overwritten value to another stat + new AbilityScoreAdjuster({ + setAbilityScore: [AbilityScore.intelligence, 0] + })); + await this.applyUniversalCreatureRule(actor, context, UniversalCreatureRules.mindless); + // Sightless + await this.applyUniversalCreatureRule(actor, context, UniversalCreatureRules.sightless); + logEntries.push([ + "Applied ooze type graft. Added blindsight, +2 to fort save, -2 to reflex save, set - as intelligence, added mindless and sightless universal creature rule, reduced good and master skills to 0 (except perception).", + Grafts.creatureType.ooze.description + ]); + } + else if (graft === Grafts.creatureType.vermin) { + await apply(actor, context, + //Senses + SharedAdjusters.Senses.darkVision60ft, + // Saves (2 to fortitude saves) + SharedAdjusters.Saves.fortitudePlus2); + // Mindless, no intelligence + // TODO: This has a chance of overwriting one of the randomly boosted ability scores, we should reassign the overwritten value to another stat + context.abilities.push(["int", 0]); + await this.applyUniversalCreatureRule(actor, context, UniversalCreatureRules.mindless); + logEntries.push([ + "Applied vermin type graft. Added darkvision, +2 to fort save, set - as intelligence, added mindless universal creature rule.", + Grafts.creatureType.vermin.description + ]); + } + actorUpdate["data.details.raceAndGrafts"] = + actor.data.data.details.raceAndGrafts + " " + graft.name; + // Update actor + await actor.update(actorUpdate); + // Update log + context.log.push(...logEntries); + } + static async applyCreatureSubtypeGraft(actor, context, graft) { + let logEntries = []; + let actorUpdate = {}; + // Set as 1 per day + function addOncePerDayInnateSpell(spell) { + spell.data.uses.value = 1; + spell.data.uses.max = 1; + spell.data.uses.per = "day"; + spell.data.preparation.mode = "innate"; + context.itemsToAdd.push(spell); + } + function addAtWillInnateSpell(spell) { + spell.data.preparation.mode = "innate"; + context.itemsToAdd.push(spell); + } + if (graft === Grafts.creatureSubtype.android) { + //Senses + await apply(actor, context, SharedAdjusters.Senses.darkVision60ft, SharedAdjusters.Senses.lowLightVision); + logEntries.push([ + "Applied android subtype graft. Added darkvision 60ft. and low-light vision.", + Grafts.creatureSubtype.android.description + ]); + } + else if (graft === Grafts.creatureSubtype.dwarf) { + //Senses + await apply(actor, context, SharedAdjusters.Senses.darkVision60ft); + logEntries.push([ + "Applied dwarf subtype graft. Added darkvision 60ft.", + Grafts.creatureSubtype.dwarf.description + ]); + } + else if (graft === Grafts.creatureSubtype.elf) { + // Elves can be `drow`, `elven` or `half-elven` race + // All elves: + await new SkillAdjuster({ + // Perception as a master skill + setSkillAsMonsterSkill: [ + Skill.perception, + MonsterSkillType.master + ] + }).apply(actor, context); + if (context.race == "elf") { + await apply(actor, context, + // Senses + SharedAdjusters.Senses.lowLightVision, + // Mysticism as a master skill + new SkillAdjuster({ + setSkillAsMonsterSkill: [ + Skill.mysticism, + MonsterSkillType.master + ] + }), + // Add immunities + SharedAdjusters.Immunities.elvenImmunities); + logEntries.push([ + "Applied elf subtype graft. elf race selected so added elven immunities, and mysticism as a master skill.", + Grafts.creatureSubtype.elf.description + ]); + } + if (context.race == "drow") { + await apply(actor, context, + //Senses + SharedAdjusters.Senses.darkVision60ft, // Replaces low-light vision + // Add immunities + SharedAdjusters.Immunities.drowImmunities); + // Drow magic at will innate spells + let dancingLights = await Utils.fuzzyFindSpellAsync("dancing lights"); + let detectMagic = await Utils.fuzzyFindSpellAsync("detect magic"); + addAtWillInnateSpell(dancingLights); + addAtWillInnateSpell(detectMagic); + logEntries.push([ + "Applied elf subtype graft. drow race selected so added darkvision 60ft., perception as a master skill, dacing lights and detect magic as innate spells, added drow immunities.", + Grafts.creatureSubtype.elf.description + ]); + } + else if (context.race == "halfElf") { + await apply(actor, context, SharedAdjusters.Senses.lowLightVision); + // Half-elves gain an extra good skill + context.mainArrayRow.goodSkill.count += 1; + logEntries.push([ + "Applied elf subtype graft. half-elf race selected so added low-light vision, perception as a master skill, and one additional good skill.", + Grafts.creatureSubtype.elf.description + ]); + } + } + else if (graft === Grafts.creatureSubtype.gnoll) { + // Senses + await apply(actor, context, SharedAdjusters.Senses.darkVision60ft, new SenseAdjuster({ addSense: ["blindsense (scent) 30 ft."] }), + // Survival as a master skill + new SkillAdjuster({ + setSkillAsMonsterSkill: [ + Skill.survival, + MonsterSkillType.master + ] + })); + // Natural weapons + context.naturalWeapons.enabled = true; + context.naturalWeapons.racial = true; + logEntries.push([ + "Applied gnoll subtype graft. Added blindsense (scent) 30 ft., darkvision 60ft., natural weapons, survival as a master skill.", + Grafts.creatureSubtype.gnoll.description + ]); + } + else if (graft === Grafts.creatureSubtype.halfling) { + await apply(actor, context, + // Perception and Stealth as master skills + new SkillAdjuster({ + setSkillAsMonsterSkill: [ + Skill.stealth, + MonsterSkillType.master + ] + }), new SkillAdjuster({ + setSkillAsMonsterSkill: [ + Skill.perception, + MonsterSkillType.master + ] + }), + // Athletics and Acrobatics as good skills + new SkillAdjuster({ + setSkillAsMonsterSkill: [ + Skill.acrobatics, + MonsterSkillType.good + ] + }), new SkillAdjuster({ + setSkillAsMonsterSkill: [ + Skill.athletics, + MonsterSkillType.good + ] + })); + logEntries.push([ + "Applied halfing subtype graft. Added perception and stealth as master skills and acrobatics and athletics as good skills.", + Grafts.creatureSubtype.halfling.description + ]); + } + else if (graft === Grafts.creatureSubtype.human) { + if (context.race == Races.nonCombatantRaces.human.name) { + context.mainArrayRow.specialAbilities += 1; + context.mainArrayRow.goodSkill.count += 1; + logEntries.push([ + "Applied human subtype graft. Added an additional special ability and an additional good skill.", + Grafts.creatureSubtype.human.description + ]); + } + // For half-elf, half-orc, etc + else { + logEntries.push([ + "Applied human subtype graft (no modifications).", + Grafts.creatureSubtype.human.description + ]); + } + } + else if (graft === Grafts.creatureSubtype.gnome) { + await apply(actor, context, + //Senses + SharedAdjusters.Senses.lowLightVision, + // Culture as a master skill + new SkillAdjuster({ + setSkillAsMonsterSkill: [ + Skill.culture, + MonsterSkillType.master + ] + })); + // Gnome magic once per day innate spells + let dancingLights = await Utils.fuzzyFindSpellAsync("dancing lights"); + let ghostSound = await Utils.fuzzyFindSpellAsync("ghost sound"); + let tokenSpell = await Utils.fuzzyFindSpellAsync("token spell"); + addOncePerDayInnateSpell(dancingLights); + addOncePerDayInnateSpell(ghostSound); + addOncePerDayInnateSpell(tokenSpell); + logEntries.push([ + "Applied gnome subtype graft. Added dancing lights, ghost sound, and token spell as once-per-day innate spells and added culture as a master skill.", + Grafts.creatureSubtype.gnome.description + ]); + } + else if (graft === Grafts.creatureSubtype.goblinoid) { + // NOTE: AA1 has a different definition of the goblinoid subtype, should handle either + // TODO: Check if space goblin, hobgoblin or kanabo + // NOTE: For now we assume hobgoblin + await apply(actor, context, + //Senses + SharedAdjusters.Senses.darkVision60ft, + // Intimidate and stealth as a master skill + new SkillAdjuster({ + setSkillAsMonsterSkill: [ + [Skill.intimidate, Skill.stealth], + MonsterSkillType.master + ] + })); + } + else if (graft === Grafts.creatureSubtype.orc) { + // TODO: Check if race is half-orc, and only then apply + await apply(actor, context, + // Senses + SharedAdjusters.Senses.darkVision60ft, + // Intimidate and Survival are master skills + new SkillAdjuster({ + setSkillAsMonsterSkill: [ + [Skill.intimidate, Skill.survival], + MonsterSkillType.master + ] + })); + logEntries.push([ + "Applied orc subtype graft. Added darkvision 60 ft and intimidate and survival as master skills.", + Grafts.creatureSubtype.orc.description + ]); + } + else if (graft === Grafts.creatureSubtype.kasatha) { + // Acrobatics and Athletics master skills + await apply(actor, context, + // Acrobatics and Athletics are master skills + new SkillAdjuster({ + setSkillAsMonsterSkill: [ + [Skill.acrobatics, Skill.athletics], + MonsterSkillType.master + ] + }), + // Culture is a good skill + new SkillAdjuster({ + setSkillAsMonsterSkill: [ + [Skill.culture], + MonsterSkillType.good + ] + })); + logEntries.push([ + "Applied kasatha subtype graft. Added acrobatics and atheletics as a master skill, culture as a good skill.", + Grafts.creatureSubtype.kasatha.description + ]); + } + else if (graft === Grafts.creatureSubtype.lashunta) { + // Languages + actorUpdate["data.traits.languages.custom"] = + "limited telepathy 30 ft."; + // Innate spells + let detectThoughts = await Utils.fuzzyFindSpellAsync("detect thoughts"); + let daze = await Utils.fuzzyFindSpellAsync("daze"); + let psychokineticHand = await Utils.fuzzyFindSpellAsync("psychokinetic hand"); + addOncePerDayInnateSpell(detectThoughts); + addAtWillInnateSpell(daze); + addAtWillInnateSpell(psychokineticHand); + logEntries.push([ + "Applied lashunta subtype graft. Added limited telepathy 30 ft., detect thoughts as a once per day innate spell and added daze and psychokinetic hand as innate spells.", + Grafts.creatureSubtype.lashunta.description + ]); + } + else if (graft === Grafts.creatureSubtype.shirren) { + await apply(actor, context, + //Senses + new SenseAdjuster({ + addSense: "blindsense (vibration) 30 ft." + }), + // Culture and Diplomacy as good skills + new SkillAdjuster({ + setSkillAsMonsterSkill: [ + [Skill.culture, Skill.diplomacy], + MonsterSkillType.good + ] + })); + // Languages + actorUpdate["data.traits.languages.custom"] = + "limited telepathy 30 ft."; + logEntries.push([ + "Applied shirren subtype graft. Added blindsense (vibration) 30 ft., limited telepathy 30 ft., culture and diplomacy as good skills.", + Grafts.creatureSubtype.shirren.description + ]); + } + else if (graft === Grafts.creatureSubtype.skittermander) { + //Senses + await apply(actor, context, SharedAdjusters.Senses.lowLightVision); + logEntries.push([ + "Applied skittermander subtype graft. Added low-light vision.", + Grafts.creatureSubtype.skittermander.description + ]); + } + else if (graft === Grafts.creatureSubtype.technological) { + // No modifications + logEntries.push([ + "Applied technological subtype graft (no modifications).", + Grafts.creatureSubtype.technological.description + ]); + } + else if (graft === Grafts.creatureSubtype.vesk) { + await apply(actor, context, + //Senses + SharedAdjusters.Senses.lowLightVision); + // Natural weapons + context.naturalWeapons.enabled = true; + context.naturalWeapons.racial = true; + logEntries.push([ + "Applied vesk subtype graft. Added low-light vision and natural weapons.", + Grafts.creatureSubtype.vesk.description + ]); + } + else if (graft === Grafts.creatureSubtype.ysoki) { + await apply(actor, context, + //Senses + SharedAdjusters.Senses.darkVision60ft, + // Skills (Engineering and stealth as master skills) + new SkillAdjuster({ + setSkillAsMonsterSkill: [ + [Skill.engineering, Skill.stealth], + MonsterSkillType.master + ] + }), + // Survival as good skill + new SkillAdjuster({ + setSkillAsMonsterSkill: [ + Skill.survival, + MonsterSkillType.good + ] + })); + logEntries.push([ + "Applied ysoki subtype graft. Added darkvision 60 ft., added engineering and stealth as master skills and added survival as a good skill.", + Grafts.creatureSubtype.ysoki.description + ]); + } + // Append subtype graft to graft list + actorUpdate["data.details.raceAndGrafts"] = + actor.data.data.details.raceAndGrafts + ", " + graft.name; + // Update actor + await actor.update(actorUpdate); + // Update log + context.log.push(...logEntries); + } + static async applyUniversalCreatureRule(actor, context, universalCreatureRule) { + if (universalCreatureRule == UniversalCreatureRules.mindless) { + await apply(actor, context, + // Immunities + SharedAdjusters.Immunities.mindAffectingEffects, + // Skills - set 0 master skills + new SkillAdjuster({ + setMonsterSkillCount: [MonsterSkillType.master, 0] + }), + // Reduce good skills by 1 + new SkillAdjuster({ + mutateMonsterSkill: [MonsterSkillType.good, -1] + }), + // No intelligence + // TODO: This has a chance of overwriting one of the randomly boosted ability scores, we should reassign the overwritten value to another stat + new AbilityScoreAdjuster({ + setAbilityScore: [AbilityScore.intelligence, 0] + })); + // Update log + context.log.push([ + "Applied mindless universal creature rule. Reduced good skills by 1, reduced master skills to 0, added mind-affecting effects to condition immunities.", + UniversalCreatureRules.mindless.description + ]); + } + else if (universalCreatureRule == UniversalCreatureRules.sightless) { + // Uses default implementation + // TODO: Reumove one all UCR can depend on default/subclass implementation + let output = await universalCreatureRule.apply(actor, context); + context.log.push(output); + } + else if (universalCreatureRule == UniversalCreatureRules.unliving) { + await apply(actor, context, + // No constitution + // TODO: This has a chance of overwriting one of the randomly boosted ability scores, we should reassign the overwritten value to another stat + // TODO: Should support `-` in the future but not yet supported by SFRPG + new AbilityScoreAdjuster({ + setAbilityScore: [AbilityScore.constituion, 0] + })); + // Update log + context.log.push([ + "Applied unliving universal creature rule, set constitution to `-` .", + UniversalCreatureRules.unliving.description + ]); + } + } + static async applyAdjustmentSpecialAbility(actor, context, adjustmentSpecialAbility) { + let logEntries = []; + let actorUpdate = {}; + // Brute - Use the low attack value for the NPC’s main attack, but determine the attack’s damage as if the NPC’s CR were 2 higher (adding the extra damage from weapon specialization). This special ability has a greater impact at higher CRs. + if (adjustmentSpecialAbility === + MonsterCreation.specialAbilities.adjustment.brute) { + context.attackArrayRow.high = context.attackArrayRow.low; + // Get attack rows higher + let indexOfCR = CR.indexOf(context.CR); + let indexOfCRPlus2 = indexOfCR + 2; + let CRPlus2 = CR[indexOfCRPlus2]; + var monsterReferenceSymbol = MonsterReferenceSymbol[context.monsterReferenceSymbol]; + let attackArrayRowPlus2 = MonsterCreation.arrays[monsterReferenceSymbol].attack[CRPlus2]; + // Buff all damage by 2 CRs + context.attackArrayRow.kinetic = attackArrayRowPlus2.kinetic; + context.attackArrayRow.energy = attackArrayRowPlus2.energy; + context.attackArrayRow.standard = attackArrayRowPlus2.standard; + logEntries.push([ + "Applied brute adjustment special ability. Set high attack bonus value to low attack bonus, increased damage by 2 rows in the array.", + MonsterCreation.specialAbilities.adjustment.brute.description + ]); + } + //Increase all saving throw bonuses by 1 or one saving throw bonus by 3. + else if (adjustmentSpecialAbility === + MonsterCreation.specialAbilities.adjustment.saveBoost) { + // Will we increase all 3 by 1 or 1 by 3 + var randomChoice = Math.random() < 0.5; + if (randomChoice) { + // Applies a +1 to all saves + apply(actor, context, new SaveAdjuster({ mutateSave: [Save.reflex, 1] }), new SaveAdjuster({ mutateSave: [Save.willpower, 1] }), new SaveAdjuster({ mutateSave: [Save.fortitude, 1] })); + logEntries.push([ + "Applied save boost adjustment special ability. +1 to all saves (chose this option at random).", + MonsterCreation.specialAbilities.adjustment.saveBoost + .description + ]); + } + else { + // Apply +3 to one save + let saves = [Save.reflex, Save.willpower, Save.fortitude]; + Utils.shuffleArray(saves); + await new SaveAdjuster({ mutateSave: [saves[0], 3] }).apply(actor, context); + logEntries.push([ + "Applied save boost adjustment special ability. +3 to " + + saves[0] + + " save (chose this option at random).", + MonsterCreation.specialAbilities.adjustment.saveBoost + .description + ]); + } + } + // Increase all master and good skill bonuses by 1 + else if (adjustmentSpecialAbility === + MonsterCreation.specialAbilities.adjustment.skillful) { + context.mainArrayRow.masterSkill.mod += 1; + context.mainArrayRow.goodSkill.mod += 1; + logEntries.push([ + "Applied skillful adjustment special ability. +1 to all master and good skills.", + MonsterCreation.specialAbilities.adjustment.skillful.description + ]); + } + //Increase the NPC’s HP by 20% + else if (adjustmentSpecialAbility === + MonsterCreation.specialAbilities.adjustment.extraHitPoints) { + context.mainArrayRow.HP = Math.floor(context.mainArrayRow.HP * 1.2); + logEntries.push([ + "Applied extra hit points adjustment special ability. Added 20% more HP.", + MonsterCreation.specialAbilities.adjustment.extraHitPoints + .description + ]); + } + // Update actor + await actor.update(actorUpdate); + // Log + context.log.push(...logEntries); + } + static async clean(item) { + if (item["_id"]) { + item["sourceId"] = item["_id"]; + delete item["_id"]; + } + } +} +//# sourceMappingURL=NPCFactory.js.map \ No newline at end of file diff --git a/dist/factories/NPCFactory.js.map b/dist/factories/NPCFactory.js.map new file mode 100644 index 0000000..b913738 --- /dev/null +++ b/dist/factories/NPCFactory.js.map @@ -0,0 +1 @@ +{"version":3,"file":"NPCFactory.js","sourceRoot":"","sources":["../../src/factories/NPCFactory.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/factories/WeaponFactory.js b/dist/factories/WeaponFactory.js new file mode 100644 index 0000000..a53cded --- /dev/null +++ b/dist/factories/WeaponFactory.js @@ -0,0 +1,46 @@ +import { Utils } from "../utils/Uils.js"; +import { naturalWeaponsTemplate, unarmedStrikeTemplate } from "../data/Weapons.js"; +export class WeaponFactory { + static makeUnarmedStrike() { + return unarmedStrikeTemplate; + } + static makeNaturalWeapons() { + return naturalWeaponsTemplate; + } + // Generates a CR appropriate laser pistol + static async makeLaserPistol(forCR) { + var pistolName = "laser pistol, azimuth"; // level 1 laser pistol + switch (forCR) { + // CR 1/3 to 5 covered by default value + case "6": + case "7": + case "8": + pistolName = "laser pistol, corona"; + break; + case "9": + case "10": + case "11": + pistolName = "laser pistol, aphelion"; + break; + case "12": + case "13": + pistolName = "laser pistol, perihelion"; + break; + case "14": + case "15": + case "16": + pistolName = "laser pistol, parallax"; + break; + case "17": + case "18": + case "19": + case "20": + pistolName = "laser pistol, zenith"; + } + let laserPistol = await Utils.fuzzyFindItemAsync(pistolName); + if (laserPistol) { + return laserPistol; + } + } +} +//# sourceMappingURL=WeaponFactory.js.map \ No newline at end of file diff --git a/dist/factories/WeaponFactory.js.map b/dist/factories/WeaponFactory.js.map new file mode 100644 index 0000000..c590a03 --- /dev/null +++ b/dist/factories/WeaponFactory.js.map @@ -0,0 +1 @@ +{"version":3,"file":"WeaponFactory.js","sourceRoot":"","sources":["../../src/factories/WeaponFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EACH,sBAAsB,EACtB,qBAAqB,EACxB,MAAM,oBAAoB,CAAA;AAE3B,MAAM,OAAO,aAAa;IACf,MAAM,CAAC,iBAAiB;QAC3B,OAAO,qBAAqB,CAAA;IAChC,CAAC;IAEM,MAAM,CAAC,kBAAkB;QAC5B,OAAO,sBAAsB,CAAA;IACjC,CAAC;IAED,0CAA0C;IACnC,MAAM,CAAC,KAAK,CAAC,eAAe,CAC/B,KAAa;QAEb,IAAI,UAAU,GAAG,uBAAuB,CAAA,CAAC,uBAAuB;QAChE,QAAQ,KAAK,EAAE;YACX,uCAAuC;YACvC,KAAK,GAAG,CAAC;YACT,KAAK,GAAG,CAAC;YACT,KAAK,GAAG;gBACJ,UAAU,GAAG,sBAAsB,CAAA;gBACnC,MAAK;YACT,KAAK,GAAG,CAAC;YACT,KAAK,IAAI,CAAC;YACV,KAAK,IAAI;gBACL,UAAU,GAAG,wBAAwB,CAAA;gBACrC,MAAK;YACT,KAAK,IAAI,CAAC;YACV,KAAK,IAAI;gBACL,UAAU,GAAG,0BAA0B,CAAA;gBACvC,MAAK;YACT,KAAK,IAAI,CAAC;YACV,KAAK,IAAI,CAAC;YACV,KAAK,IAAI;gBACL,UAAU,GAAG,wBAAwB,CAAA;gBACrC,MAAK;YACT,KAAK,IAAI,CAAC;YACV,KAAK,IAAI,CAAC;YACV,KAAK,IAAI,CAAC;YACV,KAAK,IAAI;gBACL,UAAU,GAAG,sBAAsB,CAAA;SAC1C;QAED,IAAI,WAAW,GAAG,MAAM,KAAK,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAA;QAC5D,IAAI,WAAW,EAAE;YACb,OAAO,WAAsB,CAAA;SAChC;IACL,CAAC;CACJ"} \ No newline at end of file diff --git a/dist/models/Adjuster.js b/dist/models/Adjuster.js new file mode 100644 index 0000000..f81e4b8 --- /dev/null +++ b/dist/models/Adjuster.js @@ -0,0 +1,8 @@ +class Adjuster { + apply(actor, context) { + // stub + return ["", ""]; + } +} +export {}; +//# sourceMappingURL=Adjuster.js.map \ No newline at end of file diff --git a/dist/models/Adjuster.js.map b/dist/models/Adjuster.js.map new file mode 100644 index 0000000..73d09bf --- /dev/null +++ b/dist/models/Adjuster.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Adjuster.js","sourceRoot":"","sources":["../../src/models/Adjuster.ts"],"names":[],"mappings":"AAGA,MAAe,QAAQ;IACnB,KAAK,CAAC,KAAK,EAAE,OAA2B;QACpC,OAAO;QACP,OAAO,CAAC,EAAE,EAAC,EAAE,CAAC,CAAA;IAClB,CAAC;CACJ"} \ No newline at end of file diff --git a/dist/models/AdjustmentSpecialAbility.js b/dist/models/AdjustmentSpecialAbility.js new file mode 100644 index 0000000..ff5ee2f --- /dev/null +++ b/dist/models/AdjustmentSpecialAbility.js @@ -0,0 +1,11 @@ +export default class AdjustmentSpecialAbility { + constructor(name, description) { + this.name = name; + this.description = description; + } + async apply(actor, context) { + // Stub + return ["", ""]; + } +} +//# sourceMappingURL=AdjustmentSpecialAbility.js.map \ No newline at end of file diff --git a/dist/models/AdjustmentSpecialAbility.js.map b/dist/models/AdjustmentSpecialAbility.js.map new file mode 100644 index 0000000..bf93dab --- /dev/null +++ b/dist/models/AdjustmentSpecialAbility.js.map @@ -0,0 +1 @@ +{"version":3,"file":"AdjustmentSpecialAbility.js","sourceRoot":"","sources":["../../src/models/AdjustmentSpecialAbility.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,OAAO,OAAO,wBAAwB;IAIzC,YAAY,IAAY,EAAE,WAAmB;QACzC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;IAClC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,OAA2B;QAC1C,OAAO;QACP,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;IACnB,CAAC;CACJ"} \ No newline at end of file diff --git a/dist/models/CreatureSubtypeGraft.js b/dist/models/CreatureSubtypeGraft.js new file mode 100644 index 0000000..50fe410 --- /dev/null +++ b/dist/models/CreatureSubtypeGraft.js @@ -0,0 +1,7 @@ +export default class CreatureSubtypeGraft { + constructor(name, description) { + this.name = name; + this.description = description; + } +} +//# sourceMappingURL=CreatureSubtypeGraft.js.map \ No newline at end of file diff --git a/dist/models/CreatureSubtypeGraft.js.map b/dist/models/CreatureSubtypeGraft.js.map new file mode 100644 index 0000000..e487b82 --- /dev/null +++ b/dist/models/CreatureSubtypeGraft.js.map @@ -0,0 +1 @@ +{"version":3,"file":"CreatureSubtypeGraft.js","sourceRoot":"","sources":["../../src/models/CreatureSubtypeGraft.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,oBAAoB;IAGrC,YAAY,IAAY,EAAE,WAAmB;QACzC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;IAClC,CAAC;CACJ"} \ No newline at end of file diff --git a/dist/models/CreatureTypeGraft.js b/dist/models/CreatureTypeGraft.js index f561f5b..4e5a464 100644 --- a/dist/models/CreatureTypeGraft.js +++ b/dist/models/CreatureTypeGraft.js @@ -1,6 +1,8 @@ export default class CreatureTypeGraft { - constructor(name) { + constructor(name, description, capicityForLanguage = true) { this.name = name; + this.description = description; + this.capicityForLanguage = capicityForLanguage; } } //# sourceMappingURL=CreatureTypeGraft.js.map \ No newline at end of file diff --git a/dist/models/CreatureTypeGraft.js.map b/dist/models/CreatureTypeGraft.js.map index fb9d107..c98bc7d 100644 --- a/dist/models/CreatureTypeGraft.js.map +++ b/dist/models/CreatureTypeGraft.js.map @@ -1 +1 @@ -{"version":3,"file":"CreatureTypeGraft.js","sourceRoot":"","sources":["../../src/models/CreatureTypeGraft.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,iBAAiB;IAElC,YAAY,IAAY;QACpB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;CACJ"} \ No newline at end of file +{"version":3,"file":"CreatureTypeGraft.js","sourceRoot":"","sources":["../../src/models/CreatureTypeGraft.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,iBAAiB;IAMlC,YACI,IAAY,EACZ,WAAmB,EACnB,sBAA+B,IAAI;QAEnC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;QAC9B,IAAI,CAAC,mBAAmB,GAAG,mBAAmB,CAAA;IAClD,CAAC;CACJ"} \ No newline at end of file diff --git a/dist/models/IMainArrayRow.js b/dist/models/IMainArrayRow.js new file mode 100644 index 0000000..c420112 --- /dev/null +++ b/dist/models/IMainArrayRow.js @@ -0,0 +1,2 @@ +"use strict"; +//# sourceMappingURL=IMainArrayRow.js.map \ No newline at end of file diff --git a/dist/models/IMainArrayRow.js.map b/dist/models/IMainArrayRow.js.map new file mode 100644 index 0000000..3433d8d --- /dev/null +++ b/dist/models/IMainArrayRow.js.map @@ -0,0 +1 @@ +{"version":3,"file":"IMainArrayRow.js","sourceRoot":"","sources":["../../src/models/IMainArrayRow.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/dist/models/Interfaces/IApplyable.js b/dist/models/Interfaces/IApplyable.js new file mode 100644 index 0000000..2ee47e3 --- /dev/null +++ b/dist/models/Interfaces/IApplyable.js @@ -0,0 +1,8 @@ +export async function apply(actor, context, ...applyables) { + for (let applyable of applyables) { + await applyable.apply(actor, context); + } + // TODO: Collect output + return ["", ""]; +} +//# sourceMappingURL=IApplyable.js.map \ No newline at end of file diff --git a/dist/models/Interfaces/IApplyable.js.map b/dist/models/Interfaces/IApplyable.js.map new file mode 100644 index 0000000..fc54a39 --- /dev/null +++ b/dist/models/Interfaces/IApplyable.js.map @@ -0,0 +1 @@ +{"version":3,"file":"IApplyable.js","sourceRoot":"","sources":["../../../src/models/Interfaces/IApplyable.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,KAAK,UAAU,KAAK,CACvB,KAAK,EACL,OAA2B,EAC3B,GAAG,UAAwB;IAE3B,KAAK,IAAI,SAAS,IAAI,UAAU,EAAE;QAC9B,MAAM,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;KACxC;IAED,uBAAuB;IACvB,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;AACnB,CAAC"} \ No newline at end of file diff --git a/dist/models/Interfaces/IAttackArrayRow.js b/dist/models/Interfaces/IAttackArrayRow.js new file mode 100644 index 0000000..2114fec --- /dev/null +++ b/dist/models/Interfaces/IAttackArrayRow.js @@ -0,0 +1,2 @@ +"use strict"; +//# sourceMappingURL=IAttackArrayRow.js.map \ No newline at end of file diff --git a/dist/models/Interfaces/IAttackArrayRow.js.map b/dist/models/Interfaces/IAttackArrayRow.js.map new file mode 100644 index 0000000..6509977 --- /dev/null +++ b/dist/models/Interfaces/IAttackArrayRow.js.map @@ -0,0 +1 @@ +{"version":3,"file":"IAttackArrayRow.js","sourceRoot":"","sources":["../../../src/models/Interfaces/IAttackArrayRow.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/dist/models/Interfaces/IGoods.js b/dist/models/Interfaces/IGoods.js new file mode 100644 index 0000000..8abd473 --- /dev/null +++ b/dist/models/Interfaces/IGoods.js @@ -0,0 +1,2 @@ +"use strict"; +//# sourceMappingURL=IGoods.js.map \ No newline at end of file diff --git a/dist/models/Interfaces/IGoods.js.map b/dist/models/Interfaces/IGoods.js.map new file mode 100644 index 0000000..be2d7c0 --- /dev/null +++ b/dist/models/Interfaces/IGoods.js.map @@ -0,0 +1 @@ +{"version":3,"file":"IGoods.js","sourceRoot":"","sources":["../../../src/models/Interfaces/IGoods.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/dist/models/Interfaces/IItem.js b/dist/models/Interfaces/IItem.js new file mode 100644 index 0000000..b8e4dcb --- /dev/null +++ b/dist/models/Interfaces/IItem.js @@ -0,0 +1,2 @@ +"use strict"; +//# sourceMappingURL=IItem.js.map \ No newline at end of file diff --git a/dist/models/Interfaces/IItem.js.map b/dist/models/Interfaces/IItem.js.map new file mode 100644 index 0000000..b33296c --- /dev/null +++ b/dist/models/Interfaces/IItem.js.map @@ -0,0 +1 @@ +{"version":3,"file":"IItem.js","sourceRoot":"","sources":["../../../src/models/Interfaces/IItem.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/dist/models/Interfaces/IMainArrayRow.js b/dist/models/Interfaces/IMainArrayRow.js new file mode 100644 index 0000000..c420112 --- /dev/null +++ b/dist/models/Interfaces/IMainArrayRow.js @@ -0,0 +1,2 @@ +"use strict"; +//# sourceMappingURL=IMainArrayRow.js.map \ No newline at end of file diff --git a/dist/models/Interfaces/IMainArrayRow.js.map b/dist/models/Interfaces/IMainArrayRow.js.map new file mode 100644 index 0000000..c87ea42 --- /dev/null +++ b/dist/models/Interfaces/IMainArrayRow.js.map @@ -0,0 +1 @@ +{"version":3,"file":"IMainArrayRow.js","sourceRoot":"","sources":["../../../src/models/Interfaces/IMainArrayRow.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/dist/models/Interfaces/ISpecialAbility.js b/dist/models/Interfaces/ISpecialAbility.js new file mode 100644 index 0000000..639e8d4 --- /dev/null +++ b/dist/models/Interfaces/ISpecialAbility.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=ISpecialAbility.js.map \ No newline at end of file diff --git a/dist/models/Interfaces/ISpecialAbility.js.map b/dist/models/Interfaces/ISpecialAbility.js.map new file mode 100644 index 0000000..21d6ced --- /dev/null +++ b/dist/models/Interfaces/ISpecialAbility.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ISpecialAbility.js","sourceRoot":"","sources":["../../../src/models/Interfaces/ISpecialAbility.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/dist/models/Interfaces/IWeapon.js b/dist/models/Interfaces/IWeapon.js new file mode 100644 index 0000000..75dd84f --- /dev/null +++ b/dist/models/Interfaces/IWeapon.js @@ -0,0 +1,2 @@ +"use strict"; +//# sourceMappingURL=IWeapon.js.map \ No newline at end of file diff --git a/dist/models/Interfaces/IWeapon.js.map b/dist/models/Interfaces/IWeapon.js.map new file mode 100644 index 0000000..ca741b3 --- /dev/null +++ b/dist/models/Interfaces/IWeapon.js.map @@ -0,0 +1 @@ +{"version":3,"file":"IWeapon.js","sourceRoot":"","sources":["../../../src/models/Interfaces/IWeapon.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/dist/models/Interfaces/MainArrayRow.js b/dist/models/Interfaces/MainArrayRow.js new file mode 100644 index 0000000..5ccde06 --- /dev/null +++ b/dist/models/Interfaces/MainArrayRow.js @@ -0,0 +1,2 @@ +"use strict"; +//# sourceMappingURL=MainArrayRow.js.map \ No newline at end of file diff --git a/dist/models/Interfaces/MainArrayRow.js.map b/dist/models/Interfaces/MainArrayRow.js.map new file mode 100644 index 0000000..347174c --- /dev/null +++ b/dist/models/Interfaces/MainArrayRow.js.map @@ -0,0 +1 @@ +{"version":3,"file":"MainArrayRow.js","sourceRoot":"","sources":["../../../src/models/Interfaces/MainArrayRow.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/dist/models/Interfaces/items/IGoods.js b/dist/models/Interfaces/items/IGoods.js new file mode 100644 index 0000000..8abd473 --- /dev/null +++ b/dist/models/Interfaces/items/IGoods.js @@ -0,0 +1,2 @@ +"use strict"; +//# sourceMappingURL=IGoods.js.map \ No newline at end of file diff --git a/dist/models/Interfaces/items/IGoods.js.map b/dist/models/Interfaces/items/IGoods.js.map new file mode 100644 index 0000000..57c81d8 --- /dev/null +++ b/dist/models/Interfaces/items/IGoods.js.map @@ -0,0 +1 @@ +{"version":3,"file":"IGoods.js","sourceRoot":"","sources":["../../../../src/models/Interfaces/items/IGoods.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/dist/models/Interfaces/items/IItem.js b/dist/models/Interfaces/items/IItem.js new file mode 100644 index 0000000..b8e4dcb --- /dev/null +++ b/dist/models/Interfaces/items/IItem.js @@ -0,0 +1,2 @@ +"use strict"; +//# sourceMappingURL=IItem.js.map \ No newline at end of file diff --git a/dist/models/Interfaces/items/IItem.js.map b/dist/models/Interfaces/items/IItem.js.map new file mode 100644 index 0000000..eca1edd --- /dev/null +++ b/dist/models/Interfaces/items/IItem.js.map @@ -0,0 +1 @@ +{"version":3,"file":"IItem.js","sourceRoot":"","sources":["../../../../src/models/Interfaces/items/IItem.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/dist/models/Interfaces/items/IWeapon.js b/dist/models/Interfaces/items/IWeapon.js new file mode 100644 index 0000000..75dd84f --- /dev/null +++ b/dist/models/Interfaces/items/IWeapon.js @@ -0,0 +1,2 @@ +"use strict"; +//# sourceMappingURL=IWeapon.js.map \ No newline at end of file diff --git a/dist/models/Interfaces/items/IWeapon.js.map b/dist/models/Interfaces/items/IWeapon.js.map new file mode 100644 index 0000000..0b508c2 --- /dev/null +++ b/dist/models/Interfaces/items/IWeapon.js.map @@ -0,0 +1 @@ +{"version":3,"file":"IWeapon.js","sourceRoot":"","sources":["../../../../src/models/Interfaces/items/IWeapon.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/dist/models/MainArrayRow.js b/dist/models/MainArrayRow.js new file mode 100644 index 0000000..5ccde06 --- /dev/null +++ b/dist/models/MainArrayRow.js @@ -0,0 +1,2 @@ +"use strict"; +//# sourceMappingURL=MainArrayRow.js.map \ No newline at end of file diff --git a/dist/models/MainArrayRow.js.map b/dist/models/MainArrayRow.js.map new file mode 100644 index 0000000..11d3ead --- /dev/null +++ b/dist/models/MainArrayRow.js.map @@ -0,0 +1 @@ +{"version":3,"file":"MainArrayRow.js","sourceRoot":"","sources":["../../src/models/MainArrayRow.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/dist/models/NPCCreationContext.js b/dist/models/NPCCreationContext.js index 4958217..b9340a4 100644 --- a/dist/models/NPCCreationContext.js +++ b/dist/models/NPCCreationContext.js @@ -1,6 +1,35 @@ +import { CR, MonsterReferenceSymbol } from "../data/MonsterCreation.js"; export default class NPCCreationContext { constructor() { - this.creatureTypeGraft = null; + this.CR = CR[0]; // defaults to lowest CR + this.monsterReferenceSymbol = MonsterReferenceSymbol.combatant; // defaults to combatant + this.tokenOptions = new TokenOptions(false); + // Skills - in addition to the array master/good skills + this.masterSkills = []; + this.goodSkills = []; + // Abilities - locked ability modifiers from grafts/special abilities + this.abilities = []; // `null` refers to no ability ie. mindless (not yet implemented in SFRPG) + // Senses + this.senses = []; + // Immunities + this.damageImmunities = []; + this.conditionImmunities = []; + // Special abilities + this.universalCreatureRules = []; + // Item generation + this.naturalWeapons = { enabled: false, racial: false }; + this.rangedWeapon = { enabled: false }; // NOTE: This will be fleshed out and expanded over time + this.itemsToAdd = []; + this.generateAdditionalItems = true; // Generates "junk" and character appropriate items + // Biography + this.generatePersonality = true; // Will try to generate a biography for the creature, generally only used for non-combat NPCs + // Debugging / auditing + this.log = []; // We record each mutation applied + } +} +export class TokenOptions { + constructor(dynamicImage) { + this.dynamicImage = dynamicImage; } } //# sourceMappingURL=NPCCreationContext.js.map \ No newline at end of file diff --git a/dist/models/NPCCreationContext.js.map b/dist/models/NPCCreationContext.js.map index 865d105..da4d9ca 100644 --- a/dist/models/NPCCreationContext.js.map +++ b/dist/models/NPCCreationContext.js.map @@ -1 +1 @@ -{"version":3,"file":"NPCCreationContext.js","sourceRoot":"","sources":["../../src/models/NPCCreationContext.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAO,kBAAkB;IAKnC;QACI,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAClC,CAAC;CACJ"} \ No newline at end of file +{"version":3,"file":"NPCCreationContext.js","sourceRoot":"","sources":["../../src/models/NPCCreationContext.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,EAAE,EAAU,sBAAsB,EAAE,MAAM,4BAA4B,CAAA;AAE/E,MAAM,CAAC,OAAO,OAAO,kBAAkB;IAkCnC;QA/BO,OAAE,GAAW,EAAE,CAAC,CAAC,CAAC,CAAA,CAAC,wBAAwB;QAG3C,2BAAsB,GACzB,sBAAsB,CAAC,SAAS,CAAA,CAAC,wBAAwB;QACtD,iBAAY,GAAiB,IAAI,YAAY,CAAC,KAAK,CAAC,CAAA;QAI3D,uDAAuD;QAChD,iBAAY,GAAa,EAAE,CAAA;QAC3B,eAAU,GAAa,EAAE,CAAA;QAChC,qEAAqE;QAC9D,cAAS,GAA8B,EAAE,CAAA,CAAC,0EAA0E;QAC3H,SAAS;QACF,WAAM,GAAa,EAAE,CAAA;QAC5B,aAAa;QACN,qBAAgB,GAAa,EAAE,CAAA;QAC/B,wBAAmB,GAAa,EAAE,CAAA;QACzC,oBAAoB;QACb,2BAAsB,GAAU,EAAE,CAAA;QACzC,kBAAkB;QACX,mBAAc,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;QAClD,iBAAY,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA,CAAC,wDAAwD;QAC1F,eAAU,GAAU,EAAE,CAAA;QACtB,4BAAuB,GAAG,IAAI,CAAA,CAAC,mDAAmD;QACzF,YAAY;QACL,wBAAmB,GAAG,IAAI,CAAA,CAAC,6FAA6F;QAC/H,uBAAuB;QAChB,QAAG,GAAuB,EAAE,CAAA,CAAC,kCAAkC;IAEvD,CAAC;CACnB;AAED,MAAM,OAAO,YAAY;IAErB,YAAY,YAAqB;QAC7B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;IACpC,CAAC;CACJ"} \ No newline at end of file diff --git a/dist/models/Race.js b/dist/models/Race.js new file mode 100644 index 0000000..0d63d32 --- /dev/null +++ b/dist/models/Race.js @@ -0,0 +1,17 @@ +export default class Race { + constructor(name, size, creatureTypeGraft, creatureSubtypeGrafts = [], languages, customLanguages, arms) { + this.arms = 2; + this.name = name; + this.size = size; + this.creatureTypeGraft = creatureTypeGraft; + this.languages = languages; + // Supports arrays and non-arrays + if (Array.isArray(creatureSubtypeGrafts)) { + this.creatureSubtypeGrafts = creatureSubtypeGrafts; + } + else { + this.creatureSubtypeGrafts = [creatureSubtypeGrafts]; + } + } +} +//# sourceMappingURL=Race.js.map \ No newline at end of file diff --git a/dist/models/Race.js.map b/dist/models/Race.js.map new file mode 100644 index 0000000..4c9f048 --- /dev/null +++ b/dist/models/Race.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Race.js","sourceRoot":"","sources":["../../src/models/Race.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,OAAO,OAAO,IAAI;IAQrB,YACI,IAAY,EACZ,IAAU,EACV,iBAAoC,EACpC,wBAE6B,EAAE,EAC/B,SAAoB,EACpB,eAA0B,EAC1B,IAAa;QAdjB,SAAI,GAAW,CAAC,CAAA;QAgBZ,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAA;QAC1C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAE1B,iCAAiC;QACjC,IAAI,KAAK,CAAC,OAAO,CAAC,qBAAqB,CAAC,EAAE;YACtC,IAAI,CAAC,qBAAqB,GAAG,qBAAqB,CAAA;SACrD;aAAM;YACH,IAAI,CAAC,qBAAqB,GAAG,CAAC,qBAAqB,CAAC,CAAA;SACvD;IACL,CAAC;CACJ"} \ No newline at end of file diff --git a/dist/models/UniversalCreatureRule.js b/dist/models/UniversalCreatureRule.js new file mode 100644 index 0000000..2519940 --- /dev/null +++ b/dist/models/UniversalCreatureRule.js @@ -0,0 +1,21 @@ +import { Utils } from "../utils/Uils.js"; +export default class UniversalCreatureRule { + constructor(name, description) { + this.name = name; + this.description = description; + } + async apply(actor, context) { + // By default when applied will add the appropriate feature to npc + let feature = await Utils.fuzzyFindUniversalCreatureRule(this.name); + if (feature) + context.itemsToAdd.push(feature); + // Default is just a basic log indicating no modifications + return [ + "Applied " + + this.name + + " universal creature rule (no modifications).", + this.description + ]; + } +} +//# sourceMappingURL=UniversalCreatureRule.js.map \ No newline at end of file diff --git a/dist/models/UniversalCreatureRule.js.map b/dist/models/UniversalCreatureRule.js.map new file mode 100644 index 0000000..3ca6266 --- /dev/null +++ b/dist/models/UniversalCreatureRule.js.map @@ -0,0 +1 @@ +{"version":3,"file":"UniversalCreatureRule.js","sourceRoot":"","sources":["../../src/models/UniversalCreatureRule.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAGxC,MAAM,CAAC,OAAO,OAAO,qBAAqB;IAItC,YAAY,IAAY,EAAE,WAAmB;QACzC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;IAClC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,OAA2B;QAC1C,kEAAkE;QAClE,IAAI,OAAO,GAAG,MAAM,KAAK,CAAC,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACnE,IAAI,OAAO;YAAE,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAE7C,0DAA0D;QAC1D,OAAO;YACH,aAAa;gBACT,IAAI,CAAC,IAAI;gBACT,kDAAkD;YACtD,IAAI,CAAC,WAAW;SACnB,CAAA;IACL,CAAC;CACJ"} \ No newline at end of file diff --git a/dist/models/adjusters/AbilityScoreAdjuster.js b/dist/models/adjusters/AbilityScoreAdjuster.js new file mode 100644 index 0000000..d36757f --- /dev/null +++ b/dist/models/adjusters/AbilityScoreAdjuster.js @@ -0,0 +1,19 @@ +import Adjuster from "./Adjuster.js"; +export default class AbilityScoreAdjuster extends Adjuster { + // Set ability score value + constructor(abilityScoreAdjuster = {}) { + super(); + Object.assign(this, abilityScoreAdjuster); + } + async apply(actor, context) { + if (this.setAbilityScore) { + context.abilities.push([ + this.setAbilityScore[0], + this.setAbilityScore[1] + ]); + } + // TODO: Construct log from individual adjustors + return ["", ""]; + } +} +//# sourceMappingURL=AbilityScoreAdjuster.js.map \ No newline at end of file diff --git a/dist/models/adjusters/AbilityScoreAdjuster.js.map b/dist/models/adjusters/AbilityScoreAdjuster.js.map new file mode 100644 index 0000000..6e22eff --- /dev/null +++ b/dist/models/adjusters/AbilityScoreAdjuster.js.map @@ -0,0 +1 @@ +{"version":3,"file":"AbilityScoreAdjuster.js","sourceRoot":"","sources":["../../../src/models/adjusters/AbilityScoreAdjuster.ts"],"names":[],"mappings":"AAEA,OAAO,QAAQ,MAAM,eAAe,CAAA;AAKpC,MAAM,CAAC,OAAO,OAAO,oBAAqB,SAAQ,QAAQ;IAGtD,0BAA0B;IAC1B,YAAY,uBAAsD,EAAE;QAChE,KAAK,EAAE,CAAA;QACP,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAA;IAC7C,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,OAA2B;QAC1C,IAAI,IAAI,CAAC,eAAe,EAAE;YACtB,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC;gBACnB,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;gBACvB,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;aAC1B,CAAC,CAAA;SACL;QACD,gDAAgD;QAChD,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;IACnB,CAAC;CACJ"} \ No newline at end of file diff --git a/dist/models/adjusters/Adjuster.js b/dist/models/adjusters/Adjuster.js new file mode 100644 index 0000000..4fe4dc8 --- /dev/null +++ b/dist/models/adjusters/Adjuster.js @@ -0,0 +1,7 @@ +export default class Adjuster { + async apply(actor, context) { + // stub + return ["", ""]; + } +} +//# sourceMappingURL=Adjuster.js.map \ No newline at end of file diff --git a/dist/models/adjusters/Adjuster.js.map b/dist/models/adjusters/Adjuster.js.map new file mode 100644 index 0000000..7844b54 --- /dev/null +++ b/dist/models/adjusters/Adjuster.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Adjuster.js","sourceRoot":"","sources":["../../../src/models/adjusters/Adjuster.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,OAAO,OAAgB,QAAQ;IAClC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,OAA2B;QAC1C,OAAO;QACP,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;IACnB,CAAC;CACJ"} \ No newline at end of file diff --git a/dist/models/adjusters/ImmunityAdjuster.js b/dist/models/adjusters/ImmunityAdjuster.js new file mode 100644 index 0000000..901ef39 --- /dev/null +++ b/dist/models/adjusters/ImmunityAdjuster.js @@ -0,0 +1,21 @@ +import Adjuster from "./Adjuster.js"; +export default class ImmunityAdjuster extends Adjuster { + // Set number of good / master skills + constructor(immunityAdjuster = {}) { + super(); + Object.assign(this, immunityAdjuster); + } + async apply(actor, context) { + if (this.addConditionImmunity) { + if (Array.isArray(this.addConditionImmunity)) { + context.conditionImmunities.push(this.addConditionImmunity[0]); + } + else { + context.conditionImmunities.push(this.addConditionImmunity); + } + } + // TODO: Construct log from individual adjustors + return ["", ""]; + } +} +//# sourceMappingURL=ImmunityAdjuster.js.map \ No newline at end of file diff --git a/dist/models/adjusters/ImmunityAdjuster.js.map b/dist/models/adjusters/ImmunityAdjuster.js.map new file mode 100644 index 0000000..9604f8a --- /dev/null +++ b/dist/models/adjusters/ImmunityAdjuster.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ImmunityAdjuster.js","sourceRoot":"","sources":["../../../src/models/adjusters/ImmunityAdjuster.ts"],"names":[],"mappings":"AAEA,OAAO,QAAQ,MAAM,eAAe,CAAA;AAIpC,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,QAAQ;IAGlD,qCAAqC;IACrC,YAAY,mBAA8C,EAAE;QACxD,KAAK,EAAE,CAAA;QACP,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAA;IACzC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,OAA2B;QAC1C,IAAI,IAAI,CAAC,oBAAoB,EAAE;YAC3B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,EAAE;gBAC1C,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAA;aACjE;iBAAM;gBACH,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;aAC9D;SACJ;QACD,gDAAgD;QAChD,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;IACnB,CAAC;CACJ"} \ No newline at end of file diff --git a/dist/models/adjusters/SaveAdjuster.js b/dist/models/adjusters/SaveAdjuster.js new file mode 100644 index 0000000..763f66b --- /dev/null +++ b/dist/models/adjusters/SaveAdjuster.js @@ -0,0 +1,18 @@ +import Adjuster from "./Adjuster.js"; +export default class SaveAdjuster extends Adjuster { + // Set number of good / master skills + constructor(saveAdjuster = {}) { + super(); + Object.assign(this, saveAdjuster); + } + async apply(actor, context) { + if (this.mutateSave) { + let array = context.mainArrayRow; + let currentSave = array[this.mutateSave[0]]; + array[this.mutateSave[0]] = currentSave + this.mutateSave[1]; + } + // TODO: Construct log from individual adjustors + return ["", ""]; + } +} +//# sourceMappingURL=SaveAdjuster.js.map \ No newline at end of file diff --git a/dist/models/adjusters/SaveAdjuster.js.map b/dist/models/adjusters/SaveAdjuster.js.map new file mode 100644 index 0000000..c5b33d1 --- /dev/null +++ b/dist/models/adjusters/SaveAdjuster.js.map @@ -0,0 +1 @@ +{"version":3,"file":"SaveAdjuster.js","sourceRoot":"","sources":["../../../src/models/adjusters/SaveAdjuster.ts"],"names":[],"mappings":"AAEA,OAAO,QAAQ,MAAM,eAAe,CAAA;AAKpC,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,QAAQ;IAG9C,qCAAqC;IACrC,YAAY,eAAsC,EAAE;QAChD,KAAK,EAAE,CAAA;QACP,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAA;IACrC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,OAA2B;QAC1C,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,IAAI,KAAK,GAAG,OAAO,CAAC,YAAY,CAAA;YAChC,IAAI,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;YAC3C,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;SAC/D;QAED,gDAAgD;QAChD,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;IACnB,CAAC;CACJ"} \ No newline at end of file diff --git a/dist/models/adjusters/SenseAdjuster.js b/dist/models/adjusters/SenseAdjuster.js new file mode 100644 index 0000000..cb1c794 --- /dev/null +++ b/dist/models/adjusters/SenseAdjuster.js @@ -0,0 +1,21 @@ +import Adjuster from "./Adjuster.js"; +export default class SenseAdjuster extends Adjuster { + // Set number of good / master skills + constructor(senseAdjuster = {}) { + super(); + Object.assign(this, senseAdjuster); + } + async apply(actor, context) { + if (this.addSense) { + if (Array.isArray(this.addSense)) { + context.senses.push(this.addSense[0]); + } + else { + context.senses.push(this.addSense); + } + } + // TODO: Construct log from individual adjustors + return ["", ""]; + } +} +//# sourceMappingURL=SenseAdjuster.js.map \ No newline at end of file diff --git a/dist/models/adjusters/SenseAdjuster.js.map b/dist/models/adjusters/SenseAdjuster.js.map new file mode 100644 index 0000000..8b4c541 --- /dev/null +++ b/dist/models/adjusters/SenseAdjuster.js.map @@ -0,0 +1 @@ +{"version":3,"file":"SenseAdjuster.js","sourceRoot":"","sources":["../../../src/models/adjusters/SenseAdjuster.ts"],"names":[],"mappings":"AAEA,OAAO,QAAQ,MAAM,eAAe,CAAA;AAIpC,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,QAAQ;IAG/C,qCAAqC;IACrC,YAAY,gBAAwC,EAAE;QAClD,KAAK,EAAE,CAAA;QACP,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC,CAAA;IACtC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,OAA2B;QAC1C,IAAI,IAAI,CAAC,QAAQ,EAAE;YACf,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAC9B,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;aACxC;iBAAM;gBACH,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;aACrC;SACJ;QAED,gDAAgD;QAChD,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;IACnB,CAAC;CACJ"} \ No newline at end of file diff --git a/dist/models/adjusters/SkillAdjuster.js b/dist/models/adjusters/SkillAdjuster.js new file mode 100644 index 0000000..85f2657 --- /dev/null +++ b/dist/models/adjusters/SkillAdjuster.js @@ -0,0 +1,57 @@ +import Adjuster from "./Adjuster.js"; +import { MonsterSkillType } from "../../data/MonsterCreation.js"; +export default class SkillAdjuster extends Adjuster { + // Set number of good / master skills + constructor(skillAdjuster = {}) { + super(); + Object.assign(this, skillAdjuster); + } + async apply(actor, context) { + // Set number of good / master skills + if (this.setMonsterSkillCount) { + if (this.setMonsterSkillCount[0] == MonsterSkillType.good) { + // set good skill count + context.mainArrayRow.goodSkill.count = this.setMonsterSkillCount[1]; + } + else { + // set master skill count + context.mainArrayRow.masterSkill.count = this.setMonsterSkillCount[1]; + } + } + // Set a specific skill as a good/master skill + if (this.setSkillAsMonsterSkill) { + let skill = this.setSkillAsMonsterSkill[0]; + if (this.setSkillAsMonsterSkill[1] == MonsterSkillType.master) { + if (Array.isArray(skill)) { + context.masterSkills.push(...skill); + } + else { + context.masterSkills.push(skill); + } + } + else { + if (Array.isArray(skill)) { + context.goodSkills.push(...skill); + } + else { + context.goodSkills.push(skill); + } + } + } + // Adjust the skill value applied to good/master skills + if (this.mutateMonsterSkill) { + if (this.mutateMonsterSkill[0] == MonsterSkillType.good) { + // adjust good skill count + context.mainArrayRow.goodSkill.count += this.mutateMonsterSkill[1]; + } + else { + // set master skill count + context.mainArrayRow.masterSkill.count += this.mutateMonsterSkill[1]; + } + } + // TODO: MutateSkillValue logic + // TODO: Construct log from individual adjustors + return ["", ""]; + } +} +//# sourceMappingURL=SkillAdjuster.js.map \ No newline at end of file diff --git a/dist/models/adjusters/SkillAdjuster.js.map b/dist/models/adjusters/SkillAdjuster.js.map new file mode 100644 index 0000000..3141e2e --- /dev/null +++ b/dist/models/adjusters/SkillAdjuster.js.map @@ -0,0 +1 @@ +{"version":3,"file":"SkillAdjuster.js","sourceRoot":"","sources":["../../../src/models/adjusters/SkillAdjuster.ts"],"names":[],"mappings":"AAEA,OAAO,QAAQ,MAAM,eAAe,CAAA;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAA;AAYhE,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,QAAQ;IAM/C,qCAAqC;IACrC,YAAY,gBAAwC,EAAE;QAClD,KAAK,EAAE,CAAA;QACP,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC,CAAA;IACtC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,OAA2B;QAC1C,qCAAqC;QACrC,IAAI,IAAI,CAAC,oBAAoB,EAAE;YAC3B,IAAI,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,IAAI,EAAE;gBACvD,uBAAuB;gBACvB,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAA;aACtE;iBAAM;gBACH,yBAAyB;gBACzB,OAAO,CAAC,YAAY,CAAC,WAAW,CAAC,KAAK,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAA;aACxE;SACJ;QACD,8CAA8C;QAC9C,IAAI,IAAI,CAAC,sBAAsB,EAAE;YAC7B,IAAI,KAAK,GAAG,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAA;YAE1C,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,MAAM,EAAE;gBAC3D,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;oBACtB,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAA;iBACtC;qBAAM;oBACH,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;iBACnC;aACJ;iBAAM;gBACH,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;oBACtB,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAA;iBACpC;qBAAM;oBACH,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;iBACjC;aACJ;SACJ;QACD,uDAAuD;QACvD,IAAI,IAAI,CAAC,kBAAkB,EAAE;YACzB,IAAI,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,IAAI,EAAE;gBACrD,0BAA0B;gBAC1B,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAA;aACrE;iBAAM;gBACH,yBAAyB;gBACzB,OAAO,CAAC,YAAY,CAAC,WAAW,CAAC,KAAK,IAAI,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAA;aACvE;SACJ;QAED,+BAA+B;QAE/B,gDAAgD;QAChD,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;IACnB,CAAC;CACJ"} \ No newline at end of file diff --git a/dist/utils/Setup.js b/dist/utils/Setup.js index c9c3c8f..3b2ff30 100644 --- a/dist/utils/Setup.js +++ b/dist/utils/Setup.js @@ -6,7 +6,7 @@ Hooks.on("renderSidebarTab", async (app) => { } }); // Adds options -Hooks.once('init', async function () { +Hooks.once("init", async function () { // Default CR game.settings.register("foundryvtt-sfrpg-populator", "defaultCR", { name: "Default CR", @@ -19,13 +19,16 @@ Hooks.once('init', async function () { "1/3": "CR 1/3", "1/2": "CR 1/2", "1": "CR 1", - "2": "CR 2" + "2": "CR 2", + "3": "CR 3", + "4": "CR 4", + "5": "CR 5" } }); // Use dynamic token images (requires specific folder structure in foundry data) game.settings.register("foundryvtt-sfrpg-populator", "dynamicTokenImages", { name: "Dynamic token images (Experimental)", - hint: "When enabled the token will be assigned a random image from \\populator\\
" + junkItem.description + "
", - "unidentified": "" - }, - "source": "Populator", - "type": "", - "quantity": 1, - "bulk": "L", - "price": 0, - "level": 1, - "attuned": false, - "equipped": false, - "equippable": false, - "identified": true, - "attributes": { - "sturdy": false, - "customBuilt": false, - "size": "medium", - "dex": { - "mod": "" - }, - "hp": { - "value": 6, - "max": "" - }, - "hardness": { - "value": "" - }, - "ac": { - "value": "" - } - }, - "modifiers": [], - "damage": { - "parts": [] - }, - "critical": { - "parts": [] - }, - "abilityMods": { - "parts": [] - } - }, - "flags": {}, - "effects": [] - } - } -} \ No newline at end of file diff --git a/src/NPCFactory.ts b/src/NPCFactory.ts deleted file mode 100644 index 69754f1..0000000 --- a/src/NPCFactory.ts +++ /dev/null @@ -1,458 +0,0 @@ -import { Utils } from "./utils/Uils.js"; -import { Grafts } from "./data/Grafts.js"; -import { ItemFactory } from "./ItemFactory.js" -import { MonsterCreation } from "./data/MonsterCreation.js"; -import { BundledRaces, Races } from "./data/Races.js"; -import { Randomizer } from "./Randomizer.js"; -import { WeaponFactory } from "./WeaponFactory.js"; -import CreatureTypeGraft from "./models/CreatureTypeGraft.js"; - -export class NPCFactory { - - // Produces a non-hostile NPC from a subset of races - static async makeNonHostile(options = {CR: "1/3", dynamicTokenImages: false, race: null, gender: null}) { - - let actorData = {name: "Generated Actor", type: "npc"}; - let actor = await Actor.create(actorData); - - let actorDescription = {}; - actorDescription["data.details.biography.value"] = "Created by Populator.
"; - await actor.update(actorDescription); - - let context = { - options: options, - itemsToAdd: [], - arrays: {main: null, attack: null}, - // Skills - masterSkill: [], // In addition to the array master skills - goodSkill: [], // In addition to the array good skills - // Attacks - hasNaturalWeapons: false - }; - - // Look up array - context.arrays.main = MonsterCreation.arrays.expert.main[options.CR]; - context.arrays.attack = MonsterCreation.arrays.expert.attack[options.CR]; - - // Fill in details - await this.setNameGenderAndRace(actor, context); - await this.setDetails(actor, context); - await this.setAttributes(actor, context); - await this.setGrafts(actor, context); - await this.setSkills(actor, context); - await this.setWeapons(actor, context); - await this.setInventory(actor, context); - await this.setToken(actor, context); - - // Add all items - let actorUpdate = {}; - actorUpdate["items"] = context.itemsToAdd; - await actor.update(actorUpdate); - } - - static async setNameGenderAndRace(actor, context) { - - if (!context.options.race) { - context.options.race = Randomizer.randomRace(); - } - - if(!context.options.gender) { - context.options.gender = Randomizer.randomGender(); - } - - let actorUpdate = {}; - var raceData; - // We stub in gnolls until they are included in sfrpg - if (context.options.race.name == "gnoll") { - - raceData = BundledRaces.gnoll; - } - else { - raceData = await Utils.fuzzyFindRaceAsync(context.options.race.name); - } - - - // Race item - await this.clean(raceData); - context.itemsToAdd.push(raceData); - - // Gender - actorUpdate["data.details.raceAndGrafts"] = context.options.gender + " " + context.options.race.name + ", grafts:"; // Grafts will be filled in as applied - - // Name - actorUpdate["name"] = Randomizer.randomName(context.options.race.name, context.options.gender); - - // Update actor - await actor.update(actorUpdate); - } - - static async setDetails(actor, context) { - - let race = Races.nonCombatantRaces[context.options.race.name]; - let actorUpdate = {}; - - // Source - actorUpdate["data.details.source"] = "Populator"; - - // CR - var CR = context.options.CR; - - if (CR === "1/3") { CR = (1/3); } - if (CR === "1/2") { CR = 0.5; } - - actorUpdate["data.details.cr"] = CR; - - // Alignment - actorUpdate["data.details.alignment"] = Randomizer.randomAlignment(); - - // Languages - var languages = ["common"]; - if (race.languages) { - languages.push(...race.languages); - } - actorUpdate["data.traits.languages.value"] = languages; - - // Update actor - await actor.update(actorUpdate); - } - - static async setAttributes(actor, context) { - - let array = context.arrays.main; - let actorUpdate = {}; - - // Size - actorUpdate["data.traits.size"] = context.options.race.size; - - // Hands - if(context.options.race.arms != undefined) { - actorUpdate["data.attributes.arms"] = context.options.race.arms; - } - - // Reach - // TODO: Reach should be decided by grafts - actorUpdate["data.attributes.reach"] = 5; - - // Set HP - actorUpdate["data.attributes.hp.value"] = array.HP; - actorUpdate["data.attributes.hp.max"] = array.HP; - - // Set SP (should be 0) - actorUpdate["data.attributes.sp.max"] = 0; - - // Set RP (should be 0) - actorUpdate["data.attributes.rp.max"] = 0; - - // Set KAC - actorUpdate["data.attributes.kac.value"] = array.KAC; - - // Set EAC - actorUpdate["data.attributes.eac.value"] = array.EAC; - - // Set reflex save - actorUpdate["data.attributes.reflex.bonus"] = array.reflex; - - // Set fort save - actorUpdate["data.attributes.fort.bonus"] = array.fort; - - // Set will save - actorUpdate["data.attributes.will.bonus"] = array.will; - - // Set ability modifiers - var attributes = ["cha", "con", "dex", "int", "str", "wis"]; - - // We randomize which abilities are buffed - Utils.shuffleArray(attributes); - - actorUpdate["data.abilities." + attributes[0] + ".mod"] = array.abilityMods[0]; - actorUpdate["data.abilities." + attributes[1] + ".mod"] = array.abilityMods[1]; - actorUpdate["data.abilities." + attributes[2] + ".mod"] = array.abilityMods[2]; - - // Set initiative modifier (be dex modifier) - actorUpdate["data.attributes.init.total"] = actorUpdate["data.abilities.dex.mod"] ?? 0; - - // Update actor - await actor.update(actorUpdate); - } - - static async setGrafts(actor, context) { - - let actorUpdate = {}; - let race = context.options.race; - await this.applyCreatureTypeGraft(actor,context, race.creatureTypeGraft); - - if(race.creatureSubtypeGraft) { - await this.applyCreatureSubtypeGraft(actor, context, race.creatureSubtypeGraft); - // Apply type in "An unarmed strike can be dealt with any limb or appendage. Unarmed strikes deal nonlethal damage, and the damage from an unarmed strike is considered weapon damage for the purposes of effects that give you a bonus to weapon damage rolls.
", - "unidentified": "" - }, - "source": "CRB pg. 190", - "type": "", - "quantity": null, - "bulk": "-", - "price": 0, - "level": 0, - "attuned": false, - "equipped": true, - "equippable": false, - "identified": true, - "attributes": { - "sturdy": false, - "customBuilt": false, - "size": "medium", - "dex": { - "mod": "" - }, - "hp": { - "value": 6, - "max": "" - }, - "hardness": { - "value": "" - }, - "ac": { - "value": "" - } - }, - "activation": { - "type": "action", - "cost": 1, - "condition": "" - }, - "duration": { - "value": "", - "units": "" - }, - "target": { - "value": "", - "type": "" - }, - "area": { - "value": null, - "units": null, - "shape": "", - "effect": "" - }, - "range": { - "value": null, - "units": "touch", - "additional": "", - "per": "" - }, - "uses": { - "value": 0, - "max": 0, - "per": "" - }, - "isActive": null, - "ability": "", - "actionType": "mwak", - "attackBonus": 0, - "chatFlavor": "", - "critical": { - "parts": [], - "effect": "" - }, - "damage": { - "parts": [ - [ - "1d3", - "bludgeoning" - ] - ] - }, - "formula": "", - "save": { - "type": "", - "dc": "", - "descriptor": "negate" - }, - "descriptors": [], - "capacity": { - "value": 0, - "max": 0 - }, - "usage": { - "value": 0, - "per": "" - }, - "modifiers": [], - "container": { - "contents": [], - "storage": [], - "isOpen": true - }, - "weaponType": "basicM", - "weaponCategory": "", - "special": "", - "properties": { - "one": false, - "two": false, - "amm": false, - "aeon": false, - "analog": false, - "antibiological": false, - "archaic": true, - "aurora": false, - "automatic": false, - "blast": false, - "block": false, - "boost": false, - "breach": false, - "breakdown": false, - "bright": false, - "cluster": false, - "conceal": false, - "deconstruct": false, - "deflect": false, - "disarm": false, - "double": false, - "drainCharge": false, - "echo": false, - "entangle": false, - "explode": false, - "extinguish": false, - "feint": false, - "fiery": false, - "firstArc": false, - "flexibleLine": false, - "force": false, - "freeHands": false, - "fueled": false, - "grapple": false, - "gravitation": false, - "guided": false, - "harrying": false, - "holyWater": false, - "hybrid": false, - "ignite": false, - "indirect": false, - "injection": false, - "integrated": false, - "line": false, - "living": false, - "lockdown": false, - "mind-affecting": false, - "mine": false, - "mire": false, - "modal": false, - "necrotic": false, - "nonlethal": true, - "operative": false, - "penetrating": false, - "polarize": false, - "polymorphic": false, - "powered": false, - "professional": false, - "punchGun": false, - "qreload": false, - "radioactive": false, - "reach": false, - "recall": false, - "regrowth": false, - "relic": false, - "reposition": false, - "shape": false, - "shatter": false, - "shells": false, - "shield": false, - "sniper": false, - "stun": false, - "subtle": false, - "sunder": false, - "swarm": false, - "tail": false, - "teleportive": false, - "thought": false, - "throttle": false, - "thrown": false, - "trip": false, - "unbalancing": false, - "underwater": false, - "unwieldy": false, - "variantBoost": false, - "wideLine": false - }, - "proficient": true, - "abilityMods": { - "parts": [] - } - }, - "flags": {}, - "effects": [] -} -const naturalWeaponsTemplate = { - "name": "Unarmed strike (natural weapons)", - "type": "weapon", - "data": { - "description": { - "chat": "", - "gmnotes": "", - "short": "", - "value": "A special unarmed strike that deals lethal damage, doesn’t count as archaic, and threatens squares. Gain a special version of the Weapon Specialization feat with this unarmed strike at 3rd level, allowing them to add 1–1/2 × their character level to their damage rolls for this unarmed strike (instead of just adding their character level, as usual).
", - "unidentified": "" - }, - "source": "CRB pg. 190", - "type": "", - "quantity": null, - "bulk": "-", - "price": 0, - "level": 0, - "attuned": false, - "equipped": true, - "equippable": false, - "identified": true, - "attributes": { - "sturdy": false, - "customBuilt": false, - "size": "medium", - "dex": { - "mod": "" - }, - "hp": { - "value": 6, - "max": "" - }, - "hardness": { - "value": "" - }, - "ac": { - "value": "" - } - }, - "activation": { - "type": "action", - "cost": 1, - "condition": "" - }, - "duration": { - "value": "", - "units": "" - }, - "target": { - "value": "", - "type": "" - }, - "area": { - "value": null, - "units": null, - "shape": "", - "effect": "" - }, - "range": { - "value": null, - "units": "touch", - "additional": "", - "per": "" - }, - "uses": { - "value": 0, - "max": 0, - "per": "" - }, - "isActive": null, - "ability": "", - "actionType": "mwak", - "attackBonus": 0, - "chatFlavor": "", - "critical": { - "parts": [], - "effect": "" - }, - "damage": { - "parts": [ - [ - "1d3", - "bludgeoning" - ] - ] - }, - "formula": "", - "save": { - "type": "", - "dc": "", - "descriptor": "negate" - }, - "descriptors": [], - "capacity": { - "value": 0, - "max": 0 - }, - "usage": { - "value": 0, - "per": "" - }, - "modifiers": [], - "container": { - "contents": [], - "storage": [], - "isOpen": true - }, - "weaponType": "basicM", - "weaponCategory": "", - "special": "", - "properties": { - "one": false, - "two": false, - "amm": false, - "aeon": false, - "analog": false, - "antibiological": false, - "archaic": false, - "aurora": false, - "automatic": false, - "blast": false, - "block": false, - "boost": false, - "breach": false, - "breakdown": false, - "bright": false, - "cluster": false, - "conceal": false, - "deconstruct": false, - "deflect": false, - "disarm": false, - "double": false, - "drainCharge": false, - "echo": false, - "entangle": false, - "explode": false, - "extinguish": false, - "feint": false, - "fiery": false, - "firstArc": false, - "flexibleLine": false, - "force": false, - "freeHands": false, - "fueled": false, - "grapple": false, - "gravitation": false, - "guided": false, - "harrying": false, - "holyWater": false, - "hybrid": false, - "ignite": false, - "indirect": false, - "injection": false, - "integrated": false, - "line": false, - "living": false, - "lockdown": false, - "mind-affecting": false, - "mine": false, - "mire": false, - "modal": false, - "necrotic": false, - "nonlethal": false, - "operative": false, - "penetrating": false, - "polarize": false, - "polymorphic": false, - "powered": false, - "professional": false, - "punchGun": false, - "qreload": false, - "radioactive": false, - "reach": false, - "recall": false, - "regrowth": false, - "relic": false, - "reposition": false, - "shape": false, - "shatter": false, - "shells": false, - "shield": false, - "sniper": false, - "stun": false, - "subtle": false, - "sunder": false, - "swarm": false, - "tail": false, - "teleportive": false, - "thought": false, - "throttle": false, - "thrown": false, - "trip": false, - "unbalancing": false, - "underwater": false, - "unwieldy": false, - "variantBoost": false, - "wideLine": false - }, - "proficient": true, - "abilityMods": { - "parts": [] - } - }, - "flags": {}, - "img": "icons/svg/mystery-man.svg", - "effects": [] -} \ No newline at end of file diff --git a/src/controllers/MonsterWizardPanel1Controller.ts b/src/controllers/MonsterWizardPanel1Controller.ts index ae2e974..cb24226 100644 --- a/src/controllers/MonsterWizardPanel1Controller.ts +++ b/src/controllers/MonsterWizardPanel1Controller.ts @@ -1,26 +1,28 @@ -import {CR, MonsterCreation} from "../data/MonsterCreation.js"; -import { Grafts } from "../data/Grafts.js"; +import { CR, MonsterCreation } from "../data/MonsterCreation.js" +import { Grafts } from "../data/Grafts.js" import NPCCreationContext from "../models/NPCCreationContext.js" -import MonsterWizardPanel2Controller from "./MonsterWizardPanel2Controller.js"; +import MonsterWizardPanel2Controller from "./MonsterWizardPanel2Controller.js" export default class MonsterWizardPanel1Controller extends FormApplication { + private context: NPCCreationContext - private context: NPCCreationContext; constructor(context: NPCCreationContext) { - super(); - this.context = context; + super() + this.context = context } static get defaultOptions() { - return mergeObject(super.defaultOptions, { + return mergeObject(super.defaultOptions, { id: "populator-panel", - template: "modules/foundryvtt-sfrpg-populator/templates/MonsterWizardPanel_1.html", + classes: ["sfrpg"], + template: + "modules/foundryvtt-sfrpg-populator/templates/MonsterWizardPanel_1.html", width: 300, height: 300, minimizable: true, resizable: true, title: "Create Monster (1/2)" - }); + }) } /** @@ -30,7 +32,9 @@ export default class MonsterWizardPanel1Controller extends FormApplication { */ public activateListeners(html: JQueryFortunately, the widespread use of the credstick circumvents
issues related to spending and storing currency. Flat and roughly
the size of a @Compendium[sfrpg.races.AMBcyDZDtJ1OOzh3]{Human} finger, ranging from cheap and disposable to
elaborate works of art, credsticks are a convenient way to carry
and spend money.
When wearing a properly fitted consumer backpack, you treat your Strength score as 1 higher for the purpose of determining your carrying capacity.
', + unidentified: "" + }, + source: "Core Rulebook, pg 230", + type: "", + quantity: 1, + bulk: "1", + price: 3, + level: 1, + attuned: false, + equipped: false, + equippable: false, + identified: true, + attributes: { + sturdy: false, + customBuilt: false, + size: "medium", + dex: { + mod: "" }, - "source": "CRB pg. 166", - "type": "", - "quantity": 1, - "bulk": "L", - "price": 25, - "level": 1, - "attuned": false, - "equipped": false, - "equippable": false, - "identified": true, - "attributes": { - "sturdy": false, - "customBuilt": false, - "size": "medium", - "dex": { - "mod": "" - }, - "hp": { - "value": 6, - "max": "" - }, - "hardness": { - "value": "" - }, - "ac": { - "value": "" + hp: { + value: 6, + max: "" + }, + hardness: { + value: "" + }, + ac: { + value: "" + } + }, + modifiers: [ + { + name: "Backpack, Consumer", + modifier: 1, + type: "enhancement", + effectType: "bulk", + valueAffected: "", + enabled: true, + source: "Core Rulebook, pg 230", + notes: "", + modifierType: "constant", + condition: "", + subtab: "misc", + _id: "395f0b72-1b0a-4845-ac86-f5dc5ce847f8" + } + ], + container: { + contents: [], + storage: [ + { + type: "bulk", + subtype: "", + amount: 2, + acceptsType: [ + "weapon", + "equipment", + "goods", + "consumable", + "container", + "technological", + "fusion", + "upgrade", + "augmentation", + "magic" + ], + affectsEncumbrance: true, + weightProperty: "bulk" } + ], + isOpen: true + }, + equippedBulkMultiplier: 0, + acceptedItemTypes: { + weapon: true, + equipment: true, + goods: true, + consumable: true, + container: true, + technological: true, + fusion: true, + upgrade: true, + augmentation: true + }, + damage: { + parts: [] + }, + critical: { + parts: [] + }, + abilityMods: { + parts: [] + } + }, + flags: {}, + img: "systems/sfrpg/icons/equipment/goods/backpack-consumer.jpg", + effects: [], + storage: { + type: "bulk", + amount: 2, + affectsEncumbrance: true + }, + weapon: true, + equipment: true, + consumable: true, + goods: true, + container: true, + hybrid: false, + magic: true, + technological: true, + fusion: true, + upgrade: true, + spell: false, + augmentation: true, + shield: false, + weaponAccessory: false, + vehicleAttack: false, + vehicleSystem: false +} +export const canteenTemplate = { + name: "Canteen", + type: "goods", + data: { + description: { + chat: "", + gmnotes: "", + short: "", + value: + 'This hollow plastic or metal container can hold up to a half gallon of liquid.
', + unidentified: "" + }, + source: "Armory", + type: "", + quantity: 1, + bulk: "L", + price: 1, + level: 1, + attuned: false, + equipped: false, + equippable: false, + identified: true, + attributes: { + sturdy: false, + customBuilt: false, + size: "medium", + dex: { + mod: "" }, - "modifiers": [], - "damage": { - "parts": [] + hp: { + value: 6, + max: "" }, - "critical": { - "parts": [] + hardness: { + value: "" }, - "abilityMods": { - "parts": [] + ac: { + value: "" } }, - "flags": {}, - "img": "systems/sfrpg/icons/equipment/goods/credstick.jpg", - "effects": [] + modifiers: [], + damage: { + parts: [] + }, + critical: { + parts: [] + }, + abilityMods: { + parts: [] + } }, - upbTemplate: { - "name": "UPB (25)", - "type": "goods", - "data": { - "description": { - "chat": "", - "gmnotes": "", - "short": "", - "value": "A universal polymer base, or UPB, is the basis for most technology in the Pact Worlds, the Veskarium, and many other systems. Each UPB is a tiny multifunction component, not much larger than a grain of rice, capable of being configured to act as a brace, capacitor, circuit, diode, fastener, insulator, lens, modulator, pipe, resistor, and dozens of other constituent parts. UPBs can even be spun out into fabric, broken down into component chemicals, reconstituted into new chemicals, or supplemented with base materials (such as dirt or sand) to form massive braces or walls. The right combination of hundreds or even thousands of UPBs can create everything from a comm unit to a laser weapon to powered armor. In their raw form, UPBs have a bulk of 1 per 1,000 UPBs, though when aligned and configured they can easily take up less bulk, and when configured for a specific purpose that calls for a minimum size and bracing (possibly combining them with inert materials), they can have a higher bulk.
UPBs are so ubiquitous that they are usable as currency in many major settlements and trade hubs. While credsticks are a more convenient and secure way to carry value, UPBs have the advantage of direct utility and untraceability. They are a popular way to pay smugglers and criminals, but they are also useful for trade missions to systems with UPB technology that don’t use credits as currency. The value of the Pact Worlds’ credit is based on the economic utility of a single UPB.
Fortunately, the widespread use of the credstick circumvents
issues related to spending and storing currency. Flat and roughly
the size of a @Compendium[sfrpg.races.AMBcyDZDtJ1OOzh3]{Human} finger, ranging from cheap and disposable to
elaborate works of art, credsticks are a convenient way to carry
and spend money.
A lighter is a small canister containing a pressurized flammable liquid gas. When the lighter is activated, an electric arc ignites the gas, creating a tiny flame. You can light a small flame (such as a candle) as a swift action. Lighting a full fire is at least a full action or more, depending on the size and fuel of the fire.
", - "unidentified": "" + flags: {}, + img: "systems/sfrpg/icons/equipment/goods/credstick.jpg", + effects: [] +} as IGoods +export const upbTemplate = { + name: "UPB (25)", + type: "goods", + data: { + description: { + chat: "", + gmnotes: "", + short: "", + value: + "A universal polymer base, or UPB, is the basis for most technology in the Pact Worlds, the Veskarium, and many other systems. Each UPB is a tiny multifunction component, not much larger than a grain of rice, capable of being configured to act as a brace, capacitor, circuit, diode, fastener, insulator, lens, modulator, pipe, resistor, and dozens of other constituent parts. UPBs can even be spun out into fabric, broken down into component chemicals, reconstituted into new chemicals, or supplemented with base materials (such as dirt or sand) to form massive braces or walls. The right combination of hundreds or even thousands of UPBs can create everything from a comm unit to a laser weapon to powered armor. In their raw form, UPBs have a bulk of 1 per 1,000 UPBs, though when aligned and configured they can easily take up less bulk, and when configured for a specific purpose that calls for a minimum size and bracing (possibly combining them with inert materials), they can have a higher bulk.
UPBs are so ubiquitous that they are usable as currency in many major settlements and trade hubs. While credsticks are a more convenient and secure way to carry value, UPBs have the advantage of direct utility and untraceability. They are a popular way to pay smugglers and criminals, but they are also useful for trade missions to systems with UPB technology that don’t use credits as currency. The value of the Pact Worlds’ credit is based on the economic utility of a single UPB.
A lighter is a small canister containing a pressurized flammable liquid gas. When the lighter is activated, an electric arc ignites the gas, creating a tiny flame. You can light a small flame (such as a candle) as a swift action. Lighting a full fire is at least a full action or more, depending on the size and fuel of the fire.
', + unidentified: "" + }, + source: "Armory", + type: "", + quantity: 1, + bulk: "L", + price: 1, + level: 1, + attuned: false, + equipped: false, + equippable: false, + identified: true, + attributes: { + sturdy: false, + customBuilt: false, + size: "medium", + dex: { + mod: "" }, - "modifiers": [], - "damage": { - "parts": [] + hp: { + value: 6, + max: "" }, - "critical": { - "parts": [] + hardness: { + value: "" }, - "abilityMods": { - "parts": [] + ac: { + value: "" } }, - "flags": {}, - "img": "systems/sfrpg/icons/equipment/goods/lighter.jpg", - "effects": [] + modifiers: [], + damage: { + parts: [] + }, + critical: { + parts: [] + }, + abilityMods: { + parts: [] + } }, - purfumeTemplate: { - "name": "Perfume, Standard", - "type": "goods", - "data": { - "description": { - "chat": "", - "gmnotes": "", - "short": "", - "value": "There is an immeasurable variety of perfumes and colognes in the galaxy, most tailored to the aesthetics of specific races with olfactory senses. A single dose of perfume lasts 1 hour, and a typical bottle of perfume contains 10 doses.
\n\n
Standard aromas have a pleasant smell and can convey an air of hygiene, status, and wealth.
", - "unidentified": "" + flags: {}, + img: "systems/sfrpg/icons/equipment/goods/lighter.jpg", + effects: [] +} as IGoods +export const purfumeTemplate = { + name: "Perfume, Standard", + type: "goods", + data: { + description: { + chat: "", + gmnotes: "", + short: "", + value: + "There is an immeasurable variety of perfumes and colognes in the galaxy, most tailored to the aesthetics of specific races with olfactory senses. A single dose of perfume lasts 1 hour, and a typical bottle of perfume contains 10 doses.
\n\n
Standard aromas have a pleasant smell and can convey an air of hygiene, status, and wealth.
", + unidentified: "" + }, + source: "AR pg. 131", + type: "", + quantity: 1, + bulk: "L", + price: 50, + level: 1, + attuned: false, + equipped: false, + equippable: false, + identified: true, + attributes: { + sturdy: false, + customBuilt: false, + size: "medium", + dex: { + mod: "" }, - "source": "AR pg. 131", - "type": "", - "quantity": 1, - "bulk": "L", - "price": 50, - "level": 1, - "attuned": false, - "equipped": false, - "equippable": false, - "identified": true, - "attributes": { - "sturdy": false, - "customBuilt": false, - "size": "medium", - "dex": { - "mod": "" - }, - "hp": { - "value": 6, - "max": "" - }, - "hardness": { - "value": "" - }, - "ac": { - "value": "" - } + hp: { + value: 6, + max: "" + }, + hardness: { + value: "" + }, + ac: { + value: "" + } + }, + modifiers: [], + damage: { + parts: [] + }, + critical: { + parts: [] + }, + abilityMods: { + parts: [] + } + }, + flags: {}, + img: + "systems/sfrpg/icons/equipment/magic%20items/serum-of-appearance-change.jpg", + effects: [] +} as IGoods +export const intoxicantMinorTemplate = { + name: "Intoxicant, Minor", + type: "goods", + data: { + description: { + chat: "", + gmnotes: "", + short: "", + value: + 'The price and bulk listed here is of a single serving of an intoxicating beverage or inhaled substance, which in the Pact Worlds is most often alcohol or tobacco. An intoxicant’s potency can be minor or superior. A minor intoxicant might be beer or wine, which takes a few servings to cause any physiological effects. A superior intoxicant is usually a strong spirit, such as whiskey, that can start producing effects after a single serving. Unlike @Compendium[sfrpg.rules.aKqRtg165rAly1Cc]{Drugs}, intoxicants are usually not addictive, although a GM might rule that a PC who partakes of too much of an intoxicant on a regular basis might begin to suffer the effects of an addictive @Compendium[sfrpg.rules.aKqRtg165rAly1Cc]{Drug} (as described in @Compendium[sfrpg.rules.JaRMioj4isNp7r1P]{Afflictions} on page 417).
', + unidentified: "" + }, + source: "Core Rulebook", + type: "", + quantity: 1, + bulk: "L", + price: 1, + level: 1, + attuned: false, + equipped: false, + equippable: false, + identified: true, + attributes: { + sturdy: false, + customBuilt: false, + size: "medium", + dex: { + mod: "" }, - "modifiers": [], - "damage": { - "parts": [] + hp: { + value: 6, + max: "" }, - "critical": { - "parts": [] + hardness: { + value: "" }, - "abilityMods": { - "parts": [] + ac: { + value: "" } }, - "flags": {}, - "img": "systems/sfrpg/icons/equipment/magic%20items/serum-of-appearance-change.jpg", - "effects": [] + modifiers: [], + damage: { + parts: [] + }, + critical: { + parts: [] + }, + abilityMods: { + parts: [] + } }, - intoxicantMinorTemplate: { - "name": "Intoxicant, Minor", - "type": "goods", - "data": { - "description": { - "chat": "", - "gmnotes": "", - "short": "", - "value": "The price and bulk listed here is of a single serving of an intoxicating beverage or inhaled substance, which in the Pact Worlds is most often alcohol or tobacco. An intoxicant’s potency can be minor or superior. A minor intoxicant might be beer or wine, which takes a few servings to cause any physiological effects. A superior intoxicant is usually a strong spirit, such as whiskey, that can start producing effects after a single serving. Unlike @Compendium[sfrpg.rules.aKqRtg165rAly1Cc]{Drugs}, intoxicants are usually not addictive, although a GM might rule that a PC who partakes of too much of an intoxicant on a regular basis might begin to suffer the effects of an addictive @Compendium[sfrpg.rules.aKqRtg165rAly1Cc]{Drug} (as described in @Compendium[sfrpg.rules.JaRMioj4isNp7r1P]{Afflictions} on page 417).
", - "unidentified": "" + flags: {}, + img: "systems/sfrpg/icons/equipment/goods/intoxicant.jpg", + effects: [] +} as IGoods +export const religiousSymbolTemplate = { + name: "Religious Symbol", + type: "goods", + data: { + description: { + chat: "", + gmnotes: "", + short: "", + value: + 'A religious symbol is a physical representation of a sacred image associated with a specific deity or religion, often worn as an amulet or badge. Each deity and religion has its own unique religious symbol. Religious symbols are usually mass-produced from cheap materials, such as plastic or thin metal, but they can be crafted out of other materials as well, with prices dependent on the material used. This item can also be used to represent badges or symbols of nonreligious organizations and groups.
', + unidentified: "" + }, + source: "Armory", + type: "", + quantity: 1, + bulk: "L", + price: 2, + level: 1, + attuned: false, + equipped: false, + equippable: false, + identified: true, + attributes: { + sturdy: false, + customBuilt: false, + size: "medium", + dex: { + mod: "" }, - "source": "Core Rulebook", - "type": "", - "quantity": 1, - "bulk": "L", - "price": 1, - "level": 1, - "attuned": false, - "equipped": false, - "equippable": false, - "identified": true, - "attributes": { - "sturdy": false, - "customBuilt": false, - "size": "medium", - "dex": { - "mod": "" - }, - "hp": { - "value": 6, - "max": "" - }, - "hardness": { - "value": "" - }, - "ac": { - "value": "" - } + hp: { + value: 6, + max: "" }, - "modifiers": [], - "damage": { - "parts": [] + hardness: { + value: "" }, - "critical": { - "parts": [] + ac: { + value: "" + } + }, + modifiers: [], + damage: { + parts: [] + } + }, + flags: {}, + img: "systems/sfrpg/icons/equipment/goods/religious-symbol.jpg", + effects: [] +} as IGoods +export const ropeTemplate = { + name: "Rope", + type: "goods", + data: { + description: { + chat: "", + gmnotes: "", + short: "", + value: + 'Synthetic rope is exceptionally durable, elastic, and specifically designed to be easy to grip and climb. Although it lacks the strength and durability of cable lines, synthetic rope is significantly cheaper and lighter than those alternatives.
', + unidentified: "" + }, + source: "AR pg. 131", + type: "", + quantity: 1, + bulk: "L", + price: 1, + level: 1, + attuned: false, + equipped: false, + equippable: false, + identified: true, + attributes: { + sturdy: false, + customBuilt: false, + size: "medium", + dex: { + mod: "" + }, + hp: { + value: 6, + max: "" }, - "abilityMods": { - "parts": [] + hardness: { + value: "" + }, + ac: { + value: "" } }, - "flags": {}, - "img": "systems/sfrpg/icons/equipment/goods/intoxicant.jpg", - "effects": [] - } -} - + modifiers: [], + damage: { + parts: [] + } + }, + flags: {}, + img: "systems/sfrpg/icons/equipment/goods/rope.jpg", + effects: [] +} as IGoods diff --git a/src/data/MonsterCreation.ts b/src/data/MonsterCreation.ts index d496dad..35d3af1 100644 --- a/src/data/MonsterCreation.ts +++ b/src/data/MonsterCreation.ts @@ -1,38 +1,407 @@ -export const CR = ["1/3", "1/2", "1", "2"] +import UniversalCreatureRule from "../models/UniversalCreatureRule.js" +import { UniversalCreatureRules } from "./universal creature rules/UniversalCreatureRules.js" +import AdjustmentSpecialAbility from "../models/AdjustmentSpecialAbility.js" -export const MonsterCreation = { +/// List of creature combat ratings +export const CR = [ + "1/3", + "1/2", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10" +] + +// List of creature save types +export enum Save { + fortitude = "fort", + reflex = "reflex", + willpower = "will" +} + +/// List of creature gender identities +export enum Gender { + male = "male", + female = "female", + nonBinary = "non-binary" +} + +/// List of creature sizes +export enum Size { + small, + medium, + large +} + +/// List of Monster Reference Symbols +export enum MonsterReferenceSymbol { + combatant, + expert, + spellcaster +} +export enum MonsterSkillType { + good, + master +} + +/// Collection of monster creation statistics and special abilities used to generate new creatures +export const MonsterCreation = { arrays: { // Expert Arrays expert: { - name: "expert", + name: MonsterReferenceSymbol.expert, main: { - "1/3": {CR: CR[0], EAC: 10, KAC: 11, fort: 0, reflex: 0, will: 2, HP: 6, abilityMods: [3,1,0], masterSkill: {count: 3, mod: 7}, goodSkill: {count: 2, mod: 3} }, - "1/2": {CR: CR[1], EAC: 10, KAC: 11, fort: 0, reflex: 0, will: 3, HP: 12 , abilityMods: [3,2,1], masterSkill: {count: 3, mod: 9}, goodSkill: {count: 2, mod: 4} }, - "1": {CR: CR[2], EAC: 11, KAC: 12, fort: 1, reflex: 1, will: 4, HP: 17 , abilityMods: [4,2,1], masterSkill: {count: 3, mod: 10}, goodSkill: {count: 2, mod: 5} }, - "2": {CR: CR[3], EAC: 13, KAC: 14, fort: 1, reflex: 1, will: 5, HP: 23 , abilityMods: [4,2,1], masterSkill: {count: 3, mod: 12}, goodSkill: {count: 2, mod: 7} } + "1/3": { + CR: CR[0], + EAC: 10, + KAC: 11, + fort: 0, + reflex: 0, + will: 2, + HP: 6, + abilityMods: [3, 1, 0], + specialAbilities: 1, + masterSkill: { count: 3, mod: 7 }, + goodSkill: { count: 2, mod: 3 } + } as IMainArrayRow, + "1/2": { + CR: CR[1], + EAC: 10, + KAC: 11, + fort: 0, + reflex: 0, + will: 3, + HP: 12, + abilityMods: [3, 2, 1], + specialAbilities: 1, + masterSkill: { count: 3, mod: 9 }, + goodSkill: { count: 2, mod: 4 } + } as IMainArrayRow, + "1": { + CR: CR[2], + EAC: 11, + KAC: 12, + fort: 1, + reflex: 1, + will: 4, + HP: 17, + abilityMods: [4, 2, 1], + specialAbilities: 1, + masterSkill: { count: 3, mod: 10 }, + goodSkill: { count: 2, mod: 5 } + } as IMainArrayRow, + "2": { + CR: CR[3], + EAC: 13, + KAC: 14, + fort: 1, + reflex: 1, + will: 5, + HP: 23, + abilityMods: [4, 2, 1], + specialAbilities: 1, + masterSkill: { count: 3, mod: 12 }, + goodSkill: { count: 2, mod: 7 } + } as IMainArrayRow, + "3": { + CR: CR[4], + EAC: 14, + KAC: 15, + fort: 2, + reflex: 2, + will: 6, + HP: 35, + abilityMods: [4, 2, 1], + specialAbilities: 2, + masterSkill: { count: 3, mod: 13 }, + goodSkill: { count: 2, mod: 8 } + } as IMainArrayRow, + "4": { + CR: CR[5], + EAC: 16, + KAC: 17, + fort: 3, + reflex: 3, + will: 7, + HP: 45, + abilityMods: [5, 3, 1], + specialAbilities: 2, + masterSkill: { count: 3, mod: 15 }, + goodSkill: { count: 2, mod: 10 } + } as IMainArrayRow, + "5": { + CR: CR[6], + EAC: 17, + KAC: 18, + fort: 4, + reflex: 4, + will: 8, + HP: 65, + abilityMods: [5, 3, 2], + specialAbilities: 2, + masterSkill: { count: 3, mod: 16 }, + goodSkill: { count: 2, mod: 11 } + } as IMainArrayRow }, attack: { - "1/3": {high: 2, low: 0, energy: "1d4", kinetic: "1d4", standard: "1d4 + @abilities.str.mod" }, - "1/2": {high: 4, low: 2, energy: "1d4", kinetic: "1d4", standard: "1d4 + @abilities.str.mod" }, - "1": {high: 6, low: 4, energy: "1d4+1", kinetic: "1d4+1", standard: "1d4 + 1 + @abilities.str.mod" }, - "2": {high: 8, low: 6, energy: "1d4+2", kinetic: "1d4+2", standard: "1d4 + 2 + @abilities.str.mod" } + "1/3": { + high: 2, + low: 0, + energy: "1d4", + kinetic: "1d4", + standard: "1d4 + @abilities.str.mod" + } as IMainArrayRow, + "1/2": { + high: 4, + low: 2, + energy: "1d4", + kinetic: "1d4", + standard: "1d4 + @abilities.str.mod" + } as IMainArrayRow, + "1": { + high: 6, + low: 4, + energy: "1d4+1", + kinetic: "1d4+1", + standard: "1d4 + 1 + @abilities.str.mod" + } as IMainArrayRow, + "2": { + high: 8, + low: 6, + energy: "1d4+2", + kinetic: "1d4+2", + standard: "1d4 + 2 + @abilities.str.mod" + } as IMainArrayRow, + "3": { + high: 9, + low: 7, + energy: "1d4+3", + kinetic: "1d4+3", + standard: "1d4 + 3 + @abilities.str.mod" + } as IMainArrayRow, + "4": { + high: 10, + low: 8, + energy: "1d4+4", + kinetic: "1d4+4", + standard: "1d4 + 4 + @abilities.str.mod" + } as IMainArrayRow, + "5": { + high: 12, + low: 10, + energy: "1d4+5", + kinetic: "1d6+5", + standard: "1d4 + 5 + @abilities.str.mod" + } as IMainArrayRow, + "6": { + high: 14, + low: 12, + energy: "1d6+6", + kinetic: "1d8+6", + standard: "1d6 + 6 + @abilities.str.mod" + } as IMainArrayRow, + "7": { + high: 15, + low: 13, + energy: "1d8+7", + kinetic: "1d12+7", + standard: "1d8 + 7 + @abilities.str.mod" + } as IMainArrayRow } }, combatant: { - name: "combatant", + name: MonsterReferenceSymbol.combatant, main: { - "1/3": {CR: CR[0], EAC: 10, KAC: 12, fort: 1, reflex: 1, will: 0, HP: 6, abilityMods: [3,1,0], masterSkill: {count: 1, mod: 7}, goodSkill: {count: 2, mod: 3} }, - "1/2": {CR: CR[1], EAC: 10, KAC: 12, fort: 2, reflex: 2, will: 0, HP: 13 , abilityMods: [3,2,1], masterSkill: {count: 1, mod: 9}, goodSkill: {count: 2, mod: 4} }, - "1": {CR: CR[2], EAC: 11, KAC: 13, fort: 3, reflex: 3, will: 1, HP: 20 , abilityMods: [4,2,1], masterSkill: {count: 1, mod: 10}, goodSkill: {count: 2, mod: 5} }, - "2": {CR: CR[3], EAC: 13, KAC: 15, fort: 4, reflex: 4, will: 1, HP: 25 , abilityMods: [4,2,1], masterSkill: {count: 1, mod: 12}, goodSkill: {count: 2, mod: 7} } + "1/3": { + CR: CR[0], + EAC: 10, + KAC: 12, + fort: 1, + reflex: 1, + will: 0, + HP: 6, + abilityMods: [3, 1, 0], + specialAbilities: 1, + masterSkill: { count: 1, mod: 7 }, + goodSkill: { count: 2, mod: 3 } + } as IMainArrayRow, + "1/2": { + CR: CR[1], + EAC: 10, + KAC: 12, + fort: 2, + reflex: 2, + will: 0, + HP: 13, + abilityMods: [3, 2, 1], + specialAbilities: 1, + masterSkill: { count: 1, mod: 9 }, + goodSkill: { count: 2, mod: 4 } + } as IMainArrayRow, + "1": { + CR: CR[2], + EAC: 11, + KAC: 13, + fort: 3, + reflex: 3, + will: 1, + HP: 20, + abilityMods: [4, 2, 1], + specialAbilities: 1, + masterSkill: { count: 1, mod: 10 }, + goodSkill: { count: 2, mod: 5 } + } as IMainArrayRow, + "2": { + CR: CR[3], + EAC: 13, + KAC: 15, + fort: 4, + reflex: 4, + will: 1, + HP: 25, + abilityMods: [4, 2, 1], + specialAbilities: 2, + masterSkill: { count: 1, mod: 12 }, + goodSkill: { count: 2, mod: 7 } + } as IMainArrayRow, + "3": { + CR: CR[4], + EAC: 14, + KAC: 16, + fort: 5, + reflex: 5, + will: 2, + HP: 40, + abilityMods: [4, 2, 1], + specialAbilities: 2, + masterSkill: { count: 1, mod: 13 }, + goodSkill: { count: 2, mod: 8 } + } as IMainArrayRow, + "4": { + CR: CR[5], + EAC: 16, + KAC: 18, + fort: 6, + reflex: 6, + will: 3, + HP: 50, + abilityMods: [5, 3, 1], + specialAbilities: 2, + masterSkill: { count: 1, mod: 15 }, + goodSkill: { count: 2, mod: 10 } + } as IMainArrayRow, + "5": { + CR: CR[6], + EAC: 17, + KAC: 19, + fort: 7, + reflex: 7, + will: 4, + HP: 70, + abilityMods: [5, 3, 2], + specialAbilities: 2, + masterSkill: { count: 1, mod: 16 }, + goodSkill: { count: 2, mod: 11 } + } as IMainArrayRow }, attack: { - "1/3": {high: 4, low: 1, energy: "1d4", kinetic: "1d4", standard: "1d6 + @abilities.str.mod" }, - "1/2": {high: 6, low: 3, energy: "1d4", kinetic: "1d6", standard: "1d6 + @abilities.str.mod" }, - "1": {high: 8, low: 5, energy: "1d4+1", kinetic: "1d6+1", standard: "1d6 + 1 + @abilities.str.mod" }, - "2": {high: 10, low: 7, energy: "1d4+2", kinetic: "1d6+2", standard: "1d6 + 2 + @abilities.str.mod" } + "1/3": { + high: 4, + low: 1, + energy: "1d4", + kinetic: "1d4", + standard: "1d6 + @abilities.str.mod" + } as IMainArrayRow, + "1/2": { + high: 6, + low: 3, + energy: "1d4", + kinetic: "1d6", + standard: "1d6 + @abilities.str.mod" + } as IMainArrayRow, + "1": { + high: 8, + low: 5, + energy: "1d4+1", + kinetic: "1d6+1", + standard: "1d6 + 1 + @abilities.str.mod" + } as IMainArrayRow, + "2": { + high: 10, + low: 7, + energy: "1d4+2", + kinetic: "1d6+2", + standard: "1d6 + 2 + @abilities.str.mod" + } as IMainArrayRow, + "3": { + high: 11, + low: 8, + energy: "1d4+3", + kinetic: "1d6+3", + standard: "1d6 + 3 + @abilities.str.mod" + } as IMainArrayRow, + "4": { + high: 12, + low: 9, + energy: "1d4+4", + kinetic: "1d6+4", + standard: "1d6 + 4 + @abilities.str.mod" + } as IMainArrayRow, + "5": { + high: 14, + low: 11, + energy: "1d6+5", + kinetic: "1d8+5", + standard: "1d6 + 5 + @abilities.str.mod" + } as IMainArrayRow, + "6": { + high: 16, + low: 13, + energy: "1d10+6", + kinetic: "2d6+6", + standard: "1d8 + 6 + @abilities.str.mod" + } as IMainArrayRow, + "7": { + high: 17, + low: 14, + energy: "2d6+7", + kinetic: "2d8+7", + standard: "2d6 + 7 + @abilities.str.mod" + } as IMainArrayRow } } + }, + specialAbilities: { + universalCreatureRule: { + ferocity: UniversalCreatureRules.ferocity, + naturalWeapons: UniversalCreatureRules.naturalWeapons, + integratedWeapons: UniversalCreatureRules.integratedWeapons + }, + adjustment: { + brute: new AdjustmentSpecialAbility( + "brute", + "Use the low attack value for the NPC’s main attack, but determine the attack’s damage as if the NPC’s CR were 2 higher (adding the extra damage from weapon specialization). This special ability has a greater impact at higher CRs." + ), + extraHitPoints: new AdjustmentSpecialAbility( + "extra hit points", + "Increase the NPC’s HP by 20%." + ), + saveBoost: new AdjustmentSpecialAbility( + "save boost", + "Increase all saving throw bonuses by 1 or one saving throw bonus by 3." + ), + //TODO: Secondary Magic + skillful: new AdjustmentSpecialAbility( + "skillful", + "Increase all master and good skill bonuses by 1." + ) + } } -}; \ No newline at end of file +} diff --git a/src/data/Names.js b/src/data/Names.js index 74efd7a..f363e37 100644 --- a/src/data/Names.js +++ b/src/data/Names.js @@ -1,65 +1,537 @@ -export const Names = {}; +export const Names = {} // TODO: Currently best suited in JavaScript, too much boilerplate involved in expressing in TypeScript. Should re-evaluate in future when more experienced. // NOTE: Default is also used for human names + // Default -Names.default = { male: {}, female: {}, other: {} }; -Names.default.format = "{0} {1}"; -Names.default.other.first = ["Sam", "Riley"]; -Names.default.male.first = [ "Adrian", "Alex", "Alfred", "Bob", "Dale", "George", "John", "Jordan", "Jovan", "Tom", "Reginald", "Ryan" ].concat(Names.default.other.first); -Names.default.female.first = [ "Alice", "Cara", "Jenn", "Tess", "Rachel", "Rebecca", "Tina", "Trish" ].concat(Names.default.other.first); -Names.default.last = [ "Adamson", "Black", "Johnson", "Mason", "Thompson", "Slat", "Stone", "Richards", "Ronson", "Watson", "White" ]; +Names.default = { format: "{0} {1}", male: {}, female: {}, other: {} } +Names.default.other.first = ["Sam", "Riley"] +Names.default.male.first = [ + "Adrian", + "Alex", + "Alfred", + "Bob", + "Dale", + "George", + "John", + "Jordan", + "Jovan", + "Tom", + "Reginald", + "Ryan" +].concat(Names.default.other.first) +Names.default.female.first = [ + "Alice", + "Cara", + "Jenn", + "Tess", + "Rachel", + "Rebecca", + "Tina", + "Trish" +].concat(Names.default.other.first) +Names.default.last = [ + "Adamson", + "Black", + "Johnson", + "Mason", + "Thompson", + "Slat", + "Stone", + "Richards", + "Ronson", + "Watson", + "White" +] // Exotic -Names.exotic = { male: {}, female: {}, other: {} }; -Names.exotic.format = "{0}{1}"; -Names.exotic.other.first = [ "Abrog", "Amiell", "Egnils", "Eskas", "Folta", "Kusi", "Lessaith", "Nukteins", "Oltah", "Qharruits", "Qhihrer", "Sea", "Sugik", "Tasosh", "Throlphirs", "Vu"]; -Names.exotic.male.first = Names.exotic.other.first; -Names.exotic.female.first = Names.exotic.other.first; -Names.exotic.denominator = ["'a", "-a", " a", "a", "bo", "cha", "'o", "oyo", "s", "", "", "", "", "", "", "", ""]; // Denominators are appended onto name without a space -Names.exotic.last = [""]; // No last names +Names.exotic = { male: {}, female: {}, other: {} } +Names.exotic.format = "{0}{1}" +Names.exotic.other.first = [ + "Abrog", + "Amiell", + "Egnils", + "Eskas", + "Folta", + "Kusi", + "Lessaith", + "Nukteins", + "Oltah", + "Qharruits", + "Qhihrer", + "Sea", + "Sugik", + "Tasosh", + "Throlphirs", + "Vu" +] +Names.exotic.male.first = Names.exotic.other.first +Names.exotic.female.first = Names.exotic.other.first +Names.exotic.denominator = [ + "'a", + "-a", + " a", + "a", + "bo", + "cha", + "'o", + "oyo", + "s", + "", + "", + "", + "", + "", + "", + "", + "" +] // Denominators are appended onto name without a space +Names.exotic.last = [""] // No last names // Android -Names.android = { male: {}}; -Names.android.format = "{0}{1}"; -Names.android.male.first = [ "Article", "Avoph", "Burst", "Clarity", "Fluke", "Mercy", "Magic", "Mode", "Requiem", "Simple", "Wisdom", "Union" ]; -Names.android.denominator = ["-0", "-1", "-2", "-3","-4","-55","-7", "-12", "-64","-99", "", "", "", ""]; // Denominators are appended onto name without a space -Names.android.last = [""]; // No last names +Names.android = { male: {} } +Names.android.format = "{0}{1}" +Names.android.male.first = [ + "Article", + "Avoph", + "Burst", + "Clarity", + "Fluke", + "Mercy", + "Magic", + "Mode", + "Requiem", + "Simple", + "Wisdom", + "Union" +] +Names.android.denominator = [ + "-0", + "-1", + "-2", + "-3", + "-4", + "-55", + "-7", + "-12", + "-64", + "-99", + "", + "", + "", + "" +] // Denominators are appended onto name without a space +Names.android.last = [""] // No last names // Dwarf -Names.dwarf = { male: {}, female: {} }; -Names.dwarf.male.first = [ "Luldream", "Ginik", "Grolgulir", "Nodrac", "Turgrol", "Yarbud" ]; -Names.dwarf.female.first = [ "Lokhubela", "Hozzida", "Gotribera", "Sarsolda", "Yagraeda", "Yarohilda" ]; -Names.dwarf.last = [ "Barrelshoulder", "Bristleshield", "Bronzemaker", "Coalstone", "Ironcview", "Koboldbow", "Largebrow", "Orebreaker", "Wraithgranite" ]; -Names.drow = { male: {}, female: {} }; -Names.drow.male.first = [ "Arcavato", "Dantrag", "Dresmorlin", "Dro", "Drovic", "Duagloth", "Durdyn", "Firyin", "Kaelmourn", "Gogloth", "Nyloth", "Merrryn", "Mirrendier", "Naltel", "Pharnox", "Syrendross", "Rizraen", "Zov"]; -Names.drow.female.first = [ "Ahlysaaria", "Belmarniss", "Cylellinth", "Drada", "Dralia", "Drisinil", "Ilvaria", "Johysis", "Jysdra", "Jhaelnitra", "Loscivia", "Ghina", "Neerda" , "Tyvorhan", "Ulumbralya", "Volundeil" ]; -Names.drow.last = [ "Abaeir", "Abbylan", "Argith", "Baenre", "Beltaulur", "Blaerabban", "Blundyth", "Chaulssin", "Coborel", "Coloara", "Cormrael", "Daevion'lyr", "Dalael", "Dhalmass", "Dryaalis", "Dyrr", "Duskryn", "Mizzrarran", "Mizzrear", "T'orgh", "Vrinn", "Zaphresz", "Zauviir", "Zolond" ]; -Names.drow.denominator = [" of House Zeizerer", " of House Arabani", " of House Cyrocaust", " of House Xicton", " of House Blasfamus", "", "", "", "", "", "", "", "", "", "", ""]; // Denominators are appended onto name without a space +Names.dwarf = { male: {}, female: {} } +Names.dwarf.male.first = [ + "Luldream", + "Ginik", + "Grolgulir", + "Nodrac", + "Turgrol", + "Yarbud" +] +Names.dwarf.female.first = [ + "Lokhubela", + "Hozzida", + "Gotribera", + "Sarsolda", + "Yagraeda", + "Yarohilda" +] +Names.dwarf.last = [ + "Barrelshoulder", + "Bristleshield", + "Bronzemaker", + "Coalstone", + "Ironcview", + "Koboldbow", + "Largebrow", + "Orebreaker", + "Wraithgranite" +] +// Drow +Names.drow = { male: {}, female: {} } +Names.drow.male.first = [ + "Arcavato", + "Dantrag", + "Dresmorlin", + "Dro", + "Drovic", + "Duagloth", + "Durdyn", + "Firyin", + "Kaelmourn", + "Gogloth", + "Nyloth", + "Merrryn", + "Mirrendier", + "Naltel", + "Pharnox", + "Syrendross", + "Rizraen", + "Zov" +] +Names.drow.female.first = [ + "Ahlysaaria", + "Belmarniss", + "Cylellinth", + "Drada", + "Dralia", + "Drisinil", + "Ilvaria", + "Johysis", + "Jysdra", + "Jhaelnitra", + "Loscivia", + "Ghina", + "Neerda", + "Tyvorhan", + "Ulumbralya", + "Volundeil" +] +Names.drow.last = [ + "Abaeir", + "Abbylan", + "Argith", + "Baenre", + "Beltaulur", + "Blaerabban", + "Blundyth", + "Chaulssin", + "Coborel", + "Coloara", + "Cormrael", + "Daevion'lyr", + "Dalael", + "Dhalmass", + "Dryaalis", + "Dyrr", + "Duskryn", + "Mizzrarran", + "Mizzrear", + "T'orgh", + "Vrinn", + "Zaphresz", + "Zauviir", + "Zolond" +] +Names.drow.denominator = [ + " of House Zeizerer", + " of House Arabani", + " of House Cyrocaust", + " of House Xicton", + " of House Blasfamus", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" +] // Denominators are appended onto name without a space +// Elf +Names.elf = { male: {}, female: {} } +Names.elf.male.first = [ + "Cul", + "Elvoss", + "Fin", + "Keis", + "Krel", + "Hom", + "Icvin", + "Mas", + "Mass", + "Nem", + "Nothi", + "Sass", + "Tasil", + "Utham", + "Vir", + "Zeis", + "Zemuglogom" +] +Names.elf.female.first = [ + "Arri", + "Acae", + "Alle", + "Ila", + "Phali", + "Phaves", + "Saahhil", + "Sinnis", + "Sumanrin", + "Yarnis", + "Vuha", + "Ulma" +] +Names.elf.last = [ + "Car", + "Das", + "Essu", + "Kor", + "Kos", + "Jier", + "Mis", + "Oreldlun", + "Sam", + "Sharliphos", + "Veeclor", + "Yurayu", + "Vam", + "Vuna" +] +// Half-elf (uses default names) +// Half-orc +Names.halfOrc = { male: {}, female: {} } +Names.halfOrc.male.first = [ + "Bazzosk", + "Bros", + "Buk", + "Hezrulm", + "Ogdig", + "Purg" +] +Names.halfOrc.female.first = [ + "Rabla", + "Habre", + "Hedli", + "Ohralru", + "Rzela", + "Vabla" +] +Names.halfOrc.last = [ + "Bak", + "Ber", + "Dazro", + "Dom", + "Ekaxle", + "Jirvi", + "Jom", + "Juxlanrev", + "Revomutsky", + "Rozkum", + "Tondrerem", + "Som", + "Soshky", + "Wiz", + "Vux" +] // Halfling -Names.halfling = { male: {}, female: {} }; -Names.halfling.male.first = ["Balderic", "Drogo", "Filbo", "Samwise", "Sorbo"].concat(Names.default.male.first); //Default first names are appropriate for halflings as well -Names.halfling.female.first = ["Berenga", "Hilda", "Lalia", "Sherry", "Pamphila"].concat(Names.default.female.first); //Default first names are appropriate for halflings as well -Names.halfling.last = [ "Biggums", "Boulderhill", "Gardner", "Goodchild", "Langham", "Oakbottom", "Smallburrow", "Thornburrow", "Underhill", "Undertree"]; +Names.halfling = { male: {}, female: {} } +Names.halfling.male.first = [ + "Balderic", + "Drogo", + "Filbo", + "Samwise", + "Sorbo" +].concat(Names.default.male.first) //Default first names are appropriate for halflings as well +Names.halfling.female.first = [ + "Berenga", + "Hilda", + "Lalia", + "Sherry", + "Pamphila" +].concat(Names.default.female.first) //Default first names are appropriate for halflings as well +Names.halfling.last = [ + "Biggums", + "Boulderhill", + "Gardner", + "Goodchild", + "Langham", + "Oakbottom", + "Smallburrow", + "Thornburrow", + "Underhill", + "Undertree" +] +// Hobgoblin +Names.hobgoblin = { male: {} } +Names.hobgoblin.male.first = [ + "Dithik", + "Drarud", + "Ettod", + "Ketreng", + "Ditrer", + "Kerdun", + "Nogtod", + "Relbim", + "Radret", + "Sakhang", + "Talbin" +] +Names.hobgoblin.last = [""] // No last names // Gnoll -Names.gnoll = { male: {}, female: {}, other: {} }; -Names.gnoll.other.first = ["Ot", "Sru", "Gnet"]; -Names.gnoll.male.first = ["Gryzat", "Gnekerk", "Triak", "Uk"].concat(Names.gnoll.other.first); -Names.gnoll.female.first = ["Byz", "Meih", "Nyhn", "Thiar"].concat(Names.gnoll.other.first); -Names.gnoll.last = [ "" ]; // No last names +Names.gnoll = { male: {}, female: {}, other: {} } +Names.gnoll.other.first = ["Ot", "Sru", "Gnet"] +Names.gnoll.male.first = ["Gryzat", "Gnekerk", "Triak", "Uk"].concat( + Names.gnoll.other.first +) +Names.gnoll.female.first = ["Byz", "Meih", "Nyhn", "Thiar"].concat( + Names.gnoll.other.first +) +Names.gnoll.last = [""] // No last names // Gnome -Names.gnome = { male: {}, female: {}, other: {} }; -Names.gnome.other.first = ["Glakpap", "Gnefipnoc", "Hednibyl", "Mansbikuc", "Mawugbert", "Zulmen"]; -Names.gnome.male.first = ["Blakweda", "Clilbefut", "Shaimbess", "Shelben", "Wanudlym"].concat(Names.gnome.other.first); -Names.gnome.female.first = ["Boovikort", "Gobkirt", "Slunsmat", "Wupnic", "Zemzap"].concat(Names.gnome.other.first); -Names.gnome.last = [ "" ]; // No last names +Names.gnome = { male: {}, female: {}, other: {} } +Names.gnome.other.first = [ + "Glakpap", + "Gnefipnoc", + "Hednibyl", + "Mansbikuc", + "Mawugbert", + "Zulmen" +] +Names.gnome.male.first = [ + "Blakweda", + "Clilbefut", + "Shaimbess", + "Shelben", + "Wanudlym" +].concat(Names.gnome.other.first) +Names.gnome.female.first = [ + "Boovikort", + "Gobkirt", + "Slunsmat", + "Wupnic", + "Zemzap" +].concat(Names.gnome.other.first) +Names.gnome.last = [""] // No last names // Kasatha -Names.kasatha = { male: {} }; -Names.kasatha.male.first = [ "Cas", "De Holetif", "Gotaldus", "Jatsol", "Jiltof", "Maecran", "Mahas", "Nilaltrom", "Tursal", "Tyemsil", "Zuna" ]; // All Kasatha names are non-gendered -Names.kasatha.last = [ "" ]; // No last names +Names.kasatha = { male: {} } +Names.kasatha.male.first = [ + "Cas", + "De Holetif", + "Gotaldus", + "Jatsol", + "Jiltof", + "Maecran", + "Mahas", + "Nilaltrom", + "Tursal", + "Tyemsil", + "Zuna" +] // All Kasatha names are non-gendered +Names.kasatha.last = [""] // No last names // Lashunta (uses default names) +Names.lashunta = { male: {} } +Names.lashunta.male.first = [ + "All", + "Dasel", + "Doles", + "Eieny", + "Iss", + "Ma", + "Mekafi", + "Niamas", + "Novo", + "Os", + "Thirenes", + "Seva", + "Taeoss", + "Te", + "Thofudol", + "Tonell", + "Vila", + "Zhaloloss", + "Zhefuh", + "Zinell", + "Zhohi" +] // All Lashunta names are non-gendered +Names.lashunta.last = [""] // No last names // Naur (uses exotic names) -Names.nuar = Names.exotic; +Names.nuar = Names.exotic // Shirren (uses exotic names) -Names.shirren = Names.exotic; +Names.shirren = Names.exotic // Skittermander (uses exotic names) -Names.skittermander = Names.exotic; +Names.skittermander = Names.exotic // Vesk (uses exotic names) -Names.vesk = Names.exotic; -// Ysoki (uses default names) \ No newline at end of file +Names.vesk = Names.exotic +// Ysoki (uses default names) +// Creature type names +Names.animal = { male: {} } +Names.animal.format = "{0}{1}" +Names.animal.male.first = [ + "Astra", + "Barnn", + "Coyo", + "Cy", + "Flam", + "Hippo", + "Mega", + "Neo", + "Ovi", + "Omni" +] // Used for first half of animal name +Names.animal.last = ["iguano", "raptor", "aroo", "", ""] // Used for second half of animal name +Names.animal.denominator = [ + "don", + "saur", + "oda", + "opus", + "amimus", + "mander", + "", + "", + "", + "", + "", + "" +] // Used as an optional suffix in the animal name +// +Names.construct = { male: {} } +Names.construct.format = "{0}{1}" +Names.construct.male.first = ["Buzz", "Zap", "Shoot", "Swoosh"] +Names.construct.last = ["bot", "inator"] +Names.construct.denominator = [ + "", + " 0", + " 1", + " 2", + " 3", + " 4", + " 5", + " 6", + " 2000", + " 3000" +] +// +Names.ooze = { male: {} } +Names.ooze.format = "{0}" +Names.ooze.male.first = [ + "Bloop", + "Boop", + "Brupp", + "Brzz", + "Floop", + "Froop", + "Fzzz", + "Goop", + "Gzzz", + "Sloop", + "Szzz", + "Zoop", + "Zzt" +] +Names.ooze.last = [] // Only uses first names +// +Names.vermin = { male: {} } +Names.vermin.format = "{0}{1}" +Names.vermin.male.first = [ + "Archae", + "Anthi", + "Anobi", + "Bembi", + "Cleri", + "Chrysi", + "Evani", + "Ichneu", + "Lepido", + "Manto", + "Mega", + "Trogo", + "Xylo" +] // Used for first half of animal name +Names.vermin.last = ["bio", "dea", "mero", "somelidae", "tera"] // Used for second half of vermin name +Names.vermin.denominator = ["pede", " spider", " worm", "", "", ""] diff --git a/src/data/Probabilities.ts b/src/data/Probabilities.ts index 63c93e4..405e1fb 100644 --- a/src/data/Probabilities.ts +++ b/src/data/Probabilities.ts @@ -1,22 +1,23 @@ -export const Probabilities = { +import { Gender } from "./MonsterCreation.js" +export const Probabilities = { // This distribution is based on my assumption that 50% of characters are good, 40% are bad and 10% are evil. // TODO: Allow customization of these values - alignmentDistributions : { + alignmentDistributions: { default: [ // Good - {name: "LG", percentage: 0.17}, - {name: "NG", percentage: 0.17}, - {name: "CG", percentage: 0.16}, + { name: "LG", percentage: 0.17 }, + { name: "NG", percentage: 0.17 }, + { name: "CG", percentage: 0.16 }, // Neutral - {name: "LN", percentage: 0.14}, - {name: "N", percentage: 0.13}, - {name: "CN", percentage: 0.13}, + { name: "LN", percentage: 0.14 }, + { name: "N", percentage: 0.13 }, + { name: "CN", percentage: 0.13 }, // Evil - {name: "LE", percentage: 0.4}, - {name: "NE", percentage: 0.3}, - {name: "CE", percentage: 0.3} - ] + { name: "LE", percentage: 0.4 }, + { name: "NE", percentage: 0.3 }, + { name: "CE", percentage: 0.3 }, + ], }, // The default distribution of races in a neutral environment when generating a humanoid // NOTE: Currently based on Absalom Station settlement distribution @@ -24,30 +25,33 @@ export const Probabilities = { // TODO: Allow customization of these values raceDistributions: { default: [ - {name: "android", percentage: 0.09}, - {name: "dwarf", percentage: 0.04}, - {name: "drow", percentage: 0.02}, // This, Gnoll, and Skittermanders represents the 6% "other" for now - {name: "human", percentage: 0.46}, - {name: "kasatha", percentage: 0.04}, - {name: "gnoll", percentage: 0.02}, // This, Drow, and Skittermanders represents the 6% "other" for now - {name: "gnome", percentage: 0.02}, - {name: "halfling", percentage: 0.04}, - {name: "lashunta", percentage: 0.07}, - {name: "nuar", percentage: 0.01}, - {name: "shirren", percentage: 0.05}, - {name: "skittermander", percentage: 0.02}, // This, Gnoll, and Drow represent the 6% "other" for now - {name: "ysoki", percentage: 0.09}, - {name: "vesk", percentage: 0.03} - ] + { name: "android", percentage: 0.09 }, + { name: "dwarf", percentage: 0.04 }, + { name: "drow", percentage: 0.01 }, // Represents part of the 6% "other" for now + { name: "elf", percentage: 0.01 }, // Represents part of the 6% "other" for now + { name: "kasatha", percentage: 0.04 }, + { name: "gnoll", percentage: 0.01 }, // Represents part of the 6% "other" for now + { name: "gnome", percentage: 0.02 }, + { name: "halfElf", percentage: 0.01 }, // Represents part of the 6% "other" for now + { name: "halfOrc", percentage: 0.01 }, // Represents part of the 6% "other" for now + { name: "halfling", percentage: 0.04 }, + { name: "human", percentage: 0.46 }, + { name: "lashunta", percentage: 0.07 }, + { name: "nuar", percentage: 0.01 }, + { name: "shirren", percentage: 0.05 }, + { name: "skittermander", percentage: 0.01 }, // Represents part of the 6% "other" for now + { name: "ysoki", percentage: 0.09 }, + { name: "vesk", percentage: 0.03 }, + ], }, // NOTE: Extrapolated from 2019 Canadian census: https://www12.statcan.gc.ca/census-recensement/2021/ref/98-20-0002/982000022020002-eng.cfm // TODO: Allow customization if your world has a different distribution // NOTE: Should consider gender distributions by race, ie. Drow is a matriarchal society genderDistributions: { default: [ - {name: "male", percentage: 0.49}, - {name: "female", percentage: 0.50}, - {name: "non-binary", percentage: 0.01} - ] - } -}; + { name: Gender.male, percentage: 0.49 }, + { name: Gender.female, percentage: 0.5 }, + { name: Gender.nonBinary, percentage: 0.01 }, + ], + }, +} diff --git a/src/data/Races.ts b/src/data/Races.ts index f5079bc..0f7f986 100644 --- a/src/data/Races.ts +++ b/src/data/Races.ts @@ -1,89 +1,197 @@ -import { Grafts } from "./Grafts.js"; +import { Grafts } from "./Grafts.js" +import Race from "../models/Race.js" +import { Size } from "./MonsterCreation.js" export const Races = { // A list of humanoid type races which will randomly be generated (generally for non-combat NPCs) nonCombatantRaces: { - "android": {name:"android", size: "medium", creatureTypeGraft: Grafts.creatureType.humanoid, creatureSubtypeGraft: Grafts.creatureSubtype.android}, - "dwarf": {name:"dwarf", size: "medium", languages: ["dwarven"], creatureTypeGraft: Grafts.creatureType.humanoid , creatureSubtypeGraft: Grafts.creatureSubtype.dwarf}, - "drow": {name:"drow", size: "medium", languages: ["drow"], creatureTypeGraft: Grafts.creatureType.humanoid , creatureSubtypeGraft: Grafts.creatureSubtype.elf}, - "gnome": {name:"gnome", size: "small", languages: ["gnome"], creatureTypeGraft: Grafts.creatureType.humanoid, creatureSubtypeGraft: Grafts.creatureSubtype.gnome}, - "gnoll": {name:"gnoll", size: "medium", customLanguages: ["gnoll"], creatureTypeGraft: Grafts.creatureType.humanoid, creatureSubtypeGraft: Grafts.creatureSubtype.gnoll}, - "human": {name:"human", size: "medium", creatureTypeGraft: Grafts.creatureType.humanoid, creatureSubtypeGraft: Grafts.creatureSubtype.human}, - "halfling": {name:"halfling", size: "small", languages: ["halfling"], creatureTypeGraft: Grafts.creatureType.humanoid, creatureSubtypeGraft: Grafts.creatureSubtype.halfling}, - "kasatha": {name:"kasatha", size: "medium", arms: 4, languages: ["kasatha"], creatureTypeGraft: Grafts.creatureType.humanoid, creatureSubtypeGraft: Grafts.creatureSubtype.kasatha}, - "lashunta": {name:"lashunta", size: "medium", languages: ["castrovelian"], creatureTypeGraft: Grafts.creatureType.humanoid, creatureSubtypeGraft: Grafts.creatureSubtype.lashunta}, - "nuar": {name:"nuar", size: "medium", creatureTypeGraft: Grafts.creatureType.monstrousHumanoid}, - "skittermander": {name: "skittermander", size: "small", arms: 6, creatureTypeGraft: Grafts.creatureType.humanoid, creatureSubtypeGraft: Grafts.creatureSubtype.skittermander}, - "shirren": {name: "shirren", size: "medium", languages: ["shirren"], creatureTypeGraft: Grafts.creatureType.humanoid, creatureSubtypeGraft: Grafts.creatureSubtype.shirren}, - "vesk": {name:"vesk", size: "medium", languages: ["vesk"], creatureTypeGraft: Grafts.creatureType.humanoid, creatureSubtypeGraft: Grafts.creatureSubtype.vesk}, - "ysoki": {name:"ysoki", size: "small", languages: ["akiton", "ysoki"], creatureTypeGraft: Grafts.creatureType.humanoid, creatureSubtypeGraft: Grafts.creatureSubtype.ysoki} + android: new Race( + "android", + Size.medium, + Grafts.creatureType.humanoid, + Grafts.creatureSubtype.android + ), + dwarf: new Race( + "dwarf", + Size.medium, + Grafts.creatureType.humanoid, + Grafts.creatureSubtype.dwarf, + ["dwarven"] + ), + drow: new Race( + "drow", + Size.medium, + Grafts.creatureType.humanoid, + Grafts.creatureSubtype.elf, + ["drow"] + ), + elf: new Race( + "elf", + Size.medium, + Grafts.creatureType.humanoid, + Grafts.creatureSubtype.elf, + ["elven"] + ), + gnome: new Race( + "gnome", + Size.small, + Grafts.creatureType.humanoid, + Grafts.creatureSubtype.gnome, + ["gnome"] + ), + gnoll: new Race( + "gnoll", + Size.medium, + Grafts.creatureType.humanoid, + Grafts.creatureSubtype.gnoll, + undefined, + ["gnoll"] + ), + hobgoblin: new Race( + "hobgoblin", + Size.medium, + Grafts.creatureType.humanoid, + Grafts.creatureSubtype.goblinoid, + undefined, + ["goblin"] + ), + human: new Race( + "human", + Size.medium, + Grafts.creatureType.humanoid, + Grafts.creatureSubtype.human + ), + halfOrc: new Race( + "half-orc", + Size.medium, + Grafts.creatureType.humanoid, + [Grafts.creatureSubtype.human, Grafts.creatureSubtype.orc], + ["orc"] + ), + halfElf: new Race( + "half-elf", + Size.medium, + Grafts.creatureType.humanoid, + [Grafts.creatureSubtype.human, Grafts.creatureSubtype.elf], + ["elven"] + ), + halfling: new Race( + "halfling", + Size.small, + Grafts.creatureType.humanoid, + Grafts.creatureSubtype.halfling, + ["halfling"] + ), + kasatha: new Race( + "kasatha", + Size.medium, + Grafts.creatureType.humanoid, + Grafts.creatureSubtype.kasatha, + ["kasatha"], + undefined, + 4 + ), + lashunta: new Race( + "lashunta", + Size.medium, + Grafts.creatureType.humanoid, + Grafts.creatureSubtype.lashunta, + ["castrovelian"] + ), + nuar: new Race( + "nuar", + Size.medium, + Grafts.creatureType.monstrousHumanoid + ), + skittermander: new Race( + "skittermander", + Size.small, + Grafts.creatureType.humanoid, + Grafts.creatureSubtype.skittermander, + undefined, + undefined, + 6 + ), + shirren: new Race( + "shirren", + Size.medium, + Grafts.creatureType.humanoid, + Grafts.creatureSubtype.shirren, + ["shirren"] + ), + vesk: new Race( + "vesk", + Size.medium, + Grafts.creatureType.humanoid, + Grafts.creatureSubtype.vesk, + ["vesk"] + ), + ysoki: new Race( + "ysoki", + Size.small, + Grafts.creatureType.humanoid, + Grafts.creatureSubtype.ysoki, + ["akiton", "ysoki"] + ) } -}; +} // The version of sfrpg the player is using may not have the new races included in the Alien Races Cards // I've bundled them here temporarily, will be removed when this module migrates to 0.8.X as a minimum Foundry version // (as the version of sfrpg which is compatible with 0.8.X will have these races) export const BundledRaces = { gnoll: { - "name": "Gnoll", - "type": "race", - "data": { - "description": { - "chat": "", - "gmnotes": "", - "short": "", - "value": "Gnolls are hyena-headed humanoids with reputation as bloodthirsty raiders, scavengers, and cannibals. They are capable hunters who respect pwoer and strength over station or role, and most gnolls would believe their own survival takes precedence over any kind of morality.
\nAbility Adjustments +2 Str, +2 Con, -2 Int
Hit Points 6
Gnolls are Medium humanoids with the gnoll subtype.
\nGnolls receive a +2 racial bonus to Surival checks.
\nGnolls have blindsense (scent) with a range of 30 feet.
\nGnolls can see up to 60 feet in the dark. See page 263 for more information.
\nEach time they move, gnolls can move through the first square of nonmagical difficult terrain at their normal speed.
\nGnolls can attack with a special unarmed strike that deals lethal damage, doesn’t count as archaic, and threatens squares. Gnoll gain a special version of the Weapon Specialization feat with this unarmed strike at 3rd level, allowing them to add 1–1/2 × their character level to their damage rolls for this unarmed strike (instead of just adding their character level, as usual).
\n", - "unidentified": "" + name: "Gnoll", + type: "race", + data: { + description: { + chat: "", + gmnotes: "", + short: "", + value: + "
Gnolls are hyena-headed humanoids with reputation as bloodthirsty raiders, scavengers, and cannibals. They are capable hunters who respect pwoer and strength over station or role, and most gnolls would believe their own survival takes precedence over any kind of morality.
\nAbility Adjustments +2 Str, +2 Con, -2 Int
Hit Points 6
Gnolls are Medium humanoids with the gnoll subtype.
\nGnolls receive a +2 racial bonus to Surival checks.
\nGnolls have blindsense (scent) with a range of 30 feet.
\nGnolls can see up to 60 feet in the dark. See page 263 for more information.
\nEach time they move, gnolls can move through the first square of nonmagical difficult terrain at their normal speed.
\nGnolls can attack with a special unarmed strike that deals lethal damage, doesn’t count as archaic, and threatens squares. Gnoll gain a special version of the Weapon Specialization feat with this unarmed strike at 3rd level, allowing them to add 1–1/2 × their character level to their damage rolls for this unarmed strike (instead of just adding their character level, as usual).
\n", + unidentified: "" }, - "source": "ACD", - "type": "humanoid", - "modifiers": [ + source: "ACD", + type: "humanoid", + modifiers: [ { - "name": "Self-sufficient", - "modifier": "2", - "type": "racial", - "effectType": "skill", - "valueAffected": "sur", - "enabled": true, - "source": "Racial", - "notes": "Gnolls gain a +2 racial bonus to Survival checks.", - "modifierType": "constant", - "condition": "", - "subtab": "misc", - "max": 2, - "_id": "58a26466-6333-4d6b-91f0-49ef03c52fb6" + name: "Self-sufficient", + modifier: "2", + type: "racial", + effectType: "skill", + valueAffected: "sur", + enabled: true, + source: "Racial", + notes: "Gnolls gain a +2 racial bonus to Survival checks.", + modifierType: "constant", + condition: "", + subtab: "misc", + max: 2, + _id: "58a26466-6333-4d6b-91f0-49ef03c52fb6" } ], - "hp": { - "value": 6, - "min": 1 + hp: { + value: 6, + min: 1 }, - "abilityMods": { - "parts": [ - [ - 2, - "str" - ], - [ - 2, - "con" - ], - [ - -2, - "int" - ] + abilityMods: { + parts: [ + [2, "str"], + [2, "con"], + [-2, "int"] ] }, - "size": "medium", - "subtype": "gnoll", - "damage": { - "parts": [] + size: "medium", + subtype: "gnoll", + damage: { + parts: [] }, - "critical": { - "parts": [] + critical: { + parts: [] } }, - "flags": {}, - "effects": [] + flags: {}, + effects: [] } } diff --git a/src/data/Skills.ts b/src/data/Skills.ts new file mode 100644 index 0000000..c2991be --- /dev/null +++ b/src/data/Skills.ts @@ -0,0 +1,21 @@ +export enum Skill { + acrobatics = "acr", + athletics = "ath", + bluff = "blu", + computers = "com", + culture = "cul", + diplomacy = "dip", + disguise = "dis", + engineering = "eng", + intimidate = "int", + lifeSience = "lsc", + medicine = "med", + mysticism = "mys", + perception = "per", + physicalScience = "phs", + piloting = "pil", + senseMotive = "sen", + sleightOfHand = "sle", + stealth = "ste", + survival = "sur" +} diff --git a/src/data/Types.ts b/src/data/Types.ts new file mode 100644 index 0000000..51e9b6c --- /dev/null +++ b/src/data/Types.ts @@ -0,0 +1,36 @@ +/// List of creature types +export enum Type { + aberration, + animal, + construct, + dragon, + fey, + humanoid, + "magical beast", + "monstrous humanoid", + ooze, + outsider, + plant, + undead, + vermin +} + +/// List of creature subtypes +export enum Subtype { + android, + dwarf, + elf, + gnome, + gnoll, + goblinoid, + halfling, + human, + kasatha, + lashunta, + orc, + shirren, + skittermander, + technological, + vesk, + ysoki +} diff --git a/src/data/Weapons.ts b/src/data/Weapons.ts new file mode 100644 index 0000000..e3bf896 --- /dev/null +++ b/src/data/Weapons.ts @@ -0,0 +1,408 @@ +// Weapon Templates +// Some weapons are easier to store as template which are modified/customized rather than searching compendiums +export const unarmedStrikeTemplate = { + name: "Unarmed strike", + type: "weapon", + data: { + description: { + chat: "", + gmnotes: "", + short: "", + value: + "
An unarmed strike can be dealt with any limb or appendage. Unarmed strikes deal nonlethal damage, and the damage from an unarmed strike is considered weapon damage for the purposes of effects that give you a bonus to weapon damage rolls.
", + unidentified: "" + }, + source: "CRB pg. 190", + type: "", + quantity: null, + bulk: "-", + price: 0, + level: 0, + attuned: false, + equipped: true, + equippable: false, + identified: true, + attributes: { + sturdy: false, + customBuilt: false, + size: "medium", + dex: { + mod: "" + }, + hp: { + value: 6, + max: "" + }, + hardness: { + value: "" + }, + ac: { + value: "" + } + }, + activation: { + type: "action", + cost: 1, + condition: "" + }, + duration: { + value: "", + units: "" + }, + target: { + value: "", + type: "" + }, + area: { + value: null, + units: null, + shape: "", + effect: "" + }, + range: { + value: null, + units: "touch", + additional: "", + per: "" + }, + uses: { + value: 0, + max: 0, + per: "" + }, + isActive: null, + ability: "", + actionType: "mwak", + attackBonus: 0, + chatFlavor: "", + critical: { + parts: [], + effect: "" + }, + damage: { + parts: [["1d3", "bludgeoning"]] + }, + formula: "", + save: { + type: "", + dc: "", + descriptor: "negate" + }, + descriptors: [], + capacity: { + value: 0, + max: 0 + }, + usage: { + value: 0, + per: "" + }, + modifiers: [], + container: { + contents: [], + storage: [], + isOpen: true + }, + weaponType: "basicM", + weaponCategory: "", + special: "", + properties: { + one: false, + two: false, + amm: false, + aeon: false, + analog: false, + antibiological: false, + archaic: true, + aurora: false, + automatic: false, + blast: false, + block: false, + boost: false, + breach: false, + breakdown: false, + bright: false, + cluster: false, + conceal: false, + deconstruct: false, + deflect: false, + disarm: false, + double: false, + drainCharge: false, + echo: false, + entangle: false, + explode: false, + extinguish: false, + feint: false, + fiery: false, + firstArc: false, + flexibleLine: false, + force: false, + freeHands: false, + fueled: false, + grapple: false, + gravitation: false, + guided: false, + harrying: false, + holyWater: false, + hybrid: false, + ignite: false, + indirect: false, + injection: false, + integrated: false, + line: false, + living: false, + lockdown: false, + "mind-affecting": false, + mine: false, + mire: false, + modal: false, + necrotic: false, + nonlethal: true, + operative: false, + penetrating: false, + polarize: false, + polymorphic: false, + powered: false, + professional: false, + punchGun: false, + qreload: false, + radioactive: false, + reach: false, + recall: false, + regrowth: false, + relic: false, + reposition: false, + shape: false, + shatter: false, + shells: false, + shield: false, + sniper: false, + stun: false, + subtle: false, + sunder: false, + swarm: false, + tail: false, + teleportive: false, + thought: false, + throttle: false, + thrown: false, + trip: false, + unbalancing: false, + underwater: false, + unwieldy: false, + variantBoost: false, + wideLine: false + }, + proficient: true, + abilityMods: { + parts: [] + } + }, + flags: {}, + effects: [] +} as IWeapon +export const naturalWeaponsTemplate = { + name: "Unarmed strike (natural weapons)", + type: "weapon", + data: { + description: { + chat: "", + gmnotes: "", + short: "", + value: + "Natural weapons (and natural attacks) such as acid spit, bite, claw, or slam don’t require ammunition and can’t be disarmed or sundered.\n" + + "In addition, a player character with this ability can attack with a special unarmed strike that deals lethal damage, doesn’t count as archaic, and threatens squares. They also gain a special version of the Weapon Specialization feat with this unarmed strike at 3rd level, allowing them to add 1–1/2 × their character level to their damage rolls for this unarmed strike (instead of just adding their character level as usual).
", + unidentified: "" + }, + source: "CRB pg. 190", + type: "", + quantity: null, + bulk: "-", + price: 0, + level: 0, + attuned: false, + equipped: true, + equippable: false, + identified: true, + attributes: { + sturdy: false, + customBuilt: false, + size: "medium", + dex: { + mod: "" + }, + hp: { + value: 6, + max: "" + }, + hardness: { + value: "" + }, + ac: { + value: "" + } + }, + activation: { + type: "action", + cost: 1, + condition: "" + }, + duration: { + value: "", + units: "" + }, + target: { + value: "", + type: "" + }, + area: { + value: null, + units: null, + shape: "", + effect: "" + }, + range: { + value: null, + units: "touch", + additional: "", + per: "" + }, + uses: { + value: 0, + max: 0, + per: "" + }, + isActive: null, + ability: "", + actionType: "mwak", + attackBonus: 0, + chatFlavor: "", + critical: { + parts: [], + effect: "" + }, + damage: { + parts: [["1d3", "bludgeoning"]] + }, + formula: "", + save: { + type: "", + dc: "", + descriptor: "negate" + }, + descriptors: [], + capacity: { + value: 0, + max: 0 + }, + usage: { + value: 0, + per: "" + }, + modifiers: [], + container: { + contents: [], + storage: [], + isOpen: true + }, + weaponType: "basicM", + weaponCategory: "", + special: "", + properties: { + one: false, + two: false, + amm: false, + aeon: false, + analog: false, + antibiological: false, + archaic: false, + aurora: false, + automatic: false, + blast: false, + block: false, + boost: false, + breach: false, + breakdown: false, + bright: false, + cluster: false, + conceal: false, + deconstruct: false, + deflect: false, + disarm: false, + double: false, + drainCharge: false, + echo: false, + entangle: false, + explode: false, + extinguish: false, + feint: false, + fiery: false, + firstArc: false, + flexibleLine: false, + force: false, + freeHands: false, + fueled: false, + grapple: false, + gravitation: false, + guided: false, + harrying: false, + holyWater: false, + hybrid: false, + ignite: false, + indirect: false, + injection: false, + integrated: false, + line: false, + living: false, + lockdown: false, + "mind-affecting": false, + mine: false, + mire: false, + modal: false, + necrotic: false, + nonlethal: false, + operative: false, + penetrating: false, + polarize: false, + polymorphic: false, + powered: false, + professional: false, + punchGun: false, + qreload: false, + radioactive: false, + reach: false, + recall: false, + regrowth: false, + relic: false, + reposition: false, + shape: false, + shatter: false, + shells: false, + shield: false, + sniper: false, + stun: false, + subtle: false, + sunder: false, + swarm: false, + tail: false, + teleportive: false, + thought: false, + throttle: false, + thrown: false, + trip: false, + unbalancing: false, + underwater: false, + unwieldy: false, + variantBoost: false, + wideLine: false + }, + proficient: true, + abilityMods: { + parts: [] + } + }, + flags: {}, + img: "icons/svg/mystery-man.svg", + effects: [] +} as IWeapon diff --git a/src/data/adjusters/SharedAdjusters.ts b/src/data/adjusters/SharedAdjusters.ts new file mode 100644 index 0000000..24a8506 --- /dev/null +++ b/src/data/adjusters/SharedAdjusters.ts @@ -0,0 +1,36 @@ +import SenseAdjuster from "../../models/adjusters/SenseAdjuster.js" +import ImmunityAdjuster from "../../models/adjusters/ImmunityAdjuster.js" +import SaveAdjuster from "../../models/adjusters/SaveAdjuster.js" +import { Save } from "../MonsterCreation.js" + +export const SharedAdjusters = { + Immunities: { + constructImmunities: new ImmunityAdjuster({ + addConditionImmunity: "construct immunities" + }), + drowImmunities: new ImmunityAdjuster({ + addConditionImmunity: "drow immunities" + }), + elvenImmunities: new ImmunityAdjuster({ + addConditionImmunity: "elven immunities" + }), + mindAffectingEffects: new ImmunityAdjuster({ + addConditionImmunity: "mind-affecting effects" + }) + }, + Saves: { + // Quickly add 2 to saves + fortitudePlus2: new SaveAdjuster({ mutateSave: [Save.fortitude, 2] }), + reflexPlus2: new SaveAdjuster({ mutateSave: [Save.reflex, 2] }), + willpowerPlus2: new SaveAdjuster({ mutateSave: [Save.willpower, 2] }), + // Quickly removes 2 to saves + fortitudeMinus2: new SaveAdjuster({ mutateSave: [Save.fortitude, -2] }), + reflexMinus2: new SaveAdjuster({ mutateSave: [Save.reflex, -2] }), + willpowerMinus2: new SaveAdjuster({ mutateSave: [Save.willpower, -2] }) + }, + Senses: { + blindsight: new SenseAdjuster({ addSense: ["blindsight"] }), + darkVision60ft: new SenseAdjuster({ addSense: ["darkvision 60 ft."] }), + lowLightVision: new SenseAdjuster({ addSense: ["low-light vision"] }) + } +} diff --git a/src/data/universal creature rules/UniversalCreatureRules.ts b/src/data/universal creature rules/UniversalCreatureRules.ts new file mode 100644 index 0000000..3cf791e --- /dev/null +++ b/src/data/universal creature rules/UniversalCreatureRules.ts @@ -0,0 +1,30 @@ +/// Collection of universal creature rules which are applied by various means (creature type grafts, special abilities, etc) +import UniversalCreatureRule from "../../models/UniversalCreatureRule.js" + +export const UniversalCreatureRules = { + ferocity: new UniversalCreatureRule( + "ferocity", + "When the creature is brought to 0 Hit Points, it can fight on for 1 more round. It can act normally until the end of its next turn; if it has 0 HP at that point, it dies. If it would lose further Hit Points before this, it ceases to be able to act and dies." + ), + integratedWeapons: new UniversalCreatureRule( + "integrated weapons", + "The creature’s weapons are manufactured weapons, not natural weapons, and they are integrated into its frame. A creature can’t be disarmed of these weapons, though they can be removed and used if the creature is dead." + ), + mindless: new UniversalCreatureRule( + "mindless", + "The creature has no Intelligence score or modifier and is immune to mind-affecting effects. Any DCs or other statistics that rely on an Intelligence score treat the creature as having a score of 10 (+0).\n" + + "Guidelines: Mindless creatures usually have fewer good skills and no master skills. Their skills should be based on inborn abilities, since they’re incapable of training." + ), + naturalWeapons: new UniversalCreatureRule( + "natural weapons", + "Natural weapons (and natural attacks), such as acid spit, bite, claw, or slam don’t require ammunition and can’t be disarmed or sundered." + ), + sightless: new UniversalCreatureRule( + "sightless", + "The creature does not use any visual senses and is thus never subject to any effect that requires the creature to see a target or effect. Sightless creatures normally have some form of blindsight to compensate for their sightlessness, but if not, they are assumed to be able to operate as well as a creature with normal vision unless the creature’s description says otherwise." + ), + unliving: new UniversalCreatureRule( + "unliving", + "The creature has no Constitution score or modifier. Any DCs or other statistics that rely on a Constitution score treat the creature as having a score of 10 (+0). The creature is immediately destroyed when it reaches 0 Hit Points. An unliving creature doesn’t heal damage naturally, but a construct can be repaired with the right tools. Spells such as make whole can heal constructs, and magic effects can heal undead. An unliving creature with fast healing (see page 154) still benefits from that ability. Unliving creatures don’t breathe, eat, or sleep. They can’t be raised or resurrected, except through the use of miracle, wish, or a similar effect that specifically works on unliving creatures." + ) +} diff --git a/src/factories/BiographyFactory.ts b/src/factories/BiographyFactory.ts new file mode 100644 index 0000000..4ad902e --- /dev/null +++ b/src/factories/BiographyFactory.ts @@ -0,0 +1,29 @@ +import NPCCreationContext from "../models/NPCCreationContext.js" +import { Utils } from "../utils/Uils.js" +import { Biography } from "../data/Biography.js" + +export class BiographyFactory { + // NOTE: Consider refactoring to only provide needed parameters and remove dependancy on `NPCCreationContext` + public static makeBiography(actor, context: NPCCreationContext) { + var biography: string = "" + + if (context.generatePersonality) { + let personalityTraits = Biography.personalityTraits + Utils.shuffleArray(personalityTraits) + + biography += + "" + + actor.name + + " is a " + + personalityTraits[0] + + " " + + context.race + + " who identifies as " + + context.gender + + ".
" + } + + biography += "Created by Populator.
" + return biography + } +} diff --git a/src/factories/ItemFactory.ts b/src/factories/ItemFactory.ts new file mode 100644 index 0000000..b3bf830 --- /dev/null +++ b/src/factories/ItemFactory.ts @@ -0,0 +1,133 @@ +import { Randomizer } from "../Randomizer.js" +import { + backpackTemplate, + canteenTemplate, + credStickTemplate, + intoxicantMinorTemplate, + Items, + lighterTemplate, + purfumeTemplate, + religiousSymbolTemplate, + ropeTemplate, + upbTemplate +} from "../data/Items.js" +import { Utils } from "../utils/Uils.js" + +export class ItemFactory { + // Default size is 3 + public static makeItemCollection(size = 3): IItem[] { + var itemCollection: IItem[] = [] as IItem[] + // Every NPC has 2 random items (for now, may change) + for (var i = 0; i < size; i++) { + let items = [ + { item: backpackTemplate, percentage: 0.03 }, + { item: canteenTemplate, percentage: 0.03 }, + { item: credStickTemplate, percentage: 0.03 }, + { item: upbTemplate, percentage: 0.03 }, + { item: lighterTemplate, percentage: 0.03 }, + { item: ropeTemplate, percentage: 0.03 }, + { item: purfumeTemplate, percentage: 0.03 }, + { item: intoxicantMinorTemplate, percentage: 0.03 }, + { item: ItemFactory.makeReligiousSymbol(), percentage: 0.06 }, + { item: ItemFactory.makeJunk(), percentage: 0.7 } + ] + + let winning = Randomizer.pickWinningItem(items).item + itemCollection.push(winning) + } + return itemCollection + } + + private static makeReligiousSymbol(): IGoods { + let religiousSymbol = Object.assign({}, religiousSymbolTemplate) + var gods = [ + "Abadar", + "Angradd", + "Arshea", + "Asmodeus", + "Besmara", + "Calistria", + "Damoritosh", + "Desna", + "Eldest", + "Eloritu", + "Groetus", + "Hylax", + "Ibra", + "Iomedae", + "Lamashtu", + "Lao Shu Po", + "Lissala", + "Nyarlathotep", + "Oras", + "Pharasma", + "Sarenrae", + "Talavet", + "The Devourer", + "Urgathoa", + "Weydan", + "Yaraesa", + "Zon-Kuthon" + ] + Utils.shuffleArray(gods) + religiousSymbol.name += " (" + gods[0] + ")" + return religiousSymbol + } + + private static makeJunk(): IGoods { + var junkItem = Items.junk[Math.floor(Math.random() * Items.junk.length)] + return { + name: junkItem.name, + type: "goods", + data: { + description: { + chat: "", + gmnotes: "", + short: "", + value: "" + junkItem.description + "
", + unidentified: "" + }, + source: "Populator", + type: "", + quantity: 1, + bulk: "L", + price: 0, + level: 1, + attuned: false, + equipped: false, + equippable: false, + identified: true, + attributes: { + sturdy: false, + customBuilt: false, + size: "medium", + dex: { + mod: "" + }, + hp: { + value: 6, + max: "" + }, + hardness: { + value: "" + }, + ac: { + value: "" + } + }, + modifiers: [], + damage: { + parts: [] + }, + critical: { + parts: [] + }, + abilityMods: { + parts: [] + } + }, + flags: {}, + effects: [] + } as IGoods + } +} diff --git a/src/factories/NPCFactory.ts b/src/factories/NPCFactory.ts new file mode 100644 index 0000000..7a0a884 --- /dev/null +++ b/src/factories/NPCFactory.ts @@ -0,0 +1,1448 @@ +import { Utils } from "../utils/Uils.js" +import { Grafts } from "../data/Grafts.js" +import { ItemFactory } from "./ItemFactory.js" +import { + CR, + MonsterCreation, + MonsterReferenceSymbol, + MonsterSkillType, + Save, + Size +} from "../data/MonsterCreation.js" +import { BundledRaces, Races } from "../data/Races.js" +import { Randomizer } from "../Randomizer.js" +import { WeaponFactory } from "./WeaponFactory.js" +import CreatureTypeGraft from "../models/CreatureTypeGraft.js" +import CreatureSubtypeGraft from "../models/CreatureSubtypeGraft.js" +import NPCCreationContext from "../models/NPCCreationContext.js" +import Race from "../models/Race.js" +import { BiographyFactory } from "./BiographyFactory.js" +import UniversalCreatureRule from "../models/UniversalCreatureRule.js" +import { CreatureTypeGenerationOptions } from "../data/Generator.js" +import { UniversalCreatureRules } from "../data/universal creature rules/UniversalCreatureRules.js" +import SkillAdjuster from "../models/adjusters/SkillAdjuster.js" +import { Skill } from "../data/Skills.js" +import SenseAdjuster from "../models/adjusters/SenseAdjuster.js" +import { apply } from "../models/Interfaces/IApplyable.js" +import { SharedAdjusters } from "../data/adjusters/SharedAdjusters.js" +import SaveAdjuster from "../models/adjusters/SaveAdjuster.js" +import AbilityScoreAdjuster from "../models/adjusters/AbilityScoreAdjuster.js" +import { AbilityScore } from "../data/AbilityScores.js" + +export class NPCFactory { + // Produces a non-hostile NPC from a subset of races + public static async makeNonHostile(context: NPCCreationContext) { + let actorData = { name: "Generated Actor", type: "npc" } + let actor = await Actor.create(actorData) + + // Non-combatants are always experts + context.monsterReferenceSymbol = MonsterReferenceSymbol.expert + + await this.setRace(actor, context) + await this.makeNPC(actor, context) + } + + public static async makeHostile(context: NPCCreationContext) { + let actorData = { name: "Generated Actor", type: "npc" } + let actor = await Actor.create(actorData) + + // If no type set we randomly generate + if (!context.creatureTypeGraft) { + // Randomizes creature type + let supportedMonsterTypes = CreatureTypeGenerationOptions + Utils.shuffleArray(supportedMonsterTypes) + context.creatureTypeGraft = supportedMonsterTypes[0].typeGraft + } + + // TODO: Pick a random subtype (or none) + + // We don't generate "junk" items for monsters + context.generateAdditionalItems = false + // Monsters generally don't have personalities + context.generatePersonality = false + + await this.makeNPC(actor, context) + } + + // Private + private static async makeNPC(actor, context: NPCCreationContext) { + // Grab appropriate array rows + let monsterReferenceSymbol = + MonsterReferenceSymbol[context.monsterReferenceSymbol] + + let mainArrayRow = Object.assign( + {}, + MonsterCreation.arrays[monsterReferenceSymbol].main[context.CR] + ) + let attackArrayRow = Object.assign( + {}, + MonsterCreation.arrays[monsterReferenceSymbol].attack[context.CR] + ) + + context.mainArrayRow = mainArrayRow + context.attackArrayRow = attackArrayRow + + // Fill in details + await this.setGenderAndName(actor, context) + await this.setDetails(actor, context) + await this.setGrafts(actor, context) + await this.setSpecialAbilities(actor, context) + await this.setAttributes(actor, context) + await this.setVulnerabilitiesAndImmunities(actor, context) + await this.setSkills(actor, context) + await this.setWeapons(actor, context) + await this.setInventory(actor, context) + await this.setSenses(actor, context) + await this.setToken(actor, context) + await this.setAbout(actor, context) + } + + private static async setRace(actor, context: NPCCreationContext) { + let actorUpdate = {} + let logEntries: [string, string][] = [] + + if (!context.race) { + let randomRace = Randomizer.randomRace() + context.race = randomRace.name + logEntries.push([ + "Chose race " + randomRace.name + " at random.", + "" + ]) + } else { + logEntries.push(["Race " + context.race + " chosen.", ""]) + } + + // Set grafts for race + let race = Races.nonCombatantRaces[context.race] + context.creatureTypeGraft = race.creatureTypeGraft + context.creatureSubtypeGrafts = race.creatureSubtypeGrafts + + var raceData + // We stub in gnolls until they are included in sfrpg + if (context.race == "gnoll") { + raceData = BundledRaces.gnoll + } else { + raceData = await Utils.fuzzyFindRaceAsync(race.name) + } + + // Race item + await this.clean(raceData) + context.itemsToAdd.push(raceData) + + // Update actor + await actor.update(actorUpdate) + + // Update log + context.log.push(...logEntries) + } + + private static async setGenderAndName(actor, context: NPCCreationContext) { + let actorUpdate = {} + let logEntries: [string, string][] = [] + + // Gender + if (!context.gender) { + let randomGender = Randomizer.randomGender() + context.gender = randomGender + logEntries.push([ + "Chose gender " + randomGender + " at random.", + "" + ]) + } else { + logEntries.push(["Gender " + context.gender + " chosen.", ""]) + } + + // Race and Grafts label + let raceText = context.race + ? " " + Races.nonCombatantRaces[context.race].name + : "" + actorUpdate["data.details.raceAndGrafts"] = + context.gender + raceText + ", grafts:" // Grafts will be filled in as applied + + // Name + let randomName = Randomizer.randomName(context) + actorUpdate["name"] = randomName + logEntries.push([" Generated name " + randomName + " at random.", ""]) + + // Update actor + await actor.update(actorUpdate) + + // Update log + context.log.push(...logEntries) + } + + private static async setDetails(actor, context: NPCCreationContext) { + let logEntries: [string, string][] = [] + var race: Race | undefined + if (context.race) race = Races.nonCombatantRaces[context.race] + let actorUpdate = {} + + // Source + actorUpdate["data.details.source"] = "Populator" + + // CR + var CR: number + if (context.CR === "1/3") { + CR = 1 / 3 + } else if (context.CR === "1/2") { + CR = 0.5 + } else { + CR = parseFloat(context.CR) + } + actorUpdate["data.details.cr"] = CR + + // Alignment + let randomAlignment = Randomizer.randomAlignment() + actorUpdate["data.details.alignment"] = randomAlignment + logEntries.push([ + "Chose alignment " + randomAlignment + " at random.", + "" + ]) + + // Languages + // NOTE: Only applies languages if this creature type has the intelligence capacity for language + if (context.creatureTypeGraft?.capicityForLanguage) { + var languages = ["common"] + if (race?.languages) { + languages.push(...race.languages) + } + + actorUpdate["data.traits.languages.value"] = languages + } + + // Update actor + await actor.update(actorUpdate) + + // Update log + context.log.push(...logEntries) + } + + private static async setGrafts(actor, context: NPCCreationContext) { + if (!context.creatureTypeGraft) return + let logEntries: [string, string][] = [] + let actorUpdate = {} + + try { + await this.applyCreatureTypeGraft( + actor, + context, + context.creatureTypeGraft + ) + + if (context.creatureSubtypeGrafts) { + let subtypes: string[] = [] + for (let creatureSubtypeGraft of context.creatureSubtypeGrafts) { + // Adds subtypes to an array to construct type + subtypes.push(creatureSubtypeGraft.name) + + await this.applyCreatureSubtypeGraft( + actor, + context, + creatureSubtypeGraft + ) + } + + // Apply type in "" + entry[0] + "
" + + if (entry[1] != "") { + gmNotes += "" + entry[1] + "" + } + } + + actorUpdate["data.details.biography.gmNotes"] = gmNotes + + // Update actor + await actor.update(actorUpdate) + } + + private static async applyCreatureTypeGraft( + actor, + context: NPCCreationContext, + graft: CreatureTypeGraft + ) { + let logEntries: [string, string][] = [] + let actorUpdate = {} + + if (graft === Grafts.creatureType.animal) { + // Applies either a -4 or -5 (randomly) as intelligence score + let intelligenceMods = [-4, -5] + Utils.shuffleArray(intelligenceMods) + + await apply( + actor, + context, + //Senses + SharedAdjusters.Senses.lowLightVision, + // Applies a +2 to reflex & fortitude + SharedAdjusters.Saves.reflexPlus2, + SharedAdjusters.Saves.fortitudePlus2, + new AbilityScoreAdjuster({ + setAbilityScore: [ + AbilityScore.intelligence, + intelligenceMods[0] + ] + }) + ) + + // TODO: This has a chance of overwriting one of the randomly boosted ability scores, we should reassign the overwritten value to another stat + logEntries.push([ + "Applied animal type graft. Added low-light vision, +2 to reflex/fort save, set " + + intelligenceMods[0] + + " to intelligence (chosen at random between -4 and -5).", + Grafts.creatureType.animal.description + ]) + } else if (graft === Grafts.creatureType.construct) { + await apply( + actor, + context, + //Senses + SharedAdjusters.Senses.darkVision60ft, + SharedAdjusters.Senses.lowLightVision, + // Immunities + SharedAdjusters.Immunities.constructImmunities, + // Saves (-2 to all) + SharedAdjusters.Saves.reflexMinus2, + SharedAdjusters.Saves.willpowerMinus2, + SharedAdjusters.Saves.fortitudeMinus2 + ) + + // Constitution + context.abilities.push(["con", 0]) // NOTE: Should be no constitution but sfrpg doesn't yet support + // Unliving + await this.applyUniversalCreatureRule( + actor, + context, + UniversalCreatureRules.unliving + ) + + // Attacks + context.attackArrayRow.high += 1 + context.attackArrayRow.low += 1 + + logEntries.push([ + "Applied construct type graft. Added darkvision 60 ft. and low-light vision, -2 to all saves, +1 to all attacks, added unliving universal creature rule.", + Grafts.creatureType.construct.description + ]) + } else if (graft === Grafts.creatureType.humanoid) { + // Applies a +2 to a random saving throw + var saves = [Save.reflex, Save.fortitude, Save.willpower] + Utils.shuffleArray(saves) + let save = saves[0] // random save + + await new SaveAdjuster({ mutateSave: [save, 2] }).apply( + actor, + context + ) + + logEntries.push([ + "Applied humanoid type graft. Added +2 to " + + saves[0] + + " save (chosen at random).", + Grafts.creatureType.humanoid.description + ]) + } else if (graft === Grafts.creatureType.monstrousHumanoid) { + await apply( + actor, + context, + // Senses + SharedAdjusters.Senses.darkVision60ft, + // Applies a +2 to reflex & will + SharedAdjusters.Saves.reflexPlus2, + SharedAdjusters.Saves.willpowerPlus2 + ) + + // Add +1 to all attacks + context.attackArrayRow.high += 1 + context.attackArrayRow.low += 1 + + logEntries.push([ + "Applied monstrous humanoid type graft. Added darkvision, +2 to reflex/will saves and +1 to all attacks.", + Grafts.creatureType.monstrousHumanoid.description + ]) + } else if (graft === Grafts.creatureType.ooze) { + apply( + actor, + context, + //Senses + SharedAdjusters.Senses.blindsight, + // Saves (+2 to fortitude save, -2 reflex save) + SharedAdjusters.Saves.fortitudePlus2, + SharedAdjusters.Saves.reflexMinus2, + // Skills (No master or good skills, except perception which everything usually has) + new SkillAdjuster({ + setMonsterSkillCount: [MonsterSkillType.master, 0] + }), + new SkillAdjuster({ + setMonsterSkillCount: [MonsterSkillType.good, 0] + }), + // Mindless - no intelligence + // TODO: This has a chance of overwriting one of the randomly boosted ability scores, we should reassign the overwritten value to another stat + new AbilityScoreAdjuster({ + setAbilityScore: [AbilityScore.intelligence, 0] + }) + ) + + await this.applyUniversalCreatureRule( + actor, + context, + UniversalCreatureRules.mindless + ) + + // Sightless + await this.applyUniversalCreatureRule( + actor, + context, + UniversalCreatureRules.sightless + ) + + logEntries.push([ + "Applied ooze type graft. Added blindsight, +2 to fort save, -2 to reflex save, set - as intelligence, added mindless and sightless universal creature rule, reduced good and master skills to 0 (except perception).", + Grafts.creatureType.ooze.description + ]) + } else if (graft === Grafts.creatureType.vermin) { + await apply( + actor, + context, + //Senses + SharedAdjusters.Senses.darkVision60ft, + // Saves (2 to fortitude saves) + SharedAdjusters.Saves.fortitudePlus2 + ) + + // Mindless, no intelligence + // TODO: This has a chance of overwriting one of the randomly boosted ability scores, we should reassign the overwritten value to another stat + context.abilities.push(["int", 0]) + + await this.applyUniversalCreatureRule( + actor, + context, + UniversalCreatureRules.mindless + ) + + logEntries.push([ + "Applied vermin type graft. Added darkvision, +2 to fort save, set - as intelligence, added mindless universal creature rule.", + Grafts.creatureType.vermin.description + ]) + } + + actorUpdate["data.details.raceAndGrafts"] = + actor.data.data.details.raceAndGrafts + " " + graft.name + + // Update actor + await actor.update(actorUpdate) + + // Update log + context.log.push(...logEntries) + } + + private static async applyCreatureSubtypeGraft( + actor, + context: NPCCreationContext, + graft: CreatureSubtypeGraft + ) { + let logEntries: [string, string][] = [] + let actorUpdate = {} + + // Set as 1 per day + function addOncePerDayInnateSpell(spell) { + spell.data.uses.value = 1 + spell.data.uses.max = 1 + spell.data.uses.per = "day" + spell.data.preparation.mode = "innate" + context.itemsToAdd.push(spell) + } + + function addAtWillInnateSpell(spell) { + spell.data.preparation.mode = "innate" + context.itemsToAdd.push(spell) + } + + if (graft === Grafts.creatureSubtype.android) { + //Senses + await apply( + actor, + context, + SharedAdjusters.Senses.darkVision60ft, + SharedAdjusters.Senses.lowLightVision + ) + + logEntries.push([ + "Applied android subtype graft. Added darkvision 60ft. and low-light vision.", + Grafts.creatureSubtype.android.description + ]) + } else if (graft === Grafts.creatureSubtype.dwarf) { + //Senses + await apply(actor, context, SharedAdjusters.Senses.darkVision60ft) + + logEntries.push([ + "Applied dwarf subtype graft. Added darkvision 60ft.", + Grafts.creatureSubtype.dwarf.description + ]) + } else if (graft === Grafts.creatureSubtype.elf) { + // Elves can be `drow`, `elven` or `half-elven` race + // All elves: + await new SkillAdjuster({ + // Perception as a master skill + setSkillAsMonsterSkill: [ + Skill.perception, + MonsterSkillType.master + ] + }).apply(actor, context) + + if (context.race == "elf") { + await apply( + actor, + context, + // Senses + SharedAdjusters.Senses.lowLightVision, + // Mysticism as a master skill + new SkillAdjuster({ + setSkillAsMonsterSkill: [ + Skill.mysticism, + MonsterSkillType.master + ] + }), + // Add immunities + SharedAdjusters.Immunities.elvenImmunities + ) + + logEntries.push([ + "Applied elf subtype graft. elf race selected so added elven immunities, and mysticism as a master skill.", + Grafts.creatureSubtype.elf.description + ]) + } + if (context.race == "drow") { + await apply( + actor, + context, + //Senses + SharedAdjusters.Senses.darkVision60ft, // Replaces low-light vision + // Add immunities + SharedAdjusters.Immunities.drowImmunities + ) + // Drow magic at will innate spells + let dancingLights = await Utils.fuzzyFindSpellAsync( + "dancing lights" + ) + let detectMagic = await Utils.fuzzyFindSpellAsync( + "detect magic" + ) + addAtWillInnateSpell(dancingLights) + addAtWillInnateSpell(detectMagic) + + logEntries.push([ + "Applied elf subtype graft. drow race selected so added darkvision 60ft., perception as a master skill, dacing lights and detect magic as innate spells, added drow immunities.", + Grafts.creatureSubtype.elf.description + ]) + } else if (context.race == "halfElf") { + await apply( + actor, + context, + SharedAdjusters.Senses.lowLightVision + ) + + // Half-elves gain an extra good skill + context.mainArrayRow.goodSkill.count += 1 + logEntries.push([ + "Applied elf subtype graft. half-elf race selected so added low-light vision, perception as a master skill, and one additional good skill.", + Grafts.creatureSubtype.elf.description + ]) + } + } else if (graft === Grafts.creatureSubtype.gnoll) { + // Senses + await apply( + actor, + context, + SharedAdjusters.Senses.darkVision60ft, + new SenseAdjuster({ addSense: ["blindsense (scent) 30 ft."] }), + // Survival as a master skill + new SkillAdjuster({ + setSkillAsMonsterSkill: [ + Skill.survival, + MonsterSkillType.master + ] + }) + ) + + // Natural weapons + context.naturalWeapons.enabled = true + context.naturalWeapons.racial = true + + logEntries.push([ + "Applied gnoll subtype graft. Added blindsense (scent) 30 ft., darkvision 60ft., natural weapons, survival as a master skill.", + Grafts.creatureSubtype.gnoll.description + ]) + } else if (graft === Grafts.creatureSubtype.halfling) { + await apply( + actor, + context, + // Perception and Stealth as master skills + new SkillAdjuster({ + setSkillAsMonsterSkill: [ + Skill.stealth, + MonsterSkillType.master + ] + }), + new SkillAdjuster({ + setSkillAsMonsterSkill: [ + Skill.perception, + MonsterSkillType.master + ] + }), + // Athletics and Acrobatics as good skills + new SkillAdjuster({ + setSkillAsMonsterSkill: [ + Skill.acrobatics, + MonsterSkillType.good + ] + }), + new SkillAdjuster({ + setSkillAsMonsterSkill: [ + Skill.athletics, + MonsterSkillType.good + ] + }) + ) + + logEntries.push([ + "Applied halfing subtype graft. Added perception and stealth as master skills and acrobatics and athletics as good skills.", + Grafts.creatureSubtype.halfling.description + ]) + } else if (graft === Grafts.creatureSubtype.human) { + if (context.race == Races.nonCombatantRaces.human.name) { + context.mainArrayRow.specialAbilities += 1 + context.mainArrayRow.goodSkill.count += 1 + + logEntries.push([ + "Applied human subtype graft. Added an additional special ability and an additional good skill.", + Grafts.creatureSubtype.human.description + ]) + } + // For half-elf, half-orc, etc + else { + logEntries.push([ + "Applied human subtype graft (no modifications).", + Grafts.creatureSubtype.human.description + ]) + } + } else if (graft === Grafts.creatureSubtype.gnome) { + await apply( + actor, + context, + //Senses + SharedAdjusters.Senses.lowLightVision, + // Culture as a master skill + new SkillAdjuster({ + setSkillAsMonsterSkill: [ + Skill.culture, + MonsterSkillType.master + ] + }) + ) + + // Gnome magic once per day innate spells + let dancingLights = await Utils.fuzzyFindSpellAsync( + "dancing lights" + ) + let ghostSound = await Utils.fuzzyFindSpellAsync("ghost sound") + let tokenSpell = await Utils.fuzzyFindSpellAsync("token spell") + addOncePerDayInnateSpell(dancingLights) + addOncePerDayInnateSpell(ghostSound) + addOncePerDayInnateSpell(tokenSpell) + + logEntries.push([ + "Applied gnome subtype graft. Added dancing lights, ghost sound, and token spell as once-per-day innate spells and added culture as a master skill.", + Grafts.creatureSubtype.gnome.description + ]) + } else if (graft === Grafts.creatureSubtype.goblinoid) { + // NOTE: AA1 has a different definition of the goblinoid subtype, should handle either + // TODO: Check if space goblin, hobgoblin or kanabo + // NOTE: For now we assume hobgoblin + await apply( + actor, + context, + //Senses + SharedAdjusters.Senses.darkVision60ft, + // Intimidate and stealth as a master skill + new SkillAdjuster({ + setSkillAsMonsterSkill: [ + [Skill.intimidate, Skill.stealth], + MonsterSkillType.master + ] + }) + ) + } else if (graft === Grafts.creatureSubtype.orc) { + // TODO: Check if race is half-orc, and only then apply + await apply( + actor, + context, + // Senses + SharedAdjusters.Senses.darkVision60ft, + // Intimidate and Survival are master skills + new SkillAdjuster({ + setSkillAsMonsterSkill: [ + [Skill.intimidate, Skill.survival], + MonsterSkillType.master + ] + }) + ) + + logEntries.push([ + "Applied orc subtype graft. Added darkvision 60 ft and intimidate and survival as master skills.", + Grafts.creatureSubtype.orc.description + ]) + } else if (graft === Grafts.creatureSubtype.kasatha) { + // Acrobatics and Athletics master skills + await apply( + actor, + context, + // Acrobatics and Athletics are master skills + new SkillAdjuster({ + setSkillAsMonsterSkill: [ + [Skill.acrobatics, Skill.athletics], + MonsterSkillType.master + ] + }), + // Culture is a good skill + new SkillAdjuster({ + setSkillAsMonsterSkill: [ + [Skill.culture], + MonsterSkillType.good + ] + }) + ) + + logEntries.push([ + "Applied kasatha subtype graft. Added acrobatics and atheletics as a master skill, culture as a good skill.", + Grafts.creatureSubtype.kasatha.description + ]) + } else if (graft === Grafts.creatureSubtype.lashunta) { + // Languages + actorUpdate["data.traits.languages.custom"] = + "limited telepathy 30 ft." + // Innate spells + let detectThoughts = await Utils.fuzzyFindSpellAsync( + "detect thoughts" + ) + let daze = await Utils.fuzzyFindSpellAsync("daze") + let psychokineticHand = await Utils.fuzzyFindSpellAsync( + "psychokinetic hand" + ) + addOncePerDayInnateSpell(detectThoughts) + addAtWillInnateSpell(daze) + addAtWillInnateSpell(psychokineticHand) + + logEntries.push([ + "Applied lashunta subtype graft. Added limited telepathy 30 ft., detect thoughts as a once per day innate spell and added daze and psychokinetic hand as innate spells.", + Grafts.creatureSubtype.lashunta.description + ]) + } else if (graft === Grafts.creatureSubtype.shirren) { + await apply( + actor, + context, + //Senses + new SenseAdjuster({ + addSense: "blindsense (vibration) 30 ft." + }), + // Culture and Diplomacy as good skills + new SkillAdjuster({ + setSkillAsMonsterSkill: [ + [Skill.culture, Skill.diplomacy], + MonsterSkillType.good + ] + }) + ) + + // Languages + actorUpdate["data.traits.languages.custom"] = + "limited telepathy 30 ft." + + logEntries.push([ + "Applied shirren subtype graft. Added blindsense (vibration) 30 ft., limited telepathy 30 ft., culture and diplomacy as good skills.", + Grafts.creatureSubtype.shirren.description + ]) + } else if (graft === Grafts.creatureSubtype.skittermander) { + //Senses + await apply(actor, context, SharedAdjusters.Senses.lowLightVision) + + logEntries.push([ + "Applied skittermander subtype graft. Added low-light vision.", + Grafts.creatureSubtype.skittermander.description + ]) + } else if (graft === Grafts.creatureSubtype.technological) { + // No modifications + logEntries.push([ + "Applied technological subtype graft (no modifications).", + Grafts.creatureSubtype.technological.description + ]) + } else if (graft === Grafts.creatureSubtype.vesk) { + await apply( + actor, + context, + //Senses + SharedAdjusters.Senses.lowLightVision + ) + + // Natural weapons + context.naturalWeapons.enabled = true + context.naturalWeapons.racial = true + + logEntries.push([ + "Applied vesk subtype graft. Added low-light vision and natural weapons.", + Grafts.creatureSubtype.vesk.description + ]) + } else if (graft === Grafts.creatureSubtype.ysoki) { + await apply( + actor, + context, + //Senses + SharedAdjusters.Senses.darkVision60ft, + // Skills (Engineering and stealth as master skills) + new SkillAdjuster({ + setSkillAsMonsterSkill: [ + [Skill.engineering, Skill.stealth], + MonsterSkillType.master + ] + }), + // Survival as good skill + new SkillAdjuster({ + setSkillAsMonsterSkill: [ + Skill.survival, + MonsterSkillType.good + ] + }) + ) + + logEntries.push([ + "Applied ysoki subtype graft. Added darkvision 60 ft., added engineering and stealth as master skills and added survival as a good skill.", + Grafts.creatureSubtype.ysoki.description + ]) + } + + // Append subtype graft to graft list + actorUpdate["data.details.raceAndGrafts"] = + actor.data.data.details.raceAndGrafts + ", " + graft.name + + // Update actor + await actor.update(actorUpdate) + + // Update log + context.log.push(...logEntries) + } + + private static async applyUniversalCreatureRule( + actor, + context: NPCCreationContext, + universalCreatureRule: UniversalCreatureRule + ) { + if (universalCreatureRule == UniversalCreatureRules.mindless) { + await apply( + actor, + context, + // Immunities + SharedAdjusters.Immunities.mindAffectingEffects, + // Skills - set 0 master skills + new SkillAdjuster({ + setMonsterSkillCount: [MonsterSkillType.master, 0] + }), + // Reduce good skills by 1 + new SkillAdjuster({ + mutateMonsterSkill: [MonsterSkillType.good, -1] + }), + // No intelligence + // TODO: This has a chance of overwriting one of the randomly boosted ability scores, we should reassign the overwritten value to another stat + new AbilityScoreAdjuster({ + setAbilityScore: [AbilityScore.intelligence, 0] + }) + ) + + // Update log + context.log.push([ + "Applied mindless universal creature rule. Reduced good skills by 1, reduced master skills to 0, added mind-affecting effects to condition immunities.", + UniversalCreatureRules.mindless.description + ]) + } else if (universalCreatureRule == UniversalCreatureRules.sightless) { + // Uses default implementation + // TODO: Reumove one all UCR can depend on default/subclass implementation + let output = await universalCreatureRule.apply(actor, context) + context.log.push(output) + } else if (universalCreatureRule == UniversalCreatureRules.unliving) { + await apply( + actor, + context, + // No constitution + // TODO: This has a chance of overwriting one of the randomly boosted ability scores, we should reassign the overwritten value to another stat + // TODO: Should support `-` in the future but not yet supported by SFRPG + new AbilityScoreAdjuster({ + setAbilityScore: [AbilityScore.constituion, 0] + }) + ) + + // Update log + context.log.push([ + "Applied unliving universal creature rule, set constitution to `-` .", + UniversalCreatureRules.unliving.description + ]) + } + } + + private static async applyAdjustmentSpecialAbility( + actor, + context: NPCCreationContext, + adjustmentSpecialAbility + ) { + let logEntries: [string, string][] = [] + let actorUpdate = {} + + // Brute - Use the low attack value for the NPC’s main attack, but determine the attack’s damage as if the NPC’s CR were 2 higher (adding the extra damage from weapon specialization). This special ability has a greater impact at higher CRs. + if ( + adjustmentSpecialAbility === + MonsterCreation.specialAbilities.adjustment.brute + ) { + context.attackArrayRow.high = context.attackArrayRow.low + + // Get attack rows higher + let indexOfCR = CR.indexOf(context.CR) + let indexOfCRPlus2 = indexOfCR + 2 + let CRPlus2 = CR[indexOfCRPlus2] + + var monsterReferenceSymbol = + MonsterReferenceSymbol[context.monsterReferenceSymbol] + let attackArrayRowPlus2 = + MonsterCreation.arrays[monsterReferenceSymbol].attack[CRPlus2] + + // Buff all damage by 2 CRs + context.attackArrayRow.kinetic = attackArrayRowPlus2.kinetic + context.attackArrayRow.energy = attackArrayRowPlus2.energy + context.attackArrayRow.standard = attackArrayRowPlus2.standard + + logEntries.push([ + "Applied brute adjustment special ability. Set high attack bonus value to low attack bonus, increased damage by 2 rows in the array.", + MonsterCreation.specialAbilities.adjustment.brute.description + ]) + } + //Increase all saving throw bonuses by 1 or one saving throw bonus by 3. + else if ( + adjustmentSpecialAbility === + MonsterCreation.specialAbilities.adjustment.saveBoost + ) { + // Will we increase all 3 by 1 or 1 by 3 + var randomChoice = Math.random() < 0.5 + if (randomChoice) { + // Applies a +1 to all saves + apply( + actor, + context, + new SaveAdjuster({ mutateSave: [Save.reflex, 1] }), + new SaveAdjuster({ mutateSave: [Save.willpower, 1] }), + new SaveAdjuster({ mutateSave: [Save.fortitude, 1] }) + ) + + logEntries.push([ + "Applied save boost adjustment special ability. +1 to all saves (chose this option at random).", + MonsterCreation.specialAbilities.adjustment.saveBoost + .description + ]) + } else { + // Apply +3 to one save + let saves = [Save.reflex, Save.willpower, Save.fortitude] + Utils.shuffleArray(saves) + + await new SaveAdjuster({ mutateSave: [saves[0], 3] }).apply( + actor, + context + ) + + logEntries.push([ + "Applied save boost adjustment special ability. +3 to " + + saves[0] + + " save (chose this option at random).", + MonsterCreation.specialAbilities.adjustment.saveBoost + .description + ]) + } + } + // Increase all master and good skill bonuses by 1 + else if ( + adjustmentSpecialAbility === + MonsterCreation.specialAbilities.adjustment.skillful + ) { + context.mainArrayRow.masterSkill.mod += 1 + context.mainArrayRow.goodSkill.mod += 1 + + logEntries.push([ + "Applied skillful adjustment special ability. +1 to all master and good skills.", + MonsterCreation.specialAbilities.adjustment.skillful.description + ]) + } + //Increase the NPC’s HP by 20% + else if ( + adjustmentSpecialAbility === + MonsterCreation.specialAbilities.adjustment.extraHitPoints + ) { + context.mainArrayRow.HP = Math.floor(context.mainArrayRow.HP * 1.2) + + logEntries.push([ + "Applied extra hit points adjustment special ability. Added 20% more HP.", + MonsterCreation.specialAbilities.adjustment.extraHitPoints + .description + ]) + } + + // Update actor + await actor.update(actorUpdate) + + // Log + context.log.push(...logEntries) + } + + private static async clean(item) { + if (item["_id"]) { + item["sourceId"] = item["_id"] + delete item["_id"] + } + } +} diff --git a/src/factories/WeaponFactory.ts b/src/factories/WeaponFactory.ts new file mode 100644 index 0000000..e01669c --- /dev/null +++ b/src/factories/WeaponFactory.ts @@ -0,0 +1,54 @@ +import { Utils } from "../utils/Uils.js" +import { + naturalWeaponsTemplate, + unarmedStrikeTemplate +} from "../data/Weapons.js" + +export class WeaponFactory { + public static makeUnarmedStrike() { + return unarmedStrikeTemplate + } + + public static makeNaturalWeapons() { + return naturalWeaponsTemplate + } + + // Generates a CR appropriate laser pistol + public static async makeLaserPistol( + forCR: string + ): Promise