#include <iostream>
#include <conio.h>
#include <windows.h>
#include <cstdlib>
#include <ctime>
#include <string>
#include <vector>
#include <fstream>
#include <cstdio>
using namespace std;

// 全局变量(全面扩充)
int san = 100, clue = 0, day = 1, deathCount = 0;
int money = 500, courage = 50, sisterFavor = 0;
string playerName;
bool hasDiary = false, hasPhoto = false, hasKey = false;
bool hasLighter = false, hasFood = false, hasRadio = false, hasCard = false;
bool metGhost = false, savedGirl = false, ruleBroken = false;
bool gameWin = false, isHardMode = false, trueEnding = false;
bool visitedBasement = false, visitedRooftop = false, visitedCorridor = false;
string weather[] = {"晴天", "雨天", "雷雨天", "猩红雨夜"};
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

// 函数提前声明(修复编译报错核心)
void showTitle(string t, int c);
void waitKey();
void basementEvent();
void exploreMap();
void useItem();
void shop();
void showRules();
void diaryEvent();
void photoEvent();
void firstNight();
void meetNeighbor();
void whiteSisterEvent();
void rooftopFinal();
void randomEvent();
bool checkSanity();
void daySummary();
void saveGame();
void loadGame();

// 颜色设置
void setColor(int c) {
	SetConsoleTextAttribute(hConsole, c);
}

// 慢速打印
void slowPrint(string t, int s = 30) {
	for(char ch : t) {
		cout << ch;
		Sleep(s);
	}
}

// 显示标题(对齐优化)
void showTitle(string t, int c) {
	system("cls");
	setColor(c);
	cout << "================================" << endl;
	cout << "          " << t << "          " << endl;
	cout << "================================" << endl << endl;
	setColor(7);
}

// 清屏等待
void waitKey() {
	cout << endl << "按任意键继续...";
	getch();
}

// 存档功能
void saveGame() {
	ofstream out("save.txt");
	out << san << " " << clue << " " << day << " " << deathCount << " " << money << " " << courage << " " << sisterFavor << endl;
	out << hasDiary << " " << hasPhoto << " " << hasKey << " " << hasLighter << " " << hasFood << " " << hasRadio << " " << hasCard << endl;
	out << metGhost << " " << savedGirl << " " << ruleBroken << " " << gameWin << " " << isHardMode << endl;
	out << visitedBasement << " " << visitedRooftop << " " << visitedCorridor << " " << trueEnding << endl;
	out << playerName << endl;
	out.close();
	showTitle("存 档 成 功", 10);
	slowPrint("游戏进度已安全保存!");
	Sleep(1000);
}

// 读档功能
void loadGame() {
	ifstream in("save.txt");
	if(!in) {
		showTitle("读 档 失 败", 12);
		slowPrint("未找到存档文件,请开始新游戏!");
		waitKey();
		return;
	}
	in >> san >> clue >> day >> deathCount >> money >> courage >> sisterFavor;
	in >> hasDiary >> hasPhoto >> hasKey >> hasLighter >> hasFood >> hasRadio >> hasCard;
	in >> metGhost >> savedGirl >> ruleBroken >> gameWin >> isHardMode;
	in >> visitedBasement >> visitedRooftop >> visitedCorridor >> trueEnding;
	in >> playerName;
	in.close();
	showTitle("读 档 成 功", 10);
	slowPrint("欢迎回来," + playerName + "!");
	Sleep(1000);
}

// 公寓规则系统
void showRules() {
	showTitle("公 寓 生 存 规 则", 11);
	setColor(14);
	cout << "【1】 晚上11点后绝对不要出门" << endl;
	cout << "【2】 不要回应任何红衣女子的呼唤" << endl;
	cout << "【3】 电梯禁止按7楼,不存在7楼" << endl;
	cout << "【4】 镜子出现第二人影时立刻闭眼" << endl;
	cout << "【5】 听到儿歌时必须捂住耳朵" << endl;
	cout << "【6】 不要接受陌生人的物品" << endl;
	cout << "【7】 凌晨3:33绝对不要看窗外" << endl;
	cout << "【8】 地下室禁止单独进入" << endl;
	cout << "【9】 不要相信穿白衣的女人" << endl;
	cout << "【10】 发现发卡立刻捡起,这是关键" << endl;
	setColor(7);
	cout << endl << "违反规则会触发致命惩罚!" << endl;
	waitKey();
}

