Fork of https://github.com/modality/charred-black.
Short term, has some fixes.
Long term, may include a tool to create and edit stock/lifepath/skill/trait data.
http://charred.obscuritus.ca:8080/#/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
152 lines
5.5 KiB
152 lines
5.5 KiB
require 'prawn'
|
|
require 'prawn/templates'
|
|
|
|
class CharSheet
|
|
def initialize(character)
|
|
@character = character
|
|
@t1 = 16
|
|
@t2 = 12
|
|
@t3 = 10
|
|
end
|
|
|
|
def render_skill(pdf, skilldef, at)
|
|
skill, shade, exponent = skilldef
|
|
x, y = at
|
|
|
|
pdf.text_box skill, :at => [x, y + 10], :width => 95, :height => 15, :overflow => :shrink_to_fit, :valign => :bottom, :size => @t1
|
|
|
|
self.render_shade_exponent(pdf, shade, exponent, [x+101.5, y-0.8], 13.5, -0.2)
|
|
end
|
|
|
|
def render_shade_exponent(pdf, shade, exponent, at, xs = 13, ys = 0.5)
|
|
x, y = at
|
|
pdf.draw_text shade, :at => [x, y], :size => @t2
|
|
pdf.draw_text (exponent.to_s), :at => [x+xs, y+ys], :size => @t2
|
|
end
|
|
|
|
def render(logger)
|
|
pdf = Prawn::Document.new(:template => 'data/gold.pdf')
|
|
pdf.font 'data/caliban.ttf'
|
|
pdf.default_leading -4
|
|
|
|
# logger.info @character
|
|
|
|
<<-GRID
|
|
(0...40).each do |x|
|
|
(0...30).each do |y|
|
|
if x % 5 == 0 && y % 5 == 0
|
|
pdf.stroke_color "ff0000"
|
|
else
|
|
pdf.stroke_color "cccccc"
|
|
end
|
|
pdf.stroke_circle [x * 20, y * 20], 1
|
|
end
|
|
end
|
|
|
|
pdf.go_to_page(2)
|
|
|
|
(0...40).each do |x|
|
|
(0...30).each do |y|
|
|
if x % 5 == 0 && y % 5 == 0
|
|
pdf.stroke_color "ff0000"
|
|
else
|
|
pdf.stroke_color "cccccc"
|
|
end
|
|
pdf.stroke_circle [x * 20, y * 20], 1
|
|
end
|
|
end
|
|
GRID
|
|
|
|
pdf.draw_text @character['name'], :at => [5, 490], :size => @t1
|
|
pdf.draw_text @character['stock'].capitalize, :at => [84, 490], :size => @t1
|
|
pdf.draw_text @character['age'], :at => [165, 490], :size => @t1
|
|
pdf.text_box @character['lifepaths'].join(', '), :at => [245, 499], :width => 100, :size => @t2
|
|
|
|
character_traits = @character['traits'].select {|t| t[1] == 'character'}.map {|t| t[0] }
|
|
die_traits = @character['traits'].select {|t| t[1] == 'die'}.map {|t| t[0] }
|
|
call_on_traits = @character['traits'].select {|t| t[1] == 'call_on'}.map {|t| t[0] }
|
|
|
|
pdf.text_box character_traits.join("\n"), :at => [5, 214], :width => 110, :size => @t2
|
|
pdf.text_box die_traits.join("\n"), :at => [122, 214], :width => 110, :size => @t2
|
|
pdf.text_box call_on_traits.join("\n"), :at => [241, 207], :width => 110, :size => @t2
|
|
|
|
gear = @character['gear'] + @character['property']
|
|
#gear = gear.map {|g| g.split(', ').join(' - ') }
|
|
pdf.text_box gear.join(', '), :at => [30, 55], :width => 280, :size => @t2
|
|
|
|
relationships = @character['relationships'] + @character['reputations'] + @character['affiliations']
|
|
pdf.text_box relationships.join("\n"), :at => [5, 136], :width => 80, :size => @t2
|
|
|
|
per_apt = 10 - @character['stats']['perception'][1]
|
|
wil_apt = 10 - @character['stats']['will'][1]
|
|
agi_apt = 10 - @character['stats']['agility'][1]
|
|
spd_apt = 10 - @character['stats']['speed'][1]
|
|
pow_apt = 10 - @character['stats']['power'][1]
|
|
for_apt = 10 - @character['stats']['forte'][1]
|
|
|
|
pdf.draw_text per_apt, :at => [433, 207], :size => @t2
|
|
pdf.draw_text wil_apt, :at => [482, 207], :size => @t2
|
|
pdf.draw_text agi_apt, :at => [539, 207], :size => @t2
|
|
pdf.draw_text spd_apt, :at => [593, 207], :size => @t2
|
|
pdf.draw_text pow_apt, :at => [647, 207], :size => @t2
|
|
pdf.draw_text for_apt, :at => [699, 207], :size => @t2
|
|
|
|
pdf.go_to_page(2)
|
|
|
|
wil_stat = @character['stats']['will']
|
|
per_stat = @character['stats']['perception']
|
|
pow_stat = @character['stats']['power']
|
|
for_stat = @character['stats']['forte']
|
|
agi_stat = @character['stats']['agility']
|
|
spd_stat = @character['stats']['speed']
|
|
|
|
self.render_shade_exponent(pdf, wil_stat[0], wil_stat[1], [54, 501])
|
|
self.render_shade_exponent(pdf, per_stat[0], per_stat[1], [54, 462])
|
|
self.render_shade_exponent(pdf, pow_stat[0], pow_stat[1], [166, 501])
|
|
self.render_shade_exponent(pdf, for_stat[0], for_stat[1], [166, 462])
|
|
self.render_shade_exponent(pdf, agi_stat[0], agi_stat[1], [276.5, 501])
|
|
self.render_shade_exponent(pdf, spd_stat[0], spd_stat[1], [276.5, 462])
|
|
|
|
hlt_attr = @character['attributes']['health']
|
|
stl_attr = @character['attributes']['steel']
|
|
cir_attr = @character['attributes']['circles']
|
|
res_attr = @character['attributes']['resources']
|
|
ref_attr = @character['attributes']['reflexes']
|
|
mor_attr = @character['attributes']['mortal wound']
|
|
str_attr = @character['attributes']['stride']
|
|
hes_attr = @character['attributes']['hesitation']
|
|
|
|
self.render_shade_exponent(pdf, hlt_attr[0], hlt_attr[1], [52, 396.5])
|
|
self.render_shade_exponent(pdf, stl_attr[0], stl_attr[1], [52, 351.5])
|
|
self.render_shade_exponent(pdf, cir_attr[0], cir_attr[1], [54, 296])
|
|
self.render_shade_exponent(pdf, res_attr[0], res_attr[1], [54, 249.5])
|
|
self.render_shade_exponent(pdf, ref_attr[0], ref_attr[1], [279, 396.5])
|
|
self.render_shade_exponent(pdf, mor_attr[0], mor_attr[1], [278.5, 346])
|
|
|
|
ptgs = @character['ptgs']
|
|
["Su", "Li", "Mi", "Se", "Tr", "Mo"].each do |tol|
|
|
tol_c = ptgs[tol.downcase]
|
|
pdf.draw_text "#{tol}", :at => [29 + (19.5 * tol_c), 190], :size => @t2
|
|
end
|
|
|
|
pdf.draw_text str_attr[1], :at => [264, 428], :size => @t2
|
|
pdf.draw_text hes_attr[1], :at => [53, 318], :size => @t2
|
|
|
|
skills_left = @character['skills'][0...13]
|
|
skills_right = @character['skills'][13...26]
|
|
|
|
if skills_left
|
|
skills_left.each_with_index do |s, i|
|
|
self.render_skill(pdf, s, [372, 495 - (i*20.3)])
|
|
end
|
|
end
|
|
|
|
if skills_right
|
|
skills_right.each_with_index do |s, i|
|
|
self.render_skill(pdf, s, [551, 495 - (i*20.3)])
|
|
end
|
|
end
|
|
|
|
pdf.render
|
|
end
|
|
end
|
|
|