diff --git a/css/pirateborg.css b/css/pirateborg.css index cc750693..8d389892 100644 --- a/css/pirateborg.css +++ b/css/pirateborg.css @@ -504,6 +504,7 @@ flex: 1; display: flex; flex-direction: column; + overflow: hidden; } .pirateborg.sheet.actor.character .sheet-header .header-col2 .rest-buttons { display: flex; @@ -529,6 +530,8 @@ flex-direction: row; margin-bottom: 19px; margin-left: 0px; + align-items: stretch; + flex-wrap: nowrap; } .pirateborg.sheet.actor.character .sheet-header .classname-row img.classimg { height: 24px; @@ -539,6 +542,11 @@ .pirateborg.sheet.actor.character .sheet-header .classname-row label.classname { font-family: var(--h3-font); font-size: 24px; + white-space: nowrap; +} +.pirateborg.sheet.actor.character .sheet-header .classname-row label.item-base-class { + text-overflow: ellipsis; + overflow: hidden; } .pirateborg.sheet.actor.character .sheet-header .classname-row .item-controls { flex: 0 0 35px; diff --git a/css/pirateborg.css.map b/css/pirateborg.css.map index b1fab885..2963cfea 100644 --- a/css/pirateborg.css.map +++ b/css/pirateborg.css.map @@ -1 +1 @@ -{"version":3,"sourceRoot":"","sources":["../scss/pirateborg/_root.scss","../scss/pirateborg/_flex.scss","../scss/pirateborg/_pirateborg.scss","../scss/pirateborg/_sheet.scss","../scss/pirateborg/_actor-sheet.scss","../scss/pirateborg/_character-sheet.scss","../scss/pirateborg/_item-list.scss","../scss/pirateborg/_creature-sheet.scss","../scss/pirateborg/_item-sheet.scss","../scss/pirateborg/_container-sheet.scss","../scss/pirateborg/_foundry-overrides.scss","../scss/pirateborg/_rollcards.scss","../scss/pirateborg/_dialog.scss","../scss/pirateborg/_module-fixes.scss"],"names":[],"mappings":"AAAQ;AACA;AAER;AACE;EACA;EAEA;EACA;EAEA;EACA;EAEA;EACA;EACA;EAEA;EACA;EAEA;EACA;EAEA;EACA;EAEA;EACA;EAEA;EAEA;EACA;EACA;EAEA;EACA;EACA;EAEA;AAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AACA;AACA;AACA;EACE;EACA;;ACzDF;AACA;AACA;AAEA;EACE;EACA;EACA;EACA;;AAEA;AAAA;EAEE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;EACA;;AAEA;AAAA;EAEE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;;AC9CF;EACE;EACA;;AAGF;EACE;;AAGF;EACE;EACA;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;;AAIJ;AAAA;EAEE;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIJ;EACE;EACA;EACA;;;ACjEA;EAiBE;;AAhBA;EACE;EACA;AAEA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAMJ;EACE;EACA;;AAIA;EAIE;EACA;;AAGF;EAUE;;AAIJ;EACE;;AAIA;EAEE;;AAIJ;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;;AAIJ;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAMR;EACE;;AAEA;EACE;EACA;EACA;EACA;;AAKF;EACE;;AAEA;EACE;EACA;EACA;EACA;;AAGF;AAAA;EAEE;EACA;;AAGF;EACE;;;ACpKJ;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAIJ;EACE;;AAEA;EACE;;AAEA;EAEE;;AAKF;EACE;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;AAKE;EACE;EACA;;AACA;EACE;EACA;;AACA;EACE;EACA;EACA;EACA;;AAMR;EACE;;AAGF;EACE;EACA;;AAKF;EACE;EACA;;AAGF;EACE;EACA;;AAIJ;EACE;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAKA;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAIJ;EACE;;AAEA;EACE;EACA;EACA;;AAIA;EACE;EACA;;AAGF;EACE;;AAMJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAQN;EACE;EACA;;AAEA;EACE;;AAIJ;EACE;;AAGF;EACE;EACA;;AAKN;EACE;EACA;EACA;EACA;EACA;EACA;;AAIA;EACE;EACA;EACA;EACA;;AAIA;EACE;EACA;EACA;EACA;EACA;;AAIJ;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;;;ACpRJ;EACE;EACA;;AAEA;EACE;;AACA;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AACA;EACE;EACA;EACA;;AAIJ;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;EACA;AAEA;EACA;;AAIJ;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AACA;EACE;EACA;;AAIJ;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAUJ;EACE;EACA;EACA;;AAEA;EACE;;AAIJ;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAKF;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAKN;EACE;;AAGF;EACE;EACA;;;ACjNR;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAIJ;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;;AAIJ;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAMF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAIJ;EACE;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;;AAOJ;EACE;;AAGF;EACE;;AAGF;EACE;;;ACvGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;;AAGF;EACE;EACA;;AAGF;EACE;EACA;EACA;;AAEA;EACE;;;AC/CJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;;ACrCN;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;;AAGF;EACE;;;ACzCV;EACE;EACA;EACA;;;AAIA;EACE;EACA;;;AAKF;EACE;;AAEA;EAEE;;AAIJ;EACE;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;;;AAKN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;;AAIJ;EACE;;;AAGF;EACE;EACA;;AAEA;EAEE;;;AAKF;EACE;;AAGF;EACE;;AAEA;EAEE;;AAIJ;EACE;EACA;EACA;;AAEA;EAEE;;AAIJ;EACE;EACA;EACA;;AAEA;EAEE;;;AAKN;EACE;EACA;;;AAGF;AAGE;AAAA;AAAA;EAGE;;;AAIJ;AAeI;EACE;EACA;EACA;;AAEA;EAEE;;AAGF;EACE;;AAGF;EAEE;EACA;;;AAMR;AAEA;AAEA;AAII;EACE;;AAGF;EACE;;AAMA;EAEE;;AAKF;EAEE;;;AAMR;AAGE;EACE;;AAGF;EACE;EACA;;AAEA;EACE;EACA;EACA;;;AAKN;AACA;AACA;AAEA;EACE;;AAEA;EACE;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;;AAKF;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;;AAKF;AAAA;AAAA;EAGE;;AAIJ;EACE;;AAGF;EACE;EACA;;AAGF;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAKF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;;;AAKN;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;;AAKF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAIA;EACE;EACA;;;AAKN;AACA;AAEA;EACE;AAEA;;AAEA;EACE;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAIJ;EACE;AAEA;;AAGF;EACE;EACA;;AAIA;EAEE;EACA;EACA;EACA;;AAKF;EAEE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;;AAMJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;;AAEA;EACE;EACA;;;AAKN;EACE;EACA;EACA;;AAEA;EACE;;;AAIJ;AAAA;EAEE;;;AAIA;AAAA;EAEE;EACA;;AAGF;EACE;EACA;EACA;EACA;;;AAKF;EACE;EACA;;AAGF;EACE;;AAEA;EAEE;EACA;EACA;EACA;;;AAMJ;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACE;EACA;;AAEA;EACE;EACA;;;AAIJ;EACE;EACA;EAEA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;;;AAKF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAKF;EACE;;AAGF;EACE;;AAIA;EACE;EACA;;AACA;EACE;;AAGJ;EACE;;AACA;EACE;EACA;;AAMJ;EACE;;AAGF;EACE;EACA;;AACA;EACE;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;EACA;EACA;;AAEF;EACE;EACA;;;AAQR;EAEE;;;AAIJ;EACE;EACA;EACA;EACA;EACA;;;AAIA;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;;;AAKN;AAME;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;EACA;;;AAKF;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAMA;EAEE;;;AAMJ;EACE;EACA;;;AAIJ;EACE;EACA;;;AAKE;EACE;;AAEF;EACE;;;AAKN;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;ACxvBF;AACA;AACA;AAGE;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAIJ;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;EACA;;AAIA;EACE;;AAIJ;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGJ;EACE;;;AAIJ;EACE;EACA;;;ACpHF;AACA;AACA;AAEA;EACE;;AAEA;EACE;EACA;EACA;EACA;;;AAKF;EAEE;EACA;;;AAKF;EAGE;EACA;;;AAIJ;AACA;AACA;AAEA;EACE;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;;AAGF;EACE;;AAGF;EACE;;AAGE;EAEE;;AAGF;EACE;EACA;;AAIJ;EACE;EACA;;AAIJ;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAGE;EACA;;;AAMR;AAAA;EAEE;EACA;;;ACvGI;EACE;;AAEF;EACE;EACA;;;AAON;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;;AACA;EACE;;AAIJ;EACE;;;AAKJ;EACE;;;AAGF;EACE;;AACA;EACE;EACA","file":"pirateborg.css"} \ No newline at end of file +{"version":3,"sourceRoot":"","sources":["../scss/pirateborg/_root.scss","../scss/pirateborg/_flex.scss","../scss/pirateborg/_pirateborg.scss","../scss/pirateborg/_sheet.scss","../scss/pirateborg/_actor-sheet.scss","../scss/pirateborg/_character-sheet.scss","../scss/pirateborg/_item-list.scss","../scss/pirateborg/_creature-sheet.scss","../scss/pirateborg/_item-sheet.scss","../scss/pirateborg/_container-sheet.scss","../scss/pirateborg/_foundry-overrides.scss","../scss/pirateborg/_rollcards.scss","../scss/pirateborg/_dialog.scss","../scss/pirateborg/_module-fixes.scss"],"names":[],"mappings":"AAAQ;AACA;AAER;AACE;EACA;EAEA;EACA;EAEA;EACA;EAEA;EACA;EACA;EAEA;EACA;EAEA;EACA;EAEA;EACA;EAEA;EACA;EAEA;EAEA;EACA;EACA;EAEA;EACA;EACA;EAEA;AAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AACA;AACA;AACA;EACE;EACA;;ACzDF;AACA;AACA;AAEA;EACE;EACA;EACA;EACA;;AAEA;AAAA;EAEE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;EACA;;AAEA;AAAA;EAEE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;;AC9CF;EACE;EACA;;AAGF;EACE;;AAGF;EACE;EACA;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;;AAIJ;AAAA;EAEE;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIJ;EACE;EACA;EACA;;;ACjEA;EAiBE;;AAhBA;EACE;EACA;AAEA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAMJ;EACE;EACA;;AAIA;EAIE;EACA;;AAGF;EAUE;;AAIJ;EACE;;AAIA;EAEE;;AAIJ;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;;AAIJ;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAMR;EACE;;AAEA;EACE;EACA;EACA;EACA;;AAKF;EACE;;AAEA;EACE;EACA;EACA;EACA;;AAGF;AAAA;EAEE;EACA;;AAGF;EACE;;;ACpKJ;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAIJ;EACE;;AAEA;EACE;;AAEA;EAEE;;AAKF;EACE;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;AAKE;EACE;EACA;;AACA;EACE;EACA;;AACA;EACE;EACA;EACA;EACA;;AAMR;EACE;;AAGF;EACE;EACA;;AAKF;EACE;EACA;;AAGF;EACE;EACA;;AAIJ;EACE;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAKA;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAIJ;EACE;;AAEA;EACE;EACA;EACA;;AAIA;EACE;EACA;;AAGF;EACE;;AAMJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAQN;EACE;EACA;;AAEA;EACE;;AAIJ;EACE;;AAGF;EACE;EACA;;AAKN;EACE;EACA;EACA;EACA;EACA;EACA;;AAIA;EACE;EACA;EACA;EACA;;AAIA;EACE;EACA;EACA;EACA;EACA;;AAIJ;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;;;ACpRJ;EACE;EACA;;AAEA;EACE;;AACA;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;;AAIJ;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;EACA;EACA;AAEA;EACA;;AAIJ;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AACA;EACE;EACA;;AAIJ;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAUJ;EACE;EACA;EACA;;AAEA;EACE;;AAIJ;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAKF;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAKN;EACE;;AAGF;EACE;EACA;;;AC1NR;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAIJ;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;;AAIJ;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAMF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAIJ;EACE;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;;AAOJ;EACE;;AAGF;EACE;;AAGF;EACE;;;ACvGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;;AAGF;EACE;EACA;;AAGF;EACE;EACA;EACA;;AAEA;EACE;;;AC/CJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;;ACrCN;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;;AAGF;EACE;;;ACzCV;EACE;EACA;EACA;;;AAIA;EACE;EACA;;;AAKF;EACE;;AAEA;EAEE;;AAIJ;EACE;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;;;AAKN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;;AAIJ;EACE;;;AAGF;EACE;EACA;;AAEA;EAEE;;;AAKF;EACE;;AAGF;EACE;;AAEA;EAEE;;AAIJ;EACE;EACA;EACA;;AAEA;EAEE;;AAIJ;EACE;EACA;EACA;;AAEA;EAEE;;;AAKN;EACE;EACA;;;AAGF;AAGE;AAAA;AAAA;EAGE;;;AAIJ;AAeI;EACE;EACA;EACA;;AAEA;EAEE;;AAGF;EACE;;AAGF;EAEE;EACA;;;AAMR;AAEA;AAEA;AAII;EACE;;AAGF;EACE;;AAMA;EAEE;;AAKF;EAEE;;;AAMR;AAGE;EACE;;AAGF;EACE;EACA;;AAEA;EACE;EACA;EACA;;;AAKN;AACA;AACA;AAEA;EACE;;AAEA;EACE;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;;AAKF;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;;AAKF;AAAA;AAAA;EAGE;;AAIJ;EACE;;AAGF;EACE;EACA;;AAGF;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAKF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;;;AAKN;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;;AAKF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAIA;EACE;EACA;;;AAKN;AACA;AAEA;EACE;AAEA;;AAEA;EACE;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAIJ;EACE;AAEA;;AAGF;EACE;EACA;;AAIA;EAEE;EACA;EACA;EACA;;AAKF;EAEE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;;AAMJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;;AAEA;EACE;EACA;;;AAKN;EACE;EACA;EACA;;AAEA;EACE;;;AAIJ;AAAA;EAEE;;;AAIA;AAAA;EAEE;EACA;;AAGF;EACE;EACA;EACA;EACA;;;AAKF;EACE;EACA;;AAGF;EACE;;AAEA;EAEE;EACA;EACA;EACA;;;AAMJ;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACE;EACA;;AAEA;EACE;EACA;;;AAIJ;EACE;EACA;EAEA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;;;AAKF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAKF;EACE;;AAGF;EACE;;AAIA;EACE;EACA;;AACA;EACE;;AAGJ;EACE;;AACA;EACE;EACA;;AAMJ;EACE;;AAGF;EACE;EACA;;AACA;EACE;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;EACA;EACA;;AAEF;EACE;EACA;;;AAQR;EAEE;;;AAIJ;EACE;EACA;EACA;EACA;EACA;;;AAIA;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;;;AAKN;AAME;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;EACA;;;AAKF;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAMA;EAEE;;;AAMJ;EACE;EACA;;;AAIJ;EACE;EACA;;;AAKE;EACE;;AAEF;EACE;;;AAKN;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;ACxvBF;AACA;AACA;AAGE;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAIJ;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;EACA;;AAIA;EACE;;AAIJ;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGJ;EACE;;;AAIJ;EACE;EACA;;;ACpHF;AACA;AACA;AAEA;EACE;;AAEA;EACE;EACA;EACA;EACA;;;AAKF;EAEE;EACA;;;AAKF;EAGE;EACA;;;AAIJ;AACA;AACA;AAEA;EACE;EACA;EACA;;AAEA;EACE;;AAGF;EACE;EACA;;AAGF;EACE;;AAGF;EACE;;AAGE;EAEE;;AAGF;EACE;EACA;;AAIJ;EACE;EACA;;AAIJ;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAGE;EACA;;;AAMR;AAAA;EAEE;EACA;;;ACvGI;EACE;;AAEF;EACE;EACA;;;AAON;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;;AACA;EACE;;AAIJ;EACE;;;AAIJ;EACE;;;AAGF;EACE;;AACA;EACE;EACA","file":"pirateborg.css"} \ No newline at end of file diff --git a/lang/en.json b/lang/en.json index 335ea3cd..81b55f0e 100644 --- a/lang/en.json +++ b/lang/en.json @@ -247,10 +247,10 @@ "PB.CharacterGeneratorMacro": "Character Generator Macro", "PB.StandsFirm": "Stands firm", "PB.Starting": "Starting", - "PB.StartingBonusItemInvalid": "Item must exist in a compendium pack to be able to be used as a starting bonus item.", + "PB.StartingBonusDropInvalid": "Item must exist in a compendium pack", "PB.StartingBonusItems": "Starting Bonus Items", "PB.StartingBonusRolls": "Starting Bonus Rolls", - + "PB.StartingMacro": "Starting Macro", "PB.StartingItems": "Starting Items", "PB.StartingRolls": "Starting Rolls", @@ -267,7 +267,7 @@ "PB.Take": "Take", "PB.TargetArmor": "Target Armor", "PB.Test": "Test", - "PB.TheScvmfactory": "The Pirate Factory", + "PB.TheScvmfactory": "The Tavern", "PB.Tier": "Tier", "PB.Title": "MÖRK BORG", "PB.Type": "Type", diff --git a/module/actor/actor.js b/module/actor/actor.js index a6e64ecf..59835716 100644 --- a/module/actor/actor.js +++ b/module/actor/actor.js @@ -107,23 +107,23 @@ export class PBActor extends Actor { /** @override */ async _onCreateEmbeddedDocuments(embeddedName, documents, result, options, userId) { if (documents[0].data.type === CONFIG.PB.itemTypes.class) { - this.setBaseClass(""); - this._deleteEarlierItems(CONFIG.PB.itemTypes.class); + await this.setBaseClass(""); + await this._deleteEarlierItems(CONFIG.PB.itemTypes.class); } - super._onCreateEmbeddedDocuments(embeddedName, documents, result, options, userId); + await super._onCreateEmbeddedDocuments(embeddedName, documents, result, options, userId); } - _onDeleteEmbeddedDocuments(embeddedName, documents, result, options, userId) { + async _onDeleteEmbeddedDocuments(embeddedName, documents, result, options, userId) { for (const document of documents) { if (document.isContainer) { - this.deleteEmbeddedDocuments("Item", document.items); + await this.deleteEmbeddedDocuments("Item", document.items); } if (document.hasContainer) { document.container.removeItem(document.id); } } - super._onDeleteEmbeddedDocuments(embeddedName, documents, result, options, userId); + await super._onDeleteEmbeddedDocuments(embeddedName, documents, result, options, userId); } async _deleteEarlierItems(itemType) { @@ -131,7 +131,7 @@ export class PBActor extends Actor { itemsOfType.pop(); // don't delete the last one const deletions = itemsOfType.map((i) => i.id); // not awaiting this async call, just fire it off - this.deleteEmbeddedDocuments("Item", deletions); + await this.deleteEmbeddedDocuments("Item", deletions); } /** @override */ @@ -656,16 +656,13 @@ export class PBActor extends Actor { } else { outcomeKey = "PB.StandsFirm"; } - const outcomeText = game.i18n.localize(outcomeKey); - const rollResult = { - actor: this, - outcomeRoll, - outcomeText, - moraleRoll, - }; - const html = await renderTemplate(MORALE_ROLL_CARD_TEMPLATE, rollResult); ChatMessage.create({ - content: html, + content: await renderTemplate(MORALE_ROLL_CARD_TEMPLATE, { + actor: this, + outcomeRoll, + outcomeText: game.i18n.localize(outcomeKey), + moraleRoll, + }), sound: diceSound(), speaker: ChatMessage.getSpeaker({ actor: this }), }); @@ -684,14 +681,14 @@ export class PBActor extends Actor { * Show reaction roll/result in a chat roll card. */ async _renderReactionRollCard(result) { - const rollResult = { - actor: this, - reactionRoll: result.roll, - reactionText: result.results[0].data.text, - }; - const html = await renderTemplate(REACTION_ROLL_CARD_TEMPLATE, rollResult); ChatMessage.create({ - content: html, + content: await renderTemplate(REACTION_ROLL_CARD_TEMPLATE, { + actor: this, + reactionRoll: result.roll, + reactionText: result.results[0].data.text, + }), + type: CONST.CHAT_MESSAGE_TYPES.ROLL, + roll: result.roll, sound: diceSound(), speaker: ChatMessage.getSpeaker({ actor: this }), }); @@ -727,7 +724,7 @@ export class PBActor extends Actor { } const clazz = this.getClass(); - const wieldRoll = new Roll(clazz.data.data.extraResourceTestFormula, this.getRollData()); + const wieldRoll = new Roll(clazz.data.data.extraResourceTestFormula || (await this.getBaseClass()).data?.data.extraResourceTestFormula, this.getRollData()); wieldRoll.evaluate({ async: false }); await showDice(wieldRoll); @@ -746,19 +743,17 @@ export class PBActor extends Actor { wieldOutcome = game.i18n.localize(isFumble ? "PB.InvokableFumble" : "PB.InvokableFailure"); } - const rollResult = { + const html = await renderTemplate(WIELD_INVOKABLE_CARD_TEMPLATE, { item: item.data, actor: this.data, title: game.i18n.format("PB.InvokableTitle", { type: item.data.data.invokableType, }), wieldDR, - wieldFormula: clazz.data.data.extraResourceTestFormulaLabel, + wieldFormula: clazz.data.data.extraResourceTestFormulaLabel || (await this.getBaseClass()).data?.data.extraResourceTestFormulaLabel, wieldOutcome, wieldRoll, - }; - - const html = await renderTemplate(WIELD_INVOKABLE_CARD_TEMPLATE, rollResult); + }); await ChatMessage.create({ content: html, @@ -882,7 +877,7 @@ export class PBActor extends Actor { const pack = game.packs.get("pirateborg.rolls-gamemaster"); const content = await pack.getDocuments(); const table = content.find((i) => i.name === "Mystical Mishaps"); - const draw = await table.draw({ displayChat: false}); + const draw = await table.draw({ displayChat: false }); await ChatMessage.create({ content: await renderTemplate(MYSTICAL_MISHAP_CARD_TEMPLATE, { @@ -915,7 +910,7 @@ export class PBActor extends Actor { async _rollOutcome(dieRoll, rollData, cardTitle, outcomeTextFn, rollFormula = null) { const roll = new Roll(dieRoll, rollData); - roll.evaluate({ async: false }); + await roll.evaluate(); ChatMessage.create({ content: await renderTemplate(OUTCOME_ROLL_CARD_TEMPLATE, { cardTitle: cardTitle, @@ -938,7 +933,7 @@ export class PBActor extends Actor { } const roll = await this._rollOutcome( "@luckDie", - classItem.getRollData(), + { luckDie: await this.getLuckDie() }, `${game.i18n.localize("PB.Luck")}`, (roll) => ` ${game.i18n.localize("PB.Luck")}: ${Math.max(0, roll.total)}` ); @@ -962,13 +957,14 @@ export class PBActor extends Actor { async rollExtraResourcePerDay() { const clazz = this.getClass(); - if (clazz.data.data.useExtraResource) { + const baseClass = await this.getBaseClass(); + if (clazz.data.data.useExtraResource || baseClass.data?.data.useExtraResource) { const roll = await this._rollOutcome( - clazz.data.data.extraResourceFormula, + clazz.data.data.extraResourceFormula || baseClass.data?.data.extraResourceFormula, this.getRollData(), - `${clazz.data.data.extraResourceNamePlural} ${game.i18n.localize("PB.PerDay")}`, + `${clazz.data.data.extraResourceNamePlural || baseClass.data?.data.extraResourceNamePlural} ${game.i18n.localize("PB.PerDay")}`, (roll) => ` ${game.i18n.localize("PB.PowerUsesRemaining")}: ${Math.max(0, roll.total)}`, - clazz.data.data.extraResourceFormulaLabel + clazz.data.data.extraResourceFormulaLabel || baseClass.data?.data.extraResourceNamePlural ); const newUses = Math.max(0, roll.total); await this.update({ @@ -1120,7 +1116,7 @@ export class PBActor extends Actor { const html = await renderTemplate(GET_BETTER_ROLL_CARD_TEMPLATE, data); ChatMessage.create({ - content: html, + content: html, sound: CONFIG.sounds.dice, // make a single dice sound speaker: ChatMessage.getSpeaker({ actor: this }), }); @@ -1204,6 +1200,14 @@ export class PBActor extends Actor { }); } + getClass() { + return this.items.find((item) => item.type === CONFIG.PB.itemTypes.class); + } + + async setBaseClass(baseClass) { + await this.update({ ["data.baseClass"]: baseClass }); + } + async getBaseClass() { const [compendium, item] = this.data.data.baseClass.split(";"); if (compendium && item) { @@ -1211,11 +1215,34 @@ export class PBActor extends Actor { } } - getClass() { - return this.items.find((item) => item.type === CONFIG.PB.itemTypes.class); + async getUseExtraResource() { + const currentClass = this.getClass(); + const baseClass = await this.getBaseClass(); + if (currentClass?.data?.data.useExtraResource || baseClass?.data?.data.useExtraResource) { + return true; + } + return false; } - async setBaseClass(baseClass) { - await this.update({ ["data.baseClass"]: baseClass }); + async getExtraResourceNamePlural() { + const currentClass = this.getClass(); + const baseClass = await this.getBaseClass(); + if (await this.getUseExtraResource()) { + return currentClass?.data?.data.extraResourceNamePlural || baseClass?.data?.data.extraResourceNamePlural; + } + } + + async getExtraResourceFormulaLabel() { + const currentClass = this.getClass(); + const baseClass = await this.getBaseClass(); + if (await this.getUseExtraResource()) { + return currentClass?.data?.data.extraResourceFormulaLabel || baseClass?.data?.data.extraResourceFormulaLabel; + } + } + + async getLuckDie() { + const currentClass = this.getClass(); + const baseClass = await this.getBaseClass(); + return baseClass ? baseClass.data.data.luckDie : currentClass.data.data.luckDie; } } diff --git a/module/actor/sheet/actor-sheet.js b/module/actor/sheet/actor-sheet.js index 81fb4b65..45b78947 100644 --- a/module/actor/sheet/actor-sheet.js +++ b/module/actor/sheet/actor-sheet.js @@ -174,7 +174,7 @@ export default class PBActorSheet extends ActorSheet { * * @param {MouseEvent} event The originating left click event */ - _onItemRoll(event) { + _onItemRoll(event) { event.preventDefault(); const button = $(event.currentTarget); const r = new Roll(button.data("roll"), this.actor.getRollData()); diff --git a/module/actor/sheet/character-sheet.js b/module/actor/sheet/character-sheet.js index 2563fd58..a6d6e62e 100644 --- a/module/actor/sheet/character-sheet.js +++ b/module/actor/sheet/character-sheet.js @@ -75,8 +75,18 @@ export class PBActorSheetCharacter extends PBActorSheet { async _prepareCharacterItems(sheetData) { const byName = (a, b) => (a.name > b.name ? 1 : b.name > a.name ? -1 : 0); const byType = (a, b) => (a.type.toLowerCase() > b.type.toLowerCase() ? 1 : b.type.toLowerCase() > a.type.toLowerCase() ? -1 : 0); - - sheetData.data.class = sheetData.items.find((item) => item.type === CONFIG.PB.itemTypes.class); + const groupByType = (items, item) => { + const key = item.data.featureType || item.data.invokableType || item.type; + let group = items.find((i) => i.type === key); + if (!group) { + group = { type: key, items: [] }; + items.push(group); + } + group.items.push(item); + return items; + }; + + sheetData.data.class = this.actor.getClass(); sheetData.data.equipment = sheetData.items .filter((item) => CONFIG.PB.itemEquipmentTypes.includes(item.type)) @@ -96,41 +106,22 @@ export class PBActorSheetCharacter extends PBActorSheet { sheetData.data.ammo = sheetData.items.filter((item) => item.type === CONFIG.PB.itemTypes.ammo).sort(byName); sheetData.data.features = sheetData.items - .filter( - (item) => item.type === CONFIG.PB.itemTypes.feature || item.type === CONFIG.PB.itemTypes.background || item.type === CONFIG.PB.itemTypes.invokable - ) - .filter((item) => !(item.data.invokableType === "Arcane Ritual" || item.data.invokableType === "Ancient Relic")) - .reduce((items, item) => { - const key = item.data.featureType || item.data.invokableType || item.type; - let group = items.find((i) => i.type === key); - if (!group) { - group = { type: key, items: [] }; - items.push(group); - } - group.items.push(item); - return items; - }, []) + .filter((item) => [CONFIG.PB.itemTypes.feature, CONFIG.PB.itemTypes.background, CONFIG.PB.itemTypes.invokable].includes(item.type)) + .filter((item) => !["Arcane Ritual", "Ancient Relic"].includes(item.data.invokableType)) + .reduce(groupByType, []) .sort(byType); sheetData.data.invokables = sheetData.items - .filter((item) => item.type === CONFIG.PB.itemTypes.invokable) - .filter((item) => item.data.invokableType === "Arcane Ritual" || item.data.invokableType === "Ancient Relic") - .reduce((items, item) => { - const key = item.data.invokableType; - let group = items.find((i) => i.type === key); - if (!group) { - group = { type: key, items: [] }; - items.push(group); - } - group.items.push(item); - return items; - }, []) + .filter((item) => [CONFIG.PB.itemTypes.invokable].includes(item.type)) + .filter((item) => ["Arcane Ritual", "Ancient Relic"].includes(item.data.invokableType)) + .reduce(groupByType, []) .sort(byType); - if (sheetData.data.baseClass) { - sheetData.data.baseClass = (await this.actor.getBaseClass()).data; - } - + sheetData.data.baseClass = (await this.actor.getBaseClass())?.data; + sheetData.data.useExtraResource = await this.actor.getUseExtraResource(); + sheetData.data.extraResourceNamePlural = await this.actor.getExtraResourceNamePlural(); + sheetData.data.extraResourceFormulaLabel = await this.actor.getExtraResourceFormulaLabel(); + sheetData.data.luckDie = await this.actor.getLuckDie(); console.log(sheetData.data); } diff --git a/module/combat.js b/module/combat.js index a59b48b3..472e83c7 100644 --- a/module/combat.js +++ b/module/combat.js @@ -10,11 +10,7 @@ export const rollPartyInitiative = async () => { await ChatMessage.create({ content: await renderTemplate(PARTY_INITIATIVE_ROLL_CARD_TEMPLATE, { initiativeRoll, - outcomeText: game.i18n.localize( - initiativeRoll.total <= 3 - ? "PB.InitiativeEnemiesBegin" - : "PB.InitiativePlayerCharactersBegin" - ) + outcomeText: game.i18n.localize(initiativeRoll.total <= 3 ? "PB.InitiativeEnemiesBegin" : "PB.InitiativePlayerCharactersBegin"), }), type: CONST.CHAT_MESSAGE_TYPES.ROLL, roll: initiativeRoll, @@ -75,7 +71,7 @@ export class PBCombat extends Combat { // v9+ return combatant.token.data.disposition === 1; } else { - return false + return false; } } diff --git a/module/item/sheet/item-sheet.js b/module/item/sheet/item-sheet.js index f7a180be..79b810f1 100644 --- a/module/item/sheet/item-sheet.js +++ b/module/item/sheet/item-sheet.js @@ -18,7 +18,7 @@ export class PBItemSheet extends ItemSheet { initial: "description", }, ], - dragDrop: [{ dropSelector: 'textarea[name="data.startingBonusItems"]' }], + dragDrop: [{ dropSelector: 'textarea[name="data.startingBonusItems"]' }, { dropSelector: 'textarea[name="data.startingBonusRolls"]' }], }); } @@ -86,12 +86,15 @@ export class PBItemSheet extends ItemSheet { return; } - if (data?.type !== "Item" || !data?.id) { + if (!data?.pack || !data?.id) { + ui.notifications.error(game.i18n.localize("PB.StartingBonusDropInvalid")); return; } - if (!data?.pack) { - ui.notifications.error(game.i18n.localize("PB.StartingBonusItemInvalid")); + if ( + (event.target?.name === "data.startingBonusItems" && data?.type !== "Item") || + (event.target?.name === "data.startingBonusRolls" && data?.type !== "RollTable") + ) { return; } diff --git a/module/scvm/scvmfactory.js b/module/scvm/scvmfactory.js index 80394f79..698c2428 100644 --- a/module/scvm/scvmfactory.js +++ b/module/scvm/scvmfactory.js @@ -137,12 +137,10 @@ export const rollLuck = (luckDie) => { }).total; }; -export const rollHitPoints = (startingHitPoints, toughness) => { - return ( - new Roll(startingHitPoints).evaluate({ - async: false, - }).total + toughness - ); +export const rollHitPoints = async (startingHitPoints, toughness) => { + const roll = new Roll(startingHitPoints); + const hp = (await roll.evaluate()).total + toughness; + return hp < 0 ? 1 : hp; }; export const rollSilver = (background) => { @@ -299,7 +297,7 @@ export const generateDescription = (clazz, items) => { }; const executeCompendiumMacro = async (compendiumMacro, parameters = {}) => { - const [compendium, macroName] = compendiumInfoFromString(compendiumMacro); + const [compendium, macroName] = compendiumInfoFromString(compendiumMacro || ""); if (compendium && macroName) { const macro = await findCompendiumItem(compendium, macroName); executeMacro(macro, parameters); @@ -334,7 +332,7 @@ export const rollScvmForClass = async (clazz) => { const name = await rollName(); const abilities = rollAbilities(data); const luck = rollLuck(data.luckDie); - const hitPoints = rollHitPoints(data.startingHitPoints, abilities.toughness); + const hitPoints = await rollHitPoints(data.startingHitPoints, abilities.toughness); const baseTables = await rollBaseTables(); const background = baseTables.find((item) => item.type === CONFIG.PB.itemTypes.background); @@ -351,19 +349,14 @@ export const rollScvmForClass = async (clazz) => { const startingItems = await findItems(clazz.data.data.startingItems); // Both of the rolls should loop until nothing is returning to have a kind of recursive configuration - const startingBonusItems = await findStartingBonusItems([ - ...(features || []), - ...(startingItems || []), - ...(startingRollItems || []), - background - ]); + const startingBonusItems = await findStartingBonusItems([...(features || []), ...(startingItems || []), ...(startingRollItems || []), background]); const startingBonusRollItems = await findStartingBonusRollsItems([ - ...(features || []), + ...(features || []), ...(startingItems || []), ...(startingRollItems || []), - ...(startingBonusItems || []), - background + ...(startingBonusItems || []), + background, ]); const description = generateDescription(clazz, baseTables); @@ -380,13 +373,12 @@ export const rollScvmForClass = async (clazz) => { clazz, ]; - const powerUsesRoll = new Roll(`1d4 + ${abilities.spirit}`).evaluate({async: false}); - const extraResourceRoll = new Roll(`1d4 + ${abilities.spirit}`).evaluate({async: false}); + const powerUsesRoll = new Roll(`1d4 + ${abilities.spirit}`).evaluate({ async: false }); + const extraResourceRoll = new Roll(`1d4 + ${abilities.spirit}`).evaluate({ async: false }); return { name, actorImg: clazz.img, - tokenImg: clazz.img, hitPoints, luck, ...abilities, @@ -432,7 +424,10 @@ const scvmToActorData = (s) => { img: s.actorImg, items: s.items.map((i) => { return { - data: i.data.data, + data: { + ...i.data.data, + ...([CONFIG.PB.itemTypes.weapon, CONFIG.PB.itemTypes.armor, CONFIG.PB.itemTypes.hat].includes(i.type) ? { equipped: true } : {}), + }, img: i.data.img, name: i.data.name, type: i.data.type, @@ -457,7 +452,7 @@ export const createActorWithScvm = async (s) => { export const updateActorWithScvm = async (actor, s) => { const data = scvmToActorData(s); - await actor.deleteEmbeddedDocuments("Item", [], { deleteAll: true }); + await actor.deleteEmbeddedDocuments("Item", [], { deleteAll: true, render: false }); await actor.update(data); for (const token of actor.getActiveTokens()) { await token.document.update({ diff --git a/module/system/render-actor-directory.js b/module/system/render-actor-directory.js index e8cbb388..02682700 100755 --- a/module/system/render-actor-directory.js +++ b/module/system/render-actor-directory.js @@ -13,7 +13,7 @@ export const renderActorDirectory = (app, html) => { "afterbegin", `
` ); diff --git a/packs/backgrounds.db b/packs/backgrounds.db index f573a01d..d367b38f 100755 --- a/packs/backgrounds.db +++ b/packs/backgrounds.db @@ -56,7 +56,7 @@ {"_id":"kHiWeTXrQZ6yO4ez","name":"Scoundrel","type":"background","img":"systems/pirateborg/icons/misc/background.png","data":{"description":"2d8 x 10s & a few enemies along the way
","startingGold":"2d8 * 10","quantity":1,"startingBonusItems":"pirateborg.backgrounds-items;few enemies along the way"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} {"_id":"khKmmRit5PXkFwET","name":"Bosun","type":"background","img":"systems/pirateborg/icons/misc/background.png","data":{"description":"2d6 x 10s & the respect of some crew
","startingGold":"2d6 * 10","quantity":1,"startingBonusItems":"pirateborg.backgrounds-items;the respect of some crew"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} {"_id":"koEEF4ZvvonOW7WK","name":"Cultist","type":"background","img":"systems/pirateborg/icons/misc/background.png","data":{"description":"2d6 x 10s & a book of scripture
","startingGold":"2d6 * 10","quantity":1,"startingBonusItems":"pirateborg.feature-thing-of-importance;a book of scripture"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} -{"_id":"kqZxtcxXvfKJpA74","name":"Blacksmith","type":"background","img":"systems/pirateborg/icons/misc/background.png","data":{"description":"2d6 x 10s & a set of files and tools
","startingGold":"2d6 * 10","quantity":1,"startingBonusItems":"pirateborg.equipment-gear;Metal file\npirateborg.backgrounds-items;set of tools"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"kqZxtcxXvfKJpA74","name":"Blacksmith","type":"background","img":"systems/pirateborg/icons/misc/background.png","data":{"description":"2d6 x 10s & a set of files and tools
","startingGold":"2d6 * 10","quantity":1,"startingBonusItems":"pirateborg.equipment-gear;Metal file\npirateborg.backgrounds-items;set of tools","startingBonusRolls":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} {"_id":"lNNRIrmVRbfwt2wn","name":"Soldier","type":"background","img":"systems/pirateborg/icons/misc/background.png","data":{"description":"2d6 x 10s & a tactical mind
","startingGold":"2d6 * 10","quantity":1,"startingBonusItems":"pirateborg.backgrounds-items;tactical mind"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} {"_id":"mZeaPRRsh2T4tpl4","name":"Revolutionary","type":"background","img":"systems/pirateborg/icons/misc/background.png","data":{"description":"2d6 x 10s & bold plans and a few allies
","startingGold":"2d6 * 10","quantity":1,"startingBonusItems":"pirateborg.backgrounds-items;bold plans and a few allies"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} {"_id":"nU6uDIrNQR4xVjGV","name":"Gambler","type":"background","img":"systems/pirateborg/icons/misc/background.png","data":{"description":"1d12 x 10s & a sizable debt
","startingGold":"1d12 * 10","quantity":1,"startingBonusItems":"pirateborg.backgrounds-items;sizable debt"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} @@ -79,4 +79,3 @@ {"_id":"zR3yzsYmtMnbkH30","name":"Former captive","type":"background","img":"systems/pirateborg/icons/misc/background.png","data":{"description":"2d4 x 10s & your freedom
","startingGold":"2d4 * 10","quantity":1,"startingBonusItems":"pirateborg.backgrounds-items;your freedom"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} {"_id":"zYtisv7EoFeF6gF9","name":"Quartermaster","type":"background","img":"systems/pirateborg/icons/misc/background.png","data":{"description":"2d6 x 10s & the respect of a ship's crew
","startingGold":"2d6 * 10","quantity":1,"startingBonusItems":"pirateborg.backgrounds-items;the respect of a ship's crew"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} {"_id":"zr9jEZJ3QitYWE9Z","name":"Medic","type":"background","img":"systems/pirateborg/icons/misc/background.png","data":{"description":"2d6 x 10s & a medical kit
","startingGold":"2d6 * 10","quantity":1,"startingBonusItems":"pirateborg.equipment-gear;Medical kit"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} -{"_id":"kqZxtcxXvfKJpA74","name":"Blacksmith","type":"background","img":"systems/pirateborg/icons/misc/background.png","data":{"description":"2d6 x 10s & a set of files and tools
","startingGold":"2d6 * 10","quantity":1,"startingBonusItems":"pirateborg.equipment-gear;Metal file\npirateborg.backgrounds-items;set of tools","startingBonusRolls":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} diff --git a/packs/class-buccaneer.db b/packs/class-buccaneer.db index 6cf2e949..6a7ff48e 100755 --- a/packs/class-buccaneer.db +++ b/packs/class-buccaneer.db @@ -1,26 +1,9 @@ {"_id":"2UrikGJeiCaJAUrH","name":"Exquisite smoked meat","type":"misc","img":"systems/pirateborg/icons/equipment/gear/dried-food.png","data":{"description":"Eating it immediately recovers d4 hp
","containerSpace":1,"carryWeight":1,"equipped":false,"carried":true,"price":0,"quantity":1,"actionMacro":"","actionMacroLabel":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} -{"_id":"AxeYPFRnlVp2Z2Fv","name":"Fast Reloading","type":"feature","img":"systems/pirateborg/icons/misc/class-feature.png","data":{"description":"Reloading takes 1 round instead of 2
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"AxeYPFRnlVp2Z2Fv","name":"Fast Reloading","type":"feature","img":"systems/pirateborg/icons/misc/class-feature.png","data":{"description":"Reloading takes 1 round instead of 2
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"","startingBonusRolls":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} {"_id":"F8mnXcDUFOeAp141","name":"Buccan Cook","type":"feature","img":"systems/pirateborg/icons/misc/class-feature.png","data":{"description":"Months of island life have taught you the fine art of cooking meats over the buccan fire. You start with d8 rations of exquisite smoked meat. Eating it immediately recovers d4 hp, and you can make d4 more rations from any edible animal you kill. If taken again: recover d6.
","featureType":"Class","maxQuantity":2,"quantity":1,"actionMacro":"pirateborg.macros-pirateborg;Generic Item","actionMacroLabel":"Use","startingBonusItems":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} -{"name":"Fast Reloader","type":"feature","img":"systems/pirateborg/icons/misc/class-feature.png","data":{"description":"You can reload and shoot in the same turn. Can only be taken once.
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"pirateborg.macros-pirateborg;Generic Item","actionMacroLabel":"Use","startingBonusItems":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.AxeYPFRnlVp2Z2Fv"}},"_id":"a44UBgayTh0aBtcy"} +{"_id":"a44UBgayTh0aBtcy","name":"Fast Reloader","type":"feature","img":"systems/pirateborg/icons/misc/class-feature.png","data":{"description":"You can reload and shoot in the same turn. Can only be taken once.
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"pirateborg.macros-pirateborg;Generic Item","actionMacroLabel":"Use","startingBonusItems":"","startingBonusRolls":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.AxeYPFRnlVp2Z2Fv"}}} {"_id":"aLnujMWeM7tsNsek","name":"Survivalist","type":"feature","img":"systems/pirateborg/icons/misc/class-feature.png","data":{"description":"Your body has developed into a finely tuned machine for existing in the wild. -2 DR to toughness checks. If taken again: -4 DR.
","featureType":"Class","maxQuantity":2,"quantity":1,"actionMacro":"pirateborg.macros-pirateborg;Generic Item","actionMacroLabel":"Use","startingBonusItems":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} {"_id":"bddji3nIZctPA8tg","name":"Buccaneer","type":"class","img":"systems/pirateborg/icons/misc/class.png","data":{"description":"Expert sharpshooter, especially with muskets & rifles. Skilled trackers and survivalists. You start with a musket, and reloading takes 1 round instead of 2.
","flavorText":"Expert sharpshooter, especially with muskets & rifles. Skilled trackers and survivalists.","luckDie":"1d2","startingArmorTableFormula":"1d10","startingWeaponTableFormula":"","startingHatTableFormula":"1d12","startingHitPoints":"1d10","startingItems":"pirateborg.equipment-ranged-weapons;Musket\npirateborg.equipment-ammo;Rounds of shot\npirateborg.class-buccaneer;Fast Reloading","startingRolls":"pirateborg.rolls-buccaneer;Features;1","startingMacro":"","gettingBetterRolls":"pirateborg.rolls-buccaneer;Features;1","gettingBetterMacro":"","useExtraResource":false,"extraResourceNameSingular":"","extraResourceNamePlural":"","extraResourceFormula":"","extraResourceFormulaLabel":"","extraResourceTestFormula":"","extraResourceTestFormulaLabel":"","requireBaseClass":false,"skipCharacterGenerator":"","startingAbilityScoreFormula":"3d6","startingStrengthBonus":"0","startingAgilityBonus":"-1","startingPresenceBonus":"+2","startingToughnessBonus":"0","startingSpiritBonus":"-1","characterGeneratorMacro":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} {"_id":"faput8RkeUiNkwzx","name":"Crack Shot","type":"feature","img":"systems/pirateborg/icons/misc/class-feature.png","data":{"description":"All ranged attacks are DR10. If taken again, DR8.
","featureType":"Class","maxQuantity":2,"quantity":1,"actionMacro":"pirateborg.macros-pirateborg;Generic Item","actionMacroLabel":"Use","startingBonusItems":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} {"_id":"lgzHS7vSvM7xgDOv","name":"Wildlife Tracker","type":"feature","img":"systems/pirateborg/icons/misc/class-feature.png","data":{"description":"When tracking, you always know your target’s direction from your current location, and can tell approximately how long ago it left. Can only be taken once.
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"pirateborg.macros-pirateborg;Generic Item","actionMacroLabel":"Use","startingBonusItems":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} {"_id":"vKcCqgp5tTmwYaWd","name":"Focused Aim","type":"feature","img":"systems/pirateborg/icons/misc/class-feature.png","data":{"description":"Attacks to hit an enemy you have already shot at this combat are DR8. If taken again: they also deal d4 extra damage.
","featureType":"Class","maxQuantity":2,"quantity":1,"actionMacro":"pirateborg.macros-pirateborg;Generic Item","actionMacroLabel":"Use","startingBonusItems":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} -{"_id":"a44UBgayTh0aBtcy","name":"Fast Reloader","type":"feature","img":"systems/pirateborg/icons/misc/class-feature.png","data":{"description":"You can reload and shoot in the same turn. Can only be taken once.
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"pirateborg.macros-pirateborg;Generic Item","actionMacroLabel":"Use","startingBonusItems":"","startingBonusRolls":"pirateborg.class-pirateborg;Generic Item"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.AxeYPFRnlVp2Z2Fv"}}} -{"_id":"a44UBgayTh0aBtcy","name":"Fast Reloader","type":"feature","img":"systems/pirateborg/icons/misc/class-feature.png","data":{"description":"You can reload and shoot in the same turn. Can only be taken once.
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"pirateborg.macros-pirateborg;Generic Item","actionMacroLabel":"Use","startingBonusItems":"","startingBonusRolls":"pirateborg.rolls-character-creation;d12 Arcane Rituals"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.AxeYPFRnlVp2Z2Fv"}}} -{"_id":"a44UBgayTh0aBtcy","name":"Fast Reloader","type":"feature","img":"systems/pirateborg/icons/misc/class-feature.png","data":{"description":"You can reload and shoot in the same turn. Can only be taken once.
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"pirateborg.macros-pirateborg;Generic Item","actionMacroLabel":"Use","startingBonusItems":"","startingBonusRolls":"pirateborg.rolls-character-creation;d12 Arcane rituals"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.AxeYPFRnlVp2Z2Fv"}}} -{"_id":"a44UBgayTh0aBtcy","name":"Fast Reloader","type":"feature","img":"systems/pirateborg/icons/misc/class-feature.png","data":{"description":"You can reload and shoot in the same turn. Can only be taken once.
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"pirateborg.macros-pirateborg;Generic Item","actionMacroLabel":"Use","startingBonusItems":"","startingBonusRolls":"pirateborg.rolls-character-creation;d20 Arcane rituals"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.AxeYPFRnlVp2Z2Fv"}}} -{"_id":"a44UBgayTh0aBtcy","name":"Fast Reloader","type":"feature","img":"systems/pirateborg/icons/misc/class-feature.png","data":{"description":"You can reload and shoot in the same turn. Can only be taken once.
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"pirateborg.macros-pirateborg;Generic Item","actionMacroLabel":"Use","startingBonusItems":"","startingBonusRolls":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.AxeYPFRnlVp2Z2Fv"}}} -{"_id":"a44UBgayTh0aBtcy","name":"Fast Reloader","type":"feature","img":"systems/pirateborg/icons/misc/class-feature.png","data":{"description":"You can reload and shoot in the same turn. Can only be taken once.
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"pirateborg.macros-pirateborg;Generic Item","actionMacroLabel":"Use","startingBonusItems":"","startingBonusRolls":"pirateborg.rolls-sorcerer;Sorceries;1"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.AxeYPFRnlVp2Z2Fv"}}} -{"_id":"a44UBgayTh0aBtcy","name":"Fast Reloader","type":"feature","img":"systems/pirateborg/icons/misc/class-feature.png","data":{"description":"You can reload and shoot in the same turn. Can only be taken once.
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"pirateborg.macros-pirateborg;Generic Item","actionMacroLabel":"Use","startingBonusItems":"","startingBonusRolls":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.AxeYPFRnlVp2Z2Fv"}}} -{"_id":"AxeYPFRnlVp2Z2Fv","name":"Fast Reloading","type":"feature","img":"systems/pirateborg/icons/misc/class-feature.png","data":{"description":"Reloading takes 1 round instead of 2
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"","startingBonusRolls":"pirateborg.rolls-sorcerer;Sorceries;1"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} -{"_id":"AxeYPFRnlVp2Z2Fv","name":"Fast Reloading","type":"feature","img":"systems/pirateborg/icons/misc/class-feature.png","data":{"description":"Reloading takes 1 round instead of 2
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"","startingBonusRolls":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} -{"_id":"a44UBgayTh0aBtcy","name":"Fast Reloader","type":"feature","img":"systems/pirateborg/icons/misc/class-feature.png","data":{"description":"You can reload and shoot in the same turn. Can only be taken once.
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"pirateborg.macros-pirateborg;Generic Item","actionMacroLabel":"Use","startingBonusItems":"","startingBonusRolls":"pirateborg.rolls-sorcerer;Sorceries;1"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.AxeYPFRnlVp2Z2Fv"}}} -{"_id":"a44UBgayTh0aBtcy","name":"Fast Reloader","type":"feature","img":"systems/pirateborg/icons/misc/class-feature.png","data":{"description":"You can reload and shoot in the same turn. Can only be taken once.
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"pirateborg.macros-pirateborg;Generic Item","actionMacroLabel":"Use","startingBonusItems":"","startingBonusRolls":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.AxeYPFRnlVp2Z2Fv"}}} -{"_id":"AxeYPFRnlVp2Z2Fv","name":"Fast Reloading","type":"feature","img":"systems/pirateborg/icons/misc/class-feature.png","data":{"description":"Reloading takes 1 round instead of 2
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"","startingBonusRolls":"pirateborg.rolls-sorcerer;Sorceries;1"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} -{"_id":"AxeYPFRnlVp2Z2Fv","name":"Fast Reloading","type":"feature","img":"systems/pirateborg/icons/misc/class-feature.png","data":{"description":"Reloading takes 1 round instead of 2
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"","startingBonusRolls":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} -{"_id":"AxeYPFRnlVp2Z2Fv","name":"Fast Reloading","type":"feature","img":"systems/pirateborg/icons/misc/class-feature.png","data":{"description":"Reloading takes 1 round instead of 2
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"","startingBonusRolls":"pirateborg.rolls-sorcerer;Sorceries;1"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} -{"_id":"AxeYPFRnlVp2Z2Fv","name":"Fast Reloading","type":"feature","img":"systems/pirateborg/icons/misc/class-feature.png","data":{"description":"Reloading takes 1 round instead of 2
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"","startingBonusRolls":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} -{"_id":"AxeYPFRnlVp2Z2Fv","name":"Fast Reloading","type":"feature","img":"systems/pirateborg/icons/misc/class-feature.png","data":{"description":"Reloading takes 1 round instead of 2
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"","startingBonusRolls":"pirateborg.rolls-sorcerer;Sorceries;1"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} -{"_id":"AxeYPFRnlVp2Z2Fv","name":"Fast Reloading","type":"feature","img":"systems/pirateborg/icons/misc/class-feature.png","data":{"description":"Reloading takes 1 round instead of 2
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"","startingBonusRolls":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} diff --git a/packs/class-landlubber.db b/packs/class-landlubber.db index f75c4703..0250a709 100755 --- a/packs/class-landlubber.db +++ b/packs/class-landlubber.db @@ -1 +1,2 @@ {"_id":"Y7sb7dOQ8lXr4fYK","name":"Landlubber","type":"class","img":"systems/pirateborg/icons/misc/class.png","data":{"description":"","flavorText":"","luckDie":"1d2","startingArmorTableFormula":"1d10","startingWeaponTableFormula":"1d10","startingHatTableFormula":"1d12","startingHitPoints":"1d10","startingItems":"","startingRolls":"","startingMacro":"","gettingBetterRolls":"","gettingBetterMacro":"","useExtraResource":false,"extraResourceFormula":"","startingAbilityScoreFormula":"4d6dl","startingStrengthBonus":"","startingAgilityBonus":"","startingPresenceBonus":"","startingToughnessBonus":"","startingSpiritBonus":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"Y7sb7dOQ8lXr4fYK","name":"Landlubber","type":"class","img":"systems/pirateborg/icons/misc/class.png","data":{"description":"","flavorText":"","luckDie":"1d2","startingArmorTableFormula":"1d10","startingWeaponTableFormula":"1d10","startingHatTableFormula":"1d12","startingAbilityScoreFormula":"4d6dl","startingAgilityBonus":"","startingPresenceBonus":"","startingStrengthBonus":"","startingToughnessBonus":"","startingSpiritBonus":"","startingHitPoints":"1d10","startingItems":"","startingRolls":"","startingMacro":"","gettingBetterRolls":"","gettingBetterMacro":"","useExtraResource":false,"extraResourceNameSingular":"","extraResourceNamePlural":"","extraResourceFormula":"","extraResourceFormulaLabel":"","extraResourceTestFormula":"","extraResourceTestFormulaLabel":"","requireBaseClass":false,"characterGeneratorMacro":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} diff --git a/packs/class-tall-tale.db b/packs/class-tall-tale.db index e69de29b..5dbf3d4a 100755 --- a/packs/class-tall-tale.db +++ b/packs/class-tall-tale.db @@ -0,0 +1,52 @@ +{"_id":"36B5BJPdwYbBQutL","name":"Merfolk","type":"feature","img":"systems/pirateborg/icons/classes/tall-tale/merfolk.png","data":{"description":"One of the children of Poseidon, your lower half is fish-like and you have gills. Both can be magically hidden as you masquerade as a human. Lower all DRs by 4 when underwater. You will die if you go 1+toughness days without submerging in fresh seawater (minimum 1 day). Roll d6 to gain an additional class.
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"","startingBonusRolls":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.lco7XqcFzkaMkw0W"}}} +{"_id":"3cyYeSPQD1dj3AAC","name":"Sentient Animal","type":"feature","img":"systems/pirateborg/icons/classes/tall-tale/sentient-animal.png","data":{"description":"You are a magically intelligent animal (d6). Maybe you were human once. When you begin:
\n— Roll 3d6 for each stat. You get -2 to all of your modifiers except as listed.
\n— Reroll any backstory details that don't make sense.
\n— Equipment you can't conceivable carry can be given away or left behind.
\n— Devil's Luck: d4
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"","startingBonusRolls":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.lco7XqcFzkaMkw0W"}}} +{"_id":"4qW6PHlQ23EX4jBd","name":"Foul Fowl","type":"feature","img":"systems/pirateborg/icons/classes/tall-tale/foul-fowl.png","data":{"description":"Gain the ability from one random relic & one random ritual. When you are killed, the ghosts of a hundred chickens swarm your assailant, ripping their spiritual soul from their flesh.
\nSpirit: +3.
\nHP: d4+toughness.
\nBeak Peck: d2
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"pirateborg.class-tall-tale;Foul Fowl - Beak Peck","startingBonusRolls":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.lco7XqcFzkaMkw0W"}}} +{"_id":"C8LdpjrOpMpyZB98","name":"Bilge Rat","type":"feature","img":"systems/pirateborg/icons/classes/tall-tale/bilge-rat.png","data":{"description":"You are a filthy rodent.
\nAgility: +3.
\nToughness: +2.
\nHP: d2+toughness.
\nDiseased Bite: d2 damage, 1 in 6 chance the target dies in d4 rounds from whatever disease you are carrying.
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"pirateborg.class-tall-tale;Bilge Rat - Diseased Bite","startingBonusRolls":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.lco7XqcFzkaMkw0W"}}} +{"_id":"GGf7XeEppvQ7j6BX","name":"Electric Eel","type":"feature","img":"systems/pirateborg/icons/classes/tall-tale/electric-eel.png","data":{"description":"+1 to Agility. Electric skin: d6.
","featureType":"Ancestry","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"pirateborg.class-tall-tale;Electric Eel - Electric skin","startingBonusRolls":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.lco7XqcFzkaMkw0W"}}} +{"_id":"KQQdtKQo7BYPa3qi","name":"Crab - Pincher","type":"weapon","img":"systems/pirateborg/icons/classes/tall-tale/crab.png","data":{"description":"","containerSpace":0,"carryWeight":0,"equipped":false,"carried":true,"price":0,"quantity":1,"actionMacro":"","actionMacroLabel":"","damageDie":"1d6","critOn":20,"critExtraDamage":"","handed":"1","fumbleOn":1,"usesAmmo":false,"useAmmoDamage":false,"weaponType":"melee","isGunpowderWeapon":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"L58AQyVEs6OSQTb4","name":"Electric Eel - Electric skin","type":"weapon","img":"systems/pirateborg/icons/classes/tall-tale/electric-eel.png","data":{"description":"","containerSpace":0,"carryWeight":0,"equipped":false,"carried":true,"price":0,"quantity":1,"actionMacro":"","actionMacroLabel":"","damageDie":"1d6","critOn":20,"critExtraDamage":"","handed":"1","fumbleOn":1,"usesAmmo":false,"useAmmoDamage":false,"weaponType":"melee","isGunpowderWeapon":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.iv79nVBPq9GWVZTe"}}} +{"_id":"PtDse6LgQ9ySWqZy","name":"Foul Fowl - Beak Peck","type":"weapon","img":"systems/pirateborg/icons/classes/tall-tale/foul-fowl.png","data":{"description":"","containerSpace":0,"carryWeight":0,"equipped":false,"carried":true,"price":0,"quantity":1,"actionMacro":"","actionMacroLabel":"","damageDie":"1d2","critOn":20,"critExtraDamage":"","handed":"1","fumbleOn":1,"usesAmmo":false,"useAmmoDamage":false,"weaponType":"melee","isGunpowderWeapon":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.zSblw6Wl7fvhEsUk"}}} +{"_id":"Q6As123ncIeUKQRI","name":"The Great Old One","type":"feature","img":"systems/pirateborg/icons/classes/tall-tale/the-great-old-one.png","data":{"description":"Learn one random Arcane Ritual.
","featureType":"Ancestry","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"","startingBonusRolls":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.lco7XqcFzkaMkw0W"}}} +{"_id":"TDsJBLUG3b0P868Z","name":"Tall Tale","type":"class","img":"systems/pirateborg/icons/misc/class.png","data":{"description":"","flavorText":"","luckDie":"","startingArmorTableFormula":"","startingWeaponTableFormula":"","startingHatTableFormula":"","startingAbilityScoreFormula":"","startingAgilityBonus":"","startingPresenceBonus":"","startingStrengthBonus":"","startingToughnessBonus":"","startingSpiritBonus":"","startingHitPoints":"","startingItems":"","startingRolls":"","startingMacro":"","gettingBetterRolls":"","gettingBetterMacro":"","useExtraResource":false,"extraResourceNameSingular":"","extraResourceNamePlural":"","extraResourceFormula":"","extraResourceFormulaLabel":"","extraResourceTestFormula":"","extraResourceTestFormulaLabel":"","requireBaseClass":true,"characterGeneratorMacro":"","startingAbilityScoreFormula ":"3d6","startingAgilityBonus ":0,"startingPresenceBonus ":0,"startingStrengthBonus ":0,"startingToughnessBonus ":0,"startingSpiritBonus ":0,"skipCharacterGenerator":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"UH3S40NRBY8Cczbj","name":"Crocodile - Bite","type":"weapon","img":"systems/pirateborg/icons/classes/tall-tale/crocodile.png","data":{"description":"","containerSpace":0,"carryWeight":0,"equipped":false,"carried":true,"price":0,"quantity":1,"actionMacro":"","actionMacroLabel":"","damageDie":"1d10","critOn":20,"critExtraDamage":"","handed":"1","fumbleOn":1,"usesAmmo":false,"useAmmoDamage":false,"weaponType":"melee","isGunpowderWeapon":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.zSblw6Wl7fvhEsUk"}}} +{"_id":"VijIdnYVecVxfw9t","name":"Octopus - Tentacles","type":"weapon","img":"systems/pirateborg/icons/classes/tall-tale/octopus.png","data":{"description":"","containerSpace":0,"carryWeight":0,"equipped":false,"carried":true,"price":0,"quantity":1,"actionMacro":"","actionMacroLabel":"","damageDie":"2d4","critOn":20,"critExtraDamage":"","handed":"1","fumbleOn":1,"usesAmmo":false,"useAmmoDamage":false,"weaponType":"melee","isGunpowderWeapon":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.iv79nVBPq9GWVZTe"}}} +{"_id":"WsNJPvaU4ZhZJ1MY","name":"Crab","type":"feature","img":"systems/pirateborg/icons/classes/tall-tale/crab.png","data":{"description":"Pincher: d6.
","featureType":"Ancestry","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"pirateborg.class-tall-tale;Crab - Pincher","startingBonusRolls":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.lco7XqcFzkaMkw0W"}}} +{"_id":"X3vmZDImpRpX3c0p","name":"Lucky Parrot - Beak Peck","type":"weapon","img":"systems/pirateborg/icons/classes/tall-tale/lucky-parrot.png","data":{"description":"","containerSpace":0,"carryWeight":0,"equipped":false,"carried":true,"price":0,"quantity":1,"actionMacro":"","actionMacroLabel":"","damageDie":"1d4","critOn":20,"critExtraDamage":"","handed":"1","fumbleOn":1,"usesAmmo":false,"useAmmoDamage":false,"weaponType":"melee","isGunpowderWeapon":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.zSblw6Wl7fvhEsUk"}}} +{"_id":"XY7AuM6Nfm1lcidC","name":"Anglerfish - Bite","type":"weapon","img":"systems/pirateborg/icons/classes/tall-tale/angler-fish.png","data":{"description":"","containerSpace":0,"carryWeight":0,"equipped":false,"carried":true,"price":0,"quantity":1,"actionMacro":"","actionMacroLabel":"","damageDie":"1d4","critOn":20,"critExtraDamage":"","handed":"1","fumbleOn":1,"usesAmmo":false,"useAmmoDamage":false,"weaponType":"melee","isGunpowderWeapon":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"ZcHqxygyR62oZho0","name":"Clever Monkey - Bite","type":"weapon","img":"systems/pirateborg/icons/classes/tall-tale/clever-monkey.png","data":{"description":"","containerSpace":0,"carryWeight":0,"equipped":false,"carried":true,"price":0,"quantity":1,"actionMacro":"","actionMacroLabel":"","damageDie":"1d4","critOn":20,"critExtraDamage":"","handed":"1","fumbleOn":1,"usesAmmo":false,"useAmmoDamage":false,"weaponType":"melee","isGunpowderWeapon":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.zSblw6Wl7fvhEsUk"}}} +{"_id":"a1dn6FUP6fy7N9r0","name":"Crocodile","type":"feature","img":"systems/pirateborg/icons/classes/tall-tale/crocodile.png","data":{"description":"You can hide & swim well in water
\nStrength: +3.
\nToughness: +1.
\nHP: d10+toughness.
\nBite: d10.
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"pirateborg.class-tall-tale;Crocodile - Bite","startingBonusRolls":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.lco7XqcFzkaMkw0W"}}} +{"_id":"aaOZBmDIb381oY3f","name":"Jaguar - Bite/Claws","type":"weapon","img":"systems/pirateborg/icons/classes/tall-tale/jaguar.png","data":{"description":"","containerSpace":0,"carryWeight":0,"equipped":false,"carried":true,"price":0,"quantity":1,"actionMacro":"","actionMacroLabel":"","damageDie":"1d8","critOn":20,"critExtraDamage":"","handed":"1","fumbleOn":1,"usesAmmo":false,"useAmmoDamage":false,"weaponType":"melee","isGunpowderWeapon":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.zSblw6Wl7fvhEsUk"}}} +{"_id":"bI48oC7ecHauJXnZ","name":"Aquatic Mutant","type":"feature","img":"systems/pirateborg/icons/classes/tall-tale/aquatic-mutant.png","data":{"description":"You are the spawn from an abominable union between man and the sea. Roll d8 to discover what creature makes up half of your ancestry, then roll d6 to gain an additional class.
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"","startingBonusRolls":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.lco7XqcFzkaMkw0W"}}} +{"_id":"eFihUJ3xVpEWIlhu","name":"Shark","type":"feature","img":"systems/pirateborg/icons/classes/tall-tale/shark.png","data":{"description":"Bite: d8
","featureType":"Ancestry","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"pirateborg.class-tall-tale;Shark - Bite","startingBonusRolls":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.lco7XqcFzkaMkw0W"}}} +{"_id":"gc515LVQKxsIf53o","name":"Bilge Rat - Diseased Bite","type":"weapon","img":"systems/pirateborg/icons/classes/tall-tale/bilge-rat.png","data":{"description":"1 in 6 chance the target dies in d4 rounds from whatever disease you are carrying.
","containerSpace":0,"carryWeight":0,"equipped":false,"carried":true,"price":0,"quantity":1,"actionMacro":"","actionMacroLabel":"","damageDie":"1d2","critOn":20,"critExtraDamage":"","handed":"1","fumbleOn":1,"usesAmmo":false,"useAmmoDamage":false,"weaponType":"melee","isGunpowderWeapon":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.zSblw6Wl7fvhEsUk"}}} +{"_id":"iDVD29wjXnI9oDBf","name":"Jaguar","type":"feature","img":"systems/pirateborg/icons/classes/tall-tale/jaguar.png","data":{"description":"You're a deadly jungle cat.
\nStrength: +2.
\nAgility: +2.
\nHP: d8+toughness.
\nBite/Claws: d8.
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"pirateborg.class-tall-tale;Jaguar - Bite/Claws","startingBonusRolls":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.lco7XqcFzkaMkw0W"}}} +{"_id":"iv79nVBPq9GWVZTe","name":"Jellyfish - Tendril","type":"weapon","img":"systems/pirateborg/icons/classes/tall-tale/jellyfish.png","data":{"description":"Stun 1 round, 10 foot reach.
","containerSpace":0,"carryWeight":0,"equipped":false,"carried":true,"price":0,"quantity":1,"actionMacro":"","actionMacroLabel":"","damageDie":"1d2","critOn":20,"critExtraDamage":"","handed":"1","fumbleOn":1,"usesAmmo":false,"useAmmoDamage":false,"weaponType":"melee","isGunpowderWeapon":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"lt6FGtfR0faT7qR4","name":"Anglerfish","type":"feature","img":"systems/pirateborg/icons/classes/tall-tale/angler-fish.png","data":{"description":"See in the dark. Bite: d4.
","featureType":"Ancestry","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"pirateborg.class-tall-tale;Anglerfish - Bite","startingBonusRolls":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.lco7XqcFzkaMkw0W"}}} +{"_id":"sdTjTdmBYkJ4Ak97","name":"Lucky Parrot","type":"feature","img":"systems/pirateborg/icons/classes/tall-tale/lucky-parrot.png","data":{"description":"A colorful, talking, flying bird. Roll d6 for Devil’s Luck points each day.
\nAgility: +1.
\nPresence: +2.
\nHP: d2+toughness.
\nBeak Peck: d4
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"pirateborg.class-tall-tale;Lucky Parrot - Beak Peck","startingBonusRolls":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.lco7XqcFzkaMkw0W"}}} +{"_id":"tK62n6rppvk6QxPk","name":"Octopus","type":"feature","img":"systems/pirateborg/icons/classes/tall-tale/octopus.png","data":{"description":"Tentacles: 2d4.
","featureType":"Ancestry","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"pirateborg.class-tall-tale;Octopus - Tentacles","startingBonusRolls":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.lco7XqcFzkaMkw0W"}}} +{"_id":"tzRkbIPOTs3NZTho","name":"Jellyfish","type":"feature","img":"systems/pirateborg/icons/classes/tall-tale/jellyfish.png","data":{"description":"Tendril: d2 & Stun 1 round, 10 foot reach.
","featureType":"Ancestry","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"pirateborg.class-tall-tale;Jellyfish - Tendril","startingBonusRolls":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.lco7XqcFzkaMkw0W"}}} +{"_id":"yW11H9GNe9cMbgub","name":"Clever Monkey","type":"feature","img":"systems/pirateborg/icons/classes/tall-tale/clever-monkey.png","data":{"description":"You're an excellent climber. Roll d10 for a starting weapon.
\nStrength: -1.
\nAgility: +2.
\nPresence: +0
\nHP: d6+toughness.
\nBite: d4.
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"pirateborg.class-tall-tale;Clever Monkey - Bite","startingBonusRolls":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.lco7XqcFzkaMkw0W"}}} +{"_id":"zSblw6Wl7fvhEsUk","name":"Shark - Bite","type":"weapon","img":"systems/pirateborg/icons/classes/tall-tale/shark.png","data":{"description":"","containerSpace":0,"carryWeight":0,"equipped":false,"carried":true,"price":0,"quantity":1,"actionMacro":"","actionMacroLabel":"","damageDie":"1d8","critOn":20,"critExtraDamage":"","handed":"1","fumbleOn":1,"usesAmmo":false,"useAmmoDamage":false,"weaponType":"melee","isGunpowderWeapon":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"zmF3NfJi9qwNzNhT","name":"Sea Turtle","type":"feature","img":"systems/pirateborg/icons/classes/tall-tale/sea-turtle.png","data":{"description":"Extra -d2 to armor.
","featureType":"Ancestry","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"","startingBonusRolls":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.lco7XqcFzkaMkw0W"}}} +{"_id":"TDsJBLUG3b0P868Z","name":"Tall Tale","type":"class","img":"systems/pirateborg/icons/misc/class.png","data":{"description":"","flavorText":"","luckDie":"","startingArmorTableFormula":"","startingWeaponTableFormula":"","startingHatTableFormula":"","startingAbilityScoreFormula":"","startingAgilityBonus":"","startingPresenceBonus":"","startingStrengthBonus":"","startingToughnessBonus":"","startingSpiritBonus":"","startingHitPoints":"","startingItems":"","startingRolls":"","startingMacro":"","gettingBetterRolls":"","gettingBetterMacro":"","useExtraResource":false,"extraResourceNameSingular":"","extraResourceNamePlural":"","extraResourceFormula":"","extraResourceFormulaLabel":"","extraResourceTestFormula":"","extraResourceTestFormulaLabel":"","requireBaseClass":true,"characterGeneratorMacro":"pirateborg.macros-tall-tale;Character creation","startingAbilityScoreFormula ":"3d6","startingAgilityBonus ":0,"startingPresenceBonus ":0,"startingStrengthBonus ":0,"startingToughnessBonus ":0,"startingSpiritBonus ":0,"skipCharacterGenerator":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"TDsJBLUG3b0P868Z","name":"Tall Tale","type":"class","img":"systems/pirateborg/icons/misc/class.png","data":{"description":"","flavorText":"You are a Merfolk,","luckDie":"","startingArmorTableFormula":"","startingWeaponTableFormula":"","startingHatTableFormula":"","startingAbilityScoreFormula":"","startingAgilityBonus":"","startingPresenceBonus":"","startingStrengthBonus":"","startingToughnessBonus":"","startingSpiritBonus":"","startingHitPoints":"","startingItems":"","startingRolls":"","startingMacro":"","gettingBetterRolls":"","gettingBetterMacro":"","useExtraResource":false,"extraResourceNameSingular":"","extraResourceNamePlural":"","extraResourceFormula":"","extraResourceFormulaLabel":"","extraResourceTestFormula":"","extraResourceTestFormulaLabel":"","requireBaseClass":true,"characterGeneratorMacro":"pirateborg.macros-tall-tale;Character creation","startingAbilityScoreFormula ":"3d6","startingAgilityBonus ":0,"startingPresenceBonus ":0,"startingStrengthBonus ":0,"startingToughnessBonus ":0,"startingSpiritBonus ":0,"skipCharacterGenerator":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"TDsJBLUG3b0P868Z","name":"Tall Tale","type":"class","img":"systems/pirateborg/icons/misc/class.png","data":{"description":"","flavorText":"You are a Merfolk, Aquatic Mutant or a","luckDie":"","startingArmorTableFormula":"","startingWeaponTableFormula":"","startingHatTableFormula":"","startingAbilityScoreFormula":"","startingAgilityBonus":"","startingPresenceBonus":"","startingStrengthBonus":"","startingToughnessBonus":"","startingSpiritBonus":"","startingHitPoints":"","startingItems":"","startingRolls":"","startingMacro":"","gettingBetterRolls":"","gettingBetterMacro":"","useExtraResource":false,"extraResourceNameSingular":"","extraResourceNamePlural":"","extraResourceFormula":"","extraResourceFormulaLabel":"","extraResourceTestFormula":"","extraResourceTestFormulaLabel":"","requireBaseClass":true,"characterGeneratorMacro":"pirateborg.macros-tall-tale;Character creation","startingAbilityScoreFormula ":"3d6","startingAgilityBonus ":0,"startingPresenceBonus ":0,"startingStrengthBonus ":0,"startingToughnessBonus ":0,"startingSpiritBonus ":0,"skipCharacterGenerator":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"TDsJBLUG3b0P868Z","name":"Tall Tale","type":"class","img":"systems/pirateborg/icons/misc/class.png","data":{"description":"","flavorText":"You are a Merfolk, Aquatic Mutant or a Sentient Animal","luckDie":"","startingArmorTableFormula":"","startingWeaponTableFormula":"","startingHatTableFormula":"","startingAbilityScoreFormula":"","startingAgilityBonus":"","startingPresenceBonus":"","startingStrengthBonus":"","startingToughnessBonus":"","startingSpiritBonus":"","startingHitPoints":"","startingItems":"","startingRolls":"","startingMacro":"","gettingBetterRolls":"","gettingBetterMacro":"","useExtraResource":false,"extraResourceNameSingular":"","extraResourceNamePlural":"","extraResourceFormula":"","extraResourceFormulaLabel":"","extraResourceTestFormula":"","extraResourceTestFormulaLabel":"","requireBaseClass":true,"characterGeneratorMacro":"pirateborg.macros-tall-tale;Character creation","startingAbilityScoreFormula ":"3d6","startingAgilityBonus ":0,"startingPresenceBonus ":0,"startingStrengthBonus ":0,"startingToughnessBonus ":0,"startingSpiritBonus ":0,"skipCharacterGenerator":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"TDsJBLUG3b0P868Z","name":"Tall Tale","type":"class","img":"systems/pirateborg/icons/misc/class.png","data":{"description":"","flavorText":"You are a Merfolk, an Aquatic Mutant or a Sentient Animal","luckDie":"","startingArmorTableFormula":"","startingWeaponTableFormula":"","startingHatTableFormula":"","startingAbilityScoreFormula":"","startingAgilityBonus":"","startingPresenceBonus":"","startingStrengthBonus":"","startingToughnessBonus":"","startingSpiritBonus":"","startingHitPoints":"","startingItems":"","startingRolls":"","startingMacro":"","gettingBetterRolls":"","gettingBetterMacro":"","useExtraResource":false,"extraResourceNameSingular":"","extraResourceNamePlural":"","extraResourceFormula":"","extraResourceFormulaLabel":"","extraResourceTestFormula":"","extraResourceTestFormulaLabel":"","requireBaseClass":true,"characterGeneratorMacro":"pirateborg.macros-tall-tale;Character creation","startingAbilityScoreFormula ":"3d6","startingAgilityBonus ":0,"startingPresenceBonus ":0,"startingStrengthBonus ":0,"startingToughnessBonus ":0,"startingSpiritBonus ":0,"skipCharacterGenerator":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"Q6As123ncIeUKQRI","name":"The Great Old One","type":"feature","img":"systems/pirateborg/icons/classes/tall-tale/the-great-old-one.png","data":{"description":"Learn one random Arcane Ritual.
","featureType":"Ancestry","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"","startingBonusRolls":"pirateborg.rolls-character-creation;d20 Arcane rituals"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.lco7XqcFzkaMkw0W"}}} +{"_id":"4qW6PHlQ23EX4jBd","name":"Foul Fowl","type":"feature","img":"systems/pirateborg/icons/classes/tall-tale/foul-fowl.png","data":{"description":"Gain the ability from one random relic & one random ritual. When you are killed, the ghosts of a hundred chickens swarm your assailant, ripping their spiritual soul from their flesh.
\nSpirit: +3.
\nHP: d4+toughness.
\nBeak Peck: d2
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"pirateborg.class-tall-tale;Foul Fowl - Beak Peck","startingBonusRolls":"pirateborg.rolls-character-creation;d20 Ancient relics\npirateborg.rolls-character-creation;d20 Arcane rituals"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.lco7XqcFzkaMkw0W"}}} +{"_id":"36B5BJPdwYbBQutL","name":"Merfolk","type":"feature","img":"systems/pirateborg/icons/classes/tall-tale/merfolk.png","data":{"description":"One of the children of Poseidon, your lower half is fish-like and you have gills. Both can be magically hidden as you masquerade as a human. Lower all DRs by 4 when underwater. You will die if you go 1+toughness days without submerging in fresh seawater (minimum 1 day). Roll d6 to gain an additional class.
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"","startingBonusRolls":"","flavorText":"One of the children of Poseidon, your lower half is fish-like and you have gills. Both\ncan be magically hidden as you masquerade as a human."},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.lco7XqcFzkaMkw0W"}}} +{"_id":"36B5BJPdwYbBQutL","name":"Merfolk","type":"feature","img":"systems/pirateborg/icons/classes/tall-tale/merfolk.png","data":{"description":"One of the children of Poseidon, your lower half is fish-like and you have gills. Both can be magically hidden as you masquerade as a human. Lower all DRs by 4 when underwater. You will die if you go 1+toughness days without submerging in fresh seawater (minimum 1 day). Roll d6 to gain an additional class.
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"","startingBonusRolls":"","flavorText":"One of the children of Poseidon, your lower half is fish-like and you have gills. Both can be magically hidden as you masquerade as a human."},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.lco7XqcFzkaMkw0W"}}} +{"_id":"bI48oC7ecHauJXnZ","name":"Aquatic Mutant","type":"feature","img":"systems/pirateborg/icons/classes/tall-tale/aquatic-mutant.png","data":{"description":"You are the spawn from an abominable union between man and the sea. Roll d8 to discover what creature makes up half of your ancestry, then roll d6 to gain an additional class.
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"","startingBonusRolls":"","flavorText":"You are the spawn from an abominable union between man and the sea."},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.lco7XqcFzkaMkw0W"}}} +{"_id":"3cyYeSPQD1dj3AAC","name":"Sentient Animal","type":"feature","img":"systems/pirateborg/icons/classes/tall-tale/sentient-animal.png","data":{"description":"You are a magically intelligent animal (d6). Maybe you were human once. When you begin:
\n— Roll 3d6 for each stat. You get -2 to all of your modifiers except as listed.
\n— Reroll any backstory details that don't make sense.
\n— Equipment you can't conceivable carry can be given away or left behind.
\n— Devil's Luck: d4
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"","startingBonusRolls":"","flavorText":"You are a magically intelligent animal (d6). Maybe you were human once."},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.lco7XqcFzkaMkw0W"}}} +{"_id":"3cyYeSPQD1dj3AAC","name":"Sentient Animal","type":"feature","img":"systems/pirateborg/icons/classes/tall-tale/sentient-animal.png","data":{"description":"You are a magically intelligent animal (d6). Maybe you were human once. When you begin:
\n— Roll 3d6 for each stat. You get -2 to all of your modifiers except as listed.
\n— Reroll any backstory details that don't make sense.
\n— Equipment you can't conceivable carry can be given away or left behind.
\n— Devil's Luck: d4
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"","startingBonusRolls":"","flavorText":"You are a magically intelligent animal. Maybe you were human once."},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.lco7XqcFzkaMkw0W"}}} +{"_id":"iDVD29wjXnI9oDBf","name":"Jaguar","type":"feature","img":"systems/pirateborg/icons/classes/tall-tale/jaguar.png","data":{"description":"You're a deadly jungle cat.
\nStrength: +2.
\nAgility: +2.
\nHP: d8+toughness.
\nBite/Claws: d8.
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"pirateborg.class-tall-tale;Jaguar - Bite/Claws","startingBonusRolls":"","flavorText":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.lco7XqcFzkaMkw0W"}}} +{"_id":"lt6FGtfR0faT7qR4","name":"Anglerfish","type":"feature","img":"systems/pirateborg/icons/classes/tall-tale/angler-fish.png","data":{"description":"See in the dark. Bite: d4.
","featureType":"Ancestry","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"pirateborg.class-tall-tale;Anglerfish - Bite","startingBonusRolls":"","flavorText":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.lco7XqcFzkaMkw0W"}}} +{"_id":"lt6FGtfR0faT7qR4","name":"Anglerfish","type":"feature","img":"systems/pirateborg/icons/classes/tall-tale/angler-fish.png","data":{"description":"See in the dark. Bite: d4.
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"pirateborg.class-tall-tale;Anglerfish - Bite","startingBonusRolls":"","flavorText":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.lco7XqcFzkaMkw0W"}}} +{"_id":"WsNJPvaU4ZhZJ1MY","name":"Crab","type":"feature","img":"systems/pirateborg/icons/classes/tall-tale/crab.png","data":{"description":"Pincher: d6.
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"pirateborg.class-tall-tale;Crab - Pincher","startingBonusRolls":"","flavorText":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.lco7XqcFzkaMkw0W"}}} +{"_id":"tzRkbIPOTs3NZTho","name":"Jellyfish","type":"feature","img":"systems/pirateborg/icons/classes/tall-tale/jellyfish.png","data":{"description":"Tendril: d2 & Stun 1 round, 10 foot reach.
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"pirateborg.class-tall-tale;Jellyfish - Tendril","startingBonusRolls":"","flavorText":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.lco7XqcFzkaMkw0W"}}} +{"_id":"tK62n6rppvk6QxPk","name":"Octopus","type":"feature","img":"systems/pirateborg/icons/classes/tall-tale/octopus.png","data":{"description":"Tentacles: 2d4.
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"pirateborg.class-tall-tale;Octopus - Tentacles","startingBonusRolls":"","flavorText":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.lco7XqcFzkaMkw0W"}}} +{"_id":"zmF3NfJi9qwNzNhT","name":"Sea Turtle","type":"feature","img":"systems/pirateborg/icons/classes/tall-tale/sea-turtle.png","data":{"description":"Extra -d2 to armor.
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"","startingBonusRolls":"","flavorText":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.lco7XqcFzkaMkw0W"}}} +{"_id":"GGf7XeEppvQ7j6BX","name":"Electric Eel","type":"feature","img":"systems/pirateborg/icons/classes/tall-tale/electric-eel.png","data":{"description":"+1 to Agility. Electric skin: d6.
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"pirateborg.class-tall-tale;Electric Eel - Electric skin","startingBonusRolls":"","flavorText":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.lco7XqcFzkaMkw0W"}}} +{"_id":"eFihUJ3xVpEWIlhu","name":"Shark","type":"feature","img":"systems/pirateborg/icons/classes/tall-tale/shark.png","data":{"description":"Bite: d8
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"pirateborg.class-tall-tale;Shark - Bite","startingBonusRolls":"","flavorText":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.lco7XqcFzkaMkw0W"}}} +{"_id":"Q6As123ncIeUKQRI","name":"The Great Old One","type":"feature","img":"systems/pirateborg/icons/classes/tall-tale/the-great-old-one.png","data":{"description":"Learn one random Arcane Ritual.
","featureType":"Class","maxQuantity":1,"quantity":1,"actionMacro":"","actionMacroLabel":"","startingBonusItems":"","startingBonusRolls":"pirateborg.rolls-character-creation;d20 Arcane rituals","flavorText":""},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Item.lco7XqcFzkaMkw0W"}}} diff --git a/packs/macros-haunted-soul.db b/packs/macros-haunted-soul.db index f2b46077..41cce7fb 100755 --- a/packs/macros-haunted-soul.db +++ b/packs/macros-haunted-soul.db @@ -1,2 +1 @@ -{"_id":"t02N8BGuZCCpmV1U","name":"Character creation","type":"script","author":"pdXclp2r5tiEF79G","img":"icons/svg/dice-target.svg","scope":"global","command":"const pirateFactory = game.pirateborg.pirateFactory;\n\nconst validBaseClasses = selectedClasses.filter((selectedClass) => !selectedClass.data.data.requireBaseClass);\nconst baseClass = validBaseClasses[Math.floor(Math.random() * validBaseClasses.length)];\nconst basePirateData = await pirateFactory.rollScvmForClass(baseClass);\n\nconst startingRollItems = await pirateFactory.rollRollItems(selectedClass.data.data.startingRolls);\nconst startingItems = await pirateFactory.findItems(selectedClass.data.data.startingItems);\n\nbasePirateData.items = basePirateData.items\n .filter((item) => item.data.type !== 'class')\n .concat(startingRollItems)\n .concat(startingItems)\n .concat([selectedClass]);\n\nbasePirateData.baseClass = `${baseClass.pack};${baseClass.name}`\nconsole.log(baseClass );\n\nif (actor) {\n await pirateFactory.updateActorWithScvm(actor, basePirateData);\n} else {\n await pirateFactory.createActorWithScvm(basePirateData);\n}","folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Macro.smnrajcovGMRvDVa"}}} -{"_id":"t02N8BGuZCCpmV1U","name":"Character creation","type":"script","author":"pdXclp2r5tiEF79G","img":"icons/svg/dice-target.svg","scope":"global","command":"const pirateFactory = game.pirateborg.pirateFactory;\n\nconst validBaseClasses = selectedClasses.filter((selectedClass) => !selectedClass.data.data.requireBaseClass);\nconst baseClass = validBaseClasses[Math.floor(Math.random() * validBaseClasses.length)];\nconst basePirateData = await pirateFactory.rollScvmForClass(baseClass);\n\nconst startingRollItems = await pirateFactory.rollRollItems(selectedClass.data.data.startingRolls);\nconst startingItems = await pirateFactory.findItems(selectedClass.data.data.startingItems);\n\nbasePirateData.items = basePirateData.items\n .filter((item) => item.data.type !== 'class')\n .concat(startingRollItems)\n .concat(startingItems)\n .concat([selectedClass]);\n\nbasePirateData.baseClass = `${baseClass.pack};${baseClass.name}`\n\nif (actor) {\n await pirateFactory.updateActorWithScvm(actor, basePirateData);\n} else {\n await pirateFactory.createActorWithScvm(basePirateData);\n}","folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Macro.smnrajcovGMRvDVa"}}} +{"_id":"t02N8BGuZCCpmV1U","name":"Character creation","type":"script","author":"pdXclp2r5tiEF79G","img":"icons/svg/dice-target.svg","scope":"global","command":"const pirateFactory = game.pirateborg.pirateFactory;\n\nconst validBaseClasses = selectedClasses.filter((selectedClass) => !selectedClass.data.data.requireBaseClass);\nconst baseClass = validBaseClasses[Math.floor(Math.random() * validBaseClasses.length)];\nconst pirateData = await pirateFactory.rollScvmForClass(baseClass);\n\nconst startingRollItems = await pirateFactory.rollRollItems(selectedClass.data.data.startingRolls);\nconst startingItems = await pirateFactory.findItems(selectedClass.data.data.startingItems);\n\npirateData.items = pirateData.items\n .filter((item) => item.data.type !== 'class')\n .concat(startingRollItems)\n .concat(startingItems)\n .concat([selectedClass]);\n\npirateData.baseClass = `${baseClass.pack};${baseClass.name}`\n\npirateData.description = `${selectedClass.data.data.flavorText}${pirateData.description}`\n\nif (actor) {\n await pirateFactory.updateActorWithScvm(actor, pirateData);\n} else {\n await pirateFactory.createActorWithScvm(pirateData);\n}","folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Macro.smnrajcovGMRvDVa"}}} diff --git a/packs/macros-tall-tale.db b/packs/macros-tall-tale.db index e69de29b..106f7f03 100755 --- a/packs/macros-tall-tale.db +++ b/packs/macros-tall-tale.db @@ -0,0 +1,32 @@ +{"_id":"euVqlYfll65zKOew","name":"Character creation","type":"script","author":"pdXclp2r5tiEF79G","img":"icons/svg/dice-target.svg","scope":"global","command":"console.clear();\nconsole.log('Character creation', selectedClass.data.name);\n\nconst pirateFactory = game.pirateborg.pirateFactory;\n\nconst tallTaleRollPack = 'pirateborg.rolls-tall-tale';\nconst tallTaleRollPackName = 'Tall Tale';\nconst aquaticMutantRollPackName = 'Aquatic Mutant';\nconst sentientAnimalRollPackName = 'Sentient Animal';\n\nconst getRandomBaseClass = () => {\n const validBaseClasses = selectedClasses.filter((selectedClass) => !selectedClass.data.data.requireBaseClass);\n return baseClass = validBaseClasses[Math.floor(Math.random() * validBaseClasses.length)];\n}\n\nconst getClassItems = async (selectedClass) => {\n return [\n ...(await pirateFactory.rollRollItems(selectedClass.data.data.startingRolls)),\n ...(await pirateFactory.findItems(selectedClass.data.data.startingItems)),\n ];\n}\n\nconst getStartingBonusItems = async (items) => {\n return [\n ...(await pirateFactory.findStartingBonusItems(items)),\n ...(await pirateFactory.findStartingBonusRollsItems(items)),\n ];\n}\n\nconst getPirateDataWithBaseClass = async (additionalItems = []) => {\n const baseClass = getRandomBaseClass(); \n const pirateData = await pirateFactory.rollScvmForClass(baseClass);\n const items = await getClassItems(selectedClass); \n const bonusItems = await getStartingBonusItems([...items, ...additionalItems]);\n\n pirateData.baseClass = `${baseClass.pack};${baseClass.name}`\n// pirateData.description = `${selectedClass.data.data.flavorText}${pirateData.description}`\n\n pirateData.items = pirateData.items\n .filter((item) => item.data.type !== 'class')\n .concat(items)\n .concat(additionalItems)\n .concat(bonusItems)\n .concat([selectedClass]);\n\n return pirateData;\n}\n\nconst animalDefaultData = {\n startingAbilityScoreFormula: '3d6',\n startingStrengthBonus: -2,\n startingAgilityBonus: -2,\n startingPresenceBonus: -2,\n startingToughnessBonus: -2,\n startingSpiritBonus: -2,\n luckDie: 'd4',\n flavorText: '',\n startingMacro: '',\n}\n\nconst createSentientAnimalData = async (data) => {\n return mergeObject(animalDefaultData, data, { insertKeys: true });\n}\n\nconst getMerfolkData = async (tallTaleItem) => {\n const pirateData = await getPirateDataWithBaseClass();\n pirateData.description = `${tallTaleItem.data.name}
${pirateData.description}`\n return pirateData;\n}\n\nconst getAquaticMutantData = async (tallTaleItem) => {\n const aquaticMutantItem = (await pirateFactory.drawTableItem(tallTaleRollPack, aquaticMutantRollPackName))[0];\n const pirateData = await getPirateDataWithBaseClass([aquaticMutantItem]);\n pirateData.description = `${tallTaleItem.data.name} (aquaticMutantItem.data.name)
${pirateData.description}`\n\n if (aquanticMutantItem.data.name === 'Electric Eel') {\n pirateData.agility = parseInt(pirateData.agility, 10) + 1;\n }\n\n return pirateData;\n}\n\nconst getSentientAnimalData = async (tallTaleItem) => {\n const sentientAnimalItem = (await pirateFactory.drawTableItem(tallTaleRollPack, sentientAnimalRollPackName))[0];\n // const pirateData = await getPirateDataWithBaseClass(sentientAnimalItem);\n let data = {};\n switch (sentientAnimalItem.name) {\n case 'Foul Fowl':\n data = await createSentientAnimalData({\n startingSpiritBonus: +3,\n startingHitPoints: '1d4', \n }); \n break;\n case 'Jaguar':\n data = await createSentientAnimalData({\n startingAgilityBonus: +2,\n startingStrengthBonus: +2,\n startingHitPoints: '1d8', \n });\n break;\n case 'Crocodile':\n data = await createSentientAnimalData({\n startingToughnessBonus: +1,\n startingStrengthBonus: +3,\n startingHitPoints: '1d10', \n });\n break;\n case 'Bilge Rat':\n data = await createSentientAnimalData({\n startingToughnessBonus: +2,\n startingAgilityBonus: +3,\n startingHitPoints: '1d2', \n });\n break;\n case 'Lucky Parrot':\n data = await createSentientAnimalData({\n startingPresenceBonus: +2,\n startingAgilityBonus: +1,\n startingHitPoints: '1d2', \n luckDie: '1d6'\n });\n break;\n case 'Clever Monkey':\n data = await createSentientAnimalData({\n startingPresenceBonus: 0,\n startingAgilityBonus: +2,\n startingStrengthBonus: -1,\n startingHitPoints: '1d6', \n startingWeaponTableFormula: '1d10',\n });\n break; \n }\n \n selectedClass.data.data = data;\n selectedClass.data.name = `${tallTaleItem.name} - ${sentientAnimalItem.name}`\n selectedClass.data.img = sentientAnimalItem.data.img;\n selectedClass.data.data.startingRolls = sentientAnimalItem.data.data.startingBonusRolls;\n selectedClass.data.data.startingItems = sentientAnimalItem.data.data.startingBonusItems;\n selectedClass.data.data.flavorText = `${selectedClass.data.data.flavorText}\\n ${tallTaleItem.data.data.flavorText}\\n${sentientAnimalItem.data.data.flavorText}`\n\n console.log(selectedClass);\n\n const pirateData = await pirateFactory.rollScvmForClass(selectedClass);\n pirateData.items = pirateData.items.concat([sentientAnimalItem]);\n// pirateData.description = `${tallTaleItem.data.data.flavorText}
${sentientAnimalItem.data.data.flavorText}
${pirateData.description}`\n\n // const items = await getClassItems(selectedClass); \n //const bonusItems = await getStartingBonusItems([...items, ...additionalItems]);\n\n\n return pirateData;\n}\n\n\n// const tallTaleItem = (await pirateFactory.drawTableItem(tallTaleRollPack, tallTaleRollPackName))[0];\nconst tallTaleItem = await pirateFactory.findCompendiumItem('pirateborg.class-tall-tale', 'Sentient Animal');\nlet pirateData = {};\n\nswitch (tallTaleItem.name) {\n case 'Merfolk':\n pirateData = await getMerfolkData(tallTaleItem);\n break;\n case 'Aquatic Mutant':\n pirateData = await getAquaticMutantData(tallTaleItem);\n break;\n case 'Sentient Animal':\n pirateData = await getSentientAnimalData(tallTaleItem);\n break;\n}\n\npirateData.items = pirateData.items.concat([tallTaleItem])\n\nconsole.log('Creating New', {\n name: tallTaleItem.data.name,\n tallTaleItem,\n pirateData\n});\n\nif (actor) {\n await pirateFactory.updateActorWithScvm(actor, pirateData);\n} else {\n await pirateFactory.createActorWithScvm(pirateData);\n}","folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Macro.JMLpUPK7oJ10cb4A"}}} +{"_id":"euVqlYfll65zKOew","name":"Character creation","type":"script","author":"pdXclp2r5tiEF79G","img":"icons/svg/dice-target.svg","scope":"global","command":"console.clear();\nconsole.log('Character creation', selectedClass.data.name);\n\nconst pirateFactory = game.pirateborg.pirateFactory;\n\nconst tallTaleRollPack = 'pirateborg.rolls-tall-tale';\nconst tallTaleRollPackName = 'Tall Tale';\nconst aquaticMutantRollPackName = 'Aquatic Mutant';\nconst sentientAnimalRollPackName = 'Sentient Animal';\n\nconst getRandomBaseClass = () => {\n const validBaseClasses = selectedClasses.filter((selectedClass) => !selectedClass.data.data.requireBaseClass);\n return baseClass = validBaseClasses[Math.floor(Math.random() * validBaseClasses.length)];\n}\n\nconst getClassItems = async (selectedClass) => {\n return [\n ...(await pirateFactory.rollRollItems(selectedClass.data.data.startingRolls)),\n ...(await pirateFactory.findItems(selectedClass.data.data.startingItems)),\n ];\n}\n\nconst getStartingBonusItems = async (items) => {\n return [\n ...(await pirateFactory.findStartingBonusItems(items)),\n ...(await pirateFactory.findStartingBonusRollsItems(items)),\n ];\n}\n\nconst getPirateDataWithBaseClass = async (additionalItems = []) => {\n const baseClass = getRandomBaseClass(); \n const pirateData = await pirateFactory.rollScvmForClass(baseClass);\n const items = await getClassItems(selectedClass); \n const bonusItems = await getStartingBonusItems([...items, ...additionalItems]);\n\n pirateData.baseClass = `${baseClass.pack};${baseClass.name}`\n// pirateData.description = `${selectedClass.data.data.flavorText}${pirateData.description}`\n\n pirateData.items = pirateData.items\n .filter((item) => item.data.type !== 'class')\n .concat(items)\n .concat(additionalItems)\n .concat(bonusItems)\n .concat([selectedClass]);\n\n return pirateData;\n}\n\nconst animalDefaultData = {\n startingAbilityScoreFormula: '3d6',\n startingStrengthBonus: -2,\n startingAgilityBonus: -2,\n startingPresenceBonus: -2,\n startingToughnessBonus: -2,\n startingSpiritBonus: -2,\n luckDie: 'd4',\n flavorText: '',\n startingMacro: '',\n}\n\nconst createSentientAnimalData = async (data) => {\n return mergeObject(animalDefaultData, data, { insertKeys: true });\n}\n\nconst getMerfolkData = async (tallTaleItem) => {\n const pirateData = await getPirateDataWithBaseClass();\n pirateData.description = `${tallTaleItem.data.name}
${pirateData.description}`\n return pirateData;\n}\n\nconst getAquaticMutantData = async (tallTaleItem) => {\n const aquaticMutantItem = (await pirateFactory.drawTableItem(tallTaleRollPack, aquaticMutantRollPackName))[0];\n const pirateData = await getPirateDataWithBaseClass([aquaticMutantItem]);\n pirateData.description = `${tallTaleItem.data.name} (aquaticMutantItem.data.name)
${pirateData.description}`\n\n if (aquanticMutantItem.data.name === 'Electric Eel') {\n pirateData.agility = parseInt(pirateData.agility, 10) + 1;\n }\n\n return pirateData;\n}\n\nconst getSentientAnimalData = async (tallTaleItem) => {\n const sentientAnimalItem = (await pirateFactory.drawTableItem(tallTaleRollPack, sentientAnimalRollPackName))[0];\n // const pirateData = await getPirateDataWithBaseClass(sentientAnimalItem);\n let data = {};\n switch (sentientAnimalItem.name) {\n case 'Foul Fowl':\n data = await createSentientAnimalData({\n startingSpiritBonus: +3,\n startingHitPoints: '1d4', \n }); \n break;\n case 'Jaguar':\n data = await createSentientAnimalData({\n startingAgilityBonus: +2,\n startingStrengthBonus: +2,\n startingHitPoints: '1d8', \n });\n break;\n case 'Crocodile':\n data = await createSentientAnimalData({\n startingToughnessBonus: +1,\n startingStrengthBonus: +3,\n startingHitPoints: '1d10', \n });\n break;\n case 'Bilge Rat':\n data = await createSentientAnimalData({\n startingToughnessBonus: +2,\n startingAgilityBonus: +3,\n startingHitPoints: '1d2', \n });\n break;\n case 'Lucky Parrot':\n data = await createSentientAnimalData({\n startingPresenceBonus: +2,\n startingAgilityBonus: +1,\n startingHitPoints: '1d2', \n luckDie: '1d6'\n });\n break;\n case 'Clever Monkey':\n data = await createSentientAnimalData({\n startingPresenceBonus: 0,\n startingAgilityBonus: +2,\n startingStrengthBonus: -1,\n startingHitPoints: '1d6', \n startingWeaponTableFormula: '1d10',\n });\n break; \n }\n \n selectedClass.data.data = data;\n selectedClass.data.name = `${tallTaleItem.name} - ${sentientAnimalItem.name}`\n selectedClass.data.img = sentientAnimalItem.data.img;\n selectedClass.data.data.startingRolls = sentientAnimalItem.data.data.startingBonusRolls;\n selectedClass.data.data.startingItems = sentientAnimalItem.data.data.startingBonusItems;\n selectedClass.data.data.flavorText = `${selectedClass.data.data.flavorText}...${sentientAnimalItem.data.data.flavorText}`\n\n console.log(selectedClass);\n\n const pirateData = await pirateFactory.rollScvmForClass(selectedClass);\n pirateData.items = pirateData.items.concat([sentientAnimalItem]);\n// pirateData.description = `${tallTaleItem.data.data.flavorText}
${sentientAnimalItem.data.data.flavorText}
${pirateData.description}`\n\n // const items = await getClassItems(selectedClass); \n //const bonusItems = await getStartingBonusItems([...items, ...additionalItems]);\n\n\n return pirateData;\n}\n\n\n// const tallTaleItem = (await pirateFactory.drawTableItem(tallTaleRollPack, tallTaleRollPackName))[0];\nconst tallTaleItem = await pirateFactory.findCompendiumItem('pirateborg.class-tall-tale', 'Sentient Animal');\nlet pirateData = {};\n\nswitch (tallTaleItem.name) {\n case 'Merfolk':\n pirateData = await getMerfolkData(tallTaleItem);\n break;\n case 'Aquatic Mutant':\n pirateData = await getAquaticMutantData(tallTaleItem);\n break;\n case 'Sentient Animal':\n pirateData = await getSentientAnimalData(tallTaleItem);\n break;\n}\n\npirateData.items = pirateData.items.concat([tallTaleItem])\n\nconsole.log('Creating New', {\n name: tallTaleItem.data.name,\n tallTaleItem,\n pirateData\n});\n\nif (actor) {\n await pirateFactory.updateActorWithScvm(actor, pirateData);\n} else {\n await pirateFactory.createActorWithScvm(pirateData);\n}","folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Macro.JMLpUPK7oJ10cb4A"}}} +{"_id":"euVqlYfll65zKOew","name":"Character creation","type":"script","author":"pdXclp2r5tiEF79G","img":"icons/svg/dice-target.svg","scope":"global","command":"console.clear();\nconsole.log('Character creation', selectedClass.data.name);\n\nconst pirateFactory = game.pirateborg.pirateFactory;\n\nconst tallTaleRollPack = 'pirateborg.rolls-tall-tale';\nconst tallTaleRollPackName = 'Tall Tale';\nconst aquaticMutantRollPackName = 'Aquatic Mutant';\nconst sentientAnimalRollPackName = 'Sentient Animal';\n\nconst getRandomBaseClass = () => {\n const validBaseClasses = selectedClasses.filter((selectedClass) => !selectedClass.data.data.requireBaseClass);\n return baseClass = validBaseClasses[Math.floor(Math.random() * validBaseClasses.length)];\n}\n\nconst getClassItems = async (selectedClass) => {\n return [\n ...(await pirateFactory.rollRollItems(selectedClass.data.data.startingRolls)),\n ...(await pirateFactory.findItems(selectedClass.data.data.startingItems)),\n ];\n}\n\nconst getStartingBonusItems = async (items) => {\n return [\n ...(await pirateFactory.findStartingBonusItems(items)),\n ...(await pirateFactory.findStartingBonusRollsItems(items)),\n ];\n}\n\nconst getPirateDataWithBaseClass = async (additionalItems = []) => {\n const baseClass = getRandomBaseClass(); \n const pirateData = await pirateFactory.rollScvmForClass(baseClass);\n const items = await getClassItems(selectedClass); \n const bonusItems = await getStartingBonusItems([...items, ...additionalItems]);\n\n pirateData.baseClass = `${baseClass.pack};${baseClass.name}`\n// pirateData.description = `${selectedClass.data.data.flavorText}${pirateData.description}`\n\n pirateData.items = pirateData.items\n .filter((item) => item.data.type !== 'class')\n .concat(items)\n .concat(additionalItems)\n .concat(bonusItems)\n .concat([selectedClass]);\n\n return pirateData;\n}\n\nconst animalDefaultData = {\n startingAbilityScoreFormula: '3d6',\n startingStrengthBonus: -2,\n startingAgilityBonus: -2,\n startingPresenceBonus: -2,\n startingToughnessBonus: -2,\n startingSpiritBonus: -2,\n luckDie: 'd4',\n flavorText: '',\n startingMacro: '',\n}\n\nconst createSentientAnimalData = async (data) => {\n return mergeObject(animalDefaultData, data, { insertKeys: true });\n}\n\nconst getMerfolkData = async (tallTaleItem) => {\n const pirateData = await getPirateDataWithBaseClass();\n pirateData.description = `${tallTaleItem.data.name}
${pirateData.description}`\n return pirateData;\n}\n\nconst getAquaticMutantData = async (tallTaleItem) => {\n const aquaticMutantItem = (await pirateFactory.drawTableItem(tallTaleRollPack, aquaticMutantRollPackName))[0];\n const pirateData = await getPirateDataWithBaseClass([aquaticMutantItem]);\n pirateData.description = `${tallTaleItem.data.name} (aquaticMutantItem.data.name)
${pirateData.description}`\n\n if (aquanticMutantItem.data.name === 'Electric Eel') {\n pirateData.agility = parseInt(pirateData.agility, 10) + 1;\n }\n\n return pirateData;\n}\n\nconst getSentientAnimalData = async (tallTaleItem) => {\n const sentientAnimalItem = (await pirateFactory.drawTableItem(tallTaleRollPack, sentientAnimalRollPackName))[0];\n // const pirateData = await getPirateDataWithBaseClass(sentientAnimalItem);\n let data = {};\n switch (sentientAnimalItem.name) {\n case 'Foul Fowl':\n data = await createSentientAnimalData({\n startingSpiritBonus: +3,\n startingHitPoints: '1d4', \n }); \n break;\n case 'Jaguar':\n data = await createSentientAnimalData({\n startingAgilityBonus: +2,\n startingStrengthBonus: +2,\n startingHitPoints: '1d8', \n });\n break;\n case 'Crocodile':\n data = await createSentientAnimalData({\n startingToughnessBonus: +1,\n startingStrengthBonus: +3,\n startingHitPoints: '1d10', \n });\n break;\n case 'Bilge Rat':\n data = await createSentientAnimalData({\n startingToughnessBonus: +2,\n startingAgilityBonus: +3,\n startingHitPoints: '1d2', \n });\n break;\n case 'Lucky Parrot':\n data = await createSentientAnimalData({\n startingPresenceBonus: +2,\n startingAgilityBonus: +1,\n startingHitPoints: '1d2', \n luckDie: '1d6'\n });\n break;\n case 'Clever Monkey':\n data = await createSentientAnimalData({\n startingPresenceBonus: 0,\n startingAgilityBonus: +2,\n startingStrengthBonus: -1,\n startingHitPoints: '1d6', \n startingWeaponTableFormula: '1d10',\n });\n break; \n }\n \n selectedClass.data.data = data;\n selectedClass.data.name = `${tallTaleItem.name} - ${sentientAnimalItem.name}`\n selectedClass.data.img = sentientAnimalItem.data.img;\n selectedClass.data.data.startingRolls = sentientAnimalItem.data.data.startingBonusRolls;\n selectedClass.data.data.startingItems = sentientAnimalItem.data.data.startingBonusItems;\n selectedClass.data.data.flavorText = `${selectedClass.data.data.flavorText}`\n\n console.log(selectedClass);\n\n const pirateData = await pirateFactory.rollScvmForClass(selectedClass);\n pirateData.items = pirateData.items.concat([sentientAnimalItem]);\n\n // const items = await getClassItems(selectedClass); \n //const bonusItems = await getStartingBonusItems([...items, ...additionalItems]);\n\n\n return pirateData;\n}\n\n\n// const tallTaleItem = (await pirateFactory.drawTableItem(tallTaleRollPack, tallTaleRollPackName))[0];\nconst tallTaleItem = await pirateFactory.findCompendiumItem('pirateborg.class-tall-tale', 'Sentient Animal');\nlet pirateData = {};\n\nswitch (tallTaleItem.name) {\n case 'Merfolk':\n pirateData = await getMerfolkData(tallTaleItem);\n break;\n case 'Aquatic Mutant':\n pirateData = await getAquaticMutantData(tallTaleItem);\n break;\n case 'Sentient Animal':\n pirateData = await getSentientAnimalData(tallTaleItem);\n break;\n}\n\npirateData.items = pirateData.items.concat([tallTaleItem])\n\nconsole.log('Creating New', {\n name: tallTaleItem.data.name,\n tallTaleItem,\n pirateData\n});\n\nif (actor) {\n await pirateFactory.updateActorWithScvm(actor, pirateData);\n} else {\n await pirateFactory.createActorWithScvm(pirateData);\n}","folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Macro.JMLpUPK7oJ10cb4A"}}} +{"_id":"euVqlYfll65zKOew","name":"Character creation","type":"script","author":"pdXclp2r5tiEF79G","img":"icons/svg/dice-target.svg","scope":"global","command":"console.clear();\nconsole.log('Character creation', selectedClass.data.name);\n\nconst pirateFactory = game.pirateborg.pirateFactory;\n\nconst tallTaleRollPack = 'pirateborg.rolls-tall-tale';\nconst tallTaleRollPackName = 'Tall Tale';\nconst aquaticMutantRollPackName = 'Aquatic Mutant';\nconst sentientAnimalRollPackName = 'Sentient Animal';\n\nconst getRandomBaseClass = () => {\n const validBaseClasses = selectedClasses.filter((selectedClass) => !selectedClass.data.data.requireBaseClass);\n return baseClass = validBaseClasses[Math.floor(Math.random() * validBaseClasses.length)];\n}\n\nconst getClassItems = async (selectedClass) => {\n return [\n ...(await pirateFactory.rollRollItems(selectedClass.data.data.startingRolls)),\n ...(await pirateFactory.findItems(selectedClass.data.data.startingItems)),\n ];\n}\n\nconst getStartingBonusItems = async (items) => {\n return [\n ...(await pirateFactory.findStartingBonusItems(items)),\n ...(await pirateFactory.findStartingBonusRollsItems(items)),\n ];\n}\n\nconst getPirateDataWithBaseClass = async (additionalItems = []) => {\n const baseClass = getRandomBaseClass(); \n const pirateData = await pirateFactory.rollScvmForClass(baseClass);\n const items = await getClassItems(selectedClass); \n const bonusItems = await getStartingBonusItems([...items, ...additionalItems]);\n\n pirateData.baseClass = `${baseClass.pack};${baseClass.name}`\n// pirateData.description = `${selectedClass.data.data.flavorText}${pirateData.description}`\n\n pirateData.items = pirateData.items\n .filter((item) => item.data.type !== 'class')\n .concat(items)\n .concat(additionalItems)\n .concat(bonusItems)\n .concat([selectedClass]);\n\n return pirateData;\n}\n\nconst animalDefaultData = {\n startingAbilityScoreFormula: '3d6',\n startingStrengthBonus: -2,\n startingAgilityBonus: -2,\n startingPresenceBonus: -2,\n startingToughnessBonus: -2,\n startingSpiritBonus: -2,\n luckDie: 'd4',\n flavorText: '',\n startingMacro: '',\n}\n\nconst createSentientAnimalData = async (data) => {\n return mergeObject(animalDefaultData, data, { insertKeys: true });\n}\n\nconst getMerfolkData = async (tallTaleItem) => {\n const pirateData = await getPirateDataWithBaseClass();\n pirateData.description = `${tallTaleItem.data.name}
${pirateData.description}`\n return pirateData;\n}\n\nconst getAquaticMutantData = async (tallTaleItem) => {\n const aquaticMutantItem = (await pirateFactory.drawTableItem(tallTaleRollPack, aquaticMutantRollPackName))[0];\n const pirateData = await getPirateDataWithBaseClass([aquaticMutantItem]);\n pirateData.description = `${tallTaleItem.data.name} (aquaticMutantItem.data.name)
${pirateData.description}`\n\n if (aquanticMutantItem.data.name === 'Electric Eel') {\n pirateData.agility = parseInt(pirateData.agility, 10) + 1;\n }\n\n return pirateData;\n}\n\nconst getSentientAnimalData = async (tallTaleItem) => {\n const sentientAnimalItem = (await pirateFactory.drawTableItem(tallTaleRollPack, sentientAnimalRollPackName))[0];\n // const pirateData = await getPirateDataWithBaseClass(sentientAnimalItem);\n let data = {};\n switch (sentientAnimalItem.name) {\n case 'Foul Fowl':\n data = await createSentientAnimalData({\n startingSpiritBonus: +3,\n startingHitPoints: '1d4', \n }); \n break;\n case 'Jaguar':\n data = await createSentientAnimalData({\n startingAgilityBonus: +2,\n startingStrengthBonus: +2,\n startingHitPoints: '1d8', \n });\n break;\n case 'Crocodile':\n data = await createSentientAnimalData({\n startingToughnessBonus: +1,\n startingStrengthBonus: +3,\n startingHitPoints: '1d10', \n });\n break;\n case 'Bilge Rat':\n data = await createSentientAnimalData({\n startingToughnessBonus: +2,\n startingAgilityBonus: +3,\n startingHitPoints: '1d2', \n });\n break;\n case 'Lucky Parrot':\n data = await createSentientAnimalData({\n startingPresenceBonus: +2,\n startingAgilityBonus: +1,\n startingHitPoints: '1d2', \n luckDie: '1d6'\n });\n break;\n case 'Clever Monkey':\n data = await createSentientAnimalData({\n startingPresenceBonus: 0,\n startingAgilityBonus: +2,\n startingStrengthBonus: -1,\n startingHitPoints: '1d6', \n startingWeaponTableFormula: '1d10',\n });\n break; \n }\n \n selectedClass.data.data = data;\n selectedClass.data.name = `${tallTaleItem.name} - ${sentientAnimalItem.name}`\n selectedClass.data.img = sentientAnimalItem.data.img;\n selectedClass.data.data.startingRolls = sentientAnimalItem.data.data.startingBonusRolls;\n selectedClass.data.data.startingItems = sentientAnimalItem.data.data.startingBonusItems;\n selectedClass.data.data.flavorText = `${tallTaleItem.data.data.flavorText}`\n\n console.log(selectedClass);\n\n const pirateData = await pirateFactory.rollScvmForClass(selectedClass);\n pirateData.items = pirateData.items.concat([sentientAnimalItem]);\n\n // const items = await getClassItems(selectedClass); \n //const bonusItems = await getStartingBonusItems([...items, ...additionalItems]);\n\n\n return pirateData;\n}\n\n\n// const tallTaleItem = (await pirateFactory.drawTableItem(tallTaleRollPack, tallTaleRollPackName))[0];\nconst tallTaleItem = await pirateFactory.findCompendiumItem('pirateborg.class-tall-tale', 'Sentient Animal');\nlet pirateData = {};\n\nswitch (tallTaleItem.name) {\n case 'Merfolk':\n pirateData = await getMerfolkData(tallTaleItem);\n break;\n case 'Aquatic Mutant':\n pirateData = await getAquaticMutantData(tallTaleItem);\n break;\n case 'Sentient Animal':\n pirateData = await getSentientAnimalData(tallTaleItem);\n break;\n}\n\npirateData.items = pirateData.items.concat([tallTaleItem])\n\nconsole.log('Creating New', {\n name: tallTaleItem.data.name,\n tallTaleItem,\n pirateData\n});\n\nif (actor) {\n await pirateFactory.updateActorWithScvm(actor, pirateData);\n} else {\n await pirateFactory.createActorWithScvm(pirateData);\n}","folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Macro.JMLpUPK7oJ10cb4A"}}} +{"_id":"euVqlYfll65zKOew","name":"Character creation","type":"script","author":"pdXclp2r5tiEF79G","img":"icons/svg/dice-target.svg","scope":"global","command":"console.clear();\nconsole.log('Character creation', selectedClass.data.name);\n\nconst pirateFactory = game.pirateborg.pirateFactory;\n\nconst tallTaleRollPack = 'pirateborg.rolls-tall-tale';\nconst tallTaleRollPackName = 'Tall Tale';\nconst aquaticMutantRollPackName = 'Aquatic Mutant';\nconst sentientAnimalRollPackName = 'Sentient Animal';\n\nconst getRandomBaseClass = () => {\n const validBaseClasses = selectedClasses.filter((selectedClass) => !selectedClass.data.data.requireBaseClass);\n return baseClass = validBaseClasses[Math.floor(Math.random() * validBaseClasses.length)];\n}\n\nconst getClassItems = async (selectedClass) => {\n return [\n ...(await pirateFactory.rollRollItems(selectedClass.data.data.startingRolls)),\n ...(await pirateFactory.findItems(selectedClass.data.data.startingItems)),\n ];\n}\n\nconst getStartingBonusItems = async (items) => {\n return [\n ...(await pirateFactory.findStartingBonusItems(items)),\n ...(await pirateFactory.findStartingBonusRollsItems(items)),\n ];\n}\n\nconst getPirateDataWithBaseClass = async (additionalItems = []) => {\n const baseClass = getRandomBaseClass(); \n const pirateData = await pirateFactory.rollScvmForClass(baseClass);\n const items = await getClassItems(selectedClass); \n const bonusItems = await getStartingBonusItems([...items, ...additionalItems]);\n\n pirateData.baseClass = `${baseClass.pack};${baseClass.name}`\n// pirateData.description = `${selectedClass.data.data.flavorText}${pirateData.description}`\n\n pirateData.items = pirateData.items\n .filter((item) => item.data.type !== 'class')\n .concat(items)\n .concat(additionalItems)\n .concat(bonusItems)\n .concat([selectedClass]);\n\n return pirateData;\n}\n\nconst animalDefaultData = {\n startingAbilityScoreFormula: '3d6',\n startingStrengthBonus: -2,\n startingAgilityBonus: -2,\n startingPresenceBonus: -2,\n startingToughnessBonus: -2,\n startingSpiritBonus: -2,\n luckDie: 'd4',\n flavorText: '',\n startingMacro: '',\n}\n\nconst createSentientAnimalData = async (data) => {\n return mergeObject(animalDefaultData, data, { insertKeys: true });\n}\n\nconst getMerfolkData = async (tallTaleItem) => {\n const pirateData = await getPirateDataWithBaseClass();\n pirateData.description = `${tallTaleItem.data.name}
${pirateData.description}`\n return pirateData;\n}\n\nconst getAquaticMutantData = async (tallTaleItem) => {\n const aquaticMutantItem = (await pirateFactory.drawTableItem(tallTaleRollPack, aquaticMutantRollPackName))[0];\n const pirateData = await getPirateDataWithBaseClass([aquaticMutantItem]);\n pirateData.description = `${tallTaleItem.data.name} (aquaticMutantItem.data.name)
${pirateData.description}`\n\n if (aquanticMutantItem.data.name === 'Electric Eel') {\n pirateData.agility = parseInt(pirateData.agility, 10) + 1;\n }\n\n return pirateData;\n}\n\nconst getSentientAnimalData = async (tallTaleItem) => {\n const sentientAnimalItem = (await pirateFactory.drawTableItem(tallTaleRollPack, sentientAnimalRollPackName))[0];\n // const pirateData = await getPirateDataWithBaseClass(sentientAnimalItem);\n let data = {};\n switch (sentientAnimalItem.name) {\n case 'Foul Fowl':\n data = await createSentientAnimalData({\n startingSpiritBonus: +3,\n startingHitPoints: '1d4', \n }); \n break;\n case 'Jaguar':\n data = await createSentientAnimalData({\n startingAgilityBonus: +2,\n startingStrengthBonus: +2,\n startingHitPoints: '1d8', \n });\n break;\n case 'Crocodile':\n data = await createSentientAnimalData({\n startingToughnessBonus: +1,\n startingStrengthBonus: +3,\n startingHitPoints: '1d10', \n });\n break;\n case 'Bilge Rat':\n data = await createSentientAnimalData({\n startingToughnessBonus: +2,\n startingAgilityBonus: +3,\n startingHitPoints: '1d2', \n });\n break;\n case 'Lucky Parrot':\n data = await createSentientAnimalData({\n startingPresenceBonus: +2,\n startingAgilityBonus: +1,\n startingHitPoints: '1d2', \n luckDie: '1d6'\n });\n break;\n case 'Clever Monkey':\n data = await createSentientAnimalData({\n startingPresenceBonus: 0,\n startingAgilityBonus: +2,\n startingStrengthBonus: -1,\n startingHitPoints: '1d6', \n startingWeaponTableFormula: '1d10',\n });\n break; \n }\n \n selectedClass.data.data = data;\n selectedClass.data.name = `${tallTaleItem.name} - ${sentientAnimalItem.name}`\n selectedClass.data.img = sentientAnimalItem.data.img;\n selectedClass.data.data.startingRolls = sentientAnimalItem.data.data.startingBonusRolls;\n selectedClass.data.data.startingItems = sentientAnimalItem.data.data.startingBonusItems;\n selectedClass.data.data.flavorText = `${tallTaleItem.data.data.flavorText}`\n\n const pirateData = await pirateFactory.rollScvmForClass(selectedClass);\n\n console.log(pirateData)\n\n id(sentientAnimalItem.name === 'Foul Fowl') {\n// pirateData.items.filter((item) => item.data.data. )\n }\n\n pirateData.items = pirateData.items.concat([sentientAnimalItem]);\n return pirateData;\n}\n\n\n// const tallTaleItem = (await pirateFactory.drawTableItem(tallTaleRollPack, tallTaleRollPackName))[0];\nconst tallTaleItem = await pirateFactory.findCompendiumItem('pirateborg.class-tall-tale', 'Sentient Animal');\nlet pirateData = {};\n\nswitch (tallTaleItem.name) {\n case 'Merfolk':\n pirateData = await getMerfolkData(tallTaleItem);\n break;\n case 'Aquatic Mutant':\n pirateData = await getAquaticMutantData(tallTaleItem);\n break;\n case 'Sentient Animal':\n pirateData = await getSentientAnimalData(tallTaleItem);\n break;\n}\n\npirateData.items = pirateData.items.concat([tallTaleItem])\n\nconsole.log('Creating New', {\n name: tallTaleItem.data.name,\n tallTaleItem,\n pirateData\n});\n\nif (actor) {\n await pirateFactory.updateActorWithScvm(actor, pirateData);\n} else {\n await pirateFactory.createActorWithScvm(pirateData);\n}","folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Macro.JMLpUPK7oJ10cb4A"}}} +{"_id":"euVqlYfll65zKOew","name":"Character creation","type":"script","author":"pdXclp2r5tiEF79G","img":"icons/svg/dice-target.svg","scope":"global","command":"console.clear();\nconsole.log('Character creation', selectedClass.data.name);\n\nconst pirateFactory = game.pirateborg.pirateFactory;\n\nconst tallTaleRollPack = 'pirateborg.rolls-tall-tale';\nconst tallTaleRollPackName = 'Tall Tale';\nconst aquaticMutantRollPackName = 'Aquatic Mutant';\nconst sentientAnimalRollPackName = 'Sentient Animal';\n\nconst getRandomBaseClass = () => {\n const validBaseClasses = selectedClasses.filter((selectedClass) => !selectedClass.data.data.requireBaseClass);\n return baseClass = validBaseClasses[Math.floor(Math.random() * validBaseClasses.length)];\n}\n\nconst getClassItems = async (selectedClass) => {\n return [\n ...(await pirateFactory.rollRollItems(selectedClass.data.data.startingRolls)),\n ...(await pirateFactory.findItems(selectedClass.data.data.startingItems)),\n ];\n}\n\nconst getStartingBonusItems = async (items) => {\n return [\n ...(await pirateFactory.findStartingBonusItems(items)),\n ...(await pirateFactory.findStartingBonusRollsItems(items)),\n ];\n}\n\nconst getPirateDataWithBaseClass = async (additionalItems = []) => {\n const baseClass = getRandomBaseClass(); \n const pirateData = await pirateFactory.rollScvmForClass(baseClass);\n const items = await getClassItems(selectedClass); \n const bonusItems = await getStartingBonusItems([...items, ...additionalItems]);\n\n pirateData.baseClass = `${baseClass.pack};${baseClass.name}`\n// pirateData.description = `${selectedClass.data.data.flavorText}${pirateData.description}`\n\n pirateData.items = pirateData.items\n .filter((item) => item.data.type !== 'class')\n .concat(items)\n .concat(additionalItems)\n .concat(bonusItems)\n .concat([selectedClass]);\n\n return pirateData;\n}\n\nconst animalDefaultData = {\n startingAbilityScoreFormula: '3d6',\n startingStrengthBonus: -2,\n startingAgilityBonus: -2,\n startingPresenceBonus: -2,\n startingToughnessBonus: -2,\n startingSpiritBonus: -2,\n luckDie: 'd4',\n flavorText: '',\n startingMacro: '',\n}\n\nconst createSentientAnimalData = async (data) => {\n return mergeObject(animalDefaultData, data, { insertKeys: true });\n}\n\nconst getMerfolkData = async (tallTaleItem) => {\n const pirateData = await getPirateDataWithBaseClass();\n pirateData.description = `${tallTaleItem.data.name}
${pirateData.description}`\n return pirateData;\n}\n\nconst getAquaticMutantData = async (tallTaleItem) => {\n const aquaticMutantItem = (await pirateFactory.drawTableItem(tallTaleRollPack, aquaticMutantRollPackName))[0];\n const pirateData = await getPirateDataWithBaseClass([aquaticMutantItem]);\n pirateData.description = `${tallTaleItem.data.name} (aquaticMutantItem.data.name)
${pirateData.description}`\n\n if (aquanticMutantItem.data.name === 'Electric Eel') {\n pirateData.agility = parseInt(pirateData.agility, 10) + 1;\n }\n\n return pirateData;\n}\n\nconst getSentientAnimalData = async (tallTaleItem) => {\n const sentientAnimalItem = (await pirateFactory.drawTableItem(tallTaleRollPack, sentientAnimalRollPackName))[0];\n // const pirateData = await getPirateDataWithBaseClass(sentientAnimalItem);\n let data = {};\n switch (sentientAnimalItem.name) {\n case 'Foul Fowl':\n data = await createSentientAnimalData({\n startingSpiritBonus: +3,\n startingHitPoints: '1d4', \n }); \n break;\n case 'Jaguar':\n data = await createSentientAnimalData({\n startingAgilityBonus: +2,\n startingStrengthBonus: +2,\n startingHitPoints: '1d8', \n });\n break;\n case 'Crocodile':\n data = await createSentientAnimalData({\n startingToughnessBonus: +1,\n startingStrengthBonus: +3,\n startingHitPoints: '1d10', \n });\n break;\n case 'Bilge Rat':\n data = await createSentientAnimalData({\n startingToughnessBonus: +2,\n startingAgilityBonus: +3,\n startingHitPoints: '1d2', \n });\n break;\n case 'Lucky Parrot':\n data = await createSentientAnimalData({\n startingPresenceBonus: +2,\n startingAgilityBonus: +1,\n startingHitPoints: '1d2', \n luckDie: '1d6'\n });\n break;\n case 'Clever Monkey':\n data = await createSentientAnimalData({\n startingPresenceBonus: 0,\n startingAgilityBonus: +2,\n startingStrengthBonus: -1,\n startingHitPoints: '1d6', \n startingWeaponTableFormula: '1d10',\n });\n break; \n }\n \n selectedClass.data.data = data;\n selectedClass.data.name = `${tallTaleItem.name} - ${sentientAnimalItem.name}`\n selectedClass.data.img = sentientAnimalItem.data.img;\n selectedClass.data.data.startingRolls = sentientAnimalItem.data.data.startingBonusRolls;\n selectedClass.data.data.startingItems = sentientAnimalItem.data.data.startingBonusItems;\n selectedClass.data.data.flavorText = `${tallTaleItem.data.data.flavorText}`\n\n const pirateData = await pirateFactory.rollScvmForClass(selectedClass);\n\n console.log(pirateData)\n\n if(sentientAnimalItem.name === 'Foul Fowl') {\n\n }\n\n pirateData.items = pirateData.items.concat([sentientAnimalItem]);\n return pirateData;\n}\n\n\n// const tallTaleItem = (await pirateFactory.drawTableItem(tallTaleRollPack, tallTaleRollPackName))[0];\nconst tallTaleItem = await pirateFactory.findCompendiumItem('pirateborg.class-tall-tale', 'Sentient Animal');\nlet pirateData = {};\n\nswitch (tallTaleItem.name) {\n case 'Merfolk':\n pirateData = await getMerfolkData(tallTaleItem);\n break;\n case 'Aquatic Mutant':\n pirateData = await getAquaticMutantData(tallTaleItem);\n break;\n case 'Sentient Animal':\n pirateData = await getSentientAnimalData(tallTaleItem);\n break;\n}\n\npirateData.items = pirateData.items.concat([tallTaleItem])\n\nconsole.log('Creating New', {\n name: tallTaleItem.data.name,\n tallTaleItem,\n pirateData\n});\n\nif (actor) {\n await pirateFactory.updateActorWithScvm(actor, pirateData);\n} else {\n await pirateFactory.createActorWithScvm(pirateData);\n}","folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Macro.JMLpUPK7oJ10cb4A"}}} +{"_id":"euVqlYfll65zKOew","name":"Character creation","type":"script","author":"pdXclp2r5tiEF79G","img":"icons/svg/dice-target.svg","scope":"global","command":"console.clear();\nconsole.log('Character creation', selectedClass.data.name);\n\nconst pirateFactory = game.pirateborg.pirateFactory;\n\nconst tallTaleRollPack = 'pirateborg.rolls-tall-tale';\nconst tallTaleRollPackName = 'Tall Tale';\nconst aquaticMutantRollPackName = 'Aquatic Mutant';\nconst sentientAnimalRollPackName = 'Sentient Animal';\n\nconst getRandomBaseClass = () => {\n const validBaseClasses = selectedClasses.filter((selectedClass) => !selectedClass.data.data.requireBaseClass);\n return baseClass = validBaseClasses[Math.floor(Math.random() * validBaseClasses.length)];\n}\n\nconst getClassItems = async (selectedClass) => {\n return [\n ...(await pirateFactory.rollRollItems(selectedClass.data.data.startingRolls)),\n ...(await pirateFactory.findItems(selectedClass.data.data.startingItems)),\n ];\n}\n\nconst getStartingBonusItems = async (items) => {\n return [\n ...(await pirateFactory.findStartingBonusItems(items)),\n ...(await pirateFactory.findStartingBonusRollsItems(items)),\n ];\n}\n\nconst getPirateDataWithBaseClass = async (additionalItems = []) => {\n const baseClass = getRandomBaseClass(); \n const pirateData = await pirateFactory.rollScvmForClass(baseClass);\n const items = await getClassItems(selectedClass); \n const bonusItems = await getStartingBonusItems([...items, ...additionalItems]);\n\n pirateData.baseClass = `${baseClass.pack};${baseClass.name}`\n// pirateData.description = `${selectedClass.data.data.flavorText}${pirateData.description}`\n\n pirateData.items = pirateData.items\n .filter((item) => item.data.type !== 'class')\n .concat(items)\n .concat(additionalItems)\n .concat(bonusItems)\n .concat([selectedClass]);\n\n return pirateData;\n}\n\nconst animalDefaultData = {\n startingAbilityScoreFormula: '3d6',\n startingStrengthBonus: -2,\n startingAgilityBonus: -2,\n startingPresenceBonus: -2,\n startingToughnessBonus: -2,\n startingSpiritBonus: -2,\n luckDie: 'd4',\n flavorText: '',\n startingMacro: '',\n}\n\nconst createSentientAnimalData = async (data) => {\n return mergeObject(animalDefaultData, data, { insertKeys: true });\n}\n\nconst getMerfolkData = async (tallTaleItem) => {\n const pirateData = await getPirateDataWithBaseClass();\n pirateData.description = `${tallTaleItem.data.name}
${pirateData.description}`\n return pirateData;\n}\n\nconst getAquaticMutantData = async (tallTaleItem) => {\n const aquaticMutantItem = (await pirateFactory.drawTableItem(tallTaleRollPack, aquaticMutantRollPackName))[0];\n const pirateData = await getPirateDataWithBaseClass([aquaticMutantItem]);\n pirateData.description = `${tallTaleItem.data.name} (aquaticMutantItem.data.name)
${pirateData.description}`\n\n if (aquanticMutantItem.data.name === 'Electric Eel') {\n pirateData.agility = parseInt(pirateData.agility, 10) + 1;\n }\n\n return pirateData;\n}\n\nconst getSentientAnimalData = async (tallTaleItem) => {\n const sentientAnimalItem = (await pirateFactory.drawTableItem(tallTaleRollPack, sentientAnimalRollPackName))[0];\n // const pirateData = await getPirateDataWithBaseClass(sentientAnimalItem);\n let data = {};\n switch (sentientAnimalItem.name) {\n case 'Foul Fowl':\n data = await createSentientAnimalData({\n startingSpiritBonus: +3,\n startingHitPoints: '1d4', \n }); \n break;\n case 'Jaguar':\n data = await createSentientAnimalData({\n startingAgilityBonus: +2,\n startingStrengthBonus: +2,\n startingHitPoints: '1d8', \n });\n break;\n case 'Crocodile':\n data = await createSentientAnimalData({\n startingToughnessBonus: +1,\n startingStrengthBonus: +3,\n startingHitPoints: '1d10', \n });\n break;\n case 'Bilge Rat':\n data = await createSentientAnimalData({\n startingToughnessBonus: +2,\n startingAgilityBonus: +3,\n startingHitPoints: '1d2', \n });\n break;\n case 'Lucky Parrot':\n data = await createSentientAnimalData({\n startingPresenceBonus: +2,\n startingAgilityBonus: +1,\n startingHitPoints: '1d2', \n luckDie: '1d6'\n });\n break;\n case 'Clever Monkey':\n data = await createSentientAnimalData({\n startingPresenceBonus: 0,\n startingAgilityBonus: +2,\n startingStrengthBonus: -1,\n startingHitPoints: '1d6', \n startingWeaponTableFormula: '1d10',\n });\n break; \n }\n \n selectedClass.data.data = data;\n selectedClass.data.name = `${tallTaleItem.name} - ${sentientAnimalItem.name}`\n selectedClass.data.img = sentientAnimalItem.data.img;\n selectedClass.data.data.startingRolls = sentientAnimalItem.data.data.startingBonusRolls;\n selectedClass.data.data.startingItems = sentientAnimalItem.data.data.startingBonusItems;\n selectedClass.data.data.flavorText = `${tallTaleItem.data.data.flavorText}`\n\n const pirateData = await pirateFactory.rollScvmForClass(selectedClass);\n\n console.log(pirateData)\n\n if(sentientAnimalItem.name === 'Foul Fowl') {\n pirateData.items\n .filter((item) => item.type === 'invokable')\n .forEach((item) => (item.data.data.isEquipement = false;))\n }\n\n pirateData.items = pirateData.items.concat([sentientAnimalItem]);\n return pirateData;\n}\n\n\n// const tallTaleItem = (await pirateFactory.drawTableItem(tallTaleRollPack, tallTaleRollPackName))[0];\nconst tallTaleItem = await pirateFactory.findCompendiumItem('pirateborg.class-tall-tale', 'Sentient Animal');\nlet pirateData = {};\n\nswitch (tallTaleItem.name) {\n case 'Merfolk':\n pirateData = await getMerfolkData(tallTaleItem);\n break;\n case 'Aquatic Mutant':\n pirateData = await getAquaticMutantData(tallTaleItem);\n break;\n case 'Sentient Animal':\n pirateData = await getSentientAnimalData(tallTaleItem);\n break;\n}\n\npirateData.items = pirateData.items.concat([tallTaleItem])\n\nconsole.log('Creating New', {\n name: tallTaleItem.data.name,\n tallTaleItem,\n pirateData\n});\n\nif (actor) {\n await pirateFactory.updateActorWithScvm(actor, pirateData);\n} else {\n await pirateFactory.createActorWithScvm(pirateData);\n}","folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Macro.JMLpUPK7oJ10cb4A"}}} +{"_id":"euVqlYfll65zKOew","name":"Character creation","type":"script","author":"pdXclp2r5tiEF79G","img":"icons/svg/dice-target.svg","scope":"global","command":"console.clear();\nconsole.log('Character creation', selectedClass.data.name);\n\nconst pirateFactory = game.pirateborg.pirateFactory;\n\nconst tallTaleRollPack = 'pirateborg.rolls-tall-tale';\nconst tallTaleRollPackName = 'Tall Tale';\nconst aquaticMutantRollPackName = 'Aquatic Mutant';\nconst sentientAnimalRollPackName = 'Sentient Animal';\n\nconst getRandomBaseClass = () => {\n const validBaseClasses = selectedClasses.filter((selectedClass) => !selectedClass.data.data.requireBaseClass);\n return baseClass = validBaseClasses[Math.floor(Math.random() * validBaseClasses.length)];\n}\n\nconst getClassItems = async (selectedClass) => {\n return [\n ...(await pirateFactory.rollRollItems(selectedClass.data.data.startingRolls)),\n ...(await pirateFactory.findItems(selectedClass.data.data.startingItems)),\n ];\n}\n\nconst getStartingBonusItems = async (items) => {\n return [\n ...(await pirateFactory.findStartingBonusItems(items)),\n ...(await pirateFactory.findStartingBonusRollsItems(items)),\n ];\n}\n\nconst getPirateDataWithBaseClass = async (additionalItems = []) => {\n const baseClass = getRandomBaseClass(); \n const pirateData = await pirateFactory.rollScvmForClass(baseClass);\n const items = await getClassItems(selectedClass); \n const bonusItems = await getStartingBonusItems([...items, ...additionalItems]);\n\n pirateData.baseClass = `${baseClass.pack};${baseClass.name}`\n// pirateData.description = `${selectedClass.data.data.flavorText}${pirateData.description}`\n\n pirateData.items = pirateData.items\n .filter((item) => item.data.type !== 'class')\n .concat(items)\n .concat(additionalItems)\n .concat(bonusItems)\n .concat([selectedClass]);\n\n return pirateData;\n}\n\nconst animalDefaultData = {\n startingAbilityScoreFormula: '3d6',\n startingStrengthBonus: -2,\n startingAgilityBonus: -2,\n startingPresenceBonus: -2,\n startingToughnessBonus: -2,\n startingSpiritBonus: -2,\n luckDie: 'd4',\n flavorText: '',\n startingMacro: '',\n}\n\nconst createSentientAnimalData = async (data) => {\n return mergeObject(animalDefaultData, data, { insertKeys: true });\n}\n\nconst getMerfolkData = async (tallTaleItem) => {\n const pirateData = await getPirateDataWithBaseClass();\n pirateData.description = `${tallTaleItem.data.name}
${pirateData.description}`\n return pirateData;\n}\n\nconst getAquaticMutantData = async (tallTaleItem) => {\n const aquaticMutantItem = (await pirateFactory.drawTableItem(tallTaleRollPack, aquaticMutantRollPackName))[0];\n const pirateData = await getPirateDataWithBaseClass([aquaticMutantItem]);\n pirateData.description = `${tallTaleItem.data.name} (aquaticMutantItem.data.name)
${pirateData.description}`\n\n if (aquanticMutantItem.data.name === 'Electric Eel') {\n pirateData.agility = parseInt(pirateData.agility, 10) + 1;\n }\n\n return pirateData;\n}\n\nconst getSentientAnimalData = async (tallTaleItem) => {\n const sentientAnimalItem = (await pirateFactory.drawTableItem(tallTaleRollPack, sentientAnimalRollPackName))[0];\n // const pirateData = await getPirateDataWithBaseClass(sentientAnimalItem);\n let data = {};\n switch (sentientAnimalItem.name) {\n case 'Foul Fowl':\n data = await createSentientAnimalData({\n startingSpiritBonus: +3,\n startingHitPoints: '1d4', \n }); \n break;\n case 'Jaguar':\n data = await createSentientAnimalData({\n startingAgilityBonus: +2,\n startingStrengthBonus: +2,\n startingHitPoints: '1d8', \n });\n break;\n case 'Crocodile':\n data = await createSentientAnimalData({\n startingToughnessBonus: +1,\n startingStrengthBonus: +3,\n startingHitPoints: '1d10', \n });\n break;\n case 'Bilge Rat':\n data = await createSentientAnimalData({\n startingToughnessBonus: +2,\n startingAgilityBonus: +3,\n startingHitPoints: '1d2', \n });\n break;\n case 'Lucky Parrot':\n data = await createSentientAnimalData({\n startingPresenceBonus: +2,\n startingAgilityBonus: +1,\n startingHitPoints: '1d2', \n luckDie: '1d6'\n });\n break;\n case 'Clever Monkey':\n data = await createSentientAnimalData({\n startingPresenceBonus: 0,\n startingAgilityBonus: +2,\n startingStrengthBonus: -1,\n startingHitPoints: '1d6', \n startingWeaponTableFormula: '1d10',\n });\n break; \n }\n \n selectedClass.data.data = data;\n selectedClass.data.name = `${tallTaleItem.name} - ${sentientAnimalItem.name}`\n selectedClass.data.img = sentientAnimalItem.data.img;\n selectedClass.data.data.startingRolls = sentientAnimalItem.data.data.startingBonusRolls;\n selectedClass.data.data.startingItems = sentientAnimalItem.data.data.startingBonusItems;\n selectedClass.data.data.flavorText = `${tallTaleItem.data.data.flavorText}`\n\n const pirateData = await pirateFactory.rollScvmForClass(selectedClass);\n\n console.log(pirateData)\n\n if(sentientAnimalItem.name === 'Foul Fowl') {\n pirateData.items\n .filter((item) => item.type === 'invokable')\n .forEach((item) => (item.data.data.isEquipement = false))\n }\n\n pirateData.items = pirateData.items.concat([sentientAnimalItem]);\n return pirateData;\n}\n\n\n// const tallTaleItem = (await pirateFactory.drawTableItem(tallTaleRollPack, tallTaleRollPackName))[0];\nconst tallTaleItem = await pirateFactory.findCompendiumItem('pirateborg.class-tall-tale', 'Sentient Animal');\nlet pirateData = {};\n\nswitch (tallTaleItem.name) {\n case 'Merfolk':\n pirateData = await getMerfolkData(tallTaleItem);\n break;\n case 'Aquatic Mutant':\n pirateData = await getAquaticMutantData(tallTaleItem);\n break;\n case 'Sentient Animal':\n pirateData = await getSentientAnimalData(tallTaleItem);\n break;\n}\n\npirateData.items = pirateData.items.concat([tallTaleItem])\n\nconsole.log('Creating New', {\n name: tallTaleItem.data.name,\n tallTaleItem,\n pirateData\n});\n\nif (actor) {\n await pirateFactory.updateActorWithScvm(actor, pirateData);\n} else {\n await pirateFactory.createActorWithScvm(pirateData);\n}","folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Macro.JMLpUPK7oJ10cb4A"}}} +{"_id":"euVqlYfll65zKOew","name":"Character creation","type":"script","author":"pdXclp2r5tiEF79G","img":"icons/svg/dice-target.svg","scope":"global","command":"console.clear();\nconsole.log('Character creation', selectedClass.data.name);\n\nconst pirateFactory = game.pirateborg.pirateFactory;\n\nconst tallTaleRollPack = 'pirateborg.rolls-tall-tale';\nconst tallTaleRollPackName = 'Tall Tale';\nconst aquaticMutantRollPackName = 'Aquatic Mutant';\nconst sentientAnimalRollPackName = 'Sentient Animal';\n\nconst getRandomBaseClass = () => {\n const validBaseClasses = selectedClasses.filter((selectedClass) => !selectedClass.data.data.requireBaseClass);\n return baseClass = validBaseClasses[Math.floor(Math.random() * validBaseClasses.length)];\n}\n\nconst getClassItems = async (selectedClass) => {\n return [\n ...(await pirateFactory.rollRollItems(selectedClass.data.data.startingRolls)),\n ...(await pirateFactory.findItems(selectedClass.data.data.startingItems)),\n ];\n}\n\nconst getStartingBonusItems = async (items) => {\n return [\n ...(await pirateFactory.findStartingBonusItems(items)),\n ...(await pirateFactory.findStartingBonusRollsItems(items)),\n ];\n}\n\nconst getPirateDataWithBaseClass = async (additionalItems = []) => {\n const baseClass = getRandomBaseClass(); \n const pirateData = await pirateFactory.rollScvmForClass(baseClass);\n const items = await getClassItems(selectedClass); \n const bonusItems = await getStartingBonusItems([...items, ...additionalItems]);\n\n pirateData.baseClass = `${baseClass.pack};${baseClass.name}`\n// pirateData.description = `${selectedClass.data.data.flavorText}${pirateData.description}`\n\n pirateData.items = pirateData.items\n .filter((item) => item.data.type !== 'class')\n .concat(items)\n .concat(additionalItems)\n .concat(bonusItems)\n .concat([selectedClass]);\n\n return pirateData;\n}\n\nconst animalDefaultData = {\n startingAbilityScoreFormula: '3d6',\n startingStrengthBonus: -2,\n startingAgilityBonus: -2,\n startingPresenceBonus: -2,\n startingToughnessBonus: -2,\n startingSpiritBonus: -2,\n luckDie: 'd4',\n flavorText: '',\n startingMacro: '',\n}\n\nconst createSentientAnimalData = async (data) => {\n return mergeObject(animalDefaultData, data, { insertKeys: true });\n}\n\nconst getMerfolkData = async (tallTaleItem) => {\n const pirateData = await getPirateDataWithBaseClass();\n pirateData.description = `${tallTaleItem.data.name}
${pirateData.description}`\n return pirateData;\n}\n\nconst getAquaticMutantData = async (tallTaleItem) => {\n const aquaticMutantItem = (await pirateFactory.drawTableItem(tallTaleRollPack, aquaticMutantRollPackName))[0];\n const pirateData = await getPirateDataWithBaseClass([aquaticMutantItem]);\n pirateData.description = `${tallTaleItem.data.name} (aquaticMutantItem.data.name)
${pirateData.description}`\n\n if (aquanticMutantItem.data.name === 'Electric Eel') {\n pirateData.agility = parseInt(pirateData.agility, 10) + 1;\n }\n\n return pirateData;\n}\n\nconst getSentientAnimalData = async (tallTaleItem) => {\n const sentientAnimalItem = (await pirateFactory.drawTableItem(tallTaleRollPack, sentientAnimalRollPackName))[0];\n // const pirateData = await getPirateDataWithBaseClass(sentientAnimalItem);\n let data = {};\n switch (sentientAnimalItem.name) {\n case 'Foul Fowl':\n data = await createSentientAnimalData({\n startingSpiritBonus: +3,\n startingHitPoints: '1d4', \n }); \n break;\n case 'Jaguar':\n data = await createSentientAnimalData({\n startingAgilityBonus: +2,\n startingStrengthBonus: +2,\n startingHitPoints: '1d8', \n });\n break;\n case 'Crocodile':\n data = await createSentientAnimalData({\n startingToughnessBonus: +1,\n startingStrengthBonus: +3,\n startingHitPoints: '1d10', \n });\n break;\n case 'Bilge Rat':\n data = await createSentientAnimalData({\n startingToughnessBonus: +2,\n startingAgilityBonus: +3,\n startingHitPoints: '1d2', \n });\n break;\n case 'Lucky Parrot':\n data = await createSentientAnimalData({\n startingPresenceBonus: +2,\n startingAgilityBonus: +1,\n startingHitPoints: '1d2', \n luckDie: '1d6'\n });\n break;\n case 'Clever Monkey':\n data = await createSentientAnimalData({\n startingPresenceBonus: 0,\n startingAgilityBonus: +2,\n startingStrengthBonus: -1,\n startingHitPoints: '1d6', \n startingWeaponTableFormula: '1d10',\n });\n break; \n }\n \n selectedClass.data.data = data;\n selectedClass.data.img = sentientAnimalItem.data.img;\n selectedClass.data.data.startingRolls = sentientAnimalItem.data.data.startingBonusRolls;\n selectedClass.data.data.startingItems = sentientAnimalItem.data.data.startingBonusItems;\n selectedClass.data.data.flavorText = `${tallTaleItem.data.data.flavorText}`\n\n const pirateData = await pirateFactory.rollScvmForClass(selectedClass);\n\n if(sentientAnimalItem.name === 'Foul Fowl') {\n pirateData.items\n .filter((item) => item.type === 'invokable')\n .forEach((item) => {\n item.data.data.isEquipment = false;\n });\n }\n\n pirateData.items = pirateData.items.concat([sentientAnimalItem]);\n return pirateData;\n}\n\n\n// const tallTaleItem = (await pirateFactory.drawTableItem(tallTaleRollPack, tallTaleRollPackName))[0];\nconst tallTaleItem = await pirateFactory.findCompendiumItem('pirateborg.class-tall-tale', 'Sentient Animal');\nlet pirateData = {};\n\nswitch (tallTaleItem.name) {\n case 'Merfolk':\n pirateData = await getMerfolkData(tallTaleItem);\n break;\n case 'Aquatic Mutant':\n pirateData = await getAquaticMutantData(tallTaleItem);\n break;\n case 'Sentient Animal':\n pirateData = await getSentientAnimalData(tallTaleItem);\n break;\n}\n\npirateData.items = pirateData.items.concat([tallTaleItem])\n\nconsole.log('Creating New', {\n name: tallTaleItem.data.name,\n tallTaleItem,\n pirateData\n});\n\nif (actor) {\n await pirateFactory.updateActorWithScvm(actor, pirateData);\n} else {\n await pirateFactory.createActorWithScvm(pirateData);\n}","folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Macro.JMLpUPK7oJ10cb4A"}}} +{"_id":"euVqlYfll65zKOew","name":"Character creation","type":"script","author":"pdXclp2r5tiEF79G","img":"icons/svg/dice-target.svg","scope":"global","command":"console.clear();\nconsole.log('Character creation', selectedClass.data.name);\n\nconst pirateFactory = game.pirateborg.pirateFactory;\n\nconst tallTaleRollPack = 'pirateborg.rolls-tall-tale';\nconst tallTaleRollPackName = 'Tall Tale';\nconst aquaticMutantRollPackName = 'Aquatic Mutant';\nconst sentientAnimalRollPackName = 'Sentient Animal';\n\nconst getRandomBaseClass = () => {\n const validBaseClasses = selectedClasses.filter((selectedClass) => !selectedClass.data.data.requireBaseClass);\n return baseClass = validBaseClasses[Math.floor(Math.random() * validBaseClasses.length)];\n}\n\nconst getClassItems = async (selectedClass) => {\n return [\n ...(await pirateFactory.rollRollItems(selectedClass.data.data.startingRolls)),\n ...(await pirateFactory.findItems(selectedClass.data.data.startingItems)),\n ];\n}\n\nconst getStartingBonusItems = async (items) => {\n return [\n ...(await pirateFactory.findStartingBonusItems(items)),\n ...(await pirateFactory.findStartingBonusRollsItems(items)),\n ];\n}\n\nconst getPirateDataWithBaseClass = async (additionalItems = []) => {\n const baseClass = getRandomBaseClass(); \n const pirateData = await pirateFactory.rollScvmForClass(baseClass);\n const items = await getClassItems(selectedClass); \n const bonusItems = await getStartingBonusItems([...items, ...additionalItems]);\n\n pirateData.baseClass = `${baseClass.pack};${baseClass.name}`\n// pirateData.description = `${selectedClass.data.data.flavorText}${pirateData.description}`\n\n pirateData.items = pirateData.items\n .filter((item) => item.data.type !== 'class')\n .concat(items)\n .concat(additionalItems)\n .concat(bonusItems)\n .concat([selectedClass]);\n\n return pirateData;\n}\n\nconst animalDefaultData = {\n startingAbilityScoreFormula: '3d6',\n startingStrengthBonus: -2,\n startingAgilityBonus: -2,\n startingPresenceBonus: -2,\n startingToughnessBonus: -2,\n startingSpiritBonus: -2,\n luckDie: 'd4',\n flavorText: '',\n startingMacro: '',\n}\n\nconst createSentientAnimalData = async (data) => {\n return mergeObject(animalDefaultData, data, { insertKeys: true });\n}\n\nconst getMerfolkData = async (tallTaleItem) => {\n const pirateData = await getPirateDataWithBaseClass();\n pirateData.description = `${tallTaleItem.data.name}
${pirateData.description}`\n return pirateData;\n}\n\nconst getAquaticMutantData = async (tallTaleItem) => {\n const aquaticMutantItem = (await pirateFactory.drawTableItem(tallTaleRollPack, aquaticMutantRollPackName))[0];\n const pirateData = await getPirateDataWithBaseClass([aquaticMutantItem]);\n pirateData.description = `${tallTaleItem.data.name} (aquaticMutantItem.data.name)
${pirateData.description}`\n\n if (aquanticMutantItem.data.name === 'Electric Eel') {\n pirateData.agility = parseInt(pirateData.agility, 10) + 1;\n }\n\n return pirateData;\n}\n\nconst getSentientAnimalData = async (tallTaleItem) => {\n const sentientAnimalItem = (await pirateFactory.drawTableItem(tallTaleRollPack, sentientAnimalRollPackName))[0];\n const pirateData = await getPirateDataWithBaseClass(sentientAnimalItem);\n let data = {};\n switch (sentientAnimalItem.name) {\n case 'Foul Fowl':\n data = await createSentientAnimalData({\n startingSpiritBonus: +3,\n startingHitPoints: '1d4', \n }); \n break;\n case 'Jaguar':\n data = await createSentientAnimalData({\n startingAgilityBonus: +2,\n startingStrengthBonus: +2,\n startingHitPoints: '1d8', \n });\n break;\n case 'Crocodile':\n data = await createSentientAnimalData({\n startingToughnessBonus: +1,\n startingStrengthBonus: +3,\n startingHitPoints: '1d10', \n });\n break;\n case 'Bilge Rat':\n data = await createSentientAnimalData({\n startingToughnessBonus: +2,\n startingAgilityBonus: +3,\n startingHitPoints: '1d2', \n });\n break;\n case 'Lucky Parrot':\n data = await createSentientAnimalData({\n startingPresenceBonus: +2,\n startingAgilityBonus: +1,\n startingHitPoints: '1d2', \n luckDie: '1d6'\n });\n break;\n case 'Clever Monkey':\n data = await createSentientAnimalData({\n startingPresenceBonus: 0,\n startingAgilityBonus: +2,\n startingStrengthBonus: -1,\n startingHitPoints: '1d6', \n startingWeaponTableFormula: '1d10',\n });\n break; \n }\n \n selectedClass.data.data = data;\n selectedClass.data.img = sentientAnimalItem.data.img;\n selectedClass.data.data.startingRolls = sentientAnimalItem.data.data.startingBonusRolls;\n selectedClass.data.data.startingItems = sentientAnimalItem.data.data.startingBonusItems;\n selectedClass.data.data.flavorText = `${tallTaleItem.data.data.flavorText}`\n\n const pirateData = await pirateFactory.rollScvmForClass(selectedClass);\n\n if(sentientAnimalItem.name === 'Foul Fowl') {\n pirateData.items\n .filter((item) => item.type === 'invokable')\n .forEach((item) => {\n item.data.data.isEquipment = false;\n });\n }\n\n pirateData.items = pirateData.items.concat([sentientAnimalItem]);\n return pirateData;\n}\n\n\nconst tallTaleItem = (await pirateFactory.drawTableItem(tallTaleRollPack, tallTaleRollPackName))[0];\nconst tallTaleItem = await pirateFactory.findCompendiumItem('pirateborg.class-tall-tale', 'Sentient Animal');\nlet pirateData = {};\n\nswitch (tallTaleItem.name) {\n case 'Merfolk':\n pirateData = await getMerfolkData(tallTaleItem);\n break;\n case 'Aquatic Mutant':\n pirateData = await getAquaticMutantData(tallTaleItem);\n break;\n case 'Sentient Animal':\n pirateData = await getSentientAnimalData(tallTaleItem);\n break;\n}\n\npirateData.items = pirateData.items.concat([tallTaleItem])\n\nconsole.log('Creating New', {\n name: tallTaleItem.data.name,\n tallTaleItem,\n pirateData\n});\n\nif (actor) {\n await pirateFactory.updateActorWithScvm(actor, pirateData);\n} else {\n await pirateFactory.createActorWithScvm(pirateData);\n}","folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Macro.JMLpUPK7oJ10cb4A"}}} +{"_id":"euVqlYfll65zKOew","name":"Character creation","type":"script","author":"pdXclp2r5tiEF79G","img":"icons/svg/dice-target.svg","scope":"global","command":"console.clear();\nconsole.log('Character creation', selectedClass.data.name);\n\nconst pirateFactory = game.pirateborg.pirateFactory;\n\nconst tallTaleRollPack = 'pirateborg.rolls-tall-tale';\nconst tallTaleRollPackName = 'Tall Tale';\nconst aquaticMutantRollPackName = 'Aquatic Mutant';\nconst sentientAnimalRollPackName = 'Sentient Animal';\n\nconst getRandomBaseClass = () => {\n const validBaseClasses = selectedClasses.filter((selectedClass) => !selectedClass.data.data.requireBaseClass);\n return baseClass = validBaseClasses[Math.floor(Math.random() * validBaseClasses.length)];\n}\n\nconst getClassItems = async (selectedClass) => {\n return [\n ...(await pirateFactory.rollRollItems(selectedClass.data.data.startingRolls)),\n ...(await pirateFactory.findItems(selectedClass.data.data.startingItems)),\n ];\n}\n\nconst getStartingBonusItems = async (items) => {\n return [\n ...(await pirateFactory.findStartingBonusItems(items)),\n ...(await pirateFactory.findStartingBonusRollsItems(items)),\n ];\n}\n\nconst getPirateDataWithBaseClass = async (additionalItems = []) => {\n const baseClass = getRandomBaseClass(); \n const pirateData = await pirateFactory.rollScvmForClass(baseClass);\n const items = await getClassItems(selectedClass); \n const bonusItems = await getStartingBonusItems([...items, ...additionalItems]);\n\n pirateData.baseClass = `${baseClass.pack};${baseClass.name}`\n// pirateData.description = `${selectedClass.data.data.flavorText}${pirateData.description}`\n\n pirateData.items = pirateData.items\n .filter((item) => item.data.type !== 'class')\n .concat(items)\n .concat(additionalItems)\n .concat(bonusItems)\n .concat([selectedClass]);\n\n return pirateData;\n}\n\nconst animalDefaultData = {\n startingAbilityScoreFormula: '3d6',\n startingStrengthBonus: -2,\n startingAgilityBonus: -2,\n startingPresenceBonus: -2,\n startingToughnessBonus: -2,\n startingSpiritBonus: -2,\n luckDie: 'd4',\n flavorText: '',\n startingMacro: '',\n}\n\nconst createSentientAnimalData = async (data) => {\n return mergeObject(animalDefaultData, data, { insertKeys: true });\n}\n\nconst getMerfolkData = async (tallTaleItem) => {\n const pirateData = await getPirateDataWithBaseClass();\n pirateData.description = `${tallTaleItem.data.name}
${pirateData.description}`\n return pirateData;\n}\n\nconst getAquaticMutantData = async (tallTaleItem) => {\n const aquaticMutantItem = (await pirateFactory.drawTableItem(tallTaleRollPack, aquaticMutantRollPackName))[0];\n const pirateData = await getPirateDataWithBaseClass([aquaticMutantItem]);\n pirateData.description = `${tallTaleItem.data.name} (aquaticMutantItem.data.name)
${pirateData.description}`\n\n if (aquanticMutantItem.data.name === 'Electric Eel') {\n pirateData.agility = parseInt(pirateData.agility, 10) + 1;\n }\n\n return pirateData;\n}\n\nconst getSentientAnimalData = async (tallTaleItem) => {\n const sentientAnimalItem = (await pirateFactory.drawTableItem(tallTaleRollPack, sentientAnimalRollPackName))[0];\n// const sentielAnimalData = await getPirateDataWithBaseClass(sentientAnimalItem);\n let data = {};\n switch (sentientAnimalItem.name) {\n case 'Foul Fowl':\n data = await createSentientAnimalData({\n startingSpiritBonus: +3,\n startingHitPoints: '1d4', \n }); \n break;\n case 'Jaguar':\n data = await createSentientAnimalData({\n startingAgilityBonus: +2,\n startingStrengthBonus: +2,\n startingHitPoints: '1d8', \n });\n break;\n case 'Crocodile':\n data = await createSentientAnimalData({\n startingToughnessBonus: +1,\n startingStrengthBonus: +3,\n startingHitPoints: '1d10', \n });\n break;\n case 'Bilge Rat':\n data = await createSentientAnimalData({\n startingToughnessBonus: +2,\n startingAgilityBonus: +3,\n startingHitPoints: '1d2', \n });\n break;\n case 'Lucky Parrot':\n data = await createSentientAnimalData({\n startingPresenceBonus: +2,\n startingAgilityBonus: +1,\n startingHitPoints: '1d2', \n luckDie: '1d6'\n });\n break;\n case 'Clever Monkey':\n data = await createSentientAnimalData({\n startingPresenceBonus: 0,\n startingAgilityBonus: +2,\n startingStrengthBonus: -1,\n startingHitPoints: '1d6', \n startingWeaponTableFormula: '1d10',\n });\n break; \n }\n \n selectedClass.data.data = data;\n selectedClass.data.img = sentientAnimalItem.data.img;\n selectedClass.data.data.startingRolls = sentientAnimalItem.data.data.startingBonusRolls;\n selectedClass.data.data.startingItems = sentientAnimalItem.data.data.startingBonusItems;\n selectedClass.data.data.flavorText = `${tallTaleItem.data.data.flavorText}`\n\n const pirateData = await pirateFactory.rollScvmForClass(selectedClass);\n\n if(sentientAnimalItem.name === 'Foul Fowl') {\n pirateData.items\n .filter((item) => item.type === 'invokable')\n .forEach((item) => {\n item.data.data.isEquipment = false;\n });\n }\n\n pirateData.items = pirateData.items.concat([sentientAnimalItem]);\n return pirateData;\n}\n\n\nconst tallTaleItem = (await pirateFactory.drawTableItem(tallTaleRollPack, tallTaleRollPackName))[0];\nconst tallTaleItem = await pirateFactory.findCompendiumItem('pirateborg.class-tall-tale', 'Sentient Animal');\nlet pirateData = {};\n\nswitch (tallTaleItem.name) {\n case 'Merfolk':\n pirateData = await getMerfolkData(tallTaleItem);\n break;\n case 'Aquatic Mutant':\n pirateData = await getAquaticMutantData(tallTaleItem);\n break;\n case 'Sentient Animal':\n pirateData = await getSentientAnimalData(tallTaleItem);\n break;\n}\n\npirateData.items = pirateData.items.concat([tallTaleItem])\n\nconsole.log('Creating New', {\n name: tallTaleItem.data.name,\n tallTaleItem,\n pirateData\n});\n\nif (actor) {\n await pirateFactory.updateActorWithScvm(actor, pirateData);\n} else {\n await pirateFactory.createActorWithScvm(pirateData);\n}","folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Macro.JMLpUPK7oJ10cb4A"}}} +{"_id":"euVqlYfll65zKOew","name":"Character creation","type":"script","author":"pdXclp2r5tiEF79G","img":"icons/svg/dice-target.svg","scope":"global","command":"console.clear();\nconsole.log('Character creation', selectedClass.data.name);\n\nconst pirateFactory = game.pirateborg.pirateFactory;\n\nconst tallTaleRollPack = 'pirateborg.rolls-tall-tale';\nconst tallTaleRollPackName = 'Tall Tale';\nconst aquaticMutantRollPackName = 'Aquatic Mutant';\nconst sentientAnimalRollPackName = 'Sentient Animal';\n\nconst getRandomBaseClass = () => {\n const validBaseClasses = selectedClasses.filter((selectedClass) => !selectedClass.data.data.requireBaseClass);\n return baseClass = validBaseClasses[Math.floor(Math.random() * validBaseClasses.length)];\n}\n\nconst getClassItems = async (selectedClass) => {\n return [\n ...(await pirateFactory.rollRollItems(selectedClass.data.data.startingRolls)),\n ...(await pirateFactory.findItems(selectedClass.data.data.startingItems)),\n ];\n}\n\nconst getStartingBonusItems = async (items) => {\n return [\n ...(await pirateFactory.findStartingBonusItems(items)),\n ...(await pirateFactory.findStartingBonusRollsItems(items)),\n ];\n}\n\nconst getPirateDataWithBaseClass = async (additionalItems = []) => {\n const baseClass = getRandomBaseClass(); \n const pirateData = await pirateFactory.rollScvmForClass(baseClass);\n const items = await getClassItems(selectedClass); \n const bonusItems = await getStartingBonusItems([...items, ...additionalItems]);\n\n pirateData.baseClass = `${baseClass.pack};${baseClass.name}`\n// pirateData.description = `${selectedClass.data.data.flavorText}${pirateData.description}`\n\n pirateData.items = pirateData.items\n .filter((item) => item.data.type !== 'class')\n .concat(items)\n .concat(additionalItems)\n .concat(bonusItems)\n .concat([selectedClass]);\n\n return pirateData;\n}\n\nconst animalDefaultData = {\n startingAbilityScoreFormula: '3d6',\n startingStrengthBonus: -2,\n startingAgilityBonus: -2,\n startingPresenceBonus: -2,\n startingToughnessBonus: -2,\n startingSpiritBonus: -2,\n luckDie: 'd4',\n flavorText: '',\n startingMacro: '',\n}\n\nconst createSentientAnimalData = async (data) => {\n return mergeObject(animalDefaultData, data, { insertKeys: true });\n}\n\nconst getMerfolkData = async (tallTaleItem) => {\n const pirateData = await getPirateDataWithBaseClass();\n pirateData.description = `${tallTaleItem.data.name}
${pirateData.description}`\n return pirateData;\n}\n\nconst getAquaticMutantData = async (tallTaleItem) => {\n const aquaticMutantItem = (await pirateFactory.drawTableItem(tallTaleRollPack, aquaticMutantRollPackName))[0];\n const pirateData = await getPirateDataWithBaseClass([aquaticMutantItem]);\n pirateData.description = `${tallTaleItem.data.name} (aquaticMutantItem.data.name)
${pirateData.description}`\n\n if (aquanticMutantItem.data.name === 'Electric Eel') {\n pirateData.agility = parseInt(pirateData.agility, 10) + 1;\n }\n\n return pirateData;\n}\n\nconst getSentientAnimalData = async (tallTaleItem) => {\n const sentientAnimalItem = (await pirateFactory.drawTableItem(tallTaleRollPack, sentientAnimalRollPackName))[0];\n// const sentielAnimalData = await getPirateDataWithBaseClass(sentientAnimalItem);\n let data = {};\n switch (sentientAnimalItem.name) {\n case 'Foul Fowl':\n data = await createSentientAnimalData({\n startingSpiritBonus: +3,\n startingHitPoints: '1d4', \n }); \n break;\n case 'Jaguar':\n data = await createSentientAnimalData({\n startingAgilityBonus: +2,\n startingStrengthBonus: +2,\n startingHitPoints: '1d8', \n });\n break;\n case 'Crocodile':\n data = await createSentientAnimalData({\n startingToughnessBonus: +1,\n startingStrengthBonus: +3,\n startingHitPoints: '1d10', \n });\n break;\n case 'Bilge Rat':\n data = await createSentientAnimalData({\n startingToughnessBonus: +2,\n startingAgilityBonus: +3,\n startingHitPoints: '1d2', \n });\n break;\n case 'Lucky Parrot':\n data = await createSentientAnimalData({\n startingPresenceBonus: +2,\n startingAgilityBonus: +1,\n startingHitPoints: '1d2', \n luckDie: '1d6'\n });\n break;\n case 'Clever Monkey':\n data = await createSentientAnimalData({\n startingPresenceBonus: 0,\n startingAgilityBonus: +2,\n startingStrengthBonus: -1,\n startingHitPoints: '1d6', \n startingWeaponTableFormula: '1d10',\n });\n break; \n }\n \n selectedClass.data.data = data;\n selectedClass.data.img = sentientAnimalItem.data.img;\n selectedClass.data.data.startingRolls = sentientAnimalItem.data.data.startingBonusRolls;\n selectedClass.data.data.startingItems = sentientAnimalItem.data.data.startingBonusItems;\n selectedClass.data.data.flavorText = `${tallTaleItem.data.data.flavorText}`\n\n const pirateData = await pirateFactory.rollScvmForClass(selectedClass);\n\n if(sentientAnimalItem.name === 'Foul Fowl') {\n pirateData.items\n .filter((item) => item.type === 'invokable')\n .forEach((item) => {\n item.data.data.isEquipment = false;\n });\n }\n\n pirateData.items = pirateData.items.concat([sentientAnimalItem]);\n return pirateData;\n}\n\n\nconst tallTaleItem = (await pirateFactory.drawTableItem(tallTaleRollPack, tallTaleRollPackName))[0];\n// const tallTaleItem = await pirateFactory.findCompendiumItem('pirateborg.class-tall-tale', 'Sentient Animal');\nlet pirateData = {};\n\nswitch (tallTaleItem.name) {\n case 'Merfolk':\n pirateData = await getMerfolkData(tallTaleItem);\n break;\n case 'Aquatic Mutant':\n pirateData = await getAquaticMutantData(tallTaleItem);\n break;\n case 'Sentient Animal':\n pirateData = await getSentientAnimalData(tallTaleItem);\n break;\n}\n\npirateData.items = pirateData.items.concat([tallTaleItem])\n\nconsole.log('Creating New', {\n name: tallTaleItem.data.name,\n tallTaleItem,\n pirateData\n});\n\nif (actor) {\n await pirateFactory.updateActorWithScvm(actor, pirateData);\n} else {\n await pirateFactory.createActorWithScvm(pirateData);\n}","folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Macro.JMLpUPK7oJ10cb4A"}}} +{"_id":"euVqlYfll65zKOew","name":"Character creation","type":"script","author":"pdXclp2r5tiEF79G","img":"icons/svg/dice-target.svg","scope":"global","command":"console.clear();\nconsole.log('Character creation', selectedClass.data.name);\n\nconst pirateFactory = game.pirateborg.pirateFactory;\n\nconst tallTaleRollPack = 'pirateborg.rolls-tall-tale';\nconst tallTaleRollPackName = 'Tall Tale';\nconst aquaticMutantRollPackName = 'Aquatic Mutant';\nconst sentientAnimalRollPackName = 'Sentient Animal';\n\nconst getRandomBaseClass = () => {\n const validBaseClasses = selectedClasses.filter((selectedClass) => !selectedClass.data.data.requireBaseClass);\n return baseClass = validBaseClasses[Math.floor(Math.random() * validBaseClasses.length)];\n}\n\nconst getClassItems = async (selectedClass) => {\n return [\n ...(await pirateFactory.rollRollItems(selectedClass.data.data.startingRolls)),\n ...(await pirateFactory.findItems(selectedClass.data.data.startingItems)),\n ];\n}\n\nconst getStartingBonusItems = async (items) => {\n return [\n ...(await pirateFactory.findStartingBonusItems(items)),\n ...(await pirateFactory.findStartingBonusRollsItems(items)),\n ];\n}\n\nconst getPirateDataWithBaseClass = async (additionalItems = []) => {\n const baseClass = getRandomBaseClass(); \n const pirateData = await pirateFactory.rollScvmForClass(baseClass);\n const items = await getClassItems(selectedClass); \n const bonusItems = await getStartingBonusItems([...items, ...additionalItems]);\n\n pirateData.baseClass = `${baseClass.pack};${baseClass.name}`\n// pirateData.description = `${selectedClass.data.data.flavorText}${pirateData.description}`\n\n pirateData.items = pirateData.items\n .filter((item) => item.data.type !== 'class')\n .concat(items)\n .concat(additionalItems)\n .concat(bonusItems)\n .concat([selectedClass]);\n\n return pirateData;\n}\n\nconst animalDefaultData = {\n startingAbilityScoreFormula: '3d6',\n startingStrengthBonus: -2,\n startingAgilityBonus: -2,\n startingPresenceBonus: -2,\n startingToughnessBonus: -2,\n startingSpiritBonus: -2,\n luckDie: 'd4',\n flavorText: '',\n startingMacro: '',\n}\n\nconst createSentientAnimalData = async (data) => {\n return mergeObject(animalDefaultData, data, { insertKeys: true });\n}\n\nconst getMerfolkData = async (tallTaleItem) => {\n const pirateData = await getPirateDataWithBaseClass();\n pirateData.description = `${tallTaleItem.data.name}
${pirateData.description}`\n return pirateData;\n}\n\nconst getAquaticMutantData = async (tallTaleItem) => {\n const aquaticMutantItem = (await pirateFactory.drawTableItem(tallTaleRollPack, aquaticMutantRollPackName))[0];\n const pirateData = await getPirateDataWithBaseClass([aquaticMutantItem]);\n pirateData.description = `${tallTaleItem.data.name} (aquaticMutantItem.data.name)
${pirateData.description}`\n\n if (aquanticMutantItem.data.name === 'Electric Eel') {\n pirateData.agility = parseInt(pirateData.agility, 10) + 1;\n }\n\n return pirateData;\n}\n\nconst getSentientAnimalData = async (tallTaleItem) => {\n const sentientAnimalItem = (await pirateFactory.drawTableItem(tallTaleRollPack, sentientAnimalRollPackName))[0];\n// const sentielAnimalData = await getPirateDataWithBaseClass(sentientAnimalItem);\n let data = {};\n switch (sentientAnimalItem.name) {\n case 'Foul Fowl':\n data = await createSentientAnimalData({\n startingSpiritBonus: +3,\n startingHitPoints: '1d4', \n }); \n break;\n case 'Jaguar':\n data = await createSentientAnimalData({\n startingAgilityBonus: +2,\n startingStrengthBonus: +2,\n startingHitPoints: '1d8', \n });\n break;\n case 'Crocodile':\n data = await createSentientAnimalData({\n startingToughnessBonus: +1,\n startingStrengthBonus: +3,\n startingHitPoints: '1d10', \n });\n break;\n case 'Bilge Rat':\n data = await createSentientAnimalData({\n startingToughnessBonus: +2,\n startingAgilityBonus: +3,\n startingHitPoints: '1d2', \n });\n break;\n case 'Lucky Parrot':\n data = await createSentientAnimalData({\n startingPresenceBonus: +2,\n startingAgilityBonus: +1,\n startingHitPoints: '1d2', \n luckDie: '1d6'\n });\n break;\n case 'Clever Monkey':\n data = await createSentientAnimalData({\n startingPresenceBonus: 0,\n startingAgilityBonus: +2,\n startingStrengthBonus: -1,\n startingHitPoints: '1d6', \n startingWeaponTableFormula: '1d10',\n });\n break; \n }\n \n selectedClass.data.data = data;\n selectedClass.data.img = sentientAnimalItem.data.img;\n selectedClass.data.data.startingRolls = sentientAnimalItem.data.data.startingBonusRolls;\n selectedClass.data.data.startingItems = sentientAnimalItem.data.data.startingBonusItems;\n selectedClass.data.data.flavorText = `${tallTaleItem.data.data.flavorText}`\n\n const pirateData = await pirateFactory.rollScvmForClass(selectedClass);\n\n if(sentientAnimalItem.name === 'Foul Fowl') {\n pirateData.items\n .filter((item) => item.type === 'invokable')\n .forEach((item) => {\n item.data.data.isEquipment = false;\n });\n }\n\n pirateData.items = pirateData.items.concat([sentientAnimalItem]);\n return pirateData;\n}\n\n\n// const tallTaleItem = (await pirateFactory.drawTableItem(tallTaleRollPack, tallTaleRollPackName))[0];\nconst tallTaleItem = await pirateFactory.findCompendiumItem('pirateborg.class-tall-tale', 'Merfolk');\nlet pirateData = {};\n\nswitch (tallTaleItem.name) {\n case 'Merfolk':\n pirateData = await getMerfolkData(tallTaleItem);\n break;\n case 'Aquatic Mutant':\n pirateData = await getAquaticMutantData(tallTaleItem);\n break;\n case 'Sentient Animal':\n pirateData = await getSentientAnimalData(tallTaleItem);\n break;\n}\n\npirateData.items = pirateData.items.concat([tallTaleItem])\n\nconsole.log('Creating New', {\n name: tallTaleItem.data.name,\n tallTaleItem,\n pirateData\n});\n\nif (actor) {\n await pirateFactory.updateActorWithScvm(actor, pirateData);\n} else {\n await pirateFactory.createActorWithScvm(pirateData);\n}","folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Macro.JMLpUPK7oJ10cb4A"}}} +{"_id":"euVqlYfll65zKOew","name":"Character creation","type":"script","author":"pdXclp2r5tiEF79G","img":"icons/svg/dice-target.svg","scope":"global","command":"console.clear();\nconsole.log('Character creation', selectedClass.data.name);\n\nconst pirateFactory = game.pirateborg.pirateFactory;\n\nconst tallTaleRollPack = 'pirateborg.rolls-tall-tale';\nconst tallTaleRollPackName = 'Tall Tale';\nconst aquaticMutantRollPackName = 'Aquatic Mutant';\nconst sentientAnimalRollPackName = 'Sentient Animal';\n\nconst getRandomBaseClass = () => {\n const validBaseClasses = selectedClasses.filter((selectedClass) => !selectedClass.data.data.requireBaseClass);\n return baseClass = validBaseClasses[Math.floor(Math.random() * validBaseClasses.length)];\n}\n\nconst getClassItems = async (selectedClass) => {\n return [\n ...(await pirateFactory.rollRollItems(selectedClass.data.data.startingRolls)),\n ...(await pirateFactory.findItems(selectedClass.data.data.startingItems)),\n ];\n}\n\nconst getStartingBonusItems = async (items) => {\n return [\n ...(await pirateFactory.findStartingBonusItems(items)),\n ...(await pirateFactory.findStartingBonusRollsItems(items)),\n ];\n}\n\nconst getPirateDataWithBaseClass = async (additionalItems = []) => {\n const baseClass = getRandomBaseClass(); \n const pirateData = await pirateFactory.rollScvmForClass(baseClass);\n const items = await getClassItems(selectedClass); \n const bonusItems = await getStartingBonusItems([...items, ...additionalItems]);\n\n pirateData.baseClass = `${baseClass.pack};${baseClass.name}`\n// pirateData.description = `${selectedClass.data.data.flavorText}${pirateData.description}`\n\n pirateData.items = pirateData.items\n .filter((item) => item.data.type !== 'class')\n .concat(items)\n .concat(additionalItems)\n .concat(bonusItems)\n .concat([selectedClass]);\n\n return pirateData;\n}\n\nconst animalDefaultData = {\n startingAbilityScoreFormula: '3d6',\n startingStrengthBonus: -2,\n startingAgilityBonus: -2,\n startingPresenceBonus: -2,\n startingToughnessBonus: -2,\n startingSpiritBonus: -2,\n luckDie: 'd4',\n flavorText: '',\n startingMacro: '',\n}\n\nconst createSentientAnimalData = async (data) => {\n return mergeObject(animalDefaultData, data, { insertKeys: true });\n}\n\nconst getMerfolkData = async (tallTaleItem) => {\n const pirateData = await getPirateDataWithBaseClass();\n pirateData.description = `${tallTaleItem.data.flavorText}
${pirateData.description}`\n pirateData.actorImg = tallTaleItem.data.img;\n return pirateData;\n}\n\nconst getAquaticMutantData = async (tallTaleItem) => {\n const aquaticMutantItem = (await pirateFactory.drawTableItem(tallTaleRollPack, aquaticMutantRollPackName))[0];\n const pirateData = await getPirateDataWithBaseClass([aquaticMutantItem]);\n pirateData.description = `${tallTaleItem.data.name} (aquaticMutantItem.data.name)
${pirateData.description}`\n\n if (aquanticMutantItem.data.name === 'Electric Eel') {\n pirateData.agility = parseInt(pirateData.agility, 10) + 1;\n }\n\n return pirateData;\n}\n\nconst getSentientAnimalData = async (tallTaleItem) => {\n const sentientAnimalItem = (await pirateFactory.drawTableItem(tallTaleRollPack, sentientAnimalRollPackName))[0];\n// const sentielAnimalData = await getPirateDataWithBaseClass(sentientAnimalItem);\n let data = {};\n switch (sentientAnimalItem.name) {\n case 'Foul Fowl':\n data = await createSentientAnimalData({\n startingSpiritBonus: +3,\n startingHitPoints: '1d4', \n }); \n break;\n case 'Jaguar':\n data = await createSentientAnimalData({\n startingAgilityBonus: +2,\n startingStrengthBonus: +2,\n startingHitPoints: '1d8', \n });\n break;\n case 'Crocodile':\n data = await createSentientAnimalData({\n startingToughnessBonus: +1,\n startingStrengthBonus: +3,\n startingHitPoints: '1d10', \n });\n break;\n case 'Bilge Rat':\n data = await createSentientAnimalData({\n startingToughnessBonus: +2,\n startingAgilityBonus: +3,\n startingHitPoints: '1d2', \n });\n break;\n case 'Lucky Parrot':\n data = await createSentientAnimalData({\n startingPresenceBonus: +2,\n startingAgilityBonus: +1,\n startingHitPoints: '1d2', \n luckDie: '1d6'\n });\n break;\n case 'Clever Monkey':\n data = await createSentientAnimalData({\n startingPresenceBonus: 0,\n startingAgilityBonus: +2,\n startingStrengthBonus: -1,\n startingHitPoints: '1d6', \n startingWeaponTableFormula: '1d10',\n });\n break; \n }\n \n selectedClass.data.data = data;\n selectedClass.data.img = sentientAnimalItem.data.img;\n selectedClass.data.data.startingRolls = sentientAnimalItem.data.data.startingBonusRolls;\n selectedClass.data.data.startingItems = sentientAnimalItem.data.data.startingBonusItems;\n selectedClass.data.data.flavorText = `${tallTaleItem.data.data.flavorText}`\n\n const pirateData = await pirateFactory.rollScvmForClass(selectedClass);\n\n if(sentientAnimalItem.name === 'Foul Fowl') {\n pirateData.items\n .filter((item) => item.type === 'invokable')\n .forEach((item) => {\n item.data.data.isEquipment = false;\n });\n }\n\n pirateData.items = pirateData.items.concat([sentientAnimalItem]);\n return pirateData;\n}\n\n\n// const tallTaleItem = (await pirateFactory.drawTableItem(tallTaleRollPack, tallTaleRollPackName))[0];\nconst tallTaleItem = await pirateFactory.findCompendiumItem('pirateborg.class-tall-tale', 'Merfolk');\nlet pirateData = {};\n\nswitch (tallTaleItem.name) {\n case 'Merfolk':\n pirateData = await getMerfolkData(tallTaleItem);\n break;\n case 'Aquatic Mutant':\n pirateData = await getAquaticMutantData(tallTaleItem);\n break;\n case 'Sentient Animal':\n pirateData = await getSentientAnimalData(tallTaleItem);\n break;\n}\n\npirateData.items = pirateData.items.concat([tallTaleItem])\n\nconsole.log('Creating New', {\n name: tallTaleItem.data.name,\n tallTaleItem,\n pirateData\n});\n\nif (actor) {\n await pirateFactory.updateActorWithScvm(actor, pirateData);\n} else {\n await pirateFactory.createActorWithScvm(pirateData);\n}","folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Macro.JMLpUPK7oJ10cb4A"}}} +{"_id":"euVqlYfll65zKOew","name":"Character creation","type":"script","author":"pdXclp2r5tiEF79G","img":"icons/svg/dice-target.svg","scope":"global","command":"console.clear();\nconsole.log('Character creation', selectedClass.data.name);\n\nconst pirateFactory = game.pirateborg.pirateFactory;\n\nconst tallTaleRollPack = 'pirateborg.rolls-tall-tale';\nconst tallTaleRollPackName = 'Tall Tale';\nconst aquaticMutantRollPackName = 'Aquatic Mutant';\nconst sentientAnimalRollPackName = 'Sentient Animal';\n\nconst getRandomBaseClass = () => {\n const validBaseClasses = selectedClasses.filter((selectedClass) => !selectedClass.data.data.requireBaseClass);\n return baseClass = validBaseClasses[Math.floor(Math.random() * validBaseClasses.length)];\n}\n\nconst getClassItems = async (selectedClass) => {\n return [\n ...(await pirateFactory.rollRollItems(selectedClass.data.data.startingRolls)),\n ...(await pirateFactory.findItems(selectedClass.data.data.startingItems)),\n ];\n}\n\nconst getStartingBonusItems = async (items) => {\n return [\n ...(await pirateFactory.findStartingBonusItems(items)),\n ...(await pirateFactory.findStartingBonusRollsItems(items)),\n ];\n}\n\nconst getPirateDataWithBaseClass = async (additionalItems = []) => {\n const baseClass = getRandomBaseClass(); \n const pirateData = await pirateFactory.rollScvmForClass(baseClass);\n const items = await getClassItems(selectedClass); \n const bonusItems = await getStartingBonusItems([...items, ...additionalItems]);\n\n pirateData.baseClass = `${baseClass.pack};${baseClass.name}`\n\n pirateData.items = pirateData.items\n .filter((item) => item.data.type !== 'class')\n .concat(items)\n .concat(additionalItems)\n .concat(bonusItems)\n .concat([selectedClass]);\n\n return pirateData;\n}\n\nconst animalDefaultData = {\n startingAbilityScoreFormula: '3d6',\n startingStrengthBonus: -2,\n startingAgilityBonus: -2,\n startingPresenceBonus: -2,\n startingToughnessBonus: -2,\n startingSpiritBonus: -2,\n luckDie: 'd4',\n flavorText: '',\n startingMacro: '',\n}\n\nconst createSentientAnimalData = async (data) => {\n return mergeObject(animalDefaultData, data, { insertKeys: true });\n}\n\nconst getMerfolkData = async (tallTaleItem) => {\n const pirateData = await getPirateDataWithBaseClass();\n pirateData.description = `${tallTaleItem.data.data.flavorText}
${pirateData.description}`\n pirateData.actorImg = tallTaleItem.data.img;\n return pirateData;\n}\n\nconst getAquaticMutantData = async (tallTaleItem) => {\n const aquaticMutantItem = (await pirateFactory.drawTableItem(tallTaleRollPack, aquaticMutantRollPackName))[0];\n const pirateData = await getPirateDataWithBaseClass([aquaticMutantItem]);\n pirateData.description = `${tallTaleItem.data.name} (aquaticMutantItem.data.name)
${pirateData.description}`\n\n if (aquanticMutantItem.data.name === 'Electric Eel') {\n pirateData.agility = parseInt(pirateData.agility, 10) + 1;\n }\n\n return pirateData;\n}\n\nconst getSentientAnimalData = async (tallTaleItem) => {\n const sentientAnimalItem = (await pirateFactory.drawTableItem(tallTaleRollPack, sentientAnimalRollPackName))[0];\n// const sentielAnimalData = await getPirateDataWithBaseClass(sentientAnimalItem);\n let data = {};\n switch (sentientAnimalItem.name) {\n case 'Foul Fowl':\n data = await createSentientAnimalData({\n startingSpiritBonus: +3,\n startingHitPoints: '1d4', \n }); \n break;\n case 'Jaguar':\n data = await createSentientAnimalData({\n startingAgilityBonus: +2,\n startingStrengthBonus: +2,\n startingHitPoints: '1d8', \n });\n break;\n case 'Crocodile':\n data = await createSentientAnimalData({\n startingToughnessBonus: +1,\n startingStrengthBonus: +3,\n startingHitPoints: '1d10', \n });\n break;\n case 'Bilge Rat':\n data = await createSentientAnimalData({\n startingToughnessBonus: +2,\n startingAgilityBonus: +3,\n startingHitPoints: '1d2', \n });\n break;\n case 'Lucky Parrot':\n data = await createSentientAnimalData({\n startingPresenceBonus: +2,\n startingAgilityBonus: +1,\n startingHitPoints: '1d2', \n luckDie: '1d6'\n });\n break;\n case 'Clever Monkey':\n data = await createSentientAnimalData({\n startingPresenceBonus: 0,\n startingAgilityBonus: +2,\n startingStrengthBonus: -1,\n startingHitPoints: '1d6', \n startingWeaponTableFormula: '1d10',\n });\n break; \n }\n \n selectedClass.data.data = data;\n selectedClass.data.img = sentientAnimalItem.data.img;\n selectedClass.data.data.startingRolls = sentientAnimalItem.data.data.startingBonusRolls;\n selectedClass.data.data.startingItems = sentientAnimalItem.data.data.startingBonusItems;\n selectedClass.data.data.flavorText = `${tallTaleItem.data.data.flavorText}`\n\n const pirateData = await pirateFactory.rollScvmForClass(selectedClass);\n\n if(sentientAnimalItem.name === 'Foul Fowl') {\n pirateData.items\n .filter((item) => item.type === 'invokable')\n .forEach((item) => {\n item.data.data.isEquipment = false;\n });\n }\n\n pirateData.items = pirateData.items.concat([sentientAnimalItem]);\n return pirateData;\n}\n\n\n// const tallTaleItem = (await pirateFactory.drawTableItem(tallTaleRollPack, tallTaleRollPackName))[0];\nconst tallTaleItem = await pirateFactory.findCompendiumItem('pirateborg.class-tall-tale', 'Merfolk');\nlet pirateData = {};\n\nswitch (tallTaleItem.name) {\n case 'Merfolk':\n pirateData = await getMerfolkData(tallTaleItem);\n break;\n case 'Aquatic Mutant':\n pirateData = await getAquaticMutantData(tallTaleItem);\n break;\n case 'Sentient Animal':\n pirateData = await getSentientAnimalData(tallTaleItem);\n break;\n}\n\npirateData.items = pirateData.items.concat([tallTaleItem])\n\nconsole.log('Creating New', {\n name: tallTaleItem.data.name,\n tallTaleItem,\n pirateData\n});\n\nif (actor) {\n await pirateFactory.updateActorWithScvm(actor, pirateData);\n} else {\n await pirateFactory.createActorWithScvm(pirateData);\n}","folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Macro.JMLpUPK7oJ10cb4A"}}} +{"_id":"euVqlYfll65zKOew","name":"Character creation","type":"script","author":"pdXclp2r5tiEF79G","img":"icons/svg/dice-target.svg","scope":"global","command":"console.clear();\nconsole.log('Character creation', selectedClass.data.name);\n\nconst pirateFactory = game.pirateborg.pirateFactory;\n\nconst tallTaleRollPack = 'pirateborg.rolls-tall-tale';\nconst tallTaleRollPackName = 'Tall Tale';\nconst aquaticMutantRollPackName = 'Aquatic Mutant';\nconst sentientAnimalRollPackName = 'Sentient Animal';\n\nconst getRandomBaseClass = () => {\n const validBaseClasses = selectedClasses.filter((selectedClass) => !selectedClass.data.data.requireBaseClass);\n return baseClass = validBaseClasses[Math.floor(Math.random() * validBaseClasses.length)];\n}\n\nconst getClassItems = async (selectedClass) => {\n return [\n ...(await pirateFactory.rollRollItems(selectedClass.data.data.startingRolls)),\n ...(await pirateFactory.findItems(selectedClass.data.data.startingItems)),\n ];\n}\n\nconst getStartingBonusItems = async (items) => {\n return [\n ...(await pirateFactory.findStartingBonusItems(items)),\n ...(await pirateFactory.findStartingBonusRollsItems(items)),\n ];\n}\n\nconst getPirateDataWithBaseClass = async (additionalItems = []) => {\n const baseClass = getRandomBaseClass(); \n const pirateData = await pirateFactory.rollScvmForClass(baseClass);\n const items = await getClassItems(selectedClass); \n const bonusItems = await getStartingBonusItems([...items, ...additionalItems]);\n pirateData.baseClass = `${baseClass.pack};${baseClass.name}`\n \n pirateData.items = pirateData.items\n .filter((item) => item.data.type !== 'class')\n .concat(items)\n .concat(additionalItems)\n .concat(bonusItems)\n .concat([selectedClass]);\n\n return pirateData;\n}\n\nconst animalDefaultData = {\n startingAbilityScoreFormula: '3d6',\n startingStrengthBonus: -2,\n startingAgilityBonus: -2,\n startingPresenceBonus: -2,\n startingToughnessBonus: -2,\n startingSpiritBonus: -2,\n luckDie: 'd4',\n flavorText: '',\n startingMacro: '',\n}\n\nconst createSentientAnimalData = async (data) => {\n return mergeObject(animalDefaultData, data, { insertKeys: true });\n}\n\nconst getMerfolkData = async (tallTaleItem) => {\n const pirateData = await getPirateDataWithBaseClass();\n pirateData.description = `${tallTaleItem.data.data.flavorText}
${pirateData.description}`\n pirateData.actorImg = tallTaleItem.data.img;\n\n const baseClass = pirateData.items.find((item) => item.type === 'class')\n baseClass.data.name = `${baseClass.data.name} (${tallTaleItem.data.name})`;\n return pirateData;\n}\n\nconst getAquaticMutantData = async (tallTaleItem) => {\n const aquaticMutantItem = (await pirateFactory.drawTableItem(tallTaleRollPack, aquaticMutantRollPackName))[0];\n const pirateData = await getPirateDataWithBaseClass([aquaticMutantItem]);\n pirateData.description = `${tallTaleItem.data.name} (aquaticMutantItem.data.name)
${pirateData.description}`\n\n if (aquanticMutantItem.data.name === 'Electric Eel') {\n pirateData.agility = parseInt(pirateData.agility, 10) + 1;\n }\n\n return pirateData;\n}\n\nconst getSentientAnimalData = async (tallTaleItem) => {\n const sentientAnimalItem = (await pirateFactory.drawTableItem(tallTaleRollPack, sentientAnimalRollPackName))[0];\n// const sentielAnimalData = await getPirateDataWithBaseClass(sentientAnimalItem);\n let data = {};\n switch (sentientAnimalItem.name) {\n case 'Foul Fowl':\n data = await createSentientAnimalData({\n startingSpiritBonus: +3,\n startingHitPoints: '1d4', \n }); \n break;\n case 'Jaguar':\n data = await createSentientAnimalData({\n startingAgilityBonus: +2,\n startingStrengthBonus: +2,\n startingHitPoints: '1d8', \n });\n break;\n case 'Crocodile':\n data = await createSentientAnimalData({\n startingToughnessBonus: +1,\n startingStrengthBonus: +3,\n startingHitPoints: '1d10', \n });\n break;\n case 'Bilge Rat':\n data = await createSentientAnimalData({\n startingToughnessBonus: +2,\n startingAgilityBonus: +3,\n startingHitPoints: '1d2', \n });\n break;\n case 'Lucky Parrot':\n data = await createSentientAnimalData({\n startingPresenceBonus: +2,\n startingAgilityBonus: +1,\n startingHitPoints: '1d2', \n luckDie: '1d6'\n });\n break;\n case 'Clever Monkey':\n data = await createSentientAnimalData({\n startingPresenceBonus: 0,\n startingAgilityBonus: +2,\n startingStrengthBonus: -1,\n startingHitPoints: '1d6', \n startingWeaponTableFormula: '1d10',\n });\n break; \n }\n \n selectedClass.data.data = data;\n selectedClass.data.img = sentientAnimalItem.data.img;\n selectedClass.data.data.startingRolls = sentientAnimalItem.data.data.startingBonusRolls;\n selectedClass.data.data.startingItems = sentientAnimalItem.data.data.startingBonusItems;\n selectedClass.data.data.flavorText = `${tallTaleItem.data.data.flavorText}`\n\n const pirateData = await pirateFactory.rollScvmForClass(selectedClass);\n\n if(sentientAnimalItem.name === 'Foul Fowl') {\n pirateData.items\n .filter((item) => item.type === 'invokable')\n .forEach((item) => {\n item.data.data.isEquipment = false;\n });\n }\n\n pirateData.items = pirateData.items.concat([sentientAnimalItem]);\n return pirateData;\n}\n\n\n// const tallTaleItem = (await pirateFactory.drawTableItem(tallTaleRollPack, tallTaleRollPackName))[0];\nconst tallTaleItem = await pirateFactory.findCompendiumItem('pirateborg.class-tall-tale', 'Merfolk');\nlet pirateData = {};\n\nswitch (tallTaleItem.name) {\n case 'Merfolk':\n pirateData = await getMerfolkData(tallTaleItem);\n break;\n case 'Aquatic Mutant':\n pirateData = await getAquaticMutantData(tallTaleItem);\n break;\n case 'Sentient Animal':\n pirateData = await getSentientAnimalData(tallTaleItem);\n break;\n}\n\npirateData.items = pirateData.items.concat([tallTaleItem])\n\nconsole.log('Creating New', {\n name: tallTaleItem.data.name,\n tallTaleItem,\n pirateData\n});\n\nif (actor) {\n await pirateFactory.updateActorWithScvm(actor, pirateData);\n} else {\n await pirateFactory.createActorWithScvm(pirateData);\n}","folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Macro.JMLpUPK7oJ10cb4A"}}} +{"_id":"euVqlYfll65zKOew","name":"Character creation","type":"script","author":"pdXclp2r5tiEF79G","img":"icons/svg/dice-target.svg","scope":"global","command":"console.clear();\nconsole.log('Character creation', selectedClass.data.name);\n\nconst pirateFactory = game.pirateborg.pirateFactory;\n\nconst tallTaleRollPack = 'pirateborg.rolls-tall-tale';\nconst tallTaleRollPackName = 'Tall Tale';\nconst aquaticMutantRollPackName = 'Aquatic Mutant';\nconst sentientAnimalRollPackName = 'Sentient Animal';\n\nconst getRandomBaseClass = () => {\n const validBaseClasses = selectedClasses.filter((selectedClass) => !selectedClass.data.data.requireBaseClass);\n return baseClass = validBaseClasses[Math.floor(Math.random() * validBaseClasses.length)];\n}\n\nconst getClassItems = async (selectedClass) => {\n return [\n ...(await pirateFactory.rollRollItems(selectedClass.data.data.startingRolls)),\n ...(await pirateFactory.findItems(selectedClass.data.data.startingItems)),\n ];\n}\n\nconst getStartingBonusItems = async (items) => {\n return [\n ...(await pirateFactory.findStartingBonusItems(items)),\n ...(await pirateFactory.findStartingBonusRollsItems(items)),\n ];\n}\n\nconst getPirateDataWithBaseClass = async (additionalItems = []) => {\n const baseClass = getRandomBaseClass(); \n const pirateData = await pirateFactory.rollScvmForClass(baseClass);\n const items = await getClassItems(selectedClass); \n const bonusItems = await getStartingBonusItems([...items, ...additionalItems]);\n pirateData.baseClass = `${baseClass.pack};${baseClass.name}`\n \n pirateData.items = pirateData.items\n .filter((item) => item.data.type !== 'class')\n .concat(items)\n .concat(additionalItems)\n .concat(bonusItems)\n .concat([selectedClass]);\n\n return pirateData;\n}\n\nconst animalDefaultData = {\n startingAbilityScoreFormula: '3d6',\n startingStrengthBonus: -2,\n startingAgilityBonus: -2,\n startingPresenceBonus: -2,\n startingToughnessBonus: -2,\n startingSpiritBonus: -2,\n luckDie: 'd4',\n flavorText: '',\n startingMacro: '',\n}\n\nconst createSentientAnimalData = async (data) => {\n return mergeObject(animalDefaultData, data, { insertKeys: true });\n}\n\nconst getMerfolkData = async (tallTaleItem) => {\n const pirateData = await getPirateDataWithBaseClass();\n pirateData.description = `${tallTaleItem.data.data.flavorText}
${pirateData.description}`\n pirateData.actorImg = tallTaleItem.data.img;\n\n const baseClass = pirateData.items.find((item) => item.type === 'class')\n baseClass.data.name = `${baseClass.data.name} (${tallTaleItem.data.name})`;\n return pirateData;\n}\n\nconst getAquaticMutantData = async (tallTaleItem) => {\n const aquaticMutantItem = (await pirateFactory.drawTableItem(tallTaleRollPack, aquaticMutantRollPackName))[0];\n const pirateData = await getPirateDataWithBaseClass([aquaticMutantItem]);\n pirateData.description = `${tallTaleItem.data.name} (aquaticMutantItem.data.name)
${pirateData.description}`\n\n if (aquanticMutantItem.data.name === 'Electric Eel') {\n pirateData.agility = parseInt(pirateData.agility, 10) + 1;\n }\n\n return pirateData;\n}\n\nconst getSentientAnimalData = async (tallTaleItem) => {\n const sentientAnimalItem = (await pirateFactory.drawTableItem(tallTaleRollPack, sentientAnimalRollPackName))[0];\n// const sentielAnimalData = await getPirateDataWithBaseClass(sentientAnimalItem);\n let data = {};\n switch (sentientAnimalItem.name) {\n case 'Foul Fowl':\n data = await createSentientAnimalData({\n startingSpiritBonus: +3,\n startingHitPoints: '1d4', \n }); \n break;\n case 'Jaguar':\n data = await createSentientAnimalData({\n startingAgilityBonus: +2,\n startingStrengthBonus: +2,\n startingHitPoints: '1d8', \n });\n break;\n case 'Crocodile':\n data = await createSentientAnimalData({\n startingToughnessBonus: +1,\n startingStrengthBonus: +3,\n startingHitPoints: '1d10', \n });\n break;\n case 'Bilge Rat':\n data = await createSentientAnimalData({\n startingToughnessBonus: +2,\n startingAgilityBonus: +3,\n startingHitPoints: '1d2', \n });\n break;\n case 'Lucky Parrot':\n data = await createSentientAnimalData({\n startingPresenceBonus: +2,\n startingAgilityBonus: +1,\n startingHitPoints: '1d2', \n luckDie: '1d6'\n });\n break;\n case 'Clever Monkey':\n data = await createSentientAnimalData({\n startingPresenceBonus: 0,\n startingAgilityBonus: +2,\n startingStrengthBonus: -1,\n startingHitPoints: '1d6', \n startingWeaponTableFormula: '1d10',\n });\n break; \n }\n \n selectedClass.data.data = data;\n selectedClass.data.img = sentientAnimalItem.data.img;\n selectedClass.data.data.startingRolls = sentientAnimalItem.data.data.startingBonusRolls;\n selectedClass.data.data.startingItems = sentientAnimalItem.data.data.startingBonusItems;\n selectedClass.data.data.flavorText = `${tallTaleItem.data.data.flavorText}`\n\n const pirateData = await pirateFactory.rollScvmForClass(selectedClass);\n\n if(sentientAnimalItem.name === 'Foul Fowl') {\n pirateData.items\n .filter((item) => item.type === 'invokable')\n .forEach((item) => {\n item.data.data.isEquipment = false;\n });\n }\n\n pirateData.items = pirateData.items.concat([sentientAnimalItem]);\n return pirateData;\n}\n\n\n// const tallTaleItem = (await pirateFactory.drawTableItem(tallTaleRollPack, tallTaleRollPackName))[0];\nconst tallTaleItem = await pirateFactory.findCompendiumItem('pirateborg.class-tall-tale', 'Aquatic Mutant');\nlet pirateData = {};\n\nswitch (tallTaleItem.name) {\n case 'Merfolk':\n pirateData = await getMerfolkData(tallTaleItem);\n break;\n case 'Aquatic Mutant':\n pirateData = await getAquaticMutantData(tallTaleItem);\n break;\n case 'Sentient Animal':\n pirateData = await getSentientAnimalData(tallTaleItem);\n break;\n}\n\npirateData.items = pirateData.items.concat([tallTaleItem])\n\nconsole.log('Creating New', {\n name: tallTaleItem.data.name,\n tallTaleItem,\n pirateData\n});\n\nif (actor) {\n await pirateFactory.updateActorWithScvm(actor, pirateData);\n} else {\n await pirateFactory.createActorWithScvm(pirateData);\n}","folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Macro.JMLpUPK7oJ10cb4A"}}} +{"_id":"euVqlYfll65zKOew","name":"Character creation","type":"script","author":"pdXclp2r5tiEF79G","img":"icons/svg/dice-target.svg","scope":"global","command":"console.clear();\nconsole.log('Character creation', selectedClass.data.name);\n\nconst pirateFactory = game.pirateborg.pirateFactory;\n\nconst tallTaleRollPack = 'pirateborg.rolls-tall-tale';\nconst tallTaleRollPackName = 'Tall Tale';\nconst aquaticMutantRollPackName = 'Aquatic Mutant';\nconst sentientAnimalRollPackName = 'Sentient Animal';\n\nconst getRandomBaseClass = () => {\n const validBaseClasses = selectedClasses.filter((selectedClass) => !selectedClass.data.data.requireBaseClass);\n return baseClass = validBaseClasses[Math.floor(Math.random() * validBaseClasses.length)];\n}\n\nconst getClassItems = async (selectedClass) => {\n return [\n ...(await pirateFactory.rollRollItems(selectedClass.data.data.startingRolls)),\n ...(await pirateFactory.findItems(selectedClass.data.data.startingItems)),\n ];\n}\n\nconst getStartingBonusItems = async (items) => {\n return [\n ...(await pirateFactory.findStartingBonusItems(items)),\n ...(await pirateFactory.findStartingBonusRollsItems(items)),\n ];\n}\n\nconst getPirateDataWithBaseClass = async (additionalItems = []) => {\n const baseClass = getRandomBaseClass(); \n const pirateData = await pirateFactory.rollScvmForClass(baseClass);\n const items = await getClassItems(selectedClass); \n const bonusItems = await getStartingBonusItems([...items, ...additionalItems]);\n pirateData.baseClass = `${baseClass.pack};${baseClass.name}`\n \n pirateData.items = pirateData.items\n .filter((item) => item.data.type !== 'class')\n .concat(items)\n .concat(additionalItems)\n .concat(bonusItems)\n .concat([selectedClass]);\n\n return pirateData;\n}\n\nconst animalDefaultData = {\n startingAbilityScoreFormula: '3d6',\n startingStrengthBonus: -2,\n startingAgilityBonus: -2,\n startingPresenceBonus: -2,\n startingToughnessBonus: -2,\n startingSpiritBonus: -2,\n luckDie: 'd4',\n flavorText: '',\n startingMacro: '',\n}\n\nconst createSentientAnimalData = async (data) => {\n return mergeObject(animalDefaultData, data, { insertKeys: true });\n}\n\nconst getMerfolkData = async (tallTaleItem) => {\n const pirateData = await getPirateDataWithBaseClass();\n pirateData.description = `${tallTaleItem.data.data.flavorText}
${pirateData.description}`\n pirateData.actorImg = tallTaleItem.data.img;\n\n const baseClass = pirateData.items.find((item) => item.type === 'class')\n baseClass.data.name = `${baseClass.data.name} (${tallTaleItem.data.name})`;\n return pirateData;\n}\n\nconst getAquaticMutantData = async (tallTaleItem) => {\n const aquaticMutantItem = (await pirateFactory.drawTableItem(tallTaleRollPack, aquaticMutantRollPackName))[0];\n const pirateData = await getPirateDataWithBaseClass([aquaticMutantItem]);\n pirateData.description = `${tallTaleItem.data.name} (aquaticMutantItem.data.name)
${pirateData.description}`\n\n if (aquaticMutantItem.data.name === 'Electric Eel') {\n pirateData.agility = parseInt(pirateData.agility, 10) + 1;\n }\n\n return pirateData;\n}\n\nconst getSentientAnimalData = async (tallTaleItem) => {\n const sentientAnimalItem = (await pirateFactory.drawTableItem(tallTaleRollPack, sentientAnimalRollPackName))[0];\n// const sentielAnimalData = await getPirateDataWithBaseClass(sentientAnimalItem);\n let data = {};\n switch (sentientAnimalItem.name) {\n case 'Foul Fowl':\n data = await createSentientAnimalData({\n startingSpiritBonus: +3,\n startingHitPoints: '1d4', \n }); \n break;\n case 'Jaguar':\n data = await createSentientAnimalData({\n startingAgilityBonus: +2,\n startingStrengthBonus: +2,\n startingHitPoints: '1d8', \n });\n break;\n case 'Crocodile':\n data = await createSentientAnimalData({\n startingToughnessBonus: +1,\n startingStrengthBonus: +3,\n startingHitPoints: '1d10', \n });\n break;\n case 'Bilge Rat':\n data = await createSentientAnimalData({\n startingToughnessBonus: +2,\n startingAgilityBonus: +3,\n startingHitPoints: '1d2', \n });\n break;\n case 'Lucky Parrot':\n data = await createSentientAnimalData({\n startingPresenceBonus: +2,\n startingAgilityBonus: +1,\n startingHitPoints: '1d2', \n luckDie: '1d6'\n });\n break;\n case 'Clever Monkey':\n data = await createSentientAnimalData({\n startingPresenceBonus: 0,\n startingAgilityBonus: +2,\n startingStrengthBonus: -1,\n startingHitPoints: '1d6', \n startingWeaponTableFormula: '1d10',\n });\n break; \n }\n \n selectedClass.data.data = data;\n selectedClass.data.img = sentientAnimalItem.data.img;\n selectedClass.data.data.startingRolls = sentientAnimalItem.data.data.startingBonusRolls;\n selectedClass.data.data.startingItems = sentientAnimalItem.data.data.startingBonusItems;\n selectedClass.data.data.flavorText = `${tallTaleItem.data.data.flavorText}`\n\n const pirateData = await pirateFactory.rollScvmForClass(selectedClass);\n\n if(sentientAnimalItem.name === 'Foul Fowl') {\n pirateData.items\n .filter((item) => item.type === 'invokable')\n .forEach((item) => {\n item.data.data.isEquipment = false;\n });\n }\n\n pirateData.items = pirateData.items.concat([sentientAnimalItem]);\n return pirateData;\n}\n\n\n// const tallTaleItem = (await pirateFactory.drawTableItem(tallTaleRollPack, tallTaleRollPackName))[0];\nconst tallTaleItem = await pirateFactory.findCompendiumItem('pirateborg.class-tall-tale', 'Aquatic Mutant');\nlet pirateData = {};\n\nswitch (tallTaleItem.name) {\n case 'Merfolk':\n pirateData = await getMerfolkData(tallTaleItem);\n break;\n case 'Aquatic Mutant':\n pirateData = await getAquaticMutantData(tallTaleItem);\n break;\n case 'Sentient Animal':\n pirateData = await getSentientAnimalData(tallTaleItem);\n break;\n}\n\npirateData.items = pirateData.items.concat([tallTaleItem])\n\nconsole.log('Creating New', {\n name: tallTaleItem.data.name,\n tallTaleItem,\n pirateData\n});\n\nif (actor) {\n await pirateFactory.updateActorWithScvm(actor, pirateData);\n} else {\n await pirateFactory.createActorWithScvm(pirateData);\n}","folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Macro.JMLpUPK7oJ10cb4A"}}} +{"_id":"euVqlYfll65zKOew","name":"Character creation","type":"script","author":"pdXclp2r5tiEF79G","img":"icons/svg/dice-target.svg","scope":"global","command":"console.clear();\nconsole.log('Character creation', selectedClass.data.name);\n\nconst pirateFactory = game.pirateborg.pirateFactory;\n\nconst tallTaleRollPack = 'pirateborg.rolls-tall-tale';\nconst tallTaleRollPackName = 'Tall Tale';\nconst aquaticMutantRollPackName = 'Aquatic Mutant';\nconst sentientAnimalRollPackName = 'Sentient Animal';\n\nconst getRandomBaseClass = () => {\n const validBaseClasses = selectedClasses.filter((selectedClass) => !selectedClass.data.data.requireBaseClass);\n return baseClass = validBaseClasses[Math.floor(Math.random() * validBaseClasses.length)];\n}\n\nconst getClassItems = async (selectedClass) => {\n return [\n ...(await pirateFactory.rollRollItems(selectedClass.data.data.startingRolls)),\n ...(await pirateFactory.findItems(selectedClass.data.data.startingItems)),\n ];\n}\n\nconst getStartingBonusItems = async (items) => {\n return [\n ...(await pirateFactory.findStartingBonusItems(items)),\n ...(await pirateFactory.findStartingBonusRollsItems(items)),\n ];\n}\n\nconst getPirateDataWithBaseClass = async (additionalItems = []) => {\n const baseClass = getRandomBaseClass(); \n const pirateData = await pirateFactory.rollScvmForClass(baseClass);\n const items = await getClassItems(selectedClass); \n const bonusItems = await getStartingBonusItems([...items, ...additionalItems]);\n pirateData.baseClass = `${baseClass.pack};${baseClass.name}`\n \n pirateData.items = pirateData.items\n .filter((item) => item.data.type !== 'class')\n .concat(items)\n .concat(additionalItems)\n .concat(bonusItems)\n .concat([selectedClass]);\n\n return pirateData;\n}\n\nconst animalDefaultData = {\n startingAbilityScoreFormula: '3d6',\n startingStrengthBonus: -2,\n startingAgilityBonus: -2,\n startingPresenceBonus: -2,\n startingToughnessBonus: -2,\n startingSpiritBonus: -2,\n luckDie: 'd4',\n flavorText: '',\n startingMacro: '',\n}\n\nconst createSentientAnimalData = async (data) => {\n return mergeObject(animalDefaultData, data, { insertKeys: true });\n}\n\nconst getMerfolkData = async (tallTaleItem) => {\n const pirateData = await getPirateDataWithBaseClass();\n pirateData.description = `${tallTaleItem.data.data.flavorText}
${pirateData.description}`\n pirateData.actorImg = tallTaleItem.data.img;\n\n const baseClass = pirateData.items.find((item) => item.type === 'class')\n baseClass.data.name = `${baseClass.data.name} (${tallTaleItem.data.name})`;\n return pirateData;\n}\n\nconst getAquaticMutantData = async (tallTaleItem) => {\n const aquaticMutantItem = (await pirateFactory.drawTableItem(tallTaleRollPack, aquaticMutantRollPackName))[0];\n const pirateData = await getPirateDataWithBaseClass([aquaticMutantItem]);\n pirateData.description = `${tallTaleItem.data.name} (aquaticMutantItem.data.name)
${pirateData.description}`\n\n if (aquaticMutantItem.data.name === 'Electric Eel') {\n pirateData.agility = parseInt(pirateData.agility, 10) + 1;\n }\n\n pirateData.actorImg = tallTaleItem.data.img;\n const baseClass = pirateData.items.find((item) => item.type === 'class')\n baseClass.data.name = `${baseClass.data.name} (${tallTaleItem.data.name})`;\n\n return pirateData;\n}\n\nconst getSentientAnimalData = async (tallTaleItem) => {\n const sentientAnimalItem = (await pirateFactory.drawTableItem(tallTaleRollPack, sentientAnimalRollPackName))[0];\n// const sentielAnimalData = await getPirateDataWithBaseClass(sentientAnimalItem);\n let data = {};\n switch (sentientAnimalItem.name) {\n case 'Foul Fowl':\n data = await createSentientAnimalData({\n startingSpiritBonus: +3,\n startingHitPoints: '1d4', \n }); \n break;\n case 'Jaguar':\n data = await createSentientAnimalData({\n startingAgilityBonus: +2,\n startingStrengthBonus: +2,\n startingHitPoints: '1d8', \n });\n break;\n case 'Crocodile':\n data = await createSentientAnimalData({\n startingToughnessBonus: +1,\n startingStrengthBonus: +3,\n startingHitPoints: '1d10', \n });\n break;\n case 'Bilge Rat':\n data = await createSentientAnimalData({\n startingToughnessBonus: +2,\n startingAgilityBonus: +3,\n startingHitPoints: '1d2', \n });\n break;\n case 'Lucky Parrot':\n data = await createSentientAnimalData({\n startingPresenceBonus: +2,\n startingAgilityBonus: +1,\n startingHitPoints: '1d2', \n luckDie: '1d6'\n });\n break;\n case 'Clever Monkey':\n data = await createSentientAnimalData({\n startingPresenceBonus: 0,\n startingAgilityBonus: +2,\n startingStrengthBonus: -1,\n startingHitPoints: '1d6', \n startingWeaponTableFormula: '1d10',\n });\n break; \n }\n \n selectedClass.data.data = data;\n selectedClass.data.img = sentientAnimalItem.data.img;\n selectedClass.data.data.startingRolls = sentientAnimalItem.data.data.startingBonusRolls;\n selectedClass.data.data.startingItems = sentientAnimalItem.data.data.startingBonusItems;\n selectedClass.data.data.flavorText = `${tallTaleItem.data.data.flavorText}`\n\n const pirateData = await pirateFactory.rollScvmForClass(selectedClass);\n\n if(sentientAnimalItem.name === 'Foul Fowl') {\n pirateData.items\n .filter((item) => item.type === 'invokable')\n .forEach((item) => {\n item.data.data.isEquipment = false;\n });\n }\n\n pirateData.items = pirateData.items.concat([sentientAnimalItem]);\n return pirateData;\n}\n\n\n// const tallTaleItem = (await pirateFactory.drawTableItem(tallTaleRollPack, tallTaleRollPackName))[0];\nconst tallTaleItem = await pirateFactory.findCompendiumItem('pirateborg.class-tall-tale', 'Aquatic Mutant');\nlet pirateData = {};\n\nswitch (tallTaleItem.name) {\n case 'Merfolk':\n pirateData = await getMerfolkData(tallTaleItem);\n break;\n case 'Aquatic Mutant':\n pirateData = await getAquaticMutantData(tallTaleItem);\n break;\n case 'Sentient Animal':\n pirateData = await getSentientAnimalData(tallTaleItem);\n break;\n}\n\npirateData.items = pirateData.items.concat([tallTaleItem])\n\nconsole.log('Creating New', {\n name: tallTaleItem.data.name,\n tallTaleItem,\n pirateData\n});\n\nif (actor) {\n await pirateFactory.updateActorWithScvm(actor, pirateData);\n} else {\n await pirateFactory.createActorWithScvm(pirateData);\n}","folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Macro.JMLpUPK7oJ10cb4A"}}} +{"_id":"euVqlYfll65zKOew","name":"Character creation","type":"script","author":"pdXclp2r5tiEF79G","img":"icons/svg/dice-target.svg","scope":"global","command":"console.clear();\nconsole.log('Character creation', selectedClass.data.name);\n\nconst pirateFactory = game.pirateborg.pirateFactory;\n\nconst tallTaleRollPack = 'pirateborg.rolls-tall-tale';\nconst tallTaleRollPackName = 'Tall Tale';\nconst aquaticMutantRollPackName = 'Aquatic Mutant';\nconst sentientAnimalRollPackName = 'Sentient Animal';\n\nconst getRandomBaseClass = () => {\n const validBaseClasses = selectedClasses.filter((selectedClass) => !selectedClass.data.data.requireBaseClass);\n return baseClass = validBaseClasses[Math.floor(Math.random() * validBaseClasses.length)];\n}\n\nconst getClassItems = async (selectedClass) => {\n return [\n ...(await pirateFactory.rollRollItems(selectedClass.data.data.startingRolls)),\n ...(await pirateFactory.findItems(selectedClass.data.data.startingItems)),\n ];\n}\n\nconst getStartingBonusItems = async (items) => {\n return [\n ...(await pirateFactory.findStartingBonusItems(items)),\n ...(await pirateFactory.findStartingBonusRollsItems(items)),\n ];\n}\n\nconst getPirateDataWithBaseClass = async (additionalItems = []) => {\n const baseClass = getRandomBaseClass(); \n const pirateData = await pirateFactory.rollScvmForClass(baseClass);\n const items = await getClassItems(selectedClass); \n const bonusItems = await getStartingBonusItems([...items, ...additionalItems]);\n pirateData.baseClass = `${baseClass.pack};${baseClass.name}`\n \n pirateData.items = pirateData.items\n .filter((item) => item.data.type !== 'class')\n .concat(items)\n .concat(additionalItems)\n .concat(bonusItems)\n .concat([selectedClass]);\n\n return pirateData;\n}\n\nconst animalDefaultData = {\n startingAbilityScoreFormula: '3d6',\n startingStrengthBonus: -2,\n startingAgilityBonus: -2,\n startingPresenceBonus: -2,\n startingToughnessBonus: -2,\n startingSpiritBonus: -2,\n luckDie: 'd4',\n flavorText: '',\n startingMacro: '',\n}\n\nconst createSentientAnimalData = async (data) => {\n return mergeObject(animalDefaultData, data, { insertKeys: true });\n}\n\nconst getMerfolkData = async (tallTaleItem) => {\n const pirateData = await getPirateDataWithBaseClass();\n pirateData.description = `${tallTaleItem.data.data.flavorText}
${pirateData.description}`\n pirateData.actorImg = tallTaleItem.data.img;\n\n const baseClass = pirateData.items.find((item) => item.type === 'class')\n baseClass.data.name = `${baseClass.data.name} (${tallTaleItem.data.name})`;\n return pirateData;\n}\n\nconst getAquaticMutantData = async (tallTaleItem) => {\n const aquaticMutantItem = (await pirateFactory.drawTableItem(tallTaleRollPack, aquaticMutantRollPackName))[0];\n const pirateData = await getPirateDataWithBaseClass([aquaticMutantItem]);\n pirateData.description = `${tallTaleItem.data.data.flavorText}
(aquaticMutantItem.data.data.flavorText)
${pirateData.description}`\n\n if (aquaticMutantItem.data.name === 'Electric Eel') {\n pirateData.agility = parseInt(pirateData.agility, 10) + 1;\n }\n\n pirateData.actorImg = tallTaleItem.data.img;\n const baseClass = pirateData.items.find((item) => item.type === 'class')\n baseClass.data.name = `${baseClass.data.name} (${tallTaleItem.data.name})`;\n\n return pirateData;\n}\n\nconst getSentientAnimalData = async (tallTaleItem) => {\n const sentientAnimalItem = (await pirateFactory.drawTableItem(tallTaleRollPack, sentientAnimalRollPackName))[0];\n// const sentielAnimalData = await getPirateDataWithBaseClass(sentientAnimalItem);\n let data = {};\n switch (sentientAnimalItem.name) {\n case 'Foul Fowl':\n data = await createSentientAnimalData({\n startingSpiritBonus: +3,\n startingHitPoints: '1d4', \n }); \n break;\n case 'Jaguar':\n data = await createSentientAnimalData({\n startingAgilityBonus: +2,\n startingStrengthBonus: +2,\n startingHitPoints: '1d8', \n });\n break;\n case 'Crocodile':\n data = await createSentientAnimalData({\n startingToughnessBonus: +1,\n startingStrengthBonus: +3,\n startingHitPoints: '1d10', \n });\n break;\n case 'Bilge Rat':\n data = await createSentientAnimalData({\n startingToughnessBonus: +2,\n startingAgilityBonus: +3,\n startingHitPoints: '1d2', \n });\n break;\n case 'Lucky Parrot':\n data = await createSentientAnimalData({\n startingPresenceBonus: +2,\n startingAgilityBonus: +1,\n startingHitPoints: '1d2', \n luckDie: '1d6'\n });\n break;\n case 'Clever Monkey':\n data = await createSentientAnimalData({\n startingPresenceBonus: 0,\n startingAgilityBonus: +2,\n startingStrengthBonus: -1,\n startingHitPoints: '1d6', \n startingWeaponTableFormula: '1d10',\n });\n break; \n }\n \n selectedClass.data.data = data;\n selectedClass.data.img = sentientAnimalItem.data.img;\n selectedClass.data.data.startingRolls = sentientAnimalItem.data.data.startingBonusRolls;\n selectedClass.data.data.startingItems = sentientAnimalItem.data.data.startingBonusItems;\n selectedClass.data.data.flavorText = `${tallTaleItem.data.data.flavorText}`\n\n const pirateData = await pirateFactory.rollScvmForClass(selectedClass);\n\n if(sentientAnimalItem.name === 'Foul Fowl') {\n pirateData.items\n .filter((item) => item.type === 'invokable')\n .forEach((item) => {\n item.data.data.isEquipment = false;\n });\n }\n\n pirateData.items = pirateData.items.concat([sentientAnimalItem]);\n return pirateData;\n}\n\n\n// const tallTaleItem = (await pirateFactory.drawTableItem(tallTaleRollPack, tallTaleRollPackName))[0];\nconst tallTaleItem = await pirateFactory.findCompendiumItem('pirateborg.class-tall-tale', 'Aquatic Mutant');\nlet pirateData = {};\n\nswitch (tallTaleItem.name) {\n case 'Merfolk':\n pirateData = await getMerfolkData(tallTaleItem);\n break;\n case 'Aquatic Mutant':\n pirateData = await getAquaticMutantData(tallTaleItem);\n break;\n case 'Sentient Animal':\n pirateData = await getSentientAnimalData(tallTaleItem);\n break;\n}\n\npirateData.items = pirateData.items.concat([tallTaleItem])\n\nconsole.log('Creating New', {\n name: tallTaleItem.data.name,\n tallTaleItem,\n pirateData\n});\n\nif (actor) {\n await pirateFactory.updateActorWithScvm(actor, pirateData);\n} else {\n await pirateFactory.createActorWithScvm(pirateData);\n}","folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Macro.JMLpUPK7oJ10cb4A"}}} +{"_id":"euVqlYfll65zKOew","name":"Character creation","type":"script","author":"pdXclp2r5tiEF79G","img":"icons/svg/dice-target.svg","scope":"global","command":"console.clear();\nconsole.log('Character creation', selectedClass.data.name);\n\nconst pirateFactory = game.pirateborg.pirateFactory;\n\nconst tallTaleRollPack = 'pirateborg.rolls-tall-tale';\nconst tallTaleRollPackName = 'Tall Tale';\nconst aquaticMutantRollPackName = 'Aquatic Mutant';\nconst sentientAnimalRollPackName = 'Sentient Animal';\n\nconst getRandomBaseClass = () => {\n const validBaseClasses = selectedClasses.filter((selectedClass) => !selectedClass.data.data.requireBaseClass);\n return baseClass = validBaseClasses[Math.floor(Math.random() * validBaseClasses.length)];\n}\n\nconst getClassItems = async (selectedClass) => {\n return [\n ...(await pirateFactory.rollRollItems(selectedClass.data.data.startingRolls)),\n ...(await pirateFactory.findItems(selectedClass.data.data.startingItems)),\n ];\n}\n\nconst getStartingBonusItems = async (items) => {\n return [\n ...(await pirateFactory.findStartingBonusItems(items)),\n ...(await pirateFactory.findStartingBonusRollsItems(items)),\n ];\n}\n\nconst getPirateDataWithBaseClass = async (additionalItems = []) => {\n const baseClass = getRandomBaseClass(); \n const pirateData = await pirateFactory.rollScvmForClass(baseClass);\n const items = await getClassItems(selectedClass); \n const bonusItems = await getStartingBonusItems([...items, ...additionalItems]);\n pirateData.baseClass = `${baseClass.pack};${baseClass.name}`\n \n pirateData.items = pirateData.items\n .filter((item) => item.data.type !== 'class')\n .concat(items)\n .concat(additionalItems)\n .concat(bonusItems)\n .concat([selectedClass]);\n\n return pirateData;\n}\n\nconst animalDefaultData = {\n startingAbilityScoreFormula: '3d6',\n startingStrengthBonus: -2,\n startingAgilityBonus: -2,\n startingPresenceBonus: -2,\n startingToughnessBonus: -2,\n startingSpiritBonus: -2,\n luckDie: 'd4',\n flavorText: '',\n startingMacro: '',\n}\n\nconst createSentientAnimalData = async (data) => {\n return mergeObject(animalDefaultData, data, { insertKeys: true });\n}\n\nconst getMerfolkData = async (tallTaleItem) => {\n const pirateData = await getPirateDataWithBaseClass();\n pirateData.description = `${tallTaleItem.data.data.flavorText}
${pirateData.description}`\n pirateData.actorImg = tallTaleItem.data.img;\n\n const baseClass = pirateData.items.find((item) => item.type === 'class')\n baseClass.data.name = `${baseClass.data.name} (${tallTaleItem.data.name})`;\n return pirateData;\n}\n\nconst getAquaticMutantData = async (tallTaleItem) => {\n const aquaticMutantItem = (await pirateFactory.drawTableItem(tallTaleRollPack, aquaticMutantRollPackName))[0];\n const pirateData = await getPirateDataWithBaseClass([aquaticMutantItem]);\n pirateData.description = `${tallTaleItem.data.data.flavorText}(${aquaticMutantItem.data.name})
${pirateData.description}`\n\n if (aquaticMutantItem.data.name === 'Electric Eel') {\n pirateData.agility = parseInt(pirateData.agility, 10) + 1;\n }\n\n pirateData.actorImg = aquaticMutantItem.data.img;\n const baseClass = pirateData.items.find((item) => item.type === 'class')\n baseClass.data.name = `${baseClass.data.name} (${tallTaleItem.data.name})`;\n\n return pirateData;\n}\n\nconst getSentientAnimalData = async (tallTaleItem) => {\n const sentientAnimalItem = (await pirateFactory.drawTableItem(tallTaleRollPack, sentientAnimalRollPackName))[0];\n// const sentielAnimalData = await getPirateDataWithBaseClass(sentientAnimalItem);\n let data = {};\n switch (sentientAnimalItem.name) {\n case 'Foul Fowl':\n data = await createSentientAnimalData({\n startingSpiritBonus: +3,\n startingHitPoints: '1d4', \n }); \n break;\n case 'Jaguar':\n data = await createSentientAnimalData({\n startingAgilityBonus: +2,\n startingStrengthBonus: +2,\n startingHitPoints: '1d8', \n });\n break;\n case 'Crocodile':\n data = await createSentientAnimalData({\n startingToughnessBonus: +1,\n startingStrengthBonus: +3,\n startingHitPoints: '1d10', \n });\n break;\n case 'Bilge Rat':\n data = await createSentientAnimalData({\n startingToughnessBonus: +2,\n startingAgilityBonus: +3,\n startingHitPoints: '1d2', \n });\n break;\n case 'Lucky Parrot':\n data = await createSentientAnimalData({\n startingPresenceBonus: +2,\n startingAgilityBonus: +1,\n startingHitPoints: '1d2', \n luckDie: '1d6'\n });\n break;\n case 'Clever Monkey':\n data = await createSentientAnimalData({\n startingPresenceBonus: 0,\n startingAgilityBonus: +2,\n startingStrengthBonus: -1,\n startingHitPoints: '1d6', \n startingWeaponTableFormula: '1d10',\n });\n break; \n }\n \n selectedClass.data.data = data;\n selectedClass.data.img = sentientAnimalItem.data.img;\n selectedClass.data.data.startingRolls = sentientAnimalItem.data.data.startingBonusRolls;\n selectedClass.data.data.startingItems = sentientAnimalItem.data.data.startingBonusItems;\n selectedClass.data.data.flavorText = `${tallTaleItem.data.data.flavorText}`\n\n const pirateData = await pirateFactory.rollScvmForClass(selectedClass);\n\n if(sentientAnimalItem.name === 'Foul Fowl') {\n pirateData.items\n .filter((item) => item.type === 'invokable')\n .forEach((item) => {\n item.data.data.isEquipment = false;\n });\n }\n\n pirateData.items = pirateData.items.concat([sentientAnimalItem]);\n return pirateData;\n}\n\n\n// const tallTaleItem = (await pirateFactory.drawTableItem(tallTaleRollPack, tallTaleRollPackName))[0];\nconst tallTaleItem = await pirateFactory.findCompendiumItem('pirateborg.class-tall-tale', 'Aquatic Mutant');\nlet pirateData = {};\n\nswitch (tallTaleItem.name) {\n case 'Merfolk':\n pirateData = await getMerfolkData(tallTaleItem);\n break;\n case 'Aquatic Mutant':\n pirateData = await getAquaticMutantData(tallTaleItem);\n break;\n case 'Sentient Animal':\n pirateData = await getSentientAnimalData(tallTaleItem);\n break;\n}\n\npirateData.items = pirateData.items.concat([tallTaleItem])\n\nconsole.log('Creating New', {\n name: tallTaleItem.data.name,\n tallTaleItem,\n pirateData\n});\n\nif (actor) {\n await pirateFactory.updateActorWithScvm(actor, pirateData);\n} else {\n await pirateFactory.createActorWithScvm(pirateData);\n}","folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Macro.JMLpUPK7oJ10cb4A"}}} +{"_id":"euVqlYfll65zKOew","name":"Character creation","type":"script","author":"pdXclp2r5tiEF79G","img":"icons/svg/dice-target.svg","scope":"global","command":"console.clear();\nconsole.log('Character creation', selectedClass.data.name);\n\nconst pirateFactory = game.pirateborg.pirateFactory;\n\nconst tallTaleRollPack = 'pirateborg.rolls-tall-tale';\nconst tallTaleRollPackName = 'Tall Tale';\nconst aquaticMutantRollPackName = 'Aquatic Mutant';\nconst sentientAnimalRollPackName = 'Sentient Animal';\n\nconst getRandomBaseClass = () => {\n const validBaseClasses = selectedClasses.filter((selectedClass) => !selectedClass.data.data.requireBaseClass);\n return baseClass = validBaseClasses[Math.floor(Math.random() * validBaseClasses.length)];\n}\n\nconst getClassItems = async (selectedClass) => {\n return [\n ...(await pirateFactory.rollRollItems(selectedClass.data.data.startingRolls)),\n ...(await pirateFactory.findItems(selectedClass.data.data.startingItems)),\n ];\n}\n\nconst getStartingBonusItems = async (items) => {\n return [\n ...(await pirateFactory.findStartingBonusItems(items)),\n ...(await pirateFactory.findStartingBonusRollsItems(items)),\n ];\n}\n\nconst getPirateDataWithBaseClass = async (additionalItems = []) => {\n const baseClass = getRandomBaseClass(); \n const pirateData = await pirateFactory.rollScvmForClass(baseClass);\n const items = await getClassItems(selectedClass); \n const bonusItems = await getStartingBonusItems([...items, ...additionalItems]);\n pirateData.baseClass = `${baseClass.pack};${baseClass.name}`\n \n pirateData.items = pirateData.items\n .filter((item) => item.data.type !== 'class')\n .concat(items)\n .concat(additionalItems)\n .concat(bonusItems)\n .concat([selectedClass]);\n\n return pirateData;\n}\n\nconst animalDefaultData = {\n startingAbilityScoreFormula: '3d6',\n startingStrengthBonus: -2,\n startingAgilityBonus: -2,\n startingPresenceBonus: -2,\n startingToughnessBonus: -2,\n startingSpiritBonus: -2,\n luckDie: 'd4',\n flavorText: '',\n startingMacro: '',\n}\n\nconst createSentientAnimalData = async (data) => {\n return mergeObject(animalDefaultData, data, { insertKeys: true });\n}\n\nconst getMerfolkData = async (tallTaleItem) => {\n const pirateData = await getPirateDataWithBaseClass();\n pirateData.description = `${tallTaleItem.data.data.flavorText}
${pirateData.description}`\n pirateData.actorImg = tallTaleItem.data.img;\n\n const baseClass = pirateData.items.find((item) => item.type === 'class')\n baseClass.data.name = `${baseClass.data.name} (${tallTaleItem.data.name})`;\n return pirateData;\n}\n\nconst getAquaticMutantData = async (tallTaleItem) => {\n const aquaticMutantItem = (await pirateFactory.drawTableItem(tallTaleRollPack, aquaticMutantRollPackName))[0];\n const pirateData = await getPirateDataWithBaseClass([aquaticMutantItem]);\n pirateData.description = `${tallTaleItem.data.data.flavorText} (${aquaticMutantItem.data.name})
${pirateData.description}`\n\n if (aquaticMutantItem.data.name === 'Electric Eel') {\n pirateData.agility = parseInt(pirateData.agility, 10) + 1;\n }\n\n pirateData.actorImg = aquaticMutantItem.data.img;\n const baseClass = pirateData.items.find((item) => item.type === 'class')\n baseClass.data.name = `${baseClass.data.name} (${tallTaleItem.data.name})`;\n\n return pirateData;\n}\n\nconst getSentientAnimalData = async (tallTaleItem) => {\n const sentientAnimalItem = (await pirateFactory.drawTableItem(tallTaleRollPack, sentientAnimalRollPackName))[0];\n// const sentielAnimalData = await getPirateDataWithBaseClass(sentientAnimalItem);\n let data = {};\n switch (sentientAnimalItem.name) {\n case 'Foul Fowl':\n data = await createSentientAnimalData({\n startingSpiritBonus: +3,\n startingHitPoints: '1d4', \n }); \n break;\n case 'Jaguar':\n data = await createSentientAnimalData({\n startingAgilityBonus: +2,\n startingStrengthBonus: +2,\n startingHitPoints: '1d8', \n });\n break;\n case 'Crocodile':\n data = await createSentientAnimalData({\n startingToughnessBonus: +1,\n startingStrengthBonus: +3,\n startingHitPoints: '1d10', \n });\n break;\n case 'Bilge Rat':\n data = await createSentientAnimalData({\n startingToughnessBonus: +2,\n startingAgilityBonus: +3,\n startingHitPoints: '1d2', \n });\n break;\n case 'Lucky Parrot':\n data = await createSentientAnimalData({\n startingPresenceBonus: +2,\n startingAgilityBonus: +1,\n startingHitPoints: '1d2', \n luckDie: '1d6'\n });\n break;\n case 'Clever Monkey':\n data = await createSentientAnimalData({\n startingPresenceBonus: 0,\n startingAgilityBonus: +2,\n startingStrengthBonus: -1,\n startingHitPoints: '1d6', \n startingWeaponTableFormula: '1d10',\n });\n break; \n }\n \n selectedClass.data.data = data;\n selectedClass.data.img = sentientAnimalItem.data.img;\n selectedClass.data.data.startingRolls = sentientAnimalItem.data.data.startingBonusRolls;\n selectedClass.data.data.startingItems = sentientAnimalItem.data.data.startingBonusItems;\n selectedClass.data.data.flavorText = `${tallTaleItem.data.data.flavorText}`\n\n const pirateData = await pirateFactory.rollScvmForClass(selectedClass);\n\n if(sentientAnimalItem.name === 'Foul Fowl') {\n pirateData.items\n .filter((item) => item.type === 'invokable')\n .forEach((item) => {\n item.data.data.isEquipment = false;\n });\n }\n\n pirateData.items = pirateData.items.concat([sentientAnimalItem]);\n return pirateData;\n}\n\n\n// const tallTaleItem = (await pirateFactory.drawTableItem(tallTaleRollPack, tallTaleRollPackName))[0];\nconst tallTaleItem = await pirateFactory.findCompendiumItem('pirateborg.class-tall-tale', 'Aquatic Mutant');\nlet pirateData = {};\n\nswitch (tallTaleItem.name) {\n case 'Merfolk':\n pirateData = await getMerfolkData(tallTaleItem);\n break;\n case 'Aquatic Mutant':\n pirateData = await getAquaticMutantData(tallTaleItem);\n break;\n case 'Sentient Animal':\n pirateData = await getSentientAnimalData(tallTaleItem);\n break;\n}\n\npirateData.items = pirateData.items.concat([tallTaleItem])\n\nconsole.log('Creating New', {\n name: tallTaleItem.data.name,\n tallTaleItem,\n pirateData\n});\n\nif (actor) {\n await pirateFactory.updateActorWithScvm(actor, pirateData);\n} else {\n await pirateFactory.createActorWithScvm(pirateData);\n}","folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Macro.JMLpUPK7oJ10cb4A"}}} +{"_id":"euVqlYfll65zKOew","name":"Character creation","type":"script","author":"pdXclp2r5tiEF79G","img":"icons/svg/dice-target.svg","scope":"global","command":"console.clear();\nconsole.log('Character creation', selectedClass.data.name);\n\nconst pirateFactory = game.pirateborg.pirateFactory;\n\nconst tallTaleRollPack = 'pirateborg.rolls-tall-tale';\nconst tallTaleRollPackName = 'Tall Tale';\nconst aquaticMutantRollPackName = 'Aquatic Mutant';\nconst sentientAnimalRollPackName = 'Sentient Animal';\n\nconst getRandomBaseClass = () => {\n const validBaseClasses = selectedClasses.filter((selectedClass) => !selectedClass.data.data.requireBaseClass);\n return baseClass = validBaseClasses[Math.floor(Math.random() * validBaseClasses.length)];\n}\n\nconst getClassItems = async (selectedClass) => {\n return [\n ...(await pirateFactory.rollRollItems(selectedClass.data.data.startingRolls)),\n ...(await pirateFactory.findItems(selectedClass.data.data.startingItems)),\n ];\n}\n\nconst getStartingBonusItems = async (items) => {\n return [\n ...(await pirateFactory.findStartingBonusItems(items)),\n ...(await pirateFactory.findStartingBonusRollsItems(items)),\n ];\n}\n\nconst getPirateDataWithBaseClass = async (additionalItems = []) => {\n const baseClass = getRandomBaseClass(); \n const pirateData = await pirateFactory.rollScvmForClass(baseClass);\n const items = await getClassItems(selectedClass); \n const bonusItems = await getStartingBonusItems([...items, ...additionalItems]);\n pirateData.baseClass = `${baseClass.pack};${baseClass.name}`\n \n pirateData.items = pirateData.items\n .filter((item) => item.data.type !== 'class')\n .concat(items)\n .concat(additionalItems)\n .concat(bonusItems)\n .concat([selectedClass]);\n\n return pirateData;\n}\n\nconst animalDefaultData = {\n startingAbilityScoreFormula: '3d6',\n startingStrengthBonus: -2,\n startingAgilityBonus: -2,\n startingPresenceBonus: -2,\n startingToughnessBonus: -2,\n startingSpiritBonus: -2,\n luckDie: 'd4',\n flavorText: '',\n startingMacro: '',\n}\n\nconst createSentientAnimalData = async (data) => {\n return mergeObject(animalDefaultData, data, { insertKeys: true });\n}\n\nconst getMerfolkData = async (tallTaleItem) => {\n const pirateData = await getPirateDataWithBaseClass();\n pirateData.description = `${tallTaleItem.data.data.flavorText}
${pirateData.description}`\n pirateData.actorImg = tallTaleItem.data.img;\n\n const baseClass = pirateData.items.find((item) => item.type === 'class')\n baseClass.data.name = `${baseClass.data.name} (${tallTaleItem.data.name})`;\n return pirateData;\n}\n\nconst getAquaticMutantData = async (tallTaleItem) => {\n const aquaticMutantItem = (await pirateFactory.drawTableItem(tallTaleRollPack, aquaticMutantRollPackName))[0];\n const pirateData = await getPirateDataWithBaseClass([aquaticMutantItem]);\n pirateData.description = `${tallTaleItem.data.data.flavorText} (${aquaticMutantItem.data.name})
${pirateData.description}`\n\n if (aquaticMutantItem.data.name === 'Electric Eel') {\n pirateData.agility = parseInt(pirateData.agility, 10) + 1;\n }\n\n pirateData.actorImg = aquaticMutantItem.data.img;\n const baseClass = pirateData.items.find((item) => item.type === 'class')\n baseClass.data.name = `${baseClass.data.name} (${tallTaleItem.data.name})`;\n\n\n if(aquaticMutantItem.name === 'The Great Old One') {\n pirateData.items\n .filter((item) => item.type === 'invokable')\n .forEach((item) => {\n item.data.data.isEquipment = false;\n });\n }\n\n return pirateData;\n}\n\nconst getSentientAnimalData = async (tallTaleItem) => {\n const sentientAnimalItem = (await pirateFactory.drawTableItem(tallTaleRollPack, sentientAnimalRollPackName))[0];\n// const sentielAnimalData = await getPirateDataWithBaseClass(sentientAnimalItem);\n let data = {};\n switch (sentientAnimalItem.name) {\n case 'Foul Fowl':\n data = await createSentientAnimalData({\n startingSpiritBonus: +3,\n startingHitPoints: '1d4', \n }); \n break;\n case 'Jaguar':\n data = await createSentientAnimalData({\n startingAgilityBonus: +2,\n startingStrengthBonus: +2,\n startingHitPoints: '1d8', \n });\n break;\n case 'Crocodile':\n data = await createSentientAnimalData({\n startingToughnessBonus: +1,\n startingStrengthBonus: +3,\n startingHitPoints: '1d10', \n });\n break;\n case 'Bilge Rat':\n data = await createSentientAnimalData({\n startingToughnessBonus: +2,\n startingAgilityBonus: +3,\n startingHitPoints: '1d2', \n });\n break;\n case 'Lucky Parrot':\n data = await createSentientAnimalData({\n startingPresenceBonus: +2,\n startingAgilityBonus: +1,\n startingHitPoints: '1d2', \n luckDie: '1d6'\n });\n break;\n case 'Clever Monkey':\n data = await createSentientAnimalData({\n startingPresenceBonus: 0,\n startingAgilityBonus: +2,\n startingStrengthBonus: -1,\n startingHitPoints: '1d6', \n startingWeaponTableFormula: '1d10',\n });\n break; \n }\n \n selectedClass.data.data = data;\n selectedClass.data.img = sentientAnimalItem.data.img;\n selectedClass.data.data.startingRolls = sentientAnimalItem.data.data.startingBonusRolls;\n selectedClass.data.data.startingItems = sentientAnimalItem.data.data.startingBonusItems;\n selectedClass.data.data.flavorText = `${tallTaleItem.data.data.flavorText}`\n\n const pirateData = await pirateFactory.rollScvmForClass(selectedClass);\n\n if(sentientAnimalItem.name === 'Foul Fowl') {\n pirateData.items\n .filter((item) => item.type === 'invokable')\n .forEach((item) => {\n item.data.data.isEquipment = false;\n });\n }\n\n pirateData.items = pirateData.items.concat([sentientAnimalItem]);\n return pirateData;\n}\n\n\n// const tallTaleItem = (await pirateFactory.drawTableItem(tallTaleRollPack, tallTaleRollPackName))[0];\nconst tallTaleItem = await pirateFactory.findCompendiumItem('pirateborg.class-tall-tale', 'Aquatic Mutant');\nlet pirateData = {};\n\nswitch (tallTaleItem.name) {\n case 'Merfolk':\n pirateData = await getMerfolkData(tallTaleItem);\n break;\n case 'Aquatic Mutant':\n pirateData = await getAquaticMutantData(tallTaleItem);\n break;\n case 'Sentient Animal':\n pirateData = await getSentientAnimalData(tallTaleItem);\n break;\n}\n\npirateData.items = pirateData.items.concat([tallTaleItem])\n\nconsole.log('Creating New', {\n name: tallTaleItem.data.name,\n tallTaleItem,\n pirateData\n});\n\nif (actor) {\n await pirateFactory.updateActorWithScvm(actor, pirateData);\n} else {\n await pirateFactory.createActorWithScvm(pirateData);\n}","folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Macro.JMLpUPK7oJ10cb4A"}}} +{"_id":"euVqlYfll65zKOew","name":"Character creation","type":"script","author":"pdXclp2r5tiEF79G","img":"icons/svg/dice-target.svg","scope":"global","command":"const pirateFactory = game.pirateborg.pirateFactory;\n\nconst tallTaleRollPack = 'pirateborg.rolls-tall-tale';\nconst tallTaleRollPackName = 'Tall Tale';\nconst aquaticMutantRollPackName = 'Aquatic Mutant';\nconst sentientAnimalRollPackName = 'Sentient Animal';\n\nconst getRandomBaseClass = () => {\n const validBaseClasses = selectedClasses.filter((selectedClass) => !selectedClass.data.data.requireBaseClass);\n return baseClass = validBaseClasses[Math.floor(Math.random() * validBaseClasses.length)];\n}\n\nconst getClassItems = async (selectedClass) => {\n return [\n ...(await pirateFactory.rollRollItems(selectedClass.data.data.startingRolls)),\n ...(await pirateFactory.findItems(selectedClass.data.data.startingItems)),\n ];\n}\n\nconst getStartingBonusItems = async (items) => {\n return [\n ...(await pirateFactory.findStartingBonusItems(items)),\n ...(await pirateFactory.findStartingBonusRollsItems(items)),\n ];\n}\n\nconst getPirateDataWithBaseClass = async (additionalItems = []) => {\n const baseClass = getRandomBaseClass(); \n const pirateData = await pirateFactory.rollScvmForClass(baseClass);\n const items = await getClassItems(selectedClass); \n const bonusItems = await getStartingBonusItems([...items, ...additionalItems]);\n pirateData.baseClass = `${baseClass.pack};${baseClass.name}`\n \n pirateData.items = pirateData.items\n .filter((item) => item.data.type !== 'class')\n .concat(items)\n .concat(additionalItems)\n .concat(bonusItems)\n .concat([selectedClass]);\n\n return pirateData;\n}\n\nconst animalDefaultData = {\n startingAbilityScoreFormula: '3d6',\n startingStrengthBonus: -2,\n startingAgilityBonus: -2,\n startingPresenceBonus: -2,\n startingToughnessBonus: -2,\n startingSpiritBonus: -2,\n luckDie: 'd4',\n flavorText: '',\n startingMacro: '',\n}\n\nconst createSentientAnimalData = async (data) => {\n return mergeObject(animalDefaultData, data, { insertKeys: true });\n}\n\nconst getMerfolkData = async (tallTaleItem) => {\n const pirateData = await getPirateDataWithBaseClass();\n pirateData.description = `${tallTaleItem.data.data.flavorText}
${pirateData.description}`\n pirateData.actorImg = tallTaleItem.data.img;\n\n const baseClass = pirateData.items.find((item) => item.type === 'class')\n baseClass.data.name = `${baseClass.data.name} (${tallTaleItem.data.name})`;\n return pirateData;\n}\n\nconst getAquaticMutantData = async (tallTaleItem) => {\n const aquaticMutantItem = (await pirateFactory.drawTableItem(tallTaleRollPack, aquaticMutantRollPackName))[0];\n const pirateData = await getPirateDataWithBaseClass([aquaticMutantItem]);\n pirateData.description = `${tallTaleItem.data.data.flavorText} (${aquaticMutantItem.data.name})
${pirateData.description}`\n\n if (aquaticMutantItem.data.name === 'Electric Eel') {\n pirateData.agility = parseInt(pirateData.agility, 10) + 1;\n }\n\n pirateData.actorImg = aquaticMutantItem.data.img;\n const baseClass = pirateData.items.find((item) => item.type === 'class')\n baseClass.data.name = `${baseClass.data.name} (${tallTaleItem.data.name})`;\n\n if(aquaticMutantItem.name === 'The Great Old One') {\n pirateData.items\n .filter((item) => item.type === 'invokable')\n .forEach((item) => {\n item.data.data.isEquipment = false;\n });\n }\n\n return pirateData;\n}\n\nconst getSentientAnimalData = async (tallTaleItem) => {\n const sentientAnimalItem = (await pirateFactory.drawTableItem(tallTaleRollPack, sentientAnimalRollPackName))[0];\n let data = {};\n switch (sentientAnimalItem.name) {\n case 'Foul Fowl':\n data = await createSentientAnimalData({\n startingSpiritBonus: +3,\n startingHitPoints: '1d4', \n }); \n break;\n case 'Jaguar':\n data = await createSentientAnimalData({\n startingAgilityBonus: +2,\n startingStrengthBonus: +2,\n startingHitPoints: '1d8', \n });\n break;\n case 'Crocodile':\n data = await createSentientAnimalData({\n startingToughnessBonus: +1,\n startingStrengthBonus: +3,\n startingHitPoints: '1d10', \n });\n break;\n case 'Bilge Rat':\n data = await createSentientAnimalData({\n startingToughnessBonus: +2,\n startingAgilityBonus: +3,\n startingHitPoints: '1d2', \n });\n break;\n case 'Lucky Parrot':\n data = await createSentientAnimalData({\n startingPresenceBonus: +2,\n startingAgilityBonus: +1,\n startingHitPoints: '1d2', \n luckDie: '1d6'\n });\n break;\n case 'Clever Monkey':\n data = await createSentientAnimalData({\n startingPresenceBonus: 0,\n startingAgilityBonus: +2,\n startingStrengthBonus: -1,\n startingHitPoints: '1d6', \n startingWeaponTableFormula: '1d10',\n });\n break; \n }\n \n selectedClass.data.data = data;\n selectedClass.data.img = sentientAnimalItem.data.img;\n selectedClass.data.data.startingRolls = sentientAnimalItem.data.data.startingBonusRolls;\n selectedClass.data.data.startingItems = sentientAnimalItem.data.data.startingBonusItems;\n selectedClass.data.data.flavorText = `${tallTaleItem.data.data.flavorText}`\n\n const pirateData = await pirateFactory.rollScvmForClass(selectedClass);\n\n if(sentientAnimalItem.name === 'Foul Fowl') {\n pirateData.items\n .filter((item) => item.type === 'invokable')\n .forEach((item) => {\n item.data.data.isEquipment = false;\n });\n }\n\n pirateData.items = pirateData.items.concat([sentientAnimalItem]);\n return pirateData;\n}\n\n\nconst tallTaleItem = (await pirateFactory.drawTableItem(tallTaleRollPack, tallTaleRollPackName))[0];\nlet pirateData = {};\n\nswitch (tallTaleItem.name) {\n case 'Merfolk':\n pirateData = await getMerfolkData(tallTaleItem);\n break;\n case 'Aquatic Mutant':\n pirateData = await getAquaticMutantData(tallTaleItem);\n break;\n case 'Sentient Animal':\n pirateData = await getSentientAnimalData(tallTaleItem);\n break;\n}\n\npirateData.items = pirateData.items.concat([tallTaleItem])\n\nif (actor) {\n await pirateFactory.updateActorWithScvm(actor, pirateData);\n} else {\n await pirateFactory.createActorWithScvm(pirateData);\n}","folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Macro.JMLpUPK7oJ10cb4A"}}} +{"_id":"euVqlYfll65zKOew","name":"Character creation","type":"script","author":"pdXclp2r5tiEF79G","img":"icons/svg/dice-target.svg","scope":"global","command":"const pirateFactory = game.pirateborg.pirateFactory;\n\nconst tallTaleRollPack = 'pirateborg.rolls-tall-tale';\nconst tallTaleRollPackName = 'Tall Tale';\nconst aquaticMutantRollPackName = 'Aquatic Mutant';\nconst sentientAnimalRollPackName = 'Sentient Animal';\n\nconst getRandomBaseClass = () => {\n const validBaseClasses = selectedClasses.filter((selectedClass) => !selectedClass.data.data.requireBaseClass);\n return baseClass = validBaseClasses[Math.floor(Math.random() * validBaseClasses.length)];\n}\n\nconst getClassItems = async (selectedClass) => {\n return [\n ...(await pirateFactory.rollRollItems(selectedClass.data.data.startingRolls)),\n ...(await pirateFactory.findItems(selectedClass.data.data.startingItems)),\n ];\n}\n\nconst getStartingBonusItems = async (items) => {\n return [\n ...(await pirateFactory.findStartingBonusItems(items)),\n ...(await pirateFactory.findStartingBonusRollsItems(items)),\n ];\n}\n\nconst getPirateDataWithBaseClass = async (additionalItems = []) => {\n const baseClass = getRandomBaseClass(); \n const pirateData = await pirateFactory.rollScvmForClass(baseClass);\n const items = await getClassItems(selectedClass); \n const bonusItems = await getStartingBonusItems([...items, ...additionalItems]);\n pirateData.baseClass = `${baseClass.pack};${baseClass.name}`\n \n pirateData.items = pirateData.items\n .filter((item) => item.data.type !== 'class')\n .concat(items)\n .concat(additionalItems)\n .concat(bonusItems)\n .concat([selectedClass]);\n\n return pirateData;\n}\n\nconst animalDefaultData = {\n startingAbilityScoreFormula: '3d6',\n startingStrengthBonus: -2,\n startingAgilityBonus: -2,\n startingPresenceBonus: -2,\n startingToughnessBonus: -2,\n startingSpiritBonus: -2,\n luckDie: 'd4',\n flavorText: '',\n startingMacro: '',\n}\n\nconst createSentientAnimalData = async (data) => {\n return mergeObject(animalDefaultData, data, { insertKeys: true });\n}\n\nconst getMerfolkData = async (tallTaleItem) => {\n const pirateData = await getPirateDataWithBaseClass();\n pirateData.description = `${tallTaleItem.data.data.flavorText}
${pirateData.description}`\n pirateData.actorImg = tallTaleItem.data.img;\n\n const baseClass = pirateData.items.find((item) => item.type === 'class')\n baseClass.data.name = `${baseClass.data.name} (${tallTaleItem.data.name})`;\n return pirateData;\n}\n\nconst getAquaticMutantData = async (tallTaleItem) => {\n const aquaticMutantItem = (await pirateFactory.drawTableItem(tallTaleRollPack, aquaticMutantRollPackName))[0];\n const pirateData = await getPirateDataWithBaseClass([aquaticMutantItem]);\n pirateData.description = `${tallTaleItem.data.data.flavorText} (${aquaticMutantItem.data.name})
${pirateData.description}`\n\n if (aquaticMutantItem.data.name === 'Electric Eel') {\n pirateData.agility = parseInt(pirateData.agility, 10) + 1;\n }\n\n pirateData.actorImg = aquaticMutantItem.data.img;\n const baseClass = pirateData.items.find((item) => item.type === 'class')\n baseClass.data.name = `${baseClass.data.name} (${tallTaleItem.data.name})`;\n\n if(aquaticMutantItem.name === 'The Great Old One') {\n pirateData.items\n .filter((item) => item.type === 'invokable')\n .forEach((item) => {\n item.data.data.isEquipment = false;\n });\n }\n\n return pirateData;\n}\n\nconst getSentientAnimalData = async (tallTaleItem) => {\n const sentientAnimalItem = (await pirateFactory.drawTableItem(tallTaleRollPack, sentientAnimalRollPackName))[0];\n let data = {};\n switch (sentientAnimalItem.name) {\n case 'Foul Fowl':\n data = await createSentientAnimalData({\n startingSpiritBonus: +3,\n startingHitPoints: '1d4', \n }); \n break;\n case 'Jaguar':\n data = await createSentientAnimalData({\n startingAgilityBonus: +2,\n startingStrengthBonus: +2,\n startingHitPoints: '1d8', \n });\n break;\n case 'Crocodile':\n data = await createSentientAnimalData({\n startingToughnessBonus: +1,\n startingStrengthBonus: +3,\n startingHitPoints: '1d10', \n });\n break;\n case 'Bilge Rat':\n data = await createSentientAnimalData({\n startingToughnessBonus: +2,\n startingAgilityBonus: +3,\n startingHitPoints: '1d2', \n });\n break;\n case 'Lucky Parrot':\n data = await createSentientAnimalData({\n startingPresenceBonus: +2,\n startingAgilityBonus: +1,\n startingHitPoints: '1d2', \n luckDie: '1d6'\n });\n break;\n case 'Clever Monkey':\n data = await createSentientAnimalData({\n startingPresenceBonus: 0,\n startingAgilityBonus: +2,\n startingStrengthBonus: -1,\n startingHitPoints: '1d6', \n startingWeaponTableFormula: '1d10',\n });\n break; \n }\n \n selectedClass.data.data = data;\n selectedClass.data.img = sentientAnimalItem.data.img;\n selectedClass.data.data.startingRolls = sentientAnimalItem.data.data.startingBonusRolls;\n selectedClass.data.data.startingItems = sentientAnimalItem.data.data.startingBonusItems;\n selectedClass.data.data.flavorText = `${tallTaleItem.data.data.flavorText}`\n\n const pirateData = await pirateFactory.rollScvmForClass(selectedClass);\n\n if(sentientAnimalItem.name === 'Foul Fowl') {\n pirateData.items\n .filter((item) => item.type === 'invokable')\n .forEach((item) => {\n item.data.data.isEquipment = false;\n });\n }\n\n pirateData.items = pirateData.items.concat([sentientAnimalItem]);\n return pirateData;\n}\n\n\n// const tallTaleItem = (await pirateFactory.drawTableItem(tallTaleRollPack, tallTaleRollPackName))[0];\nconst tallTaleItem = (await pirateFactory.rollTable(tallTaleRollPack, tallTaleRollPackName, '1d1 + 2'))[0];\nlet pirateData = {};\n\nswitch (tallTaleItem.name) {\n case 'Merfolk':\n pirateData = await getMerfolkData(tallTaleItem);\n break;\n case 'Aquatic Mutant':\n pirateData = await getAquaticMutantData(tallTaleItem);\n break;\n case 'Sentient Animal':\n pirateData = await getSentientAnimalData(tallTaleItem);\n break;\n}\n\npirateData.items = pirateData.items.concat([tallTaleItem])\n\nif (actor) {\n await pirateFactory.updateActorWithScvm(actor, pirateData);\n} else {\n await pirateFactory.createActorWithScvm(pirateData);\n}","folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Macro.JMLpUPK7oJ10cb4A"}}} +{"_id":"euVqlYfll65zKOew","name":"Character creation","type":"script","author":"pdXclp2r5tiEF79G","img":"icons/svg/dice-target.svg","scope":"global","command":"const pirateFactory = game.pirateborg.pirateFactory;\n\nconst tallTaleRollPack = 'pirateborg.rolls-tall-tale';\nconst tallTaleRollPackName = 'Tall Tale';\nconst aquaticMutantRollPackName = 'Aquatic Mutant';\nconst sentientAnimalRollPackName = 'Sentient Animal';\n\nconst getRandomBaseClass = () => {\n const validBaseClasses = selectedClasses.filter((selectedClass) => !selectedClass.data.data.requireBaseClass);\n return baseClass = validBaseClasses[Math.floor(Math.random() * validBaseClasses.length)];\n}\n\nconst getClassItems = async (selectedClass) => {\n return [\n ...(await pirateFactory.rollRollItems(selectedClass.data.data.startingRolls)),\n ...(await pirateFactory.findItems(selectedClass.data.data.startingItems)),\n ];\n}\n\nconst getStartingBonusItems = async (items) => {\n return [\n ...(await pirateFactory.findStartingBonusItems(items)),\n ...(await pirateFactory.findStartingBonusRollsItems(items)),\n ];\n}\n\nconst getPirateDataWithBaseClass = async (additionalItems = []) => {\n const baseClass = getRandomBaseClass(); \n const pirateData = await pirateFactory.rollScvmForClass(baseClass);\n const items = await getClassItems(selectedClass); \n const bonusItems = await getStartingBonusItems([...items, ...additionalItems]);\n pirateData.baseClass = `${baseClass.pack};${baseClass.name}`\n \n pirateData.items = pirateData.items\n .filter((item) => item.data.type !== 'class')\n .concat(items)\n .concat(additionalItems)\n .concat(bonusItems)\n .concat([selectedClass]);\n\n return pirateData;\n}\n\nconst animalDefaultData = {\n startingAbilityScoreFormula: '3d6',\n startingStrengthBonus: -2,\n startingAgilityBonus: -2,\n startingPresenceBonus: -2,\n startingToughnessBonus: -2,\n startingSpiritBonus: -2,\n luckDie: 'd4',\n flavorText: '',\n startingMacro: '',\n}\n\nconst createSentientAnimalData = async (data) => {\n return mergeObject(animalDefaultData, data, { insertKeys: true });\n}\n\nconst getMerfolkData = async (tallTaleItem) => {\n const pirateData = await getPirateDataWithBaseClass();\n pirateData.description = `${tallTaleItem.data.data.flavorText}
${pirateData.description}`\n pirateData.actorImg = tallTaleItem.data.img;\n\n const baseClass = pirateData.items.find((item) => item.type === 'class')\n baseClass.data.name = `${baseClass.data.name} (${tallTaleItem.data.name})`;\n return pirateData;\n}\n\nconst getAquaticMutantData = async (tallTaleItem) => {\n const aquaticMutantItem = (await pirateFactory.drawTableItem(tallTaleRollPack, aquaticMutantRollPackName))[0];\n const pirateData = await getPirateDataWithBaseClass([aquaticMutantItem]);\n pirateData.description = `${tallTaleItem.data.data.flavorText} (${aquaticMutantItem.data.name})
${pirateData.description}`\n\n if (aquaticMutantItem.data.name === 'Electric Eel') {\n pirateData.agility = parseInt(pirateData.agility, 10) + 1;\n }\n\n pirateData.actorImg = aquaticMutantItem.data.img;\n const baseClass = pirateData.items.find((item) => item.type === 'class')\n baseClass.data.name = `${baseClass.data.name} (${tallTaleItem.data.name})`;\n\n if(aquaticMutantItem.name === 'The Great Old One') {\n pirateData.items\n .filter((item) => item.type === 'invokable')\n .forEach((item) => {\n item.data.data.isEquipment = false;\n });\n }\n\n return pirateData;\n}\n\nconst getSentientAnimalData = async (tallTaleItem) => {\n const sentientAnimalItem = (await pirateFactory.drawTableItem(tallTaleRollPack, sentientAnimalRollPackName))[0];\n let data = {};\n switch (sentientAnimalItem.name) {\n case 'Foul Fowl':\n data = await createSentientAnimalData({\n startingSpiritBonus: +3,\n startingHitPoints: '1d4', \n }); \n break;\n case 'Jaguar':\n data = await createSentientAnimalData({\n startingAgilityBonus: +2,\n startingStrengthBonus: +2,\n startingHitPoints: '1d8', \n });\n break;\n case 'Crocodile':\n data = await createSentientAnimalData({\n startingToughnessBonus: +1,\n startingStrengthBonus: +3,\n startingHitPoints: '1d10', \n });\n break;\n case 'Bilge Rat':\n data = await createSentientAnimalData({\n startingToughnessBonus: +2,\n startingAgilityBonus: +3,\n startingHitPoints: '1d2', \n });\n break;\n case 'Lucky Parrot':\n data = await createSentientAnimalData({\n startingPresenceBonus: +2,\n startingAgilityBonus: +1,\n startingHitPoints: '1d2', \n luckDie: '1d6'\n });\n break;\n case 'Clever Monkey':\n data = await createSentientAnimalData({\n startingPresenceBonus: 0,\n startingAgilityBonus: +2,\n startingStrengthBonus: -1,\n startingHitPoints: '1d6', \n startingWeaponTableFormula: '1d10',\n });\n break; \n }\n \n selectedClass.data.data = data;\n selectedClass.data.img = sentientAnimalItem.data.img;\n selectedClass.data.data.startingRolls = sentientAnimalItem.data.data.startingBonusRolls;\n selectedClass.data.data.startingItems = sentientAnimalItem.data.data.startingBonusItems;\n selectedClass.data.data.flavorText = `${tallTaleItem.data.data.flavorText}`\n\n const pirateData = await pirateFactory.rollScvmForClass(selectedClass);\n\n if(sentientAnimalItem.name === 'Foul Fowl') {\n pirateData.items\n .filter((item) => item.type === 'invokable')\n .forEach((item) => {\n item.data.data.isEquipment = false;\n });\n }\n\n pirateData.items = pirateData.items.concat([sentientAnimalItem]);\n return pirateData;\n}\n\n\n// const tallTaleItem = (await pirateFactory.drawTableItem(tallTaleRollPack, tallTaleRollPackName))[0];\nconst tallTaleItem = (await pirateFactory.rollTable(tallTaleRollPack, tallTaleRollPackName, '(1d1 + 2)'))[0];\nlet pirateData = {};\n\nswitch (tallTaleItem.name) {\n case 'Merfolk':\n pirateData = await getMerfolkData(tallTaleItem);\n break;\n case 'Aquatic Mutant':\n pirateData = await getAquaticMutantData(tallTaleItem);\n break;\n case 'Sentient Animal':\n pirateData = await getSentientAnimalData(tallTaleItem);\n break;\n}\n\npirateData.items = pirateData.items.concat([tallTaleItem])\n\nif (actor) {\n await pirateFactory.updateActorWithScvm(actor, pirateData);\n} else {\n await pirateFactory.createActorWithScvm(pirateData);\n}","folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Macro.JMLpUPK7oJ10cb4A"}}} +{"_id":"euVqlYfll65zKOew","name":"Character creation","type":"script","author":"pdXclp2r5tiEF79G","img":"icons/svg/dice-target.svg","scope":"global","command":"const pirateFactory = game.pirateborg.pirateFactory;\n\nconst tallTaleRollPack = 'pirateborg.rolls-tall-tale';\nconst tallTaleRollPackName = 'Tall Tale';\nconst aquaticMutantRollPackName = 'Aquatic Mutant';\nconst sentientAnimalRollPackName = 'Sentient Animal';\n\nconst getRandomBaseClass = () => {\n const validBaseClasses = selectedClasses.filter((selectedClass) => !selectedClass.data.data.requireBaseClass);\n return baseClass = validBaseClasses[Math.floor(Math.random() * validBaseClasses.length)];\n}\n\nconst getClassItems = async (selectedClass) => {\n return [\n ...(await pirateFactory.rollRollItems(selectedClass.data.data.startingRolls)),\n ...(await pirateFactory.findItems(selectedClass.data.data.startingItems)),\n ];\n}\n\nconst getStartingBonusItems = async (items) => {\n return [\n ...(await pirateFactory.findStartingBonusItems(items)),\n ...(await pirateFactory.findStartingBonusRollsItems(items)),\n ];\n}\n\nconst getPirateDataWithBaseClass = async (additionalItems = []) => {\n const baseClass = getRandomBaseClass(); \n const pirateData = await pirateFactory.rollScvmForClass(baseClass);\n const items = await getClassItems(selectedClass); \n const bonusItems = await getStartingBonusItems([...items, ...additionalItems]);\n pirateData.baseClass = `${baseClass.pack};${baseClass.name}`\n \n pirateData.items = pirateData.items\n .filter((item) => item.data.type !== 'class')\n .concat(items)\n .concat(additionalItems)\n .concat(bonusItems)\n .concat([selectedClass]);\n\n return pirateData;\n}\n\nconst animalDefaultData = {\n startingAbilityScoreFormula: '3d6',\n startingStrengthBonus: -2,\n startingAgilityBonus: -2,\n startingPresenceBonus: -2,\n startingToughnessBonus: -2,\n startingSpiritBonus: -2,\n luckDie: 'd4',\n flavorText: '',\n startingMacro: '',\n}\n\nconst createSentientAnimalData = async (data) => {\n return mergeObject(animalDefaultData, data, { insertKeys: true });\n}\n\nconst getMerfolkData = async (tallTaleItem) => {\n const pirateData = await getPirateDataWithBaseClass();\n pirateData.description = `${tallTaleItem.data.data.flavorText}
${pirateData.description}`\n pirateData.actorImg = tallTaleItem.data.img;\n\n const baseClass = pirateData.items.find((item) => item.type === 'class')\n baseClass.data.name = `${baseClass.data.name} (${tallTaleItem.data.name})`;\n return pirateData;\n}\n\nconst getAquaticMutantData = async (tallTaleItem) => {\n const aquaticMutantItem = (await pirateFactory.drawTableItem(tallTaleRollPack, aquaticMutantRollPackName))[0];\n const pirateData = await getPirateDataWithBaseClass([aquaticMutantItem]);\n pirateData.description = `${tallTaleItem.data.data.flavorText} (${aquaticMutantItem.data.name})
${pirateData.description}`\n\n if (aquaticMutantItem.data.name === 'Electric Eel') {\n pirateData.agility = parseInt(pirateData.agility, 10) + 1;\n }\n\n pirateData.actorImg = aquaticMutantItem.data.img;\n const baseClass = pirateData.items.find((item) => item.type === 'class')\n baseClass.data.name = `${baseClass.data.name} (${tallTaleItem.data.name})`;\n\n if(aquaticMutantItem.name === 'The Great Old One') {\n pirateData.items\n .filter((item) => item.type === 'invokable')\n .forEach((item) => {\n item.data.data.isEquipment = false;\n });\n }\n\n return pirateData;\n}\n\nconst getSentientAnimalData = async (tallTaleItem) => {\n const sentientAnimalItem = (await pirateFactory.drawTableItem(tallTaleRollPack, sentientAnimalRollPackName))[0];\n let data = {};\n switch (sentientAnimalItem.name) {\n case 'Foul Fowl':\n data = await createSentientAnimalData({\n startingSpiritBonus: +3,\n startingHitPoints: '1d4', \n }); \n break;\n case 'Jaguar':\n data = await createSentientAnimalData({\n startingAgilityBonus: +2,\n startingStrengthBonus: +2,\n startingHitPoints: '1d8', \n });\n break;\n case 'Crocodile':\n data = await createSentientAnimalData({\n startingToughnessBonus: +1,\n startingStrengthBonus: +3,\n startingHitPoints: '1d10', \n });\n break;\n case 'Bilge Rat':\n data = await createSentientAnimalData({\n startingToughnessBonus: +2,\n startingAgilityBonus: +3,\n startingHitPoints: '1d2', \n });\n break;\n case 'Lucky Parrot':\n data = await createSentientAnimalData({\n startingPresenceBonus: +2,\n startingAgilityBonus: +1,\n startingHitPoints: '1d2', \n luckDie: '1d6'\n });\n break;\n case 'Clever Monkey':\n data = await createSentientAnimalData({\n startingPresenceBonus: 0,\n startingAgilityBonus: +2,\n startingStrengthBonus: -1,\n startingHitPoints: '1d6', \n startingWeaponTableFormula: '1d10',\n });\n break; \n }\n \n selectedClass.data.data = data;\n selectedClass.data.img = sentientAnimalItem.data.img;\n selectedClass.data.data.startingRolls = sentientAnimalItem.data.data.startingBonusRolls;\n selectedClass.data.data.startingItems = sentientAnimalItem.data.data.startingBonusItems;\n selectedClass.data.data.flavorText = `${tallTaleItem.data.data.flavorText}`\n\n const pirateData = await pirateFactory.rollScvmForClass(selectedClass);\n\n if(sentientAnimalItem.name === 'Foul Fowl') {\n pirateData.items\n .filter((item) => item.type === 'invokable')\n .forEach((item) => {\n item.data.data.isEquipment = false;\n });\n }\n\n pirateData.items = pirateData.items.concat([sentientAnimalItem]);\n return pirateData;\n}\n\n\n// const tallTaleItem = (await pirateFactory.drawTableItem(tallTaleRollPack, tallTaleRollPackName))[0];\nconst tallTaleItem = await pirateFactory.findCompendiumItem('pirateborg.class-tall-tale', 'Sentient Animal')\nlet pirateData = {};\n\nswitch (tallTaleItem.name) {\n case 'Merfolk':\n pirateData = await getMerfolkData(tallTaleItem);\n break;\n case 'Aquatic Mutant':\n pirateData = await getAquaticMutantData(tallTaleItem);\n break;\n case 'Sentient Animal':\n pirateData = await getSentientAnimalData(tallTaleItem);\n break;\n}\n\npirateData.items = pirateData.items.concat([tallTaleItem])\n\nif (actor) {\n await pirateFactory.updateActorWithScvm(actor, pirateData);\n} else {\n await pirateFactory.createActorWithScvm(pirateData);\n}","folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Macro.JMLpUPK7oJ10cb4A"}}} +{"_id":"euVqlYfll65zKOew","name":"Character creation","type":"script","author":"pdXclp2r5tiEF79G","img":"icons/svg/dice-target.svg","scope":"global","command":"const pirateFactory = game.pirateborg.pirateFactory;\n\nconst tallTaleRollPack = 'pirateborg.rolls-tall-tale';\nconst tallTaleRollPackName = 'Tall Tale';\nconst aquaticMutantRollPackName = 'Aquatic Mutant';\nconst sentientAnimalRollPackName = 'Sentient Animal';\n\nconst getRandomBaseClass = () => {\n const validBaseClasses = selectedClasses.filter((selectedClass) => !selectedClass.data.data.requireBaseClass);\n return baseClass = validBaseClasses[Math.floor(Math.random() * validBaseClasses.length)];\n}\n\nconst getClassItems = async (selectedClass) => {\n return [\n ...(await pirateFactory.rollRollItems(selectedClass.data.data.startingRolls)),\n ...(await pirateFactory.findItems(selectedClass.data.data.startingItems)),\n ];\n}\n\nconst getStartingBonusItems = async (items) => {\n return [\n ...(await pirateFactory.findStartingBonusItems(items)),\n ...(await pirateFactory.findStartingBonusRollsItems(items)),\n ];\n}\n\nconst getPirateDataWithBaseClass = async (additionalItems = []) => {\n const baseClass = getRandomBaseClass(); \n const pirateData = await pirateFactory.rollScvmForClass(baseClass);\n const items = await getClassItems(selectedClass); \n const bonusItems = await getStartingBonusItems([...items, ...additionalItems]);\n pirateData.baseClass = `${baseClass.pack};${baseClass.name}`\n \n pirateData.items = pirateData.items\n .filter((item) => item.data.type !== 'class')\n .concat(items)\n .concat(additionalItems)\n .concat(bonusItems)\n .concat([selectedClass]);\n\n return pirateData;\n}\n\nconst animalDefaultData = {\n startingAbilityScoreFormula: '3d6',\n startingStrengthBonus: -2,\n startingAgilityBonus: -2,\n startingPresenceBonus: -2,\n startingToughnessBonus: -2,\n startingSpiritBonus: -2,\n luckDie: 'd4',\n flavorText: '',\n startingMacro: '',\n}\n\nconst createSentientAnimalData = async (data) => {\n return mergeObject(animalDefaultData, data, { insertKeys: true });\n}\n\nconst getMerfolkData = async (tallTaleItem) => {\n const pirateData = await getPirateDataWithBaseClass();\n pirateData.description = `${tallTaleItem.data.data.flavorText}
${pirateData.description}`\n pirateData.actorImg = tallTaleItem.data.img;\n\n const baseClass = pirateData.items.find((item) => item.type === 'class')\n baseClass.data.name = `${baseClass.data.name} (${tallTaleItem.data.name})`;\n return pirateData;\n}\n\nconst getAquaticMutantData = async (tallTaleItem) => {\n const aquaticMutantItem = (await pirateFactory.drawTableItem(tallTaleRollPack, aquaticMutantRollPackName))[0];\n const pirateData = await getPirateDataWithBaseClass([aquaticMutantItem]);\n pirateData.description = `${tallTaleItem.data.data.flavorText} (${aquaticMutantItem.data.name})
${pirateData.description}`\n\n if (aquaticMutantItem.data.name === 'Electric Eel') {\n pirateData.agility = parseInt(pirateData.agility, 10) + 1;\n }\n\n pirateData.actorImg = aquaticMutantItem.data.img;\n const baseClass = pirateData.items.find((item) => item.type === 'class')\n baseClass.data.name = `${baseClass.data.name} (${tallTaleItem.data.name})`;\n\n if(aquaticMutantItem.name === 'The Great Old One') {\n pirateData.items\n .filter((item) => item.type === 'invokable')\n .forEach((item) => {\n item.data.data.isEquipment = false;\n });\n }\n\n return pirateData;\n}\n\nconst getSentientAnimalData = async (tallTaleItem) => {\n const sentientAnimalItem = (await pirateFactory.drawTableItem(tallTaleRollPack, sentientAnimalRollPackName))[0];\n let data = {};\n switch (sentientAnimalItem.name) {\n case 'Foul Fowl':\n data = await createSentientAnimalData({\n startingSpiritBonus: +3,\n startingHitPoints: '1d4', \n }); \n break;\n case 'Jaguar':\n data = await createSentientAnimalData({\n startingAgilityBonus: +2,\n startingStrengthBonus: +2,\n startingHitPoints: '1d8', \n });\n break;\n case 'Crocodile':\n data = await createSentientAnimalData({\n startingToughnessBonus: +1,\n startingStrengthBonus: +3,\n startingHitPoints: '1d10', \n });\n break;\n case 'Bilge Rat':\n data = await createSentientAnimalData({\n startingToughnessBonus: +2,\n startingAgilityBonus: +3,\n startingHitPoints: '1d2', \n });\n break;\n case 'Lucky Parrot':\n data = await createSentientAnimalData({\n startingPresenceBonus: +2,\n startingAgilityBonus: +1,\n startingHitPoints: '1d2', \n luckDie: '1d6'\n });\n break;\n case 'Clever Monkey':\n data = await createSentientAnimalData({\n startingPresenceBonus: 0,\n startingAgilityBonus: +2,\n startingStrengthBonus: -1,\n startingHitPoints: '1d6', \n startingWeaponTableFormula: '1d10',\n });\n break; \n }\n \n selectedClass.data.data = data;\n selectedClass.data.name = `${selectedClass.data.data} (#{tallTaleItem.data.name})`;\n selectedClass.data.img = sentientAnimalItem.data.img;\n selectedClass.data.data.startingRolls = sentientAnimalItem.data.data.startingBonusRolls;\n selectedClass.data.data.startingItems = sentientAnimalItem.data.data.startingBonusItems;\n selectedClass.data.data.flavorText = `${tallTaleItem.data.data.flavorText}`\n\n const pirateData = await pirateFactory.rollScvmForClass(selectedClass);\n\n if(sentientAnimalItem.name === 'Foul Fowl') {\n pirateData.items\n .filter((item) => item.type === 'invokable')\n .forEach((item) => {\n item.data.data.isEquipment = false;\n });\n }\n\n pirateData.items = pirateData.items.concat([sentientAnimalItem]);\n return pirateData;\n}\n\n\n// const tallTaleItem = (await pirateFactory.drawTableItem(tallTaleRollPack, tallTaleRollPackName))[0];\nconst tallTaleItem = await pirateFactory.findCompendiumItem('pirateborg.class-tall-tale', 'Sentient Animal')\nlet pirateData = {};\n\nswitch (tallTaleItem.name) {\n case 'Merfolk':\n pirateData = await getMerfolkData(tallTaleItem);\n break;\n case 'Aquatic Mutant':\n pirateData = await getAquaticMutantData(tallTaleItem);\n break;\n case 'Sentient Animal':\n pirateData = await getSentientAnimalData(tallTaleItem);\n break;\n}\n\npirateData.items = pirateData.items.concat([tallTaleItem])\n\nif (actor) {\n await pirateFactory.updateActorWithScvm(actor, pirateData);\n} else {\n await pirateFactory.createActorWithScvm(pirateData);\n}","folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Macro.JMLpUPK7oJ10cb4A"}}} +{"_id":"euVqlYfll65zKOew","name":"Character creation","type":"script","author":"pdXclp2r5tiEF79G","img":"icons/svg/dice-target.svg","scope":"global","command":"const pirateFactory = game.pirateborg.pirateFactory;\n\nconst tallTaleRollPack = 'pirateborg.rolls-tall-tale';\nconst tallTaleRollPackName = 'Tall Tale';\nconst aquaticMutantRollPackName = 'Aquatic Mutant';\nconst sentientAnimalRollPackName = 'Sentient Animal';\n\nconst getRandomBaseClass = () => {\n const validBaseClasses = selectedClasses.filter((selectedClass) => !selectedClass.data.data.requireBaseClass);\n return baseClass = validBaseClasses[Math.floor(Math.random() * validBaseClasses.length)];\n}\n\nconst getClassItems = async (selectedClass) => {\n return [\n ...(await pirateFactory.rollRollItems(selectedClass.data.data.startingRolls)),\n ...(await pirateFactory.findItems(selectedClass.data.data.startingItems)),\n ];\n}\n\nconst getStartingBonusItems = async (items) => {\n return [\n ...(await pirateFactory.findStartingBonusItems(items)),\n ...(await pirateFactory.findStartingBonusRollsItems(items)),\n ];\n}\n\nconst getPirateDataWithBaseClass = async (additionalItems = []) => {\n const baseClass = getRandomBaseClass(); \n const pirateData = await pirateFactory.rollScvmForClass(baseClass);\n const items = await getClassItems(selectedClass); \n const bonusItems = await getStartingBonusItems([...items, ...additionalItems]);\n pirateData.baseClass = `${baseClass.pack};${baseClass.name}`\n \n pirateData.items = pirateData.items\n .filter((item) => item.data.type !== 'class')\n .concat(items)\n .concat(additionalItems)\n .concat(bonusItems)\n .concat([selectedClass]);\n\n return pirateData;\n}\n\nconst animalDefaultData = {\n startingAbilityScoreFormula: '3d6',\n startingStrengthBonus: -2,\n startingAgilityBonus: -2,\n startingPresenceBonus: -2,\n startingToughnessBonus: -2,\n startingSpiritBonus: -2,\n luckDie: 'd4',\n flavorText: '',\n startingMacro: '',\n}\n\nconst createSentientAnimalData = async (data) => {\n return mergeObject(animalDefaultData, data, { insertKeys: true });\n}\n\nconst getMerfolkData = async (tallTaleItem) => {\n const pirateData = await getPirateDataWithBaseClass();\n pirateData.description = `${tallTaleItem.data.data.flavorText}
${pirateData.description}`\n pirateData.actorImg = tallTaleItem.data.img;\n\n const baseClass = pirateData.items.find((item) => item.type === 'class')\n baseClass.data.name = `${baseClass.data.name} (${tallTaleItem.data.name})`;\n return pirateData;\n}\n\nconst getAquaticMutantData = async (tallTaleItem) => {\n const aquaticMutantItem = (await pirateFactory.drawTableItem(tallTaleRollPack, aquaticMutantRollPackName))[0];\n const pirateData = await getPirateDataWithBaseClass([aquaticMutantItem]);\n pirateData.description = `${tallTaleItem.data.data.flavorText} (${aquaticMutantItem.data.name})
${pirateData.description}`\n\n if (aquaticMutantItem.data.name === 'Electric Eel') {\n pirateData.agility = parseInt(pirateData.agility, 10) + 1;\n }\n\n pirateData.actorImg = aquaticMutantItem.data.img;\n const baseClass = pirateData.items.find((item) => item.type === 'class')\n baseClass.data.name = `${baseClass.data.name} (${tallTaleItem.data.name})`;\n\n if(aquaticMutantItem.name === 'The Great Old One') {\n pirateData.items\n .filter((item) => item.type === 'invokable')\n .forEach((item) => {\n item.data.data.isEquipment = false;\n });\n }\n\n return pirateData;\n}\n\nconst getSentientAnimalData = async (tallTaleItem) => {\n const sentientAnimalItem = (await pirateFactory.drawTableItem(tallTaleRollPack, sentientAnimalRollPackName))[0];\n let data = {};\n switch (sentientAnimalItem.name) {\n case 'Foul Fowl':\n data = await createSentientAnimalData({\n startingSpiritBonus: +3,\n startingHitPoints: '1d4', \n }); \n break;\n case 'Jaguar':\n data = await createSentientAnimalData({\n startingAgilityBonus: +2,\n startingStrengthBonus: +2,\n startingHitPoints: '1d8', \n });\n break;\n case 'Crocodile':\n data = await createSentientAnimalData({\n startingToughnessBonus: +1,\n startingStrengthBonus: +3,\n startingHitPoints: '1d10', \n });\n break;\n case 'Bilge Rat':\n data = await createSentientAnimalData({\n startingToughnessBonus: +2,\n startingAgilityBonus: +3,\n startingHitPoints: '1d2', \n });\n break;\n case 'Lucky Parrot':\n data = await createSentientAnimalData({\n startingPresenceBonus: +2,\n startingAgilityBonus: +1,\n startingHitPoints: '1d2', \n luckDie: '1d6'\n });\n break;\n case 'Clever Monkey':\n data = await createSentientAnimalData({\n startingPresenceBonus: 0,\n startingAgilityBonus: +2,\n startingStrengthBonus: -1,\n startingHitPoints: '1d6', \n startingWeaponTableFormula: '1d10',\n });\n break; \n }\n \n selectedClass.data.data = data;\n selectedClass.data.name = `${selectedClass.data.name} (${tallTaleItem.data.name})`;\n selectedClass.data.img = sentientAnimalItem.data.img;\n selectedClass.data.data.startingRolls = sentientAnimalItem.data.data.startingBonusRolls;\n selectedClass.data.data.startingItems = sentientAnimalItem.data.data.startingBonusItems;\n selectedClass.data.data.flavorText = `${tallTaleItem.data.data.flavorText}`\n\n const pirateData = await pirateFactory.rollScvmForClass(selectedClass);\n\n if(sentientAnimalItem.name === 'Foul Fowl') {\n pirateData.items\n .filter((item) => item.type === 'invokable')\n .forEach((item) => {\n item.data.data.isEquipment = false;\n });\n }\n\n pirateData.items = pirateData.items.concat([sentientAnimalItem]);\n return pirateData;\n}\n\n\n// const tallTaleItem = (await pirateFactory.drawTableItem(tallTaleRollPack, tallTaleRollPackName))[0];\nconst tallTaleItem = await pirateFactory.findCompendiumItem('pirateborg.class-tall-tale', 'Sentient Animal')\nlet pirateData = {};\n\nswitch (tallTaleItem.name) {\n case 'Merfolk':\n pirateData = await getMerfolkData(tallTaleItem);\n break;\n case 'Aquatic Mutant':\n pirateData = await getAquaticMutantData(tallTaleItem);\n break;\n case 'Sentient Animal':\n pirateData = await getSentientAnimalData(tallTaleItem);\n break;\n}\n\npirateData.items = pirateData.items.concat([tallTaleItem])\n\nif (actor) {\n await pirateFactory.updateActorWithScvm(actor, pirateData);\n} else {\n await pirateFactory.createActorWithScvm(pirateData);\n}","folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Macro.JMLpUPK7oJ10cb4A"}}} +{"_id":"euVqlYfll65zKOew","name":"Character creation","type":"script","author":"pdXclp2r5tiEF79G","img":"icons/svg/dice-target.svg","scope":"global","command":"const pirateFactory = game.pirateborg.pirateFactory;\n\nconst tallTaleRollPack = 'pirateborg.rolls-tall-tale';\nconst tallTaleRollPackName = 'Tall Tale';\nconst aquaticMutantRollPackName = 'Aquatic Mutant';\nconst sentientAnimalRollPackName = 'Sentient Animal';\n\nconst getRandomBaseClass = () => {\n const validBaseClasses = selectedClasses.filter((selectedClass) => !selectedClass.data.data.requireBaseClass);\n return baseClass = validBaseClasses[Math.floor(Math.random() * validBaseClasses.length)];\n}\n\nconst getClassItems = async (selectedClass) => {\n return [\n ...(await pirateFactory.rollRollItems(selectedClass.data.data.startingRolls)),\n ...(await pirateFactory.findItems(selectedClass.data.data.startingItems)),\n ];\n}\n\nconst getStartingBonusItems = async (items) => {\n return [\n ...(await pirateFactory.findStartingBonusItems(items)),\n ...(await pirateFactory.findStartingBonusRollsItems(items)),\n ];\n}\n\nconst getPirateDataWithBaseClass = async (additionalItems = []) => {\n const baseClass = getRandomBaseClass(); \n const pirateData = await pirateFactory.rollScvmForClass(baseClass);\n const items = await getClassItems(selectedClass); \n const bonusItems = await getStartingBonusItems([...items, ...additionalItems]);\n pirateData.baseClass = `${baseClass.pack};${baseClass.name}`\n \n pirateData.items = pirateData.items\n .filter((item) => item.data.type !== 'class')\n .concat(items)\n .concat(additionalItems)\n .concat(bonusItems)\n .concat([selectedClass]);\n\n return pirateData;\n}\n\nconst animalDefaultData = {\n startingAbilityScoreFormula: '3d6',\n startingStrengthBonus: -2,\n startingAgilityBonus: -2,\n startingPresenceBonus: -2,\n startingToughnessBonus: -2,\n startingSpiritBonus: -2,\n luckDie: 'd4',\n flavorText: '',\n startingMacro: '',\n}\n\nconst createSentientAnimalData = async (data) => {\n return mergeObject(animalDefaultData, data, { insertKeys: true });\n}\n\nconst getMerfolkData = async (tallTaleItem) => {\n const pirateData = await getPirateDataWithBaseClass();\n pirateData.description = `${tallTaleItem.data.data.flavorText}
${pirateData.description}`\n pirateData.actorImg = tallTaleItem.data.img;\n\n const baseClass = pirateData.items.find((item) => item.type === 'class')\n baseClass.data.name = `${baseClass.data.name} (${tallTaleItem.data.name})`;\n return pirateData;\n}\n\nconst getAquaticMutantData = async (tallTaleItem) => {\n const aquaticMutantItem = (await pirateFactory.drawTableItem(tallTaleRollPack, aquaticMutantRollPackName))[0];\n const pirateData = await getPirateDataWithBaseClass([aquaticMutantItem]);\n pirateData.description = `${tallTaleItem.data.data.flavorText} (${aquaticMutantItem.data.name})
${pirateData.description}`\n\n if (aquaticMutantItem.data.name === 'Electric Eel') {\n pirateData.agility = parseInt(pirateData.agility, 10) + 1;\n }\n\n pirateData.actorImg = aquaticMutantItem.data.img;\n const baseClass = pirateData.items.find((item) => item.type === 'class')\n baseClass.data.name = `${baseClass.data.name} (${tallTaleItem.data.name})`;\n\n if(aquaticMutantItem.name === 'The Great Old One') {\n pirateData.items\n .filter((item) => item.type === 'invokable')\n .forEach((item) => {\n item.data.data.isEquipment = false;\n });\n }\n\n return pirateData;\n}\n\nconst getSentientAnimalData = async (tallTaleItem) => {\n const sentientAnimalItem = (await pirateFactory.drawTableItem(tallTaleRollPack, sentientAnimalRollPackName))[0];\n let data = {};\n switch (sentientAnimalItem.name) {\n case 'Foul Fowl':\n data = await createSentientAnimalData({\n startingSpiritBonus: +3,\n startingHitPoints: '1d4', \n }); \n break;\n case 'Jaguar':\n data = await createSentientAnimalData({\n startingAgilityBonus: +2,\n startingStrengthBonus: +2,\n startingHitPoints: '1d8', \n });\n break;\n case 'Crocodile':\n data = await createSentientAnimalData({\n startingToughnessBonus: +1,\n startingStrengthBonus: +3,\n startingHitPoints: '1d10', \n });\n break;\n case 'Bilge Rat':\n data = await createSentientAnimalData({\n startingToughnessBonus: +2,\n startingAgilityBonus: +3,\n startingHitPoints: '1d2', \n });\n break;\n case 'Lucky Parrot':\n data = await createSentientAnimalData({\n startingPresenceBonus: +2,\n startingAgilityBonus: +1,\n startingHitPoints: '1d2', \n luckDie: '1d6'\n });\n break;\n case 'Clever Monkey':\n data = await createSentientAnimalData({\n startingPresenceBonus: 0,\n startingAgilityBonus: +2,\n startingStrengthBonus: -1,\n startingHitPoints: '1d6', \n startingWeaponTableFormula: '1d10',\n });\n break; \n }\n \n selectedClass.data.data = data;\n selectedClass.data.name = `${selectedClass.data.name} (${tallTaleItem.data.name})`;\n selectedClass.data.img = sentientAnimalItem.data.img;\n selectedClass.data.data.startingRolls = sentientAnimalItem.data.data.startingBonusRolls;\n selectedClass.data.data.startingItems = sentientAnimalItem.data.data.startingBonusItems;\n selectedClass.data.data.flavorText = `${tallTaleItem.data.data.flavorText} (${sentientAnimalItem.data.name})`\n\n const pirateData = await pirateFactory.rollScvmForClass(selectedClass);\n\n if(sentientAnimalItem.name === 'Foul Fowl') {\n pirateData.items\n .filter((item) => item.type === 'invokable')\n .forEach((item) => {\n item.data.data.isEquipment = false;\n });\n }\n\n pirateData.items = pirateData.items.concat([sentientAnimalItem]);\n return pirateData;\n}\n\n\n// const tallTaleItem = (await pirateFactory.drawTableItem(tallTaleRollPack, tallTaleRollPackName))[0];\nconst tallTaleItem = await pirateFactory.findCompendiumItem('pirateborg.class-tall-tale', 'Sentient Animal')\nlet pirateData = {};\n\nswitch (tallTaleItem.name) {\n case 'Merfolk':\n pirateData = await getMerfolkData(tallTaleItem);\n break;\n case 'Aquatic Mutant':\n pirateData = await getAquaticMutantData(tallTaleItem);\n break;\n case 'Sentient Animal':\n pirateData = await getSentientAnimalData(tallTaleItem);\n break;\n}\n\npirateData.items = pirateData.items.concat([tallTaleItem])\n\nif (actor) {\n await pirateFactory.updateActorWithScvm(actor, pirateData);\n} else {\n await pirateFactory.createActorWithScvm(pirateData);\n}","folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Macro.JMLpUPK7oJ10cb4A"}}} +{"_id":"euVqlYfll65zKOew","name":"Character creation","type":"script","author":"pdXclp2r5tiEF79G","img":"icons/svg/dice-target.svg","scope":"global","command":"const pirateFactory = game.pirateborg.pirateFactory;\n\nconst tallTaleRollPack = 'pirateborg.rolls-tall-tale';\nconst tallTaleRollPackName = 'Tall Tale';\nconst aquaticMutantRollPackName = 'Aquatic Mutant';\nconst sentientAnimalRollPackName = 'Sentient Animal';\n\nconst getRandomBaseClass = () => {\n const validBaseClasses = selectedClasses.filter((selectedClass) => !selectedClass.data.data.requireBaseClass);\n return baseClass = validBaseClasses[Math.floor(Math.random() * validBaseClasses.length)];\n}\n\nconst getClassItems = async (selectedClass) => {\n return [\n ...(await pirateFactory.rollRollItems(selectedClass.data.data.startingRolls)),\n ...(await pirateFactory.findItems(selectedClass.data.data.startingItems)),\n ];\n}\n\nconst getStartingBonusItems = async (items) => {\n return [\n ...(await pirateFactory.findStartingBonusItems(items)),\n ...(await pirateFactory.findStartingBonusRollsItems(items)),\n ];\n}\n\nconst getPirateDataWithBaseClass = async (additionalItems = []) => {\n const baseClass = getRandomBaseClass(); \n const pirateData = await pirateFactory.rollScvmForClass(baseClass);\n const items = await getClassItems(selectedClass); \n const bonusItems = await getStartingBonusItems([...items, ...additionalItems]);\n pirateData.baseClass = `${baseClass.pack};${baseClass.name}`\n \n pirateData.items = pirateData.items\n .filter((item) => item.data.type !== 'class')\n .concat(items)\n .concat(additionalItems)\n .concat(bonusItems)\n .concat([selectedClass]);\n\n return pirateData;\n}\n\nconst animalDefaultData = {\n startingAbilityScoreFormula: '3d6',\n startingStrengthBonus: -2,\n startingAgilityBonus: -2,\n startingPresenceBonus: -2,\n startingToughnessBonus: -2,\n startingSpiritBonus: -2,\n luckDie: 'd4',\n flavorText: '',\n startingMacro: '',\n}\n\nconst createSentientAnimalData = async (data) => {\n return mergeObject(animalDefaultData, data, { insertKeys: true });\n}\n\nconst getMerfolkData = async (tallTaleItem) => {\n const pirateData = await getPirateDataWithBaseClass();\n pirateData.description = `${tallTaleItem.data.data.flavorText}
${pirateData.description}`\n pirateData.actorImg = tallTaleItem.data.img;\n\n const baseClass = pirateData.items.find((item) => item.type === 'class')\n baseClass.data.name = `${baseClass.data.name} (${tallTaleItem.data.name})`;\n return pirateData;\n}\n\nconst getAquaticMutantData = async (tallTaleItem) => {\n const aquaticMutantItem = (await pirateFactory.drawTableItem(tallTaleRollPack, aquaticMutantRollPackName))[0];\n const pirateData = await getPirateDataWithBaseClass([aquaticMutantItem]);\n pirateData.description = `${tallTaleItem.data.data.flavorText} (${aquaticMutantItem.data.name})
${pirateData.description}`\n\n if (aquaticMutantItem.data.name === 'Electric Eel') {\n pirateData.agility = parseInt(pirateData.agility, 10) + 1;\n }\n\n pirateData.actorImg = aquaticMutantItem.data.img;\n const baseClass = pirateData.items.find((item) => item.type === 'class')\n baseClass.data.name = `${baseClass.data.name} (${tallTaleItem.data.name})`;\n\n if(aquaticMutantItem.name === 'The Great Old One') {\n pirateData.items\n .filter((item) => item.type === 'invokable')\n .forEach((item) => {\n item.data.data.isEquipment = false;\n });\n }\n\n return pirateData;\n}\n\nconst getSentientAnimalData = async (tallTaleItem) => {\n const sentientAnimalItem = (await pirateFactory.drawTableItem(tallTaleRollPack, sentientAnimalRollPackName))[0];\n let data = {};\n switch (sentientAnimalItem.name) {\n case 'Foul Fowl':\n data = await createSentientAnimalData({\n startingSpiritBonus: +3,\n startingHitPoints: '1d4', \n }); \n break;\n case 'Jaguar':\n data = await createSentientAnimalData({\n startingAgilityBonus: +2,\n startingStrengthBonus: +2,\n startingHitPoints: '1d8', \n });\n break;\n case 'Crocodile':\n data = await createSentientAnimalData({\n startingToughnessBonus: +1,\n startingStrengthBonus: +3,\n startingHitPoints: '1d10', \n });\n break;\n case 'Bilge Rat':\n data = await createSentientAnimalData({\n startingToughnessBonus: +2,\n startingAgilityBonus: +3,\n startingHitPoints: '1d2', \n });\n break;\n case 'Lucky Parrot':\n data = await createSentientAnimalData({\n startingPresenceBonus: +2,\n startingAgilityBonus: +1,\n startingHitPoints: '1d2', \n luckDie: '1d6'\n });\n break;\n case 'Clever Monkey':\n data = await createSentientAnimalData({\n startingPresenceBonus: 0,\n startingAgilityBonus: +2,\n startingStrengthBonus: -1,\n startingHitPoints: '1d6', \n startingWeaponTableFormula: '1d10',\n });\n break; \n }\n \n selectedClass.data.data = data;\n selectedClass.data.name = `${selectedClass.data.name} (${tallTaleItem.data.name})`;\n selectedClass.data.img = sentientAnimalItem.data.img;\n selectedClass.data.data.startingRolls = sentientAnimalItem.data.data.startingBonusRolls;\n selectedClass.data.data.startingItems = sentientAnimalItem.data.data.startingBonusItems;\n selectedClass.data.data.flavorText = `${tallTaleItem.data.data.flavorText} (${sentientAnimalItem.data.name})`\n\n const pirateData = await pirateFactory.rollScvmForClass(selectedClass);\n\n if(sentientAnimalItem.name === 'Foul Fowl') {\n pirateData.items\n .filter((item) => item.type === 'invokable')\n .forEach((item) => {\n item.data.data.isEquipment = false;\n });\n }\n\n pirateData.items = pirateData.items.concat([sentientAnimalItem]);\n return pirateData;\n}\n\n\nconst tallTaleItem = (await pirateFactory.drawTableItem(tallTaleRollPack, tallTaleRollPackName))[0];\n// const tallTaleItem = await pirateFactory.findCompendiumItem('pirateborg.class-tall-tale', 'Sentient Animal')\nlet pirateData = {};\n\nswitch (tallTaleItem.name) {\n case 'Merfolk':\n pirateData = await getMerfolkData(tallTaleItem);\n break;\n case 'Aquatic Mutant':\n pirateData = await getAquaticMutantData(tallTaleItem);\n break;\n case 'Sentient Animal':\n pirateData = await getSentientAnimalData(tallTaleItem);\n break;\n}\n\npirateData.items = pirateData.items.concat([tallTaleItem])\n\nif (actor) {\n await pirateFactory.updateActorWithScvm(actor, pirateData);\n} else {\n await pirateFactory.createActorWithScvm(pirateData);\n}","folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Macro.JMLpUPK7oJ10cb4A"}}} +{"_id":"euVqlYfll65zKOew","name":"Character creation","type":"script","author":"pdXclp2r5tiEF79G","img":"icons/svg/dice-target.svg","scope":"global","command":"const pirateFactory = game.pirateborg.pirateFactory;\n\nconst tallTaleRollPack = 'pirateborg.rolls-tall-tale';\nconst tallTaleRollPackName = 'Tall Tale';\nconst aquaticMutantRollPackName = 'Aquatic Mutant';\nconst sentientAnimalRollPackName = 'Sentient Animal';\n\nconst getRandomBaseClass = () => {\n const validBaseClasses = selectedClasses.filter((selectedClass) => !selectedClass.data.data.requireBaseClass);\n return baseClass = validBaseClasses[Math.floor(Math.random() * validBaseClasses.length)];\n}\n\nconst getClassItems = async (selectedClass) => {\n return [\n ...(await pirateFactory.rollRollItems(selectedClass.data.data.startingRolls)),\n ...(await pirateFactory.findItems(selectedClass.data.data.startingItems)),\n ];\n}\n\nconst getStartingBonusItems = async (items) => {\n return [\n ...(await pirateFactory.findStartingBonusItems(items)),\n ...(await pirateFactory.findStartingBonusRollsItems(items)),\n ];\n}\n\nconst getPirateDataWithBaseClass = async (additionalItems = []) => {\n const baseClass = getRandomBaseClass(); \n const pirateData = await pirateFactory.rollScvmForClass(baseClass);\n const items = await getClassItems(selectedClass); \n const bonusItems = await getStartingBonusItems([...items, ...additionalItems]);\n pirateData.baseClass = `${baseClass.pack};${baseClass.name}`\n \n pirateData.items = pirateData.items\n .filter((item) => item.data.type !== 'class')\n .concat(items)\n .concat(additionalItems)\n .concat(bonusItems)\n .concat([selectedClass]);\n\n return pirateData;\n}\n\nconst animalDefaultData = {\n startingAbilityScoreFormula: '3d6',\n startingStrengthBonus: -2,\n startingAgilityBonus: -2,\n startingPresenceBonus: -2,\n startingToughnessBonus: -2,\n startingSpiritBonus: -2,\n luckDie: '1d4',\n flavorText: '',\n startingMacro: '',\n}\n\nconst createSentientAnimalData = async (data) => {\n return mergeObject(animalDefaultData, data, { insertKeys: true });\n}\n\nconst getMerfolkData = async (tallTaleItem) => {\n const pirateData = await getPirateDataWithBaseClass();\n pirateData.description = `${tallTaleItem.data.data.flavorText}
${pirateData.description}`\n pirateData.actorImg = tallTaleItem.data.img;\n\n const baseClass = pirateData.items.find((item) => item.type === 'class')\n baseClass.data.name = `${baseClass.data.name} (${tallTaleItem.data.name})`;\n return pirateData;\n}\n\nconst getAquaticMutantData = async (tallTaleItem) => {\n const aquaticMutantItem = (await pirateFactory.drawTableItem(tallTaleRollPack, aquaticMutantRollPackName))[0];\n const pirateData = await getPirateDataWithBaseClass([aquaticMutantItem]);\n pirateData.description = `${tallTaleItem.data.data.flavorText} (${aquaticMutantItem.data.name})
${pirateData.description}`\n\n if (aquaticMutantItem.data.name === 'Electric Eel') {\n pirateData.agility = parseInt(pirateData.agility, 10) + 1;\n }\n\n pirateData.actorImg = aquaticMutantItem.data.img;\n const baseClass = pirateData.items.find((item) => item.type === 'class')\n baseClass.data.name = `${baseClass.data.name} (${tallTaleItem.data.name})`;\n\n if(aquaticMutantItem.name === 'The Great Old One') {\n pirateData.items\n .filter((item) => item.type === 'invokable')\n .forEach((item) => {\n item.data.data.isEquipment = false;\n });\n }\n\n return pirateData;\n}\n\nconst getSentientAnimalData = async (tallTaleItem) => {\n const sentientAnimalItem = (await pirateFactory.drawTableItem(tallTaleRollPack, sentientAnimalRollPackName))[0];\n let data = {};\n switch (sentientAnimalItem.name) {\n case 'Foul Fowl':\n data = await createSentientAnimalData({\n startingSpiritBonus: +3,\n startingHitPoints: '1d4', \n }); \n break;\n case 'Jaguar':\n data = await createSentientAnimalData({\n startingAgilityBonus: +2,\n startingStrengthBonus: +2,\n startingHitPoints: '1d8', \n });\n break;\n case 'Crocodile':\n data = await createSentientAnimalData({\n startingToughnessBonus: +1,\n startingStrengthBonus: +3,\n startingHitPoints: '1d10', \n });\n break;\n case 'Bilge Rat':\n data = await createSentientAnimalData({\n startingToughnessBonus: +2,\n startingAgilityBonus: +3,\n startingHitPoints: '1d2', \n });\n break;\n case 'Lucky Parrot':\n data = await createSentientAnimalData({\n startingPresenceBonus: +2,\n startingAgilityBonus: +1,\n startingHitPoints: '1d2', \n luckDie: '1d6'\n });\n break;\n case 'Clever Monkey':\n data = await createSentientAnimalData({\n startingPresenceBonus: 0,\n startingAgilityBonus: +2,\n startingStrengthBonus: -1,\n startingHitPoints: '1d6', \n startingWeaponTableFormula: '1d10',\n });\n break; \n }\n \n selectedClass.data.data = data;\n selectedClass.data.name = `${selectedClass.data.name} (${tallTaleItem.data.name})`;\n selectedClass.data.img = sentientAnimalItem.data.img;\n selectedClass.data.data.startingRolls = sentientAnimalItem.data.data.startingBonusRolls;\n selectedClass.data.data.startingItems = sentientAnimalItem.data.data.startingBonusItems;\n selectedClass.data.data.flavorText = `${tallTaleItem.data.data.flavorText} (${sentientAnimalItem.data.name})`\n\n const pirateData = await pirateFactory.rollScvmForClass(selectedClass);\n\n if(sentientAnimalItem.name === 'Foul Fowl') {\n pirateData.items\n .filter((item) => item.type === 'invokable')\n .forEach((item) => {\n item.data.data.isEquipment = false;\n });\n }\n\n pirateData.items = pirateData.items.concat([sentientAnimalItem]);\n return pirateData;\n}\n\n\nconst tallTaleItem = (await pirateFactory.drawTableItem(tallTaleRollPack, tallTaleRollPackName))[0];\n// const tallTaleItem = await pirateFactory.findCompendiumItem('pirateborg.class-tall-tale', 'Sentient Animal')\nlet pirateData = {};\n\nswitch (tallTaleItem.name) {\n case 'Merfolk':\n pirateData = await getMerfolkData(tallTaleItem);\n break;\n case 'Aquatic Mutant':\n pirateData = await getAquaticMutantData(tallTaleItem);\n break;\n case 'Sentient Animal':\n pirateData = await getSentientAnimalData(tallTaleItem);\n break;\n}\n\npirateData.items = pirateData.items.concat([tallTaleItem])\n\nif (actor) {\n await pirateFactory.updateActorWithScvm(actor, pirateData);\n} else {\n await pirateFactory.createActorWithScvm(pirateData);\n}","folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{"core":{"sourceId":"Macro.JMLpUPK7oJ10cb4A"}}} diff --git a/packs/rolls-tall-tale.db b/packs/rolls-tall-tale.db index e69de29b..64f628ba 100755 --- a/packs/rolls-tall-tale.db +++ b/packs/rolls-tall-tale.db @@ -0,0 +1,41 @@ +{"_id":"4ZffqELXxRNJXjNM","name":"Tall Tale","img":"icons/svg/d20-grey.svg","results":[],"replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"xtzyxuefd8z3xVNG","name":"Aquatic Mutant","img":"icons/svg/d20-grey.svg","results":[],"replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"9lsuw5ZvjQ9CDnXt","name":"Sentient Animal","img":"icons/svg/d20-grey.svg","results":[],"replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"4ZffqELXxRNJXjNM","name":"Tall Tale","img":"icons/svg/d20-grey.svg","description":"","results":[],"formula":"","replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"4ZffqELXxRNJXjNM","name":"Tall Tale","img":"icons/svg/d20-grey.svg","results":[{"_id":"7rohXK22iPe0pmX4","type":2,"text":"Merfolk","img":"systems/pirateborg/icons/classes/tall-tale/merfolk.png","collection":"pirateborg.class-tall-tale","resultId":"36B5BJPdwYbBQutL","weight":1,"range":[1,1],"drawn":false,"flags":{}}],"replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"4ZffqELXxRNJXjNM","name":"Tall Tale","img":"icons/svg/d20-grey.svg","description":"","results":[{"_id":"7rohXK22iPe0pmX4","type":2,"text":"Merfolk","img":"systems/pirateborg/icons/classes/tall-tale/merfolk.png","collection":"pirateborg.class-tall-tale","resultId":"36B5BJPdwYbBQutL","weight":1,"range":[1,1],"drawn":false,"flags":{},"rangeL":1,"rangeH":1}],"formula":"","replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"4ZffqELXxRNJXjNM","name":"Tall Tale","img":"icons/svg/d20-grey.svg","results":[{"_id":"7rohXK22iPe0pmX4","type":2,"text":"Merfolk","img":"systems/pirateborg/icons/classes/tall-tale/merfolk.png","collection":"pirateborg.class-tall-tale","resultId":"36B5BJPdwYbBQutL","weight":1,"range":[1,1],"drawn":false,"flags":{},"rangeL":1,"rangeH":1},{"_id":"lWpnCmIwUnMMmNIq","type":2,"text":"Aquatic Mutant","img":"systems/pirateborg/icons/classes/tall-tale/aquatic-mutant.png","collection":"pirateborg.class-tall-tale","resultId":"bI48oC7ecHauJXnZ","weight":1,"range":[2,2],"drawn":false,"flags":{}}],"replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"4ZffqELXxRNJXjNM","name":"Tall Tale","img":"icons/svg/d20-grey.svg","description":"","results":[{"_id":"7rohXK22iPe0pmX4","type":2,"text":"Merfolk","img":"systems/pirateborg/icons/classes/tall-tale/merfolk.png","collection":"pirateborg.class-tall-tale","resultId":"36B5BJPdwYbBQutL","weight":1,"range":[1,1],"drawn":false,"flags":{},"rangeL":1,"rangeH":1},{"_id":"lWpnCmIwUnMMmNIq","type":2,"text":"Aquatic Mutant","img":"systems/pirateborg/icons/classes/tall-tale/aquatic-mutant.png","collection":"pirateborg.class-tall-tale","resultId":"bI48oC7ecHauJXnZ","weight":1,"range":[2,2],"drawn":false,"flags":{},"rangeL":2,"rangeH":2}],"formula":"","replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"4ZffqELXxRNJXjNM","name":"Tall Tale","img":"icons/svg/d20-grey.svg","results":[{"_id":"7rohXK22iPe0pmX4","type":2,"text":"Merfolk","img":"systems/pirateborg/icons/classes/tall-tale/merfolk.png","collection":"pirateborg.class-tall-tale","resultId":"36B5BJPdwYbBQutL","weight":1,"range":[1,1],"drawn":false,"flags":{},"rangeL":1,"rangeH":1},{"_id":"lWpnCmIwUnMMmNIq","type":2,"text":"Aquatic Mutant","img":"systems/pirateborg/icons/classes/tall-tale/aquatic-mutant.png","collection":"pirateborg.class-tall-tale","resultId":"bI48oC7ecHauJXnZ","weight":1,"range":[2,2],"drawn":false,"flags":{},"rangeL":2,"rangeH":2},{"_id":"7pEiNp0ui3QXF3IF","type":2,"text":"Sentient Animal","img":"systems/pirateborg/icons/classes/tall-tale/sentient-animal.png","collection":"pirateborg.class-tall-tale","resultId":"3cyYeSPQD1dj3AAC","weight":1,"range":[3,3],"drawn":false,"flags":{}}],"replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"xtzyxuefd8z3xVNG","name":"Aquatic Mutant","img":"icons/svg/d20-grey.svg","description":"","results":[],"formula":"","replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"xtzyxuefd8z3xVNG","name":"Aquatic Mutant","img":"icons/svg/d20-grey.svg","results":[{"_id":"T0NNLKWrj1edVZDQ","type":2,"text":"Anglerfish","img":"systems/pirateborg/icons/classes/tall-tale/angler-fish.png","collection":"pirateborg.class-tall-tale","resultId":"lt6FGtfR0faT7qR4","weight":1,"range":[1,1],"drawn":false,"flags":{}}],"replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"xtzyxuefd8z3xVNG","name":"Aquatic Mutant","img":"icons/svg/d20-grey.svg","description":"","results":[{"_id":"T0NNLKWrj1edVZDQ","type":2,"text":"Anglerfish","img":"systems/pirateborg/icons/classes/tall-tale/angler-fish.png","collection":"pirateborg.class-tall-tale","resultId":"lt6FGtfR0faT7qR4","weight":1,"range":[1,1],"drawn":false,"flags":{},"rangeL":1,"rangeH":1}],"formula":"","replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"xtzyxuefd8z3xVNG","name":"Aquatic Mutant","img":"icons/svg/d20-grey.svg","results":[{"_id":"T0NNLKWrj1edVZDQ","type":2,"text":"Anglerfish","img":"systems/pirateborg/icons/classes/tall-tale/angler-fish.png","collection":"pirateborg.class-tall-tale","resultId":"lt6FGtfR0faT7qR4","weight":1,"range":[1,1],"drawn":false,"flags":{},"rangeL":1,"rangeH":1},{"_id":"vMZDtDLoYgUw5aQJ","type":2,"text":"Crab","img":"systems/pirateborg/icons/classes/tall-tale/crab.png","collection":"pirateborg.class-tall-tale","resultId":"WsNJPvaU4ZhZJ1MY","weight":1,"range":[2,2],"drawn":false,"flags":{}}],"replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"xtzyxuefd8z3xVNG","name":"Aquatic Mutant","img":"icons/svg/d20-grey.svg","description":"","results":[{"_id":"T0NNLKWrj1edVZDQ","type":2,"text":"Anglerfish","img":"systems/pirateborg/icons/classes/tall-tale/angler-fish.png","collection":"pirateborg.class-tall-tale","resultId":"lt6FGtfR0faT7qR4","weight":1,"range":[1,1],"drawn":false,"flags":{},"rangeL":1,"rangeH":1},{"_id":"vMZDtDLoYgUw5aQJ","type":2,"text":"Crab","img":"systems/pirateborg/icons/classes/tall-tale/crab.png","collection":"pirateborg.class-tall-tale","resultId":"WsNJPvaU4ZhZJ1MY","weight":1,"range":[2,2],"drawn":false,"flags":{},"rangeL":2,"rangeH":2}],"formula":"","replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"xtzyxuefd8z3xVNG","name":"Aquatic Mutant","img":"icons/svg/d20-grey.svg","results":[{"_id":"T0NNLKWrj1edVZDQ","type":2,"text":"Anglerfish","img":"systems/pirateborg/icons/classes/tall-tale/angler-fish.png","collection":"pirateborg.class-tall-tale","resultId":"lt6FGtfR0faT7qR4","weight":1,"range":[1,1],"drawn":false,"flags":{},"rangeL":1,"rangeH":1},{"_id":"vMZDtDLoYgUw5aQJ","type":2,"text":"Crab","img":"systems/pirateborg/icons/classes/tall-tale/crab.png","collection":"pirateborg.class-tall-tale","resultId":"WsNJPvaU4ZhZJ1MY","weight":1,"range":[2,2],"drawn":false,"flags":{},"rangeL":2,"rangeH":2},{"_id":"I3OO29lcQui7lr3F","type":2,"text":"Jellyfish","img":"systems/pirateborg/icons/classes/tall-tale/jellyfish.png","collection":"pirateborg.class-tall-tale","resultId":"tzRkbIPOTs3NZTho","weight":1,"range":[3,3],"drawn":false,"flags":{}}],"replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"xtzyxuefd8z3xVNG","name":"Aquatic Mutant","img":"icons/svg/d20-grey.svg","description":"","results":[{"_id":"T0NNLKWrj1edVZDQ","type":2,"text":"Anglerfish","img":"systems/pirateborg/icons/classes/tall-tale/angler-fish.png","collection":"pirateborg.class-tall-tale","resultId":"lt6FGtfR0faT7qR4","weight":1,"range":[1,1],"drawn":false,"flags":{},"rangeL":1,"rangeH":1},{"_id":"vMZDtDLoYgUw5aQJ","type":2,"text":"Crab","img":"systems/pirateborg/icons/classes/tall-tale/crab.png","collection":"pirateborg.class-tall-tale","resultId":"WsNJPvaU4ZhZJ1MY","weight":1,"range":[2,2],"drawn":false,"flags":{},"rangeL":2,"rangeH":2},{"_id":"I3OO29lcQui7lr3F","type":2,"text":"Jellyfish","img":"systems/pirateborg/icons/classes/tall-tale/jellyfish.png","collection":"pirateborg.class-tall-tale","resultId":"tzRkbIPOTs3NZTho","weight":1,"range":[3,3],"drawn":false,"flags":{},"rangeL":3,"rangeH":3}],"formula":"","replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"xtzyxuefd8z3xVNG","name":"Aquatic Mutant","img":"icons/svg/d20-grey.svg","results":[{"_id":"T0NNLKWrj1edVZDQ","type":2,"text":"Anglerfish","img":"systems/pirateborg/icons/classes/tall-tale/angler-fish.png","collection":"pirateborg.class-tall-tale","resultId":"lt6FGtfR0faT7qR4","weight":1,"range":[1,1],"drawn":false,"flags":{},"rangeL":1,"rangeH":1},{"_id":"vMZDtDLoYgUw5aQJ","type":2,"text":"Crab","img":"systems/pirateborg/icons/classes/tall-tale/crab.png","collection":"pirateborg.class-tall-tale","resultId":"WsNJPvaU4ZhZJ1MY","weight":1,"range":[2,2],"drawn":false,"flags":{},"rangeL":2,"rangeH":2},{"_id":"I3OO29lcQui7lr3F","type":2,"text":"Jellyfish","img":"systems/pirateborg/icons/classes/tall-tale/jellyfish.png","collection":"pirateborg.class-tall-tale","resultId":"tzRkbIPOTs3NZTho","weight":1,"range":[3,3],"drawn":false,"flags":{},"rangeL":3,"rangeH":3},{"_id":"BbPVOocPCHeNmokD","type":2,"text":"Octopus","img":"systems/pirateborg/icons/classes/tall-tale/octopus.png","collection":"pirateborg.class-tall-tale","resultId":"tK62n6rppvk6QxPk","weight":1,"range":[4,4],"drawn":false,"flags":{}}],"replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"xtzyxuefd8z3xVNG","name":"Aquatic Mutant","img":"icons/svg/d20-grey.svg","description":"","results":[{"_id":"T0NNLKWrj1edVZDQ","type":2,"text":"Anglerfish","img":"systems/pirateborg/icons/classes/tall-tale/angler-fish.png","collection":"pirateborg.class-tall-tale","resultId":"lt6FGtfR0faT7qR4","weight":1,"range":[1,1],"drawn":false,"flags":{},"rangeL":1,"rangeH":1},{"_id":"vMZDtDLoYgUw5aQJ","type":2,"text":"Crab","img":"systems/pirateborg/icons/classes/tall-tale/crab.png","collection":"pirateborg.class-tall-tale","resultId":"WsNJPvaU4ZhZJ1MY","weight":1,"range":[2,2],"drawn":false,"flags":{},"rangeL":2,"rangeH":2},{"_id":"I3OO29lcQui7lr3F","type":2,"text":"Jellyfish","img":"systems/pirateborg/icons/classes/tall-tale/jellyfish.png","collection":"pirateborg.class-tall-tale","resultId":"tzRkbIPOTs3NZTho","weight":1,"range":[3,3],"drawn":false,"flags":{},"rangeL":3,"rangeH":3},{"_id":"BbPVOocPCHeNmokD","type":2,"text":"Octopus","img":"systems/pirateborg/icons/classes/tall-tale/octopus.png","collection":"pirateborg.class-tall-tale","resultId":"tK62n6rppvk6QxPk","weight":1,"range":[4,4],"drawn":false,"flags":{},"rangeL":4,"rangeH":4}],"formula":"","replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"xtzyxuefd8z3xVNG","name":"Aquatic Mutant","img":"icons/svg/d20-grey.svg","results":[{"_id":"T0NNLKWrj1edVZDQ","type":2,"text":"Anglerfish","img":"systems/pirateborg/icons/classes/tall-tale/angler-fish.png","collection":"pirateborg.class-tall-tale","resultId":"lt6FGtfR0faT7qR4","weight":1,"range":[1,1],"drawn":false,"flags":{},"rangeL":1,"rangeH":1},{"_id":"vMZDtDLoYgUw5aQJ","type":2,"text":"Crab","img":"systems/pirateborg/icons/classes/tall-tale/crab.png","collection":"pirateborg.class-tall-tale","resultId":"WsNJPvaU4ZhZJ1MY","weight":1,"range":[2,2],"drawn":false,"flags":{},"rangeL":2,"rangeH":2},{"_id":"I3OO29lcQui7lr3F","type":2,"text":"Jellyfish","img":"systems/pirateborg/icons/classes/tall-tale/jellyfish.png","collection":"pirateborg.class-tall-tale","resultId":"tzRkbIPOTs3NZTho","weight":1,"range":[3,3],"drawn":false,"flags":{},"rangeL":3,"rangeH":3},{"_id":"BbPVOocPCHeNmokD","type":2,"text":"Octopus","img":"systems/pirateborg/icons/classes/tall-tale/octopus.png","collection":"pirateborg.class-tall-tale","resultId":"tK62n6rppvk6QxPk","weight":1,"range":[4,4],"drawn":false,"flags":{},"rangeL":4,"rangeH":4},{"_id":"tTvidlvHWJHuHc9x","type":2,"text":"Sea Turtle","img":"systems/pirateborg/icons/classes/tall-tale/sea-turtle.png","collection":"pirateborg.class-tall-tale","resultId":"zmF3NfJi9qwNzNhT","weight":1,"range":[5,5],"drawn":false,"flags":{}}],"replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"xtzyxuefd8z3xVNG","name":"Aquatic Mutant","img":"icons/svg/d20-grey.svg","description":"","results":[{"_id":"T0NNLKWrj1edVZDQ","type":2,"text":"Anglerfish","img":"systems/pirateborg/icons/classes/tall-tale/angler-fish.png","collection":"pirateborg.class-tall-tale","resultId":"lt6FGtfR0faT7qR4","weight":1,"range":[1,1],"drawn":false,"flags":{},"rangeL":1,"rangeH":1},{"_id":"vMZDtDLoYgUw5aQJ","type":2,"text":"Crab","img":"systems/pirateborg/icons/classes/tall-tale/crab.png","collection":"pirateborg.class-tall-tale","resultId":"WsNJPvaU4ZhZJ1MY","weight":1,"range":[2,2],"drawn":false,"flags":{},"rangeL":2,"rangeH":2},{"_id":"I3OO29lcQui7lr3F","type":2,"text":"Jellyfish","img":"systems/pirateborg/icons/classes/tall-tale/jellyfish.png","collection":"pirateborg.class-tall-tale","resultId":"tzRkbIPOTs3NZTho","weight":1,"range":[3,3],"drawn":false,"flags":{},"rangeL":3,"rangeH":3},{"_id":"BbPVOocPCHeNmokD","type":2,"text":"Octopus","img":"systems/pirateborg/icons/classes/tall-tale/octopus.png","collection":"pirateborg.class-tall-tale","resultId":"tK62n6rppvk6QxPk","weight":1,"range":[4,4],"drawn":false,"flags":{},"rangeL":4,"rangeH":4},{"_id":"tTvidlvHWJHuHc9x","type":2,"text":"Sea Turtle","img":"systems/pirateborg/icons/classes/tall-tale/sea-turtle.png","collection":"pirateborg.class-tall-tale","resultId":"zmF3NfJi9qwNzNhT","weight":1,"range":[5,5],"drawn":false,"flags":{},"rangeL":5,"rangeH":5}],"formula":"","replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"xtzyxuefd8z3xVNG","name":"Aquatic Mutant","img":"icons/svg/d20-grey.svg","results":[{"_id":"T0NNLKWrj1edVZDQ","type":2,"text":"Anglerfish","img":"systems/pirateborg/icons/classes/tall-tale/angler-fish.png","collection":"pirateborg.class-tall-tale","resultId":"lt6FGtfR0faT7qR4","weight":1,"range":[1,1],"drawn":false,"flags":{},"rangeL":1,"rangeH":1},{"_id":"vMZDtDLoYgUw5aQJ","type":2,"text":"Crab","img":"systems/pirateborg/icons/classes/tall-tale/crab.png","collection":"pirateborg.class-tall-tale","resultId":"WsNJPvaU4ZhZJ1MY","weight":1,"range":[2,2],"drawn":false,"flags":{},"rangeL":2,"rangeH":2},{"_id":"I3OO29lcQui7lr3F","type":2,"text":"Jellyfish","img":"systems/pirateborg/icons/classes/tall-tale/jellyfish.png","collection":"pirateborg.class-tall-tale","resultId":"tzRkbIPOTs3NZTho","weight":1,"range":[3,3],"drawn":false,"flags":{},"rangeL":3,"rangeH":3},{"_id":"BbPVOocPCHeNmokD","type":2,"text":"Octopus","img":"systems/pirateborg/icons/classes/tall-tale/octopus.png","collection":"pirateborg.class-tall-tale","resultId":"tK62n6rppvk6QxPk","weight":1,"range":[4,4],"drawn":false,"flags":{},"rangeL":4,"rangeH":4},{"_id":"tTvidlvHWJHuHc9x","type":2,"text":"Sea Turtle","img":"systems/pirateborg/icons/classes/tall-tale/sea-turtle.png","collection":"pirateborg.class-tall-tale","resultId":"zmF3NfJi9qwNzNhT","weight":1,"range":[5,5],"drawn":false,"flags":{},"rangeL":5,"rangeH":5},{"_id":"5SIscfajseEVRWP6","type":2,"text":"Electric Eel","img":"systems/pirateborg/icons/classes/tall-tale/electric-eel.png","collection":"pirateborg.class-tall-tale","resultId":"GGf7XeEppvQ7j6BX","weight":1,"range":[6,6],"drawn":false,"flags":{}}],"replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"xtzyxuefd8z3xVNG","name":"Aquatic Mutant","img":"icons/svg/d20-grey.svg","description":"","results":[{"_id":"T0NNLKWrj1edVZDQ","type":2,"text":"Anglerfish","img":"systems/pirateborg/icons/classes/tall-tale/angler-fish.png","collection":"pirateborg.class-tall-tale","resultId":"lt6FGtfR0faT7qR4","weight":1,"range":[1,1],"drawn":false,"flags":{},"rangeL":1,"rangeH":1},{"_id":"vMZDtDLoYgUw5aQJ","type":2,"text":"Crab","img":"systems/pirateborg/icons/classes/tall-tale/crab.png","collection":"pirateborg.class-tall-tale","resultId":"WsNJPvaU4ZhZJ1MY","weight":1,"range":[2,2],"drawn":false,"flags":{},"rangeL":2,"rangeH":2},{"_id":"I3OO29lcQui7lr3F","type":2,"text":"Jellyfish","img":"systems/pirateborg/icons/classes/tall-tale/jellyfish.png","collection":"pirateborg.class-tall-tale","resultId":"tzRkbIPOTs3NZTho","weight":1,"range":[3,3],"drawn":false,"flags":{},"rangeL":3,"rangeH":3},{"_id":"BbPVOocPCHeNmokD","type":2,"text":"Octopus","img":"systems/pirateborg/icons/classes/tall-tale/octopus.png","collection":"pirateborg.class-tall-tale","resultId":"tK62n6rppvk6QxPk","weight":1,"range":[4,4],"drawn":false,"flags":{},"rangeL":4,"rangeH":4},{"_id":"tTvidlvHWJHuHc9x","type":2,"text":"Sea Turtle","img":"systems/pirateborg/icons/classes/tall-tale/sea-turtle.png","collection":"pirateborg.class-tall-tale","resultId":"zmF3NfJi9qwNzNhT","weight":1,"range":[5,5],"drawn":false,"flags":{},"rangeL":5,"rangeH":5},{"_id":"5SIscfajseEVRWP6","type":2,"text":"Electric Eel","img":"systems/pirateborg/icons/classes/tall-tale/electric-eel.png","collection":"pirateborg.class-tall-tale","resultId":"GGf7XeEppvQ7j6BX","weight":1,"range":[6,6],"drawn":false,"flags":{},"rangeL":6,"rangeH":6}],"formula":"","replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"xtzyxuefd8z3xVNG","name":"Aquatic Mutant","img":"icons/svg/d20-grey.svg","results":[{"_id":"T0NNLKWrj1edVZDQ","type":2,"text":"Anglerfish","img":"systems/pirateborg/icons/classes/tall-tale/angler-fish.png","collection":"pirateborg.class-tall-tale","resultId":"lt6FGtfR0faT7qR4","weight":1,"range":[1,1],"drawn":false,"flags":{},"rangeL":1,"rangeH":1},{"_id":"vMZDtDLoYgUw5aQJ","type":2,"text":"Crab","img":"systems/pirateborg/icons/classes/tall-tale/crab.png","collection":"pirateborg.class-tall-tale","resultId":"WsNJPvaU4ZhZJ1MY","weight":1,"range":[2,2],"drawn":false,"flags":{},"rangeL":2,"rangeH":2},{"_id":"I3OO29lcQui7lr3F","type":2,"text":"Jellyfish","img":"systems/pirateborg/icons/classes/tall-tale/jellyfish.png","collection":"pirateborg.class-tall-tale","resultId":"tzRkbIPOTs3NZTho","weight":1,"range":[3,3],"drawn":false,"flags":{},"rangeL":3,"rangeH":3},{"_id":"BbPVOocPCHeNmokD","type":2,"text":"Octopus","img":"systems/pirateborg/icons/classes/tall-tale/octopus.png","collection":"pirateborg.class-tall-tale","resultId":"tK62n6rppvk6QxPk","weight":1,"range":[4,4],"drawn":false,"flags":{},"rangeL":4,"rangeH":4},{"_id":"tTvidlvHWJHuHc9x","type":2,"text":"Sea Turtle","img":"systems/pirateborg/icons/classes/tall-tale/sea-turtle.png","collection":"pirateborg.class-tall-tale","resultId":"zmF3NfJi9qwNzNhT","weight":1,"range":[5,5],"drawn":false,"flags":{},"rangeL":5,"rangeH":5},{"_id":"5SIscfajseEVRWP6","type":2,"text":"Electric Eel","img":"systems/pirateborg/icons/classes/tall-tale/electric-eel.png","collection":"pirateborg.class-tall-tale","resultId":"GGf7XeEppvQ7j6BX","weight":1,"range":[6,6],"drawn":false,"flags":{},"rangeL":6,"rangeH":6},{"_id":"asrUXFBC98fCnoZt","type":2,"text":"Shark","img":"systems/pirateborg/icons/classes/tall-tale/shark.png","collection":"pirateborg.class-tall-tale","resultId":"eFihUJ3xVpEWIlhu","weight":1,"range":[7,7],"drawn":false,"flags":{}}],"replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"xtzyxuefd8z3xVNG","name":"Aquatic Mutant","img":"icons/svg/d20-grey.svg","description":"","results":[{"_id":"T0NNLKWrj1edVZDQ","type":2,"text":"Anglerfish","img":"systems/pirateborg/icons/classes/tall-tale/angler-fish.png","collection":"pirateborg.class-tall-tale","resultId":"lt6FGtfR0faT7qR4","weight":1,"range":[1,1],"drawn":false,"flags":{},"rangeL":1,"rangeH":1},{"_id":"vMZDtDLoYgUw5aQJ","type":2,"text":"Crab","img":"systems/pirateborg/icons/classes/tall-tale/crab.png","collection":"pirateborg.class-tall-tale","resultId":"WsNJPvaU4ZhZJ1MY","weight":1,"range":[2,2],"drawn":false,"flags":{},"rangeL":2,"rangeH":2},{"_id":"I3OO29lcQui7lr3F","type":2,"text":"Jellyfish","img":"systems/pirateborg/icons/classes/tall-tale/jellyfish.png","collection":"pirateborg.class-tall-tale","resultId":"tzRkbIPOTs3NZTho","weight":1,"range":[3,3],"drawn":false,"flags":{},"rangeL":3,"rangeH":3},{"_id":"BbPVOocPCHeNmokD","type":2,"text":"Octopus","img":"systems/pirateborg/icons/classes/tall-tale/octopus.png","collection":"pirateborg.class-tall-tale","resultId":"tK62n6rppvk6QxPk","weight":1,"range":[4,4],"drawn":false,"flags":{},"rangeL":4,"rangeH":4},{"_id":"tTvidlvHWJHuHc9x","type":2,"text":"Sea Turtle","img":"systems/pirateborg/icons/classes/tall-tale/sea-turtle.png","collection":"pirateborg.class-tall-tale","resultId":"zmF3NfJi9qwNzNhT","weight":1,"range":[5,5],"drawn":false,"flags":{},"rangeL":5,"rangeH":5},{"_id":"5SIscfajseEVRWP6","type":2,"text":"Electric Eel","img":"systems/pirateborg/icons/classes/tall-tale/electric-eel.png","collection":"pirateborg.class-tall-tale","resultId":"GGf7XeEppvQ7j6BX","weight":1,"range":[6,6],"drawn":false,"flags":{},"rangeL":6,"rangeH":6},{"_id":"asrUXFBC98fCnoZt","type":2,"text":"Shark","img":"systems/pirateborg/icons/classes/tall-tale/shark.png","collection":"pirateborg.class-tall-tale","resultId":"eFihUJ3xVpEWIlhu","weight":1,"range":[7,7],"drawn":false,"flags":{},"rangeL":7,"rangeH":7}],"formula":"","replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"xtzyxuefd8z3xVNG","name":"Aquatic Mutant","img":"icons/svg/d20-grey.svg","results":[{"_id":"T0NNLKWrj1edVZDQ","type":2,"text":"Anglerfish","img":"systems/pirateborg/icons/classes/tall-tale/angler-fish.png","collection":"pirateborg.class-tall-tale","resultId":"lt6FGtfR0faT7qR4","weight":1,"range":[1,1],"drawn":false,"flags":{},"rangeL":1,"rangeH":1},{"_id":"vMZDtDLoYgUw5aQJ","type":2,"text":"Crab","img":"systems/pirateborg/icons/classes/tall-tale/crab.png","collection":"pirateborg.class-tall-tale","resultId":"WsNJPvaU4ZhZJ1MY","weight":1,"range":[2,2],"drawn":false,"flags":{},"rangeL":2,"rangeH":2},{"_id":"I3OO29lcQui7lr3F","type":2,"text":"Jellyfish","img":"systems/pirateborg/icons/classes/tall-tale/jellyfish.png","collection":"pirateborg.class-tall-tale","resultId":"tzRkbIPOTs3NZTho","weight":1,"range":[3,3],"drawn":false,"flags":{},"rangeL":3,"rangeH":3},{"_id":"BbPVOocPCHeNmokD","type":2,"text":"Octopus","img":"systems/pirateborg/icons/classes/tall-tale/octopus.png","collection":"pirateborg.class-tall-tale","resultId":"tK62n6rppvk6QxPk","weight":1,"range":[4,4],"drawn":false,"flags":{},"rangeL":4,"rangeH":4},{"_id":"tTvidlvHWJHuHc9x","type":2,"text":"Sea Turtle","img":"systems/pirateborg/icons/classes/tall-tale/sea-turtle.png","collection":"pirateborg.class-tall-tale","resultId":"zmF3NfJi9qwNzNhT","weight":1,"range":[5,5],"drawn":false,"flags":{},"rangeL":5,"rangeH":5},{"_id":"5SIscfajseEVRWP6","type":2,"text":"Electric Eel","img":"systems/pirateborg/icons/classes/tall-tale/electric-eel.png","collection":"pirateborg.class-tall-tale","resultId":"GGf7XeEppvQ7j6BX","weight":1,"range":[6,6],"drawn":false,"flags":{},"rangeL":6,"rangeH":6},{"_id":"asrUXFBC98fCnoZt","type":2,"text":"Shark","img":"systems/pirateborg/icons/classes/tall-tale/shark.png","collection":"pirateborg.class-tall-tale","resultId":"eFihUJ3xVpEWIlhu","weight":1,"range":[7,7],"drawn":false,"flags":{},"rangeL":7,"rangeH":7},{"_id":"jTBI01yBRe1EMGso","type":2,"text":"The Great Old One","img":"systems/pirateborg/icons/classes/tall-tale/the-great-old-one.png","collection":"pirateborg.class-tall-tale","resultId":"Q6As123ncIeUKQRI","weight":1,"range":[8,8],"drawn":false,"flags":{}}],"replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"9lsuw5ZvjQ9CDnXt","name":"Sentient Animal","img":"icons/svg/d20-grey.svg","description":"","results":[],"formula":"","replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"9lsuw5ZvjQ9CDnXt","name":"Sentient Animal","img":"icons/svg/d20-grey.svg","results":[{"_id":"pH84jajor42VlOmF","type":2,"text":"Foul Fowl","img":"systems/pirateborg/icons/classes/tall-tale/foul-fowl.png","collection":"pirateborg.class-tall-tale","resultId":"4qW6PHlQ23EX4jBd","weight":1,"range":[1,1],"drawn":false,"flags":{}}],"replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"9lsuw5ZvjQ9CDnXt","name":"Sentient Animal","img":"icons/svg/d20-grey.svg","description":"","results":[{"_id":"pH84jajor42VlOmF","type":2,"text":"Foul Fowl","img":"systems/pirateborg/icons/classes/tall-tale/foul-fowl.png","collection":"pirateborg.class-tall-tale","resultId":"4qW6PHlQ23EX4jBd","weight":1,"range":[1,1],"drawn":false,"flags":{},"rangeL":1,"rangeH":1}],"formula":"","replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"9lsuw5ZvjQ9CDnXt","name":"Sentient Animal","img":"icons/svg/d20-grey.svg","results":[{"_id":"pH84jajor42VlOmF","type":2,"text":"Foul Fowl","img":"systems/pirateborg/icons/classes/tall-tale/foul-fowl.png","collection":"pirateborg.class-tall-tale","resultId":"4qW6PHlQ23EX4jBd","weight":1,"range":[1,1],"drawn":false,"flags":{},"rangeL":1,"rangeH":1},{"_id":"WPSDCLExXWbfkp1x","type":2,"text":"Crocodile","img":"systems/pirateborg/icons/classes/tall-tale/crocodile.png","collection":"pirateborg.class-tall-tale","resultId":"a1dn6FUP6fy7N9r0","weight":1,"range":[2,2],"drawn":false,"flags":{}}],"replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"9lsuw5ZvjQ9CDnXt","name":"Sentient Animal","img":"icons/svg/d20-grey.svg","description":"","results":[{"_id":"pH84jajor42VlOmF","type":2,"text":"Foul Fowl","img":"systems/pirateborg/icons/classes/tall-tale/foul-fowl.png","collection":"pirateborg.class-tall-tale","resultId":"4qW6PHlQ23EX4jBd","weight":1,"range":[1,1],"drawn":false,"flags":{},"rangeL":1,"rangeH":1},{"_id":"WPSDCLExXWbfkp1x","type":2,"text":"Crocodile","img":"systems/pirateborg/icons/classes/tall-tale/crocodile.png","collection":"pirateborg.class-tall-tale","resultId":"a1dn6FUP6fy7N9r0","weight":1,"range":[2,2],"drawn":false,"flags":{},"rangeL":2,"rangeH":2}],"formula":"","replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"9lsuw5ZvjQ9CDnXt","name":"Sentient Animal","img":"icons/svg/d20-grey.svg","results":[{"_id":"pH84jajor42VlOmF","type":2,"text":"Foul Fowl","img":"systems/pirateborg/icons/classes/tall-tale/foul-fowl.png","collection":"pirateborg.class-tall-tale","resultId":"4qW6PHlQ23EX4jBd","weight":1,"range":[1,1],"drawn":false,"flags":{},"rangeL":1,"rangeH":1},{"_id":"WPSDCLExXWbfkp1x","type":2,"text":"Crocodile","img":"systems/pirateborg/icons/classes/tall-tale/crocodile.png","collection":"pirateborg.class-tall-tale","resultId":"a1dn6FUP6fy7N9r0","weight":1,"range":[2,2],"drawn":false,"flags":{},"rangeL":2,"rangeH":2},{"_id":"1DkN26585sntKtbV","type":2,"text":"Lucky Parrot","img":"systems/pirateborg/icons/classes/tall-tale/lucky-parrot.png","collection":"pirateborg.class-tall-tale","resultId":"sdTjTdmBYkJ4Ak97","weight":1,"range":[3,3],"drawn":false,"flags":{}}],"replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"9lsuw5ZvjQ9CDnXt","name":"Sentient Animal","img":"icons/svg/d20-grey.svg","description":"","results":[{"_id":"pH84jajor42VlOmF","type":2,"text":"Foul Fowl","img":"systems/pirateborg/icons/classes/tall-tale/foul-fowl.png","collection":"pirateborg.class-tall-tale","resultId":"4qW6PHlQ23EX4jBd","weight":1,"range":[1,1],"drawn":false,"flags":{},"rangeL":1,"rangeH":1},{"_id":"WPSDCLExXWbfkp1x","type":2,"text":"Crocodile","img":"systems/pirateborg/icons/classes/tall-tale/crocodile.png","collection":"pirateborg.class-tall-tale","resultId":"a1dn6FUP6fy7N9r0","weight":1,"range":[2,2],"drawn":false,"flags":{},"rangeL":2,"rangeH":2},{"_id":"1DkN26585sntKtbV","type":2,"text":"Lucky Parrot","img":"systems/pirateborg/icons/classes/tall-tale/lucky-parrot.png","collection":"pirateborg.class-tall-tale","resultId":"sdTjTdmBYkJ4Ak97","weight":1,"range":[3,3],"drawn":false,"flags":{},"rangeL":3,"rangeH":3}],"formula":"","replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"9lsuw5ZvjQ9CDnXt","name":"Sentient Animal","img":"icons/svg/d20-grey.svg","results":[{"_id":"pH84jajor42VlOmF","type":2,"text":"Foul Fowl","img":"systems/pirateborg/icons/classes/tall-tale/foul-fowl.png","collection":"pirateborg.class-tall-tale","resultId":"4qW6PHlQ23EX4jBd","weight":1,"range":[1,1],"drawn":false,"flags":{},"rangeL":1,"rangeH":1},{"_id":"WPSDCLExXWbfkp1x","type":2,"text":"Crocodile","img":"systems/pirateborg/icons/classes/tall-tale/crocodile.png","collection":"pirateborg.class-tall-tale","resultId":"a1dn6FUP6fy7N9r0","weight":1,"range":[2,2],"drawn":false,"flags":{},"rangeL":2,"rangeH":2},{"_id":"1DkN26585sntKtbV","type":2,"text":"Lucky Parrot","img":"systems/pirateborg/icons/classes/tall-tale/lucky-parrot.png","collection":"pirateborg.class-tall-tale","resultId":"sdTjTdmBYkJ4Ak97","weight":1,"range":[3,3],"drawn":false,"flags":{},"rangeL":3,"rangeH":3},{"_id":"Ezq3rVrnLRSQUchw","type":2,"text":"Jaguar","img":"systems/pirateborg/icons/classes/tall-tale/jaguar.png","collection":"pirateborg.class-tall-tale","resultId":"iDVD29wjXnI9oDBf","weight":1,"range":[4,4],"drawn":false,"flags":{}}],"replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"9lsuw5ZvjQ9CDnXt","name":"Sentient Animal","img":"icons/svg/d20-grey.svg","description":"","results":[{"_id":"pH84jajor42VlOmF","type":2,"text":"Foul Fowl","img":"systems/pirateborg/icons/classes/tall-tale/foul-fowl.png","collection":"pirateborg.class-tall-tale","resultId":"4qW6PHlQ23EX4jBd","weight":1,"range":[1,1],"drawn":false,"flags":{},"rangeL":1,"rangeH":1},{"_id":"WPSDCLExXWbfkp1x","type":2,"text":"Crocodile","img":"systems/pirateborg/icons/classes/tall-tale/crocodile.png","collection":"pirateborg.class-tall-tale","resultId":"a1dn6FUP6fy7N9r0","weight":1,"range":[2,2],"drawn":false,"flags":{},"rangeL":2,"rangeH":2},{"_id":"1DkN26585sntKtbV","type":2,"text":"Lucky Parrot","img":"systems/pirateborg/icons/classes/tall-tale/lucky-parrot.png","collection":"pirateborg.class-tall-tale","resultId":"sdTjTdmBYkJ4Ak97","weight":1,"range":[3,3],"drawn":false,"flags":{},"rangeL":3,"rangeH":3},{"_id":"Ezq3rVrnLRSQUchw","type":2,"text":"Jaguar","img":"systems/pirateborg/icons/classes/tall-tale/jaguar.png","collection":"pirateborg.class-tall-tale","resultId":"iDVD29wjXnI9oDBf","weight":1,"range":[4,4],"drawn":false,"flags":{},"rangeL":4,"rangeH":4}],"formula":"","replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"9lsuw5ZvjQ9CDnXt","name":"Sentient Animal","img":"icons/svg/d20-grey.svg","results":[{"_id":"pH84jajor42VlOmF","type":2,"text":"Foul Fowl","img":"systems/pirateborg/icons/classes/tall-tale/foul-fowl.png","collection":"pirateborg.class-tall-tale","resultId":"4qW6PHlQ23EX4jBd","weight":1,"range":[1,1],"drawn":false,"flags":{},"rangeL":1,"rangeH":1},{"_id":"WPSDCLExXWbfkp1x","type":2,"text":"Crocodile","img":"systems/pirateborg/icons/classes/tall-tale/crocodile.png","collection":"pirateborg.class-tall-tale","resultId":"a1dn6FUP6fy7N9r0","weight":1,"range":[2,2],"drawn":false,"flags":{},"rangeL":2,"rangeH":2},{"_id":"1DkN26585sntKtbV","type":2,"text":"Lucky Parrot","img":"systems/pirateborg/icons/classes/tall-tale/lucky-parrot.png","collection":"pirateborg.class-tall-tale","resultId":"sdTjTdmBYkJ4Ak97","weight":1,"range":[3,3],"drawn":false,"flags":{},"rangeL":3,"rangeH":3},{"_id":"Ezq3rVrnLRSQUchw","type":2,"text":"Jaguar","img":"systems/pirateborg/icons/classes/tall-tale/jaguar.png","collection":"pirateborg.class-tall-tale","resultId":"iDVD29wjXnI9oDBf","weight":1,"range":[4,4],"drawn":false,"flags":{},"rangeL":4,"rangeH":4},{"_id":"GyMUpnHo96jTcBoQ","type":2,"text":"Bilge Rat","img":"systems/pirateborg/icons/classes/tall-tale/bilge-rat.png","collection":"pirateborg.class-tall-tale","resultId":"C8LdpjrOpMpyZB98","weight":1,"range":[5,5],"drawn":false,"flags":{}}],"replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"9lsuw5ZvjQ9CDnXt","name":"Sentient Animal","img":"icons/svg/d20-grey.svg","description":"","results":[{"_id":"pH84jajor42VlOmF","type":2,"text":"Foul Fowl","img":"systems/pirateborg/icons/classes/tall-tale/foul-fowl.png","collection":"pirateborg.class-tall-tale","resultId":"4qW6PHlQ23EX4jBd","weight":1,"range":[1,1],"drawn":false,"flags":{},"rangeL":1,"rangeH":1},{"_id":"WPSDCLExXWbfkp1x","type":2,"text":"Crocodile","img":"systems/pirateborg/icons/classes/tall-tale/crocodile.png","collection":"pirateborg.class-tall-tale","resultId":"a1dn6FUP6fy7N9r0","weight":1,"range":[2,2],"drawn":false,"flags":{},"rangeL":2,"rangeH":2},{"_id":"1DkN26585sntKtbV","type":2,"text":"Lucky Parrot","img":"systems/pirateborg/icons/classes/tall-tale/lucky-parrot.png","collection":"pirateborg.class-tall-tale","resultId":"sdTjTdmBYkJ4Ak97","weight":1,"range":[3,3],"drawn":false,"flags":{},"rangeL":3,"rangeH":3},{"_id":"Ezq3rVrnLRSQUchw","type":2,"text":"Jaguar","img":"systems/pirateborg/icons/classes/tall-tale/jaguar.png","collection":"pirateborg.class-tall-tale","resultId":"iDVD29wjXnI9oDBf","weight":1,"range":[4,4],"drawn":false,"flags":{},"rangeL":4,"rangeH":4},{"_id":"GyMUpnHo96jTcBoQ","type":2,"text":"Bilge Rat","img":"systems/pirateborg/icons/classes/tall-tale/bilge-rat.png","collection":"pirateborg.class-tall-tale","resultId":"C8LdpjrOpMpyZB98","weight":1,"range":[5,5],"drawn":false,"flags":{},"rangeL":5,"rangeH":5}],"formula":"","replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"9lsuw5ZvjQ9CDnXt","name":"Sentient Animal","img":"icons/svg/d20-grey.svg","results":[{"_id":"pH84jajor42VlOmF","type":2,"text":"Foul Fowl","img":"systems/pirateborg/icons/classes/tall-tale/foul-fowl.png","collection":"pirateborg.class-tall-tale","resultId":"4qW6PHlQ23EX4jBd","weight":1,"range":[1,1],"drawn":false,"flags":{},"rangeL":1,"rangeH":1},{"_id":"WPSDCLExXWbfkp1x","type":2,"text":"Crocodile","img":"systems/pirateborg/icons/classes/tall-tale/crocodile.png","collection":"pirateborg.class-tall-tale","resultId":"a1dn6FUP6fy7N9r0","weight":1,"range":[2,2],"drawn":false,"flags":{},"rangeL":2,"rangeH":2},{"_id":"1DkN26585sntKtbV","type":2,"text":"Lucky Parrot","img":"systems/pirateborg/icons/classes/tall-tale/lucky-parrot.png","collection":"pirateborg.class-tall-tale","resultId":"sdTjTdmBYkJ4Ak97","weight":1,"range":[3,3],"drawn":false,"flags":{},"rangeL":3,"rangeH":3},{"_id":"Ezq3rVrnLRSQUchw","type":2,"text":"Jaguar","img":"systems/pirateborg/icons/classes/tall-tale/jaguar.png","collection":"pirateborg.class-tall-tale","resultId":"iDVD29wjXnI9oDBf","weight":1,"range":[4,4],"drawn":false,"flags":{},"rangeL":4,"rangeH":4},{"_id":"GyMUpnHo96jTcBoQ","type":2,"text":"Bilge Rat","img":"systems/pirateborg/icons/classes/tall-tale/bilge-rat.png","collection":"pirateborg.class-tall-tale","resultId":"C8LdpjrOpMpyZB98","weight":1,"range":[5,5],"drawn":false,"flags":{},"rangeL":5,"rangeH":5},{"_id":"mcFoGTVZvzJFETFR","type":2,"text":"Clever Monkey","img":"systems/pirateborg/icons/classes/tall-tale/clever-monkey.png","collection":"pirateborg.class-tall-tale","resultId":"yW11H9GNe9cMbgub","weight":1,"range":[6,6],"drawn":false,"flags":{}}],"replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"9lsuw5ZvjQ9CDnXt","name":"Sentient Animal","img":"icons/svg/d20-grey.svg","description":"","results":[{"_id":"pH84jajor42VlOmF","type":2,"text":"Foul Fowl","img":"systems/pirateborg/icons/classes/tall-tale/foul-fowl.png","collection":"pirateborg.class-tall-tale","resultId":"4qW6PHlQ23EX4jBd","weight":1,"range":[1,1],"drawn":false,"flags":{},"rangeL":1,"rangeH":1},{"_id":"WPSDCLExXWbfkp1x","type":2,"text":"Crocodile","img":"systems/pirateborg/icons/classes/tall-tale/crocodile.png","collection":"pirateborg.class-tall-tale","resultId":"a1dn6FUP6fy7N9r0","weight":1,"range":[2,2],"drawn":false,"flags":{},"rangeL":2,"rangeH":2},{"_id":"1DkN26585sntKtbV","type":2,"text":"Lucky Parrot","img":"systems/pirateborg/icons/classes/tall-tale/lucky-parrot.png","collection":"pirateborg.class-tall-tale","resultId":"sdTjTdmBYkJ4Ak97","weight":1,"range":[3,3],"drawn":false,"flags":{},"rangeL":3,"rangeH":3},{"_id":"Ezq3rVrnLRSQUchw","type":2,"text":"Jaguar","img":"systems/pirateborg/icons/classes/tall-tale/jaguar.png","collection":"pirateborg.class-tall-tale","resultId":"iDVD29wjXnI9oDBf","weight":1,"range":[4,4],"drawn":false,"flags":{},"rangeL":4,"rangeH":4},{"_id":"GyMUpnHo96jTcBoQ","type":2,"text":"Bilge Rat","img":"systems/pirateborg/icons/classes/tall-tale/bilge-rat.png","collection":"pirateborg.class-tall-tale","resultId":"C8LdpjrOpMpyZB98","weight":1,"range":[5,5],"drawn":false,"flags":{},"rangeL":5,"rangeH":5},{"_id":"mcFoGTVZvzJFETFR","type":2,"text":"Clever Monkey","img":"systems/pirateborg/icons/classes/tall-tale/clever-monkey.png","collection":"pirateborg.class-tall-tale","resultId":"yW11H9GNe9cMbgub","weight":1,"range":[6,6],"drawn":false,"flags":{},"rangeL":6,"rangeH":6}],"formula":"d6","replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"xtzyxuefd8z3xVNG","name":"Aquatic Mutant","img":"icons/svg/d20-grey.svg","description":"","results":[{"_id":"T0NNLKWrj1edVZDQ","type":2,"text":"Anglerfish","img":"systems/pirateborg/icons/classes/tall-tale/angler-fish.png","collection":"pirateborg.class-tall-tale","resultId":"lt6FGtfR0faT7qR4","weight":1,"range":[1,1],"drawn":false,"flags":{},"rangeL":1,"rangeH":1},{"_id":"vMZDtDLoYgUw5aQJ","type":2,"text":"Crab","img":"systems/pirateborg/icons/classes/tall-tale/crab.png","collection":"pirateborg.class-tall-tale","resultId":"WsNJPvaU4ZhZJ1MY","weight":1,"range":[2,2],"drawn":false,"flags":{},"rangeL":2,"rangeH":2},{"_id":"I3OO29lcQui7lr3F","type":2,"text":"Jellyfish","img":"systems/pirateborg/icons/classes/tall-tale/jellyfish.png","collection":"pirateborg.class-tall-tale","resultId":"tzRkbIPOTs3NZTho","weight":1,"range":[3,3],"drawn":false,"flags":{},"rangeL":3,"rangeH":3},{"_id":"BbPVOocPCHeNmokD","type":2,"text":"Octopus","img":"systems/pirateborg/icons/classes/tall-tale/octopus.png","collection":"pirateborg.class-tall-tale","resultId":"tK62n6rppvk6QxPk","weight":1,"range":[4,4],"drawn":false,"flags":{},"rangeL":4,"rangeH":4},{"_id":"tTvidlvHWJHuHc9x","type":2,"text":"Sea Turtle","img":"systems/pirateborg/icons/classes/tall-tale/sea-turtle.png","collection":"pirateborg.class-tall-tale","resultId":"zmF3NfJi9qwNzNhT","weight":1,"range":[5,5],"drawn":false,"flags":{},"rangeL":5,"rangeH":5},{"_id":"5SIscfajseEVRWP6","type":2,"text":"Electric Eel","img":"systems/pirateborg/icons/classes/tall-tale/electric-eel.png","collection":"pirateborg.class-tall-tale","resultId":"GGf7XeEppvQ7j6BX","weight":1,"range":[6,6],"drawn":false,"flags":{},"rangeL":6,"rangeH":6},{"_id":"asrUXFBC98fCnoZt","type":2,"text":"Shark","img":"systems/pirateborg/icons/classes/tall-tale/shark.png","collection":"pirateborg.class-tall-tale","resultId":"eFihUJ3xVpEWIlhu","weight":1,"range":[7,7],"drawn":false,"flags":{},"rangeL":7,"rangeH":7},{"_id":"jTBI01yBRe1EMGso","type":2,"text":"The Great Old One","img":"systems/pirateborg/icons/classes/tall-tale/the-great-old-one.png","collection":"pirateborg.class-tall-tale","resultId":"Q6As123ncIeUKQRI","weight":1,"range":[8,8],"drawn":false,"flags":{},"rangeL":8,"rangeH":8}],"formula":"d8","replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"9lsuw5ZvjQ9CDnXt","name":"Sentient Animal","img":"icons/svg/d20-grey.svg","description":"","results":[{"_id":"pH84jajor42VlOmF","type":2,"text":"Foul Fowl","img":"systems/pirateborg/icons/classes/tall-tale/foul-fowl.png","collection":"pirateborg.class-tall-tale","resultId":"4qW6PHlQ23EX4jBd","weight":1,"range":[1,1],"drawn":false,"flags":{},"rangeL":1,"rangeH":1},{"_id":"WPSDCLExXWbfkp1x","type":2,"text":"Crocodile","img":"systems/pirateborg/icons/classes/tall-tale/crocodile.png","collection":"pirateborg.class-tall-tale","resultId":"a1dn6FUP6fy7N9r0","weight":1,"range":[2,2],"drawn":false,"flags":{},"rangeL":2,"rangeH":2},{"_id":"1DkN26585sntKtbV","type":2,"text":"Lucky Parrot","img":"systems/pirateborg/icons/classes/tall-tale/lucky-parrot.png","collection":"pirateborg.class-tall-tale","resultId":"sdTjTdmBYkJ4Ak97","weight":1,"range":[3,3],"drawn":false,"flags":{},"rangeL":3,"rangeH":3},{"_id":"Ezq3rVrnLRSQUchw","type":2,"text":"Jaguar","img":"systems/pirateborg/icons/classes/tall-tale/jaguar.png","collection":"pirateborg.class-tall-tale","resultId":"iDVD29wjXnI9oDBf","weight":1,"range":[4,4],"drawn":false,"flags":{},"rangeL":4,"rangeH":4},{"_id":"GyMUpnHo96jTcBoQ","type":2,"text":"Bilge Rat","img":"systems/pirateborg/icons/classes/tall-tale/bilge-rat.png","collection":"pirateborg.class-tall-tale","resultId":"C8LdpjrOpMpyZB98","weight":1,"range":[5,5],"drawn":false,"flags":{},"rangeL":5,"rangeH":5},{"_id":"mcFoGTVZvzJFETFR","type":2,"text":"Clever Monkey","img":"systems/pirateborg/icons/classes/tall-tale/clever-monkey.png","collection":"pirateborg.class-tall-tale","resultId":"yW11H9GNe9cMbgub","weight":1,"range":[6,6],"drawn":false,"flags":{},"rangeL":6,"rangeH":6}],"formula":"d6","replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} +{"_id":"4ZffqELXxRNJXjNM","name":"Tall Tale","img":"icons/svg/d20-grey.svg","description":"","results":[{"_id":"7rohXK22iPe0pmX4","type":2,"text":"Merfolk","img":"systems/pirateborg/icons/classes/tall-tale/merfolk.png","collection":"pirateborg.class-tall-tale","resultId":"36B5BJPdwYbBQutL","weight":1,"range":[1,2],"drawn":false,"flags":{},"rangeL":1,"rangeH":2},{"_id":"lWpnCmIwUnMMmNIq","type":2,"text":"Aquatic Mutant","img":"systems/pirateborg/icons/classes/tall-tale/aquatic-mutant.png","collection":"pirateborg.class-tall-tale","resultId":"bI48oC7ecHauJXnZ","weight":1,"range":[3,4],"drawn":false,"flags":{},"rangeL":3,"rangeH":4},{"_id":"7pEiNp0ui3QXF3IF","type":2,"text":"Sentient Animal","img":"systems/pirateborg/icons/classes/tall-tale/sentient-animal.png","collection":"pirateborg.class-tall-tale","resultId":"3cyYeSPQD1dj3AAC","weight":1,"range":[5,6],"drawn":false,"flags":{},"rangeL":5,"rangeH":6}],"formula":"d6","replacement":true,"displayRoll":true,"folder":null,"sort":0,"permission":{"default":0,"pdXclp2r5tiEF79G":3},"flags":{}} diff --git a/scss/pirateborg/_character-sheet.scss b/scss/pirateborg/_character-sheet.scss index 17952c45..116f257f 100644 --- a/scss/pirateborg/_character-sheet.scss +++ b/scss/pirateborg/_character-sheet.scss @@ -17,6 +17,7 @@ flex: 1; display: flex; flex-direction: column; + overflow: hidden; .rest-buttons { display: flex; align-items: center; @@ -46,6 +47,8 @@ flex-direction: row; margin-bottom: 19px; margin-left: 0px; + align-items: stretch; + flex-wrap: nowrap; img.classimg { height: 24px; @@ -57,6 +60,12 @@ label.classname { font-family: var(--h3-font); font-size: 24px; + white-space: nowrap; + } + + label.item-base-class { + text-overflow: ellipsis; + overflow: hidden; } .item-controls { diff --git a/scss/pirateborg/_module-fixes.scss b/scss/pirateborg/_module-fixes.scss index a52cc53f..b63a0846 100644 --- a/scss/pirateborg/_module-fixes.scss +++ b/scss/pirateborg/_module-fixes.scss @@ -33,7 +33,6 @@ input[type="text"] { color: var(--foreground-color) !important; } - } button.dice-calculator--button { diff --git a/template.json b/template.json index c58ac203..118ede94 100644 --- a/template.json +++ b/template.json @@ -141,7 +141,8 @@ "actionMacro": "", "actionMacroLabel": "", "startingBonusItems": "", - "startingBonusRolls": "" + "startingBonusRolls": "", + "flavorText": "" }, "class": { "description": "", diff --git a/templates/actor/character-sheet.html b/templates/actor/character-sheet.html index ef2426ad..ca72d48f 100644 --- a/templates/actor/character-sheet.html +++ b/templates/actor/character-sheet.html @@ -11,7 +11,7 @@ {{!-- we are cheating a bit here, using the 'item' class usually used on LI elements, so we can get the item _id to be found by the common click handler --}}