Skip to content

Commit

Permalink
Merge pull request #53 from burobrasil/gm/monster-attack
Browse files Browse the repository at this point in the history
Ataques de monstros (rolagem de ataque e dano)
  • Loading branch information
jmonteiro authored Apr 1, 2024
2 parents ad33fe2 + 31e5601 commit bf54f29
Show file tree
Hide file tree
Showing 294 changed files with 13,584 additions and 858 deletions.
16 changes: 11 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,11 @@ Sistema do Old Dragon 2a Edição para FoundryVTT.
- **Cálculo Automático de Movimento:** O módulo calcula automaticamente as variações de movimento (Correr, Nadar e Escalar) baseado no valor do movimento atual;
- **Cálculo Automático de Carga:** O módulo calcula automaticamente a Carga Máxima e a Carga Atual do personagem. A Carga Máxima é representada pelo maior valor entre os atributos de Força e Constituição, além de bônus provenientes de equipamentos como a Mochila. A Carga Atual leva em consideração a soma da carga de todos os itens que personagem possui. (O peso das moedas ainda não está sendo incluído).
- **Rolagens de Dados Aprimoradas para Personagens:** Inclui rolagens para Atributos, Jogadas de Proteção (JPD/JPC/JPS), Ataques (BAC/BAD), Dano e Chance de Nocaute com opções de Ajuste de Teste e Modificador Opcional;
- **Rolagens de Dados Aprimoradas para Monstros & Inimigos:** Inclui rolagens para Jogada de Proteção (JP), Moral (MO) e Pontos de Vida (DV/PV) com opções de Ajuste de Teste e Modificador Opcional;
- **Gerenciamento de Magias e Equipamentos:** Permite adicionar, editar, mover, remover e lançar magias, bem como gerenciar equipamentos. Alterações em itens refletem dinamicamente no Peso Total, Valor Total e Carga Atual/Carga Máxima do personagem;
- **Rolagens de Dados Aprimoradas para Monstros & Inimigos:** Inclui rolagens para Jogada de Proteção (JP), Moral (MO), Dados de Vida/Pontos de Vida (DV/PV), Ataque (BA) e Dano com opções de Ajuste de Teste e Modificador Opcional;
- **Gerenciamento de Magias e Equipamentos:** Permite adicionar, editar, mover, remover e lançar magias, bem como gerenciar equipamentos. Alterações em itens refletem dinamicamente no Peso Total, Valor Total e Carga Atual/Máxima do personagem;
- **Equipar/Desequipar itens**: Permite equipar/desequipar Armas, Armaduras, Escudos, Recipientes & Vasilhames. Armas equipadas são exibidas na aba "Ataques". Ao equipar uma Armadura ou Escudo, os bônus de CA são adicionados automaticamente à Classe de Armadura do personagem. Ao equipar uma Mochila, o valor da Carga Máxima permitida é atualizado automaticamente.
- **Compêndio SRD**: O módulo inclui gratuitamente o compêndio "SRD". Esta coleção concisa e compacta inclui Equipamentos, Magias, Monstros & Inimigos, Tabelas de Rolagem, Personagens Prontos, além do SRD (Documento de Referência) em si, o que possibilita consultar regras e instruções sem a necessidade de sair do aplicativo.
- **Iniciativa (Combat Encounter)**: O módulo utiliza a regra de iniciativa alternativa "Iniciativa Individual", presente no LB2 (pág. 88). Ao adicionar Personagens e Monstros & Inimigos a um Encontro, utilizando o _Combat Encounter_, ao clicar em "Rolar Iniciativa" será lançado 1d12 para cada participante do combate. Os personagens com os resultados mais altos agem primeiro. Por tanto, a ordem das ações será: Maior resultado > 2º maior resultado > 3º maior resultado.

O restante da ficha deve ser preenchida e gerenciada manualmente. Mais abaixo você encontra uma lista de pendências com o que planejamos implementar no futuro.

