Toggle menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

MediaWiki:Gadget-calculator-crystals-core.js

MediaWiki interface page
Revision as of 01:53, 25 August 2022 by ChaoticShadow (talk | contribs)

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
( function ( $, mw ) {
	var calculationValues = {
		days: undefined,
		events: undefined,
		songs: undefined
	};
	
	/***************************************************************************
	 * Calculation helpers
	 */
	function estimateNumberOfEvents( days ) {
		// the median event length is 8
		// the average event length is 8.16
		return Math.ceil( days / 8 );
	}
	
	function getNumberOfCheerfulCarnivals( startDay, endDay ) {
		
	}
	
	function estimateNumberOfEventSongs( numOfEvents ) {
		// mixed events are roughtly 1/3 of all events
		return Math.ceil( 2 * numOfEvents / 3);
	}
	
	function calculateLoginCrystals( numOfLogins ) {
		var numOfDaySeven = Math.floor( numOfLogins / 7 );
		return ( numOfLogins - numOfDaySeven ) * 30 + numOfDaySeven * 100;
	}
	
	function calculateEventTierCrystals( numOfEvents, avgTier ) {
		return numOfEvents * 0;
	}
	
	function calculateEventShopCrystals(
		numOfMarathonEvents,
		numOfCcEvents
	) {
		return 0;
	}
	
	function calculateEventStoryCrystals( numOfEvents ) {
		// 8 event stories, 50 crystals each
		return numOfEvents * 8 * 50;
	}
	
	function calculateSongCrystals(
		numOfSongs,
		avgRank,
		avgHardCombo,
		avgExpertCombo,
		avgMasterCombo
	) {
		var rankCrystals = { 
			'S': 50 + 30 + 20 + 10,
			'A': 30 + 20 + 10,
			'B': 20 + 10,
			'C': 10
		};
		
		var crystalsFromRank = rankCrystals[avgRank];
		
		var comboCrystals = {
			'hard':   [ 0, 0, 0,  0, 50      ],
			'expert': [ 0, 0, 0, 20, 50 + 20 ],
			'master': [ 0, 0, 0, 20, 50 + 20 ]
		};
		
		var crystalsFromHardCombo = comboCrystals.hard[avgHardCombo];
		var crystalsFromExpertCombo = comboCrystals.expert[avgExpertCombo];
		var crystalsFromMasterCombo = comboCrystals.master[avgMasterCombo];
		
		return numOfSongs * ( 
			crystalsFromRank + 
			crystalsFromHardCombo + 
			crystalsFromExpertCombo + 
			crystalsFromMasterCombo
		);
	}
	
	function calculateClCrystals( numberOfPlays, crystalsSelected ) {
		var numOfDaySeven = Math.floor( numOfLogins / 7 );
		var partialCrystals = ( numOfLogins - numOfDaySeven ) * 20;
		
		if ( !crystalsSelected ) {
			return partialCrystals;
		}
		
		return partialCrystals + numOfDaySeven * 100;
	}
	
	/***************************************************************************
	 * General helpers
	 */
	function getDateRelativeToTodayAsString( dayOffset ) {
		var now = new Date();
		now.setDate( now.getDate() + dayOffset );
		return now.toISOString().split( 'T' )[ 0 ];
	}
	 
	function getDateFromString( dateString ) {
		var date = new Date( dateString ).getTime();
		
		if ( isNaN( date ) ) {
			return undefined;
		}
		return date;
	}
	
	function getDayDiffBetweenDates( start, end ) {
		return Math.ceil( ( end - start ) / 86400000  );
	}
	
	/***************************************************************************
	 * Date range
	 */
	var startDateWidget = new mw.widgets.DateInputWidget( {
		type: 'date',
		value: getDateRelativeToTodayAsString( 0 ),
		mustBeAfter: getDateRelativeToTodayAsString( -1 ),
		inputFormat: 'YYYY-MM-DD',
        displayFormat: 'YYYY-MM-DD'
	} );
	
	var endDateWidget = new mw.widgets.DateInputWidget( {
		type: 'date',
		mustBeAfter: getDateRelativeToTodayAsString( 0 ),
		inputFormat: 'YYYY-MM-DD',
        displayFormat: 'YYYY-MM-DD'
	} );
	
	function handleDateRangeChange() {
		var startDate = getDateFromString(startDateWidget.getValue());
		var endDate = getDateFromString(endDateWidget.getValue());
		
		var dateDiff = endDate - startDate;
	}
	
	var dateFieldset = new OO.ui.FieldsetLayout( {
	    label: 'Date range',
	    items: [
	    	new OO.ui.FieldLayout(
	    		startDateWidget,
				{
					label: 'Start date',
					align: 'inline',
					help: 'test'
				}
			),
			new OO.ui.FieldLayout(
				endDateWidget,
				{
					label: 'End date',
					align: 'inline'
				}
			)
		]
	} );
	
	/***************************************************************************
	 * Event
	 */
	var eventTierOptions = [ 
		{ tier: 'T1-10',        crystals: 3000 },
		{ tier: 'T20-100',      crystals: 2500 },
		{ tier: 'T200-500',     crystals: 2000 },
		{ tier: 'T1000',        crystals: 1500 }, 
		{ tier: 'T2000-5000',   crystals: 1000 }, 
		{ tier: 'T10000-50000', crystals: 500  }, 
		{ tier: 'T100000',  crystals: 250 },
		{ tier: 'T200000',  crystals: 200 }, 
		{ tier: 'T300000',  crystals: 150 },
		{ tier: 'T500000',  crystals: 100 },
		{ tier: 'T1000000', crystals: 50  },
		{ tier: 'None',     crystals: 0   }
	];
	var eventTierWidget = new OO.ui.ButtonSelectWidget( {
		items: eventTierOptions.map( function( option, index ) {
			return new OO.ui.ButtonOptionWidget( {
				data: index,
				label: option.tier,
				selected: index === 0
			} );
		} ),
	} );
	 
    var eventFieldset = new OO.ui.FieldsetLayout( {
	    label: 'Events',
	    items: [
	    	new OO.ui.FieldLayout(
	    		eventTierWidget,
				{
					label: 'Average tier',
					align: 'inline'
				}
			)
		]
	} );
	
	/***************************************************************************
	 * Song
	 */
	 
	var songCoverWidget = new OO.ui.NumberInputWidget( {
    	min: 0,
    	value: 0
	} );
	
	var songRankOptions = [ 'S', 'A', 'B', 'C' ];
	
	var songRankWidget = new OO.ui.ButtonSelectWidget( {
		items: songRankOptions.map( function( option, index ) {
			return new OO.ui.ButtonOptionWidget( {
				data: index,
				label: option,
				selected: index === 0
			} );
		} )
	} );
	
	var songComboOptions = [
		'Combo 4 (full combo)',
		'Combo 3',
		'Combo 2',
		'Combo 1',
		'None',
	];

	var songComboHardWidget = new OO.ui.ButtonSelectWidget( {
		items: songComboOptions.map( function( option, index ) {
			return new OO.ui.ButtonOptionWidget( {
				data: songComboOptions.length - 1 - index,
				label: option,
				selected: index === 0
			} );
		} )
	} );
	
	var songComboExpertWidget = new OO.ui.ButtonSelectWidget( {
		items: songComboOptions.map( function( option, index ) {
			return new OO.ui.ButtonOptionWidget( {
				data: songComboOptions.length - 1 - index,
				label: option,
				selected: index === 0
			} );
		} )
	} );
	
	var songComboMasterWidget = new OO.ui.ButtonSelectWidget( {
		items: songComboOptions.map( function( option, index ) {
			return new OO.ui.ButtonOptionWidget( {
				data: songComboOptions.length - 1 - index,
				label: option,
				selected: index === 0
			} );
		} )
	} );
	
    var songFieldset = new OO.ui.FieldsetLayout( {
	    label: 'Songs',
	    items: [
	    	new OO.ui.FieldLayout(
	    		songCoverWidget,
	    		{
	    			label: 'New cover songs',
	    			align: 'inline'
	    		}
    		),
	    	new OO.ui.FieldLayout(
	    		songRankWidget,
				{
					label: 'Average score rank',
					align: 'inline'
				}
			),
	    	new OO.ui.FieldLayout(
	    		songComboHardWidget,
				{
					label: 'Average combo milestone (on hard)',
					align: 'inline'
				}
			),
	    	new OO.ui.FieldLayout(
	    		songComboExpertWidget,
	    		{
					label: 'Average combo milestone (on expert)',
					align: 'inline'
				}
			),
	    	new OO.ui.FieldLayout(
	    		songComboMasterWidget,
	    		{
					label: 'Average combo milestone (on master)',
					align: 'inline'
				}
			)
		]
	} );

	/***************************************************************************
	 * Challenge Stamp
	 */
	var clStampWidget = new OO.ui.RadioSelectInputWidget( {
		options: [
			{ label: 'Yes', data: 'true'  },
			{ label: 'No',  data: 'false' }
		],
		value: 'true'
	} );
    
    var clFieldset = new OO.ui.FieldsetLayout( {
	    label: 'Challenge Live',
	    items: [
	    	new OO.ui.FieldLayout(
	    		clStampWidget,
	    		{
					label: 'Crystals selected as Challenge Stamp reward?',
					align: 'inline'
				}
			)
		]
	} );
	
	/***************************************************************************
	 * Everything
	 */
	var submitButton = new OO.ui.ButtonInputWidget( { 
		label: 'Calculate',
		flags: [ 'primary', 'progressive' ],
		align: 'left',
		icon: 'mathematics'
	} );
	
	function validate() {}
	
	function calculate() {
		var startDate = startDateWidget.getValue();
		var endDate = endDateWidget.getValue();
		
		var eventTier = eventTierWidget.findSelectedItems().getData();
		
		var numOfSongCovers = songCoverWidget.getValue();
		var avgSongRank = songRankWidget
			.findSelectedItems()
			.getData();
		var avgComboHard = songComboHardWidget
			.findSelectedItems()
			.getData();
		var avgComboExpert = songComboExpertWidget
			.findSelectedItems()
			.getData();
		var avgComboMaster = songComboMasterWidget
			.findSelectedItems()
			.getData();
			
		var clStampCrystalsChosen = clStampWidget.getValue() === 'true';
		
		var diffBetweenDates = getDayDiffBetweenDates(
			new Date( startDate ),
			new Date( endDate )
		);
		
		var numOfSongs = numOfSongCovers;
		
		console.log( 
			startDate,
			endDate,
			diffBetweenDates
		);
		 
		console.log(eventTierWidget.findSelectedItems().getData());
		console.log(songCoverWidget.getValue());
		console.log(songRankWidget.findSelectedItems().getData());
		console.log(songComboHardWidget.findSelectedItems().getData());
		console.log(songComboExpertWidget.findSelectedItems().getData());
		console.log(songComboMasterWidget.findSelectedItems().getData());
		console.log(clStampWidget.getValue());
		
		var crystals = {};
		
		crystals.login = calculateLoginCrystals( diffBetweenDates );
		crystals.songs = calculateSongCrystals(
			numOfSongs,
			avgSongRank,
			avgComboHard,
			avgComboExpert,
			avgComboMaster
		);
		
		makeTable( crystals );
	}
	
	function makeTable( crystals ) {
		function makeRow( entry, crystals ) {
			var entryTd = document.createElement("tr");
    		var crystaldsTd = document.createElement("td");
    		
    		entryTd.innerText = entry;
    		crystalsTd.innerText = crystals;
    		
			var row = document.createElement( 'tr' );
			
			row.appendChild(entryTd);
			row.appendChild(crystalsTd);
			
			return row;
		}
		
		var totalCrystals = 0;
		
		var fragment = document.createDocumentFragment();
		
		fragment.appendChild( makeRow( 'Daily logins', crystals.login ) );
		totalCrystals += crystals.login;
		
		fragment.appendChild( makeRow( 'Song clears', crystals.songs ) );
		totalCrystals += crystals.songs;
		
		fragment.appendChild( makeRow ('Total crystals', totalCrystals ) );
		
		var table = document.createElement( 'table' );
		table.appendChild( fragment );
		
		$( '#result' ).html( table );
	}
	
	submitButton.on( 'click', calculate );
	
	var fieldset = new OO.ui.FieldsetLayout( {
		items: [
			dateFieldset,
			eventFieldset,
			songFieldset,
			clFieldset,
			new OO.ui.FieldLayout(
				submitButton
			)
		]
	} );

	$( '#calculator' ).append( fieldset.$element );
	
} )( jQuery, mediaWiki );
Cookies help us deliver our services. By using our services, you agree to our use of cookies.