tyrano.plugin.kag ={ version:450, tyrano:null, kag:null, sound_swf:null, is_rider:false, //ティラノライダーからの起動かどうか is_studio:false, //ティラノスタジオからの起動かどうか cache_html:{}, cache_scenario : {}, config:{ defaultStorageExtension:"jpg", projectID : "tyranoproject", game_version:"0.0", preload:"on", skipSpeed:"30", patch_apply_auto:"true", mediaFormatDefault:"ogg", configSave:"webstorage" }, //読み込んできた値 Config.tjs の値 //変更されることが無い静的な値 define:{ TYRANO_ENGINE_VERSION:400, "BASE_DIV_NAME":"tyrano_base", FLAG_APRI : false, "www":"" }, //各種変数 variable:{ //f:{},//ゲーム変数 stat に移動 sf:{},//システム変数 tf:{}//一時変数 //mp:{}//マクロに引き渡された変数がココに入る }, //一時保存オブジェクト tmp:{ checking_macro:false, //マクロの登録時はスタックにつまれない ready_audio:false, //スマホブラウザ向け。オーディオ初期化を終えたか否か audio_context:false, //オーディオコンテキスト。起動時一回のみ生成 num_anim:0, //実行中のアニメーションスタック map_bgm:{}, //再生中の音楽オーディオ map_se:{}, //再生中の効果音 sleep_game:null, //sleepgame中はここにスナップが入る sleep_game_next:false, //awakegame時に次へNextOrderするか否か。 base_scale:1, is_se_play:false, //seがプレイ中か否か is_se_play_wait:false, //seの終了を待ってるかどうか。 is_vo_play:false, //ボイス再生中か否か is_vo_play_wait:false, //ボイスの終了を待ってるかどうか。 is_bgm_play:false, //BGMがプレイ中か否か is_bgm_play_wait:false, //BGMの完了を待っているか否か。 is_audio_stopping:false,//BGMがフェードアウト中かどうか。 loading_make_ref:false, wait_id:"", //waitをキャンセルするために使います。 map_chara_talk_top:{}, //キャラトークのアニメーション中、開始のトップ位置を保持します。 video_playing:false }, //逐次変化するKAGシステムの動作に必要な状況変化ファイル //セーブデータなどは保存する必要ありますよ //文字列データしか入れちゃダメ stat:{ map_label:{}, //ラベル情報保持 map_macro:{}, //マクロの情報保持 vertical:"false", //縦書き f:{}, //ゲーム変数はstatの中 mp:{},//マクロもstat current_layer:"message0", //現在のメッセージレイヤ current_page:"fore", is_stop:false,//停止中。クリックしても先に進ませない is_wait:false, //wait中。 is_trans:false, //trans中 is_wait_anim:false, //[wa]中 is_strong_stop:false,// [s]タグで立ち止まってる状態。強力な停止中。解除するにはジャンプやマクロが呼び出せれる strong_stop_recover_index:0, //[s]タグ指定中に保存した場合、戻ってくるindex [_s]時のindexを保持しておく is_nowait:false, //ノーウェイト、テキスト瞬間表示状態 current_message_str:"ゲームスタート", //現在表示中のメッセージ current_save_str:"", //セーブの時に使用するメッセージ current_keyframe:"", //キーフレームの名前、スタートしている場合はキーフレーム名が入る map_keyframe:{}, //キーフレームアニメーション情報を登録 is_script:false,//スクリプト解析中。 buff_script:"", //スクリプトを格納しておく is_html:false, //htmlタグ解析中 map_html : {}, //htmlタグに関するステータス cssload:{}, //読み込んだCSSを保持する save_img:"", //セーブイメージ。ここにパスが入っている場合はその画像をサムネに使う。 stack:{"if":[],"call":[],"macro":[]}, //if文のスタック set_text_span:false,//メッセージ中のspanを新しく作成するときに真にする current_scenario:"first.ks",//シナリオファイルを指定する is_skip:{}, is_auto:{}, current_bgm:"", //現在再生中のBGM current_bgm_vol:"", //現在再生中のBGMボリューム current_se:{}, //現在再生中のループ効果音 load_auto_next:false,// ロード時にオートネクストするかどうか。showsave周りのときtrueになる。 enable_keyconfig:true, //キーコンフィグが有効 or 無効 current_bgmovie:{ storage:"", volume:"" }, //再生中の背景動画 current_camera :{ }, current_camera_layer:"", is_move_camera:false, //カメラの演出中かどうか is_wait_camera:false, //カメラの演出を待ってるかどうか current_line:0, //実行中の命令の実際のファイル行 エラーや警告時に使用 is_hide_message:false, //メッセージエリアが非表示状態か否か is_click_text:false, //テキストメッセージがクリックされた常態化否か is_adding_text:false,//テキストメッセージを追加中か否か flag_ref_page:false, //このフラグが立っている場合、次のクリックで画面がクリアされます。 ruby_str:"", //ここに文字列が入っている場合は、次の1文字出力時にルビとして適応する ch_speed:"", //文字表示スピード skip_link:"true", //選択肢のあと、スキップを継続するかどうか。 log_join:"false", //特定のタグの時に、ログが分裂しないようにするため。trueなら前のログに連結させる log_clear:false, // p cm などの文字クリアの時は、強制的に次のログ追加をjoinではなく、addにする f_chara_ptext:"false", flag_glyph : "false", //クリック待ちボタンが指定されているか否か current_cursor:"auto", //現在のカーソル指定 //表示フォント指定 font:{ enable:false, color:"", bold:"", size:"", face:"", italic:"" }, //表示位置調整 locate:{ x:0, y:0 }, //リセットされた時に適応されるオリジナルフォント設定 default_font:{ color:"", bold:"", size:"", face:"", italic:"", edge:"", shadow:"" }, //システム系で使用するHTMLの場所を保持 sysview:{ save:"./tyrano/html/save.html", load:"./tyrano/html/load.html", backlog:"./tyrano/html/backlog.html", menu:"./tyrano/html/menu.html" }, /*** キャラクター操作系 ***/ //キャラクターの立ち位置を自動的に調整する事ができます chara_pos_mode:"true", chara_effect:"swing", chara_ptext:"", chara_time:"600", chara_memory:"false", chara_anim:"true", //キャラクター追加時、位置が変わる場合にアニメーションで表示するか否か pos_change_time:"600", //キャラクター自動配置のスピード chara_talk_focus:"none", chara_brightness_value:"60", chara_blur_value:"2", chara_talk_anim:"none", //キャラクターが話す時にアニメーションするかどうか chara_talk_anim_time:230, chara_talk_anim_value:30, apply_filter_str:"", video_stack:null, is_wait_bgmovie :false, //定義されたキャラクター情報 charas:{}, jcharas:{}, play_bgm:true, //BGMを再生するか否か play_se:true, //SEを再生するか否か play_speak:false, // 読み上げを行うか否か map_se_volume:{}, //セーブスロットごとにボリューム値を保持できる map_bgm_volume:{}, // 同上 //ボイス周りの設定 vocoinfig map_vo:{ vobuf:{},//ボイスとして指定するplayseのbuf vochara:{}//キャラ毎にボイスの設定が入る。 }, vostart:false, //vo管理が有効か否か log_write:true, //バックログを記録するか否か buff_label_name:"", //ラベル管理のもの、通過時にここに配置されて次にlabelに到達した時に記録される already_read:false, //現在の場所が既読済みか否かを保持する。ラベル通過時に判定 visible_menu_button:false, //メニューボタンの表示状態 title:"" //ゲームのタイトル }, //ゲームの現在の状態を保持する所 状況によって、いろいろ変わってくる init:function(){ this.kag = this; var that = this; this.tyrano.test(); //コンフィグファイルの読み込み this.parser.loadConfig(function(map_config){ that.config = $.extend(true, that.config, map_config); //アップデートのチェック that.checkUpdate(function(){ that.init_game(); //ゲーム画面生成 }); }); //アプリか否かの設定 $("script").each(function(){ if($(this).attr("src")){ if($(this).attr("src").indexOf("cordova")!=-1 || $(this).attr("src").indexOf("phonegap")!=-1){ that.define.FLAG_APRI = true; } } }); //ティラノプレイヤーを使ってるなら if(typeof TyranoPlayer == "function"){ this.tmp.ready_audio = true; } else if($.isNWJS()){ this.tmp.ready_audio = true; } //audio contextを設定 1回のみ実行 var AudioContext = window.AudioContext // Default || window.webkitAudioContext // Safari and old versions of Chrome || false; if(AudioContext){ this.tmp.audio_context = new AudioContext(); } //フラッシュの設定 try{ var browser = $.getBrowser(); //音楽再生にFLASHは関係なくなった /* if(browser == "firefox" || browser =="opera" || (browser =="safari" && $.userenv()=="pc" ) ){ if($.isFlashInstalled() != true){ alert("FLASHがインストールされていないため、音楽が再生されません。"); }else{ this.kag.sound_swf = $.swfName("externalnovelsound"); } } */ }catch(e){ console.log(e); } }, //ローカルにアップデート用のファイルがある場合は、確認する checkUpdate:function(call_back){ //NWJS環境以外では、アップデート不可 if(!$.isNWJS()){ call_back(); return; } //自動反映が無効の場合は反映しない if(this.kag.config.patch_apply_auto=="false"){ call_back(); return; } var patch_path = $.localFilePath(); var that = this; patch_path = patch_path + "/" + this.kag.config.projectID + ".tpatch"; this.applyPatch(patch_path,"true",call_back) }, //パッチを反映します。 applyPatch:function(patch_path,flag_reload,call_back){ //アップデートファイルの存在チェック var fs = require('fs'); var fse = require('fs-extra'); if (!fs.existsSync(patch_path)) { call_back(); return; } //リロードの場合は、アップデート不要 if (fs.existsSync("./updated")) { call_back(); return; } var AdmZip = require('adm-zip'); var path = require('path'); var abspath = path.resolve("./"); // reading archives var zip = new AdmZip(patch_path); zip.extractAllTo("./update_tmp", true); fse.copySync("./update_tmp/","./"); fse.removeSync("./update_tmp"); //アップデートしたという証用 if(flag_reload == "true"){ fs.writeFileSync("./updated","true"); location.reload(); }else{ call_back(); } }, //スクリプトを解釈して実行する evalScript:function(str){ var TG = this; var f = this.stat.f; var sf = this.variable.sf; var tf = this.variable.tf; var mp = this.stat.mp; eval(str); this.saveSystemVariable(); if(this.kag.is_rider){ this.kag.rider.pushVariableGrid(); } }, //式を評価して値を返却します embScript:function(str,preexp){ var f = this.stat.f; var sf = this.variable.sf; var tf = this.variable.tf; var mp = this.stat.mp; return eval(str); }, //システム変数を保存する saveSystemVariable:function(){ $.setStorage(this.kag.config.projectID+"_sf", this.variable.sf ,this.kag.config.configSave); }, //すべての変数クリア clearVariable:function(){ this.stat.f ={}; //ゲーム変数 this.variable.sf ={}; //システム変数 //添付のシステムだけは残す this.clearTmpVariable(); this.saveSystemVariable(); }, //添付変数の削除 clearTmpVariable:function(){ var tmp_sys = this.kag.variable.tf["system"]; this.kag.variable.tf = {}; //一時変数かな this.kag.variable.tf["system"] = tmp_sys; }, ///スタック管理用 pushStack:function(name,flag){ this.stat.stack[name].push(flag); }, popStack:function(name){ return this.stat.stack[name].pop(); }, getStack:function(name){ return this.stat.stack[name][this.stat.stack[name].length-1]; }, setStack:function(name,flag){ this.stat.stack[name][this.stat.stack[name].length-1] = flag; }, endStorage:function(){ //ファイルの終端に来た時、スタックがたまってたらそこに戻らせる var pm = this.kag.getStack("call"); //最新のコールスタックを取得 //呼び出し元に戻る if(pm==null){ //console.log("---------終端---------"); //this.kag.error("シナリオの終端まで、きてしまいました"); return false; } this.kag.popStack("call");//スタックを奪い取る this.kag.ftag.nextOrderWithIndex(pm.index,pm.storage); }, /////////////ゲーム初期化//////////// init_game:function(){ var that = this; //kag.parser 追加 this.parser = object(tyrano.plugin.kag.parser); this.parser.kag = that; //kag.tag追加 tagが全部星している this.ftag = object(tyrano.plugin.kag.ftag); this.ftag.kag = that; this.ftag.init(); //layer 追加 this.layer = object(tyrano.plugin.kag.layer); this.layer.kag = that; this.layer.init(); //menu 追加 this.menu = object(tyrano.plugin.kag.menu); this.menu.kag = that; this.menu.init(); //key_mouse 追加 this.key_mouse = object(tyrano.plugin.kag.key_mouse); this.key_mouse.kag = that; this.key_mouse.init(); //event 追加 this.event = object(tyrano.plugin.kag.event); this.event.kag = that; this.event.init(); //rider 追加 this.rider = object(tyrano.plugin.kag.rider); this.rider.kag = that; this.rider.init(); //studio 追加 this.studio = object(tyrano.plugin.kag.studio); this.studio.kag = that; this.studio.init(); //システム変数の初期化 var tmpsf = $.getStorage(this.kag.config.projectID+"_sf",that.config.configSave); if(tmpsf == null){ this.variable.sf ={}; }else{ this.variable.sf = eval("("+tmpsf+")"); } /////////////システムで使用する変数の初期化設定//////////////////// //コンフィグ //システムが永続させたい変数はすぐにコンフィグに反映 if(typeof that.variable.sf._system_config_bgm_volume !== "undefined") that.config["defaultBgmVolume"] = String(that.variable.sf._system_config_bgm_volume); if(typeof that.variable.sf._system_config_se_volume !== "undefined") that.config["defaultSeVolume"] = String(that.variable.sf._system_config_se_volume); //if(that.variable.sf._system_config_bgm_volume) that.config["defaultBgmVolume"] = that.variable.sf._system_config_bgm_volume; //if(that.variable.sf._system_config_se_volume) that.config["defaultSeVolume"] = that.variable.sf._system_config_se_volume; if(that.variable.sf._config_ch_speed) that.config["chSpeed"] = that.variable.sf._config_ch_speed; if(typeof that.variable.sf._system_config_auto_speed !== "undefined") that.config["autoSpeed"] = that.variable.sf._system_config_auto_speed; if(that.variable.sf._system_config_auto_click) that.config["autoClickStop"] = that.variable.sf._system_config_auto_click_stop; if(that.variable.sf._system_config_already_read_text_color) that.config["alreadyReadTextColor"] = that.variable.sf._system_config_already_read_text_color; if(typeof that.variable.sf._system_config_unread_text_skip != "undefined"){ that.config["unReadTextSkip"] = that.variable.sf._system_config_unread_text_skip; } //自動セーブのデータがあるかどうか var auto_save_data = $.getStorage(this.kag.config.projectID+"_tyrano_auto_save",this.kag.config.configSave); this.variable.sf["system"] ={}; if(auto_save_data){ this.variable.sf["system"]["autosave"] = true; }else{ this.variable.sf["system"]["autosave"] = false; } //バックログ保存用の設定 this.variable.tf["system"] = {}; this.variable.tf["system"]["backlog"] = []; //コンフィグボタン追加 var button_menu_obj = $("
"); //コンフィグボタンの位置を指定する if(this.kag.config.configLeft !="-1" && this.kag.config.configTop !="-1"){ button_menu_obj.css("left",parseInt(this.kag.config.configLeft)); button_menu_obj.css("top",parseInt(this.kag.config.configTop)); }else{ button_menu_obj.css("left",this.config.scWidth -35); button_menu_obj.css("top",this.config.scHeight -35); } button_menu_obj.click(function(){ that.menu.showMenu(); }); //コンフィグファイルを確認して、メニュー表示 if(this.kag.config.configVisible=="false"){ button_menu_obj.hide(); this.kag.stat.visible_menu_button = false; }else{ this.kag.stat.visible_menu_button = true; } $("."+this.kag.define.BASE_DIV_NAME).append(button_menu_obj); //カメラモードの調整 /* if(this.kag.config["useCamera"] && this.kag.config["useCamera"]=="true"){ this.kag.config["ScreenCentering"] = "false"; } */ //センタリングの調整 if(this.kag.config["ScreenCentering"] && this.kag.config["ScreenCentering"]=="false"){ //センタリングをキャンセルする $(".tyrano_base").css("transform-origin","0 0"); $(".tyrano_base").css({ margin: 0 }); }else{ //指定がない or yes なら こっち //$(".tyrano_base").css("transform-origin","50 50"); $(".tyrano_base").css("transform-origin","0 0"); $(".tyrano_base").css({ margin: 0 }); } //センタリングが有効な場合のみ /* if(this.kag.config["ScreenCentering"]=="true"){ $("#tyrano_base").css("position","absolute"); } */ //tyranoの大本部分の調整 this.tyrano.base.setBaseSize(this.config.scWidth,this.config.scHeight); //スマホの場合は、実施。 PCの場合でも画面を一致させる処理→すべての画面フィットさせる仕様に変更 // if($.userenv() !="pc"){ this.tyrano.base.fitBaseSize(that.config.scWidth,that.config.scHeight); //スマホの場合、傾いた時に再計算させる $(window).bind("load orientationchange resize",function(){ if(Math.abs(window.orientation) === 90){ if(window.pageYOffset===0){window.scrollTo(0,1);} that.tyrano.base.fitBaseSize(that.config.scWidth,that.config.scHeight); } else{ if (window.pageYOffset === 0) { window.scrollTo(0,1); } that.tyrano.base.fitBaseSize(that.config.scWidth,that.config.scHeight); } }); // } this.layer.addLayer("base"); //メッセージレイヤの追加 this.layer.addLayer("message0"); //メッセージ外枠部分の作成 var j_message = $(""); j_message .css("background-color",$.convertColor(this.config.frameColor)) .css("opacity",$.convertOpacity(this.config.frameOpacity)) .css("left",eval(this.config.ml)) .css("top",eval(this.config.mt)) .css("width",eval(this.config.mw)) .css("height",eval(this.config.mh)) .css("z-index",100); j_message.l_visible; this.layer.appendObj("message0","fore",j_message); //メッセージ表示領域 var j_message_inner = $(""); //禁則処理 if(this.config.WordBreak == "false"){ j_message_inner.css("word-break","break-all"); } //1行目の上に余裕を持たせる。rubyカクつき対策 $.insertRule(".message_inner p{ padding-top:"+this.kag.config.defaultLineSpacing+"px;}"); this.layer.appendObj("message0","fore",j_message_inner); /*********************************/ ///messege1 2個目のメッセージレイヤ。ここは指定回数分作成できるようにする必要があるかも var num_message_layer = parseInt(this.config.numMessageLayers); for(var i=1 ;i