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

int san = 100, clue = 0, day = 1, deathCount = 0;
string playerName;
bool hasDiary = false, hasPhoto = false, hasKey = false;
bool metGhost = false, savedGirl = false;
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

void setColor(int c) { SetConsoleTextAttribute(hConsole, c); }

void slowPrint(string t, int s = 32) {
    for (char ch : t) {
        cout << ch;
        Sleep(s);
    }
}

void showTitle(string t, int c) {
    system("cls");
    setColor(c);
    cout << "=== " << t << " ===\n\n";
    setColor(7);
}

void gameStart() {
    showTitle("搬 家 第 一 天", 11);
    cout << "请输入你的名字:";
    cin >> playerName;

    system("cls");
    setColor(14);
    cout << "========================================\n";
    cout << "           2023年10月15日\n";
    cout << "========================================\n\n";
    setColor(7);

    slowPrint(playerName + ",你刚租下这套便宜得不正常的公寓。\n");
    Sleep(800);
    slowPrint("房东是个眼神空洞的老太太,临走前用极低的声音说:\n");
    Sleep(800);
    setColor(12);
    slowPrint("'记住,晚上11点后……千万别出门!'\n\n");
    setColor(7);
    Sleep(1200);

    cout << "你收拾行李时,发现前房客留下的三样东西:\n";
    cout << "1. 一本破旧的日记本\n";
    cout << "2. 一张泛黄的照片\n";
    cout << "3. 一把生锈的钥匙\n";
    cout << "你只能带走一样,请选择:";

    char choice = getch();
    if (choice == '1') {
        hasDiary = true;
        slowPrint("\n你拿起了日记本……封面很凉。\n");
    } else if (choice == '2') {
        hasPhoto = true;
        slowPrint("\n你拿起了照片……照片在微微发烫。\n");
    } else if (choice == '3') {
        hasKey = true;
        slowPrint("\n你拿起了钥匙……上面有淡淡的血腥味。\n");
    } else {
        slowPrint("\n你什么都没拿……也许会后悔。\n");
    }

    Sleep(1000);
    slowPrint("\n夜深了,窗外下起冰冷的雨……\n");
    Sleep(1500);
}

void diaryEvent() {
    showTitle("日 记 本", 14);
    slowPrint("你翻开日记本,字迹又乱又尖:\n\n");
    Sleep(800);

    setColor(12);
    cout << "「10月10日」\n";
    setColor(7);
    slowPrint("她又站在走廊尽头了……我不敢看她的脸。\n");
    Sleep(800);
    cout << "\n";
    setColor(12);
    cout << "「10月11日」\n";
    setColor(7);
    slowPrint("邻居说,十年前有个红衣女孩跳楼了。\n");
    Sleep(800);
    cout << "\n";
    setColor(12);
    cout << "「10月12日」\n";
    setColor(7);
    slowPrint("地下室的门……我好像听到里面在哭。钥匙不见了。\n");
    Sleep(800);

    clue += 3;
    cout << "\n\n线索 +3,当前线索:" << clue << "\n";
    cout << "按任意键继续..."; getch();
}

void photoEvent() {
    showTitle("泛 黄 的 照 片", 14);
    slowPrint("照片上是两个小女孩,红衣、白衣。\n");
    Sleep(800);
    slowPrint("背面写着:‘妹妹,对不起……’\n");
    Sleep(800);
    slowPrint("突然,红衣女孩的眼睛……转向了你。\n");

    san -= 8;
    clue += 2;
    cout << "\n\n理智 -8,线索 +2\n";
    cout << "按任意键继续..."; getch();
}

void firstNight() {
    showTitle("第 一 夜 - 噩 梦", 12);
    slowPrint("你躺在床上,雨声越来越诡异……\n");
    Sleep(1000);
    slowPrint("梦里,楼顶风很大,红衣女孩背对着你。\n");
    Sleep(1000);
    slowPrint("‘救救我……’她缓缓转过头……\n");
    Sleep(1200);

    cout << "\n你猛地惊醒!时间:凌晨 3:33\n";
    setColor(12);
    cout << "窗户外……贴着一个红色的人影!\n";
    setColor(7);

    cout << "\n你会:\n";
    cout << "1. 闭眼假装没看见\n";
    cout << "2. 靠近窗户查看\n";
    cout << "3. 躲进被子发抖\n";

    char choice = getch();
    if (choice == '1') {
        slowPrint("\n你紧闭双眼,拼命告诉自己是幻觉……\n");
        Sleep(1000);
        slowPrint("几分钟后,窗外安静了。\n");
    } else if (choice == '2') {
        slowPrint("\n你靠近窗户……一张惨白的脸贴在玻璃上!\n");
        san -= 30;
        slowPrint("你几乎窒息……\n");
    } else {
        slowPrint("\n你缩在被子里,听着窗外的指甲刮擦声……\n");
        san -= 12;
    }

    cout << "\n按任意键继续..."; getch();
}

