@@ -166,17 +166,33 @@ class PaybackRateMod {
166166 this . tickCount = 0 ;
167167 this . last_cps = 0 ;
168168 this . Upgrades = new Map ( ) ;
169+ /**
170+ * @type {Object }
171+ */
169172 this . default_config = {
170- enableSort : 1 ,
171- sortGrandmapocalypse : 1 ,
172- sortWizardTower : 1 ,
173+ /** @type {boolean } */
174+ enableSort : true ,
175+ /** @type {boolean } */
176+ sortGrandmapocalypse : true ,
177+ /** @type {boolean } */
178+ sortWizardTower : true ,
179+ /** @type {boolean } */
180+ autoBuy : false ,
181+ /** @type {string } */
173182 color0 : "#00ffff" ,
183+ /** @type {string } */
174184 color1 : "#00ff00" ,
185+ /** @type {string } */
175186 color7 : "#ffd939" ,
187+ /** @type {string } */
176188 color15 : "#ff4d4d" ,
189+ /** @type {string } */
177190 colorLast : "#de4dff" ,
178- isBanking : 0 ,
179- bankingSeconds : 0 ,
191+ /** @type {boolean } */
192+ isBanking : true ,
193+ /** @type {boolean } */
194+ bankingSeconds : true ,
195+ /** @type {number } */
180196 updateMS : 1000 ,
181197 } ;
182198 }
@@ -717,7 +733,7 @@ class PaybackRateMod {
717733 all . forEach ( me => this . updateNotation ( me , avg ) ) ;
718734
719735 // if there is only non-acc upgrade(s), add empty element placeholder to avoid mainLoop trigger
720- if ( ! l ( "upgradeAcc0" ) ) {
736+ if ( ! l ( "upgradeAcc0" ) && l ( "upgrade0" ) ) {
721737 const spanElement = document . createElement ( 'span' ) ;
722738 spanElement . id = 'upgradeAcc0' ;
723739 l ( "upgrade0" ) . appendChild ( spanElement ) ;
@@ -732,82 +748,169 @@ class PaybackRateMod {
732748 b . BestCpsAcceleration - a . BestCpsAcceleration
733749 ) ;
734750 } ;
751+ all . sort ( sortFunction ) ;
735752 upgrades . sort ( sortFunction ) ;
736753 buildings . sort ( sortFunction ) ;
737754 }
738755
739756 this . reorderUpgrades ( upgrades ) ;
740757 this . reorderBuildings ( buildings ) ;
741758
742- // if (all[0].waitingTime === "") {
743- // all[0].buy();
744- // }
759+ if ( this . config . autoBuy && all [ 0 ] . waitingTime === "" ) {
760+ all [ 0 ] . buy ( ) ;
761+ }
745762 }
746763
747764 /**
748765 * Adds an options menu to the game interface for the PaybackRateMod class.
749766 */
750- addOptionsMenu ( ) {
751- const body = `
752- <div class="listing">
753- ${ this . toggleButton ( "enableSort" , "Sort by payback rate" ) }
754- ${ this . toggleButton ( "sortGrandmapocalypse" , 'Grandmapocalypse' ) }
755- ${ this . toggleButton ( "sortWizardTower" , Game . Objects [ "Wizard tower" ] . dname ) }
756- </div>
757- <div class="listing"></div>
758- <div class="listing"></div>
759- <div class="listing">
760- ${ this . toggleButton ( "isBanking" , "Banking cookies" ) }
761- ${ this . numberInput ( "bankingSeconds" ) } <br>
762- <label>
763- Items will get locked to keep at least X second of cookies in bank.<br>
764- Maximum [Lucky!] payout requires 6000 CpS <br>
765- Maximum [Lucky!] payout with [Get Lucky] upgrade requires 42000 CpS<br>
766- Maximum [Cookie chain] payout requires 43200 CpS<br>
767- Maximum [Cookie chain] payout with [Get Lucky] upgrade requires 302400 CpS
768- </label>
769- </div>
770- <div class="listing">
771- ${ this . intervalInput ( "updateMS" , "Update Interval(ms)" ) } <label>(increase it if game lags)</label>
772- </div>
773- <div class="listing">
774- ${ this . colorPicker ( "color0" ) } <label>(best payback rate color)</label>
775- </div>
776- <div class="listing">
777- ${ this . colorPicker ( "color1" ) } <label>(2nd payback rate color)</label>
778- </div>
779- <div class="listing">
780- ${ this . colorPicker ( "color7" ) } <label>(8st payback rate color)</label>
781- </div>
782- <div class="listing">
783- ${ this . colorPicker ( "color15" ) } <label>(16st payback rate color)</label>
784- </div>
785- <div class="listing">
786- ${ this . colorPicker ( "colorLast" ) } <label>(worst payback rate color)</label>
787- </div>` ;
767+ sortingDiv ( ) {
768+ /* Sorting */
769+ const sortingDiv = document . createElement ( "div" ) ;
770+
771+ const toggleButtons = [
772+ { config : "enableSort" , text : "Sort by payback rate" } ,
773+ { config : "sortGrandmapocalypse" , text : "Grandmapocalypse" } ,
774+ { config : "sortWizardTower" , text : Game . Objects [ "Wizard tower" ] . dname } ,
775+ { config : "autoBuy" , text : "Auto buy best deal" } ,
776+ ] ;
777+
778+ toggleButtons . forEach ( ( button ) => {
779+ sortingDiv . appendChild ( this . toggleButton ( button . config , button . text ) ) ;
780+ } ) ;
781+ return sortingDiv ;
782+ }
783+
784+ bankingDiv ( ) {
785+ /* Banking */
786+ const bankingSecondsInput = document . createElement ( "input" ) ;
787+ bankingSecondsInput . type = "number" ;
788+ bankingSecondsInput . min = "0" ;
789+ bankingSecondsInput . style . width = "6em" ;
790+ bankingSecondsInput . id = "PaybackRateModBankingSecondsInput" ;
791+ bankingSecondsInput . value = this . config . bankingSeconds ;
792+ bankingSecondsInput . onchange = bankingSecondsInput . onkeypress = bankingSecondsInput . onpaste = bankingSecondsInput . oninput = ( ) => {
793+ bankingSecondsInput . value = bankingSecondsInput . value . replace ( / [ ^ 0 - 9 ] / g, "" ) ;
794+ this . config . bankingSeconds = parseInt ( bankingSecondsInput . value ) ;
795+ } ;
788796
797+ const bankingLabel = document . createElement ( "label" ) ;
798+ bankingLabel . innerHTML = "<br>Items will get locked to keep at least X second of cookies in bank.<br>Maximum [Lucky!] payout requires 6000 CpS<br>Maximum [Lucky!] payout with [Get Lucky] upgrade requires 42000 CpS<br>Maximum [Cookie chain] payout requires 43200 CpS<br>Maximum [Cookie chain] payout with [Get Lucky] upgrade requires 302400 CpS" ;
799+
800+ const bankingDiv = document . createElement ( "div" ) ;
801+ bankingDiv . appendChild ( this . toggleButton ( "isBanking" , "Banking cookies" ) ) ;
802+ bankingDiv . appendChild ( bankingSecondsInput ) ;
803+ bankingDiv . appendChild ( bankingLabel ) ;
804+ return bankingDiv ;
805+ }
806+ intervalBoxDiv ( ) {
807+ /* Update Interval */
808+ const updateTimeLabel = document . createElement ( "div" ) ;
809+ updateTimeLabel . style . float = "left" ;
810+ updateTimeLabel . innerHTML = "UI Update Interval" ;
811+
812+ const updateTimeValue = document . createElement ( "div" ) ;
813+ updateTimeValue . style . float = "right" ;
814+ updateTimeValue . id = "PaybackRateMod_UpdateMSValue" ;
815+ updateTimeValue . innerHTML = this . config . updateMS + "ms" ;
816+
817+ const updateTimeSlider = document . createElement ( "input" ) ;
818+ updateTimeSlider . classList . add ( "slider" ) ;
819+ updateTimeSlider . id = "PaybackRateMod_UpdateMSSlider" ;
820+ updateTimeSlider . style . clear = "both" ;
821+ updateTimeSlider . type = "range" ;
822+ updateTimeSlider . min = "500" ;
823+ updateTimeSlider . max = "10000" ;
824+ updateTimeSlider . step = "100" ;
825+ updateTimeSlider . value = this . config . updateMS ;
826+ updateTimeSlider . onchange = updateTimeSlider . oninput = ( ) => {
827+ this . config . updateMS = parseInt ( updateTimeSlider . value ) ;
828+ l ( "PaybackRateMod_UpdateMSValue" ) . innerHTML = this . config . updateMS + "ms" ;
829+ }
830+ updateTimeSlider . onmouseup = ( ) => {
831+ PlaySound ( 'snd/tick.mp3' ) ;
832+ } ;
833+
834+ const intervalBoxDiv = document . createElement ( "div" ) ;
835+ intervalBoxDiv . classList . add ( "sliderBox" ) ;
836+ intervalBoxDiv . appendChild ( updateTimeLabel ) ;
837+ intervalBoxDiv . appendChild ( updateTimeValue ) ;
838+ intervalBoxDiv . appendChild ( updateTimeSlider ) ;
839+ return intervalBoxDiv ;
840+ }
841+ colorPickerDiv ( ) {
842+ /* Color Pickers */
843+ const colorPickerDiv = document . createElement ( "div" ) ;
844+ const colorPickers = [
845+ { config : "color0" , label : "(best payback rate color)" } ,
846+ { config : "color1" , label : "(2nd payback rate color)" } ,
847+ { config : "color7" , label : "(8th payback rate color)" } ,
848+ { config : "color15" , label : "(16th payback rate color)" } ,
849+ { config : "colorLast" , label : "(worst payback rate color)" } ,
850+ ] ;
851+
852+ colorPickers . forEach ( ( picker ) => {
853+ const colorPicker = document . createElement ( "input" ) ;
854+ colorPicker . type = "color" ;
855+ colorPicker . id = `PaybackRateMod${ picker . config } Picker` ;
856+ colorPicker . value = this . config [ picker . config ] ;
857+ colorPicker . onchange = ( ) => {
858+ this . config [ picker . config ] = colorPicker . value ;
859+ } ;
860+
861+ const colorPickerLabel = document . createElement ( "label" ) ;
862+ colorPickerLabel . innerHTML = picker . label ;
863+
864+ colorPickerDiv . appendChild ( colorPicker ) ;
865+ colorPickerDiv . appendChild ( colorPickerLabel ) ;
866+ colorPickerDiv . appendChild ( document . createElement ( "br" ) ) ;
867+ } ) ;
868+ return colorPickerDiv ;
869+ }
870+ addOptionsMenu ( ) {
871+ const body = document . createElement ( "div" ) ;
872+ body . classList . add ( "listing" ) ;
873+ body . appendChild ( this . sortingDiv ( ) ) ;
874+ body . appendChild ( document . createElement ( "br" ) ) ;
875+ body . appendChild ( this . bankingDiv ( ) ) ;
876+ body . appendChild ( document . createElement ( "br" ) ) ;
877+ body . appendChild ( this . intervalBoxDiv ( ) ) ;
878+ body . appendChild ( document . createElement ( "br" ) ) ;
879+ body . appendChild ( document . createElement ( "br" ) ) ;
880+ body . appendChild ( this . colorPickerDiv ( ) ) ;
789881 CCSE . AppendCollapsibleOptionsMenu ( this . displayname , body ) ;
790882 }
883+
884+ getButtonID ( /** @type {string } */ config ) {
885+ return `PaybackRateMod_${ config } ` ;
886+ }
791887 /**
792888 *
793889 * @param {string } config
794890 * @param {string } text
795891 * @returns
796892 */
797893 toggleButton ( config , text ) {
798- const name = `PaybackRateModButton_ ${ config } ` ;
799- const callback = `paybackRateMod.toggleButtonCallback('${ config } ', '${ name } ', ' ${ text } ');` ;
894+ const name = this . getButtonID ( config ) ;
895+ const callback = `paybackRateMod.toggleButtonCallback('${ config } ', '${ text } ');`
800896 const value = this . config [ config ] ;
801- return `<a class="smallFancyButton prefButton ${ value ? "option" : "option off" } " id="${ name } " ${ Game . clickStr } ="${ callback } ">${ text } ${ value ? "On" : "Off" } </a>` ;
897+ const button = document . createElement ( "a" ) ;
898+ button . classList . add ( "smallFancyButton" , "prefButton" ) ;
899+ button . classList . toggle ( "option" , value ) ;
900+ button . classList . toggle ( "off" , ! value ) ;
901+ button . id = name ;
902+ button . setAttribute ( Game . clickStr , callback ) ;
903+ button . innerHTML = `${ text } ${ value ? "On" : "Off" } ` ;
904+ return button ;
802905 }
803906
804907 /**
805908 * @param {string } config
806- * @param {string } buttonID
807909 * @param {string } text
808910 */
809- toggleButtonCallback ( config , buttonID , text ) {
911+ toggleButtonCallback ( config , text ) {
810912 const value = ! this . config [ config ] ;
913+ const buttonID = `PaybackRateMod_${ config } ` ;
811914 this . config [ config ] = value ;
812915 l ( buttonID ) . innerHTML = value ? `${ text } On` : `${ text } Off` ;
813916 l ( buttonID ) . className = `smallFancyButton prefButton ${ value ? "option" : "option off" } ` ;
0 commit comments