Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0228f351c7 | ||
|
|
570ca6c953 | ||
|
|
4fd997d169 |
@@ -17,7 +17,7 @@
|
||||
"target": "attack"
|
||||
}
|
||||
],
|
||||
"description": "Possible Lethal or Vital Strike or Add D20E to Attack"
|
||||
"description": "Possible Lethal or Vital Strike and Add D20E to Attack"
|
||||
},
|
||||
"ranged_attack": {
|
||||
"type": "choice",
|
||||
@@ -35,7 +35,7 @@
|
||||
"target": "attack"
|
||||
}
|
||||
],
|
||||
"description": "Possible Lethal or Vital Strike or Add D20E to Attack"
|
||||
"description": "Possible Lethal or Vital Strike and Add D20E to Attack"
|
||||
},
|
||||
"melee_defense": {
|
||||
"type": "choice",
|
||||
@@ -53,7 +53,7 @@
|
||||
"target": "defense"
|
||||
}
|
||||
],
|
||||
"description": "Possible Flawless or Legendary Defense or Add D20E to Defense"
|
||||
"description": "Possible Flawless or Legendary Defense and Add D20E to Defense"
|
||||
},
|
||||
"arcane_spell_attack": {
|
||||
"type": "choice",
|
||||
@@ -71,7 +71,7 @@
|
||||
"target": "spell_attack"
|
||||
}
|
||||
],
|
||||
"description": "Possible Lethal or Vital Magical Strike or Add D20E to Spell Attack"
|
||||
"description": "Possible Lethal or Vital Magical Strike and Add D20E to Spell Attack"
|
||||
},
|
||||
"skill_rolls": {
|
||||
"type": "skill_auto_success",
|
||||
@@ -93,7 +93,7 @@
|
||||
"target": "defense"
|
||||
}
|
||||
],
|
||||
"description": "Possible Flawless or Legendary Defense or Add D20E to Defense"
|
||||
"description": "Possible Flawless or Legendary Defense and Add D20E to Defense"
|
||||
},
|
||||
"arcane_spell_defense": {
|
||||
"type": "choice",
|
||||
@@ -107,7 +107,7 @@
|
||||
"target": "spell_defense"
|
||||
}
|
||||
],
|
||||
"description": "Possible Spell Catastrophe or adds D20E to Spell Defense"
|
||||
"description": "Possible Spell Catastrophe and adds D20E to Spell Defense"
|
||||
}
|
||||
},
|
||||
"29": {
|
||||
@@ -257,7 +257,7 @@
|
||||
"target": "attack"
|
||||
}
|
||||
],
|
||||
"description": "Possible Vicious Strike or Add D12 to attack"
|
||||
"description": "Possible Vicious Strike and Add D12 to attack"
|
||||
},
|
||||
"ranged_attack": {
|
||||
"type": "choice",
|
||||
@@ -274,7 +274,7 @@
|
||||
"target": "attack"
|
||||
}
|
||||
],
|
||||
"description": "Possible Vicious Strike or add D12 to attack"
|
||||
"description": "Possible Vicious Strike and add D12 to attack"
|
||||
},
|
||||
"melee_defense": {
|
||||
"type": "choice",
|
||||
@@ -291,7 +291,7 @@
|
||||
"target": "defense"
|
||||
}
|
||||
],
|
||||
"description": "Possible 20/20 defense that avoids Any Attack Except a Lethal Strike or adds D12 to defense"
|
||||
"description": "Possible 20/20 defense that avoids Any Attack Except a Lethal Strike and adds D12 to defense"
|
||||
},
|
||||
"arcane_spell_attack": {
|
||||
"type": "choice",
|
||||
@@ -308,7 +308,7 @@
|
||||
"target": "spell_attack"
|
||||
}
|
||||
],
|
||||
"description": "Possible Vicious Application of a Magical Attack or add D12 to attack"
|
||||
"description": "Possible Vicious Application of a Magical Attack and add D12 to attack"
|
||||
},
|
||||
"skill_rolls": {
|
||||
"type": "bonus_flat",
|
||||
@@ -331,7 +331,7 @@
|
||||
"target": "defense"
|
||||
}
|
||||
],
|
||||
"description": "Possible 20/20 defense that avoids Any Attack Except a Lethal Strike or adds D12 to defense"
|
||||
"description": "Possible 20/20 defense that avoids Any Attack Except a Lethal Strike and adds D12 to defense"
|
||||
},
|
||||
"arcane_spell_defense": {
|
||||
"type": "choice",
|
||||
@@ -348,7 +348,7 @@
|
||||
"target": "spell_defense"
|
||||
}
|
||||
],
|
||||
"description": "Possible 20/20 Spell defense that Saves Against Any Magical Attack Except a Lethal Magical Strike or add D12 to spell defense"
|
||||
"description": "Possible 20/20 Spell defense that Saves Against Any Magical Attack Except a Lethal Magical Strike and add D12 to spell defense"
|
||||
}
|
||||
},
|
||||
"15": {
|
||||
@@ -446,31 +446,31 @@
|
||||
"8": {
|
||||
"melee_attack": {
|
||||
"type": "mulligan",
|
||||
"description": "Mulligan, Can Choose to Re-roll This Attack"
|
||||
"description": "Mulligan, Can Choose to Re-roll This Attack (players only)"
|
||||
},
|
||||
"ranged_attack": {
|
||||
"type": "mulligan",
|
||||
"description": "Mulligan, Can Choose to Re-Roll This Attack"
|
||||
"description": "Mulligan, Can Choose to Re-Roll This Attack (players only)"
|
||||
},
|
||||
"melee_defense": {
|
||||
"type": "mulligan",
|
||||
"description": "Mulligan, Can Choose to Re-Roll This Defense"
|
||||
"description": "Mulligan, Can Choose to Re-Roll This Defense (players only)"
|
||||
},
|
||||
"arcane_spell_attack": {
|
||||
"type": "mulligan",
|
||||
"description": "Mulligan, Can Re-Roll This Spell Attack"
|
||||
"description": "Mulligan, Can Re-Roll This Spell Attack (players only)"
|
||||
},
|
||||
"skill_rolls": {
|
||||
"type": "mulligan",
|
||||
"description": "Mulligan, Can Re-Roll This Skill roll"
|
||||
"description": "Mulligan, Can Re-Roll This Skill roll (players only)"
|
||||
},
|
||||
"ranged_defense": {
|
||||
"type": "mulligan",
|
||||
"description": "Mulligan, Can Choose to Re-Roll This Defense"
|
||||
"description": "Mulligan, Can Choose to Re-Roll This Defense (players only)"
|
||||
},
|
||||
"arcane_spell_defense": {
|
||||
"type": "mulligan",
|
||||
"description": "Mulligan, Can Re-Roll This Spell Defense"
|
||||
"description": "Mulligan, Can Re-Roll This Spell Defense (players only)"
|
||||
}
|
||||
},
|
||||
"7": {
|
||||
|
||||
@@ -105,8 +105,24 @@ export async function handleAttackBoosted(msg) {
|
||||
} = msg
|
||||
|
||||
const defender = game.actors.get(defenderId)
|
||||
const attacker = game.actors.get(attackerId)
|
||||
if (!defender) return
|
||||
|
||||
// When the attacker is GM-owned (not a PC on another client), the createChatMessage
|
||||
// hook on the defender's client already handles everything: D30 bonus dice, defense
|
||||
// reaction dialog (grit/luck/shield/mulligan), and the comparison message. Running
|
||||
// handleAttackBoosted too would double-roll all dice and show duplicate dialogs.
|
||||
// Only proceed when the hook is suppressed (attacker is a PC on another client).
|
||||
const attackerHasNonGMOwner = attacker && game.users.some(u => u.active && !u.isGM && attacker.testUserPermission(u, "OWNER"))
|
||||
const _isPrimaryController = actor => {
|
||||
if (!actor) return false
|
||||
const activePlayerOwners = game.users.filter(u => u.active && !u.isGM && actor.testUserPermission(u, "OWNER"))
|
||||
if (activePlayerOwners.length > 0) return activePlayerOwners[0].id === game.user.id
|
||||
return game.user.isGM
|
||||
}
|
||||
const attackerIsCrossClient = attackerHasNonGMOwner && !_isPrimaryController(attacker)
|
||||
if (!attackerIsCrossClient) return
|
||||
|
||||
let updatedDefenseRoll = defenseRoll
|
||||
let shieldBlocked = false
|
||||
let shieldReaction = null
|
||||
@@ -237,6 +253,7 @@ export async function handleAttackBoosted(msg) {
|
||||
await ChatMessage.create({content: rmContent, speaker: ChatMessage.getSpeaker({actor: defender})})
|
||||
}
|
||||
if (d30Result.specialEffect === "drMultiplier") {
|
||||
defenseDrMultiplier = d30Result.multiplier
|
||||
const rmContent = await foundry.applications.handlebars.renderTemplate("systems/fvtt-lethal-fantasy/templates/chat/reaction-message.hbs", {type:"d30DRMultiplier", actorName:defenderName, value:d30Result.multiplier})
|
||||
await ChatMessage.create({content: rmContent, speaker: ChatMessage.getSpeaker({actor: defender})})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user