toolheim/pdf-exporter/exporter/pdf.go

479 lines
11 KiB
Go

package exporter
import (
"strconv"
//"fmt"
"github.com/f0086/toolheim/parser"
"github.com/jung-kurt/gofpdf"
)
var marker_sign = "X"
var text_color_r = 170
var text_color_g = 0
var text_color_b = 0
var startY = 0
var offsetY = 0
func MakeHeroPage(warband parser.Warband, pdf *gofpdf.Fpdf, newPage bool) {
if !newPage {
// add a new page if required
if startY > 297-60 {
pdf.AddPage()
startY = 0
offsetY = 0
}
} else {
pdf.AddPage()
startY = 0
offsetY = 0
}
shiftY := 44
for i, hero := range warband.Heros {
if i > 0 {
offsetY = offsetY + shiftY
}
// handle multipage henchmen lists
if offsetY > 297-60 {
pdf.AddPage()
offsetY = 0
}
// Background
pdf.SetXY(5, float64(offsetY+5))
pdf.Image("images/hero.png", 5, 0, 1499*0.133, 295*0.133, true, "", 0, "")
// Name
pdf.SetFont("Arial", "B", 12)
pdf.SetXY(18, float64(offsetY+4))
pdf.Write(11, hero.Name)
// Type
pdf.SetFont("Arial", "", 12)
pdf.SetXY(18, float64(offsetY+10))
pdf.Write(11, hero.Type)
// Stats
pdf.SetFillColor(255, 0, 0)
pdf.SetFont("Arial", "", 13)
pdf.SetFontUnitSize(5)
pdf.SetXY(6, float64(offsetY+24))
if len(hero.Stats.Movement) > 1 {
pdf.SetX(3)
}
pdf.Write(11, hero.Stats.Movement)
pdf.SetX(13)
pdf.Write(11, strconv.Itoa(hero.Stats.WeaponSkill))
pdf.SetX(20)
pdf.Write(11, strconv.Itoa(hero.Stats.BallisticSkill))
pdf.SetX(27)
pdf.Write(11, strconv.Itoa(hero.Stats.Strength))
pdf.SetX(33)
pdf.Write(11, strconv.Itoa(hero.Stats.Toughness))
pdf.SetX(40)
pdf.Write(11, strconv.Itoa(hero.Stats.Wounds))
pdf.SetX(46)
pdf.Write(11, strconv.Itoa(hero.Stats.Initiative))
pdf.SetX(53)
pdf.Write(11, strconv.Itoa(hero.Stats.Attacks))
pdf.SetX(59.5)
pdf.Write(11, strconv.Itoa(hero.Stats.Leadership))
pdf.SetX(66.0)
pdf.Write(11, hero.Stats.Save)
// Skill lists
if hero.BSkillLists.Combat == true {
pdf.SetFont("Arial", "B", 10)
pdf.SetXY(7.25, float64(offsetY+21))
pdf.Write(0, marker_sign)
}
if hero.BSkillLists.Shooting == true {
pdf.SetFont("Arial", "B", 10)
pdf.SetXY(17.75, float64(offsetY+21))
pdf.Write(0, marker_sign)
}
if hero.BSkillLists.Academic == true {
pdf.SetFont("Arial", "B", 10)
pdf.SetXY(28.72, float64(offsetY+21))
pdf.Write(0, marker_sign)
}
if hero.BSkillLists.Strength == true {
pdf.SetFont("Arial", "B", 10)
pdf.SetXY(40.5, float64(offsetY+21))
pdf.Write(0, marker_sign)
}
if hero.BSkillLists.Speed == true {
pdf.SetFont("Arial", "B", 10)
pdf.SetXY(51.5, float64(offsetY+21))
pdf.Write(0, marker_sign)
}
if hero.BSkillLists.Special == true {
pdf.SetFont("Arial", "B", 10)
pdf.SetXY(60.7, float64(offsetY+21))
pdf.Write(0, marker_sign)
}
// Weapons
if hero.Weapons != nil {
for w, weapon := range hero.Weapons.List {
if w == 0 {
pdf.SetFont("Arial", "B", 10)
} else {
pdf.SetFont("Arial", "", 10)
}
pdf.SetXY(138, float64(offsetY+7+(w*5)))
pdf.Write(11, weapon)
}
}
// Armour
pdf.SetFont("Arial", "", 10)
if hero.Armour != nil {
for j, armour := range hero.Armour.List {
pdf.SetXY(168, float64(offsetY+3+(j*5)))
pdf.Write(11, armour)
}
}
ox := 0
oy := 0
if hero.Rules != nil {
for j, rule := range hero.Rules.List {
pdf.SetXY(float64(75+ox), float64(offsetY+6+(j*5)+oy))
pdf.Write(11, rule)
if j == 3 {
// start right of the first line after 4th line
ox = 30
oy = -20
}
}
}
if hero.HiredSword {
// show hired sword marker
pdf.SetXY(0, float64(offsetY)+38.5)
pdf.Image("images/hiredsword_marker.png", 6, 0, 421*0.053, 97*0.053, true, "", 0, "")
}
// XP
pdf.SetFont("Arial", "", 20)
pdf.SetXY(185, float64(offsetY+28))
pdf.Write(20, strconv.Itoa(hero.Experience))
y := 0.0
reduce_x := 0
for x := 1; x <= hero.Experience; x++ {
pdf.SetFont("Arial", "B", 10)
xx := x
if reduce_x > 0 {
xx = xx - reduce_x*30
}
pdf.SetXY(float64(73+((float64(xx)-1.0)*3.43)), float64(offsetY)+float64(y)*15.0+34.0)
pdf.Write(0, marker_sign)
if x == 30 || x == 60 {
y = y + 0.22
reduce_x = reduce_x + 1
}
}
}
offsetY = offsetY + shiftY
}
func MakeHenchmenPage(warband parser.Warband, pdf *gofpdf.Fpdf, newPage bool) {
if !newPage {
// add a new page if required
if startY > 297-60 {
pdf.AddPage()
startY = 0
offsetY = 0
}
} else {
pdf.AddPage()
startY = 0
offsetY = 0
}
shiftY := 34
for i, henchmen := range warband.HenchmenGroups {
if i > 0 {
offsetY = offsetY + shiftY
}
// handle multipage henchmen lists
if offsetY > 297-60 {
pdf.AddPage()
offsetY = 0
}
// Background
pdf.SetX(5)
pdf.SetY(float64(offsetY + 5))
pdf.Image("images/henchmen.png", 5, 0, 1499*0.133, 218*0.133, true, "", 0, "")
pdf.SetFont("Arial", "B", 12)
// Name
pdf.SetY(float64(offsetY + 4))
pdf.SetX(18)
pdf.Write(11, henchmen.Name)
// Type
pdf.SetFont("Arial", "", 12)
pdf.SetY(float64(offsetY + 9))
pdf.SetX(18)
pdf.Write(11, henchmen.Type)
// Number
pdf.SetFont("Arial", "B", 12)
pdf.SetY(float64(offsetY + 9))
pdf.SetX(64)
pdf.Write(11, strconv.Itoa(henchmen.Number))
// Stats
pdf.SetFillColor(255, 0, 0)
pdf.SetFont("Arial", "", 12)
pdf.SetFontUnitSize(5)
pdf.SetY(float64(offsetY + 18))
pdf.SetX(6)
if len(henchmen.Stats.Movement) > 1 {
pdf.SetX(3)
}
pdf.Write(11, henchmen.Stats.Movement)
pdf.SetX(13)
pdf.Write(11, strconv.Itoa(henchmen.Stats.WeaponSkill))
pdf.SetX(20)
pdf.Write(11, strconv.Itoa(henchmen.Stats.BallisticSkill))
pdf.SetX(27)
pdf.Write(11, strconv.Itoa(henchmen.Stats.Strength))
pdf.SetX(33)
pdf.Write(11, strconv.Itoa(henchmen.Stats.Toughness))
pdf.SetX(40)
pdf.Write(11, strconv.Itoa(henchmen.Stats.Wounds))
pdf.SetX(46)
pdf.Write(11, strconv.Itoa(henchmen.Stats.Initiative))
pdf.SetX(53)
pdf.Write(11, strconv.Itoa(henchmen.Stats.Attacks))
pdf.SetX(59.5)
pdf.Write(11, strconv.Itoa(henchmen.Stats.Leadership))
pdf.SetX(66.0)
pdf.Write(11, henchmen.Stats.Save)
// Weapons
if henchmen.Weapons != nil {
for w, weapon := range henchmen.Weapons.List {
if w == 0 {
pdf.SetFont("Arial", "B", 10)
} else {
pdf.SetFont("Arial", "", 10)
}
pdf.SetXY(138, float64(offsetY+7+(w*5)))
pdf.Write(11, weapon)
}
}
// Armour
pdf.SetFont("Arial", "", 10)
if henchmen.Armour != nil {
for j, armour := range henchmen.Armour.List {
pdf.SetXY(170, float64(offsetY+3+(j*5)))
pdf.Write(11, armour)
}
}
// Rules
if henchmen.Rules != nil {
for j, rule := range henchmen.Rules.List {
pdf.SetXY(75, float64(offsetY+7+(j*5)))
pdf.Write(11, rule)
}
}
// XP
pdf.SetFont("Arial", "", 13)
pdf.SetXY(190, float64(offsetY+21))
pdf.Write(20, strconv.Itoa(henchmen.Experience))
for x := 1; x <= henchmen.Experience; x++ {
pdf.SetFont("Arial", "B", 12)
pdf.SetXY(float64(137+((float64(x)-1.0)*3.45)), float64(offsetY)+30.5)
pdf.Write(0, marker_sign)
}
}
}
func MakeStatisticPage(warband parser.Warband, pdf *gofpdf.Fpdf) {
// Statistic page
pdf.AddPage()
startY = 23
offsetY = 0
// First page warband heading
pdf.SetFont("Arial", "B", 28)
pdf.SetXY(5, 5)
pdf.Write(11, warband.Warband.Name)
pdf.SetFont("Arial", "B", 17)
pdf.SetXY(5, 13)
pdf.Write(11, warband.Warband.Race)
offsetY = 23
// Warband status
pdf.SetX(5)
pdf.SetY(float64(offsetY) + 5)
pdf.Image("images/wb_stats.png", 5, 0, 1499*0.133, 218*0.133, true, "", 0, "")
// Equipment
pdf.SetFont("Arial", "", 10)
oX := 0
oY := 0
if warband.Equipment != nil {
for j, e := range warband.Equipment.List {
pdf.SetXY(123+float64(oX), float64(offsetY+oY+6+(j*5)))
pdf.Write(11, e)
if j == 4 {
oX = 40
oY = -25
}
}
}
pdf.SetFont("Arial", "B", 10)
pdf.SetXY(55, float64(offsetY)+32.0)
pdf.Write(0, strconv.Itoa(warband.Rating))
pdf.SetFont("Arial", "", 10)
pdf.SetXY(72.5, float64(offsetY)+32.0)
pdf.SetTextColor(0, 0, 0)
pdf.Write(0, "Routtest: ")
pdf.SetFont("Arial", "", 10)
pdf.SetTextColor(text_color_r, text_color_g, text_color_b)
pdf.SetXY(95, float64(offsetY)+32.0)
pdf.Write(0, strconv.Itoa(warband.Routtest))
pdf.SetFont("Arial", "", 10)
pdf.SetXY(55, float64(offsetY)+11.25)
pdf.Write(0, strconv.Itoa(warband.Hero_sum_xp))
pdf.SetXY(60, float64(offsetY)+11.25)
pdf.Write(0, "(+"+strconv.Itoa(warband.WarbandAddition_sum)+")")
pdf.SetFont("Arial", "", 10)
pdf.SetXY(55, float64(offsetY)+14.75)
pdf.Write(0, strconv.Itoa(warband.Henchmen_sum_xp))
pdf.SetFont("Arial", "B", 10)
pdf.SetXY(22.05, float64(offsetY)+18.0)
pdf.Write(0, strconv.Itoa(warband.Hero_cnt+warband.Henchmen_cnt+warband.Hiredsword_cnt))
pdf.SetFont("Arial", "", 10)
pdf.SetXY(55.0, float64(offsetY)+18.0)
pdf.Write(0, strconv.Itoa((warband.Hero_cnt+warband.Henchmen_cnt+warband.Hiredsword_cnt)*5))
pdf.SetFont("Arial", "B", 10)
pdf.SetXY(32.05, float64(offsetY)+21.25)
pdf.Write(0, strconv.Itoa(warband.Large_cnt))
pdf.SetFont("Arial", "", 10)
pdf.SetXY(55.0, float64(offsetY)+21.25)
pdf.Write(0, strconv.Itoa((warband.Large_cnt)*20))
pdf.SetFont("Arial", "B", 10)
pdf.SetXY(27.05, float64(offsetY)+24.5)
pdf.Write(0, "( "+strconv.Itoa(warband.Hiredsword_cnt)+" )")
pdf.SetFont("Arial", "", 10)
pdf.SetXY(55.0, float64(offsetY)+24.5)
pdf.Write(0, strconv.Itoa(warband.Hiredsword_sum_xp))
pdf.SetFont("Arial", "B", 10)
pdf.SetXY(95, float64(offsetY)+11.25)
pdf.Write(0, strconv.Itoa(warband.GoldCrowns))
pdf.SetFont("Arial", "B", 10)
pdf.SetXY(95, float64(offsetY)+17.75)
pdf.Write(0, strconv.Itoa(warband.Shards))
// Campaign info block
offsetY = offsetY + 40
pdf.SetXY(5, float64(offsetY))
pdf.Image("images/campaign.png", 5, 0, 1499*0.133, 218*0.133, true, "", 0, "")
pdf.SetFont("Arial", "B", 10)
pdf.SetXY(22, float64(offsetY)+6.25)
pdf.Write(0, warband.Objective)
pdf.SetFont("Arial", "", 10)
pdf.SetXY(147, float64(offsetY)+20.0)
pdf.Write(0, strconv.Itoa(warband.CampaignPoints))
row := 0
for x := 1; x <= warband.CampaignPoints; x++ {
pdf.SetFont("Arial", "B", 8)
xx := x - (row * 20)
pdf.SetXY(float64(130.75+((float64(xx)-1.0)*3.30)), float64(offsetY)+float64(24.4)+float64((float64(row)*float64(2.5))))
pdf.Write(0, marker_sign)
if x == 20 {
row = row + 1
}
}
// Notes block
offsetY = offsetY + 35
pdf.SetXY(5, float64(offsetY))
pdf.Image("images/notes.png", 5, 0, 1499*0.133, 218*0.33, true, "", 0, "")
pdf.SetFont("Arial", "", 12)
lines := pdf.SplitLines([]byte(warband.Notes), 195)
for i := 0; i < len(lines); i++ {
pdf.SetXY(7.0, float64(offsetY+8+i*8))
pdf.Write(0, string(lines[i]))
}
// the space after
offsetY = offsetY + 70
/*
pdf.SetFont("Arial", "B", 13)
pdf.SetXY(20, float64(offsetY+21))
pdf.Write(20, strconv.Itoa(hero_cnt))
pdf.SetFont("Arial", "B", 13)
pdf.SetXY(20, float64(offsetY+21))
pdf.Write(20, strconv.Itoa(len(warband.HenchmenGroups)))
pdf.SetFont("Arial", "B", 13)
pdf.SetXY(20, float64(offsetY+21))
pdf.Write(20, strconv.Itoa(henchmen_cnt))
offsetY = offsetY + 20
pdf.SetFont("Arial", "B", 13)
pdf.SetXY(20, float64(offsetY+21))
pdf.Write(20, strconv.Itoa(hero_cnt+henchmen_cnt))
*/
}
func MakePDF(warband parser.Warband, multiPage bool) {
pdf := gofpdf.New("P", "mm", "A4", "")
pdf.SetTextColor(text_color_r, text_color_g, text_color_b)
MakeStatisticPage(warband, pdf)
MakeHeroPage(warband, pdf, multiPage)
MakeHenchmenPage(warband, pdf, multiPage)
// TODO: Make output name variable or use name of the input file
err := pdf.OutputFileAndClose("warband-roaster.pdf")
if err != nil {
panic(err)
}
}