Skip to content

Instantly share code, notes, and snippets.

@hot-2130
Last active August 6, 2018 13:54
Show Gist options
  • Select an option

  • Save hot-2130/e4d2da194ff9e7d00ff39e9db98fe421 to your computer and use it in GitHub Desktop.

Select an option

Save hot-2130/e4d2da194ff9e7d00ff39e9db98fe421 to your computer and use it in GitHub Desktop.
ブラウザ三国志 都市画面に全兵補正値を表示(小数第1まで)
// ==UserScript==
// @name bro3_correct_param_view
// @namespace bro3_correct_param_view
// @description ブラウザ三国志 都市画面に全軍補正値を表示 byほっと
// @include https://*.3gokushi.jp/village.php*
// @include http://*.3gokushi.jp/village.php*
// @version 1.2
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js
// ==/UserScript==
// version date author
// 1.1 2018/08/05 作成開始
// 1.2 2018/08/06 小数第1まで表示
// to do
// 都市画面に全軍(劫略令)の補正値を表示します
// load jQuery
jQuery.noConflict();
j$ = jQuery;
//----------//
// 変数定義 //
//----------//
// ソフトウェアバージョン
var VERSION = "1.2";
var SERVER_NAME = location.hostname.match(/^(.*)\.3gokushi/)[1];
// 特殊定数
var PROTOCOL = location.protocol;
var HOST = location.hostname; // アクセスURLホスト
var SERVICE = ''; // サービス判定が必要な場合に使用する予約定数
var SVNAME = HOST.substr(0,location.hostname.indexOf(".")) + SERVICE;
var m_deckListAll = [];
var m_village = "";
//----------------//
// メインルーチン //
//----------------//
(function() {
// 拠点名取得
m_village = j$("#basepoint span[class='basename']").eq(0).text();
var promise1 = Promise.resolve();
promise1
.then(cpv_deskload) // ファイル一覧読み込み
.then(cpv_calc_param) // スキル計算
.catch(cpv_onRejectted);
})();
function cpv_onRejectted(error) {
console.log("error = " + error);
}
//-----------------------//
// URL LOAD //
//-----------------------//
function cpv_deskload(){
return new Promise(function (resolve, reject) {
m_deckListAll = [];
var l_url=PROTOCOL + "//" + HOST + "/card/deck.php";
console.log(l_url);
j$.ajax({
type: 'get',
url: l_url,
datatype: 'html',
cache: false
}).done(function(data){
// デッキにあるカード情報取得
j$(data).find("#cardListDeck div[class='cardColmn']").each(function(){
var l_deckList = new Object;
var cdName = j$(this).find( ".cardWrapper span[class='name-for-sub']");
var setVillage = j$(this).find(".clearfix dl[class='set_status clearfix'] dd:eq(1)");
var setStatus = j$(this).find(".clearfix dl[class='set_status clearfix'] dd[class='btm_none']");
var cdGage = j$(this).find(".clearfix dl[class='set_status clearfix'] div[class='para clearfix'] span[class='gage']");
var cdHp = j$(this).find( ".cardWrapper div[class='status_hp'] span[class='value']").text().match(/\d+/g)[0];
var cdLevel = j$(this).find( ".cardWrapper div[class='level'] span").text().match(/\d+/g)[0];
var cdCost = parseFloat(j$(this).find( ".cardWrapper span[class='cost-for-sub']").text());
var cdSoltype = j$(this).find( ".cardWrapper span[class='soltype-for-sub'] img").eq(0).attr("title");
var cdSpeed = j$(this).find( ".cardWrapper ul[class='status'] li[class^='status_speed']").text().match(/\d+/g)[0];
var cdSkil = j$(this).find(".back_skill li[class!='subgeneral']");
var cdSkil1 = j$(this).find(".back_skill span[class^='skillName1']").eq(0).text();
var cdSkil1pa = j$(this).find(".back_skill span[class^='skillName1']").hasClass("skillName1 skill_name red");
var cdSkil1kai = !(j$(this).find(".back_skill div").hasClass("skill1 skill-kaifuku"));
var cdSkil1id ="";
if (j$.trim(cdSkil1).length > 0 ){
cdSkil1id = j$(this).find(".back_skill div[class^='skill1'] a[class='btn_detail_s']" ).attr("onclick").match(/[a-z]{2}\d{4}/g)[0];
}
var cdSkil1txt="";
if (cdSkil1pa){
cdSkil1txt=j$(this).find(".back_skill div[class^='skill1']").eq(0).text();
}
var cdSkil2 = j$(this).find(".back_skill span[class^='skillName2']").text();
var cdSkil2pa = j$(this).find(".back_skill span[class^='skillName2']").hasClass("skillName2 skill_name red");
var cdSkil2kai = !(j$(this).find(".back_skill div").hasClass("skill2 skill-kaifuku"));
var cdSkil2id ="";
if (j$.trim(cdSkil2).length > 0 ){
cdSkil2id = j$(this).find(".back_skill div[class^='skill2'] a[class='btn_detail_s']" ).attr("onclick").match(/[a-z]{2}\d{4}/g)[0];
}
var cdSkil2txt="";
if (cdSkil2pa){
cdSkil2txt=j$(this).find(".back_skill div[class^='skill2']").text();
}
var cdSkil3 = j$(this).find(".back_skill span[class^='skillName3']").text();
var cdSkil3pa = j$(this).find(".back_skill span[class^='skillName3']").hasClass("skillName3 skill_name red");
var cdSkil3kai = !(j$(this).find(".back_skill div").hasClass("skill3 skill-kaifuku"));
var cdSkil3id ="";
if (j$.trim(cdSkil3).length > 0 ){
cdSkil3id = j$(this).find(".back_skill div[class^='skill3'] a[class='btn_detail_s']" ).attr("onclick").match(/[a-z]{2}\d{4}/g)[0];
}
var cdSkil3txt="";
if (cdSkil3pa){
cdSkil3txt=j$(this).find(".back_skill div[class^='skill3']").text();
}
var cdSkil4 = "";
var cdSkil4kai = true;
var cdSkil4id ="";
var cdSkil4pa =false;
if (cdSkil.length > 3){
cdSkil4 = j$(this).find(".back_skill span[class^='skillName4']").text();
cdSkil4pa = j$(this).find(".back_skill span[class^='skillName4']").hasClass("skillName4 skill_name red");
cdSkil4kai = !(j$(this).find(".back_skill div").hasClass('skill4 skill-kaifuku'));
if (j$.trim(cdSkil4).length > 0 ){
cdSkil4id = j$(this).find(".back_skill div[class^='skill4'] a[class='btn_detail_s']" ).attr("onclick").match(/[a-z]{2}\d{4}/g)[0];
cdSkil4id = j$(this).find(".back_skill div[class^='skill4'] a[class='btn_detail_s']").attr("onclick").match(/[a-z]{2}\d{4}/g)[0];
}
}
var cdSkil4txt="";
if (cdSkil4pa){
cdSkil4txt=j$(this).find(".back_skill div[class^='skill4']").text();
}
//副将スキルがある
var fukCd = "";
var fukCdid="";
var fukKai = true;
var fukId ="";
var fukSkiltxt ="";
if (j$(this).find(".back_skill li").hasClass("subgeneral")){
if (j$(this).find(".back_skill li[class='subgeneral'] span").hasClass("subgeneralSkillName4 skill_name_subgeneral red")==false){
fukCd = j$(this).find(".back_skill span[class^='subgeneralSkillName4']").text();
fukKai = !(j$(this).find(".back_skill div").hasClass('skill4 skill-kaifuku'));
fukId = j$(this).find(".back_skill div[class^='skill4'] a[class='btn_detail_s']").attr("onclick").match(/[a-z]{2}\d{4}/g)[0];
fukCdid = j$(this).find(".back_skill div[class^='skill4'] a[class='btn_detail_s']").attr("onclick").match(/\d+/g)[1];
} else {
fukSkiltxt=j$(this).find(".back_skill div[class^='skill4']").text();
}
}
var cid ="";
if (j$.trim(cdSkil1).length > 0 ){
cid = j$(this).find(".back_skill div[class^='skill1'] a[class='btn_detail_s']" ).attr("onclick").match(/\d+/g)[1];
}
l_deckList.name = j$.trim(cdName.text()); //カード名
l_deckList.cdid = cid; //カードID
l_deckList.setvil = j$.trim(setVillage.text()); //拠点
l_deckList.setsta = j$.trim(setStatus.text()); //状態
l_deckList.gage = j$.trim(cdGage.text()); //討伐ゲージ
l_deckList.hp = cdHp; //HP
l_deckList.cost = cdCost; //コスト
l_deckList.speed = cdSpeed; //スピード
l_deckList.level = cdLevel; //カードレベル
l_deckList.soltype = cdSoltype; //兵種
l_deckList.cdskil1 = j$.trim(cdSkil1); //スキル1
l_deckList.cdskil1kai = cdSkil1kai; //スキル1回復(回復中:false)
l_deckList.cdskil1id = cdSkil1id; //スキル1ID
l_deckList.cdskil1pa = cdSkil1pa; //スキル1パッシブ
l_deckList.cdskil1txt = cdSkil1txt; //スキル1内容
l_deckList.cdskil2 = j$.trim(cdSkil2); //スキル2
l_deckList.cdskil2kai = cdSkil2kai; //スキル2回復(回復中:false)
l_deckList.cdskil2id = cdSkil2id; //スキル2ID
l_deckList.cdskil2pa = cdSkil2pa; //スキル2パッシブ
l_deckList.cdskil2txt = cdSkil2txt; //スキル2内容
l_deckList.cdskil3 = j$.trim(cdSkil3); //スキル3
l_deckList.cdskil3kai = cdSkil3kai; //スキル3回復(回復中:false)
l_deckList.cdskil3id = cdSkil3id; //スキル3ID
l_deckList.cdskil3pa = cdSkil3pa; //スキル3パッシブ
l_deckList.cdskil3txt = cdSkil3txt; //スキル3内容
if (cdSkil.length > 3){ //スキル4
l_deckList.cdskil4 = j$.trim(cdSkil4);
} else {
l_deckList.cdskil4 ="";
}
l_deckList.cdskil4kai = cdSkil4kai; //スキル4回復(回復中:false)
l_deckList.cdskil4id = cdSkil4id; //スキル4ID
l_deckList.cdskil4pa = cdSkil4pa; //スキル4パッシブ
l_deckList.cdskil4txt = cdSkil4txt; //スキル4内容
l_deckList.fukcd = j$.trim(fukCd); //副将
l_deckList.fukcdid = fukCdid; //副将ID
l_deckList.fukkai = fukKai; //副将スキル回復(回復中:false)
l_deckList.fukskilid = fukId; //副将スキルID
l_deckList.fukskiltxt = fukSkiltxt; //副将スキル内容
console.log(l_deckList);
m_deckListAll.push(l_deckList);
});
resolve(0);
});
});
}
//----------------//
// スキル計算 //
//----------------//
function cpv_calc_param(){
return new Promise(function (resolve, reject) {
var l_summary = new Array();
l_summary[0] = 0.0; // 攻撃
l_summary[1] = 0.0; // 防御
l_summary[2] = 0.0; // 速度
var l_summary2 = new Array();
l_summary2[0] = 0.0; // 攻撃
l_summary2[1] = 0.0; // 防御
l_summary2[2] = 0.0; // 速度
if (m_deckListAll.length != 0) {
for(var d= 0; d < m_deckListAll.length; d++){
if (m_village==m_deckListAll[d].setvil){
var l_skilnamearry = [];
var l_skilarry = [];
if (m_deckListAll[d].cdskil1txt!=""){l_skilnamearry.push(m_deckListAll[d].cdskil1);l_skilarry.push(m_deckListAll[d].cdskil1txt);} //スキル1内容
if (m_deckListAll[d].cdskil2txt!=""){l_skilnamearry.push(m_deckListAll[d].cdskil2);l_skilarry.push(m_deckListAll[d].cdskil2txt);} //スキル2内容
if (m_deckListAll[d].cdskil3txt!=""){l_skilnamearry.push(m_deckListAll[d].cdskil3);l_skilarry.push(m_deckListAll[d].cdskil3txt);} //スキル3内容
if (m_deckListAll[d].cdskil4txt!=""){l_skilnamearry.push(m_deckListAll[d].cdskil4);l_skilarry.push(m_deckListAll[d].cdskil4txt);} //スキル4内容
if (m_deckListAll[d].fukskiltxt!=""){l_skilnamearry.push(m_deckListAll[d].fukcd);l_skilarry.push(m_deckListAll[d].fukskiltxt);} //副将スキル内容
// デッキにセットされている全兵スキルチェック
for (var i = 0; i < l_skilarry.length; i++) {
var l_skill_text = l_skilarry[i];
// パッシブ計算
if (l_skill_text.indexOf("自動で発動") > 0) {
// 効果計算
var l_effects = cpv_calc_skilltext_correct_effect(l_skill_text);
for (var j = 0; j < 3; j++) {
l_summary[j] += l_effects[j];
}
}
}
//劫略令
for (var i = 0; i < l_skilnamearry.length; i++) {
var l_skill_name = l_skilnamearry[i];
var l_skill_text = l_skilarry[i];
if (l_skill_name.indexOf("劫略令") > 0) {
// 効果計算
var l_effects2 = cpv_calc_skilltext_correct_effect_desk(l_skill_text);
for (var j = 0; j < 3; j++) {
l_summary2[j] += l_effects2[j];
}
}
}
}
}
}
// 画面に反映
for (var k = 0; k < 3; k++) {
if (l_summary[k]!=0){
l_summary[k] = parseFloat(l_summary[k]).toFixed(1);
}
if (l_summary2[k]!=0){
l_summary2[k] = parseFloat(l_summary2[k]).toFixed(1);
}
}
var l_txt1 = "全兵:攻撃" + l_summary[0] + "%, 速度" + l_summary[2] + "%, 防御" + l_summary[1] + "%";
var l_txt2 = "劫略令:攻撃" + l_summary2[0] + "%, 速度" + l_summary2[1] + "%, 資源" + l_summary2[2] + "%";
var l_num = j$("#basepoint div[class=base-skill]").eq(0).children("span").length;
// 設定リンクの作成
j$("#basepoint div[class=base-skill]").eq(0).children("span").eq(l_num-1).after(
"<div><span>" + l_txt1 + "<br>" + l_txt2 + "</span></div>"
);
resolve(0);
});
}
// スキル文から効果を計算
function cpv_calc_skilltext_correct_effect(i_skill_text) {
var l_effects = new Array();
l_effects[0] = 0.0; // 攻撃
l_effects[1] = 0.0; // 防御
l_effects[2] = 0.0; // 速度
// 全兵スキル以外は無視
var match = i_skill_text.match(/セットした拠点[から出兵する|の]*全[ての]*(兵士)/);
if (match == null) {
return l_effects;
}
// 効果判定(攻)
match = i_skill_text.match(/攻撃力[がを]*([0-9.]*)%/);
if (match != null) {
l_effects[0] += parseFloat(match[1]);
}
// 効果判定(防)
match = i_skill_text.match(/防御[力全てが]*([0-9.]*)%/);
if (match != null) {
l_effects[1] += parseFloat(match[1]);
}
// 効果判定(移)
match = i_skill_text.match(/移[動]*速[度が]*([0-9.]*)%/);
if (match != null) {
l_effects[2] += parseFloat(match[1]);
}
return l_effects;
}
// スキル文から効果を計算
function cpv_calc_skilltext_correct_effect_desk(i_skill_text) {
var l_effects = new Array();
l_effects[0] = 0.0; // 攻撃
l_effects[1] = 0.0; // 速度
l_effects[2] = 0.0; // 資源
var match=[];
// 効果判定(攻)
match = i_skill_text.match(/攻撃力[がを]*([0-9.]*)%/);
if (match != null) {
l_effects[0] += parseFloat(match[1]);
}
// 効果判定(移)
match = i_skill_text.match(/移[動]*速[度が]*([0-9.]*)%/);
if (match != null) {
l_effects[1] += parseFloat(match[1]);
}
// 効果判定(資源)
match = i_skill_text.match(/持ち帰る資源*([0-9.]*)%/);
if (match != null) {
l_effects[2] += parseFloat(match[1]);
}
return l_effects;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment