fixed merge conflict
This commit is contained in:
commit
98dfe1c62c
20 changed files with 1590 additions and 836 deletions
|
@ -53,8 +53,8 @@
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<div class="row h-100 gx-lg-5 gy-3 mx-2 mx-lg-0">
|
<div class="row h-100 gx-lg-5 gy-3 mx-2 mx-lg-0">
|
||||||
<div class="col-xl-6">
|
<div class="col-xl-6">
|
||||||
<div class="row row-cols-1 gy-5">
|
<div class="row row-cols-1 mb-3">
|
||||||
<div class="col">
|
<div class="col py-3">
|
||||||
<div class="row row-cols-1 row-cols-xl-2 rounded gy-4 gx-5 justify-content-center">
|
<div class="row row-cols-1 row-cols-xl-2 rounded gy-4 gx-5 justify-content-center">
|
||||||
<div class="col-auto rounded order-xl-0 order-0">
|
<div class="col-auto rounded order-xl-0 order-0">
|
||||||
<div class="row h-100 dark-shadow dark-6 rounded" id="helmet-dropdown">
|
<div class="row h-100 dark-shadow dark-6 rounded" id="helmet-dropdown">
|
||||||
|
@ -324,8 +324,8 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col">
|
<div class="col py-3">
|
||||||
<div class="row row-cols-1 gy-2 pb-3 rounded dark-5 dark-shadow">
|
<div class="row row-cols-1 gy-2 rounded dark-5 dark-shadow">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<div class="row row-cols-2 row-cols-xl-5 gy-2 justify-content-center">
|
<div class="row row-cols-2 row-cols-xl-5 gy-2 justify-content-center">
|
||||||
<div class="col text-center gx-2">
|
<div class="col text-center gx-2">
|
||||||
|
@ -420,13 +420,13 @@
|
||||||
<div class="col fw-bold dark-4 rounded-top">
|
<div class="col fw-bold dark-4 rounded-top">
|
||||||
<div class = "row">
|
<div class = "row">
|
||||||
<div class = "col-4 py-2">
|
<div class = "col-4 py-2">
|
||||||
<button class = "button rounded scaled-font fw-bold text-light dark-5" id = "edit-ID-button" onclick = "toggle_tab('edit_id_tab'); toggleButton('edit-ID-button')">
|
<button class = "col-auto button rounded scaled-font fw-bold text-light dark-5" id = "toggle-tomes" onclick = "toggle_tab('tomes-dropdown'); toggleButton('toggle-tomes')">
|
||||||
Edit IDs
|
Show Tomes
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div class = "col-4 py-2">
|
<div class = "col-4 py-2">
|
||||||
<button class = "button rounded scaled-font fw-bold text-light dark-5" id = "edit-ID-button" onclick = "updateStats();">
|
<button class = "button rounded scaled-font fw-bold text-light dark-5" id = "edit-ID-button" onclick = "toggle_tab('edit_id_tab'); toggleButton('edit-ID-button')">
|
||||||
Update Stats
|
Edit IDs
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div class = "col-4 py-2">
|
<div class = "col-4 py-2">
|
||||||
|
@ -436,6 +436,178 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class = "col dark-6 rounded-bottom my-3 my-xl-1" id = "tomes-dropdown" style = "display: none;">
|
||||||
|
<div class="row h-100 row-cols-1 row-cols-xl-2 gy-2 rounded">
|
||||||
|
<div class="col-auto rounded">
|
||||||
|
<div class="row h-100 dark-shadow rounded" id='weaponTome1-dropdown'>
|
||||||
|
<div class="col-auto g-0 rounded-end my-auto text-center scaled-item-icon" id="weaponTome1-img-loc">
|
||||||
|
<img id="weaponTome1-img" class="img-fluid rounded" src="../media/items/new/generic-weaponTome.png">
|
||||||
|
</div>
|
||||||
|
<div class="col-3">
|
||||||
|
<div class="row row-cols-1 h-100 align-items-center">
|
||||||
|
<div class="col scaled-font fw-bold gx-3">
|
||||||
|
Weapon
|
||||||
|
</div>
|
||||||
|
<div class="col scaled-font fw-bold gx-3">
|
||||||
|
Tome
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col g-0 rounded">
|
||||||
|
<div class="row row-cols-1 h-100 align-items-center">
|
||||||
|
<div class="col d-flex justify-content-end">
|
||||||
|
<input class="equipment-input border-dark text-light dark-5 rounded scaled-font form-control form-control-sm" id="weaponTome1-choice" name="weaponTome1-choice" placeholder="No Tome" value=""/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-auto rounded">
|
||||||
|
<div class="row h-100 dark-shadow rounded" id='weaponTome2-dropdown'>
|
||||||
|
<div class="col-auto g-0 rounded-end my-auto text-center scaled-item-icon" id="weaponTome2-img-loc">
|
||||||
|
<img id="weaponTome2-img" class="img-fluid rounded" src="../media/items/new/generic-weaponTome.png">
|
||||||
|
</div>
|
||||||
|
<div class="col-3">
|
||||||
|
<div class="row row-cols-1 h-100 align-items-center">
|
||||||
|
<div class="col scaled-font fw-bold gx-3">
|
||||||
|
Weapon
|
||||||
|
</div>
|
||||||
|
<div class="col scaled-font fw-bold gx-3">
|
||||||
|
Tome
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col g-0 rounded">
|
||||||
|
<div class="row row-cols-1 h-100 align-items-center">
|
||||||
|
<div class="col d-flex justify-content-end">
|
||||||
|
<input class="equipment-input border-dark text-light dark-5 rounded scaled-font form-control form-control-sm" id="weaponTome2-choice" name="weaponTome2-choice" placeholder="No Tome" value=""/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-auto rounded">
|
||||||
|
<div class="row h-100 dark-shadow rounded" id='armorTome1-dropdown'>
|
||||||
|
<div class="col-auto g-0 rounded-end my-auto text-center scaled-item-icon" id="armorTome1-img-loc">
|
||||||
|
<img id="armorTome1-img" class="img-fluid rounded" src="../media/items/new/generic-armorTome.png">
|
||||||
|
</div>
|
||||||
|
<div class="col-3">
|
||||||
|
<div class="row row-cols-1 h-100 align-items-center">
|
||||||
|
<div class="col scaled-font fw-bold gx-3">
|
||||||
|
Armor
|
||||||
|
</div>
|
||||||
|
<div class="col scaled-font fw-bold gx-3">
|
||||||
|
Tome
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col g-0 rounded">
|
||||||
|
<div class="row row-cols-1 h-100 align-items-center">
|
||||||
|
<div class="col d-flex justify-content-end">
|
||||||
|
<input class="equipment-input border-dark text-light dark-5 rounded scaled-font form-control form-control-sm" id="armorTome1-choice" name="armorTome1-choice" placeholder="No Tome" value=""/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-auto rounded">
|
||||||
|
<div class="row h-100 dark-shadow rounded" id='armorTome2-dropdown'>
|
||||||
|
<div class="col-auto g-0 rounded-end my-auto text-center scaled-item-icon" id="armorTome2-img-loc">
|
||||||
|
<img id="armorTome2-img" class="img-fluid rounded" src="../media/items/new/generic-armorTome.png">
|
||||||
|
</div>
|
||||||
|
<div class="col-3">
|
||||||
|
<div class="row row-cols-1 h-100 align-items-center">
|
||||||
|
<div class="col scaled-font fw-bold gx-3">
|
||||||
|
Armor
|
||||||
|
</div>
|
||||||
|
<div class="col scaled-font fw-bold gx-3">
|
||||||
|
Tome
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col g-0 rounded">
|
||||||
|
<div class="row row-cols-1 h-100 align-items-center">
|
||||||
|
<div class="col d-flex justify-content-end">
|
||||||
|
<input class="equipment-input border-dark text-light dark-5 rounded scaled-font form-control form-control-sm" id="armorTome2-choice" name="armorTome2-choice" placeholder="No Tome" value=""/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-auto rounded">
|
||||||
|
<div class="row h-100 dark-shadow rounded" id='armorTome3-dropdown'>
|
||||||
|
<div class="col-auto g-0 rounded-end my-auto text-center scaled-item-icon" id="armorTome3-img-loc">
|
||||||
|
<img id="armorTome3-img" class="img-fluid rounded" src="../media/items/new/generic-armorTome.png">
|
||||||
|
</div>
|
||||||
|
<div class="col-3">
|
||||||
|
<div class="row row-cols-1 h-100 align-items-center">
|
||||||
|
<div class="col scaled-font fw-bold gx-3">
|
||||||
|
Armor
|
||||||
|
</div>
|
||||||
|
<div class="col scaled-font fw-bold gx-3">
|
||||||
|
Tome
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col g-0 rounded">
|
||||||
|
<div class="row row-cols-1 h-100 align-items-center">
|
||||||
|
<div class="col d-flex justify-content-end">
|
||||||
|
<input class="equipment-input border-dark text-light dark-5 rounded scaled-font form-control form-control-sm" id="armorTome3-choice" name="armorTome3-choice" placeholder="No Tome" value=""/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-auto rounded">
|
||||||
|
<div class="row h-100 dark-shadow rounded" id='armorTome4-dropdown'>
|
||||||
|
<div class="col-auto g-0 rounded-end my-auto text-center scaled-item-icon" id="armorTome4-img-loc">
|
||||||
|
<img id="armorTome4-img" class="img-fluid rounded" src="../media/items/new/generic-armorTome.png">
|
||||||
|
</div>
|
||||||
|
<div class="col-3">
|
||||||
|
<div class="row row-cols-1 h-100 align-items-center">
|
||||||
|
<div class="col scaled-font fw-bold gx-3">
|
||||||
|
Armor
|
||||||
|
</div>
|
||||||
|
<div class="col scaled-font fw-bold gx-3">
|
||||||
|
Tome
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col g-0 rounded">
|
||||||
|
<div class="row row-cols-1 h-100 align-items-center">
|
||||||
|
<div class="col d-flex justify-content-end">
|
||||||
|
<input class="equipment-input border-dark text-light dark-5 rounded scaled-font form-control form-control-sm" id="armorTome4-choice" name="armorTome4-choice" placeholder="No Tome" value=""/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-auto rounded">
|
||||||
|
<div class="row h-100 dark-shadow rounded" id='guildTome1-dropdown'>
|
||||||
|
<div class="col-auto g-0 rounded-end my-auto text-center scaled-item-icon" id="guildTome1-img-loc">
|
||||||
|
<img id="guildTome1-img" class="img-fluid rounded" src="../media/items/new/generic-guildTome.png">
|
||||||
|
</div>
|
||||||
|
<div class="col-3">
|
||||||
|
<div class="row row-cols-1 h-100 align-items-center">
|
||||||
|
<div class="col scaled-font fw-bold gx-3">
|
||||||
|
Guild
|
||||||
|
</div>
|
||||||
|
<div class="col scaled-font fw-bold gx-3">
|
||||||
|
Tome
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col g-0 rounded">
|
||||||
|
<div class="row row-cols-1 h-100 align-items-center">
|
||||||
|
<div class="col d-flex justify-content-end">
|
||||||
|
<input class="equipment-input border-dark text-light dark-5 rounded scaled-font form-control form-control-sm" id="guildTome1-choice" name="guildTome1-choice" placeholder="No Tome" value=""/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="col dark-6 rounded-bottom my-3 my-xl-1" id = "edit_id_tab" style = "display:none;">
|
<div class="col dark-6 rounded-bottom my-3 my-xl-1" id = "edit_id_tab" style = "display:none;">
|
||||||
<div class = "row big-title justify-content-center">
|
<div class = "row big-title justify-content-center">
|
||||||
Damage Stats
|
Damage Stats
|
||||||
|
@ -446,7 +618,7 @@
|
||||||
Spell Damage %:
|
Spell Damage %:
|
||||||
</div>
|
</div>
|
||||||
<div class = "row">
|
<div class = "row">
|
||||||
<input type = "number" placeholder = "0" id="sdPct" name="sdPct" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm"/>
|
<input type = "number" placeholder = "0" id="sdPct" name="sdPct" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm" oninput = "updateStats()"/>
|
||||||
</div>
|
</div>
|
||||||
<div class = "row" id = "sdPct-base">
|
<div class = "row" id = "sdPct-base">
|
||||||
Original Value: 0
|
Original Value: 0
|
||||||
|
@ -457,7 +629,7 @@
|
||||||
Spell Damage Raw:
|
Spell Damage Raw:
|
||||||
</div>
|
</div>
|
||||||
<div class = "row">
|
<div class = "row">
|
||||||
<input type = "number" placeholder = "0" id="sdRaw" name="sdRaw" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm"/>
|
<input type = "number" placeholder = "0" id="sdRaw" name="sdRaw" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm" oninput = "updateStats()"/>
|
||||||
</div>
|
</div>
|
||||||
<div class = "row" id = "sdRaw-base">
|
<div class = "row" id = "sdRaw-base">
|
||||||
Original Value: 0
|
Original Value: 0
|
||||||
|
@ -468,7 +640,7 @@
|
||||||
Melee Damage %:
|
Melee Damage %:
|
||||||
</div>
|
</div>
|
||||||
<div class = "row">
|
<div class = "row">
|
||||||
<input type = "number" placeholder = "0" id="mdPct" name="mdPct" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm"/>
|
<input type = "number" placeholder = "0" id="mdPct" name="mdPct" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm" oninput = "updateStats()"/>
|
||||||
</div>
|
</div>
|
||||||
<div class = "row" id = "mdPct-base">
|
<div class = "row" id = "mdPct-base">
|
||||||
Original Value: 0
|
Original Value: 0
|
||||||
|
@ -479,7 +651,7 @@
|
||||||
Melee Damage Raw:
|
Melee Damage Raw:
|
||||||
</div>
|
</div>
|
||||||
<div class = "row">
|
<div class = "row">
|
||||||
<input type = "number" placeholder = "0" id="mdRaw" name="mdRaw" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm"/>
|
<input type = "number" placeholder = "0" id="mdRaw" name="mdRaw" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm" oninput = "updateStats()"/>
|
||||||
</div>
|
</div>
|
||||||
<div class = "row" id = "mdRaw-base">
|
<div class = "row" id = "mdRaw-base">
|
||||||
Original Value: 0
|
Original Value: 0
|
||||||
|
@ -492,7 +664,7 @@
|
||||||
Poison:
|
Poison:
|
||||||
</div>
|
</div>
|
||||||
<div class = "row">
|
<div class = "row">
|
||||||
<input type = "number" placeholder = "0" id="poison" name="poison" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm"/>
|
<input type = "number" placeholder = "0" id="poison" name="poison" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm" oninput = "updateStats()"/>
|
||||||
</div>
|
</div>
|
||||||
<div class = "row" id = "poison-base">
|
<div class = "row" id = "poison-base">
|
||||||
Original Value: 0
|
Original Value: 0
|
||||||
|
@ -503,7 +675,7 @@
|
||||||
Damage %:
|
Damage %:
|
||||||
</div>
|
</div>
|
||||||
<div class = "row">
|
<div class = "row">
|
||||||
<input type = "number" placeholder = "0" id="eDamPct" name="eDamPct" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm"/>
|
<input type = "number" placeholder = "0" id="eDamPct" name="eDamPct" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm" oninput = "updateStats()"/>
|
||||||
</div>
|
</div>
|
||||||
<div class = "row" id = "eDamPct-base">
|
<div class = "row" id = "eDamPct-base">
|
||||||
Original Value: 0
|
Original Value: 0
|
||||||
|
@ -514,7 +686,7 @@
|
||||||
Damage %:
|
Damage %:
|
||||||
</div>
|
</div>
|
||||||
<div class = "row">
|
<div class = "row">
|
||||||
<input type = "number" placeholder = "0" id="tDamPct" name="tDamPct" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm"/>
|
<input type = "number" placeholder = "0" id="tDamPct" name="tDamPct" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm" oninput = "updateStats()"/>
|
||||||
</div>
|
</div>
|
||||||
<div class = "row" id = "tDamPct-base">
|
<div class = "row" id = "tDamPct-base">
|
||||||
Original Value: 0
|
Original Value: 0
|
||||||
|
@ -525,7 +697,7 @@
|
||||||
Damage %:
|
Damage %:
|
||||||
</div>
|
</div>
|
||||||
<div class = "row">
|
<div class = "row">
|
||||||
<input type = "number" placeholder = "0" id="wDamPct" name="wDamPct" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm"/>
|
<input type = "number" placeholder = "0" id="wDamPct" name="wDamPct" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm" oninput = "updateStats()"/>
|
||||||
</div>
|
</div>
|
||||||
<div class = "row" id = "wDamPct-base">
|
<div class = "row" id = "wDamPct-base">
|
||||||
Original Value: 0
|
Original Value: 0
|
||||||
|
@ -538,7 +710,7 @@
|
||||||
Damage %:
|
Damage %:
|
||||||
</div>
|
</div>
|
||||||
<div class = "row">
|
<div class = "row">
|
||||||
<input type = "number" placeholder = "0" id="fDamPct" name="fDamPct" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm"/>
|
<input type = "number" placeholder = "0" id="fDamPct" name="fDamPct" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm" oninput = "updateStats()"/>
|
||||||
</div>
|
</div>
|
||||||
<div class = "row" id = "fDamPct-base">
|
<div class = "row" id = "fDamPct-base">
|
||||||
Original Value: 0
|
Original Value: 0
|
||||||
|
@ -549,7 +721,7 @@
|
||||||
Damage %:
|
Damage %:
|
||||||
</div>
|
</div>
|
||||||
<div class = "row">
|
<div class = "row">
|
||||||
<input type = "number" placeholder = "0" id="aDamPct" name="aDamPct" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm"/>
|
<input type = "number" placeholder = "0" id="aDamPct" name="aDamPct" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm" oninput = "updateStats()"/>
|
||||||
</div>
|
</div>
|
||||||
<div class = "row" id = "aDamPct-base">
|
<div class = "row" id = "aDamPct-base">
|
||||||
Original Value: 0
|
Original Value: 0
|
||||||
|
@ -560,7 +732,7 @@
|
||||||
+ Tier:
|
+ Tier:
|
||||||
</div>
|
</div>
|
||||||
<div class = "row">
|
<div class = "row">
|
||||||
<input type = "number" placeholder = "0" id="atkTier" name="atkTier" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm"/>
|
<input type = "number" placeholder = "0" id="atkTier" name="atkTier" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm" oninput = "updateStats()"/>
|
||||||
</div>
|
</div>
|
||||||
<div class = "row" id = "atkTier-base">
|
<div class = "row" id = "atkTier-base">
|
||||||
Original Value: 0
|
Original Value: 0
|
||||||
|
@ -579,7 +751,7 @@
|
||||||
Defense %:
|
Defense %:
|
||||||
</div>
|
</div>
|
||||||
<div class = "row">
|
<div class = "row">
|
||||||
<input type = "number" placeholder = "0" id="eDefPct" name="eDefPct" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm"/>
|
<input type = "number" placeholder = "0" id="eDefPct" name="eDefPct" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm" oninput = "updateStats()"/>
|
||||||
</div>
|
</div>
|
||||||
<div class = "row" id = "eDefPct-base">
|
<div class = "row" id = "eDefPct-base">
|
||||||
Original Value: 0
|
Original Value: 0
|
||||||
|
@ -590,7 +762,7 @@
|
||||||
Defense %:
|
Defense %:
|
||||||
</div>
|
</div>
|
||||||
<div class = "row">
|
<div class = "row">
|
||||||
<input type = "number" placeholder = "0" id="tDefPct" name="tDefPct" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm"/>
|
<input type = "number" placeholder = "0" id="tDefPct" name="tDefPct" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm" oninput = "updateStats()"/>
|
||||||
</div>
|
</div>
|
||||||
<div class = "row" id = "tDefPct-base">
|
<div class = "row" id = "tDefPct-base">
|
||||||
Original Value: 0
|
Original Value: 0
|
||||||
|
@ -601,7 +773,7 @@
|
||||||
Defense %:
|
Defense %:
|
||||||
</div>
|
</div>
|
||||||
<div class = "row">
|
<div class = "row">
|
||||||
<input type = "number" placeholder = "0" id="wDefPct" name="wDefPct" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm"/>
|
<input type = "number" placeholder = "0" id="wDefPct" name="wDefPct" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm" oninput = "updateStats()"/>
|
||||||
</div>
|
</div>
|
||||||
<div class = "row" id = "wDefPct-base">
|
<div class = "row" id = "wDefPct-base">
|
||||||
Original Value: 0
|
Original Value: 0
|
||||||
|
@ -612,7 +784,7 @@
|
||||||
Defense %:
|
Defense %:
|
||||||
</div>
|
</div>
|
||||||
<div class = "row">
|
<div class = "row">
|
||||||
<input type = "number" placeholder = "0" id="fDefPct" name="fDefPct" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm"/>
|
<input type = "number" placeholder = "0" id="fDefPct" name="fDefPct" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm" oninput = "updateStats()"/>
|
||||||
</div>
|
</div>
|
||||||
<div class = "row" id = "fDefPct-base">
|
<div class = "row" id = "fDefPct-base">
|
||||||
Original Value: 0
|
Original Value: 0
|
||||||
|
@ -625,7 +797,7 @@
|
||||||
Defense %:
|
Defense %:
|
||||||
</div>
|
</div>
|
||||||
<div class = "row">
|
<div class = "row">
|
||||||
<input type = "number" placeholder = "0" id="aDefPct" name="aDefPct" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm"/>
|
<input type = "number" placeholder = "0" id="aDefPct" name="aDefPct" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm" oninput = "updateStats()"/>
|
||||||
</div>
|
</div>
|
||||||
<div class = "row" id = "aDefPct-base">
|
<div class = "row" id = "aDefPct-base">
|
||||||
Original Value: 0
|
Original Value: 0
|
||||||
|
@ -636,7 +808,7 @@
|
||||||
Health Regen Raw:
|
Health Regen Raw:
|
||||||
</div>
|
</div>
|
||||||
<div class = "row">
|
<div class = "row">
|
||||||
<input type = "number" placeholder = "0" id="hprRaw" name="hprRaw" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm"/>
|
<input type = "number" placeholder = "0" id="hprRaw" name="hprRaw" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm" oninput = "updateStats()"/>
|
||||||
</div>
|
</div>
|
||||||
<div class = "row" id = "hprRaw-base">
|
<div class = "row" id = "hprRaw-base">
|
||||||
Original Value: 0
|
Original Value: 0
|
||||||
|
@ -647,7 +819,7 @@
|
||||||
Health Regen %:
|
Health Regen %:
|
||||||
</div>
|
</div>
|
||||||
<div class = "row">
|
<div class = "row">
|
||||||
<input type = "number" placeholder = "0" id="hprPct" name="hprPct" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm"/>
|
<input type = "number" placeholder = "0" id="hprPct" name="hprPct" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm" oninput = "updateStats()"/>
|
||||||
</div>
|
</div>
|
||||||
<div class = "row" id = "hprPct-base">
|
<div class = "row" id = "hprPct-base">
|
||||||
Original Value: 0
|
Original Value: 0
|
||||||
|
@ -658,7 +830,7 @@
|
||||||
Health Bonus:
|
Health Bonus:
|
||||||
</div>
|
</div>
|
||||||
<div class = "row">
|
<div class = "row">
|
||||||
<input type = "number" placeholder = "0" id="hpBonus" name="hpBonus" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm"/>
|
<input type = "number" placeholder = "0" id="hpBonus" name="hpBonus" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm" oninput = "updateStats()"/>
|
||||||
</div>
|
</div>
|
||||||
<div class = "row" id = "hpBonus-base">
|
<div class = "row" id = "hpBonus-base">
|
||||||
Original Value: 0
|
Original Value: 0
|
||||||
|
@ -674,7 +846,7 @@
|
||||||
1st Spell Cost %:
|
1st Spell Cost %:
|
||||||
</div>
|
</div>
|
||||||
<div class = "row">
|
<div class = "row">
|
||||||
<input type = "number" placeholder = "0" id="spPct1" name="spPct1" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm"/>
|
<input type = "number" placeholder = "0" id="spPct1" name="spPct1" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm" oninput = "updateStats()"/>
|
||||||
</div>
|
</div>
|
||||||
<div class = "row" id = "spPct1-base">
|
<div class = "row" id = "spPct1-base">
|
||||||
Original Value: 0
|
Original Value: 0
|
||||||
|
@ -685,7 +857,7 @@
|
||||||
2nd Spell Cost %:
|
2nd Spell Cost %:
|
||||||
</div>
|
</div>
|
||||||
<div class = "row">
|
<div class = "row">
|
||||||
<input type = "number" placeholder = "0" id="spPct2" name="spPct2" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm"/>
|
<input type = "number" placeholder = "0" id="spPct2" name="spPct2" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm" oninput = "updateStats()"/>
|
||||||
</div>
|
</div>
|
||||||
<div class = "row" id = "spPct2-base">
|
<div class = "row" id = "spPct2-base">
|
||||||
Original Value: 0
|
Original Value: 0
|
||||||
|
@ -696,7 +868,7 @@
|
||||||
3rd Spell Cost %:
|
3rd Spell Cost %:
|
||||||
</div>
|
</div>
|
||||||
<div class = "row">
|
<div class = "row">
|
||||||
<input type = "number" placeholder = "0" id="spPct3" name="spPct3" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm"/>
|
<input type = "number" placeholder = "0" id="spPct3" name="spPct3" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm" oninput = "updateStats()"/>
|
||||||
</div>
|
</div>
|
||||||
<div class = "row" id = "spPct3-base">
|
<div class = "row" id = "spPct3-base">
|
||||||
Original Value: 0
|
Original Value: 0
|
||||||
|
@ -707,7 +879,7 @@
|
||||||
4th Spell Cost %:
|
4th Spell Cost %:
|
||||||
</div>
|
</div>
|
||||||
<div class = "row">
|
<div class = "row">
|
||||||
<input type = "number" placeholder = "0" id="spPct4" name="spPct4" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm"/>
|
<input type = "number" placeholder = "0" id="spPct4" name="spPct4" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm" oninput = "updateStats()"/>
|
||||||
</div>
|
</div>
|
||||||
<div class = "row" id = "spPct4-base">
|
<div class = "row" id = "spPct4-base">
|
||||||
Original Value: 0
|
Original Value: 0
|
||||||
|
@ -720,7 +892,7 @@
|
||||||
1st Spell Cost Raw:
|
1st Spell Cost Raw:
|
||||||
</div>
|
</div>
|
||||||
<div class = "row">
|
<div class = "row">
|
||||||
<input type = "number" placeholder = "0" id="spRaw1" name="spRaw1" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm"/>
|
<input type = "number" placeholder = "0" id="spRaw1" name="spRaw1" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm" oninput = "updateStats()"/>
|
||||||
</div>
|
</div>
|
||||||
<div class = "row" id = "spRaw1-base">
|
<div class = "row" id = "spRaw1-base">
|
||||||
Original Value: 0
|
Original Value: 0
|
||||||
|
@ -731,7 +903,7 @@
|
||||||
2nd Spell Cost Raw:
|
2nd Spell Cost Raw:
|
||||||
</div>
|
</div>
|
||||||
<div class = "row">
|
<div class = "row">
|
||||||
<input type = "number" placeholder = "0" id="spRaw2" name="spRaw2" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm"/>
|
<input type = "number" placeholder = "0" id="spRaw2" name="spRaw2" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm" oninput = "updateStats()"/>
|
||||||
</div>
|
</div>
|
||||||
<div class = "row" id = "spRaw2-base">
|
<div class = "row" id = "spRaw2-base">
|
||||||
Original Value: 0
|
Original Value: 0
|
||||||
|
@ -742,7 +914,7 @@
|
||||||
3rd Spell Cost Raw:
|
3rd Spell Cost Raw:
|
||||||
</div>
|
</div>
|
||||||
<div class = "row">
|
<div class = "row">
|
||||||
<input type = "number" placeholder = "0" id="spRaw3" name="spRaw3" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm"/>
|
<input type = "number" placeholder = "0" id="spRaw3" name="spRaw3" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm" oninput = "updateStats()"/>
|
||||||
</div>
|
</div>
|
||||||
<div class = "row" id = "spRaw3-base">
|
<div class = "row" id = "spRaw3-base">
|
||||||
Original Value: 0
|
Original Value: 0
|
||||||
|
@ -753,7 +925,7 @@
|
||||||
4th Spell Cost Raw:
|
4th Spell Cost Raw:
|
||||||
</div>
|
</div>
|
||||||
<div class = "row">
|
<div class = "row">
|
||||||
<input type = "number" placeholder = "0" id="spRaw4" name="spRaw4" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm"/>
|
<input type = "number" placeholder = "0" id="spRaw4" name="spRaw4" value="0" class="border-semi-dark border-2 text-light dark-5 rounded scaled-font form-control form-control-sm" oninput = "updateStats()"/>
|
||||||
</div>
|
</div>
|
||||||
<div class = "row" id = "spRaw4-base">
|
<div class = "row" id = "spRaw4-base">
|
||||||
Original Value: 0
|
Original Value: 0
|
||||||
|
@ -1118,6 +1290,20 @@
|
||||||
</div>
|
</div>
|
||||||
<div id="weapon-tooltip" class="rounded row row-cols-1 g-0 scaled-font float-tooltip border border-3 border-dark dark-shadow p-3">
|
<div id="weapon-tooltip" class="rounded row row-cols-1 g-0 scaled-font float-tooltip border border-3 border-dark dark-shadow p-3">
|
||||||
</div>
|
</div>
|
||||||
|
<div id="weaponTome1-tooltip" class="rounded row row-cols-1 g-0 scaled-font float-tooltip border border-3 border-dark dark-shadow p-3">
|
||||||
|
</div>
|
||||||
|
<div id="weaponTome2-tooltip" class="rounded row row-cols-1 g-0 scaled-font float-tooltip border border-3 border-dark dark-shadow p-3">
|
||||||
|
</div>
|
||||||
|
<div id="armorTome1-tooltip" class="rounded row row-cols-1 g-0 scaled-font float-tooltip border border-3 border-dark dark-shadow p-3">
|
||||||
|
</div>
|
||||||
|
<div id="armorTome2-tooltip" class="rounded row row-cols-1 g-0 scaled-font float-tooltip border border-3 border-dark dark-shadow p-3">
|
||||||
|
</div>
|
||||||
|
<div id="armorTome3-tooltip" class="rounded row row-cols-1 g-0 scaled-font float-tooltip border border-3 border-dark dark-shadow p-3">
|
||||||
|
</div>
|
||||||
|
<div id="armorTome4-tooltip" class="rounded row row-cols-1 g-0 scaled-font float-tooltip border border-3 border-dark dark-shadow p-3">
|
||||||
|
</div>
|
||||||
|
<div id="guildTome1-tooltip" class="rounded row row-cols-1 g-0 scaled-font float-tooltip border border-3 border-dark dark-shadow p-3">
|
||||||
|
</div>
|
||||||
<div class="rounded row row-cols-1 g-0 scaled-font float-tooltip border border-3 border-dark dark-shadow p-3" id = "build-order">
|
<div class="rounded row row-cols-1 g-0 scaled-font float-tooltip border border-3 border-dark dark-shadow p-3" id = "build-order">
|
||||||
</div>
|
</div>
|
||||||
<div class = "rounded row row-cols-1 g-0 scaled-font float-tooltip border border-3 border-dark p-3" id = "set-info"></div>
|
<div class = "rounded row row-cols-1 g-0 scaled-font float-tooltip border border-3 border-dark p-3" id = "set-info"></div>
|
||||||
|
@ -1209,6 +1395,7 @@
|
||||||
<script type="text/javascript" src="../js/query_2.js"></script>
|
<script type="text/javascript" src="../js/query_2.js"></script>
|
||||||
<script type="text/javascript" src="../js/load.js"></script>
|
<script type="text/javascript" src="../js/load.js"></script>
|
||||||
<script type="text/javascript" src="../js/load_ing.js"></script>
|
<script type="text/javascript" src="../js/load_ing.js"></script>
|
||||||
|
<script type="text/javascript" src="../js/load_tome.js"></script>
|
||||||
<script type="text/javascript" src="../js/custom.js"></script>
|
<script type="text/javascript" src="../js/custom.js"></script>
|
||||||
<script type="text/javascript" src="../js/craft.js"></script>
|
<script type="text/javascript" src="../js/craft.js"></script>
|
||||||
<script type="text/javascript" src="../js/sq2build.js"></script>
|
<script type="text/javascript" src="../js/sq2build.js"></script>
|
||||||
|
|
|
@ -173,3 +173,7 @@ Wynn-Related CSS
|
||||||
}
|
}
|
||||||
|
|
||||||
.aDam:before, .Air:before, .Air_powder:before { content: "\274b" ' '; }
|
.aDam:before, .Air:before, .Air_powder:before { content: "\274b" ' '; }
|
||||||
|
|
||||||
|
.restrict {
|
||||||
|
color: #ff8180;
|
||||||
|
}
|
|
@ -51,7 +51,7 @@ const armorTypes = [ "helmet", "chestplate", "leggings", "boots" ];
|
||||||
const accessoryTypes = [ "ring", "bracelet", "necklace" ];
|
const accessoryTypes = [ "ring", "bracelet", "necklace" ];
|
||||||
const weaponTypes = [ "wand", "spear", "bow", "dagger", "relik" ];
|
const weaponTypes = [ "wand", "spear", "bow", "dagger", "relik" ];
|
||||||
const consumableTypes = [ "potion", "scroll", "food"];
|
const consumableTypes = [ "potion", "scroll", "food"];
|
||||||
const tomeTypes = ["armorTome", "weaponTome", "guildTome", "dungeonTome", "gatheringTome", "slayingTome"]
|
const tomeTypes = ["armorTome", "weaponTome", "guildTome"]; //"dungeonTome", "gatheringTome", "slayingTome"
|
||||||
const attackSpeeds = ["SUPER_SLOW", "VERY_SLOW", "SLOW", "NORMAL", "FAST", "VERY_FAST", "SUPER_FAST"];
|
const attackSpeeds = ["SUPER_SLOW", "VERY_SLOW", "SLOW", "NORMAL", "FAST", "VERY_FAST", "SUPER_FAST"];
|
||||||
const baseDamageMultiplier = [ 0.51, 0.83, 1.5, 2.05, 2.5, 3.1, 4.3 ];
|
const baseDamageMultiplier = [ 0.51, 0.83, 1.5, 2.05, 2.5, 3.1, 4.3 ];
|
||||||
//0.51, 0.82, 1.50, 2.05, 2.50, 3.11, 4.27
|
//0.51, 0.82, 1.50, 2.05, 2.50, 3.11, 4.27
|
||||||
|
|
|
@ -238,7 +238,7 @@ function init_maps() {
|
||||||
item.has_negstat = false;
|
item.has_negstat = false;
|
||||||
item.reqs = [0, 0, 0, 0, 0];
|
item.reqs = [0, 0, 0, 0, 0];
|
||||||
item.fixID = true;
|
item.fixID = true;
|
||||||
item.tier = "Normal";//do not get rid of this @hpp
|
item.tier = "Normal";
|
||||||
item.id = 10000 + i;
|
item.id = 10000 + i;
|
||||||
item.nDam = "0-0";
|
item.nDam = "0-0";
|
||||||
item.eDam = "0-0";
|
item.eDam = "0-0";
|
||||||
|
|
184
js/load_tome.js
Normal file
184
js/load_tome.js
Normal file
|
@ -0,0 +1,184 @@
|
||||||
|
const TOME_DB_VERSION = 1;
|
||||||
|
// @See https://github.com/mdn/learning-area/blob/master/javascript/apis/client-side-storage/indexeddb/video-store/index.jsA
|
||||||
|
|
||||||
|
let tdb;
|
||||||
|
let treload = false;
|
||||||
|
let tload_complete = false;
|
||||||
|
let tload_in_progress = false;
|
||||||
|
let tomes;
|
||||||
|
let tomeMap;
|
||||||
|
let tometomeIDMap;
|
||||||
|
let tomeRedirectMap;
|
||||||
|
let tomeLists = new Map();
|
||||||
|
/*
|
||||||
|
* Load tome set from local DB. Calls init() on success.
|
||||||
|
*/
|
||||||
|
async function load_tome_local(init_func) {
|
||||||
|
let get_tx = tdb.transaction(['tome_db'], 'readonly');
|
||||||
|
let get_store = get_tx.objectStore('tome_db');
|
||||||
|
let request = get_store.getAll();
|
||||||
|
request.onerror = function(event) {
|
||||||
|
console.log("Could not read local tome db...");
|
||||||
|
}
|
||||||
|
request.onsuccess = function(event) {
|
||||||
|
console.log("Successfully read local tome db.");
|
||||||
|
tomes = request.result;
|
||||||
|
|
||||||
|
init_tome_maps();
|
||||||
|
init_func();
|
||||||
|
tload_complete = true;
|
||||||
|
}
|
||||||
|
await get_tx.complete;
|
||||||
|
tdb.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Load tome set from remote DB (json). Calls init() on success.
|
||||||
|
*/
|
||||||
|
async function load_tome(init_func) {
|
||||||
|
|
||||||
|
let getUrl = window.location;
|
||||||
|
let baseUrl = getUrl.protocol + "//" + getUrl.host + "/";// + getUrl.pathname.split('/')[1];
|
||||||
|
// "Random" string to prevent caching!
|
||||||
|
let url = baseUrl + "/tomes.json?"+new Date();
|
||||||
|
let result = await (await fetch(url)).json();
|
||||||
|
tomes = result.tomes
|
||||||
|
|
||||||
|
let add_tx = tdb.transaction(['tome_db'], 'readwrite');
|
||||||
|
add_tx.onabort = function(e) {
|
||||||
|
console.log(e);
|
||||||
|
console.log("Not enough space...");
|
||||||
|
};
|
||||||
|
let tomes_store = add_tx.objectStore('tome_db');
|
||||||
|
let add_promises = [];
|
||||||
|
for (const tome of tomes) {
|
||||||
|
//dependency on clean_item in load.js
|
||||||
|
clean_item(tome);
|
||||||
|
let req = tomes_store.add(tome, tome.name);
|
||||||
|
req.onerror = function() {
|
||||||
|
console.log("ADD TOME ERROR? " + tome.name);
|
||||||
|
};
|
||||||
|
add_promises.push(req);
|
||||||
|
}
|
||||||
|
Promise.all(add_promises).then((values) => {
|
||||||
|
init_tome_maps();
|
||||||
|
init_func();
|
||||||
|
tload_complete = true;
|
||||||
|
});
|
||||||
|
// DB not closed? idfk man
|
||||||
|
}
|
||||||
|
|
||||||
|
function load_tome_init(init_func) {
|
||||||
|
if (tload_complete) {
|
||||||
|
console.log("Tome db already loaded, skipping load sequence");
|
||||||
|
init_func();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let request = window.indexedDB.open('tome_db', TOME_DB_VERSION);
|
||||||
|
|
||||||
|
request.onerror = function() {
|
||||||
|
console.log("DB failed to open...");
|
||||||
|
};
|
||||||
|
|
||||||
|
request.onsuccess = function() {
|
||||||
|
(async function() {
|
||||||
|
tdb = request.result;
|
||||||
|
if (!treload) {
|
||||||
|
console.log("Using stored data...")
|
||||||
|
load_tome_local(init_func);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (tload_in_progress) {
|
||||||
|
while (!tload_complete) {
|
||||||
|
await sleep(100);
|
||||||
|
}
|
||||||
|
console.log("Skipping load...")
|
||||||
|
init_func();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Not 100% safe... whatever!
|
||||||
|
tload_in_progress = true
|
||||||
|
console.log("Using new data...")
|
||||||
|
load_tome(init_func);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})()
|
||||||
|
}
|
||||||
|
|
||||||
|
request.onupgradeneeded = function(e) {
|
||||||
|
treload = true;
|
||||||
|
|
||||||
|
let tdb = e.target.result;
|
||||||
|
|
||||||
|
try {
|
||||||
|
tdb.deleteObjectStore('tome_db');
|
||||||
|
}
|
||||||
|
catch (error) {
|
||||||
|
console.log("Could not delete tome DB. This is probably fine");
|
||||||
|
}
|
||||||
|
|
||||||
|
tdb.createObjectStore('tome_db');
|
||||||
|
|
||||||
|
console.log("DB setup complete...");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function init_tome_maps() {
|
||||||
|
//warp
|
||||||
|
tomeMap = new Map();
|
||||||
|
/* Mapping from item names to set names. */
|
||||||
|
tomeIDMap = new Map();
|
||||||
|
|
||||||
|
tomeRedirectMap = new Map();
|
||||||
|
for (const it of tomeTypes) {
|
||||||
|
tomeLists.set(it, []);
|
||||||
|
}
|
||||||
|
|
||||||
|
let noneTomes = [
|
||||||
|
["tome", "weaponTome", "No Weapon Tome"],
|
||||||
|
["tome", "armorTome", "No Armor Tome"],
|
||||||
|
["tome", "guildTome", "No Guild Tome"]
|
||||||
|
];
|
||||||
|
for (let i = 0; i < 3; i++) {
|
||||||
|
let tome = Object();
|
||||||
|
tome.slots = 0;
|
||||||
|
tome.category = noneTomes[i][0];
|
||||||
|
tome.type = noneTomes[i][1];
|
||||||
|
tome.name = noneTomes[i][2];
|
||||||
|
tome.displayName = tome.name;
|
||||||
|
tome.set = null;
|
||||||
|
tome.quest = null;
|
||||||
|
tome.skillpoints = [0, 0, 0, 0, 0];
|
||||||
|
tome.has_negstat = false;
|
||||||
|
tome.reqs = [0, 0, 0, 0, 0];
|
||||||
|
tome.fixID = true;
|
||||||
|
tome.tier = "Normal";
|
||||||
|
tome.id = 61 + i; //special case!
|
||||||
|
tome.nDam = "0-0";
|
||||||
|
tome.eDam = "0-0";
|
||||||
|
tome.tDam = "0-0";
|
||||||
|
tome.wDam = "0-0";
|
||||||
|
tome.fDam = "0-0";
|
||||||
|
tome.aDam = "0-0";
|
||||||
|
//dependency - load.js
|
||||||
|
clean_item(tome);
|
||||||
|
|
||||||
|
noneTomes[i] = tome;
|
||||||
|
}
|
||||||
|
tomes = tomes.concat(noneTomes);
|
||||||
|
for (const tome of tomes) {
|
||||||
|
if (tome.remapID === undefined) {
|
||||||
|
tomeLists.get(tome.type).push(tome.displayName);
|
||||||
|
tomeMap.set(tome.displayName, tome);
|
||||||
|
if (noneTomes.includes(tome)) {
|
||||||
|
tomeIDMap.set(tome.id, "");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
tomeIDMap.set(tome.id, tome.displayName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
tomeRedirectMap.set(tome.id, tome.remapID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,7 +1,6 @@
|
||||||
function calculate_skillpoints(equipment, weapon) {
|
function calculate_skillpoints(equipment, weapon) {
|
||||||
// Calculate equipment equipping order and required skillpoints.
|
// Calculate equipment equipping order and required skillpoints.
|
||||||
// Return value: [equip_order, best_skillpoints, final_skillpoints, best_total];
|
// Return value: [equip_order, best_skillpoints, final_skillpoints, best_total];
|
||||||
|
|
||||||
let fixed = [];
|
let fixed = [];
|
||||||
let consider = [];
|
let consider = [];
|
||||||
let noboost = [];
|
let noboost = [];
|
||||||
|
|
86
js/sq2bs.js
86
js/sq2bs.js
|
@ -3,7 +3,7 @@ let armor_keys = ['helmet', 'chestplate', 'leggings', 'boots'];
|
||||||
let skp_keys = ['str', 'dex', 'int', 'def', 'agi'];
|
let skp_keys = ['str', 'dex', 'int', 'def', 'agi'];
|
||||||
let accessory_keys= ['ring1', 'ring2', 'bracelet', 'necklace'];
|
let accessory_keys= ['ring1', 'ring2', 'bracelet', 'necklace'];
|
||||||
let powderable_keys = ['helmet', 'chestplate', 'leggings', 'boots', 'weapon'];
|
let powderable_keys = ['helmet', 'chestplate', 'leggings', 'boots', 'weapon'];
|
||||||
let equipment_keys = ['helmet', 'chestplate', 'leggings', 'boots', 'ring1', 'ring2', 'bracelet', 'necklace', 'weapon'];
|
let equipment_keys = ['helmet', 'chestplate', 'leggings', 'boots', 'ring1', 'ring2', 'bracelet', 'necklace', 'weapon'].concat(tome_keys);
|
||||||
let powder_keys = ['e', 't', 'w', 'f', 'a'];
|
let powder_keys = ['e', 't', 'w', 'f', 'a'];
|
||||||
|
|
||||||
let spell_disp = ['spell0-info', 'spell1-info', 'spell2-info', 'spell3-info'];
|
let spell_disp = ['spell0-info', 'spell1-info', 'spell2-info', 'spell3-info'];
|
||||||
|
@ -13,13 +13,18 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||||
|
|
||||||
for (const eq of equipment_keys) {
|
for (const eq of equipment_keys) {
|
||||||
document.querySelector("#"+eq+"-choice").setAttribute("oninput", "update_field('"+ eq +"'); calcBuildSchedule();");
|
document.querySelector("#"+eq+"-choice").setAttribute("oninput", "update_field('"+ eq +"'); calcBuildSchedule();");
|
||||||
document.querySelector("#"+eq+"-tooltip").setAttribute("onclick", "collapse_element('#"+ eq +"-tooltip'); "); //toggle_plus_minus('" + eq + "-pm');
|
document.querySelector("#"+eq+"-tooltip").setAttribute("onclick", "collapse_element('#"+ eq +"-tooltip');"); //toggle_plus_minus('" + eq + "-pm');
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const eq of powderable_keys) {
|
for (const eq of powderable_keys) {
|
||||||
document.querySelector("#"+eq+"-powder").setAttribute("oninput", "calcBuildSchedule(); update_field('"+ eq +"');");
|
document.querySelector("#"+eq+"-powder").setAttribute("oninput", "calcBuildSchedule(); update_field('"+ eq +"');");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (const eq of tome_keys) {
|
||||||
|
document.querySelector("#" + eq + "-choice").setAttribute("oninput", "update_field('" + eq + "'); calcBuildSchedule();");
|
||||||
|
document.querySelector("#"+eq+"-tooltip").setAttribute("onclick", "collapse_element('#"+ eq +"-tooltip');");
|
||||||
|
}
|
||||||
|
|
||||||
for (const i of spell_disp) {
|
for (const i of spell_disp) {
|
||||||
document.querySelector("#"+i+"Avg").setAttribute("onclick", "toggle_spell_tab('"+i+"')");
|
document.querySelector("#"+i+"Avg").setAttribute("onclick", "toggle_spell_tab('"+i+"')");
|
||||||
}
|
}
|
||||||
|
@ -144,6 +149,14 @@ function update_field(field) {
|
||||||
category = item.category;
|
category = item.category;
|
||||||
type = item.type;
|
type = item.type;
|
||||||
}
|
}
|
||||||
|
else if (tomeMap.get(item)) {
|
||||||
|
tome = tomeMap.get(item);
|
||||||
|
if (!tome) {return false;}
|
||||||
|
powder_slots = 0;
|
||||||
|
tier = tome.tier;
|
||||||
|
category = tome.category;
|
||||||
|
type = tome.type;
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
// item not found
|
// item not found
|
||||||
document.querySelector("#"+field+"-choice").classList.add("text-light");
|
document.querySelector("#"+field+"-choice").classList.add("text-light");
|
||||||
|
@ -299,6 +312,9 @@ function reset_powder_specials() {
|
||||||
function init_autocomplete() {
|
function init_autocomplete() {
|
||||||
let dropdowns = new Map()
|
let dropdowns = new Map()
|
||||||
for (const eq of equipment_keys) {
|
for (const eq of equipment_keys) {
|
||||||
|
if (tome_keys.includes(eq)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
// build dropdown
|
// build dropdown
|
||||||
let item_arr = [];
|
let item_arr = [];
|
||||||
if (eq == 'weapon') {
|
if (eq == 'weapon') {
|
||||||
|
@ -375,6 +391,72 @@ function init_autocomplete() {
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (const eq of tome_keys) {
|
||||||
|
// build dropdown
|
||||||
|
let tome_arr = [];
|
||||||
|
for (const tome of tomeLists.get(eq.replace(/[0-9]/g, ''))) {
|
||||||
|
let tome_obj = tomeMap.get(tome);
|
||||||
|
if (tome_obj["restrict"] && tome_obj["restrict"] === "DEPRECATED") {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
//this should suffice for tomes - jank
|
||||||
|
if (tome_obj["name"].includes('No ' + eq.charAt(0).toUpperCase())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
let tome_name = tome;
|
||||||
|
tome_arr.push(tome_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
// create dropdown
|
||||||
|
dropdowns.set(eq, new autoComplete({
|
||||||
|
data: {
|
||||||
|
src: tome_arr
|
||||||
|
},
|
||||||
|
selector: "#"+ eq +"-choice",
|
||||||
|
wrapper: false,
|
||||||
|
resultsList: {
|
||||||
|
maxResults: 1000,
|
||||||
|
tabSelect: true,
|
||||||
|
noResults: true,
|
||||||
|
class: "search-box dark-7 rounded-bottom px-2 fw-bold dark-shadow-sm",
|
||||||
|
element: (list, data) => {
|
||||||
|
// dynamic result loc
|
||||||
|
let position = document.getElementById(eq+'-dropdown').getBoundingClientRect();
|
||||||
|
list.style.top = position.bottom + window.scrollY +"px";
|
||||||
|
list.style.left = position.x+"px";
|
||||||
|
list.style.width = position.width+"px";
|
||||||
|
list.style.maxHeight = position.height * 2 +"px";
|
||||||
|
|
||||||
|
if (!data.results.length) {
|
||||||
|
message = document.createElement('li');
|
||||||
|
message.classList.add('scaled-font');
|
||||||
|
message.textContent = "No results found!";
|
||||||
|
list.prepend(message);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
resultItem: {
|
||||||
|
class: "scaled-font search-item",
|
||||||
|
selected: "dark-5",
|
||||||
|
element: (tome, data) => {
|
||||||
|
tome.classList.add(tomeMap.get(data.value).tier);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
events: {
|
||||||
|
input: {
|
||||||
|
selection: (event) => {
|
||||||
|
if (event.detail.selection.value) {
|
||||||
|
event.target.value = event.detail.selection.value;
|
||||||
|
}
|
||||||
|
update_field(eq);
|
||||||
|
calcBuildSchedule();
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
let filter_loc = ["filter1", "filter2", "filter3", "filter4"];
|
let filter_loc = ["filter1", "filter2", "filter3", "filter4"];
|
||||||
for (const i of filter_loc) {
|
for (const i of filter_loc) {
|
||||||
dropdowns.set(i+"-choice", new autoComplete({
|
dropdowns.set(i+"-choice", new autoComplete({
|
||||||
|
|
149
js/sq2build.js
149
js/sq2build.js
|
@ -100,8 +100,12 @@ class Build{
|
||||||
* @param {Number[]} powders : Powder application. List of lists of integers (powder IDs).
|
* @param {Number[]} powders : Powder application. List of lists of integers (powder IDs).
|
||||||
* In order: boots, Chestplate, Leggings, Boots, Weapon.
|
* In order: boots, Chestplate, Leggings, Boots, Weapon.
|
||||||
* @param {Object[]} inputerrors : List of instances of error-like classes.
|
* @param {Object[]} inputerrors : List of instances of error-like classes.
|
||||||
|
*
|
||||||
|
* @param {Object[]} tomes: List of tomes.
|
||||||
|
* In order: 2x Weapon Mastery Tome, 4x Armor Mastery Tome, 1x Guild Tome.
|
||||||
|
* 2x Slaying Mastery Tome, 2x Dungeoneering Mastery Tome, 2x Gathering Mastery Tome are in game, but do not have "useful" stats (those that affect damage calculations or building)
|
||||||
*/
|
*/
|
||||||
constructor(level,equipment, powders, externalStats, inputerrors=[]){
|
constructor(level,equipment, powders, externalStats, inputerrors=[], tomes){
|
||||||
|
|
||||||
let errors = inputerrors;
|
let errors = inputerrors;
|
||||||
//this contains the Craft objects, if there are any crafted items. this.boots, etc. will contain the statMap of the Craft (which is built to be an expandedItem).
|
//this contains the Craft objects, if there are any crafted items. this.boots, etc. will contain the statMap of the Craft (which is built to be an expandedItem).
|
||||||
|
@ -327,6 +331,142 @@ class Build{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//cannot craft tomes
|
||||||
|
|
||||||
|
if(tomeMap.get(tomes[0]) && tomeMap.get(tomes[0]).type === "weaponTome") {
|
||||||
|
const weaponTome1 = tomeMap.get(tomes[0]);
|
||||||
|
this.weaponTome1 = expandItem(weaponTome1, []);
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
let weaponTome1 = getCustomFromHash(tomes[0]) ? getCustomFromHash(tomes[0]) : undefined;
|
||||||
|
if (weaponTome1.statMap.get("type") !== "weaponTome1") {
|
||||||
|
throw new Error("Not a Weapon Tome");
|
||||||
|
}
|
||||||
|
if (this.weaponTome1.get("custom")) {
|
||||||
|
this.customItems.push(weaponTome1);
|
||||||
|
} //can't craft tomes
|
||||||
|
|
||||||
|
} catch (Error) {
|
||||||
|
const weaponTome1 = tomeMap.get("No Weapon Tome");
|
||||||
|
this.weaponTome1 = expandItem(weaponTome1, []);
|
||||||
|
errors.push(new ItemNotFound(tomes[0], "weaponTome1", true));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(tomeMap.get(tomes[1]) && tomeMap.get(tomes[1]).type === "weaponTome") {
|
||||||
|
const weaponTome2 = tomeMap.get(tomes[1]);
|
||||||
|
this.weaponTome2 = expandItem(weaponTome2, []);
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
let weaponTome2 = getCustomFromHash(tomes[1]) ? getCustomFromHash(tomes[1]) : undefined;
|
||||||
|
if (weaponTome2.statMap.get("type") !== "weaponTome2") {
|
||||||
|
throw new Error("Not a Weapon Tome");
|
||||||
|
}
|
||||||
|
if (this.weaponTome2.get("custom")) {
|
||||||
|
this.customItems.push(weaponTome2);
|
||||||
|
} //can't craft tomes
|
||||||
|
|
||||||
|
} catch (Error) {
|
||||||
|
const weaponTome2 = tomeMap.get("No Weapon Tome");
|
||||||
|
this.weaponTome2 = expandItem(weaponTome2, []);
|
||||||
|
errors.push(new ItemNotFound(tomes[1], "weaponTome2", true));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(tomeMap.get(tomes[2]) && tomeMap.get(tomes[2]).type === "armorTome") {
|
||||||
|
const armorTome1 = tomeMap.get(tomes[2]);
|
||||||
|
this.armorTome1 = expandItem(armorTome1, []);
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
let armorTome1 = getCustomFromHash(tomes[2]) ? getCustomFromHash(tomes[2]) : undefined;
|
||||||
|
if (armorTome1.statMap.get("type") !== "armorTome1") {
|
||||||
|
throw new Error("Not an Armor Tome");
|
||||||
|
}
|
||||||
|
if (this.armorTome1.get("custom")) {
|
||||||
|
this.customItems.push(armorTome1);
|
||||||
|
} //can't craft tomes
|
||||||
|
|
||||||
|
} catch (Error) {
|
||||||
|
const armorTome1 = tomeMap.get("No Armor Tome");
|
||||||
|
this.armorTome1 = expandItem(armorTome1, []);
|
||||||
|
errors.push(new ItemNotFound(tomes[2], "armorTome1", true));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(tomeMap.get(tomes[3]) && tomeMap.get(tomes[3]).type === "armorTome") {
|
||||||
|
const armorTome2 = tomeMap.get(tomes[3]);
|
||||||
|
this.armorTome2 = expandItem(armorTome2, []);
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
let armorTome2 = getCustomFromHash(tomes[3]) ? getCustomFromHash(tomes[3]) : undefined;
|
||||||
|
if (armorTome2.statMap.get("type") !== "armorTome2") {
|
||||||
|
throw new Error("Not an Armor Tome");
|
||||||
|
}
|
||||||
|
if (this.armorTome2.get("custom")) {
|
||||||
|
this.customItems.push(armorTome2);
|
||||||
|
} //can't craft tomes
|
||||||
|
|
||||||
|
} catch (Error) {
|
||||||
|
const armorTome2 = tomeMap.get("No Armor Tome");
|
||||||
|
this.armorTome2 = expandItem(armorTome2, []);
|
||||||
|
errors.push(new ItemNotFound(tomes[3], "armorTome2", true));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(tomeMap.get(tomes[4]) && tomeMap.get(tomes[4]).type === "armorTome") {
|
||||||
|
const armorTome3 = tomeMap.get(tomes[4]);
|
||||||
|
this.armorTome3 = expandItem(armorTome3, []);
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
let armorTome3 = getCustomFromHash(tomes[4]) ? getCustomFromHash(tomes[4]) : undefined;
|
||||||
|
if (armorTome3.statMap.get("type") !== "armorTome3") {
|
||||||
|
throw new Error("Not an Armor Tome");
|
||||||
|
}
|
||||||
|
if (this.armorTome3.get("custom")) {
|
||||||
|
this.customItems.push(armorTome3);
|
||||||
|
} //can't craft tomes
|
||||||
|
|
||||||
|
} catch (Error) {
|
||||||
|
const armorTome3 = tomeMap.get("No Armor Tome");
|
||||||
|
this.armorTome3 = expandItem(armorTome3, []);
|
||||||
|
errors.push(new ItemNotFound(tomes[4], "armorTome3", true));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(tomeMap.get(tomes[5]) && tomeMap.get(tomes[5]).type === "armorTome") {
|
||||||
|
const armorTome4 = tomeMap.get(tomes[5]);
|
||||||
|
this.armorTome4 = expandItem(armorTome4, []);
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
let armorTome4 = getCustomFromHash(tomes[5]) ? getCustomFromHash(tomes[5]) : undefined;
|
||||||
|
if (armorTome4.statMap.get("type") !== "armorTome4") {
|
||||||
|
throw new Error("Not an Armor Tome");
|
||||||
|
}
|
||||||
|
if (this.armorTome4.get("custom")) {
|
||||||
|
this.customItems.push(armorTome4);
|
||||||
|
} //can't craft tomes
|
||||||
|
|
||||||
|
} catch (Error) {
|
||||||
|
const armorTome4 = tomeMap.get("No Armor Tome");
|
||||||
|
this.armorTome4 = expandItem(armorTome4, []);
|
||||||
|
errors.push(new ItemNotFound(tomes[5], "armorTome4", true));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(tomeMap.get(tomes[6]) && tomeMap.get(tomes[6]).type === "guildTome") {
|
||||||
|
const guildTome1 = tomeMap.get(tomes[6]);
|
||||||
|
this.guildTome1 = expandItem(guildTome1, []);
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
let guildTome1 = getCustomFromHash(tomes[6]) ? getCustomFromHash(tomes[6]) : undefined;
|
||||||
|
if (guildTome1.statMap.get("type") !== "guildTome1") {
|
||||||
|
throw new Error("Not an Guild Tome");
|
||||||
|
}
|
||||||
|
if (this.guildTome1.get("custom")) {
|
||||||
|
this.customItems.push(guildTome1);
|
||||||
|
} //can't craft tomes
|
||||||
|
|
||||||
|
} catch (Error) {
|
||||||
|
const guildTome1 = tomeMap.get("No Guild Tome");
|
||||||
|
this.guildTome1 = expandItem(guildTome1, []);
|
||||||
|
errors.push(new ItemNotFound(tomes[6], "guildTome1", true));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//console.log(this.craftedItems)
|
//console.log(this.craftedItems)
|
||||||
|
|
||||||
if (level < 1) { //Should these be constants?
|
if (level < 1) { //Should these be constants?
|
||||||
|
@ -345,9 +485,10 @@ class Build{
|
||||||
|
|
||||||
this.availableSkillpoints = levelToSkillPoints(this.level);
|
this.availableSkillpoints = levelToSkillPoints(this.level);
|
||||||
this.equipment = [ this.helmet, this.chestplate, this.leggings, this.boots, this.ring1, this.ring2, this.bracelet, this.necklace ];
|
this.equipment = [ this.helmet, this.chestplate, this.leggings, this.boots, this.ring1, this.ring2, this.bracelet, this.necklace ];
|
||||||
this.items = this.equipment.concat([this.weapon]);
|
this.tomes = [this.weaponTome1, this.weaponTome2, this.armorTome1, this.armorTome2, this.armorTome3, this.armorTome4, this.guildTome1];
|
||||||
|
this.items = this.equipment.concat([this.weapon]).concat(this.tomes);
|
||||||
// return [equip_order, best_skillpoints, final_skillpoints, best_total];
|
// return [equip_order, best_skillpoints, final_skillpoints, best_total];
|
||||||
let result = calculate_skillpoints(this.equipment, this.weapon);
|
let result = calculate_skillpoints(this.equipment.concat(this.tomes), this.weapon);
|
||||||
console.log(result);
|
console.log(result);
|
||||||
this.equip_order = result[0];
|
this.equip_order = result[0];
|
||||||
// How many skillpoints the player had to assign (5 number)
|
// How many skillpoints the player had to assign (5 number)
|
||||||
|
@ -378,7 +519,7 @@ class Build{
|
||||||
/*Returns build in string format
|
/*Returns build in string format
|
||||||
*/
|
*/
|
||||||
toString(){
|
toString(){
|
||||||
return [this.equipment,this.weapon].flat();
|
return [this.equipment,this.weapon,this.tomes].flat();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Getters */
|
/* Getters */
|
||||||
|
|
241
js/sq2builder.js
241
js/sq2builder.js
|
@ -61,6 +61,15 @@ let equipment_fields = [
|
||||||
"necklace",
|
"necklace",
|
||||||
"weapon"
|
"weapon"
|
||||||
];
|
];
|
||||||
|
let tome_fields = [
|
||||||
|
"weaponTome1",
|
||||||
|
"weaponTome2",
|
||||||
|
"armorTome1",
|
||||||
|
"armorTome2",
|
||||||
|
"armorTome3",
|
||||||
|
"armorTome4",
|
||||||
|
"guildTome1",
|
||||||
|
]
|
||||||
let equipment_names = [
|
let equipment_names = [
|
||||||
"Helmet",
|
"Helmet",
|
||||||
"Chestplate",
|
"Chestplate",
|
||||||
|
@ -72,8 +81,19 @@ let equipment_names = [
|
||||||
"Necklace",
|
"Necklace",
|
||||||
"Weapon"
|
"Weapon"
|
||||||
];
|
];
|
||||||
|
|
||||||
|
let tome_names = [
|
||||||
|
"Weapon Tome",
|
||||||
|
"Weapon Tome",
|
||||||
|
"Armor Tome",
|
||||||
|
"Armor Tome",
|
||||||
|
"Armor Tome",
|
||||||
|
"Armor Tome",
|
||||||
|
"Guild Tome",
|
||||||
|
]
|
||||||
let equipmentInputs = equipment_fields.map(x => x + "-choice");
|
let equipmentInputs = equipment_fields.map(x => x + "-choice");
|
||||||
let buildFields = equipment_fields.map(x => x+"-tooltip");
|
let buildFields = equipment_fields.map(x => x+"-tooltip").concat(tome_fields.map(x => x + "-tooltip"));
|
||||||
|
let tomeInputs = tome_fields.map(x => x + "-choice");
|
||||||
|
|
||||||
let powderInputs = [
|
let powderInputs = [
|
||||||
"helmet-powder",
|
"helmet-powder",
|
||||||
|
@ -83,15 +103,6 @@ let powderInputs = [
|
||||||
"weapon-powder",
|
"weapon-powder",
|
||||||
];
|
];
|
||||||
|
|
||||||
function init() {
|
|
||||||
console.log("builder.js init");
|
|
||||||
init_autocomplete();
|
|
||||||
decodeBuild(url_tag);
|
|
||||||
for (const i of equipment_keys) {
|
|
||||||
update_field(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function getItemNameFromID(id) {
|
function getItemNameFromID(id) {
|
||||||
if (redirectMap.has(id)) {
|
if (redirectMap.has(id)) {
|
||||||
return getItemNameFromID(redirectMap.get(id));
|
return getItemNameFromID(redirectMap.get(id));
|
||||||
|
@ -99,13 +110,20 @@ function getItemNameFromID(id) {
|
||||||
return idMap.get(id);
|
return idMap.get(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getTomeNameFromID(id) {
|
||||||
|
if (tomeRedirectMap.has(id)) {
|
||||||
|
return getTomeNameFromID(tomeRedirectMap.get(id));
|
||||||
|
}
|
||||||
|
return tomeIDMap.get(id);
|
||||||
|
}
|
||||||
|
|
||||||
function parsePowdering(powder_info) {
|
function parsePowdering(powder_info) {
|
||||||
// TODO: Make this run in linear instead of quadratic time... ew
|
// TODO: Make this run in linear instead of quadratic time... ew
|
||||||
let powdering = [];
|
let powdering = [];
|
||||||
for (let i = 0; i < 5; ++i) {
|
for (let i = 0; i < 5; ++i) {
|
||||||
let powders = "";
|
let powders = "";
|
||||||
let n_blocks = Base64.toInt(powder_info.charAt(0));
|
let n_blocks = Base64.toInt(powder_info.charAt(0));
|
||||||
console.log(n_blocks + " blocks");
|
// console.log(n_blocks + " blocks");
|
||||||
powder_info = powder_info.slice(1);
|
powder_info = powder_info.slice(1);
|
||||||
for (let j = 0; j < n_blocks; ++j) {
|
for (let j = 0; j < n_blocks; ++j) {
|
||||||
let block = powder_info.slice(0,5);
|
let block = powder_info.slice(0,5);
|
||||||
|
@ -127,13 +145,17 @@ function parsePowdering(powder_info) {
|
||||||
*/
|
*/
|
||||||
function decodeBuild(url_tag) {
|
function decodeBuild(url_tag) {
|
||||||
if (url_tag) {
|
if (url_tag) {
|
||||||
|
//default values
|
||||||
let equipment = [null, null, null, null, null, null, null, null, null];
|
let equipment = [null, null, null, null, null, null, null, null, null];
|
||||||
|
let tomes = [null, null, null, null, null, null, null];
|
||||||
let powdering = ["", "", "", "", ""];
|
let powdering = ["", "", "", "", ""];
|
||||||
let info = url_tag.split("_");
|
let info = url_tag.split("_");
|
||||||
let version = info[0];
|
let version = info[0];
|
||||||
let save_skp = false;
|
let save_skp = false;
|
||||||
let skillpoints = [0, 0, 0, 0, 0];
|
let skillpoints = [0, 0, 0, 0, 0];
|
||||||
let level = 106;
|
let level = 106;
|
||||||
|
|
||||||
|
//equipment (items)
|
||||||
if (version === "0" || version === "1" || version === "2" || version === "3") {
|
if (version === "0" || version === "1" || version === "2" || version === "3") {
|
||||||
let equipments = info[1];
|
let equipments = info[1];
|
||||||
for (let i = 0; i < 9; ++i ) {
|
for (let i = 0; i < 9; ++i ) {
|
||||||
|
@ -177,6 +199,42 @@ function decodeBuild(url_tag) {
|
||||||
}
|
}
|
||||||
info[1] = info_str.slice(start_idx);
|
info[1] = info_str.slice(start_idx);
|
||||||
}
|
}
|
||||||
|
if (version === "6") {
|
||||||
|
let info_str = info[1];
|
||||||
|
let start_idx = 0;
|
||||||
|
for (let i = 0; i < 9; ++i ) {
|
||||||
|
if (info_str.slice(start_idx,start_idx+3) === "CR-") {
|
||||||
|
equipment[i] = info_str.slice(start_idx, start_idx+20);
|
||||||
|
start_idx += 20;
|
||||||
|
} else if (info_str.slice(start_idx+3,start_idx+6) === "CI-") {
|
||||||
|
let len = Base64.toInt(info_str.slice(start_idx,start_idx+3));
|
||||||
|
equipment[i] = info_str.slice(start_idx+3,start_idx+3+len);
|
||||||
|
start_idx += (3+len);
|
||||||
|
} else {
|
||||||
|
let equipment_str = info_str.slice(start_idx, start_idx+3);
|
||||||
|
equipment[i] = getItemNameFromID(Base64.toInt(equipment_str));
|
||||||
|
start_idx += 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//tomes!
|
||||||
|
for (let i = 0; i < 7; ++i) {
|
||||||
|
let tome_str = info_str.charAt(start_idx);
|
||||||
|
tomes[i] = getTomeNameFromID(Base64.toInt(tome_str));
|
||||||
|
start_idx += 1;
|
||||||
|
}
|
||||||
|
info[1] = info_str.slice(start_idx);
|
||||||
|
|
||||||
|
//tome values do not appear in anything before v6.
|
||||||
|
for (let i in tomes) {
|
||||||
|
setValue(tomeInputs[i], tomes[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//constant in all versions
|
||||||
|
for (let i in equipment) {
|
||||||
|
setValue(equipmentInputs[i], equipment[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
//level, skill point assignments, and powdering
|
||||||
if (version === "1") {
|
if (version === "1") {
|
||||||
let powder_info = info[1];
|
let powder_info = info[1];
|
||||||
powdering = parsePowdering(powder_info);
|
powdering = parsePowdering(powder_info);
|
||||||
|
@ -189,7 +247,7 @@ function decodeBuild(url_tag) {
|
||||||
|
|
||||||
let powder_info = info[1].slice(10);
|
let powder_info = info[1].slice(10);
|
||||||
powdering = parsePowdering(powder_info);
|
powdering = parsePowdering(powder_info);
|
||||||
} else if (version === "3" || version === "4" || version === "5"){
|
} else if (version === "3" || version === "4" || version === "5" || version === "6"){
|
||||||
level = Base64.toInt(info[1].slice(10,12));
|
level = Base64.toInt(info[1].slice(10,12));
|
||||||
setValue("level-choice",level);
|
setValue("level-choice",level);
|
||||||
save_skp = true;
|
save_skp = true;
|
||||||
|
@ -202,13 +260,10 @@ function decodeBuild(url_tag) {
|
||||||
|
|
||||||
powdering = parsePowdering(powder_info);
|
powdering = parsePowdering(powder_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (let i in powderInputs) {
|
for (let i in powderInputs) {
|
||||||
setValue(powderInputs[i], powdering[i]);
|
setValue(powderInputs[i], powdering[i]);
|
||||||
}
|
}
|
||||||
for (let i in equipment) {
|
|
||||||
setValue(equipmentInputs[i], equipment[i]);
|
|
||||||
}
|
|
||||||
calculateBuild(save_skp, skillpoints);
|
calculateBuild(save_skp, skillpoints);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -219,8 +274,11 @@ function encodeBuild() {
|
||||||
|
|
||||||
if (player_build) {
|
if (player_build) {
|
||||||
let build_string;
|
let build_string;
|
||||||
if (player_build.customItems.length > 0) { //v5 encoding
|
|
||||||
build_string = "5_";
|
//V6 encoding - Tomes
|
||||||
|
if (player_build.items.length == 16 && player_build.tomes) {
|
||||||
|
build_string = "6_";
|
||||||
|
|
||||||
let crafted_idx = 0;
|
let crafted_idx = 0;
|
||||||
let custom_idx = 0;
|
let custom_idx = 0;
|
||||||
for (const item of player_build.items) {
|
for (const item of player_build.items) {
|
||||||
|
@ -232,37 +290,8 @@ function encodeBuild() {
|
||||||
} else if (item.get("crafted")) {
|
} else if (item.get("crafted")) {
|
||||||
build_string += "CR-"+encodeCraft(player_build.craftedItems[crafted_idx]);
|
build_string += "CR-"+encodeCraft(player_build.craftedItems[crafted_idx]);
|
||||||
crafted_idx += 1;
|
crafted_idx += 1;
|
||||||
} else {
|
} else if (item.get("category") === "tome") {
|
||||||
build_string += Base64.fromIntN(item.get("id"), 3);
|
build_string += Base64.fromIntN(item.get("id"), 1);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const skp of skp_order) {
|
|
||||||
build_string += Base64.fromIntN(getValue(skp + "-skp"), 2); // Maximum skillpoints: 2048
|
|
||||||
}
|
|
||||||
build_string += Base64.fromIntN(player_build.level, 2);
|
|
||||||
for (const _powderset of player_build.powders) {
|
|
||||||
let n_bits = Math.ceil(_powderset.length / 6);
|
|
||||||
build_string += Base64.fromIntN(n_bits, 1); // Hard cap of 378 powders.
|
|
||||||
// Slice copy.
|
|
||||||
let powderset = _powderset.slice();
|
|
||||||
while (powderset.length != 0) {
|
|
||||||
let firstSix = powderset.slice(0,6).reverse();
|
|
||||||
let powder_hash = 0;
|
|
||||||
for (const powder of firstSix) {
|
|
||||||
powder_hash = (powder_hash << 5) + 1 + powder; // LSB will be extracted first.
|
|
||||||
}
|
|
||||||
build_string += Base64.fromIntN(powder_hash, 5);
|
|
||||||
powderset = powderset.slice(6);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else { //v4 encoding
|
|
||||||
build_string = "4_";
|
|
||||||
let crafted_idx = 0;
|
|
||||||
for (const item of player_build.items) {
|
|
||||||
if (item.get("crafted")) {
|
|
||||||
build_string += "-"+encodeCraft(player_build.craftedItems[crafted_idx]);
|
|
||||||
crafted_idx += 1;
|
|
||||||
} else {
|
} else {
|
||||||
build_string += Base64.fromIntN(item.get("id"), 3);
|
build_string += Base64.fromIntN(item.get("id"), 3);
|
||||||
}
|
}
|
||||||
|
@ -288,8 +317,89 @@ function encodeBuild() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return build_string;
|
return build_string;
|
||||||
}
|
}
|
||||||
|
/* For reference in development - V5 and V4 encoding schemes */
|
||||||
|
// //V5 encoding - Custom Items
|
||||||
|
// if (player_build.customItems.length > 0) {
|
||||||
|
// build_string = "5_";
|
||||||
|
// let crafted_idx = 0;
|
||||||
|
// let custom_idx = 0;
|
||||||
|
// for (const item of player_build.items) {
|
||||||
|
// //skip tomes (do we skip them?)
|
||||||
|
// if (item.category === "tome") {
|
||||||
|
// continue;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if (item.get("custom")) {
|
||||||
|
// let custom = "CI-"+encodeCustom(player_build.customItems[custom_idx],true);
|
||||||
|
// build_string += Base64.fromIntN(custom.length, 3) + custom;
|
||||||
|
// custom_idx += 1;
|
||||||
|
// } else if (item.get("crafted")) {
|
||||||
|
// build_string += "CR-"+encodeCraft(player_build.craftedItems[crafted_idx]);
|
||||||
|
// crafted_idx += 1;
|
||||||
|
// } else {
|
||||||
|
// build_string += Base64.fromIntN(item.get("id"), 3);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// for (const skp of skp_order) {
|
||||||
|
// build_string += Base64.fromIntN(getValue(skp + "-skp"), 2); // Maximum skillpoints: 2048
|
||||||
|
// }
|
||||||
|
// build_string += Base64.fromIntN(player_build.level, 2);
|
||||||
|
// for (const _powderset of player_build.powders) {
|
||||||
|
// let n_bits = Math.ceil(_powderset.length / 6);
|
||||||
|
// build_string += Base64.fromIntN(n_bits, 1); // Hard cap of 378 powders.
|
||||||
|
// // Slice copy.
|
||||||
|
// let powderset = _powderset.slice();
|
||||||
|
// while (powderset.length != 0) {
|
||||||
|
// let firstSix = powderset.slice(0,6).reverse();
|
||||||
|
// let powder_hash = 0;
|
||||||
|
// for (const powder of firstSix) {
|
||||||
|
// powder_hash = (powder_hash << 5) + 1 + powder; // LSB will be extracted first.
|
||||||
|
// }
|
||||||
|
// build_string += Base64.fromIntN(powder_hash, 5);
|
||||||
|
// powderset = powderset.slice(6);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// } else { //v4 encoding
|
||||||
|
// build_string = "4_";
|
||||||
|
// let crafted_idx = 0;
|
||||||
|
// for (const item of player_build.items) {
|
||||||
|
// //skip tomes for now
|
||||||
|
// if (item.get("category") === "tome") {
|
||||||
|
// continue;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if (item.get("crafted")) {
|
||||||
|
// build_string += "-"+encodeCraft(player_build.craftedItems[crafted_idx]);
|
||||||
|
// crafted_idx += 1;
|
||||||
|
// } else {
|
||||||
|
// build_string += Base64.fromIntN(item.get("id"), 3);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// for (const skp of skp_order) {
|
||||||
|
// build_string += Base64.fromIntN(getValue(skp + "-skp"), 2); // Maximum skillpoints: 2048
|
||||||
|
// }
|
||||||
|
// build_string += Base64.fromIntN(player_build.level, 2);
|
||||||
|
// for (const _powderset of player_build.powders) {
|
||||||
|
// let n_bits = Math.ceil(_powderset.length / 6);
|
||||||
|
// build_string += Base64.fromIntN(n_bits, 1); // Hard cap of 378 powders.
|
||||||
|
// // Slice copy.
|
||||||
|
// let powderset = _powderset.slice();
|
||||||
|
// while (powderset.length != 0) {
|
||||||
|
// let firstSix = powderset.slice(0,6).reverse();
|
||||||
|
// let powder_hash = 0;
|
||||||
|
// for (const powder of firstSix) {
|
||||||
|
// powder_hash = (powder_hash << 5) + 1 + powder; // LSB will be extracted first.
|
||||||
|
// }
|
||||||
|
// build_string += Base64.fromIntN(powder_hash, 5);
|
||||||
|
// powderset = powderset.slice(6);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
// this.equipment = [ this.helmet, this.chestplate, this.leggings, this.boots, this.ring1, this.ring2, this.bracelet, this.necklace ];
|
// this.equipment = [ this.helmet, this.chestplate, this.leggings, this.boots, this.ring1, this.ring2, this.bracelet, this.necklace ];
|
||||||
// let build_string = "3_" + Base64.fromIntN(player_build.helmet.get("id"), 3) +
|
// let build_string = "3_" + Base64.fromIntN(player_build.helmet.get("id"), 3) +
|
||||||
// Base64.fromIntN(player_build.chestplate.get("id"), 3) +
|
// Base64.fromIntN(player_build.chestplate.get("id"), 3) +
|
||||||
|
@ -306,12 +416,13 @@ function encodeBuild() {
|
||||||
function calculateBuild(save_skp, skp){
|
function calculateBuild(save_skp, skp){
|
||||||
try {
|
try {
|
||||||
resetEditableIDs();
|
resetEditableIDs();
|
||||||
if(player_build){
|
if (player_build) {
|
||||||
reset_powder_specials();
|
reset_powder_specials();
|
||||||
updateBoosts("skip", false);
|
updateBoosts("skip", false);
|
||||||
updatePowderSpecials("skip", false);
|
updatePowderSpecials("skip", false);
|
||||||
}
|
}
|
||||||
let weaponName = getValue(equipmentInputs[8]);
|
let weaponName = getValue(equipmentInputs[8]);
|
||||||
|
//bruh @hpp
|
||||||
if (weaponName.startsWith("Morph-")) {
|
if (weaponName.startsWith("Morph-")) {
|
||||||
let equipment = [ "Morph-Stardust", "Morph-Steel", "Morph-Iron", "Morph-Gold", "Morph-Topaz", "Morph-Emerald", "Morph-Amethyst", "Morph-Ruby", weaponName.substring(6) ];
|
let equipment = [ "Morph-Stardust", "Morph-Steel", "Morph-Iron", "Morph-Gold", "Morph-Topaz", "Morph-Emerald", "Morph-Amethyst", "Morph-Ruby", weaponName.substring(6) ];
|
||||||
for (let i in equipment) {
|
for (let i in equipment) {
|
||||||
|
@ -362,11 +473,24 @@ function calculateBuild(save_skp, skp){
|
||||||
//console.log("POWDERING: " + powdering);
|
//console.log("POWDERING: " + powdering);
|
||||||
powderings.push(powdering);
|
powderings.push(powdering);
|
||||||
}
|
}
|
||||||
|
let tomes = [ null, null, null, null, null, null, null];
|
||||||
|
for (let i in tomes) {
|
||||||
|
let equip = getValue(tomeInputs[i]).trim();
|
||||||
|
if (equip === "") {
|
||||||
|
equip = "No " + tome_names[i]
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
setValue(tomeInputs[i], equip);
|
||||||
|
}
|
||||||
|
tomes[i] = equip;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
let level = document.getElementById("level-choice").value;
|
let level = document.getElementById("level-choice").value;
|
||||||
player_build = new Build(level, equipment, powderings, new Map(), errors);
|
player_build = new Build(level, equipment, powderings, new Map(), errors, tomes);
|
||||||
console.log(player_build);
|
console.log(player_build);
|
||||||
|
|
||||||
|
//isn't this deprecated?
|
||||||
for (let i of document.getElementsByClassName("hide-container-block")) {
|
for (let i of document.getElementsByClassName("hide-container-block")) {
|
||||||
i.style.display = "block";
|
i.style.display = "block";
|
||||||
}
|
}
|
||||||
|
@ -1094,7 +1218,20 @@ function optimizeStrDex() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Learn and use await
|
// TODO: Learn and use await
|
||||||
|
function init() {
|
||||||
|
console.log("builder.js init");
|
||||||
|
init_autocomplete();
|
||||||
|
decodeBuild(url_tag);
|
||||||
|
for (const i of equipment_keys) {
|
||||||
|
update_field(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
function init2() {
|
function init2() {
|
||||||
load_ing_init(init);
|
load_ing_init(init);
|
||||||
}
|
}
|
||||||
load_init(init2);
|
function init3() {
|
||||||
|
load_tome_init(init2)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
load_init(init3);
|
||||||
|
|
|
@ -465,7 +465,12 @@ function displaysq2ExpandedItem(item, parent_id){
|
||||||
let item_desc_elem = document.createElement("div");
|
let item_desc_elem = document.createElement("div");
|
||||||
item_desc_elem.classList.add("col");
|
item_desc_elem.classList.add("col");
|
||||||
item_desc_elem.classList.add(item.get("tier"));
|
item_desc_elem.classList.add(item.get("tier"));
|
||||||
item_desc_elem.textContent = item.get("tier")+" "+item.get("type");
|
if (tome_types.includes(item.get("type"))) {
|
||||||
|
tome_type_map = new Map([["weaponTome", "Weapon Tome"],["armorTome", "Armor Tome"],["guildTome", "Guild Tome"]]);
|
||||||
|
item_desc_elem.textContent = item.get("tier")+" "+tome_type_map.get(item.get("type"));
|
||||||
|
} else {
|
||||||
|
item_desc_elem.textContent = item.get("tier")+" "+item.get("type");
|
||||||
|
}
|
||||||
parent_div.append(item_desc_elem);
|
parent_div.append(item_desc_elem);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -61,9 +61,15 @@ let item_types = [
|
||||||
"Bow",
|
"Bow",
|
||||||
"Potion",
|
"Potion",
|
||||||
"Scroll",
|
"Scroll",
|
||||||
"Food"
|
"Food",
|
||||||
|
"Weapon Tome",
|
||||||
|
"Armor Tome",
|
||||||
|
"Guild Tome"
|
||||||
]
|
]
|
||||||
|
|
||||||
|
let tome_types = ['weaponTome', 'armorTome', 'guildTome'];
|
||||||
|
let tome_keys = ['weaponTome1', 'weaponTome2', 'armorTome1', 'armorTome2', 'armorTome3', 'armorTome4', 'guildTome1'];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Display commands
|
* Display commands
|
||||||
*/
|
*/
|
||||||
|
|
BIN
media/items/new/generic-armorTome.png
Normal file
BIN
media/items/new/generic-armorTome.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.8 KiB |
BIN
media/items/new/generic-guildTome.png
Normal file
BIN
media/items/new/generic-guildTome.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.8 KiB |
BIN
media/items/new/generic-weaponTome.png
Normal file
BIN
media/items/new/generic-weaponTome.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.8 KiB |
BIN
media/items/old/generic-armorTome.png
Normal file
BIN
media/items/old/generic-armorTome.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.8 KiB |
BIN
media/items/old/generic-guildTome.png
Normal file
BIN
media/items/old/generic-guildTome.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.8 KiB |
BIN
media/items/old/generic-weaponTome.png
Normal file
BIN
media/items/old/generic-weaponTome.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.8 KiB |
|
@ -13,15 +13,15 @@ tome_mapping = dict()
|
||||||
|
|
||||||
max_id = 0
|
max_id = 0
|
||||||
for tome in tome_data:
|
for tome in tome_data:
|
||||||
if "tomeID" in tome:
|
if "id" in tome:
|
||||||
if tome["tomeID"] > max_id:
|
if tome["id"] > max_id:
|
||||||
max_id = tome["tomeID"]
|
max_id = tome["id"]
|
||||||
tome_mapping[tome["name"]] = tome["tomeID"]
|
tome_mapping[tome["name"]] = tome["id"]
|
||||||
i = max_id + 1
|
i = max_id + 1
|
||||||
|
|
||||||
for tome in tome_data:
|
for tome in tome_data:
|
||||||
if "tomeID" not in tome:
|
if "id" not in tome:
|
||||||
tome["tomeID"] = i
|
tome["id"] = i
|
||||||
tome_mapping[tome["name"]] = i
|
tome_mapping[tome["name"]] = i
|
||||||
i += 1
|
i += 1
|
||||||
|
|
||||||
|
|
1467
tomes.json
1467
tomes.json
File diff suppressed because it is too large
Load diff
|
@ -14,6 +14,12 @@ const pdfs = new Map([
|
||||||
|
|
||||||
|
|
||||||
const changelog = new Map([
|
const changelog = new Map([
|
||||||
|
["Build Version 6 (20 May 2022)",
|
||||||
|
[
|
||||||
|
" + Added Tomes",
|
||||||
|
" + Changed Build encode and decode schemes to account for tomes",
|
||||||
|
]
|
||||||
|
],
|
||||||
["WynnBuilder^2 (12 May 2022)",
|
["WynnBuilder^2 (12 May 2022)",
|
||||||
[
|
[
|
||||||
" + Switched most of Wynnbuilder over to Bootstrap",
|
" + Switched most of Wynnbuilder over to Bootstrap",
|
||||||
|
|
Loading…
Add table
Reference in a new issue