diff --git a/.gitignore b/.gitignore index 602eb8e..192fa56 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,117 @@ -test.js \ No newline at end of file +test.js +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json +.idea/vcs.xml +.idea/sys_d10.iml +.idea/modules.xml +.idea/misc.xml +.idea/inspectionProfiles/profiles_settings.xml diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..bad102e --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "minitest"] + path = helpers/minitest + url = git@github.com:Malphaet/minitest.git diff --git a/README.md b/README.md index 68862f6..b9c1a5e 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,15 @@ ## Introduction Vous trouverez ici la feuille de personnage type pour le système D10. Cette feuille a été crée pour fonctionner avec Roll20. -##Macros roll20 +## Macros roll20 Peuvent etre utile a modifier ou récuperer: - - ```shieldLife_Points / shieldLife_Points_max``` : Points de Vie - - ```shieldEndurance_Points / shieldEndurance_Points_max``` : Points de fatigue - - ```shieldgeneral_item_weapon1``` : La valeur de dégats de l'arme 1 - - ```shieldgeneral_item_weapon1_name``` : Le nom de l'arme 1 - - ```shieldgeneral_effective_weapon1``` : La valeur de dégats de l'arme 1 si elle est activée; 0 sinon - - ```shieldbase_damage_dices``` : La base de dégats offensif (a priori, rien sauf compétence particulière) - - ```shieldexal_damage_dices``` : Le modificateur de dégats (Un bonus de charge, un buff de dégats temporaires) + - ```Life_Points / Life_Points_maximum``` : Points de Vie + - ```Endurance_Points / Endurance_Points_maximum``` : Points de fatigue + - ```general_item_weapon1``` : La valeur de dégats de l'arme 1 + - ```general_item_weapon1_name``` : Le nom de l'arme 1 + - ```general_effective_weapon1``` : La valeur de dégats de l'arme 1 si elle est activée; 0 sinon + - ```base_damage_dices``` : La base de dégats offensif (a priori, rien sauf compétence particulière) + - ```exal_damage_dices``` : Le modificateur de dégats (Un bonus de charge, un buff de dégats temporaires) Exemple (avec chatSetAttr) [chatSetAttr](https://github.com/Roll20/roll20-api-scripts/blob/master/ChatSetAttr/README.md): - ```!setattr --sel --Life_Points|21``` diff --git a/Skills.txt b/Skills.txt deleted file mode 100644 index 0ea2e98..0000000 --- a/Skills.txt +++ /dev/null @@ -1,58 +0,0 @@ -General -Initiative (Comp) -Rapidite_surnaturelle @Actions -Frères_d'arme @Reserve -Perfection P -Prescience_ @Reserve -Rage_primale @Reserve -A_corps_perdu @Reserve - -Defence -Encaissement @Defence -Encaissement @Defence -Resistances @Defence -Endurance_surnaturelle @PV -Riposte @Reserve -Riposte @Reserve -Parade @Reserve -Defense_impenetrable I_1 -Defense_impenetrable I_2 -Defense_impenetrable I_4 -Rempart_parfait R -Infatigable (Rappel) -Dernier_Souffle_ (Rappel) -Envers_et_contre_tout (Rappel) -Regeneration (Rappel) -Regeneration (Rappel) -Presence_ecrasante (Rappel) -Maîtrise_du_combat (Rappel) - -Offense -Technique_martiale M_1 -Technique_martiale M_2 -Coup_en_Puissance @Reserve -Coup_Double @Reserve -Coup_dechirant D -Fauchage F -Coup_mortel (Rappel)@Reserve -Combat_acrobatique (Rappel) -Assaut_implacable (Rappel) -Tir_en_mouvement (Rappel) -Exploiter_les_points_faibles E_1 -Exploiter_les_points_faibles E_2 -Exploiter_les_points_faibles E_4 -Double_initiative (Rappel)** -Marcher_dans_les_ombres (Rappel) -Rage_Berserk (Rappel)** -Influx_meurtrier (Rappel)** - - - -Special -Tir_mortel @Reserve -Tir_precis T_1 -Tir_precis T_2 -Tir_implacable i -Charge C -Charge_Mortelle (Rappel) -Charge_indomptable N diff --git a/Todo and utils.txt b/Todo and utils.txt deleted file mode 100644 index 25b8de0..0000000 --- a/Todo and utils.txt +++ /dev/null @@ -1,85 +0,0 @@ -//Variables a initialiser par parse -/* -var nb_dices=0; -Action a a e d -var all_dices d* -var nb_2add=0; //+ -var nb_2sub=0; //- - -var relances=0; //r -Perfection P - -Defense -Défense_impénétrable I 1 -Défense_impénétrable I 2 - Rappel -Défense_impénétrable I 4 -Rempart_parfait R - -Offense -Technique_martiale M 1 -Technique_martiale M 2 -Coup_déchirant D -Fauchage F -Exploiter_les_points_faibles E 1 -Exploiter_les_points_faibles E 2 - Rappel -Exploiter_les_points_faibles E 4 - -Spécial -Tir_précis T 1 -Tir_précis T 2 -Tir_implacable i -Charge C -Charge_indomptable N - (Sur la feuille de perso) -Seuil s -On Hit crit H -Attribute values A -Encaissement S -*/ - -// SKILLNAME -on("change:skill_SKILLNAME_activation change:general_skilllevel_SKILLNAME", function() { - getAttrs(["skill_SKILLNAME_activation", "general_skilllevel_SKILLNAME"], function(values) { - setAttrs({"general_effective_SKILLNAME":values.skill_SKILLNAME_activation*values.general_skilllevel_SKILLNAME}); - }); -}); - - - - - - - - - - - -
- - - - - -
- - - - - - - -// shield3 -on("change:item_shield3_activation change:general_item_shield3", function() { - getAttrs(["item_shield3_activation", "general_item_shield3"], function(values) { - setAttrs({"general_effective_shield3":values.item_shield3_activation*values.general_item_shield3}); - }); -}); diff --git a/backup b/backup deleted file mode 100644 index e69de29..0000000 diff --git a/crit.js b/crit.js index db4ea3b..f4a330d 100644 --- a/crit.js +++ b/crit.js @@ -15,7 +15,9 @@ on("chat:message", function(msg) { d_vars.rempart_p=Math.min(10,d_vars.rempart_p); d_vars.nb_dices+=d_vars.tir_i; d_vars.fauchage=Math.min(d_vars.fauchage,d_vars.nb_dices); + d_vars.oseuil=d_vars.seuil; d_vars.seuil=Math.max(d_vars.seuil-d_vars.tir_p_0-d_vars.tir_p_1,0); + //d_vars.replace=-1; //d_vars.add_to_all=0; @@ -166,17 +168,14 @@ on("chat:message", function(msg) { function show_rolls(who,d_vars){ //Return a beautiful table showing the results and some information depending on the type of action "e":Dodge "a":Attack "d":Defense - var msg_head="
" - var msg=""; - break; + msg+=who_pr+" attaque"; + break; case "e": - msg+=who+" esquive"; - m_esq=2; // It's a hit - break; + msg+=who_pr+" esquive"; + m_esq=2; // It's a hit + break; case "d": - msg+=who+" se defend"; - break; + msg+=who_pr+" se defend"; + break; default: - msg+=who+" lance "+d_vars.nb_dices+" dés"; + msg+=who_pr+" lance "+d_vars.nb_dices+" dés"; } - if (dice_stats.is_crit) {if ((d_vars.nb_dices+d_vars.nb_flat_dices)>(d_vars.attribute/2)){ - m_crit=2; // It's a crit - } else { - if (d_vars.nb_dices==0){m_crit=1;} // That's not a crit - else {m_crit=1.5;} // Only half a crit + // 1=pas de crit, 2=crit normal + //d_vars.crit_level-=2; + if (dice_stats.is_crit) { + if ((d_vars.nb_dices+d_vars.nb_flat_dices)>(d_vars.attribute/2)){ + m_crit=d_vars.crit_level; // It's a full crit + } else { + if (d_vars.nb_dices+d_vars.nb_flat_dices==0){m_crit=1;} // That's not a crit + else { + m_crit=Math.min((0.5+d_vars.crit_level/2),d_vars.crit_level); + } // Only half a crit }}; //Add the rolls msg+=add_thoose_dices(d_vars,d_vars.results,"",m_esq,m_crit); if (d_vars.fauchage!=0) msg+=add_thoose_dices(d_vars,d_vars.cleave,"Fauchage: ",m_esq,m_crit); - if (d_vars.coup_d!=0) msg_adds+=""; // Coup déchirant - if (d_vars.technique_m!=0) msg_adds+=""; // Technique martiale - if (d_vars.relances!=0) msg_adds+=""; // Technique martiale - if (d_vars.encaissement!=0) msg_adds+=""; // Technique martiale - - if (dice_stats.is_crit==1) msg+=""; + if (d_vars.coup_d!=0) msg_adds+=""; // Coup déchirant + if (d_vars.technique_m!=0) msg_adds+=""; // Technique martiale + if (d_vars.relances!=0) msg_adds+=""; // Relances + if (d_vars.encaissement!=0) msg_adds+=""; // Encaissement + if (d_vars.add_to_all!=0){msg_adds+=" "; if (dice_stats.is_hit==1){ if (d_vars.seuil!=0){ if (d_vars.action=="a"){ - msg+=""; + msg+=""; } else if (d_vars.action=="d"||d_vars.action=="e"){ // Can't miss a block or a dodge, can be a shitty roll tho } else { - msg+=""; + msg+=""; } } } else { if (d_vars.action=="a"){ - msg+=""; + msg+=""; } else if (d_vars.action=="d"||d_vars.action=="e"){ // Can't miss a block or a dodge } else { - msg+=""; + msg+=""; } } msg+=msg_adds; - sendChat(who,msg_head+msg+msg_foot+msg_relance); + sendChat(who_pr,msg_head+msg+msg_foot+msg_relance+""); //logit(msg_head+msg+msg_foot); } function add_thoose_dices(d_vars,results,name,m_esq,m_crit){ logit(results); - var dices=""; + sum+=-d_vars.nb_2sub; + dices+=""; //logit(dices); return dices; @@ -302,12 +328,7 @@ function parse_command(message){ // Parse a string formated in the following fashion // 4 P 2 I 2 4 E 4 1 T 1 4 + 11 - 22 s 2 d 4 d 5 d 8 d 1 // And add everithing in the related Variables - var d_vars={"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":""}; + var d_vars={"perfection":0,"defense_i_0":0,"defense_i_1":0,"defense_i_2":0,"rempart_p":0,"technique_m":0,"coup_d":0,"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,"action":"","flat_dices":[],"on_hit_c":0,"attribute":0,"encaissement":0,"replace":-1,"add_to_all":0,"max_dices":-1,"player_name":"","crit_level":2,"transcendence":3,"pctreceived":0,"pctinflicted":0,"nb_dices":0,"nb_flat_dices":0,"encaissement_dices":"","results":[],"cleave":[],"encaissement_result":0,"technique_result":0,"coup_d_results":[]}; var tab=message.split(" "); var len_args=tab.length; var i; @@ -315,145 +336,157 @@ function parse_command(message){ //logit(tab.length); if (len_args>0){ - d_vars.nb_dices=to_p_number(tab[0]); + d_vars.nb_dices=to_p_number(tab[0]); } for (i = 1; i < len_args;) { - switch(tab[i]) { - case "+": - d_vars.nb_2add+=to_number(tab[i+1]); - i+=2; - break; - case "-": - d_vars.nb_2sub=to_number(tab[i+1]); - i+=2; - break; - case "P": - d_vars.perfection=to_p_number(tab[i+1]); - i+=2; - break; - case "r": - d_vars.relances=to_p_number(tab[i+1]); - i+=2; - break; - case "s": - d_vars.seuil=to_p_number(tab[i+1]); - i+=2; - break; - case "d": - d_vars.flat_dices[d_vars.nb_flat_dices]=to_p_number(tab[i+1]); - d_vars.nb_flat_dices++; - i+=2; - break; - case "I": - switch (tab[i+1]) { - case "1": - d_vars.defense_i_0=to_p_number(tab[i+2]); - break; - case "2": - d_vars.defense_i_1=to_p_number(tab[i+2]); - break; - case "4": - d_vars.defense_i_2=to_p_number(tab[i+2]); - break; - } - i+=3; - break; - case "E": - switch (tab[i+1]) { - case "1": - d_vars.exploiter_p_0=to_p_number(tab[i+2]); - break; - case "2": - d_vars.exploiter_p_1=to_p_number(tab[i+2]); - break; - case "4": - d_vars.exploiter_p_2=to_p_number(tab[i+2]); - break; - } - i+=3; - break; - case "T": - switch (tab[i+1]) { - case "2": - d_vars.tir_p_0=to_p_number(tab[i+2]); - break; - case "4": - d_vars.tir_p_1=to_p_number(tab[i+2]); - break; - } - i+=3; - break; - case "R": - d_vars.rempart_p=to_p_number(tab[i+1]); - i+=2; - break; - case "C": - d_vars.charge=to_p_number(tab[i+1]); - i+=2; - break; - case "M": // Both act likewise, we don't care the level in the script - d_vars.technique_m=to_p_number(tab[i+2]); - i+=3; - break; - case "D": - d_vars.coup_d=to_p_number(tab[i+1]); - i+=2; - break; - case "F": - d_vars.fauchage=to_p_number(tab[i+1]); - i+=2; - break; - case "N": - d_vars.charge_i=to_p_number(tab[i+1]); - i+=2; - break; - case "i": - d_vars.tir_i=to_p_number(tab[i+1]); - i+=2; - break; - case "a": - d_vars.action=tab[i+1]; - i+=2; - break; - case "H": - d_vars.on_hit_c+=to_number(tab[i+1]); - i+=2; - break; - case "A": - d_vars.attribute+=to_number(tab[i+1]); - i+=2; - break; - case "S": - 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; - case "L": - d_vars.replace=to_number(tab[i+1]); - i+=2; - break; - case "l": - d_vars.add_to_all=to_number(tab[i+1]); - i+=2; - break; - case "m": - d_vars.max_dices=to_number(tab[i+1]); - i+=2; - break; - case ":": - d_vars.player_name=tab[i+1]; - /*if(tab[i+2].length>1){ // Fixaround, not really pretty, due to the way things are parsed - d_vars.player_name+=" "+tab[i+2]; // Adding second part of name - i+=1; - }*/ - i+=2; - break; - default: - logit("Argument "+tab[i]+" unknown."); - i++; - break; - } + switch(tab[i]) { + case "P": + d_vars.perfection=to_p_number(tab[i+1]); + i+=2; + break; + case "R": + d_vars.rempart_p=to_p_number(tab[i+1]); + i+=2; + break; + case "M": + d_vars.technique_m=to_p_number(tab[i+2]); + i+=3; + break; + case "D": + d_vars.coup_d=to_p_number(tab[i+1]); + i+=2; + break; + case "F": + d_vars.fauchage=to_p_number(tab[i+1]); + i+=2; + break; + case "i": + d_vars.tir_i=to_p_number(tab[i+1]); + i+=2; + break; + case "C": + d_vars.charge=to_p_number(tab[i+1]); + i+=2; + break; + case "N": + d_vars.charge_i=to_p_number(tab[i+1]); + i+=2; + break; + case "+": + d_vars.nb_2add+=to_number(tab[i+1]); + i+=2; + break; + case "-": + d_vars.nb_2sub+=to_number(tab[i+1]); + i+=2; + break; + case "r": + d_vars.relances=to_p_number(tab[i+1]); + i+=2; + break; + case "s": + d_vars.seuil=to_p_number(tab[i+1]); + i+=2; + break; + case "a": + d_vars.action=tab[i+1]; + i+=2; + break; + case "d": + d_vars.flat_dices[d_vars.nb_flat_dices]=to_p_number(tab[i+1]); + d_vars.nb_flat_dices++; + i+=2; + break; + case "H": + d_vars.on_hit_c+=to_number(tab[i+1]); + i+=2; + break; + case "A": + d_vars.attribute+=to_number(tab[i+1]); + i+=2; + break; + case "S": + 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; + case "L": + d_vars.replace=to_number(tab[i+1]); + i+=2; + break; + case "l": + d_vars.add_to_all=to_number(tab[i+1]); + i+=2; + break; + case "m": + d_vars.max_dices=to_p_number(tab[i+1]); + i+=2; + break; + case "n": + d_vars.player_name=tab[i+1]; + i+=2; + break; + case "c": + d_vars.crit_level=to_p_number(tab[i+1]); + i+=2; + break; + case "t": + d_vars.transcendence=to_p_number(tab[i+1]); + i+=2; + break; + case "v": + d_vars.pctreceived=to_number(tab[i+1]); + i+=2; + break; + case "f": + d_vars.pctinflicted=to_number(tab[i+1]); + i+=2; + break; + case "I": + switch (tab[i+1]) { + case "1": + d_vars.defense_i_0=to_p_number(tab[i+2]); + break; + case "2": + d_vars.defense_i_1=to_p_number(tab[i+2]); + break; + case "4": + d_vars.defense_i_2=to_p_number(tab[i+2]); + break; + } + i+=3; + break; + case "E": + switch (tab[i+1]) { + case "1": + d_vars.exploiter_p_0=to_p_number(tab[i+2]); + break; + case "2": + d_vars.exploiter_p_1=to_p_number(tab[i+2]); + break; + case "4": + d_vars.exploiter_p_2=to_p_number(tab[i+2]); + break; + } + i+=3; + break; + case "T": + switch (tab[i+1]) { + case "2": + d_vars.tir_p_0=to_p_number(tab[i+2]); + break; + case "4": + d_vars.tir_p_1=to_p_number(tab[i+2]); + break; + } + i+=3; + break; + default: + logit("Argument "+tab[i]+" unknown."); + i++; + break; + } } return d_vars; }; diff --git a/feuille_sysd10.html b/feuille_sysd10.html index efdf933..6786a8e 100644 --- a/feuille_sysd10.html +++ b/feuille_sysd10.html @@ -1,668 +1,2027 @@ - - - // shield1 - on("change:item_shield1_activation change:general_item_shield1", function() { - getAttrs(["item_shield1_activation", "general_item_shield1"], function(values) { - setAttrs({"general_effective_shield1":values.item_shield1_activation*values.general_item_shield1}); - }); - }); - // shield2 - on("change:item_shield2_activation change:general_item_shield2", function() { - getAttrs(["item_shield2_activation", "general_item_shield2"], function(values) { - setAttrs({"general_effective_shield2":values.item_shield2_activation*values.general_item_shield2}); - }); - }); - // shield3 - on("change:item_shield3_activation change:general_item_shield3", function() { - getAttrs(["item_shield3_activation", "general_item_shield3"], function(values) { - setAttrs({"general_effective_shield3":values.item_shield3_activation*values.general_item_shield3}); - }); - }); - -
-
- -
- -
-
-
-
-
"; + var msg_head="
" + var msg="
"; var msg_foot="
"; var msg_adds=""; - var msg_relance="Relancer ce jet"; + logit(msg_relance); var sum=0; var m_esq=1,m_crit=1; //The multiplier from dodge or crit @@ -186,66 +185,76 @@ function show_rolls(who,d_vars){ logit(dice_stats); if (d_vars.player_name!=""){ who=d_vars.player_name; + who_pr=d_vars.player_name.replace(/_/g," ").replace(/\//g,"'"); } switch(d_vars.action){ case "a": - msg+=who+" attaque
Coup déchirant: "+d_vars.coup_d_results.join(" ")+"
Technique martiale: "+d_vars.technique_result+"
Relances: "+d_vars.relances+"
Encaissement: "+d_vars.encaissement_result+"
L'action est une réussite critique
Coup déchirant: "+d_vars.coup_d_results.join(" ")+"
Technique martiale: "+d_vars.technique_result+"
Relances: "+d_vars.relances+"
Encaissement: "+d_vars.encaissement_result+"
Modificateur de des: "+d_vars.add_to_all;}; //Dice modifier + if (d_vars.transcendence!=3){msg_adds+="
Transcendence: "+d_vars.transcendence;}; //Transcendence + //if (d_vars.pctreceived!=0){msg_adds+="
Réduction de dégats: "+d_vars.pctreceived+"%";}; //Transcendence + //if (d_vars.pctinflicted!=0){msg_adds+="
Augmentation de dégats: "+d_vars.pctinflicted+"%";}; //Transcendence + + if (dice_stats.is_crit==1&&m_crit>1) msg+="
L'action est une réussite critique
L'attaque parvient à toucher sa cible
L'attaque parvient à toucher sa cible (seuil "+d_vars.seuil+")
L'action est un succes
L'action est un succes (seuil "+d_vars.seuil+")
L'attaque ne touche pas sa cible
L'attaque ne touche pas sa cible (seuil "+d_vars.seuil+")
L'action est un echec
L'action est un echec (seuil "+d_vars.seuil+")
"+name; + var dices="
"+name; var is_below=0,is_acrit=0; var sum=0; var t_hit=d_vars.seuil,t_crit=Math.max(7,d_vars.seuil); //The crit threshold can change if the hit threshold is higher @@ -253,20 +262,20 @@ function add_thoose_dices(d_vars,results,name,m_esq,m_crit){ for (var i=0,len=results.length;it_hit && is_below==1){ + if (results[i]>=t_hit && is_below==1){ dices+=""; //Stop greying everithing is_below=2; } if (results[i]>t_crit&&is_acrit==0){ - dices+=""; //Start greening everithing + dices+=""; //Start greening everything is_acrit=1; } // Only add to the sum if you pass the threshold - if (results[i]>t_hit) { - if (d_vars.replace>=0) { + if (results[i]>=t_hit) { + if (d_vars.replace>0) { sum+=d_vars.replace+d_vars.add_to_all; } else { sum+=results[i]+d_vars.add_to_all; @@ -280,18 +289,35 @@ function add_thoose_dices(d_vars,results,name,m_esq,m_crit){ is_acrit=2; } + + if (m_esq==2) {dices+=" [x2]";}; if (d_vars.nb_2add!=0){dices+=" + ("+d_vars.nb_2add;}; - if (d_vars.on_hit_c+d_vars.attribute!=0){ + if (d_vars.attribute+d_vars.attribute!=0){ //&&!=0 dices+=" + "+(d_vars.on_hit_c+d_vars.attribute); if (m_crit>1) dices+=" [x"+m_crit+"]"; }; + if (d_vars.pctreceived!=0 && d_vars.action!="a"){ + d_vars.pctreceived=(100+d_vars.pctreceived); + d_vars.nb_2sub=Math.floor(d_vars.nb_2sub*d_vars.pctreceived/100); + dices+=" [x"+d_vars.pctreceived+"%]"; + } if (d_vars.nb_2add!=0){dices+=")";}; if (d_vars.nb_2sub!=0){dices+=" - "+d_vars.nb_2sub;}; // Add everything to the sum - sum=Math.floor(((sum*m_esq+d_vars.on_hit_c+d_vars.attribute))*m_crit)+d_vars.nb_2add-d_vars.nb_2sub; + sum=Math.floor(((sum*m_esq+d_vars.on_hit_c+d_vars.attribute))*m_crit)+d_vars.nb_2add sum+=d_vars.defense_i_0+d_vars.exploiter_p_0+d_vars.charge+d_vars.technique_result+d_vars.encaissement_result; + if(d_vars.transcendence>3){sum=sum*(2**(d_vars.transcendence-3));} + else { + if (d_vars.transcendence<3) { sum=Math.floor(sum/(2**(3-d_vars.transcendence)));} + } + if (d_vars.pctinflicted!=0 && d_vars.action=="a"){ + d_vars.pctinflicted=(100+d_vars.pctinflicted); + sum=Math.floor(sum*d_vars.pctinflicted/100); + dices+=' [x'+d_vars.pctinflicted+'%]'; + } - dices+="
Total: "+sum+"
Total: "+sum+"
- - - - - - - - - - -

Points de compétence :

Utilisés - -
Restants
+
+ +
+
-
-

Ressources

-
- - - - - - - - - - - - -

Points de Vie

Points de Fatigue

-
-
- -
-
-

Caractéristiques

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CaracValeurBonusLancer
Force
Agilité
Perception
Charisme
+
+
+
+

Ressources

+ + + + + + + + + + + + + + + + +

Points de Vie

Points de Fatigue

+
+
+ + + +
+ + + + + + + + +

Points de compétence :

Utilisés + +
Restants
+
-
-

 

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CaracValeurBonusLancer
Intelligence
Volonté
Psyché
Chance
+
+
+

Caractéristiques

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CaracValeurBonusLancer
Force
Agilité
Perception
Charisme
+
+
+

 

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CaracValeurBonusLancer
Intelligence
Volonté
Psyché
Chance
+
-
-
- - - - +
+ + + +
-
- - - - -
- -

Compétences générales

-
- - - - - -
+ + + + +
+ +

Combat

+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
- -
- -

Compétences sociales

-
- - - - - -
+
+ +

Physiques

+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
- -
- -

Compétences Intellectuelles

-
- - - - - -
+
+ +

Implants

+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+
+
+ +

Pilotage

+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
- -
- - +
-
- - -
-

Compétences magiques

-
- - - - - -
+ + + +
+ +

Techniques

+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+
+
+ +

Connaissances

+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+
+
+ +

Culture Générale

+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
- -
- - +
- - - - - -
- - - - d10+ - + - - -
- - - - - -
- - - - - -
- - - - - - - - -
- - - - - -
- -
- - -
- - - - - - - - - -
- - - - - - - - - -
- - - - - - - - - -
- - - - - - - - - -
- - - - - - - - - -
- - -
- - - - - -
-
- - -
- - d10+ - + - - -
- - d10+ - - -
- - - - - -
- - - - - -
- - - - - - - - - - - - - - - -
- - - - - - - - - -
- - - - - - - - - -
- - - - - - - - - -
- - -
- - - - - -
-
- - -
. - - d10 ∘ - + - - -
- - - - - - - - - -
- - - - - - - - - -
- - - - - - - - - -
- - - - - - - - - -
- - -
- - - - - -
-
- - +

Sociales

+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+
+
+ +

Clandestines

+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+
+
+ +

Contacts

+ +
+ + + + + +
+
+
+
-
--> -
+ + + + + + {{#rollWasCrit() result}} + + {{/rollWasCrit() result}} + {{#^rollWasCrit() result}} + {{#rollWasFumble() result}} + {{#rollGreater() result 1}} + + {{/rollGreater() result 1}} + {{#rollBetween() result 0 1}} + + {{/rollBetween() result 0 1}} + {{#rollLess() result 0}} + + {{/rollLess() result 0}} + {{/rollWasFumble() result}} + {{#^rollWasFumble() result}} + {{#rollGreater() result 1}} + + {{/rollGreater() result 1}} + {{#rollBetween() result 0 1}} + + {{/rollBetween() result 0 1}} + {{#rollLess() result 0}} + + {{/rollLess() result 0}} + {{/^rollWasFumble() result}} + {{/^rollWasCrit() result}} + +
{{name}} — {{roll_name}}
Test au d{{dice_name}} seuil {{threshold}}
Critique ! {{result}}x2 degrés de réussiteÉchec critique ! {{result}}/2 degrés de réussiteÉchec critique ! {{result}}/2 degré de réussiteÉchec critique ! {{result}}x2 degrés d'échec{{result}} degrés de réussite{{result}} degré de réussite{{result}} degrés d'échec
+
+ + + + +
{{name}} — {{roll_name}}
1d10+{{value}} = {{result}} + {{#rollWasCrit() result}} + +{{base}} + {{/rollWasCrit() result}} + {{#rollWasFumble() result}} + {{result}}-{{base}} + {{/rollWasFumble() result}} +
+
diff --git a/helpers/base.py b/helpers/base.py new file mode 100644 index 0000000..9f6cee3 --- /dev/null +++ b/helpers/base.py @@ -0,0 +1,580 @@ +head = """ + + +""" +script = "" # The rest is kept for legacy reasons +"""" + +""" +header = """ +
+
+ +
+ +
+
+
+
+ + + +
+ + + + + + + + +

Points de compétence :

Utilisés + +
Restants
+
+
+
+
+

Caractéristiques

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CaracValeurBonusLancer
Force
Agilité
Perception
Charisme
+
+
+

 

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CaracValeurBonusLancer
Intelligence
Volonté
Psyché
Chance
+
+
+
+""" + +footer = """ +
+ + + + + + {{#rollWasCrit() result}} + + {{/rollWasCrit() result}} + {{#^rollWasCrit() result}} + {{#rollWasFumble() result}} + {{#rollGreater() result 1}} + + {{/rollGreater() result 1}} + {{#rollBetween() result 0 1}} + + {{/rollBetween() result 0 1}} + {{#rollLess() result 0}} + + {{/rollLess() result 0}} + {{/rollWasFumble() result}} + {{#^rollWasFumble() result}} + {{#rollGreater() result 1}} + + {{/rollGreater() result 1}} + {{#rollBetween() result 0 1}} + + {{/rollBetween() result 0 1}} + {{#rollLess() result 0}} + + {{/rollLess() result 0}} + {{/^rollWasFumble() result}} + {{/^rollWasCrit() result}} + +
{{name}} — {{roll_name}}
Test au d{{dice_name}} seuil {{threshold}}
Critique ! {{result}}x2 degrés de réussiteÉchec critique ! {{result}}/2 degrés de réussiteÉchec critique ! {{result}}/2 degré de réussiteÉchec critique ! {{result}}x2 degrés d'échec{{result}} degrés de réussite{{result}} degré de réussite{{result}} degrés d'échec
+
+ + + + +
{{name}} — {{roll_name}}
1d10+{{value}} = {{result}} + {{#rollWasCrit() result}} + +{{base}} + {{/rollWasCrit() result}} + {{#rollWasFumble() result}} + {{result}}-{{base}} + {{/rollWasFumble() result}} +
+
+ +
+

{{name}}

+
{{subtags}}
+
+ {{#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}} +
+
+""" +css_footer = """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/customs.py b/helpers/customs.py new file mode 100644 index 0000000..0dff0e7 --- /dev/null +++ b/helpers/customs.py @@ -0,0 +1,126 @@ +import generator + +__ALL__=["DISTANCE","MELEE"] + +class DISTANCE(generator.Node): + """DISTANCE Weapons""" + + def __init__(self, name,nb): + super(DISTANCE, self).__init__("repeating_ranged-weapons",0) + + def content(self): + ret=""" +
+
+
+ + + + + + + + + + +
+
+ + + + + +
+
+ + + + + + + + + + + + + + + +
+
+""" + return ret + + +class MELEE(generator.Node): + """MELEE Weapons""" + + def __init__(self, name,nb): + super(MELEE, self).__init__(name,nb) + + def content(self): + ret=""" +
+
+
+ + + + +
+
+ + + +
+
+ + + + + + + + +
+
+""" + return ret + +class CONSOMMABLE(generator.Node): + """CONSUMMABLES""" + + def __init__(self, name,nb): + super(CONSOMMABLE, self).__init__(name,nb) + + def content(self): + return """
+
+
+ + + + + + +
+
+ +
+
+""" diff --git a/helpers/cyberpnk.txt b/helpers/cyberpnk.txt new file mode 100644 index 0000000..aa443a4 --- /dev/null +++ b/helpers/cyberpnk.txt @@ -0,0 +1,135 @@ +@ Physique ++ Combat += Armes à feu +- ⇥ Armes d'assaut +- ⇥ Armes de poing += Armes Lourdes +- ⇥ Munitions solide +- ⇥ Projectiles autopropulsés +- ⇥ Armement laser += Artillerie +- ⇥ Projectiles balistiques +- ⇥ Guidage de missiles +- ⇥ Systemes de défenses +- ⇥ Balistique superlative += Combat à Mains Nues +- ⇥ Neo Kwon Do +- ⇥ Zero-G += Combat Armé +- ⇥ Armes Contondantes +- ⇥ Armes Tranchantes += Maniement des Explosifs + ++ Physiques += Athlétisme +- ⇥ Aerien +- ⇥ Terrestre +- ⇥ Maritime +- ⇥ Zero G += Survie +- ⇥ Environnement Sauvage +- ⇥ Environnement Urbain +- ⇥ Environnement Spacial + ++ Implants += Utilisation de Cyberware +- ⇥ Utilisation de Neuro Accelerateurs +- ⇥ Utilisation d'Interfaces de tir +- ⇥ Overdrive Physique + ++ Pilotage += Pilotage atmosphérique +- ⇥ Pilotage de Chasseurs +- ⇥ Pilotage de Navettes += Vehicules Terrestres +- ⇥ Vehicules Légers +- ⇥ Vehicules Lourds +- ⇥ Véhicules de Course += Vaisseaux Spatiaux +- ⇥ Bâtiments légers +- ⇥ Bâtiments lourds +- ⇥ Bâtiments super lourds + +@ Intelectuelles ++ Techniques += Biotech +- ⇥ Chirurgie d’implants += Électronique +- ⇥ Interconnection des systèmes +- ⇥ Verrous magnétiques += Informatique +- ⇥ Hardware +- ⇥ Software +- ⇥ Systèmes embarqués += Mécanique +- ⇥ Réacteurs à Fusion +- ⇥ Réacteurs à Fission +- ⇥ Compensateurs d'Inertie +- ⇥ Technologie Lightfold +- ⇥ Systèmes de Survie +- ⇥ Systèmes de Propulsion += Prospection stellaire +- ⇥ Corps stellaires +- ⇥ Excavation planetaire + ++ Connaissances += Bioware +- ⇥ Implants Céphaliens +- ⇥ Implants Corporels += Médecine +- ⇥ Soins Intensifs +- ⇥ Cybernetisation += Sciences +- ⇥ Astromathématiques +- ⇥ Biologie +- ⇥ Xenobiologie +- ⇥ Mathématiques +- ⇥ Physique/Chimie +- ⇥ Lightfold +- ⇥ Sociologie + ++ Culture Générale += Instruction Civique +- ⇥ Administratif/Politique/Droit +- ⇥ Finances +- ⇥ Psychologie += Théorie Militaire +- ⇥ Tactique +- ⇥ Stratégie + +@ Sociales ++ Relations humaines += Étiquette +- ⇥ Alpha Centauri +- ⇥ Eridani +- ⇥ Banard +- ⇥ Tau +- ⇥ Sirius +- ⇥ C.I.C. +- ⇥ Sol +- ⇥ Pègre += Interrogation +- ⇥ Intimidation += Commandement += Négociation += Barratin + ++ Clandestines += Discrétion += Crochetage += Informations += Larcin += Marchés noirs +- ⇥ Acquisition d’Objets +- ⇥ Acquisition d’Informations + ++ Contacts +. Contacts + +@ Arsenal ++ Distance +# DISTANCE ++ Mêlée +# MELEE ++ Consommable +# CONSOMMABLE diff --git a/helpers/generator.py b/helpers/generator.py new file mode 100644 index 0000000..272e2c5 --- /dev/null +++ b/helpers/generator.py @@ -0,0 +1,250 @@ +# -*- coding: utf-8 -*- + + +# content skills sections and others from a file, on the long run, it should be able to content the whole sheet + +import argparse, sys, os +import string +# from unidecode import unidecode +# import unicode + +def remove_non_ascii(text): + return "".join([c for c in text if c in string.ascii_letters]).strip(" ") + # return unidecode(text) + +class Node(object): + """Generic Node.""" + def __init__(self, name,nb): + self.name = name#name.strip(" ") + self.number=nb + self.children=[] + self.checked="" + self.parent=None + self.pname=u""+remove_non_ascii(self.name.replace(" ","")).lower() + if nb==1: + self.checked='checked="checked"' + + def content(self): + return "" + + def header(self): + return "" + + def css(self): + return "" + + def addchild(self,child): + self.children+=[child] + child.parent=self + +class Root(Node): + """docstring for Root.""" + def __init__(self): + super(Root,self).__init__("",0) + + def generate(self): + "Return the whole tree, printable" + return self.content() + + def content(self): + ret="" + for child in self.children: + ret+=child.header() # Ligne de chaque tab direct, puis tout + for child in self.children: + ret+=child.content() + ret+="
\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) + + def content(self): + ret='\n
\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=""" + + + + + +
\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=""" + + + + + +
\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=""" +
+ + + + + +
+
\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 @@ + + + + +
+
+ +
+ +
+
+
+
+

Ressources

+ + + + + + + + + + + + + + + +

Points de Vie

Points de Fatigue

+
+
+ + + +
+ + + + + + + + +

Points de compétence :

Utilisés + +
Restants
+
+
+
+
+

Caractéristiques

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CaracValeurBonusLancer
Force
Agilité
Perception
Charisme
+
+
+

 

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CaracValeurBonusLancer
Intelligence
Volonté
Psyché
Chance
+
+
+
+ + + + + +
+ + + + +
+ +

Combat

+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+
+
+ +

Physiques

+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+
+
+ +

Implants

+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+
+
+ +

Pilotage

+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+
+
+ +
+ + + +
+ +

Techniques

+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+
+
+ +

Connaissances

+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+
+
+ +

Culture Générale

+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+
+
+ +
+ + + +
+ +

Sociales

+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+
+
+ +

Clandestines

+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+
+
+ +

Contacts

+ +
+ + + + + +
+
+
+
+ +
+ + + +
+ +

Distance

+ +
+
+
+ + + + + + + + + + +
+
+ + + + + +
+
+ + + + + + + + + + + + + + + +
+
+
+
+ +

Melée

+ +
+
+
+ + + + +
+
+ + + +
+
+ + + + + + + + +
+
+
+
+ +

Consommable

+
+
+
+ + + + + + +
+
+ +
+
+
+
+ +
+ + + + + + {{#rollWasCrit() result}} + + {{/rollWasCrit() result}} + {{#^rollWasCrit() result}} + {{#rollWasFumble() result}} + {{#rollGreater() result 1}} + + {{/rollGreater() result 1}} + {{#rollBetween() result 0 1}} + + {{/rollBetween() result 0 1}} + {{#rollLess() result 0}} + + {{/rollLess() result 0}} + {{/rollWasFumble() result}} + {{#^rollWasFumble() result}} + {{#rollGreater() result 1}} + + {{/rollGreater() result 1}} + {{#rollBetween() result 0 1}} + + {{/rollBetween() result 0 1}} + {{#rollLess() result 0}} + + {{/rollLess() result 0}} + {{/^rollWasFumble() result}} + {{/^rollWasCrit() result}} + +
{{name}} — {{roll_name}}
Test au d{{dice_name}} seuil {{threshold}}
Critique ! {{result}}x2 degrés de réussiteÉchec critique ! {{result}}/2 degrés de réussiteÉchec critique ! {{result}}/2 degré de réussiteÉchec critique ! {{result}}x2 degrés d'échec{{result}} degrés de réussite{{result}} degré de réussite{{result}} degrés d'échec
+
+ + + + +
{{name}} — {{roll_name}}
1d10+{{value}} = {{result}} + {{#rollWasCrit() result}} + +{{base}} + {{/rollWasCrit() result}} + {{#rollWasFumble() result}} + {{result}}-{{base}} + {{/rollWasFumble() result}} +
+
+ +
+

{{name}}

+
{{subtags}}
+
+ {{#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 @@ - - - - - - - - - - -