✨
This commit is contained in:
0
lang/en.json
Normal file
0
lang/en.json
Normal file
7
less/character-sheet.less
Normal file
7
less/character-sheet.less
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
// main: ./pokemon.less
|
||||||
|
.pokemon.sheet.charactersheet {
|
||||||
|
.sheet {
|
||||||
|
width: 500px;
|
||||||
|
height: 500px;
|
||||||
|
};
|
||||||
|
}
|
||||||
2
less/pokemon.less
Normal file
2
less/pokemon.less
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
// relativeUrls: true, out: ../pokemon.css
|
||||||
|
@import "./character-sheet.less";
|
||||||
5
modules/config.js
Normal file
5
modules/config.js
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
export const POKEMON = {};
|
||||||
|
|
||||||
|
POKEMON.attributes = {
|
||||||
|
Test: "TEST!"
|
||||||
|
}
|
||||||
0
modules/dialog.js
Normal file
0
modules/dialog.js
Normal file
0
modules/dice.js
Normal file
0
modules/dice.js
Normal file
0
modules/listenerFunction.js
Normal file
0
modules/listenerFunction.js
Normal file
34
modules/objects/pokemonActor.js
Normal file
34
modules/objects/pokemonActor.js
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
export default class pokemonActor extends Actor {
|
||||||
|
preparedata() {
|
||||||
|
|
||||||
|
// In case some steps need to be overwritten later
|
||||||
|
|
||||||
|
super.preparedata();
|
||||||
|
}
|
||||||
|
|
||||||
|
prepareDerivedData() {
|
||||||
|
const actorData = this.system;
|
||||||
|
|
||||||
|
this._preparePlayerCharacterData(actorData);
|
||||||
|
}
|
||||||
|
|
||||||
|
_preparePlayerCharacterData(actorData) {
|
||||||
|
this._setCharacterValues(actorData);
|
||||||
|
}
|
||||||
|
|
||||||
|
async _setCharacterValues(data) {
|
||||||
|
// Calculations of values here
|
||||||
|
}
|
||||||
|
|
||||||
|
setNote(note) {
|
||||||
|
this.update({"system.note ": note});
|
||||||
|
}
|
||||||
|
|
||||||
|
addLogEntry(entry) {
|
||||||
|
// Add a log entry to the character event log
|
||||||
|
|
||||||
|
let log = this.system.log;
|
||||||
|
log.push(entry);
|
||||||
|
this.update({"system.log": log})
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
export default class PokemonItemSheet extends foundry.appv1.sheets.ItemSheet {
|
|
||||||
get template() {
|
|
||||||
return `systems/pokemon/templates/sheets/${this.item.type}-sheet.html`
|
|
||||||
}
|
|
||||||
}
|
|
||||||
80
modules/sheets/pokemonCharacterSheet.js
Normal file
80
modules/sheets/pokemonCharacterSheet.js
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
const api = foundry.applications.api;
|
||||||
|
const sheets = foundry.applications.sheets;
|
||||||
|
|
||||||
|
export default class pokemonCharacterSheet extends api.HandlebarApplicationMixin(sheets.ActorSheetV2) {
|
||||||
|
|
||||||
|
sheetContext = {};
|
||||||
|
|
||||||
|
static DEFAULT_OPTIONS = {
|
||||||
|
tag: "form",
|
||||||
|
classes: ["pokemon", "sheet", "characterSheet"],
|
||||||
|
actions: {
|
||||||
|
|
||||||
|
},
|
||||||
|
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
|
||||||
|
};
|
||||||
|
|
||||||
|
this.sheetContext = context;
|
||||||
|
|
||||||
|
return context;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @override */
|
||||||
|
_onRender(context, options) {
|
||||||
|
|
||||||
|
const tabs = new foundry.applications.ux.Tabs({navSelector: ".tabs", contentSelector: ".content", initial: "tab1"});
|
||||||
|
tabs.bind(this.element);
|
||||||
|
|
||||||
|
const tabs2 = new foundry.applications.ux.Tabs({navSelector: ".tabs2", contentSelector: ".content2", initial: "tab2-1"});
|
||||||
|
tabs2.bind(this.element);
|
||||||
|
}
|
||||||
|
}
|
||||||
0
modules/utils.js
Normal file
0
modules/utils.js
Normal file
4
pokemon.css
Normal file
4
pokemon.css
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
.pokemon.sheet.charactersheet .sheet {
|
||||||
|
width: 500px;
|
||||||
|
height: 500px;
|
||||||
|
}
|
||||||
105
pokemon.js
105
pokemon.js
@@ -1,8 +1,103 @@
|
|||||||
import PokemonItemSheet from "./modules/sheets/PokemonItemSheet.js";
|
import { POKEMON } from "./modules/config.js";
|
||||||
|
import pokemonActor from "./modules/objects/pokemonActor.js";
|
||||||
|
import pokemonCharacterSheet from "./modules/sheets/pokemonCharacterSheet.js";
|
||||||
|
|
||||||
Hooks.once("init", function() {
|
Hooks.once("init", async () => {
|
||||||
console.log("pokemon | Initializing the Pokémon system");
|
|
||||||
|
|
||||||
foundry.documents.collections.Items.unregisterSheet("core", foundry.appv1.sheets.ItemSheet);
|
console.log("POKEMON | Initalizing Pokémon System");
|
||||||
foundry.documents.collections.Items.registerSheet("pokemon", PokemonItemSheet, { makeDefault: true });
|
|
||||||
|
// Setting up the Global Configuration Object
|
||||||
|
CONFIG.POKEMON = POKEMON;
|
||||||
|
CONFIG.INIT = true;
|
||||||
|
CONFIG.Actor.documentClass = pokemonActor;
|
||||||
|
|
||||||
|
// Register custom Sheets and unregister the start Sheets
|
||||||
|
// Items.unregisterSheet("core", ItemSheet);
|
||||||
|
|
||||||
|
const DocumentSheetConfig = foundry.applications.apps.DocumentSheetConfig;
|
||||||
|
DocumentSheetConfig.unregisterSheet(Actor, "core", foundry.appv1.sheets.ActorSheet);
|
||||||
|
DocumentSheetConfig.registerSheet(Actor, "pokemon", pokemonCharacterSheet, {
|
||||||
|
types: ["character"],
|
||||||
|
makeDefault: true,
|
||||||
|
label: "POKEMON.SheetClassCharacter"
|
||||||
|
})
|
||||||
|
|
||||||
|
// Load all Partial-Handlebar Files
|
||||||
|
preloadHandlebarsTemplates();
|
||||||
|
|
||||||
|
// Register Additional Handelbar Helpers
|
||||||
|
registerHandlebarsHelpers();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Hooks.once("ready", async () => {
|
||||||
|
|
||||||
|
// Finished Initalization Phase and release lock
|
||||||
|
CONFIG.INIT = false;
|
||||||
|
|
||||||
|
// Only execute when run as Gamemaster
|
||||||
|
if(!game.user.isGM) return;
|
||||||
|
});
|
||||||
|
|
||||||
|
function preloadHandlebarsTemplates() {
|
||||||
|
|
||||||
|
const templatePaths = [
|
||||||
|
|
||||||
|
"systems/pokemon/templates/partials/character-sheet-character.hbs",
|
||||||
|
"systems/pokemon/templates/partials/character-sheet-background.hbs",
|
||||||
|
"systems/pokemon/templates/partials/character-sheet-moves.hbs"
|
||||||
|
|
||||||
|
];
|
||||||
|
|
||||||
|
return foundry.applications.handlebars.loadTemplates(templatePaths);
|
||||||
|
};
|
||||||
|
|
||||||
|
function registerHandlebarsHelpers() {
|
||||||
|
|
||||||
|
Handlebars.registerHelper("equals", function(v1, v2) { return (v1 === v2)});
|
||||||
|
|
||||||
|
Handlebars.registerHelper("contains", function(element, search) { return (element.includes(search))});
|
||||||
|
|
||||||
|
Handlebars.registerHelper("concat", function(s1, s2, s3 = "") { return s1 + s2 + s3;});
|
||||||
|
|
||||||
|
Handlebars.registerHelper("isGreater", function(p1, p2) { return (p1 > p2)});
|
||||||
|
|
||||||
|
Handlebars.registerHelper("isEqualORGreater", function(p1, p2) { return (p1 >= p2)});
|
||||||
|
|
||||||
|
Handlebars.registerHelper("ifOR", function(conditional1, conditional2) { return (conditional1 || conditional2)});
|
||||||
|
|
||||||
|
Handlebars.registerHelper("doLog", function(value) { console.log(value)});
|
||||||
|
|
||||||
|
Handlebars.registerHelper("toBoolean", function(string) { return (string === "true")});
|
||||||
|
|
||||||
|
Handlebars.registerHelper('for', function(from, to, incr, content) {
|
||||||
|
|
||||||
|
let result = "";
|
||||||
|
|
||||||
|
for(let i = from; i < to; i += incr)
|
||||||
|
result += content.fn(i);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
});
|
||||||
|
|
||||||
|
Handlebars.registerHelper("times", function(n, content) {
|
||||||
|
|
||||||
|
let result = "";
|
||||||
|
|
||||||
|
for(let i = 0; i < n; i++)
|
||||||
|
result += content.fn(i);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
});
|
||||||
|
|
||||||
|
Handlebars.registerHelper("notEmpty", function(value) {
|
||||||
|
|
||||||
|
if (value == 0 || value == "0") return true;
|
||||||
|
if (value == null|| value == "") return false;
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
/* General Functions */
|
||||||
|
/* -------------------------------------------- */
|
||||||
20
system.json
20
system.json
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"version": "0.0.7",
|
"version": "0.0.8",
|
||||||
"id": "pokemon",
|
"id": "pokemon",
|
||||||
"title": "Pokémon TTRPG",
|
"title": "Pokémon TTRPG",
|
||||||
"description": "A Pokémon TTRPG",
|
"description": "A Pokémon TTRPG",
|
||||||
@@ -19,11 +19,23 @@
|
|||||||
"esmodules": [
|
"esmodules": [
|
||||||
"pokemon.js"
|
"pokemon.js"
|
||||||
],
|
],
|
||||||
"styles": [],
|
"styles": [
|
||||||
|
"pokemon.css"
|
||||||
|
],
|
||||||
"packs": [],
|
"packs": [],
|
||||||
"languages": [],
|
"languages": [
|
||||||
|
{
|
||||||
|
"lang": "en",
|
||||||
|
"name": "English",
|
||||||
|
"path": "lang/en.json"
|
||||||
|
}
|
||||||
|
],
|
||||||
"socket": false,
|
"socket": false,
|
||||||
"url": "https://git.ingemanngade.net/NikolajDanger/pokemon-foundry/raw/branch/main/",
|
"grid": {
|
||||||
|
"distance": 5,
|
||||||
|
"units": "ft"
|
||||||
|
},
|
||||||
|
"url": "https://git.ingemanngade.net/NikolajDanger/pokemon-foundry/",
|
||||||
"manifest": "https://git.ingemanngade.net/NikolajDanger/pokemon-foundry/raw/branch/main/system.json",
|
"manifest": "https://git.ingemanngade.net/NikolajDanger/pokemon-foundry/raw/branch/main/system.json",
|
||||||
"download": "https://git.ingemanngade.net/NikolajDanger/pokemon-foundry/raw/branch/main/system.zip"
|
"download": "https://git.ingemanngade.net/NikolajDanger/pokemon-foundry/raw/branch/main/system.zip"
|
||||||
}
|
}
|
||||||
@@ -1,16 +1,86 @@
|
|||||||
{
|
{
|
||||||
"Actor": {},
|
"Actor": {
|
||||||
"Item": {
|
|
||||||
"types": ["item"],
|
"types": [
|
||||||
"templates": {
|
"character"
|
||||||
"base": {
|
],
|
||||||
"description": ""
|
|
||||||
}
|
"character": {
|
||||||
|
"species": "",
|
||||||
|
|
||||||
|
"experience": {
|
||||||
|
"level": 1,
|
||||||
|
"EXP": 0
|
||||||
|
},
|
||||||
|
|
||||||
|
"armor class": 0,
|
||||||
|
"stats": {
|
||||||
|
"attack": {
|
||||||
|
"value": 0,
|
||||||
|
"modifier": 0
|
||||||
|
},
|
||||||
|
"defense": {
|
||||||
|
"value": 0,
|
||||||
|
"modifier": 0
|
||||||
|
},
|
||||||
|
"move": {
|
||||||
|
"value": 0,
|
||||||
|
"modifier": 0
|
||||||
|
},
|
||||||
|
"hp": {
|
||||||
|
"value": 0,
|
||||||
|
"modifier": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"speed": 0,
|
||||||
|
"hp": {
|
||||||
|
"max": 0,
|
||||||
|
"current": 0
|
||||||
|
},
|
||||||
|
"moves": {
|
||||||
|
"move 1": {
|
||||||
|
"category": 0,
|
||||||
|
"type": 0,
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"move 2": {
|
||||||
|
"category": 0,
|
||||||
|
"type": 0,
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"move 3": {
|
||||||
|
"category": 0,
|
||||||
|
"type": 0,
|
||||||
|
"description": ""
|
||||||
|
},
|
||||||
|
"move 4": {
|
||||||
|
"category": 0,
|
||||||
|
"type": 0,
|
||||||
|
"description": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"item": {
|
|
||||||
"templates": ["base"],
|
"Item": {
|
||||||
"quantity": 1,
|
|
||||||
"weight": 0
|
"types":[
|
||||||
|
"Item"
|
||||||
|
],
|
||||||
|
|
||||||
|
"templates": {
|
||||||
|
|
||||||
|
"generalItems": {
|
||||||
|
"weight": 10,
|
||||||
|
"value": 100,
|
||||||
|
"description": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"Item": {
|
||||||
|
"templates": ["generalItems"],
|
||||||
|
"type": "item",
|
||||||
|
"quantity": 1
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
17
templates/sheets/character/header.hbs
Normal file
17
templates/sheets/character/header.hbs
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<div class="headerBox">
|
||||||
|
|
||||||
|
{{!-- <div class="logoBox">
|
||||||
|
<div class="logoImg"><div class="logoText">{{localize "POKEMON.SystemName"}}</div></div>
|
||||||
|
</div> --}}
|
||||||
|
|
||||||
|
<div class="charInfoBox">
|
||||||
|
<input class="bigInputText" type="text" name="name" value="{{actor.name}}">
|
||||||
|
<div class="lvlBox">
|
||||||
|
<div class="lvlLabel">{{localize "POKEMON.System.LevelShort"}}</div>
|
||||||
|
<div class="lvlValue">{{system.experience.level}}</div>
|
||||||
|
</div>
|
||||||
|
<div class="expBox">
|
||||||
|
<div class="expValue">{{system.experience.EXP}} EXP</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
89
templates/sheets/character/sidebar
Normal file
89
templates/sheets/character/sidebar
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
<div>
|
||||||
|
<div class="sideBarBox">
|
||||||
|
|
||||||
|
<div class="imgBox">
|
||||||
|
<img class="charImg" src="{{actor.img}}" data-edit="img" data-action="editImage" title="{{actor.name}}" >
|
||||||
|
<div class="imgOverlay">
|
||||||
|
<div class="charHex charHPCurrent"><span class="charHexHead">HP</span></br><span class="charHexValue">{{system.hp.current}}</span></div>
|
||||||
|
<div class="charHex charHPMax"><span class="charHexHead">Max</span></br><span class="charHexValue">{{system.hp.max}}</span></div>
|
||||||
|
</div>
|
||||||
|
<div class="charHex"><span class="charHexHead">{{localize "POKEMON.System.Attack"}}</span></br><span class="charHexValue">{{system.stats}}</span></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="menuBox">
|
||||||
|
|
||||||
|
<div class="menuBG"></div>
|
||||||
|
<div class="menuLbl"></div>
|
||||||
|
|
||||||
|
<nav class="tabs menuTabs" data-group="primary-tabs">
|
||||||
|
<div class="menuIcon" style="left: 135px;">
|
||||||
|
<a class="item" data-tab="tab1" data-group="primary-tabs">
|
||||||
|
<i class="fa-solid fa-book-open-cover"></i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="menuIcon" style="left: 180px;">
|
||||||
|
<a class="item" data-tab="tab2" data-group="primary-tabs">
|
||||||
|
<i class="fa-solid fa-book"></i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="menuIcon" style="left: 225px;">
|
||||||
|
<a class="item" data-tab="tab3" data-group="primary-tabs">
|
||||||
|
<i class="fa-regular fa-stars"></i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="menuIcon" style="left: 270px;">
|
||||||
|
<a class="item" data-tab="tab4" data-group="primary-tabs">
|
||||||
|
<i class="fa-solid fa-swords"></i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="menuIcon" style="left: 315px;">
|
||||||
|
<a class="item" data-tab="tab5" data-group="primary-tabs">
|
||||||
|
<i class="fa-solid fa-aperture"></i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="menuIcon" style="left: 360px;">
|
||||||
|
<a class="item" data-tab="tab6" data-group="primary-tabs">
|
||||||
|
<i class="fa-solid fa-bezier-curve"></i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="menuSetup" style="left: 405px;">
|
||||||
|
<a class="item" data-tab="tab7" data-group="primary-tabs">
|
||||||
|
<i class="fa-solid fa-ellipsis-vertical"></i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="contentBox">
|
||||||
|
<section class="content">
|
||||||
|
<div class="tab" data-tab="tab1" data-group="primary-tabs">
|
||||||
|
{{> "systems/nether/templates/partials/character-sheet-character.hbs"}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="tab" data-tab="tab2" data-group="primary-tabs">
|
||||||
|
{{> "systems/nether/templates/partials/character-sheet-background.hbs"}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="tab" data-tab="tab3" data-group="primary-tabs">
|
||||||
|
{{> "systems/nether/templates/partials/character-sheet-skill.hbs"}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="tab" data-tab="tab4" data-group="primary-tabs">
|
||||||
|
{{> "systems/nether/templates/partials/character-sheet-combat.hbs"}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="tab" data-tab="tab5" data-group="primary-tabs">
|
||||||
|
{{> "systems/nether/templates/partials/character-sheet-progression.hbs"}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="tab" data-tab="tab6" data-group="primary-tabs">
|
||||||
|
Pfade
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="tab" data-tab="tab7" data-group="primary-tabs">
|
||||||
|
Settings
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
<form class="{{cssClass}}" autocomplete="off">
|
|
||||||
<header class="sheet-header">
|
|
||||||
<img src="{{item.img}}" data-edit="img" title="{{item.name}}" height="64" width="64"/>
|
|
||||||
<h1><input name="name" type="text" value="{{item.name}}" placeholder="Name"/></h1>
|
|
||||||
</header>
|
|
||||||
<p>HELLO TEST</p>
|
|
||||||
</form>
|
|
||||||
Reference in New Issue
Block a user