// 商店系统
void shop() {
	showTitle("便 民 商 店", 10);
	cout << "当前金钱:" << money << "¥" << endl << endl;
	cout << "1. 打火机(250¥)- 黑暗区域必备" << endl;
	cout << "2. 压缩饼干(200¥)- 恢复40理智" << endl;
	cout << "3. 老式收音机(350¥)- 驱散鬼魂" << endl;
	cout << "4. 护身符(650¥)- 免疫一次死亡" << endl;
	cout << "5. 退出商店" << endl << endl;
	cout << "请选择:";
	char c = getch();
	if(c == '1' && money >= 250) {
		hasLighter = true;
		money -= 250;
		slowPrint("你购买了打火机!");
	} else if(c == '2' && money >= 200) {
		hasFood = true;
		money -= 200;
		slowPrint("你购买了压缩饼干!");
	} else if(c == '3' && money >= 350) {
		hasRadio = true;
		money -= 350;
		slowPrint("你购买了老式收音机!");
	} else if(c == '4' && money >= 650) {
		hasCard = true;
		money -= 650;
		slowPrint("你购买了护身符!");
	} else if(c != '5') slowPrint("金钱不足!");
	waitKey();
}

// 道具使用系统
void useItem() {
	showTitle("道 具 栏", 11);
	cout << "当前持有道具:" << endl;
	if(hasFood) cout << "1. 压缩饼干(恢复40理智)" << endl;
	if(hasLighter) cout << "2. 打火机(黑暗照明)" << endl;
	if(hasRadio) cout << "3. 收音机(驱邪)" << endl;
	if(hasCard) cout << "4. 护身符(免疫死亡)" << endl;
	cout << "5. 退出道具栏" << endl << endl;
	cout << "选择要使用的道具:";
	char c = getch();
	if(c == '1' && hasFood) {
		san += 40;
		if(san > 100) san = 100;
		hasFood = false;
		slowPrint("你吃了饼干,理智恢复了!理智+40");
	} else if(c == '2' && hasLighter) {
		slowPrint("打火机点燃,周围变得明亮!");
		courage += 10;
	} else if(c == '3' && hasRadio) {
		slowPrint("收音机发出白噪音,鬼魂被驱散!");
		metGhost = false;
		san += 10;
	} else if(c == '4' && hasCard) {
		slowPrint("护身符发出微光,守护着你!");
	}
	waitKey();
}

// 区域探索系统
void exploreMap() {
	showTitle("公 寓 地 图", 11);
	cout << "当前天气:" << weather[rand()%4] << endl << endl;
	cout << "1. 自己的房间(安全)" << endl;
	cout << "2. 公寓走廊(中等危险)" << endl;
	cout << "3. 地下室(高危险)" << endl;
	cout << "4. 顶楼(极高危险)" << endl;
	cout << "5. 返回主菜单" << endl << endl;
	cout << "选择探索区域:";
	char c = getch();
	if(c == '1') {
		showTitle("房间", 10);
		slowPrint("你回到房间,这里是唯一安全的地方。");
		san += 5;
	} else if(c == '2') {
		visitedCorridor = true;
		showTitle("公寓走廊", 12);
		slowPrint("走廊灯光闪烁,空气中弥漫着霉味。");
		if(rand()%2 == 0) {
			slowPrint("你捡到了一张纸条!线索+1");
			clue += 1;
		} else {
			slowPrint("你听到了身后的脚步声...\n理智-10");
			san -= 10;
		}
	} else if(c == '3') {
		visitedBasement = true;
		basementEvent();
	} else if(c == '4') {
		visitedRooftop = true;
		if(day < 7) {
			showTitle("顶楼", 12);
			slowPrint("顶楼大门紧锁,只有第七天才能打开!");
		} else rooftopFinal();
	}
	waitKey();
}

