//
//  ログウィンドウ&蓄積型戦闘ログ ver1.04
//
// ------------------------------------------------------
// Copyright (c) 2016 Yana
// Released under the MIT license
// http://opensource.org/licenses/mit-license.php
// ------------------------------------------------------
//
// author Yana
//

var Imported = Imported || {};
Imported['StackBattleLog'] = 1.04;

/*:
 * @plugindesc ver1.04/戦闘ログを蓄積型に変更し、戦闘ログを表示するパーティコマンドを追加します。
 * @author Yana
 * 
 * @param Stack Log UseLog
 * @desc パーティコマンドにログのコマンドを追加するかの設定です。
 * true/falseで設定してください。
 * @default true
 * 
 * @param Stack Log UseStack
 * @desc 戦闘ログを蓄積型に変更するかの設定です。
 * true/falseで設定してください。
 * @default true
 * 
 * @param Stack Log Text
 * @desc パーティコマンドに表示するコマンドの名前です。
 * @default Log
 * 
 * @param Stack Log Start
 * @desc ログウィンドウに表示する戦闘開始のテキストです。
 * @default ------Start Battle------
 * 
 * @param Stack Log TurnEnd
 * @desc ログウィンドウに表示するターン終了のテキストです。
 * %dをターン数に変換します。
 * @default ------ %d Turn End------
 * 
 * @param Stack Log MaxLines
 * @desc 戦闘ログの最大行数です。
 * @default 6
 * 
 * @param Stack Log FontSize
 * @desc 戦闘ログ及びログウィンドウの文字サイズです。
 * @default 24
 *
 * @param Stack Log Size
 * @desc 蓄積するログの行数です。
 * @default 100
 *
 * @help このプラグインにはプラグインコマンドはありません。
 * ------------------------------------------------------
 * 仕様
 * ------------------------------------------------------
 * このプラグインは、同時に以下の制御文字を追加します。
 * 
 * \FS[FontSize]
 * メッセージなど、drawTextExを使用しているテキストの文字サイズを
 * FontSizeに変更します。
 * この制御文字は\{や\}と違い、最小値、最大値を持ちません。
 * ------------------------------------------------------
 * 利用規約
 * ------------------------------------------------------
 * 当プラグインはMITライセンスで公開されています。
 * 使用に制限はありません。商用、アダルト、いずれにも使用できます。
 * 二次配布も制限はしませんが、サポートは行いません。
 * 著作表示は任意です。行わなくても利用できます。
 * 要するに、特に規約はありません。
 * バグ報告や使用方法等のお問合せはネ実ツクールスレ、または、Twitterにお願いします。
 * https://twitter.com/yanatsuki_
 * 素材利用は自己責任でお願いします。
 * ------------------------------------------------------
 * ver1.04:YEP_MessageCoreとの競合を回避
 * ver1.03:制御文字の変換が正常に行われていないバグを修正
 *		  :100行を超えるログを削除する際、正常に削除できていなかったバグを修正
 *		  :残っていたconsole.logを削除
 * ver1.01:パーティコマンドのログを無効化する設定にしていても、正常に動作しないバグを修正
 * ver1.00:公開
 *
 */

