Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ A companion app/website for the merging game Scrap Clicker 2.
Provides the ability to calculate the resources needed to reach a specific Star level when providing:
* Current Star Level
* Current Scrapyard v2 Level
* Obtained Achievements
* Amount of barrels that reached Mastery 17
* Target Star Level

One calculated, it will provide the needed amounts of:
Expand Down
23 changes: 22 additions & 1 deletion index.html
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,15 @@
</head>
<body>
<h1 class="text-center"><span id = "lblTitle">Star Levels </span></h1>
<div class="text-center">
<span id="lblNotation">Number Notation:</span>
<select id="inputNotation" onchange="calculate()">
<option value="Original">Original</option>
<option value="Normal">Normal</option>
<option value="Abstract">Abstract</option>
<option value="Scientific">Scientific</option>
</select>
</div>
<div class="text-center" ><span id = "lblSetAll" >Set all Stars: </span><input id="setAll" type="number" maxlength="5" placeholder="Enter level" onchange="setAll();calculate()" min="10" value="10" ></div>
<div class="text-center" ><span id = "lblSettings">Remember My Settings: </span><input id="rememberMe" type="checkbox" onchange="onRememberMeChange()"></div>
<div class="d-grid gap-3">
Expand Down Expand Up @@ -83,14 +92,26 @@ <h1 class="text-center"><span id = "lblTitle">Star Levels </span></h1>
</div>
<div class="text-center">
<label class="text-center">
<span class="h3 w-50" id="lblv2Level">Scrapyard V2 Level:</span>
<span class="h3 w-50" id="lblv2Level">Scrapyard V2:</span>
<input class="w-25" id="v2" type="number" placeholder="Enter level" min="1" value="1" onchange="calculate()">
</label>
<br/>
<label class="text-center">
<span class="h3 w-50" id="lblAchievement25">Achievement Boost 2 Level:</span>
<input class="w-25" id="achievement" type="number" placeholder="Enter Amount" min="0" value="0" onchange="calculate()">
</label>
<label class="text-center">
<span class="h3 w-50" id="lblMasteryBoost17">Mastery 17+ Barrels:</span>
<input class="w-25" id="masteryBoost17" type="number" placeholder="Enter Amount" min="0" value="0" onchange="calculate()">
</label>
<br/>
<label class="text-center">
<span class="h3 w-50" id = "lblTarget">Target Star Level:</span>
<input class="w-25" id="target" type="number" placeholder="Enter level" min="11" value="11" onchange="calculate()">
</label>
<label class="text-center" >
<span id = "lblMagic">Use Black Magic (Experimental): </span><input id="useMagic" type="checkbox" onchange="calculate()">
</label>
<!--<div class="text-center" style="padding: 10px;">
<button class="btn btn-primary" onclick="calculate()" >Submit</button>
</div>
Expand Down
197 changes: 151 additions & 46 deletions js/site.js
Original file line number Diff line number Diff line change
@@ -1,42 +1,58 @@
var inputs = ["setAll","v2","target"];
var inputs = ["setAll","v2","achievement","masteryBoost17","target"];
var inpStars = ["inpStar1","inpStar2","inpStar3","inpStar4","inpStar5","inpStar6","inpStar7","inpStar8","inpStar9","inpStar10"]
var inpCheckbox = ["rememberMe","useMagic"]
var language = window.navigator.userLanguage || window.navigator.language;

