Skip to content

Commit

Permalink
Merge pull request #13543 from morgdalaine/wilderfeast
Browse files Browse the repository at this point in the history
[New Sheet] Wilderfeast 🍽️
kfroll20 authored Nov 26, 2024
2 parents 20fb8f4 + 5fdd14c commit b92ddb9
Showing 21 changed files with 3,813 additions and 0 deletions.
7 changes: 7 additions & 0 deletions Wilderfeast/.prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"plugins": ["@prettier/plugin-pug"],
"pugAttributeSeparator": "as-needed",
"pugSortAttributes": "as-is",
"pugBracketSpacing": false,
"pugPrintWidth": 100
}
33 changes: 33 additions & 0 deletions Wilderfeast/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Welcome to Wilderfeast

![Version](https://img.shields.io/badge/version-1.0.0-blue.svg?cacheSeconds=2592000)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/license/MIT)


An unofficial Roll20 sheet for [Wilderfeast](https://horribleguild.com/us/product-category/roleplaying-games/wilderfeast) Tabletop RPG!

## Install

```sh
# Install all of the npm packages
$ npm install
```

## Usage

> [!WARNING]
> This sheet uses `pug` and SCSS to build the HTML and CSS files respectively. Please do not directly edit the HTML or CSS directly: it will be **wiped away** when the `npm` scripts are ran.
```sh
# Run the development environment
$ npm run dev

# Run final build and linting
$ npm run build
```

<a href='https://ko-fi.com/R5R54NXP1' target='_blank'><img height='20' style='border:0px;height:20px;' src='https://storage.ko-fi.com/cdn/brandasset/v2/kofi_symbol.png' border='0' alt='Buy Me a Coffee at ko-fi.com' /></a>
[![GitHub](https://img.shields.io/badge/@morgdalaine-whitesmoke?style=social&logo=github)](https://github.com/morgdalaine)
[![GitHub](https://img.shields.io/badge/@morgdalaine-whitesmoke?style=social&logo=discord)](https://discordapp.com/users/186973853011017729)

[^0]: This README was generated with ♥︎ by [readme-md-generator](https://github.com/kefranabg/readme-md-generator)
4 changes: 4 additions & 0 deletions Wilderfeast/assets/d20.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 4 additions & 0 deletions Wilderfeast/assets/d8.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
45 changes: 45 additions & 0 deletions Wilderfeast/biome.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
{
"$schema": "https://biomejs.dev/schemas/1.9.4/schema.json",
"vcs": {
"enabled": false,
"clientKind": "git",
"useIgnoreFile": false
},
"files": {
"ignoreUnknown": false,
"ignore": []
},
"formatter": {
"enabled": true,
"useEditorconfig": true,
"formatWithErrors": false,
"indentStyle": "space",
"indentWidth": 2,
"lineEnding": "lf",
"lineWidth": 100,
"attributePosition": "auto",
"bracketSpacing": false
},
"organizeImports": {
"enabled": true
},
"linter": {
"enabled": true,
"rules": {
"recommended": true
}
},
"javascript": {
"formatter": {
"arrowParentheses": "always",
"attributePosition": "auto",
"bracketSameLine": false,
"bracketSpacing": true,
"jsxQuoteStyle": "double",
"quoteProperties": "asNeeded",
"quoteStyle": "double",
"semicolons": "always",
"trailingCommas": "es5"
}
}
}
36 changes: 36 additions & 0 deletions Wilderfeast/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
{
"name": "wilderfeast",
"version": "1.0.0",
"author": "morgdalaine",
"scripts": {
"dev": "run-p dev:*",
"build": "run-s lint:pug compile:* i18n lint:biome",

"dev:sass": "npx sass ./src/scss/wilderfeast.scss:wilderfeast.css --watch --no-source-map --no-charset",
"dev:pug": "npx pug3 ./src/pug/wilderfeast.pug -w --out ./ --pretty",

"compile:sass": "npx sass ./src/scss/wilderfeast.scss:wilderfeast.css --no-source-map --no-charset",
"compile:pug": "npx pug3 ./src/pug/wilderfeast.pug --out ./ --pretty",
"compile:css": "npx postcss wilderfeast.css --output wilderfeast.css --use autoprefixer --verbose --no-map",

"i18n": "i18ntool -i wilderfeast.html -a > /dev/null",

"lint:biome": "npx @biomejs/biome check --write ./src",
"lint:pug": "npx prettier --write '**/*.pug' --plugin '@prettier/plugin-pug'"
},
"keywords": ["roll20"],
"license": "MIT",
"devDependencies": {
"@anduh/pug-cli": "^1.0.0-alpha8",
"@biomejs/biome": "1.9.4",
"@prettier/plugin-pug": "^3.2.0",
"autoprefixer": "^10.4.20",
"npm-run-all": "^4.1.5",
"postcss": "^8.4.49",
"postcss-cli": "^11.0.0",
"prettier": "^3.3.3",
"pug": "^3.0.3",
"sass": "^1.81.0",
"typescript": "^5.6.3"
}
}
9 changes: 9 additions & 0 deletions Wilderfeast/sheet.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"html": "wilderfeast.html",
"css": "wilderfeast.css",
"authors": "morgdalaine",
"roll20userid": "61327",
"preview": "wilderfeast.png",
"instructions": "The Unofficial Roll20 Wilderfeast TTRPG character sheet",
"useroptions": []
}
36 changes: 36 additions & 0 deletions Wilderfeast/src/js/constants.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
const STYLES = ["mighty", "precise", "swift", "tricky"];
const SKILLS = [
"assurance",
"display",
"shot",
"call",
"grab",
"strike",
"craft",
"hoard",
"study",
"cure",
"search",
"traversal",
];

const CONDITIONS = [
{ label: "Burned", name: "burned" },
{ label: "Caught", name: "caught" },
{ label: "Confused", name: "confused", min: 1 },
{ label: "Discordant", name: "discordant" },
{ label: "Expanded", name: "expanded" },
{ label: "Exposed", name: "exposed" },
{ label: "Fatigued", name: "fatigued", min: 1 },
{ label: "Frightened", name: "frightened", min: 1 },
{ label: "Invigorated", name: "invigorated", min: 1 },
{ label: "Hidden", name: "hidden" },
{ label: "Poisoned", name: "poisoned", min: 1 },
{ label: "Rehabilitating", name: "rehabilitating", min: 1, max: 6 },
{ label: "Rested", name: "rested", min: 1 },
{ label: "Stunned", name: "stunned", min: 1 },
{ label: "Wounded", name: "wounded", min: 1, max: 3 },
];
const CONDITIONS_REQUEST = CONDITIONS.flatMap((c) => [c.name, `${c.name}_level`]);

const MAX_FIELDS = ["hp", "tool_durability", "harmony"];
82 changes: 82 additions & 0 deletions Wilderfeast/src/js/dice.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
on("clicked:focus_up", async (eventInfo) => {
rollAction();
});
on("clicked:go_wild", async (eventInfo) => {
rollAction(true);
});

/**
*
* @param {string} template name of rolltemplate to use
* @param {object} properties key value pairs
* @param {function} callback startRoll callback function; should include `finishRoll()`
*/
const makeRoll = async (template, properties, callback) => {
const rollstring = createRollString(template, properties);
await startRoll(rollstring, callback);
};

/**
* Create roll string including whisper, template, and roll properties
* @param {string} template name of rolltemplate to use
* @param {object} properties key value pairs
* @returns finished roll string
*/
const createRollString = (template, properties) => {
const props = Object.entries(properties)
.map(([key, val]) => `{{${key}=${val}}}`)
.join("");

// return `@{wtype}&{template:${template}}${props}`;
return `&{template:${template}}${props}`;
};

const rollAction = async (wild = false) => {
getAttrs(
["style", "skill", "advantage", ...STYLES, ...SKILLS, ...CONDITIONS_REQUEST],
(attributes) => {
const styleName = attributes.style;
const skillName = attributes.skill;
const style = Number(attributes[styleName]) ?? 0;
const skill = Number(attributes[skillName]) ?? 0;

console.debug(attributes);
const properties = {};

const dic = {};
dic.action = getTranslationByKey("action") || "Action";
dic.frightened = getTranslationByKey("frightened") || "Frightened";

properties.character_name = "@{character_name}";
properties.style = `^{${styleName}}`;
properties.skill = `^{${skillName}} (+${skill})`;

const action_is = wild ? "wild" : "focus";
properties[action_is] = action_is;
properties.action_is = action_is;

properties.question = "[[?{Circumstances|Normal,0|Advantage,1|Disadvantage,-1}]]";

const dice = style - (wild ? 1 : 0);
for (const key of Array.from(Array(dice).keys(), (k) => k + 1)) {
properties[`roll_style${key}`] = "[[1d6]]";
}

const frightenedLevel =
attributes.frightened === "on" ? Number(attributes.frightened_level) : 0;
const frightenedMod =
frightenedLevel > 0 ? `+ ${-1 * frightenedLevel}[${dic.frightened}]` : "";
properties.roll_action = `[[1d${wild ? 20 : 8}[${dic.action}] ${frightenedMod}]]`;

makeRoll("action", properties, ({ rollId, results }) => {
finishRoll(rollId, results);

// const answer = Number(results.question.result);
// const circumstance = answer > 0 ? "advantage" : answer < 0 ? "disadvantage" : "";
// finishRoll(rollId, {
// [circumstance]: true,
// });
});
}
);
};
35 changes: 35 additions & 0 deletions Wilderfeast/src/js/eventhandlers.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// Handle conditions that affect other rolls
for (const condition of CONDITIONS) {
on(`change:${condition.name} change:${condition.name}_level`, (eventInfo) => {
getAttrs(CONDITIONS_REQUEST, (attributes) => {
const state = attributes[condition.name];
const level = state === "on" ? Number(attributes[`${condition.name}_level`]) : 0;

switch (condition.name) {
case "fatigued":
setAttrs({ hp_mod: -1 * level }, { silent: true });
break;

default:
break;
}
});
});
}

// Handle attributes with an underscore_max attribute
for (const field of MAX_FIELDS) {
on(`change:${field}`, (eventInfo) => {
if (eventInfo.sourceType !== "player") return;

getAttrs([field, `${field}_max`, `${field}_mod`], (attributes) => {
const current = Number(attributes[field]);
const max = Number(attributes[`${field}_max`]);
const mod = Number(attributes[`${field}_mod`]) || 0;

if (current > max + mod) {
setAttrs({ [field]: max + mod }, { silent: true });
}
});
});
}
90 changes: 90 additions & 0 deletions Wilderfeast/src/pug/rolltemplate.pug
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
- const DICE = Array.from(Array(10).keys(), (key) => `roll_style${key + 1}`);

mixin tags(array)
each tag in array
if (tag[0] === "^")
| {{#{tag}}}
else
| {{##{tag}}}
if block
block
each tag in array.reverse()
if (tag[0] === "^")
- tag = tag.slice(1);
| {{/#{tag}}}
else
| {{/#{tag}}}

mixin rollFunctions(array)
each tag in array
| {{##{tag}}}
if block
block
each tag in array.reverse()
| {{/#{tag}}}

mixin displayDie(die)
+rollFunctions([`rollBetween() ${die} 1 1`])
span.sheet-wf-style__face-1= `{{${die}}}`
+rollFunctions([`rollBetween() ${die} 2 2`])
span.sheet-wf-style__face-2= `{{${die}}}`
+rollFunctions([`rollBetween() ${die} 3 3`])
span.sheet-wf-style__face-3= `{{${die}}}`
+rollFunctions([`rollBetween() ${die} 4 4`])
span.sheet-wf-style__face-4= `{{${die}}}`
+rollFunctions([`rollBetween() ${die} 5 5`])
span.sheet-wf-style__face-5= `{{${die}}}`
+rollFunctions([`rollBetween() ${die} 6 20`])
span.sheet-wf-style__face-6= `{{${die}}}`

rolltemplate.sheet-rolltemplate-action
.sheet-wf-wrapper
.sheet-wf-header
+tags(["character_name"])
.sheet-wf-character-name
span {{character_name}}
+tags(["wild"])
.sheet-wf-go-wild
span(data-i18n="goes_wild") Goes&#10;Wild
+tags(["focus"])
.sheet-wf-focus-up
span(data-i18n="focuses_up") Focuses&#10;Up
.sheet-wf-circumstance
+rollFunctions(["rollBetween() question 1 1"])
span(data-i18n="advantage") Advantage!
+rollFunctions(["rollBetween() question -1 -1"])
span(data-i18n="disadvantage") Disadvantage!

.sheet-wf-style-and-skill
span.sheet-wf-header--style {{style}}
| &nbsp;
span.sheet-wf-header--skill {{skill}}

.sheet-wf-dice-tray
.sheet-wf-style
+rollFunctions(["rollBetween() question 1 1"])
.sheet-wf-style__roll--advantage
each die in DICE
+tags([die])
+displayDie(die)
+rollFunctions(["rollBetween() question 0 0"])
.sheet-wf-style__roll
each die in DICE
+tags([die])
+displayDie(die)
+rollFunctions(["rollBetween() question -1 -1"])
.sheet-wf-style__roll--disadvantage
each die in DICE
+tags([die])
+displayDie(die)

.sheet-wf-action(class="sheet-wf-action--{{action_is}}")
+rollFunctions(["rollBetween() roll_action 1 4"])
span.sheet-wf-action__roll--partial {{roll_action}}
span.sheet-wf-action__result(data-i18n="success_partial") Partial Success
+rollFunctions(["rollBetween() roll_action 5 7"])
span.sheet-wf-action__roll {{roll_action}}
span.sheet-wf-action__result(data-i18n="success_standard") Standard Success
+rollFunctions(["rollBetween() roll_action 8 20"])
span.sheet-wf-action__roll--critical {{roll_action}}
span.sheet-wf-action__result(data-i18n="success_critical") Critical Success
8 changes: 8 additions & 0 deletions Wilderfeast/src/pug/translations.pug
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
-
const TRANSLATIONS = {
"action": "Action",
}
div(style="display: none")
each key in Object.keys(TRANSLATIONS)
span(data-i18n=key)= TRANSLATIONS[key]
583 changes: 583 additions & 0 deletions Wilderfeast/src/pug/wilderfeast.pug

Large diffs are not rendered by default.

133 changes: 133 additions & 0 deletions Wilderfeast/src/scss/_reset.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
html {
box-sizing: border-box;
font-size: 12px;

.characterviewer,
.tab-content,
.sheetform,
.charactersheet {
box-sizing: border-box;
height: calc(100% - 1px);
}
}

.charsheet {
* {
box-sizing: border-box;
height: unset;
width: unset;
padding: unset;
margin: unset;

font-family: unset;
// font-size: unset;
// font-weight: unset;
// line-height: unset;

color: unset;
border: unset;
border-radius: unset;
background: unset;
background-color: unset;
text-shadow: unset;
box-shadow: unset;
}

// h1,
// h2,
// h3,
// h4,
// h5 {
// font-size: unset;
// line-height: unset;

// color: unset;
// }

p,
input,
input[type="number"],
textarea,
select,
button,
button[type="roll"],
button[type="action"],
label {
display: unset;
width: unset;
height: unset;
padding: unset;
margin-bottom: unset;

// font-family: unset;
font-size: unset;
font-weight: unset;
text-shadow: none;
line-height: unset;

color: unset;
border: unset;
border-radius: unset;
background: unset;
background-color: unset;
box-shadow: unset;
}

// button[type="roll"],
// button[type="action"] {
// &::before {
// display: none;
// }
// }

input[disabled],
select[disabled],
textarea[disabled],
input[readonly],
select[readonly],
textarea[readonly] {
background-color: unset;
border-color: unset;
}
}

.charsheet {
// * {
// font-size: 1rem;
// box-sizing: border-box;
// font-family: inherit;
// }

fieldset {
background: transparent;
}

span {
word-break: break-word;
}
}

input[type="number"] {
appearance: textfield;

&::-webkit-outer-spin-button,
&::-webkit-inner-spin-button {
appearance: none;
margin: 0;
}
}

.ui-dialog {
.largedialog {
padding: 0;
}

.charsheet {
padding: 0;

input[type="number"] {
width: unset;
max-width: 5rem;
}
}
}
254 changes: 254 additions & 0 deletions Wilderfeast/src/scss/_rolltemplate.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,254 @@
.sheet-rolltemplate {
&-action {
--dice-color: var(--color-navy);

position: relative;
background-color: var(--color-white);
padding: 0.5em;

.inlinerollresult.inlinerollresult {
position: relative;
background: transparent;
color: var(--dice-color);
font-family: var(--font-text-monospace);
border: none;
font-weight: 700;
line-height: 1;
vertical-align: middle;

&.fullcrit,
&.fullfail {
border: none;
}
}

.sheet-wf {
&-wrapper {
background-color: var(--color-white);
background-image: linear-gradient(
to right,
var(--color-parchment),
transparent,
var(--color-parchment)
);
border: 3px double var(--color-orange);
padding: 0 0.5em 0.5em;
}

&-header {
// Style and Skill
&--style {
text-transform: uppercase;
font-family: var(--font-text-header);
font-weight: 700;
color: var(--color-orange);
}

&--skill {
text-transform: uppercase;
font-family: var(--font-text-header);
font-weight: 700;
color: var(--color-navy);
}
}

&-character-name {
color: var(--color-navy);
margin-top: -0.75em;

span {
font-family: var(--font-text-title);
text-transform: uppercase;
background-color: var(--color-white);
padding: 0 0.5em;
font-weight: 700;
}

&__skill-style {
display: flex;
gap: 1em;
}
}

// Flags
&-go-wild,
&-focus-up {
position: absolute;
display: flex;
justify-content: end;
top: 0;
right: 0;
padding: 0.25em;
background-color: transparent;
background-image: linear-gradient(
to top right,
transparent 50% 50%,
var(--color-red) 100%
);
color: var(--color-white);
-webkit-text-stroke: 2px var(--color-red);

min-width: 5em;

span {
color: var(--color-white);
font-family: var(--font-text-header);
display: inline-block;
text-align: end;
white-space: break-spaces;
font-weight: 700;
text-transform: uppercase;

paint-order: stroke fill;
}
}

&-circumstance {
&:not(:has(> span)) {
display: none;
}

position: absolute;
display: flex;
justify-content: end;
bottom: 0;
left: 0;
padding: 0.25em;
background-color: transparent;
background-image: linear-gradient(
to bottom left,
transparent 50% 50%,
var(--color-navy) 100%
);
color: var(--color-white);
-webkit-text-stroke: 2px var(--color-navy);

min-width: 5em;

span {
color: var(--color-white);
font-family: var(--font-text-header);
display: inline-block;
text-align: end;
white-space: break-spaces;
font-weight: 700;
text-transform: uppercase;

paint-order: stroke fill;
}
}

&-dice-tray {
display: grid;
grid-template-columns: 4fr 1fr;
gap: 0.5em;
margin-top: 0.5em;

align-items: center;
}

&-action {
display: grid;
gap: 0.5em;
padding: 0.5em 1em;

background-color: var(--color-parchment);
border: 2px solid var(--color-orange);

text-align: center;

&__roll {
.inlinerollresult {
font-size: 2em;
}

&--partial {
@extend .sheet-wf-action__roll;
}

&--critical {
@extend .sheet-wf-action__roll;

&::after {
position: absolute;
content: "";
}
}
}

&__result {
font-family: var(--font-text-header);
font-size: 0.8em;
line-height: 1;
text-transform: uppercase;
text-align: center;
}
}

&-style {
&__roll {
display: flex;
flex-direction: row;
gap: 0.5em;

justify-content: center;
align-items: center;

.sheet-wf-style__face {
--dice-style: solid;

.inlinerollresult {
display: inline-block;

border: 2px var(--dice-style) var(--dice-color);
color: var(--color-navy);
width: 1.5em;
line-height: 1.5em;
aspect-ratio: 1;

padding: 0;

text-align: center;
vertical-align: middle;
}

&-1,
&-2,
&-3,
&-4,
&-5,
&-6 {
@extend .sheet-wf-style__face;
}

&-1,
&-2,
&-3,
&-4 {
--dice-color: var(--color-red);
--dice-style: dashed;
}
}

&--advantage {
@extend .sheet-wf-style__roll;

.sheet-wf-style__face-4 {
--dice-color: var(--color-navy);
--dice-style: solid;
}
}

&--disadvantage {
@extend .sheet-wf-style__roll;

.sheet-wf-style__face-5 {
--dice-color: var(--color-red);
--dice-style: dashed;
}
}
}
}
}
}
}
73 changes: 73 additions & 0 deletions Wilderfeast/src/scss/_tailwind.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
.wf {
// Tailwind
.flex {
display: flex;
gap: 0 0.25em;
}
.grid {
display: grid;
grid-template-rows: auto 1fr;
gap: 0 0.25em;
}

.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
border: 0;
}

.col-span-1 {
grid-column: span 1 / span 1;
}
.col-span-2 {
grid-column: span 2 / span 2;
}
.col-span-3 {
grid-column: span 3 / span 3;
}
.col-span-4 {
grid-column: span 4 / span 4;
}
.col-span-5 {
grid-column: span 5 / span 5;
}
.col-span-6 {
grid-column: span 6 / span 6;
}

@each $col in 2, 3, 4, 5, 6 {
.grid-cols-#{$col} {
grid-template-columns: repeat(#{$col}, minmax(0, 1fr));
}
}
.text-start {
text-align: start;
}
.text-center {
text-align: center;
}
.text-end {
text-align: end;
}
.text-justify {
text-align: justify;
}

.flex-row {
flex-direction: row;
}
.flex-row-reverse {
flex-direction: row-reverse;
}
.flex-col {
flex-direction: column;
}
.flex-col-reverse {
flex-direction: column-reverse;
}
}
598 changes: 598 additions & 0 deletions Wilderfeast/src/scss/wilderfeast.scss

Large diffs are not rendered by default.

156 changes: 156 additions & 0 deletions Wilderfeast/translation.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
{
"action": "Action",
"advantage": "Advantage!",
"ambition": "Ambition",
"ambition_placeholder": "What is the meal you want to eat most?",
"area": "Area",
"area_name": "Area Name",
"area_name_placeholder": "Area Name",
"assurance": "assurance",
"burned": "Burned",
"but_struggle_to_be": "But You Struggle to Be",
"call": "call",
"caught": "Caught",
"character_avatar": "Despite everything, it's still you.",
"character_name": "Name",
"choose_action_die_focus": "Add a d8 Action Die to your dice pool.",
"choose_action_die_wild": "Choose one of your TRAITS and describe how it helps you in this situation. Then, remove 1 Style Die and replace it with a d20 Action Die.",
"communities": "Communities",
"community_details": "Details",
"community_details_placeholder": "Details...",
"community_name": "Community",
"community_name_placeholder": "Community",
"conditions": "Conditions",
"confused": "Confused",
"connection": "Connection",
"connection_placeholder": "The two of you share a bond over this dish.",
"craft": "craft",
"cure": "cure",
"current": "Current",
"den": "Den",
"details": "Details",
"disadvantage": "Disadvantage!",
"discordant": "Discordant",
"display": "display",
"durability": "Durability",
"expanded": "Expanded",
"exposed": "Exposed",
"fatigued": "Fatigued",
"focus_up": "FOCUS UP",
"focuses_up": "Focuses\nUp",
"forage_details": "Details",
"forage_details_placeholder": "Details...",
"forage_name": "Forage",
"forage_name_placeholder": "Forage",
"forage_style": "Style",
"forage_style_placeholder": "Style",
"forages": "Forages",
"frightened": "Frightened",
"go_wild": "GO WILD",
"goes_wild": "Goes\nWild",
"grab": "grab",
"grit": "Grit",
"grit_cost": "(Cost: 1 Success)",
"grit_details": "Increase [A] by 1.",
"harmony": "Harmony",
"hidden": "Hidden",
"hoard": "hoard",
"hp": "Health",
"ingredient_effects": "Effects",
"ingredient_effects_placeholder": "Effects...",
"ingredient_name": "Name",
"ingredient_name_placeholder": "Ingredient",
"ingredient_quantity": "Qty.",
"ingredient_quantity_placeholder": "0",
"ingredients": "Ingredients",
"initiation": "Initiation",
"initiation_placeholder": "What is the meal that made you a wilder?",
"insight": "Insight",
"insight_cost": "(Cost: 1 Success)",
"insight_details": "Establish a detail about the situation.",
"invigorated": "Invigorated",
"max": "Max",
"members": "Members",
"members_placeholder": "Members",
"mighty": "mighty",
"mighty_value": "mighty value",
"monster_location": "Location",
"monster_location_placeholder": "Location...",
"monster_name": "Monster",
"monster_name_placeholder": "Name",
"monster_rehab": "Rehab",
"monster_rehab_placeholder": "0",
"monstrous_acquaintance": "Monstrous Acquaintance",
"monstrous_acquaintance_placeholder": "Monstrous Acquaintance...",
"name_placeholder": "Name",
"note_details": "Details...",
"note_details_placeholder": "Details...",
"note_name": "Title",
"note_name_placeholder": "Note Title",
"notes": "Notes",
"pack": "Pack",
"pack_name": "Pack Name",
"pack_name_placeholder": "Pack Name",
"poisoned": "Poisoned",
"precise": "precise",
"precise_value": "precise value",
"pronouns": "Pronouns",
"pronouns_placeholder": "Pronouns",
"range": "Range",
"rehabilitating": "Rehabilitating",
"rested": "Rested",
"search": "search",
"select_style_skill": "Select a STYLE and SKILL.",
"sheet": "Sheet",
"shot": "shot",
"skills": "Skills",
"specialty": "Specialty",
"specialty_placeholder": "Specialty",
"spice": "Spice",
"stamina": "Stamina",
"staple": "Staple",
"strike": "strike",
"study": "study",
"stunned": "Stunned",
"styles": "Styles",
"success_critical": "Critical Success",
"success_partial": "Partial Success",
"success_standard": "Standard Success",
"swift": "swift",
"swift_value": "swift value",
"tech_cost_placeholder": "Passive",
"tech_details_placeholder": "Details...",
"tech_name_placeholder": "Technique",
"technique_cost": "Cost",
"technique_details": "Details",
"technique_name": "Name",
"techniques": "Techniques",
"three_course_background": "3 Course Background",
"tool": "Tool",
"tool_details_placeholder": "Details...",
"tools_and_techniques": "Tools & Techniques",
"trait_cost": "Cost",
"trait_cost_placeholder": "Passive",
"trait_details": "Details",
"trait_details_placeholder": "Details...",
"trait_name": "Name",
"trait_name_placeholder": "Trait",
"traits": "Traits",
"travel_details": "Details",
"travel_details_placeholder": "Details...",
"travel_name": "Travel",
"travel_name_placeholder": "Travel",
"travel_style": "Style",
"travel_style_placeholder": "Style",
"travels": "Travels",
"traversal": "traversal",
"tricky": "tricky",
"tricky_value": "tricky value",
"upbringing": "Upbringing",
"upbringing_placeholder": "What is the meal that defines your childhood?",
"version": "Version",
"wilder": "Wilder",
"wilderfeast": "Wilderfeast",
"wounded": "Wounded",
"you_are": "You Are"
}
866 changes: 866 additions & 0 deletions Wilderfeast/wilderfeast.css

Large diffs are not rendered by default.

761 changes: 761 additions & 0 deletions Wilderfeast/wilderfeast.html

Large diffs are not rendered by default.

Binary file added Wilderfeast/wilderfeast.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit b92ddb9

Please sign in to comment.