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: Difference between revisions

MediaWiki interface page
Content added Content deleted
m (changed sub to add)
No edit summary
Line 19: Line 19:
}
}
function estimateNumberOfEventSongs( numberOfEvents ) {
function estimateNumberOfEventSongs( numOfEvents ) {
// mixed events are roughtly 1/3 of all events
// mixed events are roughtly 1/3 of all events
return Math.ceil( 2 * numberOfEvents / 3);
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 ) {
}
}
Line 92: Line 151:
*/
*/
var eventTierOptions = [
var eventTierOptions = [
'T1-10',
{ tier: 'T1-10', crystals: 3000 },
'T20-100',
{ tier: 'T20-100', crystals: 2500 },
'T200-500',
{ tier: 'T200-500', crystals: 2000 },
'T1000',
{ tier: 'T1000', crystals: 1500 },
'T2000-5000',
{ tier: 'T2000-5000', crystals: 1000 },
'T10000-50000',
{ tier: 'T10000-50000', crystals: 500 },
'T100000',
{ tier: 'T100000', crystals: 250 },
'T200000',
{ tier: 'T200000', crystals: 200 },
'T300000',
{ tier: 'T300000', crystals: 150 },
'T500000',
{ tier: 'T500000', crystals: 100 },
'T1000000',
{ tier: 'T1000000', crystals: 50 },
'None'
{ tier: 'None', crystals: 0 }
];
];
var eventTierWidget = new OO.ui.ButtonSelectWidget( {
var eventTierWidget = new OO.ui.ButtonSelectWidget( {
items: eventTierOptions.map( function( tier, index ) {
items: eventTierOptions.map( function( option, index ) {
return new OO.ui.ButtonOptionWidget( {
return new OO.ui.ButtonOptionWidget( {
data: index,
data: index,
label: tier,
label: option.tier,
selected: index === 0
selected: index === 0
} );
} );
Line 138: Line 197:
var songRankOptions = [ 'S', 'A', 'B', 'C' ];
var songRankOptions = [ 'S', 'A', 'B', 'C' ];
var songRankWidget = new OO.ui.ButtonSelectWidget( {
var songRankWidget = new OO.ui.ButtonSelectWidget( {
items: songRankOptions.map( function( rank, index ) {
items: songRankOptions.map( function( option, index ) {
return new OO.ui.ButtonOptionWidget( {
return new OO.ui.ButtonOptionWidget( {
data: index,
data: index,
label: rank,
label: option,
selected: index === 0
selected: index === 0
} );
} );
Line 155: Line 215:
'None',
'None',
];
];

var songComboHardWidget = new OO.ui.ButtonSelectWidget( {
var songComboHardWidget = new OO.ui.ButtonSelectWidget( {
items: songComboOptions.map( function( option, index ) {
items: songComboOptions.map( function( option, index ) {
return new OO.ui.ButtonOptionWidget( {
return new OO.ui.ButtonOptionWidget( {
data: index,
data: songComboOptions.length - 1 - index,
label: option,
label: option,
selected: index === 0
selected: index === songComboOptions.length - 1
} );
} );
} )
} )
Line 229: Line 290:
* Challenge Stamp
* Challenge Stamp
*/
*/
var clStampOptions = [
{ label: 'Yes', crystals: 100 },
{ label: 'No', crystals: 0 }
];
var clStampWidget = new OO.ui.RadioSelectInputWidget( {
var clStampWidget = new OO.ui.RadioSelectInputWidget( {
options: clStampOptions.map( function( option, index ) {
options: [
return {
{ data: 'true', label: 'Yes' },
label: option.label,
{ data: 'false', label: 'No' }
data: index
],
};
value: 'true'
} ),
value: 0
} );
} );

Revision as of 23:53, 24 August 2022

( 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 ) {
		
	}
	
	/***************************************************************************
	 * 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;
	}
	
	/***************************************************************************
	 * 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 === songComboOptions.length - 1
			} );
		} )
	} );
	
	var songComboExpertWidget = new OO.ui.ButtonSelectWidget( {
		items: songComboOptions.map( function( option, index ) {
			return new OO.ui.ButtonOptionWidget( {
				data: index,
				label: option,
				selected: index === 0
			} );
		} )
	} );
	
	var songComboMasterWidget = new OO.ui.ButtonSelectWidget( {
		items: songComboOptions.map( function( option, index ) {
			return new OO.ui.ButtonOptionWidget( {
				data: 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 clStampOptions = [
		{ label: 'Yes', crystals: 100 },
		{ label: 'No',  crystals: 0   }
	];
	var clStampWidget = new OO.ui.RadioSelectInputWidget( {
		options: clStampOptions.map( function( option, index ) {
			return {
				label: option.label,
				data: index
			};
		} ),
		value: 0
	} );
    
    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 calculate() {
		console.log(startDateWidget.getValue());
		console.log(endDateWidget.getValue());
		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());
	}
	
	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.