// 每日行动菜单
void dailyAction() {
	showTitle("第" + to_string(day) + "天 - 行 动 选 择", 11);
	cout << "1. 区域探索  2. 使用道具  3. 前往商店" << endl;
	cout << "4. 查看规则  5. 保存游戏  6. 读取游戏" << endl;
	cout << endl << "请选择行动:";
	char c = getch();
	if(c == '1') exploreMap();
	else if(c == '2') useItem();
	else if(c == '3') shop();
	else if(c == '4') showRules();
	else if(c == '5') saveGame();
	else if(c == '6') loadGame();
}

// 游戏开场
void gameStart() {
	system("cls");
	setColor(12);
	cout << "╔═════════════════════════════════╗" << endl;
	cout << "║     规 则 怪 谈 - 红 衣 女 孩     ║" << endl;
	cout << "║            完 整 版               ║" << endl;
	cout << "╚═════════════════════════════════╝" << endl << endl;
	setColor(7);
	
	showTitle("难 度 选 择", 11);
	cout << "1. 普通模式(理智正常消耗,新手推荐)" << endl;
	cout << "2. 困难模式(理智双倍消耗,硬核挑战)" << endl;
	char c = getch();
	if(c == '2') isHardMode = true;
	
	showTitle("搬 家 第 一 天", 11);
	cout << "请输入你的名字:";
	cin >> playerName;
	system("cls");
	
	setColor(14);
	cout << "========================================" << endl;
	cout << "           2023年10月15日 雨夜          " << endl;
	cout << "========================================" << endl << endl;
	setColor(7);
	
	slowPrint(playerName + ",你刚租下这套月租300的廉价公寓。\n");
	Sleep(800);
	slowPrint("房东是个眼神空洞的老婆婆,临走前反复叮嘱:\n");
	Sleep(800);
	setColor(12);
	slowPrint("'一定要遵守规则,否则...永远别想离开!'\n");
	setColor(7);
	Sleep(1000);
	showRules();
	
	slowPrint("收拾行李时,你发现了前房客留下的遗物:\n");
	cout << "1. 破旧日记本\n";
	cout << "2. 泛黄照片\n";
	cout << "3. 生锈钥匙\n";
	cout << "选择你要带走的物品:";
	char choice = getch();
	if(choice == '1') {
		hasDiary = true;
		slowPrint("\n你拿起了日记本...");
	} else if(choice == '2') {
		hasPhoto = true;
		slowPrint("\n你拿起了照片...");
	} else if(choice == '3') {
		hasKey = true;
		slowPrint("\n你拿起了钥匙...");
	}
	slowPrint("\n夜深了,窗外下起了猩红的雨,噩梦即将开始...");
	Sleep(1500);
}

// 日记本完整剧情
void diaryEvent() {
	showTitle("日 记 本 - 亡 魂 遗 言", 14);
	slowPrint("你翻开日记本,字迹从工整变得癫狂:\n\n");
	Sleep(1000);
	setColor(12);
	cout << "「10月10日」" << endl;
	setColor(7);
	slowPrint("红衣的小琪每天都在哭,她在找姐姐小玲。");
	Sleep(800);
	setColor(12);
	cout << endl << "「10月11日」" << endl;
	setColor(7);
	slowPrint("她们因为一个发卡吵架,小琪摔坏了发卡。");
	Sleep(800);
	setColor(12);
	cout << endl << "「10月12日」" << endl;
	setColor(7);
	slowPrint("小玲失手把小琪从顶楼推了下去...");
	Sleep(800);
	setColor(12);
	cout << endl << "「10月13日」" << endl;
	setColor(7);
	slowPrint("地下室藏着小琪的遗体,钥匙在死去的房客身上。");
	Sleep(800);
	setColor(12);
	cout << endl << "「10月14日」" << endl;
	setColor(7);
	slowPrint("它来了,它知道我发现了秘密,我要死了...");
	clue += 5;
	sisterFavor += 16;
	san -= 15;
	cout << endl << endl << "线索+5,理智-15,妹妹好感度+16,当前线索:" << clue << endl;
	waitKey();
}

