(function ($) { var options = {}; $.bpEngine = function (options) { // プロパティ $.extend(this.options, options); this.break_point = break_point; this.scp_rank_list = scp_rank_list; this.get_route2 = get_route2; }; function test1() { console.log("git読込", "ok"); } //miniv,minpl function get_route2(id, shadow) { var route = 0; var min_iv = 0; var min_pl = 1; if (shadow == 1) { route = get_shadow_route(id)||0; console.log("get_shadow_route(2)",route); min_pl = 8; if (route == 1 || route == 2) min_iv = 6; if (route == 2) min_pl = 20; } else { route = get_route(id); if (route == 1 || route == 3) min_iv = 10; else if (route == 2 || route == 4) min_iv = 1; if (route == 1 || route == 2) min_pl = 15; else if (route == 3 || route == 4) min_pl = 20; if (id == 4413) min_pl = 15; } /*var route = get_route(id); var min_iv; var min_pl; if (shadow == 1) route = 0; 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) min_pl = 15; else if (route == 3 || route == 4) min_pl = 20; else min_pl = 1;*/ var route_list = new Array(); route_list.miniv = min_iv; route_list.minpl = min_pl; return route_list; } //タイプ相性 function get_type_chem_chart(type_id) { if (!type_id) type_id = 0; var eff = 1.6; var not = 0.625; var dbl = 0.390625; switch (type_id) { case 0: // タイプなし return [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]; case 1: // ノーマル return [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, not, dbl, 1, 1, not, 1]; case 2: // ひこう return [1, 1, 1, 1, 1, eff, not, 1, eff, 1, 1, 1, eff, not, 1, 1, 1, not, 1]; case 3: // ほのお return [1, 1, 1, not, not, eff, 1, eff, 1, 1, 1, 1, eff, not, 1, not, 1, eff, 1]; case 4: // みず return [1, 1, 1, eff, not, not, 1, 1, 1, 1, eff, 1, 1, eff, 1, not, 1, 1, 1]; case 5: // くさ return [1, 1, not, not, eff, not, 1, 1, 1, not, eff, 1, not, eff, 1, not, 1, not, 1]; case 6: // でんき return [1, 1, eff, 1, eff, not, not, 1, 1, 1, dbl, 1, 1, 1, 1, not, 1, 1, 1]; case 7: // こおり return [1, 1, eff, not, not, eff, 1, not, 1, 1, eff, 1, 1, 1, 1, eff, 1, not, 1]; case 8: // かくとう return [1, eff, not, 1, 1, 1, 1, eff, 1, not, 1, not, not, eff, dbl, 1, eff, eff, not]; case 9: // どく return [1, 1, 1, 1, 1, eff, 1, 1, 1, not, not, 1, 1, not, not, 1, 1, dbl, eff]; case 10: // じめん return [1, 1, dbl, eff, 1, not, eff, 1, 1, eff, 1, 1, not, eff, 1, 1, 1, eff, 1]; case 11: // エスパー return [1, 1, 1, 1, 1, 1, 1, 1, eff, eff, 1, not, 1, 1, 1, 1, dbl, not, 1]; case 12: // むし return [1, 1, not, not, 1, eff, 1, 1, not, not, 1, eff, 1, 1, not, 1, eff, not, not]; case 13: // いわ return [1, 1, eff, eff, 1, 1, 1, eff, not, 1, not, 1, eff, 1, 1, 1, 1, not, 1]; case 14: // ゴースト return [1, dbl, 1, 1, 1, 1, 1, 1, 1, 1, 1, eff, 1, 1, eff, 1, not, 1, 1]; case 15: // ドラゴン return [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, eff, 1, not, dbl]; case 16: // あく return [1, 1, 1, 1, 1, 1, 1, 1, not, 1, 1, eff, 1, 1, eff, 1, not, 1, not]; case 17: // はがね return [1, 1, 1, not, not, 1, not, eff, 1, 1, 1, 1, 1, eff, 1, 1, 1, not, eff]; case 18: // フェアリー return [1, 1, 1, not, 1, 1, 1, 1, eff, not, 1, 1, 1, 1, 1, eff, eff, not, 1]; } } //ダメージ計算関数 function pvp_damage_calc(c) { var atk_st = parseFloat(c["atk_st"]); var def_st = parseFloat(c["def_st"]); var at_type1 = parseInt(c["at_type1"]); var at_type2 = parseInt(c["at_type2"]); var df_type1 = parseInt(c["df_type1"]); var df_type2 = parseInt(c["df_type2"]); var mov_type = parseInt(c["mov_type"]); var mov_power = parseInt(c["mov_power"]); var hit = parseFloat(c["hit"]); if (c["at_shadow"] == 1) atk_st = atk_st * 1.2; if (c["df_shadow"] == 1) def_st = def_st / 1.2; var stab = at_type1 == mov_type || at_type2 == mov_type ? 1.2 : 1; var type_list = get_type_chem_chart(mov_type); var type_Chem1 = type_list[df_type1]; var type_Chem2 = type_list[df_type2]; var pre_damage = (atk_st / def_st) * mov_power * stab * type_Chem1 * type_Chem2 * 0.5 * 1.3 * hit + 1; var error_range = 0.0000000000001; var int_diff = Math.round(pre_damage) - pre_damage; if (Math.abs(int_diff) < error_range) pre_damage = Math.round(pre_damage); return parseInt(Math.floor(pre_damage)); } //攻撃力閾値 function pvp_atk_break(c) { var damage = parseInt(c["damage"]); var def_st = parseFloat(c["def_st"]); var at_type1 = parseInt(c["at_type1"]); var at_type2 = parseInt(c["at_type2"]); var df_type1 = parseInt(c["df_type1"]); var df_type2 = parseInt(c["df_type2"]); var mov_type = parseInt(c["mov_type"]); var mov_power = parseInt(c["mov_power"]); var hit = parseFloat(c["hit"]); var at_shadow = c["at_shadow"] == 1 ? 1.2 : 1; var df_shadow = c["df_shadow"] == 1 ? 1 / 1.2 : 1; var stab = at_type1 == mov_type || at_type2 == mov_type ? 1.2 : 1; var type_list = get_type_chem_chart(mov_type); var type_Chem1 = type_list[df_type1]; var type_Chem2 = type_list[df_type2]; var atk_st = ((damage - 1) * def_st * df_shadow) / (mov_power * stab * type_Chem1 * type_Chem2 * at_shadow * 0.5 * 1.3); return atk_st; } //防御力閾値 function pvp_def_break(c) { var damage = parseInt(c["damage"]); var atk_st = parseFloat(c["atk_st"]); var at_type1 = parseInt(c["at_type1"]); var at_type2 = parseInt(c["at_type2"]); var df_type1 = parseInt(c["df_type1"]); var df_type2 = parseInt(c["df_type2"]); var mov_type = parseInt(c["mov_type"]); var mov_power = parseInt(c["mov_power"]); var hit = parseFloat(c["hit"]); var at_shadow = c["at_shadow"] == 1 ? 1.2 : 1; var df_shadow = c["df_shadow"] == 1 ? 1 / 1.2 : 1; var stab = at_type1 == mov_type || at_type2 == mov_type ? 1.2 : 1; var type_list = get_type_chem_chart(mov_type); var type_Chem1 = type_list[df_type1]; var type_Chem2 = type_list[df_type2]; var def_st = (mov_power * atk_st * stab * type_Chem1 * type_Chem2 * at_shadow * 0.5 * 1.3) / (damage * df_shadow); return def_st; } //CP計算 function calc_cp(atk, def, hp, pl) { var 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; } //SCP計算 function calc_scp(atk, def, hp, pl) { var scp = (Math.pow(atk * cpm_list["pl" + pl], 2 / 3) * Math.pow(def * cpm_list["pl" + pl], 2 / 3) * Math.pow(Math.floor(hp * cpm_list["pl" + pl]), 2 / 3)) / 10; return scp; } //メンバ変数 var bl_ivs = new Array(); //ブレークポイント function break_point(c) { const Time0 = new Date(); //ブレークポイントリスト var b_list = new Array(); //与ダメor被ダメ var table = c.table == 1 ? 1 : 0; //リーグ var lg = c.lg; var limit_cp; let data_id = $('[data-id="lg"]').filter('.wiki_selected').attr('data-data_id') || '10182'; let metas0 = pvp_metas['m'+data_id].slice() || []; if (lg == 1) { limit_cp = 1500; } else if (lg == 2) { limit_cp = 2500; } else if (lg == 4) { limit_cp = 500; } else { limit_cp = 10000; } //自分のポケモン var id = c.id; var pokemon = pokemon_list["p" + id]; var atk = pokemon.atk; var def = pokemon.def; var hp = pokemon.hp; var type1 = pokemon.type1 ? parseInt(pokemon.type1) : 0; var type2 = pokemon.type2 ? parseInt(pokemon.type2) : 0; var shadow = c.shadow == 1 ? 1 : 0; if (table == 0) { if (!c.moves) { b_list.error = "技が選択されていません"; return b_list; } var moves = c.moves; } if(c.maxpl!=="mix"&&c.maxpl!=="50mix") c.maxpl = parseInt(c.maxpl); var max_pl = c.maxpl === 40 ? 40 : (c.maxpl === 41 || c.maxpl == "mix" ? 41 : (c.maxpl === 50 ? 50 : 51)); var min_pl = [1, 15, 20].includes(parseInt(c.minpl)) ? parseInt(c.minpl) : 1; var min_iv = [0, 1, 2, 3, 5, 10].includes(parseInt(c.miniv)) ? parseInt(c.miniv) : 0; //自分個体値 var my_iv = typeof c.atk !== "undefined" && typeof c.def !== "undefined" && typeof c.hp !== "undefined" ? true : false; //条件 var cond = false; if (table == 0) { if (c.def_st || c.hp_st) cond = true; } else { if (c.atk_st || c.hp_st) cond = true; } //個体値リスト var iv_list = new Array(); var best100 = false; for (var a = min_iv; a <= 15; ++a) { for (var d = min_iv; d <= 15; ++d) { for (var h = min_iv; h <= 15; ++h) { var pl = 0; for (var p = max_pl; p >= min_pl; p = p - 0.5) { if (calc_cp(atk + a, def + d, hp + h, p) <= limit_cp) { pl = p; break; } } if (pl == 0) continue; var cpm = cpm_list["pl" + pl]; var atk_st = (atk + a) * cpm; var def_st = (def + d) * cpm; var hp_st = Math.floor((hp + h) * cpm); if (cond) { var conf = true; if (table == 1 && c.atk_st && c.atk_st > atk_st) conf = false; if (table == 0 && c.def_st && c.def_st > def_st) conf = false; if (c.hp_st && c.hp_st > hp_st) conf = false; } var add = new Array(); add.atk = a; add.def = d; add.hp = h; add.pl = pl; add.atk_st = atk_st; add.def_st = def_st; add.hp_st = hp_st; if (cond) add.conf = conf; iv_list.push(add); if (my_iv) { if (parseInt(c.atk) == a && parseInt(c.def) == d && parseInt(c.hp) == h) { var my_atk_st = atk_st; var my_def_st = def_st; var my_hp_st = hp_st; var my_pl = pl; } } if (a == 15 && d == 15 && h == 15 && pl == max_pl) best100 = true; //ミックス var mix_maxpl = c.maxpl == "mix" ? 40 : c.maxpl == "50mix" ? 50 : 100; if (pl > mix_maxpl) { var cpm = cpm_list["pl" + mix_maxpl]; var atk_st = (atk + a) * cpm; var def_st = (def + d) * cpm; var hp_st = Math.floor((hp + h) * cpm); if (cond) { var conf = true; if (table == 1 && c.atk_st && c.atk_st > atk_st) conf = false; if (table == 0 && c.def_st && c.def_st > def_st) conf = false; if (c.hp_st && c.hp_st > hp_st) conf = false; } var add = new Array(); add.atk = a; add.def = d; add.hp = h; add.pl = mix_maxpl; add.atk_st = atk_st; add.def_st = def_st; add.hp_st = hp_st; if (cond) add.conf = conf; iv_list.push(add); if (my_iv) { if (parseInt(c.atk) == a && parseInt(c.def) == d && parseInt(c.hp) == h) { var my_atk_st2 = atk_st; var my_def_st2 = def_st; var my_hp_st2 = hp_st; var my_pl2 = mix_maxpl; } } } } } } var list_no = iv_list.length; if (list_no == 0) { b_list.error = "最低PL" + min_pl + "、最低個体値" + min_iv + "の条件でリーグに参加できる個体値がありません"; return b_list; } if (my_iv && !my_atk_st) { b_list.error = "最低PL" + min_pl + "、最低個体値" + min_iv + "の条件と指定の個体値が一致しません"; return b_list; } if (table == 0) { iv_list.sort(function (a, b) { if (a.atk_st < b.atk_st) return 1; if (a.atk_st > b.atk_st) return -1; return 0; }); } else { iv_list.sort(function (a, b) { if (a.def_st < b.def_st) return 1; if (a.def_st > b.def_st) return -1; return 0; }); } var max_atk = iv_list[0]["atk_st"]; var min_atk = iv_list[list_no - 1]["atk_st"]; var max_def = iv_list[0]["def_st"]; var min_def = iv_list[list_no - 1]["def_st"]; //敵条件 var meta_ivs = c.meta_ivs; if (lg == 3) meta_ivs = ["max"]; var meta_moves = c.meta_moves; var meta_mpl = c.maxpl.toString().charAt(0) == "5" ? 50 : 40; //マイメタ合成 $.each(c.u_meta, (k, v) => { var m_flag = false; $.each(metas0, (k1, v1) => { if(v.id==v1.id&&v1.moves.includes(v.move)) m_flag = true; }); if(!m_flag){ var m_add = new Array(); m_add.id = v.id; m_add.moves = [v.move]; metas0.push(m_add); } }); //メタリスト加工 var metas1 = new Array(); var meta_ids = new Array(); var e_moves = new Array(); metas0.forEach((meta0) => { if (table == 1) { if (!e_moves[meta0.id]) { e_moves[meta0.id] = new Array(); if (meta_moves.includes(1)) e_moves[meta0.id].push(meta0.moves[0]); if (meta_moves.includes(2)) e_moves[meta0.id].push(meta0.moves[1]); if (meta_moves.includes(2) && meta0.moves[2]) e_moves[meta0.id].push(meta0.moves[2]); } else { if (meta_moves.includes(1) && !e_moves[meta0.id].includes(meta0.moves[0])) e_moves[meta0.id].push(meta0.moves[0]); if (meta_moves.includes(2) && !e_moves[meta0.id].includes(meta0.moves[1])) e_moves[meta0.id].push(meta0.moves[1]); if (meta_moves.includes(2) && meta0.moves[2] && !e_moves[meta0.id].includes(meta0.moves[2])) e_moves[meta0.id].push(meta0.moves[2]); } } if (!meta_ids.includes(meta0.id)) { add = new Array(); add.id = meta0.id; add.shadow = 0; metas1.push(add); if(pokemon_list["p" + meta0.id]==undefined){ console.log("meta0.id",meta0.id); g_toast.warn(meta0.id+'のポケモンデータがありません'); return false; } var other = pokemon_list["p" + meta0.id]["other"]; if (other) { if (other.match("ライト") || other.match("シャドウ")) { add = new Array(); add.id = meta0.id; add.shadow = 1; metas1.push(add); } } meta_ids.push(meta0.id); } }); var metas = new Array(); var e_iv_label; var bl_names = ["max", "r_max", "min", "100", "500","top"]; metas1.forEach((meta) => { var enemy = pokemon_list["p" + meta.id]; var e_atk = enemy.atk; var e_def = enemy.def; var e_hp = enemy.hp; var e_shadow = meta.shadow; var route = e_shadow == 1 ? 0 : get_route(meta.id); var e_min_iv = route == 1 || route == 3 ? 10 : route == 2 || route == 4 ? 1 : 0; var e_min_pl = route == 1 || route == 2 ? 15 : route == 3 || route == 4 ? 20 : 1; meta_ivs.forEach((ivs) => { //想定外の個体値種ははじく if (bl_names.includes(ivs)) { //個体値名セット switch (ivs) { case "max": e_iv_label = (table == 0 ? "防" : "攻") + (lg == 3 ? "15/PL" : "最大"); break; case "r_max": e_iv_label = (table == 0 ? "防" : "攻") + "レイド最大"; break; case "min": e_iv_label = (table == 0 ? "防" : "攻") + "最低"; break; case "100": e_iv_label = "100位最大"; break; case "500": e_iv_label = "500位最大"; break; case "top": e_iv_label = "1位"; break; } //マスターリーグ以外 if (lg == 1 || lg == 2 || lg == 4) { //リーグ名 var lgn = lg == 1 ? "sl" : lg == 2 ? "hl" : "lc"; //メタ個体値リストなければ作成 if (!bl_ivs[lgn] || !bl_ivs[lgn][meta_mpl] || !bl_ivs[lgn][meta_mpl][meta.id]) { //初期化 if (!bl_ivs[lgn]) bl_ivs[lgn] = new Array(); if (!bl_ivs[lgn][meta_mpl]) bl_ivs[lgn][meta_mpl] = new Array(); if (!bl_ivs[lgn][meta_mpl][meta.id]) bl_ivs[lgn][meta_mpl][meta.id] = new Array(); //PL41or51・100%で上限CP超えないとき if (calc_cp(enemy.atk + 15, enemy.def + 15, enemy.hp + 15, meta_mpl + 1) <= limit_cp) { for (var k1 = meta_mpl; k1 <= meta_mpl + 1; k1++) { ["atk", "def"].forEach((k2) => { if (!bl_ivs[lgn][meta_mpl][meta.id][k2]) bl_ivs[lgn][meta_mpl][meta.id][k2] = new Array(); bl_names.forEach((k3) => { if(k3!="top"){ if (!bl_ivs[lgn][meta_mpl][meta.id][k2][k3]) bl_ivs[lgn][meta_mpl][meta.id][k2][k3] = new Array(); if (!bl_ivs[lgn][meta_mpl][meta.id][k2][k3][k1]) bl_ivs[lgn][meta_mpl][meta.id][k2][k3][k1] = new Array(); bl_ivs[lgn][meta_mpl][meta.id][k2][k3][k1]["atk"] = k2 == "atk" && k3 == "min" ? e_min_iv : 15; bl_ivs[lgn][meta_mpl][meta.id][k2][k3][k1]["def"] = k2 == "def" && k3 == "min" ? e_min_iv : 15; bl_ivs[lgn][meta_mpl][meta.id][k2][k3][k1]["hp"] = 15; bl_ivs[lgn][meta_mpl][meta.id][k2][k3][k1]["pl"] = k1; } }); }); if (!bl_ivs[lgn][meta_mpl][meta.id]["scp"]) bl_ivs[lgn][meta_mpl][meta.id]["scp"] = new Array(); if (!bl_ivs[lgn][meta_mpl][meta.id]["scp"]["top"]) bl_ivs[lgn][meta_mpl][meta.id]["scp"]["top"] = new Array(); if (!bl_ivs[lgn][meta_mpl][meta.id]["scp"]["top"][k1]) bl_ivs[lgn][meta_mpl][meta.id]["scp"]["top"][k1] = new Array(); bl_ivs[lgn][meta_mpl][meta.id]["scp"]["top"][k1]["atk"] = 15; bl_ivs[lgn][meta_mpl][meta.id]["scp"]["top"][k1]["def"] = 15; bl_ivs[lgn][meta_mpl][meta.id]["scp"]["top"][k1]["hp"] = 15; bl_ivs[lgn][meta_mpl][meta.id]["scp"]["top"][k1]["pl"] = k1; } } //PL41or51・100%で上限CP超えるとき else { //初期化 ["atk", "def"].forEach((k2) => { bl_ivs[lgn][meta_mpl][meta.id][k2] = new Array(); bl_names.forEach((k3) => { if(k3!="top") bl_ivs[lgn][meta_mpl][meta.id][k2][k3] = new Array(); }); }); bl_ivs[lgn][meta_mpl][meta.id]["scp"] = new Array(); bl_ivs[lgn][meta_mpl][meta.id]["scp"]["top"] = new Array(); //40or50の最低個体値で上限CP上回らなければ2通り、上回れば1通り作成 var plk = calc_cp(enemy.atk + e_min_iv, enemy.def + e_min_iv, enemy.hp + e_min_iv, meta_mpl) { bl_names.forEach((k3) => { if(k3!="top") bl_ivs[lgn][meta_mpl][meta.id][k2][k3][k1] = new Array(); }); }); bl_ivs[lgn][meta_mpl][meta.id]["scp"]["top"][k1] = new Array(); //全個体値のPL・SCP等計算 var e_iv_list = new Array(); for (var a = e_min_iv; a <= 15; ++a) { for (var d = e_min_iv; d <= 15; ++d) { for (var h = e_min_iv; h <= 15; ++h) { var e_pl = 0; for (p = k1; p >= e_min_pl; p = p - 0.5) { var e_cp = calc_cp(e_atk + a, e_def + d, e_hp + h, p); if (e_cp <= limit_cp) { e_pl = p; break; } } if (e_pl == 0) continue; var e_cpm = cpm_list["pl" + e_pl]; var e_atk_st = (e_atk + a) * e_cpm; var e_def_st = (e_def + d) * e_cpm; var e_scp = calc_scp(e_atk + a, e_def + d, e_hp + h, e_pl); var add = new Array(); add.atk = a; add.def = d; add.hp = h; add.pl = e_pl; add.atk_st = e_atk_st; add.def_st = e_def_st; add.cp = e_cp; add.scp = e_scp; e_iv_list.push(add); } } } //SCP順に並び替え e_iv_list.sort(function (a, b) { if (Math.round(a.scp * 10000000000) < Math.round(b.scp * 10000000000)) return 1; if (Math.round(a.scp * 10000000000) > Math.round(b.scp * 10000000000)) return -1; if (a.cp < b.cp) return 1; if (a.cp > b.cp) return -1; return 0; }); //特定の個体値を抽出しリストへ格納 var list_no = e_iv_list.length; var e_atk_max = 0; var e_def_max = 0; var e_atk_r_max = 0; var e_def_r_max = 0; var e_atk_min = 1000; var e_def_min = 1000; for (var i = 0; i < list_no; i++) { if (i == 0) { bl_ivs[lgn][meta_mpl][meta.id]["scp"]["top"][k1]["atk"] = e_iv_list[i]["atk"]; bl_ivs[lgn][meta_mpl][meta.id]["scp"]["top"][k1]["def"] = e_iv_list[i]["def"]; bl_ivs[lgn][meta_mpl][meta.id]["scp"]["top"][k1]["hp"] = e_iv_list[i]["hp"]; bl_ivs[lgn][meta_mpl][meta.id]["scp"]["top"][k1]["pl"] = e_iv_list[i]["pl"]; } if (Math.round(e_atk_max * 10000000000) < Math.round(e_iv_list[i]["atk_st"] * 10000000000)) { e_atk_max = e_iv_list[i]["atk_st"]; if (i < 100) { bl_ivs[lgn][meta_mpl][meta.id]["atk"]["100"][k1]["atk"] = e_iv_list[i]["atk"]; bl_ivs[lgn][meta_mpl][meta.id]["atk"]["100"][k1]["def"] = e_iv_list[i]["def"]; bl_ivs[lgn][meta_mpl][meta.id]["atk"]["100"][k1]["hp"] = e_iv_list[i]["hp"]; bl_ivs[lgn][meta_mpl][meta.id]["atk"]["100"][k1]["pl"] = e_iv_list[i]["pl"]; } if (i < 500) { bl_ivs[lgn][meta_mpl][meta.id]["atk"]["500"][k1]["atk"] = e_iv_list[i]["atk"]; bl_ivs[lgn][meta_mpl][meta.id]["atk"]["500"][k1]["def"] = e_iv_list[i]["def"]; bl_ivs[lgn][meta_mpl][meta.id]["atk"]["500"][k1]["hp"] = e_iv_list[i]["hp"]; bl_ivs[lgn][meta_mpl][meta.id]["atk"]["500"][k1]["pl"] = e_iv_list[i]["pl"]; } bl_ivs[lgn][meta_mpl][meta.id]["atk"]["max"][k1]["atk"] = e_iv_list[i]["atk"]; bl_ivs[lgn][meta_mpl][meta.id]["atk"]["max"][k1]["def"] = e_iv_list[i]["def"]; bl_ivs[lgn][meta_mpl][meta.id]["atk"]["max"][k1]["hp"] = e_iv_list[i]["hp"]; bl_ivs[lgn][meta_mpl][meta.id]["atk"]["max"][k1]["pl"] = e_iv_list[i]["pl"]; } if (Math.round(e_def_max * 10000000000) < Math.round(e_iv_list[i]["def_st"] * 10000000000)) { e_def_max = e_iv_list[i]["def_st"]; if (i < 100) { bl_ivs[lgn][meta_mpl][meta.id]["def"]["100"][k1]["atk"] = e_iv_list[i]["atk"]; bl_ivs[lgn][meta_mpl][meta.id]["def"]["100"][k1]["def"] = e_iv_list[i]["def"]; bl_ivs[lgn][meta_mpl][meta.id]["def"]["100"][k1]["hp"] = e_iv_list[i]["hp"]; bl_ivs[lgn][meta_mpl][meta.id]["def"]["100"][k1]["pl"] = e_iv_list[i]["pl"]; } if (i < 500) { bl_ivs[lgn][meta_mpl][meta.id]["def"]["500"][k1]["atk"] = e_iv_list[i]["atk"]; bl_ivs[lgn][meta_mpl][meta.id]["def"]["500"][k1]["def"] = e_iv_list[i]["def"]; bl_ivs[lgn][meta_mpl][meta.id]["def"]["500"][k1]["hp"] = e_iv_list[i]["hp"]; bl_ivs[lgn][meta_mpl][meta.id]["def"]["500"][k1]["pl"] = e_iv_list[i]["pl"]; } bl_ivs[lgn][meta_mpl][meta.id]["def"]["max"][k1]["atk"] = e_iv_list[i]["atk"]; bl_ivs[lgn][meta_mpl][meta.id]["def"]["max"][k1]["def"] = e_iv_list[i]["def"]; bl_ivs[lgn][meta_mpl][meta.id]["def"]["max"][k1]["hp"] = e_iv_list[i]["hp"]; bl_ivs[lgn][meta_mpl][meta.id]["def"]["max"][k1]["pl"] = e_iv_list[i]["pl"]; } if (e_iv_list[i]["atk"] >= 10 && e_iv_list[i]["def"] >= 10 && e_iv_list[i]["hp"] >= 10) { if (Math.round(e_atk_r_max * 10000000000) < Math.round(e_iv_list[i]["atk_st"] * 10000000000)) { e_atk_r_max = e_iv_list[i]["atk_st"]; bl_ivs[lgn][meta_mpl][meta.id]["atk"]["r_max"][k1]["atk"] = e_iv_list[i]["atk"]; bl_ivs[lgn][meta_mpl][meta.id]["atk"]["r_max"][k1]["def"] = e_iv_list[i]["def"]; bl_ivs[lgn][meta_mpl][meta.id]["atk"]["r_max"][k1]["hp"] = e_iv_list[i]["hp"]; bl_ivs[lgn][meta_mpl][meta.id]["atk"]["r_max"][k1]["pl"] = e_iv_list[i]["pl"]; } if (Math.round(e_def_r_max * 10000000000) < Math.round(e_iv_list[i]["def_st"] * 10000000000)) { e_def_r_max = e_iv_list[i]["def_st"]; bl_ivs[lgn][meta_mpl][meta.id]["def"]["r_max"][k1]["atk"] = e_iv_list[i]["atk"]; bl_ivs[lgn][meta_mpl][meta.id]["def"]["r_max"][k1]["def"] = e_iv_list[i]["def"]; bl_ivs[lgn][meta_mpl][meta.id]["def"]["r_max"][k1]["hp"] = e_iv_list[i]["hp"]; bl_ivs[lgn][meta_mpl][meta.id]["def"]["r_max"][k1]["pl"] = e_iv_list[i]["pl"]; } } if (Math.round(e_atk_min * 10000000000) > Math.round(e_iv_list[i]["atk_st"] * 10000000000)) { e_atk_min = e_iv_list[i]["atk_st"]; bl_ivs[lgn][meta_mpl][meta.id]["atk"]["min"][k1]["atk"] = e_iv_list[i]["atk"]; bl_ivs[lgn][meta_mpl][meta.id]["atk"]["min"][k1]["def"] = e_iv_list[i]["def"]; bl_ivs[lgn][meta_mpl][meta.id]["atk"]["min"][k1]["hp"] = e_iv_list[i]["hp"]; bl_ivs[lgn][meta_mpl][meta.id]["atk"]["min"][k1]["pl"] = e_iv_list[i]["pl"]; } if (Math.round(e_def_min * 10000000000) > Math.round(e_iv_list[i]["def_st"] * 10000000000)) { e_def_min = e_iv_list[i]["def_st"]; bl_ivs[lgn][meta_mpl][meta.id]["def"]["min"][k1]["atk"] = e_iv_list[i]["atk"]; bl_ivs[lgn][meta_mpl][meta.id]["def"]["min"][k1]["def"] = e_iv_list[i]["def"]; bl_ivs[lgn][meta_mpl][meta.id]["def"]["min"][k1]["hp"] = e_iv_list[i]["hp"]; bl_ivs[lgn][meta_mpl][meta.id]["def"]["min"][k1]["pl"] = e_iv_list[i]["pl"]; } } } } } //メタ個体値セット var ta = ivs == "top" ? "scp" : table == 0 ? "def" : "atk"; var plk = bl_ivs[lgn][meta_mpl][meta.id][ta][ivs][meta_mpl] ? meta_mpl : meta_mpl+1; for (var k1 = plk; k1 <= meta_mpl+1; k1++) { add = new Array(); add.id = meta.id; add.shadow = meta.shadow; add.atk = bl_ivs[lgn][meta_mpl][meta.id][ta][ivs][k1]["atk"]; add.def = bl_ivs[lgn][meta_mpl][meta.id][ta][ivs][k1]["def"]; add.hp = bl_ivs[lgn][meta_mpl][meta.id][ta][ivs][k1]["hp"]; add.pl = bl_ivs[lgn][meta_mpl][meta.id][ta][ivs][k1]["pl"]; add.label = e_iv_label + (plk == meta_mpl ? k1 : ""); metas.push(add); } } //マスターリーグ else { //メタ個体値セット for (var k1 = meta_mpl; k1 <= meta_mpl+1; k1++) { add = new Array(); add.id = meta.id; add.shadow = meta.shadow; add.atk = table == 1 && ivs == "min" ? e_min_iv : 15; add.def = table == 0 && ivs == "min" ? e_min_iv : 15; add.hp = 15; add.pl = k1; add.label = e_iv_label + k1; metas.push(add); } } } /*else { e_iv_label = "1位"; if (lg == 1 || lg == 2 || lg == 4) { //var lgn = lg==2 ? "hl" : "sl"; if (lg == 1) var lgn = "sl"; else if (lg == 2) var lgn = "hl"; else var lgn = "lc"; if (!scps[lgn]["p" + meta.id]) { add = new Array(); add.id = meta.id; add.shadow = meta.shadow; add.atk = 15; add.def = 15; add.hp = 15; add.pl = 40; add.label = e_iv_label + "40"; metas.push(add); add = new Array(); add.id = meta.id; add.shadow = meta.shadow; add.atk = 15; add.def = 15; add.hp = 15; add.pl = 41; add.label = e_iv_label + "41"; metas.push(add); } else if (scps[lgn]["p" + meta.id][40]) { add = new Array(); add.id = meta.id; add.shadow = meta.shadow; add.atk = scps[lgn]["p" + meta.id][40]["atk"]; add.def = scps[lgn]["p" + meta.id][40]["def"]; add.hp = scps[lgn]["p" + meta.id][40]["hp"]; add.pl = scps[lgn]["p" + meta.id][40]["pl"]; (add.label = e_iv_label + "40"), metas.push(add); add = new Array(); add.id = meta.id; add.shadow = meta.shadow; (add.atk = scps[lgn]["p" + meta.id][41]["atk"]), (add.def = scps[lgn]["p" + meta.id][41]["def"]), (add.hp = scps[lgn]["p" + meta.id][41]["hp"]), (add.pl = scps[lgn]["p" + meta.id][41]["pl"]), (add.label = e_iv_label + "41"); metas.push(add); } else if (scps[lgn]["p" + meta.id][41]) { add = new Array(); add.id = meta.id; add.shadow = meta.shadow; add.atk = scps[lgn]["p" + meta.id][41]["atk"]; add.def = scps[lgn]["p" + meta.id][41]["def"]; add.hp = scps[lgn]["p" + meta.id][41]["hp"]; add.pl = scps[lgn]["p" + meta.id][41]["pl"]; add.label = e_iv_label; metas.push(add); } } else { add = new Array(); add.id = meta.id; add.shadow = meta.shadow; add.atk = 15; add.def = 15; add.hp = 15; add.pl = 40; add.label = e_iv_label + "40"; add = new Array(); add.id = meta.id; add.shadow = meta.shadow; add.atk = 15; add.def = 15; add.hp = 15; add.pl = 41; add.label = e_iv_label + "41"; metas.push(add); } }*/ }); }); if (table == 1) { var metas2 = new Array(); metas.forEach((meta) => { e_moves[meta.id].forEach((move) => { add = new Array(); add.id = meta.id; add.shadow = meta.shadow; add.atk = meta.atk; add.def = meta.def; add.hp = meta.hp; add.pl = meta.pl; add.label = meta.label; add.move = move; metas2.push(add); }); }); metas = metas2; } if (c.debug) console.log("bl_ivs", bl_ivs); //ユーザーリスト合成 if (c.u_list) { c.u_list.forEach((list) => { var u_pokemon = pokemon_list["p" + list.id]; var u_atk = u_pokemon.atk; var u_def = u_pokemon.def; var u_hp = u_pokemon.hp; var u_max_pl = list.max_pl; if(!list.pl){ for (var p = u_max_pl; p >= 1; p = p - 0.5) { if (calc_cp(u_atk + list.atk, u_def + list.def, u_hp + list.hp, p) <= limit_cp) { var u_pl = p; break; } } }else{ var u_pl = list.pl; } var label = list.atk + "/" + list.def + "/" + list.hp; if (u_pl > meta_mpl) label = label + " PL" + u_pl; if (u_pl == meta_mpl && u_max_pl == meta_mpl) { for (var p = meta_mpl+1; p >= 1; p = p - 0.5) { if (calc_cp(u_atk + list.atk, u_def + list.def, u_hp + list.hp, p) <= limit_cp) { var u_pl2 = p; break; } } if (u_pl2 > u_pl) label = label + " PL" + u_pl; } add = new Array(); add.id = list.id.toString(); add.shadow = list.shadow; add.atk = list.atk; add.def = list.def; add.hp = list.hp; add.pl = u_pl; add.label = label; if (table == 1) add.move = list.move; metas.push(add); }); } //ブレイクポイントリスト metas.forEach((meta) => { if (b_list.length > 3000) { var error_list = new Array(); error_list.error = "ブレイクポイントの件数が多過ぎます。"; return error_list; } var enemy = pokemon_list["p" + meta.id]; var e_name = enemy.name; var e_type1 = enemy.type1 ? parseInt(enemy.type1) : 0; var e_type2 = enemy.type2 ? parseInt(enemy.type2) : 0; var e_shadow = meta.shadow; var e_cpm = cpm_list["pl" + meta.pl]; if (table == 0) { var e_def = enemy.def; var e_def_st = (e_def + meta.def) * e_cpm; moves.forEach((move) => { if (waza_list["w" + move] === undefined) return true; move_name = waza_list["w" + move]["name"]; move_type = waza_list["w" + move]["type"]; move_power = waza_list["w" + move]["power_p"]; var con = new Array(); con["atk_st"] = min_atk; con["def_st"] = e_def_st; con["at_type1"] = type1; con["at_type2"] = type2; con["df_type1"] = e_type1; con["df_type2"] = e_type2; con["mov_type"] = move_type; con["mov_power"] = move_power; con["hit"] = 1; con["at_shadow"] = shadow; con["df_shadow"] = e_shadow; var min_damage = pvp_damage_calc(con); con["atk_st"] = max_atk; var max_damage = pvp_damage_calc(con); if (min_damage < max_damage) { for (var b = 1; b < 100; ++b) { var damage = min_damage + b; con = new Array(); con["damage"] = damage; con["def_st"] = e_def_st; con["at_type1"] = type1; con["at_type2"] = type2; con["df_type1"] = e_type1; con["df_type2"] = e_type2; con["mov_type"] = move_type; con["mov_power"] = move_power; con["hit"] = 1; con["at_shadow"] = shadow; con["df_shadow"] = e_shadow; var break_atk_st = pvp_atk_break(con); var conform_no2 = 0; var buddy = 0; var not_buddy = 0; if (best100) { var limit_iv = 100; if (c.maxpl == "mix"||c.maxpl == "50mix") var limit_iv2 = 100; } for (var i = 0; i < list_no; i++) { if (iv_list[i]["atk_st"] <= break_atk_st) break; if (cond && iv_list[i]["conf"]) conform_no2++; if (iv_list[i]["pl"] > (c.maxpl == "mix"?40:50)) buddy++; else not_buddy++; if (best100) { if (c.maxpl == "mix"||c.maxpl == "50mix") { if (((c.maxpl == "mix"&&iv_list[i]["pl"] == 41)||(c.maxpl == "50mix"&&iv_list[i]["pl"] == 51)) && iv_list[i]["atk"] < limit_iv) limit_iv = iv_list[i]["atk"]; if (((c.maxpl == "mix"&&iv_list[i]["pl"] == 40)||(c.maxpl == "50mix"&&iv_list[i]["pl"] == 50)) && iv_list[i]["atk"] < limit_iv2) limit_iv2 = iv_list[i]["atk"]; } else { if (iv_list[i]["atk"] < limit_iv) limit_iv = iv_list[i]["atk"]; } } } var conform_no = i; if (my_iv) { var myiv_conform = 0; if (my_atk_st > break_atk_st) myiv_conform = my_pl > 40 ? 2 : 1; if (my_atk_st2) var myiv_conform2 = my_atk_st2 > break_atk_st ? 1 : 0; } add = new Array(); add.pokemon_id = meta.id; add.pokemon_name = e_name; add.shadow = e_shadow; add.move_id = move; add.move_name = move_name; add.iv = [meta.label]; add.iv2 = [meta.atk + "/" + meta.def + "/" + meta.hp + " PL" + meta.pl]; add.damage1 = damage - 1; add.damage2 = damage; if ((c.maxpl == "mix"||c.maxpl == "50mix") && buddy > 0 && not_buddy == 0) add.buddy_only = 1; add.break_atk_st = break_atk_st; add.conform_no = conform_no; if (cond) add.conform_no2 = conform_no2; if (my_iv && myiv_conform > 0) add.myiv_conform = myiv_conform; if (my_atk_st2 && myiv_conform2 > 0) add.myiv_conform2 = myiv_conform2; if (best100) add.limit_iv = limit_iv; if (best100 && (c.maxpl == "mix"||c.maxpl == "50mix")) add.limit_iv2 = limit_iv2; b_list.push(add); if (damage == max_damage) break; } } else { add = new Array(); add.pokemon_id = meta.id; add.pokemon_name = e_name; add.shadow = e_shadow; add.move_id = move; add.move_name = move_name; add.iv = [meta.label]; add.iv2 = [meta.atk + "/" + meta.def + "/" + meta.hp + " PL" + meta.pl]; add.damage1 = min_damage; add.damage2 = max_damage; add.break_atk_st = 0; add.conform_no = null; if (cond) add.conform_no2 = null; b_list.push(add); } }); } else { var e_atk = enemy.atk; var e_atk_st = (e_atk + meta.atk) * e_cpm; if (waza_list["w" + meta.move] === undefined) return true; move_name = waza_list["w" + meta.move]["name"]; move_type = waza_list["w" + meta.move]["type"]; move_power = waza_list["w" + meta.move]["power_p"]; var con = new Array(); con["atk_st"] = e_atk_st; con["def_st"] = min_def; con["at_type1"] = e_type1; con["at_type2"] = e_type2; con["df_type1"] = type1; con["df_type2"] = type2; con["mov_type"] = move_type; con["mov_power"] = move_power; con["hit"] = 1; con["at_shadow"] = e_shadow; con["df_shadow"] = shadow; var max_damage = pvp_damage_calc(con); con["def_st"] = max_def; var min_damage = pvp_damage_calc(con); if (min_damage < max_damage) { for (var b = 1; b < 100; ++b) { var damage = max_damage - b; con = new Array(); con["damage"] = damage; con["atk_st"] = e_atk_st; con["at_type1"] = e_type1; con["at_type2"] = e_type2; con["df_type1"] = type1; con["df_type2"] = type2; con["mov_type"] = move_type; con["mov_power"] = move_power; con["hit"] = 1; con["at_shadow"] = e_shadow; con["df_shadow"] = shadow; var break_def_st = pvp_def_break(con); var conform_no2 = 0; var buddy = 0; var not_buddy = 0; if (best100) { var limit_iv = 100; if (c.maxpl == "mix"||c.maxpl == "50mix") var limit_iv2 = 100; } for (var i = 0; i < list_no; i++) { if (iv_list[i]["def_st"] <= break_def_st) break; if (cond && iv_list[i]["conf"]) conform_no2++; if (iv_list[i]["pl"] > (c.maxpl == "mix"?40:50)) buddy++; else not_buddy++; if (best100) { if (c.maxpl == "mix"||c.maxpl == "50mix") { if (((c.maxpl == "mix"&&iv_list[i]["pl"] == 41)||(c.maxpl == "50mix"&&iv_list[i]["pl"] == 51)) && iv_list[i]["def"] < limit_iv) limit_iv = iv_list[i]["def"]; if (((c.maxpl == "mix"&&iv_list[i]["pl"] == 40)||(c.maxpl == "50mix"&&iv_list[i]["pl"] == 50)) && iv_list[i]["def"] < limit_iv2) limit_iv2 = iv_list[i]["def"]; } else { if (iv_list[i]["atk"] < limit_iv) limit_iv = iv_list[i]["def"]; } } } var conform_no = i; if (my_iv) { var myiv_conform = 0; if (my_def_st >= break_def_st) myiv_conform = my_pl > 40 ? 2 : 1; if (my_def_st2) var myiv_conform2 = my_def_st2 > break_def_st ? 1 : 0; } add = new Array(); add.pokemon_id = meta.id; add.pokemon_name = e_name; add.shadow = e_shadow; add.move_id = meta.move; add.move_name = move_name; add.iv = [meta.label]; add.iv2 = [meta.atk + "/" + meta.def + "/" + meta.hp + " PL" + meta.pl]; add.damage1 = damage + 1; add.damage2 = damage; if ((c.maxpl == "mix"||c.maxpl == "50mix") && buddy > 0 && not_buddy == 0) add.buddy_only = 1; add.break_def_st = break_def_st; add.conform_no = conform_no; if (cond) add.conform_no2 = conform_no2; if (my_iv && myiv_conform > 0) add.myiv_conform = myiv_conform; if (my_def_st2 && myiv_conform2 > 0) add.myiv_conform2 = myiv_conform2; if (best100) add.limit_iv = limit_iv; if (best100 && (c.maxpl == "mix"||c.maxpl == "50mix")) add.limit_iv2 = limit_iv2; b_list.push(add); if (damage == min_damage) break; } } else { add = new Array(); add.pokemon_id = meta.id; add.pokemon_name = e_name; add.shadow = e_shadow; add.move_id = meta.move; add.move_name = move_name; add.iv = [meta.label]; add.iv2 = [meta.atk + "/" + meta.def + "/" + meta.hp + " PL" + meta.pl]; add.damage1 = max_damage; add.damage2 = min_damage; add.break_def_st = 0; add.conform_no = null; if (cond) add.conform_no2 = null; b_list.push(add); } } }); list_no = b_list.length; if (list_no > 3000) { var error_list = new Array(); error_list.error = "ブレイクポイントの件数が多過ぎます。"; return error_list; } if (table == 0) { b_list.sort(function (a, b) { if (a.break_atk_st < b.break_atk_st) return 1; if (a.break_atk_st > b.break_atk_st) return -1; if (a.move_id > b.move_id) return 1; if (a.move_id < b.move_id) return -1; return 0; }); } else { b_list.sort(function (a, b) { if (a.break_def_st < b.break_def_st) return 1; if (a.break_def_st > b.break_def_st) return -1; if (a.move_id > b.move_id) return 1; if (a.move_id < b.move_id) return -1; return 0; }); } var k = -1; for (var i = 1; i < list_no; i++) { if (b_list[i]["pokemon_id"] == b_list[i - 1]["pokemon_id"] && b_list[i]["shadow"] == b_list[i - 1]["shadow"] && b_list[i]["move_id"] == b_list[i - 1]["move_id"] && b_list[i]["damage2"] == b_list[i - 1]["damage2"] && b_list[i]["conform_no"] == b_list[i - 1]["conform_no"]) { if (k == -1) k = i - 1; b_list[k]["iv"].push(b_list[i]["iv"][0]); b_list[k]["iv2"].push(b_list[i]["iv2"][0]); b_list[i]["dup"] = true; } else { k = -1; } } b_list = b_list.filter((list) => !list.dup); list_no = b_list.length; for (var i = 0; i < list_no; i++) { if (table == 0) b_list[i]["break_atk_st"] = b_list[i]["break_atk_st"] == 0 ? 1000 : b_list[i]["break_atk_st"]; else b_list[i]["break_def_st"] = b_list[i]["break_def_st"] == 0 ? 1000 : b_list[i]["break_def_st"]; } var data_list = new Array(); data_list.bp_list = b_list; //data_list.meta_bl_ivs = bl_ivs; const Time1 = new Date(); if (c.debug) console.log("[エンジン内タイム]", Time1 - Time0); return data_list; } //SCP順個体値リスト関数 function scp_rank_list(c) { const Time0 = new Date(); //リーグ var lg = c.lg; var limit_cp; if (lg == 1) { limit_cp = 1500; } else if (lg == 2) { limit_cp = 2500; } else if (lg == 4) { limit_cp = 500; } else { limit_cp = 10000; } //自分のポケモン var id = c.id; var pokemon = pokemon_list["p" + id]; var atk = pokemon.atk; var def = pokemon.def; var hp = pokemon.hp; if(c.maxpl!=="mix"&&c.maxpl!=="50mix") c.maxpl = parseInt(c.maxpl); var max_pl = c.maxpl === 40 ? 40 : (c.maxpl === 41 || c.maxpl == "mix" ? 41 : (c.maxpl === 50 ? 50 : 51)); var min_pl = [1, 8, 15, 20].includes(parseInt(c.minpl)) ? parseInt(c.minpl) : 1; var min_iv = [0, 1, 2, 3, 5, 6, 10].includes(parseInt(c.miniv)) ? parseInt(c.miniv) : 0; //自分個体値 var my_iv = typeof c.atk !== "undefined" && typeof c.def !== "undefined" && typeof c.hp !== "undefined" ? true : false; //個体値リスト var iv_list = new Array(); var hp_list = new Array(); var min_hp = 1000; var max_hp = 0; var my_iv_exist = false; var buddy = 0; var not_buddy = 0; for (var a = min_iv; a <= 15; ++a) { for (var d = min_iv; d <= 15; ++d) { for (var h = min_iv; h <= 15; ++h) { var pl = 0; for (var p = max_pl; p >= min_pl; p = p - 0.5) { var cp = calc_cp(atk + a, def + d, hp + h, p); if (cp <= limit_cp) { pl = p; break; } } if (pl == 0) continue; var cpm = cpm_list["pl" + pl]; var atk_st = (atk + a) * cpm; var def_st = (def + d) * cpm; var hp_st = Math.floor((hp + h) * cpm); var scp = calc_scp(atk + a, def + d, hp + h, pl); var add = new Array(); add.atk = a; add.def = d; add.hp = h; add.pl = pl; add.atk_st = atk_st; add.def_st = def_st; add.hp_st = hp_st; add.cp = cp; add.scp = scp; iv_list.push(add); //HPリスト if (!hp_list[hp_st]) hp_list[hp_st] = 1; else hp_list[hp_st] = hp_list[hp_st] + 1; //最大最低HP if (min_hp > hp_st) min_hp = hp_st; if (max_hp < hp_st) max_hp = hp_st; //指定個体値が条件内にあるか判定 if (my_iv && parseInt(c.atk) == a && parseInt(c.def) == d && parseInt(c.hp) == h) my_iv_exist = true; //相棒カウント if (pl > (c.maxpl == "mix"?40:50)) buddy++; else not_buddy++; //ミックス var mix_maxpl = c.maxpl == "mix" ? 40 : c.maxpl == "50mix" ? 50 : 100; if (pl > mix_maxpl) { cpm = cpm_list["pl" + mix_maxpl]; atk_st = (atk + a) * cpm; def_st = (def + d) * cpm; hp_st = Math.floor((hp + h) * cpm); cp = calc_cp(atk + a, def + d, hp + h, mix_maxpl); scp = calc_scp(atk + a, def + d, hp + h, mix_maxpl); add = new Array(); add.atk = a; add.def = d; add.hp = h; add.pl = mix_maxpl; add.atk_st = atk_st; add.def_st = def_st; add.hp_st = hp_st; add.cp = cp; add.scp = scp; iv_list.push(add); //HPリスト if (!hp_list[hp_st]) hp_list[hp_st] = 1; else hp_list[hp_st] = hp_list[hp_st] + 1; //最大最低HP if (min_hp > hp_st) min_hp = hp_st; if (max_hp < hp_st) max_hp = hp_st; //指定個体値が条件内にあるか判定 if (my_iv && parseInt(c.atk) == a && parseInt(c.def) == d && parseInt(c.hp) == h) my_iv_exist2 = true; //相棒カウント not_buddy++; } } } } var list_no = iv_list.length; if (list_no == 0) { iv_list.error = "最低PL" + min_pl + "、最低個体値" + min_iv + "の条件でリーグに参加できる個体値がありません"; return iv_list; } if (my_iv && !my_iv_exist) { iv_list.error = "最低PL" + min_pl + "、最低個体値" + min_iv + "の条件と指定の個体値が一致しません"; iv_list.error1 = true; return iv_list; } if (c.debug) { //攻撃力並び替え iv_list.sort(function (a, b) { if (Math.round(a.atk_st * 10000000000) < Math.round(b.atk_st * 10000000000)) return 1; if (Math.round(a.atk_st * 10000000000) > Math.round(b.atk_st * 10000000000)) return -1; return 0; }); //攻撃力ランクづけ for (var i = 0; i < list_no; ++i) { if (i == 0) { iv_list[i]["atk_rank"] = i + 1; } else if (Math.round(iv_list[i]["atk_st"] * 10000000000) == Math.round(iv_list[i - 1]["atk_st"] * 10000000000)) { iv_list[i]["atk_rank"] = iv_list[i - 1]["atk_rank"]; } else { iv_list[i]["atk_rank"] = i + 1; } } //防御力並び替え iv_list.sort(function (a, b) { if (Math.round(a.def_st * 10000000000) < Math.round(b.def_st * 10000000000)) return 1; if (Math.round(a.def_st * 10000000000) > Math.round(b.def_st * 10000000000)) return -1; return 0; }); //防御力ランクづけ for (var i = 0; i < list_no; ++i) { if (i == 0) { iv_list[i]["def_rank"] = i + 1; } else if (Math.round(iv_list[i]["def_st"] * 10000000000) == Math.round(iv_list[i - 1]["def_st"] * 10000000000)) { iv_list[i]["def_rank"] = iv_list[i - 1]["def_rank"]; } else { iv_list[i]["def_rank"] = i + 1; } } //HP並び替え iv_list.sort(function (a, b) { if (a.hp_st < b.hp_st) return 1; if (a.hp_st > b.hp_st) return -1; return 0; }); //HPランクづけ for (var i = 0; i < list_no; ++i) { if (i == 0) { iv_list[i]["hp_rank"] = i + 1; } else if (iv_list[i]["hp_st"] == iv_list[i - 1]["hp_st"]) { iv_list[i]["hp_rank"] = iv_list[i - 1]["hp_rank"]; } else { iv_list[i]["hp_rank"] = i + 1; } } } //SCP並び替え iv_list.sort(function (a, b) { if (Math.round(a.scp * 10000000000) < Math.round(b.scp * 10000000000)) return 1; if (Math.round(a.scp * 10000000000) > Math.round(b.scp * 10000000000)) return -1; if (a.cp < b.cp) return 1; if (a.cp > b.cp) return -1; return 0; }); //SCPランクづけ var myiv_result = new Array(); for (var i = 0; i < list_no; ++i) { if (i == 0) { iv_list[i]["rank"] = i + 1; } else if (Math.round(iv_list[i]["scp"] * 10000000000) == Math.round(iv_list[i - 1]["scp"] * 10000000000)) { iv_list[i]["rank"] = iv_list[i - 1]["rank"]; } else { iv_list[i]["rank"] = i + 1; } if (myiv_result["no"] && parseInt(c.atk) == iv_list[i]["atk"] && parseInt(c.def) == iv_list[i]["def"] && parseInt(c.hp) == iv_list[i]["hp"]) { var myiv_result2 = $.extend(true, {}, iv_list[i]); myiv_result2["no"] = list_no; myiv_result2["scp"] = Math.floor(myiv_result2["scp"]); myiv_result2["atk_st"] = myiv_result2["atk_st"].toFixed(1); myiv_result2["def_st"] = myiv_result2["def_st"].toFixed(1); iv_list[i]["myiv2"] = true; } if (my_iv && !myiv_result["no"] && parseInt(c.atk) == iv_list[i]["atk"] && parseInt(c.def) == iv_list[i]["def"] && parseInt(c.hp) == iv_list[i]["hp"]) { myiv_result = $.extend(true, {}, iv_list[i]); myiv_result["no"] = list_no; myiv_result["scp"] = Math.floor(myiv_result["scp"]); myiv_result["atk_st"] = myiv_result["atk_st"].toFixed(1); myiv_result["def_st"] = myiv_result["def_st"].toFixed(1); iv_list[i]["myiv"] = true; } } //絞り込み if (c.atk_st || c.def_st || c.hp_st) { if (c.atk_st) iv_list = iv_list.filter((list) => Math.round(list.atk_st * 10000000000) >= Math.round(c.atk_st * 10000000000)); if (c.def_st) iv_list = iv_list.filter((list) => Math.round(list.def_st * 10000000000) > Math.round(c.def_st * 10000000000)); if (c.hp_st) iv_list = iv_list.filter((list) => list.hp_st >= c.hp_st); //再ランクづけ hp_list = new Array(); for (var i = min_hp; i <= max_hp; i++) { hp_list[i] = 0; } max_hp1 = 0; list_no = iv_list.length; buddy = 0; not_buddy = 0; for (var i = 0; i < list_no; ++i) { iv_list[i]["rank2"] = iv_list[i]["rank"]; if (i == 0) { iv_list[i]["rank"] = i + 1; } else if (Math.round(iv_list[i]["scp"] * 10000000000) == Math.round(iv_list[i - 1]["scp"] * 10000000000)) { iv_list[i]["rank"] = iv_list[i - 1]["rank"]; } else { iv_list[i]["rank"] = i + 1; } if (iv_list[i]["myiv"]) { myiv_result["rank2"] = myiv_result["rank"]; myiv_result["rank"] = iv_list[i]["rank"]; } if (iv_list[i]["myiv2"]) { myiv_result2["rank2"] = myiv_result2["rank"]; myiv_result2["rank"] = iv_list[i]["rank"]; } hp_list[iv_list[i]["hp_st"]]++; if (max_hp1 < iv_list[i]["hp_st"]) max_hp1 = iv_list[i]["hp_st"]; //相棒カウント if (iv_list[i]["pl"] > (c.maxpl == "mix" ? 40 : 50)) buddy++; else not_buddy++; } if (myiv_result && !myiv_result["rank2"]) { myiv_result["rank2"] = myiv_result["rank"]; myiv_result["rank"] = null; } if (myiv_result2 && !myiv_result2["rank2"]) { myiv_result2["rank2"] = myiv_result2["rank"]; myiv_result2["rank"] = null; } for (var i = max_hp1 - 1; i >= min_hp; i--) { hp_list[i] = hp_list[i] + hp_list[i + 1]; } if (myiv_result) { myiv_result["no2"] = myiv_result["no"]; myiv_result["no"] = list_no; } if (myiv_result2) { myiv_result2["no2"] = myiv_result2["no"]; myiv_result2["no"] = list_no; } } else { if (min_hp < max_hp) { for (var i = max_hp - 1; i >= min_hp; i--) { hp_list[i] = hp_list[i] + hp_list[i + 1]; } } } for (var j = 0; j < list_no; ++j) { iv_list[j]["scp"] = Math.floor(iv_list[j]["scp"]); iv_list[j]["atk_st"] = iv_list[j]["atk_st"].toFixed(1); iv_list[j]["def_st"] = iv_list[j]["def_st"].toFixed(1); } //出力 var data_list = new Array(); if (c.list != "hp") { data_list.scp_rank_list = iv_list; if (c.maxpl == "mix" || c.maxpl == "50mix") { //console.log("buddy", buddy); //console.log("not_buddy", not_buddy); data_list.buddy = buddy; data_list.not_buddy = not_buddy; } } //if (c.maxpl == "mix" || c.maxpl == "50mix") { //console.log("buddy", buddy); //console.log("not_buddy", not_buddy); myiv_result.buddy = buddy; myiv_result.not_buddy = not_buddy; //} if (my_iv) data_list.myiv_result = myiv_result; if (myiv_result2) data_list.myiv_result2 = myiv_result2; if (c.list != "scp" && my_iv) data_list.hp_list = hp_list; const Time1 = new Date(); if (c.debug) console.log("[エンジン内タイム]", Time1 - Time0); return data_list; } //HP範囲関数 function hp_range(lg, id, miniv, minpl, maxpl) { var limit_cp; if (lg == 1) limit_cp = 1500; else if (lg == 2) limit_cp = 2500; else limit_cp = 10000; var pokemon = pokemon_list["p" + id]; var atk = pokemon.atk; var def = pokemon.def; var hp = pokemon.hp; var max_pl = parseInt(maxpl) == 41 ? 41 : 40; var min_pl = [1, 15, 20].includes(parseInt(minpl)) ? parseInt(minpl) : 1; var min_iv = [0, 1, 2, 3, 5, 10].includes(parseInt(miniv)) ? parseInt(miniv) : 0; var pl_min = 0; for (var p = max_pl; p >= min_pl; p = p - 0.5) { var cp = calc_cp(atk + 15, def + 15, hp + min_iv, p); if (cp <= limit_cp) { pl_min = p; break; } } var pl_max = 0; for (p = max_pl; p >= min_pl; p = p - 0.5) { cp = calc_cp(atk + min_iv, def + min_iv, hp + 15, p); if (cp <= limit_cp) { pl_max = p; break; } } if (pl_min >= 1 && pl_max >= 1) { var min_hp = Math.floor((hp + min_iv) * cpm_list["pl" + pl_min]); var max_hp = Math.floor((hp + 15) * cpm_list["pl" + pl_max]); } else { var min_hp = 1000; var max_hp = 0; for (var a = min_iv; a <= 15; ++a) { for (var d = min_iv; d <= 15; ++d) { for (var h = min_iv; h <= 15; ++h) { var pl = 0; for (p = max_pl; p >= min_pl; p = p - 0.5) { cp = calc_cp(atk + a, def + d, hp + h, p); if (cp <= limit_cp) { pl = p; break; } } if (pl == 0) continue; var hp_st = Math.floor((hp + h) * cpm_list["pl" + pl]); if (min_hp > hp_st) min_hp = hp_st; if (max_hp < hp_st) max_hp = hp_st; } } } if (max_hp == 0) return ["この個体値条件ではリーグに参加できません"]; } var hp_range = new Array(); for (var i = min_hp; i <= max_hp; ++i) { hp_range.push(i); } return hp_range; } })(jQuery);