void meetNeighbor() {
    showTitle("第" + to_string(day) + "天 - 邻 居", 14);
    slowPrint("走廊里,一个老婆婆靠着墙,眼神浑浊。\n");
    Sleep(1000);
    slowPrint("‘新来的吧……那间房,死过人。’\n");
    Sleep(1000);
    slowPrint("‘十年前,小琪跳楼了。她姐姐小玲,从此失踪。’\n");
    Sleep(1000);
    slowPrint("‘她们……就是为了一个小小的发卡。’\n");

    clue += 2;
    cout << "\n线索 +2\n";

    cout << "\n你要问:\n";
    cout << "1. 她们为什么吵架?\n";
    cout << "2. 地下室有什么?\n";
    cout << "3. 怎么让她安息?\n";

    char choice = getch();
    if (choice == '1') {
        slowPrint("\n‘小琪摔坏了姐姐最珍贵的发卡……’\n");
        clue++;
    } else if (choice == '2') {
        slowPrint("\n‘地下室是小琪死前待最久的地方……门锁着。’\n");
        if (hasKey) slowPrint("\n你摸了摸口袋里的钥匙,它在震动。\n");
    } else if (choice == '3') {
        slowPrint("\n‘找到她没说出口的道歉……她就能安息。’\n");
        slowPrint("去地下室,但……千万别待到午夜。\n");
    }

    cout << "\n按任意键继续..."; getch();
}

void basementEvent() {
    showTitle("地 下 室", 8);
    setColor(8);
    cout << "空气冰冷潮湿,到处是腐烂味……\n\n";
    setColor(7);

    if (!hasKey) {
        slowPrint("门锁得死死的,你根本打不开。\n");
        slowPrint("你必须找到钥匙才能继续。\n");
        cout << "\n按任意键返回..."; getch();
        return;
    }

    slowPrint("钥匙插进去,发出‘咔嗒’一声……像骨头断裂。\n");
    Sleep(1000);
    slowPrint("黑暗深处,有个破旧的木箱子。\n");

    cout << "\n你选择:\n";
    cout << "1. 打开箱子\n";
    cout << "2. 查看墙壁\n";
    cout << "3. 立刻离开\n";

    char choice = getch();
    if (choice == '1') {
        slowPrint("\n箱子里有一支粉色发卡,还有一封皱巴巴的信。\n");
        Sleep(800);
        slowPrint("‘姐姐,对不起……我不是故意的。我在顶楼等你。’\n");
        clue += 4;
        savedGirl = true;
    } else if (choice == '2') {
        slowPrint("\n墙上全是指甲抓痕……深到嵌进水泥里。\n");
        san -= 20;
    } else {
        slowPrint("\n你疯了一样逃出地下室……心脏狂跳。\n");
        return;
    }

    cout << "\n按任意键继续..."; getch();
}

void rooftopFinal() {
    showTitle("第7天 - 顶 楼", 12);

    if (!savedGirl) {
        slowPrint("楼顶风像哭声一样嘶吼。\n");
        Sleep(1000);
        slowPrint("红衣女孩飘到你面前:‘你根本不想帮我……’\n");
        Sleep(1000);
        slowPrint("她的脸开始腐烂,眼睛流出黑血……\n");
        san -= 999;

        slowPrint("\n你脚下一空,从楼顶坠落……\n");
        slowPrint("从此,这栋楼又多了一个不肯离开的人。\n");
        setColor(12);
        cout << "\n===== 坏结局:第三位住客 =====\n";
        setColor(7);
    } else {
        slowPrint("你在水箱后面找到了发卡,冰凉冰凉。\n");
        Sleep(1000);
        slowPrint("红衣女孩安静地出现,没有恐怖,只有委屈。\n");
        Sleep(1000);
        slowPrint("‘你……拿到我的信了?’\n");
        Sleep(1000);
        slowPrint("你把发卡递给她。她轻轻笑了。\n");
        Sleep(1000);
        slowPrint("‘姐姐……我终于可以去找你了。’\n");
        slowPrint("红衣慢慢变淡,消失在风里。\n");

        setColor(10);
        cout << "\n===== 好结局:姐妹和解 =====\n";
        cout << "       公寓恢复了平静……\n";
        setColor(7);
    }

    cout << "\n按任意键结束游戏..."; getch();
}

