summaryrefslogtreecommitdiff
path: root/draw.lua
diff options
context:
space:
mode:
Diffstat (limited to 'draw.lua')
-rw-r--r--draw.lua139
1 files changed, 16 insertions, 123 deletions
diff --git a/draw.lua b/draw.lua
index e75274c..f80d565 100644
--- a/draw.lua
+++ b/draw.lua
@@ -6,117 +6,10 @@ setfenv(1, module)
local m = require 'marigold-svg.marigold'
-local function merge2(a, b)
- local tbl = {}
- for k, v in pairs(a) do tbl[k] = v end
- for k, v in pairs(b) do tbl[k] = v end
- return tbl
-end
-local function merge_recursive(array, acc)
- local tbl = array[1]
- table.remove(array, 1)
- local acc = merge2(acc, tbl)
- if #array == 0 then return acc end
- return merge_recursive(array, acc)
-end
-local function merge(...)
- return merge_recursive({...}, {})
-end
-
-
function capitalize(str)
return string.gsub(str, "^.", string.upper)
end
---===== boxes =====--
-
-Box = {}
-function Box.new(_, tbl)
- local parent = tbl.parent or { x0=0, y0=0 }
- local width = tbl.width or parent.width
- local height = tbl.height or parent.width
- local offset = tbl.offset or { x=0, y=0 }
- local padding = tbl.padding or { left=0, right=0, top=0, bottom=0 }
- padding.left = padding.left or 0
- padding.right = padding.right or 0
- padding.top = padding.top or 0
- padding.bottom = padding.bottom or 0
- local self = {
- x0 = parent.x0 + offset.x + padding.left,
- y0 = parent.y0 + offset.y + padding.top,
- width = width - padding.left - padding.right,
- height = height - padding.top - padding.bottom,
- }
- setmetatable(self, {__index=Box})
- return self
-end
-setmetatable(Box, {__call=Box.new})
-
-
-function Box.point(self, x, y)
- return x + self.x0, y + self.y0
-end
-
-function Box.center(self)
- return self.x0 + (self.width/2), self.y0 + (self.height/2)
-end
-
-local function hsplit(box, acc, count, settings)
- local index = #acc
- if index == count then return acc end
-
- local z = box.width / count
- table.insert(
- acc,
- Box(merge({
- parent=box,
- width=z,
- offset= { x=index*z, y=0 }
- }, settings))
- )
- return hsplit(box, acc, count, settings)
-end
-function Box.hsplit(self, count, settings)
- local count = count or 2
- local settings = settings or {}
- return hsplit(self, {}, count, settings)
-end
-
-local function vsplit(box, acc, count, settings)
- local index = #acc
- if index == count then return acc end
-
- local z = box.height / count
- table.insert(
- acc,
- Box(merge({
- parent=box,
- height=z,
- offset= { y=index*z, x=0 }
- }, settings))
- )
- return vsplit(box, acc, count, settings)
-end
-function Box.vsplit(self, count, settings)
- local count = count or 2
- local settings = settings or {}
- return vsplit(self, {}, count, settings)
-end
-
-
-function Box.split_down(self, height)
- local a = Box{
- parent=self,
- height=height,
- }
- local b = Box{
- parent=self,
- height=self.height - height,
- offset={x=0, y=height},
- }
- return a, b
-end
-
--===== misc =====--
@@ -156,10 +49,10 @@ local divider = function() return pad(0, 10, _divider()) end
--===== basic stats =====--
-local function title(stats)
+local function name(stats)
local size = 40
return function(y)
- return m.text(stats.title, {
+ return m.text(stats.name, {
x=10, y=y+size,
style="font-size:"..size.."px;font-variant-caps:small-caps;stroke:black;fill:darkred;font-family:serif",
})
@@ -179,7 +72,7 @@ end
local function header(stats)
local f, h = stack(
- {pad(10, 10, title(stats))},
+ {pad(10, 10, name(stats))},
{pad(0, 10, subheading(stats))}
)
return f, h
@@ -203,25 +96,25 @@ local function armor_hp(stats)
return f, h
end
-local function bonus(raw)
- return math.floor( (raw-10)/2 )
+local function bonus(ability_score)
+ return math.floor( (ability_score-10)/2 )
end
-local function rawbox(name, raw, x, y)
- local raw = tonumber(raw)
- local value = string.format("%d (%s%d)", raw, (raw<0 and '-') or '+', bonus(raw))
+local function scorebox(name, ability_score, x, y)
+ local score = tonumber(ability_score)
+ local value = string.format("%d (%s%d)", score, (score<0 and '-') or '+', bonus(score))
return m.g{
m.text(name, { x=x+10, y=y+15, style="font-weight:bold;font-size:15px;fill:darkred" }),
m.text(value, {x=x, y=y+30, style="font-size:15px;fill:darkred;" }),
}
end
-local function raw(stats)
+local function ability_scores(stats)
return function(y) return m.g{
- rawbox('STR', stats.str, 10, y),
- rawbox('DEX', stats.dex, 90, y),
- rawbox('CON', stats.con, 170, y),
- rawbox('INT', stats.int, 250, y),
- rawbox('WIS', stats.wis, 330, y),
- rawbox('CHA', stats.cha, 410, y),
+ scorebox('STR', stats.str, 10, y),
+ scorebox('DEX', stats.dex, 90, y),
+ scorebox('CON', stats.con, 170, y),
+ scorebox('INT', stats.int, 250, y),
+ scorebox('WIS', stats.wis, 330, y),
+ scorebox('CHA', stats.cha, 410, y),
} end, 40
end
@@ -231,7 +124,7 @@ local function base(stats)
{divider()},
{armor_hp(stats)},
{divider()},
- {raw(stats)},
+ {ability_scores(stats)},
{divider()}
)
return f, h