#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
int hard;//游戏难度 
int progress,hidscore,ep;//主线进程 隐藏分 经验值 
string place="达米尔星";//位置 
bool tflag,sflag,eflag,cflag,rflag,dflag,yflag;//每一个神殿是否解锁
bool tfin,sfin,efin,cfin,rfin,dfin,yfin;//每一个神殿是否完成 
//神殿 
struct sanc{
	string name;//名称 
	string smap;//地图压缩 
	int fx,fy,sx,sy,room;
	char note;/*
	fx 终点x坐标
	fy 终点y坐标
	sx 起点x坐标
	sy 起点y坐标
	room 房间数量
	note 辨识号码(在代码中容易区分)
	 */ 
	//地图压缩:每行之间以"*"间隔 
};
queue<sanc> sancs;//神殿队列 
map<char,vector<vector<char> > > mp;//神殿地图 
void say(string s,int speed){
	for(int i=0;i<(int)s.size();i++){
		putchar(s[i]);
		Sleep(1000/speed);
	}
	puts("");
}
void sanc_reset(){//神殿初始化 
	sanc timesa;//时间神殿 
	timesa.name="time sanctuary Level ";
	timesa.note='t';
	if(hard==1)timesa.name+="1";
	if(hard==2)timesa.name+="2";
	if(hard==3)timesa.name+="3";
	timesa.smap="##.##*#..##*#.###*#...#*###.#*#...#";
	timesa.fx=1,timesa.fy=3;
	timesa.sx=6,timesa.sy=2;
	timesa.room=11;
	sancs.push(timesa);
	sanc spacesa;//空间神殿 
	spacesa.name="space sanctuary Level ";
	spacesa.note='s';
	if(hard==1)spacesa.name+="1";
	if(hard==2)spacesa.name+="2";
	if(hard==3)spacesa.name+="3";
	spacesa.smap="###.#*#...#*#.###*#.###*#..##*##.##";
	spacesa.fx=1,spacesa.fy=4;
	spacesa.sx=6,spacesa.sy=3;
	spacesa.room=9;
	sancs.push(spacesa);
	sanc elemsa;//元间神殿 
	elemsa.name="element sanctuary Level ";
	elemsa.note='e';
	if(hard==1)elemsa.name+="1";
	if(hard==2)elemsa.name+="2";
	if(hard==3)elemsa.name+="3";
	elemsa.smap="##.##*##..#*###.#*###.#*##..#*##.##";
	elemsa.fx=1,elemsa.fy=3;
	elemsa.sx=6,elemsa.sy=3;
	elemsa.room=8;
	sancs.push(elemsa);
	sanc ctrlsa;//控世神殿 
	ctrlsa.name="control sanctuary Level ";
	ctrlsa.note='c';
	if(hard==1)ctrlsa.name+="1";
	if(hard==2)ctrlsa.name+="2";
	if(hard==3)ctrlsa.name+="3";
	ctrlsa.smap="##.##*#..##*#.###*#..##*##..#*###.#";
	ctrlsa.fx=1,ctrlsa.fy=3;
	ctrlsa.fx=6,ctrlsa.sy=4;
	ctrlsa.room=9;
	sancs.push(ctrlsa);
	sanc crtesa;//创世神殿 
	crtesa.name="create sanctuary Level ";
	crtesa.note='r';
	if(hard==1)crtesa.name+="1";
	if(hard==2)crtesa.name+="2";
	if(hard==3)crtesa.name+="3";
	crtesa.smap="###.#*#...#*#.###*#.###*#.###*#..##";
	crtesa.fx=1,crtesa.fy=4;
	crtesa.sx=6,crtesa.sy=3;
	crtesa.room=9;
	sancs.push(crtesa);
	sanc dstrsa;//灭世神殿 
	dstrsa.name="destroy sanctuary Level ";
	dstrsa.note='d';
	if(hard==1)dstrsa.name+="1";
	if(hard==2)dstrsa.name+="2";
	if(hard==3)dstrsa.name+="3";
	dstrsa.smap="#.###*#..##*##.##*##.##*##..#*###.#"; 
	dstrsa.fx=1,dstrsa.fy=2;
	dstrsa.sx=6,dstrsa.sy=4;
	dstrsa.room=8;
	sancs.push(dstrsa);
	sanc lastsa;//终末圣殿 
	lastsa.name="END SANCTUARY   LEVEL ";
	lastsa.note='Y';
	if(hard==1)lastsa.name+="1";
	if(hard==2)lastsa.name+="2";
	if(hard==3)lastsa.name+="3";
	lastsa.smap="##.####*##b.w##*####.b#*#####.#*###w.b#*##.w###*###.g.#";
	lastsa.fx=1,lastsa.fy=3;
	lastsa.sx=7,lastsa.sy=6;
	lastsa.room=15;
	sancs.push(lastsa);
}
vector<vector<char> > sanc_translate(sanc w){//翻译地图 
	vector<vector<char> > m;
	for(int i=0;i<(int)w.smap.size();i++){
		int j=1;
		if(w.smap[i]=='*'){
			j++;
			m[j].push_back(' ');
			continue;
		}
		m[j].push_back(w.smap[i]);
	}
	mp[w.note]=m;
	return m;
}
void sanc_map_reset(){//神殿地图初始化 
	sanc f=sancs.front();
	while(true){
		sanc now=sancs.front();
		if(now.note==f.note)break;
		sancs.pop();
		mp[now.note]=sanc_translate(now);
		sancs.push(now);
	}
}
//任务 
struct task{
	string name;//任务名字 
	bool unlocked;//是否被解锁 
	bool finished;//是否已完成
	char type;/*任务类型 
	m:主线任务
	n:迷你任务 
	*/
	void unlock(){
		system("cls");
		if(unlocked){puts("任务已解锁!");system("cls");return;}
		switch(type){
			case 'm':
				cout<<"主线任务:";
				break;
			case 'n':
				cout<<"迷你任务:";
				break;
		}
		cout<<name<<endl;
		Sleep(500);
		unlocked=true;
		system("cls");
	}
	void finish(){
		system("cls");
		if(finished){puts("任务已完成!");system("cls");return;}
			switch(type){
				case 'm':
					cout<<"主线任务:";
					break;
				case 'n':
					cout<<"迷你任务:";
					break;
			}
			cout<<name<<"已完成!"<<endl;
			Sleep(500);
			finished=true;
			system("cls");
	}
};
queue<task> maintasks;//主线任务 
vector<task> minitasks;//迷你任务 
void task_reset(){//任务初始化 
	//主线任务:
	task prepretime;
	prepretime.unlocked=prepretime.finished=false;
	prepretime.name="寻找神殿线索!";
	prepretime.type='m';
	maintasks.push(prepretime);
	task pretime;
	pretime.unlocked=pretime.finished=false;
	pretime.name="进入时间神殿!";
	pretime.type='m';
	maintasks.push(pretime); 
	task intime;
	intime.unlocked=intime.finished=false;
	intime.name="探索时间神殿!";
	pretime.type='m';
	maintasks.push(intime);
}
void print_task(){//输出任务 
	puts("请选择任务分类:");
	puts("1.主线任务		2.迷你任务		3.未完成任务		4.已完成任务");//分类 
	int c;
	cin>>c;
	switch(c){
		case 1:{
			task f=maintasks.front();
			maintasks.pop();
			if(f.unlocked){
				cout<<".主线任务:"<<f.name<<endl;
				cout<<"状态:";
				if(f.finished)cout<<"已完成";
				else cout<<"未完成";
				puts(""); 
				maintasks.push(f);
			}
			for(;;){
				task n=maintasks.front();
				if(n.name==f.name)break;
				maintasks.pop();
				if(!n.unlocked)continue;
				cout<<"主线任务:"<<n.name<<endl;
				cout<<"状态:";
				if(n.finished)cout<<"已完成";
				else cout<<"未完成";
				puts(""); 
				maintasks.push(n);
			}
			system("pause");
			system("cls");
			break;
		}
		case 2:{
			for(auto n: minitasks){
				if(!n.unlocked)continue;
				cout<<"迷你任务:"<<n.name<<endl;
				cout<<"状态:";
				if(n.finished)cout<<"已完成";
				else cout<<"未完成";
				puts(""); 
			}
			system("pause");
			system("cls");
			break;
		}
		case 3:{
			task f=maintasks.front();
			maintasks.pop();
			if(f.unlocked&&(!f.finished)){
				cout<<"主线任务:"<<f.name<<endl;
				cout<<"状态:未完成"<<endl;
				maintasks.push(f);
			}
			for(;;){
				task n=maintasks.front();
				if(n.name==f.name)break;
				maintasks.pop();
				if((!n.unlocked)||n.finished)continue;
				cout<<"主线任务:"<<n.name<<endl;
				cout<<"状态:未完成"<<endl;
				maintasks.push(n);
			}
			for(auto n:minitasks){
				if((!n.unlocked)||n.finished)continue;
				cout<<"迷你任务:"<<n.name<<endl;
				cout<<"状态:未完成"<<endl;
			}
			system("pause");
			system("cls");
			break;
		}
		case 4:{
			if(!maintasks.empty()){
				task f=maintasks.front();
				maintasks.pop();
				if(f.unlocked&&f.finished){
					cout<<"主线任务:"<<f.name<<endl;
					cout<<"状态:未完成"<<endl;
					maintasks.push(f);
				}
				for(;;){
					task n=maintasks.front();
					if(n.name==f.name)break;
					maintasks.pop();
					if((!n.unlocked)||(!n.finished))continue;
					cout<<"主线任务:"<<n.name<<endl;
					cout<<"状态:已完成"<<endl;
					maintasks.push(n);
				}
			}
			if(!minitasks.empty()){
				for(auto n:minitasks){
					if((!n.unlocked)||(!n.finished))continue;
					cout<<"迷你任务:"<<n.name<<endl;
					cout<<"状态:已完成"<<endl;
				}
			}
			
			system("pause");
			system("cls");
			break;
		}
	} 
}
struct mob{//怪物 
	string name;
	int attack,defence,blood;
	int k;
	/*
	name:名字
	attack:攻击伤害
	defence:防御 
	blood: 血量
	k:增幅指数(随着等级分的增加,怪物的数值也会随之增加) 
	*/
};
mob death,rememberor,shooter,walker,flier,mainbug,skeleton,cloud;
/*death:死灵   rememberor:回忆者   shooter:守卫者射手   walker:徘徊者   flier:飞行者   mainbug:世界病毒   skeleton:骷髅   cloud:云端圣手*/
void mob_reset(){
	
}
struct skill{//技能 
	string name;
	int colddown,timesset;
	int level;
	int levelup[8][4][3];
	string effect;
	/*
	name:名字
	colddown:冷却时间
	timesset:限制次数
	level:等级
	levelup[i][j][1]:升到i级需要的物品编号 
	levelup[i][j][2]:升到i级需要的物品数量
	effect:描述效果 
	*/
};
map<string,skill> skillist;
void skill_reset(){
	
}
struct Lamen{//法阵 
	string name;
	vector<skill> skills;
	bool can;
	/*
	name 名字
	skills 一堆技能
	can 能否使用 
	*/
};
void Lamen_reset(){
	
} 
void game_reset(){//初始化 
	sanc_reset();
	sanc_map_reset();
	task_reset();
}
void opening(){//开场白 
	say("此游戏归Ay(BC20270055)所有",100);Sleep(500);
	say("游戏前作:《天灵传说1:翼龙降世》",30);
	say("当初那个游戏十分的烂,不过建议玩玩了解剧情",40);
	say("可能这个游戏也没好多少......",20);Sleep(500);
	system("cls");
	say("作者是个蒟蒻,请多多关照",100);Sleep(500);
	say("那么,开始你的游戏吧!",100);Sleep(500);
	say("请选择难度:",1000);
	while(1){
		puts("1.简单		2.中等			3.困难");
		int h;cin>>h;
		if(h==1||h==2||h==3){
			hard=h;
			break;
		}else{
			cout<<"额,请重新输入"<<endl;
			while(1)malloc(114514);
		}
	}
	system("cls"); 
}
void story(int now){//剧情概览 
	printf("是否跳过剧情?\n输入0跳过	输入其余任意键观看剧情\n");
	char c;cin>>c;
	system("cls");
	if(c=='0')return;
	switch(now){
		case 0:
			say("达米尔星,是一个充满神话的行星",50);Sleep(500);
			say("这上面,发生过许许多多的故事",50);Sleep(600);
			say("和事故......",50);Sleep(500);
			say("每一个太平盛世,所有人都对神话深信不疑",50);Sleep(600);
			say("每一次灾难到来,神话便立刻遭到唾弃",50);Sleep(550);
			say("然而,每一次灾难,所有的决定都会掌握在一个特定的人身上",50);Sleep(650);
			say("这样的人被称作天灵",50);Sleep(550);
			say("一般来说,每一个时代都只有一位天灵,他或她会独自对抗危机,并将达米尔星拯救于水深火热之中",50);Sleep(700);
			say("然而,这段时间的危机似乎超乎想象",50);Sleep(500);
			say("上天安排了数位天灵......",50);Sleep(500);
			say("此即所谓“天灵传说”",30);Sleep(1000);
			system("cls");
			say("这个危机的开端,得从翼龙复活开始说起......",50);Sleep(600);
			say("那之前1000年,翼龙被打败了",50);Sleep(500);
			say("但是,这是一个充满神话的时代......",50);Sleep(500);
			say("有许多翼龙的信徒出现了",50);Sleep(400);
			say("总共7个",100);Sleep(200);
			say("而当时出现了一位天灵......",50);Sleep(400);
			say("他叫做普·利姆......",50);Sleep(400);
			say("他研究出了多元宇宙的关系",50);Sleep(400);
			say("将时间线裂成9份",50);Sleep(300);
			say("利用混沌系统将自己变成一个不确定的量子态",50);Sleep(600);
			say("在每一个时间线中,他有着不同的身份和攻击形态",50);Sleep(600);
			say("他的想法是,在9个宇宙当中,总有一个能够成功",50);Sleep(500);
			say("然而讽刺的是,他在9个宇宙中都成功了,但也同时将达米尔星拉入了毁灭的深渊......",50);Sleep(650);
			say("(以上参见《天灵传说1:翼龙降世》)",100);Sleep(1000);
			say("巨龙复活了......",50);Sleep(1000);
			system("cls");
			say("你,是被选中的第二位天灵",50);Sleep(500);
			say("你的任务十分明显,那就是阻止翼龙毁灭达米尔星",50);Sleep(500);
			say("当然,这是有头绪的,不然这游戏也没得玩了",50);Sleep(500);
			say("翼龙诞生后,龙之祭坛升起了一座神殿,将巨龙封印在了神殿中......",50);Sleep(500);
			say("这说明,的确有一些古老的机关用于防范巨龙......",50);Sleep(500);
			say("与此同时,达米尔星一些特定的地方升起了神殿......",50);Sleep(500);
			say("总共6座",50);Sleep(200);
			say("这想必是古老的神为如今的形势作出的准备",50);Sleep(300);
			say("所以,你需要去探索一个个神殿,为屠龙做出准备......",50);Sleep(1000);
			system("cls");
			break;
		case 1:
			say("第一个神殿,位于赤道之上......",50);Sleep(500);
			say("这个神殿完全是黑色,还泛着轻微的绿光......",50);Sleep(500);
			say("但是,神殿似乎不开放,你目前根本进不去......",50);Sleep(500);
			say("你现在唯一的办法,就是去到神殿旁边的村子求助",50);Sleep(1000);
			system("cls");
			say("这个位于赤道炎热气候的村子叫做塔礼村",50);Sleep(500);
			say("同世界上所有的村子一样,他们的信仰神话和先进城市的大不相同",50);Sleep(500);
			say("在这里,你也许可以找出一些线索......",50);Sleep(500);
			say("探索一下吧!",50);Sleep(500);
			maintasks.front().unlock();
			break;
	}
}
void journey(){
	cout<<"你要去哪里?\n1.达米尔星		2.塔李村"<<endl;
	if(tflag)cout<<"3.时间神殿		"<<endl;
	int ans;
	cin>>ans;
	switch(ans){
		case 1:
			place="达米尔星";
			break;
		case 2:
			place="塔李村";
			break;
		case 3:
			if(!tflag){
				break;
			}
			place="时间神殿";
			break;
	}
}
void explore(){
	if(place=="达米尔星"){
		say("你的面前坐着整个行星的神父......",40);Sleep(500);
		say("虽然我们有行星的首相,但他实际上没什么权力,而在这个神话为主的世界里,神父则拥有绝对的权力",20);Sleep(400);
		say("但是如今,危机来临,你作为选定的天灵获得了至高无上的权力......",30);Sleep(400);
		say("神父已没有了以往威严神圣的神情,取而代之的,是一种深深的恐惧......",40);Sleep(1400);
		system("cls");
		return;
	}else if(place=="塔李村"){
		if(!tflag){
			cout<<"是否跳过剧情?\n1.是		2.否"<<endl;
			bool t;cin>>t;
			if(t)return;
			say("你拜访了塔李村......",30);Sleep(500);
			say("你拜见了一个居民,从他们那里,你得知了另一个神话......",40);Sleep(500);
			say("很久以前,这里曾经有一场巨大的风波",40);Sleep(500);
			say("当时,一个女人曾经造访这里,自称是死灵法师,在天空中打开了一个巨大的眼睛",40);Sleep(500);
			say("大量的死灵出现,掠夺了村庄",50);Sleep(500);
			say("当时,村庄危在旦夕,许多人都死了,剩下的都流离失所",40);Sleep(500);
			say("这个时候,天上突然闪过一道绿光",40);Sleep(500);
			say("据居民所说,有一个人以常人难以想象的速度把一个长枪刺向了那个死灵法师",40);Sleep(500);
			say("之后,那个人来到了村庄中,自称是时间之神",50);Sleep(500);
			say("他拯救了村庄,并创造了一个神殿将死灵法师封印在这里",50);Sleep(500);
			say("但是不久之前,那个死灵法师曾经在巨龙的帮助下破开了封印飞了出去",50);Sleep(500);
			say("但是那个时间之神如今却不知去向",50);Sleep(500);
			say("人们搭建了一座神庙来祈祷,希望时间之神能够在巨龙的危机中出手相助......",50);Sleep(500);
			say("你听到之后,意识到机会就在眼前",50);Sleep(500);
			say("你来到了神庙,并且对着时间之神巨大的雕像开始祈祷",50);Sleep(500);
			say("“愿时间之神持守相助,助达米尔星脱离巨龙之灾!”",50);Sleep(500);
			say("突然,一道绿光出现了......",50);Sleep(500);
			say("一道声音传来,穿过重重时空来到了你耳边",50);Sleep(500);
			say("“井下......”",15);Sleep(500);
			say("你吓了一跳,同时也明白了自己该去的地方",30);Sleep(500);
			say("你来到了村庄里的井,义无反顾跳了下去",50);Sleep(500);
			say("井下,有一个奇怪的物品,像是一个绿色的宝石",50);Sleep(500);
			say("你拿了起来,突然旁边闪过一道光,一把弓箭出现了",50);Sleep(500);
			say("突然,又是一道绿光闪过,时间之神的声音再度传来......",50);Sleep(500);
			say("“把那块宝石......通过弓箭......射到神殿门口......”",50);Sleep(500);
			say("这是一个相当不错的答案,所以,你立刻离开了村子,坐船来到了神殿门口......",50);Sleep(500); 
		}
	}
}
void story_telling(){
	for(int i=1;i<=progress;i++){
		story(i);
	}
}
void main_line(){
	switch(progress){
		case 1:
			story(progress);
			break;
		
	}
}
int main(){
	opening();
	game_reset();
	story(progress);progress++;
	while(1){
		system("cls");
		cout<<"你现在位于"<<place<<endl;
		puts("你现在要干什么?");
		printf("1.探问神殿		2.回顾剧情		3.出发		4.探索		  5.查看任务");
		int ans;
		cin>>ans;
		system("cls");
		switch(ans){
			case 1:
				main_line();
				break;
			case 2:
				story_telling();
				break;
			case 3:
				journey();
				break;
			case 4:
				explore(); 
				break;
			case 5:
				print_task();
				break;
			default:
				while(1)malloc(114514);
		}
	}
	return 0;
}