ろむのシ的メモ+α

Web系のブラウザゲーのツールとか作ったりつくらなかったりしてます

beyondの対応とかとか

今回mixi鯖で大幅な変更があったので暫定的に対応したものをアップします
今回は修正点がちょっと多目なのと追加機能がちょっとあったりします
よければどうぞ
動作確認してるブラウザ
firefox:3.0.18-4.0
Google Chrome:10.0.648.151
Safari+NinjaKit:5.0.1+0.8

スクリプトの場所
https://github.com/romer/browser-3gokushi-beyond/raw/master/3gokushi-beyond.user.js


変更した機能(mixiの場合のみ挙動が変わります)

  • 小さいボタン機能(これmixiの場合あっても意味ないですよね)
  • 小さいボタン機能のヨロズミクボタン削除(小さいボタン機能をmixiから削除した為これも削除)
  • サイドボックスに表示されてたボックスを下に表示
  • ボックスをフローティングにした時に表示色を変更


追加した機能

  • 名声獲得タイマー機能(名声獲得までの時間をカウントダウンします)
  • 拠点援軍ボタン機能(仕様変更で現在動きません)
  • ブラ3タイマー格納機能(ブラ3タイマーをボックスに格納します)
  • 都市リスト表示機能(都市以外でも都市のリストを表示できるようになりましたこれはmixiのみでます)
  • ログ出力機能(アラートで出ていたメッセージやエラーをログBOXに出力するようにします)

追加予定のあるかもしれない機能

  • 945pxモードを作る機能


他にも不具合あればコメントもしくは@までお願いします


2010/09/22 追記
前回からの修正箇所

  • 拠点リンク機能の復活
  • 拠点援軍ボタン機能の復活
  • 資源タイマー等がずれる問題の修正
  • 次拠点の拠点作成可能数が変だった問題の修正
  • 移動時間表示機能を修正
  • 各施設を開くと正常に機能しない場合があるを修正


2010-09-23 追記

  • 資源合計が表示されるように変更
  • デッキの自動セットが出来るように変更
  • 破棄・建設のリストに追加されるように変更
  • 移動時間表示で遠征訓練所に対応
  • 同盟/君主表示で正常に表示されるように変更
  • 都市リスト機能追加(設定画面から設定する必要あり)
  • 都市リスト機能の修正


2010-09-24 追記

  • 都市リスト機能を使わない時に次拠点の拠点作成可能数が変だった問題の修正
  • 移動時間表示をするtooltipで正常に動かない問題の修正


2010-09-25 追記

  • 移動時間表示をするtooltipで正常に動かない問題の修正したつもり?


2010-09-26 追記

  • 次拠点の場所及び次の名声までの時間の場所の変更
  • 次の名声までの時間が0になったとき多分名声値がカウントアップするように変更
  • 拠点生産で工場、水車に対応したつもり
  • サイドボックスが完全に枠外にある時に自動で中にくるように変更


2010-09-29 追記

  • 小さいボタンの復活及びmixi以外のボタンへも対応
  • 異様にメモリを消費し続けていた不具合の修正
  • タイマーボタン格納機能のアイコンを元リンクに画像があった場合それを使うように変更
  • 完了時刻の表示が正常に動作していなかった不具合の修正
  • フローティング時にドラッグアンドドロップが出来ない場合がある問題の修正
  • 建設完了時間やユニット作成完了時間がNaNになる不具合を修正
  • ユニット作成完了時間がNaNになる不具合を再修正
  • mixiの仕様変更に対応


2010-10-02 追記

  • フローティング時にドラッグアンドドロップが出来ない場合がある問題の再修正
  • その他フローティング時の挙動を若干変更
  • 次の名声値取得部分を若干変更


2010-10-03 追記

  • 特定時間、特定座標等の時にのみ起こる不具合を修正


2010-10-07 追記

  • 複数建設予定がある場合に最終時間が違う不具合を修正
  • cookieが使えない場合に対応
  • CSVが若干変だったのでその修正


2010-10-12 16:46追記

  • 建設/破棄リストからMAPに飛べない不具合の修正
  • 暫定的にヤフモバに対応(ただし確認できないためなんとも言えません)

