スキル強化合成ページで白くじ10連引きをするための、moko編集のすゝめ

スキル強化合成ページで白くじ10連引きをするための、moko編集のすゝめ

拡張機能
目次

序論

balloon
武将育成集中合成イベントも終わったことだし、今宵はゆっくりと・・・
balloon
殿、大変です。mokoだと強化合成ページでも白くじを引けるのですが、動作が遅すぎです><

Image from Gyazo

balloon
なぬ、確かに遅い・・白くじ10連引きを使わずに1枚ずつ引いてるみたいだな。
balloon
ですよね。なんとかできませんか?
balloon
前に白くじ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);
}
balloon
分からないよって人は、`function sendSenkuji`の完成形をコピーし、元のコードに貼り付けて上書きすれば良いワン。

gif

修正箇所其の2

balloon
そういえば、スキル強化ページで強化カードが選択されていない時も、mokoの白くじ引き機能が追加されているな。ここも修正しよう。

image for Gyazo

// 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;
  }

  // 以降のコードは無関係なので割愛
}

解説

balloon
戦国くじページでの白くじN枚引きの時と同じだが、10枚以上の時は『got_type: 1320』を利用するようにしたのだ。また10枚連引きの時は残りの引く枚数を10減らすように変更したのだ。
balloon
ふむふむ。ところで、1320という数字に何か意味はあるのですか?
balloon
さっぱりわからん。

自分の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);
    });
}