Expand All @@ -36,12 +38,16 @@ O sistema `olddragon2e` para Foundry VTT está em desenvolvimento contínuo, ain
- Controle de uso de Magias;
- Raças e Classes dinâmicas (xp, movimento, infravisão, habilidades);
- Controle de uso de Habilidades de Classe;
- Rolagem de ataque para Monstros;
- Tabelas de rolagens diversas (ex: Tesouros);
- Sistema de turnos/iniciativa (Combat Tracker).
- Sistema de Iniciativa (Combat Encounter) padrão do LB1.

## Importação de personagens

O sistema permite importar personagens criados na plataforma [ODO](https://olddragon.com.br/).

Passo a passo: Na aba "Actors", clique em "Importar Personagem do ODO". Insira o link da ficha do personagem escolhido no [ODO](https://olddragon.com.br/) (utilizando o botão de "Compartilhar" da ficha, ou copiando a URL no browser). Por último, basta clicar em "Importar".

Esta funcionalidade ainda será aprimorada. Por tanto, atualmente o personagem importado carrega apenas os seguintes dados: Nome; Raça; Classe; Nível; Movimento; Pontos de Vida; Atributos e Modificadores (Força, Destreza, Constituição, Inteligência, Sabedoria e Carisma).

![Importação de personagem](./static/importacao-personagem.gif)

## Development
Expand Down
19 changes: 16 additions & 3 deletions src/lang/en.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,15 @@
{
"TYPES.Actor.character": "Personagem",
"TYPES.Actor.monster": "Monstro/Inimigo",
"TYPES.Item.weapon": "Arma",
"TYPES.Item.armor": "Armadura",
"TYPES.Item.shield": "Escudo",
"TYPES.Item.misc": "Item Geral",
"TYPES.Item.container": "Recipiente/Vasilhame",
"TYPES.Item.vehicle": "Montaria/Transporte",
"TYPES.Item.spell": "Magia",
"TYPES.Item.monster_attack": "Ataque de Monstro",

"olddragon2e": {
"name": "Nome",
"id": "ID",
Expand Down Expand Up @@ -220,6 +231,7 @@
"equipment_short": "Equip.",
"quantity": "Quantidade",
"quantity_short": "Qtd",
"times": "Vezes",
"weight": "Peso",
"weight_in_load": "Peso em carga",
"weight_in_grams": "Peso em gramas",
Expand All @@ -246,15 +258,16 @@
},
"unarmed": "Desarmado",
"damage": "Dano",
"damage_description": "Descrição do dano",
"damage_roll": "Rolar dano",
"avarage_damage": "Dano médio",
"bonus_damage": "Bônus no dano",
"knockout": "Nocaute",
"knockout_roll": "Rolar chance de nocaute",
"bonus_ba": "Bônus na BA",
"range": "Alcance",
"throw_range": "Alcance (disparo)",
"shoot_range": "Alcance (arremesso)",
"throw_range": "Alcance (arremesso)",
"shoot_range": "Alcance (disparo)",
"arrow": "Flecha",
"bolt": "Virote",
"bolt_small": "Virote pequeno",
Expand Down Expand Up @@ -309,7 +322,7 @@
"details_tab": "Detalhes"
},
"monster": {
"skills_tab": "Habilidades",
"attacks_tab": "Ataques",
"info_tab": "Informações"
}
},
Expand Down
15 changes: 14 additions & 1 deletion src/lang/pt-BR.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,15 @@
{
"TYPES.Actor.character": "Personagem",
"TYPES.Actor.monster": "Monstro/Inimigo",
"TYPES.Item.weapon": "Arma",
"TYPES.Item.armor": "Armadura",
"TYPES.Item.shield": "Escudo",
"TYPES.Item.misc": "Item Geral",
"TYPES.Item.container": "Recipiente/Vasilhame",
"TYPES.Item.vehicle": "Montaria/Transporte",
"TYPES.Item.spell": "Magia",
"TYPES.Item.monster_attack": "Ataque de Monstro",

"olddragon2e": {
"name": "Nome",
"id": "ID",
Expand Down Expand Up @@ -220,6 +231,7 @@
"equipment_short": "Equip.",
"quantity": "Quantidade",
"quantity_short": "Qtd",
"times": "Vezes",
"weight": "Peso",
"weight_in_load": "Peso em carga",
"weight_in_grams": "Peso em gramas",
Expand All @@ -246,6 +258,7 @@
},
"unarmed": "Desarmado",
"damage": "Dano",
"damage_description": "Descrição do dano",
"damage_roll": "Rolar dano",
"avarage_damage": "Dano médio",
"bonus_damage": "Bônus no dano",
Expand Down Expand Up @@ -309,7 +322,7 @@
"details_tab": "Detalhes"
},
"monster": {
"skills_tab": "Habilidades",
"attacks_tab": "Ataques",
"info_tab": "Informações"
}
},
Expand Down
1 change: 1 addition & 0 deletions src/module/OD2Item.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ export default class OD2Item extends Item {
container: 'systems/olddragon2e/templates/partials/cards/container-card.hbs',
vehicle: 'systems/olddragon2e/templates/partials/cards/vehicle-card.hbs',
spell: 'systems/olddragon2e/templates/chat/spell-chat.hbs',
monster_attack: 'systems/olddragon2e/templates/partials/cards/monster_attack-card.hbs',
};

