スキル強化合成ページで白くじ10連引きをするための、moko編集のすゝめ
拡張機能
目次
序論
武将育成集中合成イベントも終わったことだし、今宵はゆっくりと・・・
殿、大変です。mokoだと強化合成ページでも白くじを引けるのですが、動作が遅すぎです><
なぬ、確かに遅い・・白くじ10連引きを使わずに1枚ずつ引いてるみたいだな。
ですよね。なんとかできませんか?
前に白くじ10連引きの修正と基本同じだろうから、やってみるか。
本論
今回はネット上にある適当で最新なmokoを使用します。その他のmokoでも改行方法や行の位置こそ違えど関数名や変数名はそこまで変わらないと思われます。なので自分のmokoに適用できるように適宜読み替えてください。
なお、これらの修正により発生した不利益の責任は一切受け付けませんので宜しくお願いします。
修正箇所其の1
元のコード
ixa-moko.user.js
内でfunction sendSenkuji
で検索するとヒットするsendSenkuji
関数を編集します。
// ixa-moko.user.js
// 合成白くじ引き
function sendSenkuji(data, token, material, send_num) {
if (!sendSenkuji.ajflag) {
sendSenkuji.ajflag = true;
} else if (sendSenkuji.ajflag) {
return;
}
if (send_num === 0) {
if (data.union_type == 1) {
// 強化合成
data.material_arr = material;
} else {
// ランクアップ
data.material_cid = material;
}
return $.form({
type: 'post',
url: location.pathname,
data: data
});
}
$.ajax({
type: 'post',
url: '/senkuji/play_senkuji.php',
data: {
send: 'send',
got_type: '0',
sub_id: '0',
senkuji_token: token
},
beforeSend: xrwStatusText,
}).then(function(html) {
// 下の完成形のコードでは、ここから
whiteLottery.count++;
setStorage('ixamoko_white_lottery', whiteLottery);
var new_cid = $(html).find('span[id^="card_commandsol_cnt"]').attr('id').match(/\d+/)[0];
material.push(new_cid);
Info.count('あと ' + send_num + '枚');
send_num--;
sendSenkuji.ajflag = false;
// ここまでを弄ってます。
return sendSenkuji(data, token, material, send_num);
}, null);
}
完成形
上記の元のコードに、『残り枚数が10枚以上なら10連引きを、10枚未満なら通常の1枚ずつ引きをする』コードを足し加えます。
// ixa-moko.user.js
function sendSenkuji(data, token, material, send_num) {
if (!sendSenkuji.ajflag) {
sendSenkuji.ajflag = true;
} else if (sendSenkuji.ajflag) {
return;
}
if (send_num === 0) {
// 引ける枚数が0になったら。
if (data.union_type == 1) {
// 強化合成
data.material_arr = material;
} else {
// ランクアップ
data.material_cid = material;
}
return $.form({
type: "post",
url: location.pathname,
data: data,
});
}
// 下の1行を追加
const isDrawX10 = 10 <= send_num;
$.ajax({
type: 'post',
url: '/senkuji/play_senkuji.php',
data: {
send: 'send',
got_type: isDrawX10 ? '1320' : '0',
sub_id: '0',
senkuji_token: token
},
beforeSend: xrwStatusText,
}).then(function (html) {
// ここから
const parser = new DOMParser();
const doc = parser.parseFromString(html, "text/html");
Info.count(`あと ${send_num}枚`);
if (isDrawX10) {
send_num -= 10;
whiteLottery.count += 10;
} else {
send_num--;
whiteLottery.count++;
}
const elms = doc.querySelectorAll('span[id^="card_commandsol_cnt"]');
const newCids = Array.from(elms).map(elm => elm.id.match(/\d+/)[0]);
material.push(...newCids);
setStorage("ixamoko_white_lottery", whiteLottery);
// ここまでを変更
sendSenkuji.ajflag = false;
return sendSenkuji(data, token, material, send_num);
}, null);
}
分からないよって人は、`function sendSenkuji`の完成形をコピーし、元のコードに貼り付けて上書きすれば良いワン。
修正箇所其の2
そういえば、スキル強化ページで強化カードが選択されていない時も、mokoの白くじ引き機能が追加されているな。ここも修正しよう。
// ixa-moko.user.js
// 合成 白くじ引き
function syntheticWhiteLottery() {
if (
location.pathname != '/union/levelup.php'
&& location.pathname != '/union/additional.php'
) {
return;
}
// ここから
const ig_deck_subcardarea = document.getElementsByClassName("ig_deck_subcardarea")[0];
if (location.pathname === '/union/levelup.php' && !ig_deck_subcardarea.children.length) {
return;
}
// ここまでを挿入
var union_type = $('#union_type').val();
if ((union_type != 1 && union_type != 4) || (union_type == 4 && !$('div.addslot').length)) {
return;
}
// 以降のコードは無関係なので割愛
}
解説
戦国くじページでの白くじN枚引きの時と同じだが、10枚以上の時は『got_type: 1320』を利用するようにしたのだ。また10枚連引きの時は残りの引く枚数を10減らすように変更したのだ。
ふむふむ。ところで、1320という数字に何か意味はあるのですか?
さっぱりわからん。
自分のmokoの場合
mokoで主に使われている方法から大きく乖離しているため、普通一般の人はしない方が良いです
基本的にjquery
は not for me なので、自分用に手入れしてあるmokoだと下の様になっています。片端からjquery
を排していって、まともな方法でmanifest v3に対応出来るようにしたいですね。
// ixa-moko.user.js
/**
* response body に含まれる text string を html document に変換する
* @param {string} html
* @return
*/
function getDocument(html){
const parser = new DOMParser();
return parser.parseFromString(html, "text/html");
}
/**
* 合成白くじ引き
* 再帰関数
* @param {{union_type: number, material_arr: number[], material_cid: number[]}} data
* @param {number} token
* @param {number[]} material
* @param {number} send_num
* @returns
*/
function sendSenkuji(data, token, material, send_num) {
// 完成形と同じなので割愛
const isDrawX10 = 10 <= send_num;
const url = "/senkuji/play_senkuji.php"
const senkujiData = {
send: "send",
got_type: isDrawX10 ? 1320 : 0,
sub_id: 0,
senkuji_token: token,
}
fetch(url, {
method: "POST",
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: new URLSearchParams(Object.entries(senkujiData)).toString()
})
.then(res => res.text())
.then(html => {
const doc = getDocument(html);
// 割愛
const elms = doc.querySelectorAll('span[id^="card_commandsol_cnt"]');
const newCids = Array.from(elms).map(elm => elm.id.match(/\d+/)[0]);
// 割愛
return sendSenkuji(data, token, material, send_num);
});
}