忍者ブログ
このブログはPBW『無限のファンタジア』『シルバーレイン』『エンドブレイカー!』『サイキックハーツ』のキャラクター、およびそのプレイヤー(背後)の対話形式のブログです……でした。 対話形式は気まぐれに、残りはほとんどプレイング置き場になってます。
[234] [233] [232] [231] [230] [229] [228] [227] [226] [225] [224]
背後:IEのバグから逃れるためにFirefoxに乗り換えて―

キッド:スレイプニルを勧められたのは9月末だったはずだから、1ヶ月半ぐらい?

背後:上司にUIの愚痴をこぼして『Greasemonkeyで改造すれば?』と言われた―のが何時だっけ。

ミリア:次の月曜から『2度目』ですから、約1ヶ月経ってますね……。(カレンダー見ながら)

背後:IEでしか動かなかったトミーウォーカーのサムネイル、Firefoxでやっと動いた―

キッド:―可読性、低いけど(ボソッ)


トミーウォーカーのゲーム、TW1(無限のファンタジア)及びTW2(シルバーレイン)のサムネイルを対象としたユーザースクリプトです。
Firefox2.0下、Greasemonkey(ver0.8.2)下での動作を確認はしましたが、徹底的にデバッグをかけた訳ではないので、先述以外の環境では動作自体を保障できません。
(少なくとも、Greasemonkeyのバージョン違いなど、先述に準ずる環境であれば動くとは思いますが……。)
文字化けする場合、UTF-8で保存するか、unescape関数を使ってください(ex.未投票 → unescape("%u672A%u6295%u7968"))
本家(TW)に準ずる挙動をしていますが、機能を追加しているため、本家のサムネイルにないバグが起こるかもしれません。

インストール(?)は、使う方の判断及び責任のもと、バグを覚悟の上でお願いします。
なお、著作権はkidにあり、放棄はしません。

NPCに投票できる不具合があったので、改修しました。最新版はこちら
// ver 2.0 2008.11.15
//         TW1(無限のファンタジア)、TW2(シルバーレイン)の両方に対応

// 何もしない条件(サムネイルがある環境)
//   length == 0 : 状況がわからないが、少なくとも参照自体がエラー
//   length == 1 : 存在しないキャラクターID
if (document.getElementsByTagName('script').length < 2){return;}

