/* ############################################ 作者: KOBRA 営利・非営利・18禁問わず配布可、改造も可、報告不要 積極的に配布して皆のゲーム開発を快適にしてあげて http://cobrara.blogspot.jp/ https://twitter.com/onarinin_san ############################################ */ /*: * @target MZ * @plugindesc エロステータスを追加します * @author * * @param SE * @text SE * @default Cursor3 * @desc ページを変更した時のSE音を指定、デフォルト:Cursor3 * * @param SEvol * @text SEボリューム * @type number * @default 100 * @desc SE音の音量を指定、デフォルト:100 * * @param window * @text ウィンドウの表示 * @type boolean * @default true * @desc 背景としてウィンドウの枠を表示するかどうか * * @param font * @text フォント * @default * @desc Project\fontsにwoffファイルを入れ、ファイル名を記入してください * * @help エロステータスプラグイン * * イベントのスクリプトでエロステータス画面を作る事が可能に * * ~開く~ * イベントのスクリプトで * SceneManager.push(Scene_EroStatus) * とやるだけ * * ~設定~ * スクリプトで1行目に「CBR-エロステータス」と記入するとエロステータスのスクリプトを使うよーって合図に * * ~初期化~ * 「初期化-???」 ALLと書くと前ページ初期化、数値だと指定したページのみ初期化 * * ~データ入れる~ * 「ページ-???」 数値を入れると「今からこのページにデータ入れるよー」という合図を行います * * ~画像~ * ※注※ 必ず画像-????.png を2行目に持ってきてください * * 「画像-??????.png」って書くととpicturesフォルダに保存された画像を表示、\V[2]で変数2を使ったりも可能 * 「x-???」 x座標を指定 * 「y-???」 y座標 * 「透明度-???」 書かなくてもいい、無かったら100になる 数値は0~100 * 「サイズ-???」 書かなくてもいい、無かったら100になる 数値は0~ * * * ~テキスト~ * ※注※ 必ず テキスト-??? を2行目に持ってきてください * * 「テキスト-??????」 \V[2]で変数3を表示したり\{でフォントを大きくしたりできます * 「x-???」 x座標を指定 * 「y-???」 y座標 * 「左右-?」 書かなくてもいい、無かったら左になる 左、中、右でx座標の始点を指定 * 「上下-?」 書かなくてもいい、無かったら上になる 上、中、下で途中でフォントサイズ大きくした時の揃え方を指定 * 「サイズ-??」 書かなくてもいい、無かったら28になる * * */ //(function(){ var CBR = CBR || {}; CBR.eroStatus = { event:0, se:"Cursor3", seVol:100, addPage:0, pageNow:0, window:0, font:false, data:[] }; if(!CBR_Game_Interpreter_command355){ var CBR_Game_Interpreter_command355 = Game_Interpreter.prototype.command355; Game_Interpreter.prototype.command355 = function() { //CBR-xxxの場合CBR.xxxにobjを渡す var key = this.currentCommand().parameters[0]; if(key.match(/^CBR\-/)){ var obj = []; //下に続いてるスクリプトの取得 while (this.nextEventCode() === 655) { this._index++; obj[obj.length] = this.currentCommand().parameters[0]; } var temp = key.split('-'); //CBR-×××があったら if(CBR[temp[1]]){ //下に続くデータを入れる CBR[temp[1]](obj); } //普通にスクリプト実行 }else{ CBR_Game_Interpreter_command355.call(this); } return true; }; }; CBR["エロステータス"] = function(ary){ //スクリプト毎に実行されるヤツ //全てのデータを格納しよう //変数の変換は開く時かなー var obj ={}; for(var A of ary){ //A = A.replace(/\\V\[(\d+)\]/g,function(a,b){//汚いけどこれは毎回やらないとね // return $gameVariables.value(b);//律儀にNumberしなくてもいいか //}); var temp = A.split(/\-(.*)/,2); switch (temp[0]) {//初期化とページ変更はここで終わる case "初期化": if(temp[1]=='ALL'){ CBR.eroStatus.data.length = 0; }else{ delete CBR.eroStatus.data[Number(temp[1])-1]; } return;//break; case "ページ": CBR.eroStatus.addPage = Number(temp[1]) - 1; return;//break; case "画像": case "テキスト": obj.val = temp[1]; obj.type = temp[0]; break; case "x": case "y": case "サイズ": case "左右": case "上下": case "透明度": obj[temp[0]] = temp[1]; break; default: //console.log("なにこれ?"+temp[0]); return; } } CBR.eroStatus.data[CBR.eroStatus.addPage] = CBR.eroStatus.data[CBR.eroStatus.addPage] || {"画像":[],"テキスト":[]};//ページがなかったら作る CBR.eroStatus.data[CBR.eroStatus.addPage][obj.type][CBR.eroStatus.data[CBR.eroStatus.addPage][obj.type].length] = obj;//んで入れる }; //まずstarted const boxMargin = 4;が原因でマージンができてしまう function Scene_EroStatus() { this.initialize(...arguments); } Scene_EroStatus.prototype = Object.create(Scene_Base.prototype); Scene_EroStatus.prototype.constructor = Scene_EroStatus; Scene_EroStatus.prototype.initialize = function() { Scene_Base.prototype.initialize.call(this); }; Scene_EroStatus.prototype.create = function() { Scene_Base.prototype.create.call(this); //data[{},{},,,]ってなってたら空の部分を削る var i = CBR.eroStatus.data.length - 1; while(i && !CBR.eroStatus.data[i]){ CBR.eroStatus.data.pop(); i--; } //開いた時表示するページ CBR.eroStatus.pageNow = 0; var i = 0; while(!CBR.eroStatus.data[i]){ i++ } CBR.eroStatus.pageNow = i; var param = PluginManager.parameters("CBR_EroStatus"); CBR.eroStatus.se = (param["SE"] || 100); CBR.eroStatus.seVol = (param["SEvol"] || 100); if(param["window"]=="true"){ CBR.eroStatus.window = true; }else{ CBR.eroStatus.window = false; } CBR.eroStatus.font = param["font"] || false; if(CBR.eroStatus.font){ if(FontManager._urls["rmmz-mainfont"] !="fonts/"+CBR.eroStatus.font+".woff"){ FontManager._states["rmmz-mainfont"] = null; FontManager.load("rmmz-mainfont", CBR.eroStatus.font+".woff"); } } this.createBackground(); this.createWindowLayer(); this._windowLayer.x = 0; this._windowLayer.y = 0; this.createEroStatusWindow(); }; //今まで自力でロードフラグやってたけど今回は便利な物が、シーン.isReadyのおかげ Scene_EroStatus.prototype.start = function() { Scene_MenuBase.prototype.start.call(this); this._eroStatusWindow.refresh(); }; Scene_EroStatus.prototype.createEroStatusWindow = function() { const rect = this.eroStatusWindowRect(); this._eroStatusWindow = new Window_EroStatus(rect); this._eroStatusWindow.setHandler("cancel", this.popScene.bind(this)); this.addWindow(this._eroStatusWindow); }; Scene_EroStatus.prototype.eroStatusWindowRect = function() { const ww = Graphics.width; const wh = Graphics.height; const wx = 0; const wy = 0; return new Rectangle(wx, wy, ww, wh); }; Scene_EroStatus.prototype.update = function() { Scene_Base.prototype.update.call(this); }; Scene_EroStatus.prototype.createBackground = function() { this._backgroundFilter = new PIXI.filters.BlurFilter(); this._backgroundSprite = new Sprite(); this._backgroundSprite.bitmap = SceneManager.backgroundBitmap(); //なんか黒いフチが右下だけっていうのが気に入らないので四方に this._backgroundFilter.autoFit = false; this._backgroundSprite.filters = [this._backgroundFilter]; this.addChild(this._backgroundSprite); this.setBackgroundOpacity(192); }; Scene_EroStatus.prototype.setBackgroundOpacity = function(opacity) { this._backgroundSprite.opacity = opacity; }; Scene_EroStatus.prototype.popScene = function() { FontManager._states["rmmz-mainfont"] = null; FontManager.load("rmmz-mainfont", $dataSystem.advanced.mainFontFilename); SceneManager.pop(); }; //ウィンドウ function Window_EroStatus() { this.initialize(...arguments); } Window_EroStatus.prototype = Object.create(Window_Selectable.prototype); Window_EroStatus.prototype.constructor = Window_EroStatus; Window_EroStatus.prototype.initialize = function(rect) { Window_Selectable.prototype.initialize.call(this, rect); this._CBR_drawn = false; this.refresh(); }; Window_EroStatus.prototype.itemPadding = function() { return 0; }; Window_EroStatus.prototype.updatePadding = function() { this.padding = 0; }; Window_EroStatus.prototype.colSpacing = function() { return 0; }; Window_EroStatus.prototype.rowSpacing = function() { return 0; }; Window_EroStatus.prototype.update = function() { Window_Selectable.prototype.update.call(this); if (TouchInput.isCancelled()) { this.processCancel(); return; } if(CBR.eroStatus.data.length !== 1 && ImageManager.isReady() && FontManager.isReady()){//読み込み終わってたら、結局画像読み終えてない限りリフレッシュする必要なし var pn = CBR.eroStatus.pageNow; var n; if(Input.isRepeated("right")){ for(var i=1,len=CBR.eroStatus.data.length; i/g,function(a,b,c,d,e,f){ if(b){//\\ return '\\'; }else if(c){//[VNP] d = Number(d); switch(c){ case 'V': return $gameVariables.value(d); break; case 'N': return $gameActors._data[d]._name; break; case 'P': return $dataActors[$gameParty._actors[d-1]].name; break; } }else{//script return eval(f); } }); this.contents.context.font = this.contents._makeFontNameText(); this.contents.fontSize = Number(obj["サイズ"]) || $gameSystem.mainFontSize(); this.resetTextColor(); const reg = RegExp(/\\([CI])\[(\d+)\]|\\\{|\\\}/, 'g'); var ary; var c = 0; var left = 0; var strAry = [];//分割された文字列いれる var wAry = [];//分割された横幅いれる var fAry = [];//分割ごとの操作を入れる var ii = 0; var strWidth = 0; var maxH = this.contents.fontSize; //テキストのwidthや分割集め while ((ary = reg.exec(text)) !== null){ var str = text.substring(c,ary.index);//描写したい部分を抜き出す strAry[ii] = str; wAry[ii] = this.textWidth(str); strWidth += wAry[ii]; switch(ary[1]){ case undefined://{や}の時 if(ary[0].substring(1)=="{"){ fAry[ii] = {type:"{"}; this.contents.fontSize += 6; if(maxH < this.contents.fontSize){ maxH = this.contents.fontSize; } }else{ fAry[ii] = {type:"}"}; this.contents.fontSize -= 6; } break; default: fAry[ii] = {type:ary[1],val:ary[2]}; break; } c = reg.lastIndex; ii++; } if(c != text.length){ var str = text.substring(c);//描写したい部分を抜き出す strAry[ii] = str; fAry[ii] = {type:false,val:false}; wAry[ii] = this.textWidth(str); strWidth += wAry[ii]; ii++; } this.contents.context.font = this.contents._makeFontNameText(); this.contents.fontSize = Number(obj["サイズ"]) || $gameSystem.mainFontSize(); var left = 0; var top = 0; if(obj["左右"] == "中"){ left -= strWidth / 2; }else if(obj["左右"] == "右"){ left -= strWidth; } for(var i=0; i