ろむのシ的メモ+α

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

Opera用Beyondを作ってみた

基本的に中身は同じ
けど若干動作を同じ仕様にするために若干違う・・・
ということで別ファイルとして公開します
まぁどれほどOpera使いの人が居るかはわかりませんが・・・

動作確認したバージョン
Opera:11.10

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


Operaの場合インストールというものは無く
ダウンロードして各自が設定したUserscriptのフォルダに配置してやる必要があります

設定する場所は
設定→詳細設定→コンテンツ→JavaScriptオプション→ユーザーJavaScriptフォルダ
から設定できます

あとOpera版のバグはこちらへお願いします
現時点で動かないと確認不具合

  • 特になし

2010-10-12 17:36更新

2011-04-18 21:43追記

2011-04-20 21:03追記
今回の修正でほぼ全面的に機能するはず。

  • 君主★情報表示機能でのGETを押しても取得が出来ない不具合を修正
  • 領地レベル表示機能でのGETを押しても取得が出来ない不具合を修正

配列初期化時の挙動と「localStorageとXPCNativeWrapper」のその後

まず配列の方から。
配列の初期化で複数個の宣言をした時に挙動が思いがけないものだった。
以下が試したコード

var array = [,,,];
alert(array.length);

Safari,Opera,Firefox,Chromeは全て3でIEだけ4
挙動としてはIEの挙動であって欲しかった・・・・


次にlocalStorageとXPCNativeWrapperの方
MDCにあるXPCNativeWrapperの「XPCNativeWrapperは何をするのか」の説明にはこうある

XPCNativeWrapper は、ラップしたオブジェクトのメソッドとプロパティへのアクセスを制限します。XPCNativeWrapper を通した場合、そのプロパティとメソッドへのアクセスは、IDL で定義されているか、DOM レベル 0 で定義されているものに限定されます。(ただし、いくつかの DOM レベル 0 のプロパティとメソッドは、XPCNativeWrapper 上では動作しません) 特に、JavaScript によって、プロパティを追加した場合や、 __defineGetter__ と __defineSetter__ によって、getter と setter を定義した場合には、 そのオブジェクトに対する XPCNativeWrapper で公開されるようにはなりません。この制約によって、そのオブジェクトに対して IDL で定義されている安全なメソッドに確実にアクセスできるようにします。

XPCNativeWrapper は何をするのか

早速なのでIDLを探してみた
http://mxr.mozilla.org/mozilla-central/source/dom/interfaces/storage/nsIDOMStorage.idl
IDLの中に

/**
 * The number of keys stored.
 */
readonly attribute unsigned long length;

とあるのでIDLに定義されていないわけでは無さそう。
その他の制限事項にも目を通してみたけどそれでも無さそうな感じ・・・
うーんやっぱりバグなのかな・・・

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でも付けてあげてください。