【ティラノスクリプト】バッジ機能プラグインのトラブルに関するアレコレ
ティラノスクリプトに関するバッジ取得について、よく見るアレやコレの解決方法を解説していこうと思います。
動作しない
バッジ機能プラグインである「novecole.ks」が古い可能性があります。
特に、以前のプロジェクトで使っていたnovecole.ksをそのままコピーして使い回す場合に起こりやすいです。(ティラノスクリプトV4からV5にプロジェクトを移行した場合などは特に注意です。)
また、以前は動作していたはずなのに最近動いていないようだ、と言ったケースの場合はOSやブラウザのバージョンアップによる仕様変更の影響を受けている可能性があります。
まずは下記のサイトから最新版のnovecole.ksを入手しましょう。
それでも動作しない場合は、プラグイン追加の記述方法(pluginタグではなくcallタグで読み込む。novecole.ksの配置ディレクトリがおかしい。タグの単純な打ち間違い)などを疑ってみてください。
iPhoneからPWA環境でプレイすると取得できない
2021年9月17日現在、恐らくiPhoneからPWAでプレイした際にバッジの取得ウインドウが開きません。
ブラウザでプレイした際に取得ウインドウが見切れる
ゲーム解像度によっては下記のような状態に陥ります。
今回はゲーム解像度の横幅を640pxに設定したパターンで説明します。
デフォルトの設定だとバッジ取得ウインドウの横幅が500px、表示位置が左から200pxとなっている為、全て表示させるには最低700pxの解像度が必要です。
つまり今回のケースだと、取得ウインドウが700pxに対してゲーム画面が640pxなので、右側60pxがはみ出ている状態となります。
このようなパターンだと本来右上に表示されている×ボタンでウインドウが閉じることができずに、ゲーム進行自体が止まってしまいます。
似たようなパターンで、高さが足りずに取得ボタンを押せないという現象もあります。
こちらを解決するには直接novecole.ksを編集する必要があります。
;エンブレム取得。
[macro name="give_emblem"]
[iscript]
function give_emb(url,emb_id,pid){
//配置する場所を設定。
if(!mp.width){mp.width=500};
if(!mp.height){mp.height=400};
if(!mp.left){mp.left=200};
if(!mp.top){mp.top=100};
mp.left=200およびmp.top=100の部分が取得ウインドウの表示位置になります。
これをmp.left=0、mp.top=0にしてみましょう。
;エンブレム取得。
[macro name="give_emblem"]
[iscript]
function give_emb(url,emb_id,pid){
//配置する場所を設定。
if(!mp.width){mp.width=500};
if(!mp.height){mp.height=400};
if(!mp.left){mp.left=0};
if(!mp.top){mp.top=0};
こんな感じで左上に表示されるようになりました。
中央寄せにしたい場合は下記のコードが使えます。
;エンブレム取得。
[macro name="give_emblem"]
[iscript]
function give_emb(url,emb_id,pid){
//配置する場所を設定。
if(!mp.width){mp.width=500};
if(!mp.height){mp.height=400};
if(!mp.left){mp.left=(TYRANO.kag.config.scWidth / 2) - (mp.width / 2)};
if(!mp.top){mp.top=(TYRANO.kag.config.scHeight / 2) - (mp.height / 2)};
ゲーム解像度を取得して中央座標を計算して配置するので、解像度の異なるプロジェクトでもこのコードひとつで中央寄せで表示可能です。
バッジ取得ウインドウ(タブ)を上書きしてしまう
例えばPC版で、Aのバッジを取得した際にA取得画面のブラウザが立ち上がります。
それを後から取得しようと放置したままゲームを進めると、続けてBのバッジに辿り着きました。
すると、先ほどのAのバッジ取得画面を上書きしてBのバッジの取得画面になってしまいます。
これを防ぐためにはnovecole.ksの下記のコードを編集する必要があります。
//17行目
html +='<iframe name="emb_frame" style="width:100%;height:100%;" src="" frameborder="0" scrolling="no" ></iframe>';
//35行目
var j_form = $('<form method="post" action="'+url+'" target="emb_frame" ></form>');
//56行目~58行目
window.open("","emb_frame");
var j_form = $('<form method="post" action="'+url+'" target="emb_frame" ></form>');
このコードで出てくる4か所の"emb_frame"を"'+emb_id+'"(56行目だけemb_id)に書き換えます。
//17行目
html +='<iframe name="'+emb_id+'" style="width:100%;height:100%;" src="" frameborder="0" scrolling="no" ></iframe>';
//35行目
var j_form = $('<form method="post" action="'+url+'" target="'+emb_id+'" ></form>');
//56行目~58行目
window.open("",emb_id);
var j_form = $('<form method="post" action="'+url+'" target="'+emb_id+'" ></form>');
この記述へ変更することにより、AというバッジはA用のタブに表示され、BというバッジはB用のタブに表示されるようになります。
全部乗せ
前述の変更を全て加えたコードを載せておきます。
バッジ取得画面の表示位置は中央寄せになっています。
ティラノスクリプトV6にも対応済みです。
;エンブレム取得。
[macro name="give_emblem"]
[iscript]
function give_emb(url,emb_id,pid){
//配置する場所を設定。
if(!mp.width){mp.width=500};
if(!mp.height){mp.height=400};
if(!mp.left){mp.left=(TYRANO.kag.config.scWidth / 2) - (mp.width / 2)};
if(!mp.top){mp.top=(TYRANO.kag.config.scHeight / 2) - (mp.height / 2)};
var html = '<div style="z-index:999999999999;position:absolute;width:100%;height:100%;background:rgba(45,45,45, 0.5);">';
html +='<div style="position:absolute;" class="inner_frame">';
html +='<a class="emblem_close_button" style="z:index:999999;cursor:pointer;color:#777; font-size:36px;position:absolute;right:5px;text-decoration: none;text-shadow: 0 1px 0 #fff;top:5px;">✖</a>';
html +='<iframe name="'+emb_id+'" style="width:100%;height:100%;" src="" frameborder="0" scrolling="no" ></iframe>';
html +='</div>';
html +='</div>';
var j_emb = $(html);
j_emb.find(".inner_frame").css({
width:mp.width,
height:mp.height,
left:mp.left,
top:mp.top
});
j_emb.find(".emblem_close_button").click(function(){
j_emb.remove();
});
$("#tyrano_base").prepend(j_emb);
var j_form = $('<form method="post" action="'+url+'" target="'+emb_id+'" ></form>');
j_form.append('<input type="hidden" name="emb_id" value="'+emb_id+'" />');
j_form.append('<input type="hidden" name="pid" value="'+pid+'" />');
j_form.append('<input type="hidden" name="pjid" value="'+TG.config.projectID+'" />');
$("body").append(j_form);
j_form.submit();
j_form.remove();
} // end function
//非ログイン時
function give_emb_window(url,emb_id,pid){
if($.isNWJS()){
url = url+"?emb_id="+emb_id+"&pid="+pid+"&pjid="+TG.config.projectID;
var gui = require('nw.gui');
gui.Shell.openExternal(url);
}else{
window.open("",emb_id);
var j_form = $('<form method="post" action="'+url+'" target="'+emb_id+'" ></form>');
j_form.append('<input type="hidden" name="emb_id" value="'+emb_id+'" />');
j_form.append('<input type="hidden" name="pid" value="'+pid+'" />');
j_form.append('<input type="hidden" name="pjid" value="'+TG.config.projectID+'" />');
$("body").append(j_form);
j_form.submit();
j_form.remove();
}
}
var url = 'https://novelgame.jp/emb/give';
var emb_id = mp.id;
var pid = mp.pid;
//V4.x
if($.isNWJS()){
url = url+"?emb_id="+emb_id+"&pid="+pid+"&pjid="+TG.config.projectID;
var gui = require('nw.gui');
gui.Shell.openExternal(url);
//V5.x V6.x
}else if(navigator.userAgent.indexOf("TyranoErectron")!=-1){
url = url+"?emb_id="+emb_id+"&pid="+pid+"&pjid="+TG.config.projectID;
if(window.studio_api){
//V6
var shell = window.studio_api.shell;
shell.openExternal(url);
}else{
//V5
var shell = require("electron").shell;
shell.openExternal(url);
}
}else{
$.ajax({
type: 'GET',
url: 'https://novelgame.jp/emb/check_login',
dataType: 'jsonp',
jsonpCallback: 'novecole',
success: function(json){
if(json.status !="success"){
return;
}
var is_login = json.data.is_login;
if(is_login=="true"){
give_emb(url,mp.id,mp.pid);
}else{
$.alert("エンブレムを見つけました!",function(){
//ログインしていない場合
give_emb_window(url,mp.id,mp.pid);
});
}
},
error:function(){
return false;
}
});
}
[endscript]
[endmacro]
コピーしてnovecole.ksに全て上書きしてください。
ただし、今後novecole.ksに更新があった場合は使えなくなる可能性がありますので注意してください。