Files
roll20-character-sheets/ButterflyAspect/ButterflyAspect.html
T
2022-10-01 19:39:22 +02:00

1233 lines
47 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<input class="selector-switch rollmod" name="attr_rollmodswitch" type="checkbox" value="1" />
<div class="container">
<div class="float head">
<div class="float head-logo">
<img class="logo" src="https://raw.githubusercontent.com/Roll20/roll20-character-sheets/master/ButterflyAspect/logo.png" alt="ButterflyAspect" />
<div class="settings">
<select name="attr_gmroll">
<option value="0" selected disabled>Auswahl treffen</option>
<option value="nogm">Für alle sichtbar würfeln</option>
<option value="gm">Für GM würfeln</option>
</select>
<input type="hidden" name="attr_abilityroll" />
<select name="attr_rollmodswitch">
<option value="1">Modifier aktiv</option>
<option value="0" selected>Modifier inaktiv</option>
</select>
</div>
</div>
<div class="float head-info">
<div class="header">
<span>Allgemeines</span>
</div>
<div class="float head-info-boxes">
<div class="formular">
<label for="attr_character_name">Charaktername</label>
<input type="text" id="attr_character_name" name="attr_character_name" />
</div>
<div class="formular">
<label for="attr_character_description">Beschreibung</label>
<textarea id="attr_character_description" name="attr_character_description" style="height: 102px"></textarea>
</div>
</div>
<div class="head-stats">
<div class="formular">
<label for="attr_leben">Leben</label>
<div class="health">
<input type="number" class="number-20" id="attr_leben" name="attr_leben" placeholder="Aktuell" /> /
<input type="number" class="number-20" id="attr_leben_max" name="attr_leben_max" style="cursor: not-allowed" readonly />
</div>
</div>
<div class="formular">
<label for="attr_ruestung">Rüstung</label>
<input type="number" class="number-20" id="attr_ruestung" name="attr_ruestung" style="cursor: not-allowed" readonly />
</div>
<div class="formular ressourcen">
<label for="attr_ressourcen">Ressourcen</label>
<div>
<input type="checkbox" name="attr_ressourcen0" value="0" title="Ausgebrannt" />
<div>|</div>
<input type="checkbox" name="attr_ressourcen1" value="1" checked />
<input type="checkbox" name="attr_ressourcen2" value="2" checked />
<input type="checkbox" name="attr_ressourcen3" value="3" />
<input type="checkbox" name="attr_ressourcen4" value="4" />
<div>|</div>
<input type="checkbox" name="attr_ressourcen0" value="5" title="Geldsegen" />
</div>
</div>
<div class="formular">
<button type="roll" class="small-button" name="roll_schicksalRoll" value="Die Gruppe hat jetzt noch [[@{schicksal}]] Schicksalspunkte">Schicksal</button>
<input type="number" name="attr_schicksal" value="4" class="number-20" />
</div>
</div>
</div>
</div>
<div class="break"></div>
<div class="float attribut">
<div class="header">
<span>Attribute</span>
</div>
<div class="float attribut-stats">
<div class="float formular">
<button type="roll" class="small-button norollmod" name="roll_NaRoll" value="@{abilityroll} &{template:butterfly} {{name=Nahkampf}} {{rolling=[[floor(@{Na}d10 / 2)]]}}">Nahkampf</button>
<button type="roll" class="small-button rollmod" name="roll_NaRoll" value="@{abilityroll} &{template:butterfly} {{name=Nahkampf}} {{rolling=[[floor((?{Würfel|@{Na}}d10) / 2)]]}}">
Nahkampf
</button>
<input type="number" name="attr_Na" value="1" min="1" class="number-20" />
</div>
<div class="float formular">
<button type="roll" class="small-button norollmod" name="roll_FeRoll" value="@{abilityroll} &{template:butterfly} {{name=Fernkampf}} {{rolling=[[floor(@{Fe}d10 / 2)]]}}">Fernkampf</button>
<button type="roll" class="small-button rollmod" name="roll_FeRoll" value="@{abilityroll} &{template:butterfly} {{name=Fernkampf}} {{rolling=[[floor((?{Würfel|@{Fe}}d10) / 2)]]}}">
Fernkampf
</button>
<input type="number" name="attr_Fe" value="1" min="1" class="number-20" />
</div>
<div class="float formular">
<button type="roll" class="small-button norollmod" name="roll_GeRoll" value="@{abilityroll} &{template:butterfly} {{name=Geschick}} {{rolling=[[floor(@{Ge}d10 / 2)]]}}">Geschick</button>
<button type="roll" class="small-button rollmod" name="roll_GeRoll" value="@{abilityroll} &{template:butterfly} {{name=Geschick}} {{rolling=[[floor((?{Würfel|@{Ge}}d10) / 2)]]}}">
Geschick
</button>
<input type="number" name="attr_Ge" value="1" min="1" class="number-20" />
</div>
<div class="float formular">
<button type="roll" class="small-button norollmod" name="roll_WaRoll" value="@{abilityroll} &{template:butterfly} {{name=Wahrnehmung}} {{rolling=[[floor(@{Wa}d10 / 2)]]}}">Wahrnehmung</button>
<button type="roll" class="small-button rollmod" name="roll_WaRoll" value="@{abilityroll} &{template:butterfly} {{name=Wahrnehmung}} {{rolling=[[floor((?{Würfel|@{Wa}}d10) / 2)]]}}">
Wahrnehmung
</button>
<input type="number" name="attr_Wa" value="1" min="1" class="number-20" />
</div>
<div class="float formular">
<button type="roll" class="small-button norollmod" name="roll_KoRoll" value="@{abilityroll} &{template:butterfly} {{name=Konstitution}} {{rolling=[[floor(@{Ko}d10 / 2)]]}}">Konstitution</button>
<button type="roll" class="small-button rollmod" name="roll_KoRoll" value="@{abilityroll} &{template:butterfly} {{name=Konstitution}} {{rolling=[[floor((?{Würfel|@{Ko}}d10) / 2)]]}}">
Konstitution
</button>
<input type="number" name="attr_Ko" value="1" min="1" class="number-20" />
</div>
<div class="float formular">
<button type="roll" class="small-button norollmod" name="roll_InRoll" value="@{abilityroll} &{template:butterfly} {{name=Intelligenz}} {{rolling=[[floor(@{In}d10 / 2)]]}}">Intelligenz</button>
<button type="roll" class="small-button rollmod" name="roll_InRoll" value="@{abilityroll} &{template:butterfly} {{name=Intelligenz}} {{rolling=[[floor((?{Würfel|@{In}}d10) / 2)]]}}">
Intelligenz
</button>
<input type="number" name="attr_In" value="1" min="1" class="number-20" />
</div>
<div class="float formular">
<button type="roll" class="small-button norollmod" name="roll_WiRoll" value="@{abilityroll} &{template:butterfly} {{name=Wissen}} {{rolling=[[floor(@{Wi}d10 / 2)]]}}">Wissen</button>
<button type="roll" class="small-button rollmod" name="roll_WiRoll" value="@{abilityroll} &{template:butterfly} {{name=Wissen}} {{rolling=[[floor((?{Würfel|@{Wi}}d10) / 2)]]}}">
Wissen
</button>
<input type="number" name="attr_Wi" value="1" min="1" class="number-20" />
</div>
<div class="float formular">
<button type="roll" class="small-button norollmod" name="roll_CaRoll" value="@{abilityroll} &{template:butterfly} {{name=Charisma}} {{rolling=[[floor(@{Ca}d10 / 2)]]}}">Charisma</button>
<button type="roll" class="small-button rollmod" name="roll_CaRoll" value="@{abilityroll} &{template:butterfly} {{name=Charisma}} {{rolling=[[floor((?{Würfel|@{Ca}}d10) / 2)]]}}">
Charisma
</button>
<input type="number" name="attr_Ca" value="1" min="1" class="number-20" />
</div>
</div>
</div>
<div class="break"></div>
<div class="float full skills">
<div class="header">
<span>Fertigkeiten</span>
</div>
<div class="grid">
<div>Fertigkeit</div>
<div>Attr.</div>
<div>Wert</div>
<div>MOD</div>
<div>PP</div>
<div>Roll</div>
</div>
<div class="gridplace">
<fieldset class="repeating_basicskills">
<div id="skilldiv" class="repeat-skill">
<div><input class="textcenter" type="text" name="attr_skillname" /></div>
<div>
<select name="attr_attribut">
<option value="@{Na}">Nahkampf</option>
<option value="@{Fe}">Fernkampf</option>
<option value="@{Ge}">Geschick</option>
<option value="@{Wa}">Wahrnehmung</option>
<option value="@{Ko}">Konstitution</option>
<option value="@{in}">Intelligenz</option>
<option value="@{Wi}">Wissen</option>
<option value="@{Ca}">Charisma</option>
</select>
</div>
<div><input type="number" name="attr_skill" value="0" /></div>
<div><input type="number" name="attr_skill_mod" value="0" /></div>
<div><input type="number" name="attr_pp" value="0" /></div>
<div>
<button
type="roll"
class="norollmod"
name="roll_skill"
value="@{abilityroll} &{template:butterfly} {{name=@{skillname}}} {{rolling=[[{@{skill}d10! + @{skill_mod}d10}k@{attribut}]]}}"
></button>
<button
type="roll"
class="rollmod"
name="roll_skill"
value="@{abilityroll} &{template:butterfly} {{name=@{skillname}}} [[?{Modifier|@{skill_mod}} ?{Würfel|@{skill}}]] {{rolling=[[{?{Würfel}d10! + ?{Modifier}d10}k@{attribut}]]}}"
></button>
</div>
</div>
</fieldset>
</div>
</div>
<div class="break"></div>
<div class="float full weapons">
<div class="header">
<span>Waffen</span>
<button type="roll" class="small-button" name="roll_ini" value="/w GM @{character_name} hat eine Initiative von [[@{Ge}d10 &{tracker}]]">Initiative</button>
</div>
<div class="grid">
<div>Waffe</div>
<div>Attr.</div>
<div>Wert</div>
<div>MOD</div>
<div>Schaden</div>
<div>Roll</div>
</div>
<div class="gridplace">
<fieldset class="repeating_waponskills">
<div id="weapondiv" class="repeat-weapon">
<input class="options-flag" id="weaponcheck" name="attr_options-flag" type="checkbox" title="Show/hide options" /><span>y</span>
<div><input class="textcenter" type="text" name="attr_weaponname" /></div>
<div>
<select name="attr_attribut">
<option value="@{Na}">Nahkampf</option>
<option value="@{Fe}">Fernkampf</option>
<option value="@{Ge}">Geschick</option>
<option value="@{Ko}">Konstitution</option>
</select>
</div>
<div><input type="number" name="attr_weaponskill" value="0" /></div>
<div><input type="number" name="attr_weaponskill_mod" value="0" /></div>
<div><input type="number" name="attr_weapondamage" value="0" /></div>
<div>
<button
type="roll"
class="norollmod"
name="roll_weapon"
value="@{abilityroll} &{template:butterfly} {{name=@{weaponname}}} {{rolling=[[{@{weaponskill}d10! + @{weaponskill_mod}d10}k@{attribut}]]}} {{damage=[[1d10 + @{weapondamage}]]}} {{desc=@{weaponeffekt}}}"
></button>
<button
type="roll"
class="rollmod"
name="roll_weapon"
value="@{abilityroll} &{template:butterfly} {{name=@{weaponname}}} [[?{Modifier|@{weaponskill_mod}} ?{Würfel|@{weaponskill}} ?{Schaden|@{weapondamage}}]] {{rolling=[[{?{Würfel}d10! + ?{Modifier}d10}k@{attribut}]]}} {{damage=[[1d10 + ?{Schaden}]]}} {{desc=@{weaponeffekt}}}"
></button>
</div>
<input class="liketextarea hiddenBox" type="text" name="attr_weaponeffekt" placeholder="Spezialeffekt" />
</div>
</fieldset>
</div>
</div>
<div class="break"></div>
<div class="float full mage">
<div class="header">
<span>Magie</span>
</div>
<div class="grid">
<div>Zauber</div>
<div>Zufälliger Effekt</div>
<div>Entf.</div>
<div>Zeit</div>
<div>Ziel.</div>
<div>Wert</div>
<div>MOD</div>
<div>Roll</div>
</div>
<div class="gridplace">
<fieldset class="repeating_spells">
<div id="magediv" class="repeat-mage">
<input class="options-flag" id="magecheck" name="attr_options-flag" type="checkbox" title="Show/hide options" /><span>y</span>
<div><input class="textcenter" type="text" name="attr_spellname" placeholder="Name" /></div>
<div><input class="liketextarea" type="text" name="attr_spelleffekt" placeholder="Zufälliger Effekt" /></div>
<div class="select-3">
<span class="hiddenBox">Entf.</span>
<input type="checkbox" name="attr_spellentfernung" value="1" title="10m" />
<input type="checkbox" name="attr_spellentfernung" value="3" title="Sichtreichweite" />
<input type="checkbox" name="attr_spellentfernung" value="6" title="sympathetischer Verbindung" />
</div>
<div class="select-4">
<span class="hiddenBox">Zeit</span>
<input type="checkbox" name="attr_spellzeit" value="1" title="eine Stunde" />
<input type="checkbox" name="attr_spellzeit" value="3" title="bis zum nächsten Sonnenaufgang" />
<input type="checkbox" name="attr_spellzeit" value="6" title="eine Woche" />
<input type="checkbox" name="attr_spellzeit" value="10" title="drei Monate" />
</div>
<div class="select-4">
<span class="hiddenBox">Ziel.</span>
<input type="checkbox" name="attr_ziehlbereich" value="1" title="2 Wesen/Objekte" />
<input type="checkbox" name="attr_ziehlbereich" value="3" title="5 Wesen/Objekte" />
<input type="checkbox" name="attr_ziehlbereich" value="6" title="10 Wesen/Objekte" />
<input type="checkbox" name="attr_ziehlbereich" value="10" />
</div>
<div><input type="number" name="attr_spellskill" value="0" /></div>
<div><input type="number" name="attr_spellskill_mod" value="0" /></div>
<div>
<button
type="roll"
class=""
name="roll_spell"
value="@{abilityroll} &{template:butterfly} {{name=@{spellname}}} [[?{Modifier?|@{spellskill_mod}} ?{Würfel|@{spellskill}}]] [[({floor(([[{?{Würfel}d10! + ?{Modifier?}d10}k@{attribut}]] - [[@{spellwiderstand} + (?{Gegnerische Intelligenz?|0} + ?{Aufrechterhaltene Zauber?|0}) * 2]]) / 5),1}kh1)]] {{rolling=$[[1]]}} {{widerstand=$[[2]]}} {{damage=@{damage}}} {{healing=@{healing}}} {{zeit=@{spellzeit}}} {{reinigung=@{spellreinigung}}} {{desc=@{spelleffekt}}}"
>
<input
type="number"
name="attr_spellwiderstand"
value="floor((@{spellbefehligen} + @{spellbewegung} + @{spellelement} + @{spellentfernung} + @{spellgestalt} + @{spellglueck} + @{spellreinigung} + @{spellwissen} + @{ziehlbereich} + @{spellzeit}) * 2)"
disabled
/>
</button>
</div>
<div class="hiddenBox">
<div class="select-4">
<div>Befeh.</div>
<input type="checkbox" name="attr_spellbefehligen" value="1" />
<input type="checkbox" name="attr_spellbefehligen" value="3" />
<input type="checkbox" name="attr_spellbefehligen" value="6" />
<input type="checkbox" name="attr_spellbefehligen" value="10" />
</div>
<div class="select-3">
<div>Bew.</div>
<input type="checkbox" name="attr_spellbewegung" value="1" />
<input type="checkbox" name="attr_spellbewegung" value="3" />
<input type="checkbox" name="attr_spellbewegung" value="6" />
</div>
<div class="select-3">
<div>Element</div>
<input type="checkbox" name="attr_spellelement" value="1" />
<input type="checkbox" name="attr_spellelement" value="3" />
<input type="checkbox" name="attr_spellelement" value="6" />
</div>
<div class="select-4">
<div>Gestalt</div>
<input type="checkbox" name="attr_spellgestalt" value="1" />
<input type="checkbox" name="attr_spellgestalt" value="3" />
<input type="checkbox" name="attr_spellgestalt" value="6" />
<input type="checkbox" name="attr_spellgestalt" value="10" />
</div>
<div class="select-4">
<div>Glück</div>
<input type="checkbox" name="attr_spellglueck" value="1" />
<input type="checkbox" name="attr_spellglueck" value="3" />
<input type="checkbox" name="attr_spellglueck" value="6" />
<input type="checkbox" name="attr_spellglueck" value="10" />
</div>
<div class="select-3">
<div>Rein.</div>
<input type="checkbox" name="attr_spellreinigung" value="1" />
<input type="checkbox" name="attr_spellreinigung" value="3" />
<input type="checkbox" name="attr_spellreinigung" value="6" />
</div>
<div class="select-4">
<div>Wissen</div>
<input type="checkbox" name="attr_spellwissen" value="1" />
<input type="checkbox" name="attr_spellwissen" value="3" />
<input type="checkbox" name="attr_spellwissen" value="6" />
<input type="checkbox" name="attr_spellwissen" value="10" />
</div>
<div id="attribut">
<select name="attr_attribut">
<option value="0" selected>Attribut</option>
<option value="@{Ge}">Geschick</option>
<option value="@{In}" selected>Intelligenz</option>
<option value="@{Wi}">Wissen</option>
<option value="@{Ch}">Charisma</option>
</select>
</div>
<div id="damage">
<select name="attr_damage">
<option value="0" selected disabled>Schaden</option>
<option value="[[1d10]]">aktiv</option>
<option value="">inaktiv</option>
</select>
</div>
<div id="healing">
<select name="attr_healing">
<option value="0" selected disabled>Heilung</option>
<option value="$[[3]]">aktiv</option>
<option value="">inaktiv</option>
</select>
</div>
<div id="textarea">
<textarea name="attr_spelldescription" placeholder="Inhalt"></textarea>
</div>
</div>
</div>
</fieldset>
</div>
</div>
<div class="break"></div>
<div class="float half aspects">
<div class="header">
<span>Aspekte</span>
</div>
<fieldset class="repeating_aspekte">
<input type="text" name="attr_aspekt" />
</fieldset>
</div>
<div class="float half stunts">
<div class="header">
<span>Stunts</span>
</div>
<fieldset class="repeating_stunts">
<div class="repeat-stunt">
<input class="options-flag" name="attr_options-flag" type="checkbox" title="Show/hide options" /><span>y</span>
<input type="text" name="attr_stunt" placeholder="Name" />
<textarea class="hiddenBox" name="attr_description" placeholder="Beschreibung"></textarea>
</div>
</fieldset>
</div>
<div class="break"></div>
<div class="float half inventar">
<div class="header">
<span>Inventar</span>
</div>
<div class="ruestung">
<input type="text" name="attr_ruestungName" placeholder="Rüstung/Schild" />
<input type="number" name="attr_ruestungswert" placeholder="Rüstungswert" />
</div>
<fieldset class="repeating_extras">
<div class="repeat-inv extras-row">
<input class="options-flag" name="attr_options-flag" type="checkbox" title="Show/hide options" /><span>y</span>
<input type="text" name="attr_name" placeholder="Gegenstand" />
<input type="number" name="attr_wight" placeholder="Info" />
<input type="number" name="attr_costs" placeholder="Anzahl" />
<textarea class="hiddenBox" name="attr_description" placeholder="Beschreibung"></textarea>
</div>
</fieldset>
</div>
<div class="float half notes">
<div class="header">
<span>Notizen</span>
</div>
<fieldset class="repeating_notes">
<div class="repeat-notes notes-row">
<input class="options-flag" name="attr_options-flag" type="checkbox" title="Show/hide options" /><span>y</span>
<input type="text" name="attr_title" placeholder="Titel" />
<textarea class="hiddenBox" name="attr_body" placeholder="Inhalt"></textarea>
</div>
</fieldset>
</div>
<div class="break"></div>
<div class="float full xp">
<div class="header">
<span>Erfahrungspunkte und Steigerung</span>
</div>
<div class="totalxp">
<div class="formular">
<label for="attr_XPtoSpend">Verfügbare EP</label>
<input type="number" id="attr_XPtoSpend" name="attr_XPtoSpend" class="number-20" value="@{XPTotal} - @{XPSpent}" style="cursor: not-allowed" disabled />
</div>
<div class="formular">
<label for="attr_XPSpent">Ausgegebene EP</label>
<input type="number" id="attr_XPSpent" name="attr_XPSpent" class="number-20" readonly />
</div>
<div class="formular">
<label for="attr_XPTotal">Gesamte EP</label>
<input type="number" id="attr_XPTotal" name="attr_XPTotal" class="number-20" />
</div>
</div>
<fieldset class="repeating_advancements">
<div class="item">
<input type="text" name="attr_advancement1" />
</div>
<div class="brackets">
<input type="number" name="attr_advancement1xp" />
</div>
<div class="placeholder"></div>
<div class="item">
<input type="text" name="attr_advancement2" />
</div>
<div class="brackets">
<input type="number" name="attr_advancement2xp" />
</div>
<div class="placeholder"></div>
<div class="item">
<input type="text" name="attr_advancement3" />
</div>
<div class="brackets">
<input type="number" name="attr_advancement3xp" />
</div>
</fieldset>
</div>
<div class="break"></div>
<div class="float full version">v22.09.1</div>
</div>
<!-- rolltemplate -->
<rolltemplate class="sheet-rolltemplate-butterfly">
<div class="container">
<div class="header">
<span>{{name}}</span>
</div>
<div class="content">
<div><span>Ergebnis:</span>{{rolling}}</div>
{{#widerstand}}
<div><span>Widerstand:</span>{{widerstand}}</div>
{{/widerstand}}
{{#damage}}
<div><span>Schaden:</span>{{damage}}</div>
{{/damage}}
{{#healing}}
<div><span>Heilung:</span><span class="fakeroll">{{reinigung}}</span></div>
{{#rollTotal() zeit 0}}
<div><span>Minuten:</span>{{healing}}</div>
{{/rollTotal() zeit 0}}
{{#rollGreater() zeit 0}}
<div><span>Runden:</span>{{healing}}</div>
{{/rollGreater() zeit 0}}
{{/healing}}
{{#desc}}
<div class="desc">
<span>Effekt:</span><br/>
{{desc}}
</div>
{{/desc}}
</div>
</div>
</rolltemplate>
<!-- worker scripts -->
<script type="text/worker">
/* ---- BEGIN: TheAaronSheet.js ---- */
// Github: https://github.com/shdwjk/TheAaronSheet/blob/master/TheAaronSheet.js
// By: The Aaron, Arcane Scriptomancer
// Contact: https://app.roll20.net/users/104025/the-aaron
var TAS = TAS || (function(){
'use strict';
var version = '0.2.5',
lastUpdate = 1504710542,
loggingSettings = {
debug: {
key: 'debug',
title: 'DEBUG',
color: {
bgLabel: '#7732A2',
label: '#F2EF40',
bgText: '#FFFEB7',
text: '#7732A2'
}
},
error: {
key: 'error',
title: 'Error',
color: {
bgLabel: '#C11713',
label: 'white',
bgText: '#C11713',
text: 'white'
}
},
warn: {
key: 'warn',
title: 'Warning',
color: {
bgLabel: '#F29140',
label: 'white',
bgText: '#FFD8B7',
text: 'black'
}
},
info: {
key: 'info',
title: 'Info',
color: {
bgLabel: '#413FA9',
label: 'white',
bgText: '#B3B2EB',
text: 'black'
}
},
notice: {
key: 'notice',
title: 'Notice',
color: {
bgLabel: '#33C133',
label: 'white',
bgText: '#ADF1AD',
text: 'black'
}
},
log: {
key: 'log',
title: 'Log',
color: {
bgLabel: '#f2f240',
label: 'black',
bgText: '#ffff90',
text: 'black'
}
},
callstack: {
key: 'TAS',
title: 'function',
color: {
bgLabel: '#413FA9',
label: 'white',
bgText: '#B3B2EB',
text: 'black'
}
},
callstack_async: {
key: 'TAS',
title: 'ASYNC CALL',
color: {
bgLabel: '#413FA9',
label: 'white',
bgText: '#413FA9',
text: 'white'
}
},
TAS: {
key: 'TAS',
title: 'TAS',
color: {
bgLabel: 'grey',
label: 'black;background:linear-gradient(#304352,#d7d2cc,#d7d2cc,#d7d2cc,#304352)',
bgText: 'grey',
text: 'black;background:linear-gradient(#304352,#d7d2cc,#d7d2cc,#d7d2cc,#304352)'
}
}
},
config = {
debugMode: false,
logging: {
log: true,
notice: true,
info: true,
warn: true,
error: true,
debug: false
}
},
callstackRegistry = [],
queuedUpdates = {}, //< Used for delaying saves till the last moment.
complexType = function(o){
switch(typeof o){
case 'string':
return 'string';
case 'boolean':
return 'boolean';
case 'number':
return (_.isNaN(o) ? 'NaN' : (o.toString().match(/\./) ? 'decimal' : 'integer'));
case 'function':
return 'function: '+(o.name ? o.name+'()' : '(anonymous)');
case 'object':
return (_.isArray(o) ? 'array' : (_.isArguments(o) ? 'arguments' : ( _.isNull(o) ? 'null' : 'object')));
default:
return typeof o;
}
},
dataLogger = function(primaryLogger,secondaryLogger,data){
_.each(data,function(m){
var type = complexType(m);
switch(type){
case 'string':
primaryLogger(m);
break;
case 'undefined':
case 'null':
case 'NaN':
primaryLogger('['+type+']');
break;
case 'number':
case 'not a number':
case 'integer':
case 'decimal':
case 'boolean':
primaryLogger('['+type+']: '+m);
break;
default:
primaryLogger('['+type+']:=========================================');
secondaryLogger(m);
primaryLogger('=========================================================');
break;
}
});
},
colorLog = function(options){
var coloredLoggerFunction,
key = options.key,
label = options.title || 'TAS',
lBGColor = (options.color && options.color.bgLabel) || 'blue',
lTxtColor = (options.color && options.color.label) || 'white',
mBGColor = (options.color && options.color.bgText) || 'blue',
mTxtColor = (options.color && options.color.text) || 'white';
coloredLoggerFunction = function(message){
/* eslint-disable no-console */
console.log(
'%c '+label+': %c '+message + ' ',
'background-color: '+lBGColor+';color: '+lTxtColor+'; font-weight:bold;',
'background-color: '+mBGColor+';color: '+mTxtColor+';'
);
/* eslint-enable no-console */
};
return function(){
if('TAS'===key || config.logging[key]){
/* eslint-disable no-console */
dataLogger(coloredLoggerFunction,function(m){console.log(m);},_.toArray(arguments));
/* eslint-enable no-console */
}
};
},
logDebug = colorLog(loggingSettings.debug),
logError = colorLog(loggingSettings.error),
logWarn = colorLog(loggingSettings.warn),
logInfo = colorLog(loggingSettings.info),
logNotice = colorLog(loggingSettings.notice),
logLog = colorLog(loggingSettings.log),
log = colorLog(loggingSettings.TAS),
logCS = colorLog(loggingSettings.callstack),
logCSA = colorLog(loggingSettings.callstack_async),
registerCallstack = function(callstack,label){
var idx=_.findIndex(callstackRegistry,function(o){
return (_.difference(o.stack,callstack).length === _.difference(callstack,o.stack).length) &&
_.difference(o.stack,callstack).length === 0 &&
o.label === label;
});
if(-1 === idx){
idx=callstackRegistry.length;
callstackRegistry.push({
stack: callstack,
label: label
});
}
return idx;
},
setConfigOption = function(options){
var newconf =_.defaults(options,config);
newconf.logging=_.defaults(
(options && options.logging)||{},
config.logging
);
config=newconf;
},
isDebugMode = function(){
return config.debugMode;
},
debugMode = function(){
config.logging.debug=true;
config.debugMode = true;
},
getCallstack = function(){
var e = new Error('dummy'),
stack = _.map(_.rest(e.stack.replace(/^[^(]+?[\n$]/gm, '')
.replace(/^\s+at\s+/gm, '')
.replace(/^Object.<anonymous>\s*\(/gm, '{anonymous}()@')
.split('\n')),function(l){
return l.replace(/\s+.*$/,'');
});
return stack;
},
logCallstackSub = function(cs){
var matches, csa;
_.find(cs,function(line){
matches = line.match(/TAS_CALLSTACK_(\d+)/);
if(matches){
csa=callstackRegistry[matches[1]];
logCSA( '===================='+(csa.label ? '> '+csa.label+' <' : '')+'====================');
logCallstackSub(csa.stack);
return true;
}
logCS(line);
return false;
});
},
logCallstack = function(){
var cs;
if(config.debugMode){
cs = getCallstack();
cs.shift();
log('==============================> CALLSTACK <==============================');
logCallstackSub(cs);
log('=========================================================================');
}
},
wrapCallback = function (label, callback, context){
var callstack;
if('function' === typeof label){
context=callback;
callback=label;
label=undefined;
}
if(!config.debugMode){
return (function(cb,ctx){
return function(){
cb.apply(ctx||{},arguments);
};
}(callback,context));
}
callstack = getCallstack();
callstack.shift();
return (function(cb,ctx,cs,lbl){
var ctxref=registerCallstack(cs,lbl);
/*jshint -W054 */
return new Function('cb','ctx','TASlog',
"return function TAS_CALLSTACK_"+ctxref+"(){"+
"var start,end;"+
"TASlog('Entering: '+(cb.name||'(anonymous function)'));"+
"start=_.now();"+
"cb.apply(ctx||{},arguments);"+
"end=_.now();"+
"TASlog('Exiting: '+(cb.name||'(anonymous function)')+' :: '+(end-start)+'ms elapsed');"+
"};")(cb,ctx,log);
/*jshint +W054 */
}(callback,context,callstack,label));
},
prepareUpdate = function( attribute, value ){
queuedUpdates[attribute]=value;
},
applyQueuedUpdates = function() {
setAttrs(queuedUpdates);
queuedUpdates = {};
},
namesFromArgs = function(args,base){
return _.chain(args)
.reduce(function(memo,attr){
if('string' === typeof attr) {
memo.push(attr);
} else if(_.isArray(args) || _.isArguments(args)){
memo = namesFromArgs(attr,memo);
}
return memo;
},(_.isArray(base) && base) || [])
.uniq()
.value();
},
addId = function(obj,value){
Object.defineProperty(obj,'id',{
value: value,
writable: false,
enumerable: false
});
},
addProp = function(obj,prop,value,fullname){
(function(){
var pname=(_.contains(['S','F','I','D'],prop) ? '_'+prop : prop),
full_pname = fullname || prop,
pvalue=value;
_.each(['S','I','F'],function(p){
if( !_.has(obj,p)){
Object.defineProperty(obj, p, {
value: {},
enumerable: false,
readonly: true
});
}
});
if( !_.has(obj,'D')){
Object.defineProperty(obj, 'D', {
value: _.reduce(_.range(10),function(m,d){
Object.defineProperty(m, d, {
value: {},
enumerable: true,
readonly: true
});
return m;
},{}),
enumerable: false,
readonly: true
});
}
// Raw value
Object.defineProperty(obj, pname, {
enumerable: true,
set: function(v){
if(v!==pvalue) {
pvalue=v;
prepareUpdate(full_pname,v);
}
},
get: function(){
return pvalue;
}
});
// string value
Object.defineProperty(obj.S, pname, {
enumerable: true,
set: function(v){
var val=v.toString();
if(val !== pvalue) {
pvalue=val;
prepareUpdate(full_pname,val);
}
},
get: function(){
return pvalue.toString();
}
});
// int value
Object.defineProperty(obj.I, pname, {
enumerable: true,
set: function(v){
var val=parseInt(v,10) || 0;
if(val !== pvalue){
pvalue=val;
prepareUpdate(full_pname,val);
}
},
get: function(){
return parseInt(pvalue,10) || 0;
}
});
// float value
Object.defineProperty(obj.F, pname, {
enumerable: true,
set: function(v){
var val=parseFloat(v) || 0;
if(val !== pvalue) {
pvalue=val;
prepareUpdate(full_pname,val);
}
},
get: function(){
return parseFloat(pvalue) || 0;
}
});
_.each(_.range(10),function(d){
Object.defineProperty(obj.D[d], pname, {
enumerable: true,
set: function(v){
var val=(parseFloat(v) || 0).toFixed(d);
if(val !== pvalue){
pvalue=val;
prepareUpdate(full_pname,val);
}
},
get: function(){
return (parseFloat(pvalue) || 0).toFixed(d);
}
});
});
}());
},
repeating = function( section ) {
return (function(s){
var sectionName = s,
attrNames = [],
fieldNames = [],
operations = [],
after = [],
repAttrs = function TAS_Repeating_Attrs(){
attrNames = namesFromArgs(arguments,attrNames);
return this;
},
repFields = function TAS_Repeating_Fields(){
fieldNames = namesFromArgs(arguments,fieldNames);
return this;
},
repReduce = function TAS_Repeating_Reduce(func, initial, final, context) {
operations.push({
type: 'reduce',
func: (func && _.isFunction(func) && func) || _.noop,
memo: (_.isUndefined(initial) && 0) || initial,
final: (final && _.isFunction(final) && final) || _.noop,
context: context || {}
});
return this;
},
repMap = function TAS_Repeating_Map(func, final, context) {
operations.push({
type: 'map',
func: (func && _.isFunction(func) && func) || _.noop,
final: (final && _.isFunction(final) && final) || _.noop,
context: context || {}
});
return this;
},
repEach = function TAS_Repeating_Each(func, final, context) {
operations.push({
type: 'each',
func: (func && _.isFunction(func) && func) || _.noop,
final: (final && _.isFunction(final) && final) || _.noop,
context: context || {}
});
return this;
},
repTap = function TAS_Repeating_Tap(final, context) {
operations.push({
type: 'tap',
final: (final && _.isFunction(final) && final) || _.noop,
context: context || {}
});
return this;
},
repAfter = function TAS_Repeating_After(callback,context) {
after.push({
callback: (callback && _.isFunction(callback) && callback) || _.noop,
context: context || {}
});
return this;
},
repExecute = function TAS_Repeating_Execute(callback,context){
var rowSet = {},
attrSet = {},
fieldIds = [],
fullFieldNames = [];
repAfter(callback,context);
// call each operation per row.
// call each operation's final
getSectionIDs("repeating_"+sectionName,function(ids){
fieldIds = ids;
fullFieldNames = _.reduce(fieldIds,function(memo,id){
return memo.concat(_.map(fieldNames,function(name){
return 'repeating_'+sectionName+'_'+id+'_'+name;
}));
},[]);
getAttrs( _.uniq(attrNames.concat(fullFieldNames)), function(values){
_.each(attrNames,function(aname){
if(values.hasOwnProperty(aname)){
addProp(attrSet,aname,values[aname]);
}
});
rowSet = _.reduce(fieldIds,function(memo,id){
var r={};
addId(r,id);
_.each(fieldNames,function(name){
var fn = 'repeating_'+sectionName+'_'+id+'_'+name;
addProp(r,name,values[fn],fn);
});
memo[id]=r;
return memo;
},{});
_.each(operations,function(op){
var res;
switch(op.type){
case 'tap':
_.bind(op.final,op.context,rowSet,attrSet)();
break;
case 'each':
_.each(rowSet,function(r){
_.bind(op.func,op.context,r,attrSet,r.id,rowSet)();
});
_.bind(op.final,op.context,rowSet,attrSet)();
break;
case 'map':
res = _.map(rowSet,function(r){
return _.bind(op.func,op.context,r,attrSet,r.id,rowSet)();
});
_.bind(op.final,op.context,res,rowSet,attrSet)();
break;
case 'reduce':
res = op.memo;
_.each(rowSet,function(r){
res = _.bind(op.func,op.context,res,r,attrSet,r.id,rowSet)();
});
_.bind(op.final,op.context,res,rowSet,attrSet)();
break;
}
});
// finalize attrs
applyQueuedUpdates();
_.each(after,function(op){
_.bind(op.callback,op.context)();
});
});
});
};
return {
attrs: repAttrs,
attr: repAttrs,
column: repFields,
columns: repFields,
field: repFields,
fields: repFields,
reduce: repReduce,
inject: repReduce,
foldl: repReduce,
map: repMap,
collect: repMap,
each: repEach,
forEach: repEach,
tap: repTap,
'do': repTap,
after: repAfter,
last: repAfter,
done: repAfter,
execute: repExecute,
go: repExecute,
run: repExecute
};
}(section));
},
repeatingSimpleSum = function(section, field, destination){
repeating(section)
.attr(destination)
.field(field)
.reduce(function(m,r){
return m + (r.F[field]);
},0,function(t,r,a){
a.S[destination]=t;
})
.execute();
};
/* eslint-disable no-console */
console.log('%c•.¸¸.•*´¨`*•.¸¸.•*´¨`*•.¸ The Aaron Sheet v'+version+' ¸.•*´¨`*•.¸¸.•*´¨`*•.¸¸.•','background: linear-gradient(to right,green,white,white,green); color:black;text-shadow: 0 0 8px white;');
console.log('%c•.¸¸.•*´¨`*•.¸¸.•*´¨`*•.¸ Last update: '+(new Date(lastUpdate*1000))+' ¸.•*´¨`*•.¸¸.•*´¨`*•.¸¸.•','background: linear-gradient(to right,green,white,white,green); color:black;text-shadow: 0 0 8px white;');
/* eslint-enable no-console */
return {
/* Repeating Sections */
repeatingSimpleSum: repeatingSimpleSum,
repeating: repeating,
/* Configuration */
config: setConfigOption,
/* Debugging */
callback: wrapCallback,
callstack: logCallstack,
debugMode: debugMode,
isDebugMode: isDebugMode,
_fn: wrapCallback,
/* Logging */
debug: logDebug,
error: logError,
warn: logWarn,
info: logInfo,
notice: logNotice,
log: logLog
};
}());
/* ---- END: TheAaronSheet.js ---- */
on("change:gmroll", function () {
getAttrs(["gmroll"], function (values) {
let gmroll = values.gmroll || "";
switch (gmroll) {
case "nogm":
setAttrs({ abilityroll: "/me" });
break;
case "gm":
setAttrs({ abilityroll: "/w GM **@{character_name}**" });
break;
}
});
});
on("change:ko", function() {
getAttrs(["ko"], function(values) {
setAttrs({
leben: Math.floor(10 + parseInt(values.ko) * 5)
});
setAttrs({
leben_max: Math.floor(10 + parseInt(values.ko) * 5)
});
});
});
on("change:ruestungswert", function() {
getAttrs(["ruestungswert"], function(values) {
setAttrs({
ruestung: parseInt(values.ruestungswert)
});
});
});
on('change:repeating_advancements', function () {
TAS.repeating('advancements')
.attrs('XPSpent')
.fields('advancement1xp', 'advancement2xp', 'advancement3xp')
.reduce(function (memo, row, attrSet, id, rowSet) {
memo.total += row.I.advancement1xp;
memo.total += row.I.advancement2xp;
memo.total += row.I.advancement3xp;
return memo;
}, { total: 0 }, function (memo, rowSet, attrSet) {
attrSet.I.XPSpent = memo.total;
})
.execute();
});
</script>