Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://gcoulby.github.io/IronswornCompanion/

Ironsworn Companion is a digital toolkit for playing the tabletop roleplaying game Ironsworn.
https://gcoulby.github.io/IronswornCompanion/

Last synced: 2 months ago
JSON representation

Ironsworn Companion is a digital toolkit for playing the tabletop roleplaying game Ironsworn.

Awesome Lists containing this project

README

        

READMEhtml {overflow-x: initial !important;}:root { --bg-color:#ffffff; --text-color:#333333; --select-text-bg-color:#B5D6FC; --select-text-font-color:auto; --monospace:"Lucida Console",Consolas,"Courier",monospace; --title-bar-height:20px; }
.mac-os-11 { --title-bar-height:28px; }
html { font-size: 14px; background-color: var(--bg-color); color: var(--text-color); font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; }
body { margin: 0px; padding: 0px; height: auto; bottom: 0px; top: 0px; left: 0px; right: 0px; font-size: 1rem; line-height: 1.42857; overflow-x: hidden; background: inherit; tab-size: 4; }
iframe { margin: auto; }
a.url { word-break: break-all; }
a:active, a:hover { outline: 0px; }
.in-text-selection, ::selection { text-shadow: none; background: var(--select-text-bg-color); color: var(--select-text-font-color); }
#write { margin: 0px auto; height: auto; width: inherit; word-break: normal; overflow-wrap: break-word; position: relative; white-space: normal; overflow-x: visible; padding-top: 36px; }
#write.first-line-indent p { text-indent: 2em; }
#write.first-line-indent li p, #write.first-line-indent p * { text-indent: 0px; }
#write.first-line-indent li { margin-left: 2em; }
.for-image #write { padding-left: 8px; padding-right: 8px; }
body.typora-export { padding-left: 30px; padding-right: 30px; }
.typora-export .footnote-line, .typora-export li, .typora-export p { white-space: pre-wrap; }
.typora-export .task-list-item input { pointer-events: none; }
@media screen and (max-width: 500px) {
body.typora-export { padding-left: 0px; padding-right: 0px; }
#write { padding-left: 20px; padding-right: 20px; }
.CodeMirror-sizer { margin-left: 0px !important; }
.CodeMirror-gutters { display: none !important; }
}
#write li > figure:last-child { margin-bottom: 0.5rem; }
#write ol, #write ul { position: relative; }
img { max-width: 100%; vertical-align: middle; image-orientation: from-image; }
button, input, select, textarea { color: inherit; font: inherit; }
input[type="checkbox"], input[type="radio"] { line-height: normal; padding: 0px; }
*, ::after, ::before { box-sizing: border-box; }
#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p, #write pre { width: inherit; }
#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p { position: relative; }
p { line-height: inherit; }
h1, h2, h3, h4, h5, h6 { break-after: avoid-page; break-inside: avoid; orphans: 4; }
p { orphans: 4; }
h1 { font-size: 2rem; }
h2 { font-size: 1.8rem; }
h3 { font-size: 1.6rem; }
h4 { font-size: 1.4rem; }
h5 { font-size: 1.2rem; }
h6 { font-size: 1rem; }
.md-math-block, .md-rawblock, h1, h2, h3, h4, h5, h6, p { margin-top: 1rem; margin-bottom: 1rem; }
.hidden { display: none; }
.md-blockmeta { color: rgb(204, 204, 204); font-weight: 700; font-style: italic; }
a { cursor: pointer; }
sup.md-footnote { padding: 2px 4px; background-color: rgba(238, 238, 238, 0.7); color: rgb(85, 85, 85); border-radius: 4px; cursor: pointer; }
sup.md-footnote a, sup.md-footnote a:hover { color: inherit; text-transform: inherit; text-decoration: inherit; }
#write input[type="checkbox"] { cursor: pointer; width: inherit; height: inherit; }
figure { overflow-x: auto; margin: 1.2em 0px; max-width: calc(100% + 16px); padding: 0px; }
figure > table { margin: 0px; }
tr { break-inside: avoid; break-after: auto; }
thead { display: table-header-group; }
table { border-collapse: collapse; border-spacing: 0px; width: 100%; overflow: auto; break-inside: auto; text-align: left; }
table.md-table td { min-width: 32px; }
.CodeMirror-gutters { border-right: 0px; background-color: inherit; }
.CodeMirror-linenumber { user-select: none; }
.CodeMirror { text-align: left; }
.CodeMirror-placeholder { opacity: 0.3; }
.CodeMirror pre { padding: 0px 4px; }
.CodeMirror-lines { padding: 0px; }
div.hr:focus { cursor: none; }
#write pre { white-space: pre-wrap; }
#write.fences-no-line-wrapping pre { white-space: pre; }
#write pre.ty-contain-cm { white-space: normal; }
.CodeMirror-gutters { margin-right: 4px; }
.md-fences { font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; overflow: visible; white-space: pre; background: inherit; position: relative !important; }
.md-diagram-panel { width: 100%; margin-top: 10px; text-align: center; padding-top: 0px; padding-bottom: 8px; overflow-x: auto; }
#write .md-fences.mock-cm { white-space: pre-wrap; }
.md-fences.md-fences-with-lineno { padding-left: 0px; }
#write.fences-no-line-wrapping .md-fences.mock-cm { white-space: pre; overflow-x: auto; }
.md-fences.mock-cm.md-fences-with-lineno { padding-left: 8px; }
.CodeMirror-line, twitterwidget { break-inside: avoid; }
.footnotes { opacity: 0.8; font-size: 0.9rem; margin-top: 1em; margin-bottom: 1em; }
.footnotes + .footnotes { margin-top: 0px; }
.md-reset { margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: top; background: 0px 0px; text-decoration: none; text-shadow: none; float: none; position: static; width: auto; height: auto; white-space: nowrap; cursor: inherit; -webkit-tap-highlight-color: transparent; line-height: normal; font-weight: 400; text-align: left; box-sizing: content-box; direction: ltr; }
li div { padding-top: 0px; }
blockquote { margin: 1rem 0px; }
li .mathjax-block, li p { margin: 0.5rem 0px; }
li blockquote { margin: 1rem 0px; }
li { margin: 0px; position: relative; }
blockquote > :last-child { margin-bottom: 0px; }
blockquote > :first-child, li > :first-child { margin-top: 0px; }
.footnotes-area { color: rgb(136, 136, 136); margin-top: 0.714rem; padding-bottom: 0.143rem; white-space: normal; }
#write .footnote-line { white-space: pre-wrap; }
@media print {
body, html { border: 1px solid transparent; height: 99%; break-after: avoid; break-before: avoid; font-variant-ligatures: no-common-ligatures; }
#write { margin-top: 0px; padding-top: 0px; border-color: transparent !important; }
.typora-export * { -webkit-print-color-adjust: exact; }
.typora-export #write { break-after: avoid; }
.typora-export #write::after { height: 0px; }
.is-mac table { break-inside: avoid; }
}
.footnote-line { margin-top: 0.714em; font-size: 0.7em; }
a img, img a { cursor: pointer; }
pre.md-meta-block { font-size: 0.8rem; min-height: 0.8rem; white-space: pre-wrap; background: rgb(204, 204, 204); display: block; overflow-x: hidden; }
p > .md-image:only-child:not(.md-img-error) img, p > img:only-child { display: block; margin: auto; }
#write.first-line-indent p > .md-image:only-child:not(.md-img-error) img { left: -2em; position: relative; }
p > .md-image:only-child { display: inline-block; width: 100%; }
#write .MathJax_Display { margin: 0.8em 0px 0px; }
.md-math-block { width: 100%; }
.md-math-block:not(:empty)::after { display: none; }
.MathJax_ref { fill: currentcolor; }
[contenteditable="true"]:active, [contenteditable="true"]:focus, [contenteditable="false"]:active, [contenteditable="false"]:focus { outline: 0px; box-shadow: none; }
.md-task-list-item { position: relative; list-style-type: none; }
.task-list-item.md-task-list-item { padding-left: 0px; }
.md-task-list-item > input { position: absolute; top: 0px; left: 0px; margin-left: -1.2em; margin-top: calc(1em - 10px); border: none; }
.math { font-size: 1rem; }
.md-toc { min-height: 3.58rem; position: relative; font-size: 0.9rem; border-radius: 10px; }
.md-toc-content { position: relative; margin-left: 0px; }
.md-toc-content::after, .md-toc::after { display: none; }
.md-toc-item { display: block; color: rgb(65, 131, 196); }
.md-toc-item a { text-decoration: none; }
.md-toc-inner:hover { text-decoration: underline; }
.md-toc-inner { display: inline-block; cursor: pointer; }
.md-toc-h1 .md-toc-inner { margin-left: 0px; font-weight: 700; }
.md-toc-h2 .md-toc-inner { margin-left: 2em; }
.md-toc-h3 .md-toc-inner { margin-left: 4em; }
.md-toc-h4 .md-toc-inner { margin-left: 6em; }
.md-toc-h5 .md-toc-inner { margin-left: 8em; }
.md-toc-h6 .md-toc-inner { margin-left: 10em; }
@media screen and (max-width: 48em) {
.md-toc-h3 .md-toc-inner { margin-left: 3.5em; }
.md-toc-h4 .md-toc-inner { margin-left: 5em; }
.md-toc-h5 .md-toc-inner { margin-left: 6.5em; }
.md-toc-h6 .md-toc-inner { margin-left: 8em; }
}
a.md-toc-inner { font-size: inherit; font-style: inherit; font-weight: inherit; line-height: inherit; }
.footnote-line a:not(.reversefootnote) { color: inherit; }
.md-attr { display: none; }
.md-fn-count::after { content: "."; }
code, pre, samp, tt { font-family: var(--monospace); }
kbd { margin: 0px 0.1em; padding: 0.1em 0.6em; font-size: 0.8em; color: rgb(36, 39, 41); background: rgb(255, 255, 255); border: 1px solid rgb(173, 179, 185); border-radius: 3px; box-shadow: rgba(12, 13, 14, 0.2) 0px 1px 0px, rgb(255, 255, 255) 0px 0px 0px 2px inset; white-space: nowrap; vertical-align: middle; }
.md-comment { color: rgb(162, 127, 3); opacity: 0.8; font-family: var(--monospace); }
code { text-align: left; vertical-align: initial; }
a.md-print-anchor { white-space: pre !important; border-width: initial !important; border-style: none !important; border-color: initial !important; display: inline-block !important; position: absolute !important; width: 1px !important; right: 0px !important; outline: 0px !important; background: 0px 0px !important; text-decoration: initial !important; text-shadow: initial !important; }
.md-inline-math .MathJax_SVG .noError { display: none !important; }
.html-for-mac .inline-math-svg .MathJax_SVG { vertical-align: 0.2px; }
.md-math-block .MathJax_SVG_Display { text-align: center; margin: 0px; position: relative; text-indent: 0px; max-width: none; max-height: none; min-height: 0px; min-width: 100%; width: auto; overflow-y: hidden; display: block !important; }
.MathJax_SVG_Display, .md-inline-math .MathJax_SVG_Display { width: auto; margin: inherit; display: inline-block !important; }
.MathJax_SVG .MJX-monospace { font-family: var(--monospace); }
.MathJax_SVG .MJX-sans-serif { font-family: sans-serif; }
.MathJax_SVG { display: inline; font-style: normal; font-weight: 400; line-height: normal; zoom: 90%; text-indent: 0px; text-align: left; text-transform: none; letter-spacing: normal; word-spacing: normal; overflow-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; padding: 0px; margin: 0px; }
.MathJax_SVG * { transition: none 0s ease 0s; }
.MathJax_SVG_Display svg { vertical-align: middle !important; margin-bottom: 0px !important; margin-top: 0px !important; }
.os-windows.monocolor-emoji .md-emoji { font-family: "Segoe UI Symbol", sans-serif; }
.md-diagram-panel > svg { max-width: 100%; }
[lang="flow"] svg, [lang="mermaid"] svg { max-width: 100%; height: auto; }
[lang="mermaid"] .node text { font-size: 1rem; }
table tr th { border-bottom: 0px; }
video { max-width: 100%; display: block; margin: 0px auto; }
iframe { max-width: 100%; width: 100%; border: none; }
.highlight td, .highlight tr { border: 0px; }
mark { background: rgb(255, 255, 0); color: rgb(0, 0, 0); }
.md-html-inline .md-plain, .md-html-inline strong, mark .md-inline-math, mark strong { color: inherit; }
mark .md-meta { color: rgb(0, 0, 0); opacity: 0.3 !important; }
@media print {
.typora-export h1, .typora-export h2, .typora-export h3, .typora-export h4, .typora-export h5, .typora-export h6 { break-inside: avoid; }
}
.md-diagram-panel .messageText { stroke: none !important; }
.md-diagram-panel .start-state { fill: var(--node-fill); }
.md-diagram-panel .edgeLabel rect { opacity: 1 !important; }
.md-require-zoom-fix foreignobject { font-size: var(--mermaid-font-zoom); }

:root {
--side-bar-bg-color: #fafafa;
--control-text-color: #777;
}

@include-when-export url(https://fonts.loli.net/css?family=Open+Sans:400italic,700italic,700,400&subset=latin,latin-ext);

/* open-sans-regular - latin-ext_latin */
/* open-sans-italic - latin-ext_latin */
/* open-sans-700 - latin-ext_latin */
/* open-sans-700italic - latin-ext_latin */
html {
font-size: 16px;
}

body {
font-family: "Open Sans","Clear Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
color: rgb(51, 51, 51);
line-height: 1.6;
}

#write {
max-width: 860px;
margin: 0 auto;
padding: 30px;
padding-bottom: 100px;
}

@media only screen and (min-width: 1400px) {
#write {
max-width: 1024px;
}
}

