|
|
(18 intermediate revisions by 2 users not shown) |
Line 1: |
Line 1: |
− | /**
| + | let SCalStateCheck = setInterval(() => { |
− | * Skeleton Key Calculator V 0.2
| + | 'use strict'; |
− | * Elteria Shadowhand
| + | if (document.readyState === 'complete') { |
− | */
| + | clearInterval(SCalStateCheck); |
− | $(document).ready(function() {
| + | let mainDivId = 'SCalMain'; // ID of the main content box. Can be a <div> or whatever. |
− | if (document.getElementById('SCalMain')) {
| + | if (document.getElementById(mainDivId)) { |
− | let baseResources; // Collection of the needed base resources. To be filled.
| + | var url = mw.util.getUrl('Product Calculator', { product: 'Skeleton Key' }); |
− | let refinedResources; // Collection of the needed refined resources. To be filled.
| + | window.location.href = url; |
− | let initialKeyCount = 10;
| |
− | let maxKeyCount = 5000;
| |
− | let maxSkillCount = 2000;
| |
− | let skills = new Map();// a list of all skills needed.
| |
− |
| |
− | // let's add some relevant information.
| |
− | // needed amounts default to optimum skills
| |
− | let products = new Map();
| |
− | products.set('Skeleton Key', { subs: new Map(), skill:'Tinkering', minCount: 1, maxCount: 1, minSkill: 1100, maxSkill: 1425, type: 'SCalProduct' });
| |
− | products.get('Skeleton Key').subs
| |
− | .set('Enchanted Adamantium-Mithril Bar', { subs: new Map(), skill:'Tinkering', minCount: 3, maxCount: 6, minSkill: 1100, maxSkill: 1425, type: 'SCalProduct' });
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .set('Gozar\'s Blessing', { subs: new Map(), skill:'Scribing', minCount: 2, maxCount: 4, minSkill: 1100, maxSkill: 1425, type: 'SCalProduct' });
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Gozar\'s Blessing').subs
| |
− | .set('Meltanis\' Prayer', { subs: new Map(), skill:'Spellcraft', minCount: 1, maxCount: 3, minSkill: 1100, maxSkill: 1425, type: 'SCalProduct' });
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Gozar\'s Blessing').subs
| |
− | .get('Meltanis\' Prayer').subs
| |
− | .set('Travertine Spell Shard', { subs: new Map(), skill:'Spellcraft', minCount: 1, maxCount: 5, minSkill: 1100, maxSkill: 1425, type: 'SCalRefinedResource' });
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Gozar\'s Blessing').subs
| |
− | .get('Meltanis\' Prayer').subs
| |
− | .get('Travertine Spell Shard').subs
| |
− | .set('Travertine Brick', { subs: new Map(), skill:'Stoneworking', minCount: 2, maxCount: 5, minSkill: 1000, maxSkill: 1325, type: 'SCalRefinedResource' });
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Gozar\'s Blessing').subs
| |
− | .get('Meltanis\' Prayer').subs
| |
− | .get('Travertine Spell Shard').subs
| |
− | .get('Travertine Brick').subs
| |
− | .set('Travertine Slab', { skill:'Stoneworking', minCount: 2, maxCount: 5, minSkill: 1000, maxSkill: 1325 });
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Gozar\'s Blessing').subs
| |
− | .get('Meltanis\' Prayer').subs
| |
− | .set('Radiant Essence Orb', { subs: new Map(), skill:'Essence Shaping', minCount: 4, maxCount: 10, minSkill: 1000, maxSkill: 1325, type: 'SCalRefinedResource'});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Gozar\'s Blessing').subs
| |
− | .get('Meltanis\' Prayer').subs
| |
− | .get('Radiant Essence Orb').subs
| |
− | .set('Radiant Essence', { skill:'Essence Shaping', minCount: 2, maxCount: 5, minSkill: 1000, maxSkill: 1325});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Gozar\'s Blessing').subs
| |
− | .set('Primal Burst III', { subs: new Map(), skill:'Spellcraft', minCount: 1, maxCount: 3, minSkill: 930, maxSkill: 1130, type: 'SCalProduct'});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Gozar\'s Blessing').subs
| |
− | .get('Primal Burst III').subs
| |
− | .set('Marble Spell Shard', { subs: new Map(), skill:'Spellcraft', minCount: 5, maxCount: 5, minSkill: 930, maxSkill: 1130, type: 'SCalRefinedResource'});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Gozar\'s Blessing').subs
| |
− | .get('Primal Burst III').subs
| |
− | .get('Marble Spell Shard').subs
| |
− | .set('Marble Brick', { subs: new Map(), skill:'Stoneworking', minCount: 2, maxCount: 5, minSkill: 800, maxSkill: 1100, type: 'SCalRefinedResource'});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Gozar\'s Blessing').subs
| |
− | .get('Primal Burst III').subs
| |
− | .get('Marble Spell Shard').subs
| |
− | .get('Marble Brick').subs
| |
− | .set('Marble Slab', { skill:'Stoneworking', minCount: 2, maxCount: 5, minSkill: 800, maxSkill: 1100});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Gozar\'s Blessing').subs
| |
− | .get('Primal Burst III').subs
| |
− | .set('Shining Essence Orb', { subs: new Map(), skill:'Essence Shaping', minCount: 9, maxCount: 18, minSkill: 800, maxSkill: 1100, type: 'SCalRefinedResource'});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Gozar\'s Blessing').subs
| |
− | .get('Primal Burst III').subs
| |
− | .get('Shining Essence Orb').subs
| |
− | .set('Shining Essence', { skill:'Essence Shaping', minCount: 2, maxCount: 5, minSkill: 800, maxSkill: 1100});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Gozar\'s Blessing').subs
| |
− | .set('Energy Strike V', { subs: new Map(), skill:'Spellcraft', minCount: 1, maxCount: 3, minSkill: 850, maxSkill: 1050, type: 'SCalProduct'});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Gozar\'s Blessing').subs
| |
− | .get('Energy Strike V').subs
| |
− | .set('Marble Spell Shard', { subs: new Map(), skill:'Spellcraft', minCount: 4, maxCount: 4, minSkill: 800, maxSkill: 1100, type: 'SCalRefinedResource'});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Gozar\'s Blessing').subs
| |
− | .get('Energy Strike V').subs
| |
− | .get('Marble Spell Shard').subs
| |
− | .set('Marble Brick', { subs: new Map(), skill:'Stoneworking', minCount: 2, maxCount: 5, minSkill: 800, maxSkill: 1100, type: 'SCalRefinedResource'});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Gozar\'s Blessing').subs
| |
− | .get('Energy Strike V').subs
| |
− | .get('Marble Spell Shard').subs
| |
− | .get('Marble Brick').subs
| |
− | .set('Marble Slab', { skill:'Stoneworking', minCount: 2, maxCount: 5, minSkill: 800, maxSkill: 1100});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Gozar\'s Blessing').subs
| |
− | .get('Energy Strike V').subs
| |
− | .set('Shining Essence Orb', { subs: new Map(), skill:'Essence Shaping', minCount: 7, maxCount: 14, minSkill: 800, maxSkill: 1100, type: 'SCalRefinedResource'});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Gozar\'s Blessing').subs
| |
− | .get('Energy Strike V').subs
| |
− | .get('Shining Essence Orb').subs
| |
− | .set('Shining Essence', { skill:'Essence Shaping', minCount: 2, maxCount: 5, minSkill: 800, maxSkill: 1100});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Gozar\'s Blessing').subs
| |
− | .set('Ice Bomb V', { subs: new Map(), skill:'Spellcraft', minCount: 1, maxCount: 3, minSkill: 920, maxSkill: 1120, type: 'SCalProduct'});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Gozar\'s Blessing').subs
| |
− | .get('Ice Bomb V').subs
| |
− | .set('Marble Spell Shard', { subs: new Map(), skill:'Spellcraft', minCount: 5, maxCount: 5, minSkill: 800, maxSkill: 1100, type: 'SCalRefinedResource'});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Gozar\'s Blessing').subs
| |
− | .get('Ice Bomb V').subs
| |
− | .get('Marble Spell Shard').subs
| |
− | .set('Marble Brick', { subs: new Map(), skill:'Stoneworking', minCount: 2, maxCount: 5, minSkill: 800, maxSkill: 1100, type: 'SCalRefinedResource'});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Gozar\'s Blessing').subs
| |
− | .get('Ice Bomb V').subs
| |
− | .get('Marble Spell Shard').subs
| |
− | .get('Marble Brick').subs
| |
− | .set('Marble Slab', { skill:'Stoneworking', minCount: 2, maxCount: 5, minSkill: 800, maxSkill: 1100});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Gozar\'s Blessing').subs
| |
− | .get('Ice Bomb V').subs
| |
− | .set('Shining Essence Orb', { subs: new Map(), skill:'Essence Shaping', minCount: 9, maxCount: 18, minSkill: 800, maxSkill: 1100, type: 'SCalRefinedResource'});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Gozar\'s Blessing').subs
| |
− | .get('Ice Bomb V').subs
| |
− | .get('Shining Essence Orb').subs
| |
− | .set('Shining Essence', { skill:'Essence Shaping', minCount: 2, maxCount: 5, minSkill: 800, maxSkill: 1100});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Gozar\'s Blessing').subs
| |
− | .set('Fiery Strike V', { subs: new Map(), skill:'Spellcraft', minCount: 1, maxCount: 3, minSkill: 980, maxSkill: 1180, type: 'SCalProduct'});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Gozar\'s Blessing').subs
| |
− | .get('Fiery Strike V').subs
| |
− | .set('Marble Spell Shard', { subs: new Map(), skill:'Spellcraft', minCount: 6, maxCount: 6, minSkill: 800, maxSkill: 1100, type: 'SCalRefinedResource'});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Gozar\'s Blessing').subs
| |
− | .get('Fiery Strike V').subs
| |
− | .get('Marble Spell Shard').subs
| |
− | .set('Marble Brick', { subs: new Map(), skill:'Stoneworking', minCount: 2, maxCount: 5, minSkill: 800, maxSkill: 1100, type: 'SCalRefinedResource'});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Gozar\'s Blessing').subs
| |
− | .get('Fiery Strike V').subs
| |
− | .get('Marble Spell Shard').subs
| |
− | .get('Marble Brick').subs
| |
− | .set('Marble Slab', { skill:'Stoneworking', minCount: 2, maxCount: 5, minSkill: 800, maxSkill: 1100});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Gozar\'s Blessing').subs
| |
− | .get('Fiery Strike V').subs
| |
− | .set('Shining Essence Orb', { subs: new Map(), skill:'Essence Shaping', minCount: 11, maxCount: 22, minSkill: 800, maxSkill: 1100, type: 'SCalRefinedResource'});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Gozar\'s Blessing').subs
| |
− | .get('Fiery Strike V').subs
| |
− | .get('Shining Essence Orb').subs
| |
− | .set('Shining Essence', { skill:'Essence Shaping', minCount: 2, maxCount: 5, minSkill: 800, maxSkill: 1100});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Gozar\'s Blessing').subs
| |
− | .set('Gold Papyrus Sheet', { subs: new Map(), skill:'Papermaking', minCount: 2, maxCount: 5, minSkill: 1000, maxSkill: 1325, type: 'SCalRefinedResource'});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Gozar\'s Blessing').subs
| |
− | .get('Gold Papyrus Sheet').subs
| |
− | .set('Gold Papyrus Stem', { skill:'Papermaking', minCount: 2, maxCount: 5, minSkill: 1000, maxSkill: 1325});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .set('Hardened Adamantium-Mithril Bar', { subs: new Map(), skill:'Tinkering', minCount: 2, maxCount: 5, minSkill: 1100, maxSkill: 1425, type: 'SCalRefinedResource'});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Hardened Adamantium-Mithril Bar').subs
| |
− | .set('Solution of Majorita', { subs: new Map(), skill:'Alchemy', minCount: 2, maxCount: 5, minSkill: 1100, maxSkill: 1425, type: 'SCalRefinedResource'});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Hardened Adamantium-Mithril Bar').subs
| |
− | .get('Solution of Majorita').subs
| |
− | .set('Thornwood Bowl', { subs: new Map(), skill:'Alchemy', minCount: 1, maxCount: 3, minSkill: 1100, maxSkill: 1425, type: 'SCalRefinedResource'});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Hardened Adamantium-Mithril Bar').subs
| |
− | .get('Solution of Majorita').subs
| |
− | .get('Thornwood Bowl').subs
| |
− | .set('Thornwood Sap', { skill:'Papermaking', minCount: 3, maxCount: 6, minSkill: 1100, maxSkill: 1425});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Hardened Adamantium-Mithril Bar').subs
| |
− | .get('Solution of Majorita').subs
| |
− | .get('Thornwood Bowl').subs
| |
− | .set('Thornwood Board', { subs: new Map(), skill:'Lumbering', minCount: 5, maxCount: 10, minSkill: 1000, maxSkill: 1325, type: 'SCalRefinedResource'});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Hardened Adamantium-Mithril Bar').subs
| |
− | .get('Solution of Majorita').subs
| |
− | .get('Thornwood Bowl').subs
| |
− | .get('Thornwood Board').subs
| |
− | .set('Thornwood Log', { skill:'Lumbering', minCount: 2, maxCount: 5, minSkill: 1000, maxSkill: 1325});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Hardened Adamantium-Mithril Bar').subs
| |
− | .get('Solution of Majorita').subs
| |
− | .set('Crystallized Travertine Brick', { subs: new Map(), skill:'Stoneworking', minCount: 5, maxCount: 10, minSkill: 1000, maxSkill: 1325, type: 'SCalRefinedResource'});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Hardened Adamantium-Mithril Bar').subs
| |
− | .get('Solution of Majorita').subs
| |
− | .get('Crystallized Travertine Brick').subs
| |
− | .set('Unfocused Violet Azulyte Crystal', { skill:'Stoneworking', minCount: 1, maxCount: 5, minSkill: 1000, maxSkill: 1325});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Hardened Adamantium-Mithril Bar').subs
| |
− | .get('Solution of Majorita').subs
| |
− | .get('Crystallized Travertine Brick').subs
| |
− | .set('Travertine Slab', { skill:'Stoneworking', minCount: 1, maxCount: 5, minSkill: 1000, maxSkill: 1325});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Hardened Adamantium-Mithril Bar').subs
| |
− | .get('Solution of Majorita').subs
| |
− | .set('Purified Radiant Essence Orb', { subs: new Map(), skill:'Enchanting', minCount: 1, maxCount: 4, minSkill: 1100, maxSkill: 1325, type: 'SCalRefinedResource'});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Hardened Adamantium-Mithril Bar').subs
| |
− | .get('Solution of Majorita').subs
| |
− | .get('Purified Radiant Essence Orb').subs
| |
− | .set('Radiant Essence Orb', { subs: new Map(), skill:'Essence Shaping', minCount: 1, maxCount: 4, minSkill: 1100, maxSkill: 1325, type: 'SCalRefinedResource'});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Hardened Adamantium-Mithril Bar').subs
| |
− | .get('Solution of Majorita').subs
| |
− | .get('Purified Radiant Essence Orb').subs
| |
− | .get('Radiant Essence Orb').subs
| |
− | .set('Radiant Essence', { skill:'Essence Shaping', minCount: 2, maxCount: 5, minSkill: 1000, maxSkill: 1325});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Hardened Adamantium-Mithril Bar').subs
| |
− | .get('Solution of Majorita').subs
| |
− | .set('Water', { skill:'Alchemy', minCount: 15, maxCount: 30, minSkill: 1100, maxSkill: 1425});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Hardened Adamantium-Mithril Bar').subs
| |
− | .set('Adamantium-Mithril Bar', { subs: new Map(), skill:'Smelting', minCount: 1, maxCount: 1, minSkill: 1100, maxSkill: 1425, type: 'SCalRefinedResource'});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Hardened Adamantium-Mithril Bar').subs
| |
− | .get('Adamantium-Mithril Bar').subs
| |
− | .set('Mithril Ore', { skill:'Smelting', minCount: 3, maxCount: 6, minSkill: 1100, maxSkill: 1425});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Enchanted Adamantium-Mithril Bar').subs
| |
− | .get('Hardened Adamantium-Mithril Bar').subs
| |
− | .get('Adamantium-Mithril Bar').subs
| |
− | .set('Adamantium Ore', { skill:'Smelting', minCount: 3, maxCount: 6, minSkill: 1100, maxSkill: 1425});
| |
− | products.get('Skeleton Key').subs
| |
− | .set('Skeleton Key Mold', { subs: new Map(), skill:'Earthencraft', minCount: 1, maxCount: 1, minSkill: 1100, maxSkill: 1425, type: 'SCalProduct'});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Skeleton Key Mold').subs
| |
− | .set('Skeleton Key Pattern', { skill:'Earthencraft', minCount: 1, maxCount: 1, minSkill: 1100, maxSkill: 1425});
| |
− | products.get('Skeleton Key').subs
| |
− | .get('Skeleton Key Mold').subs
| |
− | .set('Porcelain Clay Chunk', { skill:'Earthencraft', minCount: 2, maxCount: 5, minSkill: 1100, maxSkill: 1425});
| |
− | | |
− | printHeader();
| |
− | | |
− | $('#SCalMain').append('<center><table>'
| |
− | + '<tr valign="top">'
| |
− | + '<td id="SCalResourcesrow1"></td>'
| |
− | + '<td id="SCalResourcesrow2"></td>'
| |
− | + '</tr>'
| |
− | + '</table></center>'
| |
− | );
| |
− | | |
− | $('#SCalResourcesrow1').append('<div id="SCalResources"></div>');
| |
− | | |
− | printLists();
| |
− | | |
− | //FUNCTIONS:
| |
− | function printHeader() {
| |
− | $('#SCalMain').append('<h1 id="SCalH1">The Calculator</h1>');
| |
− | $('#SCalMain').append('<center><label for="SCalCountInput" id="SCalCountInputLbl">How many Skeleton Keys would you want to create?</label></center>');
| |
− | $('#SCalMain').append('<center><input type="number" id="SCalCountInput" name="SCalCountInput" value="' + initialKeyCount + '" size="6"></center>');
| |
− | $('#SCalMain').append('<br />');
| |
− | $('#SCalMain').append('<hr />');
| |
− | $('#SCalMain').append('<center>Please enter your current skills in the fields below. Defaults to optimal skills.</center>');
| |
− | $('#SCalMain').append('<center><input type="button" id="SCalMaxSkillsBtn" value="Reset to optimal skills"></center>');
| |
− | $('#SCalMain').append('<center><div id="SCalSkills" style="column-count:3; width:fit-content; text-align:left"></div></center>');
| |
− | $('#SCalMain').append('<br />');
| |
− | $('#SCalMain').append('<center><input type="button" id="SCalCountBtn" value="Calculate now!"></center>');
| |
− | $('#SCalMain').append('<div id="SCalErrorText"></div>');
| |
− | $('#SCalMain').append('<hr />');
| |
− | | |
− | $('#SCalMaxSkillsBtn').click(function() {
| |
− | if(confirm('This will reset all of the skills! Are you really sure? ')) {
| |
− | for (var v of skills.values()) {
| |
− | $('#SCalSkill' + v + 'Input').val(maxSkillCount);
| |
− | $('#SCalSkill' + v + 'Input').change();
| |
− | };
| |
− | }
| |
− | });
| |
− | | |
− | $('#SCalCountBtn').click(function() {
| |
− | printLists();
| |
− | });
| |
− | | |
− | $('#SCalCountInput').keypress(function(event) {
| |
− | if (event.key === 'Enter') printLists();
| |
− | });
| |
− | | |
− | printSkillInputs();
| |
− | }
| |
− | | |
− | function printLists() {
| |
− | baseResources = new Map();
| |
− | refinedResources = new Map();
| |
− |
| |
− | if(validateInputs()) { // check if the input fields contain valid entries
| |
− |
| |
− | $('#SCalResources').html('');
| |
− | $('#SCalResources').append('<h2>Tree of needed products</h2>');
| |
− | products = recursiveCalculateNeedEffectives(products, parseInt($('#SCalCountInput').val()));
| |
− | var html = recursivePrintTreeProduct(products);
| |
− | $('#SCalResources').append(html);
| |
− | | |
− | printBaseResources();
| |
− | printRefinedResources();
| |
− | | |
− | mw.loader.using('jquery.tablesorter', function() {
| |
− | $('table.sortable').tablesorter({ sortList: [{ 0: 'asc' }] })
| |
− | });
| |
− | }
| |
− | }
| |
− | | |
− | function printSkillInputs() {
| |
− | recursiveDetermineSkills(products);
| |
− | for (var [key, value] of skills.entries()) {
| |
− | var id = 'SCalSkill' + value;
| |
− | var skill = getCookie(id + 'Input');
| |
− | | |
− | if(!isRealInteger(skill)) {
| |
− | skill = maxSkillCount;
| |
− | }
| |
− | | |
− | $('#SCalSkills').append('<input type="number" id="' + id + 'Input" name="' + id + '" size="6"><label for="' + id + '"> ' + key + '</label><br />');
| |
− | $('#' + id + 'Input').keypress(function(event) {
| |
− | if (event.key === 'Enter') {
| |
− | printLists();
| |
− | setCookie(id, skill, new Date(3030,1,4));
| |
− | }
| |
− | });
| |
− | $('#' + id + 'Input').change(function(event) {
| |
− | | |
− | setCookie(event.target.id, $('#' + event.target.id).val(), new Date(3030,1,4));
| |
− | });
| |
− | $('#SCalSkill' + value + 'Input').val(skill);
| |
− | }
| |
− | } | |
− | | |
− | function recursiveDetermineSkills(product) {
| |
− | product.forEach((obj) => {
| |
− | if(typeof obj.skill != 'undefined') {
| |
− | skills.set(obj.skill, obj.skill.replace(/\s/, ''));
| |
− | }
| |
− |
| |
− | if(obj.subs instanceof Map) {
| |
− | recursiveDetermineSkills(obj.subs);
| |
− | }
| |
− | });
| |
− | } | |
− |
| |
− | function recursivePrintTreeProduct(product) {
| |
− | var html = '';
| |
− | product.forEach((obj, value) => {
| |
− | html += '<ul>';
| |
− | html += '<li>';
| |
− | html += '<span class="' + obj.type + '"><a href="' + mw.util.getUrl(value) + '">' + value + '</a>: ' + obj.neededCount + '</span>';
| |
− | if(obj.subs instanceof Map) {
| |
− | html += recursivePrintTreeProduct(obj.subs);
| |
− | }
| |
− | html += '</ul>';
| |
− | html += '</li>'
| |
− | });
| |
− | return html;
| |
− | }
| |
− | | |
− | function recursiveCalculateNeedEffectives(product, previousCount) {
| |
− | product.forEach((value,key) => {
| |
− | var currentSkill;
| |
− | if(typeof value.skill != 'undefined') { // if we found a skill, use the value of the input field
| |
− | currentSkill = $('#SCalSkill' + skills.get(value.skill) + 'Input').val();
| |
− | } else {
| |
− | currentSkill = maxSkillCount;
| |
− | }
| |
− | var percent = (currentSkill - value.minSkill) / (value.maxSkill - value.minSkill);
| |
− | var needEffective = value.maxCount - ((value.maxCount - value.minCount) * percent);
| |
− | needEffective = Math.ceil(needEffective);
| |
− |
| |
− | if (needEffective < value.minCount) needEffective = value.minCount;
| |
− | if (needEffective > value.maxCount) needEffective = value.maxCount;
| |
− |
| |
− | value.neededCount = needEffective * previousCount;
| |
− | | |
− | if(!(value.subs instanceof Map)) { // we assume that a product without subs is a base resource
| |
− | if(baseResources.has(key)) {
| |
− | baseResources.set(key, value.neededCount + baseResources.get(key));
| |
− | } else {
| |
− | baseResources.set(key, value.neededCount);
| |
− | }
| |
− | }
| |
− | | |
− | if(value.type == 'SCalRefinedResource') {
| |
− | if(refinedResources.has(key)) {
| |
− | refinedResources.set(key, value.neededCount + refinedResources.get(key));
| |
− | } else {
| |
− | refinedResources.set(key, value.neededCount);
| |
− | }
| |
− | }
| |
− | | |
− | if(value.subs instanceof Map) {
| |
− | recursiveCalculateNeedEffectives(value.subs, value.neededCount);
| |
− | }
| |
− | });
| |
− | | |
− | return product;
| |
− | }
| |
− | | |
− | function printRefinedResources() {
| |
− | refinedResources = new Map([...refinedResources.entries()].sort());
| |
− | | |
− | $('#SCalResourcesrow2').append('<h2>Overview of refined resources</h2>');
| |
− | $('#SCalResourcesrow2').append('<table id="SCalRefinedResourceTable" class="wikitable sortable"><thead>'
| |
− | + '<tr>'
| |
− | + '<th align="left">Resource</th>'
| |
− | + '<th align="left">Need</th>'
| |
− | + '</tr></thead>'
| |
− | );
| |
− | | |
− | var tablecontent = '<tbody>'; | |
− | | |
− | refinedResources.forEach(function(value, key) {
| |
− | tablecontent += '<tr>'
| |
− | + '<td><a href="' + mw.util.getUrl(key) + '">' + key + '</a></td>'
| |
− | + '<td>' + value + '</td>'
| |
− | + '</tr>';
| |
− | });
| |
− | | |
− | tablecontent += '</tbody>';
| |
− | tablecontent += '</table>';
| |
− | $('#SCalRefinedResourceTable').append(tablecontent);
| |
− | }
| |
− | | |
− | function printBaseResources() {
| |
− | baseResources = new Map([...baseResources.entries()].sort());
| |
− | | |
− | $('#SCalResourcesrow2').html('');
| |
− | $('#SCalResourcesrow2').append('<h2>Overview of base resources</h2>');
| |
− | $('#SCalResourcesrow2').append('<table id="SCalBaseResourceTable" class="wikitable sortable"><thead>'
| |
− | + '<tr>'
| |
− | + '<th align="left">Resource</th>'
| |
− | + '<th align="left">Need</th>'
| |
− | + '</tr></thead>'
| |
− | );
| |
− | | |
− | var tablecontent = '<tbody>';
| |
− | | |
− | baseResources.forEach(function(value, key) {
| |
− | tablecontent += '<tr>'
| |
− | + '<td><a href="' + mw.util.getUrl(key) + '">' + key + '</a></td>'
| |
− | + '<td>' + value + '</td>'
| |
− | + '</tr>';
| |
− | });
| |
− | | |
− | tablecontent += '</tbody>';
| |
− | tablecontent += '</table>';
| |
− | | |
− | $('#SCalBaseResourceTable').append(tablecontent);
| |
− | }
| |
− | | |
− | function isRealInteger(number) {
| |
− | return (!isNaN(number) && parseInt(Number(number)) == number && !isNaN(parseInt(number, 10)));
| |
− | }
| |
− |
| |
− | function validateInputs() {
| |
− | var ready = true;
| |
− | //reset the error textfield
| |
− | $('#SCalErrorText').html('');
| |
− | | |
− | // check the keycounter value
| |
− | $('#SCalCountInput').removeClass('SCalErroreousInput');
| |
− | var number = $('#SCalCountInput').val();
| |
− | if (!isRealInteger(number)) {
| |
− | $('#SCalErrorText').append('<center>Amount of keys: this was not a number!</center>');
| |
− | $('#SCalCountInput').addClass('SCalErroreousInput');
| |
− | ready = false;
| |
− | } else {
| |
− | if (number < 1 || number > maxKeyCount) {
| |
− | $('#SCalErrorText').append('<center>Amount of keys: please provide a number between 1 and ' + maxKeyCount + '</center>');
| |
− | $('#SCalCountInput').addClass('SCalErroreousInput');
| |
− | ready = false;
| |
− | }
| |
− | }
| |
− | | |
− | //check the skills counters | |
− | for (var [skill, id] of skills) {
| |
− | $('#SCalSkill' + id + 'Input').removeClass('SCalErroreousInput');
| |
− | number = $('#SCalSkill' + id + 'Input').val();
| |
− | | |
− | if (!isRealInteger(number)) {
| |
− | $('#SCalErrorText').append('<center>' + skill + ': this was not a number!</center>');
| |
− | $('#SCalSkill' + id + 'Input').addClass('SCalErroreousInput');
| |
− | ready = false;
| |
− | } else {
| |
− | if (number < 1 || number > maxSkillCount) {
| |
− | $('#SCalErrorText').append('<center>' + skill + ': please provide a number between 1 and ' + maxSkillCount + '</center>');
| |
− | $('#SCalSkill' + id + 'Input').addClass('SCalErroreousInput');
| |
− | ready = false;
| |
− | }
| |
− | }
| |
− | }
| |
− | return ready;
| |
− | }
| |
− |
| |
− | function setCookie(name, value, date) {
| |
− | var expires = '; expires=' + date.toGMTString();
| |
− | var cookie = name + '=' + value + expires + '; path=/; SameSite=Strict';
| |
− | | |
− | document.cookie = cookie;
| |
− | }
| |
− | | |
− | function getCookie(name) {
| |
− | var nameEQ = name + '=';
| |
− | var ca = document.cookie.split(';');
| |
− | for(var i=0;i < ca.length;i++) {
| |
− | var c = ca[i];
| |
− | while (c.charAt(0)==' ') c = c.substring(1,c.length);
| |
− | if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
| |
− | }
| |
− | return null;
| |
| } | | } |
| } | | } |
− | }); | + | }, 50); |