wayfinder 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/bin/wayfinder +300 -0
- data/lib/wayfinder.rb +147 -0
- metadata +77 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 04e0689646c906a8aeaa97be76dce05d711a74e1
|
4
|
+
data.tar.gz: 6ab236a77d2786b759654631d85f834ed551886c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 6e06774be9d859c2fe54f3d1af22ec55995ff472fcd52dce7d13af78787df1b59fb8dcc3468a9e0c948209dfcc3cf491308ce174e13bc280d702a269f39db43d
|
7
|
+
data.tar.gz: edb60f0c7417529f9270d36dac1d69115df449b1df01c7fe6212a17a0c30ff2b83e1cb0f72a8f9f31763df76941a9950be1d486cd3bf5790db86f94ba6c4d25d
|
data/bin/wayfinder
ADDED
@@ -0,0 +1,300 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'box'
|
4
|
+
require 'yaml'
|
5
|
+
require 'mote'
|
6
|
+
require 'wayfinder'
|
7
|
+
|
8
|
+
source_data = {}
|
9
|
+
%i(meta stats gear feats buffs skills).each do |source_file|
|
10
|
+
source_data[source_file] = YAML.load_file("#{ source_file.to_s }.yml")
|
11
|
+
end
|
12
|
+
|
13
|
+
character = Wayfinder::Character.new(source_data)
|
14
|
+
template = Mote.parse(Box::FILES['character_sheet.htm'],
|
15
|
+
self,
|
16
|
+
[:character]
|
17
|
+
)
|
18
|
+
|
19
|
+
File.open('character_sheet.htm', 'w') do |f|
|
20
|
+
f.write(template.call(character: character))
|
21
|
+
end
|
22
|
+
|
23
|
+
__END__
|
24
|
+
@@ character_sheet.htm
|
25
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
26
|
+
<html>
|
27
|
+
<head>
|
28
|
+
<meta http-equiv="content-type" content="text-html; charset=utf-8" />
|
29
|
+
<title>Unnamed 1 [0 Points]</title>
|
30
|
+
<style type="text/css">
|
31
|
+
.font4 { font-family: Arial; font-size:4pt; }
|
32
|
+
.font5 { font-family: Arial; font-size:5pt; }
|
33
|
+
.font6 { font-family: Arial; font-size:6pt; }
|
34
|
+
.font7 { font-family: Arial; font-size:7pt; }
|
35
|
+
.font8 { font-family: Arial; font-size:8pt; }
|
36
|
+
.font9 { font-family: Arial; font-size:9pt; }
|
37
|
+
.h { font-family: Arial; font-size:8pt; vertical-align: bottom; }
|
38
|
+
.hs { font-family: Arial; font-size:6pt; border-top-width:1px; border-top: 1pt solid black; vertical-align:top; background: #CCCCCC; }
|
39
|
+
.ah { font-family: Arial; font-size:4pt; text-align:center; }
|
40
|
+
.ab { font-family: Arial; font-size:10pt; text-align:center; color:white; background:black; }
|
41
|
+
.sc { font-family: Arial; font-size: 5pt }
|
42
|
+
.scr { font-family: Arial; font-size: 5pt; text-align:right }
|
43
|
+
.scbr { font-family: Arial; font-size: 5pt; border-right-width:1px; border-right: 1pt solid black; text-align:right}
|
44
|
+
.hph { font-family: Arial; font-size: 7pt; text-align:center; vertical-align:bottom;}
|
45
|
+
.ach { font-family: Arial; font-size: 7pt; text-align:center; vertical-align:middle;}
|
46
|
+
.acb { font-family: Arial; font-size: 9pt; font-weight:bold; text-align:center; vertical-align:middle; border: 1px solid black;}
|
47
|
+
.hphs { font-family: Arial; font-size: 5pt; text-align:center; vertical-align:bottom;}
|
48
|
+
.hpb { font-family: Arial; font-size: 9pt; font-weight:bold; text-align:center; vertical-align:middle; border: 1px solid black;}
|
49
|
+
.hpbb { font-family: Arial; font-size: 9pt; font-weight:bold; color:white; background:black; text-align:center; vertical-align:middle; border: 1px solid black;}
|
50
|
+
.abb { font-family: Arial; font-size:10pt; text-align:center; font-weight:bold; border: 1px solid black;}
|
51
|
+
.abt { font-family: Arial; font-size:10pt; text-align:center; font-weight:bold; border: 5px solid lightgray;}
|
52
|
+
.sptab { font-family: Arial; vertical-align:top;border: 1px solid black; text-align:center;font-size:8pt;}
|
53
|
+
.spname { font-family: Arial; vertical-align:top;border: 1px solid black; text-align:left;font-size:8pt;}
|
54
|
+
.sptop { font-family: Arial; vertical-align:top;border: 1px solid black; text-align:center;font-size:8pt; color:white;}
|
55
|
+
.splevel { font-family: Arial; background:black; text-align:center;font-size:9pt; color:white;}
|
56
|
+
.sphead { font-family: Arial; background:black; text-align:center;font-size:12pt; color:white;}
|
57
|
+
.spcomp { font-family: Arial; vertical-align:top; text-align:left;font-size:6pt;}
|
58
|
+
.spcomp2 { font-family: Arial; vertical-align:top; text-align:left;font-size:5pt;}
|
59
|
+
.spcomp3 { font-family: Arial; vertical-align:top; text-align:left;font-size:9pt;}
|
60
|
+
.topline {
|
61
|
+
border-top-width:1px;
|
62
|
+
border-top: 1pt solid black;
|
63
|
+
font-family: Arial;
|
64
|
+
font-size:6pt;
|
65
|
+
}
|
66
|
+
.border {
|
67
|
+
border: 1px solid black;
|
68
|
+
}
|
69
|
+
.border7 {
|
70
|
+
border: 1px solid black;
|
71
|
+
font-size:7pt;
|
72
|
+
}
|
73
|
+
.border8 {
|
74
|
+
border: 1px solid black;
|
75
|
+
font-size:8pt;
|
76
|
+
}
|
77
|
+
.border9 {
|
78
|
+
border: 1px solid black;
|
79
|
+
font-size:9pt;
|
80
|
+
}
|
81
|
+
.border10 {
|
82
|
+
border: 1px solid black;
|
83
|
+
}
|
84
|
+
.tempborder {
|
85
|
+
font-size:10pt; border: 5px solid lightgray;
|
86
|
+
}
|
87
|
+
.borderbottom {
|
88
|
+
border-bottom-width:1px;
|
89
|
+
border-bottom: 1pt solid black;
|
90
|
+
}
|
91
|
+
.borderright {
|
92
|
+
border-right-width:1px;
|
93
|
+
border-right: 1pt solid black;
|
94
|
+
}
|
95
|
+
.c, .wbc {
|
96
|
+
text-align: center;
|
97
|
+
}
|
98
|
+
TD {
|
99
|
+
font-family: Arial
|
100
|
+
}
|
101
|
+
span.notes p {margin-top:0; margin-bottom:0;}
|
102
|
+
</style>
|
103
|
+
</head>
|
104
|
+
<body bgcolor="white">
|
105
|
+
<table border="0" cellpadding="0" cellspacing="0" width="100%" summary="Master Page Table">
|
106
|
+
<tr>
|
107
|
+
<td rowspan="2" valign="top">
|
108
|
+
<!-- START Abilities Table -->
|
109
|
+
<table summary="Ability Table">
|
110
|
+
<tr>
|
111
|
+
<td align="center" width="20%" class="font4">ABILITY<br />NAME</td>
|
112
|
+
<td align="center" width="20%" class="font4">ABILITY<br />SCORE</td>
|
113
|
+
<td align="center" width="20%" class="font4">ABILITY<br />MODIFIER</td>
|
114
|
+
</tr>
|
115
|
+
<tr>
|
116
|
+
<td class="ab"><b>STR</b><font style="font-size:5pt"><br />Strength</font></td>
|
117
|
+
<td class="abb">{{ character.strength }}</td>
|
118
|
+
<td class="abb">{{ character.strength_modifier }}</td>
|
119
|
+
</tr>
|
120
|
+
<tr>
|
121
|
+
<td class="ab"><b>DEX</b><font style="font-size:5pt"><br />Dexterity</font></td>
|
122
|
+
<td class="abb">{{ character.dexterity }}</td>
|
123
|
+
<td class="abb">{{ character.dexterity_modifier }}</td>
|
124
|
+
</tr>
|
125
|
+
<tr>
|
126
|
+
<td class="ab"><b>CON</b><font style="font-size:5pt"><br />Constitution</font></td>
|
127
|
+
<td class="abb">{{ character.constitution }}</td>
|
128
|
+
<td class="abb">{{ character.constitution_modifier }}</td>
|
129
|
+
</tr>
|
130
|
+
<tr>
|
131
|
+
<td class="ab"><b>INT</b><font style="font-size:5pt"><br />Intelligence</font></td>
|
132
|
+
<td class="abb">{{ character.intelligence }}</td>
|
133
|
+
<td class="abb">{{ character.intelligence_modifier }}</td>
|
134
|
+
</tr>
|
135
|
+
<tr>
|
136
|
+
<td class="ab"><b>WIS</b><font style="font-size:5pt"><br />Wisdom</font></td>
|
137
|
+
<td class="abb">{{ character.wisdom }}</td>
|
138
|
+
<td class="abb">{{ character.wisdom_modifier }}</td>
|
139
|
+
</tr>
|
140
|
+
<tr>
|
141
|
+
<td class="ab"><b>CHA</b><font style="font-size:5pt"><br />Charisma</font></td>
|
142
|
+
<td class="abb">{{ character.charisma }}</td>
|
143
|
+
<td class="abb">{{ character.charisma_modifier }}</td>
|
144
|
+
</tr>
|
145
|
+
</table>
|
146
|
+
<!-- STOP Abilities Table -->
|
147
|
+
|
148
|
+
</td>
|
149
|
+
<td colspan="2" valign="top">
|
150
|
+
|
151
|
+
<!-- START Hit point Table -->
|
152
|
+
<table summary="HP Table">
|
153
|
+
<tr>
|
154
|
+
<td align="center" width="50"></td>
|
155
|
+
<td align="center" width="25" valign="bottom"></td>
|
156
|
+
<td align="center"></td>
|
157
|
+
<td align="center" width="119" class="font5"><br />WOUNDS/CURRENT HP</td>
|
158
|
+
<td align="center"></td>
|
159
|
+
<td align="center" width="60" class="font5"><br />DAMAGE<br />REDUCTION</td>
|
160
|
+
<td align="center"></td>
|
161
|
+
<td align="center" width="60" class="font5"><br />SPEED</td>
|
162
|
+
</tr>
|
163
|
+
<tr>
|
164
|
+
<td align="center" bgcolor="black"><font style="font-size:9pt" color="white"><b>HP</b></font><font style="font-size:5pt" color="white"><br />Hit Points</font></td>
|
165
|
+
<td align="center" class="border9"><b>{{ character.hp }}</b></td>
|
166
|
+
<td align="center" class="font7"><br /></td>
|
167
|
+
<td align="center" class="border9">{{ character.received_damage }}<br /></td>
|
168
|
+
<td align="center" class="font7"><br /></td>
|
169
|
+
<td align="center" class="border9"><b> </b></td>
|
170
|
+
<td align="center" class="font7"><br /></td>
|
171
|
+
<td align="center" class="border9"><b><br /></b></td>
|
172
|
+
</tr>
|
173
|
+
</table>
|
174
|
+
<!-- STOP Hit point Table -->
|
175
|
+
<!-- START AC Table -->
|
176
|
+
<table summary="AC Table">
|
177
|
+
<tr>
|
178
|
+
<td align="center" bgcolor="black"><font style="font-size:9pt" color="white"><b>AC</b></font><font style="font-size:5pt" color="white"><br />Armour Class</font></td>
|
179
|
+
<!-- Thomas Behr 13-02-02: replaced old tokens with new ones -->
|
180
|
+
<td align="center" class="border9"><b>{{ character.ac }}</b></td>
|
181
|
+
</tr>
|
182
|
+
<tr>
|
183
|
+
<td align="center" width="50"></td>
|
184
|
+
</tr>
|
185
|
+
</table>
|
186
|
+
<!-- STOP AC Table -->
|
187
|
+
</td>
|
188
|
+
</tr>
|
189
|
+
<tr>
|
190
|
+
<td valign="top">
|
191
|
+
<!-- START Initiative Table -->
|
192
|
+
<table width="35%" summary="Initiative Table">
|
193
|
+
<tr>
|
194
|
+
<td align="center" bgcolor="black"><font style="font-size:9pt" color="white"><b>INITIATIVE</b></font><font style="font-size:5pt" color="white"><br />Modifier</font></td>
|
195
|
+
<td align="center" class="border9"><b>{{ character.initiative }}</b></td>
|
196
|
+
</tr>
|
197
|
+
<tr>
|
198
|
+
</tr>
|
199
|
+
</table>
|
200
|
+
<!-- STOP Initiative Table -->
|
201
|
+
<!-- START Base Attack Table -->
|
202
|
+
<table width="100%" summary="Base Attack Table">
|
203
|
+
<tr>
|
204
|
+
<td align="center" bgcolor="black"><font style="font-size:9pt" color="white"><b>BASE ATTACK</b></font><font style="font-size:5pt" color="white"><br />Bonus</font></td>
|
205
|
+
<td align="center" width="94" class="border10"><b>{{ character.bab }} <br /></b></td>
|
206
|
+
<td align="center" width="50%"><br /></td>
|
207
|
+
</tr>
|
208
|
+
</table>
|
209
|
+
<!-- STOP Base Attack Table -->
|
210
|
+
</td>
|
211
|
+
<td rowspan="2" valign="top" width="50%">
|
212
|
+
|
213
|
+
<!-- STOP PSI Power Points Table -->
|
214
|
+
<!-- START Skills Table -->
|
215
|
+
<table cellpadding="0" cellspacing="0" border="0" width="100%" summary="Skills Table">
|
216
|
+
<tr>
|
217
|
+
<td colspan="3" bgcolor="black" align="center"><font style="font-size: 9pt" color="white"><b>SKILLS</b></font>
|
218
|
+
</td>
|
219
|
+
</tr>
|
220
|
+
<tr>
|
221
|
+
<td align="left" class="border" valign="top">
|
222
|
+
<table cellpadding="0" cellspacing="0" border="0" width="100%" summary="Skills Table">
|
223
|
+
<tr><td align="left" class="borderbottom"><font style="font-size: 5pt"> Name</font></td><td align="left" class="borderbottom"><font style="font-size: 5pt">Abb</font></td><td align="right" class="borderbottom"><font style="font-size: 5pt">Rnk</font></td><td align="right" class="borderbottom"><font style="font-size: 5pt">Tot </font></td><td align="left" class="borderbottom"><font style="font-size: 5pt"> Name</font></td><td align="left" class="borderbottom"><font style="font-size: 5pt">Abb</font></td><td align="right" class="borderbottom"><font style="font-size: 5pt">Rnk</font></td><td align="right" class="borderbottom"><font style="font-size: 5pt">Tot </font></td><td align="left" class="borderbottom"><font style="font-size: 5pt"> Name</font></td><td align="left" class="borderbottom"><font style="font-size: 5pt">Abb</font></td><td align="right" class="borderbottom"><font style="font-size: 5pt">Rnk</font></td><td align="right" class="borderbottom"><font style="font-size: 5pt">Tot </font></td><tr>
|
224
|
+
<tr><td align="left"><font style="font-size: 5pt"> Acrobatics</font></td><td align="left"><font style="font-size: 5pt">DEX</font></td><td align="right"><font style="font-size: 5pt">0.0</font></td><td align="right" class="borderright"><font style="font-size: 5pt">-11 </font></td><td align="left"><font style="font-size: 5pt"> Disguise</font></td><td align="left"><font style="font-size: 5pt">CHA</font></td><td align="right"><font style="font-size: 5pt">0.0</font></td><td align="right" class="borderright"><font style="font-size: 5pt">-5 </font></td><td align="left"><font style="font-size: 5pt"> Ride</font></td><td align="left"><font style="font-size: 5pt">DEX</font></td><td align="right"><font style="font-size: 5pt">0.0</font></td><td align="right" class="borderright"><font style="font-size: 5pt">-11 </font></td><tr><tr><td align="left"><font style="font-size: 5pt"> Acrobatics (Jump)</font></td><td align="left"><font style="font-size: 5pt">DEX</font></td><td align="right"><font style="font-size: 5pt">0.0</font></td><td align="right" class="borderright"><font style="font-size: 5pt">-23 </font></td><td align="left"><font style="font-size: 5pt"> Escape Artist</font></td><td align="left"><font style="font-size: 5pt">DEX</font></td><td align="right"><font style="font-size: 5pt">0.0</font></td><td align="right" class="borderright"><font style="font-size: 5pt">-11 </font></td><td align="left"><font style="font-size: 5pt"> Sense Motive</font></td><td align="left"><font style="font-size: 5pt">WIS</font></td><td align="right"><font style="font-size: 5pt">0.0</font></td><td align="right" class="borderright"><font style="font-size: 5pt">-5 </font></td><tr><tr><td align="left"><font style="font-size: 5pt"> Appraise</font></td><td align="left"><font style="font-size: 5pt">INT</font></td><td align="right"><font style="font-size: 5pt">0.0</font></td><td align="right" class="borderright"><font style="font-size: 5pt">-5 </font></td><td align="left"><font style="font-size: 5pt"> Fly</font></td><td align="left"><font style="font-size: 5pt">DEX</font></td><td align="right"><font style="font-size: 5pt">0.0</font></td><td align="right" class="borderright"><font style="font-size: 5pt">-11 </font></td><td align="left"><font style="font-size: 5pt"> Stealth</font></td><td align="left"><font style="font-size: 5pt">DEX</font></td><td align="right"><font style="font-size: 5pt">0.0</font></td><td align="right" class="borderright"><font style="font-size: 5pt">-11 </font></td><tr><tr><td align="left"><font style="font-size: 5pt"> Bluff</font></td><td align="left"><font style="font-size: 5pt">CHA</font></td><td align="right"><font style="font-size: 5pt">0.0</font></td><td align="right" class="borderright"><font style="font-size: 5pt">-5 </font></td><td align="left"><font style="font-size: 5pt"> Heal</font></td><td align="left"><font style="font-size: 5pt">WIS</font></td><td align="right"><font style="font-size: 5pt">0.0</font></td><td align="right" class="borderright"><font style="font-size: 5pt">-5 </font></td><td align="left"><font style="font-size: 5pt"> Survival</font></td><td align="left"><font style="font-size: 5pt">WIS</font></td><td align="right"><font style="font-size: 5pt">0.0</font></td><td align="right" class="borderright"><font style="font-size: 5pt">-5 </font></td><tr><tr><td align="left"><font style="font-size: 5pt"> Climb</font></td><td align="left"><font style="font-size: 5pt">STR</font></td><td align="right"><font style="font-size: 5pt">0.0</font></td><td align="right" class="borderright"><font style="font-size: 5pt">-3 </font></td><td align="left"><font style="font-size: 5pt"> Intimidate</font></td><td align="left"><font style="font-size: 5pt">CHA</font></td><td align="right"><font style="font-size: 5pt">0.0</font></td><td align="right" class="borderright"><font style="font-size: 5pt">-5 </font></td><td align="left"><font style="font-size: 5pt"> Swim</font></td><td align="left"><font style="font-size: 5pt">STR</font></td><td align="right"><font style="font-size: 5pt">0.0</font></td><td align="right" class="borderright"><font style="font-size: 5pt">-3 </font></td><tr><tr><td align="left"><font style="font-size: 5pt"> Craft (Untrained)</font></td><td align="left"><font style="font-size: 5pt">INT</font></td><td align="right"><font style="font-size: 5pt">0.0</font></td><td align="right" class="borderright"><font style="font-size: 5pt">-5 </font></td><td align="left"><font style="font-size: 5pt"> Perception</font></td><td align="left"><font style="font-size: 5pt">WIS</font></td><td align="right"><font style="font-size: 5pt">0.0</font></td><td align="right" class="borderright"><font style="font-size: 5pt">-5 </font></td><tr><tr><td align="left"><font style="font-size: 5pt"> Diplomacy</font></td><td align="left"><font style="font-size: 5pt">CHA</font></td><td align="right"><font style="font-size: 5pt">0.0</font></td><td align="right" class="borderright"><font style="font-size: 5pt">-5 </font></td><td align="left"><font style="font-size: 5pt"> Perform (Untrained)</font></td><td align="left"><font style="font-size: 5pt">CHA</font></td><td align="right"><font style="font-size: 5pt">0.0</font></td><td align="right" class="borderright"><font style="font-size: 5pt">-5 </font></td><tr>
|
225
|
+
</table>
|
226
|
+
</td>
|
227
|
+
</tr>
|
228
|
+
</table>
|
229
|
+
<!-- STOP Skills Table -->
|
230
|
+
<!-- START Special Attacks Table -->
|
231
|
+
<!-- STOP Special Attacks Table -->
|
232
|
+
<!-- START Animal Tricks Table -->
|
233
|
+
<!-- STOP Animal Tricks Table -->
|
234
|
+
<!-- START Special Quality Table -->
|
235
|
+
<!-- STOP Special Quality Table -->
|
236
|
+
<!-- START Special Abilities Table -->
|
237
|
+
|
238
|
+
<!-- STOP Special Abilities Table -->
|
239
|
+
<!-- START Feats Table -->
|
240
|
+
<table cellpadding="0" cellspacing="0" border="0" width="100%" summary="Feats Table">
|
241
|
+
<tr>
|
242
|
+
<td colspan="1" bgcolor="black" align="center"><font style="font-size: 9pt" color="white"><b>FEATS</b></font></td>
|
243
|
+
</tr>
|
244
|
+
<tr>
|
245
|
+
<td align="left" width="100%" class="border7"></td>
|
246
|
+
</tr>
|
247
|
+
</table>
|
248
|
+
<!-- STOP Feats Table -->
|
249
|
+
|
250
|
+
</td>
|
251
|
+
</tr>
|
252
|
+
<tr>
|
253
|
+
<td colspan="2" valign="top">
|
254
|
+
<!-- START Saving Throws Table -->
|
255
|
+
<table width="25%" summary="Saving Throws">
|
256
|
+
<tr>
|
257
|
+
<td align="center" bgcolor="black"><font style="font-size:10pt" color="white"><b>Fortitude</b></font>
|
258
|
+
<font style="font-size:5pt" color="white"><br />
|
259
|
+
Constitution
|
260
|
+
</font>
|
261
|
+
</td>
|
262
|
+
<td align="center" class="border9"><b>{{ character.fortitude }}</b></td>
|
263
|
+
</tr>
|
264
|
+
<tr>
|
265
|
+
<td align="center" bgcolor="black"><font style="font-size:10pt" color="white"><b>Reflex</b></font>
|
266
|
+
<font style="font-size:5pt" color="white"><br />
|
267
|
+
Dexterity
|
268
|
+
</font>
|
269
|
+
</td>
|
270
|
+
<td align="center" class="border9"><b>{{ character.reflex }}</b></td>
|
271
|
+
</tr>
|
272
|
+
<tr>
|
273
|
+
<td align="center" bgcolor="black"><font style="font-size:10pt" color="white"><b>Will</b></font>
|
274
|
+
<font style="font-size:5pt" color="white"><br />
|
275
|
+
Wisdom
|
276
|
+
</font>
|
277
|
+
</td>
|
278
|
+
<td align="center" class="border9"><b>{{ character.will }}</b></td>
|
279
|
+
</tr>
|
280
|
+
</table>
|
281
|
+
<!-- STOP Saving Throws Table -->
|
282
|
+
<!-- START Unarmed Attack Table -->
|
283
|
+
<table cellpadding="0" cellspacing="0" border="0" width="100%" summary="Unarmed Attack Table">
|
284
|
+
<tr>
|
285
|
+
<td align="center" height="25" bgcolor="black" rowspan="2" width="125"><font style="font-size:10pt" color="white"><b>Attack</b></font></td>
|
286
|
+
<td align="center" bgcolor="black" width="110" height="15"><font style="font-size:6pt" color="white"><b>TOTAL ATTACK BONUS</b></font></td>
|
287
|
+
<td align="center" bgcolor="black" width="60" height="15"><font style="font-size:6pt" color="white"><b>DAMAGE</b></font></td>
|
288
|
+
<td align="center" bgcolor="black" width="60" height="15"><font style="font-size:6pt" color="white"><b>CRITICAL</b></font></td>
|
289
|
+
</tr>
|
290
|
+
<tr><td align="center" bgcolor="white" class="border8"><b>{{ character.full_attack.join('/') }}<br /></b></td>
|
291
|
+
<td align="center" bgcolor="white" class="border8"><b>{{ character.damage }}<br /></b></td>
|
292
|
+
<td align="center" bgcolor="white" class="border8"><b>--<br /></b></td>
|
293
|
+
</tr>
|
294
|
+
</table>
|
295
|
+
<!-- STOP Saving Throws Table -->
|
296
|
+
</td>
|
297
|
+
</tr>
|
298
|
+
</table>
|
299
|
+
</body>
|
300
|
+
</html>
|
data/lib/wayfinder.rb
ADDED
@@ -0,0 +1,147 @@
|
|
1
|
+
module Wayfinder
|
2
|
+
|
3
|
+
BASE_STATS = %w(strength dexterity constitution wisdom charisma intelligence)
|
4
|
+
|
5
|
+
class Character
|
6
|
+
|
7
|
+
## :source must be a hash with the following keys, each containing the data of
|
8
|
+
## its appropriate yaml file.
|
9
|
+
#
|
10
|
+
# * meta - contains hp, base attack bonus, saving throws, xp, name,
|
11
|
+
# and other metadata.
|
12
|
+
# * stats - contains basic stats, str, dex, con, wis, int and cha.
|
13
|
+
# * gear - contains descriptions of items that modify the final
|
14
|
+
# computed stats for the character.
|
15
|
+
# * feats - character feats, similar to gear in that it contributes
|
16
|
+
# to the final stack.
|
17
|
+
# * buffs - buffs are temporary modifiers that are expected to change
|
18
|
+
# often, but act much like feats and gear.
|
19
|
+
# * skills - skills contain data on the ranks and associated stats for
|
20
|
+
# each given skill.
|
21
|
+
#
|
22
|
+
## :modifier_stack is an array of gear, feats and buffs and is what will be
|
23
|
+
## iterated while computing final modifiers for all character stats.
|
24
|
+
|
25
|
+
attr_accessor :source, :modifier_stack
|
26
|
+
|
27
|
+
def initialize(source_data = {})
|
28
|
+
self.source = source_data
|
29
|
+
self.modifier_stack = [
|
30
|
+
self.source[:gear],
|
31
|
+
self.source[:feats],
|
32
|
+
self.source[:buffs]
|
33
|
+
]
|
34
|
+
end
|
35
|
+
|
36
|
+
BASE_STATS.each do |base_stat|
|
37
|
+
define_method(base_stat) do
|
38
|
+
self.source[:stats][base_stat] + modifier_for(base_stat)
|
39
|
+
end
|
40
|
+
|
41
|
+
define_method("#{ base_stat }_modifier") do
|
42
|
+
stat = self.source[:stats][base_stat] + modifier_for(base_stat)
|
43
|
+
(stat - 10) / 2
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
## Returns an array of object who affect the specified attribute
|
48
|
+
def stack_for(attribute)
|
49
|
+
self.modifier_stack.map(&:values).flatten.keep_if do |item|
|
50
|
+
item['active'] && item['modifiers'].keys.include?(attribute)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
## Outputs the final modifier for the specified attribute.
|
55
|
+
def modifier_for(attribute)
|
56
|
+
modifier = 0
|
57
|
+
stack_for(attribute).each do |mod|
|
58
|
+
modifier += mod['modifiers'][attribute]
|
59
|
+
end
|
60
|
+
|
61
|
+
modifier
|
62
|
+
end
|
63
|
+
|
64
|
+
## Combat
|
65
|
+
|
66
|
+
def hp
|
67
|
+
self.source[:meta]['hp'] + modifier_for('hp')
|
68
|
+
end
|
69
|
+
|
70
|
+
def received_damage
|
71
|
+
self.source[:meta]['received_damage']
|
72
|
+
end
|
73
|
+
|
74
|
+
def current_hp
|
75
|
+
self.hp - self.received_damage
|
76
|
+
end
|
77
|
+
|
78
|
+
def initiative
|
79
|
+
dexterity_modifier + modifier_for('initiative')
|
80
|
+
end
|
81
|
+
|
82
|
+
def bab
|
83
|
+
self.source[:meta]['bab']
|
84
|
+
end
|
85
|
+
|
86
|
+
def to_hit(base_attack = self.bab)
|
87
|
+
base_attack + strength_modifier + modifier_for('to_hit')
|
88
|
+
end
|
89
|
+
|
90
|
+
def damage
|
91
|
+
strength_modifier + modifier_for('damage')
|
92
|
+
end
|
93
|
+
|
94
|
+
def full_attack
|
95
|
+
attack_babs = [self.bab]
|
96
|
+
|
97
|
+
## Fuck yeah I used a while in ruby, fuck you, fuck everything, EVERYTHING.
|
98
|
+
while attack_babs.last - 5 > 1
|
99
|
+
attack_babs << attack_babs.last - 5
|
100
|
+
end
|
101
|
+
|
102
|
+
attack_babs.map { |attack| to_hit(attack) }
|
103
|
+
end
|
104
|
+
|
105
|
+
def ac
|
106
|
+
10 + dexterity_modifier + modifier_for('ac')
|
107
|
+
end
|
108
|
+
|
109
|
+
## Saving Throws
|
110
|
+
def saving_throws
|
111
|
+
{
|
112
|
+
fortitude: self.fortitude,
|
113
|
+
reflex: self.reflex,
|
114
|
+
will: self.will
|
115
|
+
}
|
116
|
+
end
|
117
|
+
|
118
|
+
def fortitude
|
119
|
+
self.source[:meta]['fortitude'] + constitution_modifier + modifier_for('fortitude')
|
120
|
+
end
|
121
|
+
|
122
|
+
def reflex
|
123
|
+
self.source[:meta]['reflex'] + dexterity_modifier + modifier_for('reflex')
|
124
|
+
end
|
125
|
+
|
126
|
+
def will
|
127
|
+
self.source[:meta]['will'] + wisdom_modifier + modifier_for('will')
|
128
|
+
end
|
129
|
+
|
130
|
+
def skill(skill_name)
|
131
|
+
skill = self.source[:skills].fetch(skill_name, {})
|
132
|
+
computed_score = skill.fetch('ranks', 0) + self.send("#{ skill['stat'] }_modifier") + modifier_for(skill_name)
|
133
|
+
|
134
|
+
if skill['class']
|
135
|
+
computed_score += 3
|
136
|
+
end
|
137
|
+
|
138
|
+
computed_score
|
139
|
+
end
|
140
|
+
|
141
|
+
def skills
|
142
|
+
all_skills = {}
|
143
|
+
self.source[:skills].keys.each { |s| all_skills[s] = self.skill(s) }
|
144
|
+
all_skills
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
metadata
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: wayfinder
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- PoTe
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-10-18 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: box
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: mote
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: |-
|
42
|
+
Wayfinder assumes you'll keep your character described in yaml following a set of conventions, all the data points are
|
43
|
+
aggregated together to generate a nicely formatted output from the input data, with all the numbers crunched in for you.
|
44
|
+
email:
|
45
|
+
- pote@tardis.com.uy
|
46
|
+
executables:
|
47
|
+
- wayfinder
|
48
|
+
extensions: []
|
49
|
+
extra_rdoc_files: []
|
50
|
+
files:
|
51
|
+
- bin/wayfinder
|
52
|
+
- lib/wayfinder.rb
|
53
|
+
homepage: https://github.com/pote/wayfinder
|
54
|
+
licenses:
|
55
|
+
- MIT
|
56
|
+
metadata: {}
|
57
|
+
post_install_message:
|
58
|
+
rdoc_options: []
|
59
|
+
require_paths:
|
60
|
+
- lib
|
61
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
62
|
+
requirements:
|
63
|
+
- - '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - '>='
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
71
|
+
requirements: []
|
72
|
+
rubyforge_project:
|
73
|
+
rubygems_version: 2.0.3
|
74
|
+
signing_key:
|
75
|
+
specification_version: 4
|
76
|
+
summary: Pathfinder RPG character bookkeeping made easy.
|
77
|
+
test_files: []
|