#include <GConsoleLib.h>
#include <stdio.h>
#include <string.h>
#include <wchar.h>
#include <stdlib.h>
#include <time.h>
#include <locale.h>

//画像データ
char *g_backimage = "C:\\GConsole追加ファイル\\sampleimg\\chap6-1-back.png";
char *g_faceimage[] = {
	"C:\\GConsole追加ファイル\\sampleimg\\chap6-1-bad.png",
	"C:\\GConsole追加ファイル\\sampleimg\\chap6-1-natural.png",
	"C:\\GConsole追加ファイル\\sampleimg\\chap6-1-good.png"
};
char g_imagebuf[256];	//コマンドのファイルパスを記憶しておくバッファ

//グローバル変数
wchar_t g_name[80];	//プレーヤーの名前
int g_loverate = 50;	//好感度
wchar_t g_talkbuf[256];	//会話バッファ
#define SCLINEMAX 100	//シナリオの行数
#define SCLINELEN 256	//シナリオ1行の文字数
wchar_t g_scenario[SCLINEMAX][SCLINELEN];
int g_screadlines = 0;	//読み込んだ行数

//関数プロトタイプ宣言
void DrawScreen();
void AnalyzeTalk();

int main(){
	srand( (unsigned int)time(NULL) );
	//ワイド文字変換用のロケール設定
	setlocale(LC_ALL,"japanese");
	//ファイル読み込み
	FILE *fp;
	if( fopen_s(&fp, "scenario.txt", "r") != 0 ) {
		printf("ファイル読み込みエラー\n");
		return -1;
	}
	while(fgetws( g_scenario[g_screadlines], SCLINELEN, fp ) != NULL){
		int len = wcslen(g_scenario[g_screadlines]);
		g_scenario[g_screadlines][len-1] = L'\0';	//改行削除
		wprintf(L"%s\n", g_scenario[g_screadlines]);	//確認
		g_screadlines++;
	}
	fclose(fp);

	gcls();
	gfront();

	DrawScreen();
	//名前入力
	glocate(0,14);
	wchar_t ans;
	do{
		gwprintf(L"\nあなたの名前を入力してください");
		ggetws(g_name, 80);
		//名前の長さチェック
		int len = wcslen(g_name);
		if(len==0) wcscpy_s(g_name, 80, L"さとし");
		gwprintf(L"\n名前は%sで合っていますか？（y/n）", g_name);
		ans = ggetwchar();
	} while(ans != L'y' && ans != L'ｙ');
	
	//シナリオ解析
	for(int curline = 0; curline < g_screadlines; curline++){
		if(g_scenario[curline][0] != L'#'){
			//通常のセリフ
			gcolor(255, 80, 80);
			gwprintf(L"%s\n", g_scenario[curline]);
			ggetwchar();	//待機
		} else {
			//コマンド
			if(wcsstr(g_scenario[curline], L"#back") != NULL){
				//背景変更
				//ファイルパスをg_imagebufへコピー
				unsigned int num;
				wcstombs_s(&num, g_imagebuf, 256, 
					&g_scenario[curline][6], 255 );
				g_backimage = g_imagebuf;
				DrawScreen();
			} else if(wcsstr(g_scenario[curline], L"#free") != NULL){
				//フリートーク
				int freetalkcnt;
				swscanf_s(g_scenario[curline], 
					L"#free %d", &freetalkcnt);
				//会話
				gcls();
				DrawScreen();
				glocate(0,15); gcolor(255, 80, 80);
				gwprintf(L"%s君。お話ししようよ\n", g_name);
				for(int i = 0; i<freetalkcnt; i++){
					gcolor(0, 0, 200);
					ggetws(g_talkbuf, 256);
					gwprintf(L"\n");
					gcolor(255, 80, 80);
					AnalyzeTalk();
				}
			}
		}
	}

}

//画面表示
void DrawScreen(){
	gimage(g_backimage, 0,24);
	//好感度によって表情を変える
	int level = 1;
	if(g_loverate <= 25) level = 0; 
	else if(g_loverate >= 75) level = 2;
	gimage(g_faceimage[level], 160,64);
}

//AnalyzeTalkで使用するキーワードのグローバル変数
wchar_t* g_goodkeyword[] = {
	L"ケーキ", L"ショッピング", L"花束"
};
wchar_t* g_badkeyword[] = {
	L"毛虫", L"蛇", L"カエル", L"わりかん"
};
//ランダムキーワード
wchar_t* g_randomtalk1[] = {
	L"なにかしゃべってよ", L"無口だね", L"無視しないで",
	L"お腹すいてない？"
};
wchar_t* g_randomtalk2[] = {
	L"ふ〜ん", L"そうだね", L"びみょ〜",
	L"気持ちはわかるよ"
};

//会話解析
void AnalyzeTalk(){
	//セリフが入力されていないときの反応
	if(wcslen(g_talkbuf) == 0){
		int rt1num = sizeof(g_randomtalk1) / sizeof(wchar_t*);
		gwprintf(L"%s\n",g_randomtalk1[ rand() % rt1num ]);
		return;
	}

	int gknum = sizeof(g_goodkeyword) / sizeof(wchar_t*);
	int bknum = sizeof(g_badkeyword) / sizeof(wchar_t*);

	int goodfeeling = 0, badfeeling = 0;
	//よいキーワードを検索
	for(int i=0; i<gknum; i++){
		if( wcsstr(g_talkbuf, g_goodkeyword[i]) != NULL){
			goodfeeling += 10;
			gwprintf(L"%sいいよね\n", g_goodkeyword[i]);
		}
	}
	//悪いキーワードを検索
	for(int i=0; i<bknum; i++){
		if( wcsstr(g_talkbuf, g_badkeyword[i]) != NULL){
			badfeeling += 10;
			gwprintf(L"%sキライ\n", g_badkeyword[i]);
		}
	}
	//キーワード一致なし
	if(goodfeeling == 0 && badfeeling == 0){
		int rt2num = sizeof(g_randomtalk2) / sizeof(wchar_t*);
		gwprintf(L"%s\n", g_randomtalk2[ rand() % rt2num ]);
	}
	
	//現在のレベル
	int oldlevel = 1, newlevel = 1;
	if(g_loverate <= 25) oldlevel = 0; 
	else if(g_loverate >= 75) oldlevel = 2;
	//変化を好感度に反映
	g_loverate += goodfeeling - badfeeling;
	//新しいレベル
	if(g_loverate <= 25) newlevel = 0; 
	else if(g_loverate >= 75) newlevel = 2;
	if( oldlevel != newlevel ) {
		DrawScreen();
	}
}