async roll() {
Expand Down
18 changes: 10 additions & 8 deletions src/module/actors/OD2CharacterDataModel.js
Original file line number Diff line number Diff line change
Expand Up @@ -380,34 +380,36 @@ export class OD2CharacterDataModel extends foundry.abstract.TypeDataModel {
}

get attack_items() {
return getItemsOfActorOfType(this.parent, 'weapon', ({ system }) => system.is_equipped);
return getItemsOfActorOfType(this.parent, 'weapon', ({ system }) => system.is_equipped).sort(
(a, b) => (a.sort || 0) - (b.sort || 0),
);
}

get weapon_items() {
return getItemsOfActorOfType(this.parent, 'weapon');
return getItemsOfActorOfType(this.parent, 'weapon').sort((a, b) => (a.sort || 0) - (b.sort || 0));
}

get armor_items() {
return getItemsOfActorOfType(this.parent, 'armor');
return getItemsOfActorOfType(this.parent, 'armor').sort((a, b) => (a.sort || 0) - (b.sort || 0));
}

get shield_items() {
return getItemsOfActorOfType(this.parent, 'shield');
return getItemsOfActorOfType(this.parent, 'shield').sort((a, b) => (a.sort || 0) - (b.sort || 0));
}

get misc_items() {
return getItemsOfActorOfType(this.parent, 'misc');
return getItemsOfActorOfType(this.parent, 'misc').sort((a, b) => (a.sort || 0) - (b.sort || 0));
}

get container_items() {
return getItemsOfActorOfType(this.parent, 'container');
return getItemsOfActorOfType(this.parent, 'container').sort((a, b) => (a.sort || 0) - (b.sort || 0));
}

get vehicle_items() {
return getItemsOfActorOfType(this.parent, 'vehicle');
return getItemsOfActorOfType(this.parent, 'vehicle').sort((a, b) => (a.sort || 0) - (b.sort || 0));
}

get spell_items() {
return getItemsOfActorOfType(this.parent, 'spell');
return getItemsOfActorOfType(this.parent, 'spell').sort((a, b) => (a.sort || 0) - (b.sort || 0));
}
}
7 changes: 7 additions & 0 deletions src/module/actors/OD2MonsterDataModel.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
const getItemsOfActorOfType = (actor, filterType, filterFn = null) =>
actor.items.filter(({ type }) => type === filterType).filter(filterFn || (() => true));