@media only screen and (min-width: 1800px) {
#write {
max-width: 1200px;
}
}

#write > ul:first-child,
#write > ol:first-child{
margin-top: 30px;
}

a {
color: #4183C4;
}
h1,
h2,
h3,
h4,
h5,
h6 {
position: relative;
margin-top: 1rem;
margin-bottom: 1rem;
font-weight: bold;
line-height: 1.4;
cursor: text;
}
h1:hover a.anchor,
h2:hover a.anchor,
h3:hover a.anchor,
h4:hover a.anchor,
h5:hover a.anchor,
h6:hover a.anchor {
text-decoration: none;
}
h1 tt,
h1 code {
font-size: inherit;
}
h2 tt,
h2 code {
font-size: inherit;
}
h3 tt,
h3 code {
font-size: inherit;
}
h4 tt,
h4 code {
font-size: inherit;
}
h5 tt,
h5 code {
font-size: inherit;
}
h6 tt,
h6 code {
font-size: inherit;
}
h1 {
font-size: 2.25em;
line-height: 1.2;
border-bottom: 1px solid #eee;
}
h2 {
font-size: 1.75em;
line-height: 1.225;
border-bottom: 1px solid #eee;
}

/*@media print {
.typora-export h1,
.typora-export h2 {
border-bottom: none;
padding-bottom: initial;
}

.typora-export h1::after,
.typora-export h2::after {
content: "";
display: block;
height: 100px;
margin-top: -96px;
border-top: 1px solid #eee;
}
}*/