(function() {
	
	var parameters = PluginManager.parameters('StackBattleLog');
	var stackLogUseLog = String(parameters['Stack Log UseLog'] || "true") == "true";
	var stackLogUseStack = String(parameters['Stack Log UseStack'] || "true") == "true";
	var stackLogText = String(parameters['Stack Log Text'] || "Log");
	var stackLogStart = String(parameters['Stack Log Start'] || "------Start Battle------");
	// %dをターン数に変換します。
	var stackLogTurnEnd = String(parameters['Stack Log TurnEnd'] || "------ %d Turn End------");
	var stackLogMaxLines = Number(parameters['Stack Log LineMax'] || 6);
	var stackLogFontSize = Number(parameters['Stack Log FontSize'] || 24);
	var stackLogSize = Number(parameters['Stack Log Size'] || 24);
	
	
	// ログウィンドウの制御に関する部分です。
	Game_Temp.prototype.addLog = function (text){
		this._battleLog = this._battleLog || [];
		if (this._battleLog.length > stackLogSize){
			this._battleLog.shift();
		}
		this._battleLog.push(text);
	};
	
	Game_Temp.prototype.battleLog = function () {
		return (this._battleLog || []);
	};
	
	var _stacklogw_Window_BattleLog_addText = Window_BattleLog.prototype.addText;
	Window_BattleLog.prototype.addText = function(text){
		//text = ('00000'+Graphics.frameCount).slice(-6) + ':' + text//
		text = "\\FS[" + stackLogFontSize + "]" + text;
		_stacklogw_Window_BattleLog_addText.call(this,text);
		$gameTemp.addLog(text);
	};
	
	var _stacklogw_Game_Message_add = Game_Message.prototype.add;
	Game_Message.prototype.add = function(text){
		_stacklogw_Game_Message_add.call(this,text);
		text = "\\FS[" + stackLogFontSize + "]" + text;
		if ($gameParty.inBattle()) { $gameTemp.addLog(text) }
	};
	
	var _stacklogw_BattleManager_startBattle = BattleManager.startBattle;
	BattleManager.startBattle = function() {
		var text = stackLogStart;
		text = "\\FS[" + stackLogFontSize + "]" + text;
		$gameTemp.addLog(text);
		_stacklogw_BattleManager_startBattle.call(this);
	};
	
	var _stacklogw_BattleManager_endTurn = BattleManager.endTurn;
	BattleManager.endTurn = function(){
		var text = stackLogTurnEnd;
		text = "\\FS[" + stackLogFontSize + "]" + text;
		text = text.replace(/%d/g,$gameTroop._turnCount);
		$gameTemp.addLog(text);
		_stacklogw_BattleManager_endTurn.call(this);
	};
	
	function Window_StackLog() {
		this.initialize.apply(this, arguments);
	};

	Window_StackLog.prototype = Object.create(Window_Selectable.prototype);
	Window_StackLog.prototype.constructor = Window_StackLog;
	
	Window_StackLog.prototype.initialize = function(){
		var x = 64;
		var y = 64;
		var width = Graphics.boxWidth - 128;
		var height = Graphics.boxHeight - 128;
		Window_Selectable.prototype.initialize.call(this, x, y, width, height);
		this.openness = 0;
		this.refresh();
	};
	
	Window_StackLog.prototype.contentsHeight = function() {
		return (this.lineHeight() * this.maxItems());
	};
	
	Window_StackLog.prototype.maxItems = function() {
		if ($gameTemp.battleLog() == []) {
			return 1;
		}else{
			return $gameTemp.battleLog().length;
		}
	};
	
	Window_StackLog.prototype.drawItem = function(index)　{
		var text = $gameTemp.battleLog()[index];
		var y = this.lineHeight() * (index - this.topRow());
		if (text){
			this.drawTextEx(text,0,y);
		}
	};
	
	Window_StackLog.prototype.refresh = function() {
		this.createContents();
		Window_Selectable.prototype.refresh.call(this);
	};
	Window_StackLog.prototype.lineHeight = function() {
		return stackLogFontSize + 8;
	};
	Scene_Battle.prototype.createStackLogWindow = function() {
		this._stackLogWindow = new Window_StackLog();
    	this._stackLogWindow.setHandler('ok',     this.onLogOk.bind(this));
    	this._stackLogWindow.setHandler('cancel', this.onLogOk.bind(this));
		this.addWindow(this._stackLogWindow);
	};
	var _stacklogw_Scene_Battle_createPartyCommandWindow = Scene_Battle.prototype.createPartyCommandWindow;
	Scene_Battle.prototype.createPartyCommandWindow = function() {
		_stacklogw_Scene_Battle_createPartyCommandWindow.call(this);
		if(stackLogUseLog) { this._partyCommandWindow.setHandler('log', this.commandLog.bind(this)) };
	};
	var _stacklogw_Scene_Battle_createAllWindows = Scene_Battle.prototype.createAllWindows;
	Scene_Battle.prototype.createAllWindows = function() {
		_stacklogw_Scene_Battle_createAllWindows.call(this);
		this.createStackLogWindow();
	};
	
	var _stacklogw_Scene_Battle_isAnyInputWindowActive = Scene_Battle.prototype.isAnyInputWindowActive;
	Scene_Battle.prototype.isAnyInputWindowActive = function() {
		return (_stacklogw_Scene_Battle_isAnyInputWindowActive.call(this) || this._stackLogWindow.active);
    };

	var _stacklogw_Scene_Battle_changeInputWindow = Scene_Battle.prototype.changeInputWindow;
	Scene_Battle.prototype.changeInputWindow = function() {
		if(!this._stackLogWindow.active){ 
			_stacklogw_Scene_Battle_changeInputWindow.call(this);
		}
	};
	
	Scene_Battle.prototype.commandLog = function() {
		this._stackLogWindow.refresh();
		this._stackLogWindow.open();
		this._stackLogWindow.activate();
		this._stackLogWindow.select($gameTemp.battleLog().length - 1);
		this._partyCommandWindow.deactivate();
	};
	
	Scene_Battle.prototype.onLogOk = function() {
		this._stackLogWindow.close();
		this._stackLogWindow.deactivate();
		this._partyCommandWindow.activate();
	};
	
	var _stacklogw_Window_PartyCommand_makeCommandList = Window_PartyCommand.prototype.makeCommandList;
	Window_PartyCommand.prototype.makeCommandList = function() {
		_stacklogw_Window_PartyCommand_makeCommandList.call(this);
   		if(stackLogUseLog) { this.addCommand(stackLogText,  'log') }
	};
	
	//　ログをスタック式に変換する部分です。
	
	// 再定義
	Window_BattleLog.prototype.lineHeight = function() {
		return stackLogFontSize + 8;
	};
	
	if (stackLogUseStack) { //　蓄積型ログを使用する時のみ定義を行います。
	// エイリアス　ただし、再定義に近い
	var _stacklogw_Window_BattleLog_clear = Window_BattleLog.prototype.clear;
	Window_BattleLog.prototype.clear = function() {
		  this.refresh();
	};
	Window_BattleLog.prototype.logClear = function() {
		_stacklogw_Window_BattleLog_clear.call(this)
	};
	// 再定義
	Window_BattleLog.prototype.maxLines = function() {
		return stackLogMaxLines;
	};
	//　再定義
	Window_BattleLog.prototype.popBaseLine = function() {
	};
	var _stacklogw_Window_BattleLog_refresh = Window_BattleLog.prototype.refresh;
	Window_BattleLog.prototype.refresh = function() {
		var text = "\\FS[" + stackLogFontSize + "]";
		this.drawTextEx(text,0,0,24); // 変更したダミーの文字を送ることでテキストの高さを調整する。
		_stacklogw_Window_BattleLog_refresh.call(this);
	};
	// 再定義
	Window_BattleLog.prototype.drawLineText = function(index) {
		var length = this._lines.length;
		var topLength = length - this.maxLines();
		if (topLength < 0) { topLength = 0 }
		if (index < topLength){ return }
	    var indexPos = index - topLength;
	    var rect = this.itemRectForText(indexPos);
	    
	    this.contents.clearRect(rect.x, rect.y, rect.width, rect.height);
	    this.drawTextEx(this._lines[index], rect.x, rect.y, rect.width);
	};
	var _stacklogw_Window_BattleLog_numLines = Window_BattleLog.prototype.numLines;
	Window_BattleLog.prototype.numLines = function() {
		var n = _stacklogw_Window_BattleLog_numLines.call(this);
		if ( n >= this.maxLines() ) {
			return this.maxLines();
		}else{
			return n;
		}
	};
	var _stacklogw_Scene_Battle_selectEnemySelection =  Scene_Battle.prototype.selectEnemySelection;
	Scene_Battle.prototype.selectEnemySelection = function() {
		_stacklogw_Scene_Battle_selectEnemySelection.call(this);
                this._logWindow.logClear();
	};
	var _stacklogw_Scene_Battle_update = Scene_Battle.prototype.update;
	Scene_Battle.prototype.update = function() {
		_stacklogw_Scene_Battle_update.call(this);
		if (BattleManager.isAborting() || BattleManager.isBattleEnd()|| $gameSwitches.value(10)) { this._logWindow.logClear() };
	};
	}// 蓄積型ログ専用処理はここまでです。


	if (!Imported.YEP_MessageCore) {
		// \FS[FontSize]の制御文字を追加する部分です。
		var _stacklogw_Window_Base_processEscapeCharacter = Window_Base.prototype.processEscapeCharacter;
		Window_Base.prototype.processEscapeCharacter = function (code, textState) {
			if (code === 'FS') {
				this.makeFontSize(this.obtainEscapeParam(textState));
			} else {
				_stacklogw_Window_Base_processEscapeCharacter.call(this, code, textState);
			}
		};
	}
	Window_Base.prototype.makeFontSize = function(fontSize) {
        //if (fontSize >= 96){ fontSize = 96 };
       	//if (fontSize <= 24){ fontSize = 24 };
       	this.contents.fontSize = fontSize;
	};
	
})();