//=============================================================================
// GameCustom.js
//=============================================================================

/*:ja
 * @plugindesc 
 * @author Milk Force
 * 
 * 
 * @help
 */
 
var $event_control=null;
 
(function() {
	'use strict';
	
	
	//にゅーげーむ
	var _Scene_Title_prototype_commandNewGame=Scene_Title.prototype.commandNewGame;	
	Scene_Title.prototype.commandNewGame=function(){
		_Scene_Title_prototype_commandNewGame.call(this);
		
		$event_control=new EventControl();
		$event_control.initNewGame();
		$event_control.initCommonFlg();
		
		//$event_control.testFlgAllOpen();//テスト用
		
		$sprite_progress=new Sprite_Progress();
		
	};
	
	//ロード
	var _Scene_Load_prototype_onSavefileOk=Scene_Load.prototype.onSavefileOk;
	Scene_Load.prototype.onSavefileOk = function() {
		_Scene_Load_prototype_onSavefileOk.call(this);
		
		$event_control=new EventControl();
		$event_control.initCommonFlg();
		
		$sprite_progress=new Sprite_Progress();
	};

	
	//マップの切替時 夜間トーン切替 BGM切替
	var _Scene_Map_prototype_onMapLoaded=Scene_Map.prototype.onMapLoaded;
	Scene_Map.prototype.onMapLoaded = function() {
		_Scene_Map_prototype_onMapLoaded.call(this);
		
		updateMapStatus();
	};
	
	/*　ピクチャ反転 -100%にするしか方法がない？ this._mirrorで検索
  	var MIRROR_IDS=[30,31,32,33,34,35,36,37,38,39];
	var _Sprite_Picture_prototype_initialize=Sprite_Picture.prototype.initialize;
	Sprite_Picture.prototype.initialize = function(pictureId) {
		_Sprite_Picture_prototype_initialize.call(this,pictureId);
		if(MIRROR_IDS.indexOf(pictureId) >= 0){
			this._mirror=true;
		}else{
			console.log(this);	
		}
	};
	*/

	function EventControl(){
		this.initialize.apply(this,arguments);
	};
	
	EventControl.prototype.initialize=function(){
		this._game_span=7;//ゲームの日数

		this._moral_max=100;//MPの最大値
		this._moral_min=0;//MPの最小値
		
		this._moral_alert=10;//MP注意メッセージを表示するポイント
		
		this._event_id_start	=101;//イベントIDの開始位置 達成率計算用
		this._event_id_end	=150;//イベントIDの終了位置 イベントを追加したら調整が必要
		
		this._event_id_save_start=90;//達成済イベントIDの保存範囲 開始
		this._event_id_save_end=200;//達成済イベントIDの保存範囲 終了
		
		this._common_item_ids=[3,4,5,6];
		
		this._furin_ids=[105,108,109,112,120,121,130,139];//不倫扱いになるイベントID
	};
	
	
	
	//ニューゲーム時のフラグ・変数調整
	EventControl.prototype.initNewGame=function(){
		$gameSwitches.setValue(1,false); //ゲーム終了フラグ
		$gameSwitches.setValue(3,true);  //昼間フラグon
		$gameSwitches.setValue(2,false); //夜間フラグoff
		$gameSwitches.setValue(4,true);  //ジョンは死んでないフラグ on
		$gameSwitches.setValue(6,false); //進行度表示フラグ
		$gameSwitches.setValue(10,false);//MP表示フラグ
 		$gameSwitches.setValue(14,false);//村長の死亡フラグ
		
		$gameVariables.setValue(1,100);//残りMP
		$gameVariables.setValue(92,0);//通常エンディング種別
		$gameVariables.setValue(98,this._game_span); //ゲームの日数
		$gameVariables.setValue(99,0); //ゲームの時間帯 0:昼間,1:夜間
		$gameVariables.setValue(100,1);//経過日数
	
	};
	
	//共通セーブから解放済みイベントIDや取得済みキーアイテムを読み込む
	EventControl.prototype.initCommonFlg=function(){
		for(var i= this._event_id_save_start; i<=this._event_id_save_end;i++){
			if(Number($common_save.get("ev_"+i.toString()))==1){
				$gameSwitches.setValue(i,true);	
			}
		}
		
		for(i in this._common_item_ids){
			if(Number($common_save.get("item_"+this._common_item_ids[i].toString()))==1){
				if(!$gameParty.hasItem($dataItems[this._common_item_ids[i]])){
					//持ってないアイテムのみ追加
					$gameParty.gainItem($dataItems[this._common_item_ids[i]],1);
				}
			}
		}
	}
	
	//テスト用 フラグを全て開ける
	EventControl.prototype.testFlgAllOpen=function(){
		for(var i= this._event_id_save_start; i<=this._event_id_save_end;i++){
			$gameSwitches.setValue(i,true);	
		}
		for(i in this._common_item_ids){
			if(!$gameParty.hasItem($dataItems[this._common_item_ids[i]])){
				//持ってないアイテムのみ追加
				$gameParty.gainItem($dataItems[this._common_item_ids[i]],1);
			}	
		}
	};
	//テスト用 特定イベントのフラグを閉じる
	EventControl.prototype.testFlgClose=function(event_id){
		$common_save.set("ev_"+event_id.toString(),0);
		$gameSwitches.setValue(event_id,false);	
		
	};
	
	
	//event_id=0ならMPの変更はなし
	//event_id=999はMPの回復
	//progress 進める時間１:半日　0:進めない
	EventControl.prototype.complete=function(event_id,progress){
		if(this._event_id_save_start <= event_id && event_id <= this._event_id_save_end){
			$gameSwitches.setValue(event_id,true);//スイッチ操作
			$common_save.set("ev_"+event_id.toString(), 1);//共通セーブにクリアを記録
		}
		//モラル値更新(モラルの増減値を変数[9]に記録
		this.updateMoralDamege(event_id);
		
		if(progress>0){
			//時間を進める
			this.putProgress(progress);
		}
		
		this.updateEndingStatus(event_id);//通常エンドの種別状況を更新
		
	};
	
	
	
	//イベント終了後のモラル値の更新
  	//event_id 999 回復
  	//          1  共通MP減少イベント
	//			2  MP減少無しで1日進める
	//@return モラルの増減値
	EventControl.prototype.updateMoralDamege=function(event_id){
		$gameVariables.setValue(9,0)//直前のMP増減値をリセット
		
		var damege=10;
		
		if(event_id==undefined){
			event_id=1;
		}
		event_id=Number(event_id);
				
		switch(event_id){	
			case 0:
			case 2:
			case 101:
				//MP増減なし	
				damege=0;
				break;
			case 999:
				//回復
				damege = -damege;
				break;
		}
		
		var tmp_moral=$gameVariables.value(1)-damege;
		
		if(tmp_moral > this._moral_max){
			damege=damege-(tmp_moral-this._moral_max);//上限からはみ出た部分を除算
			tmp_moral=this._moral_max;
			
		}else if(tmp_moral == this._moral_alert && damege > 0){
			$gameSwitches.setValue(10,true);//モラルアラート表示フラグを立てる
			
		}else if(tmp_moral <= this._moral_min){
			damege+=tmp_moral;
			tmp_moral=this._moral_min;
			
			//ゲームオーバー
			//コモンイベント[15:MP増減表示]で判定してコモンイベント[50:ゲームオーバー]を呼び出す
		}
		
		$gameVariables.setValue(1,tmp_moral);
		$gameVariables.setValue(9,-damege);//増減値を格納　符号は反転しておく
		
		if(damege != 0){
			$gameSwitches.setValue(7,true);//進行度表示強制更新フラグ
			//MPの増減が発生した場合のメッセージ表示
			//$gameTemp.reserveCommonEvent(15);//コモンイベント実行
		}
		
		return -damege;//符号反転して返す
	};
	
	//進行状況を進める　progress=1半日 2で一日
	EventControl.prototype.putProgress=function(progress){
		if(progress==undefined){
			progress=1;
		}
		progress=Number(progress);
				
		var day=progress/2; //経過日数
		var time=progress%2; //経過時間帯
		
		if($gameVariables.value(100)<=0){ //経過日数
			$gameVariables.setValue(100,1);
		}
		
		var today=$gameVariables.value(100);
		
		today+=day;//経過日数を加算
		
		if(time>0){
			if($gameVariables.value(99)==1){//夜なら
				$gameVariables.setValue(99,0);//昼にする
				today+=1;//一日進める
				$gameSwitches.setValue(3,true);//昼間フラグ
				$gameSwitches.setValue(2,false);//夜間フラグ
			}else{
				$gameVariables.setValue(99,1);//夜にする
				$gameSwitches.setValue(3,false);//昼間フラグ
				$gameSwitches.setValue(2,true);//夜間フラグ
			}
			$gameSwitches.setValue(25,true);//マップ更新フラグ 夜間切替等の実行用
			$gameSwitches.setValue(7,true);//進行度表示強制更新フラグ
		}
		
		
		this.updateEventProgress(day,time);//時間経過に伴うイベント制御変数の調整
		
		$gameVariables.setValue(100,today);
	};
	
	//通常エンドの種別状況を更新
	EventControl.prototype.updateEndingStatus=function(event_id){
		var status=$gameVariables.value(92);
		
		if($gameVariables.value(92) < 2){
			if(this._furin_ids.indexOf($gameVariables.value(92))>=0){
				status=2;//不倫有り状態
			}else if($gameVariables.value(92)==0){
				if($gameVariables.value(9)<0){//直前にモラルの減少が発生している
					$gameVariables.setValue(92,1);//不倫無し エロイベントあり
				}
			}
		}
	};
	
	//エンディングID
    EventControl.prototype.setEndingID=function(ending_id){
		if(ending_id==undefined){
			ending_id=0;		
		}
   		//$gameSwitches.setValue(6,false);//進行度を非表示
		$gameSwitches.setValue(1,true);//ゲーム終了フラグ このフラグで実行判定
		$gameVariables.setValue(10,ending_id);//エンディングID
			   
		//50 GAME OVER
		//51 魔王エンド
		//52 うさぎエンド
		//53 タリアエンド
		//54 まん汁エンド
		//55 馬鹿王子エンド
	};
	
	//イベント完了後のフラグセット
	EventControl.prototype.setCommonFlg=function(event_id,flg_bool){
		if(flg_bool==undefined){
			flg_bool=true
		}
		$gameSwitches.setValue(event_id,flg_bool);
		
		var set_value=0;
		if(flg_bool){
			set_value=1;
		}
		$common_save.set("ev_"+event_id.toString(), set_value);
	};
	
	//特殊アイテムの取得処理
	EventControl.prototype.getCommonItem=function(item_id,del_flg){
		var set_value=1;
		if(del_flg==true){//削除する場合
			set_value=0;
		}else{
			del_flg=false;	
		}
		$common_save.set("item_"+item_id.toString(), set_value); //共通セーブにセット
		
		if(del_flg){
			//持ち物から除外
			if($gameParty.hasItem($dataItems[item_id])){
				$gameParty.loseItem($dataItems[item_id],99);
			}
		}else{
			//持ち物にアイテムを追加
			if(!$gameParty.hasItem($dataItems[item_id])){
				$gameParty.gainItem($dataItems[item_id],1);
			}
		}
	};
	
	//時間経過に伴うイベント制御変数の調整
	EventControl.prototype.updateEventProgress=function(day,time){
		//野菜泥棒と魔動かかしが終了なら加算　後日譚表示
		if($gameVariables.value(5) == 5){
			$gameVariables.setValue(5,$gameVariables.value(5)+1);
		}
		
		//マン汁マイスター 酒場２F　シオンとドルメコの会話後
		if($gameVariables.value(6) == 1){ 
			$gameVariables.setValue(6,$gameVariables.value(6)+1);
		}
		//アイテム屋全滅カウンター イベント至高のマン汁を放置した時 MAXは４
		if($gameVariables.value(11) > 0 && $gameVariables.value(11) <=3){ 
			$gameVariables.setValue(11,$gameVariables.value(11)+1);
		}
		
		//キャトーレと会話が済んでいて娼館の存在をしってるなら一つ進める
		if($gameVariables.value(15) == 2){
			$gameVariables.setValue(15,$gameVariables.value(15)+1);
		}
		
		//リズがゲロッパにいたずらされそうになってるとこからスタート 基本的には自動進行 村長一家全滅で進行ストップ
		if($gameVariables.value(17) >=3 && $gameVariables.value(17) <= 13 && $gameVariables.value(19)!=99){
			if($gameVariables.value(17)==5){//試合を観に行かなかった場合
				$gameVariables.setValue(17,$gameVariables.value(17)+1);//一つ進める
			}
			$gameVariables.setValue(17,$gameVariables.value(17)+1);
		}
		
		//タリアに水をぶっかけてから半日経過 村長一家全滅
		if($gameVariables.value(19)==3 && $gameVariables.value(99)==1){
			$gameVariables.setValue(19,99);
		}
		
				
		//ミスティとヨサク イベント進行
		if($gameVariables.value(22) == 3){
			$gameVariables.setValue(22,4);
		}
		//ミスティとヨサク イベント進行
		if($gameVariables.value(22) == 6){
			$gameVariables.setValue(22,7);
		}
	};
   
   	//イベント達成率を再計算して変数に格納
   	EventControl.prototype.reloadEventAchivement=function(){
		var ev_count=0;
		var ev_total=this._event_id_end - this._event_id_start + 1;
			 
		for(var i= this._event_id_start; i <= this._event_id_end ;i++){
		   if($gameSwitches.value(i)){
			 ev_count+=1;
		   }
		}
		 
		$gameVariables.setValue(93,ev_count);//達成イベント数
		$gameVariables.setValue(94,ev_total);//総イベント数
		$gameVariables.setValue(95,this._event_id_start);
		$gameVariables.setValue(96,this._event_id_end);
		$gameVariables.setValue(97,0);//達成率
		
		if(ev_count > 0){
			$gameVariables.setValue(97,Math.round((ev_count/ev_total)*100));
		}
		
	}
	
	EventControl.prototype.getMoralMax=function(){
		return this._moral_max;
	};
	
})();
		
