337 lines
10 KiB
JavaScript
337 lines
10 KiB
JavaScript
//
|
|
// メッセージアライメント制御文字 ver1.04
|
|
//
|
|
// ------------------------------------------------------
|
|
// Copyright (c) 2016 Yana
|
|
// Released under the MIT license
|
|
// http://opensource.org/licenses/mit-license.php
|
|
// ------------------------------------------------------
|
|
//
|
|
// author Yana
|
|
//
|
|
|
|
var Imported = Imported || {};
|
|
Imported["MessageAlignmentEC"] = 1.04;
|
|
/*:
|
|
* @plugindesc ver1.04/メッセージのアライメントを変更する制御文字を追加します。
|
|
* @author Yana
|
|
*
|
|
* @param ExtendEC
|
|
* @desc メッセージ内で制御文字として扱う文字です。
|
|
* 詳細はヘルプを参照してください。
|
|
* @default
|
|
*
|
|
* @help ------------------------------------------------------
|
|
* 使用方法
|
|
* ------------------------------------------------------
|
|
* イベントコマンド「文章の表示」及び、「文章のスクロール表示」内に
|
|
* アライメントを変更する制御文字を追加します。
|
|
* 追加される制御文字は、
|
|
*
|
|
* \LL 文字を左寄せにします。
|
|
* \CL 文字を中央寄せにします。
|
|
* \RL 文字を右寄せにします。
|
|
*
|
|
* の3つです。
|
|
* 呼び出された時点で、同ページのそれより下の行は自動的に
|
|
* 設定したアライメントに変更されます。
|
|
*
|
|
* ※プラグインパラメータについて
|
|
*
|
|
* プラグインパラメータで指定した制御文字は、幅0として計算される
|
|
* ようになります。
|
|
*
|
|
* この際、制御文字が\aの場合は、aを指定します。
|
|
* 制御文字が\a[x]の場合は、aのみを指定します。
|
|
*
|
|
* 指定する制御文字はカンマ区切りで複数個指定可能です。
|
|
* a,b,d
|
|
* と指定すると、\a及び\a[x]、\b及び\b[x]、\d及び\d[x]が、
|
|
* 文字幅0として計算されます。
|
|
*
|
|
* ------------------------------------------------------
|
|
* 利用規約
|
|
* ------------------------------------------------------
|
|
* 当プラグインはMITライセンスで公開されています。
|
|
* 使用に制限はありません。商用、アダルト、いずれにも使用できます。
|
|
* 二次配布も制限はしませんが、サポートは行いません。
|
|
* 著作表示は任意です。行わなくても利用できます。
|
|
* 要するに、特に規約はありません。
|
|
* バグ報告や使用方法等のお問合せはネ実ツクールスレ、または、Twitterにお願いします。
|
|
* https://twitter.com/yanatsuki_
|
|
* 素材利用は自己責任でお願いします。
|
|
* ------------------------------------------------------
|
|
* 更新履歴:
|
|
* ver1.04:
|
|
* 一つの行に複数の色変更やアイコンがあった時、正常にテキストの幅が取得できないバグを修正。
|
|
* ver1.03:
|
|
* 拡張制御文字に合わせて処理を修正。
|
|
* ver1.02:
|
|
* プラグインパラメータに何も指定していない時、アライメント指定が正常に機能しないバグを修正。
|
|
* ver1.01:
|
|
* 文章のスクロール表示に対応。
|
|
* }{を使用すると、正常に文字の横幅を取得できていなかったバグを修正。
|
|
* 指定した制御文字を幅0で計算するためのパラメータを追加。
|
|
* ver1.00:
|
|
* 公開
|
|
*/
|
|
|
|
(function () {
|
|
////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
var parameters = PluginManager.parameters("MessageAlignmentEC");
|
|
var extendEC = parameters["ExtendEC"].split(",");
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
Window_Base.prototype.textWidthEx = function (text) {
|
|
var result = 0;
|
|
text = text.replace(/\x1bC\[\d+\]/gi, "");
|
|
text = text.replace(
|
|
/\x1bI\[\d+\]/gi,
|
|
function () {
|
|
result += Window_Base._iconWidth;
|
|
return "";
|
|
}.bind(this)
|
|
);
|
|
for (var i = 0, max = text.length; i < max; i++) {
|
|
var c = text[i];
|
|
if (c === "\x1b") {
|
|
i++;
|
|
c = text[i];
|
|
if (c === "{") {
|
|
this.makeFontBigger();
|
|
} else if (c === "}") {
|
|
this.makeFontSmaller();
|
|
} else if (c === "F" && text[i + 1] === "S") {
|
|
var cc = "\x1b";
|
|
for (var j = i; j < max; j++) {
|
|
cc += text[j];
|
|
if (text[j] === "]") {
|
|
if (cc.match(/\x1bFS\[(\d+)\]/i))
|
|
this.contents.fontSize = Number(RegExp.$1);
|
|
i = j;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
result += this.textWidth(c);
|
|
}
|
|
}
|
|
return result;
|
|
};
|
|
|
|
Window_Base.prototype.setAlignment = function (text, col, max) {
|
|
if (this._aligns === undefined) {
|
|
this._aligns = [];
|
|
}
|
|
text = text.replace(
|
|
/\x1bLL/i,
|
|
function () {
|
|
for (var j = col; j < max; j++) {
|
|
this._aligns[j] = null;
|
|
}
|
|
return "";
|
|
}.bind(this)
|
|
);
|
|
text = text.replace(
|
|
/\x1bCL/i,
|
|
function () {
|
|
for (var j = col; j < max; j++) {
|
|
this._aligns[j] = "center";
|
|
}
|
|
return "";
|
|
}.bind(this)
|
|
);
|
|
text = text.replace(
|
|
/\x1bRL/i,
|
|
function () {
|
|
for (var j = col; j < max; j++) {
|
|
this._aligns[j] = "right";
|
|
}
|
|
return "";
|
|
}.bind(this)
|
|
);
|
|
return text;
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// 再定義
|
|
Window_ScrollText.prototype.refresh = function () {
|
|
var textState = { index: 0 };
|
|
textState.text = this.convertEscapeCharacters(this._text);
|
|
this.resetFontSettings();
|
|
this._allTextHeight = this.calcTextHeight(textState, true);
|
|
var texts = this._text.split("\n");
|
|
this.createContents();
|
|
this.origin.y = -this.height;
|
|
var yy = 0;
|
|
var fontSize = this.contents.fontSize;
|
|
this._aligns = [];
|
|
for (var i = 0, max = texts.length; i < max; i++) {
|
|
var text = texts[i];
|
|
var text2 = this.convertEscapeCharacters(text);
|
|
if (fontSize > this.standardFontSize()) {
|
|
var n = Math.ceil((fontSize - this.standardFontSize()) / 12);
|
|
for (var j = 0; j < n; j++) {
|
|
text = "\\{" + text;
|
|
}
|
|
}
|
|
if (fontSize < this.standardFontSize()) {
|
|
text = "\\}" + text;
|
|
}
|
|
var height = this.calcTextHeight({ index: 0, text: text2 }, false);
|
|
text2 = this.setAlignment(text2, i, max);
|
|
var textWidth = this.textWidthEx(text2);
|
|
var sx = 0;
|
|
if (this._aligns[i] === "center") {
|
|
sx = (this.contentsWidth() - this.textPadding() - textWidth) / 2;
|
|
} else if (this._aligns[i] === "right") {
|
|
sx = this.contentsWidth() - this.textPadding() - textWidth;
|
|
}
|
|
this.drawTextEx(text, this.textPadding() + sx, 1 + yy);
|
|
fontSize = this.contents.fontSize;
|
|
yy += height;
|
|
}
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
var __WMessage_startMessage = Window_Message.prototype.startMessage;
|
|
Window_Message.prototype.startMessage = function () {
|
|
this._callStart = true;
|
|
__WMessage_startMessage.call(this);
|
|
this._callStart = false;
|
|
};
|
|
|
|
Window_Message.prototype.checkTextWidth = function () {
|
|
this._currentPage = 0;
|
|
var texts = this._textState.text.split("\n");
|
|
this._corX = [0, 0, 0, 0];
|
|
this._aligns = [];
|
|
var fontSize = this.contents.fontSize;
|
|
var ary = this.zeroWidthEscapes();
|
|
for (var i = 0, max = texts.length; i < max; i++) {
|
|
var text = texts[i];
|
|
for (var j = 0, jmax = ary.length; j < jmax; j++) {
|
|
var regExp = new RegExp("\\x1b" + ary[j] + "(?:\\[.+?\\])*", "gi");
|
|
text = text.replace(regExp, "");
|
|
}
|
|
text = this.setAlignment(text, i, max);
|
|
this._corX[i] = this.textWidthEx(text);
|
|
}
|
|
this.contents.fontSize = fontSize;
|
|
};
|
|
|
|
Window_Message.prototype.zeroWidthEscapes = function () {
|
|
var ary = ["\\.", "\\|", "\\$", ">", "<", "!", "\\^"];
|
|
if (extendEC.length > 0 && extendEC[0] !== "") {
|
|
ary = ary.concat(extendEC);
|
|
}
|
|
if (Imported["yExtendEscapeCharacters"]) {
|
|
var ary2 = [
|
|
"BGM",
|
|
"BGS",
|
|
"SE",
|
|
"ME",
|
|
"FRT",
|
|
"FFV",
|
|
"FFH",
|
|
"FO",
|
|
"FCI",
|
|
"FSN",
|
|
"FCT",
|
|
"FBC",
|
|
"WC",
|
|
"WCW",
|
|
"DWC",
|
|
"DWCW",
|
|
"MMW",
|
|
"RMW",
|
|
"OMW",
|
|
"BLN",
|
|
"ANI",
|
|
"SPIC",
|
|
"MPIC",
|
|
"ZPIC",
|
|
"OPIC",
|
|
"ORPIC",
|
|
"RPIC",
|
|
"APIC",
|
|
"TPIC",
|
|
"NCPIC",
|
|
"CFPIC",
|
|
"CTPIC",
|
|
"CXPIC",
|
|
"BNPIC",
|
|
"FIPIC",
|
|
"FOPIC",
|
|
];
|
|
ary = ary.concat(ary2);
|
|
}
|
|
if (Imported["StandPictureEC"]) {
|
|
var ary2 = [
|
|
"WT",
|
|
"SP",
|
|
"HP",
|
|
"CP",
|
|
"RP",
|
|
"MP",
|
|
"ZP",
|
|
"RMP",
|
|
"RRP",
|
|
"RZP",
|
|
"TP",
|
|
"CFP",
|
|
"COP",
|
|
"BCP",
|
|
"LS",
|
|
"LE",
|
|
"BP",
|
|
"OP",
|
|
"SFR",
|
|
"SBK",
|
|
"MC",
|
|
"RMC",
|
|
"ZC",
|
|
"RZC",
|
|
"RC",
|
|
"RRC",
|
|
"RPC",
|
|
"ZPC",
|
|
"SAC",
|
|
];
|
|
ary = ary.concat(ary2);
|
|
}
|
|
return ary;
|
|
};
|
|
|
|
var __WMessage_newLineX = Window_Message.prototype.newLineX;
|
|
Window_Message.prototype.newLineX = function () {
|
|
if (this._callStart) {
|
|
this.checkTextWidth();
|
|
}
|
|
var newX = __WMessage_newLineX.call(this);
|
|
var width = this.contents.width;
|
|
if (this._rightFace) {
|
|
width -= 168;
|
|
}
|
|
if (this._aligns[this._currentPage] === "center") {
|
|
newX = (width - newX - this._corX[this._currentPage]) / 2 + newX;
|
|
} else if (this._aligns[this._currentPage] === "right") {
|
|
newX = width - this._corX[this._currentPage];
|
|
}
|
|
return newX;
|
|
};
|
|
|
|
var __WMessage_processNewLine = Window_BattleLog.prototype.processNewLine;
|
|
Window_Message.prototype.processNewLine = function (textState) {
|
|
__WMessage_processNewLine.call(this, textState);
|
|
this._currentPage += 1;
|
|
this._textState.x = this.newLineX();
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////
|
|
})();
|