Ajout de la commande /voyage et grosse MAJK de la commande /auberge
This commit is contained in:
@@ -1,2 +0,0 @@
|
|||||||
let item = await fromUuid("Compendium.wfrp4e-core.items.weczkAMPlTjX7lqU")
|
|
||||||
this.actor.createEmbeddedDocuments("Item", [item])
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
return args.item?.system?.isRanged && args.data.targets[0]?.actor?.sizeNum < 3
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
// The imbiber immediately
|
|
||||||
// takes 3 Poisoned Conditions that cannot be resisted at first,
|
|
||||||
await this.actor.addCondition("poisoned", 3)
|
|
||||||
|
|
||||||
// recovers a number of Wounds equal to their Toughness Bonus,
|
|
||||||
await this.actor.modifyWounds(this.actor.system.characteristics.t.bonus)
|
|
||||||
|
|
||||||
// and acquires the Regenerate Creature Trait.
|
|
||||||
const hasRegenerate = this.actor.has("Regenerate")
|
|
||||||
if (hasRegenerate === undefined) {
|
|
||||||
fromUuid("Compendium.wfrp4e-core.items.SfUUdOGjdYpr3KSR").then(trait => {
|
|
||||||
let traitItem = trait.toObject()
|
|
||||||
this.actor.createEmbeddedDocuments("Item", [traitItem], {fromEffect: this.effect.id})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
this.script.scriptMessage(`<p><strong>${this.actor.prototypeToken.name}</strong> has
|
|
||||||
<ul>
|
|
||||||
<li>gained 3 Poisoned Conditions that cannot be resisted at first</li>
|
|
||||||
<li>recovered ${this.actor.system.characteristics.t.bonus} Wounds</li>
|
|
||||||
<li>acquired the Regenerate Creature Trait.</li>
|
|
||||||
</ul>
|
|
||||||
It’s up to Ranald if their regenerating can outpace their poisoning.</p>
|
|
||||||
<p>When all Poisoned Conditions are lost, so too is Regenerate.</p>`,
|
|
||||||
{ whisper: ChatMessage.getWhisperRecipients("GM"), blind: true })
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
this.actor.addCondition("blinded", 3)
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
let item = await fromUuid("Compendium.wfrp4e-core.items.8piWcBKFlQ2J1E3A")
|
|
||||||
let data = item.toObject();
|
|
||||||
data.system.location.key= this.item.system.location.key
|
|
||||||
this.actor.createEmbeddedDocuments("Item", [data])
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
if (!args.flags.quietenedApplied)
|
|
||||||
{
|
|
||||||
args.fields.modifier += 10;
|
|
||||||
args.flags.quietenedApplied = true
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
return !args.options.terror && !args.extendedTest?.flags.wfrp4e?.fear
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
return !args.skill?.name.includes(game.i18n.localize("NAME.Row")) && !args.skill?.name.includes(game.i18n.localize("NAME.Sail"));
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
let spells = await warhammer.utility.findAllItems("spell", "Loading Spells")
|
|
||||||
|
|
||||||
let text = (await game.wfrp4e.tables.rollTable("random-caster", {hideDSN: true})).result
|
|
||||||
|
|
||||||
lore = Array.from(text.matchAll(/{(.+?)}/gm))[0][1]
|
|
||||||
|
|
||||||
if (text == "GM's Choice")
|
|
||||||
{
|
|
||||||
return this.script.scriptNotification(text)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (spellsWithLore.length > 0)
|
|
||||||
{
|
|
||||||
let spellsWithLore = spells.filter(i => game.wfrp4e.config.magicLores[i.system.lore.value] == lore)
|
|
||||||
let selectedSpell = spellsWithLore[Math.floor(CONFIG.Dice.randomUniform() * spellsWithLore.length)]
|
|
||||||
this.script.scriptNotification(selectedSpell.name);
|
|
||||||
this.actor.createEmbeddedDocuments("Item", [selectedSpell])
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ui.notifications.notify(`Could not find ${lore} spell. Try Again`)
|
|
||||||
}
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
let item = await fromUuid("Compendium.wfrp4e-core.items.4CMKeDTDrRQZbPIJ")
|
|
||||||
let fixation = (await game.wfrp4e.tables.rollTable("fixations"))
|
|
||||||
let data = item.toObject();
|
|
||||||
data.system.specification.value = fixation.result;
|
|
||||||
this.item.updateSource({name : this.item.name += ` (${fixation.result})`});
|
|
||||||
this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id})
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
return !["t", "wp"].includes(args.characteristic)
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
let table = game.wfrp4e.tables.findTable("mutatephys");
|
|
||||||
if (!table)
|
|
||||||
{
|
|
||||||
return ui.notifications.error("Mutation table not found, please ensure a table with the `mutatephys` key is imported in the world.")
|
|
||||||
}
|
|
||||||
let result = (await table.roll()).results[0];
|
|
||||||
let uuid = `Compendium.${result.documentCollection}.${result.documentId}`
|
|
||||||
let item = await fromUuid(uuid);
|
|
||||||
|
|
||||||
if (item)
|
|
||||||
{
|
|
||||||
this.script.scriptNotification(`${item.name} added`)
|
|
||||||
this.actor.createEmbeddedDocuments("Item", [item])
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ui.notifications.error("Item could not be found: " + uuid)
|
|
||||||
}
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
let location = this.item.system.location.key;
|
|
||||||
|
|
||||||
if (location)
|
|
||||||
{
|
|
||||||
let dropped = this.item.system.weaponsAtLocation;
|
|
||||||
|
|
||||||
if (dropped.length)
|
|
||||||
{
|
|
||||||
this.script.scriptNotification(`Dropped ${dropped.map(i => i.name).join(", ")}!`)
|
|
||||||
for(let weapon of dropped)
|
|
||||||
{
|
|
||||||
await weapon.system.toggleEquip();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let roll = await new Roll("max(1, 1d10 - @system.characteristics.t.bonus)", this.actor).roll()
|
|
||||||
|
|
||||||
roll.toMessage(this.script.getChatData({flavor : `${this.effect.name} (Duration)`}));
|
|
||||||
|
|
||||||
this.effect.updateSource({"duration.rounds" : roll.total})
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
if (args.skill?.name != game.i18n.localize("NAME.Gossip"))
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
args.data.canReverse = true; // Kind of a kludge here, the talent Tests has a specific condition, but the description simply says "any gossip test can be reversed" so check it here instead of submission
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
if (args.applyAP && args.modifiers.ap.metal)
|
|
||||||
{
|
|
||||||
args.modifiers.ap.ignored += args.modifiers.ap.metal
|
|
||||||
args.modifiers.ap.details.push("<strong>" + this.effect.name + "</strong>: Ignore Metal (" + args.modifiers.ap.metal + ")");
|
|
||||||
args.modifiers.ap.metal = 0
|
|
||||||
}
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
let item = await fromUuid("Compendium.wfrp4e-core.items.GbDyBCu8ZjDp6dkj")
|
|
||||||
let data = item.toObject();
|
|
||||||
this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id})
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
let item1 = await fromUuid("Compendium.wfrp4e-core.items.3S4OYOZLauXctmev")
|
|
||||||
let item2 = await fromUuid("Compendium.wfrp4e-core.items.7mCcI3q7hgWcmbBU")
|
|
||||||
|
|
||||||
let data1 = item1.toObject();
|
|
||||||
data1.system.location.key = this.item.system.location.key
|
|
||||||
|
|
||||||
let data2 = item2.toObject();
|
|
||||||
data2.system.location.key = this.item.system.location.key
|
|
||||||
|
|
||||||
this.actor.createEmbeddedDocuments("Item", [data1, data2], {fromEffect: this.effect.id})
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
args.fields.modifier -= 20;
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`}).then(async test => {
|
|
||||||
await test.roll()
|
|
||||||
if (test.failed)
|
|
||||||
{
|
|
||||||
this.actor.addCondition("stunned")
|
|
||||||
}
|
|
||||||
})
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
if (!args.flags.strikeToStun)
|
|
||||||
{
|
|
||||||
args.flags.strikeToStun = true
|
|
||||||
args.fields.modifier += 20;
|
|
||||||
args.fields.hitLocation = "head";
|
|
||||||
}
|
|
||||||
args.fields.successBonus++;
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
return args.options.terror || args.extendedTest?.flags.wfrp4e?.fear
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
let type = this.item.getFlag("wfrp4e", "breath");
|
|
||||||
|
|
||||||
if (["fire", "electricity", "poison"].includes(type))
|
|
||||||
{
|
|
||||||
args.applyAP = false;
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
args.fields.modifier -= 20
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
let state = !this.effect.disabled;
|
|
||||||
this.effect.update({"disabled": state});
|
|
||||||
|
|
||||||
if (state)
|
|
||||||
return ui.notifications.info("EFFECT.CreatureBackInWater", {localize: true})
|
|
||||||
|
|
||||||
return ui.notifications.info("EFFECT.CreatureOutOfWater", {localize: true});
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
if (!this.item.name.includes("(") || this.item.system.tests.value.includes("Terrain"))
|
|
||||||
{
|
|
||||||
let tests = this.item.system.tests.value
|
|
||||||
let name = this.item.name
|
|
||||||
|
|
||||||
// If name already specifies, make sure tests value reflects that
|
|
||||||
if (name.includes("("))
|
|
||||||
{
|
|
||||||
let terrain = name.split("(")[1].split(")")[0]
|
|
||||||
tests = tests.replace("the Terrain", terrain)
|
|
||||||
}
|
|
||||||
else // If no sense specified, provide dialog choice
|
|
||||||
{
|
|
||||||
let choice = await ItemDialog.create(ItemDialog.objectToArray({
|
|
||||||
coastal : "Coastal",
|
|
||||||
deserts : "Deserts",
|
|
||||||
marshes : "Marshes",
|
|
||||||
rocky : "Rocky",
|
|
||||||
tundra : "Tundra",
|
|
||||||
woodlands : "Woodlands"
|
|
||||||
}, this.item.img), 1, "Choose Terrain");
|
|
||||||
if (choice[0])
|
|
||||||
{
|
|
||||||
name = `${name.split("(")[0].trim()} (${choice[0].name})`
|
|
||||||
tests = tests.replace("the Terrain", choice[0].name + " Terrain")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.effect.updateSource({name})
|
|
||||||
this.item.updateSource({name, "system.tests.value" : tests})
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
return !args.skill?.name.includes(game.i18n.localize("NAME.Language"));
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
let characteristics = {
|
|
||||||
"ws" : 5,
|
|
||||||
"bs" : 5,
|
|
||||||
"s" : 5,
|
|
||||||
"t" : 0,
|
|
||||||
"i" : 5,
|
|
||||||
"ag" : 5,
|
|
||||||
"dex" : 5,
|
|
||||||
"int" : 0,
|
|
||||||
"wp" : 5,
|
|
||||||
"fel" : 5
|
|
||||||
}
|
|
||||||
let items = []
|
|
||||||
|
|
||||||
let updateObj = this.actor.toObject();
|
|
||||||
|
|
||||||
let talents = (await Promise.all([game.wfrp4e.tables.rollTable("talents"), game.wfrp4e.tables.rollTable("talents"), game.wfrp4e.tables.rollTable("talents")])).map(i => i.text)
|
|
||||||
|
|
||||||
for (let ch in characteristics)
|
|
||||||
{
|
|
||||||
updateObj.system.characteristics[ch].modifier += characteristics[ch];
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let talent of talents)
|
|
||||||
{
|
|
||||||
let talentItem = await game.wfrp4e.utility.findTalent(talent)
|
|
||||||
if (talentItem)
|
|
||||||
{
|
|
||||||
items.push(talentItem.toObject());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ui.notifications.warn(`Could not find ${talent}`, {permanent : true})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
await this.actor.update(updateObj)
|
|
||||||
this.actor.createEmbeddedDocuments("Item", items);
|
|
||||||
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
return args.characteristic != "t"
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
args.actor.details.move.run += 4
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
await this.actor.addCondition("ablaze", 2)
|
|
||||||
await this.script.scriptMessage(await this.actor.applyBasicDamage(this.effect.sourceTest.result.damage, {suppressMsg: true}))
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
return args.skill?.name.includes(game.i18n.localize("NAME.Channelling")) || args.skill?.name == `${game.i18n.localize("NAME.Language")} (${game.i18n.localize("SPEC.Magick")})`
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
return args.characteristic != "wp"
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
let test = await this.actor.setupCharacteristic("wp", {skipTargets: true, appendTitle : ` ${this.effect.name}`})
|
|
||||||
await test.roll()
|
|
||||||
if (test.succeeded)
|
|
||||||
{
|
|
||||||
this.effect.delete();
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
args.options.cardsharp = true;
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
if (args.opposedTest.result.hitloc.value == this.item.system.location.key && args.totalWoundLoss > 0)
|
|
||||||
{
|
|
||||||
args.actor.addCondition("bleeding", 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
return ["ws", "bs", "s", "ag", "t", "dex"].includes(args.characteristic)
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
let test = await args.actor.setupCharacteristic("wp", {skipTargets: true, appendTitle : " - " + this.effect.name, context : {failure: "Gained a Stunned Condition"}})
|
|
||||||
await test.roll();
|
|
||||||
if (test.failed)
|
|
||||||
{
|
|
||||||
args.actor.addCondition("stunned")
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
this.actor.status.addArmour(1, {source: this.effect, magical : true})
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
this.script.scriptNotification(`Cannot enter ${this.effect.name}!`);
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
let healed = parseInt(this.effect.sourceTest.result.SL)
|
|
||||||
this.actor.modifyWounds(healed)
|
|
||||||
this.script.scriptMessage(`Healed ${healed} Wounds`)
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
let damage = this.effect.sourceActor.hasCondition("fatigued") ? 6 : 10;
|
|
||||||
|
|
||||||
let loc = "body"
|
|
||||||
|
|
||||||
let APatLoc = this.actor.system.status.armour[loc];
|
|
||||||
|
|
||||||
let metalAP = APatLoc.layers.reduce((metal, layer) => metal += ((layer.metal && !layer.magical) ? layer.value : 0), 0)
|
|
||||||
|
|
||||||
let APused = Math.max(0, APatLoc.value - metalAP); // remove metal AP at location;
|
|
||||||
|
|
||||||
damage -= (APused + this.actor.system.characteristics.t.bonus)
|
|
||||||
|
|
||||||
let msg = await this.actor.applyBasicDamage(damage, {suppressMsg : true, damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL});
|
|
||||||
msg += ` (ignored ${metalAP} metal AP on ${game.wfrp4e.config.locations[loc]})`
|
|
||||||
this.script.scriptMessage(msg)
|
|
||||||
|
|
||||||
let test = await this.actor.setupSkill("Endurance", {fields : {difficulty : "difficult"}, appendTitle : ` - ${this.effect.name}`});
|
|
||||||
await test.roll();
|
|
||||||
if (test.failed)
|
|
||||||
this.actor.addCondition("stunned");
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : " - " + this.effect.name})
|
|
||||||
await test.roll();
|
|
||||||
if (!test.succeeded)
|
|
||||||
{
|
|
||||||
let item = await fromUuid("Compendium.wfrp4e-core.items.ZhMADOqoo0y8Q9bx")
|
|
||||||
let data = item.toObject();
|
|
||||||
if (this.item.system.location.key == "rLeg")
|
|
||||||
{
|
|
||||||
data.system.location.value = "Right Toe"
|
|
||||||
data.system.location.key = "rToe";
|
|
||||||
}
|
|
||||||
else if (this.item.system.location.key == "lLeg")
|
|
||||||
{
|
|
||||||
data.system.location.value = "Left Toe"
|
|
||||||
data.system.location.key = "lToe";
|
|
||||||
}
|
|
||||||
this.actor.createEmbeddedDocuments("Item", [data])
|
|
||||||
}
|
|
||||||
this.effect.delete();
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
args.options.ballockKnife = true;
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`}).then(async test => {
|
|
||||||
await test.roll();
|
|
||||||
if (test.failed)
|
|
||||||
{
|
|
||||||
this.actor.addCondition("stunned", 3)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
if (args.effect.conditionId == "bleeding")
|
|
||||||
args.data.damage -= 1
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
return !args.skill?.name?.includes(game.i18n.localize("NAME.Sail"))
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
let choice = await ItemDialog.create(ItemDialog.objectToArray(game.wfrp4e.config.locations), 1, "Choose Location");
|
|
||||||
|
|
||||||
let location = choice[0].id;
|
|
||||||
|
|
||||||
let itemTargeted = this.actor.items.get(this.effect.getFlag("wfrp4e", "itemTargets")[0])
|
|
||||||
|
|
||||||
if (itemTargeted)
|
|
||||||
{
|
|
||||||
itemTargeted.update({[`system.APdamage.${location}`] : itemTargeted.system.APdamage[location] + 1})
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
return args.options.reload
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
return args.type != "channelling" && !args.skill?.name.includes(game.i18n.localize("NAME.Channelling"))
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
if (args.item.range && args.item.range.bands)
|
|
||||||
{
|
|
||||||
args.item.range.bands[game.i18n.localize("Long Range")].modifier = 0
|
|
||||||
args.item.range.bands[game.i18n.localize("Extreme")].modifier /= 2
|
|
||||||
}
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
let item = await fromUuid("Compendium.wfrp4e-core.items.eWPN3CV2Eddwz8aM")
|
|
||||||
let data = item.toObject();
|
|
||||||
data.system.location.value = "Back"
|
|
||||||
this.actor.createEmbeddedDocuments("Item", [data], {fromEffect: this.effect.id})
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
game.wfrp4e.utility.postCorruptionTest(this.item.system.specification.value, {speaker : {alias: this.actor.prototypeToken.name}})
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
return args.skill?.name == game.i18n.localize("NAME.Bribery") || args.skill?.name.includes(game.i18n.localize("NAME.Stealth"));
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
return args.item?.system.attackType
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
return !["fel"].includes(args.characteristic)
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
return args.item?.name != game.i18n.localize("NAME.Navigation")
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
args.fields.slBonus += this.actor.system.characteristics.wp.bonus
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
if (isNaN(parseInt(this.item.system.specification.value)))
|
|
||||||
{
|
|
||||||
let value = await ValueDialog.create("Enter Armour value", this.effect.name);
|
|
||||||
if (value)
|
|
||||||
{
|
|
||||||
this.item.updateSource({"system.specification.value" : value});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
if (!["rLeg", "lLeg"].includes(this.effect.getFlag("wfrp4e", "location")))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
if (args.options.dodge)
|
|
||||||
{
|
|
||||||
args.abort = true;
|
|
||||||
this.script.scriptNotification("Cannot Dodge!")
|
|
||||||
}
|
|
||||||
return ["t", "int", "wp", "fel"].includes(args.characteristic)
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
if (args.totalWoundLoss > 0)
|
|
||||||
{
|
|
||||||
let test = await args.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`})
|
|
||||||
await test.roll();
|
|
||||||
if (test.failed && parseInt(args.opposedTest.attackerTest.result.SL) > 0)
|
|
||||||
{
|
|
||||||
args.actor.addCondition("stunned", parseInt(args.opposedTest.attackerTest.result.SL))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
let skill = `Trade (${this.item.parenthesesText})`
|
|
||||||
let currentCareer = this.actor.system.currentCareer;
|
|
||||||
let existingSkill = this.actor.itemTypes.skill.find(i => i.name == skill);
|
|
||||||
|
|
||||||
if (!currentCareer) return
|
|
||||||
|
|
||||||
|
|
||||||
let inCurrentCareer = currentCareer.system.skills.includes(skill);
|
|
||||||
let craftsmanAdded = this.actor.getFlag("wfrp4e", "craftsmanAdded") || {};
|
|
||||||
if (existingSkill && inCurrentCareer && !craftsmanAdded[existingSkill.name])
|
|
||||||
{
|
|
||||||
existingSkill.system.advances.costModifier = -5;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
craftsmanAdded[skill] = true;
|
|
||||||
currentCareer.system.skills.push(skill);
|
|
||||||
setProperty(this.actor, "flags.wfrp4e.craftsmanAdded", craftsmanAdded)
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
if (args.weapon && this.item.system.usesLocation(args.weapon))
|
|
||||||
{
|
|
||||||
args.bleedingHand = true;
|
|
||||||
let success = await this.effect.manualScripts[0].execute({actor: this.actor})
|
|
||||||
if (!success)
|
|
||||||
{
|
|
||||||
args.abort = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
let item = await fromUuid("Compendium.wfrp4e-core.items.9h82z72XGo9tfgQS")
|
|
||||||
let data = item.toObject();
|
|
||||||
data.name = data.name += " (Hearing)"
|
|
||||||
this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id})
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
if (this.item.system.quantity.value)
|
|
||||||
{
|
|
||||||
this.item.update({"system.quantity.value" : this.item.system.quantity.value - 0.25})
|
|
||||||
let actor = Array.from(game.user.targets)[0]?.actor || this.actor;
|
|
||||||
actor.applyEffect({effectData : [this.item.effects.contents[1].convertToApplied()]})
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
this.script.scriptNotification("None left!", "error")
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
return args.skill?.name.includes(game.i18n.localize("NAME.Lore"));
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
if (args.test.isFumble)
|
|
||||||
{
|
|
||||||
args.test.result.other.push("@Table[doomrocket-fumble]")
|
|
||||||
}
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
let item = await fromUuid("Compendium.wfrp4e-core.items.qn4ZpvTQIX4rcJDl");
|
|
||||||
let data = item.toObject();
|
|
||||||
data.system.location.key = this.item.system.location.key
|
|
||||||
this.actor.createEmbeddedDocuments("Item", [data], {fromEffect: this.effect.id})
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
args.prefillModifiers.difficulty = "hard"
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
if (args.opposedTest.result.winner == "attacker") {
|
|
||||||
if (args.opposedTest.defenderTest.weapon && args.opposedTest.defenderTest.item.properties.qualities.shield) {
|
|
||||||
ui.notifications.notify(`<b>${this.effect.name}</b>: Gained ${this.item.Advances} Advantage`)
|
|
||||||
this.actor.setAdvantage(this.item.Advances)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
|
|
||||||
|
|
||||||
if (!["Goblin", "Orc"].includes(this.actor.system.details.species.value)) {
|
|
||||||
let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), { appendTitle: ` - ${this.effect.name}` })
|
|
||||||
await test.roll();
|
|
||||||
if (test.failed) {
|
|
||||||
let infection = await fromUuid("Compendium.wfrp4e-core.items.Item.1hQuVFZt9QnnbWzg")
|
|
||||||
this.actor.createEmbeddedDocuments("Item", [infection])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Since wounds change when the effect is deleted, need to wait until after
|
|
||||||
// the max wounds have been recalculated to apply damage
|
|
||||||
game.wfrp4e.utility.sleep(1000).then(async () => {
|
|
||||||
let roll = await new Roll("1d10").roll();
|
|
||||||
|
|
||||||
roll.toMessage(this.script.getChatData());
|
|
||||||
this.script.scriptMessage(await this.actor.applyBasicDamage(roll.total, { damageType: game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL, suppressMsg: true }))
|
|
||||||
|
|
||||||
})
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
let currentCareer = this.actor.system.currentCareer;
|
|
||||||
if (!currentCareer)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let talents = ["Aethyric Attunement",
|
|
||||||
"Arcane Magic (Any)",
|
|
||||||
"Chaos Magic (Tzeentch)",
|
|
||||||
"Fast Hands",
|
|
||||||
"Instinctive Diction",
|
|
||||||
"Magical Sense",
|
|
||||||
"Petty Magic",
|
|
||||||
"Second Sight",
|
|
||||||
"War Wizard",
|
|
||||||
"Witch!"].filter(t => !currentCareer.system.talents.includes(t))
|
|
||||||
|
|
||||||
currentCareer.system.talents = currentCareer.system.talents.concat(talents)
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
let item = await fromUuid("Compendium.wfrp4e-core.items.9GNpAqgsKzxZKJpp")
|
|
||||||
let data = item.toObject();
|
|
||||||
this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id})
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
args.data.canReverse = true;
|
|
||||||
args.options.fieldDressing = true;
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
let wounds = this.actor.system.status.wounds
|
|
||||||
if (wounds.value == 0)
|
|
||||||
return this.script.scriptNotification("No effect at 0 Wounds", "error")
|
|
||||||
|
|
||||||
this.script.scriptNotification(`Healed ${this.actor.characteristics.t.bonus} Wounds`)
|
|
||||||
await this.actor.modifyWounds(this.actor.characteristics.t.bonus)
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
if (args.item.type == "spell")
|
|
||||||
{
|
|
||||||
args.item.cn.value = Math.floor(args.item.cn.value / 2)
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
return !args.options.handling
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
this.script.scriptMessage(await this.actor.applyBasicDamage(8, {damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_AP, suppressMsg: true}))
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
args.actor.system.details.move.value += 2;
|
|
||||||
args.actor.system.status.carries.max = Math.floor(args.actor.system.status.carries.max * 0.5);
|
|
||||||
args.actor.system.details.price.gc *= 1.1;
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
args.fields.successBonus += 1;
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
if (args.test.options.cardsharp && args.test.succeeded)
|
|
||||||
{
|
|
||||||
|
|
||||||
let SL = Math.floor(args.test.target / 10) - Math.floor(args.test.result.roll / 10)
|
|
||||||
let ones = Number(args.test.result.roll.toString().split("").pop())
|
|
||||||
|
|
||||||
if (ones > SL)
|
|
||||||
args.test.result.other.push(`<span class="hide-option"><b>${this.effect.name}</b>: ${ones + args.test.successBonus + args.test.slBonus} SL</span>`)
|
|
||||||
}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
let fatigue = this.actor.hasCondition("fatigued")
|
|
||||||
if (fatigue)
|
|
||||||
{
|
|
||||||
this.script.scriptNotification("Removing Fatigued Condition, disabled effect")
|
|
||||||
this.effect.update({disabled : true})
|
|
||||||
await this.actor.removeCondition("fatigued")
|
|
||||||
}
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
let choice = await ItemDialog.create(ItemDialog.objectToArray(game.wfrp4e.config.locations, this.effect.img), 1, "Choose Location");
|
|
||||||
if (choice[0])
|
|
||||||
{
|
|
||||||
this.effect.updateSource({name : `${this.effect.name} (${choice[0].name})`})
|
|
||||||
this.effect.updateSource({"flags.wfrp4e.location" : choice[0].id})
|
|
||||||
}
|
|
||||||
|
|
||||||
let location = choice[0].id;
|
|
||||||
|
|
||||||
if (["lArm", "rArm"].includes(location))
|
|
||||||
{
|
|
||||||
let dropped = this.actor.itemTypes.weapon.filter(i => i.isEquipped & i.system.usesHands.includes(location));
|
|
||||||
|
|
||||||
if (dropped.length)
|
|
||||||
{
|
|
||||||
this.script.scriptNotification(`Dropped ${dropped.map(i => i.name).join(", ")}!`)
|
|
||||||
for(let weapon of dropped)
|
|
||||||
{
|
|
||||||
await weapon.system.toggleEquip();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (location == "body")
|
|
||||||
{
|
|
||||||
await this.actor.addCondition("fatigued");
|
|
||||||
test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {fields : {difficulty : "hard"}, skipTargets: true, appendTitle : ` - ${this.effect.name}`})
|
|
||||||
await test.roll();
|
|
||||||
if (test.failed)
|
|
||||||
{
|
|
||||||
this.actor.addCondition("prone");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (location == "head")
|
|
||||||
{
|
|
||||||
await this.actor.addCondition("stunned");
|
|
||||||
test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {fields : {difficulty : "average"}, skipTargets: true, appendTitle : ` - ${this.effect.name}`})
|
|
||||||
await test.roll();
|
|
||||||
if (test.failed)
|
|
||||||
{
|
|
||||||
this.actor.addCondition("unconscious");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
return !args.skill?.name.includes(game.i18n.localize("NAME.Language"));
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
let item = await fromUuid("Compendium.wfrp4e-core.items.IPKRMGry6WotuS1G")
|
|
||||||
let data = item.toObject();
|
|
||||||
this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id})
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
let modifier = this.effect.sourceTest?.result.overcast.usage.other.current || 0
|
|
||||||
|
|
||||||
let test = await this.actor.setupCharacteristic("dex", {fields: {modifier}, skipTargets: true, appendTitle : " - " + this.script.label});
|
|
||||||
|
|
||||||
test.roll();
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
if (args.item.type == "weapon" || args.item.type == "trait")
|
|
||||||
{
|
|
||||||
args.item.qualities.value.push({name : "penetrating"})
|
|
||||||
args.item.qualities.value.push({name : "impale"})
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
this.effect.manualScripts[0].execute({actor : this.actor});
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
return args.options.mutate
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
args.fields.slBonus += this.actor.characteristics.ag.bonus;
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
return args.skill?.name != game.i18n.localize("NAME.CharmAnimal") && !args.skill?.name.includes(game.i18n.localize("NAME.AnimalTraining"));
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
args.options.useOnesAttractive = true;
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
this.script.scriptMessage(await this.actor.applyBasicDamage(Math.ceil(CONFIG.Dice.randomUniform() * 10) + 6, {damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_AP, suppressMsg : true}))
|
|
||||||
this.actor.addCondition("ablaze");
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
this.actor.addCondition("blinded", 3);
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
return !["NAME.Evaluate", "NAME.Gamble"].map(i => game.i18n.localize(i)).includes(args.skill?.name)
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
if (this.actor.hasCondition("surprised"))
|
|
||||||
{
|
|
||||||
this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {fields : {difficulty : "average"}, skipTargets: true, appendTitle : " - " + this.effect.name}).then(test => test.roll())
|
|
||||||
}
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
await args.actor.addCondition("ablaze")
|
|
||||||
await args.actor.addCondition("prone")
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
return args.skill?.name == game.i18n.localize("NAME.ConsumeAlcohol");
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
return args.skill?.name != game.i18n.localize("NAME.Research") && !args.skill?.name?.includes(game.i18n.localize("NAME.Language"));
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
let item = await fromUuid("Compendium.wfrp4e-core.items.gz2xy41OSVZ8YBgI");
|
|
||||||
let data = item.toObject();
|
|
||||||
data.system.location.key = this.item.system.location.key
|
|
||||||
this.actor.createEmbeddedDocuments("Item", [data])
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
this.actor.details.move.run *= 2
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user