h3 {
font-size: 1.5em;
line-height: 1.43;
}
h4 {
font-size: 1.25em;
}
h5 {
font-size: 1em;
}
h6 {
font-size: 1em;
color: #777;
}
p,
blockquote,
ul,
ol,
dl,
table{
margin: 0.8em 0;
}
li>ol,
li>ul {
margin: 0 0;
}
hr {
height: 2px;
padding: 0;
margin: 16px 0;
background-color: #e7e7e7;
border: 0 none;
overflow: hidden;
box-sizing: content-box;
}

li p.first {
display: inline-block;
}
ul,
ol {
padding-left: 30px;
}
ul:first-child,
ol:first-child {
margin-top: 0;
}
ul:last-child,
ol:last-child {
margin-bottom: 0;
}
blockquote {
border-left: 4px solid #dfe2e5;
padding: 0 15px;
color: #777777;
}
blockquote blockquote {
padding-right: 0;
}
table {
padding: 0;
word-break: initial;
}
table tr {
border-top: 1px solid #dfe2e5;
margin: 0;
padding: 0;
}
table tr:nth-child(2n),
thead {
background-color: #f8f8f8;
}
table th {
font-weight: bold;
border: 1px solid #dfe2e5;
border-bottom: 0;
margin: 0;
padding: 6px 13px;
}
table td {
border: 1px solid #dfe2e5;
margin: 0;
padding: 6px 13px;
}
table th:first-child,
table td:first-child {
margin-top: 0;
}
table th:last-child,
table td:last-child {
margin-bottom: 0;
}