var tw_thumbnail = {
    init: function(){
        this.tw_prd = this.get_array('prd');

        // 本家が使える場合は何もしない
        if ((document.all) || (this.tw_prd.length == 0)){return;}

        // DOMをサポートしていない場合、エラーが起こるので中断する
        if (!document.getElementById){return;}

        // IDを取得
        var id_fild = this.img_sorce[this.img_sorce.length - 42];
        var start = id_fild.indexOf('value')+7;
        var end = start + 6;
        var char_id = id_fild.substring(start, end);

        // 変数を取得
        this.tw_vlabel = this.get_array('votelabel');
        this.tw_lid = this.get_param('lastid');
        this.tw_prm = this.get_param('getparm');
        this.tw_in  = this.get_param('login');
        this.tw_votebtn = this.get_element('votebtn');

        // スペーサーの高さを計算
        var max_height=0;
        var init_height=0;
        for (var i=0;i<this.tw_prd.length;i++){
            img_height = this.tw_prd[i][12].match(/height.*/);
            if (img_height){
                image_height = parseInt(img_height[0].substring(8, img_height[0].length-1));
                max_height = Math.max(max_height, image_height);
                if (i==this.tw_lid){init_height = image_height;}
            }
        }
        if (typeof(max_height)=='number'){this.max_height = max_height + 80;};

        var spacer=document.createElement('div');
        document.getElementsByTagName('body')[0].appendChild(spacer);
        spacer.setAttribute('id', 'spacer');
        spacer.style.height = init_height+'px';

        this.novotemsg = (this.tw_in) ? '未投票' : ' ';

        this.write_sorce();
        this.init_link(char_id);
        this.get_element('prdmain').innerHTML = this.create_prd(this.tw_lid);
    },
    
    // リンクの張り替え
    init_link: function(myid){
        if (!this.tw_in){
            for (var id=0; id<this.tw_prd.length; id++){
                if (id == this.tw_lid){
                    this.get_element('tmb' + id).style.borderColor = '#ee1111';
                }
                else {
                    this.get_element('tmb' + id).style.borderColor = '#3333ee';
                }
                this.get_element('tmbvote' + id).innerHTML = this.novotemsg;
                this.get_element('tmblink' + id).href = 'javascript:tw_change(' + id + ')';
            }
            this.tw_votebtn.innerHTML = this.create_btn(this.tw_lid);
            return;            
        }
        var vformval = '<form name="vform" id="vform" action="'+this.action_path+'/ils_gvote.cgi">';
        vformval += '<input type="hidden" name="myid" value="'+myid+'">';
        vformval += '<input type="hidden" name="getparm" value="' + this.tw_prm + '">';

        for (var id=0; id<this.tw_prd.length; id++){
            if (id == this.tw_lid){
                this.get_element('tmb' + id).style.borderColor = '#ee1111';

                if (this.tw_prd[id][8] == ''){
                    this.tw_votebtn.innerHTML = this.create_btn(id);
                    this.get_element('tmbvote' + id).innerHTML = this.novotemsg;
                    this.get_element('tmbvote' + id).style.color = '#ff0000';
                }
            }
            else {
                if (this.tw_prd[id][8] == ''){
                    this.get_element('tmb' + id).style.borderColor = '#3333ee';
                    this.get_element('tmbvote' + id).innerHTML = this.novotemsg;
                    this.get_element('tmbvote' + id).style.color = '#ff0000';
                }
                else{this.get_element('tmb' + id).style.borderColor = '#9999cc';}
            }
            this.get_element('tmblink' + id).href = 'javascript:tw_change(' + id + ')';
            vformval += '<input type="hidden" name="odrid' + this.tw_prd[id][0] + '" id="odrid' + this.tw_prd[id][0] + '" value="">';
        }
        vformval += '</form>';
        this.get_element('voteform').innerHTML = vformval;
        this.get_element('allvotebtn').innerHTML = '<input type="button" value="一括投票" onclick="tw_submit()">';

    },
    get_element: function(id){
        return document.getElementById(id);
    },
    // ボタンを生成
    create_btn: function(id){
        var buf;
        if(!this.tw_in){
            buf='<table border="0" width="320" cellspacing="4" cellpadding="4"><tr><td><br>';
            buf+='あなたはログインしていないので、<br>投票できません。';
            buf+='<br><br><br><br></td></tr></table>';
        }
        else if ((this.tw_prd[id][4]=='')||(this.tw_prd[id][17]=='0'&&this.tw_serial==2)){
            buf='<table border="0" width="320" cellspacing="4" cellpadding="4"><tr><td><br>';
            buf+='この作品には投票できません。';
            buf+='<br><br><br><br></td></tr></table>';
        }
        else if(this.tw_prd[id][8]==''){
            buf='<table border="0" width="320" cellspacing="4" cellpadding="0" align="center">';
            buf+='<tr><td colspan="4"><b>この作品に投票する</b><br>';
            buf+='(「一括投票」ボタンでまとめて投票されます)<br></td></tr><tr>';
            for(var i=1;i<=8;i++){
                buf+='<td><a href="javascript:tw_store('+id+',\''+((i==8)?'n':i);
                buf+='\')"><img src="'+this.vote_img_path+'/ill_icon_kensaku0';
                buf+=(i+1);
                buf+='.jpg" width="70" height="16" border="0"></a></td>';
                if(i==4){buf+='</tr><tr>'};
            }
            buf+='</tr>';
            buf+='<tr><td colspan="4" align="center"><a href="javascript:tw_cansel('+id+');">キャンセル</a></td></tr>';
            buf+='</table>';
        }
        else{
            buf='<table border="0" width="320" cellspacing="4" cellpadding="4"><tr><td><br>';
            buf+='あなたはこの作品に<br> 「<b>';
            buf+=((this.tw_prd[id][8]=='n')?'いまいち':this.tw_vlabel[this.tw_prd[id][8]]);
            buf+='</b>」を投票しました。<br><br><br></td></tr></table>';
        }
        return buf;
    },
    // nameで指定された配列を、TWのソースから取得
    // 2次配列を前提とした実装
    get_array: function(name){
        var param_array=[];
        var img_sorce = this.img_sorce;
        for (var i=0;i<img_sorce.length;i++){
            line=img_sorce[i];
            if (line.indexOf(name) == 0){
                // 空配列を除外
                if (line.indexOf(' = new Array()') != -1
                    || line.indexOf('=new Array()') != -1
                    || line.indexOf('=[]') != -1
                    || line.indexOf(' = []') != -1){continue;}

                var start = line.indexOf('=');
                var end = line.length;
                if (line.charAt(end) == ';'){end--;}
                param = line.substring(start+1, end);
                param_array.push( eval(param) );
            }
        }
        if (param_array.length == 0){return this.get_param(name);}
        return param_array;
    },
    // nameで指定された変数を、TWのソースから取得
    get_param: function(name){
        var param=null;
        var img_sorce = this.img_sorce;
        for (var i=0;i<img_sorce.length;i++){
            line = img_sorce[i];
            if (line.indexOf(name) == 0){
                var start=name.length;
                var end=line.length;

                if (line.charAt(end-1)==';'){end--;}
                if (line.charAt(start)=='='){start++;}
                else if (line.substring(start, start+3)==' = '){start+=3;}

                return eval(line.substring(start, end));
            }
        }
    },
    // span#prdmainのinnerHTMLを生成
    create_prd: function(id){
        var buf = '<table border="1" bordercolor="'+this.table_bgcolor+'" width="640" cellspacing="0" cellpadding="0" align="center">'
        buf += '<tbody>';
        buf += '<tr><td align="center">';
        buf += '<table width="100%"><tbody><tr><td align="left">';
        if (id > 0){buf += '<a href="javascript:tw_change('+(id-1)+');">'+'<='+'</a>';}
        buf += '</td><td align="right">';
        if (id < this.tw_prd.length - 1){buf += '<a href="javascript:tw_change('+(id+1)+');">'+'=>'+'</a>';}
        buf += '</td></tr></tbody></table>';
        buf += this.tw_prd[id][1];
        buf += '<div align="right">(' + (id + 1) + '/' + (this.tw_prd.length) + ')</div></td></tr>';
        buf += '<tr><td align="center">';
        buf += ((this.tw_prd[id][15] == '')?'':'<a href="'+this.tw_prd[id][14]+'" target="_blank">');
        buf += '<img src="' + this.tw_prd[id][10] + '"' + this.tw_prd[id][11] + this.tw_prd[id][12] + ' border="0"></td></tr>';
        buf += ((this.tw_prd[id][15] == '')?'':'</a>');
        if (this.tw_prd[id][9] != ''){
            buf += '<tr><td align="center"><br>';
            buf += '『'+ this.tw_prd[id][9] + '』';
            buf += '<br><br></td></tr>';
        }
        if (this.tw_prd[id][13] != ''){;
            buf += '<tr><td align="center"><br>';
            buf += '着せ替えパスワード:『 ';
            buf += this.tw_prd[id][13];
            buf += ' 』';
            buf += '<br><br></td></tr>';
        }
        if (this.tw_serial==1){
            buf += this.tw_prd[id][16];
            if (this.tw_prd[id][4] != ''){
                buf += '<tr><th><a href="/mugefan/illust/chip.cgi?ilsid=' + this.tw_prd[id][4];
                buf += '"><img src="../img/icon_appare.jpg" width="61" height="50" border="0"></a></th></tr>';
            }
        }
        else{
            if (this.tw_prd[id][4] != ''){
                buf += '<tr><th><a href="/sr/illust/chip.cgi?ilsid=' + this.tw_prd[id][4];
                buf += '"><img src="../img/illust/icon_appare.jpg" width="61" height="50" border="0"></a>';
                buf += this.tw_prd[id][18] + this.tw_prd[id][16] + '</th></tr>';
            }
            else{
                buf += '<tr><th>' + this.tw_prd[id][18] + this.tw_prd[id][16] + '</th></tr>';
            }
        }
        buf += '</tbody></table>';
        return buf;
    },
    // サムネイルを動かすためのソースコードをHTMLに追加
    write_sorce: function(){
        var sorce = 'tw_prd=[\n';
        for (var i=0;i<this.tw_prd.length;i++){
            if (this.tw_prd[i][15] == ''){prd_name=this.tw_prd[i][5];}
            else{prd_name=this.tw_prd[i][5]+'<a href="'+this.tw_prd[i][14]+'" target="_blank">'+this.tw_prd[i][15]+'</a>';}

            sorce += '[\'' + prd_name + '\',\'' + this.create_prd(i) + '\']';
            sorce += ((i==this.tw_prd.length-1)?'\n];\n':',\n');
        }
        var func ='var max_image_height = '+this.max_height+';\n';
        func+='function tw_change(id){';
        func+='document.getElementById(\'tmb\'+lastid).style.borderColor=((prd[lastid][8]==\'\')?\'#3333ee\':\'#9999cc\');';
        func+='document.getElementById(\'tmb\'+id).style.borderColor=\'#ee1111\';';

        func+='if(tw_prd[id][2]){document.getElementById(\'spacer\').style.height=tw_prd[id][2];\n}\n';
        func+='else if(prd[id][12]&&prd[id][12]!=\'\'){\n';
        func+='img_height=prd[id][12].match(\/height.*\/);\n';
        func+='parseInt(img_height[0].substring(8, img_height[0].length-1));\n';
        func+='space_height=max_image_height-parseInt(img_height[0].substring(8, img_height[0].length-1));\n';
        func+='tw_prd[id][2]=(space_height+"px");\n';
        func+='document.getElementById(\'spacer\').style.height=tw_prd[id][2];\n}';
        func+='else{document.getElementById(\'spacer\').style.height=\'0px\';}\n';

        func+='document.getElementById(\'ilslink1\').innerHTML=prd[id][3];';
        func+='document.getElementById(\'ilslink1\').href=\''+this.action_path+'/ils_info.cgi?ilsid=\'+prd[id][4];';
        func+='document.getElementById(\'ilslink2\').href=\''+this.action_path+'/ils_info.cgi?ilsid=\'+prd[id][4];';
        func+='document.getElementById(\'prddate\').innerHTML=prd[id][6];';
        func+='document.getElementById(\'prdvotes\').innerHTML=prd[id][7];';
        func+='document.getElementById(\'prdname\').innerHTML=tw_prd[id][0];';
        func+='document.getElementById(\'prdmain\').innerHTML=tw_prd[id][1];';
        func+='document.getElementById(\'votebtn\').innerHTML=tw_btn(id);';
        func+='lastid=id;};\n';

        if (!this.tw_in){
            func+='function tw_btn(id){';
            func+='var buf;';
            func+='buf=\'<table border="0" width="320" cellspacing="4" cellpadding="4"><tr><td><br>\';';
            func+='buf+=\'あなたはログインしていないので、<br>投票できません。\';';
            func+='buf+=\'<br><br><br><br></td></tr></table>\';';
            func+='return buf;};';
        }
        else{
            func+='function tw_store(id,vote){';
            func+='voteval[id]=vote;';
            func+='document.getElementById(\'tmbvote\'+id).style.color=\'#000000\';';
            func+='document.getElementById(\'tmbvote\'+id).innerHTML=votelabel[vote];';
            func+='if(id<prd.length-1){tw_change(id+1);}';
            func+='else{document.getElementById(\'votebtn\').innerHTML=tw_btn(id);';
            func+='if(novote==1&&confirm(\'このページの最後のイラストに投票しました。一括投票しますか?\')){tw_submit();}}}\n';
            func+='function tw_cansel(id){';
            func+='voteval[id]=undefined;';
            func+='document.getElementById(\'tmbvote\'+id).style.color=\'#ff0000\';';
            func+='document.getElementById(\'tmbvote\'+id).innerHTML=\''+this.novotemsg+'\';';
            func+='if(id<prd.length-1){tw_change(id+1);}}\n';
            func+='function tw_submit(){var voted=undefined;votedlength=0;';
            func+='for(id=0;id<prd.length;id++){voted=voteval[id];';
            func+='if(!voted){continue;}';
            func+='document.getElementById(\'odrid\'+prd[id][0]).value=voted;';
            func+='votedlength++;}';
            func+='if(votedlength==0){return;};';
            func+='document.getElementById(\'vform\').submit();}\n';
            func+='function tw_btn(id){';
            func+='if(prd[id][8]==\'\'){';
            func+='buf=\'<table border="0" width="320" cellspacing="4" cellpadding="0" align="center">\';';
            func+='buf+=\'<tr><td colspan=\"4\"><b>この作品に投票する</b>\';';
            func+='if(voteval[id]&&voteval[id]!=\'\'){buf+=\' \'+(((voteval[id]==\'n\')?\'いまいち';
            func+='\':votelabel[voteval[id]])+\'を選択中\')};';
            func+='buf+=\'<br>(「一括投票」ボタンでまとめて投票されます)\';';
            func+='buf+=\'<br></td></tr><tr>\';for(var i=1;i<=8;i++){';
            func+='buf+=\'<td><a href=\"javascript:tw_store(\';';
            func+='buf+=id+\',\\\'\'+((i==8)?\'n\':i);';
            func+='buf+=\'\\\')\"><img src=\"'+this.vote_img_path+'/ill_icon_kensaku0\';buf+=(i+1);';
            func+='buf+=\'.jpg\" width=\"70\" height=\"16\" border=\"0\"></a></td>\';';
            func+='if(i==4){buf+=\'</tr><tr>\'};};buf+=\'</tr>\';';
            func+='buf+=\'<tr><td colspan=\"4\" align=\"center\"><a href=\"javascript:tw_cansel(\'+id+\');\">\';';
            func+='buf+=\'キャンセル</a></td></tr></table>\';}';
            func+='else{';
            func+='buf=\'<table border="0" width="320" cellspacing="4" cellpadding="4"><tr><td><br>\';';
            func+='buf+=\'あなたはこの作品に<br> 「<b>\';';
            func+='buf+=((prd[id][8]==\'n\')?\'いまいち\':votelabel[prd[id][8]]);';
            func+='buf+=\'</b>」を投票しました。\';';
            func+='buf+=\'<br><br><br></td></tr></table>\';}';
            func+='return buf;}';
        }
        var js_code=document.createElement('script');
        document.getElementsByTagName('body')[0].appendChild(js_code);
        js_code.setAttribute('type', 'text/JavaScript');
        js_code.innerHTML += sorce + func;
    }
};