export class OD2MonsterDataModel extends foundry.abstract.TypeDataModel {
static defineSchema() {
const fields = foundry.data.fields;
Expand Down Expand Up @@ -52,4 +55,8 @@ export class OD2MonsterDataModel extends foundry.abstract.TypeDataModel {
get mve() {
return Math.floor(parseInt(this.mv) - 2);
}

get monster_attack_items() {
return getItemsOfActorOfType(this.parent, 'monster_attack').sort((a, b) => (a.sort || 0) - (b.sort || 0));
}
}
2 changes: 1 addition & 1 deletion src/module/helpers/index.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
export { showDialog } from './dialogs';
export { registerHandlebarsHelper } from './handlebars';
export { truncateString } from './strings';
export { truncateString, signed_number } from './strings';
10 changes: 10 additions & 0 deletions src/module/helpers/strings.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,13 @@ export function truncateString(string, number) {
// Return string truncated with '...' concatenated to the end of string.
return string.slice(0, number) + '...';
}

export function signed_number(number, zero = '+0') {
if (number === '0') {
return zero;
} else if (number < 0) {
return number.toString();
} else {
return `+${number}`;
}
}
28 changes: 28 additions & 0 deletions src/module/items/OD2MonsterAttackDataModel.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
export class OD2MonsterAttackDataModel extends foundry.abstract.TypeDataModel {
static defineSchema() {
const fields = foundry.data.fields;
return {
text: new fields.StringField(),
times: new fields.NumberField({
required: true,
initial: 1,
integer: true,
}),
description: new fields.StringField(),
ba: new fields.NumberField({
required: true,
initial: 0,
integer: true,
}),
damage_description: new fields.StringField(),
damage: new fields.StringField(),
damage_bonus: new fields.NumberField({
integer: true,
}),
weapon: new fields.BooleanField({
required: true,
initial: false,
}),
};
}
}
1 change: 1 addition & 0 deletions src/module/items/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ export { OD2ArmorDataModel } from './OD2ArmorDataModel';
export { OD2ContainerDataModel } from './OD2ContainerDataModel';
export { OD2EquipmentDataModel } from './OD2EquipmentDataModel';
export { OD2ItemDataModel } from './OD2ItemDataModel';
export { OD2MonsterAttackDataModel } from './OD2MonsterAttackDataModel';
export { OD2ShieldDataModel } from './OD2ShieldDataModel';
export { OD2SpellDataModel } from './OD2SpellDataModel';
export { OD2WeaponDataModel } from './OD2WeaponDataModel';
2 changes: 2 additions & 0 deletions src/module/olddragon2e.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import {
OD2EquipmentDataModel,
OD2ContainerDataModel,
OD2SpellDataModel,
OD2MonsterAttackDataModel,
} from './items';

// Initialize system
Expand All @@ -43,6 +44,7 @@ Hooks.once('init', async () => {
container: OD2ContainerDataModel,
vehicle: OD2EquipmentDataModel,
spell: OD2SpellDataModel,
monster_attack: OD2MonsterAttackDataModel,
};

Items.unregisterSheet('core', ItemSheet);
Expand Down
3 changes: 2 additions & 1 deletion src/module/preloadTemplates.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ export async function preloadTemplates() {
'systems/olddragon2e/templates/partials/tabs/character-tab-spells.hbs',
'systems/olddragon2e/templates/partials/tabs/character-tab-equipment.hbs',
'systems/olddragon2e/templates/partials/tabs/character-tab-details.hbs',
'systems/olddragon2e/templates/partials/tabs/monster-tab-skills.hbs',
'systems/olddragon2e/templates/partials/tabs/monster-tab-attacks.hbs',
'systems/olddragon2e/templates/partials/tabs/monster-tab-info.hbs',
'systems/olddragon2e/templates/partials/cards/attack-card.hbs',
'systems/olddragon2e/templates/partials/cards/weapon-card.hbs',
Expand All @@ -15,6 +15,7 @@ export async function preloadTemplates() {
'systems/olddragon2e/templates/partials/cards/container-card.hbs',
'systems/olddragon2e/templates/partials/cards/vehicle-card.hbs',
'systems/olddragon2e/templates/partials/cards/spell-card.hbs',
'systems/olddragon2e/templates/partials/cards/monster_attack-card.hbs',
];

return loadTemplates(templatePaths);
Expand Down
Loading

0 comments on commit bf54f29

Please sign in to comment.