2011-04-18 21:43追記

  • 51x51の時にマップでツールチップを表示しないように変更
  • 20x20の時のMap中央表示でアイコンの位置が上に若干ずれてた問題を修正
  • 建設/破棄一覧での地図に表示で正常に表示出来ていなかった不具合を修正
  • 地形一覧での正常に取得出来ていなかった不具合を修正
  • 出兵マップ表示での地図に表示で正常に表示出来ていなかった不具合を修正

2011-04-29 19:39追記

  • 既存機能でmapに関する機能を可能な限り51x51マップに対応させた
  • ログ出力BOX機能を追加。建築・破棄完了時のメッセージ等をログBOXに出力するようにした。(時間をマイナス指定するとログが即削除されます。)

2011-04-30 17:13追記

  • デッキセット先自動選択機能をauto pager系スクリプトが動いてても設定できるようにした。(但し最新のSITEINFOを使用する必要あり。普通は自動でしてくれてると思います。)
  • 51x51mapでOperaに表示不具合?があるようなのでその対応を追加(Opera版だけとかはめんどくさいので全てです)
  • ログ出力BOX機能で時間やサイズ等を設定出来ない不具合を修正。

localStorageと XPCNativeWrapper

今GM関数のラッパとか作ってて色々試してた時になぜか

var len = localStorage.length;

が使えなかった・・・
consoleには"Component is not available"と出ており
length自体もreadOnlyだけどwebStorageの仕様にあるものでInterfaceにも書かれてるから
なんら変なことしてないのになーと思ってました

で、localStorageをGM_logでconsoleに出したら
[object XPCNativeWrapper [object Storage]]
と出てました
で、とりあえずラッピングされてないものを試してみる事に・・・

var len = localStorage.wrappedJSObject.length;

今度は普通に通った・・・

何故本来元からあるはずのlengthがラッピングで使えなくなるのでしょうか・・・
正直謎です

1行でのブラウザ判断について

Detecting browsers javascript hacks
この記事にある1行でのブラウザ判断を現時点での最新のものでテストしてみました
テストしたのは以下の5つ
Firefox3.6.8、Google Chrome5.0.375.127、Opera10.61、Safari5.0.1、IETester0.4.4のIE5.5と6

まずはFirefoxで下記を実行。共にfalseに。

//Firefox detector 2/3 by DoctorDan
FF=/a/[-1]=='a'

//Firefox 3 by me:-
FF3=(function x(){})[-5]=='x'

次にsafariで下記を実行。これはOKだった。

//Safari detector by me
Saf=/a/.__proto__=='//'

次にGoogle Chrome。これもNG。

//Chrome by me
Chr=/source/.test((/a/.toString+''))

そしてOpera。これもNG。

