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

//画像データ
const char* g_backimage =
"C:\\GConsole追加ファイル\\sampleimg\\chap6-1-back.png";
const 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で使用するキーワードのグローバル変数
const wchar_t* g_goodkeyword[] = {
	L"ケーキ", L"ショッピング", L"花束"
};
const wchar_t* g_badkeyword[] = {
	L"毛虫", L"蛇", L"カエル", L"わりかん"
};
//ランダムキーワード
const wchar_t* g_randomtalk1[] = {
	L"なにかしゃべってよ", L"無口だね", L"無視しないで",
	L"お腹すいてない？"
};
const 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();
	}
}