效率曲计算器:修订间差异

来自LoveLive Wiki
跳到导航 跳到搜索
无编辑摘要
无编辑摘要
第270行: 第270行:


<!-- 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={}));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}class guest_default{static get_list(live_attr){const target_map=[,this.smile,this.pure,this.cool][live_attr];if(target_map.size>0)return target_map;const guest_center_set=new Set();sif2_card_data.forEach((v,id1)=>guest_center_set.add(id1));sif2_card_data.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,live_attr)){guest_center_set.delete(id1);break}}});guest_center_set.forEach((v)=>target_map.set(v,sif2_card_data.get(v).center_skill));return target_map}}guest_default.smile=new Map();guest_default.pure=new Map();guest_default.cool=new Map();function guest_nohigherthan(id1,id2,live_attr){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)&&center_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)&&center_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)&&center_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)&&center_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}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);let guest_set;if(!center_skill_guest_ids){guest_set=guest_default.get_list(live_attr)}else{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);if(center_skill_guest_ids)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,live_attr)){guest_center_set.delete(id1);break}}});const[guest_min,guest_max]=(()=>{let min=999999,max=-999999;guest_center_set.forEach((csk,id)=>{const{center_skill}=sif2_card_data.get(id);if(center_skill.type_1!==live_attr)return;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]})();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)&&center_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)&&center_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)&&center_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)&&center_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;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}}});if(forced_card_set)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(confirmed_set.size<8){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){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>
<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_600"]=600]="dummy_600";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={}));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_600: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}class guest_default{static get_list(live_attr){const target_map=[,this.smile,this.pure,this.cool][live_attr];if(target_map.size>0)return target_map;const guest_center_set=new Set();sif2_card_data.forEach((v,id1)=>guest_center_set.add(id1));sif2_card_data.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,live_attr)){guest_center_set.delete(id1);break}}});guest_center_set.forEach((v)=>target_map.set(v,sif2_card_data.get(v).center_skill));return target_map}}guest_default.smile=new Map();guest_default.pure=new Map();guest_default.cool=new Map();function guest_nohigherthan(id1,id2,live_attr){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)&&center_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)&&center_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)&&center_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)&&center_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}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);let guest_set;if(!center_skill_guest_ids){guest_set=guest_default.get_list(live_attr)}else{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);if(center_skill_guest_ids)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,live_attr)){guest_center_set.delete(id1);break}}});const[guest_min,guest_max]=(()=>{let min=999999,max=-999999;guest_center_set.forEach((csk,id)=>{const{center_skill}=sif2_card_data.get(id);if(center_skill.type_1!==live_attr)return;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]})();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)&&center_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)&&center_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)&&center_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)&&center_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;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}}});if(forced_card_set)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(confirmed_set.size<8){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){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 -->



2023年6月30日 (五) 13:12的版本

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={}));var changemod;(function(changemod){changemod[changemod["constant"]=0]="constant";changemod[changemod["lvall"]=1]="lvall";changemod[changemod["lv2468"]=2]="lv2468";changemod[changemod["lv258"]=3]="lv258";changemod[changemod["lv47"]=4]="lv47";changemod[changemod["lv59"]=5]="lv59";changemod[changemod["lv5"]=6]="lv5"})(changemod||(changemod={}));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["yohane"]=600]="yohane";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["5r5"]=401]="5r5";tgtype[tgtype["cc"]=402]="cc";tgtype[tgtype["kds"]=403]="kds"})(tgtype||(tgtype={}));const sif2_card_data=new Map();function sif2_skill_description(skill){let template=null;switch(skill.type){case sktype.score_bad:template="每{0}{10}有{1}%概率
在{2}秒内{11}点击分数增加{3}";break;case sktype.judge:template="每{0}{10}有{1}%概率
在{2}秒内{11}PERFECT判定范围扩大{3}阶";break;case sktype.heal:template="每{0}{10}有{1}%概率
回复{3}体力";break;case sktype.score_perfect:template="每{0}{10}有{1}%概率
在{2}秒内{11}PERFECT时点击分数增加{3}";break}template=template.replace("{0}",(skill.tr/(skill.trigger===trtype.time?1000:1)).toString());template=template.replace("{10}",{1:"个节奏图示",2:"COMBO",3:"次PERFECT",4:"秒"}[skill.trigger]);template=template.replace("{1}",(skill.pb/100).toString());template=template.replace("{2}",(skill.tm/1000).toString());template=template.replace("{3}",(skill.ev).toString());template=template.replace("{11}",skill.target!==0?`使${{100:"μ's",200:"Aqours",300:"虹咲",400:"Liella!",600:"幻日"}[skill.target]}成员的`:"");return template}const sif2_character_name=new Map([[1001,"穗乃果"],[1002,"绘里"],[1003,"小鸟"],[1004,"海未"],[1005,"凛"],[1006,"真姬"],[1007,"希"],[1008,"花阳"],[1009,"妮可"],[2001,"千歌"],[2002,"梨子"],[2003,"果南"],[2004,"黛雅"],[2005,"曜"],[2006,"善子"],[2007,"花丸"],[2008,"鞠莉"],[2009,"露比"],[3001,"步梦"],[3002,"霞"],[3003,"雫"],[3004,"果林"],[3005,"爱"],[3006,"彼方"],[3007,"雪菜"],[3008,"艾玛"],[3009,"璃奈"],[3010,"栞子"],[3011,"米娅"],[3012,"岚珠"],[4001,"香音"],[4002,"可可"],[4003,"千砂都"],[4004,"堇"],[4005,"恋"],[4006,"希奈子"],[4007,"芽衣"],[4008,"四季"],[4009,"夏美"],[4010,"薇恩"],[4011,"冬毬"],[6001,"Yohane"],[6002,"Hanamaru"],[6003,"Dia"],[6004,"Ruby"],[6005,"Chika"],[6006,"You"],[6007,"Kanan"],[6008,"Riko"],[6009,"Mari"]]);function gettext(){return $('#card-data').text()}function sif2_cardlist_init(){const text=gettext();text.split('\n').forEach((line)=>{const parts=line.split('|');const[,name]=parts[0].split(',');const[id,,type,rarity,hp1,smile,pure,cool]=parts[0].split(',').map(v=>parseInt(v));const{masterCharacterId}=parse_id(id);const skill_by_level=parse_skill(parts[2].split(',').map(v=>parseInt(v)));const[ce1,cetg1,cev1,ce2,cetg2,cev2]=parts[1].split(',').map(v=>parseInt(v));sif2_card_data.set(id,{id,masterCharacterId,name,type,rarity,hp:hp1-1,smile,pure,cool,skill_by_level,center_skill:{type_1:ce1,target_1:cetg1,value_1:cev1,type_2:ce2,target_2:cetg2,value_2:cev2,},})})}function parse_id(id){const masterCharacterId=Math.floor(id/10000);const illustId=[("00000"+masterCharacterId.toString()).slice(-5),("0000"+(id%10000).toString()).slice(-4),"00"].join('_');const evolveIllustId=[("00000"+masterCharacterId.toString()).slice(-5),("0000"+(id%10000).toString()).slice(-4),"01"].join('_');return{id,masterCharacterId,illustId,evolveIllustId}}function parse_skill([sktype,trtype,tgtype,tr_cm,tr_lv1,tr_up,pb_cm,pb_lv1,pb_up,tm_cm,tm_lv1,tm_up,ev_cm,ev_lv1,ev_up]){const skill_by_level=new Map();const trlist=parse_changemod(tr_cm,tr_lv1,tr_up);const pblist=parse_changemod(pb_cm,pb_lv1,pb_up);const tmlist=parse_changemod(tm_cm,tm_lv1,tm_up);const evlist=parse_changemod(ev_cm,ev_lv1,ev_up);for(let lv=1;lv<=9;lv+=1){skill_by_level.set(lv,{type:sktype,trigger:trtype,target:tgtype,tr:trlist[lv-1],pb:pblist[lv-1],tm:tmlist[lv-1],ev:evlist[lv-1],})}return skill_by_level}function parse_changemod(cm,lv1,up){const vlist=[1,2,3,4,5,6,7,8,9];switch(cm){case changemod.constant:return vlist.map((v)=>0*up+lv1);case changemod.lvall:return vlist.map((v)=>(v-1)*up+lv1);case changemod.lv2468:return vlist.map((v)=>Math.floor(v/2)*up+lv1);case changemod.lv258:return vlist.map((v)=>Math.floor((v+1)/3)*up+lv1);case changemod.lv47:return vlist.map((v)=>Math.floor((v-1)/3)*up+lv1);case changemod.lv59:return vlist.map((v)=>Math.floor((v-1)/4)*up+lv1);case changemod.lv5:return vlist.map((v)=>lv1+(v>=5&&up||0))}}sif2_cardlist_init();

const sif2_card_image = new Map(); function sif2_card_image_init() { $('#card-icon-data').html().split('\n').forEach((line)=>{ const [id_str, src1, src2] = line.split(','); sif2_card_image.set(parseInt(id_str), [src1, src2]); }) } const border_src_type_rarity = [,[,["f_1_1"],["f_1_2"],["f_1_3"]],[,["f_2_1"],["f_2_2"],["f_2_3"]],[,["f_3_1"],["f_3_2"],["f_3_3"]]]; const background_src_type_rarity = [,[,["b_1_1_1","b_1_1_2"],["b_0_0_0","b_0_0_0"],["b_0_0_0","b_0_0_0"]],[,["b_2_1_1","b_2_1_2"],["b_0_0_0","b_0_0_0"],["b_0_0_0","b_0_0_0"]],[,["b_3_1_1","b_3_1_2"],["b_0_0_0","b_0_0_0"],["b_0_0_0","b_0_0_0"]]]; /* 默认格式为png,允许的非png格式后缀 */ const enabled_not_raw_suffix = new Set(["jpg","jpeg","webp","png"]); function sif2_card_image_refresh() { $('[data-card-icon]').each(function(){ const $this = $(this); if ($('img', $this)[0]) return; const card_id = parseInt($this.attr('data-card-icon')); if (!sif2_card_data.has(card_id)) {console.warn('sif2_card_image_refresh: id ' + card_id + ' does not exist in sif2_card_data'); return;} let src1, src2; if(!sif2_card_image.has(card_id)){console.warn('sif2_card_image_refresh: card id',$this.attr('data-card-icon'),'icon not found');src1="d562l9";src2="d562l9"} else ([src1, src2] = sif2_card_image.get(card_id)); const {type,rarity,name,masterCharacterId} = sif2_card_data.get(card_id); const src_border = border_src_type_rarity[type][rarity]; const [bgsrc1, bgsrc2] = background_src_type_rarity[type][rarity]; /* 识别JSCardIcon/Source中的非png格式后缀 */ let src1_suf, src2_suf; { const src1_suffix = src1.split(".").pop(); const src2_suffix = src2.split(".").pop(); if (enabled_not_raw_suffix.has(src1_suffix)) src1_suf = src1; else src1_suf = src1 + ".png"; if (enabled_not_raw_suffix.has(src2_suffix)) src2_suf = src2; else src2_suf = src2 + ".png"; } $this.html(`<div style="background-image: url('https://s1.imagehub.cc/images/2023/04/29/${bgsrc1}.png')"><img src="https://s1.imagehub.cc/images/${src1_suf}"></div><div style="background-image: url('https://s1.imagehub.cc/images/2023/04/29/${bgsrc2}.png')"><img src="https://s1.imagehub.cc/images/${src2_suf}"></div><div><img src="https://s1.imagehub.cc/images/2023/04/29/${src_border}.png"></div>`); $this.attr("title",`${name} ${sif2_character_name.get(masterCharacterId)}`); }); } sif2_card_image_init(); sif2_card_image_refresh();

[data-card-icon] { display: inline-block; position: relative; width: calc(64px + 2vw); height: calc(64px + 2vw); } [data-card-icon] > div { background-size: 100% 100%; position: absolute; width: 100%; height: 100%; } /* hover切换图片 hove-swap-image */ [data-card-icon] > div:nth-child(2) { position: absolute; top: 0; left: 0; transition: mask-position, -webkit-mask-position 0.5s; mask-image: linear-gradient(135deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0) 40%, rgba(0, 0, 0, 0.33) 40%, rgba(0, 0, 0, 1) 60%, rgba(0, 0, 0, 1)100%), linear-gradient(225deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0) 40%, rgba(0, 0, 0, 0.5) 40%, rgba(0, 0, 0, 1) 60%, rgba(0, 0, 0, 1)100%); -webkit-mask-image: linear-gradient(135deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0) 40%, rgba(0, 0, 0, 0.33) 40%, rgba(0, 0, 0, 1) 60%, rgba(0, 0, 0, 1)100%), linear-gradient(225deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0) 40%, rgba(0, 0, 0, 0.5) 40%, rgba(0, 0, 0, 1) 60%, rgba(0, 0, 0, 1)100%); mask-composite: source-in; -webkit-mask-composite: source-in; mask-repeat: no-repeat; -webkit-mask-repeat: no-repeat; mask-size: 100% 320%; -webkit-mask-size: 100% 320%; mask-position: 0% 0%; -webkit-mask-position: 0% 0%; } [data-card-icon]:hover > div:nth-child(2), .hover-swap-image-trigger:hover [data-card-icon] > div:nth-child(2) { mask-position: 0% 100%; -webkit-mask-position: 0% 100%; } [data-card-icon] img { width: 100%; height: 100%; }

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["catchu"]=403]="catchu";tgtype[tgtype["kld"]=404]="kld";tgtype[tgtype["sync"]=405]="sync";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_600"]=600]="dummy_600";tgtype[tgtype["dummy_9999"]=9999]="dummy_9999";tgtype[tgtype["smile_1919810"]=1919811]="smile_1919810";tgtype[tgtype["pure_1919810"]=1919812]="pure_1919810";tgtype[tgtype["cool_1919810"]=1919813]="cool_1919810"})(tgtype||(tgtype={}));var note_action;(function(note_action){note_action[note_action["normal"]=0]="normal";note_action[note_action["press"]=1]="press";note_action[note_action["swing_left"]=2]="swing_left";note_action[note_action["swing_right"]=3]="swing_right";note_action[note_action["end"]=4]="end";note_action[note_action["press_end"]=5]="press_end";note_action[note_action["swing_end"]=6]="swing_end"})(note_action||(note_action={}));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={}));var parse_state;(function(parse_state){parse_state[parse_state["delay"]=0]="delay";parse_state[parse_state["pos"]=1]="pos"})(parse_state||(parse_state={}));class sif2_live_data{static _get_livedata_text(){const r=$('#chart-data-raw');if(r.length===0)alert("sif2_live_data找不到可读取的谱面数据!");return r.html()}static chart_data_init(){const text=this._get_livedata_text();text.split('\n').forEach((line)=>{if(!line||line.length===0)return;const parts=line.split("|");const part1_str=parts[0].split("%");const[live_id,attribute,masterGroupId,release_date,bpm,jacket_image_id]=part1_str.map(v=>parseInt(v));const jacket_image=`jacket_${jacket_image_id}`;const[,,,,,,name,kana]=part1_str;if(!parts[1])console.warn(line);const part2=parts[1].split(",").map(v=>parseInt(v));const charts_by_difficulty=new Map();for(let i=0;i<part2.length;i+=3){const[difficulty,difficulty_rating,max_combo]=part2.slice(i,i+3);const difficulty_id=live_id*10+difficulty;charts_by_difficulty.set(difficulty,{live_id,difficulty_id,difficulty_rating,max_combo,raw_text:parts[2+i/3],})};this.live_info.set(live_id,{live_id,attribute,masterGroupId,release_date,bpm,jacket_image,name,kana,charts_by_difficulty,})})}static chart_info_get(difficulty_id){if(this._chart_info.has(difficulty_id))return this._chart_info.get(difficulty_id);const{name,live_id,attribute,charts_by_difficulty}=this.live_info.get(Math.floor(difficulty_id/10));const{max_combo,raw_text}=charts_by_difficulty.get(difficulty_id%10);const reg_lt=new RegExp(String.fromCharCode(38,108,116,59),"g"),reg_gt=new RegExp(String.fromCharCode(38,103,116,59),"g");const note_list=this._chart_note_parse(raw_text.replace(reg_lt,'<').replace(reg_gt,'>'));if(max_combo!==note_list[note_list.length-1].combo)throw new Error(`live_id ${live_id}${name}difficulty ${difficulty_id%10}combo mismatch`);const weights_detail=this._chart_weights(note_list);const weights_total=weights_detail.map((m,i)=>{let total_weight=0;for(const[weight,count]of m){total_weight+=weight*count}return total_weight});this._chart_info.set(difficulty_id,{attribute,max_combo,note_list,weights_detail,weights_total,skill_coverage_time:new Map(),skill_coverage_note:new Map(),skill_coverage_combo:new Map(),skill_coverage_perfect:new Map()});return this._chart_info.get(difficulty_id)}static chart_skill_coverage_get(difficulty_id,skill){const chart=this.chart_info_get(difficulty_id);const{tr,tm}=skill;const key=tr+100000*tm;switch(skill.trigger){case trtype.note:if(chart.skill_coverage_note.has(key))return chart.skill_coverage_note.get(key);break;case trtype.combo:if(chart.skill_coverage_combo.has(key))return chart.skill_coverage_combo.get(key);break;case trtype.perfect:if(chart.skill_coverage_perfect.has(key))return chart.skill_coverage_perfect.get(key);break;case trtype.time:if(chart.skill_coverage_time.has(key))return chart.skill_coverage_time.get(key);break;default:throw new Error();}const note_list=chart.note_list;if(skill.type===sktype.score_perfect||skill.type===sktype.score_bad||skill.type===sktype.judge){if(tr<1)throw new Error();const stacks_by_judge=[];const stacks_by_pos=[,[],[],[],[],[],[],[],[],[]];function stacks_by_pos_assign(){note_list.forEach(({judge,pos})=>{stacks_by_pos[pos][stacks_by_judge[judge]||0]=(stacks_by_pos[pos][stacks_by_judge[judge]||0]||0)+1})}let j,time_limit;if(skill.trigger===trtype.note){for(let i=tr-1;i<note_list.length;i+=tr){j=i+1;time_limit=note_list[i].call_time+tm;while(note_list[j]&&note_list[j].call_time<=time_limit){stacks_by_judge[j]=(stacks_by_judge[j]||0)+1;j+=1}}stacks_by_pos_assign();chart.skill_coverage_note.set(key,stacks_by_pos)}else if(skill.trigger===trtype.combo){if(tr<3)throw new Error();for(let i=tr-1;i<note_list.length;i+=tr){while(note_list[i]&&note_list[i].combo%tr!==0)i+=1;if(i===note_list.length)break;j=i+1;time_limit=note_list[i].call_time+tm;while(note_list[j]&&note_list[j].call_time<=time_limit){stacks_by_judge[j]=(stacks_by_judge[j]||0)+1;j+=1}}stacks_by_pos_assign();chart.skill_coverage_combo.set(key,stacks_by_pos)}else if(skill.trigger===trtype.perfect){for(let i=tr-1;i<note_list.length;i+=tr){while(note_list[i]&&Math.floor(note_list[i].judge*background_settings.perfect_rate/100)%tr!==0)i+=1;if(i===note_list.length)break;j=i+1;time_limit=note_list[i].call_time+tm;while(note_list[j]&&note_list[j].call_time<=time_limit){stacks_by_judge[j]=(stacks_by_judge[j]||0)+1;j+=1}}stacks_by_pos_assign();chart.skill_coverage_perfect.set(key,stacks_by_pos)}else if(skill.trigger===trtype.time){let time_start=tr;for(let i=0;i<note_list.length;){while(note_list[i]&&note_list[i].call_time<=time_start)i+=1;if(i===note_list.length)break;j=i+1;time_limit=time_start+tm;while(note_list[j]&&note_list[j].call_time<=time_limit){stacks_by_judge[j]=(stacks_by_judge[j]||0)+1;j+=1}time_start+=tr}stacks_by_pos_assign();chart.skill_coverage_perfect.set(key,stacks_by_pos)}return stacks_by_pos}else return null}static _chart_note_parse(encoded_str){const note_list=[];const parts=encoded_str.split("~");const multipler=10**(parseInt(parts[0])-3);const delay_map=new Map();parts.slice(1,-1).map((str)=>{delay_map.set(str.codePointAt(0),this._from52(str.slice(1)))});let time_msec=0;const chart_str=parts[parts.length-1];let c=null,a=null;let state=parse_state.delay;let delay=[],pos=null,action=note_action.normal,star=false;let judge=0,combo=0;for(let i=0;i<=chart_str.length;i+=1){c=chart_str[i];a=(c||'$').charCodeAt(0);if(state===parse_state.delay){if(a>=65&&a<91||a>=97&&a<123){delay.push(a);continue}else if(a>=49&&a<58){pos=a-48;state=parse_state.pos;continue}else throw new Error(`position ${i}character ${c}at state delay`)}else if(state===parse_state.pos){if(a>=65&&a<91||a>=97&&a<123||a===36){time_msec+=((delay.length===1&&(delay_map.get(delay[0])/multipler))||(this._from52_code(delay)/multipler));judge+=1;if(action!==note_action.press)combo+=1;note_list.push({judge,combo,call_time:time_msec,pos,action,star,});star=false;action=note_action.normal;delay=[a];state=parse_state.delay;continue}else if(a>=49&&a<58){time_msec+=((delay.length===1&&(delay_map.get(delay[0])/multipler))||(this._from52_code(delay)/multipler));judge+=1;if(action!==note_action.press)combo+=1;note_list.push({judge,combo,call_time:time_msec,pos,action,star,});star=false;delay=[];pos=a-48;action=note_action.normal;continue}else if(a===60){action=note_action.swing_left;continue}else if(a===61){action=note_action.press;continue}else if(a===62){action=note_action.swing_right;continue}else if(a===35){action=note_action.end;continue}else if(a===42){star=true;continue}else throw new Error(`position ${i}character ${c}at state pos`)}}return note_list}static _chart_weights(note_list){let pressed_pos_1=0,pressed_pos_2=0,combo_weight_ratio=1;let last_call_time=0,last_pos=0,last_type_weight_ratio=1,type_weight_ratio=1;const weights=[];const combo_changes=[51,101,201,401,601,800];let combo_changes_index=0;for(let i=1;i<=9;i+=1)weights[i]=new Map();for(let i=0;i<note_list.length;i+=1){const{judge,combo,call_time,pos,action,star}=note_list[i];if(combo_changes[combo_changes_index]===combo){combo_weight_ratio=this._combo_multipler(combo);combo_changes_index+=1}if(action===note_action.press){if(!pressed_pos_1)pressed_pos_1=pos;else if(!pressed_pos_2)pressed_pos_2=pos;else throw new Error(`more than 2 press at the same time`);type_weight_ratio=1.25}else if(action===note_action.end){if(pressed_pos_1===pos){pressed_pos_1=0;type_weight_ratio=1.25}else if(pressed_pos_2===pos){pressed_pos_2=0;type_weight_ratio=1.25}else type_weight_ratio=0.5}else if(action===note_action.swing_left||action===note_action.swing_right)type_weight_ratio=0.5;else type_weight_ratio=1;this._map_accumulate(weights[pos],combo_weight_ratio*type_weight_ratio);if(combo_changes[combo_changes_index]===combo+1){last_type_weight_ratio=type_weight_ratio;last_pos=pos;last_call_time=call_time}else if(combo_changes[combo_changes_index-1]===combo){if(call_time-last_call_time<45&&last_type_weight_ratio!==type_weight_ratio){const diff=call_time-last_call_time<15?0.5:0.3;this._map_accumulate(weights[last_pos],this._combo_multipler(combo-1)*last_type_weight_ratio,-diff);this._map_accumulate(weights[last_pos],combo_weight_ratio*last_type_weight_ratio,diff);this._map_accumulate(weights[pos],this._combo_multipler(combo-1)*type_weight_ratio,diff);this._map_accumulate(weights[pos],combo_weight_ratio*type_weight_ratio,-diff)}}}return weights}static _map_accumulate(map,key,diff=1){map.has(key)&&map.set(key,map.get(key)+diff)||map.set(key,diff)}static _combo_multipler(combo){if(combo<=50)return 1;else if(combo<=100)return 1.1;else if(combo<=200)return 1.15;else if(combo<=400)return 1.2;else if(combo<=600)return 1.25;else if(combo<800)return 1.3;else return 1.35}static _from52(base52){return Array.from(base52).reduce((prev,curr)=>{const ascii=curr.charCodeAt(0);return prev*52+ascii-(ascii>96?97:39)},0)}static _from52_code(base52){return base52.reduce((prev,curr)=>{return prev*52+curr-(curr>96?97:39)},0)}static chart_difficulty_rating_selection(rating_min,rating_max){const selected_difficulties=[];for(const[,{charts_by_difficulty}]of this.live_info){for(const[,{difficulty_id,difficulty_rating}]of charts_by_difficulty){if(difficulty_rating<rating_min||difficulty_rating>rating_max)continue;selected_difficulties.push(difficulty_id)}}return selected_difficulties}}sif2_live_data.live_info=new Map();sif2_live_data._chart_info=new Map();sif2_live_data.chart_data_init();const ROMAJI_KANA_ARR=["xtsu/っ/ッ","shi/し/シ","chi/ち/チ","tsu/つ/ツ","ka/か/カ","ki/き/キ","ku/く/ク","ke/け/ケ","ko/こ/コ","ga/が/ガ","gi/ぎ/ギ","gu/ぐ/グ","ge/げ/ゲ","go/ご/ゴ","sa/さ/サ","su/す/ス","se/せ/セ","so/そ/ソ","za/ざ/ザ","ji/じ/ジ","zu/ず/ズ","ze/ぜ/ゼ","zo/ぞ/ゾ","ta/た/タ","te/て/テ","to/と/ト","da/だ/ダ","dzi/ぢ/ヂ","dzu/づ/ヅ","de/で/デ","do/ど/ド","na/な/ナ","ni/に/ニ","nu/ぬ/ヌ","ne/ね/ネ","no/の/ノ","ha/は/ハ","hi/ひ/ヒ","fu/ふ/フ","he/へ/ヘ","ho/ほ/ホ","pa/ぱ/パ","pi/ぴ/ピ","pu/ぷ/プ","pe/ぺ/ペ","po/ぽ/ポ","ba/ば/バ","bi/び/ビ","bu/ぶ/ブ","be/べ/ベ","bo/ぼ/ボ","ma/ま/マ","mi/み/ミ","mu/む/ム","me/め/メ","mo/も/モ","ra/ら/ラ","ri/り/リ","ru/る/ル","re/れ/レ","ro/ろ/ロ","wa/わ/ワ","wi/ゐ/ヰ","we/ゑ/ヱ","wo/を/ヲ","va/ゔぁ/ヴァ","vi/ゔぃ/ヴィ","ve/ゔぇ/ヴェ","vo/ゔぉ/ヴォ","vu/ゔ/ヴ","n/ん/ン","xa/ぁ/ァ","xi/ぃ/ィ","xu/ぅ/ゥ","xe/ぇ/ェ","xo/ぉ/ォ","xya/ゃ/ャ","xyu/ゅ/ュ","xyo/ょ/ョ","ya/や/ヤ","yu/ゆ/ユ","yo/よ/ヨ","a/あ/ア","i/い/イ","u/う/ウ","e/え/エ","o/お/オ","h/っ/ッ","-/ー/ー"];function replaceAll(iiyo,koiyo,ikuiku){return iiyo.replace(new RegExp(koiyo,"gm"),ikuiku)}const KANA_REPLACE_BEFORE_ARR=["([んン])([あいうえおやゆよアイウエオヤユヨ])=$1'$2"];const KANA_REPLACE_AFTER_ARR=["fux([aieo])=f$1","ixy=y","(s|c)hy=$1h","dzu=zu","(dz|j)y?=j","xtsu([rtpsdfghjkbm])=$1$1","xtsuc=tc","([aiueo])-=$1$1"];function kanaToRomaji(kana){KANA_REPLACE_BEFORE_ARR.forEach((val)=>{var arr=val.split("=");kana=replaceAll(kana,arr[0],arr[1])});ROMAJI_KANA_ARR.forEach((val)=>{var arr=val.split("/");kana=replaceAll(kana,arr[1]+"|"+arr[2],arr[0])});KANA_REPLACE_AFTER_ARR.forEach((val)=>{var arr=val.split("=");kana=replaceAll(kana,arr[0],arr[1])});return kana}const ROMAJI_REPLACE_BEFORE_ARR=["(f)([aieo])=$1ux$2","(sh|j|ch|dz)y?([auo])=$1ixy$2","([kgnhpbmr])y=$1ixy","tch=xtsuch","([rtpsdfghjkbm])\\\\1=xtsu$1"];function romajiToKana(romaji){romaji=romaji.toLowerCase();ROMAJI_REPLACE_BEFORE_ARR.forEach((val)=>{var arr=val.split("=");romaji=replaceAll(romaji,arr[0],arr[1])});ROMAJI_KANA_ARR.forEach((val)=>{var arr=val.split("/");romaji=replaceAll(romaji,arr[0],arr[1])});ROMAJI_REPLACE_BEFORE_ARR.forEach((val)=>{var arr=val.split("=");romaji=replaceAll(romaji,arr[0],arr[1])});ROMAJI_KANA_ARR.forEach((val)=>{var arr=val.split("/");romaji=replaceAll(romaji,arr[0],arr[2])});return replaceAll(romaji,"\\'","")}class sif2_live_data_filter{static by_romaji(finder){finder=finder.replace(/g/g,"k");finder=finder.replace(/b|p/g,"h");finder=finder.replace(/d/g,"t");finder=finder.replace(/j/g,"sh");let kana=romajiToKana(finder);kana=kana.replace(/っ/g,"つ");kana=kana.replace(/ゃ/g,"や");kana=kana.replace(/ょ/g,"よ");kana=kana.replace(/ゅ/g,"ゆ");kana=kana.replace(/ぅ/g,"う");let regexp;try{regexp=new RegExp(kanaToRomaji(kana).replace(/ /g,".*"))}catch(e){return[]}this._by_romaji_try_init();const res=[];this._by_romaji_map.forEach((tar_kana,id)=>{if(!tar_kana.match(regexp))return;res.push(id)});return res}static _by_romaji_try_init(){if(this._by_romaji_map.size!==0)return;sif2_live_data.live_info.forEach((live,id)=>{let kana=live.kana;kana=kana.replace(/ッ/g,"ツ");kana=kana.replace(/ャ/g,"ヤ");kana=kana.replace(/ョ/g,"ヨ");kana=kana.replace(/ュ/g,"ユ");kana=kana.replace(/ゥ/g,"ウ");this._by_romaji_map.set(id,kanaToRomaji(kana))})}static by_fuzzy_pure_name(finder){const finders=finder.split(" ");const fuzzy_finders=finders.map(this._fuzzy_pure_name);this._by_name_try_init();let fpreg;try{fpreg=new RegExp(fuzzy_finders.join(".*"))}catch(e){return[]}const res=[];this._by_fuzzy_pure_names_map.forEach((tar_fuzzy_pures,id)=>{for(const tar_fuzzy_pure of tar_fuzzy_pures){if(!(tar_fuzzy_pure.match(fpreg)))continue;res.push(id);return}});return res}static by_fuzzy_name(finder){const fuzzy_finder=this._fuzzy_name(finder);this._by_name_try_init();const res=[];this._by_fuzzy_name_map.forEach((tar_fuzzy,id)=>{if(tar_fuzzy.indexOf(fuzzy_finder)===-1)return;res.push(id)});return res}static _fuzzy_name(str){str=str.replace(/ /g,"");str=str.replace(/!/g,"!");str=str.replace(/×/g,"x");str=str.replace(/?/g,"?");str=str.replace(/(/g,"(");str=str.replace(/)/g,")");str=str.replace(/・/g,"·");str=str.replace(/&/g,"&");str=str.replace(/~|〜/g,"~");str=str.replace(/,/g,",");str=str.replace(/。/g,".");str=str.replace(/*/g,"*");str=str.replace(/+/g,"+");str=str.replace(/=/g,"=");str=str.replace(/‘|’/g,"'");str=str.replace(/“|”/g,"\"");str=str.replace(/1/g,"1");str=str.replace(/2/g,"2");str=str.replace(/3/g,"3");str=str.replace(/‼/g,"!!");str=str.toLowerCase();return str}static _fuzzy_pure_name(str){str=str.replace(/ /g,"");str=str.replace(/!|!|‼/g,"");str=str.replace(/×/g,"");str=str.replace(/?|\?/g,"");str=str.replace(/(|\(/g,"");str=str.replace(/)|\)/g,"");str=str.replace(/・|·/g,"");str=str.replace(/&|\&/g,"");str=str.replace(/~|〜|\~/g,"");str=str.replace(/,|,/g,"");str=str.replace(/。|\./g,"");str=str.replace(/*|\*/g,"");str=str.replace(/+|\+/g,"");str=str.replace(/=|\=/g,"");str=str.replace(/‘|’|'/g,"");str=str.replace(/“|”|"/g,"");str=str.replace(/1/g,"1");str=str.replace(/2/g,"2");str=str.replace(/3/g,"3");str=str.replace(/、/g,"");str=str.replace(/☆/g,"");str=str.replace(/♡/g,"");str=str.replace(/\-/g,"");str=str.replace(/←/g,"");str=str.replace(/→/g,"");str=str.replace(/:/g,"");str=str.toLowerCase();return str}static _by_name_try_init(){if(this._by_fuzzy_name_map.size!==0)return;if(this._by_fuzzy_pure_names_map.size!==0)return;sif2_live_data.live_info.forEach((live,id)=>{this._by_fuzzy_name_map.set(id,this._fuzzy_name(live.name));this._by_fuzzy_pure_names_map.set(id,[this._fuzzy_pure_name(live.name)])});try{this._alias_name_init_add()}catch(e){console.warn("alias name source read-in failed:",e)}}static _get_songle_text(){const r=$('#song-alias-name');if(r.length===0)alert("sif2_live_data_filter找不到可读取的歌曲别名数据!");return r.html()}static _alias_name_init_add(){try{const alias_name=JSON.parse(this._get_songle_text());alias_name.forEach(([name,aliases])=>{const[id]=sif2_live_data_filter.by_fuzzy_pure_name(name);if(!id){console.warn(`alias name index ${name}does not exist!`);return}aliases.forEach((v)=>{this._by_fuzzy_pure_names_map.get(id).push(v)})})}catch(e){alert("sif2_live_data_filter解析歌曲别名数据过程中出现错误,可能是数据的格式不正确")}}static by_combo(finder){if(isNaN(parseInt(finder.replace(/[x\*]/g,"0"))))return[];this._by_combo_try_init();const res=[];const regexp=new RegExp(finder.replace(/[x\*]/g,"[0-9]"));this._by_combo_map.forEach((tar_combos,id)=>{for(const tar_combo of tar_combos){if(!tar_combo.match(regexp))continue;res.push(id);return}});return res}static _by_combo_try_init(){if(this._by_combo_map.size>0)return;sif2_live_data.live_info.forEach((live,id)=>{this._by_combo_map.set(id,[live.charts_by_difficulty.has(1)&&live.charts_by_difficulty.get(1).max_combo.toString()||"",live.charts_by_difficulty.has(2)&&live.charts_by_difficulty.get(2).max_combo.toString()||"",live.charts_by_difficulty.has(3)&&live.charts_by_difficulty.get(3).max_combo.toString()||"",live.charts_by_difficulty.has(4)&&live.charts_by_difficulty.get(4).max_combo.toString()||"",])})}static comprehensive_string_find(finder){const by_romaji=this.by_romaji(finder);const by_fuzzy_pure_name=this.by_fuzzy_pure_name(finder);const by_fuzzy_name=this.by_fuzzy_name(finder);const by_combo=this.by_combo(finder);const result=by_romaji.concat(by_fuzzy_pure_name,by_fuzzy_name,by_combo);if(result.length>500)return null;else return result}}sif2_live_data_filter._by_romaji_map=new Map();sif2_live_data_filter._by_fuzzy_name_map=new Map();sif2_live_data_filter._by_fuzzy_pure_names_map=new Map();sif2_live_data_filter._by_combo_map=new Map();

[data-card-icon] {width: min(64px,40px + 4vw); height: min(64px,40px + 4vw);} :is(#selected-cards,#forced-cards,#forced-center-card) > div { display: grid; align-items: center; grid-template: 1fr / min(64px,40px + 4vw) 1fr 1fr 1fr 1fr 1fr minmax(100px,4fr) 1fr; grid-gap: 4px; } div[data-lv], div[data-sklv] { display: grid; align-items: center; grid-template: 1fr / minmax(24px, 1fr) minmax(48px, 3fr) minmax(24px, 1fr); } div:is([data-lv],[data-sklv]) > input[type="number"] { text-align: right; } [data-smile], [data-pure], [data-cool] { text-align: center; } [data-smile] { color:#f968b1; } [data-pure] { color:#34be75; } [data-cool] { color:#2a8bcd; } [data-type="1"] > [data-smile] { font-weight: bold; } [data-type="2"] > [data-pure] { font-weight: bold; } [data-type="3"] > [data-cool] { font-weight: bold; } input[type="button"] { border-radius: 4px; background-color:#00a1e93f; font-size: 120%; } [data-remove] { border-radius: 4px; background-color:#00a1e93f; text-align: center; } #background-settings > input[type="button"] { margin: 4px; } :is(#selected-cards, #forced-cards, #forced-center-card) > div[data-card-id]:nth-child(2n) { background-color: #0000000f; }

/* 等级/技能等级信息保存 */ const formation_id_map = new Map(); /* 已选集合 */ const selected_id_map = new Map(); /* 从localStorage中初始化 */ function formation_data_read() { const f = JSON.parse(localStorage.getItem("user_cards")); if (!f) return; const s = JSON.parse(localStorage.getItem("selected_ids")); f.forEach(([k, v])=>{formation_id_map.set(k, v);}); s.forEach((k)=>{ selected_id_map.set(k, formation_id_map.get(k)); selected_cards_add(k); }); } formation_data_read(); /* 保存到localStorage */ function formation_data_save() { const f = []; formation_id_map.forEach((v, k)=>{ f.push([k, v]); }); const s = []; selected_id_map.forEach((v, k)=>{ s.push(k); }); localStorage.setItem("user_cards", JSON.stringify(f)); localStorage.setItem("selected_ids", JSON.stringify(s)); } /* 强制入队集合 */ const forced_card_set = new Set(); /* 强制C位ID */ let forced_center_id = null; /* 点击头像加卡 */ function select_this(e) { const $this = $(e); const id = parseInt($this.attr('data-card-icon')); /* 检测是否对象加分 */ const {skill_by_level} = sif2_card_data.get(id); if (skill_by_level.get(1).target!==0) { alert('暂不支持该技能类型'); return; } if(formation_id_map.has(id)) selected_id_map.set(id, formation_id_map.get(id)); else { const v = {id, level:1, skill_level:1 }; formation_id_map.set(id, v); selected_id_map.set(id, v); } formation_data_save(); selected_cards_add(id); $this.css('display', 'none'); } /* 在列表中添加显示已选中的卡 */ function selected_cards_add(id) { const {level, skill_level} = selected_id_map.get(id); const {rarity, type, skill_by_level, smile, pure, cool} = sif2_card_data.get(id); const n = $('<div data-card-id="' + id + '" data-type="' + type + '">' + '<div data-card-icon="' + id + '"></div>' + '<div data-lv><input type="button" value="-"><input type="number" min="1" max="' + [,60,80,100][rarity] + '" step="1" value="' + level + '"><input type="button" value="+"></div>' + '<div data-smile>smile</div>' + '<div data-pure>pure</div>' + '<div data-cool>cool</div>' + '<div data-sklv><input type="button" value="-"><input type="number" min="1" max="' + [,3,5,9][rarity] + '" step="1" value="' + skill_level + '"><input type="button" value="+"></div>' + '<div data-skilltext>skilleffect</div>' + '<div data-remove>remove</div> </div>'); selected_move_to_normal(n); selected_card_level_init(n, id, level); selected_card_skill_level_init(n, id, skill_level); sif2_card_image_refresh(); } /* 调整等级和技能等级的点击事件 */ function level_input_init($parent) { /* 加减通用行为 */ $('input[type="button"][value="-"]', $parent).on("click", function(){ const input_number = $(this).next(); const value = parseInt(input_number.val()), min = parseInt(input_number.attr('min')); if (value <= min) return; input_number.val(value - 1); }); $('input[type="button"][value="+"]', $parent).on("click", function(){ const input_number = $(this).prev(); const value = parseInt(input_number.val()), max = parseInt(input_number.attr('max')); if (value >= max) return; input_number.val(value + 1); }); $('input[type="number"]', $parent).on("change", function(){ const $this = $(this); const level = parseInt($this.val()), min = parseInt($this.attr('min')), max = parseInt($this.attr('max')); if (level < min) $this.val(min); else if (level > max) $this.val(max); else $this.val(level); }); /* 等级加减特殊行为 */ $('[data-lv] > input[type="button"][value="-"]', $parent).on("click", function(){ const id = parseInt($parent.attr('data-card-id')); const level = parseInt($(this).next().val()); selected_card_level_update($parent, id, level); }); $('[data-lv] > input[type="button"][value="+"]', $parent).on("click", function(){ const id = parseInt($parent.attr('data-card-id')); const level = parseInt($(this).prev().val()); selected_card_level_update($parent, id, level); }); $('[data-lv] > input[type="number"]', $parent).on("change", function(){ const id = parseInt($parent.attr('data-card-id')); selected_card_level_update($parent, id, parseInt($(this).val())); }); /* 技能等级加减特殊行为 */ $('[data-sklv] > input[type="button"][value="-"]', $parent).each(function(){ $(this).on("click", function(){ const id = parseInt($parent.attr('data-card-id')); const skill_level = parseInt($(this).next().val()); selected_card_skill_level_update($parent, id, skill_level); }); }); $('[data-sklv] > input[type="button"][value="+"]', $parent).on("click", function(){ const id = parseInt($parent.attr('data-card-id')); const skill_level = parseInt($(this).prev().val()); selected_card_skill_level_update($parent, id, skill_level); }); $('[data-sklv] > input[type="number"]', $parent).on("change", function(){ const id = parseInt($parent.attr('data-card-id')); selected_card_skill_level_update($parent, id, parseInt($(this).val())); }); } /* promotion */ function selected_move_to_normal($parent) { level_input_init($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 id = parseInt($parent.attr('data-card-id')); $parent.remove(); $('#available-cards > [data-card-icon="' + id + '"]').css('display', ''); selected_id_map.delete(id); formation_data_save(); console.log(id, 'removed from selected'); }); } function selected_move_to_forced($parent) { const id = parseInt($parent.attr('data-card-id')); level_input_init($parent); $('#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')); level_input_init($parent); $('#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; } /* 更新等级数值 */ 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(); } /* 等级加减,技能等级加减 */ function selected_card_level_init($parent, id, level) { const {rarity, smile, pure, cool} = sif2_card_data.get(id); $('[data-smile]', $parent).html(Math.floor(smile * card_level_ratio(rarity, level) / 10000)); $('[data-pure]', $parent).html(Math.floor(pure * card_level_ratio(rarity, level) / 10000)); $('[data-cool]', $parent).html(Math.floor(cool * card_level_ratio(rarity, level) / 10000)); } function selected_card_level_update($parent, id, level) { selected_card_level_init($parent, id, level); console.log(id, 'level changed to', level); selected_id_map.get(id).level = level; formation_data_save(); } function selected_card_skill_level_init($parent, id, skill_level) { const {skill_by_level} = sif2_card_data.get(id); $('[data-skilltext]', $parent).html(sif2_skill_description(skill_by_level.get(skill_level))); } function selected_card_skill_level_update($parent, id, skill_level) { selected_card_skill_level_init($parent, id, skill_level); console.log(id, 'skill level changed to', skill_level); selected_id_map.get(id).skill_level = skill_level; formation_data_save(); } /* 筛选条件。调整筛选条件后,更新列表 */ const selector_filter={rarity:[,true,true,true],group:[,true,true,true,true],type:[,true,true,true],skill:[,true,true,true,true]} function selector_update(){ const $e=$('#available-cards');$e.html(''); sif2_card_data.forEach(({id,masterCharacterId,rarity,type,skill_by_level})=>{if(!selector_filter.rarity[rarity])return;if(!selector_filter.group[Math.floor(masterCharacterId/1000)])return;if(!selector_filter.type[type])return;if(!selector_filter.skill[skill_by_level.get(1).type])return;const n = $("<div data-card-icon=\""+id+"\" onclick='select_this(this);'></div>");if(selected_id_map.has(id))n.css('display','none');$e.append(n);}); sif2_card_image_refresh(); } /* 筛选按键初始化 */ for(let i = 1; i <= 4; i += 1) { $('#filter-rarity-'+i).attr('onclick',"selector_filter.rarity["+i+"]=!selector_filter.rarity["+i+"];selector_update();$(this).css('opacity',0.6+0.4*selector_filter.rarity["+i+"])"); $('#filter-group-'+i).attr('onclick',"selector_filter.group["+i+"]=!selector_filter.group["+i+"];selector_update();$(this).css('opacity',0.6+0.4*selector_filter.group["+i+"])"); $('#filter-type-'+i).attr('onclick',"selector_filter.type["+i+"]=!selector_filter.type["+i+"];selector_update();$(this).css('opacity',0.6+0.4*selector_filter.type["+i+"])"); $('#filter-skill-'+i).attr('onclick',"selector_filter.skill["+i+"]=!selector_filter.skill["+i+"];selector_update();$(this).css('opacity',0.6+0.4*selector_filter.skill["+i+"])"); } $('#filter-rarity-1').click(); $('#filter-rarity-2').click();

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_600"]=600]="dummy_600";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={}));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_600: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}class guest_default{static get_list(live_attr){const target_map=[,this.smile,this.pure,this.cool][live_attr];if(target_map.size>0)return target_map;const guest_center_set=new Set();sif2_card_data.forEach((v,id1)=>guest_center_set.add(id1));sif2_card_data.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,live_attr)){guest_center_set.delete(id1);break}}});guest_center_set.forEach((v)=>target_map.set(v,sif2_card_data.get(v).center_skill));return target_map}}guest_default.smile=new Map();guest_default.pure=new Map();guest_default.cool=new Map();function guest_nohigherthan(id1,id2,live_attr){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)&&center_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)&&center_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)&&center_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)&&center_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}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);let guest_set;if(!center_skill_guest_ids){guest_set=guest_default.get_list(live_attr)}else{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);if(center_skill_guest_ids)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,live_attr)){guest_center_set.delete(id1);break}}});const[guest_min,guest_max]=(()=>{let min=999999,max=-999999;guest_center_set.forEach((csk,id)=>{const{center_skill}=sif2_card_data.get(id);if(center_skill.type_1!==live_attr)return;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]})();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)&&center_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)&&center_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)&&center_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)&&center_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;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}}});if(forced_card_set)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(confirmed_set.size<8){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){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();}

const guest_centers = null; let showed = 0; let result = null; function formation_calculate(max_difficulty_rating) { if(selected_id_map.size < 9){ alert('至少配置9张卡片才能开始'); return; } 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, forced_card_set, forced_center_id); } 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); $('#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 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 score_total = '<span>总分: ' + (Math.round(result[i].score*1000)/1000).toFixed(3) + ' </span>'; const event_pt = '<span>活动点数: ' + (0.25*Math.pow(result[i].score,1/2)-0.5).toFixed(2) + '+10 </span>'; const event_item = '<span>活动道具: ' + (6*Math.pow(result[i].score,1/6)-0.5).toFixed(2) + ' </span>'; const score_tap = '<span>点击: ' + (Math.round(result[i].tap*1000)/1000).toFixed(3) + ' </span>'; const score_skill = '<span>技能: ' + (Math.round(result[i].skill*1000)/1000).toFixed(3) + ' </span>'; 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); } if(!result[i]) { $('input[type="button"]','#show-more').prop('disabled',true); $('input[type="button"]','#show-more').attr('value',"已展示完"+result.length+"个结果"); } 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 type="button" value="GO(12)" onclick="formation_calculate(12);"></input>'); $('#background-settings').append('<input type="button" value="GO(11)" onclick="formation_calculate(11);"></input>'); $('#background-settings').append('<input type="button" value="GO(10)" onclick="formation_calculate(10);"></input>'); $('#background-settings').append('<input type="button" value="GO(9)" onclick="formation_calculate(9);"></input>'); $('#background-settings').append('<input type="button" value="GO(8)" onclick="formation_calculate(8);"></input>'); $('#background-settings').append('<input type="button" value="GO(7)" onclick="formation_calculate(7);"></input>'); $('#background-settings').append('<input type="button" value="GO(6)" onclick="formation_calculate(6);"></input>'); $('#background-settings').append('<input type="button" value="GO(5)" onclick="formation_calculate(5);"></input>'); $('#background-settings').append('<input type="button" value="GO(4)" onclick="formation_calculate(4);"></input>');

手机用户如遇显示异常,可尝试请求桌面站点

UR SR R

muse aqours niji liella
smile pure cool
加分 判定 回复 条件加分

选择卡片
可选入队(点击头像添加)
强制入队(点击头像添加)
强制C位(点击头像添加)