.CodeMirror-lines {
padding-left: 4px;
}

.code-tooltip {
box-shadow: 0 1px 1px 0 rgba(0,28,36,.3);
border-top: 1px solid #eef2f2;
}

.md-fences,
code,
tt {
border: 1px solid #e7eaed;
background-color: #f8f8f8;
border-radius: 3px;
padding: 0;
padding: 2px 4px 0px 4px;
font-size: 0.9em;
}

code {
background-color: #f3f4f4;
padding: 0 2px 0 2px;
}

.md-fences {
margin-bottom: 15px;
margin-top: 15px;
padding-top: 8px;
padding-bottom: 6px;
}

.md-task-list-item > input {
margin-left: -1.3em;
}

@media print {
html {
font-size: 13px;
}
table,
pre {
page-break-inside: avoid;
}
pre {
word-wrap: break-word;
}
}

.md-fences {
background-color: #f8f8f8;
}
#write pre.md-meta-block {
padding: 1rem;
font-size: 85%;
line-height: 1.45;
background-color: #f7f7f7;
border: 0;
border-radius: 3px;
color: #777777;
margin-top: 0 !important;
}

.mathjax-block>.code-tooltip {
bottom: .375rem;
}

.md-mathjax-midline {
background: #fafafa;
}

#write>h3.md-focus:before{
left: -1.5625rem;
top: .375rem;
}
#write>h4.md-focus:before{
left: -1.5625rem;
top: .285714286rem;
}
#write>h5.md-focus:before{
left: -1.5625rem;
top: .285714286rem;
}
#write>h6.md-focus:before{
left: -1.5625rem;
top: .285714286rem;
}
.md-image>.md-meta {
/*border: 1px solid #ddd;*/
border-radius: 3px;
padding: 2px 0px 0px 4px;
font-size: 0.9em;
color: inherit;
}

.md-tag {
color: #a7a7a7;
opacity: 1;
}

.md-toc {
margin-top:20px;
padding-bottom:20px;
}

.sidebar-tabs {
border-bottom: none;
}

#typora-quick-open {
border: 1px solid #ddd;
background-color: #f8f8f8;
}

#typora-quick-open-item {
background-color: #FAFAFA;
border-color: #FEFEFE #e5e5e5 #e5e5e5 #eee;
border-style: solid;
border-width: 1px;
}

