function iv_engine(result,base,rank){ const Time0 = new Date(); //再利用 var pre_r = result; // エンジン移行 var q = create_request(); //console.log(q); var r = new Array(); r['result'] = new Array(); r['result']['cp_highest'] = "-"; r['result']['sl_highest'] = "-"; r['result']['hl_highest'] = "-"; r['result']['ml_highest'] = "-"; var data_list; var data_no; var id; var pokemon = new Array(); var pokemon_name; var atk; var def; var hp; var cp_bases0 = new Array(); var evolutions = new Array(); var ask_reward; var ask_egg_or_raid; var ask_strd_r_e_r; var evals_list = new Array(); var max_iv_kind_list = new Array(); var max_iv_eval_list = new Array(); var hp_sts = new Array(); var stardusts = new Array(); var candys = new Array(); var disc_end; var evol_id; var evol_name; var evol_atk; var evol_def; var evol_hp; var evol_cp_bases = new Array(); var sl_ranks = new Array(); var hl_ranks = new Array(); var ml_ranks = new Array(); var cp_highest; var sl_highest; var hl_highest; var ml_highest; id = q.id; if(!id) return r; if(pre_r){ if(pre_r.id!=id) pre_r = { id : 0 }; }else{ pre_r = { id : 0 }; } r['result']['id'] = id; pokemon = pokemon_list["p"+id]; pokemon_name = pokemon['name']; atk = pokemon['atk']; r['result']['atk'] = atk; def = pokemon['def']; r['result']['def'] = def; hp = pokemon['hp']; r['result']['hp'] = hp; const Time1 = new Date(); //console.log("cpベース前",Time1 - Time0); //CPべース if(pre_r.id==id&&base.cp_bases0){ cp_bases0 = base.cp_bases0; }else{ var cp_base; var add; for(var a=0;a<=15;a++){ for(var d=0;d<=15;d++){ for(var h=0;h<=15;h++){ cp_base = (atk+a)*Math.pow((def+d)*(hp+h),0.5)/10; add = { atk : a , def : d , hp : h , cp_base : cp_base }; cp_bases0.push(add); } } } cp_bases0.sort(function(a,b){ if(a.cp_base < b.cp_base) return 1; if(a.cp_base > b.cp_base) return -1; return 0; }); for(var i=0;i<4096;i++){ if(i==0){ cp_bases0[i]['rank'] = i+1; }else{ if(cp_bases0[i-1]['cp_base']==cp_bases0[i]['cp_base']){ cp_bases0[i]['rank'] = cp_bases0[i-1]['rank']; }else{ cp_bases0[i]['rank'] = i+1; } } } r['base'] = new Array(); r['base']['cp_bases0'] = cp_bases0; } const Time2 = new Date(); //console.log("cpベース",Time2 - Time1); //進化先 if(pre_r.id==id&&base.evolutions){ evolutions = base.evolutions; }else{ var ev = 0; evolutions[ev] = { 'id' : id , 'name' : pokemon['name'] , 'atk' : pokemon['atk'] , 'def' : pokemon['def'] , 'hp' : pokemon['hp'] }; if(pokemon['evolutions']){ var ids1 = pokemon['evolutions']; if(id==5373||id==5374) ids1.push(4385); var ev_pokemon; var ids2; var len1 = ids1.length; for(i=0;i b.cp_base) return -1; return 0; }); for(var i=0;i<4096;i++){ if(i==0){ evol_cp_bases[i]['rank'] = i+1; }else{ if(evol_cp_bases[i-1]['cp_base']==evol_cp_bases[i]['cp_base']){ evol_cp_bases[i]['rank'] = evol_cp_bases[i-1]['rank']; }else{ evol_cp_bases[i]['rank'] = i+1; } } } } //r['rank']['evol_cp_bases'] = evol_cp_bases; } const Time5 = new Date(); //console.log("進化先CPランク",Time5 - Time4); //各リーグランク var min_iv; var limit_pl; if(pre_r.id==id&&rank.evol_id==evol_id){ //sl_ranks = rank.sl_ranks; //hl_ranks = rank.hl_ranks; //ml_ranks = rank.ml_ranks; min_iv = rank.min_iv; limit_pl = rank.min_pl; }else{ var route = get_route(evol_id); if(route==1||route==3){ min_iv = 10; }else if(route==2||route==4){ min_iv = 1; }else{ min_iv = 0; } if(route==1||route==2){ limit_pl = 15; }else if(route==3||route==4){ limit_pl = 20; }else{ limit_pl = 1; } var limit_cp; var max_cp; var min_pl; for(var s=0;s<3;s++){ if(s==0) limit_cp=1500; else if(s==1) limit_cp=2500; else if(s==2) limit_cp=10000; //if(calc_cp(evol_atk+min_iv,evol_def+min_iv,evol_hp+min_iv,min_pl)>limit_cp) limit_pl=1; for(var l=limit_pl;l<=50;l=l+0.5){ max_cp = calc_cp(evol_atk+15,evol_def+15,evol_hp+15,l); min_pl = l; if(max_cp>limit_cp){ min_pl = Math.max(l-0.5,limit_pl); break; } } if(route==3||route==4){ min_pl = Math.max(min_pl,20); }else if(route==1||route==2){ min_pl = Math.max(min_pl,15); }else{ min_pl = 1; } var scp_list = new Array(); var scp_list_add; var cp1; var cpm; var scp; for(var a=min_iv;a<=15;++a){ for(var d=min_iv;d<=15;++d){ for(var h=min_iv;h<=15;++h){ cp1 = calc_cp(evol_atk+a,evol_def+d,evol_hp+h,min_pl); if(cp1<=limit_cp){ for(l=50;l>=min_pl;l=l-0.5){ cp1 = calc_cp(evol_atk+a,evol_def+d,evol_hp+h,l); pl = l; if(cp1<=limit_cp){ break; } } cpm = cpm_list['pl'+pl]; scp = ( Math.pow((evol_atk+a)*cpm,2/3) *Math.pow((evol_def+d)*cpm,2/3) *Math.pow(Math.floor((evol_hp+h)*cpm),2/3) )/10; scp_list_add = { pl : pl, atk : a, def : d, hp : h, cp : cp1, scp : scp }; scp_list.push(scp_list_add); } } } } scp_list.sort(function(a,b){ if(a.hp < b.hp) return 1; if(a.hp > b.hp) return -1; return 0; }); scp_list.sort(function(a,b){ if(a.scp < b.scp) return 1; if(a.scp > b.scp) return -1; return 0; }); var list_no = scp_list.length; for(var i=0;i=10&&item.def>=10&&item.hp>=10) return true; }); cp_bases = new_cp_bases1; } const Time7 = new Date(); //console.log("前data_listで絞り込み",Time7 - Time6a); var min_cp; var max_cp; var cpm; var cp0; var ap=0; for(var l=1;l<=50;l=l+add){ min_cp = calc_cp(atk,def,hp,l); if(min_cp<=cp_in){ max_cp = Math.max(calc_cp(atk+15,def+15,hp+15,l),10); if(cp_in<=max_cp){ cpm = cpm_list['pl'+l]; //if(l==18.5) console.log("cpm",cpm); list_no = cp_bases.length; for(var b=0;bapply_list[ap]['evol_cp_rank']){ cp_highest=apply_list[ap]['evol_cp_rank']; } } if(l<=cp_bases[b]['sl_pl']){ apply_list[ap]['sl_rank'] = cp_bases[b]['sl_rank']; apply_list[ap]['sl_pl'] = cp_bases[b]['sl_pl']; apply_list[ap]['sl_cp'] = cp_bases[b]['sl_cp']; apply_list[ap]['sl_scp'] = cp_bases[b]['sl_scp']; }else{ apply_list[ap]['sl_rank'] = 10000; apply_list[ap]['sl_pl'] = "条件外"; apply_list[ap]['sl_cp'] = "条件外"; apply_list[ap]['sl_scp'] = "条件外"; } if(l<=cp_bases[b]['hl_pl']){ apply_list[ap]['hl_rank'] = cp_bases[b]['hl_rank']; apply_list[ap]['hl_pl'] = cp_bases[b]['hl_pl']; apply_list[ap]['hl_cp'] = cp_bases[b]['hl_cp']; apply_list[ap]['hl_scp'] = cp_bases[b]['hl_scp']; }else{ apply_list[ap]['hl_rank'] = 10000; apply_list[ap]['hl_pl'] = "条件外"; apply_list[ap]['hl_cp'] = "条件外"; apply_list[ap]['hl_scp'] = "条件外"; } apply_list[ap]['ml_rank'] = cp_bases[b]['ml_rank']; apply_list[ap]['ml_pl'] = cp_bases[b]['ml_pl']; apply_list[ap]['ml_cp'] = cp_bases[b]['ml_cp']; apply_list[ap]['ml_scp'] = cp_bases[b]['ml_scp']; var rank0; var rank1; if(sl_highest=="条件外") rank0=10000; else rank0=sl_highest; if(apply_list[ap]['sl_rank']=="条件外") rank1=10000; else rank1=apply_list[ap]['sl_rank']; if(!sl_highest||rank0>rank1) sl_highest=apply_list[ap]['sl_rank']; if(hl_highest=="条件外") rank0=10000; else rank0=hl_highest; if(apply_list[ap]['hl_rank']=="条件外") rank1=10000; else rank1=apply_list[ap]['hl_rank']; if(!hl_highest||rank0>rank1) hl_highest=apply_list[ap]['hl_rank']; if(ml_highest=="条件外") rank0=10000; else rank0=ml_highest; if(apply_list[ap]['ml_rank']=="条件外") rank1=10000; else rank1=apply_list[ap]['ml_rank']; if(!ml_highest||rank0>rank1) ml_highest=apply_list[ap]['ml_rank']; ++ap; if(reward) ++rewards; if(egg_or_raid) ++egg_or_raids; if(strd_r_e_r) ++strd_r_e_rs; if(evals_list.indexOf(total_eval)==-1) evals_list.push(total_eval); if(max_iv_eval_list.indexOf(max_iv_eval)==-1) max_iv_eval_list.push(max_iv_eval); if(max_iv_kind_list.indexOf(max_iv_kind)==-1) max_iv_kind_list.push(max_iv_kind); if(hp_sts.indexOf(hp_st)==-1) hp_sts.push(hp_st); if(stardusts.indexOf(stardust)==-1) stardusts.push(stardust); if(candys.indexOf(candy)==-1) candys.push(candy); } if(cp0 b ) return 1; return 0; }); r['result']['evals'] = evals_list; //console.log('evals_list',evals_list); max_iv_kind_list.sort(function(a,b){ if( a < b ) return -1; if( a > b ) return 1; return 0; }); r['result']['max_iv_kinds'] = max_iv_kind_list; max_iv_eval_list.sort(function(a,b){ if( a < b ) return -1; if( a > b ) return 1; return 0; }); r['result']['max_iv_evals'] = max_iv_eval_list; hp_sts.sort(function(a,b){ if( a < b ) return -1; if( a > b ) return 1; return 0; }); r['result']['hp_sts'] = hp_sts; stardusts.sort(function(a,b){ if( a < b ) return -1; if( a > b ) return 1; return 0; }); r['result']['stardusts'] = stardusts; candys.sort(function(a,b){ if( a < b ) return -1; if( a > b ) return 1; return 0; }); r['result']['candys'] = candys; //これ以上絞れない var rewards_end; var egg_or_raids_end; var strd_r_e_rs_end; var r_e_rs_end; if(0==rewards||rewards==data_no||reward_ans==2) rewards_end = true; else rewards_end = false; if(0==egg_or_raids||egg_or_raids==data_no||egg_or_raid_ans==2) egg_or_raids_end = true; else egg_or_raids_end = false; if(0==strd_r_e_rs||strd_r_e_rs==data_no||strd_r_e_r_ans==2) strd_r_e_rs_end = true; else strd_r_e_rs_end = false; if(rewards_end&&egg_or_raids_end&&strd_r_e_rs_end) r_e_rs_end = true; else r_e_rs_end = false; if(2<=data_no&&r_e_rs_end&&evals_list.length==1&&max_iv_kind_list.length==1&&max_iv_eval_list.length==1&&hp_sts.length==1&&stardusts.length==1&&candys.length==1){ disc_end = true; }else{ disc_end = false; } r['result']['disc_end'] = disc_end; const Time9 = new Date(); //console.log("候補セット",Time9 - Time8); //並び替え if(data_no>0){ //並び替え if(q.lg==0&&id!=evol_id){ apply_list.sort(function(a,b){ if(a.evol_cp_rank < b.evol_cp_rank) return -1; if(a.evol_cp_rank > b.evol_cp_rank) return 1; return 0; }); }else if(q.lg==1){ apply_list.sort(function(a,b){ if(a.sl_rank < b.sl_rank) return -1; if(a.sl_rank > b.sl_rank) return 1; return 0; }); }else if(q.lg==2){ apply_list.sort(function(a,b){ if(a.hl_rank < b.hl_rank) return -1; if(a.hl_rank > b.hl_rank) return 1; return 0; }); }else if(q.lg==3){ apply_list.sort(function(a,b){ if(a.ml_rank < b.ml_rank) return -1; if(a.ml_rank > b.ml_rank) return 1; return 0; }); } } if(cp_highest!=undefined&&cp_highest!='条件外'&&cp_highest!=10000) r['result']['cp_highest'] = cp_highest; if(sl_highest!=undefined&&sl_highest!='条件外'&&sl_highest!=10000) r['result']['sl_highest'] = sl_highest; if(hl_highest!=undefined&&hl_highest!='条件外'&&hl_highest!=10000) r['result']['hl_highest'] = hl_highest; if(ml_highest!=undefined&&ml_highest!='条件外'&&ml_highest!=10000) r['result']['ml_highest'] = ml_highest; r['result']['data_list'] = apply_list; //console.log("apply_list",apply_list); const Time10= new Date(); //console.log("並び替え",Time10 - Time9); //console.log("[エンジン内タイム]",Time10 - Time0); //console.log("r",r); return r; }