// 照片完整剧情
void photoEvent() {
	showTitle("泛 黄 的 照 片", 14);
	slowPrint("照片上是一对可爱的姐妹,红衣小琪,白衣小玲。\n");
	Sleep(1000);
	slowPrint("照片背面用血写着:\n");
	setColor(12);
	slowPrint("'妹妹,对不起,我不是故意的...'");
	setColor(7);
	Sleep(1000);
	slowPrint("\n突然!照片上的小琪缓缓转过头,直勾勾盯着你!");
	san -= 25;
	clue += 3;
	metGhost = true;
	sisterFavor += 10;
	cout << endl << "理智-25,线索+3,妹妹好感度+10" << endl;
	waitKey();
}

// 第一夜:噩梦升级
void firstNight() {
	showTitle("第 一 夜 - 噩 梦 降 临", 12);
	slowPrint("你躺在床上,雨声像婴儿的哭声一样刺耳。\n");
	Sleep(1000);
	slowPrint("梦中,你站在顶楼,红衣女孩悬在半空。\n");
	Sleep(1000);
	slowPrint("'为什么不救我...为什么所有人都抛弃我...'");
	Sleep(1000);
	cout << endl << "你猛地惊醒!时间:凌晨3:33" << endl;
	setColor(12);
	cout << "【规则7警告】绝对不要看窗外!" << endl;
	setColor(7);
	cout << endl << "1. 强行看向窗外" << endl;
	cout << "2. 闭眼默念规则" << endl;
	cout << "3. 躲进被子瑟瑟发抖" << endl;
	char choice = getch();
	if(choice == '1') {
		ruleBroken = true;
		slowPrint("\n你看到了她的脸——没有眼睛,只有黑洞!");
		san -= 50;
	} else if(choice == '2') {
		slowPrint("\n你遵守规则,平安度过了恐怖的一夜。");
		san += 10;
		courage += 5;
	} else {
		slowPrint("\n你在恐惧中熬过一夜,精神备受折磨。");
		san -= 25;
	}
	waitKey();
}

// 邻居老婆婆完整支线
void meetNeighbor() {
	showTitle("第"+to_string(day)+"天 - 神 秘 房 东", 14);
	slowPrint("你在走廊遇到了房东老婆婆,她递给你一杯水。\n");
	Sleep(1000);
	slowPrint("'我是这栋楼的守护者,十年前的悲剧我亲眼目睹。'");
	Sleep(1000);
	slowPrint("'小琪含冤而死,化作地缚灵,诅咒着所有房客。'");
	Sleep(1000);
	slowPrint("'小玲愧疚一生,最后也消失在了这栋楼里。'");
	clue += 4;
	sisterFavor += 5;
	cout << endl << "线索+4,妹妹好感度+5" << endl;
	cout << "1. 询问和解方法 2. 询问真相 3. 询问姐姐下落" << endl;
	char c = getch();
	if(c == '1') {
		slowPrint("\n'找到发卡和道歉信,她就能安息,诅咒解除。'");
		clue += 3;
	} else if(c == '2') {
		slowPrint("\n'真相就是,姐姐从未想过杀死妹妹,只是意外。'");
		sisterFavor += 20;
	} else if(c == '3') {
		slowPrint("\n'小玲的灵魂,也被困在这栋楼里赎罪。'");
		clue += 2;
	}
	waitKey();
}

// 白衣姐姐隐藏事件
void whiteSisterEvent() {
	showTitle("白 衣 女 人", 13);
	slowPrint("一个穿白衣的女人出现在你面前,她是小玲。\n");
	Sleep(1000);
	slowPrint("'帮帮我,我想向妹妹道歉,我真的不是故意的。'");
	Sleep(1000);
	cout << "1. 相信她 2. 拒绝她 3. 给她发卡" << endl;
	char c = getch();
	if(c == '1') {
		slowPrint("\n小玲感激地看着你,好感度大幅提升!");
		sisterFavor += 35;
		clue += 3;
	} else if(c == '2') {
		slowPrint("小玲突然露出诡异的笑容......");
		san -= 50;
	}
	else if(c == '3' && savedGirl) {
		slowPrint("\n你把发卡递给她,她泪流满面。");
		trueEnding = true;
		clue += 7;
	}
	waitKey();
}

