Compare commits
10 Commits
Author | SHA1 | Date |
---|---|---|
|
ffd5dc4d77 | 2 years ago |
|
e6d89e11a7 | 2 years ago |
|
d740e9a96a | 2 years ago |
|
4e570a2ba2 | 2 years ago |
|
a6ce5d9635 | 2 years ago |
|
458721c55b | 2 years ago |
|
962f5fff48 | 2 years ago |
|
050c71e872 | 2 years ago |
|
0df9eb8bca | 2 years ago |
|
06f581fb78 | 2 years ago |
@ -1,71 +1,73 @@ |
||||
GEM |
||||
remote: https://rubygems.org/ |
||||
specs: |
||||
Ascii85 (1.1.0) |
||||
Ascii85 (1.0.3) |
||||
afm (0.2.2) |
||||
daemons (1.4.1) |
||||
deep_merge (1.2.2) |
||||
backports (3.15.0) |
||||
daemons (1.3.1) |
||||
eventmachine (1.2.7) |
||||
ffi (1.15.5) |
||||
ffi (1.11.1) |
||||
hashery (2.1.2) |
||||
listen (3.8.0) |
||||
rb-fsevent (~> 0.10, >= 0.10.3) |
||||
rb-inotify (~> 0.9, >= 0.9.10) |
||||
multi_json (1.15.0) |
||||
mustermann (3.0.0) |
||||
ruby2_keywords (~> 0.0.1) |
||||
pdf-core (0.9.0) |
||||
pdf-reader (2.11.0) |
||||
Ascii85 (~> 1.0) |
||||
listen (3.1.5) |
||||
rb-fsevent (~> 0.9, >= 0.9.4) |
||||
rb-inotify (~> 0.9, >= 0.9.7) |
||||
ruby_dep (~> 1.2) |
||||
multi_json (1.13.1) |
||||
mustermann (1.0.3) |
||||
pdf-core (0.7.0) |
||||
pdf-reader (2.2.0) |
||||
Ascii85 (~> 1.0.0) |
||||
afm (~> 0.2.1) |
||||
hashery (~> 2.0) |
||||
ruby-rc4 |
||||
ttfunk |
||||
prawn (2.4.0) |
||||
pdf-core (~> 0.9.0) |
||||
ttfunk (~> 1.7) |
||||
prawn-templates (0.1.2) |
||||
prawn (2.2.2) |
||||
pdf-core (~> 0.7.0) |
||||
ttfunk (~> 1.5) |
||||
prawn-templates (0.1.1) |
||||
pdf-reader (~> 2.0) |
||||
prawn (~> 2.2) |
||||
rack (2.2.8) |
||||
rack-protection (3.1.0) |
||||
rack (~> 2.2, >= 2.2.4) |
||||
rb-fsevent (0.11.2) |
||||
rb-inotify (0.10.1) |
||||
rack (2.0.7) |
||||
rack-protection (2.0.5) |
||||
rack |
||||
rb-fsevent (0.10.3) |
||||
rb-inotify (0.10.0) |
||||
ffi (~> 1.0) |
||||
rerun (0.14.0) |
||||
rerun (0.13.0) |
||||
listen (~> 3.0) |
||||
ruby-rc4 (0.1.5) |
||||
ruby2_keywords (0.0.5) |
||||
sinatra (3.1.0) |
||||
mustermann (~> 3.0) |
||||
rack (~> 2.2, >= 2.2.4) |
||||
rack-protection (= 3.1.0) |
||||
ruby_dep (1.5.0) |
||||
rubyzip (2.3.2) |
||||
sinatra (2.0.5) |
||||
mustermann (~> 1.0) |
||||
rack (~> 2.0) |
||||
rack-protection (= 2.0.5) |
||||
tilt (~> 2.0) |
||||
sinatra-contrib (3.1.0) |
||||
sinatra-contrib (2.0.5) |
||||
backports (>= 2.8.2) |
||||
multi_json |
||||
mustermann (~> 3.0) |
||||
rack-protection (= 3.1.0) |
||||
sinatra (= 3.1.0) |
||||
tilt (~> 2.0) |
||||
thin (1.8.2) |
||||
mustermann (~> 1.0) |
||||
rack-protection (= 2.0.5) |
||||
sinatra (= 2.0.5) |
||||
tilt (>= 1.3, < 3) |
||||
thin (1.7.2) |
||||
daemons (~> 1.0, >= 1.0.9) |
||||
eventmachine (~> 1.0, >= 1.0.4) |
||||
rack (>= 1, < 3) |
||||
tilt (2.2.0) |
||||
ttfunk (1.7.0) |
||||
tilt (2.0.9) |
||||
ttfunk (1.5.1) |
||||
|
||||
PLATFORMS |
||||
x86_64-linux |
||||
ruby |
||||
|
||||
DEPENDENCIES |
||||
deep_merge (~> 1.2, >= 1.2.1) |
||||
prawn |
||||
prawn-templates |
||||
prawn (= 2.2.2) |
||||
prawn-templates (= 0.1.1) |
||||
rerun |
||||
rubyzip |
||||
sinatra |
||||
sinatra-contrib |
||||
thin |
||||
|
||||
BUNDLED WITH |
||||
2.3.7 |
||||
1.17.2 |
||||
|
@ -1 +0,0 @@ |
||||
* |
@ -0,0 +1,114 @@ |
||||
[ |
||||
{ |
||||
"range": [ |
||||
1, |
||||
20 |
||||
], |
||||
"m": 6, |
||||
"p": 13 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
21, |
||||
30 |
||||
], |
||||
"m": 7, |
||||
"p": 13 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
31, |
||||
50 |
||||
], |
||||
"m": 7, |
||||
"p": 14 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
51, |
||||
76 |
||||
], |
||||
"m": 8, |
||||
"p": 15 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
77, |
||||
111 |
||||
], |
||||
"m": 8, |
||||
"p": 16 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
112, |
||||
151 |
||||
], |
||||
"m": 9, |
||||
"p": 16 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
152, |
||||
199 |
||||
], |
||||
"m": 9, |
||||
"p": 17 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
200, |
||||
245 |
||||
], |
||||
"m": 10, |
||||
"p": 18 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
246, |
||||
300 |
||||
], |
||||
"m": 11, |
||||
"p": 17 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
301, |
||||
345 |
||||
], |
||||
"m": 11, |
||||
"p": 16 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
346, |
||||
396 |
||||
], |
||||
"m": 12, |
||||
"p": 15 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
397, |
||||
445 |
||||
], |
||||
"m": 11, |
||||
"p": 14 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
446, |
||||
525 |
||||
], |
||||
"m": 11, |
||||
"p": 13 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
526, |
||||
600 |
||||
], |
||||
"m": 10, |
||||
"p": 12 |
||||
} |
||||
] |
@ -0,0 +1,146 @@ |
||||
[ |
||||
{ |
||||
"range": [ |
||||
1, |
||||
25 |
||||
], |
||||
"m": 7, |
||||
"p": 13 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
26, |
||||
60 |
||||
], |
||||
"m": 8, |
||||
"p": 13 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
61, |
||||
100 |
||||
], |
||||
"m": 9, |
||||
"p": 14 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
101, |
||||
125 |
||||
], |
||||
"m": 9, |
||||
"p": 15 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
126, |
||||
160 |
||||
], |
||||
"m": 10, |
||||
"p": 16 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
161, |
||||
225 |
||||
], |
||||
"m": 10, |
||||
"p": 17 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
226, |
||||
325 |
||||
], |
||||
"m": 11, |
||||
"p": 17 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
326, |
||||
425 |
||||
], |
||||
"m": 12, |
||||
"p": 17 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
426, |
||||
525 |
||||
], |
||||
"m": 13, |
||||
"p": 18 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
526, |
||||
625 |
||||
], |
||||
"m": 13, |
||||
"p": 19 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
626, |
||||
725 |
||||
], |
||||
"m": 14, |
||||
"p": 19 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
726, |
||||
825 |
||||
], |
||||
"m": 14, |
||||
"p": 20 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
826, |
||||
925 |
||||
], |
||||
"m": 15, |
||||
"p": 20 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
926, |
||||
1025 |
||||
], |
||||
"m": 15, |
||||
"p": 21 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
1026, |
||||
1125 |
||||
], |
||||
"m": 15, |
||||
"p": 22 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
1126, |
||||
1225 |
||||
], |
||||
"m": 15, |
||||
"p": 23 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
1226, |
||||
1325 |
||||
], |
||||
"m": 15, |
||||
"p": 24 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
1326, |
||||
9999 |
||||
], |
||||
"m": 16, |
||||
"p": 24 |
||||
} |
||||
] |
@ -0,0 +1,90 @@ |
||||
[ |
||||
{ |
||||
"range": [ |
||||
1, |
||||
10 |
||||
], |
||||
"m": 5, |
||||
"p": 10 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
11, |
||||
14 |
||||
], |
||||
"m": 6, |
||||
"p": 13 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
15, |
||||
16 |
||||
], |
||||
"m": 6, |
||||
"p": 16 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
17, |
||||
25 |
||||
], |
||||
"m": 7, |
||||
"p": 16 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
26, |
||||
29 |
||||
], |
||||
"m": 7, |
||||
"p": 15 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
30, |
||||
35 |
||||
], |
||||
"m": 7, |
||||
"p": 14 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
36, |
||||
40 |
||||
], |
||||
"m": 7, |
||||
"p": 13 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
41, |
||||
55 |
||||
], |
||||
"m": 7, |
||||
"p": 12 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
56, |
||||
65 |
||||
], |
||||
"m": 7, |
||||
"p": 11 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
66, |
||||
79 |
||||
], |
||||
"m": 7, |
||||
"p": 10 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
80, |
||||
100 |
||||
], |
||||
"m": 6, |
||||
"p": 9 |
||||
} |
||||
] |
@ -0,0 +1,98 @@ |
||||
[ |
||||
{ |
||||
"range": [ |
||||
1, |
||||
10 |
||||
], |
||||
"m": 3, |
||||
"p": 10 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
11, |
||||
16 |
||||
], |
||||
"m": 4, |
||||
"p": 11 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
17, |
||||
22 |
||||
], |
||||
"m": 5, |
||||
"p": 12 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
23, |
||||
30 |
||||
], |
||||
"m": 5, |
||||
"p": 13 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
31, |
||||
40 |
||||
], |
||||
"m": 6, |
||||
"p": 14 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
41, |
||||
50 |
||||
], |
||||
"m": 6, |
||||
"p": 15 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
51, |
||||
60 |
||||
], |
||||
"m": 7, |
||||
"p": 16 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
61, |
||||
80 |
||||
], |
||||
"m": 7, |
||||
"p": 17 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
81, |
||||
99 |
||||
], |
||||
"m": 8, |
||||
"p": 17 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
100, |
||||
125 |
||||
], |
||||
"m": 8, |
||||
"p": 18 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
126, |
||||
150 |
||||
], |
||||
"m": 9, |
||||
"p": 18 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
151, |
||||
9999 |
||||
], |
||||
"m": 9, |
||||
"p": 19 |
||||
} |
||||
] |
@ -0,0 +1,74 @@ |
||||
[ |
||||
{ |
||||
"range": [ |
||||
1, |
||||
5 |
||||
], |
||||
"m": 6, |
||||
"p": 10 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
6, |
||||
9 |
||||
], |
||||
"m": 7, |
||||
"p": 13 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
10, |
||||
15 |
||||
], |
||||
"m": 7, |
||||
"p": 14 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
16, |
||||
24 |
||||
], |
||||
"m": 8, |
||||
"p": 15 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
25, |
||||
30 |
||||
], |
||||
"m": 8, |
||||
"p": 14 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
31, |
||||
36 |
||||
], |
||||
"m": 7, |
||||
"p": 13 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
37, |
||||
40 |
||||
], |
||||
"m": 7, |
||||
"p": 12 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
41, |
||||
45 |
||||
], |
||||
"m": 7, |
||||
"p": 11 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
46, |
||||
49 |
||||
], |
||||
"m": 6, |
||||
"p": 10 |
||||
} |
||||
] |
@ -0,0 +1,58 @@ |
||||
[ |
||||
{ |
||||
"range": [ |
||||
1, |
||||
1.5 |
||||
], |
||||
"m": 6, |
||||
"p": 12 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
2, |
||||
3.5 |
||||
], |
||||
"m": 7, |
||||
"p": 16 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
4, |
||||
5.5 |
||||
], |
||||
"m": 7, |
||||
"p": 17 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
6, |
||||
7.5 |
||||
], |
||||
"m": 7, |
||||
"p": 16 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
8, |
||||
9.5 |
||||
], |
||||
"m": 6, |
||||
"p": 14 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
10, |
||||
11.5 |
||||
], |
||||
"m": 6, |
||||
"p": 12 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
12, |
||||
15.5 |
||||
], |
||||
"m": 5, |
||||
"p": 10 |
||||
} |
||||
] |
@ -1,130 +0,0 @@ |
||||
{ |
||||
"key": "dwarf", |
||||
"name": "Dwarf", |
||||
"stride": 6, |
||||
"adjective": "dwarven", |
||||
"common_traits": [ |
||||
"Accustomed To The Dark", |
||||
"Bearded", |
||||
"Greed", |
||||
"Oathsworn", |
||||
"Shaped From Earth And Stone", |
||||
"Stout", |
||||
"Tough" |
||||
], |
||||
"starting_stats": |
||||
[ |
||||
{ |
||||
"range": [ |
||||
1, |
||||
20 |
||||
], |
||||
"m": 6, |
||||
"p": 13 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
21, |
||||
30 |
||||
], |
||||
"m": 7, |
||||
"p": 13 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
31, |
||||
50 |
||||
], |
||||
"m": 7, |
||||
"p": 14 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
51, |
||||
76 |
||||
], |
||||
"m": 8, |
||||
"p": 15 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
77, |
||||
111 |
||||
], |
||||
"m": 8, |
||||
"p": 16 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
112, |
||||
151 |
||||
], |
||||
"m": 9, |
||||
"p": 16 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
152, |
||||
199 |
||||
], |
||||
"m": 9, |
||||
"p": 17 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
200, |
||||
245 |
||||
], |
||||
"m": 10, |
||||
"p": 18 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
246, |
||||
300 |
||||
], |
||||
"m": 11, |
||||
"p": 17 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
301, |
||||
345 |
||||
], |
||||
"m": 11, |
||||
"p": 16 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
346, |
||||
396 |
||||
], |
||||
"m": 12, |
||||
"p": 15 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
397, |
||||
445 |
||||
], |
||||
"m": 11, |
||||
"p": 14 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
446, |
||||
525 |
||||
], |
||||
"m": 11, |
||||
"p": 13 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
526, |
||||
600 |
||||
], |
||||
"m": 10, |
||||
"p": 12 |
||||
} |
||||
] |
||||
} |
@ -1,161 +0,0 @@ |
||||
{ |
||||
"key": "elf", |
||||
"name": "Elf", |
||||
"stride": 8, |
||||
"adjective": "elven", |
||||
"common_traits": [ |
||||
"Born Under The Silver Stars", |
||||
"Essence Of The Earth", |
||||
"Fair And Statuesque", |
||||
"First Born", |
||||
"Grief", |
||||
"Keen Sight" |
||||
], |
||||
"starting_stats": |
||||
[ |
||||
{ |
||||
"range": [ |
||||
1, |
||||
25 |
||||
], |
||||
"m": 7, |
||||
"p": 13 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
26, |
||||
60 |
||||
], |
||||
"m": 8, |
||||
"p": 13 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
61, |
||||
100 |
||||
], |
||||
"m": 9, |
||||
"p": 14 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
101, |
||||
125 |
||||
], |
||||
"m": 9, |
||||
"p": 15 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
126, |
||||
160 |
||||
], |
||||
"m": 10, |
||||
"p": 16 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
161, |
||||
225 |
||||
], |
||||
"m": 10, |
||||
"p": 17 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
226, |
||||
325 |
||||
], |
||||
"m": 11, |
||||
"p": 17 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
326, |
||||
425 |
||||
], |
||||
"m": 12, |
||||
"p": 17 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
426, |
||||
525 |
||||
], |
||||
"m": 13, |
||||
"p": 18 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
526, |
||||
625 |
||||
], |
||||
"m": 13, |
||||
"p": 19 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
626, |
||||
725 |
||||
], |
||||
"m": 14, |
||||
"p": 19 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
726, |
||||
825 |
||||
], |
||||
"m": 14, |
||||
"p": 20 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
826, |
||||
925 |
||||
], |
||||
"m": 15, |
||||
"p": 20 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
926, |
||||
1025 |
||||
], |
||||
"m": 15, |
||||
"p": 21 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
1026, |
||||
1125 |
||||
], |
||||
"m": 15, |
||||
"p": 22 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
1126, |
||||
1225 |
||||
], |
||||
"m": 15, |
||||
"p": 23 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
1226, |
||||
1325 |
||||
], |
||||
"m": 15, |
||||
"p": 24 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
1326, |
||||
9999 |
||||
], |
||||
"m": 16, |
||||
"p": 24 |
||||
} |
||||
] |
||||
} |
@ -1,99 +0,0 @@ |
||||
{ |
||||
"key": "man", |
||||
"name": "Man", |
||||
"stride": 7, |
||||
"adjective": "mannish", |
||||
"common_traits": [ |
||||
], |
||||
"starting_stats": |
||||
[ |
||||
{ |
||||
"range": [ |
||||
1, |
||||
10 |
||||
], |
||||
"m": 5, |
||||
"p": 10 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
11, |
||||
14 |
||||
], |
||||
"m": 6, |
||||
"p": 13 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
15, |
||||
16 |
||||
], |
||||
"m": 6, |
||||
"p": 16 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
17, |
||||
25 |
||||
], |
||||
"m": 7, |
||||
"p": 16 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
26, |
||||
29 |
||||
], |
||||
"m": 7, |
||||
"p": 15 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
30, |
||||
35 |
||||
], |
||||
"m": 7, |
||||
"p": 14 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
36, |
||||
40 |
||||
], |
||||
"m": 7, |
||||
"p": 13 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
41, |
||||
55 |
||||
], |
||||
"m": 7, |
||||
"p": 12 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
56, |
||||
65 |
||||
], |
||||
"m": 7, |
||||
"p": 11 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
66, |
||||
79 |
||||
], |
||||
"m": 7, |
||||
"p": 10 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
80, |
||||
100 |
||||
], |
||||
"m": 6, |
||||
"p": 9 |
||||
} |
||||
] |
||||
} |
@ -1,114 +0,0 @@ |
||||
{ |
||||
"key": "orc", |
||||
"name": "Orc", |
||||
"stride": 7, |
||||
"adjective": "orcish", |
||||
"common_traits": [ |
||||
"Cannibal", |
||||
"Cold Black Blood", |
||||
"Breeder", |
||||
"Fanged And Clawed", |
||||
"Loathsome And Twisted", |
||||
"Lynx-eyed, Like Burning Coals", |
||||
"Vile Language" |
||||
], |
||||
"starting_stats": |
||||
[ |
||||
{ |
||||
"range": [ |
||||
1, |
||||
10 |
||||
], |
||||
"m": 3, |
||||
"p": 10 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
11, |
||||
16 |
||||
], |
||||
"m": 4, |
||||
"p": 11 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
17, |
||||
22 |
||||
], |
||||
"m": 5, |
||||
"p": 12 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
23, |
||||
30 |
||||
], |
||||
"m": 5, |
||||
"p": 13 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
31, |
||||
40 |
||||
], |
||||
"m": 6, |
||||
"p": 14 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
41, |
||||
50 |
||||
], |
||||
"m": 6, |
||||
"p": 15 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
51, |
||||
60 |
||||
], |
||||
"m": 7, |
||||
"p": 16 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
61, |
||||
80 |
||||
], |
||||
"m": 7, |
||||
"p": 17 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
81, |
||||
99 |
||||
], |
||||
"m": 8, |
||||
"p": 17 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
100, |
||||
125 |
||||
], |
||||
"m": 8, |
||||
"p": 18 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
126, |
||||
150 |
||||
], |
||||
"m": 9, |
||||
"p": 18 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
151, |
||||
9999 |
||||
], |
||||
"m": 9, |
||||
"p": 19 |
||||
} |
||||
] |
||||
} |
@ -1,90 +0,0 @@ |
||||
{ |
||||
"key": "roden", |
||||
"name": "Roden", |
||||
"stride": 8, |
||||
"adjective": "roden", |
||||
"common_traits": [ |
||||
"Aecer's Likeness", |
||||
"Coat Of Fur", |
||||
"Communal", |
||||
"Enlarged Incisors", |
||||
"Quick-blooded", |
||||
"Tail", |
||||
"Large Ears" |
||||
], |
||||
"starting_stats": |
||||
[ |
||||
{ |
||||
"range": [ |
||||
1, |
||||
5 |
||||
], |
||||
"m": 6, |
||||
"p": 10 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
6, |
||||
9 |
||||
], |
||||
"m": 7, |
||||
"p": 13 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
10, |
||||
15 |
||||
], |
||||
"m": 7, |
||||
"p": 14 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
16, |
||||
24 |
||||
], |
||||
"m": 8, |
||||
"p": 15 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
25, |
||||
30 |
||||
], |
||||
"m": 8, |
||||
"p": 14 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
31, |
||||
36 |
||||
], |
||||
"m": 7, |
||||
"p": 13 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
37, |
||||
40 |
||||
], |
||||
"m": 7, |
||||
"p": 12 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
41, |
||||
45 |
||||
], |
||||
"m": 7, |
||||
"p": 11 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
46, |
||||
49 |
||||
], |
||||
"m": 6, |
||||
"p": 10 |
||||
} |
||||
] |
||||
} |
@ -1,75 +0,0 @@ |
||||
{ |
||||
"key": "wolf", |
||||
"name": "Wolf", |
||||
"stride": 11, |
||||
"adjective": "wolfish", |
||||
"common_traits": [ |
||||
"Crushing Jaws", |
||||
"Deep Fur", |
||||
"Great Lupine Form", |
||||
"Lupine Intellect", |
||||
"Long-legged", |
||||
"Wolf's Eyes", |
||||
"Wolf's Snout", |
||||
"Woodland Ear" |
||||
], |
||||
"starting_stats": |
||||
[ |
||||
{ |
||||
"range": [ |
||||
1, |
||||
1.5 |
||||
], |
||||
"m": 6, |
||||
"p": 12 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
2, |
||||
3.5 |
||||
], |
||||
"m": 7, |
||||
"p": 16 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
4, |
||||
5.5 |
||||
], |
||||
"m": 7, |
||||
"p": 17 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
6, |
||||
7.5 |
||||
], |
||||
"m": 7, |
||||
"p": 16 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
8, |
||||
9.5 |
||||
], |
||||
"m": 6, |
||||
"p": 14 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
10, |
||||
11.5 |
||||
], |
||||
"m": 6, |
||||
"p": 12 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
12, |
||||
15.5 |
||||
], |
||||
"m": 5, |
||||
"p": 10 |
||||
} |
||||
] |
||||
} |
@ -0,0 +1,82 @@ |
||||
[ |
||||
{ |
||||
"range": [ |
||||
1, |
||||
5 |
||||
], |
||||
"m": 3, |
||||
"p": 11 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
6, |
||||
12 |
||||
], |
||||
"m": 4, |
||||
"p": 14 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
13, |
||||
19 |
||||
], |
||||
"m": 4, |
||||
"p": 17 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
20, |
||||
27 |
||||
], |
||||
"m": 4, |
||||
"p": 19 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
28, |
||||
57 |
||||
], |
||||
"m": 4, |
||||
"p": 20 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
58, |
||||
80 |
||||
], |
||||
"m": 4, |
||||
"p": 19 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
81, |
||||
124 |
||||
], |
||||
"m": 4, |
||||
"p": 18 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
125, |
||||
213 |
||||
], |
||||
"m": 5, |
||||
"p": 17 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
214, |
||||
390 |
||||
], |
||||
"m": 5, |
||||
"p": 16 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
391, |
||||
712 |
||||
], |
||||
"m": 6, |
||||
"p": 15 |
||||
} |
||||
] |
@ -1,100 +0,0 @@ |
||||
{ |
||||
"key": "troll", |
||||
"name": "Troll", |
||||
"stride": 7, |
||||
"adjective": "trollish", |
||||
"common_traits": [ |
||||
"Black Nails", |
||||
"Fangs", |
||||
"Night Blooded", |
||||
"Night Eyed (Troll)", |
||||
"Massive Stature (Troll)", |
||||
"Stone's Age", |
||||
"Tough (Troll)", |
||||
"Troll Skin", |
||||
"Voracious Carnivore" |
||||
], |
||||
"starting_stats": |
||||
[ |
||||
{ |
||||
"range": [ |
||||
1, |
||||
5 |
||||
], |
||||
"m": 3, |
||||
"p": 11 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
6, |
||||
12 |
||||
], |
||||
"m": 4, |
||||
"p": 14 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
13, |
||||
19 |
||||
], |
||||
"m": 4, |
||||
"p": 17 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
20, |
||||
27 |
||||
], |
||||
"m": 4, |
||||
"p": 19 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
28, |
||||
57 |
||||
], |
||||
"m": 4, |
||||
"p": 20 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
58, |
||||
80 |
||||
], |
||||
"m": 4, |
||||
"p": 19 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
81, |
||||
124 |
||||
], |
||||
"m": 4, |
||||
"p": 18 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
125, |
||||
213 |
||||
], |
||||
"m": 5, |
||||
"p": 17 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
214, |
||||
390 |
||||
], |
||||
"m": 5, |
||||
"p": 16 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
391, |
||||
712 |
||||
], |
||||
"m": 6, |
||||
"p": 15 |
||||
} |
||||
] |
||||
} |
@ -1,27 +0,0 @@ |
||||
require 'json' |
||||
|
||||
module Charred |
||||
module Custom |
||||
def load_custom(data) |
||||
Dir.glob("data/custom/**/*") { |file| |
||||
if File.file?(file) |
||||
case File.extname(file) |
||||
when ".skills" |
||||
verbose_merge data[:skills], json_get(file) |
||||
when ".traits" |
||||
verbose_merge data[:traits], json_get(file) |
||||
when ".stock" |
||||
stock = Stock.new(json_get(file)) |
||||
data[:stocks].deep_merge!({ stock.key => stock }) |
||||
when ".lifepaths" |
||||
contents = json_get(file) |
||||
data[:lifepaths].ko_deep_merge!({ contents["stock"] => contents["settings"]}) |
||||
when ".resources" |
||||
contents = json_get(file) |
||||
data[:resources].ko_deep_merge!({ contents["stock"] => contents["resources"]}) |
||||
end |
||||
end |
||||
} |
||||
end |
||||
end |
||||
end |
@ -1,34 +0,0 @@ |
||||
module Charred |
||||
class Stock |
||||
@@default_stride = 7 |
||||
|
||||
attr :key |
||||
attr :name |
||||
attr :stride |
||||
attr :common_traits |
||||
attr :starting_stats |
||||
|
||||
def initialize(h) |
||||
@key = h["key"] |
||||
@name = h["name"] || @key |
||||
@stride = h["stride"] || @@default_stride |
||||
@adjective = h["adjective"] || @key+"ish" |
||||
@common_traits = h["common_traits"] |
||||
@starting_stats = h["starting_stats"] |
||||
end |
||||
|
||||
def as_json(options = {}) |
||||
{ |
||||
"key" => @key, |
||||
"name" => @name, |
||||
"stride" => @stride, |
||||
"adjective" => @adjective, |
||||
"common_traits" => @common_traits, |
||||
"starting_stats" => @starting_stats |
||||
} |
||||
end |
||||
def to_json(*a) |
||||
as_json.to_json(*a) |
||||
end |
||||
end |
||||
end |
@ -0,0 +1,67 @@ |
||||
a.panel-title:link,.panel-title a:link { text-decoration: none; } |
||||
a.panel-title:visited,.panel-title a:visited { text-decoration: none; } |
||||
a.panel-title:hover,.panel-title a:hover { text-decoration: underline; } |
||||
a.panel-title:active,.panel-title a:active { text-decoration: underline; } |
||||
|
||||
input.editable-name { |
||||
color: #333; |
||||
display: inline; |
||||
width: 12em; |
||||
} |
||||
input.editable-line { |
||||
color: #333; |
||||
} |
||||
input.editable-num { |
||||
color: #333; |
||||
display: inline; |
||||
width: 3em; |
||||
} |
||||
input.editable-name.not-editing { |
||||
background: #F5F5F5; |
||||
font-weight: bold; |
||||
} |
||||
input.editable-line.not-editing { |
||||
background: #F5F5F5; |
||||
} |
||||
input.editable-num.not-editing { |
||||
background: #F5F5F5; |
||||
} |
||||
|
||||
.add-skills-traits-container { |
||||
margin-top: 1em; |
||||
margin-bottom: 1em; |
||||
} |
||||
|
||||
.horizontal-input-pair { |
||||
display: flex; |
||||
align-items: center; |
||||
gap: 0.5em; |
||||
} |
||||
.horizontal-input-pair label { |
||||
margin-bottom: 0; |
||||
} |
||||
.horizontal-input-pair input { |
||||
flex-grow: 1; |
||||
} |
||||
div.skill-even { |
||||
} |
||||
div.skill-odd { |
||||
background: #F5F5F5; |
||||
} |
||||
tr.trait-even { |
||||
background: lightgray; |
||||
} |
||||
tr.trait-odd { |
||||
background: #F5F5F5; |
||||
} |
||||
textarea.trait-desc { |
||||
height: 5em; |
||||
width: 98%; |
||||
margin: 1em; |
||||
} |
||||
table.traits{ |
||||
width: 100%; |
||||
} |
||||
table.traits input.editable-name { |
||||
width: 100%; |
||||
} |
@ -1,5 +1,5 @@ |
||||
var serverSettings = { |
||||
'versionString' : '3.0.0', |
||||
'versionString' : '2.3.0', |
||||
'storageType' : 'client',
|
||||
'displayAttrMath' : 'false' |
||||
} |
||||
|
@ -0,0 +1,388 @@ |
||||
// class TimeLogger {
|
||||
// constructor() {
|
||||
// this.logs = [];
|
||||
// this.unlabelled_id = 0;
|
||||
// this.start = this.previous = Date.now();
|
||||
// this.log('start');
|
||||
// }
|
||||
// log(label) {
|
||||
// var now = Date.now();
|
||||
// var log = {
|
||||
// 'when': now,
|
||||
// 'label': label,
|
||||
// 'elapsed': now - this.previous,
|
||||
// 'total': now - this.start
|
||||
// };
|
||||
// this.logs.push(log);
|
||||
// this.previous = now;
|
||||
// return log;
|
||||
// }
|
||||
// }
|
||||
|
||||
// const timelogger = new TimeLogger;
|
||||
// console.log(timelogger.logs[0]);
|
||||
//
|
||||
// console.log(timelogger.log("post-data"));
|
||||
|
||||
// Settings
|
||||
|
||||
function StockedSetting(name, charredSettingData) { |
||||
this.isSubsetting = false; |
||||
if(result = name.match(/(.*) setting/i)) { |
||||
this.name = result[1]; |
||||
} else if(result = name.match(/(.*) subsetting/i)) { |
||||
this.name = result[1]; |
||||
this.isSubsetting = true; |
||||
} else { |
||||
this.name = name; |
||||
} |
||||
this.lifepaths = []; |
||||
for (let name in charredSettingData) { |
||||
this.lifepaths.push(new StockedLifePath(name, charredSettingData[name])); |
||||
} |
||||
} |
||||
StockedSetting.prototype.addLifepath = function() { |
||||
this.lifepaths.push(new StockedLifePath(this.newLifepathName, {})); |
||||
this.newLifepathName = ""; |
||||
} |
||||
StockedSetting.prototype.removeLifepath = function(index) { |
||||
this.lifepaths.splice(index, 1); |
||||
} |
||||
StockedSetting.prototype.toCharred = function() { |
||||
// let name = this.name + (this.isSubsetting ? " Subsetting" : " Setting";
|
||||
|
||||
let charred = {}; |
||||
for(let lp of this.lifepaths) { |
||||
charred[lp.name] = lp.toCharred(); |
||||
} |
||||
// common traits
|
||||
// stride
|
||||
return charred; |
||||
} |
||||
|
||||
function StockedLifePath(name, charredPathData) { |
||||
if(charredPathData) { |
||||
this.name = name; |
||||
this.time = charredPathData.time; |
||||
this.res = charredPathData.res; |
||||
this.requires = charredPathData.requires; |
||||
this.restrict = charredPathData.restrict; |
||||
this.stat = new StockedLifePathStats(charredPathData.stat); |
||||
this.skills = new StockedLifePathSkills(charredPathData.skills); |
||||
this.traits = new StockedLifePathTraits(charredPathData.traits); |
||||
} else { |
||||
this.stat = new StockedLifePathStats(); |
||||
this.skills = new StockedLifePathSkills(); |
||||
this.traits = new StockedLifePathTraits(); |
||||
} |
||||
|
||||
this.leads_dict = {}; |
||||
if(charredPathData.leads) { |
||||
for(let lead of charredPathData.leads) { this.leads_dict[lead] = true; } |
||||
} |
||||
this.leads = () => Object.keys(this.leads_dict).filter(l => this.leads_dict[l]); |
||||
} |
||||
StockedLifePath.prototype.toCharred = function() { |
||||
let charred = {}; |
||||
charred.time = this.time; |
||||
charred.res = this.res; |
||||
charred.requires = this.requires; |
||||
charred.restrict = this.restrict; |
||||
charred.stat = this.stat.toCharred(); |
||||
charred.skills = this.skills.toCharred(); |
||||
charred.traits = this.traits.toCharred(); |
||||
charred.leads = this.leads(); |
||||
return charred; |
||||
} |
||||
|
||||
function StockedLifePathStats(charredStatData) { |
||||
this.P = 0; |
||||
this.M = 0; |
||||
this.PM = 0; |
||||
if(charredStatData) { |
||||
for (let stat of charredStatData) { |
||||
if(stat[1].toUpperCase() == 'P') { |
||||
this.P += stat[0]; |
||||
} |
||||
else if(stat[1].toUpperCase() == 'M') { |
||||
this.M += stat[0]; |
||||
} |
||||
else if(stat[1].toUpperCase() == 'PM' || stat[0].toUpperCase() == 'MP') { |
||||
this.PM += stat[0]; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
StockedLifePathStats.prototype.toString = function() { |
||||
let strs = []; |
||||
if (this.P) { strs.push("+" + this.P + "P"); } |
||||
if (this.M) { strs.push("+" + this.M + "M"); } |
||||
if (this.PM) { strs.push("+" + this.PM + "P/M"); } |
||||
return strs.join(","); |
||||
}; |
||||
StockedLifePathStats.prototype.toCharred = function() { |
||||
let charred = []; |
||||
if(this.P > 0) charred.push([this.P, "p"]); |
||||
if(this.M > 0) charred.push([this.M, "m"]); |
||||
if(this.PM > 0) charred.push([this.PM, "pm"]); |
||||
return charred; |
||||
} |
||||
|
||||
function StockedLifePathSkills(charredLpSkillData) { |
||||
this.lpPoints = 0; |
||||
this.generalPoints = 0; |
||||
this.lpSkills = []; |
||||
if (charredLpSkillData) { |
||||
for (let skill of charredLpSkillData) { |
||||
if(skill.length == 1) { |
||||
this.lpPoints = skill[0]; |
||||
} |
||||
if(skill.length >= 2) { |
||||
if(skill[1].toLowerCase() == "general") { |
||||
this.generalPoints += skill[0]; |
||||
} else { |
||||
this.lpPoints += skill[0]; |
||||
this.lpSkills = this.lpSkills.concat(skill.slice(1)); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
StockedLifePathSkills.prototype.removeSkill = function(index) { |
||||
this.lpSkills.splice(index, 1); |
||||
} |
||||
StockedLifePathSkills.prototype.addSkill = function(skill) { |
||||
this.lpSkills.push(skill); |
||||
} |
||||
StockedLifePathSkills.prototype.toString = function() { |
||||
let strs = []; |
||||
if (this.lpPoints) { strs.push(StockedUtil.pts(this.lpPoints, this.lpSkills)); } |
||||
if (this.generalPoints) { strs.push(StockedUtil.pts(this.generalPoints, ["General"])); } |
||||
return strs.join("; "); |
||||
}; |
||||
StockedLifePathSkills.prototype.toCharred = function() { |
||||
let charred = []; |
||||
if(this.lpSkills.length > 0 || this.lpPoints > 0){ |
||||
charred.push([this.lpPoints].concat(this.lpSkills)); |
||||
} |
||||
if(this.generalPoints > 0) |
||||
charred.push([this.generalPoints, "General"]); |
||||
return charred; |
||||
} |
||||
|
||||
function StockedLifePathTraits(charredTraitData) { |
||||
this.lpTraits = []; |
||||
if(charredTraitData) { |
||||
this.points = charredTraitData[0]; |
||||
this.lpTraits = charredTraitData.slice(1); |
||||
} |
||||
} |
||||
StockedLifePathTraits.prototype.removeTrait = function(index) { |
||||
this.lpTraits.splice(index, 1); |
||||
} |
||||
StockedLifePathTraits.prototype.addTrait = function(skill) { |
||||
this.lpTraits.push(skill); |
||||
} |
||||
StockedLifePathTraits.prototype.toString = function() { |
||||
return StockedUtil.pts(this.points, this.lpTraits); |
||||
} |
||||
StockedLifePathTraits.prototype.toCharred = function() { |
||||
return [this.points].concat(this.lpTraits); |
||||
} |
||||
|
||||
|
||||
// Skills
|
||||
|
||||
function StockedSkill(name, charredSkillData) { |
||||
this.name = name; |
||||
this.magic = charredSkillData.magic ? true : false; |
||||
this.roots = { |
||||
Perception: false, |
||||
Will: false, |
||||
Forte: false, |
||||
Power: false, |
||||
Agility: false, |
||||
Speed: false, |
||||
}; |
||||
if(charredSkillData.roots){ |
||||
charredSkillData.roots.map(rootName => this.roots[rootName] = true); |
||||
} |
||||
this.stockSpecific = "TODO"; |
||||
} |
||||
|
||||
// Traits
|
||||
|
||||
function StockedTrait(name, charredTraitData) { |
||||
this.name = name; |
||||
this.cost = charredTraitData.cost; |
||||
this.type = charredTraitData.type; |
||||
this.desc = charredTraitData.desc; |
||||
|
||||
// No logic for these yet
|
||||
this.bonus = charredTraitData.bonus; |
||||
this.restrict = charredTraitData.restrict; |
||||
} |
||||
|
||||
//Ctrl
|
||||
|
||||
var testscope; |
||||
|
||||
function StockedCtrl($scope, $http, burningData) { |
||||
$scope.to_id = function(input) { return input.replaceAll(/\W/g, '_'); }; |
||||
$scope.StockedUtil = StockedUtil; |
||||
|
||||
$scope.TRAIT_TYPES = ["character", "die", "call_on"]; |
||||
|
||||
$scope.settings = []; |
||||
|
||||
/* testing */ |
||||
testscope = $scope; |
||||
$scope.general = { |
||||
'Name': 'Foo', |
||||
'Stride': 7, |
||||
'CommonTraits': [], |
||||
'selectedTrait': '' |
||||
}; |
||||
|
||||
// $scope.parseStock = function (stockData){
|
||||
// let settings = [];
|
||||
// for (let name in stockData) {
|
||||
// settings.push(new StockedSetting(name, stockData[name]));
|
||||
// }
|
||||
// return settings;
|
||||
// };
|
||||
|
||||
// $scope.parseSkills = function (skillsData){
|
||||
// let skills = [];
|
||||
// for (let name in skillsData) {
|
||||
// skills.push(new StockedSkill(name, skillsData[name]));
|
||||
// }
|
||||
// return skills;
|
||||
// };
|
||||
|
||||
// $scope.parseTraits = function (traitsData){
|
||||
// let traits = [];
|
||||
// for (let name in traitsData) {
|
||||
// traits.push(new StockedTrait(name, traitsData[name]));
|
||||
// }
|
||||
// return traits;
|
||||
// };
|
||||
|
||||
/* end testing */ |
||||
|
||||
/* Input/Output */ |
||||
/* end Input/Output */ |
||||
|
||||
$scope.addSetting = function (){ |
||||
this.settings.push(new StockedSetting(this.newSettingName, {})); |
||||
this.newSettingName = ""; |
||||
}; |
||||
|
||||
$scope.removeSetting = function (index) { |
||||
this.settings.splice(index, 1); |
||||
}; |
||||
|
||||
$scope.addSkill = function (){ |
||||
this.skills.push(new StockedSkill("New", {})); |
||||
}; |
||||
$scope.removeSkill = function (index) { |
||||
this.skills.splice(index, 1); |
||||
}; |
||||
|
||||
$scope.addTrait = function (){ |
||||
this.traits.push(new StockedTrait("New", {})); |
||||
}; |
||||
$scope.removeTrait = function (index) { |
||||
this.traits.splice(index, 1); |
||||
}; |
||||
|
||||
$scope.collapseBody = function(data_target, $event) { |
||||
$(data_target).collapse("toggle"); |
||||
if($event) { $event.stopPropagation(); } |
||||
}; |
||||
$scope.editField = function($event, edit) { |
||||
$($event.target).toggleClass("not-editing"); |
||||
}; |
||||
burningData.registerOnAllDatasetsLoaded(function() { |
||||
onLifepathsLoad_Stocked($scope, burningData); |
||||
}); |
||||
|
||||
$scope.editLeads = function($event) { |
||||
let container = $($event.target).closest('.path-leads'); |
||||
container.find(".path-leads-read").toggle(false); |
||||
container.find(".path-leads-write").toggle(true); |
||||
}; |
||||
$scope.readLeads = function($event) { |
||||
let container = $($event.target).closest('.path-leads'); |
||||
container.find(".path-leads-read").toggle(true); |
||||
container.find(".path-leads-write").toggle(false); |
||||
}; |
||||
|
||||
$scope.stocked_loadCharredModel = function() { |
||||
file = document.getElementById("stocked_charred_file"); |
||||
file.files[0].text().then((text) => loadCharredModel(this, JSON.parse(text))); |
||||
}; |
||||
$scope.stocked_downLoadCharredModel = function() { |
||||
model = serializeToCharredModel(this); |
||||
$http.post("/stocked_download", model). |
||||
success(function(data,status,headers,config){ |
||||
console.log("huzzah, converting stocked model to charred succeeded. File URL: " + data); |
||||
var frame = document.getElementById("downloadframe"); |
||||
if ( frame ){ |
||||
frame.src = data; |
||||
} |
||||
}). |
||||
error(function(data,status,headers,config){ |
||||
console.log("boo, converting stocked model to charred failed. File URL: " + data); |
||||
$scope.addAlert('tools', "converting stocked model to charred failed: " + data); |
||||
}); |
||||
} |
||||
} |
||||
|
||||
// Accepts an object, JSON text should be parsed first
|
||||
function loadCharredModel($scope, model) { |
||||
let settings = []; |
||||
for (let name in model) { |
||||
settings.push(new StockedSetting(name, model[name])); |
||||
} |
||||
$scope.settings = settings; |
||||
$scope.$apply(); |
||||
} |
||||
|
||||
function serializeToCharredModel($scope) { |
||||
let model = {}; |
||||
model.settings = {}; |
||||
model.Name = $scope.general.Name; |
||||
$scope.settings.forEach((s) => |
||||
model.settings[s.name + (s.isSubsetting ? " Subsetting" : " Setting")] = s.toCharred()) |
||||
return JSON.stringify(model); |
||||
} |
||||
|
||||
function onLifepathsLoad_Stocked($scope, burningData) { |
||||
// $scope.settings = $scope.parseStock(test_data);
|
||||
// $scope.skills = $scope.parseSkills(test_skills_data);
|
||||
// $scope.traits = $scope.parseTraits(test_traits_data);
|
||||
$scope.charredTraits = Object.keys(burningData.traits); |
||||
$scope.charredSkills = Object.keys(burningData.skills); |
||||
} |
||||
|
||||
var StockedUtil = { |
||||
"pluralize": function(num, thing, withE, nospace) { |
||||
str = ""; |
||||
str += num; |
||||
if (!nospace) { str += ' '; } |
||||
str += thing; |
||||
if(num != 1) { |
||||
if (withE) { str += 'e'; } |
||||
str += 's'; |
||||
} |
||||
return str; |
||||
}, |
||||
"pts": function(num, entries) { |
||||
let str = StockedUtil.pluralize(num, "pt") + ": "; |
||||
if(Array.isArray(entries) && entries.length > 0) { str += entries.join(", "); } |
||||
else { str += "—" } |
||||
return str; |
||||
}//, "filter$properties": (key, value) => (key.startsWith('$') ? undefined : value)
|
||||
|
||||
}; |
@ -0,0 +1,42 @@ |
||||
function EditableInputController($scope, $element, $attrs) { |
||||
console.log($scope); |
||||
console.log($element); |
||||
var ctrl = this; |
||||
ctrl.isEditing = false; |
||||
|
||||
ctrl.handleModeChange = function() { |
||||
if (ctrl.isEditing) { |
||||
ctrl.onUpdate({value: ctrl.modelValue}); |
||||
ctrl.modelValueCopy = ctrl.modelValue; |
||||
} |
||||
ctrl.isEditing = !ctrl.isEditing; |
||||
}; |
||||
|
||||
ctrl.reset = function() { |
||||
ctrl.modelValue = ctrl.modelValueCopy; |
||||
}; |
||||
|
||||
ctrl.$onInit = function() { |
||||
// Make a copy of the initial value to be able to reset it later
|
||||
ctrl.modelValueCopy = ctrl.modelValue; |
||||
|
||||
// Set a default inputType
|
||||
if (!ctrl.inputType) { |
||||
ctrl.inputType = 'text'; |
||||
} |
||||
}; |
||||
} |
||||
|
||||
export function register(module) { |
||||
console.log(module); |
||||
module.component('editableInput', { |
||||
templateUrl: '/stocked/editableInput_partial', |
||||
controller: EditableInputController, |
||||
bindings: { |
||||
modelValue: '<', |
||||
inputID: '<', |
||||
inputType: '@?', |
||||
onUpdate: '&' |
||||
} |
||||
}); |
||||
} |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,23 @@ |
||||
{ |
||||
"Foo Setting": { |
||||
"Born Foo": { |
||||
"time": 1, |
||||
"res": 5, |
||||
"stat": [ |
||||
[1, "pm"] |
||||
], |
||||
"leads": [ |
||||
"Bar" |
||||
], |
||||
"key_leads": [ |
||||
"Bar Setting" |
||||
], |
||||
"skills": [ |
||||
[3, "General"] |
||||
], |
||||
"traits": [1], |
||||
"common_traits": [] |
||||
} |
||||
}, |
||||
"Bar Setting": {} |
||||
} |
@ -0,0 +1,377 @@ |
||||
<div class='container' ng-controller='StockedCtrl'> |
||||
<h1 id='intro'>Stocked</h1> |
||||
<div class='well'> |
||||
Stocked (Stock·ed) |
||||
<br> |
||||
<br> |
||||
<ol> |
||||
<li><i>adj.</i> Furnished with more than enough. <i>(ref https://www.vocabulary.com/dictionary/stocked)</i></li> |
||||
<li><i>n.</i> A portmanteau of <i>stock</i> and <i>editor</i>.</li> |
||||
</ol> |
||||
</div> |
||||
<div class='panel panel-default'> |
||||
<div class='panel-heading' > |
||||
<h4 class='panel-title'> |
||||
<a href='' ng-click='collapseBody("#collapse_tools")'>▸</a> |
||||
Tools |
||||
</h4> |
||||
</div> |
||||
<div class='panel-collapse collapse in' id='collapse_tools'> |
||||
<div class='panel-body'> |
||||
<div class='alert alert-danger alert-dismissable' ng-repeat="warn in alertsOfType('tools', 'warn')"> |
||||
<button aria-hidden='true' class='close' ng-click="removeAlert('tools',warn)" type='button'>×</button> |
||||
{{warn}} |
||||
</div> |
||||
<div class='alert alert-success alert-dismissable' ng-repeat="warn in alertsOfType('tools', 'succ')"> |
||||
<button aria-hidden='true' class='close' ng-click="removeAlert('tools',warn)" type='button'>×</button> |
||||
{{warn}} |
||||
</div> |
||||
<div class='container'> |
||||
<div class='row'> |
||||
<div class='col-md-3'> |
||||
<input type="file" id="stocked_charred_file"/> |
||||
<a href='' ng-click='stocked_loadCharredModel()'> |
||||
TODO: Load charred stock model |
||||
</a> |
||||
</div> |
||||
<div class='col-md-3'> |
||||
<a href='' ng-click='stocked_downloadCharredModel()'> |
||||
TODO: Download charred stock model |
||||
</a> |
||||
</div> |
||||
<div class='col-md-3'> |
||||
<a href='' ng-click='stocked_generateMarkdown()'> |
||||
TODO: Generate Markdown |
||||
</a> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<div class='panel-heading'> |
||||
<h4 class='panel-title'> |
||||
<a href='' ng-click='collapseBody("#collapse_general")'>▸</a> |
||||
General |
||||
</h4> |
||||
</div> |
||||
<div class='panel-collapse collapse in' id='collapse_general'> |
||||
<div class='panel-body'> |
||||
<label for='stock-name'>Name:</label> |
||||
<input class='form-control input-lg not-editing editable-name' name='stock-name' id='stock-name' |
||||
ng-model="general.Name" ng-click="$event.stopPropagation()" |
||||
ng-focus='editField($event, true)' ng-blur='editField($event, false)' /> |
||||
|
||||
<label for='stock-stride'>Stride:</label> |
||||
<input type="number" class='not-editing editable-num' name='stock-stride' id='stock-stride' |
||||
ng-model="general.Stride" ng-click="$event.stopPropagation()" |
||||
ng-focus='editField($event, true)' ng-blur='editField($event, false)' /> |
||||
<br /> |
||||
<div> |
||||
<span>Common traits: {{general.CommonTraits.join(", ")}}</span> |
||||
<select class='form-control' ng-model='general.selectedTrait' ng-options='t for t in charredTraits'></select> |
||||
</div> |
||||
<div> |
||||
<a href='' ng-click='general.CommonTraits.push(general.selectedTrait)'>Add trait</a> |
||||
</div> |
||||
<div> |
||||
<a href='' ng-click=''>TODO: Add new trait</a> |
||||
</div> |
||||
<br /> |
||||
TODO: other things in General section? |
||||
</div> |
||||
</div> |
||||
<div class='panel-heading'> |
||||
<h4 class='panel-title'> |
||||
<a href='' ng-click='collapseBody("#collapse_settings")'>▸</a> |
||||
Settings |
||||
</h4> |
||||
</div> |
||||
<div class='panel-collapse collapse in' id='collapse_settings'> |
||||
<div class='panel-body'> |
||||
<span class="note-label">Note:</span> |
||||
<span class="note-content"> |
||||
Settings will have " Setting" (or " Subsetting" for subsettings) |
||||
appended to the name in the generated charred model, which is how charred will display them. |
||||
</span> |
||||
<br /> |
||||
|
||||
<a ng-click='collapseBody(".collapse_all_settings", $event)' href=''> |
||||
collapse/expand all settings |
||||
</a> |
||||
<div class='list-group'> |
||||
<div ng-repeat="setting in settings" class='list-group-item'> |
||||
<div class='panel-heading'> |
||||
<a href='' class="panel-title" ng-click='collapseBody("#collapse_" + to_id(setting.name))'>▸</a> |
||||
<input class='form-control input-lg not-editing editable-name' |
||||
ng-model="setting.name" ng-click="$event.stopPropagation()" |
||||
ng-focus='editField($event, true)' ng-blur='editField($event, false)' /> |
||||
<span class="panel-title" style="font-weight: bold;"> |
||||
<input type="checkbox" ng-model="setting.isSubsetting" /> Subsetting? |
||||
</span> |
||||
<a href='' ng-click='removeSetting($index)'>[X]</a> |
||||
</div> |
||||
<div class='panel-collapse collapse in collapse_all_settings' id='collapse_{{to_id(setting.name)}}'> |
||||
<div class='panel-body'> |
||||
<div class="panel"> |
||||
<div class="panel-body"> |
||||
<span class="note-label">Note:</span> |
||||
<span class="note-content"> |
||||
Prefix a lifepath's name with "Born " to have charred consider it a born lifepath; |
||||
i.e. selectable if and only if it is the first lifepath. |
||||
</span> |
||||
<br /> |
||||
|
||||
<a ng-click='collapseBody(".collapse_all_"+to_id(setting.name), $event)' href=''> |
||||
collapse/expand all paths in setting |
||||
</a> |
||||
<div class='container-fluid'> |
||||
<div class='row'> |
||||
<div class='h4 col-md-3'>Lifepath</div> |
||||
<div class='h4 col-md-1'>Time</div> |
||||
<div class='h4 col-md-1'>Res</div> |
||||
<div class='h4 col-md-3'>Stat</div> |
||||
<div class='h4 col-md-4'>Leads</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<div ng-repeat="path in setting.lifepaths"> |
||||
<div class='panel-heading'> |
||||
<div class='container-fluid'> |
||||
<div class='row'> |
||||
<div class="col-md-3"> |
||||
<a href='' class="panel-title" ng-click='collapseBody("#collapse_" + to_id(path.name))'>▸</a> |
||||
<input ng-model="path.name" |
||||
class='form-control input-lg not-editing editable-name' |
||||
ng-click="$event.stopPropagation()" |
||||
ng-focus='editField($event, true)' ng-blur='editField($event, false)' /> |
||||
<a href='' ng-click='setting.removeLifepath($index)'>[X]</a> |
||||
</div> |
||||
|
||||
<div class="col-md-1"> |
||||
<input type="number" ng-model="path.time" |
||||
class='not-editing editable-num' |
||||
ng-click="$event.stopPropagation()" |
||||
ng-focus='editField($event, true)' ng-blur='editField($event, false)' /> |
||||
<span>yrs</span> |
||||
</div> |
||||
|
||||
<div class="col-md-1"> |
||||
<input type="number" ng-model="path.res" |
||||
class='not-editing editable-num' |
||||
ng-click="$event.stopPropagation()" |
||||
ng-focus='editField($event, true)' ng-blur='editField($event, false)' /> |
||||
</div> |
||||
|
||||
<div class="col-md-3"> |
||||
<label for="{{to_id(path.name)}}_M">M: </label> |
||||
<input type="number" ng-model="path.stat.M" id="{{to_id(path.name)}}_M" |
||||
class='not-editing editable-num' |
||||
ng-click="$event.stopPropagation()" |
||||
ng-focus='editField($event, true)' ng-blur='editField($event, false)' /> |
||||
<label for="{{to_id(path.name)}}_P">P: </label> |
||||
<input type="number" ng-model="path.stat.P" id="{{to_id(path.name)}}_M" |
||||
class='not-editing editable-num' |
||||
ng-click="$event.stopPropagation()" |
||||
ng-focus='editField($event, true)' ng-blur='editField($event, false)' /> |
||||
<label for="{{to_id(path.name)}}_PM">P/M: </label> |
||||
<input type="number" ng-model="path.stat.PM" id="{{to_id(path.name)}}_M" |
||||
class='not-editing editable-num' |
||||
ng-click="$event.stopPropagation()" |
||||
ng-focus='editField($event, true)' ng-blur='editField($event, false)' /> |
||||
</div> |
||||
|
||||
<div class='h5 col-md-4 path-leads'> |
||||
<div class="path-leads-read"> |
||||
<span>Leads: </span><i>{{path.leads().join(", ")}}</i> |
||||
<a href='' ng-click='editLeads($event)'>Edit</a> |
||||
</div> |
||||
<div class="path-leads-write" hidden="hidden"> |
||||
<div ng-repeat="setting in settings"> |
||||
<input type="checkbox" id='{{to_id(path.name)}}-to-{{to_id(setting.name)}}' |
||||
ng-model='path.leads_dict[setting.name]' value='{{to_id(setting.name)}}' /> |
||||
<label for='{{to_id(path.name)}}-to-{{to_id(setting.name)}}'> |
||||
{{setting.name}} |
||||
</label> |
||||
</div> |
||||
<a href='' ng-click='readLeads($event)'>Done</a> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<div class='panel-collapse collapse in collapse_all_{{to_id(setting.name)}}' id='collapse_{{to_id(path.name)}}'> |
||||
<div class='panel-body'> |
||||
<span ng-if='$first'>TODO: Born/common traits</span> |
||||
|
||||
<div> |
||||
<b><i>Skills:</i></b> |
||||
<span ng-if='path.skills.lpSkills.length > 0' ng-click='editPoints($event)'> |
||||
{{StockedUtil.pluralize(path.skills.lpPoints, "pt")}}: |
||||
</span> |
||||
<div style="display: inline;" ng-repeat='skill in path.skills.lpSkills track by $index'> |
||||
{{skill}}<a href='' ng-click='path.skills.removeSkill($index)'>[X]</a><!-- |
||||
--><span ng-if='!$last'>,</span></div><!-- |
||||
--><span ng-if='path.skills.lpSkills.length > 0 && path.skills.generalPoints > 0'>;</span> |
||||
<span ng-if='path.skills.generalPoints > 0'>{{StockedUtil.pluralize(path.skills.generalPoints, "pt")}}: General</span> |
||||
</div> |
||||
|
||||
<div> |
||||
<b><i>Traits:</i></b> |
||||
<span ng-if='path.traits.lpTraits.length == 0'>—</span> |
||||
<span ng-if='path.traits.lpTraits.length > 0' ng-click='editPoints($event)'> |
||||
{{StockedUtil.pluralize(path.traits.points, "pt")}}: |
||||
</span> |
||||
<div style="display: inline;" ng-repeat='trait in path.traits.lpTraits track by $index'> |
||||
{{trait}}<a href='' ng-click='path.traits.removeTrait($index)'>[X]</a><!-- |
||||
--><span ng-if='!$last'>,</span></div> |
||||
</div> |
||||
|
||||
<div ng-if="path.requires" class="horizontal-input-pair"> |
||||
<label for="{{to_id(path.name)}}-requires"><b><i>Requires: </i></b></label> |
||||
<input ng-model="path.requires" id="{{to_id(path.name)}}-requires" |
||||
class='form-control not-editing editable-line' |
||||
ng-click="$event.stopPropagation()" |
||||
ng-focus='editField($event, true)' ng-blur='editField($event, false)' /> |
||||
</div> |
||||
<div ng-if="path.restrict" class="horizontal-input-pair"> |
||||
<label for="{{to_id(path.name)}}-restrict"><b><i>Restrictions: </i></b></label> |
||||
<input ng-model="path.restrict" id="{{to_id(path.name)}}-restrict" |
||||
class='form-control not-editing editable-line' |
||||
ng-click="$event.stopPropagation()" |
||||
ng-focus='editField($event, true)' ng-blur='editField($event, false)' /> |
||||
</div> |
||||
|
||||
<div class="add-skills-traits-container" class="container"> |
||||
<div class='row'> |
||||
<div class='col-md-3'> |
||||
<select class='form-control' ng-model='path.selectedSkill' ng-options='s for s in charredSkills'></select> |
||||
</div> |
||||
<div class='col-md-1'> |
||||
<a href='' ng-click='path.skills.addSkill(path.selectedSkill)'>Add skill</a> |
||||
</div> |
||||
<div class='col-md-2'> |
||||
<a href='' ng-click=''>TODO: Add new skill</a> |
||||
</div> |
||||
|
||||
<div class='col-md-3'> |
||||
<select class='form-control' ng-model='path.selectedTrait' ng-options='t for t in charredTraits'></select> |
||||
</div> |
||||
<div class='col-md-1'> |
||||
<a href='' ng-click='path.traits.addTrait(path.selectedTrait)'>Add trait</a> |
||||
</div> |
||||
<div class='col-md-2'> |
||||
<a href='' ng-click=''>TODO: Add new trait</a> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
|
||||
<span>WISHLIST: requires expression</span> |
||||
|
||||
</div> |
||||
</div> |
||||
</div> |
||||
<div class='panel panel-default'> |
||||
<input class='form-control input-lg not-editing editable-name' |
||||
name='new-lifepath-name' id='new-lifepath-name' |
||||
ng-model="setting.newLifepathName" ng-click="$event.stopPropagation()" |
||||
ng-focus='editField($event, true)' ng-blur='editField($event, false)' /> |
||||
<a href='' ng-click='setting.addLifepath()'>Add new lifepath</a> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<div class='panel panel-default'> |
||||
<input class='form-control input-lg not-editing editable-name' |
||||
name='new-setting-name' id='new-setting-name' |
||||
ng-model="newSettingName" ng-click="$event.stopPropagation()" |
||||
ng-focus='editField($event, true)' ng-blur='editField($event, false)' /> |
||||
<a href='' ng-click='addSetting()'>Add new setting</a> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<div class='panel-heading'> |
||||
<h4 class='panel-title'> |
||||
<a href='' ng-click='collapseBody("#collapse_skills")'>▸</a> |
||||
Skills |
||||
</h4> |
||||
</div> |
||||
<div class='panel-collapse collapse in' id='collapse_skills'> |
||||
<div class='panel-body'> |
||||
<div class='container-fluid'> |
||||
<div class='row'> |
||||
<div class='h4 col-md-3'>Skill</div> |
||||
<div class='h4 col-md-1'>Sorcerous?</div> |
||||
<div class='h4 col-md-8'>Roots</div> |
||||
<%# <div class='h4 col-md-2'>Stock specific?</div> %> |
||||
</div> |
||||
</div> |
||||
<div ng-repeat='skill in skills' class='row' ng-class-even="'skill-even'" ng-class-odd="'skill-odd'"> |
||||
<div class='h4 col-md-3'> |
||||
<input ng-model="skill.name" |
||||
class='form-control input-lg not-editing editable-name' |
||||
ng-click="$event.stopPropagation()" |
||||
ng-focus='editField($event, true)' ng-blur='editField($event, false)' /> |
||||
</div> |
||||
<div class='h4 col-md-1'><input type="checkbox" ng-model='skill.magic'></div> |
||||
<div class='h4 col-md-8'> |
||||
<div class="skill-roots-write"> |
||||
<span ng-repeat="(root,is) in skill.roots"> |
||||
<input type="checkbox" id='{{to_id(skill.name)-to_id(root)}}' ng-model='is'/> |
||||
<label for='{{to_id(skill.name)-to_id(root)}}'> {{root}} </label> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<div class='row'> |
||||
<div class='h4 col-md-12'><a href='' ng-click='addSkill()'>Add new skill</a></div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<div class='panel-heading'> |
||||
<h4 class='panel-title'> |
||||
<a href='' ng-click='collapseBody("#collapse_traits")'>▸</a> |
||||
Traits |
||||
</h4> |
||||
</div> |
||||
<div class='panel-collapse collapse in' id='collapse_traits'> |
||||
<div class='panel-body'> |
||||
<table class="traits"> |
||||
<tr> |
||||
<th>Trait</th> |
||||
<th>Cost</th> |
||||
<th>Type</th> |
||||
<%# <div class='h4 col-md-2'>Bonus</div> %> |
||||
<%# <div class='h4 col-md-2'>Restrictions</div> %> |
||||
</tr> |
||||
<%# </div> %> |
||||
<tr ng-repeat-start='trait in traits' ng-class-even="'trait-even'" ng-class-odd="'trait-odd'"> |
||||
<td> |
||||
<input ng-model="trait.name" |
||||
class='form-control input-lg not-editing editable-name' |
||||
ng-click="$event.stopPropagation()" |
||||
ng-focus='editField($event, true)' ng-blur='editField($event, false)' /> |
||||
</td> |
||||
<td> |
||||
<input type="number" class='not-editing editable-num' |
||||
ng-model="trait.cost" ng-click="$event.stopPropagation()" |
||||
ng-focus='editField($event, true)' ng-blur='editField($event, false)' /> |
||||
</td> |
||||
<td> |
||||
<select class='form-control' ng-model='trait.type' ng-options='t for t in TRAIT_TYPES'></select> |
||||
</td> |
||||
<td><a href='' ng-click='removeTrait($index)'>[X]</a></td> |
||||
</tr> |
||||
<%# <div class='h4 col-md-2'>WISHLIST</div> %> |
||||
<%# <div class='h4 col-md-2'>WISHLIST</div> %> |
||||
<tr ng-repeat-end ng-class-even="'trait-even'" ng-class-odd="'trait-odd'"> |
||||
<td colspan="99"><textarea class='trait-desc' ng-model='trait.desc'></textarea></td> |
||||
</tr> |
||||
</table> |
||||
<div class='row'> |
||||
<div class='h4 col-md-12'><a href='' ng-click='addTrait()'>Add new trait</a></div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
@ -0,0 +1,6 @@ |
||||
<span ng-if='$ctrl.label' for='{{$ctrl.inputID}}'>{{$ctrl.label}}</span> |
||||
<span ng-switch='$ctrl.isEditing'> |
||||
<input ng-switch-when="true" ng-model='$ctrl.modelValue' ng-blur='$ctrl.handleModeChange()' |
||||
id='{{$ctrl.inputID}}' type='{{$ctrl.inputType}}' class="editable-input editing"> |
||||
<span ng-switch-default class="editable-input">{{$ctrl.modelValue}}</span> |
||||
</span> |
@ -1 +0,0 @@ |
||||
{"serialize_version":1,"name":"Algoric the Apologist","gender":"male","stock":"man","lifepaths":[["Peasant Setting","Born Peasant",0,null,null,null,[]],["College of Magic Setting","Supplicant",0,null,null,null,[]],["College of Magic Setting","Junior Student",0,null,null,null,[[1,"p"]]],["Outcast Subsetting","Rogue Wizard",0,null,null,null,[[1,"p"],[1,"m"]]],["Servitude And Captive Setting","Captive Of War",0,null,null,null,[]],["City Dweller Setting","Criminal",0,null,null,null,[[1,"pm"]]],["City Dweller Setting","Temple Acolyte",0,null,null,null,[[1,"m"]]],["Religious Subsetting","Priest",0,null,null,null,[[1,"m"]]]],"stats":[{"name":"Will","shade":"B","mentalPoints":5,"physicalPoints":0,"eitherPoints":1},{"name":"Perception","shade":"B","mentalPoints":5,"physicalPoints":0,"eitherPoints":0},{"name":"Power","shade":"B","mentalPoints":0,"physicalPoints":3,"eitherPoints":0},{"name":"Forte","shade":"B","mentalPoints":0,"physicalPoints":4,"eitherPoints":0},{"name":"Agility","shade":"B","mentalPoints":0,"physicalPoints":4,"eitherPoints":0},{"name":"Speed","shade":"B","mentalPoints":0,"physicalPoints":3,"eitherPoints":0}],"skills":{"lifepath":[{"name":"Animal Husbandry","lifepathPoints":1,"generalPoints":0},{"name":"Firebuilding","lifepathPoints":1,"generalPoints":0},{"name":"Read","lifepathPoints":1,"generalPoints":0},{"name":"Write","lifepathPoints":1,"generalPoints":0},{"name":"Ancient History","lifepathPoints":1,"generalPoints":0},{"name":"Circination","lifepathPoints":2,"generalPoints":0},{"name":"Illuminations","lifepathPoints":1,"generalPoints":0},{"name":"Astrology","lifepathPoints":2,"generalPoints":0},{"name":"Symbology","lifepathPoints":1,"generalPoints":0},{"name":"Sorcery","lifepathPoints":5,"generalPoints":0},{"name":"Inconspicuous","lifepathPoints":1,"generalPoints":0},{"name":"Graveyard-wise","lifepathPoints":1,"generalPoints":0},{"name":"Bloodletting","lifepathPoints":1,"generalPoints":0},{"name":"Ugly Truth","lifepathPoints":1,"generalPoints":0},{"name":"Apocalypse-wise","lifepathPoints":1,"generalPoints":0},{"name":"Enchanting","lifepathPoints":2,"generalPoints":0},{"name":"Alchemy","lifepathPoints":1,"generalPoints":0},{"name":"Cell-wise","lifepathPoints":1,"generalPoints":0},{"name":"Chain-wise","lifepathPoints":1,"generalPoints":0},{"name":"Streetwise","lifepathPoints":1,"generalPoints":0},{"name":"Intimidation","lifepathPoints":1,"generalPoints":0},{"name":"Knives","lifepathPoints":1,"generalPoints":0},{"name":"Climbing","lifepathPoints":1,"generalPoints":0},{"name":"Doctrine","lifepathPoints":1,"generalPoints":0},{"name":"Bureaucracy","lifepathPoints":1,"generalPoints":0},{"name":"Temple-wise","lifepathPoints":1,"generalPoints":0},{"name":"Oratory","lifepathPoints":1,"generalPoints":0},{"name":"Suasion","lifepathPoints":2,"generalPoints":0},{"name":"Ritual","lifepathPoints":1,"generalPoints":0},{"name":"Religious History","lifepathPoints":1,"generalPoints":0}],"general":[{"name":"Whip-wise","lifepathPoints":0,"generalPoints":1},{"name":"Herbalism","lifepathPoints":0,"generalPoints":2}]},"traits":[{"name":"Gifted"},{"name":"Second Sight"},{"name":"Fey Blood"},{"name":"Aura Of Fear"},{"name":"Obscure Aura"},{"name":"Poker Face"},{"name":"Faithful"}],"gear":[{"cost":1,"desc":"Clothes"},{"cost":1,"desc":"Traveling Gear"},{"cost":1,"desc":"Personal Effects"},{"cost":5,"desc":"Riding Mount Or Pack Animal"},{"cost":10,"desc":"Armor, Light Mail, Run Of The Mill Quality"},{"cost":14,"desc":"Spells"}],"property":[{"cost":10,"desc":"Property, A House"}],"relationships":[],"affiliations":[{"desc":"The Scurrilous Foes","importance":"small"}],"reputations":[{"desc":"An Escaped Prisoner","importance":"regional"}],"attr_mod_questions":{"Health":[{"question":"Was the character severely wounded in the past?","answer":true},{"question":"Is the character athletic and active?","answer":true}],"Steel":[{"question":"Has the character ever been severely wounded?","answer":true},{"question":"Has the character ever murdered or killed with his own hand more than once?","answer":true},{"question":"Has the character been raised in a competitive (but non-violent) culture - sports, debate, strategy games, courting?","answer":true}],"Faith":[{"question":"Is it only through God that you best serve your allies?","answer":false}]},"brutal_life_withdrawn":false,"approp_weapons":{}} |
@ -1 +0,0 @@ |
||||
{"name":"Algoric the Apologist","age":41,"stock":"man","lifepaths":["Born Peasant","Supplicant","Junior Student","Rogue Wizard","Captive Of War","Criminal","Temple Acolyte","Priest"],"stats":{"will":["B",6],"perception":["B",5],"power":["B",3],"forte":["B",4],"agility":["B",4],"speed":["B",3]},"attributes":{"mortal wound":["B",9],"reflexes":["B",4],"health":["B",5],"steel":["B",6],"hesitation":["",4],"stride":["",7],"circles":["B",3],"resources":["B",3],"faith":["B",3]},"skills":[["Animal Husbandry","B",3,false],["Firebuilding","B",2,false],["Read","B",2,false],["Write","B",2,false],["Ancient History","B",2,false],["Circination","B",2,false],["Illuminations","B",2,false],["Astrology","B",3,false],["Symbology","B",2,false],["Sorcery","B",5,false],["Inconspicuous","B",3,false],["Graveyard-wise","B",2,null],["Bloodletting","B",2,false],["Ugly Truth","B",2,false],["Apocalypse-wise","B",2,null],["Enchanting","B",2,false],["Alchemy","B",2,false],["Cell-wise","B",2,null],["Chain-wise","B",2,null],["Streetwise","B",2,false],["Intimidation","B",3,false],["Knives","B",2,false],["Climbing","B",1,false],["Doctrine","B",2,false],["Bureaucracy","B",3,false],["Temple-wise","B",2,null],["Oratory","B",3,false],["Suasion","B",4,false],["Ritual","B",2,false],["Religious History","B",2,false],["Whip-wise","B",2,false],["Herbalism","B",3,false]],"traits":[["Gifted","die"],["Second Sight","die"],["Fey Blood","die"],["Aura Of Fear","die"],["Obscure Aura","die"],["Poker Face","call_on"],["Faithful","die"],["Broken In","die"],["Hazed","die"],["Spooky","character"],["Claustrophobic","die"],["Cynical","character"],["Believer","die"],["Vested","die"]],"gear":["Clothes","Traveling Gear","Personal Effects","Riding Mount Or Pack Animal","Armor, Light Mail, Run Of The Mill Quality","Spells"],"property":["Property, A House"],"relationships":[],"reputations":["An Escaped Prisoner 2D"],"affiliations":["The Scurrilous Foes 1D"],"ptgs":{"su":3,"li":5,"mi":6,"se":7,"tr":8,"mo":9},"attr_mod_questions":{"Health":[{"question":"Does the character live in squalor and filth?","math_label":"(-1 Health)","modifier":-1},{"question":"Is the character frail or sickly?","math_label":"(-1 Health)","modifier":-1},{"question":"Was the character severely wounded in the past?","math_label":"(-1 Health)","modifier":-1,"answer":true},{"question":"Has the character been tortured and enslaved?","math_label":"(-1 Health)","modifier":-1},{"question":"Is the character athletic and active?","math_label":"(+1 Health)","modifier":1,"answer":true},{"question":"Does the character live in a really clean and happy place, like the hills in the Sound of Music?","math_label":"(+1 Health)","modifier":1}],"Steel":[{"question":"Has the character ever been severely wounded?","math_label":"(+1 Steel if combat lifepath taken/-1 Steel if not)","computeModifier":true,"answer":true},{"question":"Has the character ever murdered or killed with his own hand more than once?","math_label":"(+1 Steel)","modifier":1,"answer":true},{"question":"Has the character been tortured, enslaved or beaten terribly over time?","math_label":"(+1 Steel if Will is > 4, -1 Steel if Will < 4, +0 if Will is 4)","computeModifier":true},{"question":"Has the character lead a sheltered life, free of violence and pain?","math_label":"(-1 Steel)","modifier":-1},{"question":"Has the character been raised in a competitive (but non-violent) culture - sports, debate, strategy games, courting?","math_label":"(+1 Steel)","modifier":1,"answer":true},{"question":"Has the character given birth to a child?","math_label":"(+1 Steel)","modifier":1}],"Faith":[{"question":"Is God who you trust the most?","math_label":"(+1 Faith)","modifier":1},{"question":"When in danger, do you consult God for aid?","math_label":"(+1 Faith)","modifier":1},{"question":"Is it only through God that you best serve your allies?","math_label":"(+1 Faith)","modifier":1,"answer":false}]}} |
File diff suppressed because one or more lines are too long
@ -1 +0,0 @@ |
||||
{"name":"Tyastanarphen","age":676,"stock":"elf","lifepaths":["Citadel Born","Wanderer","Song Singer","Bard","Loremaster","Griever","Liar","Deceiver","Recluse"],"stats":{"will":["B",8],"perception":["G",6],"power":["B",6],"forte":["B",5],"agility":["B",5],"speed":["B",5]},"attributes":{"mortal wound":["B",11],"reflexes":["B",6],"health":["B",5],"steel":["B",9],"hesitation":["",2],"stride":["",8],"circles":["B",4],"resources":["B",1],"grief":["G",4],"spite":["B",9]},"skills":[["Elven Script","G",4,false],["Sing","B",4,false],["Song Of Paths And Ways","G",3,false],["Air Of Gates","B",4,false],["Foraging","G",3,false],["Road-wise","G",3,false],["Song Of Songs","B",4,false],["Song Of Soothing","B",4,false],["Lament Of Stars","B",4,false],["Song Of Merriment","B",4,false],["Lament Of Mourning","B",4,false],["Tract Of Enmity","B",4,false],["Oratory","B",6,false],["Conspicuous","B",4,false],["Lyre","B",3,false],["Flute","B",3,false],["Ancient And Obscure History","G",3,false],["Research","G",3,false],["Ballad Of History","G",3,false],["Lyric Of Law","G",3,false],["Canticle Of Years","B",4,false],["Rhyme Of Tongues","B",4,false],["Sorrow Of Truth","B",4,false],["Dark Elf-wise","G",3,null],["Falsehood","B",4,false],["Soothing Platitudes","B",4,false],["Persuasion","B",6,false],["Twisted Tongue","B",4,false],["Sleight Of Hand","B",4,false],["Disguise","B",3,false],["Inconspicuous","B",4,false],["Rhyme Of The Unraveller","B",4,false],["Ancient History","G",3,false],["Dwarf-wise","G",3,false],["Elven Politics-wise","G",3,null],["Cut Of The Quickened Mind","B",4,false],["Antiphon Union Training","B",5,true],["Almanac","G",3,false]],"traits":[["Grim","character"],["Glib","call_on"],["Oikofugic","character"],["Voice In The Crowd","character"],["Spite","character"],["Compulsive Liar","character"],["Deceptive","call_on"],["Vengeful","die"],["Born Under The Silver Stars","character"],["Essence Of The Earth","die"],["Fair And Statuesque","character"],["First Born","die"],["Grief","die"],["Keen Sight","die"]],"gear":["Morlin Armor, Light Mail","Long Knife","Tome Of Lore","Cloak Of Darkness"],"property":["Remote Refuge, Safe House"],"relationships":[],"reputations":[],"affiliations":[],"ptgs":{"su":3,"li":6,"mi":8,"se":9,"tr":10,"mo":11},"attr_mod_questions":{"Health":[{"question":"Does the character live in squalor and filth?","math_label":"(-1 Health)","modifier":-1,"answer":true},{"question":"Is the character frail or sickly?","math_label":"(-1 Health)","modifier":-1},{"question":"Was the character severely wounded in the past?","math_label":"(-1 Health)","modifier":-1,"answer":true},{"question":"Has the character been tortured and enslaved?","math_label":"(-1 Health)","modifier":-1,"answer":true},{"question":"Is the character athletic and active?","math_label":"(+1 Health)","modifier":1,"answer":true},{"question":"Does the character live in a really clean and happy place, like the hills in the Sound of Music?","math_label":"(+1 Health)","modifier":1}],"Steel":[{"question":"Has the character ever been severely wounded?","math_label":"(+1 Steel if combat lifepath taken/-1 Steel if not)","computeModifier":true,"answer":true},{"question":"Has the character ever murdered or killed with his own hand more than once?","math_label":"(+1 Steel)","modifier":1,"answer":true},{"question":"Has the character been tortured, enslaved or beaten terribly over time?","math_label":"(+1 Steel if Will is > 4, -1 Steel if Will < 4, +0 if Will is 4)","computeModifier":true,"answer":true},{"question":"Has the character lead a sheltered life, free of violence and pain?","math_label":"(-1 Steel)","modifier":-1},{"question":"Has the character been raised in a competitive (but non-violent) culture - sports, debate, strategy games, courting?","math_label":"(+1 Steel)","modifier":1,"answer":true},{"question":"Has the character given birth to a child?","math_label":"(+1 Steel)","modifier":1,"answer":true}],"Grief":[{"question":"Does the character's history include tragedy?","math_label":"(+1 Grief)","modifier":1,"answer":true},{"question":"Has the character lived among non-Elven people?","math_label":"(+1 Grief)","modifier":1,"answer":true}],"Spite":[{"question":"Has the character been betrayed by their friends?","math_label":"(+1 Spite)","modifier":1,"answer":true},{"question":"Is the character lovesick or broken hearted?","math_label":"(+1 Spite)","modifier":1,"answer":true},{"question":"Has the character been abandoned by those they held dear?","math_label":"(+1 Spite)","modifier":1,"answer":true},{"question":"Has the character been abused or tortured?","math_label":"(+1 Spite)","modifier":1,"answer":true},{"question":"Does the character still respect or admire someone on the other side?","math_label":"(-1 Spite)","modifier":-1,"answer":true},{"question":"Does the character still love someone on the other side?","math_label":"(-2 Spite)","modifier":-2}]}} |
@ -1,133 +0,0 @@ |
||||
{ |
||||
"stock": "test", |
||||
"settings": { |
||||
"Test Setting": { |
||||
"Born Test": { |
||||
"time": 7, |
||||
"res": 5, |
||||
"skills": [ |
||||
[ |
||||
1, |
||||
"General" |
||||
] |
||||
], |
||||
"traits": [ |
||||
2 |
||||
], |
||||
"leads": [ |
||||
"Nowhere" |
||||
], |
||||
"key_leads": [ |
||||
"Nowhere Setting" |
||||
] |
||||
}, |
||||
"A thing": { |
||||
"time": 5, |
||||
"res": 2, |
||||
"stat": [ |
||||
[ |
||||
2, |
||||
"p" |
||||
] |
||||
], |
||||
"skills": [ |
||||
[ |
||||
4, |
||||
"Testing", |
||||
"Forest-wise", |
||||
"Stealthy" |
||||
] |
||||
], |
||||
"traits": [ |
||||
1 |
||||
], |
||||
"leads": [ |
||||
"Nowhere" |
||||
], |
||||
"key_leads": [ |
||||
"Nowhere Setting" |
||||
] |
||||
} |
||||
}, |
||||
"Nowhere Setting": { |
||||
"Born Nothing": { |
||||
"time": 0, |
||||
"res": 0, |
||||
"skills": [ |
||||
], |
||||
"traits": [ |
||||
], |
||||
"leads": [ |
||||
], |
||||
"key_leads": [ |
||||
] |
||||
}, |
||||
"Not A Thing": { |
||||
"time": 15, |
||||
"res": 1, |
||||
"stat": [ |
||||
[ |
||||
1, |
||||
"pm" |
||||
] |
||||
], |
||||
"skills": [ |
||||
[ |
||||
2, |
||||
"Nothinging", |
||||
"Voiding" |
||||
] |
||||
], |
||||
"traits": [ |
||||
3 |
||||
], |
||||
"leads": [ |
||||
"Somewhere" |
||||
], |
||||
"key_leads": [ |
||||
"Somewhere Subsetting" |
||||
] |
||||
} |
||||
}, |
||||
"Somewhere Subsetting": { |
||||
"Something Special": { |
||||
"time": 30, |
||||
"res": 21, |
||||
"stat": [ |
||||
[ |
||||
1, |
||||
"m" |
||||
],[ |
||||
1, |
||||
"p" |
||||
],[ |
||||
1, |
||||
"pm" |
||||
] |
||||
], |
||||
"skills": [ |
||||
[ |
||||
7, |
||||
"Specializing", |
||||
"Soothing", |
||||
"History", |
||||
"Sorcery", |
||||
"Spirit Binding", |
||||
"Harming" |
||||
] |
||||
], |
||||
"traits": [ |
||||
3, |
||||
"Stubborn", |
||||
"Shy" |
||||
], |
||||
"leads": [ |
||||
"Nowhere" |
||||
], |
||||
"key_leads": [ |
||||
"Nowhere Setting" |
||||
] |
||||
} |
||||
} |
||||
} |
||||
} |
@ -1,25 +0,0 @@ |
||||
{ |
||||
"stock": "test", |
||||
"resources": [ |
||||
{ |
||||
"name": "Rags", |
||||
"type": "gear", |
||||
"rp": 1 |
||||
}, |
||||
{ |
||||
"name": "Riches", |
||||
"type": "gear", |
||||
"rp": 50 |
||||
}, |
||||
{ |
||||
"name": "A firey soul", |
||||
"type": "gear", |
||||
"rp": 3 |
||||
}, |
||||
{ |
||||
"name": "Chest or Footlocker", |
||||
"type": "gear", |
||||
"rp": 3 |
||||
} |
||||
] |
||||
} |
@ -1,39 +0,0 @@ |
||||
{ |
||||
"Testing": { |
||||
"stock": "testish", |
||||
"roots": [ |
||||
"Perception" |
||||
] |
||||
}, |
||||
"Nothinging": { |
||||
"stock": "testish", |
||||
"roots": [ |
||||
"Will", |
||||
"Agility" |
||||
] |
||||
}, |
||||
"Voiding": { |
||||
"stock": "testish", |
||||
"roots": [ |
||||
"Speed" |
||||
] |
||||
}, |
||||
"Specializing": { |
||||
"stock": "testish", |
||||
"roots": [ |
||||
"Forte" |
||||
] |
||||
}, |
||||
"Soothing": { |
||||
"stock": "testish", |
||||
"roots": [ |
||||
"Power" |
||||
] |
||||
}, |
||||
"Harming": { |
||||
"stock": "testish", |
||||
"roots": [ |
||||
"Will" |
||||
] |
||||
} |
||||
} |
@ -1,95 +0,0 @@ |
||||
{ |
||||
"key": "test", |
||||
"name": "Test", |
||||
"stride": 9, |
||||
"adjective": "testish", |
||||
"common_traits": [ |
||||
"Trait 1", |
||||
"testy", |
||||
"Trait #3", |
||||
"Night Eyed (Test)" |
||||
], |
||||
"starting_stats": |
||||
[ |
||||
{ |
||||
"range": [ |
||||
1, |
||||
10 |
||||
], |
||||
"m": 1, |
||||
"p": 2 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
11, |
||||
20 |
||||
], |
||||
"m": 2, |
||||
"p": 4 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
21, |
||||
30 |
||||
], |
||||
"m": 3, |
||||
"p": 6 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
31, |
||||
40 |
||||
], |
||||
"m": 4, |
||||
"p": 8 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
41, |
||||
50 |
||||
], |
||||
"m": 5, |
||||
"p": 10 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
51, |
||||
60 |
||||
], |
||||
"m": 6, |
||||
"p": 12 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
61, |
||||
70 |
||||
], |
||||
"m": 7, |
||||
"p": 14 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
71, |
||||
80 |
||||
], |
||||
"m": 8, |
||||
"p": 16 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
81, |
||||
90 |
||||
], |
||||
"m": 9, |
||||
"p": 18 |
||||
}, |
||||
{ |
||||
"range": [ |
||||
91, |
||||
100 |
||||
], |
||||
"m": 10, |
||||
"p": 20 |
||||
} |
||||
] |
||||
} |
@ -1,55 +0,0 @@ |
||||
{ |
||||
"Trait 1": { |
||||
"cost": 0, |
||||
"type": "die", |
||||
"restrict": [ |
||||
"testish", |
||||
"common" |
||||
], |
||||
"desc": "" |
||||
}, |
||||
"testy": { |
||||
"cost": 0, |
||||
"type": "die", |
||||
"restrict": [ |
||||
"testish", |
||||
"common" |
||||
], |
||||
"desc": "" |
||||
}, |
||||
"Trait #3": { |
||||
"cost": 0, |
||||
"type": "die", |
||||
"restrict": [ |
||||
"testish", |
||||
"common" |
||||
], |
||||
"desc": "" |
||||
}, |
||||
"Night Eyed (Test)": { |
||||
"cost": 1, |
||||
"type": "die", |
||||
"restrict": [ |
||||
"testish", |
||||
"common" |
||||
], |
||||
"desc": "The test version" |
||||
}, |
||||
"Shy": { |
||||
"cost": 1, |
||||
"type": "character", |
||||
"restrict": [ |
||||
"testish", |
||||
"lifepath" |
||||
] |
||||
}, |
||||
"Special": { |
||||
"cost": 3, |
||||
"type": "die", |
||||
"restrict": [ |
||||
"testish", |
||||
"special" |
||||
], |
||||
"desc": "Snowflake" |
||||
} |
||||
} |
Loading…
Reference in new issue