diff --git a/BESM4eExtras/BESM4eExtras.css b/BESM4eExtras/BESM4eExtras.css index d65aa97135..44bc04cbf2 100644 --- a/BESM4eExtras/BESM4eExtras.css +++ b/BESM4eExtras/BESM4eExtras.css @@ -1,5 +1,5 @@ /* === VERSION === */ -/* 1.4.7 */ +/* 1.5.0 */ /* === GENERAL === */ .charsheet { @@ -99,6 +99,12 @@ input.sheet-dynamic:checked ~ div.sheet-body { font-weight: bold; } +button.sheet-multi-select[type="action"] { + width: 85%; + height: 1.5em; + font-size: 12px; +} + /*============= TABS =============*/ div.sheet-tab-content @@ -853,12 +859,12 @@ span.sheet-targeted-inactive{ cursor: help; } .sheet-tooltip strong { line-height: 30px; } -.sheet-tooltip:hover span { +.sheet-tooltip:hover span.sheet-tooltip { display: block; position: absolute; } .sheet-tooltip:hover { text-decoration: none; } -.sheet-tooltip span { +.sheet-tooltip span.sheet-tooltip { display: none; border-radius: 4px; box-shadow: 2px 2px 3px #ccc; @@ -1480,6 +1486,7 @@ input.sheet-theme[value="1"]:checked ~ div > div > div > h5 > div > div > div > input.sheet-theme[value="1"]:checked ~ div > div > div > h5 > div > div > div > div > div > div > div > h4, input.sheet-theme[value="1"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > h4, input.sheet-theme[value="1"]:checked ~ div > div > div > div > h4 > div > div > div > div > span, +input.sheet-theme[value="1"]:checked ~ div > div > div > div > div > div > div > div > div > h4 > div > div > span, /*Skill Template Tooltip*/ input.sheet-theme[value="1"]:checked ~ div > div > div > h5 > div > div > div > div > div > h3 > div > div > div > div > h3 > span, input.sheet-theme[value="1"]:checked ~ div > div > div > div > h4 > div > div > div > div > div > div > div > div > div > div > span, @@ -1490,6 +1497,7 @@ input.sheet-theme[value="1"]:checked ~ div > div > div > div > div > div > div > input.sheet-theme[value="1"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4, input.sheet-theme[value="1"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4, input.sheet-theme[value="1"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4, +input.sheet-theme[value="1"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4, input.sheet-theme[value="1"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4 > div > div > div > div > span, input.sheet-theme[value="1"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4 > div > div > div > div > div > div, input.sheet-theme[value="1"]:checked ~ div > div > div > button[type="action"], @@ -1502,12 +1510,14 @@ input.sheet-theme[value="1"]:checked ~ div > div > div > div > div > div > div > input.sheet-theme[value="1"]:checked ~ div > div > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="1"]:checked ~ div > div > div > h5 > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="1"]:checked ~ div > div > div > div > div > div > div > div > div > div > button[type="action"], +input.sheet-theme[value="1"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="1"]:checked ~ div > div > div > div > div > h4 > div > div > div > div > div > button[type="action"], input.sheet-theme[value="1"]:checked ~ div > div > div > div > div > div > h4 > div > div > div > div > div > button[type="action"], input.sheet-theme[value="1"]:checked ~ div > div > div > div > div > h4 > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="1"]:checked ~ div > div > div > div > div > div > div > div > div > h4 > span > div > div > button[type="action"], input.sheet-theme[value="1"]:checked ~ div > div > div > div > div > div > h4 > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="1"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > button[type="action"], +input.sheet-theme[value="1"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4 > div > div > button[type="action"], input.sheet-theme[value="1"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > button[type="action"] { background: #d77979; @@ -1531,6 +1541,7 @@ input.sheet-theme[value="2"]:checked ~ div > div > div > h5 > div > div > div > input.sheet-theme[value="2"]:checked ~ div > div > div > h5 > div > div > div > div > div > div > div > h4, input.sheet-theme[value="2"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > h4, input.sheet-theme[value="2"]:checked ~ div > div > div > div > h4 > div > div > div > div > span, +input.sheet-theme[value="2"]:checked ~ div > div > div > div > div > div > div > div > div > h4 > div > div > span, /*Skill Template Tooltip*/ input.sheet-theme[value="2"]:checked ~ div > div > div > h5 > div > div > div > div > div > h3 > div > div > div > div > h3 > span, input.sheet-theme[value="2"]:checked ~ div > div > div > div > h4 > div > div > div > div > div > div > div > div > div > div > span, @@ -1541,6 +1552,7 @@ input.sheet-theme[value="2"]:checked ~ div > div > div > div > div > div > div > input.sheet-theme[value="2"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4, input.sheet-theme[value="2"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4, input.sheet-theme[value="2"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4, +input.sheet-theme[value="2"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4, input.sheet-theme[value="2"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4 > div > div > div > div > span, input.sheet-theme[value="2"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4 > div > div > div > div > div > div, input.sheet-theme[value="2"]:checked ~ div > div > div > button[type="action"], @@ -1553,12 +1565,14 @@ input.sheet-theme[value="2"]:checked ~ div > div > div > div > div > div > div > input.sheet-theme[value="2"]:checked ~ div > div > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="2"]:checked ~ div > div > div > h5 > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="2"]:checked ~ div > div > div > div > div > div > div > div > div > div > button[type="action"], +input.sheet-theme[value="2"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="2"]:checked ~ div > div > div > div > div > h4 > div > div > div > div > div > button[type="action"], input.sheet-theme[value="2"]:checked ~ div > div > div > div > div > div > h4 > div > div > div > div > div > button[type="action"], input.sheet-theme[value="2"]:checked ~ div > div > div > div > div > h4 > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="2"]:checked ~ div > div > div > div > div > div > div > div > div > h4 > span > div > div > button[type="action"], input.sheet-theme[value="2"]:checked ~ div > div > div > div > div > div > h4 > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="2"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > button[type="action"], +input.sheet-theme[value="2"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4 > div > div > button[type="action"], input.sheet-theme[value="2"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > button[type="action"] { background: #F4B183; @@ -1582,6 +1596,7 @@ input.sheet-theme[value="3"]:checked ~ div > div > div > h5 > div > div > div > input.sheet-theme[value="3"]:checked ~ div > div > div > h5 > div > div > div > div > div > div > div > h4, input.sheet-theme[value="3"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > h4, input.sheet-theme[value="3"]:checked ~ div > div > div > div > h4 > div > div > div > div > span, +input.sheet-theme[value="3"]:checked ~ div > div > div > div > div > div > div > div > div > h4 > div > div > span, /*Skill Template Tooltip*/ input.sheet-theme[value="3"]:checked ~ div > div > div > h5 > div > div > div > div > div > h3 > div > div > div > div > h3 > span, input.sheet-theme[value="3"]:checked ~ div > div > div > div > h4 > div > div > div > div > div > div > div > div > div > div > span, @@ -1592,6 +1607,7 @@ input.sheet-theme[value="3"]:checked ~ div > div > div > div > div > div > div > input.sheet-theme[value="3"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4, input.sheet-theme[value="3"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4, input.sheet-theme[value="3"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4, +input.sheet-theme[value="3"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4, input.sheet-theme[value="3"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4 > div > div > div > div > span, input.sheet-theme[value="3"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4 > div > div > div > div > div > div, input.sheet-theme[value="3"]:checked ~ div > div > div > button[type="action"], @@ -1604,12 +1620,14 @@ input.sheet-theme[value="3"]:checked ~ div > div > div > div > div > div > div > input.sheet-theme[value="3"]:checked ~ div > div > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="3"]:checked ~ div > div > div > h5 > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="3"]:checked ~ div > div > div > div > div > div > div > div > div > div > button[type="action"], +input.sheet-theme[value="3"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="3"]:checked ~ div > div > div > div > div > h4 > div > div > div > div > div > button[type="action"], input.sheet-theme[value="3"]:checked ~ div > div > div > div > div > div > h4 > div > div > div > div > div > button[type="action"], input.sheet-theme[value="3"]:checked ~ div > div > div > div > div > h4 > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="3"]:checked ~ div > div > div > div > div > div > div > div > div > h4 > span > div > div > button[type="action"], input.sheet-theme[value="3"]:checked ~ div > div > div > div > div > div > h4 > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="3"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > button[type="action"], +input.sheet-theme[value="3"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4 > div > div > button[type="action"], input.sheet-theme[value="3"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > button[type="action"] { background: #FFD966; @@ -1633,6 +1651,7 @@ input.sheet-theme[value="4"]:checked ~ div > div > div > h5 > div > div > div > input.sheet-theme[value="4"]:checked ~ div > div > div > h5 > div > div > div > div > div > div > div > h4, input.sheet-theme[value="4"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > h4, input.sheet-theme[value="4"]:checked ~ div > div > div > div > h4 > div > div > div > div > span, +input.sheet-theme[value="4"]:checked ~ div > div > div > div > div > div > div > div > div > h4 > div > div > span, /*Skill Template Tooltip*/ input.sheet-theme[value="4"]:checked ~ div > div > div > h5 > div > div > div > div > div > h3 > div > div > div > div > h3 > span, input.sheet-theme[value="4"]:checked ~ div > div > div > div > h4 > div > div > div > div > div > div > div > div > div > div > span, @@ -1643,6 +1662,7 @@ input.sheet-theme[value="4"]:checked ~ div > div > div > div > div > div > div > input.sheet-theme[value="4"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4, input.sheet-theme[value="4"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4, input.sheet-theme[value="4"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4, +input.sheet-theme[value="4"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4, input.sheet-theme[value="4"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4 > div > div > div > div > span, input.sheet-theme[value="4"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4 > div > div > div > div > div > div, input.sheet-theme[value="4"]:checked ~ div > div > div > button[type="action"], @@ -1655,12 +1675,14 @@ input.sheet-theme[value="4"]:checked ~ div > div > div > div > div > div > div > input.sheet-theme[value="4"]:checked ~ div > div > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="4"]:checked ~ div > div > div > h5 > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="4"]:checked ~ div > div > div > div > div > div > div > div > div > div > button[type="action"], +input.sheet-theme[value="4"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="4"]:checked ~ div > div > div > div > div > h4 > div > div > div > div > div > button[type="action"], input.sheet-theme[value="4"]:checked ~ div > div > div > div > div > div > h4 > div > div > div > div > div > button[type="action"], input.sheet-theme[value="4"]:checked ~ div > div > div > div > div > h4 > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="4"]:checked ~ div > div > div > div > div > div > div > div > div > h4 > span > div > div > button[type="action"], input.sheet-theme[value="4"]:checked ~ div > div > div > div > div > div > h4 > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="4"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > button[type="action"], +input.sheet-theme[value="4"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4 > div > div > button[type="action"], input.sheet-theme[value="4"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > button[type="action"] { background: #A9D18E; @@ -1684,6 +1706,7 @@ input.sheet-theme[value="5"]:checked ~ div > div > div > h5 > div > div > div > input.sheet-theme[value="5"]:checked ~ div > div > div > h5 > div > div > div > div > div > div > div > h4, input.sheet-theme[value="5"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > h4, input.sheet-theme[value="5"]:checked ~ div > div > div > div > h4 > div > div > div > div > span, +input.sheet-theme[value="5"]:checked ~ div > div > div > div > div > div > div > div > div > h4 > div > div > span, /*Skill Template Tooltip*/ input.sheet-theme[value="5"]:checked ~ div > div > div > h5 > div > div > div > div > div > h3 > div > div > div > div > h3 > span, input.sheet-theme[value="5"]:checked ~ div > div > div > div > h4 > div > div > div > div > div > div > div > div > div > div > span, @@ -1694,6 +1717,7 @@ input.sheet-theme[value="5"]:checked ~ div > div > div > div > div > div > div > input.sheet-theme[value="5"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4, input.sheet-theme[value="5"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4, input.sheet-theme[value="5"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4, +input.sheet-theme[value="5"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4, input.sheet-theme[value="5"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4 > div > div > div > div > span, input.sheet-theme[value="5"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4 > div > div > div > div > div > div, input.sheet-theme[value="5"]:checked ~ div > div > div > button[type="action"], @@ -1706,12 +1730,14 @@ input.sheet-theme[value="5"]:checked ~ div > div > div > div > div > div > div > input.sheet-theme[value="5"]:checked ~ div > div > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="5"]:checked ~ div > div > div > h5 > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="5"]:checked ~ div > div > div > div > div > div > div > div > div > div > button[type="action"], +input.sheet-theme[value="5"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="5"]:checked ~ div > div > div > div > div > h4 > div > div > div > div > div > button[type="action"], input.sheet-theme[value="5"]:checked ~ div > div > div > div > div > div > h4 > div > div > div > div > div > button[type="action"], input.sheet-theme[value="5"]:checked ~ div > div > div > div > div > h4 > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="5"]:checked ~ div > div > div > div > div > div > div > div > div > h4 > span > div > div > button[type="action"], input.sheet-theme[value="5"]:checked ~ div > div > div > div > div > div > h4 > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="5"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > button[type="action"], +input.sheet-theme[value="5"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4 > div > div > button[type="action"], input.sheet-theme[value="5"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > button[type="action"] { background: #8FAADC; @@ -1735,6 +1761,7 @@ input.sheet-theme[value="6"]:checked ~ div > div > div > h5 > div > div > div > input.sheet-theme[value="6"]:checked ~ div > div > div > h5 > div > div > div > div > div > div > div > h4, input.sheet-theme[value="6"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > h4, input.sheet-theme[value="6"]:checked ~ div > div > div > div > h4 > div > div > div > div > span, +input.sheet-theme[value="6"]:checked ~ div > div > div > div > div > div > div > div > div > h4 > div > div > span, /*Skill Template Tooltip*/ input.sheet-theme[value="6"]:checked ~ div > div > div > h5 > div > div > div > div > div > h3 > div > div > div > div > h3 > span, input.sheet-theme[value="6"]:checked ~ div > div > div > div > h4 > div > div > div > div > div > div > div > div > div > div > span, @@ -1745,6 +1772,7 @@ input.sheet-theme[value="6"]:checked ~ div > div > div > div > div > div > div > input.sheet-theme[value="6"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4, input.sheet-theme[value="6"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4, input.sheet-theme[value="6"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4, +input.sheet-theme[value="6"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4, input.sheet-theme[value="6"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4 > div > div > div > div > span, input.sheet-theme[value="6"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4 > div > div > div > div > div > div, input.sheet-theme[value="6"]:checked ~ div > div > div > button[type="action"], @@ -1757,12 +1785,14 @@ input.sheet-theme[value="6"]:checked ~ div > div > div > div > div > div > div > input.sheet-theme[value="6"]:checked ~ div > div > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="6"]:checked ~ div > div > div > h5 > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="6"]:checked ~ div > div > div > div > div > div > div > div > div > div > button[type="action"], +input.sheet-theme[value="6"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="6"]:checked ~ div > div > div > div > div > h4 > div > div > div > div > div > button[type="action"], input.sheet-theme[value="6"]:checked ~ div > div > div > div > div > div > h4 > div > div > div > div > div > button[type="action"], input.sheet-theme[value="6"]:checked ~ div > div > div > div > div > h4 > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="6"]:checked ~ div > div > div > div > div > div > div > div > div > h4 > span > div > div > button[type="action"], input.sheet-theme[value="6"]:checked ~ div > div > div > div > div > div > h4 > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="6"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > button[type="action"], +input.sheet-theme[value="6"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4 > div > div > button[type="action"], input.sheet-theme[value="6"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > button[type="action"] { background: #A162D0; @@ -1786,6 +1816,7 @@ input.sheet-theme[value="7"]:checked ~ div > div > div > h5 > div > div > div > input.sheet-theme[value="7"]:checked ~ div > div > div > h5 > div > div > div > div > div > div > div > h4, input.sheet-theme[value="7"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > h4, input.sheet-theme[value="7"]:checked ~ div > div > div > div > h4 > div > div > div > div > span, +input.sheet-theme[value="7"]:checked ~ div > div > div > div > div > div > div > div > div > h4 > div > div > span, /*Skill Template Tooltip*/ input.sheet-theme[value="7"]:checked ~ div > div > div > h5 > div > div > div > div > div > h3 > div > div > div > div > h3 > span, input.sheet-theme[value="7"]:checked ~ div > div > div > div > h4 > div > div > div > div > div > div > div > div > div > div > span, @@ -1796,6 +1827,7 @@ input.sheet-theme[value="7"]:checked ~ div > div > div > div > div > div > div > input.sheet-theme[value="7"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4, input.sheet-theme[value="7"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4, input.sheet-theme[value="7"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4, +input.sheet-theme[value="7"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4, input.sheet-theme[value="7"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4 > div > div > div > div > span, input.sheet-theme[value="7"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4 > div > div > div > div > div > div, input.sheet-theme[value="7"]:checked ~ div > div > div > button[type="action"], @@ -1808,12 +1840,14 @@ input.sheet-theme[value="7"]:checked ~ div > div > div > div > div > div > div > input.sheet-theme[value="7"]:checked ~ div > div > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="7"]:checked ~ div > div > div > h5 > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="7"]:checked ~ div > div > div > div > div > div > div > div > div > div > button[type="action"], +input.sheet-theme[value="7"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="7"]:checked ~ div > div > div > div > div > h4 > div > div > div > div > div > button[type="action"], input.sheet-theme[value="7"]:checked ~ div > div > div > div > div > div > h4 > div > div > div > div > div > button[type="action"], input.sheet-theme[value="7"]:checked ~ div > div > div > div > div > h4 > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="7"]:checked ~ div > div > div > div > div > div > div > div > div > h4 > span > div > div > button[type="action"], input.sheet-theme[value="7"]:checked ~ div > div > div > div > div > div > h4 > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="7"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > button[type="action"], +input.sheet-theme[value="7"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4 > div > div > button[type="action"], input.sheet-theme[value="7"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > button[type="action"] { background: #AFABAB; @@ -1837,6 +1871,7 @@ input.sheet-theme[value="8"]:checked ~ div > div > div > h5 > div > div > div > input.sheet-theme[value="8"]:checked ~ div > div > div > h5 > div > div > div > div > div > div > div > h4, input.sheet-theme[value="8"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > h4, input.sheet-theme[value="8"]:checked ~ div > div > div > div > h4 > div > div > div > div > span, +input.sheet-theme[value="8"]:checked ~ div > div > div > div > div > div > div > div > div > h4 > div > div > span, /*Skill Template Tooltip*/ input.sheet-theme[value="8"]:checked ~ div > div > div > h5 > div > div > div > div > div > h3 > div > div > div > div > h3 > span, input.sheet-theme[value="8"]:checked ~ div > div > div > div > h4 > div > div > div > div > div > div > div > div > div > div > span, @@ -1847,6 +1882,7 @@ input.sheet-theme[value="8"]:checked ~ div > div > div > div > div > div > div > input.sheet-theme[value="8"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4, input.sheet-theme[value="8"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4, input.sheet-theme[value="8"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4, +input.sheet-theme[value="8"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4, input.sheet-theme[value="8"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4 > div > div > div > div > span, input.sheet-theme[value="8"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4 > div > div > div > div > div > div, input.sheet-theme[value="8"]:checked ~ div > div > div > button[type="action"], @@ -1859,12 +1895,14 @@ input.sheet-theme[value="8"]:checked ~ div > div > div > div > div > div > div > input.sheet-theme[value="8"]:checked ~ div > div > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="8"]:checked ~ div > div > div > h5 > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="8"]:checked ~ div > div > div > div > div > div > div > div > div > div > button[type="action"], +input.sheet-theme[value="8"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="8"]:checked ~ div > div > div > div > div > h4 > div > div > div > div > div > button[type="action"], input.sheet-theme[value="8"]:checked ~ div > div > div > div > div > div > h4 > div > div > div > div > div > button[type="action"], input.sheet-theme[value="8"]:checked ~ div > div > div > div > div > h4 > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="8"]:checked ~ div > div > div > div > div > div > div > div > div > h4 > span > div > div > button[type="action"], input.sheet-theme[value="8"]:checked ~ div > div > div > div > div > div > h4 > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="8"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > button[type="action"], +input.sheet-theme[value="8"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4 > div > div > button[type="action"], input.sheet-theme[value="8"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > button[type="action"] { background: #595959; @@ -1888,6 +1926,7 @@ input.sheet-theme[value="9"]:checked ~ div > div > div > h5 > div > div > div > input.sheet-theme[value="9"]:checked ~ div > div > div > h5 > div > div > div > div > div > div > div > h4, input.sheet-theme[value="9"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > h4, input.sheet-theme[value="9"]:checked ~ div > div > div > div > h4 > div > div > div > div > span, +input.sheet-theme[value="9"]:checked ~ div > div > div > div > div > div > div > div > div > h4 > div > div > span, /*Skill Template Tooltip*/ input.sheet-theme[value="9"]:checked ~ div > div > div > h5 > div > div > div > div > div > h3 > div > div > div > div > h3 > span, input.sheet-theme[value="9"]:checked ~ div > div > div > div > h4 > div > div > div > div > div > div > div > div > div > div > span, @@ -1898,6 +1937,7 @@ input.sheet-theme[value="9"]:checked ~ div > div > div > div > div > div > div > input.sheet-theme[value="9"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4, input.sheet-theme[value="9"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4, input.sheet-theme[value="9"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4, +input.sheet-theme[value="9"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4, input.sheet-theme[value="9"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4 > div > div > div > div > span, input.sheet-theme[value="9"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4 > div > div > div > div > div > div, input.sheet-theme[value="9"]:checked ~ div > div > div > button[type="action"], @@ -1910,12 +1950,14 @@ input.sheet-theme[value="9"]:checked ~ div > div > div > div > div > div > div > input.sheet-theme[value="9"]:checked ~ div > div > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="9"]:checked ~ div > div > div > h5 > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="9"]:checked ~ div > div > div > div > div > div > div > div > div > div > button[type="action"], +input.sheet-theme[value="9"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="9"]:checked ~ div > div > div > div > div > h4 > div > div > div > div > div > button[type="action"], input.sheet-theme[value="9"]:checked ~ div > div > div > div > div > div > h4 > div > div > div > div > div > button[type="action"], input.sheet-theme[value="9"]:checked ~ div > div > div > div > div > h4 > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="9"]:checked ~ div > div > div > div > div > div > div > div > div > h4 > span > div > div > button[type="action"], input.sheet-theme[value="9"]:checked ~ div > div > div > div > div > div > h4 > div > div > div > div > div > div > div > button[type="action"], input.sheet-theme[value="9"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > button[type="action"], +input.sheet-theme[value="9"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > h4 > div > div > button[type="action"], input.sheet-theme[value="9"]:checked ~ div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > div > button[type="action"] { background: #D9D9D9; @@ -2293,13 +2335,13 @@ input.sheet-stats:checked + button.sheet-major-stat { } button.sheet-allaspects-stat-inactive[type="action"], -button.sheet-condition[type="action"], +button.sheet-push-button[type="action"], h4.sheet-protection { opacity: 0.65; } input.sheet-protectionstate:checked + h4.sheet-protection, -input.sheet-condition:checked + button.sheet-condition { +input.sheet-push-button:checked + button.sheet-push-button { opacity: 1; } @@ -2307,7 +2349,7 @@ input.sheet-block-switch, input.sheet-stats, input.sheet-weapon, input.sheet-protectionstate, -input.sheet-condition { +input.sheet-push-button { opacity: 0; left: -9999px; position: absolute; @@ -2327,6 +2369,14 @@ div.sheet-flex-container-evenlyspace { align-content: space-around; } +div.sheet-flex-container-wrap { + display: flex; + justify-content: space-between; + flex-flow: row wrap; + align-content: space-around; + gap: 3px; +} + div.sheet-flex-container-spacearound { display: flex; justify-content: space-around; diff --git a/BESM4eExtras/BESM4eExtras.html b/BESM4eExtras/BESM4eExtras.html index d168ba9bf2..512197880b 100644 --- a/BESM4eExtras/BESM4eExtras.html +++ b/BESM4eExtras/BESM4eExtras.html @@ -30,7 +30,7 @@

Sheet Options

Sheet Version - +

Sheet Type @@ -285,84 +285,84 @@
Conditions
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
- -
@@ -1526,10 +1526,13 @@

-
+
+ + +

@@ -1537,10 +1540,13 @@

-
+
+ + +
  @@ -2823,90 +2829,82 @@
-
-
- -
-
- -
-
-
-
- - -
-
-
- -
-

- Name - - -

-
-
-

- Attribute - - -

-
-
-

- Characteristic - - -

-
- - - - - - - - - - -
- -
- -
+
+
- y -
-
-
- - -
-
-
-
-
-

- Details -

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

+ Name + + +

+
+
+

+ Attribute + + +

+
+
+

+ Characteristic + + +

+
+ + + + + + + + + +
+ +
+ +
+ +
+ +
+
+
+
+ +
+
+
+
@@ -2966,6 +2964,116 @@
+ +
+ +
+
+
+

+ Unaffected Attributes +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+

+
+
+
@@ -3042,11 +3150,84 @@
+
+
+ +
+
+
+

+ Damage Type + +

+
+
+
+
+ +
+
+
+

+ Damage Type + +

+
+
+
+
+ +
+
+
+

+ Damage Type + + +

+
+
+
+
+
+ +
+ +

- Damage Type - + Damage Category +

@@ -3155,20 +3336,20 @@
- +
@@ -3250,6 +3431,53 @@
+ +
+ +
+
+
+

+ Unaffected Weapon + +

+
+
+
@@ -3286,20 +3514,7 @@
- +
@@ -4059,7 +4274,38 @@
- + +
@@ -4186,6 +4432,7 @@

Enhancements

+ @@ -4250,28 +4497,62 @@ + + + + + + + +
-
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
@@ -4370,30 +4651,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -4471,15 +4812,49 @@
-
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -4506,6 +4881,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -4516,34 +4915,100 @@
-
-
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -4551,10 +5016,55 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -4562,45 +5072,179 @@
-
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -4648,27 +5292,113 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -4679,6 +5409,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -4845,12 +5595,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -4873,6 +5639,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
@@ -4919,6 +5697,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -4972,6 +5770,174 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

@@ -5112,6 +6078,14 @@ + + + + + + + +
@@ -5120,13 +6094,17 @@
-
-
+
+
+
+
+
+
@@ -5195,13 +6173,17 @@
+
+
+
+
-
-
+
+
@@ -5356,10 +6338,12 @@
+
@@ -5398,6 +6382,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

@@ -6543,11 +7567,18 @@ const rollable_attributes_regex = /(healing|inspire|unaffected|exorcism|illusion|metamorphosis|mimic|mindcontrol|nullify|powerflux|powervariation|projection|sixthsense|supersense|telepathy|transfer|transmute)/i; const targetable_attributes_regex = /(healing|exorcism|illusion|metamorphosis|mimic|mindcontrol|nullify|telepathy|transfer)/i; const dymanicGrouRegex = /(flux|variation)/i; - + const controlable_environments_array = ['arid', 'clouds', 'cold', 'darkness', 'heat', 'humidity', 'light', 'liquid', 'gaseous', 'smell', 'sound', 'storms', 'unique', 'vacuum']; + const sixthsense_phenomena_array = ['attrsrc', 'danger', 'dimensions', 'elements', 'emotions', 'extraplanarbeings', 'illusions', 'morality', 'objects', 'placesofpower', 'uniquephenomena']; + const special_movements_array = ['balance', 'catlike', 'fast', 'lightfooted', 'slithering', 'swinging', 'untrackable', 'wallbouncing', 'wallcrawling', 'waterwalking', 'zendirection']; + const undetectable_methods_array = ['hearing', 'sight', 'smell', 'taste', 'touch', 'echolocation', 'infrasound', 'radio', 'ultrasound', 'infrared', 'ultraviolet', 'x-ray', 'odorant', 'tastant', 'magnetic', 'radiation', 'seismic', 'thermal']; + const unaffected_attrs_array = ['alternateform','alternateidentity','changestate','dataaccess','dimensionwalk','dynamicpowers','exorcism','features','forcefield','illusion','metamorphosis','mindcontrol','nullify','plantcontrol','portal','projection','sensoryblock','sizechange','telekinesis','telepathy','teleport','transmute','undetectable','weapon']; + const unaffected_states_array = ['alternateformstate', 'alternateidentitystate', 'changestatestate', 'dataaccessstate', 'dimensionwalkstate', 'dynamicpowersstate', 'exorcismstate', 'featuresstate', 'forcefieldstate', 'illusionstate', 'metamorphosisstate', 'mindcontrolstate', 'nullifystate', 'plantcontrolstate', 'portalstate', 'projectionstate', 'sensoryblockstate', 'sizechangestate', 'telekinesisstate', 'telepathystate', 'teleportstate', 'transmutestate', 'undetectablestate', 'weaponstate']; + const non_actionable_events = ['costperlevel','visible','new','source','characteristic','rollable','attrdefecttoggle','damagetype']; + const upgrade_to_1_5_0_array = ["upgraded_1_5_0"]; const upgrade_to_1_3_1_array = ["upgraded_1_3_1", "attrdb"]; const upgrade_to_1_2_2_array = ["upgraded_1_2_2", "name", "charactername"]; const global_initialized_array = ["global_initialized"]; - const on_sheet_open_array = _.chain([upgrade_to_1_3_1_array, upgrade_to_1_2_2_array, global_initialized_array]) + const on_sheet_open_array = _.chain([upgrade_to_1_5_0_array, upgrade_to_1_3_1_array, upgrade_to_1_2_2_array, global_initialized_array]) .flatten() .value(); @@ -6585,6 +7616,15 @@ return result; } + function get1or2andHalfor5(level) { + const oneTwoAndHalfOrFive = mod => + mod == 0 ? 1 : + mod == 1 ? 2.5 : + mod == 2 ? 5 : + 0; + return oneTwoAndHalfOrFive(level % 3); + } + function setPreviousValue(eventInfo){ eventInfo.previousValue = eventInfo.previousValue == eventInfo.newValue ? Number.isInteger(eventInfo.newValue) ? 0 : @@ -6600,6 +7640,7 @@ function doUpgrade(value, setObj){ upgradeTo_1_2_2(value, setObj); upgradeTo_1_3_1(value, setObj); + upgradeTo_1_5_0(value, setObj); } function upgradeTo_1_2_2(value, setObj){ @@ -6623,16 +7664,46 @@ _.each(defectdb, defect => { const rowID = defect.source; const rank = parseInt(defect.rank) || 0; - console.log(`[upgradeTo_1_3_1()] defect = ${defect.name}`); - console.log(`[upgradeTo_1_3_1()] rowID = ${rowID}`); - console.log(`[upgradeTo_1_3_1()] rank = ${rank}`); setObj[`repeating_attr_${rowID}_rank`] = rank; }); - console.log(`[upgradeTo_1_3_1()] setObj:`); console.log(setObj); setObj.upgraded_1_3_1 = true; } } + function upgradeTo_1_5_0(value, setObj){ + if(value.upgraded_1_5_0 == true){ + return; + }else{ + const limiters_array = ['activation','ammo','assisted','backblast','backlash','bothdirections','broadcategory','capped','category','category','categoty','charges','concentration','consumable','delay','dependent','deplete','detectable','emotional','environmental','equipment','exclusive','fieldless','focused','focuseddamage','gap','glide','group','hands','imbue','impacting','inaccurate','ingest','intensity','internal','irreversible','localized','maintain','maximum','nonadjacent','nonpenetrating','nostun','object','permanent','proportionaldamage','recovery','roadbound','semipermanent','skillflux','skim','specialized','specificattribute','spread','stoppable','targeteddamage','toxic','unique','unpredictable','unreliable']; + getSectionIDs('attr', attrIDs => { + const attr_customization_array = _.map(attrIDs, id => { + return `repeating_attr_${id}_customizations`; + }); + const attr_names_array = _.map(attrIDs, id => { + return `repeating_attr_${id}_attribute`; + }); + const getAttrsArray = attr_customization_array.concat(attr_names_array); + getAttrs(getAttrsArray, v => { + _.each(attr_customization_array, c => { + const customizations = _.each(v[`${c}`], customization => { + if(_.isEmpty(customization)) return; + if (limiters_array.indexOf(customization.name) >= 0) { + return customization["type"] = "limiter"; + } else { + return customization["type"] = "enhancement"; + } + }); + setObj[`${c}`] = customizations; + }); + _.each(attrIDs, id => { + setAttrCustomizations(1, v, id, setObj); + }) + }); + }); + setObj.upgraded_1_5_0 = true; + } + } + /** Build UI Functions **/ function buildSizeUI(sizes, setObj) { @@ -6687,7 +7758,7 @@ writeSkill[`repeating_skilltemplate_${rowID}_statallaspect`] = skill.statallaspect; writeSkill[`repeating_skilltemplate_${rowID}_statmajor`] = skill.statmajor; writeSkill[`repeating_skilltemplate_${rowID}_cost`] = skill.cost[global_templates_game_genre]; - setAttrs(writeSkill); + setAttrs(writeSkill,{silent:true}); }); } @@ -6731,66 +7802,67 @@ function buildReapeatingAttrValuesArray(attrIDs) { var result = []; const attrs = [ - `activate`, - `ammo`, - `ammostate`, - `armorlayer`, - `attrdefecttoggle`, - `attribute`, - `attrsrc`, - `augmentedstat`, - `bonus`, - `capacity`, - `capacitystate`, - `capacitytype`, - `characteristic`, - `charges`, - `collectiontype`, - `conditions`, - `continuingtype`, - `conversiontype`, - `costperlevel`, - `customizations`, - `damagetype`, - `defect`, - `defectaspect`, - `defenseclass`, - `display`, - `draintype`, - `effect`, - `effectivelevel`, - `endurance`, - `enemy`, - `enhancementassignments`, - `extraarms`, - `fluxenable`, - `group`, - `immunityrole`, - `isflux`, - `level`, - `limiterassignments`, - `lock`, - `name`, - `new`, - `object`, - `options`, - `rank`, - `rollable`, - `seeinto`, - `sense`, - `skill`, - `skillgroup`, - `source`, - `stat`, - `supersense`, - `totalcost`, - `uniquephenomena`, - `visible`, - `weaponclass` + 'activate', + 'ammo', + 'ammostate', + 'armorlayer', + 'attrdefecttoggle', + 'attribute', + 'attrsrc', + 'augmentedstat', + 'bonus', + 'capacity', + 'capacitystate', + 'capacitytype', + 'characteristic', + 'charges', + 'collectiontype', + 'conditions', + 'continuingtype', + 'conversiontype', + 'costperlevel', + 'customizations', + 'damagetype', + 'defect', + 'defectaspect', + 'defenseclass', + 'display', + 'draintype', + 'effect', + 'effectivelevel', + 'endurance', + 'enemy', + 'enhancementassignments', + 'extraarms', + 'fluxenable', + 'group', + 'immunityrole', + 'isflux', + 'level', + 'limiterassignments', + 'lock', + 'name', + 'new', + 'object', + 'options', + 'rank', + 'rollable', + 'seeinto', + 'sense', + 'skill', + 'skillgroup', + 'source', + 'stat', + 'supersense', + 'totalcost', + 'uniquephenomena', + 'visible', + 'unaffectedattributes', + 'weaponclass' ]; _.each(attrIDs, id => { - _.each(attrs, attr => { - result[result.length] = `repeating_attr_${id}_${attr}`; + _.map(attrs.concat(unaffected_states_array), attr => { + return result[result.length] = `repeating_attr_${id}_${attr}`; }); }); return result; @@ -7061,7 +8133,7 @@ } function restoreActiveAttribute(removedInfo){ - setAttrs(removedInfo); + setAttrs(removedInfo,{silent:true}); } function getRemovedAttribute(removedInfo){ @@ -7333,12 +8405,19 @@ function getAggregateShortcomingRanks(debug, value, defectdb, stat, setObj) { const result = _.chain(defectdb) .map(defect => { + /* const isActive = isNaN(parseInt(setObj[`repeating_attr_${defect.source}_activate`])) ? parseInt(value[`repeating_attr_${defect.source}_activate`]) : parseInt(setObj[`repeating_attr_${defect.source}_activate`]); + + const getIsActive = source => isNaN(source) ? + parseInt(value[`repeating_attr_${defect.source}_activate`]) : + source; + const isActive = getIsActive(parseInt(setObj[`repeating_attr_${defect.source}_activate`])); + */ const rank = defect.name == 'shortcoming' ? defect.aspect == `${stat}` ? - isActive > 0 ? - parseInt(defect.rank) : 0 : 0 : 0; + // isActive > 0 ? + parseInt(defect.rank) : 0 : 0; return rank; }) .reduce((memo, num)=>{ return memo + num; }, 0) @@ -7511,7 +8590,7 @@ console.log(`[setAttrVisibilityByGroup(${eventInfo.newValue})] currGroup = ${currGroup}`); } if(debug){ console.log('[Changes To Sheet Values] setObj:'); console.log(setObj); } - setAttrs(setObj); + setAttrs(setObj,{silent:true}); return; }); } @@ -7708,7 +8787,7 @@ if (isDynamicAttr && isDynamicGroup(value, sectionName)) { setObj[`${match}`] = eventInfo.previousValue; if(debug){ console.log('[Changes To Sheet Values] setObj:'); console.log(setObj); } - setAttrs(setObj); + setAttrs(setObj,{silent:true}); result = true; debugtext = `${debugtext} group is dynamic, resetting attribute selection.`; } else { @@ -7744,7 +8823,7 @@ if (debug) console.log(`[resetOnActive(${match})] attribute is active, exiting`); setObj[`${match}`] = reset; if(debug){ console.log('[Changes To Sheet Values] setObj:'); console.log(setObj); } - setAttrs(setObj); + setAttrs(setObj,{silent:true}); return true; } else { return false; } } @@ -7776,7 +8855,7 @@ if (debug) console.log(`[resetOnLevelNotZero(${match})] can't change Attribute when Level or Effective Level is greater than 0, exiting`); setObj[`${match}`] = reset; if(debug){ console.log('[Changes To Sheet Values] setObj:'); console.log(setObj); } - setAttrs(setObj); + setAttrs(setObj,{silent:true}); return true; } else { return false; } } @@ -7789,7 +8868,7 @@ if (debug) console.log(`[resetOnPoolLevelNotZero(${match})] can't change Type when Level is greater than 0, exiting`); setObj[`${match}`] = reset; if(debug){ console.log('[Changes To Sheet Values] setObj:'); console.log(setObj); } - setAttrs(setObj); + setAttrs(setObj,{silent:true}); return true; } else { return false; } } @@ -7801,7 +8880,7 @@ if (debug) console.log(`[resetOnNoAttr(${match})] can't change Level when no Attribute is selected, exiting`); setObj[`${match}`] = 0; if(debug){ console.log('[Changes To Sheet Values] setObj:'); console.log(setObj); } - setAttrs(setObj); + setAttrs(setObj,{silent:true}); return true; } else { return false; } } @@ -7814,7 +8893,7 @@ if (debug) console.log(`[resetOnActiveGroup(${match})] can't change Group Type when group Attributes have a level > 0, exiting`); setObj[`${match}`] = reset; if(debug){ console.log('[Changes To Sheet Values] setObj:'); console.log(setObj); } - setAttrs(setObj); + setAttrs(setObj,{silent:true}); return true; } else { return false; } } @@ -7837,7 +8916,7 @@ console.log('[Changes To Sheet Values] setObj:'); console.log(setObj); } - setAttrs(setObj); + setAttrs(setObj,{silent:true}); } return result; } @@ -8610,10 +9689,11 @@ } function setAttrCharacteristic(debug, value, rowID, setObj) { - const attribute = value[`repeating_attr_${rowID}_attribute`].toLowerCase().replace(/\s+/g, ''); + const attribute = value[`repeating_attr_${rowID}_attribute`].replace(/\s+/g, ''); if (attribute == 'defect') return; - const level = parseInt(setObj[`repeating_attr_${rowID}_effectivelevel`]) || - parseInt(value[`repeating_attr_${rowID}_effectivelevel`]) || 0; + const level = isNaN(parseInt(setObj[`repeating_attr_${rowID}_effectivelevel`])) ? + parseInt(value[`repeating_attr_${rowID}_effectivelevel`]) || 0 : + parseInt(setObj[`repeating_attr_${rowID}_effectivelevel`]) || 0; let characteristic = ""; switch (attribute) { case "absorption": characteristic = `${level * 5} Damage Absorbed`; break; @@ -8677,7 +9757,7 @@ case "rangeddefense": characteristic = `DCV +${level * 2} ${getCharacteristicSpecializationByAttr(debug, value, rowID, attribute)} Ranged Defense`; break; case "regeneration": characteristic = `Regenerate ${level * 5} Heath Points/Round`; break; case "reincarnation": characteristic = getCharacteristicByAttr(debug, value, rowID, attribute, setObj); break; - case "resilient": characteristic = `Resilient to ${getCharacteristicByCustomizations(debug, value, rowID, attribute)}`; break; + case "resilient": characteristic = `${level} Resiliencies Remaining`; break; case "sensory block": characteristic = `Block ${getCharacteristicByCustomizations(debug, value, rowID, attribute)}`; break; case "shield": characteristic = `${level * 5} Armor Rating` + getShieldParryBonus(debug, value, rowID); break; case "sixthsense": characteristic = getCharacteristicByCustomizations(debug, value, rowID, attribute); break; @@ -8698,7 +9778,7 @@ case "transfer": characteristic = `Transer Attributes as Level ${level}`; break; case "transmute": characteristic = `Transmute objects of ${level * 5} Character Points`; break; case "tunneling": characteristic = getCharacteristicByAttr(debug, value, rowID, attribute, setObj); break; - case "unaffected": characteristic = `Attacker suffers ${level * -2} using Attributes`; break; + case "unaffected": characteristic = `Attacker's roll ${level * -2}`; break; case "unassailable": characteristic = `Sanity Points +${level * 2}`; break; case "undetectable": characteristic = getCharacteristicByCustomizations(debug, value, rowID, attribute); break; case "uniqueattribute": characteristic = ""; break; @@ -8818,12 +9898,12 @@ "default": "Does not improve beyond level 10" }, "dataaccess": { - 1: "10 cm radius", - 2: "1 m radius", - 3: "10 m radius", - 4: "100 m radius", - 5: "1 km radius", - 6: "10 km radius", + 1: "Tiny-sized (10 cm radius)", + 2: "Small-sized (1 m radius)", + 3: "Moderately-sized (10 m radius)", + 4: "Building-sized (100 m radius)", + 5: "Neighbourhood-sized (1 km radius)", + 6: "City-sized (10 km radius)", "default": "" }, "dimensionwalk": { @@ -8845,12 +9925,12 @@ "default": "Does not improve beyond level 6" }, "elasticity": { - 1: "Stretch body up to 10 cm", - 2: "Stretch body up to 30 cm", - 3: "Stretch body up to 1 m", - 4: "Stretch body up to 3 m", - 5: "Stretch body up to 10 m", - 6: "Stretch body up to 30 m", + 1: "Stretch up to 10 cm", + 2: "Stretch up to 30 cm", + 3: "Stretch up to 1 m", + 4: "Stretch up to 3 m", + 5: "Stretch up to 10 m", + 6: "Stretch up to 30 m", "default": "" }, "extraarms": { @@ -8890,12 +9970,12 @@ "default": "Does not improve beyond level 6" }, "illusion": { - 1: "Tiny-sized Illusions (10 cm)", - 2: "Small-sized Illusions (1 m)", - 3: "Moderate-sized Illusions (10 m)", - 4: "Building-sized Illusions (100 m)", - 5: "Neighbourhood-sized Illusions (1 km)", - 6: "City-sized Illusions (10 km)", + 1: "Tiny-sized (10 cm radius)", + 2: "Small-sized (1 m radius)", + 3: "Moderately-sized (10 m radius)", + 4: "Building-sized (100 m radius)", + 5: "Neighbourhood-sized (1 km radius)", + 6: "City-sized (10 km radius)", "default": "Does not improve beyond level 6" }, "mindcontrol": { @@ -8926,21 +10006,21 @@ "default": "" }, "pocketdimension": { - 1: "Tiny dimension (10 cm radius)", - 2: "Small dimension (1 m radius)", - 3: "Moderately sized dimension (10 m radius)", - 4: "Building-sized dimension (100 m radius)", - 5: "Neighbourhood-sized dimension (1 km radius)", - 6: "City-sized dimension (10 km radius)", + 1: "Tiny-sized (10 cm radius)", + 2: "Small-sized (1 m radius)", + 3: "Moderately-sized (10 m radius)", + 4: "Building-sized (100 m radius)", + 5: "Neighbourhood-sized (1 km radius)", + 6: "City-sized (10 km radius)", "default": "" }, "projection": { - 1: "Tiny Projection (10 cm radius)", - 2: "Small Projection (1 m radius)", - 3: "Moderately sized Projection (10 m radius)", - 4: "Building-side Projection (100 m radius)", - 5: "Neighbourhood-sized Projection (1 km radius)", - 6: "City-sided Projection (10 km radius)", + 1: "Tiny-sized (10 cm radius)", + 2: "Small-sized (1 m radius)", + 3: "Moderately-sized (10 m radius)", + 4: "Building-sized (100 m radius)", + 5: "Neighbourhood-sized (1 km radius)", + 6: "City-sized (10 km radius)", "default": "" }, "reincarnation": { @@ -9042,17 +10122,22 @@ } function getCharacteristicByCustomizations(debug, value, rowID, attribute) { - const characteristics = (attribute == 'sixthsense') ? [`attrsrc`, `danger`, `dimensions`, `elements`, `emotions`, `extraplanarbeings`, `illusions`, `morality`, `objects`, `placesofpower`, `uniquephenomena`] : - (attribute == 'undetectable') ? [`hearing`, `sight`, `smell`, `taste`, `touch`, `echolocation`, `infrasound`, `radio`, `ultrasound`, `infrared`, `ultraviolet`, `x-ray`, `odorant`, `tastant`, `magnetic`, `radiation`, `seismic`, `thermal`] : - (attribute == 'controlenvironment') ? [`arid`, `clouds`, `cold`, `darkness`, `heat`, `humidity`, `light`, `liquid`, `gaseous`, `smell`, `sound`, `storms`, `unique`, `vacuum`] : - (attribute == "specialmovement") ? [`balance`, `catlike`, `fast`, `lightfooted`, `slithering`, `swinging`, `untrackable`, `wallbouncing`, `wallcrawling`, `waterwalking`, `zendirection`] : - []; + const characteristics = + (attribute == 'sixthsense') ? sixthsense_phenomena_array : + (attribute == 'undetectable') ? undetectable_methods_array : + (attribute == 'controlenvironment') ? controlable_environments_array : + (attribute == 'specialmovement') ? special_movements_array : []; + console.log(`[getCharacteristicByCustomizations(${attribute})] result:`); console.log(characteristics); + var result = []; - if (characteristics && characteristics.length > 0) { + if (characteristics && _.isArray(characteristics)) { _.each(characteristics, (characteristic) => { if (getCustomizationValue(debug, value, rowID, 'rank', characteristic) > 0) { let fetch = ''; - if (/(attrsrc|objects|uniquephenomena)/i.test(characteristic)) { + if (characteristic == "attrsrc" || + characteristic == "objects" || + characteristic == "uniquephenomena") { + //if (/(attrsrc|objects|uniquephenomena)/i.test(characteristic)) { fetch = capital(value[`repeating_attr_${rowID}_${characteristic}`]); } else if (characteristic == "unique") { fetch = capital(getCustomizationValue(debug, value, rowID, 'type', characteristic)); @@ -9332,6 +10417,12 @@ break; case 'stat': setStatButtonStatsAndRolls(debug, eventInfo, value, rowID, sourceAttr, setObj); + /* + type = '{{statroll=1}}'; + title = '{{title=Stat Roll}}'; + stat = `{{stat=${}}}`; + base = statBase; + */ break; } result = `${result} ${type} ${title} ${stat} ` + @@ -9344,8 +10435,8 @@ } function setAttrCustomizations(debug, value, rowID, setObj) { - let attribute = value[`repeating_attr_${rowID}_attribute`], - obj = { + const attribute = value[`repeating_attr_${rowID}_attribute`]; + const obj = { "absorption": 6, "armor": 2, "change state": 17, @@ -9353,12 +10444,15 @@ "connected": 16, "control environment": 39, "conversion": 7, + "dimension walk": 40, "dynamic powers": 8, + "exorcism": 41, "flight": 11, "forcefield": 12, - "illusion": 13, "ground speed": 14, + "healing": 42, "heightened senses": 37, + "illusion": 13, "massive damage": 15, "merge": 10, "metamorphosis": 18, @@ -9366,11 +10460,14 @@ "mind control": 20, "nullify": 21, "plant control": 22, + "portal": 43, "power flux": 36, + "power variation": 44, "resilient": 23, "projection": 24, "regeneration": 25, "reincarnation": 26, + "sensory block": 45, "shield": 27, "sixth sense": 38, "size change": 28, @@ -9383,12 +10480,18 @@ "transmute": 34, "unaffected": 3, "undetectable": 9, + "unique attribute": 46, + "unknown power": 47, "weapon": 35, "default": 1 - }, - result = (obj[attribute] || obj["default"]); + }; + const result = (obj[attribute] || obj["default"]); if (debug) console.log(`[setAttrCustomizations(${attribute})] result = ${result}`); - if (`${attribute}` == "defect") { setObj[`repeating_attr_${rowID}_attrdefecttoggle`] = 1; } else { setObj[`repeating_attr_${rowID}_attrdefecttoggle`] = 0; } + if (`${attribute}` == "defect") { + setObj[`repeating_attr_${rowID}_attrdefecttoggle`] = 1; + } else { + setObj[`repeating_attr_${rowID}_attrdefecttoggle`] = 0; + } setObj[`repeating_attr_${rowID}_enhancementtab`] = result; setObj[`repeating_attr_${rowID}_limitertab`] = result; } @@ -9424,8 +10527,8 @@ 'showaugmentedstat', 'showcapacitytype', 'showcollectiontype', - 'showconditions', - 'showconversiontype', + 'showconversiontype', + 'showdamagecategory', 'showdamagetype', 'showdefect', 'showdefenseclass', @@ -9434,7 +10537,9 @@ 'showimmunityrole', 'showseeinto', 'showskillgroup', - 'showsupersense', + 'showsupersense', + 'showunaffected', + 'showunaffectedweapon', 'showvariablestat', 'showweaponclass' ]; @@ -9466,10 +10571,13 @@ case attribute == 'powervariation' && setting == 'showvariablestat': set = 1; break; case attribute == 'rangeddefense' && setting == 'showdefenseclass': set = 1; break; case attribute == 'regeneration' && setting == 'showcollectiontype': set = 1; break; - case attribute == 'resilient' && setting == 'showconditions': set = 1; break; + //case attribute == 'resilient' && setting == 'showdamagetype': set = 1; break; case attribute == 'skill' && setting == 'showskillgroup': set = 1; break; case attribute == 'supersense' && setting == 'showsupersense': set = 1; break; case attribute == 'transmute' && setting == 'showvariablestat': set = 1; break; + case attribute == 'unaffected' && setting == 'showunaffected': set = 1; break; + case attribute == 'unaffected' && setting == 'showattrsrc': set = 1; break; + //case attribute == 'unaffected' && setting == 'showunaffectedweapon': set = 1; break; case attribute == 'weapon' && setting == 'showdamagetype': set = 1; break; case attribute == 'weapon' && setting == 'showweaponclass': set = 1; break; default: set = 0; @@ -9479,12 +10587,14 @@ }); } - function exposeAttrSettingsOnCustomizationChange(debug, eventInfo, source, sourceAttr, setObj) { - const rank = parseInt(eventInfo.newValue), - attr = (/enhancement/i.test(sourceAttr)) ? sourceAttr.substring(11) : (/limiter/i.test(sourceAttr)) ? sourceAttr.substring(7) : `default`, - attribute = attr.replace(/\s+/g, ''); - var set = (rank) ? 1 : 0, - result = ""; + function exposeAttrSettingsOnCustomizationChange(debug, eventInfo, source, customization, setObj) { + const rank = parseInt(eventInfo.newValue); + const attribute = getIsObject(customization) ? customization.name.replace(/\s+/g, '') : + 'default'; + //attr = (/enhancement/i.test(sourceAttr)) ? sourceAttr.substring(11) : (/limiter/i.test(sourceAttr)) ? sourceAttr.substring(7) : `default`, + //attribute = attr.replace(/\s+/g, ''); + const set = rank ? 1 : 0; + let result = ''; switch (attribute) { case `ammo`: result = `showammo`; break; case `attrsrc`: result = 'showattrsrc'; break; @@ -9496,19 +10606,43 @@ case `focuseddamage`: result = 'showweaponclass'; break; case `objects`: result = 'showobject'; break; case `specialized`: result = 'showdamagetype'; break; + case `specific`: result = 'showdamagecategory'; break; case `targeted`: result = 'showenemy'; break; case `targeteddamage`: result = 'showenemy'; break; case `uniquephenomena`: result = 'showuniquephenomena'; break; case `unpredictable`: result = `showvariablestat`; break; } if (debug) { - console.log(`[exposeAttrSettingsOnCustomizationChange(${sourceAttr})] attribute = ${attribute}`); - console.log(`[exposeAttrSettingsOnCustomizationChange(${sourceAttr})] result = ${result}`); - console.log(`[exposeAttrSettingsOnCustomizationChange(${sourceAttr})] set = ${set}`); + console.log(`[exposeAttrSettingsOnCustomizationChange()] attribute = ${attribute}`); + console.log(`[exposeAttrSettingsOnCustomizationChange()] result = ${result}`); + console.log(`[exposeAttrSettingsOnCustomizationChange()] set = ${set}`); } setObj[`${source}_${result}`] = set; } + function setAvailableDamageTypes(debug, value, rowID, setObj) { + const isWeapon = value[`repeating_attr_${rowID}_attribute`] == 'weapon' ? true : false; + if (!isWeapon) return; + const customizations = setObj[`repeating_attr_${rowID}_customizations`] || + value[`repeating_attr_${rowID}_customizations`] || []; + const isInsidious = getIsObject(getCustomizationExists('insidious', customizations)); + const isPsychic = getIsObject(getCustomizationExists('psychic', customizations)); + setObj[`repeating_attr_${rowID}_normaldamage`] = 0; + setObj[`repeating_attr_${rowID}_insidiousdamage`] = 0; + setObj[`repeating_attr_${rowID}_psychicdamage`] = 0; + if (isInsidious && !isPsychic) { + setObj[`repeating_attr_${rowID}_insidiousdamage`] = 1; + } else if (isPsychic) { + setObj[`repeating_attr_${rowID}_psychicdamage`] = 1; + } else { + setObj[`repeating_attr_${rowID}_normaldamage`] = 1; + } + if(debug) { + console.log(`[setAvailableDamageTypes()] isInsidious = ${isInsidious}`); + console.log(`[setAvailableDamageTypes()] isPsychic = ${isPsychic}`); + } + } + function setProtection(isActive, debug, value, rowID, sourceAttr, attribute, setObj) { const name = (isActive) ? value[`repeating_attr_${rowID}_name`] : ''; const elevel = parseInt(value[`repeating_attr_${rowID}_effectivelevel`]) || 0; @@ -9929,27 +11063,26 @@ function setAttrdb(isActive, debug, value, attrdb, attrIDs, rowID, sourceAttr, attribute, setObj) { const name = value[`repeating_attr_${rowID}_name`] || ""; const level = parseInt(value[`repeating_attr_${rowID}_effectivelevel`]) || 0; - const length = (attrdb[`${attribute}`] == undefined) ? + const length = attrdb[`${attribute}`] === undefined ? 0 : attrdb[`${attribute}`].length; + const customizations = value[`repeating_attr_${rowID}_customizations`] || []; let result = {}; let stat = 0; let focused = 0; let defense = 0; let targeted = 0; let damagetype = ''; - let customizations = []; switch (attribute) { case 'augmented': stat = value[`repeating_attr_${rowID}_augmentedstat`] || ""; - result = { level: level, focus: stat, source: rowID }; + result = { name: name, attribute: attribute, level: level, focus: stat, source: rowID }; break; case `combattechnique`: - customizations = value[`repeating_attr_${rowID}_customizations`] || []; - result = { subattrs: getSubAttrs(debug, customizations, attribute), source: rowID }; + result = { name: name, attribute: attribute, subattrs: getSubAttrs(debug, customizations, attribute), source: rowID }; break; case `enemyattack`: case `enemydefense`: - result = { level: level, targeted: 1, source: rowID }; + result = { name: name, attribute: attribute, level: level, targeted: 1, source: rowID }; break; case `attackmastery`: case `defensemastery`: @@ -9960,25 +11093,27 @@ case `superstrength`: case `tough`: case `unassailable`: - result = { level: level, source: rowID }; + result = { name: name, attribute: attribute, level: level, source: rowID }; break; case `meleeattack`: case `rangedattack`: case `meleedefense`: focused = value[`repeating_attr_${rowID}_weaponclass`] || ""; - result = { level: level, focus: focused, source: rowID }; + result = { name: name, attribute: attribute, level: level, focus: focused, source: rowID }; break; case `rangeddefense`: defense = value[`repeating_attr_${rowID}_defenseclass`] || ""; - result = { level: level, focus: defense, source: rowID }; + result = { name: name, attribute: attribute, level: level, focus: defense, source: rowID }; break; case `massivedamage`: targeted = getCustomizationValue(debug, value, rowID, 'rank', "targeteddamage") || 0; focused = value[`repeating_attr_${rowID}_weaponclass`] || ""; - result = { level: level, targeted: targeted, focus: focused, source: rowID }; + result = { name: name, attribute: attribute, level: level, targeted: targeted, focus: focused, source: rowID }; break; case `heightenedsenses`: result = { + name: name, + attribute: attribute, senses: [ { name: 'sight', @@ -10005,8 +11140,7 @@ }; break; case `shield`: - customizations = value[`repeating_attr_${rowID}_customizations`] || []; - result = { name: name, level: level, source: rowID, customizations: customizations }; + result = { name: name, attribute: attribute, level: level, source: rowID, customizations: customizations }; break; case `telekinesis`: case `swarm`: @@ -10019,10 +11153,12 @@ attribute == 'telekinesis' ? 'blunt' : value[`repeating_attr_${rowID}_damagetype`]; - customizations = value[`repeating_attr_${rowID}_customizations`] || []; - result = { name: name, level: level, focus: focused, damagetype: damagetype, source: rowID, customizations: customizations }; + result = { name: name, attribute: attribute, level: level, focus: focused, damagetype: damagetype, source: rowID, customizations: customizations }; break; - default: result = {}; + case 'unaffected': + + break; + default: result = { name: name, attribute: attribute, level: level, source: rowID, customizations: customizations }; } if (isActive) { attrdb[`${attribute}`][`${length}`] = result; @@ -10394,7 +11530,7 @@ } } - function setActiveAttribute(isActive, debug, value, rowID, sourceAttr, setObj, attribute, level) { + function setActiveAttribute(isActive, debug, value, rowID, attrdb, setObj, attribute, level) { const target = (attribute == 'supersense') ? `repeating_senses` : `repeating_active`; if (isActive) { const activeID = generateRowID(), @@ -10405,6 +11541,7 @@ setObj[`repeating_attr_${rowID}_source`] = source; setObj[`${target}_${activeID}_name`] = `${name} (${attribute})`; setObj[`${target}_${activeID}_characteristic`] = characteristic; + setObj[`${target}_${activeID}_description`] = buildActiveAttrTooltip(debug, attrdb, attribute, rowID); if (attribute == 'telepathy' && level > 3) { setRollable(debug, value, rowID, activeID, setObj, attribute); } else if (attribute != 'telepathy' && attribute != 'supersense') { @@ -10466,12 +11603,12 @@ case "attackmastery": case "defensemastery": setAttrdb(isActive, debug, value, attrdb, attrIDs, rowID, sourceAttr, attribute, setObj); - setActiveAttribute(isActive, debug, value, rowID, sourceAttr, setObj, attribute, level); + setActiveAttribute(isActive, debug, value, rowID, attrdb, setObj, attribute, level); break; case "augmented": setAttrdb(isActive, debug, value, attrdb, attrIDs, rowID, sourceAttr, attribute, setObj); setAugmented(isActive, debug, value, attrdb, rowID, sourceAttr, setObj); - setActiveAttribute(isActive, debug, value, rowID, sourceAttr, setObj, attribute, level); + setActiveAttribute(isActive, debug, value, rowID, attrdb, setObj, attribute, level); break; case "combattechnique": setAttrdb(isActive, debug, value, attrdb, attrIDs, rowID, sourceAttr, attribute, setObj); @@ -10479,18 +11616,18 @@ break; case "conversion": setProtection(isActive, debug, value, rowID, sourceAttr, attribute, setObj); - setActiveAttribute(isActive, debug, value, rowID, sourceAttr, setObj, attribute, level); + setActiveAttribute(isActive, debug, value, rowID, attrdb, setObj, attribute, level); break; case "defect": setDefectdb(isActive, debug, attrdb, value, rowID, setObj); setDefectEffect(isActive, debug, attrIDs, attrdb, value, rowID, setObj, attribute); - setActiveAttribute(isActive, debug, value, rowID, sourceAttr, setObj, attribute, level); + setActiveAttribute(isActive, debug, value, rowID, attrdb, setObj, attribute, level); break; case "enemyattack": case "enemydefense": setAttrdb(isActive, debug, value, attrdb, attrIDs, rowID, sourceAttr, attribute, setObj); setTargeted(isActive, debug, value, attrdb, attrIDs, rowID, sourceAttr, attribute, setObj); - setActiveAttribute(isActive, debug, value, rowID, sourceAttr, setObj, attribute, level); + setActiveAttribute(isActive, debug, value, rowID, attrdb, setObj, attribute, level); break; case "energized": setAttrdb(isActive, debug, value, attrdb, attrIDs, rowID, sourceAttr, attribute, setObj); @@ -10500,14 +11637,14 @@ case "extradefenses": setAttrdb(isActive, debug, value, attrdb, attrIDs, rowID, sourceAttr, attribute, setObj); setExtraActions(debug, attrdb, attribute, setObj); - setActiveAttribute(isActive, debug, value, rowID, sourceAttr, setObj, attribute, level); + setActiveAttribute(isActive, debug, value, rowID, attrdb, setObj, attribute, level); break; case "extraarms": setExtraArms(isActive, debug, extraarmIDs, value, rowID, sourceAttr, setObj); break; case "heightenedawareness": setAttrdb(isActive, debug, value, attrdb, attrIDs, rowID, sourceAttr, attribute, setObj); - setActiveAttribute(isActive, debug, value, rowID, sourceAttr, setObj, attribute, level); + setActiveAttribute(isActive, debug, value, rowID, attrdb, setObj, attribute, level); break; case "heightenedsenses": setAttrdb(isActive, debug, value, attrdb, attrIDs, rowID, sourceAttr, attribute, setObj); @@ -10520,14 +11657,14 @@ case "rangeddefense": setAttrdb(isActive, debug, value, attrdb, attrIDs, rowID, sourceAttr, attribute, setObj); setTargeted(isActive, debug, value, attrdb, attrIDs, rowID, sourceAttr, attribute, setObj); - setActiveAttribute(isActive, debug, value, rowID, sourceAttr, setObj, attribute, level); + setActiveAttribute(isActive, debug, value, rowID, attrdb, setObj, attribute, level); break; case "powerflux": case "powervariation": setPoolMax(isActive, value, attrIDs, sectionName, rowID, setObj); convertAttrGroupCost(isActive, value, sectionName, attrIDs, rowID, setObj); setPoolActive(isActive, value, sectionName, setObj); - setActiveAttribute(isActive, debug, value, rowID, sourceAttr, setObj, attribute, level); + setActiveAttribute(isActive, debug, value, rowID, attrdb, setObj, attribute, level); break; case "shield": setProtection(isActive, debug, value, rowID, sourceAttr, attribute, setObj); @@ -10543,25 +11680,25 @@ setDerivedValue(debug, attrdb, value, setObj, 'social'); break; case "specialmovement": - setActiveAttribute(isActive, debug, value, rowID, sourceAttr, setObj, attribute, level); + setActiveAttribute(isActive, debug, value, rowID, attrdb, setObj, attribute, level); break; case "socialmastery": case "superstrength": setAttrdb(isActive, debug, value, attrdb, attrIDs, rowID, sourceAttr, attribute, setObj); - setActiveAttribute(isActive, debug, value, rowID, sourceAttr, setObj, attribute, level); + setActiveAttribute(isActive, debug, value, rowID, attrdb, setObj, attribute, level); break; case "swarm": setAttrdb(isActive, debug, value, attrdb, attrIDs, rowID, sourceAttr, attribute, setObj); setSwarmCritters(isActive, debug, value, attrdb, rowID, setObj); setWeapon(isActive, debug, value, extraarmIDs, rowID, sourceAttr, setObj, attrdb, attribute); - setActiveAttribute(isActive, debug, value, rowID, sourceAttr, setObj, attribute, level); + setActiveAttribute(isActive, debug, value, rowID, attrdb, setObj, attribute, level); break; case "telekinesis": if (level > 1) { setAttrdb(isActive, debug, value, attrdb, attrIDs, rowID, sourceAttr, attribute, setObj); setWeapon(isActive, debug, value, extraarmIDs, rowID, sourceAttr, setObj, attrdb, attribute); } - setActiveAttribute(isActive, debug, value, rowID, sourceAttr, setObj, attribute, level); + setActiveAttribute(isActive, debug, value, rowID, attrdb, setObj, attribute, level); break; case "tough": setAttrdb(isActive, debug, value, attrdb, attrIDs, rowID, sourceAttr, attribute, setObj); @@ -10576,7 +11713,8 @@ setWeapon(isActive, debug, value, extraarmIDs, rowID, sourceAttr, setObj, attrdb, attribute); break; default: - setActiveAttribute(isActive, debug, value, rowID, sourceAttr, setObj, attribute, level); + setAttrdb(isActive, debug, value, attrdb, attrIDs, rowID, sourceAttr, attribute, setObj); + setActiveAttribute(isActive, debug, value, rowID, attrdb, setObj, attribute, level); } if (debug) console.log(`[setAttrEffects(${sourceAttr})] attribute = ${attribute}`); setObj.attrdb = JSON.stringify(attrdb); @@ -10784,71 +11922,160 @@ function getCustomizationValue(debug, value, rowID, type, customization) { // type = 'rank' || 'name'; - const customizations = value[`repeating_attr_${rowID}_customizations`] || [], - match = customizations.find((o) => { - if (o.name === customization) return o; - }), - result = match === undefined ? 0 : match[`${type}`]; + const customizations = value[`repeating_attr_${rowID}_customizations`] || []; + const match = customizations.find((o) => { + if (o.name === customization) return true; + }); + const result = match === undefined ? 0 : match[`${type}`]; if (debug) console.log(`[getCustomizationValue(${customization})] ${type} = ${result}`); return result; } function setCustomization(debug, eventInfo, value, rowID, customization, setObj) { const rank = parseInt(eventInfo.newValue); - let customizations = setObj[`repeating_attr_${rowID}_customizations`] || value[`repeating_attr_${rowID}_customizations`] || []; - if (!customizations.length) { - customizations[0] = { "name": customization, "rank": rank }; //create array with first entry + let customizations = + value[`repeating_attr_${rowID}_customizations`] || []; + if (!customizations.length) {//create array with first entry + customizations[0] = + { "name": customization.name, "rank": rank, "type": customization.type }; } else { const result = customizations.find((o, i) => { - if (o.name === customization) { - if (rank > 0) { - //update existing element - customizations[i] = { "name": customization, "rank": rank }; - } else { - //remove existing element + if (o.name === customization.name) { + if (rank > 0) {//update existing element + customizations[i] = + { "name": customization.name, "rank": rank, "type": customization.type }; + } else {//remove existing element customizations.splice(i, 1); } return true; } }); - if (result === undefined) customizations[customizations.length] = { "name": customization, "rank": rank }; //add new + if (result === undefined) {//add new + customizations[customizations.length] = + { "name": customization.name, "rank": rank, "type": customization.type }; + } + } + if (debug) { + console.log(`[setCustomization(${customization.name})] customizations:`); + console.log(customizations); } setObj[`repeating_attr_${rowID}_customizations`] = customizations; + } + + function setUnaffectedWeapons(debug, eventInfo, value, rowID, customization, setObj) { + const attribute = getIsObject(customization) ? customization.name : 'default'; + console.log(`[setUnaffectedWeapons()] attribute = ${attribute}`); + + if (attribute != 'allweapons') return; + const rank = parseInt(eventInfo.newValue); + console.log(`[setUnaffectedWeapons()] rank = ${rank}`); + + const unaffectedattributes = value[`repeating_attr_${rowID}_unaffectedattributes`] || []; + console.log(`[setUnaffectedWeapons()] unaffectedattributes:`); console.log(unaffectedattributes); + + const hasWeapon = unaffectedattributes.length ? + unaffectedattributes.indexOf('Weapon') >= 0 ? + true : false : + false; + console.log(`[setUnaffectedWeapons()] hasWeapon = ${hasWeapon}`); + + const showWeapons = hasWeapon ? + rank ? + setObj[`repeating_attr_${rowID}_showunaffectedweapon`] = 0 : + setObj[`repeating_attr_${rowID}_showunaffectedweapon`] = 1 : + false; + if(debug) console.log(`[setUnaffectedWeapons()] showWeapons = ${showWeapons}`); + } + + function setUnaffectedAttributes(debug, eventInfo, value, rowID, setObj) { + const attribute = eventInfo.htmlAttributes.value; + console.log(`[setUnaffectedAttributes()] attribute = ${attribute}`); + + const state = parseInt(setObj[`repeating_attr_${rowID}_${removeWhiteSpace(attribute)}state`]); + console.log(`[setUnaffectedAttributes()] state = ${state}`); + + const unaffectedattributes = value[`repeating_attr_${rowID}_unaffectedattributes`] || []; + console.log(`[setUnaffectedAttributes()] unaffectedattributes:`); + console.log(unaffectedattributes); + + const isAllWeapons = getCustomizationValue(debug, value, rowID, 'rank', 'allweapons') > 0 ? + true : false; + + const setUnaffectedAttribute = state ? + unaffectedattributes.push(capital(attribute)) : + unaffectedattributes.splice(unaffectedattributes.indexOf(capital(attribute)), 1); + + const showWeapons = attribute == 'weapon' ? state && !isAllWeapons ? + setObj[`repeating_attr_${rowID}_showunaffectedweapon`] = 1 : + setObj[`repeating_attr_${rowID}_showunaffectedweapon`] = 0 : + false; + if (debug) { - console.log(`[setCustomization(${customization})] customizations:`); console.log(customizations); + console.log(`[setUnaffectedAttributes()] unaffectedattributes:`); + console.log(unaffectedattributes); } + setObj[`repeating_attr_${rowID}_unaffectedattributes`] = unaffectedattributes; } function isEmpty(str) { return (!str || str.length === 0); } - function setEffectiveLevelByCustomization(debug, eventInfo, value, type, rowID, setObj) { - const newAssignment = parseInt(eventInfo.newValue) || 0, - prevAssignment = (parseInt(eventInfo.previousValue) == newAssignment) ? 0 : parseInt(eventInfo.previousValue) || 0, - diffAssignment = newAssignment - prevAssignment, - enhancements = parseInt(setObj[`repeating_attr_${rowID}_enhancementassignments`]) || parseInt(value[`repeating_attr_${rowID}_enhancementassignments`]) || 0, - limiters = parseInt(setObj[`repeating_attr_${rowID}_limiterassignments`]) || parseInt(value[`repeating_attr_${rowID}_limiterassignments`]) || 0, - level = parseInt(setObj[`repeating_attr_${rowID}_level`]) || parseInt(value[`repeating_attr_${rowID}_level`]) || 0, - customization = (type == "enhancement") ? enhancements + diffAssignment : limiters + diffAssignment, - effectivelevel = (type == "enhancement") ? level - (enhancements + diffAssignment) + limiters : level - enhancements + (limiters + diffAssignment); - setObj[`repeating_attr_${rowID}_${type}assignments`] = customization; - setObj[`repeating_attr_${rowID}_effectivelevel`] = effectivelevel; - if (debug) { - console.log(`[setEffectiveLevelByCustomization(${type})] isEmpty(eventInfo.newValue) = ${isEmpty(eventInfo.newValue)}`); - console.log(`[setEffectiveLevelByCustomization(${type})] newAssignment = ${newAssignment}`); - console.log(`[setEffectiveLevelByCustomization(${type})] isEmpty(eventInfo.previousValue) = ${isEmpty(eventInfo.previousValue)}`); - console.log(`[setEffectiveLevelByCustomization(${type})] prevAssignment = ${prevAssignment}`); - console.log(`[setEffectiveLevelByCustomization(${type})] diffAssignment = ${diffAssignment}`); - console.log(`[setEffectiveLevelByCustomization(${type})] enhancements = ${enhancements}`); - console.log(`[setEffectiveLevelByCustomization(${type})] limiters = ${limiters}`); - console.log(`[setEffectiveLevelByCustomization(${type})] level = ${level}`); - console.log(`[setEffectiveLevelByCustomization(${type})] customization = ${customization}`); - console.log(`[setEffectiveLevelByCustomization(${type})] effectivelevel = ${effectivelevel}`); - console.log(`[setEffectiveLevelByCustomization(${type})] value:`); console.log(value); - } + function getCustomizationTypeTotal(debug, customizations, type) { + const result = _.chain(customizations) + .map(c => { + const typematch = type => c.type == type ? c.rank : 0; + return typematch(type); + }) + .reduce((memo, num) => { return memo + num; }, 0) + .value(); + if(debug) console.log(`[getCustomizationTypeTotal(${type})] result = ${result}`); + return result; } + function setEffectiveLevelByCustomization(debug, eventInfo, value, customization, rowID, setObj) { + //const newAssignment = parseInt(eventInfo.newValue) || 0; + //const prevAssignment = parseInt(eventInfo.previousValue) == newAssignment ? + // 0 : parseInt(eventInfo.previousValue) || 0; + //const diffAssignment = newAssignment - prevAssignment; + const customizations = setObj[`repeating_attr_${rowID}_customizations`] || []; + const enhancements = getCustomizationTypeTotal(debug, customizations, 'enhancement'); + //parseInt(customization.enhancements); + //parseInt(setObj[`repeating_attr_${rowID}_enhancementassignments`]) || + //parseInt(value[`repeating_attr_${rowID}_enhancementassignments`]) || + //0; + const limiters = getCustomizationTypeTotal(debug, customizations, 'limiter'); + //parseInt(customization.limiters); + //parseInt(setObj[`repeating_attr_${rowID}_limiterassignments`]) || + //parseInt(value[`repeating_attr_${rowID}_limiterassignments`]) || + //0; + const level = + //parseInt(setObj[`repeating_attr_${rowID}_level`]) || + parseInt(value[`repeating_attr_${rowID}_level`]) || + 0; + //const assignments = (customization.type == "enhancement") ? + //enhancements :// + diffAssignment : + //limiters; // + diffAssignment; + const effectivelevel = //(customization.type == "enhancement") ? + //level - (enhancements + diffAssignment) + limiters : + //level - enhancements + (limiters + diffAssignment); + level + limiters - enhancements; + if (debug) { + //console.log(`[setEffectiveLevelByCustomization()] isEmpty(eventInfo.newValue) = ${isEmpty(eventInfo.newValue)}`); + //console.log(`[setEffectiveLevelByCustomization()] newAssignment = ${newAssignment}`); + //console.log(`[setEffectiveLevelByCustomization()] isEmpty(eventInfo.previousValue) = ${isEmpty(eventInfo.previousValue)}`); + //console.log(`[setEffectiveLevelByCustomization()] prevAssignment = ${prevAssignment}`); + //console.log(`[setEffectiveLevelByCustomization()] diffAssignment = ${diffAssignment}`); + console.log(`[setEffectiveLevelByCustomization()] enhancements = ${enhancements}`); + console.log(`[setEffectiveLevelByCustomization()] limiters = ${limiters}`); + console.log(`[setEffectiveLevelByCustomization()] level = ${level}`); + //console.log(`[setEffectiveLevelByCustomization()] assignments = ${assignments}`); + console.log(`[setEffectiveLevelByCustomization()] effectivelevel = ${effectivelevel}`); + } + //setObj[`repeating_attr_${rowID}_${customization.type}assignments`] = assignments; + setObj[`repeating_attr_${rowID}_effectivelevel`] = effectivelevel; + } + /* function setEnhancement(debug, eventInfo, value, rowID, enhancement, setObj) { let enhancements = value[`repeating_attr_${rowID}_enhancements`] || []; const cust = getCustomizationExists(customization, customizations); @@ -10863,7 +12090,7 @@ setObj[`repeating_attr_${rowID}_customizations`] = customizations; if (debug) { console.log(`[getCustomization(${customization})] customizations:`); console.log(customizations); } } - + */ function setDamageType(debug, source, sourceAttr, setObj) { const hasDamageType = /(weapon|armor)/i.test(`${sourceAttr}`); let setDamageType = (hasDamageType) ? 0 : 1; @@ -10973,29 +12200,66 @@ return result; } - function getRange(debug, attrdb, customization, selection) { - console.log(`[getRange()] selection = ${selection}`); - const extended = - getSumOfActiveSubAttrRanks(attrdb, 'combattechnique', 'extendedrange') || - 0; + function getRange(debug, attrdb, customization, selection, isweapon = true) { + const rank = parseInt(customization.rank); + const extended = isweapon ? + getSumOfActiveSubAttrRanks(attrdb, 'combattechnique', 'extendedrange') > 0 ? + 1 : 0 : 0; const rangeobj = { 1:3, 2:10, 3:100, 4:1000, 5:10000, - 6:100000 + 6:100000, + 7:1000000, + 8:10000000, + 9:100000000, + 10:1000000000 }; - const distance = - `${Math.round(((rangeobj[customization.rank] || - 0) * (extended + 1)) * getRangeDistance(debug, selection))}` || - "0"; - const length = distance.length; - const range = length > 3 ? - `${parseInt(distance)/1000} km` : - `${distance} m`; - if(debug) console.log(`[getRange()] range = ${range}`); - return range; + const baserange = rank > 10 ? + 1000000000 * (10 * (rank - 10)) : + rangeobj[rank] || 0; + const actualrange = + `${Math.round((baserange * (extended + 1)) * getRangeDistance(debug, selection))}`; + const length = actualrange.length; + const result = + length > 6 ? + `${parseInt(actualrange)/1000000}M km` : + length > 3 ? + `${parseInt(actualrange)/1000} km` : + `${actualrange} m`; + if(debug) console.log(`[getRange()] result = ${result}`); + return result; + } + + function getDuration(debug, rank) { + const durationobj = { + 1:'10 minutes (weapons 2 rounds)', + 2:'1 hour (weapons 5 rounds)', + 3:'1 day (weapons 10 rounds)', + 4:'1 week (weapons 1 minute)', + 5:'1 month (weapons 1 hour)', + 6:'1 season (weapons 1 day)', + 7:'1 year (weapons 1 week)', + 8:'10 years (weapons 1 month)', + 9:'100 years (weapons 1 year)', + 10:'Permanent or 1000 years (weapons 10 years)' + }; + const getUnits = units => (10 * (rank - 10)) * units; + const result = rank > 10 ? + `${getUnits(1000)} years (weapons ${getUnits(10)} years)` : + durationobj[rank] || 0; + if(debug) console.log(`[getDuration()] result = ${result}`); + return result; + } + + function getTargets(debug, rank) { + const mod = get1or2andHalfor5(rank); + const targets = Math.floor(mod * (10 ^ Math.floor(rank / 3))); + const result = `Affect up to ${targets} Targets at once`; + if(debug) console.log(`[getDuration()] result = ${result}`); + return result; } function getAmmoMax(debug, rank) { @@ -11081,18 +12345,6 @@ case 'ammo': setObj.weapon_ammo_autofire = 1; setObj.weapon_ammo = 1; - /* - const ammostate = parseInt(value[`repeating_attr_${weapon}_ammostate`]); - const ammo = isNaN(ammostate) ? - getAmmoMax(debug, customization.rank) : - ammostate; - const capacitystate = parseInt(value[`repeating_attr_${weapon}_capacitystate`]); - const capacity = isNaN(capacitystate) ? - parseInt(value[`repeating_attr_${weapon}_capacity`]) : - capacitystate; - setObj.weapon_ammo_reloads = ammo; - setObj.weapon_ammo_capacity = capacity; - */ break; case 'autofire': setObj.weapon_ammo_autofire = 1; @@ -11100,7 +12352,7 @@ break; case 'range': const selection = customization.rank > 2 ? - parseInt(setObj.static_weapon_range_selection) || + //parseInt(setObj.static_weapon_range_selection) || parseInt(value.static_weapon_range_selection) || 1 : 1; @@ -11108,7 +12360,169 @@ setRange(debug, attrdb, customization, selection, setObj); break; } - }) + }); + } + + function getStatByAttr(debug, defectdb, attribute) { + const attrs_stat_obj = { + 'absorption':['body','con'], + 'alternate form':['body','con'], + 'alternate identity':['body','dex'], + 'change state':['body','str'], + 'cognition':['mind','per'], + 'connected':['soul','awa'], + 'control environment':['soul','wil'], + 'conversion':['body','con'], + 'data access':['mind','rea'], + 'dimension walk':['soul','wil'], + 'elasticity':['body','agi'], + 'exorcism':['soul','com'], + 'extra defenses':['mind','per'], + 'flight':['body','agi'], + 'force field':['body','str'], + 'ground speed':['body','agi'], + 'healing':['soul','wil'], + 'heightened awareness':['mind','per'], + 'heightened senses':['mind','per'], + 'illusion':['mind','cre'], + 'immovable':['body','str'], + 'immunity':['body','con'], + 'immutable':['body','con'], + 'inspire':['soul','cha'], + 'jumping':['body','agi'], + 'metamorphosis':['soul','wil'], + 'mimic':['mind','per'], + 'mind control':['mind','int'], + 'mind shield':['mind','int'], + 'minions':['soul','cha'], + 'mulligan':['soul','com'], + 'nullify':['soul','wil'], + 'plant control':['mind','cre'], + 'portal':['soul','wil'], + 'projection':['mind','cre'], + 'regeneration':['body','con'], + 'reincarnation':['soul','com'], + 'resilient':['body','con'], + 'sensory block':['mind','per'], + 'shield':['body','str'], + 'sixth sense':['soul','awa'], + 'size change':['body','con'], + 'spaceflight':['body','agi'], + 'special movement':['body','agi'], + 'summon creatures':['mind','int'], + 'supersense':['mind','per'], + 'superspeed':['body','agi'], + 'superstrength':['body','str'], + 'swarm':['mind','per'], + 'telekinesis':['mind','int'], + 'telepathy':['mind','int'], + 'teleport':['mind','per'], + 'transfer':['soul','wil'], + 'transmute':['soul','wil'], + 'tunnelling':['body','agi'], + 'unaffected':['body','con'], + 'undetectable':['body','con'], + 'water speed':['body','agi'] + }; + const isUsingMajorAspects = getIsUsingMajorAspects (debug, defectdb) ? 1 : 0; + const stat = attrs_stat_obj[`${attribute}`] || []; + const result = stat.length > 0 ? stat[isUsingMajorAspects] : ''; + return result; + } + + function getIsUsingMajorAspects (debug, defectdb) { + const isMajorAspect = _.chain(defectdb) + .map(defect => { + const rank = defect.name == 'shortcoming' ? + parseInt(defect.rank) : 0; + return rank; + }) + .reduce((memo, num)=>{ return memo + num; }, 0) + .value(); + const result = isMajorAspect > 0 ? true : false; + if(debug) console.log(`[getIsUsingMajorAspects()] result = ${result}`); + return result; + } + + function getAttrStandardEnhancements(debug, attribute) { + const standard_enhancements_obj = { + 'controlenvironment':['area','duration','range'], + 'dimensionwalk':['area'], + 'dynamicpowers':['area','duration','range','targets'], + 'exorcism':['area','range','targets'], + 'forcefield':['area','duration','range'], + 'healing':['area','range','targets'], + 'illusion':['area','duration','range','targets'], + 'merge':['duration'], + 'metamorphosis':['area','duration','range','targets'], + 'mimic':['duration','range'], + 'mindcontrol':['area','duration','range','targets'], + 'nullify':['area','duration','range','targets'], + 'plantcontrol':['duration'], + 'portal':['area','duration','range','targets'], + 'powerflux':['area','duration','range','targets'], + 'powervariation':['area','duration','range','targets'], + 'projection':['area','duration','range'], + 'sensoryblock':['area','duration','range'], + 'sixthsense':['area'], + 'sizechange':['duration'], + 'summoncreatures':['duration'], + 'telekinesis':['area','range'], + 'telepathy':['area','range','targets'], + 'teleport':['area','range','targets'], + 'transfer':['duration','range'], + 'transmute':['duration','range','targets'], + 'uniqueattribute':['area','duration','range','targets'], + 'unknownpower':['area','duration','range','targets'], + 'weapon':['area','duration','range'], + 'default':[] + }; + const result = standard_enhancements_obj[attribute] || + standard_enhancements_obj['default']; + if(debug) console.log(`[getAttrStandardEnhancements(${attribute})] result = ${result}`); + return result; + } + + function getCustomizationsTooltipString(debug, attrobj, attrdb) { + const base_values_obj = { + 'area':'Area: individual\n', + 'duration':'Duration: instant\n', + 'range':'Range: self or touch\n', + 'targets':'Targets: self or 1 target\n' + }; + const standard_enhancements_array = + getAttrStandardEnhancements(debug, attrobj.attribute); + const standardEnhancementsObj = standard_enhancements_array.length > 0 ? + standard_enhancements_array.reduce((o, key) => + ({ ...o, [key]: base_values_obj[key]}), {}) : + {}; + _.each(attrobj.customizations, c => { + const getRankString = rank => rank ? + c.name == 'area' || c.name == 'range' ? + getRange(debug, attrdb, c, 3, false) : + c.name == 'duration' ? + getDuration(debug, rank) : + c.name == 'targets' ? + getTargets(debug, rank) : + rank : + ''; + standardEnhancementsObj[`${c.name}`] = `${capital(c.name)}: ${getRankString(c.rank)}\n`; + }); + const result = _.values(standardEnhancementsObj).join(""); + if(debug) console.log(`[getCustomizationsTooltipString()] result = ${result}`); + return result; + } + + function buildActiveAttrTooltip(debug, attrdb, attribute, rowID) { + const defectdb = attrdb.defect; + const stat = getStatByAttr(debug, defectdb, attribute); + const attrobj = _.find(attrdb[`${attribute}`], attr => { + if (attr.source == rowID) return true; + }) || {}; + const customizations = getCustomizationsTooltipString(debug, attrobj, attrdb); + const result = stat.length > 0 ? `Stat: ${capital(stat)}\n${customizations}` : customizations; + if(debug) console.log(`[buildActiveAttrTooltip()] result = ${result}`); + return result; } function buildProtectionsString(debug, value, maneuver='') { @@ -11599,6 +13013,28 @@ }); } + function getIsCustomization(debug, sourceAttr) { + const result = + sourceAttr.includes("enhancement") || sourceAttr.includes("limiter") ? + true : false; + if(debug) console.log(`[getIsCustomization(${sourceAttr})] result = ${result}`); + return result; + } + + function getCustomizationType(debug, sourceAttr) { + const result = + sourceAttr.includes("enhancement") ? "enhancement" : + sourceAttr.includes("limiter") ? "limiter" : ""; + if(debug) console.log(`[getCustomizationType(${sourceAttr})] result = ${result}`); + return result; + } + + function getCustomizationName(debug, sourceAttr, type) { + const result = sourceAttr.replace(type, ''); + if(debug) console.log(`[getCustomizationName(${sourceAttr})] result = ${result}`); + return result; + } + function getStatStateArray(debug, value, sourceAttr, setObj, type, source = '') { const stats = type.major == 1 ? major_stats_array: allaspects_stats_array; const skill = source.length>0 ? `${source}_`: ''; @@ -11699,11 +13135,23 @@ } function buildStatButtonStatesArray() { + /* let result = []; const majorAndMinorArray = allaspects_stats_array.concat(major_stats_array); _.each(majorAndMinorArray, (stat) => { result[result.length] = `${stat.toLowerCase()}state`; }); + */ + const result = _.map(allaspects_stats_array.concat(major_stats_array), stat => { + return `${stat.toLowerCase()}state`; + }); + return result; + } + + function buildUnaffectedButtonStatesArray() { + const result = _.map(unaffected_attrs_array, m => { + return `${m}state`; + }); return result; } @@ -11721,17 +13169,24 @@ } function setStatButtonStatsAndRolls(debug, eventInfo, value, rowID, sourceAttr, setObj) { - const statButtonState = button => button == 'stat' ? - parseInt(value[`${sourceAttr}state`]) > 0 ? - setObj[`${sourceAttr}state`] = 0 : - setObj[`${sourceAttr}state`] = 1 : + const source = sourceAttr == "unaffected" ?//rowID == 'stat' || rowID == 'type' ? sourceAttr : + `repeating_attr_${rowID}_${removeWhiteSpace(eventInfo.htmlAttributes.value)}` : + sourceAttr; + const setButtonState = button => button == 'stat' || button == 'type' || + button.length == 20 ? + parseInt(value[`${source}state`]) > 0 ? + setObj[`${source}state`] = 0 : + setObj[`${source}state`] = 1 : false; - if (statButtonState(rowID) === false) return; - if (debug) console.log(`[setStatButtonStatsAndRolls(${sourceAttr})] statButtonState = ` + setObj[`${sourceAttr}state`]); - const isMajorAspectStat = button => allaspects_stats_regex.test(button) ? - setStatRoll(debug, value, sourceAttr, setObj, getStatType(value)) : major_stats_regex.test(button) ? - setStatRoll(debug, value, sourceAttr, setObj, getStatType(value)) : false; - isMajorAspectStat(eventInfo.triggerName); + if (setButtonState(rowID) === false) return; + if (debug) console.log(`[setStatButtonStatsAndRolls(${sourceAttr})] setButtonState = ` + setObj[`${source}state`]); + const type = getStatType(value); + const isMajorAspectStat = button => allaspects_stats_array.indexOf(button) >= 0 ? + setStatRoll(debug, value, sourceAttr, setObj, type) : + major_stats_array.indexOf(button) >= 0 ? + setStatRoll(debug, value, sourceAttr, setObj, type) : + false; + isMajorAspectStat(sourceAttr); } function setSkillCostBySpecilizationChange(debug, eventInfo, value, sectionName, rowID, setObj){ @@ -11891,6 +13346,8 @@ buttonsToRegister = [ "repeating_attr:setlock", "repeating_attr:activate", + "repeating_attr:options", + "repeating_attr:unaffected", "repeating_skilltemplate:addskill", "repeating_extraarm:armedstate", "repeating_skill", @@ -11905,6 +13362,7 @@ "static_button_offhand_armedstate" ].concat(statButtons), buttonString = `clicked:${buttonsToRegister.join(" clicked:")}`; + console.log(`[registerActions()] buttonString = ${buttonString}`); return buttonString; } @@ -11986,7 +13444,8 @@ console.log(`rowID = ${rowID}`); console.log(`sourceAttr = ${sourceAttr}`); - if (`${sourceType}` == `repeating` && /(costperlevel|visible|new|source|characteristic|rollable|attrdefecttoggle|damagetype)/i.test(`${sourceAttr}`)) return; + //if (`${sourceType}` == `repeating` && /(costperlevel|visible|new|source|characteristic|rollable|attrdefecttoggle|damagetype)/i.test(`${sourceAttr}`)) return; + if (sourceType == `repeating` && non_actionable_events.indexOf(sourceAttr) >= 0) return; var getAttrsString = [`show_debug_messages`]; var setObj = {}; @@ -12009,11 +13468,11 @@ getAttrsString = getAttrsString.concat(stats_array); getAttrsString = getAttrsString.concat(rolls_array); getAttrsString = getAttrsString.concat([ - `theme`, - `static_weapon_maneuver_name`, - `active_weapon`, - `static_attrgroup_selected_tab`, - `static_skillgroup_selected_tab` + 'theme', + 'static_weapon_maneuver_name', + 'active_weapon', + 'static_attrgroup_selected_tab', + 'static_skillgroup_selected_tab' ]); getAttrsString = getAttrsString.concat(size_template_values_array); getAttrsString = getAttrsString.concat(buildStatButtonStatesArray()); @@ -12039,16 +13498,19 @@ break; } if(debug){ console.log('[Changes To Sheet Values] setObj:'); console.log(setObj); } - setAttrs(setObj); + setAttrs(setObj,{silent:true}); } return; }else if (sourceType==`repeating`) { - const isCustomization = /(enhancement|limiter)/i.test(`${sourceAttr}`); - const customization = (isCustomization) ? - sourceAttr.replace(/(enhancement|limiter)/i, "") : ""; - const customizationType = - (sourceAttr.includes("enhancement")) ? "enhancement" : - (sourceAttr.includes("limiter")) ? "limiter" : ""; + const isCustomization = getIsCustomization(debug, sourceAttr);//(enhancement|limiter)/i.test(`${sourceAttr}`); + const customizationType = getCustomizationType(debug, sourceAttr); + const customization = (isCustomization) ? + { + name:`${getCustomizationName(debug, sourceAttr, customizationType)}`, + type:`${customizationType}` + } : + undefined; + sourceAttr = isCustomization ? 'customization' : sourceAttr; switch (sectionName) { case `attr`: const isNew = parseInt(value[`${source}_new`]) || 0; @@ -12057,15 +13519,8 @@ switch (sourceAttr) { case `options`: if (resetOnLocked(debug, eventInfo, value, match, rowID, setObj)) return; - if (eventInfo.newValue == '1') { - const isDefect = value[`${source}_attribute`] == 'defect' ? - true : false; - if (isDefect) { - setDefectCharacteristic(attrdb, value, rowID, setObj); - } else { - setAttrCharacteristic(debug, value, rowID, setObj); - } - } + const state = parseInt(value[`${source}_${sourceAttr}`]) > 0 ? 0: 1; + setObj[`${source}_${sourceAttr}`] = state; break; case `attribute`: if (resetOnLocked(debug, eventInfo, value, match, rowID, setObj)) return; @@ -12086,6 +13541,7 @@ setLevelElevation(eventInfo, source, `levelelevation`, setObj); setAttrCostByLevelChange(debug, attrdb, eventInfo, value, attrIDs, sectionName, rowID, sourceAttr, setObj); setEffectiveLevelByLevelChange(debug, eventInfo, value, sectionName, rowID, sourceAttr, setObj); + setAttrCharacteristic(debug, value, rowID, setObj); break; case `activate`: if (!getIsLocked(debug, value, rowID, sourceAttr)) return; @@ -12102,6 +13558,7 @@ break; case `lock`: if (resetOnActive(debug, eventInfo, value, match, rowID, setObj)) return; + if (eventInfo.newValue == "1") setObj[`${source}_options`] = 0; break; case 'defect': resetRank(value, rowID, setObj); @@ -12114,13 +13571,25 @@ case 'rank': setDefectPointsByRankChange(debug, attrdb, attrIDs, eventInfo, value, sectionName, rowID, setObj); break; + case 'customization': + exposeAttrSettingsOnCustomizationChange(debug, eventInfo, source, customization, setObj); + setCustomization(debug, eventInfo, value, rowID, customization, setObj); + setEffectiveLevelByCustomization(debug, eventInfo, value, customizationType, rowID, setObj); + setAttrCharacteristic(debug, value, rowID, setObj); + setAvailableDamageTypes(debug, value, rowID, setObj); + setUnaffectedWeapons(debug, eventInfo, value, rowID, customization, setObj); + break; + case 'unaffected': + setStatButtonStatsAndRolls(debug, eventInfo, value, rowID, sourceAttr, setObj); + setUnaffectedAttributes(debug, eventInfo, value, rowID, setObj); + break; default: - if (isCustomization) { - exposeAttrSettingsOnCustomizationChange(debug, eventInfo, source, sourceAttr, setObj); - setEffectiveLevelByCustomization(debug, eventInfo, value, customizationType, rowID, setObj); - setCustomization(debug, eventInfo, value, rowID, customization, setObj); - setAttrCharacteristic(debug, value, rowID, setObj); + const isDefect = value[`${source}_attribute`] == 'defect' ? + true : false; + if (isDefect) { + setDefectCharacteristic(attrdb, value, rowID, setObj); } + setStatButtonStatsAndRolls(debug, eventInfo, value, rowID, sourceAttr, setObj); } break; case `skill`: @@ -12178,7 +13647,7 @@ console.log('[Changes To Sheet Values] setObj:'); console.log(setObj); } - setAttrs(setObj); + setAttrs(setObj,{silent:true}); return; } else if (sourceType==`static`) { switch (sectionName) { @@ -12187,6 +13656,7 @@ case `autofire`: case `maneuver`: case `range`: + if (sectionName == 'weapon') setCombatRoll(debug, value, attrdb, value.active_weapon, sourceAttr, setObj); break; } @@ -12273,7 +13743,7 @@ break; } if(debug){ console.log('[Changes To Sheet Values] setObj:'); console.log(setObj); } - setAttrs(setObj); + setAttrs(setObj,{silent:true}); return; } else { if(debug) console.log(`[sourceType = ${sourceType}] no matching sourceType, exiting.`);