var languages = {
var languages = { //TODO translate Achievement25, MasteryBoost17, Magic label
"en": {
"Title": "Star Calc",
"SetAll": "Set all to: ",
"Settings": "Remember levels: ",
"v2Level": "Scrapyard V2: ",
"Target": "Target Stars: "
"Achievement25": "Achievement Boost 2 Level:",
"MasteryBoost17": "Mastery 17+ Barrels:",
"Target": "Target Stars: ",
"Magic": "Use Black Magic (Experimental): "
},
"es": {
"Title": "Cálculo de Estrellas",
"SetAll": "Establecer todo en: ",
"Settings": "Recuerda niveles: ",
"v2Level": "Vertedero V2: ",
"Target": "Objetivo Estrellas: "
"Achievement25": "Achievement Boost 2 Level:",
"MasteryBoost17": "Mastery 17+ Barrels:",
"Target": "Objetivo Estrellas: ",
"Magic": "Use Black Magic (Experimental): "
},
"ru": {
"Title": "Звездный Кальк",
"SetAll": "Установить все звезды: ",
"Settings": "Запомнить уровни: ",
"v2Level": "Двор мусора v2: ",
"Target": "Целевые звезды: "
"Achievement25": "Achievement Boost 2 Level:",
"MasteryBoost17": "Mastery 17+ Barrels:",
"Target": "Целевые звезды: ",
"Magic": "Use Black Magic (Experimental): "
},
"de": {
"Title": "Sterne Kalkulator",
"Settings": "Merken Sie sich die Level: ",
"SetAll": "Setze alle Sterne: ",
"v2Level": "Schrottplatz V2: ",
"Target": "Zielsterne: "
"Achievement25": "Achievement Boost 2 Level:",
"MasteryBoost17": "Mastery 17+ Barrels:",
"Target": "Zielsterne: ",
"Magic": "Use Black Magic (Experimental): "
},
"fr": {
"Title": "Étoile Calculette",
"Settings": "Mémoriser les niveaux: ",
"SetAll": "Définir toutes les étoiles: ",
"v2Level": "Parc à casse V2: ",
"Target": "Cible Étoile: "
"Achievement25": "Achievement Boost 2 Level:",
"MasteryBoost17": "Mastery 17+ Barrels:",
"Target": "Cible Étoile: ",
"Magic": "Use Black Magic (Experimental): "
}
}

Expand All @@ -46,7 +62,10 @@ document.getElementById("lblTitle").innerHTML = languages[language]["Title"];
document.getElementById("lblSetAll").innerHTML = languages[language]["SetAll"];
document.getElementById("lblSettings").innerHTML = languages[language]["Settings"];
document.getElementById("lblv2Level").innerHTML = languages[language]["v2Level"];
document.getElementById("lblAchievement25").innerHTML = languages[language]["Achievement25"];
document.getElementById("lblMasteryBoost17").innerHTML = languages[language]["MasteryBoost17"];
document.getElementById("lblTarget").innerHTML = languages[language]["Target"];
document.getElementById("lblMagic").innerHTML = languages[language]["Magic"];

window.onload = checkLocalStorage();

Expand All @@ -68,7 +87,10 @@ function setLocalStorage() {
inpStars.forEach(input => {
localStorage.setItem(input,document.getElementById(input).value);
});
localStorage.setItem("rememberMe",document.getElementById("rememberMe").checked);
inpCheckbox.forEach(input => {
localStorage.setItem(input,document.getElementById(input).checked)
})
localStorage.setItem("inputNotation", document.getElementById("inputNotation").value)
}

function checkLocalStorage(){
Expand All @@ -78,6 +100,9 @@ function checkLocalStorage(){
calculate();
return;
}
inpCheckbox.forEach(input => {
document.getElementById(input).checked = JSON.parse(localStorage.getItem(input));
});
document.getElementById("rememberMe").checked = JSON.parse(localStorage.getItem("rememberMe"));
inpStars.forEach(input => {
if (Number(localStorage.getItem(input)))
Expand All @@ -91,6 +116,7 @@ function checkLocalStorage(){
document.getElementById(input).value = localStorage.getItem(input);
}
});
document.getElementById("inputNotation").value = localStorage.getItem("inputNotation");
calculate();
}

Expand All @@ -109,7 +135,7 @@ function setAll() {
function calculate() {
var isValid = true;
inpStars.every(input => {
if (document.getElementById(input).value <= 0) {
if (document.getElementById(input).value <= 0) { // TODO can be raised to < 10
document.getElementById(input).select();
document.getElementById(input).classList.add("red");
isValid = false;
Expand Down Expand Up @@ -139,24 +165,121 @@ function calculate() {
var magAmount = 0;
var fragmentAmount = 0;
var scrapyardMul = scrapyardModifier();
var achievementMul = achievementModifier(); // scaled by 1000, to be multiplied
var masteryBoost17Mul = masteryBoost17Modifier(); // To be multiplied

stars.forEach((star) => {
for (let index = Number(star); index < Number(desired); index++) {
gsAmount += gsCost(index, scrapyardMul);
magAmount += magnetCost(index, scrapyardMul);
fragmentAmount += fragmentCost(index, scrapyardMul);
gsAmount += gsCost(index, scrapyardMul, achievementMul, masteryBoost17Mul);
magAmount += magnetCost(index, scrapyardMul, achievementMul, masteryBoost17Mul);
fragmentAmount += fragmentCost(index, scrapyardMul, achievementMul, masteryBoost17Mul);
}
});

document.getElementById("gs").innerHTML = gsAmount.toLocaleString(language);
document.getElementById("mag").innerHTML = magAmount.toLocaleString(language);
document.getElementById("fragment").innerHTML = fragmentAmount.toLocaleString(language);
document.getElementById("gs").innerHTML = convertNumberToNotation(gsAmount);
document.getElementById("mag").innerHTML = convertNumberToNotation(magAmount);
document.getElementById("fragment").innerHTML = convertNumberToNotation(fragmentAmount);

if ( document.getElementById("rememberMe").checked ) setLocalStorage();

}

function gsCost(starLevel, scrapyardMul) {
function convertNumberToNotation(number) {
if((Math.abs(number)<1e9) || (Math.abs(number)==1/0)) return number.toLocaleString(language);
var exponent = Math.floor(Math.log10(number));
var mantissa = (Math.floor(1e8 * (number / Math.pow(10,exponent)))/1e8);
switch(document.getElementById("inputNotation").value){
case "Original":
return number.toLocaleString(language);
case "Normal":
mantissa *= Math.pow(10, exponent%3);
var index = Math.floor(exponent/3)-1;
var index1 = Math.floor(index%10)
var index10 = Math.floor(index%100/10)
var index100 = Math.floor(index%1000/100)
var normal1 = ["", "U", "D", "T", "Q", "q", "S", "s", "O", "N"]
var normal10 = ["", "D", "V", "Tr", "QU", "qu", "Se", "Sp", "Oc", "No"]
var normal100 = ["", "C", "Overflow"]
var normalConcat = ""
switch(index%100){
case 0:
normalConcat = "".concat(normal100[index100], "t");
break;
case 1:
normalConcat = "".concat(normal100[index100], "M")
break;
case 2:
normalConcat = "".concat(normal100[index100], "B")
break;
default:
normalConcat = "".concat(normal100[index100], normal1[index1], normal10[index10])
}
return "".concat(mantissa.toPrecision(9)," ",normalConcat)
case "Abstract":
mantissa *= Math.pow(10, exponent%3);
var index = Math.floor(exponent/3)-1;
return "".concat(mantissa.toPrecision(9)," ",convertIndexToAbstract(index))
case "Scientific":
return "".concat(mantissa.toPrecision(9),"e",exponent)
}
}

function convertIndexToAbstract(index){
if(index<=0) return ""
var remainder = (Math.floor(index)-1)%26+1;
return "".concat(convertIndexToAbstract((index-remainder)/26),String.fromCharCode(96+remainder))
}

function scrapyardModifier()
{
var modifier;
var level = document.getElementById("v2").value;
if (level > 200)
{
modifier = (level - 200) * 4 + 300;
}
else
{
modifier = level;
if (level > 100)
modifier = (level - 100) * 2 + 100;
}
return modifier - 1;
}

function achievementModifier()
{
var modifier;
var amount = document.getElementById("achievement").value;
modifier = Math.max(0, 1000 - Math.max(0,amount * 2));
return modifier;
}

function masteryBoost17Modifier()
{
var modifier;
var amount = document.getElementById("masteryBoost17").value;
modifier = Math.pow(0.99,Math.floor(amount/10));
return modifier;
}

function magic(starLevel){ // I like it when *(long)2147483648 becomes *(long)2100000000 due to [REDACTED] - IcyZeroTwo
if(starLevel < 1760) return 1;
if(!document.getElementById("useMagic").checked) return 1;

const BULK_SIZE = 300;
const BULK_PRECISION = 1e8;
const BULK_DEVIATION = (Math.floor(Math.pow(1.1,BULK_SIZE)/BULK_PRECISION)*BULK_PRECISION) / Math.pow(1.1,BULK_SIZE);

var jumpCount = Math.floor((starLevel - 1760)/50);
var bulkCount = Math.floor(jumpCount/BULK_SIZE);
jumpCount -= bulkCount * BULK_SIZE;
var precision = Math.pow(10, Math.floor((Math.log10(1.1) * jumpCount - 6) / 8) * 8 + 5);
var jumpDeviation = (Math.floor(Math.pow(1.1,jumpCount)/precision)*precision) / Math.pow(1.1,jumpCount);
return Math.pow(BULK_DEVIATION,bulkCount) * jumpDeviation;
}

function gsCost(starLevel, scrapyardMul, achievementMul, masteryBoost17Mul) {
var cost = 100000 * (starLevel - 10) + 250000; //adjust for first 10 stars
if (starLevel >= 20) cost *= 1.3;
if (starLevel >= 30) cost *= 1.3;
Expand All @@ -180,27 +303,10 @@ function gsCost(starLevel, scrapyardMul) {
if (starLevel >= 450) cost *= 1.1;
if (starLevel >= 500) cost *= 1.1;
if (starLevel >= 550) cost *= 1.1;
return Math.floor((cost * 100) / (scrapyardMul + 100));
}

function scrapyardModifier()
{
var modifier;
var level = document.getElementById("v2").value;
if (level > 200)
{
modifier = (level - 200) * 4 + 300;
}
else
{
modifier = level;
if (level > 100)
modifier = (level - 100) * 2 + 100;
}
return modifier - 1;
return Math.floor((cost * 100) * achievementMul * masteryBoost17Mul / ((scrapyardMul + 100) * 1000));
}

function magnetCost(starLevel, scrapyardMul) {
function magnetCost(starLevel, scrapyardMul, achievementMul, masteryBoost17Mul) { // formula from v11.6
var cost = 250 * (starLevel - 10) + 1000; //adjust for first 10 stars
if (starLevel >= 12) cost *= 0.98;
if (starLevel >= 13) cost *= 0.98;
Expand Down Expand Up @@ -272,26 +378,25 @@ function magnetCost(starLevel, scrapyardMul) {
if (starLevel >= 1090) cost *= 1.1;
if (starLevel >= 1110) cost *= 1.3;
if (starLevel >= 1120) cost *= 1.1;
if (starLevel >= 1130) cost *= 1.1;
if (starLevel >= 1160) cost *= 1.1;
if (starLevel >= 1210) cost *= 1.3;
if (starLevel >= 1260) cost *= 1.18;
if (starLevel >= 1285) cost *= 1.18;
if (starLevel >= 1310) cost *= 1.36;
if (starLevel >= 1360) cost *= 1.36;
if (starLevel >= 1410) cost *= 1.37;
if (starLevel >= 1460) cost *= 1.37;
if (starLevel >= 1310) cost *= 1.34;
if (starLevel >= 1360) cost *= 1.34;
if (starLevel >= 1410) cost *= 1.34;
if (starLevel >= 1460) cost *= 1.34;
if (starLevel >= 1510) cost *= 1.3;
if (starLevel >= 1560) cost *= 1.269;
if (starLevel >= 1610) cost *= 1.1;
if (starLevel >= 1660) cost *= 1.1;
if (starLevel >= 1710) cost *= 1.3;
if (starLevel >= 1760) cost *= 1.269;
if (starLevel >= 1810) cost *= 1.1;
if (starLevel >= 1860) cost *= Math.pow(1.1, Math.floor((starLevel - 1810) / 50));
return Math.floor(cost * 100 / (scrapyardMul + 100));
if (starLevel >= 1810) cost *= Math.pow(1.1, Math.floor((starLevel - 1760) / 50));
return Math.floor((cost * 100) * achievementMul * masteryBoost17Mul * magic(starLevel) / ((scrapyardMul + 100) * 1000));
}

function fragmentCost(starLevel, scrapyardMul) {
function fragmentCost(starLevel, scrapyardMul, achievementMul, masteryBoost17Mul) {
var cost = 4 + (starLevel - 10); //adjust for first 10 stars
if (starLevel >= 60) cost *= 1.05;
if (starLevel >= 70) cost *= 1.05;
Expand Down Expand Up @@ -325,5 +430,5 @@ function fragmentCost(starLevel, scrapyardMul) {
if (starLevel >= 810) cost *= 1.1;
if (starLevel >= 910) cost *= 1.1;
if (starLevel >= 1010) cost *= 1.1;
return Math.floor((cost * 100) / (scrapyardMul + 100));
}
return Math.floor((cost * 100) * achievementMul * masteryBoost17Mul / ((scrapyardMul + 100) * 1000));
}