Skip to content

Instantly share code, notes, and snippets.

@vkgtaro
Forked from puyo-sh/3gokushi-TroopTool.user.js
Last active January 20, 2017 01:16
Show Gist options
  • Save vkgtaro/ee208f548590b66019ca1beb3e896a72 to your computer and use it in GitHub Desktop.
Save vkgtaro/ee208f548590b66019ca1beb3e896a72 to your computer and use it in GitHub Desktop.
ブラウザ三国志 簡易出兵ツール
// ==UserScript==
// @name 3gokushi-TroopTool
// @namespace https://gist.github.com/vkgtaro/ee208f548590b66019ca1beb3e896a72
// @description ブラウザ三国志 出兵ツール
// @include http://*.3gokushi.jp/*
// @exclude http://info.3gokushi.jp/*
// @version 1.4
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js
// @require http://ajax.microsoft.com/ajax/jquery.templates/beta1/jquery.tmpl.js
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_deleteValue
// ==/UserScript==
// ver 0.1 α版
// 選択中の拠点にセットされている武将を出兵先で指定した座標にすべて出兵する
// ただし、攻撃の基礎値が3000以上とする
// ver 1.0
// テキスト入力による登録を廃止。領地画面から登録/解除できるように。
// ver 1.1
// 援軍も可能に。攻撃と違い制限は無し。
// ver 1.2
// g1-t MAP対応
// ver 1.3
// 出兵画面仕様が変わったことで援軍できなくなっていた為、突貫修正。
// ver 1.4
// オリジナルから fork。出兵先複数変えられるように修正。
j$ = jQuery.noConflict(true);
(function ($){
// Chrome用GM_関数 ---------------------------------------------------------------------------------
// @copyright 2009, James Campos
// @license cc-by-3.0; http://creativecommons.org/licenses/by/3.0/
if ((typeof GM_getValue == 'undefined') || (GM_getValue('a', 'b') == undefined)) {
GM_addStyle = function(css) {
var style = document.createElement('style');
style.textContent = css;
document.getElementsByTagName('head')[0].appendChild(style);
};
GM_deleteValue = function(name) {
localStorage.removeItem(name);
};
GM_getValue = function(name, defaultValue) {
var value = localStorage.getItem(name);
if (!value)
return defaultValue;
var type = value[0];
value = value.substring(1);
switch (type) {
case 'b':
return value == 'true';
case 'n':
return Number(value);
default:
return value;
}
};
GM_log = function(message) {
if (window.opera) {
opera.postError(message);
return;
}
console.log(message);
};
GM_registerMenuCommand = function(name, funk) {
//todo
};
GM_setValue = function(name, value) {
value = (typeof value)[0] + value;
localStorage.setItem(name, value);
};
}
// サーバー名の取得(localstorageのkeyに利用)
var serverName = location.hostname.split(".")[0];
// 出兵先リストを取得 ---------------------------------------------------------------------------------
function getTroopXYFromStorage() {
var troopXY = GM_getValue(serverName + "_TROOP_XY", "");
if (troopXY) {
return JSON.parse(troopXY).list;
}
else {
return false;
}
}
// 出兵先リストを格納 ---------------------------------------------------------------------------------
function setTroopXYToStorage(troopXY) {
GM_setValue(serverName + "_TROOP_XY", JSON.stringify({ "list": troopXY }));
}
// 出兵先リストを格納 ---------------------------------------------------------------------------------
function setCurrentLandToStorage(currentLand) {
var troopXY = getTroopXYFromStorage();
if ( ! $.isArray(troopXY) ) {
setTroopXYToStorage([currentLand]);
} else if ( troopXY.indexOf(currentLand) == -1 ) {
troopXY.push(currentLand);
setTroopXYToStorage(troopXY);
}
}
// 出兵先リストから除外 ---------------------------------------------------------------------------------
function removeCurrentLandFromStorage(currentLand) {
var troopXY = getTroopXYFromStorage();
if ( ! $.isArray(troopXY) ) {
return false;
}
var new_troopXY = [];
for (var i = 0; i < troopXY.length; i++ ) {
if ( troopXY[i] == currentLand ) {
continue;
}
else {
new_troopXY.push(troopXY[i]);
}
}
setTroopXYToStorage(new_troopXY);
}
// 出兵ボックスを生成 ---------------------------------------------------------------------------------
function makeTroopBox(param){
var param = { "troopXY": '' };
var troopXYs = getTroopXYFromStorage();
if ( ! $.isArray(troopXYs) ) {
param.troopXY = '<span style="color:#FF0000">未設定</span>';
}
else {
for ( var i = 0; i < troopXYs.length; i++ ) {
var xy_obj = troopXYs[i].match(/([\-0-9]{1,4}),([\-0-9]{1,4})/);
var xy = xy_obj[1]+'-'+xy_obj[2];
param.troopXY += '<a href="/land.php?x='+xy_obj[1]+'&y='+xy_obj[2]+'">'+troopXYs[i]+'</a>'
+ '<div id="troop_run-'+i+'" class="troop_run_message"></div>'
+ ' <a class="troop_run" href="javascript:void(0)" data-code="'+i+'-302-'+xy+'">討伐</a> '
+ '<a class="troop_run" href="javascript:void(0)" data-code="'+i+'-301-'+xy+'">援軍</a>';
}
}
var troop_html = (function(param){/*
<li>
<div id="troopBox" class="clerfix">
{{html troopXY}}
</div>
<style>
<!--
#troopBox{
font-size:0.8em;
padding:5px;
top:0;left:0;
background-color:#000000;
border:1px solid #FFFFFF;
}
#troop_xy{
width: 90%;
}
.troop_run_message{
padding:2px 5px 0 5px;
margin-bottom:5px;
color:#FFFFFF;
}
.troop_run{
padding:2px 5px 0 5px;
color:#000000;
text-decoration:none;
pointer:curor;
background-color:#FFFFFF;
}
-->
</style>
</li>
*/}).toString().replace(/(\n)/g, '').split('*')[1];
var html = $.tmpl(troop_html,param) || '';
var $target = $("#sidebar > ul:first-child");
$target.css("position","relative");
$target.append(html);
// 出兵ボタンEvent
$(".troop_run").off("click").on("click",function(){
var data_codes = $(this).attr("data-code").match(/^(\d+)-(\d+)-(\d+)-(\d+)$/);
if( !$.isArray(data_codes) ){
alert("出兵先が未設定です");
return false;
}
var troop_run_id = "#troop_run-"+data_codes[1];
var troopCode = parseInt(data_codes[2]);
var troop_x = parseInt(data_codes[3]);
var troop_y = parseInt(data_codes[4]);
$(troop_run_id).html('出兵開始');
// 設定中のXY座標を取得する
if(!(troop_x >= -800 && troop_x <= 800 && troop_y >= -800 && troop_y <= 800)){
$(troop_run_id).html('出兵');
alert("出兵先座標の値が不正です");
return false;
}
var card_nos = [];
var troopDatas = [];
// 出兵画面の情報を取得する
var onePageData = getTroopPageData(troop_x,troop_y,card_nos,troopCode);
onePageData.then(
function(){
// 出兵実行
if(card_nos.length > 0){
$(card_nos).each(function(index,value){
var unit_assign_card_id = value;
var oneTroopData = troopRun(unit_assign_card_id,troop_x,troop_y,troopCode);
troopDatas.push(oneTroopData);
});
$.when.apply($,troopDatas).then(
function(){
location.href="/facility/unit_status.php";
}
);
}else{
$("#troop_run").html('出兵');
alert("出兵可能な武将が存在しません");
return false;
}
},function(){
}
);
});
// 出兵画面のデータを取得する
function getTroopPageData(x,y,card_nos,troopCode){
var d = new $.Deferred;
$.ajax({
type: 'get',
url: '/facility/castle_send_troop.php?x='+x+'&y='+y,
dataType: 'html',
}).then(
function(data){
// $(data).find(".bushoList > table").each(function(){
$(data).find(".bushoList > table:not(:first)").each(function(){
var busho_data = $(this).find("tr").eq(1).find("td").eq(1).html();
var reg_busho_data = busho_data.match(/[-]?[0-9]+(\.[0-9]+)?/g);
// [2]:カードID [3]:討伐ゲージ
var busho_status = $(this).find("tr").eq(1).find("td").eq(2).html();
var reg_busho_status = busho_status.match(/[-]?[0-9]+(\.[0-9]+)?/g);
// [0]:LV [1]:HP [2]:攻撃 [4]:速度
if(troopCode == 302){
// 出兵条件(攻撃3000以上とする)
if(parseInt(reg_busho_status[2]) >= 3000){
if($.inArray(reg_busho_status[2], card_nos) == '-1'){
card_nos.push(parseInt(reg_busho_data[2]));
}
}
}else{
card_nos.push(parseInt(reg_busho_data[2]));
}
});
d.resolve(data);
},function(data){
d.reject();
}
);
return d.promise();
}
// 出兵処理
function troopRun(unit_assign_card_id,x,y,code){
var d = new $.Deferred;
var params = {};
params["village_x_value"] = x;
params["village_y_value"] = y;
params["village_name"] = "";
params["unit_assign_card_id"] = unit_assign_card_id;
params["radio_move_type"] = code; // 301:援軍 302:賊討伐 303:強襲
params["radio_reserve_type"] = 0;
params["card_id"] = 204;
params["btn_send"] = "出兵";
$.ajax({
type: 'post',
url: '/facility/castle_send_troop.php',
data: params,
}).then(
function(data){
d.resolve(data);
},function(data){
d.reject();
}
);
return d.promise();
}
}
// 領地登録ボックスを生成 ---------------------------------------------------------------------------------
function makeLandSaveBox(param){
var tmpCurrentLand = $("#basepoint .xy").text();
var regCurrentLand = tmpCurrentLand.match(/(\(.*\))/g);
var currentLand = regCurrentLand[0];
var troopXYs = getTroopXYFromStorage();
var param = {};
if ( $.isArray(troopXYs) && troopXYs.indexOf(currentLand) == 0 ) {
param.xy = currentLand;
} else {
param.xy = '未設定';
}
var troop_html = (function(param){/*
<div id="landDataBox">
出兵ツール 領地:<a class="save">[登録]</a> <a class="del">[解除]</a><br />
現在の設定値:<span class="troop_land_xy">${xy}</span>
</div>
<style>
<!--
#landDataBox{
width:200px;
padding:5px;
background-color:#FFFFFF;
border:1px solid #000000;
color:#333333;
}
#landDataBox a{
color:#0000DD;
cursor:pointer;
}
#landDataBox span{
color:#DD0000;
}
-->
</style>
*/}).toString().replace(/(\n)/g, '').split('*')[1];
var html = $.tmpl(troop_html,param) || '';
$("#tMenu_btnif").append(html);
// 登録無し 解除ボタンを非表示にする
if( troopXYs.indexOf(currentLand) == -1 ){
$("#landDataBox a.del").hide();
}
// 登録ボタンEvent
$("#landDataBox a.save").off("click").on("click",function(){
// localstorageにデータを保存
setCurrentLandToStorage(currentLand);
$("#landDataBox a.del").show();
$("#landDataBox .troop_land_xy").html(currentLand);
$("#troopBox").closest("li").remove();
makeTroopBox();
alert("「"+currentLand+"」を出兵先として登録しました");
});
// 解除ボタンEvent
$("#landDataBox a.del").off("click").on("click",function(){
// localstorageにデータを削除
removeCurrentLandFromStorage(currentLand);
$("#landDataBox .troop_land_xy").html("未設定");
$("#landDataBox a.del").hide();
$("#troopBox").closest("li").remove();
makeTroopBox();
alert("出兵先を解除しました");
});
}
// Run
makeTroopBox();
if (location.pathname == '/land.php') {
makeLandSaveBox();
}
})(j$);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment