效率曲计算器

来自LoveLive Wiki
跳到导航 跳到搜索

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; } .switch { position: relative; display: inline-block; width: 60px; height: 34px; } .switch input {display:none;} .slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: #ccc; -webkit-transition: .4s; transition: .4s; } .slider:before { position: absolute; content: ""; height: 26px; width: 26px; left: 4px; bottom: 4px; background-color: white; -webkit-transition: .4s; transition: .4s; } input:checked + .slider { background-color: #00a1e97f; } input:focus + .slider { box-shadow: 0 0 1px #00a1e97f; } input:checked + .slider:before { -webkit-transform: translateX(26px); -ms-transform: translateX(26px); transform: translateX(26px); } /* Rounded sliders */ .slider.round { border-radius: 34px; } .slider.round:before { border-radius: 50%; }

/* 等级/技能等级信息保存 */ 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, rarity } = 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:60,2:80,3:100}[rarity], skill_level:{1:5,2:7,3:9}[rarity] }; 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();

let TEST_20240116={nohigherthan_success:0,nohigherthan_total:0,while_confirmed_size_l8:0,while_confirmed_size_l8_break:0,while_confirmed_size_l8_confirmed_set_unchanged:0,lesseq_card_count:0,time_selfcenter_filter:0,time_fast_minmax:0,time_fast_minmax_sort:0,time_partialorder_p1_1:0,time_partialorder_p1_2:0,time_partialorder_p1_2_h67:0,time_autoselect_others_total:0,depth_7_count:0,depth_8_count:0,};const background_settings={perfect_rate:96,skill_probability_up_flat:0,};function perfect_cache_clear(){sif2_live_data._chart_info.forEach(({skill_coverage_perfect})=>{skill_coverage_perfect.clear()})}function member_target_group_test(g,card){if(g===tgtype.all)return true;const{masterCharacterId:m,type:attr}=card;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.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;case tgtype.catchu:return m===4001||m===4004||m===4007;case tgtype.kld:return m===4002||m===4005||m===4010;case tgtype.sync:return m===4003||m===4006||m===4008||m===4009||m===4011;case tgtype.smile_1919810:return attr===1;case tgtype.pure_1919810:return attr===2;case tgtype.cool_1919810:return attr===3;default:throw new Error(`unrecognized target ${g}.\nfor member ${m}type(attribute)${attr}.`)}}function skill_score_fetch(difficulty_id,skill,cards_by_pos,perfect_rate){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+background_settings.skill_probability_up_flat)/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,cards_by_pos&&cards_by_pos[pos]||undefined))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)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));if(selected_cards.size<9)throw new Error(`less than 9 cards selected`);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||Number.NaN)*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)?1.1:1)-1;if(skill.target!==tgtype.all)throw new Error(`card ${id}skill target ${skill.target}is not ALL,not supported`);const skill_score=skill_score_fetch(difficulty_id,skill,null,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||center_skill_guest_ids.length===1&&center_skill_guest_ids[0]===0){guest_set=new Map();guest_set.set(0,{type_1:0,target_1:0,value_1:0,type_2:0,target_2:0,value_2:0})}else if(center_skill_guest_ids.length===0){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=0,max=-999999;guest_center_set.forEach((center_skill,id)=>{if(center_skill.type_1!==live_attr){if(max<0)max=0;if(center_skill.type_2===live_attr)throw new Error(`C位技能的两个作用属性不同`);return}if(center_skill.target_1===tgtype.all&&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){TEST_20240116.nohigherthan_success+=1;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;TEST_20240116.nohigherthan_total+=1;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}}return null});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,base_tap_score:r.base_tap_score,detail_by_pos:r.detail_by_pos}}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 card=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,card))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,card))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,card))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,card))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 sort_top_nth(array,rank,func,left=0,right=array.length-1){if(left>=right)return;const border=array[left];let i=left,j=right;while(i<j){while(i<j&&func(array[j],border)>=0)j-=1;if(i<j){array[i]=array[j];i+=1}while(i<j&&func(array[i],border)<0)i+=1;if(i<j){array[j]=array[i];j-=1}}array[i]=border;if(i+1===rank)return;if(i+1>rank)sort_top_nth(array,rank,func,left,i-1);else sort_top_nth(array,rank,func,i+1,right)}function partial_order(center_set,intermediate_set,confirmed_set,total_weight,weights_by_pos,weights_others_order,judge_ratio,depth=0){switch(depth){case 0:{if(intermediate_set.size<37)break;let max_totalpowerc=center_set.power_c,min_totalpowerc=center_set.power_c;confirmed_set.forEach(({power_c,attr_group_boost})=>{max_totalpowerc+=power_c;min_totalpowerc+=power_c});const intermediate_power_cs=[];intermediate_set.forEach(({power_c,attr_group_boost})=>{intermediate_power_cs.push(power_c)});sort_top_nth(intermediate_power_cs,7-confirmed_set.size,(a,b)=>b-a);for(let i=0;i<7-confirmed_set.size;i+=1){max_totalpowerc+=intermediate_power_cs[i]}sort_top_nth(intermediate_power_cs,7-confirmed_set.size,(a,b)=>a-b);for(let i=0;i<7-confirmed_set.size;i+=1){min_totalpowerc+=intermediate_power_cs[i]}const list=[];intermediate_set.forEach(({power_c,attr_group_boost,skill_score,judge_rate},id)=>{const min=(min_totalpowerc+power_c)*weights_others_order[7]*attr_group_boost+power_c*(total_weight*1.00)+skill_score*80/judge_ratio;const max_expression_1=((power_c)*(attr_group_boost-(1.1*1.1-1))+max_totalpowerc*attr_group_boost);const max=(max_expression_1>0?(weights_others_order[0]*max_expression_1+power_c*total_weight*1.1*1.1):(weights_others_order[7]*max_expression_1+power_c*total_weight*1.1*1.1))+skill_score*80/judge_ratio;list.push({id,min,max})});sort_top_nth(list,7-confirmed_set.size,(a,b)=>b.min-a.min);const eliminated_max=list[7-confirmed_set.size].min;list.forEach(({id,max})=>{if(max<eliminated_max)intermediate_set.delete(id)});break}case 7:{TEST_20240116.depth_7_count+=1;break}case 8:{TEST_20240116.depth_8_count+=1;break}case 9:{console.error(intermediate_set,confirmed_set);throw new Error(`depth 9 is not possible`);}}let leq0_ids_g=null;const trace_changes={intermediate_set_size_before:intermediate_set.size,};const TEST_original_intermediate_set=new Map(intermediate_set);while(confirmed_set.size<8){TEST_20240116.while_confirmed_size_l8+=1;const intermediate_power_cs=[];const intermediate_agmap=new Map([[0,0],[1.1-1,0],[1.1*1.1-1,0]]);intermediate_set.forEach(({power_c,attr_group_boost})=>{intermediate_power_cs.push(power_c);intermediate_agmap.set(attr_group_boost,intermediate_agmap.has(attr_group_boost)?(intermediate_agmap.get(attr_group_boost)+1):1)});let max_totalpowerc=center_set.power_c,min_totalpowerc=center_set.power_c;const confirmed_agmap=new Map([[0,0],[1.1-1,0],[1.1*1.1-1,0]]);confirmed_set.forEach(({power_c,attr_group_boost})=>{max_totalpowerc+=power_c;min_totalpowerc+=power_c;confirmed_agmap.set(attr_group_boost,confirmed_agmap.has(attr_group_boost)?(confirmed_agmap.get(attr_group_boost)+1):1)});sort_top_nth(intermediate_power_cs,7-confirmed_set.size,(a,b)=>b-a);for(let i=0;i<7-confirmed_set.size;i+=1){max_totalpowerc+=intermediate_power_cs[i]}sort_top_nth(intermediate_power_cs,7-confirmed_set.size,(a,b)=>a-b);for(let i=0;i<7-confirmed_set.size;i+=1){min_totalpowerc+=intermediate_power_cs[i]}const max_sumproduct_by_boost=new Map();const min_sumproduct_by_boost=new Map();const boosts=[0,1.1-1,1.1*1.1-1];const confirmed_boosts=boosts.map(v=>confirmed_agmap.get(v));const intermediate_boosts=boosts.map(v=>intermediate_agmap.get(v));for(let i=0;i<boosts.length;i+=1){if(intermediate_boosts[i]<=0)continue;confirmed_boosts[i]+=1;intermediate_boosts[i]-=1;let selected_boosts=[...confirmed_boosts];let remaining_count=7-confirmed_set.size;for(let j=boosts.length-1;j>=0;j-=1){if(remaining_count<=intermediate_boosts[j]){selected_boosts[j]+=remaining_count;break}else{selected_boosts[j]+=intermediate_boosts[j];remaining_count-=intermediate_boosts[j]}}max_sumproduct_by_boost.set(boosts[i],{sumproduct:selected_boosts.reduceRight(({start,value},c,j)=>{for(let k=start;k<start+c;k+=1)value+=weights_others_order[k]*boosts[j];start+=c;return{start,value}},{start:0,value:0}).value,lastrank:selected_boosts.reduceRight((p,c,j)=>p+(j>=i?c:0),-1),});selected_boosts=[...confirmed_boosts];remaining_count=7-confirmed_set.size;for(let j=0;j<boosts.length;j+=1){if(remaining_count<=intermediate_boosts[j]){selected_boosts[j]+=remaining_count;break}else{selected_boosts[j]+=intermediate_boosts[j];remaining_count-=intermediate_boosts[j]}}min_sumproduct_by_boost.set(boosts[i],{sumproduct:selected_boosts.reduceRight(({start,value},c,j)=>{for(let k=start;k<start+c;k+=1)value+=weights_others_order[k]*boosts[j];start+=c;return{start,value}},{start:0,value:0}).value,lastrank:selected_boosts.reduceRight((p,c,j)=>p+(j>=i?c:0),-1),});confirmed_boosts[i]-=1;intermediate_boosts[i]+=1}const expression_1_min=total_weight+1*((min_sumproduct_by_boost.has(1.1*1.1-1)&&(min_sumproduct_by_boost.get(1.1*1.1-1).sumproduct-weights_others_order[0]*(1.1*1.1-1)))||(min_sumproduct_by_boost.has(1.1-1)&&(min_sumproduct_by_boost.get(1.1-1).sumproduct-weights_others_order[0]*(1.1-1)))||(min_sumproduct_by_boost.has(0)&&(min_sumproduct_by_boost.get(0).sumproduct)));const expression_1_max=total_weight+1*((max_sumproduct_by_boost.has(0)&&(max_sumproduct_by_boost.get(0).sumproduct))||(max_sumproduct_by_boost.has(1.1-1)&&(max_sumproduct_by_boost.get(1.1-1).sumproduct-weights_others_order[7]*(1.1-1)))||(max_sumproduct_by_boost.has(1.1*1.1-1)&&(max_sumproduct_by_boost.get(1.1*1.1-1).sumproduct-weights_others_order[7]*(1.1*1.1-1))));function lesseq_card(card_1,card_2){TEST_20240116.lesseq_card_count+=1;const diff_power_c=card_2.power_c-card_1.power_c,diff_attr_group_boost=card_2.attr_group_boost-card_1.attr_group_boost,diff_skill_score=card_2.skill_score-card_1.skill_score;if(diff_power_c>=0&&diff_attr_group_boost>=0&&diff_skill_score>=0){if(diff_power_c===0&&diff_attr_group_boost===0&&diff_skill_score===0){if(card_1.judge_rate<=card_2.judge_rate)return false;else if(card_1.judge_rate===card_2.judge_rate){if(card_1.id<card_2.id)return false}}return true}if(diff_attr_group_boost>=0){let diff_total=diff_skill_score*80/judge_ratio;if(diff_power_c>=0){diff_total+=diff_power_c*(total_weight+min_sumproduct_by_boost.get(card_1.attr_group_boost).sumproduct)}else{diff_total+=diff_power_c*(total_weight+max_sumproduct_by_boost.get(card_1.attr_group_boost).sumproduct)}if(diff_total>=0)return true}if(diff_attr_group_boost!==0){let diff_total=diff_skill_score*80/judge_ratio;if(diff_power_c>=0)diff_total+=diff_power_c*(expression_1_min);else diff_total+=diff_power_c*(expression_1_max);let expression_2=card_2.power_c*card_2.attr_group_boost-card_1.power_c*card_1.attr_group_boost;if(diff_attr_group_boost>=0)expression_2+=min_totalpowerc*diff_attr_group_boost;else expression_2+=max_totalpowerc*diff_attr_group_boost;if(expression_2>=0){if(diff_total>=0)return true;diff_total+=expression_2*weights_others_order[7]}else diff_total+=expression_2*weights_others_order[0];if(diff_total>=0)return true}return false}const card_list=[],leq_count=[],heq_count=[];intermediate_set.forEach(({power_c,attr_group_boost,skill_score,judge_rate},id)=>{card_list.push({id,power_c,attr_group_boost,skill_score,judge_rate});leq_count.push(0);heq_count.push(0)});sort_top_nth(card_list,27,(card_1,card_2)=>card_2.power_c-card_1.power_c);let leq_count_border=8-confirmed_set.size,heq_count_border=intermediate_set.size+confirmed_set.size-8;const is_only_leq_count=intermediate_set.size>100;for(let i=0;i<card_list.length;i+=1){leq_count[i]=0;for(let j=0;j<card_list.length;j+=1){if(i===j)continue;const card_1=card_list[i],card_2=card_list[j];const is_lesseq=lesseq_card(card_1,card_2);if(is_lesseq){leq_count[i]+=1;heq_count[j]+=1;if(is_only_leq_count){if(leq_count[j]>=leq_count_border-1){leq_count[i]=leq_count_border;break}}}}}const leq0_ids=[];leq0_ids_g=leq0_ids;for(let i=0;i<card_list.length;i+=1){if(leq_count[i]>=leq_count_border){intermediate_set.delete(card_list[i].id)}else if(heq_count[i]>=heq_count_border){confirmed_set.set(card_list[i].id,intermediate_set.get(card_list[i].id));intermediate_set.delete(card_list[i].id)}else if(leq_count[i]===0){leq0_ids.push(card_list[i].id)}}if(intermediate_set.size+confirmed_set.size<8){throw new Error();}if(intermediate_set.size===trace_changes.intermediate_set_size_before){break}trace_changes.intermediate_set_size_before=intermediate_set.size}if(confirmed_set.size<8)TEST_20240116.while_confirmed_size_l8_break+=1;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("too large intermediate size",8-confirmed_set.size,intermediate_set);throw new Error(`intermediate size ${intermediate_set.size}>37`)}let score=0,set=null;const intermediate_set_new=new Map(intermediate_set);for(const id of leq0_ids_g){if(confirmed_set.size+intermediate_set_new.size<=8)break;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,new Map(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}}if(confirmed_set.size+intermediate_set_new.size===8){const confirmed_set_new=new Map(confirmed_set);for(const id of intermediate_set_new.keys()){confirmed_set_new.set(id,intermediate_set_new.get(id));intermediate_set_new.delete(id)}const result=partial_order(center_set,new Map(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}}if(!set){console.error(`分支节点:迭代深度${depth}已确定${confirmed_set.size}张卡已完成下一步尝试剩余${intermediate_set.size}中的${leq0_ids_g.length}张卡`);throw new Error();}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||Number.NaN)*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;const detail_by_pos=[];for(let pos=1;pos<=9;pos+=1)detail_by_pos[pos]={power_c:0,tap_score:0,skill_score:0};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,power},pos)=>{if(member_target_group_test(target,card)){detail_by_pos[pos].power_c=power+Math.ceil(power*value/10000);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)?1.1:1);map.forEach((count,ratio)=>{detail_by_pos[pos].tap_score+=(Math.ceil(tapscore_attr_group*ratio*1.00)*(100-great_rate)+Math.ceil(tapscore_attr_group*ratio*0.88)*great_rate)/100*count});total_tapscore+=detail_by_pos[pos].tap_score});let total_skillscore=0;cards_by_pos.forEach(({skill},pos)=>{detail_by_pos[pos].skill_score=skill_score_fetch(difficulty_id,skill,cards_by_pos.map(v=>v.card),100-great_rate);total_skillscore+=detail_by_pos[pos].skill_score});return{base_tap_score,detail_by_pos,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();}

