diff options
author | dakkar <dakkar@thenautilus.net> | 2011-10-23 13:06:04 +0100 |
---|---|---|
committer | dakkar <dakkar@thenautilus.net> | 2011-10-23 13:06:04 +0100 |
commit | 0465d36acc48f9ecd0604ed23fce8b2ba2e4343b (patch) | |
tree | 6062544e622f77d621bca220b904017520624efd /incantesimi | |
parent | script per creare fogli di incantesimi (diff) | |
download | inventario-0465d36acc48f9ecd0604ed23fce8b2ba2e4343b.tar.gz inventario-0465d36acc48f9ecd0604ed23fce8b2ba2e4343b.tar.bz2 inventario-0465d36acc48f9ecd0604ed23fce8b2ba2e4343b.zip |
spostiamo roba
Diffstat (limited to 'incantesimi')
-rw-r--r-- | incantesimi/excel_to_incantesimi.pl | 134 | ||||
-rw-r--r-- | incantesimi/incantesimi.cmd.tex | 136 | ||||
-rw-r--r-- | incantesimi/incantesimi.example.tex | 95 | ||||
-rw-r--r-- | incantesimi/incantesimi.prep.tex | 170 |
4 files changed, 535 insertions, 0 deletions
diff --git a/incantesimi/excel_to_incantesimi.pl b/incantesimi/excel_to_incantesimi.pl new file mode 100644 index 0000000..e2d1899 --- /dev/null +++ b/incantesimi/excel_to_incantesimi.pl @@ -0,0 +1,134 @@ +#!/usr/bin/perl +use strict; +use warnings; +use Spreadsheet::ParseExcel; +use LaTeX::Encode; +use Template; +use Data::Printer; + +# excel => latex +my %fieldmap = ( + spellname => 'name', + level => 'level', + school => 'scuola', + comp => 'components', + ct => 'tempo', + range => 'range', + target => 'target', + duration => 'durata', + st => 'st', + sr => 'sr', + spell => 'descrizione', + special => 'specialcomp', + page => 'ref', + notes => 'note', +); + +my ($input_filename,$output_filename)=@ARGV; + +die "$0 \$input \$output\n" + unless $input_filename && $output_filename; + +my $parser = Spreadsheet::ParseExcel->new(); +my $wb = $parser->parse($input_filename) + or die $parser->error; + +my $spells = parse_table($wb->worksheet('Incantesimi') + // $wb->worksheet(0)); + +munge($spells); +p $spells; +my $template = Template->new(); +$template->process( + \*DATA, + { + spells => $spells, + fieldmap => \%fieldmap, + lt => \&latexise, + }, + $output_filename, +) + or die $template->error; + +sub parse_table { + my ($ws) = @_; + + my ($min_col,$max_col) = $ws->col_range(); + my ($min_row,$max_row) = $ws->row_range(); + my @headings = map { eval { $ws->get_cell($min_row,$_)->value } } + $min_col .. $max_col; + + for my $h (@headings) { + $h =~ s{\W.*$}{}; + $h = lc($h); + } + + my @ret = (); + + for my $row ((1+$min_row) .. $max_row) { + # allow and skip empty rows + next unless eval { $ws->get_cell($row,$min_col)->value }; + my %record; + + keys @headings; + while (my ($idx,$heading) = each @headings) { + # allow and skip empty cols + next unless $heading; + $record{$heading} = + eval { $ws->get_cell($row,$idx+$min_col)->value } // ''; + } + push @ret,\%record; + } + return \@ret; +} + +sub munge { + my ($spells) = @_; + + for my $spell (@$spells) { + if ($spell->{page} =~ m{^\d+$}) { + $spell->{page} = 'PHB'.$spell->{page}; + } + } + return; +} + +sub latexise { + my ($str) = @_; + + $str = latex_encode($str); + $str =~ s{(?<!\\)\. }{.\\ }g; + + return $str; +} + +__DATA__ +\input{incantesimi.cmd} +\usepackage{textcomp} + +\begin{document} +% +\begin{tikzpicture} +\matrix { + +[% FOREACH spell IN spells %] +\incantesimo{type=spell, +[%- FOREACH field IN fieldmap; IF spell.item(field.key) %] + [% field.value %]={[% lt(spell.item(field.key)) %]}, +[%- END; END %] +} [% IF (loop.count() % 6) %]& [% ELSE %] \\ [% END -%] +[% IF (loop.count() % 18) == 0 %]}; +\end{tikzpicture} + +\pagebreak + +\begin{tikzpicture} +\matrix { + +[% END; END; + rest_in_row = spells.size % 6; + FOREACH skip IN [ 1 .. rest_in_row ]; ' & '; END; ' \\\\ ' +%]}; +\end{tikzpicture} +\vspace{-10pt} +\end{document} diff --git a/incantesimi/incantesimi.cmd.tex b/incantesimi/incantesimi.cmd.tex new file mode 100644 index 0000000..b2e6146 --- /dev/null +++ b/incantesimi/incantesimi.cmd.tex @@ -0,0 +1,136 @@ +\documentclass[a4paper,10pt,landscape]{article} +\usepackage[empty,cm]{fullpage} +\usepackage[latin1]{inputenc} +\usepackage[italian,english]{babel} +\usepackage[OT1]{fontenc} +\usepackage{pgfkeys} +\usepackage{tikz} +\usetikzlibrary{calc} +\usetikzlibrary{shapes.multipart} + +%%%% fullpage +\setlength{\headheight}{0pt} +\setlength{\headsep}{0pt} +\setlength{\footskip}{0pt} +\setlength{\textwidth}{\paperwidth} +\setlength{\oddsidemargin}{-2.68cm} +\setlength{\evensidemargin}{\oddsidemargin} +\setlength{\textheight}{1.1\paperheight} +\setlength{\topmargin}{0pt} +\addtolength{\topmargin}{-2.68cm} +\addtolength{\oddsidemargin}{0.45cm} % per centrare le etichette +\addtolength{\evensidemargin}{0.45cm} % per centrare le etichette +%%%% +\setlength{\parindent}{0pt} + +%%%% +\newlength{\cardtextwidth} +\setlength{\cardtextwidth}{4.33cm} + +%\fontseries{c}\fontshape{sc} + +\tikzstyle{carta}=[rectangle,minimum width=4.8cm,minimum height=7cm,outer sep=0,use as bounding box] + +\tikzstyle{title label}=[rectangle,text=blue!80!green!75!black,minimum height=2\baselineskip,font={\small},inner sep=1mm,text width=4.6cm,align=flush center] + +\tikzstyle{side label}=[rectangle,text=green!25!black,minimum height=3mm,font=\tiny,inner sep=0.5mm,rotate=270] + +\tikzstyle{subt label}=[text=magenta!25!black,font=\scriptsize,inner xsep=2pt,inner ysep=0.2em,text width=\cardtextwidth] + +\tikzstyle{descr label}=[rectangle,text=red!50!black,font={\sffamily\footnotesize},inner xsep=2pt,inner ysep=1mm,text width=\cardtextwidth,align=justify] + +\tikzstyle{trg label}=[rectangle,text=red!70!blue!90!yellow,font={\sffamily\footnotesize},inner xsep=2pt,inner ysep=1mm,align=#1] + +\tikzstyle{above angles label}=[text=blue!50!black,font=\scriptsize,minimum height=\baselineskip,align=justify] + +\tikzstyle{angles label}=[rectangle split,rectangle split parts=2,rectangle split part align=left,text=blue!50!black,font=\tiny,align=justify] + +\tikzstyle{prep label}=[rectangle split,rectangle split parts=2,rectangle split part align=left,draw,ultra thin,minimum width=0.333*4.8cm,text=yellow!10!black,inner xsep=0.1em,inner ysep=0.29em,font={\it\tiny}]%inner ysep is set to have 7mm overall heigh + +%%%% + +\pgfkeys{/spells/.is family} +\tikzset{/spells/type/.initial=spell} +\tikzset{/spells/st/.initial=None} +\tikzset{/spells/sr/.initial=No} +\tikzset{/spells/specialcomp/.initial={}} +\tikzset{/spells/note/.initial={}} +\tikzset{/spells/ref/.initial={}} +\tikzset{/spells/tempo/.initial={1 a}} +\tikzset{/spells/level/.initial={Must be passed in}} +\tikzset{/spells/name/.initial={Must be passed in}} +\tikzset{/spells/scuola/.initial={Must be passed in}} +\tikzset{/spells/durata/.initial={Must be passed in}} +\tikzset{/spells/components/.initial={Must be passed in}} +\tikzset{/spells/descrizione/.initial={Must be passed in}} +\tikzset{/spells/target/.initial={Must be passed in}} +\tikzset{/spells/range/.initial={Must be passed in}} + +\newcommand{\incantesimo}[1]{% +%\begin{scope}[every node/.style={draw,ultra thin},/spells/.cd,#1] +\begin{scope}[/spells/.cd,#1] +\node[carta,ultra thin,draw] (card) {}; + +% titolo +\node [anchor=north,title label] (name) at (card.north) + {\usefont{OT1}{ptm}{bx}{sc}\pgfkeysvalueof{/spells/name}}; + +%angolo nord est +\node [anchor=north west,side label] (type) at ($(card.east |- name.south) - (0mm,0.0mm)$) + {\textsl{\pgfkeysvalueof{/spells/type}}}; + +%lato sud +\node [anchor=south,prep label] (prep) at (card.south) + {Prep:\nodepart{two}Used:}; + +%angolo sud ovest +\node [anchor=south west,angles label] + (st) at (card.south west) + {\textsc{ST:}\nodepart{two}\textsc{\pgfkeysvalueof{/spells/st}}}; + +\node [anchor=south west,above angles label] (durata) at (card.west |- prep.north) + {\textsf{Duration: \pgfkeysvalueof{/spells/durata}}}; + +%angolo sud est +\node [anchor=south east,angles label] (sr) at (card.south east) + {\textsc{SR:}\nodepart{two}\textsc{\pgfkeysvalueof{/spells/sr}}}; + +\node [anchor=south east,above angles label] (tempo) at (card.east |- prep.north) + {\textsf{CT: \pgfkeysvalueof{/spells/tempo}}}; + +%lato sud est +\node [anchor=north east,side label] (ref) at ($(tempo.north east) + (0,3mm)$) + {\pgfkeysvalueof{/spells/ref}}; + + + +%sottotitoli +\node [anchor=north east,align=flush right,rectangle,subt label] (scuola) at (type.south west) + {\emph{\pgfkeysvalueof{/spells/scuola}}}; + +\node [anchor=north west,rectangle split,rectangle split parts=2,rectangle split part align={left,flushright},subt label] + (components) at ($(scuola.south -| card.west) - (0mm,0mm)$) + {\textsc{\pgfkeysvalueof{/spells/components}}\nodepart{two}{\tiny\pgfkeysvalueof{/spells/specialcomp}}}; + + +%centro +\node [anchor=west,descr label] (description) at ($0.70*(card.west)+0.3*(card.south west)$) + {\pgfkeysvalueof{/spells/descrizione}}; + +\node [anchor=north,descr label] (notes) at (description.south) + {\tiny\fontseries{e}\pgfkeysvalueof{/spells/note}}; + +% sopra il centro +\node [anchor=south west,trg label=flush left] (target) at ($(description.north west) + (0,1mm)$) + {{\scriptsize{}Target/Effect/Area:}\\{\slshape\pgfkeysvalueof{/spells/target}}}; + +\node [anchor=south east,trg label=flush right] (range) at (target.north -| type.south) + {{\scriptsize{}Range:} \textnormal{\itshape\pgfkeysvalueof{/spells/range}}}; + +%lato est +\node [anchor=north west,side label] (lvl) at ($0.8*(card.east)+0.2*(card.north east)$) + {\textsc{lvl \pgfkeysvalueof{/spells/level}}}; + + +\end{scope}% +} diff --git a/incantesimi/incantesimi.example.tex b/incantesimi/incantesimi.example.tex new file mode 100644 index 0000000..91a5811 --- /dev/null +++ b/incantesimi/incantesimi.example.tex @@ -0,0 +1,95 @@ +\input{incantesimi.cmd} +%\input{incantesimi.cmd.other} + +\begin{document} +% +\begin{tikzpicture} +% +\matrix { + +\incantesimo{type=spell-like, + scuola={Enchantment (Charm) [LD, MA, Sonic]}, + st={Fort half (HO)}, + tempo=15m, + name=Regenerate Moderate Wounds, + level=9, + sr={Yes (HO)}, + durata={30m / disch}, + ref=PH289, + range=medium, + target={Well shaft 10ft. diam 100 ft. deep}, + components={V,S,M,F,DF,XP}, + specialcomp={M: Incense; F: Payer beads (500~MO); XP: 0 or 500}, + descrizione={Fully repairs an obj. up to 5\%/2L mass loss; cures 1d4 dmg to magical obj.}, + note={Reasonable command may give -1 to -4 pen. to S. T.} +} & +\incantesimo{type=spell-like, + name={Death touch}, + %level=0, + scuola={Death domain}, + components={Once per day}, + %tempo=1a, + range=Touch, + target={1 living creat. touched}, + durata=Instantaneous, + %st, + sr=Yes, + descrizione={If touched creat. has less than 1d6/CL hp dies.}, + ref=PH163, +% note + } & +\incantesimo{type=Supernatural,scuola=scuola a caso pił altra roba in giro,name=Incantesimo col nome lungooooooo,level=3, + durata=1/L m,range=Touch,target=you,components={V,S,M},specialcomp={M:tanta roba costosa da accendere (5000~MO)}, + descrizione={+2 Defl AC/Resist. saves, counter mind control, hedge out elemental/outsiders.}} & +\incantesimo{scuola=scuola a caso,name=Incantesimo col nome lungo a a a a,level=1, + durata=Inst,range=touch,target=you,components={V,S}, + descrizione={blah blah blah}, + note={Bigger ones can pass after Will save with 2d6 dmg.}} & +\incantesimo{scuola=scuola a caso,name=Incantesimo col nome lungo,level=1, + durata=Inst,range=touch,target=you,components={V,S}, + descrizione={blah blah blah}}& +\incantesimo{scuola=scuola a caso,name=Incantesimo col nome lungo,level=1, + durata=Inst,range=touch,target=you,components={V,S}, + descrizione={blah blah blah}} \\ + +\incantesimo{scuola=scuola a caso,name=Incantesimo col nome lungo,level=1, + durata=Inst,range=touch,target=you,components={V,S},specialcomp={M: Incense; F: Prayer bead (500~MO)}, + descrizione={blah blah blah}} & +\incantesimo{scuola=scuola a caso,name=Incantesimo col nome lungo,level=1, + durata=Inst,range=touch,target=you,components={V,S}, + descrizione={blah blah blah}} & +\incantesimo{scuola=scuola a caso,name=Incantesimo col nome lungo,level=1, + durata=Inst,range=touch,target=you,components={V,S}, + descrizione={blah blah blah}} & +\incantesimo{scuola=scuola a caso,name=Incantesimo col nome lungo,level=1, + durata=Inst,range=touch,target=you,components={V,S}, + descrizione={blah blah blah}} & +\incantesimo{scuola=scuola a caso,name=Incantesimo col nome lungo,level=1, + durata=Inst,range=touch,target=you,components={V,S}, + descrizione={blah blah blah}} & +\incantesimo{scuola=scuola a caso,name=Incantesimo col nome lungo,level=1, + durata=Inst,range=touch,target=you,components={V,S}, + descrizione={blah blah blah}} \\ + +\incantesimo{scuola=scuola a caso,name=Incantesimo col nome lungo,level=1, + durata=Inst,range=touch,target=you,components={V,S}, + descrizione={blah blah blah}} & +\incantesimo{scuola=scuola a caso,name=Incantesimo col nome lungo,level=1, + durata=Inst,range=touch,target=you,components={V,S}, + descrizione={blah blah blah}} & +\incantesimo{scuola=scuola a caso,name=Incantesimo col nome lungo,level=1, + durata=Inst,range=touch,target=you,components={V,S}, + descrizione={blah blah blah}} & +\incantesimo{scuola=scuola a caso,name=Incantesimo col nome lungo,level=1, + durata=Inst,range=touch,target=you,components={V,S}, + descrizione={blah blah blah}} & +\incantesimo{scuola=scuola a caso,name=Incantesimo col nome lungo,level=1, + durata=Inst,range=touch,target=you,components={V,S}, + descrizione={blah blah blah}} & +\incantesimo{scuola=scuola a caso,name=Incantesimo col nome lungo,level=1, + durata=Inst,range=touch,target=you,components={V,S}, + descrizione={blah blah blah}}\\ +}; +\end{tikzpicture} +\vspace{-10pt} +\end{document} diff --git a/incantesimi/incantesimi.prep.tex b/incantesimi/incantesimi.prep.tex new file mode 100644 index 0000000..9df1015 --- /dev/null +++ b/incantesimi/incantesimi.prep.tex @@ -0,0 +1,170 @@ + +\documentclass[a4paper,10pt,landscape]{article} +\usepackage[empty,cm]{fullpage} +\usepackage[latin1]{inputenc} +\usepackage[italian,english]{babel} +\usepackage[OT1]{fontenc} +\usepackage{pgfkeys} +\usepackage{tikz} +\usetikzlibrary{calc} +\usetikzlibrary{matrix} +\usetikzlibrary{shapes.multipart} + +%%%% fullpage +\setlength{\headheight}{0pt} +\setlength{\headsep}{0pt} +\setlength{\footskip}{0pt} +\setlength{\textwidth}{\paperwidth} +\setlength{\oddsidemargin}{-2.68cm} +\setlength{\evensidemargin}{\oddsidemargin} +\setlength{\textheight}{1.1\paperheight} +\setlength{\topmargin}{0pt} +\addtolength{\topmargin}{-2.68cm} +\addtolength{\oddsidemargin}{0.45cm} % per centrare le etichette +\addtolength{\evensidemargin}{0.45cm} % per centrare le etichette +%%%% +\setlength{\parindent}{0pt} + +%%%% +\newlength{\cardtextwidth} +\setlength{\cardtextwidth}{4.33cm} + +\newcounter{lvl} + +%\fontseries{c}\fontshape{sc} + +\tikzstyle{carta}=[rectangle,minimum width=4.8cm,minimum height=7cm,inner sep=0pt,outer sep=0,use as bounding box] + +\tikzstyle{prep label}=[rectangle split,rectangle split parts=2,rectangle split part align=left,draw,ultra thin,minimum width=0.333*4.8cm,text=yellow!10!black,inner xsep=0.1em,inner ysep=0.293em,font={\it\tiny},outer sep=0pt]%inner ysep is set to have 7mm overall heigh + +\tikzstyle{spells}=[rectangle,anchor=center,minimum width=1.5cm,minimum height=5mm,font={\footnotesize},text=#1] + +\tikzstyle{ranges}=[anchor=south,rectangle split,rectangle split parts=2,rectangle split part align=center,% + /pgf/number format/int detect,font={\sffamily\footnotesize},text=red!70!blue!90!yellow,] + +\newcommand{\preptext}[1]{% + \node[anchor=north west,prep label] at #1 {Prep:\nodepart{two}Used:};% +} + +\newcommand{\prepcard}{% + % + \node[carta] (card) {}; + % + \foreach \x in {0,1,2} + \foreach \y in {0,...,9} + { + \preptext{($(card.north west)+(\x*1.6cm,-\y*0.7cm)$)} + } + % + \draw[white,thin] (card.north west) rectangle (card.south east); + % +} + +\newcommand{\printRoman}{ + \ifnum \value{lvl} = 0 + \textsc{Orisons} + \else + \Roman{lvl} + \fi +} + +\newcommand{\closerange}[1]{ + \pgfmathparse{25+5*floor(#1/2)} + \pgfmathprintnumber{\pgfmathresult} +} +% +\newcommand{\mediumrange}[1]{ + \pgfmathparse{100+(10*#1)} + \pgfmathprintnumber{\pgfmathresult} +} +\newcommand{\longrange}[1]{ + \pgfmathparse{400+(40*#1)} + \pgfmathprintnumber{\pgfmathresult} +} + +\newcommand{\mydepth}{\rule[-0.2em]{0pt}{1mm}} + +\newcommand{\spellatlvl}[5]{% + \setcounter{lvl}{#1} + \path #2 + node[spells=red!#5!black] {\printRoman} + ++(1.5cm,0) + node[spells=green!75!black!#5!black] {#3} + ++(1.5cm,0) + node[spells=blue!#5!black] {\pgfmathprintnumber{#4}}; +} + +\newcommand{\spellscard}[3]{% takes rel ability bonus, castel lvl, and a list of 10 spells_per_day +\begin{scope} + % + \node[carta] (card) {}; + % titles + \path (card.north west) ++(0.9cm,-0.5cm) + node[spells=blue!80!green!75!black,font={\scshape\footnotesize}] (lvltl) {Level} + ++(1.5cm,0) + node[spells=blue!80!green!75!black,font={\scshape\footnotesize}] {Per day} + ++(1.5cm,0) + node[spells=blue!80!green!75!black,font={\scshape\footnotesize}] {ST DC}; + % spells + \foreach \n [count=\x from 0,evaluate=\x as \dc using 10+#1+\x,evaluate=\x as \shd using 85-7*\x,/pgf/number format/int detect] in #3 + { + \spellatlvl{\x}{($(lvltl.center)-(0,6mm+\x*5mm)$)}{\n}{\dc}{\shd} + } + % ranges + \path (card.south -| lvltl.center) + node[ranges] (close) + {Close:\mydepth\nodepart{two}\closerange{#2} ft.\mydepth} + ++(1.5cm,0) + node[ranges] (medium) + {Medium:\mydepth\nodepart{two}\mediumrange{#2} ft.\mydepth} + ++(1.5cm,0) + node[ranges] (long) + {Long:\mydepth\nodepart{two}\longrange{#2} ft.\mydepth}; + % + \draw[thin,green!20!black] (close.north) ++(2mm,2pt) -- ++(1.1cm,0) ++(4mm,0) -- ++(1.1cm,0); + % + % \draw[red,thin] (card.north west) rectangle (card.south east); + % +\end{scope} +} + +\begin{document} +% +\begin{tikzpicture} +\matrix[ampersand replacement=\&] { + % Necrist current + \spellscard{4}{12}{{6,4+1+1,4+1+1,3+1+1,3+1+1,2+0+1,-,-,-,-}}\& + % + \prepcard\&\prepcard\&\prepcard\&\prepcard\&\prepcard\\ + % Necrist next + \spellscard{4}{13}{{6,5+1+1,4+1+1,4+1+1,3+1+1,2+0+1,1+0+1,-,-,-}}\& + % + \prepcard\&\prepcard\&\prepcard\&\prepcard\&\prepcard\\ + % Necrist plus + \spellscard{5}{13}{{6,5+1+1,4+1+1,4+1+1,3+1+1,2+0+1,1+0+1,-,-,-}}\& + % + \prepcard\&\prepcard\&\prepcard\&\prepcard\&\prepcard\\ +}; +% +\end{tikzpicture} +\pagebreak + +\begin{tikzpicture} +\matrix[ampersand replacement=\&] { + % Ariel current + \spellscard{4}{9}{{6,4+1+1,4+1+1,3+1+1,2+1+1,1+0+1,-,-,-,-}}\& + % + \prepcard\&\prepcard\&\prepcard\&\prepcard\&\prepcard\\ + % Ariel next + \spellscard{4}{10}{{6,4+1+1,4+1+1,3+1+1,3+1+1,2+0+1,-,-,-,-}}\& + % + \prepcard\&\prepcard\&\prepcard\&\prepcard\&\prepcard\\ + % Ariel plus + \spellscard{5}{10}{{6,4+1+1,4+1+1,3+1+1,3+1+1,2+0+1,-,-,-,-}}\& + % + \prepcard\&\prepcard\&\prepcard\&\prepcard\&\prepcard\\ +}; +% +\end{tikzpicture} +% +\end{document} |