A => Bearbones.js +19 -0
@@ 0,0 1,19 @@
+import BearActor from './modules/bear_actor.js';
+import BearSheet from './modules/bear_sheet.js';
+
+Hooks.once("init", function() {
+ console.log('Bearbones | look ma no brains')
+
+ game.bearbones2 = {
+ }
+
+ CONFIG.Actor.documentClass = BearActor;
+
+ Actors.unregisterSheet("core", ActorSheet);
+ Actors.registerSheet("bearbones2", BearSheet, {
+ // types: ["pc", "enemy", "vehicle"],
+ makeDefault: true,
+ // label: "Bearbones.CharacterSheet"
+ });
+
+});
No newline at end of file
R module/actor.js => +0 -44
@@ 1,44 0,0 @@
-
-export default class BearActor extends Actor {
-
- /** @override */
- static async create(data, options={}) {
- const default_image = "systems/bearbones/icons/npc_spear.png"
- data.token = data.token || {};
- if ( data.type === "pc" ) {
- mergeObject(data.token, {
- vision: true,
- dimSight: 0,
- brightSight: 10000,
- actorLink: true,
- disposition: 1,
- img: default_image,
- displayName:TOKEN_DISPLAY_MODES.NEVER,
- displayBars: TOKEN_DISPLAY_MODES.NEVER,
- bar1: {attribute: "combat.health"},
- }, {overwrite: false});
- data.img = data.img || default_image;
- } else if ( data.type === "enemy" ) {
- const default_image = "systems/bearbones/icons/npc_angery.png"
- mergeObject(data.token, {
- vision: false,
- actorLink: false,
- disposition: -1,
- img: default_image,
- displayName:TOKEN_DISPLAY_MODES.HOVER,
- displayBars: TOKEN_DISPLAY_MODES.OWNER,
- bar1: {attribute: "combat.health"},
- }, {overwrite: false});
- data.img = data.img || default_image;
- }
- return super.create(data, options);
- }
-
- /** @override */
- async update(data, options={}) {
- // Perform the update
- return super.update(data, options);
- }
-
-
-}
No newline at end of file
R module/bearbones.js => +0 -17
@@ 1,17 0,0 @@
-import { bearbones } from "./index.js";
-import HeroSheet from "./sheets/HeroSheet.js";
-import BearActor from "./actor.js";
-
-Hooks.once("init", function () {
- console.log('Bearbones | look ma no brains')
-
- CONFIG.bearbones = bearbones;
- CONFIG.Actor.entityClass = BearActor;
-
- Actors.unregisterSheet("core", ActorSheet);
- Actors.registerSheet("bearbones", HeroSheet, {makeDefault: true});
-
- // Actors.unregisterSheet("core", Actor);
- // Actors.registerSheet("bearbones", BearActor, {makeDefault: true});
-
-})
No newline at end of file
R module/index.js => +0 -1
@@ 1,1 0,0 @@
-export const bearbones = {};
No newline at end of file
R module/sheets/HeroSheet.js => +0 -15
@@ 1,15 0,0 @@
-export default class HeroSheet extends ActorSheet {
- static get defaultOptions () {
- return mergeObject(super.defaultOptions, {
- classes: ["bearbones", "sheet"],
- template: `systems/bearbones/templates/sheets/hero-sheet.hbs`,
- width: 600,
- height: 600,
- // tabs: [{navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "bio"}],
- });
- }
- getData() {
- const data = super.getData();
- return data;
- }
-}
No newline at end of file
A => modules/bear_actor.js +70 -0
@@ 0,0 1,70 @@
+
+export default class BearActor extends Actor {
+
+ async _preCreate(data, options, user) {
+ await super._preCreate(data, options, user);
+ const sourceId = this.getFlag("core", "sourceId");
+ if (sourceId?.startsWith("Compendium.")) return;
+
+ // Player character configuration
+ if (this.type === "character") {
+ this.data.token.update({
+ vision: true,
+ actorLink: true,
+ dimSight: 0,
+ brightSight: 0,
+ disposition: 1,
+ displayName: CONST.TOKEN_DISPLAY_MODES.ALWAYS,
+ displayBars: CONST.TOKEN_DISPLAY_MODES.OWNER,
+ bar1: {attribute: "combat.health"},
+ img: "systems/bearbones2/icons/npc.png",
+ });
+ this.data.update({img: "systems/bearbones2/icons/npc.png"})
+ } else if (this.type === "enemy") {
+ this.data.token.update({
+ vision: false,
+ actorLink: true,
+ disposition: -1,
+ displayName: CONST.TOKEN_DISPLAY_MODES.OWNER,
+ displayBars: CONST.TOKEN_DISPLAY_MODES.ALWAYS,
+ bar1: {attribute: "combat.health"},
+ img: "systems/bearbones2/icons/npc_angery.png",
+ });
+ this.data.update({img: "systems/bearbones2/icons/npc_angery.png"})
+ } else if (this.type === "object") {
+ this.data.token.update({
+ vision: false,
+ actorLink: true,
+ disposition: 0,
+ displayName: CONST.TOKEN_DISPLAY_MODES.HOVER,
+ displayBars: CONST.TOKEN_DISPLAY_MODES.NONE,
+ img: "systems/bearbones2/icons/npc_spear.png",
+ });
+ this.data.update({img: "systems/bearbones2/icons/npc_spear.png"})
+ }
+ }
+
+
+ async _preUpdate(changed, options, user) {
+ await super._preUpdate(changed, options, user);
+
+ if (changed.data && changed.data.darkvision === true){
+ this.data.token.update({
+ dimSight: 60,
+ });
+ } else if (changed.data && changed.data.darkvision === false) {
+ this.data.token.update({
+ dimSight: 0,
+ });
+ }
+
+ const docs_to_update = this.getActiveTokens(true).map(token => {
+ console.log(token);
+ token.data.dimSight = this.data.token.dimSight;
+ return token.data;
+ });
+
+ return canvas.scene?.updateEmbeddedDocuments("Token", docs_to_update);
+ }
+
+}
No newline at end of file
A => modules/bear_sheet.js +17 -0
@@ 0,0 1,17 @@
+
+export default class BearSheet extends ActorSheet {
+ static get defaultOptions() {
+ return mergeObject(super.defaultOptions, {
+ classes: ["bearbones2", "sheet", "actor"],
+ template: `systems/bearbones2/templates/sheets/bear-sheet.html`,
+ width: 720,
+ height: 680
+ });
+ }
+ getData() {
+ const data = super.getData();
+ data.isGM = game.user.isGM;
+ console.log(data);
+ return data;
+ }
+}
No newline at end of file
A => modules/bear_token.js +0 -0
M system.json +8 -10
@@ 1,17 1,15 @@
{
- "name": "bearbones",
- "title": "Bearbones is Bearbones",
+ "name": "bearbones2",
+ "title": "Bearbones is Bearbones 2",
"description": "My Dog ate my Character Sheet",
- "esmodules": [
- "module/bearbones.js"
- ],
- "styles": [
- "styles/style.css"
- ],
"packs": [],
"languages": [],
"gridDistance": "5",
"gridUnits": "ft",
- "primaryTokenAttribute": "health",
- "initiative": "1d20"
+ "primaryTokenAttribute": "combat.health",
+ "initiative": "1d20",
+ "esmodules": ["Bearbones.js"],
+ "styles": [
+ "styles/style.css"
+ ]
}
No newline at end of file
M template.json +25 -18
@@ 1,36 1,43 @@
{
"Actor": {
- "types": ["pc", "enemy"],
+ "types": ["character", "object", "enemy"],
"templates": {
"combat": {
"health": {
- "min": 0,
- "max": 10,
- "value": 10
+ "health": {
+ "min": 0,
+ "max": 10,
+ "value": 10
+ }
},
- "death_saves_failed": {
- "min": 0,
- "value": 0,
- "max": 3
- },
- "death_saves_saved": {
- "min": 0,
- "value": 0,
- "max": 3
+ "death_saves": {
+ "failed": {
+ "min": 0,
+ "value": 0,
+ "max": 3
+ },
+ "saved": {
+ "min": 0,
+ "value": 0,
+ "max": 3
+ }
}
},
"notes": {
"notes": ""
+ },
+ "vision": {
+ "darkvision": false
}
},
- "pc": {
- "templates": ["combat", "notes"]
+ "character": {
+ "templates": ["combat", "vision", "notes"]
+ },
+ "object": {
+ "templates": ["notes"]
},
"enemy": {
"templates": ["combat", "notes"]
}
- },
- "Item": {
-
}
}
No newline at end of file
A => templates/sheets/bear-sheet.html +43 -0
@@ 0,0 1,43 @@
+<form class="{{cssClass}}" autocomplete="off">
+ <header class="sheet-header">
+ <img src="{{actor.img}}" data-edit="img" title="{{actor.name}}" height="64" width="64" />
+ <h1><input name="name" type="text" value="{{actor.name}}"/></h1>
+ </header>
+ <div>
+ <p>Health</p>
+ <div class="attribute-row">
+ <div>
+ <label>Health</label>
+ <input type="number" name="data.health.health.value" value="{{data.data.health.health.value}}"/>
+ </div>
+ <div>
+ <label>Max Health</label>
+ <input type="number" name="data.health.health.max" value="{{data.data.health.health.max}}"/>
+ </div>
+ </div>
+ <p>Death Saves</p>
+ <div class="attribute-row">
+ <div>
+ <label>Failed</label>
+ <input type="text" name="data.death_saves.failed.value" value="{{data.data.death_saves.failed.value}}"/>
+ </div>
+ <div>
+ <label>Succeeded</label>
+ <input type="text" name="data.death_saves.saved.value" value="{{data.data.death_saves.saved.value}}"/>
+ </div>
+ </div>
+
+ {{# if isGM }}
+ <p>Vision</p>
+ <div class="attribute-row">
+ <div>
+ <label>Darkvision?</label>
+ <input type="checkbox" name="data.darkvision" {{checked data.data.darkvision}} />
+ </div>
+ </div>
+ {{/if}}
+
+ <p>Notes</p>
+ <textarea style="min-height:18em" name="data.notes" data-edit="notes">{{data.data.notes}}</textarea>
+ </div>
+</form>
No newline at end of file
R templates/sheets/hero-sheet.hbs => +0 -36
@@ 1,36 0,0 @@
-<form class="{{cssClass}}" autocomplete="off">
- <header class="sheet-header">
- <img src="{{actor.img}}" data-edit="img" title="{{actor.name}}" height="64" width="64" />
- <h1><input name="name" type="text" value="{{actor.name}}"/></h1>
- </header>
- <div>
- <p>Health</p>
- <div class="attribute-row">
- <div>
- <label>Health</label>
- <input type="text" name="data.combat.health.value" value="{{data.combat.health.value}}" data-dtype="Number" />
- </div>
- <div>
- <label>Max Health</label>
- <input type="text" name="data.combat.health.max" value="{{data.combat.health.max}}" data-dtype="Number" />
- </div>
- </div>
-
- <p>Death Saves</p>
- <div class="attribute-row">
- <div>
- <label>Failed</label>
- <input type="text" name="data.combat.death_saves_failed.value" value="{{data.combat.death_saves_failed.value}}" data-dtype="Number" />
- </div>
- <div>
- <label>Succeeded</label>
- <input type="text" name="data.combat.death_saves_saved.value" value="{{data.combat.death_saves_saved.value}}" data-dtype="Number" />
- </div>
- </div>
-
- <p>Notes</p>
- <textarea style="min-height:18em" name="data.notes.notes" data-edit="data.notes.notes">{{data.notes.notes}}</textarea>
- </div>
-
-
-</form>
No newline at end of file