效率曲计算器:修订间差异
跳到导航
跳到搜索
(样式调整) |
无编辑摘要 |
||
第4行: | 第4行: | ||
<p data-css style="display:none;"><nowiki> | <p data-css style="display:none;"><nowiki> | ||
[data-card-icon] {width: min(64px,6vw); height: min(64px,6vw);} | [data-card-icon] {width: min(64px,6vw); height: min(64px,6vw);} | ||
#selected-cards > div { | :is(#selected-cards,#forced-cards,#forced-center-card) > div { | ||
display: grid; align-items: center; | display: grid; align-items: center; | ||
grid-template: 1fr / min(64px,6vw) 2fr 1fr 1fr 1fr 2fr minmax(100px,4fr) 1fr; | grid-template: 1fr / min(64px,6vw) 2fr 1fr 1fr 1fr 2fr minmax(100px,4fr) 1fr; | ||
第53行: | 第53行: | ||
localStorage.setItem("selected_ids", JSON.stringify(s)); | localStorage.setItem("selected_ids", JSON.stringify(s)); | ||
} | } | ||
/* 强制入队集合 */ | |||
const forced_card_set = new Set(); | |||
/* 强制C位ID */ | |||
let forced_center_id = null; | |||
/* 点击头像加卡 */ | /* 点击头像加卡 */ | ||
function select_this(e) { | function select_this(e) { | ||
第152行: | 第156行: | ||
}); | }); | ||
}); | }); | ||
/* | selected_move_to_normal(n); | ||
$('[data-remove]', | selected_card_level_init(id, level); | ||
selected_card_skill_level_init(id, skill_level); | |||
sif2_card_image_refresh(); | |||
} | |||
/* promotion */ | |||
function selected_move_to_normal($parent) { | |||
$('#selected-cards').append($parent); | |||
$('[data-card-icon]', $parent).off('click'); | |||
$('[data-remove]', $parent).off('click'); | |||
$('[data-remove]', $parent).html('remove'); | |||
$('[data-card-icon]', $parent).on('click', function(){ | |||
if(forced_card_set.size >= 9) { alert('强制入队卡片不能超过 9 张!'); return; } | |||
const $parent = $(this).parent(); | |||
$parent.remove(); | |||
selected_move_to_forced($parent); | |||
}); | |||
$('[data-remove]', $parent).on('click', function(){ | |||
const $parent = $(this).parent(); | const $parent = $(this).parent(); | ||
const id = parseInt($parent.attr('data-card-id')); | const id = parseInt($parent.attr('data-card-id')); | ||
第162行: | 第182行: | ||
console.log(id, 'removed from selected'); | console.log(id, 'removed from selected'); | ||
}); | }); | ||
$('# | } | ||
function selected_move_to_forced($parent) { | |||
const id = parseInt($parent.attr('data-card-id')); | |||
$('#forced-cards').append($parent); | |||
$('[data-card-icon]', $parent).off('click'); | |||
$('[data-remove]', $parent).off('click'); | |||
$('[data-remove]', $parent).html('cancel'); | |||
$('[data-card-icon]', $parent).on('click', function(){ | |||
if(forced_center_id) { alert('强制C位卡片不能超过 1 张!'); return; } | |||
const $parent = $(this).parent(); | |||
$parent.remove(); | |||
selected_move_to_forced_center($parent); | |||
}); | |||
$('[data-remove]', $parent).on('click', function(){ | |||
const $parent = $(this).parent(); | |||
$parent.remove(); | |||
selected_move_to_normal($parent); | |||
forced_card_set.delete(id); | |||
}); | |||
forced_card_set.add(id); | |||
} | |||
function selected_move_to_forced_center($parent) { | |||
const id = parseInt($parent.attr('data-card-id')); | |||
$('#forced-center-card').append($parent); | |||
$('[data-card-icon]', $parent).off('click'); | |||
$('[data-remove]', $parent).off('click'); | |||
$('[data-remove]', $parent).html('cancel'); | |||
/* 已经是c位,再点一次就会移除 */ | |||
$('[data-card-icon]', $parent).on('click', function(){ | |||
const $parent = $(this).parent(); | |||
$parent.remove(); | |||
selected_move_to_forced($parent); | |||
forced_center_id = null; | |||
}); | |||
$('[data-remove]', $parent).on('click', function(){ | |||
const $parent = $(this).parent(); | |||
$parent.remove(); | |||
selected_move_to_forced($parent); | |||
forced_center_id = null; | |||
}); | |||
forced_center_id = id; | |||
} | } | ||
/* 更新等级数值 */ | /* 更新等级数值 */ | ||
第219行: | 第276行: | ||
<!-- start of kernel --> | <!-- start of kernel --> | ||
<p data-js style="display:none;"><nowiki>var tgtype;(function(tgtype){tgtype[tgtype["none"]=-1]="none";tgtype[tgtype["all"]=0]="all";tgtype[tgtype["muse"]=100]="muse";tgtype[tgtype["aqours"]=200]="aqours";tgtype[tgtype["niji"]=300]="niji";tgtype[tgtype["liella"]=400]="liella";tgtype[tgtype["muse_solo"]=190]="muse_solo";tgtype[tgtype["muse_other"]=199]="muse_other";tgtype[tgtype["aqours_solo"]=290]="aqours_solo";tgtype[tgtype["aqours_other"]=299]="aqours_other";tgtype[tgtype["niji_solo"]=390]="niji_solo";tgtype[tgtype["niji_other"]=399]="niji_other";tgtype[tgtype["liella_solo"]=490]="liella_solo";tgtype[tgtype["liella_other"]=499]="liella_other";tgtype[tgtype["pts"]=101]="pts";tgtype[tgtype["llw"]=102]="llw";tgtype[tgtype["bibi"]=103]="bibi";tgtype[tgtype["cyr"]=201]="cyr";tgtype[tgtype["aaa"]=202]="aaa";tgtype[tgtype["gk"]=203]="gk";tgtype[tgtype["dd"]=301]="dd";tgtype[tgtype["azn"]=302]="azn";tgtype[tgtype["q4"]=303]="q4";tgtype[tgtype["r3b"]=304]="r3b";tgtype[tgtype["arise"]=104]="arise";tgtype[tgtype["ss"]=204]="ss";tgtype[tgtype["sas"]=205]="sas";tgtype[tgtype["snp"]=401]="snp";tgtype[tgtype["yn"]=402]="yn";tgtype[tgtype["dummy_500"]=500]="dummy_500";tgtype[tgtype["dummy_501"]=501]="dummy_501";tgtype[tgtype["dummy_502"]=502]="dummy_502";tgtype[tgtype["dummy_503"]=503]="dummy_503";tgtype[tgtype["dummy_9999"]=9999]="dummy_9999"})(tgtype||(tgtype={}));var sktype;(function(sktype){sktype[sktype["score_bad"]=1]="score_bad";sktype[sktype["judge"]=2]="judge";sktype[sktype["heal"]=3]="heal";sktype[sktype["score_perfect"]=4]="score_perfect"})(sktype||(sktype={}));var trtype;(function(trtype){trtype[trtype["note"]=1]="note";trtype[trtype["combo"]=2]="combo";trtype[trtype["perfect"]=3]="perfect";trtype[trtype["time"]=4]="time"})(trtype||(trtype={}));const background_settings={perfect_rate:96,};function perfect_cache_clear(){sif2_live_data._chart_info.forEach(({skill_coverage_perfect})=>{skill_coverage_perfect.clear()})}function member_target_group_test(g,m){switch(g){case tgtype.none:case tgtype.arise:case tgtype.ss:case tgtype.sas:case tgtype.snp:case tgtype.yn:case tgtype.dummy_500:case tgtype.dummy_501:case tgtype.dummy_502:case tgtype.dummy_503:case tgtype.dummy_9999:return false;case tgtype.all:return true;case tgtype.muse:case tgtype.muse_solo:case tgtype.muse_other:return Math.floor(m/1000)===1;case tgtype.aqours:case tgtype.aqours_solo:case tgtype.aqours_other:return Math.floor(m/1000)===2;case tgtype.niji:case tgtype.niji_solo:case tgtype.niji_other:return Math.floor(m/1000)===3;case tgtype.liella:case tgtype.liella_solo:case tgtype.liella_other:return Math.floor(m/1000)===4;case tgtype.pts:return m===1001||m===1003||m===1008;case tgtype.llw:return m===1004||m===1005||m===1007;case tgtype.bibi:return m===1002||m===1006||m===1009;case tgtype.cyr:return m===2001||m===2005||m===2009;case tgtype.aaa:return m===2003||m===2004||m===2007;case tgtype.gk:return m===2002||m===2006||m===2008;case tgtype.dd:return m===3004||m===3005;case tgtype.azn:return m===3001||m===3003||m===3007;case tgtype.q4:return m===3002||m===3006||m===3008||m===3009;case tgtype.r3b:return m===3010||m===3011||m===3012;default:throw new Error(`unrecognized target ${g}`)}}function skill_score_fetch(difficulty_id,skill,masterCharacterId_by_pos,perfect_rate=null){if(skill.type===sktype.judge||skill.type===sktype.heal)return 0;const{tr,tm,pb,ev}=skill;const pb_ratios=[];for(let i=0;i<10;i+=1)pb_ratios.push(1-Math.pow(1-pb/10000,i));const stacks_by_pos=sif2_live_data.chart_skill_coverage_get(difficulty_id,skill);const at_100_pr=ev*stacks_by_pos.reduce((prev,stacks,pos)=>{if(!member_target_group_test(skill.target,masterCharacterId_by_pos[pos]))return prev;if(stacks.length>=10)throw new Error(`one skill stacks more than 10`);return prev+stacks.reduce((p,c,s)=>{return p+c*pb_ratios[s]},0)},0);if(skill.type===sktype.score_bad){return at_100_pr}else if(skill.type===sktype.score_perfect){if(perfect_rate===null)throw new Error();return at_100_pr*perfect_rate/100}}function skill_judge_fetch(difficulty_id,skill){if(skill.type!==sktype.judge)return 0;const{tr,tm,pb,ev}=skill;if(ev<1)throw new Error();const pb_ratios=[];for(let i=0;i<10;i+=1)pb_ratios.push(1-Math.pow(1-pb/10000,i));const stacks_by_pos=sif2_live_data.chart_skill_coverage_get(difficulty_id,skill);return stacks_by_pos.reduce((prev,stacks,pos)=>{if(stacks.length>=10)throw new Error(`one skill stacks more than 10`);return prev+stacks.reduce((p,c,s)=>{return p+c*pb_ratios[s]},0)},0)/sif2_live_data.chart_info_get(difficulty_id).note_list.length}function autoselect_center(difficulty_id,selected_cards,center_skill_guest_ids,forced_center | <p data-js style="display:none;"><nowiki>var tgtype;(function(tgtype){tgtype[tgtype["none"]=-1]="none";tgtype[tgtype["all"]=0]="all";tgtype[tgtype["muse"]=100]="muse";tgtype[tgtype["aqours"]=200]="aqours";tgtype[tgtype["niji"]=300]="niji";tgtype[tgtype["liella"]=400]="liella";tgtype[tgtype["muse_solo"]=190]="muse_solo";tgtype[tgtype["muse_other"]=199]="muse_other";tgtype[tgtype["aqours_solo"]=290]="aqours_solo";tgtype[tgtype["aqours_other"]=299]="aqours_other";tgtype[tgtype["niji_solo"]=390]="niji_solo";tgtype[tgtype["niji_other"]=399]="niji_other";tgtype[tgtype["liella_solo"]=490]="liella_solo";tgtype[tgtype["liella_other"]=499]="liella_other";tgtype[tgtype["pts"]=101]="pts";tgtype[tgtype["llw"]=102]="llw";tgtype[tgtype["bibi"]=103]="bibi";tgtype[tgtype["cyr"]=201]="cyr";tgtype[tgtype["aaa"]=202]="aaa";tgtype[tgtype["gk"]=203]="gk";tgtype[tgtype["dd"]=301]="dd";tgtype[tgtype["azn"]=302]="azn";tgtype[tgtype["q4"]=303]="q4";tgtype[tgtype["r3b"]=304]="r3b";tgtype[tgtype["arise"]=104]="arise";tgtype[tgtype["ss"]=204]="ss";tgtype[tgtype["sas"]=205]="sas";tgtype[tgtype["snp"]=401]="snp";tgtype[tgtype["yn"]=402]="yn";tgtype[tgtype["dummy_500"]=500]="dummy_500";tgtype[tgtype["dummy_501"]=501]="dummy_501";tgtype[tgtype["dummy_502"]=502]="dummy_502";tgtype[tgtype["dummy_503"]=503]="dummy_503";tgtype[tgtype["dummy_9999"]=9999]="dummy_9999"})(tgtype||(tgtype={}));var sktype;(function(sktype){sktype[sktype["score_bad"]=1]="score_bad";sktype[sktype["judge"]=2]="judge";sktype[sktype["heal"]=3]="heal";sktype[sktype["score_perfect"]=4]="score_perfect"})(sktype||(sktype={}));var trtype;(function(trtype){trtype[trtype["note"]=1]="note";trtype[trtype["combo"]=2]="combo";trtype[trtype["perfect"]=3]="perfect";trtype[trtype["time"]=4]="time"})(trtype||(trtype={}));const background_settings={perfect_rate:96,};function perfect_cache_clear(){sif2_live_data._chart_info.forEach(({skill_coverage_perfect})=>{skill_coverage_perfect.clear()})}function member_target_group_test(g,m){switch(g){case tgtype.none:case tgtype.arise:case tgtype.ss:case tgtype.sas:case tgtype.snp:case tgtype.yn:case tgtype.dummy_500:case tgtype.dummy_501:case tgtype.dummy_502:case tgtype.dummy_503:case tgtype.dummy_9999:return false;case tgtype.all:return true;case tgtype.muse:case tgtype.muse_solo:case tgtype.muse_other:return Math.floor(m/1000)===1;case tgtype.aqours:case tgtype.aqours_solo:case tgtype.aqours_other:return Math.floor(m/1000)===2;case tgtype.niji:case tgtype.niji_solo:case tgtype.niji_other:return Math.floor(m/1000)===3;case tgtype.liella:case tgtype.liella_solo:case tgtype.liella_other:return Math.floor(m/1000)===4;case tgtype.pts:return m===1001||m===1003||m===1008;case tgtype.llw:return m===1004||m===1005||m===1007;case tgtype.bibi:return m===1002||m===1006||m===1009;case tgtype.cyr:return m===2001||m===2005||m===2009;case tgtype.aaa:return m===2003||m===2004||m===2007;case tgtype.gk:return m===2002||m===2006||m===2008;case tgtype.dd:return m===3004||m===3005;case tgtype.azn:return m===3001||m===3003||m===3007;case tgtype.q4:return m===3002||m===3006||m===3008||m===3009;case tgtype.r3b:return m===3010||m===3011||m===3012;default:throw new Error(`unrecognized target ${g}`)}}function skill_score_fetch(difficulty_id,skill,masterCharacterId_by_pos,perfect_rate=null){if(skill.type===sktype.judge||skill.type===sktype.heal)return 0;const{tr,tm,pb,ev}=skill;const pb_ratios=[];for(let i=0;i<10;i+=1)pb_ratios.push(1-Math.pow(1-pb/10000,i));const stacks_by_pos=sif2_live_data.chart_skill_coverage_get(difficulty_id,skill);const at_100_pr=ev*stacks_by_pos.reduce((prev,stacks,pos)=>{if(!member_target_group_test(skill.target,masterCharacterId_by_pos[pos]))return prev;if(stacks.length>=10)throw new Error(`one skill stacks more than 10`);return prev+stacks.reduce((p,c,s)=>{return p+c*pb_ratios[s]},0)},0);if(skill.type===sktype.score_bad){return at_100_pr}else if(skill.type===sktype.score_perfect){if(perfect_rate===null)throw new Error();return at_100_pr*perfect_rate/100}}function skill_judge_fetch(difficulty_id,skill){if(skill.type!==sktype.judge)return 0;const{tr,tm,pb,ev}=skill;if(ev<1)throw new Error();const pb_ratios=[];for(let i=0;i<10;i+=1)pb_ratios.push(1-Math.pow(1-pb/10000,i));const stacks_by_pos=sif2_live_data.chart_skill_coverage_get(difficulty_id,skill);return stacks_by_pos.reduce((prev,stacks,pos)=>{if(stacks.length>=10)throw new Error(`one skill stacks more than 10`);return prev+stacks.reduce((p,c,s)=>{return p+c*pb_ratios[s]},0)},0)/sif2_live_data.chart_info_get(difficulty_id).note_list.length}function autoselect_center(difficulty_id,selected_cards,center_skill_guest_ids,forced_card_set,forced_center){const{attribute:live_attr,masterGroupId:live_group}=sif2_live_data.live_info.get(Math.floor(difficulty_id/10));const card_set=new Map();const powers=[];selected_cards.forEach(({id,level,skill_level})=>{const card=sif2_card_data.get(id);const power=Math.floor((live_attr===1&&card.smile||live_attr===2&&card.pure||live_attr===3&&card.cool)*card_level_ratio(card.rarity,level)/10000);const skill=card.skill_by_level.get(skill_level);const center_skill=card.center_skill;const attr_group_boost=(card.type===live_attr?1.1:1)*(member_target_group_test(live_group,card.masterCharacterId)?1.1:1)-1;if(skill.target!==tgtype.all)throw new Error(`not supported skill type`);const skill_score=skill_score_fetch(difficulty_id,skill,[],background_settings.perfect_rate);const judge_rate=skill_judge_fetch(difficulty_id,skill);if(card_set.has(id))throw new Error(`duplicate card ${id}`);card_set.set(id,{power,power_c:null,attr_group_boost,skill_score,judge_rate,center_skill});powers.push(power)});const power_max8=powers.sort((a,b)=>b-a).slice(0,8).reduce((prev,v)=>v+prev,0);const power_min8=powers.sort((a,b)=>a-b).slice(0,8).reduce((prev,v)=>v+prev,0);if(forced_center&&!card_set.has(forced_center))throw new Error(`forced center ${forced_center}does not exist in card_set`);const center_set=forced_center?new Map([[forced_center,card_set.get(forced_center)]]):new Map(card_set);const weights_by_pos=sif2_live_data.chart_info_get(difficulty_id).weights_total;const total_weight=weights_by_pos.reduce((prev,w)=>prev+w,0);const weight_other_max=Math.max(...weights_by_pos.filter((v,i)=>i>0&&i!==5));const weight_other_min=Math.min(...weights_by_pos.filter((v,i)=>i>0&&i!==5));const judge_ratio=0.88+0.12*(background_settings.perfect_rate/100);const guest_set=new Map();center_skill_guest_ids.forEach((id)=>{guest_set.set(id,sif2_card_data.get(id).center_skill)});const guest_center_set=new Map(guest_set);const[guest_min,guest_max]=center_skill_guest_ids.reduce(([min,max],id)=>{const{center_skill}=sif2_card_data.get(id);if(center_skill.type_1!==live_attr)return[min,max];if(center_skill.value_1>min)min=center_skill.value_1;if((center_skill.value_1+center_skill.value_2)>max)max=(center_skill.value_1+center_skill.value_2);return[min,max]},[0,0]);function guest_nohigherthan(id1,id2){const cs1=sif2_card_data.get(id1).center_skill,cs2=sif2_card_data.get(id2).center_skill;const center_skill_diff=new Map([[tgtype.all,0]]);if(cs2.type_1===live_attr)center_skill_diff.set(cs2.target_1,(center_skill_diff.has(cs2.target_1)&¢er_skill_diff.get(cs2.target_1)||0)+cs2.value_1);if(cs2.type_2===live_attr)center_skill_diff.set(cs2.target_2,(center_skill_diff.has(cs2.target_2)&¢er_skill_diff.get(cs2.target_2)||0)+cs2.value_2);if(cs1.type_1===live_attr){center_skill_diff.set(cs1.target_1,(center_skill_diff.has(cs1.target_1)&¢er_skill_diff.get(cs1.target_1)||0)-cs1.value_1)}if(cs1.type_2===live_attr){center_skill_diff.set(cs1.target_2,(center_skill_diff.has(cs1.target_2)&¢er_skill_diff.get(cs1.target_2)||0)-cs1.value_2)}let diff_min=center_skill_diff.get(tgtype.all);center_skill_diff.delete(tgtype.all);center_skill_diff.forEach((v,k)=>{if(v<0)diff_min+=v});return diff_min>=0}guest_set.forEach((v,id1)=>{if(!guest_center_set.has(id1))return;for(const[id2,]of guest_center_set){if(id1===id2)continue;if(guest_nohigherthan(id1,id2)){guest_center_set.delete(id1);break}}});function nohigherthan(id1,id2){const c1=center_set.get(id1),c2=center_set.get(id2);const attr_group_boost_diff=c2.attr_group_boost-c1.attr_group_boost;let relative_1=0;if(c1.attr_group_boost<c2.attr_group_boost){if(weights_by_pos[5]<weight_other_max){relative_1=attr_group_boost_diff*(weights_by_pos[5]-weight_other_max)/(total_weight+c1.attr_group_boost*weights_by_pos[5]+c2.attr_group_boost*weight_other_max)}else if(weights_by_pos[5]>weight_other_max){const total_plus=(total_weight-weights_by_pos[5]-weight_other_max)*(1.1*1.1-1);relative_1=attr_group_boost_diff*(weights_by_pos[5]-weight_other_max)/(total_weight+total_plus+c1.attr_group_boost*weights_by_pos[5]+c2.attr_group_boost*weight_other_max)}}else if(c1.attr_group_boost>c2.attr_group_boost){if(weights_by_pos[5]<weight_other_min){const total_plus=(total_weight-weights_by_pos[5]-weight_other_min)*(1.1*1.1-1);relative_1=attr_group_boost_diff*(weights_by_pos[5]-weight_other_min)/(total_weight+total_plus+c1.attr_group_boost*weights_by_pos[5]+c2.attr_group_boost*weight_other_min)}else if(weights_by_pos[5]>weight_other_min){relative_1=attr_group_boost_diff*(weights_by_pos[5]-weight_other_min)/(total_weight+c1.attr_group_boost*weights_by_pos[5]+c2.attr_group_boost*weight_other_min)}}const center_skill_diff=new Map([[tgtype.all,0]]);let c1_min=0,c1_max=0;if(c2.center_skill.type_1===live_attr)center_skill_diff.set(c2.center_skill.target_1,(center_skill_diff.has(c2.center_skill.target_1)&¢er_skill_diff.get(c2.center_skill.target_1)||0)+c2.center_skill.value_1);if(c2.center_skill.type_2===live_attr)center_skill_diff.set(c2.center_skill.target_2,(center_skill_diff.has(c2.center_skill.target_2)&¢er_skill_diff.get(c2.center_skill.target_2)||0)+c2.center_skill.value_2);if(c1.center_skill.type_1===live_attr){center_skill_diff.set(c1.center_skill.target_1,(center_skill_diff.has(c1.center_skill.target_1)&¢er_skill_diff.get(c1.center_skill.target_1)||0)-c1.center_skill.value_1);c1_max=c1_min=c1.center_skill.value_1}if(c1.center_skill.type_2===live_attr){center_skill_diff.set(c1.center_skill.target_2,(center_skill_diff.has(c1.center_skill.target_2)&¢er_skill_diff.get(c1.center_skill.target_2)||0)-c1.center_skill.value_2);c1_max+=c1.center_skill.value_2}let c2dc1_min=center_skill_diff.get(tgtype.all);center_skill_diff.delete(tgtype.all);center_skill_diff.forEach((v,k)=>{if(v<0)c2dc1_min+=v});let relative_2=0;if(c2dc1_min<0){if(relative_1<=0)return false;relative_2=c2dc1_min/(10000+c1_min+guest_min)}else if(c2dc1_min>0){relative_2=c2dc1_min/(10000+c1_max+guest_max)}if((1+relative_1)*(1+relative_2)<1)return false;const p_diff=c2.power-c1.power;const w_diff=attr_group_boost_diff*weights_by_pos[5];const c_diff=c2dc1_min;if(p_diff>=0&&w_diff>=0&&c_diff>=0){return true}let boost=+Infinity;for(const op of[power_min8,power_max8]){for(const ow of[total_weight,total_weight+(total_weight-weights_by_pos[5])*(1.1*1.1-1)]){for(const oc of[10000+guest_min,10000+guest_max]){boost=Math.min(boost,p_diff*ow*oc+op*w_diff*oc+op*ow*c_diff+p_diff*w_diff*oc+p_diff*ow*c_diff+op*w_diff*c_diff+p_diff*w_diff*c_diff)}}}const absolute=boost/80/10000*judge_ratio+c2.skill_score-c1.skill_score;if(absolute>=0){return true}else return false}card_set.forEach((v,id1)=>{if(!center_set.has(id1))return;for(const[id2,]of center_set){if(id1===id2)continue;if(nohigherthan(id1,id2)){center_set.delete(id1);break}}});forced_card_set.forEach((id)=>{if(card_set.has(id))return;else throw new Error(`forced card ${id}does not exist in card_set`)});let max_score=-1,max_card_ids=null,max_gid=null;for(const[gid,guest_center_skill]of guest_center_set){for(const[cid]of center_set){const{card_id_by_pos,score}=autoselect_others(difficulty_id,card_set,cid,guest_center_skill,forced_card_set);if(score<0)throw new Error(`difficulty ${difficulty_id}get a negative score ${score}with formation ${JSON.stringify(card_id_by_pos)}`);if(score>max_score){max_card_ids=card_id_by_pos;max_gid=gid;max_score=score}}}const card_by_pos=max_card_ids.map((id_s)=>{for(const[,{id,level,skill_level}]of selected_cards){if(id_s===id)return{id,level,skill_level}}});const r=score_final(difficulty_id,card_by_pos,guest_center_set.get(max_gid));return{difficulty_id,card_by_pos,guest_id:max_gid,score:r.score,tap:r.tap,skill:r.skill}}function autoselect_others(difficulty_id,card_set,center_id,center_skill_guest,forced_card_set){const{attribute:live_attr,masterGroupId:live_group}=sif2_live_data.live_info.get(Math.floor(difficulty_id/10));const center_skill_self=card_set.get(center_id).center_skill;const intermediate_set=new Map();card_set.forEach(({power,attr_group_boost,skill_score,judge_rate},id)=>{const{masterCharacterId}=sif2_card_data.get(id);let power_c=power;if(center_skill_self.type_1===live_attr&&member_target_group_test(center_skill_self.target_1,masterCharacterId))power_c+=Math.ceil(power*center_skill_self.value_1/10000);if(center_skill_self.type_2===live_attr&&member_target_group_test(center_skill_self.target_2,masterCharacterId))power_c+=Math.ceil(power*center_skill_self.value_2/10000);if(center_skill_guest.type_1===live_attr&&member_target_group_test(center_skill_guest.target_1,masterCharacterId))power_c+=Math.ceil(power*center_skill_guest.value_1/10000);if(center_skill_guest.type_2===live_attr&&member_target_group_test(center_skill_guest.target_2,masterCharacterId))power_c+=Math.ceil(power*center_skill_guest.value_2/10000);intermediate_set.set(id,{power:null,power_c,attr_group_boost,skill_score,judge_rate,center_skill:null})});const center_set=intermediate_set.get(center_id);const confirmed_set=new Map();intermediate_set.delete(center_id);const forced_confirm_set=new Set(forced_card_set);forced_confirm_set.delete(center_id);if(forced_confirm_set){for(const id of forced_confirm_set){confirmed_set.set(id,intermediate_set.get(id));if(confirmed_set.size>8)throw new Error(`9 or more forced non-center components`);intermediate_set.delete(id)}}const weights_by_pos=sif2_live_data.chart_info_get(difficulty_id).weights_total;const weights_others_order=weights_by_pos.filter((v,i)=>i>0&&i!==5).sort((a,b)=>b-a);const total_weight=weights_by_pos.reduce((prev,w)=>prev+w,0);const judge_ratio=0.88+0.12*(background_settings.perfect_rate/100);const result=partial_order(center_set,intermediate_set,confirmed_set,total_weight,weights_by_pos,weights_others_order,judge_ratio);const id_ag_pair=[];result.confirmed_set.forEach(({attr_group_boost},id)=>{id_ag_pair.push({id,attr_group_boost})});id_ag_pair.sort((a,b)=>b.attr_group_boost-a.attr_group_boost);const selected_card_ids=[];selected_card_ids[5]=center_id;id_ag_pair.forEach(({id},i)=>{const weight=weights_others_order[i];let pos=0;do{pos=weights_by_pos.indexOf(weight,pos+1);if(pos<1||pos>9)throw new Error();}while(selected_card_ids[pos]);selected_card_ids[pos]=id});return{card_id_by_pos:selected_card_ids,score:result.score}}function partial_order(center_set,intermediate_set,confirmed_set,total_weight,weights_by_pos,weights_others_order,judge_ratio,depth=0){if(depth>7)throw new Error(`at depth 7 intermediate_set size ${intermediate_set.size}`);while(true){let global_changed_flag=false;const intermediate_power_cs=[],intermediate_attr_group_boosts=[];const intermediate_agmap=new Map();intermediate_set.forEach(({power_c,attr_group_boost})=>{intermediate_power_cs.push(power_c);intermediate_attr_group_boosts.push(attr_group_boost);intermediate_agmap.set(attr_group_boost,intermediate_agmap.has(attr_group_boost)?(intermediate_agmap.get(attr_group_boost)+1):1)});let max_totalpowerc=0,min_totalpowerc=0,max_attrgroupboosts=[],min_attrgroupboosts=[];const confirmed_agmap=new Map();confirmed_set.forEach(({power_c,attr_group_boost})=>{max_totalpowerc+=power_c;min_totalpowerc+=power_c;max_attrgroupboosts.push(attr_group_boost);min_attrgroupboosts.push(attr_group_boost);confirmed_agmap.set(attr_group_boost,confirmed_agmap.has(attr_group_boost)?(confirmed_agmap.get(attr_group_boost)+1):1)});intermediate_power_cs.sort((a,b)=>b-a);intermediate_attr_group_boosts.sort((a,b)=>b-a);for(let i=0;i<7-confirmed_set.size;i+=1){max_totalpowerc+=intermediate_power_cs[i];max_attrgroupboosts.push(intermediate_attr_group_boosts[i])}for(let i=intermediate_set.size-1;i>intermediate_set.size-8+confirmed_set.size;i-=1){min_totalpowerc+=intermediate_power_cs[i];min_attrgroupboosts.push(intermediate_attr_group_boosts[i])}max_totalpowerc+=center_set.power_c;min_totalpowerc+=center_set.power_c;const max_sumproduct_by_boost=new Map(([0,1.1-1,1.1*1.1-1]).map((boost)=>{const max_copy=max_attrgroupboosts.map(v=>v);max_copy.push(boost);max_copy.sort((a,b)=>b-a);const lastrank=max_copy.lastIndexOf(boost);const sumproduct=max_copy.reduce((prev,b,i)=>{return prev+b*weights_others_order[i]},center_set.attr_group_boost*weights_by_pos[5]);return[boost,{sumproduct,lastrank,}]}));const min_sumproduct_by_boost=new Map(([0,1.1-1,1.1*1.1-1]).map((boost)=>{const min_copy=min_attrgroupboosts.map(v=>v);min_copy.push(boost);min_copy.sort((a,b)=>b-a);const lastrank=min_copy.lastIndexOf(boost);const sumproduct=min_copy.reduce((prev,b,i)=>{return prev+b*weights_others_order[i]},center_set.attr_group_boost*weights_by_pos[5]);return[boost,{sumproduct,lastrank,}]}));const temp=new Map();temp.set(0,(()=>{const max_bw_by_rank=[],min_bw_by_rank=[];max_bw_by_rank[7]=max_sumproduct_by_boost.get(0).sumproduct;min_bw_by_rank[7]=min_sumproduct_by_boost.get(0).sumproduct;return{max_bw_by_rank,min_bw_by_rank}})());temp.set(1.1-1,(()=>{const max_bw_by_rank=[],min_bw_by_rank=[];for(let rank=min_sumproduct_by_boost.get(1.1-1).lastrank;rank<=max_sumproduct_by_boost.get(1.1-1).lastrank;rank+=1){let max_boost=[],min_boost=[];max_boost[rank]=1.1-1;min_boost[rank]=1.1-1;for(let i=rank+1;i<8;i+=1){min_boost[i]=0;max_boost[i]=0}for(let i=0;i<confirmed_agmap.get(1.1*1.1-1);i+=1){min_boost[i]=1.1*1.1-1;max_boost[i]=1.1*1.1-1}for(let i=rank-1;i>=0&&i>=rank-confirmed_agmap.get(1.1-1);i-=1){min_boost[i]=1.1-1;max_boost[i]=1.1-1}let available_21=intermediate_agmap.get(1.1*1.1-1);for(let i=0;i<8;i+=1){if(max_boost[i]!==undefined)continue;if((available_21-=1)>=0)max_boost[i]=1.1*1.1-1;else max_boost[i]=1.1-1}let available_10=intermediate_agmap.get(1.1-1)-1;for(let i=7;i>=0;i-=1){if(min_boost[i]!==undefined)continue;if((available_10-=1)>=0)min_boost[i]=1.1-1;else min_boost[i]=1.1*1.1-1}max_bw_by_rank[rank]=max_boost.reduce((prev,b,i)=>prev+b*weights_others_order[i],center_set.attr_group_boost*weights_by_pos[5]);min_bw_by_rank[rank]=min_boost.reduce((prev,b,i)=>prev+b*weights_others_order[i],center_set.attr_group_boost*weights_by_pos[5])}return{max_bw_by_rank,min_bw_by_rank}})());temp.set(1.1*1.1-1,(()=>{const max_bw_by_rank=[],min_bw_by_rank=[];for(let rank=min_sumproduct_by_boost.get(1.1*1.1-1).lastrank;rank<=max_sumproduct_by_boost.get(1.1*1.1-1).lastrank;rank+=1){let max_boost=[],min_boost=[];max_boost[rank]=1.1*1.1-1;min_boost[rank]=1.1*1.1-1;for(let i=0;i<rank;i+=1){min_boost[i]=1.1*1.1-1;max_boost[i]=1.1*1.1-1}for(let i=rank+1;i<8&&i<=rank+confirmed_agmap.get(1.1-1);i+=1){min_boost[i]=1.1-1;max_boost[i]=1.1-1}for(let i=8-confirmed_agmap.get(0);i<8;i+=1){min_boost[i]=0;max_boost[i]=0}let available_10=intermediate_agmap.get(1.1-1);for(let i=0;i<8;i+=1){if(max_boost[i]!==undefined)continue;if((available_10-=1)>=0)max_boost[i]=1.1-1;else max_boost[i]=0}let available_00=intermediate_agmap.get(0);for(let i=7;i>=0;i-=1){if(min_boost[i]!==undefined)continue;if((available_00-=1)>=0)min_boost[i]=0;else min_boost[i]=1.1-1}max_bw_by_rank[rank]=max_boost.reduce((prev,b,i)=>prev+b*weights_others_order[i],center_set.attr_group_boost*weights_by_pos[5]);min_bw_by_rank[rank]=min_boost.reduce((prev,b,i)=>prev+b*weights_others_order[i],center_set.attr_group_boost*weights_by_pos[5])}return{max_bw_by_rank,min_bw_by_rank}})());let list=[];intermediate_set.forEach(({power_c,attr_group_boost,skill_score,judge_rate},id)=>{const{max_bw_by_rank,min_bw_by_rank}=temp.get(attr_group_boost);const t_max=max_bw_by_rank.reduce((prev,max_bw,rank)=>{return Math.max(prev,(power_c*(total_weight+max_bw)+(power_c+max_totalpowerc)*attr_group_boost*weights_others_order[rank])/80*judge_ratio+skill_score)},0);const t_min=min_bw_by_rank.reduce((prev,min_bw,rank)=>{return Math.min(prev,(power_c*(total_weight+min_bw)+(power_c+min_totalpowerc)*attr_group_boost*weights_others_order[rank])/80*judge_ratio+skill_score)},99999999);list.push({id,min:Math.round(t_min),max:Math.round(t_max),})});list.sort((a,b)=>b.min-a.min);if(!list[7-confirmed_set.size]){console.log(confirmed_set.size,list,intermediate_set);throw new Error();}const eliminated_max=list[7-confirmed_set.size].min;list.sort((a,b)=>b.max-a.max);const confirmed_min=list[8-confirmed_set.size]&&list[8-confirmed_set.size].max||0;list=list.filter(({id,min,max})=>{if(max<eliminated_max){intermediate_set.delete(id);global_changed_flag=true;return false}if(min>=confirmed_min&&confirmed_set.size<8){confirmed_set.set(id,intermediate_set.get(id));intermediate_set.delete(id);global_changed_flag=true;return false}return true});if(confirmed_set.size>8){console.log(list,eliminated_max,confirmed_min);throw new Error();}if(!global_changed_flag||confirmed_set.size===8){break}}if(confirmed_set.size===8){let great_ratio=1-background_settings.perfect_rate/100;const id_ag_pair=[];let total_power=center_set.power_c,score=0;confirmed_set.forEach(({power_c,attr_group_boost},id)=>{id_ag_pair.push({id,attr_group_boost});total_power+=power_c});id_ag_pair.sort((a,b)=>b.attr_group_boost-a.attr_group_boost);const weight_ag=total_weight+weights_others_order.reduce((prev,w,i)=>{return prev+w*id_ag_pair[i].attr_group_boost},center_set.attr_group_boost*weights_by_pos[5]);confirmed_set.forEach(({skill_score,judge_rate})=>{great_ratio*=(1-judge_rate);score+=skill_score});score+=center_set.skill_score;score+=total_power/80*weight_ag*(1-0.12*great_ratio);return{confirmed_set,score}}else{if(intermediate_set.size>37){console.log(8-confirmed_set.size,intermediate_set);throw new Error(`intermediate size ${intermediate_set.size}>37`)}let set=null,score=0;intermediate_set.forEach((c,id)=>{const intermediate_set_new=new Map(intermediate_set);const confirmed_set_new=new Map(confirmed_set);confirmed_set_new.set(id,intermediate_set_new.get(id));intermediate_set_new.delete(id);const result=partial_order(center_set,intermediate_set_new,confirmed_set_new,total_weight,weights_by_pos,weights_others_order,judge_ratio,depth+1);if(result.score>score){score=result.score;set=result.confirmed_set}});return{confirmed_set:set,score}}}function score_final(difficulty_id,card_by_pos,center_skill_guest={type_1:0,target_1:0,value_1:0,type_2:0,target_2:0,value_2:0}){const{attribute:live_attr,masterGroupId:live_group}=sif2_live_data.live_info.get(Math.floor(difficulty_id/10));const chart=sif2_live_data.chart_info_get(difficulty_id);const cards_by_pos=card_by_pos.map(({id,level,skill_level})=>{const card=sif2_card_data.get(id);const power=Math.floor((live_attr===1&&card.smile||live_attr===2&&card.pure||live_attr===3&&card.cool)*card_level_ratio(card.rarity,level)/10000);const skill=card.skill_by_level.get(skill_level);return{card,power,skill}});const center_skill_self=sif2_card_data.get(card_by_pos[5].id).center_skill;let total_power=0;cards_by_pos.forEach(({power})=>{total_power+=power});function process_center_skill_effect(type,target,value){if(type===live_attr)cards_by_pos.forEach(({card:{masterCharacterId},power})=>{if(member_target_group_test(target,masterCharacterId))total_power+=Math.ceil(power*value/10000)})}process_center_skill_effect(center_skill_self.type_1,center_skill_self.target_1,center_skill_self.value_1);process_center_skill_effect(center_skill_self.type_2,center_skill_self.target_2,center_skill_self.value_2);process_center_skill_effect(center_skill_guest.type_1,center_skill_guest.target_1,center_skill_guest.value_1);process_center_skill_effect(center_skill_guest.type_2,center_skill_guest.target_2,center_skill_guest.value_2);const base_tap_score=Math.ceil(total_power/80);let great_rate=100-background_settings.perfect_rate;cards_by_pos.forEach(({skill})=>{great_rate*=(1-skill_judge_fetch(difficulty_id,skill))});let total_tapscore=0;chart.weights_detail.forEach((map,pos)=>{const tapscore_attr_group=base_tap_score*(cards_by_pos[pos].card.type===live_attr?1.1:1)*(member_target_group_test(live_group,cards_by_pos[pos].card.masterCharacterId)?1.1:1);map.forEach((count,ratio)=>{total_tapscore+=(Math.ceil(tapscore_attr_group*ratio*1.00)*(100-great_rate)+Math.ceil(tapscore_attr_group*ratio*0.88)*great_rate)/100*count})});let total_skillscore=0;const masterCharacterId_by_pos=cards_by_pos.map(({card:{masterCharacterId}})=>masterCharacterId);cards_by_pos.forEach(({skill})=>{total_skillscore+=skill_score_fetch(difficulty_id,skill,masterCharacterId_by_pos,100-great_rate)});return{score:total_tapscore+total_skillscore,tap:total_tapscore,skill:total_skillscore}}function card_level_ratio(rarity,level){if(rarity===3)return level>80?(5000+50*level):(6600+30*level);else if(rarity===2)return level>60?(6000+50*level):(7200+30*level);else if(rarity===1)return level>40?(7000+50*level):(7800+30*level);else throw new Error();}</nowiki></p> | ||
<!-- end of kernel --> | <!-- end of kernel --> | ||
<p data-js style="display:none;"><nowiki> | <p data-js style="display:none;"><nowiki> | ||
const guest_centers = [10010013, 20010011, 30010007, 40010007, 10020013, 10030013, 10040013]; | const guest_centers = [10010013, 20010011, 30010007, 40010007, 10020013, 10030013, 10040013]; | ||
let showed = 0; | |||
let result = null; | |||
function formation_calculate(max_difficulty_rating) { | function formation_calculate(max_difficulty_rating) { | ||
if(selected_id_map.size < 9){ | if(selected_id_map.size < 9){ | ||
第230行: | 第289行: | ||
} | } | ||
const chart_ids = sif2_live_data.chart_difficulty_rating_selection(1, max_difficulty_rating); | const chart_ids = sif2_live_data.chart_difficulty_rating_selection(1, max_difficulty_rating); | ||
result = chart_ids.map((difficulty_id)=>{ | |||
try { return autoselect_center(difficulty_id, selected_id_map, guest_centers); } | try { return autoselect_center(difficulty_id, selected_id_map, guest_centers, forced_card_set, forced_center_id); } | ||
catch(e) { alert(' | catch(e) { alert(sif2_live_data.live_info.get(Math.floor(result[i].difficulty_id / 10)).name+' '+[,"NORMAL","HARD","EXPERT","MASTER"][result[i].difficulty_id%10]+'难度发生错误:'+e); return {score:-1} } | ||
}); | }); | ||
showed = 0; | |||
$('input[type="button"]','#show-more').prop('disabled',false); | |||
$('input[type="button"]','#show-more').attr('value','show 50 more'); | |||
result.sort((a,b)=>b.score-a.score); | result.sort((a,b)=>b.score-a.score); | ||
$('#formation-result').html(''); | $('#formation-result').html(''); | ||
$('input[type="button"]','#show-more').click(); | |||
} | |||
function show_result(result, start, end) { | |||
let i = start; | |||
for(; i < end; i += 1) { | |||
if (!result[i]) break; | |||
const card_icons = result[i].card_by_pos.map(({id})=>'<div data-card-icon="' + id + '"></div>').join(''); | const card_icons = result[i].card_by_pos.map(({id})=>'<div data-card-icon="' + id + '"></div>').join(''); | ||
const title = '<div>#' + (i+1) + ' ' + sif2_live_data.live_info.get(Math.floor(result[i].difficulty_id / 10)).name + ' ' + [,"NORMAL","HARD","EXPERT","MASTER"][result[i].difficulty_id%10] + '</div>'; | const title = '<div>#' + (i+1) + ' ' + sif2_live_data.live_info.get(Math.floor(result[i].difficulty_id / 10)).name + ' ' + [,"NORMAL","HARD","EXPERT","MASTER"][result[i].difficulty_id%10] + '</div>'; | ||
第246行: | 第313行: | ||
const n = $('<div>'+ title + event_pt + event_item + score_total + score_tap + score_skill + '<br>' + card_icons + '<div data-card-icon></div><div data-card-icon="' + result[i].guest_id + '"></div></div>'); | const n = $('<div>'+ title + event_pt + event_item + score_total + score_tap + score_skill + '<br>' + card_icons + '<div data-card-icon></div><div data-card-icon="' + result[i].guest_id + '"></div></div>'); | ||
$('#formation-result').append(n); | $('#formation-result').append(n); | ||
} | |||
if(!result[i]) { | |||
$('input[type="button"]','#show-more').prop('disabled',true); | |||
$('input[type="button"]','#show-more').attr('value',"已展示完"+result.length+"个结果"); | |||
} | } | ||
sif2_card_image_refresh(); | sif2_card_image_refresh(); | ||
return i; | |||
} | } | ||
$('#show-more').append('<input type="button" value="show 50 more" disabled></input>'); | |||
$('input[type="button"]','#show-more').click(function(){ | |||
showed = show_result(result, showed, showed + 50); | |||
}); | |||
$('#background-settings').append('<input style="width:50%;" type="range" min="70" max="100" step="0.5" value="96" onchange="perfect_rate.value=background_settings.perfect_rate=parseFloat(this.value);perfect_cache_clear();"></input>PERFECT率 - <output id="perfect_rate">96</output>%<br>'); | $('#background-settings').append('<input style="width:50%;" type="range" min="70" max="100" step="0.5" value="96" onchange="perfect_rate.value=background_settings.perfect_rate=parseFloat(this.value);perfect_cache_clear();"></input>PERFECT率 - <output id="perfect_rate">96</output>%<br>'); | ||
第270行: | 第346行: | ||
<span id="filter-skill-1">加分</span> <span id="filter-skill-2">判定</span> <span id="filter-skill-3">回复</span> <span id="filter-skill-4">条件加分</span> | <span id="filter-skill-1">加分</span> <span id="filter-skill-2">判定</span> <span id="filter-skill-3">回复</span> <span id="filter-skill-4">条件加分</span> | ||
|- | |- | ||
| id="available-cards" | | | id="available-cards" | 选择卡片 | ||
|- | |||
| id="selected-cards" | 可选入队(点击头像添加) | |||
|- | |||
| id="forced-cards" | 强制入队(点击头像添加) | |||
|- | |- | ||
| id=" | | id="forced-center-card" | 强制C位(点击头像添加) | ||
|} | |} | ||
第278行: | 第358行: | ||
<div id="formation-result"></div> | <div id="formation-result"></div> | ||
<div id="show-more"></div> |
2023年4月29日 (六) 08:36的版本
UR SR R muse aqours niji liella |
选择卡片 |
可选入队(点击头像添加) |
强制入队(点击头像添加) |
强制C位(点击头像添加) |