From 2349985cfcd06082dea056ff8457982117d21be5 Mon Sep 17 00:00:00 2001 From: Mike Lee Date: Mon, 6 Sep 2021 19:23:02 -0400 Subject: [PATCH] add support for bonus values (extra 10%), new poker interval --- english.js | 13 ++++- japanese.js | 13 ++++- muni.js | 135 ++++++++++++++++++++++++++++++++++++++--------- parkingcalc.html | 53 +++++++++++-------- 4 files changed, 164 insertions(+), 50 deletions(-) diff --git a/english.js b/english.js index bfa4cb9..22d6637 100644 --- a/english.js +++ b/english.js @@ -9,8 +9,8 @@ function English(str) { case 3:{ //Set up your options (Category Title) return "Parking Configuration" }break; - case 4:{ //Selection for event type: Poker/Raid - return "Poker/Raid" + case 4:{ //Selection for event type: Poker + return "Poker" }break; case 5:{ //Selection for event type: Bingo return "Bingo" @@ -18,6 +18,9 @@ function English(str) { case 6:{ //Selection for event type: Medley return "Medley" }break; + case 24:{ //Selection for event type: Raid + return "Raid" + }break; case 7:{ //Label for team % selector (Include ":") return "Event Team Bonus:" }break; @@ -63,6 +66,12 @@ function English(str) { case 21:{ //Tip: The "Flexible Team" option gives you the fastest park, but at the expense of more voltage. return "The \"Flexible Team\" option gives you the fastest park, but at the expense of more voltage." }break; + case 22:{ //Tip: The maximum score you can get from playing a song using "Free Live" (Use 0 for Rehearsals Only) + return "The maximum score you can get from playing a song using Free Live.
(Use 0 for Rehearsals Only)" + }break; + case 23:{ //See any issues? Contact Mirby#5516 on D4DJ discord + return "See any issues? Contact Mirby#5516 on D4DJ discord" + }break; case "%INITIAL%":{ //This message is the first thing to display for a normal calculation. //Sample message: /* diff --git a/japanese.js b/japanese.js index f7228f3..4652d76 100644 --- a/japanese.js +++ b/japanese.js @@ -9,8 +9,8 @@ function Japanese(str) { case 3:{ //Set up your options (Category Title) return "Parking Configuration" }break; - case 4:{ //Selection for event type: Poker/Raid - return "Poker/Raid" + case 4:{ //Selection for event type: Poker + return "Poker" }break; case 5:{ //Selection for event type: Bingo return "Bingo" @@ -18,6 +18,9 @@ function Japanese(str) { case 6:{ //Selection for event type: Medley return "Medley" }break; + case 24:{ //Selection for event type: Raid + return "Raid" + }break; case 7:{ //Label for team % selector (Include ":") return "Event Team Bonus:" }break; @@ -63,6 +66,12 @@ function Japanese(str) { case 21:{ //Tip: The "Flexible Team" option gives you the fastest park, but at the expense of more voltage. return "The \"Flexible Team\" option gives you the fastest park, but at the expense of more voltage." }break; + case 22:{ //Tip: The maximum score you can get from playing a song using "Free Live" (Use 0 for Rehearsals Only) + return "The maximum score you can get from playing a song using Free Live.
(Use 0 for Rehearsals Only)" + }break; + case 23:{ //See any issues? Contact Mirby#5516 on D4DJ discord + return "See any issues? Contact Mirby#5516 on D4DJ discord" + }break; case "%INITIAL%":{ //This message is the first thing to display for a normal calculation. //Sample message: /* diff --git a/muni.js b/muni.js index 8b3a8f8..b013840 100644 --- a/muni.js +++ b/muni.js @@ -43,6 +43,29 @@ const MAXSTEPS= 10000 function toggleWarning() { setTimeout(() => { document.getElementById("warningparktext").style.visibility=document.getElementById("flexible").checked?"visible":"hidden"},100) } + + function toggleBonus() { + var bonusOptions = {}; + bonusOptions['noBonus'] = ['0','20','40','60','80','100','120','140','160']; + bonusOptions['bonus'] = ['0','20','40','50','60','70','80','90','100','110','120','140','150','170','200']; + + var isBonus = document.getElementById("teambonus").checked; + var bonusList = document.getElementById("bonus"); + while (bonusList.options.length) { + bonusList.remove(0); + } + if (isBonus) { + for (var i = 0; i < bonusOptions['bonus'].length; i++) { + var entry = new Option(bonusOptions['bonus'][i] + "%", bonusOptions['bonus'][i] / 100); + bonusList.options.add(entry); + } + } else { + for (var i = 0; i < bonusOptions['noBonus'].length; i++) { + var entry = new Option(bonusOptions['noBonus'][i] + "%", bonusOptions['noBonus'][i] / 100); + bonusList.options.add(entry); + } + } + } /*function toggleBingo(){ setTimeout(() => { document.getElementById("hideBingo").style.visibility=document.getElementById("Bingo").checked?"visible":"hidden"},100) @@ -52,10 +75,12 @@ const MAXSTEPS= 10000 var start = Math.abs(Math.max(0,Number(document.getElementById("starting").value))) var end = Math.abs(Math.max(0,Number(document.getElementById("ending").value))) - var bonus = Number(document.getElementById("team").value) + var bonus = Number(document.getElementById("bonus").value) + var isBonus = document.getElementById("teambonus").checked var parameter = Math.abs(Math.max(0,Number(document.getElementById("parameter").value))) var type = (document.getElementById("Bingo").checked?"Bingo": - document.getElementById("Poker").checked?"Poker/Raid": + document.getElementById("Poker").checked?"Poker": + document.getElementById("Raid").checked?"Raid": "Medley") var flexible = document.getElementById("flexible").checked //document.getElementById("console").value=flexible+"...\n\n" @@ -64,7 +89,7 @@ const MAXSTEPS= 10000 var originalTarget=start document.getElementById("console").value="" - var interval = (type=="Medley")?15000:10000 + var interval = (type=="Medley")?15000:(type=="Poker")?4000:10000 var maxscore = Math.floor(Math.abs(Math.min(5000000,Math.max(0,Number(document.getElementById("maxscore").value))))/interval)*interval @@ -72,13 +97,16 @@ const MAXSTEPS= 10000 if (voltage>0) { switch (type) { case "Bingo":{ - return voltage * Math.floor((1 + bonus)*Math.max(10,Math.floor(score/interval))+Math.floor((1 + bonus)*Math.floor(parameter/600))) + return voltage * Math.floor((1 + bonus) * (Math.max(10, Math.floor(score/interval)) + Math.floor(parameter/600))) }break; case "Medley":{ - return voltage * Math.floor((1 + bonus)*(10+Math.floor(score/interval))+Math.floor((1 + bonus)*Math.floor(parameter/600))) + return voltage * Math.floor((1 + bonus) * (10 + Math.floor(score/interval) + Math.floor(parameter/600))) }break; - case "Poker/Raid":{ - return voltage * Math.floor((1 + bonus)*(50 + Math.floor(score/interval))+Math.floor((1 + bonus)*Math.floor(parameter/600))) + case "Poker":{ + return voltage * Math.floor((1 + bonus) * (50 + Math.floor(score/interval) + Math.floor(parameter/600))) + }break; + case "Raid":{ + return voltage * Math.floor((1 + bonus) * (50 + Math.floor(score/interval) + Math.floor(parameter/600))) }break; } } else { @@ -86,6 +114,38 @@ const MAXSTEPS= 10000 } } + // Generate a list of possible bonus values the user can have, based on the selected drop down value and whether extra 10% bonus is applied + var bonusOptions = [0,.2,.4,.5,.6,.7,.8,.9,1,1.1,1.2,1.4,1.5,1.7,2]; + function GenerateBonusRange(bonusValue, isBonus) { + var array = []; + if (isBonus) { + for (var i=bonusValue;i>=0;i-=0.1) { + i = Math.round(i * 10) / 10 // Eliminate precision problems + if (bonusOptions.includes(i)) { + array.push(i) + } + } + } else { + for (var i=bonusValue;i>=0;i-=0.2) { + i = Math.round(i * 10) / 10 + array.push(i) + } + } + return array + } + + // During rehearsal, we can't use the odd bonus values, so return next lowest even value + function GetNextBonus(bonusValue) { + for (var i=bonusValue;i>=0;i-=0.1) { + i = Math.round(i * 10) / 10 + if (bonusOptions.includes(i) && ((i*10)%2==0)) { + return i + } + } + } + + var bonusRange = GenerateBonusRange(bonus, isBonus) + function EvenOdd(val) { return val%2==0?"even":"odd" } @@ -212,25 +272,47 @@ const MAXSTEPS= 10000 } var voltage=0 if ((end-start)%2!==0) { - return undefined + if (isBonus && (end-start >= 21)) { + var gain = 0 + // If rehearsing with an odd gap, use 110% to flip back to even - only exception is 29, need to use 90% + if (end-start==29){ + gain=19 + } else { + gain=21 + } + start+=gain + document.getElementById("console").value+=ConvertVariables(LANGUAGE("%REHEARSAL%"),{step:step++,percent:((gain-10)*10),epgain:gain,remaining:end-start})+"\n" + return true + } else { + return undefined + } } if (end-start>(10+Math.round(tbonus*10))+10) { var gain=(10+Math.round(tbonus*10)) + if (EvenOdd(end-start)!=EvenOdd(gain)) { + tbonus = GetNextBonus(tbonus) + gain=(10+Math.round(tbonus*10)) + } start+=gain //document.getElementById("console").value+="1)" document.getElementById("console").value+=ConvertVariables(LANGUAGE("%REHEARSAL%"),{step:step++,percent:Math.round(tbonus*100),epgain:gain,remaining:end-start})+"\n" /*"Step "+(step++)+") Use Rehearsal w/"+Math.round(tbonus*100)+"% team. EP +"+gain+". Remaining:"+(end-start)+" EP \n"*/ return true } else - for (var j=tbonus;j>=0;j-=0.2) { + for (var j of GenerateBonusRange(tbonus,isBonus)) { result = TryMatchingRehearsal(j) if (!result) { return false } } if (end-start>=20) { - var gain=end-start-10 + var gain = 0 + if (isBonus && ((end-start)==38 || (end-start)==36)) { // If bonus exists, and gap is 36 or 38, need to do special exception because bonus teams can't reach 160% or 180% + gain = 24 + } else { + gain = end-start-10 + } start+=gain //document.getElementById("console").value+="2)" document.getElementById("console").value+=ConvertVariables(LANGUAGE("%REHEARSAL%"),{step:step++,percent:((gain-10)*10),epgain:gain,remaining:end-start})+"\n" @@ -297,7 +379,7 @@ const MAXSTEPS= 10000 var result=true if (maxscore>0) { if (flexible) { - for (var j=bonus;j>=0;j-=0.2) { + for (var j of bonusRange) { while (TryBiggestGain(j)) { //document.getElementById("console").value+=+start+" EP"+"\n" } @@ -328,14 +410,15 @@ const MAXSTEPS= 10000 } } } - for (var j=bonus;j>=0;j-=0.2) { + for (var j of bonusRange) { result = TryMatchingRehearsal(j) if (!result) { break; } } if (result) { - for (var j=1.6;j>=0;j-=0.2) { + var maxBonus = (isBonus)?2.0:1.6 + for (var j of GenerateBonusRange(maxBonus,isBonus)) { result = TryMatchingRehearsal(j) if (!result) { break; @@ -344,25 +427,24 @@ const MAXSTEPS= 10000 } if (result) { do { - if (flexible) { - for (var j=bonus;j>=0;j-=0.2) { - var prevstart = 0 - result = TryRehearsal(j) - if (start!==prevstart) { - break; - } + if (flexible) { + for (var j of bonusRange) { + var prevstart = 0 + result = TryRehearsal(j) + if (start!==prevstart) { + break; } - } else { - result = TryRehearsal(bonus) } + } else { + result = TryRehearsal(bonus) + } } while (result); } - if (maxscore>0) { if (flexible) { for (var i=5;i>0;i--) { - for (var j=bonus;j>=0;j-=0.2) { + for (var j of bonusRange) { while (result = TryEqualGain(i,j)) { //document.getElementById("console").value+="Step "+(step++)+")"+start+" EP"+"\n" } @@ -379,7 +461,7 @@ const MAXSTEPS= 10000 function ConvertEvent(str) { switch (str) { - case "Poker/Raid":{ + case "Poker":{ return LANGUAGE(4) }break; case "Bingo":{ @@ -388,6 +470,9 @@ const MAXSTEPS= 10000 case "Medley":{ return LANGUAGE(6) }break; + case "Raid":{ + return LANGUAGE(24) + }break; } } diff --git a/parkingcalc.html b/parkingcalc.html index 4355349..2956c3a 100644 --- a/parkingcalc.html +++ b/parkingcalc.html @@ -15,8 +15,17 @@
Parking Configuration + + + + +     + + +

+ - +     @@ -24,9 +33,17 @@     + +
- + Check this box if event gives extra 10% for matching both char and style. + + -      - If turned on, calculates scoring options using lower % teams also. - +      + + + + If turned on, calculates scoring options using lower % teams also. +

- + The maximum score you can get from playing a song using Free Live.
(Use 0 for Rehearsals Only)
-       +       How to find Parameter value???
- + - +

-
@@ -82,6 +92,7 @@
  • Here's the Light on EX or Synchrogazer on Hard/EX difficulty are some of the highest scoring songs you can pick.
  • When you get close to the score you need in Free Live, purposely fail the song. Notes are worth 10% their normal value when you have 0 health so you can finish easily.
  • The "Flexible Team" option gives you the fastest park, but at the expense of more voltage.
  • +
  • See any issues? Contact Mirby#5516 on D4DJ discord.