function iv_engine(q,result,base,rank){ console.log("q",q); //console.log("result",result); //console.log("base",base); //console.log("rank",rank); const Time0 = new Date(); //再利用 var pre_r = result; var r = new Array(); r['result'] = new Array(); var id; var pokemon = new Array(); var pokemon_name; var atk; var def; var hp; var type1; var cp_bases0 = new Array(); var atk_iv; if(q.atk === '') atk_iv = 15; else atk_iv = parseInt(q.atk); r['result']['atk_iv'] = atk_iv; var def_iv; if(q.def === '') def_iv = 15; else def_iv = parseInt(q.def); r['result']['def_iv'] = def_iv; var hp_iv; if(q.hp === '') hp_iv = 15; else hp_iv = parseInt(q.hp); r['result']['hp_iv'] = hp_iv; var evolutions = new Array(); var sl_ranks = new Array(); var hl_ranks = new Array(); var ml_ranks = new Array(); var lc_ranks = new Array(); var slb_ranks = new Array(); var hlb_ranks = new Array(); var mlb_ranks = new Array(); var lcb_ranks = new Array(); var sl_diffs = new Array(); var hl_diffs = new Array(); var lc_diffs = new Array(); var cp_ranks = new Array(); 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; var shadow = q.shadow; //console.log("shadow",shadow); r['result']['shadow'] = shadow; if(q.max_pl=="mix,40") q.max_pl=40; if(q.max_pl=="mix,50") q.max_pl=50; r['result']['maxpl'] = q.max_pl; r['result']['boost'] = q.boost ? q.boost : 50; q.buddy = q.boost ? 1 : 0; 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; type1 = pokemon['type1']; const Time1 = new Date(); //console.log("cpベース前",Time1 - Time0); //進化先 if(pre_r.id==id&&pre_r.shadow==shadow&&base.evolutions){ evolutions = base.evolutions; }else{ var ev = 0; var route = get_route(id); if(shadow==1) route = 0; if(route==1||route==3){ var min_iv = 10; }else if(route==2||route==4){ var min_iv = 1; }else{ var min_iv = 0; } if(route==1||route==2){ var limit_pl = 15; }else if(route==3||route==4){ var limit_pl = 20; }else{ var limit_pl = 1; } if(id==4413) limit_pl = 15; evolutions[ev] = { 'id' : id , 'name' : pokemon['name'] , 'atk' : pokemon['atk'] , 'def' : pokemon['def'] , 'hp' : pokemon['hp'] , 'min_iv' : min_iv , 'min_pl' : limit_pl }; 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;iMath.max(q.max_pl,40)){ sl_ranks[evs] = new Array; sl_ranks[evs] = slb_ranks[evs]; }else if(s==5&&!hl_diff&&q.boost>Math.max(q.max_pl,40)){ hl_ranks[evs] = new Array; hl_ranks[evs] = hlb_ranks[evs]; }else if(s==7&&!hl_diff&&q.boost>Math.max(q.max_pl,40)){ lc_ranks[evs] = new Array; lc_ranks[evs] = lcb_ranks[evs]; }else{ if(s==0||s==4) limit_cp=1500; else if(s==1||s==5) limit_cp=2500; else if(s==2||s==6) limit_cp=10000; else if(s==3||s==7) limit_cp=500; //console.log("test3","ok"); //if(calc_cp(evol_atk+min_iv,evol_def+min_iv,evol_hp+min_iv,min_pl)>limit_cp) limit_pl=1; if(s<4) max_pl=q.boost; else max_pl=q.max_pl==50?50:40; for(var l=limit_pl;l<=max_pl;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; var cp0; 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=max_pl;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; } } if(s==0&&pl>Math.max(q.max_pl,40)) sl_diff=true; if(s==1&&pl>Math.max(q.max_pl,40)) hl_diff=true; if(s==3&&pl>Math.max(q.max_pl,40)) lc_diff=true; 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; cp0 = calc_cp(atk+a,def+d,hp+h,pl); scp_list_add = { pl : pl, atk : a, def : d, hp : h, cp : cp1, scp : scp, cp0 : cp0 }; 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 b.cp_r) return -1; return 0; }); var list_no = cp_list.length; for(var i=0;icp_in){ break; } } if(!r['result']['pl']) r['result']['pl'] = -1; } //console.log("r['result']",r['result']); //console.log("r['base']",r['base']); //const Time10= new Date(); //console.log("並び替え",Time10 - Time9); //const Time10 = new Date(); //console.log("[エンジン内タイム]",Time10 - Time0); console.log("r",r); return r; } function calc_cp(atk,def,hp,pl){ cp = Math.floor((atk*Math.pow(def,0.5)*Math.pow(hp,0.5)*Math.pow(cpm_list['pl'+pl],2))/10); return cp < 10 ? 10 : cp; }