GASTER特别版——第一部分
2025-09-10 20:31:48
发布于:上海
冷知识,Ctrl+A可以全选
#include <bits/stdc++.h>
#include <windows.h>
#include <ctime>
using namespace std;
const int UNDERGROUND = 1;
const int SNOWDIN = 2;
const int WATERFALL = 3;
const int HOTLAND = 4;
const int CORE = 5;
const int NEW_HOME = 6;
const int JUDGMENT_HALL = 7;
const int TRUE_LAB = 8;
const int ASRIEL_AREA = 9;
string player_name;
int current_area = UNDERGROUND;
bool game_complete = false;
int route = 0;
bool game_over = false;
bool chara_awakened = false;
bool asriel_restored = false;
bool seen_asriel_memory = false;
bool developer_mode = false;
string dev_password = "debugmode";
bool is_gaster = false;
vector<string> absorbed_souls;
vector<string> absorbed_monsters;
bool met_toriel = false;
bool toriel_killed = false;
bool toriel_spared = false;
bool met_sans = false;
bool met_papyrus = false;
bool papyrus_killed = false;
bool papyrus_spared = false;
bool met_undyne = false;
bool undyne_killed = false;
bool undyne_spared = false;
bool undyne_determined = false;
bool sent_undyne_letter = false;
bool met_alphys = false;
bool alphys_neutral_ending = false;
bool met_mtt = false;
bool mtt_killed = false;
bool mtt_spared = false;
bool met_asgore = false;
bool asgore_killed = false;
bool asgore_spared = false;
bool freed_monsters = false;
bool true_lab_unlocked = false;
bool entered_true_lab = false;
bool seen_alphys_memories = false;
bool fought_sans = false;
bool sans_killed = false;
bool met_flowey = false;
bool flowey_betrayed = false;
bool flowey_omega_fought = false;
bool gaster_followers_met = false;
int kill_count = 0;
int area_kills[9] = {0};
int required_kills[9] = {0, 20, 15, 18, 40, 30, 1, 5, 0};
bool genocide_route = false;
bool true_pacifist = false;
bool has_souls = false;
bool reset_used = false;
int save_file_id = 0;
int resets = 0;
int gaster_absorbed_attack = 0;
struct Item {
string name;
string description;
int effect;
int type;
int price;
Item(string n, string d, int e, int t, int p)
: name(n), description(d), effect(e), type(t), price(p) {}
};
enum SkillType { ACTIVE, PASSIVE };
struct Skill {
string name;
SkillType type;
string desc;
int cool_down;
int current_cool;
int damage_bonus;
int hp_restore;
int dodge_bonus;
int exp_bonus;
bool is_unlocked;
Skill(string n, SkillType t, string d, int cd, int cc, int db, int hr, int dbn, int eb, bool ul)
: name(n), type(t), desc(d), cool_down(cd), current_cool(cc),
damage_bonus(db), hp_restore(hr), dodge_bonus(dbn), exp_bonus(eb), is_unlocked(ul) {}
};
struct Player {
string Name;
int Health, maxHealth, Damage, Money, level;
double exp;
int dodge;
double exb;
vector<Skill> skills;
vector<Item> inventory;
int current_skill;
};
struct Monster {
string name;
int health;
int damage;
int exp;
int money;
int dodge;
string flavor_text;
bool is_boss;
bool is_unique;
int area;
int battle_id;
Monster(string n, int h, int d, int e, int m, int db, string ft, bool ib, bool iu, int a, int bid)
: name(n), health(h), damage(d), exp(e), money(m), dodge(db),
flavor_text(ft), is_boss(ib), is_unique(iu), area(a), battle_id(bid) {}
};
vector<Skill> skill_lib;
vector<Item> item_lib;
vector<Monster> all_monsters;
vector<string> souls;
bool has_item(const Player& p, const string& item_name);
bool battle(Player& p, Monster& mob);
void judge_route(Player& p);
void trigger_judgment_hall(Player& p);
void check_level_up(Player& p);
void true_lab_event(Player& p);
void ending(Player& p);
void flowey_event(Player& p);
void asriel_final_battle(Player& p);
void developer_mode_menu(Player& p);
void battle_selector_menu(Player& p);
void start_one(string rest);
void navigate_map(Player& p);
void init_game_data();
void start_screen();
void gaster_true_lab_event(Player& p);
string int_to_string(int num) {
if (num == 0) return "0";
string res;
bool is_neg = false;
if (num < 0) {
is_neg = true;
num = -num;
}
while (num > 0) {
res = (char)('0' + num % 10) + res;
num /= 10;
}
return is_neg ? "-" + res : res;
}
void Color(int a) {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), a);
}
void print_slow(const string& text, int delay = 20) {
for (size_t i = 0; i < text.size(); ++i) {
cout << text[i];
Sleep(delay);
}
}
void show_area_title() {
system("cls");
Color(14);
if (current_area == UNDERGROUND) print_slow("--- 废墟 (The Ruins) ---\n\n");
else if (current_area == SNOWDIN) print_slow("--- 雪町 (Snowdin) ---\n\n");
else if (current_area == WATERFALL) print_slow("--- 瀑布 (Waterfall) ---\n\n");
else if (current_area == HOTLAND) print_slow("--- 热域 (Hotland) ---\n\n");
else if (current_area == CORE) print_slow("--- 核心 (The Core) ---\n\n");
else if (current_area == NEW_HOME) print_slow("--- 新家 (New Home) ---\n\n");
else if (current_area == JUDGMENT_HALL) {
Color(12);
print_slow("--- 审判长廊 (Judgment Hall) ---\n\n");
}
else if (current_area == TRUE_LAB) {
Color(13);
print_slow("--- 真实验室 (True Lab) ---\n\n");
}
else if (current_area == ASRIEL_AREA) {
Color(11);
print_slow("--- 绝对领域 (Absolute Realm) ---\n\n");
}
Color(7);
}
void init_player(Player& p, const string& name) {
p.Name = name;
p.maxHealth = 20;
p.Health = p.maxHealth;
p.Damage = 5;
p.Money = 20;
p.level = 1;
p.exp = 0;
p.dodge = 5;
p.exb = 1.0;
p.current_skill = 1;
if (name == "GASTER" || name == "gaster" || name == "Gaster") {
is_gaster = true;
p.maxHealth = 9999;
p.Health = p.maxHealth;
p.Damage = 9999;
p.Money = 9999;
p.dodge = 100;
Color(13);
print_slow("* 你感受到了虚空的力量...\n");
print_slow("* 世界线开始变得不稳定...\n\n");
Color(7);
p.inventory.push_back(item_lib[21]);
for (size_t i = 0; i < skill_lib.size(); ++i) {
p.skills.push_back(skill_lib[i]);
}
if (skill_lib.size() >= 13) {
for (size_t i = 9; i < 13 && i < skill_lib.size(); i++) {
for (auto& skill : p.skills) {
if (skill.name == skill_lib[i].name) {
skill.is_unlocked = true;
break;
}
}
}
}
}
}
void check_level_up(Player& p) {
if (is_gaster) return;
double required_exp = p.level * 50;
while (p.exp >= required_exp) {
p.level++;
p.exp -= required_exp;
p.maxHealth += 10;
p.Health = p.maxHealth;
p.Damage += 2;
p.dodge += 1;
Color(14);
print_slow("\n--- 升级了! ---\n");
Color(7);
print_slow("等级提升至 " + int_to_string(p.level) + "!\n");
print_slow("最大HP增加了!\n");
print_slow("攻击力提升了!\n");
print_slow("闪避率提升了!\n\n");
required_exp = p.level * 50;
// 升级解锁技能
if (p.level == 3 && !p.skills[2].is_unlocked) {
p.skills[2].is_unlocked = true;
print_slow("解锁了新技能: 强力攻击!\n");
}
else if (p.level == 5 && !p.skills[3].is_unlocked) {
p.skills[3].is_unlocked = true;
print_slow("解锁了新技能: 格挡!\n");
}
else if (p.level == 10 && !p.skills[4].is_unlocked) {
p.skills[4].is_unlocked = true;
print_slow("解锁了新技能: 决心爆发!\n");
}
else if (p.level == 15 && route == 1 && !p.skills[8].is_unlocked) {
p.skills[8].is_unlocked = true;
print_slow("解锁了新技能: 希望!\n");
}
Sleep(2000);
}
}
bool has_item(const Player& p, const string& item_name) {
for (size_t i = 0; i < p.inventory.size(); ++i) {
if (p.inventory[i].name == item_name) {
return true;
}
}
return false;
}
void judge_route(Player& p) {
if (is_gaster) return;
bool all_areas_genocide = true;
for (int i = 1; i <= 6; i++) {
if (area_kills[i] < required_kills[i]) {
all_areas_genocide = false;
break;
}
}
if (all_areas_genocide && toriel_killed && papyrus_killed && undyne_killed && mtt_killed &&
asgore_killed && sans_killed && kill_count >= 124) {
route = 2;
genocide_route = true;
if (!has_item(p, "真刀")) {
p.inventory.push_back(item_lib[8]);
p.Damage += 50;
print_slow("你获得了'真刀'!\n");
Sleep(1000);
}
}
else if (toriel_spared && papyrus_spared && undyne_spared &&
mtt_spared && asgore_spared && true_lab_unlocked &&
entered_true_lab && seen_alphys_memories && freed_monsters &&
asriel_restored) {
route = 4;
true_pacifist = true;
p.skills[8].is_unlocked = true;
}
else if (toriel_spared && papyrus_spared && undyne_spared &&
mtt_spared && asgore_spared && !asriel_restored) {
route = 1;
}
else if (reset_used && genocide_route && route == 1) {
route = 3;
p.skills[7].is_unlocked = true;
}
else {
route = 0;
}
}
void gaster_true_lab_event(Player& p) {
if (!gaster_followers_met && current_area == TRUE_LAB) {
show_area_title();
Color(13);
print_slow("* 实验室深处传来熟悉的声音...\n\n");
print_slow("神秘声音1: 主...主人?是你吗?\n");
print_slow("神秘声音2: 我们一直在等你...\n");
print_slow("神秘声音3: 世界正在崩溃...只有你能修复它...\n\n");
print_slow("* 三个模糊的身影从阴影中出现...\n");
print_slow("* 他们是你的追随者...\n\n");
print_slow("神秘声音1: 这是你曾经的研究成果...\n");
print_slow("* 他们递给你一个奇怪的装置...\n\n");
bool has_extractor = false;
for (auto& item : p.inventory) {
if (item.name == "决心提取器") {
has_extractor = true;
item.description = "Gaster的研究成果,可使用三种特殊技能: 吞噬、吸收、召唤";
break;
}
}
if (!has_extractor) {
p.inventory.push_back(item_lib[21]);
}
gaster_followers_met = true;
Color(7);
print_slow("输入任意键继续...");
string temp;
cin >> temp;
}
}
void undyne_letter_event(Player& p) {
if (met_undyne && !sent_undyne_letter && current_area == HOTLAND && !undyne_killed) {
show_area_title();
print_slow("Undyne追上了你,看起来有点不好意思...\n\n");
print_slow("Undyne: 嘿,人类!我...我有个请求...\n");
print_slow("Undyne: 你能帮我把这封信交给Alphys吗?她是皇家科学家...\n");
print_slow("Undyne: 别偷看里面的内容!\n\n");
p.inventory.push_back(item_lib[9]);
sent_undyne_letter = true;
print_slow("你获得了'Undyne的信'!\n");
print_slow("输入任意键继续...");
string temp;
cin >> temp;
}
}
void alphys_lab_event(Player& p) {
if (sent_undyne_letter && current_area == HOTLAND && !met_alphys) {
show_area_title();
print_slow("你来到了一座看起来很先进的实验室门前...\n");
print_slow("门上写着'皇家科学研究所'\n\n");
print_slow("(你敲门后,一个戴着眼镜的蜥蜴怪物打开了门)\n\n");
print_slow("Alphys: 哦!你...你好!我是Alphys,皇家科学家!\n");
if (has_item(p, "Undyne的信")) {
print_slow("Alphys: 那...那是Undyne给我的信吗?\n");
print_slow("(Alphys接过信,脸变得通红)\n");
print_slow("Alphys: 谢...谢谢你!作为回报,我可以帮你...\n");
for (auto it = p.inventory.begin(); it != p.inventory.end(); ++it) {
if (it->name == "Undyne的信") {
p.inventory.erase(it);
break;
}
}
print_slow("Alphys: 我会帮你打开通往核心的门!\n");
met_alphys = true;
if (!has_item(p, "生锈的钥匙")) {
p.inventory.push_back(item_lib[6]);
print_slow("Alphys: 对了,这是一把旧钥匙,也许你会用得上...\n");
}
}
print_slow("输入任意键继续...");
string temp;
cin >> temp;
}
}
void mtt_hotel_event(Player& p) {
if (met_alphys && current_area == HOTLAND && !met_mtt) {
show_area_title();
print_slow("你来到了一家华丽的酒店,招牌上写着'MTT度假村'\n\n");
print_slow("(一个机器人从里面走了出来,看起来像个电视明星)\n\n");
print_slow("Mettaton: 哦!看看我们有什么客人!一位人类!\n");
print_slow("Mettaton: 欢迎来到我的度假村!我是Mettaton,地下世界的超级明星!\n");
print_slow("Mettaton: 今晚8点,我将举办一场特别节目,主角就是你!\n\n");
met_mtt = true;
print_slow("你获得了'MTT汉堡'!\n");
p.inventory.push_back(item_lib[12]);
print_slow("输入任意键继续...");
string temp;
cin >> temp;
Monster mtt = Monster("Mettaton", 300, 15, 80, 50, 20, "准备好了吗,亲爱的观众?", true, true, HOTLAND, 16);
battle(p, mtt);
}
}
void flowey_event(Player& p) {
if (current_area == UNDERGROUND && !met_flowey && !met_toriel) {
show_area_title();
Color(10);
print_slow("* 你看到一朵金色的花在闪烁...\n\n");
print_slow("Flowey: 你好啊,我是Flowey,Flowey the Flower!\n");
print_slow("Flowey: 看起来你是新来的,对这个地下世界还不熟悉吧?\n");
print_slow("Flowey: 我来教你怎么在这里生存!\n\n");
print_slow("* Flowey向你展示了一个闪烁的'友谊颗粒'\n");
print_slow("Flowey: 看到这些白色的颗粒了吗?它们是友谊的象征!\n");
print_slow("Flowey: 来,走到它们旁边,收集它们!\n\n");
print_slow("(你感觉到不对劲,但还是照做了)\n\n");
print_slow("Flowey: 哈哈!蠢货!在这个世界上,不是杀,就是被杀!\n");
print_slow("* 友谊颗粒突然变成了红色,向你袭来!\n\n");
// Toriel救场
print_slow("* 一道火球击中了Flowey!\n");
print_slow("Toriel: 滚出去,你这个肮脏的生物!\n");
print_slow("Flowey: 切...下次不会放过你的...\n");
print_slow("* Flowey消失了\n\n");
print_slow("Toriel: 孩子,你没事吧?你不应该在这里...跟我来,我会保护你的。\n");
met_flowey = true;
met_toriel = true;
print_slow("输入任意键继续...");
string temp;
cin >> temp;
}
if (current_area == NEW_HOME && met_asgore && !flowey_betrayed && !genocide_route && !is_gaster) {
show_area_title();
print_slow("* 就在你以为一切都结束时,Flowey突然出现了!\n\n");
print_slow("Flowey: 做得好,人类!你帮我省了不少事!\n");
print_slow("Flowey: 现在,Asgore的灵魂和人类的灵魂都是我的了!\n");
print_slow("* Flowey吸收了所有的灵魂...\n\n");
print_slow("Flowey: 见证我的真正形态吧!\n");
print_slow("* Flowey开始扭曲变形...\n");
flowey_betrayed = true;
print_slow("输入任意键继续...");
string temp;
cin >> temp;
Monster omega_flowey = Monster("Omega Flowey", 1000, 30, 200, 0, 30, "我将成为神!", true, true, NEW_HOME, 21);
battle(p, omega_flowey);
flowey_omega_fought = true;
}
if (flowey_omega_fought && true_pacifist && !asriel_restored && !is_gaster) {
show_area_title();
Color(11);
print_slow("* 灵魂们开始反抗Flowey的控制...\n");
print_slow("* 一股强大的力量从Flowey体内爆发出来...\n\n");
print_slow("* 金色的花朵开始变形...\n");
print_slow("* 一个熟悉而陌生的身影出现在你面前...\n\n");
print_slow("Asriel: 我...我想起了...\n");
print_slow("Asriel: 我是...艾斯利而...\n");
asriel_restored = true;
print_slow("输入任意键继续...");
string temp;
cin >> temp;
asriel_final_battle(p);
}
}
void asriel_final_battle(Player& p) {
current_area = ASRIEL_AREA;
show_area_title();
Color(11);
print_slow("* 整个世界仿佛都静止了...\n");
print_slow("* 真神艾斯利而展现在你面前,拥有无穷的力量...\n\n");
print_slow("Asriel: 我是神!我可以做任何事!\n");
print_slow("Asriel: 我可以重置一切,让一切都回到原点...\n");
print_slow("Asriel: 但这一次...我想让你见证一切...\n\n");
print_slow("* 艾斯利而向你展示了过去的回忆...\n");
print_slow("* 你看到了查拉和艾斯利而的童年...\n");
print_slow("* 你看到了他们的约定和悲剧...\n\n");
print_slow("Asriel: 我害怕再次失去...所以我宁愿重置一切...\n");
print_slow("Asriel: 但你让我明白...有些事情值得去珍惜...\n\n");
Color(7);
print_slow("输入任意键开始最终战斗...");
string temp;
cin >> temp;
Monster asriel = Monster("真神艾斯利而", 9999, 50, 0, 0, 50,
"希望与梦想...这就是我所遗忘的东西...",
true, true, ASRIEL_AREA, 24);
battle(p, asriel);
// 战斗后剧情
show_area_title();
Color(11);
print_slow("* 你没有攻击艾斯利而,而是选择了理解和宽恕...\n");
print_slow("* 艾斯利而的力量开始消散...\n\n");
print_slow("Asriel: 谢谢你...你让我想起了如何去爱...\n");
print_slow("Asriel: 我不能再重置世界了...但我可以做最后一件事...\n");
print_slow("* 艾斯利而解除了地下世界的屏障...\n\n");
print_slow("Asriel: 再见了,我的朋友...不要忘记我...\n");
print_slow("* 艾斯利而变回了一朵金色的小花,随风飘散...\n");
freed_monsters = true;
Color(7);
judge_route(p);
if (route == 4) {
game_complete = true;
}
print_slow("输入任意键继续...");
cin >> temp;
}
void trigger_judgment_hall(Player& p) {
if (genocide_route && current_area == NEW_HOME && !fought_sans) {
current_area = JUDGMENT_HALL;
show_area_title();
Color(11);
print_slow("* 你听到了骨头摩擦的声音...\n");
print_slow("* 一个熟悉的骷髅站在走廊尽头...\n\n");
// Gaster专属Sans对话
if (is_gaster) {
print_slow("Sans: 你...你是...\n");
print_slow("Sans: 不...不可能...你应该已经...咳...消失了...\n");
print_slow("Sans: 你...打破了规则...干涉了时间线...\n\n");
print_slow("Sans: 你吞噬灵魂...破坏平衡...这就是你想要的吗?\n");
print_slow("Sans: 你知道这会导致什么后果吗?\n");
print_slow("Sans: 所有的时间线都会...咳...崩溃...\n\n");
print_slow("Sans: 我必须阻止你...为了所有的世界...\n");
} else {
print_slow("Sans: 嘿,人类。\n");
print_slow("Sans: 看起来你已经走了很远的路了。\n");
print_slow("Sans: 一路上...你杀了很多人,对吧?\n");
print_slow("Sans: 我本来不想管的...但现在,有人需要接受审判。\n");
print_slow("Sans: 而你,就是那个罪人。\n\n");
}
Color(7);
print_slow("输入任意键开始审判...");
string temp;
cin >> temp;
Monster judge_sans = Monster("审判者Sans", 1, 1, 0, 0, 99,
"记住我的话,孩子...\n每个人都要为自己的行为负责。",
true, true, JUDGMENT_HALL, 22);
fought_sans = true;
battle(p, judge_sans);
current_area = NEW_HOME;
}
}
void true_lab_event(Player& p) {
if (is_gaster) {
gaster_true_lab_event(p);
return;
}
if (has_item(p, "生锈的钥匙") && current_area == HOTLAND && !entered_true_lab) {
show_area_title();
print_slow("你用生锈的钥匙打开了一扇隐藏的门...\n");
print_slow("门后是一个看起来废弃已久的实验室...\n\n");
print_slow("墙上的牌子写着:'真实验室'\n\n");
print_slow("(你决定进入调查)\n\n");
current_area = TRUE_LAB;
entered_true_lab = true;
true_lab_unlocked = true;
print_slow("* 你看到了一些奇怪的实验记录...\n");
print_slow("* 记录中提到了'soul fusion'和'determination'...\n");
print_slow("* 你发现了Alphys博士的秘密...\n\n");
if (!has_item(p, "查拉的日记")) {
p.inventory.push_back(item_lib[18]);
print_slow("你找到了'查拉的日记'!\n");
}
print_slow("输入任意键继续...");
string temp;
cin >> temp;
Monster amalgamate = Monster("融合怪", 150, 10, 0, 0, 15, "它...在痛苦地扭动...", true, false, TRUE_LAB, 23);
battle(p, amalgamate);
show_area_title();
print_slow("* 你找到了一个记忆存档装置...\n");
print_slow("* 你看到了Alphys和Asriel的过去...\n\n");
print_slow("* 你了解到了Flowey的真相...\n");
seen_alphys_memories = true;
print_slow("输入任意键离开真实验室...");
cin >> temp;
current_area = HOTLAND;
}
}
// 商店与物品系统
void shop_menu(Player& p) {
show_area_title();
print_slow("--- 商店 ---\n\n");
vector<int> available_items;
if (current_area == SNOWDIN) {
available_items = {1, 2};
} else if (current_area == HOTLAND) {
available_items = {10, 12};
} else if (current_area == WATERFALL) {
available_items = {5, 3};
}
print_slow("店主: 欢迎光临!想买点什么吗?\n\n");
for (int idx : available_items) {
Item& item = item_lib[idx];
print_slow(int_to_string(&item - &item_lib[0] + 1) + ". " + item.name +
" - " + item.description + " (" + int_to_string(item.price) + "G)\n");
}
print_slow("\n0. 离开商店\n");
print_slow("你的金币: " + int_to_string(p.Money) + "G\n");
print_slow("请选择: ");
int choice;
cin >> choice;
if (choice == 0) return;
choice--;
for (int idx : available_items) {
if (idx == choice) {
Item& item = item_lib[idx];
if (p.Money >= item.price) {
p.Money -= item.price;
p.inventory.push_back(item);
print_slow("你购买了" + item.name + "!\n");
} else {
print_slow("金币不足!\n");
}
Sleep(1000);
return;
}
}
print_slow("无效的选择!\n");
Sleep(1000);
}
void use_item_menu(Player& p) {
if (p.inventory.empty()) {
print_slow("你的背包是空的...\n");
Sleep(1000);
return;
}
system("cls");
print_slow("--- 背包 ---\n\n");
for (size_t i = 0; i < p.inventory.size(); ++i) {
cout << i+1 << ". " << p.inventory[i].name << " - " << p.inventory[i].description << endl;
}
cout << "\n输入物品编号使用,0返回: ";
int choice;
cin >> choice;
if (choice < 1 || choice > (int)p.inventory.size()) {
return;
}
Item& item = p.inventory[choice-1];
if (item.type == 0) {
int heal = item.effect;
if (item.effect >= 100) {
heal = p.maxHealth * item.effect / 100;
}
p.Health = min(p.Health + heal, p.maxHealth);
print_slow("\n使用了" + item.name + ",恢复了" + int_to_string(heal) + "HP!\n");
p.inventory.erase(p.inventory.begin() + choice - 1);
}
else if (item.type == 1) {
p.dodge += item.effect;
print_slow("\n使用了" + item.name + ",闪避率增加了" + int_to_string(item.effect) + "%!\n");
p.inventory.erase(p.inventory.begin() + choice - 1);
}
else if (item.type == 2) {
if (item.name == "查拉的日记") {
show_area_title();
print_slow("* 你翻开了查拉的日记...\n\n");
print_slow("'今天我遇到了一个怪物男孩,他叫艾斯利而...'\n");
print_slow("'我们成为了朋友,他说会带我去看金色的花朵...'\n");
print_slow("'我们约定要一起穿过那个屏障...'\n\n");
print_slow("* 你感受到了查拉和艾斯利而之间的友谊...\n");
seen_asriel_memory = true;
}
else {
print_slow("\n这个物品现在不能使用!\n");
}
}
// 决心提取器使用(Gaster专属)
else if (item.type == 3 && is_gaster) {
system("cls");
print_slow("--- 决心提取器 ---\n\n");
print_slow("1. 吞噬 - 吸取敌人10%的生命和攻击(永久)\n");
print_slow("2. 吸收 - 吸收对方灵魂(最多保存2个)\n");
print_slow("3. 召唤 - 召唤已吸收的怪物协助战斗\n");
print_slow("4. 释放 - 释放一个已吞噬的怪物力量\n");
print_slow("0. 返回\n");
print_slow("请选择技能: ");
int extractor_choice;
cin >> extractor_choice;
if (extractor_choice == 0) return;
print_slow("\n该技能将在战斗中生效!\n");
Sleep(1000);
}
Sleep(1500);
}
bool battle(Player& p, Monster& mob) {
system("cls");
Color(12);
print_slow("遭遇了 " + mob.name + "!\n\n");
Color(7);
print_slow(mob.flavor_text + "\n\n");
Sleep(1000);
bool is_sans_battle = (mob.name == "审判者Sans");
int sans_turn = 0;
if (is_sans_battle) {
Color(11);
print_slow("* Sans对你露出了诡异的微笑...\n");
print_slow("* 战斗开始了...\n\n");
Color(7);
Sleep(1000);
}
bool is_asriel_battle = (mob.name == "真神艾斯利而");
int asriel_phase = 1;
if (is_asriel_battle) {
Color(11);
print_slow("* 这不是一场普通的战斗...\n");
print_slow("* 你的灵魂感受到了前所未有的压力...\n\n");
Color(7);
Sleep(1000);
}
bool mtt_ex_transformed = false;
while (true) {
system("cls");
Color(12);
print_slow(p.Name + " HP: " + int_to_string(p.Health) + "/" + int_to_string(p.maxHealth) + "\n");
Color(14);
print_slow(mob.name + " HP: " + int_to_string(mob.health) + "\n\n");
Color(7);
if (is_asriel_battle) {
Color(11);
if (asriel_phase == 1) print_slow("* phase 1: 记忆的碎片\n");
else if (asriel_phase == 2) print_slow("* phase 2: 破碎的梦想\n");
else if (asriel_phase == 3) print_slow("* phase 3: 希望的光芒\n");
Color(7);
cout << endl;
}
if (developer_mode) {
print_slow("1. 战斗\n");
print_slow("2. 物品\n");
print_slow("3. 仁慈\n");
print_slow("4. 查看状态\n");
print_slow("5. 作者模式 (秒杀敌人)\n");
print_slow("请选择行动: ");
} else {
print_slow("1. 战斗\n");
print_slow("2. 物品\n");
print_slow("3. 仁慈\n");
print_slow("4. 查看状态\n");
print_slow("请选择行动: ");
}
int action;
cin >> action;
if (developer_mode && action == 5) {
mob.health = 0;
print_slow("作者模式: 已秒杀敌人!\n");
Sleep(1000);
}
if (is_sans_battle) {
sans_turn++;
if (sans_turn > 10) {
print_slow("\nSans: 看来你很有耐心啊...\n");
mob.damage += 5;
}
}
if (is_asriel_battle) {
if (mob.health < 7000 && asriel_phase == 1) {
asriel_phase = 2;
mob.damage += 15;
mob.dodge += 10;
mob.health -= 500;
show_area_title();
print_slow("* 艾斯利而释放了更多的力量...\n");
print_slow("* 他想起了更多被遗忘的记忆...\n");
print_slow("* 但他的防御出现了破绽...\n\n");
Sleep(2000);
}
else if (mob.health < 3000 && asriel_phase == 2) {
asriel_phase = 3;
mob.damage = 100;
mob.dodge = 70;
mob.health -= 1000;
p.Health = p.maxHealth;
show_area_title();
print_slow("* 艾斯利而的力量达到了顶峰...\n");
print_slow("* 但他的眼神中多了一丝犹豫...\n");
print_slow("* 希望的力量治愈了你的伤口...\n\n");
Sleep(2000);
}
}
if (action == 1) {
system("cls");
print_slow("选择技能:\n");
for (size_t i = 0; i < p.skills.size(); ++i) {
if (p.skills[i].is_unlocked) {
string cool = (p.skills[i].current_cool > 0) ? " (冷却中: " + int_to_string(p.skills[i].current_cool) + ")" : "";
print_slow(int_to_string(i+1) + ". " + p.skills[i].name + cool + " - " + p.skills[i].desc + "\n");
}
}
print_slow("请选择技能: ");
int skill_choice;
cin >> skill_choice;
skill_choice--;
if (skill_choice < 0 || skill_choice >= (int)p.skills.size() || !p.skills[skill_choice].is_unlocked || p.skills[skill_choice].current_cool > 0) {
print_slow("无法使用该技能!\n");
Sleep(1000);
continue;
}
Skill& used_skill = p.skills[skill_choice];
int damage_dealt = p.Damage + gaster_absorbed_attack;
// 技能效果处理
if (used_skill.name == "强力攻击") {
damage_dealt = (p.Damage + gaster_absorbed_attack) * 150 / 100;
}
else if (used_skill.name == "决心爆发") {
int hp_cost = p.Health / 2;
p.Health -= hp_cost;
damage_dealt = (p.Damage + gaster_absorbed_attack) * 3;
print_slow("你消耗了" + int_to_string(hp_cost) + "HP,释放了决心爆发!\n");
}
else if (used_skill.name == "伪善之面") {
damage_dealt = (p.Damage + gaster_absorbed_attack) * 2;
print_slow("* 你的表情变得扭曲...\n");
print_slow("* 伪善的力量在你体内涌动!\n");
}
else if (used_skill.name == "希望") {
p.Health = min(p.Health + 50, p.maxHealth);
damage_dealt = (p.Damage + gaster_absorbed_attack) * 2;
print_slow("* 希望的力量充满了你的身体...\n");
print_slow("* 你感受到了前所未有的勇气!\n");
}
// Gaster专属技能 - 吞噬
else if (used_skill.name == "吞噬" && is_gaster) {
int absorb_hp = mob.health * 10 / 100;
int absorb_atk = mob.damage * 10 / 100;
p.Health = min(p.Health + absorb_hp, p.maxHealth);
gaster_absorbed_attack += absorb_atk;
mob.health -= absorb_hp;
Color(13);
print_slow("* 你使用了决心提取器的吞噬技能!\n");
print_slow("* 吸取了" + int_to_string(absorb_hp) + "点生命和" + int_to_string(absorb_atk) + "点攻击!\n");
Color(7);
damage_dealt = 0;
}
else if (used_skill.name == "吸收" && is_gaster) {
if (absorbed_monsters.size() < 2) {
absorbed_monsters.push_back(mob.name);
Color(13);
print_slow("* 你使用了决心提取器的吸收技能!\n");
print_slow("* 成功吸收了" + mob.name + "的灵魂!\n");
print_slow("* 现在可以使用召唤技能了!\n");
Color(7);
for (auto& skill : p.skills) {
if (skill.name == "召唤") {
skill.is_unlocked = true;
break;
}
}
} else {
Color(13);
print_slow("* 你已经吸收了两个灵魂,无法再吸收更多!\n");
print_slow("* 可以使用释放技能后再尝试吸收...\n");
Color(7);
}
damage_dealt = 0;
}
else if (used_skill.name == "召唤" && is_gaster && !absorbed_monsters.empty()) {
system("cls");
print_slow("选择要召唤的怪物:\n");
for (size_t i = 0; i < absorbed_monsters.size(); ++i) {
print_slow(int_to_string(i+1) + ". " + absorbed_monsters[i] + "\n");
}
print_slow("请选择: ");
int summon_choice;
cin >> summon_choice;
summon_choice--;
if (summon_choice >= 0 && summon_choice < (int)absorbed_monsters.size()) {
string summoned = absorbed_monsters[summon_choice];
Color(13);
print_slow("* 你使用了决心提取器的召唤技能!\n");
print_slow("* 召唤了" + summoned + "协助战斗!\n");
int summon_damage = 0;
if (summoned == "Toriel") summon_damage = 50;
else if (summoned == "Papyrus") summon_damage = 70;
else if (summoned == "Undyne") summon_damage = 90;
else if (summoned == "Mettaton") summon_damage = 80;
else if (summoned == "Asgore") summon_damage = 120;
else summon_damage = 40;
mob.health -= summon_damage;
print_slow("* " + summoned + "对敌人造成了" + int_to_string(summon_damage) + "点伤害!\n");
Color(7);
}
damage_dealt = 0;
}
else if (used_skill.name == "释放" && is_gaster && !absorbed_monsters.empty()) {
system("cls");
print_slow("选择要释放的怪物:\n");
for (size_t i = 0; i < absorbed_monsters.size(); ++i) {
print_slow(int_to_string(i+1) + ". " + absorbed_monsters[i] + "\n");
}
print_slow("请选择: ");
int release_choice;
cin >> release_choice;
release_choice--;
if (release_choice >= 0 && release_choice < (int)absorbed_monsters.size()) {
string released = absorbed_monsters[release_choice];
Color(13);
print_slow("* 你使用了决心提取器的释放技能!\n");
print_slow("* 释放了" + released + "的全部力量!\n");
int release_damage = 0;
if (released == "Toriel") release_damage = 200;
else if (released == "Papyrus") release_damage = 250;
else if (released == "Undyne") release_damage = 300;
else if (released == "Mettaton") release_damage = 280;
else if (released == "Asgore") release_damage = 400;
else release_damage = 150;
mob.health -= release_damage;
print_slow("* 爆发造成了" + int_to_string(release_damage) + "点伤害!\n");
absorbed_monsters.erase(absorbed_monsters.begin() + release_choice);
if (absorbed_monsters.empty()) {
for (auto& skill : p.skills) {
if (skill.name == "召唤") {
skill.is_unlocked = false;
break;
}
}
}
Color(7);
}
damage_dealt = 0;
}
bool hit = true;
if (is_sans_battle) {
hit = (rand() % 100 > 80);
if (!hit) {
print_slow("Sans轻松地躲开了你的攻击!\n");
print_slow("Sans: 太慢了,孩子。\n");
}
}
else if (is_asriel_battle) {
hit = (rand() % 100 > mob.dodge);
if (!hit) {
print_slow("艾斯利而用魔法屏障挡住了你的攻击!\n");
print_slow("Asriel: 这种程度的攻击对我无效!\n");
}
else if (asriel_phase >= 2) {
if (rand() % 100 < 30) {
print_slow("* 艾斯利而故意没有躲避你的攻击...\n");
damage_dealt *= 2;
}
}
}
else {
hit = (rand() % 100 > mob.dodge);
}
if (hit && damage_dealt > 0) {
mob.health -= damage_dealt;
Color(12);
print_slow("你对" + mob.name + "造成了" + int_to_string(damage_dealt) + "点伤害!\n");
Color(7);
}
else if (!is_sans_battle && !is_asriel_battle && damage_dealt > 0) {
print_slow(mob.name + "躲开了你的攻击!\n");
}
if (used_skill.cool_down > 0) {
used_skill.current_cool = used_skill.cool_down;
}
if (mob.health <= 0) {
Color(10);
print_slow(mob.name + "被击败了!\n");
Color(7);
if (mob.name == "Toriel") {
met_toriel = true;
toriel_killed = true;
kill_count++;
area_kills[UNDERGROUND]++;
print_slow("Toriel: 为什么...孩子...\n");
p.inventory.push_back(item_lib[0]);
}
else if (mob.name == "Papyrus") {
met_papyrus = true;
papyrus_killed = true;
kill_count++;
area_kills[SNOWDIN]++;
print_slow("Papyrus: 为...为什么...我们...可以做朋友的...\n");
}
else if (mob.name == "Undyne") {
met_undyne = true;
undyne_killed = true;
kill_count++;
area_kills[WATERFALL]++;
if (toriel_killed && papyrus_killed && !undyne_determined) {
print_slow("* 一股强大的决心从Undyne体内涌出...\n");
print_slow("* 她的身体开始融化,但眼神更加坚定!\n");
Sleep(2000);
undyne_determined = true;
mob = Monster("决心鱼Undyne", 400, 25, 150, 50, 20,
"* 即使化为尘埃,我的决心也不会动摇!\n* 我要阻止你这个屠杀者!",
true, true, WATERFALL, 11);
return battle(p, mob);
}
}
else if (mob.name == "决心鱼Undyne") {
undyne_killed = true;
kill_count++;
print_slow("* 决心的力量开始消散...\n");
print_slow("Undyne: 可恶...我...失败了...\n");
}
else if (mob.name == "Mettaton") {
met_mtt = true;
if (!mtt_ex_transformed) {
print_slow("Mettaton: 看来我需要拿出真本事了!\n");
print_slow("* Mettaton进行了形态转换!\n");
mtt_ex_transformed = true;
mob = Monster("Mettaton EX", 500, 20, 120, 70, 25,
"我将成为地下世界的超级明星!", true, true, HOTLAND, 17);
Sleep(2000);
continue;
}
mtt_killed = true;
kill_count++;
area_kills[HOTLAND]++;
print_slow("Mettaton: 哦不...我的演艺生涯...结束了...\n");
}
else if (mob.name == "Asgore") {
met_asgore = true;
asgore_killed = true;
kill_count++;
area_kills[NEW_HOME]++;
print_slow("Asgore: 我...失败了...\n");
}
else if (mob.name == "审判者Sans") {
sans_killed = true;
print_slow("* Sans的眼睛失去了光芒...\n");
print_slow("Sans: ...好吧...看来这就是你的选择...\n");
print_slow("* 他化作了尘埃...\n");
}
else if (mob.name == "Omega Flowey") {
print_slow("* 灵魂们的力量压制了Flowey...\n");
print_slow("Flowey: 不...这不可能!我应该是神!\n");
print_slow("* Flowey变回了普通的金色花朵...\n");
}
else if (mob.name == "真神艾斯利而") {
print_slow("* 艾斯利而停止了攻击...\n");
print_slow("Asriel: 我...我想起了一切...\n");
print_slow("Asriel: 谢谢你...让我找回了自己...\n");
}
else if (mob.name == "融合怪") {
print_slow("* 融合怪平静了下来...\n");
print_slow("* 它似乎认出了你...\n");
area_kills[TRUE_LAB]++;
}
if (!mob.is_unique || (mob.name != "Sans" && mob.name != "审判者Sans" &&
mob.name != "Omega Flowey" && mob.name != "真神艾斯利而")) {
int exp_gained = mob.exp;
p.exp += exp_gained;
p.Money += mob.money;
print_slow("获得了" + int_to_string(exp_gained) + "点经验!\n");
print_slow("获得了" + int_to_string(mob.money) + "G!\n");
check_level_up(p);
}
judge_route(p);
Sleep(2000);
return true;
}
Sleep(1000);
print_slow("\n" + mob.name + "的回合!\n");
bool gaster_dodge = is_gaster && (rand() % 100 < 90);
if (is_sans_battle) {
Color(11);
print_slow("* Sans使用了骨头攻击!\n");
int sans_damage = 5 + sans_turn / 2;
if (!gaster_dodge && rand() % 100 > p.dodge - 30) {
p.Health -= sans_damage;
print_slow("* 你被骨头击中了!受到" + int_to_string(sans_damage) + "点伤害!\n");
if (sans_turn % 5 == 0) {
print_slow("Sans: 还记得那些被你杀死的怪物吗?\n");
print_slow("Sans: 他们曾经也有梦想和朋友...\n");
}
} else {
print_slow("* 你勉强躲开了Sans的攻击!\n");
if (is_gaster) {
print_slow("Sans: 怎么可能...你竟然能...咳...躲过这个...\n");
} else {
print_slow("Sans: 还不赖嘛...\n");
}
}
Color(7);
}
else if (is_asriel_battle) {
Color(11);
if (asriel_phase == 1) {
print_slow("* 艾斯利而使用了星尘攻击!\n");
}
else if (asriel_phase == 2) {
print_slow("* 艾斯利而释放了记忆碎片!\n");
}
else {
print_slow("* 艾斯利而召唤了彩虹冲击波!\n");
}
int damage_taken = mob.damage;
if (!gaster_dodge && rand() % 100 > p.dodge) {
p.Health -= damage_taken;
print_slow("* 你被击中了!受到" + int_to_string(damage_taken) + "点伤害!\n");
if (asriel_phase == 3 && rand() % 2 == 0) {
print_slow("Asriel: 为什么...你不放弃...\n");
print_slow("Asriel: 像我一样...逃避一切...\n");
}
} else {
print_slow("* 你躲开了艾斯利而的攻击!\n");
if (asriel_phase >= 2) {
print_slow("Asriel: ...你很勇敢...\n");
}
}
Color(7);
}
else if (mob.name == "Omega Flowey") {
Color(12);
print_slow("* Flowey使用了灵魂控制!\n");
int damage_taken = mob.damage + (rand() % 20);
if (!gaster_dodge && rand() % 100 > p.dodge - 20) {
p.Health -= damage_taken;
print_slow("* 你被多个灵魂同时攻击!受到" + int_to_string(damage_taken) + "点伤害!\n");
print_slow("Flowey: 感受绝望吧!我是不朽的!\n");
} else {
print_slow("* 你抵抗住了灵魂控制!\n");
print_slow("Flowey: 什么?!这不可能!\n");
}
Color(7);
}
else {
int damage_taken = mob.damage;
if (mob.name == "Undyne" || mob.name == "决心鱼Undyne") {
damage_taken = (rand() % 3 + 1) * mob.damage / 2;
print_slow("Undyne使用了长矛攻击!\n");
}
else if (mob.name == "Mettaton EX") {
damage_taken = mob.damage + (rand() % 10);
print_slow("Mettaton EX使用了明星光束!\n");
}
if (!gaster_dodge && rand() % 100 > p.dodge) {
p.Health -= damage_taken;
Color(12);
print_slow(mob.name + "对你造成了" + int_to_string(damage_taken) + "点伤害!\n");
Color(7);
}
else {
print_slow("你躲开了" + mob.name + "的攻击!\n");
}
}
if (is_gaster && p.Health < p.maxHealth) {
int regen = p.maxHealth * 5 / 100;
p.Health = min(p.Health + regen, p.maxHealth);
Color(13);
print_slow("* 虚空的力量在治愈你的伤口...恢复了" + int_to_string(regen) + "HP!\n");
Color(7);
}
if (p.Health <= 0) {
if (has_item(p, "决心")) {
print_slow("你的决心让你坚持了下来!\n");
p.Health = p.maxHealth / 2;
for (auto it = p.inventory.begin(); it != p.inventory.end(); ++it) {
if (it->name == "决心") {
p.inventory.erase(it);
break;
}
}
}
else {
Color(12);
print_slow("你被" + mob.name + "击败了...\n");
Color(7);
Sleep(2000);
return false;
}
}
}
else if (action == 2) {
use_item_menu(p);
}
else if (action == 3) {
system("cls");
print_slow("你选择了仁慈...\n");
if (is_asriel_battle) {
print_slow("* 你向艾斯利而表达了理解和宽恕...\n");
print_slow("Asriel: ...为什么...你不恨我...\n");
print_slow("* 艾斯利而的攻击减弱了...\n");
mob.damage -= 5;
mob.health -= 500;
Sleep(1500);
print_slow("\n" + mob.name + "的回合!\n");
int damage_taken = mob.damage;
if (rand() % 100 > p.dodge + 20) {
p.Health -= damage_taken;
Color(12);
print_slow(mob.name + "对你造成了" + int_to_string(damage_taken) + "点伤害!\n");
Color(7);
}
else {
print_slow("你躲开了" + mob.name + "的攻击!\n");
}
continue;
}
vector<string> spareable = {"小幽灵纳普斯特", "青蛙吉特", "忧郁虫虫", "Toriel", "Papyrus", "Undyne", "Mettaton EX", "Asgore", "融合怪"};
bool can_spare = find(spareable.begin(), spareable.end(), mob.name) != spareable.end();
if (can_spare) {
if (rand() % 2 == 0) {
print_slow(mob.name + "接受了你的仁慈!\n");
print_slow("战斗结束了。\n");
if (mob.name == "Toriel") {
met_toriel = true;
toriel_spared = true;
print_slow("Toriel: 孩子,我明白了...你必须自己走下去...\n");
p.inventory.push_back(item_lib[0]);
}
else if (mob.name == "Papyrus") {
met_papyrus = true;
papyrus_spared = true;
print_slow("Papyrus: 我...我输了?难以置信!\n");
print_slow("Papyrus: 但你是个不错的对手!我们做朋友吧!\n");
}
else if (mob.name == "Undyne") {
met_undyne = true;
undyne_spared = true;
print_slow("Undyne: 什...什么?你为什么不杀我?\n");
print_slow("Undyne: 哼...别以为这样我就会放过你!\n");
}
else if (mob.name == "Mettaton EX") {
met_mtt = true;
mtt_spared = true;
print_slow("Mettaton: 哦?你选择了饶恕我?\n");
print_slow("Mettaton: 真没想到...好吧,我认输了。\n");
}
else if (mob.name == "Asgore") {
met_asgore = true;
asgore_spared = true;
print_slow("Asgore: 谢谢你,孩子...我终于可以休息了...\n");
}
else if (mob.name == "融合怪") {
print_slow("* 融合怪变回了几个单独的怪物...\n");
print_slow("* 他们向你表示感谢后离开了...\n");
}
p.exb += 0.1;
print_slow("你的仁慈之心得到了回报,经验倍率提升了!\n");
judge_route(p);
Sleep(2000);
return true;
}
else {
print_slow(mob.name + "还没有准备好接受你的仁慈...\n");
}
}
else {
print_slow(mob.name + "不接受你的仁慈!\n");
}
Sleep(1000);
print_slow("\n" + mob.name + "的回合!\n");
if (rand() % 100 > p.dodge) {
p.Health -= mob.damage;
Color(12);
print_slow(mob.name + "对你造成了" + int_to_string(mob.damage) + "点伤害!\n");
Color(7);
}
else {
print_slow("你躲开了" + mob.name + "的攻击!\n");
}
if (p.Health <= 0) {
Color(12);
print_slow("你被" + mob.name + "击败了...\n");
Color(7);
这里空空如也
有帮助,赞一个