//実行中のイベント名を変数２５に代入
 //　\V[25]  で文中表示
function setEventName(){
	$gameVariables.setValue(25,$dataMap.events[$gameMap._interpreter.eventId()].name);
};


function EventComp(event_id,progress){
	if(progress == undefined){
		progress=1;	
	}
	$event_control.complete(event_id,progress);
};

//モラルダメージの更新
function UpdateMoralDamage(event_id){
	$event_control.updateMoralDamege(event_id);
};
//進行状況を一つ進める
function PutProgress(progress){
	$event_control.putProgress(progress);
};

function setCommonFlg(event_id,flg_bool){
	$event_control.setCommonFlg(event_id,flg_bool);
};

//共通アイテムを取得したら呼び出す
function getCommonItem(item_id,del_flg){
	$event_control.getCommonItem(item_id,del_flg);
};

//イベント達成率を再計算して変数に格納
function reloadEventAchivement(){
	$event_control.reloadEventAchivement();
};

function closeFlg(event_id){
	$event_control.testFlgClose(event_id);	
}

function updateMapStatus(){
	var night_map=[3,15,16,41,45];//特定のマップのみ夜間フラグを適用する
	var map_id=$gameMap.mapId();
			
	//夜間トーンを適用するマップの場合
	if(night_map.indexOf(map_id)>=0){
		
		if($gameSwitches.value(2)){//夜なら
			if(!$gameSwitches.value(9)){
				//夜間トーンが効いてないならかける
				$gameScreen.startTint([-68,-68,0,68],0);	
				$gameSwitches.setValue(9,true);
			}				
		}else if($gameSwitches.value(9)){
			//昼で夜間トーンがきいてるなら除去
			$gameScreen.startTint([0,0,0,0],0);
			$gameSwitches.setValue(9,false);
		}
		
		
	//夜間トーンを適用しないマップ	
	}else{
		if($gameSwitches.value(9)){
			$gameScreen.startTint([0,0,0,0],0);
		}
		$gameSwitches.setValue(9,false);
		
	}
	//$gameSwitches.setValue(25,true);//マップが切り替わったフラグを立てる
	
	if(map_id==3){//村マップのBGM切替
		var bgm=Object();
		bgm.pan=0;
		bgm.pitch=100;
		bgm.volume=100;
		if($gameSwitches.value(2)){//夜なら
			bgm.name="CF_Town-03";
		}else{//昼なら
			bgm.name="XP_Field4";	
		}
		AudioManager.playBgm(bgm);
	}			
};

//ゲームの初期化
function resetGame(){
    //共通セーブファイルの削除
    $common_save.data_delete();
    //セーブファイルを全て削除
	for (var i = 0; i <= 20; i++) {
		if (StorageManager.exists(i)) {
			StorageManager.remove(i);
		}
	}
	//StorageManagerの0番目にglobalinfoが格納されている

};





function timestampToUnixtime(timestamp){
	var timestamp = new Date(timestamp);
   
    var year = timestamp.getFullYear();
    var month = timestamp.getMonth() + 1;
    var date = timestamp.getDate();
    var hours = timestamp.getHours();
    var minutes = timestamp.getMinutes();
    var seconds = timestamp.getSeconds();
    
    //return year + '/' + month + '/' + date + ' ' + hours + ':' + minutes + ':' + seconds;
	return year + '/' + zeroPadding(month,2) + '/' + zeroPadding(date,2) + ' ' + zeroPadding(hours,2) + ':' + zeroPadding(minutes,2);// + ':' + seconds;
   
}
var zeroPadding = function(number, digit) {
    var numberLength = String(number).length;
    if (digit > numberLength) {
        return (new Array((digit - numberLength) + 1).join(0)) + number;
    } else {
        return number;
    }
};