// 地下室探索升级
void basementEvent() {
	showTitle("地 下 室 - 亡 魂 巢 穴", 8);
	setColor(8);
	cout << "阴森潮湿,腐臭扑鼻,远处传来孩童的哭声。" << endl << endl;
	setColor(7);
	if(!hasKey) {
		slowPrint("大门紧锁,上面刻满了孩童的抓痕,需要钥匙。");
		waitKey();
		return;
	}
	if(!hasLighter) {
		slowPrint("一片漆黑,你什么都看不见,必须要有打火机!");
		waitKey();
		return;
	}
	slowPrint("你用钥匙打开门,打火机照亮了黑暗。\n");
	Sleep(1000);
	slowPrint("墙壁上全是抓痕,正中央放着一个木箱。\n");
	Sleep(1000);
	cout << "1. 打开木箱 2. 搜查角落 3. 立刻逃跑" << endl;
	char choice = getch();
	if(choice == '1') {
		slowPrint("\n木箱里装着:红色发卡 + 道歉信 + 姐姐的遗物!");
		Sleep(1000);
		slowPrint("\n'姐姐,对不起,我不该任性,我原谅你了。'");
		clue += 5;
		savedGirl = true;
		san += 25;
		sisterFavor += 25;
	} else if(choice == '2') {
		slowPrint("\n你摸到了一只冰冷的小手!");
		san -= 50;
	} else {
		slowPrint("\n你疯跑出去,心脏几乎炸裂。");
		courage -= 15;
		san -= 30;
	}
	waitKey();
}

// 顶楼多结局决战
void rooftopFinal() {
	showTitle("第7天 - 顶 楼 决 战", 12);
	if(!savedGirl) {
		slowPrint("红衣小琪漂浮在半空,全身滴血,面目狰狞。\n");
		Sleep(1000);
		slowPrint("'你没有救赎我,那就永远留下来陪我!'");
		if(hasCard) {
			slowPrint("\n护身符发光,救了你一命!");
			hasCard = false;
			san = 20;
		} else {
			san -= 999;
			setColor(12);
			cout << endl << "=== 坏结局:亡魂的祭品 ===" << endl;
		}
	} else if(trueEnding && sisterFavor >= 80) {
		slowPrint("你拿出发卡和道歉信,姐妹俩的灵魂同时出现。\n");
		Sleep(1000);
		slowPrint("'姐姐,我原谅你了!' '妹妹,对不起!'");
		Sleep(1000);
		slowPrint("\n两道白光相拥,诅咒彻底解除,公寓恢复平静。");
		setColor(10);
		cout << endl << "=== 真结局:姐妹重逢 ===" << endl;
		gameWin = true;
	} else {
		slowPrint("你递出发卡,小琪的灵魂露出了释然的笑容。\n");
		Sleep(1000);
		slowPrint("'谢谢你,我终于可以安心离开了...'");
		Sleep(1000);
		slowPrint("\n红衣身影消散,公寓的诅咒消失了。");
		setColor(10);
		cout << endl << "=== 好结局:灵魂救赎 ===" << endl;
		gameWin = true;
	}
	waitKey();
}

// 恐怖随机事件(全面扩充)
void randomEvent() {
	vector<string> events = {
	"电梯数字疯狂跳动,停在了不存在的7楼",
	"镜子里的你对着自己诡异微笑并招手",
	"门外传来小女孩拍门:哥哥/姐姐,开门",
	"天花板滴下暗红色的血液,落在你的额头",
	"电视自动播放十年前姐妹俩的葬礼新闻",
	"耳边传来轻柔的梳头声,却空无一人",
	"墙壁渗出黑色油污,组成了:救我",
	"你的影子分裂成两个人,一红一白",
	"走廊灯光全部熄灭,红衣身影一闪而过",
	"手机自动拨号,听筒传来儿歌"
};
	int idx = rand() % events.size();
	showTitle("诡 异 事 件", 12);
	slowPrint(events[idx] + "...\n");
	Sleep(1000);
	int lose = isHardMode ? 30 : 20;
	san -= lose;
	slowPrint("理智-" + to_string(lose));
	if(idx < 3) {
		setColor(12);
		cout << endl << "【规则破坏】惩罚触发!理智额外-15" << endl;
		setColor(7);
		san -= 15;
		ruleBroken = true;
	}
	waitKey();
}

