Closed sion677 closed 3 years ago
無限ループに陥っているようなので、いつもならあやしいのは宗谷ですね。
api_id=645 の宗谷
api_afterbull: 0
api_afterfuel: 700
api_afterlv: 60
api_aftershipid: "650"
api_backs: 6
api_broken: [3, 0, 9, 0]
api_buildtime: 60
api_bull_max: 5
api_ctype: 111
api_fuel_max: 20
api_getmes: "<br>"
api_houg: [0, 1]
api_id: 645
api_leng: 1
api_luck: [65, 130]
api_maxeq: [0, 0, 0, 0, 0]
api_name: "宗谷"
api_powup: [0, 0, 0, 2]
api_raig: [0, 0]
api_slot_num: 2
api_soku: 5
api_sort_id: 7613
api_sortno: 445
api_souk: [13, 40]
api_stype: 22
api_taik: [23, 36]
api_tyku: [0, 0]
api_voicef: 1
api_yomi: "そうや"
api_id=650 の宗谷
api_afterbull: 130
api_afterfuel: 280
api_afterlv: 60
api_aftershipid: "699"
api_backs: 7
api_broken: [4, 0, 10, 0]
api_buildtime: 60
api_bull_max: 5
api_ctype: 111
api_fuel_max: 25
api_getmes: "<br>"
api_houg: [0, 1]
api_id: 650
api_leng: 1
api_luck: [77, 155]
api_maxeq: [1, 2, 3, 0, 0]
api_name: "宗谷"
api_powup: [0, 0, 0, 3]
api_raig: [0, 0]
api_slot_num: 3
api_soku: 5
api_sort_id: 7615
api_sortno: 450
api_souk: [15, 62]
api_stype: 22
api_taik: [26, 38]
api_tyku: [0, 0]
api_voicef: 1
api_yomi: "そうや"
api_id=699 の宗谷
api_afterbull: 0
api_afterfuel: 380
api_afterlv: 60
api_aftershipid: "645"
api_backs: 5
api_broken: [3, 0, 9, 0]
api_buildtime: 60
api_bull_max: 10
api_ctype: 111
api_fuel_max: 20
api_getmes: "特務艦、宗谷です。提督、お逢いできて、光栄です。<br>戦闘艦ではありませんが、私…精一杯、働きます!<br>どうぞよろしく、お願いします!"
api_houg: [1, 9]
api_id: 699
api_leng: 1
api_luck: [55, 110]
api_maxeq: [0, 0, 0, 0, 0]
api_name: "宗谷"
api_powup: [0, 0, 0, 2]
api_raig: [0, 0]
api_slot_num: 3
api_soku: 5
api_sort_id: 7611
api_sortno: 408
api_souk: [13, 35]
api_stype: 22
api_taik: [22, 35]
api_tyku: [8, 32]
api_voicef: 1
api_yomi: "そうや"
699 -> 645 -> 650 -> 699 というコンバートのようです。
ここですね。改造していくと最初のship_idに戻ってくるので無限ループしている。
function update_mst_ship(list) {
if (!list) return;
$mst_ship = {};
var before = {};
list.forEach(function(data) {
$mst_ship[data.api_id] = data;
if (data.api_aftershipid) {
let b = before[data.api_aftershipid];
if (b == null || $mst_ship[b].api_afterlv > data.api_afterlv)
before[data.api_aftershipid] = data.api_id;
}
});
for (var id in $mst_ship) {
var b = before[id];
if (b) {
$mst_ship[id].yps_before_shipid = b; // 改装前の艦種ID.
do {
$mst_ship[id].yps_begin_shipid = b; // 未改装の艦種ID.
} while (b = before[b]);
}
}
save_storage('mst_ship', $mst_ship);
}
スマートな解決策ではないですが、愚直に699に到達したら脱出するようにして動くようにはなりました。
do {
$mst_ship[id].yps_begin_shipid = b; // 未改装の艦種ID.
if(b == 699) break; // 宗谷
} while (b = before[b]);
ただ、この実装だと未保有艦の判定がダメですね。宗谷がカウントされない。
未保有艦判定が狂うのは、「ここの改造型を除外する」に該当しちゃってますね。
for (var id in $mst_ship) {
var mst = $mst_ship[id];
if (mst.yps_begin_shipid) continue; // 改造型を除外する.
if (!mst.api_afterlv) continue; // 改造不能型(季節艦、深海棲艦)を除外する.
if (!owned_ship_idset[id]) unowned_names.push(ship_name(id)); // 未所有艦名をリストに加える.
}
いきなりのコメント失礼します。 update_mst_ship 関数の before 配列で値の代入時に 「before[data.api_aftershipid] = data.api_id;」 この値「before["699"] = 650;」を除外したら両方解決したりする? これをした場合に何か弊害があるかどうか把握してはないけど
api_afterlv が全て60になってるからだと思うので将来的には初期形態かどうかの判定をして before 配列にその初期形態のIDが入らないようにするとか? 初期形態かどうかの判定は api_getmes から \<br> を消した時に何か文字が残っているかどうか(メッセージがあれば最初の艦)で判定するとか?
この値「before["699"] = 650;」を除外したら両方解決したりする?
これを除外すると挙げた問題はたぶん解決しますが、おそらく改造Lv判定の部分がおかしくなりますね。コンバート改装の判定にならず、普通の改造の判定だけに。
初期形態かどうかの判定は、おそらく api_sort_id で出来ると思われます。スマートな処理をするならこれを使うのが良さそう。
とりあえず暫定対処で動くようになったのでPR書きます。
ということで #163 です。自分のところで動作検証は済ませてますがマージ前なので未保証。 急いで動くようにしたい人は https://github.com/hkuno9000/KanColle-YPS/tree/t-f-m-patch-1 から持っていってください。
皆様ありがとうございます。自分は一般ユーザーなのでコードの書き換え等はできませんので、 制作者の方の修正版を待ちます。わざわざありがとうございます。
動かないのは致命的なのでプルリク #163 をマージしてストア版を公開します。 毎回、ここがネックなので誤判定しても良いから脱出できるように仕掛けを考えます。
お疲れさまです。 issueの途中だとapi_sort_idが使えそうと書いてますが、これは宗谷では使えそうなのであって、他の艦だとあまり機能しなさそうです。特に千歳千代田、鈴谷熊野あたりのダイナミックに艦種が変わる艦で。
ストア版の審査通過しました。公開完了です。 ブラウザをリロード、再起動すると更新できます。
迅速な対応ありがとうございます。
@yamagen75
初期形態かどうかの判定は api_getmes から
を消した時に何か文字が残っているかどうか(メッセージがあれば最初の艦)で判定するとか?
この案を採用し、改装の出発点となる艦種IDを確定します。 さらに無限ループに陥った場合に備えて安全弁(checked)をつけた修正版を e364a8c にコミットしました。
5月21日のイベント後段作戦開放メンテナンス後、艦隊これくしょん-YPSがロード完了しなくなりました。 お忙しいところ恐縮ですが対応お願いします。