// TW1とTW2の差分をセット
var url = location.href;
if (url.match(/^http:\/\/t-walker\.jp\/mugefan\//)){
    tw_thumbnail.tw_serial = 1;
    tw_thumbnail.table_bgcolor = '#883300';
    tw_thumbnail.action_path = '/mugefan/illust';
    tw_thumbnail.vote_img_path = '../img';
}
else if (url.match(/^http:\/\/t-walker\.jp\/sr\//)){
    tw_thumbnail.tw_serial = 2;
    tw_thumbnail.table_bgcolor = '#5050b0';
    tw_thumbnail.action_path = '/sr/illust';
    tw_thumbnail.vote_img_path = '../img/illust';
}
else{
    return;
}

var img_js = document.getElementsByTagName('script')[0];
tw_thumbnail.img_sorce = (img_js.textContent || img_js.gnnerText || img_js.innerHTML).split('\n');

tw_thumbnail.init();

2008.11.24 テキストエリアで失敗したので、ふっつーにdivにしました orz背後:ただ、こういうのを作ると、余計に悩む―本当にプログラマを目指しているのか。僕は果たしてクリエイターなのか。誰かのために作る事を―あるいは、魂のこもった作品を、なのかもしれないが―作る事が出来るのか。そもそも、僕は何が作りたいんだろう?
PR

コメント


コメントフォーム
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード
  Vodafone絵文字 i-mode絵文字 Ezweb絵文字


トラックバック
この記事にトラックバックする:


忍者ブログ [PR]
カレンダー
09 2017/10 11
S M T W T F S
1 2 3 4 5 6 7
8 9 10 11 12 13 14
16 17 18 19 20 21
23 24 25 26 27 28
29 30 31
お天気情報
プロフィール
HN:
キッド
年齢:
31
性別:
男性
誕生日:
1986/03/22
職業:
(元)冒険者
最新コメント
[06/16 TWmap管理人]
[05/09 おか(静月PL)]
[09/28 水]
[07/05 イノセ]
[07/04 水]
アクセス解析
ブログ内検索
フリーエリア
Dropboxに登録しませんか? Dropboxは複数の端末でファイルを共有・管理できるサービスです。 (PCからスマフォへの画像送信や、ToDo管理や、スマフォで発注文を書いてPCでリクエスト、など用途はたくさん!) 上のURLから登録すると、500MBが無料拡張されます。
最古記事
(08/12)
(08/15)
(09/15)
(11/01)
(11/05)
最新トラックバック
バーコード