/** focus mode */
.on-focus-mode blockquote {
border-left-color: rgba(85, 85, 85, 0.12);
}

header, .context-menu, .megamenu-content, footer{
font-family: "Segoe UI", "Arial", sans-serif;
}

.file-node-content:hover .file-node-icon,
.file-node-content:hover .file-node-open-state{
visibility: visible;
}

.mac-seamless-mode #typora-sidebar {
background-color: #fafafa;
background-color: var(--side-bar-bg-color);
}

.md-lang {
color: #b4654d;
}

.html-for-mac .context-menu {
--item-hover-bg-color: #E6F0FE;
}

#md-notification .btn {
border: 0;
}

.dropdown-menu .divider {
border-color: #e5e5e5;
}

.ty-preferences .window-content {
background-color: #fafafa;
}

.ty-preferences .nav-group-item.active {
color: white;
background: #999;
}



Ironsworn Companion


 



Introduction



What is Ironsworn?


Ironsworn is a tabletop RPG created by Shawn Tomkin. What makes Ironsworn unique is that unlike traditional tabletop RPGs, Ironsworn enables solo/ small-group play, as its unique game mechanics remove the need for a traditional game master.


What is even more fascinating about Ironsworn is the distribution methods. When reading the game, you realise the care, effort and devotion that has gone in to creating this game and yet, the game is released as open-source under the creative commons 4.0 License: CC BY 4.0


Ironsworn truly is a labour of love and is available for free at https://www.ironswornrpg.com/



What is the Ironsworn Companion?


First and foremost, this application is not an official Ironsworn product, instead it leverages the CC4.0 license to provide a digital toolkit for playing the game.


I used to use platforms such as Roll20 for playing campaigns with a remote group of friends. I wanted a similar experience from Ironsworn, e.g. a digital companion app that could aid, automate and track my game to reduce on paper waste and also provide quick and easy ways to exploit mechanics such as The Oracle (a roll-based game mechanic to spark ideas during game play).


While there are various companions out there, I was disappointed with the features and felt they didn't match my view of what the companion should be like. That's not to say the other apps are bad, but many just felt like lightweight tools to support pen and paper play, which is great, if that is what you want.


This app is not designed to replace the rules, though it may clear your desk of progress tracks and asset cards.





Using the app


The following sections will provide instruction on how to use the individual components in the app.





Sections


Key areas such as a pages will be shown like this throughout the documentation: Characters, Background etc.


At times the documentation will refer to sections. There are three main sections to this app: Header, Sidebar and Footer. These are fairly self explanatory.



Header


The Header refers to the top of the page where the Character Selector and Stat Overview exists.


image-20210316092433055



Sidebar


The Sidebar refers to the side navigation menu. This section is used for navigating around the app.


image-20210316092602896



Footer


The Footer contains a quick dice roller. This can be used to roll on stats with an action dice vs two challenge dice. When you click Roll a box will appear that will state either Miss, Weak Hit, or Strong Hit. Hovering over this box will make a breakdown of the roll appear in a popup. Progression tracks also make use of this, which we will explore later.


image-20210316092805822





Oracles


Before discussing the features of the app its important to understand how the oracle works. Throughout the companion you will see the following roll icon in various places:


image-20210226101636509


This icon denotes that you can consult the oracle. Each implementation of the oracle differs between pages. For example, by consulting the oracle during character creation, a random Ironlander name will be generated. On the other hand, by consulting the oracle during world creation, a number of world truths will be defined. As with everything in Ironsworn, if the Oracle's insights are not inline with your version of the Ironlands or provides some contradiction, you can either roll again or carve your own path. You should definitely consult the rules on how exactly to use the Oracle, this app merely takes away the need to cross reference a comprehensive list of roll tables.



Oracle Page


To supplement the oracle implementations on each page, there is also a page dedicated to oracles. The Oracles page provides the ability to roll on any oracle table and get a random result. Since there are no dice involved here, the oracle tables can be any size you like. After rolling an oracle table you can click on the result and it will automatically copy to clipboard.



Oracle Creation


New Oracle tables can be created using the form at the top of the page. Simply enter the Oracle Table name and press


+ Add Oracle Table



Editing Oracle Tables


Once you have added an oracle table you can edit the tables using the left hand column. Simply select an oracle table from the drop down box and start typing in the box below. Every line represents 1 row in the oracle table. For this reason, long oracles will cause a scroll bar to appear along the bottom of the text box... Do not press Enter to make the box look pretty as this will split your oracle in two.





Characters


Most of the functionality of the the companion app will not work unless you create and select a character. Characters represent players and multiple characters can be created. However, only 1 character can be selected at a time. This will mean a degree of micro management will be needed in coop games.



Create a character


To create a character go to the Characters page and either enter the details into the form manually or roll the individual fields against the respective oracle tables.