void randomEvent() {
    vector<string> events = {
        "电梯镜子里,你身后站着一个红衣女孩",
        "水龙头流出的水,是淡红色的",
        "走廊尽头传来小女孩的哭声",
        "你的房门,自己轻轻开了一条缝",
        "窗户上,慢慢印出一个手掌印",
        "电视自动打开,播放十年前的跳楼新闻"
    };

    vector<string> reacts = {
        "你吓得不敢动", "你立刻关掉水龙头",
        "你捂住耳朵快跑", "你冲过去把门反锁",
        "你用衣服擦掉它", "你颤抖着关掉电视"
    };

    int r = rand() % events.size();
    showTitle("诡 异 事 件", 12);
    slowPrint(events[r] + "……\n");
    Sleep(800);
    slowPrint(reacts[r] + "。\n");

    san -= 6;
    cout << "\n理智 -6\n";
    cout << "按任意键继续..."; getch();
}

bool checkSanity() {
    if (san <= 0) {
        showTitle("理 智 崩 溃", 12);
        slowPrint("你再也分不清现实和鬼魂……\n");
        Sleep(1000);
        slowPrint("你永远留在了这栋诅咒的公寓里。\n");
        deathCount++;

        cout << "\n重新开始游戏?(y/n):";
        if (getch() == 'y') {
            san = 100; clue = 0; day = 1;
            hasDiary = hasPhoto = hasKey = false;
            metGhost = savedGirl = false;
            return true;
        }
        return false;
    }

    if (san < 30) {
        setColor(12);
        cout << "\n!! 警告:理智极低,你快要崩溃了 !!\n";
        setColor(7);
        Sleep(1200);
    }
    return true;
}

void daySummary() {
    showTitle("第" + to_string(day) + "天 · 总结", 10);
    cout << "==========================\n";
    cout << "理智值:" << san << "/100\n";
    cout << "线索  :" << clue << "\n";
    cout << "持有物:";
    if (hasDiary) cout << "日记本 ";
    if (hasPhoto) cout << "照片 ";
    if (hasKey) cout << "钥匙 ";
    if (!hasDiary && !hasPhoto && !hasKey) cout << "无";
    cout << "\n==========================\n\n";
    cout << "按任意键进入下一天...";
    getch();
}

int main() {
    srand(time(0));
    CONSOLE_CURSOR_INFO cursorInfo;
    GetConsoleCursorInfo(hConsole, &cursorInfo);
    cursorInfo.bVisible = false;
    SetConsoleCursorInfo(hConsole, &cursorInfo);

    system("title 规则怪谈:红衣女孩 · 增强版");
    system("mode con cols=68 lines=28");

    setColor(12);
    cout << "╔════════════════════════════════╗\n";
    cout << "║        规 则 怪 谈             ║\n";
    cout << "║        - 红 衣 女 孩 -         ║\n";
    cout << "╚════════════════════════════════╝\n\n";
    setColor(7);

    slowPrint("本故事根据真实都市传说改编……\n", 40);
    Sleep(1500);

    gameStart();

    while (day <= 7) {
        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)
            basementEvent();
        else if (day >= 5 && day <= 6) {
            randomEvent();
            if (!checkSanity()) break;
            randomEvent();
            if (!checkSanity()) break;
        } else if (day == 7) {
            rooftopFinal();
            break;
        }

        if (!checkSanity()) {
            if (san <= 0) {
                san = 100; clue = 0; day = 1;
                hasDiary = hasPhoto = hasKey = false;
                metGhost = savedGirl = false;
                continue;
            }
        }

        daySummary();
        day++;
    }

    cursorInfo.bVisible = true;
    SetConsoleCursorInfo(hConsole, &cursorInfo);
    return 0;
}