貓咪大戰超絕功能擴充

battlecats plug-in

// ==UserScript==
// @name         貓咪大戰超絕功能擴充
// @namespace	 https://home.gamer.com.tw/homeindex.php?owner=k96879687
// @version      0.31
// @description  battlecats plug-in
// @author       k96879687(竊盜拿到OK繃)
// @match        https://battlecats-db.com/*
// @grant        none

// ==/UserScript==

/*
目前功能:
1.關卡上下關連結,可反應星數	
2.角色等級30、40、50變化
3.外星敵人水晶倍率100%、200%、300%變化
4.外星(星)水晶倍率100%、200%、300%變化
5.變化後顏色提示

*/

(function() {
    'use strict';
	
	let default_crystal = 299;//預設未來篇水晶%數
	let default_crystal_stat = 299;//預設宇宙篇水晶%數
	let animationOFF = 0;//動畫關閉
	let animationBGColor = "009040";//動畫顏色
	let animationTime = 2500;//動畫長度 單位ms
	
	
	
	
	
	
	var head = document.getElementsByTagName('head')[0];
	var style = document.createElement('style');
	var declarations = document.createTextNode(
		'#k96_plug{width:auto; height:auto; position:fixed; right:50px; bottom:60px; background:#883800; text-align:center; line-height:50px; padding:5px;}'+
		'#k96_plug_block_0{ width:100px; height:50px; background:#883800; border-bottom-style:solid;border-color:#b06000;}'+
		'#k96_plug_block_0:hover{background:#b06000; transition:background 1s;}'+
		'#k96_plug_block_1{ width:100px; height:50px; background:#883800; border-bottom-style:solid;border-color:#b06000;}'+
		'#k96_plug_block_1:hover{background:#b06000; transition:background 1s;}'+
		'#k96_plug_block_2{ width:100px; height:50px; background:#883800;}'+
		'#k96_plug_block_2:hover{background:#b06000; transition:background 1s;}'+
		'@keyframes fade { 0%{ background:#'+animationBGColor+';} 100%{}}'+
		'.fade{ animation: fade '+animationTime+'ms forwards;}'
	);
	style.type = 'text/css';
	if (style.styleSheet) {
		style.styleSheet.cssText = declarations.nodeValue;
	}
	else{
		style.appendChild(declarations);
	}
	head.appendChild(style);
	

	var 連結陣列 = location.href.split('//');	//[https:],[battlecats-db.com/stage/s00000-01.html]
	連結陣列 = 連結陣列[1].split('/');	//[battlecats-db.com],[stage],[s00000-01.html]
	var i = 0;
	//---------------------------創造右下區塊---------------------------
	var parent = document.getElementById("main");
	var div = document.createElement("div");
	div.setAttribute("id", "k96_plug");
	parent.appendChild(div);

	
	for(let n =0;n<3;n++){
		let div = document.createElement("div");
		div.setAttribute("id", "k96_plug_block_"+n);
		document.getElementById("k96_plug").appendChild(div);
		div = document.createElement("div");
	}
	
	var legendstory = [
		8,8,8,8,6,8,8,8,8,6,//s00048共49
		8,8,8,6,6,8,8,6,6,8,
		6,6,6,6,8,8,8,6,5,6,
		6,6,6,6,6,6,6,6,6,6,
		6,6,6,6,6,6,6,8,1
	];	
	var true_legendstory = [
		1,6,6,6,6,6,6,6,6,6,//s13018共19
		6,6,6,6,6,6,6,6,6
	];
	function numtostr(num){
		var parts = num.toString().split('.');
		parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',');
		return parts.join('.');
	}
	
	function addObserverIfDesiredNodeAvailable(flag,set_mode){
		if(!animationOFF){
			let composeBox=[];
			if(set_mode == "enemy"){
				composeBox = [document.getElementsByClassName("c06")[flag],document.getElementsByClassName("c10")[flag],document.getElementsByClassName("c11")[flag]];
			}
			else if(set_mode == "unit"){
				composeBox = [document.getElementsByClassName("R")[14*flag],document.getElementsByClassName("R")[14*flag+4],document.getElementsByClassName("R")[14*flag+8]];
			}
			if(!composeBox[0] && !composeBox[1] && !composeBox[2]) {
				window.setTimeout(addObserverIfDesiredNodeAvailable,500);
				return;
			}
			for(let i=0;i<3;i++){
				mutationObserver.observe(composeBox[i], {
					characterData: true,
					childList: true,
					subtree: true
				});
			}
		}

	}
	var mutationObserver = new MutationObserver(function(mutations) {
		mutations.forEach(function(mutation) {
			mutation.target.classList.remove('fade');
			void mutation.target.offsetWidth; // restart css animation
			mutation.target.classList.add('fade');
		});
	});
	
	
	
	function unitLV(getLv){
		$('#allLv').trigger('click');
		$('#allLv').children().val(getLv);
		$('#allLv').children().trigger('blur');
		$('#allLv').children().trigger('blur');
	}
	
	function setCrystal(getnumber,mode,list){
		addObserverIfDesiredNodeAvailable(list-1,"enemy");
		let crystal_type = [
			["takaraB","takaraR"],
			["takaraG","takaraY","takaraO","takaraL","takaraP"]
			];
		for(i = 0;i<crystal_type[mode].length;i++){
			$('#'+crystal_type[mode][i]).trigger('click');
			$('#'+crystal_type[mode][i]).children().val(getnumber);
			$('#'+crystal_type[mode][i]).children().trigger('blur');
			$('#'+crystal_type[mode][i]).children().trigger('blur');
		}
	}
	
	function isAlien(flag){
		let isAlien = 0;
		let 敵人屬性 = document.getElementsByClassName("c01")[flag].getElementsByTagName("a");
		for(i =0;i<敵人屬性.length;i++){
			if(敵人屬性[i].innerText == "エイリアン"){
				isAlien = 1;
				if(isAlien && (i+1)!=敵人屬性.length){
					if(敵人屬性[i+1].innerText == "スター"){
						isAlien = 2;
					}
				}
				break;
			}
		}
		return isAlien;
	}
	
	function change_Enemies(){
		let numberOfEnemy = document.getElementsByClassName("c06").length;
		for(let flag=0;flag<numberOfEnemy;flag++){
			if(isAlien(flag) == 1){
				if(default_crystal != 300){
					setCrystal(default_crystal,0,flag+1);
				}
			}
			else if(isAlien(flag) == 2){
				if(default_crystal_stat != 300){
					setCrystal(default_crystal_stat,1,flag+1);
				}
			}
		}
	}
	
	if(連結陣列[1]=="stage" && 連結陣列[2] !== ""){
		let stage_string = /[a-z0-9]+/.exec(連結陣列[2]);
		let now_stage_str = 連結陣列[2].substring(1+stage_string[0].length,3+stage_string[0].length);
		let now_stage = parseInt(now_stage_str,10);
		let previous_stage = now_stage<=10 ? "0"+(now_stage-1) : now_stage-1;
		let next_stage = now_stage<=8 ? "0"+(now_stage+1) : now_stage+1;
		let link_head = "<a href=\"https://battlecats-db.com/stage/"+stage_string[0];
		let link_end = 連結陣列[2].split('.');
		let stop = 0;
		let stage_count = 0;
		let stage_number_plus = [
			//イベントステージ
			"s01069",2,"s01111",2,"s01112",2,"s01114",2,"s01120",2,
			"s01127",3,"s01161",4,"s01190",2,"s01208",2,"s01210",3,
			"s01211",3,"s01212",3,"s01213",3,"s07000",40,
			//シーズンイベントステージ
			"s01154",3,"s01060",3,"s01160",5,"s01072",6,"s01164",5,
			"s01081",5,"s01174",6,"s01115",6,"s01125",5,"s01129",6,
			"s01140",5,"s01149",5,
			//月間イベントステージ
			"s01011",8,"s01083",2,"s01184",5,"s01012",8,"s01084",2,
			"s01186",5,"s01013",8,"s01085",2,"s01192",5,"s01026",8,
			"s01086",2,"s01194",5,"s01029",8,"s01087",2,"s01197",5,
			"s01030",8,"s01088",2,"s01165",5,"s01031",8,"s01089",2,
			"s01166",5,"s01032",8,"s01090",2,"s01167",5,"s01036",8,
			"s01091",2,"s01168",5,"s01038",8,"s01092",2,"s01170",5,
			"s01009",6,"s01093",2,"s01171",5,"s01010",8,"s01094",2,
			"s01175",5
		];
		//如果是日本、未來、宇宙
		if(連結陣列[2].substring(0,5) == 's0300'){
			stage_count=48;
		}//如果是傳說
		else if(連結陣列[2].substring(0,4) == 's000'){
			stage_count = legendstory[parseInt(連結陣列[2].substring(4,6),10)];
		}//如果是真傳說
		else if(連結陣列[2].substring(0,4) == 's130'){
			stage_count = true_legendstory[parseInt(連結陣列[2].substring(4,6),10)];
		}
		else{
			for(i=0;i<stage_number_plus.length;i+=2){
				if(stage_string == stage_number_plus[i]){
					stage_count = stage_number_plus[i+1];
				}
			}
		}
		
		if(link_end[0] == stage_string+"-"+now_stage_str){
			link_end = "."+link_end[1]+"\">";
		}
		else if(link_end[0] == stage_string+"-"+now_stage_str+"_enemy"){
			link_end = link_end[0].substring(stage_string[0].length+3,link_end[0].length)+"."+link_end[1]+"\">";
			change_Enemies();
			if(!stage_count){
				stop = 1;
			}
		}
		
		if(!isNaN(now_stage)){
			//---------------------------上一頁按鈕---------------------------
			if(now_stage == 1){
				document.getElementById("k96_plug_block_0").innerText = "無";
			}
			else{
				document.getElementById("k96_plug_block_0").innerHTML = link_head+"-"+previous_stage+link_end+"前一關 "+previous_stage+"</a>";
			}
			//---------------------------下面為下一頁按鈕---------------------------
			if(now_stage == stage_count || (document.getElementsByClassName("chars").item(1).src == "https://battlecats-db.imgs-server.com/i105.png") || stop){
				document.getElementById("k96_plug_block_2").innerText = stop?"不支援":"無";
			}
			else{
				document.getElementById("k96_plug_block_2").innerHTML = link_head+"-"+next_stage+link_end+"下一關 "+next_stage+"</a>";				
			}
			document.getElementById("k96_plug_block_1").innerText = now_stage+" / "+(stage_count===0?"unknown":stage_count);
		}
	}
	else if(連結陣列[1]=="unit"){
		if(Number(連結陣列[2].substring(0,3))){
			for(let i=0;i<document.getElementsByClassName("c08").length;i++){
				addObserverIfDesiredNodeAvailable(i,"unit");
			}
			var k96_plug_block_0 = document.querySelector ("#k96_plug_block_0");
			var k96_plug_block_1 = document.querySelector ("#k96_plug_block_1");
			var k96_plug_block_2 = document.querySelector ("#k96_plug_block_2");
			
			if (k96_plug_block_0 && k96_plug_block_1 && k96_plug_block_2) {
				document.getElementById("k96_plug_block_0").innerText = "30";
				document.getElementById("k96_plug_block_1").innerText = "40";
				document.getElementById("k96_plug_block_2").innerText = "50";
				k96_plug_block_0.addEventListener ("click", function(){ unitLV(30);} , false);
				k96_plug_block_1.addEventListener ("click", function(){ unitLV(40);} , false);
				k96_plug_block_2.addEventListener ("click", function(){ unitLV(50);} , false);
			}
		}
	}
	else if(連結陣列[1]=="enemy"){
		if(Number(連結陣列[2].substring(0,3))){
			if(isAlien(0) == 1){
				if(default_crystal != 300){
					setCrystal(default_crystal,0,1);
				}				
				let k96_plug_block_0 = document.querySelector("#k96_plug_block_0");
				let k96_plug_block_1 = document.querySelector("#k96_plug_block_1");
				let k96_plug_block_2 = document.querySelector("#k96_plug_block_2");
				if (k96_plug_block_0 && k96_plug_block_1 && k96_plug_block_2) {
					document.getElementById("k96_plug_block_0").innerText = "100%水晶";
					document.getElementById("k96_plug_block_1").innerText = "200%水晶";
					document.getElementById("k96_plug_block_2").innerText = "300%水晶";
					k96_plug_block_0.addEventListener("click", function(){ setCrystal(100,0,1);});
					k96_plug_block_1.addEventListener("click", function(){ setCrystal(200,0,1);});
					k96_plug_block_2.addEventListener("click", function(){ setCrystal(300,0,1);});
				}
			}
			else if(isAlien(0) == 2){
				if(default_crystal_stat != 300){
					setCrystal(default_crystal_stat,1,1);
				}
				let k96_plug_block_0 = document.querySelector("#k96_plug_block_0");
				let k96_plug_block_1 = document.querySelector("#k96_plug_block_1");
				let k96_plug_block_2 = document.querySelector("#k96_plug_block_2");
				if (k96_plug_block_0 && k96_plug_block_1 && k96_plug_block_2) {
					document.getElementById("k96_plug_block_0").innerText = "100%水晶";
					document.getElementById("k96_plug_block_1").innerText = "200%水晶";
					document.getElementById("k96_plug_block_2").innerText = "300%水晶";
					k96_plug_block_0.addEventListener("click", function(){ setCrystal(100,1,1);});
					k96_plug_block_1.addEventListener("click", function(){ setCrystal(200,1,1);});
					k96_plug_block_2.addEventListener("click", function(){ setCrystal(300,1,1);});
				}
			}
		}
	}
	

	
})();