For more information on Character creation consult Chapter 2 of the Ironsworn rulebook.



Stats


There are five stats in total. Each is given a value from 1 to 3. To start, arrange these bonuses across your five stats in any order: 3, 2, 2, 1, 1. You can also roll on the oracle to leave your primary stat choice down to fate. The Roll Primary Stat button will choose 1 of the stats at random to be your primary stat value=3. You can then enter two 1s and two 2s into the remaining stats.



Selected character


Once you have created a character it will appear under the CHARACTER SELECTION heading. This will show a card for each character, which will all contain a Select and Delete button. Delete button will completely delete your character and Select will make your character the Selected Character. To use all of the functionality of the companion there must always be one Selected Character.


Characters can also be selected from the dropdown box in the Header. Once a character is a selected, their stats will be shown across the top of the pages, which provide 2 purposes. Firstly, they provide a persistent view of character stats, regardless of where you at the app. Secondly, the stats are buttons and can be clicked to take you to your Character Sheet.


After selecting a character you are automatically taken to the Stats page, which shows a character sheet for the Selected Character.





Logs


There are two logs in the companion Campaign Log and Background. These logs are used to add fiction or metagame information to your campaign. The Campaign Log is for adding information about events, plot, story or anything related to the campaign that is not character specific. The Background page is for adding information specific to the Selected Character



Adding Logs


To add a log enter text into the text box at the bottom of a log page and press SHIFT + ENTER to enter fiction (this information should be in character/roleplay). Alternatively press CTRL + ENTER to enter metagame information (This information can be out of character/roleplay).



Viewing and Deleting Logs


Once logs are added they will appear in the box above the input box. They will appear in chronological order and are all timestamped with the date/time they were added. The box will auto scroll to the bottom of the page on refresh, or when a new log item is added.





World Truths


As the name suggests, the World Truths page is for selecting the truths of your world. In short, there are a various categories under the World Truths page such as The Old World or Religion. Under each category there are 3 truths. You should choose a truth from each page this will define the parameters of your world. For example, the Mysticism tab is for choosing the truth about the prevalence of magic, the three options define whether magic is a myth, a rarity or commonplace.



Selecting a Truth


To select a truth, simply click on the card. Once selected, a checkmark () will appear on the right hand side of the card and the card will be surrounded with a black border.



Changing Truths


As your story unfolds you may find out that you were wrong about your truth selection, i.e. you may go into your world with the idea that there is no magic, but then you meet a ancient mystic who shows you that magic is not a myth, but is rare, dangerous and part of an underground movement. For this reason, you can change your truths at any time.



Rolling a Random World


You have the option to Roll a Random World. Clicking this box will randomly choose a truth for each category to add more randomness to your world.



Custom World Truths.


The custom tab contains two text boxes. One for a custom quest starter and the other for custom world details. Be descriptive here. You can use this box to define an entirely custom world or provide modifiers to existing truths from other categories. It is your world so get creative.


For more information on World Truths consult Chapter 4 of the Ironsworn rulebook.





NPCs


The NPCs page is for creating Non-Player Characters. Creation of NPCs is functionally similar to character creation except there are more options to roll on. Each oracle roll will work the same way as character creation, except for Name. If you roll on Name, before choosing a Race, a race will be selected for you as this will determine which oracle table the name is chosen from.



Story Helpers


NPCs have more options to roll on that characters to provide more flavour to your NPCs that can drive your story.




  • Dispositions help drive the narrative as NPCs could be helpful or curious, alternatively they could be threatening or derisive


  • NPC Conversation will tell you the nature of their conversations topics; for example, they may tell you about their heritage or about the leadership of their settlement.


  • NPC Knowledge will inform you about what information they know about.



Last Location


If you have created locations (See Locations and Settlements) you will be able to specify the NPC's last know location. Simply select a location from the dropdown box either during NPC creation, or from their NPC card.



Bonds


If you have a character selected a Bond Track will appear on the NPC card once it is created. Increasing the bond track of an NPC. will increase the NPCs track by 1 Tick. It will also increase the bond track of the Selected Character by 1 Tick. If you need to add bonds to multiple characters (for co-op), this will not be done automatically, instead you should use the character select drop down in the Header to switch to other character sheets and manually enter those bonds to other characters.





Locations and Settlements


Locations and settlements can be added to an interactive map under the Locations and Settlements page.



Adding a location


The Add Location form is also used to edit existing locations. Consequently, when you click on the map the form will be reset. Therefore, to add a location you must click on the map first to choose the location of the new settlement. This will add the XY coordinates to the input form. From there, you can then manually enter details about the settlement or roll on the oracle to generate random location details. The additional information can be used to provide flavour and context to your location.


Once you have completed the form, click Save Location this will add a marker to the map.



Editing a Location


