\n"
+ return ret
+
+ def css(self):
+ "Return the whole css, printable"
+ ret="div.sheet-tab-content { display: none; }"
+ for child in self.children:
+ ret+="\ninput.sheet-tab{node.number}:checked ~ div.sheet-tab{node.number},".format(node=child)
+ ret=ret[:-1]
+ ret+="\n{\n display: block;\n}\n"
+ for child in self.children:
+ ret+=child.css()
+ return ret
+
+class Tab(Node):
+ """Tab node, contains"""
+ def __init__(self, name,nb):
+ super(Tab, self).__init__(name,nb)
+
+ def header(self): # Comes first
+ return '
\n'.format(self=self) # And add all content
+ for child in self.children:
+ ret+=child.header()
+ for child in self.children:
+ ret+=child.content()
+ return ret
+
+ def css(self):
+ ret=" "
+ for child in self.children:
+ ret+="\ninput.sheet-secondary_{node.pname}_tab{child.number}:checked ~ div.sheet-secondary_{node.pname}_tab{child.number},".format(child=child,node=self)
+ ret=ret[:-1]
+ ret+="\n{\n display: block;\n}"
+ return ret
+
+class SubTab(Node):
+ def __init__(self,name,nb):
+ super(SubTab,self).__init__(name,nb)
+
+ def header(self):
+ return """
\n""".format(self=self)
+
+ def content(self):
+ ret= '
\n'.format(self=self)
+ ret+=" \n
{self.name} \n".format(self=self)
+ for child in self.children:
+ ret+=child.content()
+ ret+=" \n"
+ return ret
+ def css(self):
+ return ""
+
+class Skill(Node):
+ """Print a skill."""
+ def __init__(self, name,nb):
+ super(Skill, self).__init__(name,nb)
+
+ def content(self): # {self.parent.pname} is not needed, else _skilllevel_ cause a confict, legacy keeping I guess ?
+ ret="""
+
+
+
+
+ For
+ Agi
+ Per
+ Cha
+ Int
+ Per
+ Vol
+ Psy
+ Chn
+
+
+
\n""".format(self=self)
+ return ret
+
+class SubSkill(Node):
+ """Print a subskill."""
+ def __init__(self, name,nb,superskill):
+ super(SubSkill, self).__init__(name,nb)
+ self.superskill=superskill
+ print(name,superskill.pname)
+ def content(self): # {self.parent.pname} is not needed, else _skilllevel_ cause a confict, legacy keeping I guess ?
+ ret="""
+
+
+
+
+ For
+ Agi
+ Per
+ Cha
+ Int
+ Per
+ Vol
+ Psy
+ Chn
+
+
+
\n""".format(self=self)
+ return ret
+
+class Repeating(Node):
+ """Repeating section"""
+
+ def __init__(self, name,nb):
+ super(Repeating, self).__init__(name,nb)
+
+ def content(self):
+ ret="""
+
+
+
+
+
+ For
+ Agi
+ Per
+ Cha
+ Int
+ Per
+ Vol
+ Psy
+ Chn
+
+ \
+
+
+
\n""".format(node=self)
+ return ret
+
+if __name__ == '__main__':
+ # filen=sys.argv[1]
+ # filen="light.txt"
+ import customs as custom_skills
+ filen="cyberpnk.txt"
+ output="systemd10cyberpunk.html"
+ outcss="systemd10cyberpunk.css"
+ def parse(filen):
+ root=Root()
+ active_tab,active_subtab=None,None
+ tab_nb,subtab_nb,skill_nb,repeating_nb=1,1,1,1
+ mainskill=None
+ try:
+ with open(filen,encoding="utf-8") as f:
+ for line in f.readlines():
+ if line[0]=="@": # Tab
+ active_tab=Tab(line[1:-1],tab_nb)
+ root.addchild(active_tab)
+ tab_nb+=1
+ subtab_nb=1
+ elif line[0]=="+":
+ active_subtab=SubTab(line[1:-1],subtab_nb)
+ active_tab.addchild(active_subtab)
+ subtab_nb+=1
+ skill_nb=1
+ elif line[0]=="=":
+ tech_content=Skill(line[1:-1],skill_nb)
+ active_subtab.addchild(tech_content)
+ mainskill=tech_content
+ skill_nb+=1
+ elif line[0]=="-":
+ tech_content=SubSkill(line[1:-1],skill_nb,mainskill)
+ active_subtab.addchild(tech_content)
+ skill_nb+=1
+ elif line[0]==".":
+ tech_content=Repeating(line[1:-1],repeating_nb)
+ active_subtab.addchild(tech_content)
+ repeating_nb+=1
+ elif line[0]=="#":
+ skill=custom_skills.__getattribute__(line[2:-1])("","")
+ active_subtab.addchild(skill)
+ repeating_nb+=1 # ???
+ except FileNotFoundError:
+ print(filen,"was not found")
+ return root
+ root=parse(filen)
+ import base
+ with open(output,"w",encoding="utf-8") as f:
+ f.write(base.head)
+ f.write(base.script)
+ f.write(base.header)
+ f.write(root.content())
+ f.write(base.footer)
+ with open(outcss,"w",encoding="utf-8") as f:
+ f.write(root.css())
+ f.write(base.css_footer)
diff --git a/helpers/light.txt b/helpers/light.txt
new file mode 100644
index 0000000..16e7aae
--- /dev/null
+++ b/helpers/light.txt
@@ -0,0 +1,5 @@
+@ Physique
++ Combat
+- Armes à feu
++ Soc
+- Charisme
diff --git a/helpers/minitest b/helpers/minitest
new file mode 160000
index 0000000..11a1157
--- /dev/null
+++ b/helpers/minitest
@@ -0,0 +1 @@
+Subproject commit 11a1157bd86f0166e43445ab137bb483ec85d71f
diff --git a/helpers/skill_generator.py b/helpers/skill_generator.py
new file mode 100644
index 0000000..483e52b
--- /dev/null
+++ b/helpers/skill_generator.py
@@ -0,0 +1,423 @@
+#!/usr/bin/python
+# -*- coding: UTF-8 -*-
+
+# Not actually part of the project; just easier to maintain everything here
+import importlib
+import re
+import sys,os
+import traceback
+
+try:
+ # path=os.path.join(os.path.dirname(__file__),"..","minitest")
+ # minitest=importlib.import_module("...minitest.minitest","skill_generator")
+ from minitest import minitest
+ term = minitest.Terminal()
+ from test import testReroll,testInit,testWrapper,testParser
+
+except ImportError as e:
+ print(e)
+ print("Minitest isn't imported, the system cannot execute test units")
+
+
+try:
+ args = sys.argv[1:]
+ command = sys.argv[1]
+except:
+ print("No command specified, just outputting the help")
+ command = "help"
+
+EOL = "\n"
+tab = " "
+# Custom parsing
+ENCAISSEMENT_PARSE = """d_vars.encaissement=to_number(tab[i+1]);
+d_vars.encaissement_dices="d20";
+if (tab[i+2]=="4") d_vars.encaissement_dices="d10";
+i+=3;
+break;"""
+
+FLAT_DICES_PARSE = """d_vars.flat_dices[d_vars.nb_flat_dices]=to_p_number(tab[i+1]);
+d_vars.nb_flat_dices++;
+i+=2;
+break;"""
+
+TECHNIQUE_PARSE = """d_vars.technique_m=to_p_number(tab[i+2]);
+i+=3;
+break;"""
+## Custom adders:
+lambda_flat_dices = lambda a: "@flat_dices[@flat_dices]=type({tab+1});\n@nb_flat_dices++;"
+
+## Custom rerolls:
+
+categories = ['varname', 'Pretty name', 'nb_args', 'type', 'code', 'id', 'default', 'action', 'parser']
+hashedCategories = {}
+for c in range(len(categories)):
+ hashedCategories[categories[c]] = c
+
+
+def findCat(element, category):
+ return element[hashedCategories[category]]
+
+
+list = []
+# list.append(['varname','Pretty name','nb_args','type','code','id','default','action','parser'])
+list.append(['perfection', 'Perfection', 1, 'pint', 'P', 0, 0, "", None])
+list.append(['defense_i_0', 'Defence impénétrable simple', 2, 'pint', 'I', 1, 0, "", None])
+list.append(['defense_i_1', 'Defence impénétrable expert', 2, 'pint', 'I', 2, 0, "", None])
+list.append(['defense_i_2', 'Defence impénétrable meta', 2, 'pint', 'I', 4, 0, "", None])
+list.append(['rempart_p', 'Rempart parfait', 1, 'pint', 'R', 0, 0, "", None])
+list.append(['technique_m', 'Perfection', 1, 'pint', 'M', 0, 0, "", TECHNIQUE_PARSE]) # +=3
+list.append(['coup_d', 'Coup_déchirant', 1, 'pint', 'D', 0, 0, "", None])
+list.append(['fauchage', 'Fauchage', 1, 'pint', 'F', 0, 0, "", None])
+list.append(['exploiter_p_0', 'Exploiter_les_points_faibles simple', 2, 'pint', 'E', 1, 0, "", None])
+list.append(['exploiter_p_1', 'Exploiter_les_points_faibles expert', 2, 'pint', 'E', 2, 0, "", None])
+list.append(['exploiter_p_2', 'Exploiter_les_points_faibles meta', 2, 'pint', 'E', 4, 0, "", None])
+list.append(['tir_p_0', 'Tir_précis expert', 2, 'pint', 'T', 2, 0, "", None])
+list.append(['tir_p_1', 'Tir_précis meta', 2, 'pint', 'T', 4, 0, "", None])
+list.append(['tir_i', 'Tir_implacable', 1, 'pint', 'i', 0, 0, "", None])
+list.append(['charge', 'Charge', 1, 'pint', 'C', 0, 0, "", None])
+list.append(['charge_i', 'Charge_indomptable', 1, 'pint', 'N', 0, 0, "", None])
+list.append(['nb_2add', 'Nombre à ajouter', 1, 'int', '+', 0, 0, "+", None])
+list.append(['nb_2sub', 'Nombre a soustraire', 1, 'int', '-', 0, 0, "+", None])
+list.append(['relances', 'Relances', 1, 'pint', 'r', 0, 0, "", None])
+list.append(['seuil', 'Seuil', 1, 'pint', 's', 0, 0, "", None])
+list.append(['action', 'Type d\'Action', 1, 'str', 'a', 0, '""', "", None])
+list.append(['flat_dices', 'Des fixes', 1, 'pint', 'd', 0, "[]", "+", FLAT_DICES_PARSE])
+list.append(['on_hit_c', 'Dégats a l\'impact critique', 1, 'int', 'H', 0, 0, "+", None])
+list.append(['attribute', 'Caractéristique', 1, 'int', 'A', 0, 0, "+", None])
+list.append(['encaissement', 'Encaissement', 1, 'pint', 'S', 0, 0, "",
+ ENCAISSEMENT_PARSE]) # It's actually 2 args but no switch
+list.append(['replace', 'Des de substitution', 1, 'int', 'L', 0, -1, "", None])
+list.append(['add_to_all', 'Valeur d\'ajout aux des', 1, 'int', 'l', 0, 0, "", None])
+list.append(['max_dices', 'Nombre de des max', 1, 'pint', 'm', 0, -1, "", None])
+list.append(['player_name', 'Nom du joueur', 1, 'str', 'n', 0, '""', "", None])
+
+list.append(['crit_level', 'Niveau de critique', 1, 'pint', 'c', 0, 2, "", None])
+list.append(['transcendence', 'Transcendence', 1, 'pint', 't', 0, 3, "", None])
+list.append(['pctreceived', 'Pourcentage dégats recus', 1, 'int', 'v', 0, 0, "", None])
+list.append(['pctinflicted', 'Pourcentage dégats infligés', 1, 'int', 'f', 0, 0, "", None])
+
+list.append(['nb_dices', 'Nombre de des', 1, 'pint', '', 0, 0, "", None])
+list.append(['nb_flat_dices', 'Nombre de des fixes', 1, 'pint', '', 0, 0, "", None])
+list.append(['encaissement_dices', 'Perfection', 1, 'pint', '', 0, '""', "", None])
+list.append(['results', 'Resultats', 1, 'pint', '', 0, "[]", "", None])
+list.append(['cleave', 'Fauchage', 1, 'pint', '', 0, "[]", "", None])
+list.append(['encaissement_result', 'Resultat d\'encaissement', 1, 'pint', '', 0, 0, "", None])
+list.append(['technique_result', 'Dégats technique martiale', 1, 'int', '', 0, 0, "", None])
+list.append(['coup_d_results', 'Coup déchirant results', 1, 'pint', '', 0, "[]", "", None])
+
+
+class megaListWrapper():
+ def __init__(self, table=list):
+ self.table = table
+ self.len = len(table)
+ self.indexes = {}
+ for i in range(len(table)):
+ self.indexes[findCat(table[i], "varname")] = i
+ # Theese are array because you can't acess them directly
+ self.singles = []
+ self.code = []
+ self.doubles = {}
+ for i in table:
+ if findCat(i, 'nb_args') == 1:
+ self.singles.append(i)
+ elif findCat(i, 'nb_args') == 2:
+ n = findCat(i, 'code')
+ if n not in self.doubles:
+ self.doubles[n] = []
+ self.doubles[n].append(i)
+ if findCat(i, 'code') != '':
+ self.code.append(i)
+
+ def __getitem__(self, argument): # Actually return the full line as a list wrapper
+ return listWrapper(self.table[self.indexes[argument]])
+
+ def __iter__(self):
+ for index, key in self.indexes.items():
+ yield self[index]
+
+ def itersingles(self):
+ "Only iterate over the simple argument ones"
+ for index in self.singles:
+ yield self[findCat(index, 'varname')]
+
+ def iterdoubles(self):
+ "Only iterate over the double arguments ones return a table with all"
+ for table in self.doubles.values():
+ yield [self[findCat(l, 'varname')] for l in table]
+
+ def iterdefined(self):
+ "Only iterate over the ones with defined code"
+ pass
+
+ def __contains__(self, val):
+ return val in self.indexes
+
+ def __len__(self):
+ return self.len
+
+ def pprint(self):
+ for e in self:
+ print(e[0], ":", e)
+
+
+class listWrapper():
+ def __init__(self, list, index=hashedCategories):
+ self.list = list
+ self.indexes = index
+
+ def pprint(self):
+ print(self.list)
+
+ def asList(self):
+ return self.list
+
+ def __len__(self):
+ return len(self.list)
+
+ def __repr__(self):
+ return str(self.list)
+
+ def __getitem__(self, nb):
+ return self.list[nb]
+
+ def __getattr__(self, index):
+ return self.list[self.indexes[index]]
+
+ def __iter__(self):
+ for e in self.list:
+ yield e
+
+
+## Commands
+def initialise(args):
+ "Initialise the variables for the switch"
+ text = "var d_vars={"
+ for line in list:
+ text += '"{}":{},'.format(line[0], line[6])
+ text = text[:-1] + '};'
+ return text
+
+
+def pprint(args):
+ "Print the whole list of values"
+ for i in list:
+ print(i)
+
+
+def pErrors(name, errors):
+ "Print success or error of given test"
+ if errors:
+ print("{:<15}: {} errors occured".format(name, errors))
+ else:
+ print("{:<15}: All test successful".format(name))
+ return errors
+
+
+def reroll(args):
+ "Generate the reroll inline message"
+
+ reroll = "var msg_relance=\"
Relancer ce jet ";'
+
+ return reroll
+
+
+def find_code(args):
+ "Find the next available code for given name"
+ try:
+ code = args[1]
+ except:
+ print("One argument expected")
+ return 0
+ listFree = ''
+ for letter in code:
+ Letter = letter.capitalize()
+ free, Free = 1, 1
+ for line in wrapper:
+ if free and letter == line.code:
+ free = 0
+ if Free and Letter == line.code:
+ Free = 0
+ if not free and not Free:
+ break
+ if Free and Letter not in listFree:
+ listFree += Letter
+ if free and letter not in listFree:
+ listFree += letter
+ if listFree:
+ if len(listFree) == 1:
+ return 'The code "{}" is available.'.format(listFree)
+ else:
+ return 'The following codes "{}" are available'.format(listFree)
+ else:
+ print('No letter from name "{}" is available'.format(code))
+ print(find_code([0, "abcdefghijklmnopqrstuvwxyz&_?.§!;"]))
+
+
+def parser(args):
+ "Generate the argument parser"
+ res = tab + "if (len_args>0){" + EOL
+ res += tab * 2 + "d_vars.nb_dices=to_p_number(tab[0]);" + EOL
+ res += tab + "}" + EOL
+ res += tab + "for (i = 1; i < len_args;) {" + EOL
+ res += tab * 2 + "switch(tab[i]) {" + EOL
+
+ def typewise(type):
+ if type == "pint":
+ return "to_p_number({});"
+ elif type == 'int':
+ return "to_number({});"
+ return "{};"
+
+ doubles = {}
+ for elt in wrapper.itersingles():
+ if elt.parser:
+ res += tab * 3 + 'case "{}":'.format(elt.code) + EOL
+ for l in elt.parser.splitlines():
+ res += tab * 4 + l + EOL
+ elif elt.code != "":
+ res += tab * 3 + 'case "{}":'.format(elt.code) + EOL
+ res += tab * 4 + 'd_vars.{}{}={}'.format(elt.varname, elt.action,
+ typewise(elt.type).format("tab[i+1]")) + EOL
+ res += tab * 4 + 'i+=2;' + EOL
+ res += tab * 4 + 'break;' + EOL
+ for grp in wrapper.iterdoubles():
+ res += tab * 3 + 'case "{}":'.format(grp[0].code) + EOL
+ res += tab * 4 + 'switch (tab[i+1]) {' + EOL
+ for elt in grp:
+ if elt.parser:
+ for l in elt.parser.splitlines():
+ res += tab * 5 + l + EOL
+ elif elt.code != "":
+ res += tab * 5 + 'case "{}":'.format(elt.id) + EOL
+ res += tab * 6 + 'd_vars.{}{}={}'.format(elt.varname, elt.action,
+ typewise(elt.type).format("tab[i+2]")) + EOL
+ res += tab * 6 + 'break;' + EOL
+ if not elt.parser:
+ res += tab * 4 + "}" + EOL
+ res += tab * 4 + 'i+=3;' + EOL
+ res += tab * 4 + 'break;' + EOL
+
+ res += tab * 3 + "default:" + EOL
+ res += tab * 4 + 'logit("Argument "+tab[i]+" unknown.");' + EOL
+ res += tab * 4 + "i++;" + EOL
+ res += tab * 4 + "break;" + EOL
+ res += tab * 2 + "}" + EOL
+ res += tab * 1 + "}" + EOL
+ return res
+
+def export(args):
+ if len(args) > 1:
+ filen = args[1]
+ try:
+ f = open(filen)
+ except:
+ filen = "export.log"
+ f = open(filen, "w+")
+
+ def title(t):
+ return "{} {} {}".format("#" * 10, t, "#" * 10) + EOL
+
+ f.write(title("Relances"))
+ f.write(reroll([]) + EOL)
+ f.write(title("Reroll"))
+ f.write(initialise([]) + EOL)
+ f.write(title("Parse"))
+ f.write(parser([]) + EOL)
+
+ f.close()
+
+ return "All data written in '{}'".format(filen)
+
+
+def test_all(args):
+ "Execute all tests"
+ subclass = minitest.testGroup("Main Classes", term, verbose=True)
+ all_s, t = ["reroll", "init", "wrapper", "parser"], 0
+ if len(args) > 1:
+ sub = [] # A list of test to execute
+ for a in args[1:]:
+ a = a.strip("-")
+ if a in all_s or a == "all":
+ t += 1
+ sub.append(a.strip("-"))
+ else:
+ print("Argument {} unknown".format(a))
+ else:
+ sub = all_s
+ t = len(sub)
+
+ if "all" in sub or "reroll" in sub:
+ # "Check the reroll inline generation"
+ subclass.addTest(testReroll())
+ if "all" in sub or "init" in sub:
+ # "Check the initialisation message"
+ subclass.addTest(testInit())
+ if "all" in sub or "wrapper" in sub:
+ # "Test the wrapper, only useful internally"
+ subclass.addTest(testWrapper())
+ if "all" in sub or "parser" in sub:
+ # "Check the reroll inline generation"
+ subclass.addTest(testParser())
+
+ if t > 0:
+ subclass.test()
+ status = subclass.get_status()
+ return status['failure']
+ return 0
+
+def help(args):
+ "Help, print the following message"
+ print("List of availables commands")
+ for key in commands.keys():
+ print(" {}: {}".format(key, commands[key].__doc__))
+
+
+commands = {"init": initialise, "print": pprint, "reroll": reroll,
+ "test": test_all, "code": find_code, "parser": parser, "export": export, "help": help}
+
+if __name__ == '__main__':
+ wrapper = megaListWrapper()
+ try:
+ ret = commands[command](args)
+ if ret:
+ print(ret)
+ except KeyError:
+ print("Command {} doesn't exist".format(command))
+ commands['help'](args)
+ except Exception:
+ print("Couldn't execute command " + command)
+ print(" > {} ({})".format(sys.exc_info()[1], sys.exc_info()[0]))
+ traceback.print_tb(sys.exc_info()[2])
diff --git a/helpers/systemd10cyberpunk.css b/helpers/systemd10cyberpunk.css
new file mode 100644
index 0000000..e1af46c
--- /dev/null
+++ b/helpers/systemd10cyberpunk.css
@@ -0,0 +1,373 @@
+div.sheet-tab-content { display: none; }
+input.sheet-tab1:checked ~ div.sheet-tab1,
+input.sheet-tab2:checked ~ div.sheet-tab2,
+input.sheet-tab3:checked ~ div.sheet-tab3,
+input.sheet-tab4:checked ~ div.sheet-tab4
+{
+ display: block;
+}
+
+input.sheet-secondary_physique_tab1:checked ~ div.sheet-secondary_physique_tab1,
+input.sheet-secondary_physique_tab2:checked ~ div.sheet-secondary_physique_tab2,
+input.sheet-secondary_physique_tab3:checked ~ div.sheet-secondary_physique_tab3,
+input.sheet-secondary_physique_tab4:checked ~ div.sheet-secondary_physique_tab4
+{
+ display: block;
+}
+input.sheet-secondary_intelectuelles_tab1:checked ~ div.sheet-secondary_intelectuelles_tab1,
+input.sheet-secondary_intelectuelles_tab2:checked ~ div.sheet-secondary_intelectuelles_tab2,
+input.sheet-secondary_intelectuelles_tab3:checked ~ div.sheet-secondary_intelectuelles_tab3
+{
+ display: block;
+}
+input.sheet-secondary_social_tab1:checked ~ div.sheet-secondary_social_tab1,
+input.sheet-secondary_social_tab2:checked ~ div.sheet-secondary_social_tab2,
+input.sheet-secondary_social_tab3:checked ~ div.sheet-secondary_social_tab3
+{
+ display: block;
+}
+input.sheet-secondary_arsenal_tab1:checked ~ div.sheet-secondary_arsenal_tab1,
+input.sheet-secondary_arsenal_tab2:checked ~ div.sheet-secondary_arsenal_tab2,
+input.sheet-secondary_arsenal_tab3:checked ~ div.sheet-secondary_arsenal_tab3
+{
+ display: block;
+}input.sheet-tab{
+ -moz-appearance: none;
+ width:150px;
+ height: 20px;
+ top: 5px;
+ left: 6px;
+ margin: 5px;
+ cursor: pointer;
+ z-index: 1;
+ content: attr(title);
+}
+input.sheet-tab::before{
+ -moz-appearance: none;
+ content: attr(title);
+ border-radius:.5em;
+ border:2px solid black;
+ text-align: center;
+ display: inline-block;
+ background: black;
+ color:white;
+ width: 150px;
+ height: 20px;
+ font-size: 18px;
+}
+input.sheet-tab:checked::before{
+ -moz-appearance: none;
+ background:#CCCCCC;
+ color:black;
+ border-radius:.5em;
+ border:2px solid black;
+}
+
+input.sheet-small_tab{
+ -moz-appearance: none;
+ width:120px;
+ height: 20px;
+ cursor: pointer;
+ z-index: 1;
+ margin:5px;
+}
+input.sheet-small_tab::before{
+ -moz-appearance: none;
+ content: attr(title);
+ border-radius:.5em;
+ text-align: center;
+ display: inline-block;
+ color:white;
+ background:black;
+ border:2px solid black;
+ width: 120px;
+ height:20px;
+ font-size: 14px;
+}
+input.sheet-small_tab:checked::before{
+ -moz-appearance: none;
+ border:2px solid black;
+ background:#CCCCCC;
+ color:black;
+ border-radius:.5em;
+}
+
+input.sheet-skill_name{
+ -moz-appearance: none;
+ width:400px;
+}
+input.sheet-skill_hidden{
+ visibility: hidden;
+}
+div.sheet-tab-content{
+ border-top-color: #000;
+ margin: 2px 0 0 0;
+}
+select.sheet-skill_select{
+ width:55px;
+ margin-bottom:-1px;
+}
+select.sheet-dice_select{
+ width:85px;
+ margin-bottom:-1px;
+}
+.sheet-trait{
+ width: 30px;
+}
+.sheet-numberbox {
+ width: 50px;
+}
+
+.sheet-rolltemplate-d10init table,
+.sheet-rolltemplate-d10skillcheck table {
+ border-radius: 6px;
+ width:100%;
+ padding:0px;
+ margin:0px;
+ padding: 2px;
+ border: 1px solid;
+ background-color: #ffffff;
+ border-width: 1px;
+ border-style: solid;
+ border-color: #000;
+ border-image-source: none;
+}
+.sheet-rolltemplate-d10init .sheet-roll-title,
+.sheet-rolltemplate-d10init th,
+.sheet-rolltemplate-d10skillcheck .sheet-roll-title,
+.sheet-rolltemplate-d10skillcheck th {
+ color: rgb(42, 42, 42);
+ padding:0px;
+ margin:0px;
+ padding-left: 5px;
+ font-size: 1.2em;
+ text-align: left;
+ font-family: "Times New Roman", Times, serif;
+ font-variant: small-caps;
+ text-transform: capitalize;
+ border-width: 0px;
+}
+.sheet-rolltemplate-d10init .sheet-roll-attr,
+.sheet-rolltemplate-d10skillcheck .sheet-roll-attr{
+ color: #555555;
+ font-size: 1em;
+ font-style: italic;
+ padding:0px;
+ margin:0px;
+ padding-left: 9px;
+ border-width: 0px;
+ margin-top: -10px;
+}
+.sheet-rolltemplate-d10init .sheet-roll-success,
+.sheet-rolltemplate-d10skillcheck .sheet-roll-success ,
+.sheet-rolltemplate-d10skillcheck .sheet-roll-fail {
+ padding:0px;
+ margin:0px;
+ border-width: 0px;
+ padding-left: 5px;
+}
+.sheet-rolltemplate-d10skillcheck .sheet-roll-crit {
+ padding:0px;
+ margin:0px;
+ border-width: 0px;
+ padding-left: 5px;
+ background-color:#b0d6ad;
+}
+.sheet-rolltemplate-d10skillcheck .sheet-roll-fumble {
+ padding-left: 5px;
+ border-width: 0px;
+ background-color:#d6adad;
+}
+.sheet-rolltemplate-d10init .sheet-inline,
+.sheet-rolltemplate-d10init .inlinerollresult,
+.sheet-rolltemplate-d10skillcheck .sheet-inline,
+.sheet-rolltemplate-d10skillcheck .inlinerollresult {
+ background-color: transparent;
+ border: none;
+ font-weight: bold;
+ padding:0px;
+ font-family: "Times New Roman", Times, serif;
+}
+.sheet-rolltemplate-d10skillcheck .sheet-inline.sheet-fullcrit,
+.sheet-rolltemplate-d10skillcheck .inlinerollresult.fullcrit {
+ color: #3FB315;
+ border: none;
+}
+.sheet-rolltemplate-d10skillcheck .sheet-inline.sheet-fullfail,
+.sheet-rolltemplate-d10skillcheck .inlinerollresult.fullfail {
+ color: #B31515;
+ border: none;
+}
+.sheet-rolltemplate-d10skillcheck .inlinerollresult.importantroll {
+ color: #4A57ED;
+ border: none;
+}
+
+.sheet-rolltemplate-d10fight-blob{
+ border-radius: 6px;
+ border: 1px solid #898989;
+ z-index: 1;
+}
+.sheet-rolltemplate-d10fight table{
+ padding:0px;
+ margin:0px;
+ text-align: left;
+ width:100%;
+ border:none;
+ cellpadding:3px;
+ cellspacing:0px;
+}
+.sheet-rolltemplate-d10fight .sheet-sum{
+ padding:0px;
+ margin:0px;
+ border:none;
+ text-align: right;
+ padding-right:10px;
+}
+.sheet-rolltemplate-d10fight .sheet-success,
+.sheet-rolltemplate-d10fight .sheet-line{
+ padding:0px;
+ margin:0px;
+ padding-left: 3px;
+ border:none;
+}
+.sheet-rolltemplate-d10fight .sheet-critical{
+ padding:0px;
+ margin:0px;
+ border:none;
+ padding-left: 3px;
+ border-radius: 4px;
+ background-color:#b0d6ad;
+}
+.sheet-rolltemplate-d10fight .sheet-hit{
+ padding:0px;
+ margin:0px;
+ padding-left: 3px;
+ border-radius: 4px;
+ background-color:#b0d6ad;
+ border:none;
+}
+.sheet-rolltemplate-d10fight .sheet-miss{
+ padding:0px;
+ margin:0px;
+ padding-left: 3px;
+ border:none;
+ border-radius: 4px;
+ background-color:#d6adad;
+}
+.sheet-rolltemplate-d10fight .sheet-name{
+ padding:0px;
+ padding-left: 3px;
+ margin:0px;
+ border:none;
+ border-radius: 4px;
+ border-bottom-left-radius: 2px;
+ border-bottom-right-radius: 2px;
+ background-color: #999999;
+}
+.sheet-rolltemplate-d10fight .sheet-additional{
+ padding:0px;
+ margin:0px;
+ border:none;
+ padding-left:10px;
+}
+.sheet-rolltemplate-d10fight-grey{
+ color: #999999;
+}
+.sheet-rolltemplate-d10fight-green{
+ color: #009900;
+}
+.sheet-rolltemplate-d10fight a,
+.sheet-rolltemplate-d10fight a[href^="!"],
+.sheet-rolltemplate-d10fight a[href^="~"]{
+ text-align:right;
+ background-color: #999999; !important
+}
+
+.sheet-rolltemplate-d10Shooting .sheet-container {
+ background-color: #ffffff;
+ border: 1px solid;
+ padding: 2px;
+ width: 189px;
+}
+
+.sheet-rolltemplate-d10Shooting .sheet-container h1 {
+ color: rgb(126, 45, 64);
+ font-size: 1.2em;
+ font-variant: small-caps;
+ line-height: 20px;
+}
+
+.sheet-rolltemplate-d10Shooting div {
+ padding: 2px;
+};
+
+.sheet-rolltemplate-d10Shooting span {
+ color: rgb(126, 45, 64);
+ font-family: "Times New Roman", Times, serif;
+ font-size: 1.2em;
+ font-variant: small-caps;
+ line-height: 1.6em;
+ padding-left: 5px;
+ text-align: left;
+}
+
+.sheet-rolltemplate-d10Shooting .sheet-subheader {
+ color: #000;
+ font-size: 1em;
+ font-style: italic;
+}
+
+.sheet-rolltemplate-d10Shooting .sheet-arrow-right {
+ border-bottom: 2px solid transparent;
+ border-left: 180px solid rgb(126, 45, 64);
+ border-top: 2px solid transparent;
+}
+
+.sheet-rolltemplate-d10Shooting .sheet-tcat {
+ font-style: italic;
+}
+
+.sheet-rolltemplate-d10Shooting .inlinerollresult {
+ background-color: #ffffff;
+ border: none;
+}
+
+.sheet-rolltemplate-d10Shooting .inlinerollresult.fullcrit {
+ color: #3FB315;
+ border: none;
+}
+
+.sheet-rolltemplate-d10Shooting .inlinerollresult.fullfail {
+ color: #B31515;
+ border: none;
+}
+
+.sheet-rolltemplate-d10Shooting .inlinerollresult.importandivoll {
+ color: #4A57ED;
+ border: none;
+}
+
+select.sheet-weapon_type_select{
+ line-height: 0px;
+ margin-bottom:0px;
+ margin: 0px;
+}
+label {
+ display: inline;
+ margin: 0px;
+ padding: 0px;
+}
+div.sheet-row{
+ margin: 0px;
+ padding: 3px;
+}
+div.sheet-quickborder{
+ border: 1px solid #ccc;
+ border-color: grey;
+ margin:5px;
+ padding:5px;
+}
+div.repeating_ranged-weapon{
+ margin:5px;
+}
diff --git a/helpers/systemd10cyberpunk.html b/helpers/systemd10cyberpunk.html
new file mode 100644
index 0000000..591d927
--- /dev/null
+++ b/helpers/systemd10cyberpunk.html
@@ -0,0 +1,2187 @@
+
+
+
+
+
+
+
+ {{name}} — {{roll_name}}
+ Test au d{{dice_name}} seuil {{threshold}}
+
+ {{#rollWasCrit() result}}
+ Critique ! {{result}}x2 degrés de réussite
+ {{/rollWasCrit() result}}
+ {{#^rollWasCrit() result}}
+ {{#rollWasFumble() result}}
+ {{#rollGreater() result 1}}
+ Échec critique ! {{result}}/2 degrés de réussite
+ {{/rollGreater() result 1}}
+ {{#rollBetween() result 0 1}}
+ Échec critique ! {{result}}/2 degré de réussite
+ {{/rollBetween() result 0 1}}
+ {{#rollLess() result 0}}
+ Échec critique ! {{result}}x2 degrés d'échec
+ {{/rollLess() result 0}}
+ {{/rollWasFumble() result}}
+ {{#^rollWasFumble() result}}
+ {{#rollGreater() result 1}}
+ {{result}} degrés de réussite
+ {{/rollGreater() result 1}}
+ {{#rollBetween() result 0 1}}
+ {{result}} degré de réussite
+ {{/rollBetween() result 0 1}}
+ {{#rollLess() result 0}}
+ {{result}} degrés d'échec
+ {{/rollLess() result 0}}
+ {{/^rollWasFumble() result}}
+ {{/^rollWasCrit() result}}
+
+
+
+
+
+ {{name}} — {{roll_name}}
+ 1d10+{{value}} = {{result}}
+ {{#rollWasCrit() result}}
+ +{{base}}
+ {{/rollWasCrit() result}}
+ {{#rollWasFumble() result}}
+ {{result}}-{{base}}
+ {{/rollWasFumble() result}}
+
+
+
+
+
+
{{name}}
+
+
+ {{#attack}}
+
Attack: {{attack}} successes
+ {{#mode}}
+
Mode: {{mode}} ({{usedammo}})
+ {{/mode}}
+ {{/attack}}
+ {{#damage}}
+
+ Damage: {{damage}}
+
+ {{#ammocurrent}}
+
+ Ammunition: {{ammocurrent}}/{{magsize}} | {{ammototal}}
+
+ {{/ammocurrent}}
+ {{/damage}}
+ {{#damagedone}}
+
+ Damage: {{damagedone}}
+
+ {{#ammocurrent}}
+
+ Ammunition: {{ammocurrent}}/{{magsize}} | {{ammototal}}
+
+ {{/ammocurrent}}
+ {{/damagedone}}
+ {{#special}}
+
+ Special: {{special}}
+
+ {{/special}}
+
+
diff --git a/helpers/tests.py b/helpers/tests.py
new file mode 100644
index 0000000..bc30ca1
--- /dev/null
+++ b/helpers/tests.py
@@ -0,0 +1,215 @@
+import minitest
+import re
+from skill_generator import *
+
+__all__=["testParser","testWrapper","testInit","testReroll"]
+
+class testInit(minitest.simpleTestUnit):
+ """Check the initialisation message"""
+
+ def __init__(self):
+ super(testInit, self).__init__("initialisation variables")
+
+ def _testInit(self):
+ self.currentTest("generating test values")
+
+ test_values = {"nb_dices": 0, "perfection": 0, "defense_i_0": 0, "defense_i_1": 0,
+ "defense_i_2": 0, "rempart_p": 0, "technique_m": 0, "coup_d": 0, "coup_d_results": "[]",
+ "fauchage": 0, "exploiter_p_0": 0, "exploiter_p_1": 0, "exploiter_p_2": 0, "tir_p_0": 0,
+ "tir_p_1": 0, "tir_i": 0, "charge": 0, "charge_i": 0, "nb_2add": 0, "nb_2sub": 0, "relances": 0,
+ "seuil": 0, "nb_flat_dices": 0, "action": '""', "flat_dices": "[]", "results": "[]",
+ "technique_result": 0,
+ "cleave": "[]", "on_hit_c": 0, "attribute": 0, "encaissement": 0, "encaissement_dices": '""',
+ "encaissement_result": 0, "replace": -1, "add_to_all": 0, "max_dices": -1, "player_name": '""'}
+ a = len(test_values)
+ b = len(list)
+ try:
+ dict_list = {}
+ for l in list:
+ dict_list[l[0]] = l[6]
+ self.addSuccess()
+ except Exception as ex:
+ self.addFailure(str(ex))
+
+ self.currentTest("testing list")
+ if a < b:
+ pass # Only if the values are updated
+ # self.addFailure("Too many values in the list")
+ # for l in dict_list.keys():
+ # if l not in test_values:
+ # self.currentTest(l)
+ # self.addFailure("{} missing from the test template".format(l))
+ elif b < a:
+ self.addFailure("Too few values in the list")
+ for t, v in test_values.items():
+ if t not in dict_list.keys():
+ self.currentTest(t)
+ self.addFailure("Missing element {}".format(v))
+ else:
+ for l, vl in dict_list.items():
+ if l in test_values.keys():
+ if test_values[l] != vl:
+ self.currentTest(test_values[l])
+ self.addFailure("Expected {}, got {}".format(l, vl))
+ else:
+ self.currentTest(l)
+ self.addFailure("The element is not in the test values")
+ self.addSuccess()
+
+
+class testReroll(minitest.simpleTestUnit):
+ """Check the reroll inline message"""
+
+ def __init__(self):
+ super(testReroll, self).__init__("inline message")
+
+ def _testReroll(self):
+ self.currentTest("regex generation")
+ model = """"var msg_relance="
Relancer ce jet ";"""
+ var = re.compile(' ([a-zA-Z:+_] .*?".*?)(?:\+"|;)')
+ self.addSuccess()
+
+ self.currentTest('generating inline message')
+ roll = reroll(args)
+ self.addSuccess()
+
+ self.currentTest("checking generated roll")
+ for e in (var.findall(model)):
+ if roll.find(e) < 0:
+ self.currentTest("[{}]".format(e))
+ self.addFailure("missing value")
+ self.addSuccess()
+
+ # Only if the args are updated
+ # self.currentTest("checking model")
+ # for e in var.findall(roll):
+ # if model.find(e)<0:
+ # self.currentTest("[{}]".format(e))
+ # self.addFailure("missing value")
+ # self.addSuccess()
+
+
+class testWrapper(minitest.simpleTestUnit):
+ """Check the reroll inline message"""
+
+ def __init__(self):
+ super(testWrapper, self).__init__("inline message")
+
+ def _testWrapper(self):
+ self.currentTest("generating wrapper")
+ s = len(hashedCategories)
+ errors=0
+ try:
+ wrapper[-1]
+ errors += 1
+ self.addFailure("Error: Element -1 shouldn't exist")
+ except:
+ self.addSuccess()
+
+ f = 0
+ self.currentTest("hashing categories")
+ for ele in wrapper:
+ for c in hashedCategories.keys():
+ if ele.__getattr__(c) != findCat(ele, c):
+ f += 1
+ self.currentTest(ele[0])
+ self.addFailure("{} found, should be {}".format(findCat(ele, c), ele.__getattr__(c)))
+
+ for i in range(s):
+ if wrapper[ele[0]][i] != ele.asList()[i] or wrapper[ele[0]][i] != ele[i]:
+ f += 1
+ self.currentTest(i)
+ self.addFailure("Element differs {}!={}".format(wrapper[ele[0]][i], ele.asList()[i]))
+ if f == 0:
+ self.addSuccess()
+ else:
+ self.addFailure("{} elements failed".format(f))
+
+ f = 0
+ self.currentTest("single variable")
+ for i in wrapper.itersingles():
+ if i[0] not in wrapper:
+ f += 1
+ self.addFailure("{} element missing".format(i[0]), nonDestructive=True)
+ if f == 0:
+ self.addSuccess()
+ else:
+ self.addFailure("{} elements failed".format(f))
+
+ f = 0
+ self.currentTest("double variables")
+ for l in wrapper.iterdoubles():
+ for i in l:
+ if i[0] not in wrapper:
+ f += 1
+ self.addFailure("{} element missing".format(i[0]), nonDestructive=True)
+ if f == 0:
+ self.addSuccess()
+ else:
+ self.addFailure("{} elements failed".format(f))
+
+
+class testParser(minitest.simpleTestUnit):
+ """Check the reroll inline message"""
+
+ def __init__(self):
+ super(testParser, self).__init__("inline message")
+
+ def _testParser(self):
+ self.currentTest("loading parser")
+ par = parser(args)
+ self.addSuccess()
+ f = 0
+ nb_code = 0
+ self.currentTest("testing all variables")
+ for line in list:
+ cat = findCat(line, "code")
+ if cat != "":
+ nb_code += 1
+ if 'case "{}"'.format(cat) not in par:
+ f += 1
+ self.addFailure("code {} not found".format(cat), nonDestructive=True)
+ if 'd_vars.{}'.format(findCat(line, "varname")) not in par:
+ f += 1
+ self.addFailure("variable {} not found".format(findCat(line, "varname")), nonDestructive=True)
+ if f == 0:
+ self.addSuccess()
+ else:
+ self.addFailure("{} failures".format(f))
+
+ self.currentTest("testing i++ count")
+ count = par.count("i+=")
+ nb_code = nb_code + len([l for l in wrapper.iterdoubles()]) - sum([len(l) for l in wrapper.iterdoubles()])
+ if count != nb_code:
+ self.addFailure("{} occurences found (expected {})".format(par.count("i+="), nb_code))
+ else:
+ self.addSuccess()
+
+ self.currentTest("counting {}")
+ counto = par.count("{")
+ countc = par.count("}")
+ tot = len([l for l in wrapper.iterdoubles()]) + 3
+ if counto != countc or counto != tot:
+ self.addFailure("found {} '{{' and {} '}} ' instead of {}".format(counto, countc, tot))
+ else:
+ self.addSuccess()
+
+ f = 0
+ self.currentTest("checking special text")
+ for line in list:
+ cat = findCat(line, "parser")
+ if cat:
+ for l in cat.splitlines():
+ if l not in par:
+ self.addFailure("{} isn't in the end result".format(l), nonDestructive=True)
+ if f == 0:
+ self.addSuccess()
+ else:
+ self.addFailure("{} failures".format(f))
+ """for varname with symbol, find symbol
+ for Special text, find special
+ """
+
+term = minitest.Terminal()
\ No newline at end of file
diff --git a/style.css b/style.css
index 9e39338..05a9888 100644
--- a/style.css
+++ b/style.css
@@ -3,117 +3,286 @@ input.sheet-tab1:checked ~ div.sheet-tab1,
input.sheet-tab2:checked ~ div.sheet-tab2,
input.sheet-tab3:checked ~ div.sheet-tab3
{
- display: block;
+ display: block;
+
+div.sheet-header-tab-content { display: none; }
+input.sheet-header-tab1:checked ~ div.sheet-header-tab1,
+input.sheet-header-tab2:checked ~ div.sheet-header-tab2,
+{
+ display: block;
}
-input.sheet-secondary_tab1:checked ~ div.sheet-secondary_tab1,
-input.sheet-secondary_tab2:checked ~ div.sheet-secondary_tab2,
-input.sheet-secondary_tab3:checked ~ div.sheet-secondary_tab3,
-input.sheet-secondary_tab4:checked ~ div.sheet-secondary_tab4
+
+input.sheet-secondary_physique_tab1:checked ~ div.sheet-secondary_physique_tab1,
+input.sheet-secondary_physique_tab2:checked ~ div.sheet-secondary_physique_tab2,
+input.sheet-secondary_physique_tab3:checked ~ div.sheet-secondary_physique_tab3,
+input.sheet-secondary_physique_tab4:checked ~ div.sheet-secondary_physique_tab4
{
- display:block;
+ display: block;
}
-input.sheet-secondary_magic_tab1:checked ~ div.sheet-secondary_magic_tab1,
-input.sheet-secondary_magic_tab2:checked ~ div.sheet-secondary_magic_tab2,
-input.sheet-secondary_magic_tab3:checked ~ div.sheet-secondary_magic_tab3,
-input.sheet-secondary_magic_tab4:checked ~ div.sheet-secondary_magic_tab4,
-input.sheet-secondary_magic_tab5:checked ~ div.sheet-secondary_magic_tab5
+input.sheet-secondary_intelectuelles_tab1:checked ~ div.sheet-secondary_intelectuelles_tab1,
+input.sheet-secondary_intelectuelles_tab2:checked ~ div.sheet-secondary_intelectuelles_tab2,
+input.sheet-secondary_intelectuelles_tab3:checked ~ div.sheet-secondary_intelectuelles_tab3
{
- display:block;
+ display: block;
}
-input.sheet-secondary_skills_tab1:checked ~ div.sheet-secondary_skills_tab1,
-input.sheet-secondary_skills_tab2:checked ~ div.sheet-secondary_skills_tab2,
-input.sheet-secondary_skills_tab3:checked ~ div.sheet-secondary_skills_tab3
+input.sheet-secondary_social_tab1:checked ~ div.sheet-secondary_social_tab1,
+input.sheet-secondary_social_tab2:checked ~ div.sheet-secondary_social_tab2,
+input.sheet-secondary_social_tab3:checked ~ div.sheet-secondary_social_tab3
{
- display:block;
+ display: block;
}
-
input.sheet-tab{
- -moz-appearance: none;
- width:150px;
- height: 20px;
- top: 5px;
- left: 6px;
- margin: 5px;
- cursor: pointer;
- z-index: 1;
- content: attr(title);
+ -moz-appearance: none;
+ width:150px;
+ height: 20px;
+ top: 5px;
+ left: 6px;
+ margin: 5px;
+ cursor: pointer;
+ z-index: 1;
+ content: attr(title);
}
input.sheet-tab::before{
- -moz-appearance: none;
- content: attr(title);
-
- border-radius:.5em;
- border:2px solid black;
- text-align: center;
- display: inline-block;
-
- background: black;
- color:white;
- width: 150px;
- height: 20px;
- font-size: 18px;
+ -moz-appearance: none;
+ content: attr(title);
+ border-radius:.5em;
+ border:2px solid black;
+ text-align: center;
+ display: inline-block;
+ background: black;
+ color:white;
+ width: 150px;
+ height: 20px;
+ font-size: 18px;
}
input.sheet-tab:checked::before{
- -moz-appearance: none;
- background:#CCCCCC;
- color:black;
- border-radius:.5em;
- border:2px solid black;
+ -moz-appearance: none;
+ background:#CCCCCC;
+ color:black;
+ border-radius:.5em;
+ border:2px solid black;
}
input.sheet-small_tab{
- -moz-appearance: none;
- width:120px;
- height: 20px;
- cursor: pointer;
- z-index: 1;
- margin:5px;
+ -moz-appearance: none;
+ width:120px;
+ height: 20px;
+ cursor: pointer;
+ z-index: 1;
+ margin:5px;
}
input.sheet-small_tab::before{
- -moz-appearance: none;
- content: attr(title);
-
- border-radius:.5em;
- text-align: center;
- display: inline-block;
- color:white;
- background:black;
- border:2px solid black;
- width: 120px;
- height:20px;
- font-size: 14px;
-
+ -moz-appearance: none;
+ content: attr(title);
+ border-radius:.5em;
+ text-align: center;
+ display: inline-block;
+ color:white;
+ background:black;
+ border:2px solid black;
+ width: 120px;
+ height:20px;
+ font-size: 14px;
}
input.sheet-small_tab:checked::before{
- -moz-appearance: none;
- border:2px solid black;
- background:#CCCCCC;
- color:black;
- border-radius:.5em;
+ -moz-appearance: none;
+ border:2px solid black;
+ background:#CCCCCC;
+ color:black;
+ border-radius:.5em;
}
input.sheet-skill_name{
- -moz-appearance: none;
- width:400px;
+ -moz-appearance: none;
+ width:400px;
}
input.sheet-skill_hidden{
visibility: hidden;
}
div.sheet-tab-content{
- border-top-color: #000;
- margin: 2px 0 0 0;
+ border-top-color: #000;
+ margin: 2px 0 0 0;
}
-
select.sheet-skill_select{
- width:55px;
- margin-bottom:-1px;
+ width:55px;
+ margin-bottom:-1px;
}
select.sheet-dice_select{
- width:85px;
- margin-bottom:-1px;
+ width:85px;
+ margin-bottom:-1px;
+}
+.sheet-trait{
+ width: 30px;
}
-
.sheet-numberbox {
- width: 50px;
+ width: 50px;
+}
+
+.sheet-rolltemplate-d10init table,
+.sheet-rolltemplate-d10skillcheck table {
+ border-radius: 6px;
+ width:100%;
+ padding:0px;
+ margin:0px;
+ padding: 2px;
+ border: 1px solid;
+ background-color: #ffffff;
+ border-width: 1px;
+ border-style: solid;
+ border-color: #000;
+ border-image-source: none;
+}
+.sheet-rolltemplate-d10init .sheet-roll-title,
+.sheet-rolltemplate-d10init th,
+.sheet-rolltemplate-d10skillcheck .sheet-roll-title,
+.sheet-rolltemplate-d10skillcheck th {
+ color: rgb(42, 42, 42);
+ padding:0px;
+ margin:0px;
+ padding-left: 5px;
+ font-size: 1.2em;
+ text-align: left;
+ font-family: "Times New Roman", Times, serif;
+ font-variant: small-caps;
+ text-transform: capitalize;
+ border-width: 0px;
+}
+.sheet-rolltemplate-d10init .sheet-roll-attr,
+.sheet-rolltemplate-d10skillcheck .sheet-roll-attr{
+ color: #555555;
+ font-size: 1em;
+ font-style: italic;
+ padding:0px;
+ margin:0px;
+ padding-left: 9px;
+ border-width: 0px;
+ margin-top: -10px;
+}
+.sheet-rolltemplate-d10init .sheet-roll-success,
+.sheet-rolltemplate-d10skillcheck .sheet-roll-success ,
+.sheet-rolltemplate-d10skillcheck .sheet-roll-fail {
+ padding:0px;
+ margin:0px;
+ border-width: 0px;
+ padding-left: 5px;
+}
+.sheet-rolltemplate-d10skillcheck .sheet-roll-crit {
+ padding:0px;
+ margin:0px;
+ border-width: 0px;
+ padding-left: 5px;
+ background-color:#b0d6ad;
+}
+.sheet-rolltemplate-d10skillcheck .sheet-roll-fumble {
+ padding-left: 5px;
+ border-width: 0px;
+ background-color:#d6adad;
+}
+.sheet-rolltemplate-d10init .sheet-inline,
+.sheet-rolltemplate-d10init .inlinerollresult,
+.sheet-rolltemplate-d10skillcheck .sheet-inline,
+.sheet-rolltemplate-d10skillcheck .inlinerollresult {
+ background-color: transparent;
+ border: none;
+ font-weight: bold;
+ padding:0px;
+ font-family: "Times New Roman", Times, serif;
+}
+.sheet-rolltemplate-d10skillcheck .sheet-inline.sheet-fullcrit,
+.sheet-rolltemplate-d10skillcheck .inlinerollresult.fullcrit {
+ color: #3FB315;
+ border: none;
+}
+.sheet-rolltemplate-d10skillcheck .sheet-inline.sheet-fullfail,
+.sheet-rolltemplate-d10skillcheck .inlinerollresult.fullfail {
+ color: #B31515;
+ border: none;
+}
+.sheet-rolltemplate-d10skillcheck .inlinerollresult.importantroll {
+ color: #4A57ED;
+ border: none;
+}
+
+
+
+.sheet-rolltemplate-d10fight-blob{
+ border-radius: 6px;
+ border: 1px solid #898989;
+ z-index: 1;
+}
+.sheet-rolltemplate-d10fight table{
+ padding:0px;
+ margin:0px;
+ text-align: left;
+ width:100%;
+ border:none;
+ cellpadding:3px;
+ cellspacing:0px;
+}
+.sheet-rolltemplate-d10fight .sheet-sum{
+ padding:0px;
+ margin:0px;
+ border:none;
+ text-align: right;
+ padding-right:10px;
+}
+.sheet-rolltemplate-d10fight .sheet-success,
+.sheet-rolltemplate-d10fight .sheet-line{
+ padding:0px;
+ margin:0px;
+ padding-left: 3px;
+ border:none;
+}
+.sheet-rolltemplate-d10fight .sheet-critical{
+ padding:0px;
+ margin:0px;
+ border:none;
+ padding-left: 3px;
+ border-radius: 4px;
+ background-color:#b0d6ad;
+}
+.sheet-rolltemplate-d10fight .sheet-hit{
+ padding:0px;
+ margin:0px;
+ padding-left: 3px;
+ border-radius: 4px;
+ background-color:#b0d6ad;
+ border:none;
+}
+.sheet-rolltemplate-d10fight .sheet-miss{
+ padding:0px;
+ margin:0px;
+ padding-left: 3px;
+ border:none;
+ border-radius: 4px;
+ background-color:#d6adad;
+}
+.sheet-rolltemplate-d10fight .sheet-name{
+ padding:0px;
+ padding-left: 3px;
+ margin:0px;
+ border:none;
+ border-radius: 4px;
+ border-bottom-left-radius: 2px;
+ border-bottom-right-radius: 2px;
+ background-color: #999999;
+}
+.sheet-rolltemplate-d10fight .sheet-additional{
+ padding:0px;
+ margin:0px;
+ border:none;
+ padding-left:10px;
+}
+.sheet-rolltemplate-d10fight-grey{
+ color: #999999;
+}
+.sheet-rolltemplate-d10fight-green{
+ color: #009900;
+}
+.sheet-rolltemplate-d10fight a,
+.sheet-rolltemplate-d10fight a[href^="!"],
+.sheet-rolltemplate-d10fight a[href^="~"]{
+ text-align:right;
+ background-color: #999999; !important
}
diff --git a/tesidy.html b/tesidy.html
deleted file mode 100644
index 8d142b2..0000000
--- a/tesidy.html
+++ /dev/null
@@ -1,197 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-