let guest_centers = []; let showed = 0; let result = null; function formation_calculate(min_difficulty_rating, max_difficulty_rating) { if(selected_id_map.size < 9){ alert('至少配置9张卡片才能开始'); return; } /* 检查是否使用助战 */ if(sif2_formation_option_enable_guest.value === "使用助战") guest_centers = []; else if(sif2_formation_option_enable_guest.value === "禁用助战") guest_centers = [0]; const chart_ids = sif2_live_data.chart_difficulty_rating_selection(min_difficulty_rating, max_difficulty_rating); result = []; chart_ids.forEach((difficulty_id)=>{ /* 检查是否使用每键平均分数顺序,如果是则只展示最高难度 */ if (sif2_formation_option_sort_by.value==="每键分数顺序") { try { sif2_live_data.chart_info_get(difficulty_id + 1); return; } catch(e) { } } try { result.push(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]*/difficulty_id+'难度发生错误:'+e); return; } }); showed = 0; $('input[type="button"]','#show-more').prop('disabled',false); $('input[type="button"]','#show-more').attr('value','show 50 more'); /* 检查是否使用每键平均分数顺序 */ if (sif2_formation_option_sort_by.value==="每键分数顺序") { result = result.map((v)=>{ const max_combo = sif2_live_data.live_info.get(Math.floor(v.difficulty_id/10)).charts_by_difficulty.get(v.difficulty_id%10).max_combo; v.score_per_note = v.score / max_combo; return v; }); result.sort((a,b)=>b.score_per_note-a.score_per_note); } else { 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 chart_info_link = `<a href="/讨论:歌曲数据和谱面#${result[i].difficulty_id}" title="歌曲数据和谱面">${sif2_live_data.live_info.get(Math.floor(result[i].difficulty_id / 10)).name} ${[,"NORMAL","HARD","EXPERT","MASTER"][result[i].difficulty_id%10]}</a>`; const title = '<div>#' + (i+1) + ' ' + chart_info_link + '</div>'; let score_total = '<span>总分: ' + (Math.round(result[i].score*1000)/1000).toFixed(3) + ' </span>'; /* 检查是否使用每键平均分数顺序 */ if (sif2_formation_option_sort_by.value==="每键分数顺序") { score_total = '<span>每键平均: ' + (Math.round(result[i].score_per_note*1000)/1000).toFixed(3) + ' </span>'; } else { 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 = sif2_formation_option_sort_by.value === "总计分数顺序" && '<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>%'); $('#background-settings').append('<br>'); $('#background-settings').append('<label class="switch"><input type="checkbox" checked onchange="sif2_formation_option_enable_guest.value=this.checked?`使用助战`:`禁用助战`"></input><div class="slider round"></div></label><output id="sif2_formation_option_enable_guest">使用助战</output>'); $('#background-settings').append('<label class="switch"><input type="checkbox" onchange="sif2_formation_option_sort_by.value=this.checked?`每键分数顺序`:`总计分数顺序`"></input><div class="slider round"></div></label><output id="sif2_formation_option_sort_by">总计分数顺序</output>'); $('#background-settings').append('<label class="switch"><input type="checkbox" onchange="background_settings.skill_probability_up_flat=this.checked?2000:0;skill_probability_up_flat.value=`技能发动率+${background_settings.skill_probability_up_flat/100}%`"></input><div class="slider round"></div></label><output id="skill_probability_up_flat">技能发动率+0%</output>'); $('#background-settings').append('<br>'); $('#background-settings').append('<input type="button" value="GO(10-12)" onclick="formation_calculate(10,12);"></input>'); $('#background-settings').append('<input type="button" value="GO(8-11)" onclick="formation_calculate(8,11);"></input>'); $('#background-settings').append('<input type="button" value="GO(6-10)" onclick="formation_calculate(6,10);"></input>'); $('#background-settings').append('<input type="button" value="GO(5-8)" onclick="formation_calculate(5,8);"></input>'); $('#background-settings').append('<input type="button" value="GO(4-6)" onclick="formation_calculate(4,6);"></input>'); $('#background-settings').append('<input type="button" value="GO(1-4)" onclick="formation_calculate(1,4);"></input>');

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

UR SR R

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

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