Clicking on a map marker will populate the form with details on the location. If any NPCs have their Last Location set to this location/settlement they will appear in a list on this screen. A bond track is also available, which works the same way as an NPC bond track. Each progression adds 1 Tick to the location and also 1 Tick to the selected player.


When you have finished editing the location click Save Location



Delete Location


You can Delete locations by clicking on their map marker and then clicking Delete





Enter the Fray


Enter the fray describes the action of combat.


To enter combat, create Active Foes by either selecting from the Category and Type drop boxes or click Roll Random Foe. Multiple Active Foes can be added and each Foe will have an individual combat track.



Foe Card


The Foe Card provides information and context about your foes:


image-20210316095147244


The title bar of each Foe Card contains the Foe Type and Rank of each Foe. The rank determines how much harm a foe can inflict on a player and also determines the combat progression per harm done. The Foe Card also contains the page number of the Foe and the source so you can refer to the books for more information.



Roll Progress


At any point you can Roll Progress. However, this is dangerous early in the fight, Rolling progress involves rolling the value of the progression track against the challenge dice. If your Combat Progress is only 2, you will essentially roll 2 against two D10s. This strongly increases the chance of a Miss, which has consequences. When you click Roll Progress the Foe is selected in the Footer and you must then click Roll in the Footer to determine the outcome.


If the roll is successful you can delete the character and move on. If it is not you must Pay the Price


For information about Combat see Chapter 3 of the Ironsworn rulebook



Foe Packs


The Ironsworn rules allows you to form packs of NPCs that have a single track. This app does not yet implement packs, but the functionality can be easily achieved. Simply, create a single Dangerous or Formidable opponent and treat that opponent as a pack.


For information about NPC Packs see Chapter 5 of the Ironsworn rulebook





Stats


The stats page is your digital character sheet. Here you can track Experience, Core Stats, Health, Spirit, Supply and Momentum tracks, as well as Debilities



Experience


Experience is changed manually after Fulling a Vow. You increase experience with the [+] button and decrease with the [-] button. The [>>] button is for advancing experience when it is spent on Assets (See Assets)



Debilities


To add a debility simply click on one of the words. When done, they will be highlighted black. Momentum is automatically affected by Debilities; reducing the Momentum Reset and the Max Momentum values.


For more information on Character Stats consult Chapter 2 of the Ironsworn rulebook.





Vows, Quests and Journeys


Vows quests and Journeys are functionally identical to each other. They are created with the form at the topic where a description and difficulty are defined. A card will be created with a Progress Track, which will work the same way as a Foe Combat Track. When you roll to Fulfill a Vow, Complete Your Quest or Reach Your Destination, the Progress will be selected in the Footer and you can roll on the value.



Differences


The only difference between these progressions is what happens at completion. When you complete a Vow you gain experience. However, when you complete quests or journeys you do not. Journeys and Quests are here to add more fictional context. As the rules suggest: Let the fiction drive this. Your Journey may be to Sail to the Barrier Islands to Deliver a message to the leader Highcairn. Completing this journey may get you a reward or increase your bond with the Highcairn settlement. Your quest may be to find the mystical staff of Charrak completing this quest would add this staff to your equipment and grant you whatever powers you envision it having.





Assets


Assets screen allows you add assets to your character and make live changes to the asset card. If assets have tracks an interactive track will appear, with the same paper clip user experience found on the stats page.


There a few controls to this page. The leftmost drop down allows you to select and an asset to you character. Whereas the rightmost allows you to select and remove an asset from your character.


Once an asset is added you can input text into the Input Fields, modify tracks, upgrade the assets (but remember to spend your experience when you do)





Asset Builder



Asset Creation


The asset builder allows you to create, copy, edit and delete assets.


Assets with (Core) in the name cannot be edited or deleted. They are centrally maintained by the Data Management page. To update assets got to the Data Management page and press Update Core Assets


To create a new Asset either fill out the various fields and press Save Asset or select an existing asset, make the required changes and press Save Asset. As you make changes, those changes will be reflect live on the card nearest the input form. Use this to ensure your content fits inside the card (so that it will display/print correctly).


Assets MUST have a unique name. Therefore you will be unable to click Save Asset. unless a unique name is chosen.



Buttons


The buttons on this page are dynamic. A button will only appear if an action is allowed. For example, since you can't delete or modify a core asset. When a core asset is selected, the only button available to you is Save as Copy. However, this button only appears when the name is unique. Similarly, if you're creating a new asset, then the Delete, Save as Copy and Save Changes button are hidden.


There are four buttons in total:


