Content added Content deleted
m (changed sub to add) |
No edit summary |
||
Line 19: | Line 19: | ||
} |
} |
||
function estimateNumberOfEventSongs( |
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 * |
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( |
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( |
items: songRankOptions.map( function( option, index ) { |
||
return new OO.ui.ButtonOptionWidget( { |
return new OO.ui.ButtonOptionWidget( { |
||
data: index, |
data: index, |
||
label: |
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 === |
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 |
|||
⚫ | |||
}; |
|||
⚫ | |||
} ), |
|||
⚫ | |||
} ); |
} ); |
||
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 );