gdritter repos dogs / b768dcb
Add a build system to generate the HTML Getty Ritter 5 years ago
6 changed file(s) with 282 addition(s) and 10 deletion(s). Collapse all Expand all
1 build/guenashk.html: txt/dogs.md build/template.html
2 mkdir -p build
3 pandoc --template=build/template <txt/dogs.md >build/guenashk.html
4
5 build/icon-%.svg: diagrams/icon-%.svg
6 inkscape --export-plain-svg=$@ $<
7 sed -i -e 's/height=[^>]*/height="1em"/g' $@
8 sed -i -e 's/width=[^>]*/width="1em"/g' $@
9
10 build/payload.json: build/icon-heart.svg build/icon-relationship.svg
11 bin/b64-payload \
12 --raleway=/usr/share/fonts/TTF/Raleway-Medium.ttf \
13 --trait-icon=build/icon-heart.svg \
14 --relationship-icon=build/icon-relationship.svg \
15 >build/payload.json
16
17 build/template.html: txt/template.mustache build/payload.json
18 pystache txt/template.mustache build/payload.json >build/template.html
19
20 clean:
21 rm -f build/*
1 #!/usr/bin/env python3
2
3 import base64
4 import json
5 import sys
6
7 USAGE='''
8 {0} --key1=file1 --key2=file2 ...
9 '''
10
11 def main(args):
12 result = {}
13 for key, filename in args.items():
14 with open(filename, 'rb') as f:
15 contents = f.read()
16 result[key] = base64.b64encode(contents).decode('utf-8')
17 json.dump(result, sys.stdout)
18
19 if __name__ == '__main__':
20 if '--help' in sys.argv[1:]:
21 print(USAGE.format(sys.argv[0]))
22 sys.exit(0)
23
24 args = dict((arg.strip('--').split('=') for arg in sys.argv[1:]))
25 main(args)
1 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2 <!-- Created with Inkscape (http://www.inkscape.org/) -->
3
4 <svg
5 xmlns:dc="http://purl.org/dc/elements/1.1/"
6 xmlns:cc="http://creativecommons.org/ns#"
7 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8 xmlns:svg="http://www.w3.org/2000/svg"
9 xmlns="http://www.w3.org/2000/svg"
10 xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11 xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12 width="75pt"
13 height="75pt"
14 viewBox="0 0 26.458333 26.458334"
15 version="1.1"
16 id="svg8"
17 inkscape:version=""
18 sodipodi:docname="icon-heart.svg">
19 <defs
20 id="defs2" />
21 <sodipodi:namedview
22 id="base"
23 pagecolor="#ffffff"
24 bordercolor="#666666"
25 borderopacity="1.0"
26 inkscape:pageopacity="0.0"
27 inkscape:pageshadow="2"
28 inkscape:zoom="5.6"
29 inkscape:cx="21.262725"
30 inkscape:cy="43.443214"
31 inkscape:document-units="mm"
32 inkscape:current-layer="layer1"
33 showgrid="true"
34 units="pt"
35 inkscape:window-width="1920"
36 inkscape:window-height="1080"
37 inkscape:window-x="0"
38 inkscape:window-y="0"
39 inkscape:window-maximized="0">
40 <inkscape:grid
41 type="xygrid"
42 id="grid815" />
43 </sodipodi:namedview>
44 <metadata
45 id="metadata5">
46 <rdf:RDF>
47 <cc:Work
48 rdf:about="">
49 <dc:format>image/svg+xml</dc:format>
50 <dc:type
51 rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
52 <dc:title></dc:title>
53 </cc:Work>
54 </rdf:RDF>
55 </metadata>
56 <g
57 inkscape:label="Layer 1"
58 inkscape:groupmode="layer"
59 id="layer1"
60 transform="translate(0,-270.54165)">
61 <path
62 style="opacity:1;fill:#802020;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.8973664;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
63 d="M 27.5,5 C 15.073593,5 4.9999995,16.192881 5,30 c 4e-7,35.000013 30,60.000001 45,60 15.000001,-10e-7 45,-24.999987 45,-60 C 95,16.192881 84.926407,5 72.5,5 60.073593,5 50.000001,11.192881 50.000001,25 50.000001,11.192881 39.926407,5 27.5,5 Z"
64 transform="matrix(0.26458333,0,0,0.26458333,0,270.54165)"
65 id="path817"
66 inkscape:connector-curvature="0"
67 sodipodi:nodetypes="ssssscs" />
68 </g>
69 </svg>
1 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2 <!-- Created with Inkscape (http://www.inkscape.org/) -->
3
4 <svg
5 xmlns:dc="http://purl.org/dc/elements/1.1/"
6 xmlns:cc="http://creativecommons.org/ns#"
7 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8 xmlns:svg="http://www.w3.org/2000/svg"
9 xmlns="http://www.w3.org/2000/svg"
10 xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11 xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12 width="75pt"
13 height="75pt"
14 viewBox="0 0 26.458333 26.458334"
15 version="1.1"
16 id="svg8"
17 inkscape:version=""
18 sodipodi:docname="icon-relationship.svg">
19 <defs
20 id="defs2" />
21 <sodipodi:namedview
22 id="base"
23 pagecolor="#ffffff"
24 bordercolor="#666666"
25 borderopacity="1.0"
26 inkscape:pageopacity="0.0"
27 inkscape:pageshadow="2"
28 inkscape:zoom="3.959798"
29 inkscape:cx="-13.737275"
30 inkscape:cy="43.443214"
31 inkscape:document-units="mm"
32 inkscape:current-layer="layer1"
33 showgrid="true"
34 units="pt"
35 inkscape:window-width="1920"
36 inkscape:window-height="1080"
37 inkscape:window-x="0"
38 inkscape:window-y="0"
39 inkscape:window-maximized="0">
40 <inkscape:grid
41 type="xygrid"
42 id="grid815" />
43 </sodipodi:namedview>
44 <metadata
45 id="metadata5">
46 <rdf:RDF>
47 <cc:Work
48 rdf:about="">
49 <dc:format>image/svg+xml</dc:format>
50 <dc:type
51 rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
52 <dc:title />
53 </cc:Work>
54 </rdf:RDF>
55 </metadata>
56 <g
57 inkscape:label="Layer 1"
58 inkscape:groupmode="layer"
59 id="layer1"
60 transform="translate(0,-270.54165)">
61 <circle
62 style="opacity:1;fill:#802020;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916664;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
63 id="path814"
64 cx="13.229167"
65 cy="278.47916"
66 r="5.953125" />
67 <path
68 style="opacity:1;fill:#802020;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.54773951;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
69 d="m 13.229167,283.10935 a 9.9218751,9.2604168 0 0 0 -9.921875,9.26042 v 2.64583 h 19.84375 v -2.64583 a 9.9218751,9.2604168 0 0 0 -9.921875,-9.26042 z"
70 id="path816"
71 inkscape:connector-curvature="0" />
72 </g>
73 </svg>
11 % The Emissaries of Guenašk
22
33 > The senator from the Ultaian delegation tries to look nonplussed, but the coloration of their neck fronds betrays a frantic nervousness. The Expeditionite pirate pushes her blaster hard against the Ultaian's scaled back, twists its cold barrel, and growls at you.
4
4 >
55 > "Please, I've done nothing, I'm a senator," they say with a quavering voice, their alien vocal tract elongating vowels and nearly dropping consonants. "Please—"
6
6 >
77 > "You've been harvesting from our bio-stations for years now," she says. "Your synthdrones, twice every cycle. It ends now." She nods towards you. "You, Guenaški. You tell them."
8
8 >
99 > The Ultaian's three eyes widen, and both theirs and hers turn towards you. What do you do?
1010
11 **The Emissaries of Guenašk**
12
13 _A Role-Playing Game_
14
1511 The Emissaries of Guenašk is a game about space, the peoples who have set out to explore and live in it, and those individuals who are tasked with mediating peace between those people. These individuals, the Guenaški, travel from planet to planet, station to station, star to star, equipped with the uneasy and contingent trust of an interplanetary coalition, and attempt to serve as peacekeepers, healers, mediators, and explorers to those they find, sometimes to their joy and sometimes to their chagrin.
1612
1713 The stars are limitless and varied, and the Guenaški are tasked by both convention and conviction to help keep them stable and avoid another war like the Last War. Sometimes they travel to the Shining Core and mediate political debates among the hundreds of thousands of political entities that exist in the galaxy, and other times they provide humanitarian aid to colonies or outposts in crisis, and yet other times they shut down smugglers or free political prisoners from the very edges of known space.
2218
2319 ## Creating a Character
2420
25 1. **Choose a background.** Your Background will give you dice that you can use in subsequent steps: in particular, it tells you the dice you can use for your **Stats**, your **Traits**, and your **Relationships**.
21 1. **Choose a [](#background).** Your [](#background) will give you dice that you can use in subsequent steps: in particular, it tells you the dice you can use for your **Stats**, your **Traits**, and your **Relationships**.
2622
2723 2. **Select your Stats.** Your Background specified a number of _stat dice_: take these and divide them up among your four **Stats**. The minimum value for a stat is 2d6, and there is no maximum beyond what your stat dice allow.
2824
2925 Your four stats are **Body**, **Mind**, **Soft**, and **Hard**.
3026
31 3. **Decide on your Traits.** Your Background specified a number of _trait dice_: divide these up to give your character **Traits**. A **Trait** is a phrase or sentence that describes a feature of character's personality, acumen, or history that is interesting to your character's story. Assigning dice to a trait means that you think that the trait in question is important in a way that will affect the outcome of a conflict.
27 3. **Decide on your [](#trait)s.** Your Background specified a number of _trait dice_: divide these up to give your character **Traits**. A **Trait** is a phrase or sentence that describes a feature of character's personality, acumen, or history that is interesting to your character's story. Assigning dice to a trait means that you think that the trait in question is important in a way that will affect the outcome of a conflict.
3228
3329 As a player, you have a lot of leeway in how to frame your traits. For example, you might want to phrase them:
3430
3935
4036 Assign each **trait** at least one die. You can assign more than one die to a trait, but each trait must have a consistent die size: you can assign *2d6* to a trait, but you can't assign *1d4 1d6* to a trait.
4137
42 4. **Decide on a few of your Relationships.** Your Background specified a number of _relationship dice_: use a few of these to give your character **Relationships**. A **Relationship** represents your character's relationship and history with another person and how important that history is to your character's story, but doesn't necessarily need to reflect your character's feelings or a breadth of history. You can, for example, assign *1d4* to your character's spouse and *2d8* to a stranger whom your character met in Adullar Station: this doesn't mean that your character loves the stranger more than their spouse, but it does mean that you think the stranger is more interesting to your character's story.
38 4. **Decide on a few of your [](#relationship)s.** Your Background specified a number of _relationship dice_: use a few of these to give your character **Relationships**. A **Relationship** represents your character's relationship and history with another person and how important that history is to your character's story, but doesn't necessarily need to reflect your character's feelings or a breadth of history. You can, for example, assign *1d4* to your character's spouse and *2d8* to a stranger whom your character met in Adullar Station: this doesn't mean that your character loves the stranger more than their spouse, but it does mean that you think the stranger is more interesting to your character's story.
4339
4440 Unlike with your _trait dice_, your _relationship dice_ don't need to be—and shouldn't be!—all assigned at the beginning. Keep some unassigned and then choose to assign them as events progress.
4541
1 <!DOCTYPE html>
2 <html xmlns="http://www.w3.org/1999/xhtml">
3 <head>
4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5 <meta http-equiv="Content-Style-Type" content="text/css" />
6 <meta name="generator" content="pandoc" />$for(author-meta)$
7 <meta name="author" content="$author-meta$" />
8 $endfor$
9 $if(date-meta)$
10 <meta name="date" content="$date-meta$" />
11 $endif$
12 $if(keywords)$
13 <meta name="keywords" content="$for(keywords)$$keywords$$sep$, $endfor$" />
14 $endif$
15 <title>$if(title-prefix)$$title-prefix$ – $endif$$pagetitle$</title>
16 <style type="text/css">
17 @font-face {
18 font-family: raleway;
19 src: url(data:application/x-font-truetype;base64,{{raleway}});
20 }
21 body { font-family: "Fira Sans", sans-serif; }
22 code{white-space: pre;}
23 .main {
24 width: 80%;
25 text-align: justify;
26 margin-left: auto;
27 margin-right: auto;
28 font-size: 18px;
29 line-height: 150%;
30 }
31 h1 {
32 font-family: raleway;
33 font-weight: normal;
34 color: #822;
35 }
36 h2 {
37 font-family: raleway;
38 font-weight: normal;
39 color: #822;
40 }
41 h3 {
42 font-family: raleway;
43 font-weight: normal;
44 color: #822;
45 }
46 .footer {
47 text-align: center;
48 }
49 blockquote {
50 background-color: #f5f5f5;
51 padding-left: 30px;
52 padding-right: 30px;
53 padding-top: 5px;
54 padding-bottom: 5px;
55 border-left: 2px solid black;
56 }
57 p { margin-left: 20pt; margin-right: 20pt; }
58 a { text-decoration: none; color: #822; }
59 a[href="#background"]::after {
60 content: "Background";
61 }
62 a[href="#trait"]::before {
63 content: url(data:image/svg+xml;base64,{{trait-icon}});
64 }
65 a[href="#trait"]::after {
66 content: " Trait";
67 }
68 a[href="#relationship"]::before {
69 content: url(data:image/svg+xml;base64,{{relationship-icon}});
70 }
71 a[href="#relationship"]::after {
72 content: " Relationship";
73 }
74 </style>
75 </head>
76 <body>
77 <div class="main" >
78 <div class="header">
79 <h1 id="if-the-sky-were-crooked">$if(title)$ $title$ $endif$</h1>
80 </div>
81 $body$
82 <div class="footer">
83 $for(author)$ $author$ $endfor$<br/>
84 $if(date)$ $date$ $endif$
85 </div>
86 </div>
87 </body>
88 </html>