ButtonActionRulesAdd AssetAdds a new AssetIs not shown if existing asset is selected
Name cannot be blankSave ChangesSaves changes to an existing assetCannot add if Name is blank,
Can only save changes if the selected assets is not a core asset,
The asset Name cannot be different to the previous version.
At least one other field must be different to the previous version.Save as a CopyCreates a new Asset based on previous assetCannot add if Name is blank,
Cannot add asset if selected asset is core asset.
Cannot add if an asset exists with same name
cannot add if the asset is same as default asset (ie no changes)
cannot add if asset with same id already exists
add button is not shown when modifying an existing asset (copy shown instead)DeleteDelete an Existing AssetExisting asset cannot be a core asset
Cannot be an asset that is not yet created

 



Asset Deck


At the bottom of the Asset Builder page, all the existing assets can be viewed on the page. At the top of the Asset Deck, there is a Print Cards button, which will modify the page and hide non essential visual elements to create an automated printable page. This process will also automatically generate card backs and place them in order so that they print correctly on double sided printers. (if you don't want card backs you can select those pages not to print in the printer options)


 


KNOWN ISSUE: The way the page is generate the last page always generates an almost blank page. This should be removed in the printer settings.





Roll


The Roll button in the Sidebar takes you to a simple Dice Roller. This uses the same Dice Roller that drives the tables, but allows you to specify a series of dice and roll them. The dice roller in the Footer is functionally more useful to Ironsworn, but this was added for those that want to roll on some dice for whatever reason.





Data Management


This companion has a persistent state meaning that you can move between pages and your textboxes wont clear when you return. This is done through your browser's local storage. The Data Management page allows you to Reset, Load or Save your gamestate at any point.



Saving and Loading the Game State


The Save Button allows you to download your gamestate to a JSON file that you can store on your computer. If you not a programmer/unaware of what JSON is, don't worry. You don't need to know what the file is, except that it is a text file that contains all of the information to maintain your game save. It also allows your to move your game between browsers or computers.


JSON files can be loaded using the Load button to replace the current gamestate with the gamestate from the save file.


The Reset button wipes the gamestate back to defaults. This cannot be reversed so ensure you save your game before doing this.



Updating Core Assets


This platform makes use of RSEK's datasworn assets. If your assets fall behind RSEKs datasworn assets, you can use the update button to bring them up to date.





Acknowledgements


The acknowledgement page provides the following information, but it is also here to make the documentation more complete.



License


To honour the labour of love created by Shawn, this companion is distributed (for free) under the same International Attribution-NonCommercial-ShareAlike 4.0 license as the official Ironsworn game. This companion could not exist without Shawn's work and since his game is distributed for free it seemed only right to do the same with the companion. The images, icons and maps used in this companion are provided from different authors (See Contributors below). Consequently, they are NOT covered by the same ShareAlike 4.0 license


img


As part of the Attribution-NonCommercial-ShareAlike 4.0 license: any forks of this application must only build upon this page. No attributions may be taken away from this page without expressed written permission. This page must be included in any derivative works and may not be 'hidden' from view.



Contributors


There were several content developers from the Ironsworn community that deserve an honourable mention here. During the creation of this companion the following people provided direct or indirect support to this app.


ContributorContributionURLSHAWN TOMKINWithout Shawn's work none of this could be possible. When reading the game, you realise the care, effort and devotion that has gone in to creating this game and yet, the game is released as open-source under the creative commons 4.0. True Legend!https://www.ironswornrpg.com/JOSIAH VAN EGMONDThe coloured version of the map was created by Josiah Van Egmond from Black Hawk Cartography (who make some amazing maps I might add). Additional thanks to Shawn Tomkin for providing me with explicit permission to use this image outside of the CC4.0 license.https://www.blackhawkcartography.com/RSEKRSEK provided continued support and feedback throughout development and their Datasworn repository was used to build the core assets in this companion.https://github.com/rsekERIC BRIGHTTo provide more variety and options when rolling on oracle tables, Eric's expanded oracles were used to populate the core oracle tableshttps://www.drivethrurpg.com/browse/pub/8584/Eric-BrightDELAPOUITE & LORCThe icons used at Game-Icons.net are fundamental for achieving the Ironsworn look-and-feel. Therefore the icon selector for asset creation is driven by Game-Icons.net fonts.https://game-icons.net/KYLE KEMPTo integrate the Game-Icons.net icons into the application, Kyle's game-icons.net web-font was used, which was evidently inspired by FontAwesome.https://seiyria.com/gameicons-font/GHOST225Ghost provided continued support, feedback, feature suggestions and testing throughout the developmenthttps://github.com/ghost225NOMADSOUL1Credit goes to NOMADSOUL1 from freepik for the homepage image. The colour image was filtered to get the same look and feel as the Ironsworn book.https://www.freepik.com/nomadsoul1ONLINE WEB FONTSModesto font made from Online Web Fonts licensed by CC BY 3.0http://www.onlinewebfonts.com


Developer


This app was created by Graham Coulby to serve as a holistic digital companion for the Ironsworn tabletop RPG. This app was not designed to replace the official rules nor was it designed to supersede the work done by Shawn Tomkin.


img