// 理智检测系统
bool checkSanity() {
	if(san <= 0) {
		showTitle("理 智 崩 溃", 12);
		slowPrint("你的精神彻底破碎,永远被困在了诅咒公寓...\n");
		deathCount++;
		setColor(12);
		cout << "死亡次数:" << deathCount << endl;
		setColor(7);
		cout << "重新开始游戏?(y/n):";
		if(getch() == 'y') {
			san = 100;
			clue = 0;
			day = 1;
			money = 500;
			hasDiary = hasPhoto = hasKey = false;
			metGhost = savedGirl = ruleBroken = false;
			return true;
		}
		return false;
	}
	if(san < 30) {
		setColor(12);
		cout << "?  警告:理智濒临崩溃  ?" << endl;
		setColor(7);
		Sleep(1000);
	}
	return true;
}

// 每日总结
void daySummary() {
	showTitle("第" + to_string(day) + "天 总 结", 10);
	cout << "【角色状态】" << endl;
	cout << "理智值:" << san << "/100    线索:" << clue << "/25" << endl;
	cout << "金钱:" << money << "¥    勇气:" << courage << "/100" << endl;
	cout << "妹妹好感度:" << sisterFavor << "/100" << endl << endl;
	cout << "【持有道具】" << endl;
	if(hasDiary) cout << "日记本 ";
	if(hasPhoto) cout << "照片 ";
	if(hasKey) cout << "钥匙 ";
	if(hasLighter) cout << "打火机 ";
	if(hasFood) cout << "饼干 ";
	if(hasRadio) cout << "收音机 ";
	if(hasCard) cout << "护身符 ";
	cout << endl;
	waitKey();
}

// 主函数
int main() {
	srand(time(0));
	CONSOLE_CURSOR_INFO cursorInfo;
	GetConsoleCursorInfo(hConsole, &cursorInfo);
	cursorInfo.bVisible = false;
	SetConsoleCursorInfo(hConsole, &cursorInfo);
	
	system("title 规则怪谈:红衣女孩 完整版");
	system("mode con cols=60 lines=30");
	
	setColor(12);
	cout << "╔═════════════════════════════════╗" << endl;
	cout << "║     规 则 怪 谈 - 红 衣 女 孩   ║" << endl;
	cout << "║            完 整 版             ║" << endl;
	cout << "╚═════════════════════════════════╝" << endl << endl;
	setColor(7);
	slowPrint("欢迎来到诅咒公寓,生存下去,揭开真相...");
	Sleep(1500);
	
	cout << "1. 新游戏    2. 读游戏" << endl;
	char c = getch();
	if(c == '2') loadGame();
	else gameStart();
	
	// 游戏主循环
	while(day <= 7) {
		dailyAction();
		if(day == 1) firstNight();
		else if(day == 2 && hasDiary) diaryEvent();
		else if(day == 2 && hasPhoto) photoEvent();
		else if(day == 3) meetNeighbor();
		else if(day == 4 && sisterFavor >= 50) whiteSisterEvent();
		else if(day >= 5 && day <= 6) {
			for(int i = 0; i < 2; i++) {
				randomEvent();
				if(!checkSanity()) break;
			}
		} else if(day == 7) {
			rooftopFinal();
			break;
		}
		
		if(!checkSanity()) break;
		daySummary();
		day++;
		money += 100;
	}
	
	// 游戏结束
	cursorInfo.bVisible = true;
	SetConsoleCursorInfo(hConsole, &cursorInfo);
	if(gameWin) {
		system("cls");
		setColor(10);
		slowPrint("恭喜你成功打破诅咒,活了下来!");
		Sleep(2000);
	}
	system("cls");
	showTitle("游 戏 结 束", 12);
	cout << "感谢游玩《规则怪谈:红衣女孩》完整版!" << endl;
	return 0;
}