//Opera by me
Op=/^function \(/.test([].sort)

最後にIE6。これはIE5.5も引っかかった。

//IE6 detector using conditionals
try {IE6=@cc_on @_jscript_version <= 5.7&&@_jscript_build<10000} catch(e){IE6=false;}

NGが多くて結局userAgentからの判断にしたけど
こんな感じでそれぞれのブラウザ判断できる良い方法ないかな・・・

beyondが更新されないので・・・

建設中施設の点滅と出兵時刻計算が使えなくなったのを修正する何かです。

自分で修正してください。
出兵時刻計算の修正
5072行目を

    var tim = td.textContent.match(/到着まで: (\d+):(\d+):(\d+) 到達時間/);

から

    var tim = td.textContent.match(/到着まで[:|:][\s| ]*(\d+):(\d+):(\d+)[\s| ]*到達時間/);

建設中施設の点滅の修正
6480行目を

    var xpath = '//*[@id=\"actionLog\"]/ul/li/span[@class=\"buildStatus\" and starts-with(text(),\"建設\")]/a';

から

    var xpath = 'id("actionLog")//li/span[@class="buildStatus" and contains(.,"建設")]/a';

これだけで動くようになると思います。


2010/07/23追記
出兵表示機能の修正
5322行目を

    var xy = tds[i+0].innerHTML.match(/((-?\d+),(-?\d+))$/);

から

    var xy = tds[i+0].innerHTML.match(/[\(|(](-?\d+),(-?\d+)[)|\)]$/);


2010/07/24追記
新施設への対応?
1250行目付近の

    var cost_mura=[
        [400, 136, 104, 160],
        [936, 319, 243, 374],
        [1685, 573, 438, 673],
        [2467, 1357, 1110, 1233],
        [4194, 2307, 1887, 2097],
        [7191, 3954, 3236, 3596],
        [11505, 6327, 5177, 5753],
        [18776, 13560, 10430, 9387],
        [33912, 24492, 18839, 16956],
        [61043, 44087, 33914, 30523],
        [106495, 85196, 66939, 45640],
        [190570, 152456, 119786, 81672],
        [340166, 272133, 213820, 145786],
        [505021, 456148, 423566, 244365],
        [844765, 763014, 708513, 408756]
    ];

の後に

    var cost_mihari = [
        [600,840,600,360],
        [960,1344,960,576],
        [1536,2150,1536,922],
        [2458,3441,2458,1475],
        [3932,5505,3932,2359],
        [6291,8808,6291,3775],
        [9437,13212,9437,5662],
        [14156,19818,14156,8493],
        [21233,29727,21233,12740],
        [31850,44590,31850,19110],
        [44590,62426,44590,26754],
        [62426,87396,62426,37456],
        [87397,122355,87397,52438],
        [122355,171297,122355,73413],
        [159062,222686,159062,95437],
        [206780,289492,206780,124068],
        [0,0,0,0],
        [0,0,0,0],
        [0,0,0,0],
        [0,0,0,0]
    ];
    var cost_daisyukusya = [
        [200,114,200,438],
        [320,183,320,701],
        [512,293,512,1121],
        [768,439,768,1682],
        [1152,658,1152,2523],
        [1728,987,1728,3784],
        [2419,1382,2419,5298],
        [3387,1935,3387,7418],
        [4741,2709,4741,10385],
        [6637,3793,6637,14538],
        [8628,4930,8628,18900],
        [11217,6409,11217,24570],
        [14582,8332,14582,31941],
        [18956,11735,18956,40620],
        [25817,16429,25817,49286],
        [32271,22003,32271,60141],
        [42172,29337,42172,69675],
        [52715,38963,52715,84803],
        [66009,49506,66009,93512],
        [79211,62708,79211,108914]
    ];
    var cost_enseikunren = [
        [2884,4486,5977,2723],
        [4614,7177,9484,4357],
        [7382,11483,15174,6972],
        [11811,18373,24279,11155],
        [18898,29397,38846,17848],
        [28347,44096,58269,26772],
        [42521,66143,87404,40158],
        [63781,99215,131105,60238],
        [0,0,0,0],
        [0,0,0,0]
    ];
    var cost_syuugyousyo = [
        [1600,1200,600,600],
        [2240,1680,840,840],
        [3136,2352,1176,1176],
        [4390,3293,1646,1646],
        [6146,4610,2305,2305],
        [8605,6454,3227,3227],
        [11186,8390,4195,4195],
        [14542,10907,5453,5453],
        [18905,14179,7089,7089],
        [24577,18433,9216,9216],
        [31950,23963,11981,11981],
        [38340,28755,14378,14378],
        [46008,34506,17253,17253],
        [55210,41407,20704,20704],
        [66252,49689,24844,24844],
        [72877,54658,27329,27329],
        [80164,60123,30062,30062],
        [88181,66136,33068,33068],
        [96999,72749,36375,36375],
        [106699,80024,40012,40012]
    ];

を追加
さらにその下の

    costs["村"] = cost_mura;

の下あたりに

    costs["見張り台"] = cost_mihari;
    costs["大宿舎"] = cost_daisyukusya;
    costs["遠征訓練所"] = cost_enseikunren;
    costs["修行所"] = cost_syuugyousyo;

を追加で新施設も反映されるようになります。
因みに見張り台の17-20と遠征訓練所の9-10はwikiに情報が無いのでコスト0になってます。


2010/8/1追記
遠征訓練所を立ててる時に出兵tooltipが変になる修正
新施設への対応を含まない時の行数で書きます。
4286行目の

        var map = $("mapOverlayMap");
        if( map ) {
            var lv = map.innerHTML.match(/訓練所 LV.([0-9]+)/);

から

        var map = $x('//area[starts-with(@alt, "訓練所")]');
        if( map ) {
            var lv = map.alt.match(/LV.([0-9]+)/);



他の機能でもあればどうぞ。暇なら見てみます。

とりあえずまたMapStar対応させときました。

元々公開されていたサイトが閉鎖?されてるようなので
一応DLできるようにもしておきました。

Firefox版インストール


Chromeの対応ですが、暫定的な対応になっておりますが、
Chrome版という形でアップしておきした。

Chrome版インストール


要望?っぽい物とかはやろうと思ってはいるのですが
いかんせん面d(ry


あ、忘れてました・・・
一部?の方向け情報として今回の変更で描画されるboxに
idをmapStar_*(数字)という形で付けてます。
数字は上から左へ増加していきます。
styleのvisibilityにhiddenでも付けてあげてください。

修正版の対応させたやつ。

こっちへ移動しました
http://be4you.jp/tuck/で公開されているMap-Starを新仕様に対応させました。

色消しすると毎回リロードという仕様がちょっと気になったので、
大幅?に書き換えてみた。
今回は変更箇所が多い為とりあえず全部記載します。
今回もIEは未対応。

// ==UserScript==
// @name           3gokushi-MapStar
// @namespace      3gokushi
// @description    ブラウザ三国志のマップに★の数を表示します。
// @include        http://*.3gokushi.jp/map.php*
// ==/UserScript==

window.addEventListener("load",function() {

    GM_VAL_PREFIX = "GMMS_";

    /**
     * 設定データ初期化
     */
    var dataTable = new Array();
    dataTable["w"] = new Array("#FFFFFF", "#000000", GM_getValue(GM_VAL_PREFIX
            + "w", true)); // white
    dataTable["r"] = new Array("#FF0000", "#FFFFFF", GM_getValue(GM_VAL_PREFIX
            + "r", true)); // red
    dataTable["g"] = new Array("#00FF00", "#000000", GM_getValue(GM_VAL_PREFIX
            + "g", true)); // green
    dataTable["b"] = new Array("#0000FF", "#FFFFFF", GM_getValue(GM_VAL_PREFIX
            + "b", true)); // blue
    dataTable["y"] = new Array("#FFFF00", "#000000", GM_getValue(GM_VAL_PREFIX
            + "y", true)); // yellow
    dataTable["p"] = new Array("#FF00FF", "#FFFFFF", GM_getValue(GM_VAL_PREFIX
            + "p", true)); // pink
    dataTable["bk"] = new Array("#000000", "#FFFFFF", GM_getValue(GM_VAL_PREFIX
            + "bk", true)); // black

    /**
     * 設定on/off処理関数
     */
    function onSettingClick() {
        var key = this.getAttribute("type");
        var gmv = GM_getValue(GM_VAL_PREFIX + key, true);
        GM_setValue(GM_VAL_PREFIX + key, !gmv);

        var clsName;
        var displayVal;
        if (gmv) {
            clsName = "off";
            visibleVal = "hidden";
        } else {
            clsName = "on";
            visibleVal = "visible";
        }

        var XPath = '//div[@class="mapStar_' + key + '"]';
        var list = document.evaluate(XPath, document, null,
                XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);

        for ( var i = 0; i < list.snapshotLength; i++) {
            list.snapshotItem(i).style.visibility = visibleVal;
        }

        XPath = '//div[@type="' + key + '"]';
        document.evaluate(XPath, document, null,
                XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.firstChild.className = "outer "
                + clsName;

    }

    /**
     * 設定ボックスの挿入
     */
    var insset = document.getElementById('mapboxInner');

    if (insset != null) {

        var html = "\
                 <style>\
                 .outer{ width:10px;height:10px;margin:2px 4px 2px 0px;float:left;border:1px solid #000000;cursor:pointer; }\
                 .on{ filter:alpha(opacity=100);-moz-opacity:1;opacity:1; }\
                 .off{ filter:alpha(opacity=30);-moz-opacity:0.3;opacity:0.3;border:1px solid #999999; }\
                 </style>\
                 <div style='background-color:#ffffff;'> </div>";

        var set = document.createElement('div');
        set.innerHTML = html;
        insset.appendChild(set);

        for ( var key in dataTable) {
            var onoff = dataTable[key][2] ? "on" : "off";
            html = '<div class="outer ' + onoff + '" style="background-color:'
                    + dataTable[key][0] + ' ;"> </div>';

            var setItem = document.createElement('div');
            setItem.innerHTML = html;
            set.appendChild(setItem);
            setItem.setAttribute("type", key);
            setItem.addEventListener("click", onSettingClick, false);
        }
    }

    /**
     * MAPサイズ取得
     */
    var mapSize = document.getElementById('rollover').style.zIndex - 1;

    /**
     * 地図データの取得
     */
    var mapMap = new Array(mapSize + 1);
    var mapAreaDoc = document.getElementById('mapsAll');
    var imgRegCmp = new RegExp(/img\/panel\/[^_]*_([^_]*)_/);

    var imgMap = mapAreaDoc.getElementsByTagName('img');
    for ( var i = 0; i < imgMap.length; i++) {
        var clstxt = imgMap[i].className;
        if ((clstxt != null) && (clstxt.search(/mapAll(\d+)/) != -1)) {
            var mapIndex = RegExp.$1 - 0;
            var imgSrc = imgMap[i].src;
            if (imgRegCmp.exec(imgSrc)) {
                mapMap[mapIndex] = RegExp.$1;
            } else if (0 <= imgSrc.indexOf("blanc")) {
                mapMap[mapIndex] = "wall";
            }
        }
    }

    /**
     * 地図へ埋め込み
     *
     */
    var areas = mapAreaDoc.getElementsByTagName('area');

    // mapSizeからzIndexの値とmarginSizeを決定する
    var marginSize = "32px 0px 0px 23px";
    var zIndex = mapSize + 2;
    if (200 < zIndex && zIndex < 400) {
        marginSize = "25px 0px 0px 17px";
    } else if (400 <= zIndex) {
        marginSize = "16px 0px 0px 12px";
    }

    var regCmp = new RegExp(
            /(\'[^\']*\'[^\']*){5}\'(\u2605+)\'.*overOperation\(\'.*\'.*\'(.*)\'.*\'(.*)\'/);
    var j = 0;

    var alpha = 6;
    for ( var i = 1; i < mapMap.length; i++) {
        if (mapMap[i] != undefined && mapMap[i] == "wall") {
            continue;
        }

        if (areas[j] == undefined) {
            break;
        }
        var mo = areas[j++].getAttribute('onmouseover');
        if (mo.search(/\u2605/) < 0) {
            continue;
        }

        if (regCmp.test(mo)) {
            var dataKey = (mapMap[i] == undefined) ? "w" : mapMap[i];
            var bg = dataTable[dataKey][0];
            var cl = dataTable[dataKey][1];

            var div = document.createElement('div');
            if (!dataTable[dataKey][2]) {
                div.style.visibility = "hidden";
            }

            if (bg != null) {
                div.style.backgroundColor = bg;
            }

            if (cl != null) {
                div.style.color = cl;
            }

            div.className = "mapStar_" + dataKey;
            div.style.left = RegExp.$3;
            div.style.top = RegExp.$4;
            div.style.position = "absolute";
            div.style.width = "8px";
            div.style.height = "8px";
            div.style.margin = marginSize;
            div.style.padding = "0px 0px 2px 3px";
            div.style.zIndex = zIndex;
            div.style.fontSize = "8px";
            div.innerHTML = RegExp.$2.length;

            if (RegExp.$2.length >= 5) {
                div.style.border = "1px solid";
            }
            if (RegExp.$2.length >= 3) {
                div.style.fontWeight = "bold";
            }

            div.style.filter = 'alpha(opacity=' + (alpha * 10) + ')';
            div.style.MozOpacity = alpha / 10;
            div.style.opacity = alpha / 10;

            mapAreaDoc.appendChild(div);
        }
    }
},false);


追記
元々のプログラムにもあったのですが・・・
壁がある所では正常に表示されないというバグがあります。
明日ぐらいまでには対応しようかと。
10/02/02 13:25
対応しました。

さらに追記。
10/02/02 16:25
名前や領地名に★が含まれて居た場合正常に表示されない問題を修正。

10/02/08 13:16
実行タイミングをずらしました。