const api = foundry.applications.api; const sheets = foundry.applications.sheets; effectivenessChart = { "normal": { "normal": 1, "fire": 1, "water": 1, "electric": 1, "grass": 1, "ice": 1, "fighting": 1, "poison": 1, "ground": 1, "flying": 1, "psychic": 1, "bug": 1, "rock": 0.5, "ghost": 0, "dragon": 1, "dark": 1, "steel": 0.5 }, "fire": { "normal": 1, "fire": 0.5, "water": 0.5, "electric": 1, "grass": 2, "ice": 2, "fighting": 1, "poison": 1, "ground": 1, "flying": 1, "psychic": 1, "bug": 2, "rock": 0.5, "ghost": 1, "dragon": 0.5, "dark": 1, "steel": 2 }, "water": { "normal": 1, "fire": 2, "water": 0.5, "electric": 1, "grass": 0.5, "ice": 1, "fighting": 1, "poison": 1, "ground": 2, "flying": 1, "psychic": 1, "bug": 1, "rock": 2, "ghost": 1, "dragon": 0.5, "dark": 1, "steel": 1 }, "electric": { "normal": 1, "fire": 1, "water": 2, "electric": 0.5, "grass": 0.5, "ice": 1, "fighting": 1, "poison": 1, "ground": 0, "flying": 2, "psychic": 1, "bug": 1, "rock": 1, "ghost": 1, "dragon": 0.5, "dark": 1, "steel": 1 }, "grass": { "normal": 1, "fire": 0.5, "water": 2, "electric": 1, "grass": 0.5, "ice": 1, "fighting": 1, "poison": 0.5, "ground": 2, "flying": 0.5, "psychic": 1, "bug": 0.5, "rock": 2, "ghost": 1, "dragon": 0.5, "dark": 1, "steel": 0.5 }, "ice": { "normal": 1, "fire": 0.5, "water": 0.5, "electric": 1, "grass": 2, "ice": 0.5, "fighting": 1, "poison": 1, "ground": 2, "flying": 2, "psychic": 1, "bug": 1, "rock": 1, "ghost": 1, "dragon": 2, "dark": 1, "steel": 0.5 }, "fighting": { "normal": 2, "fire": 1, "water": 1, "electric": 1, "grass": 1, "ice": 2, "fighting": 1, "poison": 0.5, "ground": 1, "flying": 0.5, "psychic": 0.5, "bug": 0.5, "rock": 2, "ghost": 0, "dragon": 1, "dark": 2, "steel": 2 }, "poison": { "normal": 1, "fire": 1, "water": 1, "electric": 1, "grass": 2, "ice": 1, "fighting": 1, "poison": 0.5, "ground": 0.5, "flying": 1, "psychic": 1, "bug": 1, "rock": 0.5, "ghost": 0.5, "dragon": 1, "dark": 1, "steel": 0 }, "ground": { "normal": 1, "fire": 2, "water": 1, "electric": 2, "grass": 0.5, "ice": 1, "fighting": 1, "poison": 2, "ground": 1, "flying": 0, "psychic": 1, "bug": 0.5, "rock": 2, "ghost": 1, "dragon": 1, "dark": 1, "steel": 2 }, "flying": { "normal": 1, "fire": 1, "water": 1, "electric": 0.5, "grass": 2, "ice": 1, "fighting": 2, "poison": 1, "ground": 1, "flying": 1, "psychic": 1, "bug": 2, "rock": 0.5, "ghost": 1, "dragon": 1, "dark": 1, "steel": 0.5 }, "psychic": { "normal": 1, "fire": 1, "water": 1, "electric": 1, "grass": 1, "ice": 1, "fighting": 2, "poison": 2, "ground": 1, "flying": 1, "psychic": 0.5, "bug": 1, "rock": 1, "ghost": 1, "dragon": 1, "dark": 0, "steel": 0.5 }, "bug": { "normal": 1, "fire": 0.5, "water": 1, "electric": 1, "grass": 2, "ice": 1, "fighting": 0.5, "poison": 0.5, "ground": 1, "flying": 0.5, "psychic": 2, "bug": 1, "rock": 1, "ghost": 0.5, "dragon": 1, "dark": 2, "steel": 0.5 }, "rock": { "normal": 1, "fire": 2, "water": 1, "electric": 1, "grass": 1, "ice": 2, "fighting": 0.5, "poison": 1, "ground": 0.5, "flying": 2, "psychic": 1, "bug": 2, "rock": 1, "ghost": 1, "dragon": 1, "dark": 1, "steel": 0.5 }, "ghost": { "normal": 0, "fire": 1, "water": 1, "electric": 1, "grass": 1, "ice": 1, "fighting": 1, "poison": 1, "ground": 1, "flying": 1, "psychic": 2, "bug": 1, "rock": 1, "ghost": 2, "dragon": 1, "dark": 0.5, "steel": 0.5 }, "dragon": { "normal": 1, "fire": 1, "water": 1, "electric": 1, "grass": 1, "ice": 1, "fighting": 1, "poison": 1, "ground": 1, "flying": 1, "psychic": 1, "bug": 1, "rock": 1, "ghost": 1, "dragon": 2, "dark": 1, "steel": 0.5 }, "dark": { "normal": 1, "fire": 1, "water": 1, "electric": 1, "grass": 1, "ice": 1, "fighting": 0.5, "poison": 1, "ground": 1, "flying": 1, "psychic": 2, "bug": 1, "rock": 1, "ghost": 2, "dragon": 1, "dark": 0.5, "steel": 0.5 }, "steel": { "normal": 1, "fire": 0.5, "water": 0.5, "electric": 0.5, "grass": 1, "ice": 2, "fighting": 1, "poison": 1, "ground": 1, "flying": 1, "psychic": 1, "bug": 1, "rock": 2, "ghost": 1, "dragon": 1, "dark": 1, "steel": 0.5 } } export default class pokemonCharacterSheet extends api.HandlebarsApplicationMixin(sheets.ActorSheetV2) { sheetContext = {}; tab = "tab1"; static DEFAULT_OPTIONS = { tag: "form", classes: ["pokemon", "sheet", "characterSheet"], tabs: [ {navSelector: ".tabs", contentSelector: ".content", initial: this.tab} ], form: { submitOnChange: true, closeOnSubmit: false }, position: { width: 650 } } static PARTS = { header: { template: "systems/pokemon/templates/sheets/character/header.hbs" }, sidebar: { template: "systems/pokemon/templates/sheets/character/sidebar.hbs" } } get title() { return this.actor.name; } /** @override */ _configureRenderOptions(options) { super._configureRenderOptions(options); if (this.document.limited) options.parts = ["header"] else options.parts = ["header", "sidebar"]; } /** @override */ async _prepareContext(options) { // ################################################################################################# // ################################################################################################# // ## ## // ## Creates Basic Datamodel, which is used to fill the HTML together with Handelbars with Data. ## // ## ## // ################################################################################################# // ################################################################################################# const baseData = await super._prepareContext(); let context = { // Set General Values owner: baseData.document.isOwner, editable: baseData.editable, actor: baseData.document, system: baseData.document.system, items: baseData.document.items, config: CONFIG.POKEMON, isGM: baseData.user.isGM, effects: baseData.document.effects, types: ["normal", "fire", "water", "electric", "grass", "ice", "fighting", "poison", "ground", "flying", "psychic", "bug", "rock", "ghost", "dragon", "dark", "steel", "fairy"] }; context = this.calculateDerivated(context) this.sheetContext = context; context.system.tab = this.tab; return context; } calculateDerivated(context) { context.system.phArmorClass = 10+context.system.stats.defense; context.system.spArmorClass = 10+context.system.stats.defense; if (context.system.defenseCategory == "Physical") { context.system.phArmorClass += 2; } else { context.system.spArmorClass += 2; } context.defenses = context.types.map(type => this.calcEffectiveness(context, type)); context.system.speed = 30+5*context.system.stats.speed; return context; } calcEffectiveness(context, type) { effectiveness = 1 effectiveness *= effectivenessChart[type][context.system.type1] if (context.system.type2 != "") { effectiveness *= effectivenessChart[type][context.system.type2] } return effectiveness } /** @override */ _onRender(context, options) { const tabs = new foundry.applications.ux.Tabs({navSelector: ".tabs", contentSelector: ".content", initial: this.tab}); tabs.bind(this.element); // tabs.activate(this.tab); tabs.callback = () => { this.tab = tabs.active; } } }