⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cscript.cpp

📁 成熟的RPG引擎,Flysky发布. 斜视角引擎.
💻 CPP
字号:
//脚本文件解释器
#include "../GameH.h"

char Tempc[100],Tempc1[100],Tempc2[100]; //临时字符串
int t1=0,t2=0,t3=0,t4=0,t5=0,t6=0,t7=0;
char tc1[32],tc2[32];
//脚本读入器 Mar.2nd,2005
//大修正 加返回,改BUG June,5th,2005
//小飞侠 制作,小飞侠 三次修改
//一次,基本,有BUG!(重)
//二次,加强,有BUG!(重)
//三次,加强(加返回),无BUG
CScript::CScript(){ScrIsFill=false;}
CScript::~CScript()
{
	ScrIsFill=false;
	if(ScriptBg!=NULL)
	{
	ScriptBg->Release();
	ScriptBg=NULL;
	}
}
void CScript::Init(LPDIRECTDRAWSURFACE7 &SDDS)
{
ScrIsFill=false;
if (ScriptBg==NULL) CreateSurface(ScriptBg,NULL,ScreenWidth,ScreenHeight);
ScriptDDS=SDDS;
}
bool CScript::LoadScript(char *FileName)
{
	ifstream is;
	int ZS;
	int sta,end;
	if (IsFile(FileName)==false) return false; //直接返回,因为不存在
	IsNextLine=true;
	strcpy(Name,FileName);
	is.open(FileName);
	//if (RunGame!=true) ScriptBg->BltFast(0,0,lpDDS[1],NULL,NoKey);  //备份
	if (RunGame!=true) BltFast(ScriptBg,0,0,lpDDS[1],NULL,NoKey);  //备份
	for (;!is.eof();)
	{
		//用于循环时数据更新
		if (ScrIsFill==true) {Clrscr(lpDDS[1],0);Clrscr(ScriptBg,0);} //清屏
		else if (RunGame==true) 
			{
				Clrscr(lpDDS[1],0);
				XGameLoop(lpDDS[1]);
			}
			else
			{
				//lpDDS[1]->BltFast(0,0,ScriptBg,NULL,NoKey);  //备份
				BltFast(lpDDS[1],0,0,ScriptBg,NULL,NoKey);  //备份
			}
		ForV(); //Fps等文字状态
		PrintMouse(lpDDS[1],lpDDS[DDS_Mouse]); //画鼠标 必须
		FlipSurface();
	if (IsNextLine==true) getline(is,str);
	ZS=int(str.find("//"));
	str=str.substr(0,ZS); //去掉注释语句
	replace_all_distinct(str,"'","");
	replace_all_distinct(str,syh,"");
	if (stricmp(str.c_str(),"return;")==0||stricmp(str.c_str(),"return();")==0) break;
	else RunScript();
	//IF语句的实现
	if (stricmp(M_CMD.c_str(),"If")==0)
	{
		int IfP=2;
		//If(X(Y)) 肯定条件,相符运行语句
		if (M_CANX[0].find("(")!=-1)
		{
		sta=int(M_CANX[0].find("(")); //比如IF(XX[(]XX))
		end=int(M_CANX[0].find_last_of(")"));//比如IF(XX(XX[)])
		M_IFO=M_CANX[0].substr(0,sta);//获取IF里的命令
		M_IFT=M_CANX[0].substr(sta+1,end-sta-1);//获取if里的变量
		//strcpy(SMessage,M_IFO.c_str());
		if (M_IFO==M_IFT) IfP=0; //0为通过
		else IfP=1; //1为不通过
		}
  		//If(X[Y]) 否定条件,不符运行语句  
		if (M_CANX[0].find("[")!=-1)
		{
		sta=int(M_CANX[0].find("[")); //比如IF(XX[XX])
		end=int(M_CANX[0].find_last_of("]"));//比如IF(XX[XX])
		M_IFO=M_CANX[0].substr(0,sta);//获取IF里的命令
		M_IFT=M_CANX[0].substr(sta+1,end-sta-1);//获取if里的变量
		if (M_IFO!=M_IFT)IfP=0; //0为通过
		else IfP=1; //1为不通过
		}

		if (IfP!=2)
		{
		if (IfP==0)
		{
			while(str!="}") //什么时候结束
			{
				//用于循环时数据更新
				if (RunGame==true) 
				{
					Clrscr(ScriptDDS,0);
					XGameLoop(ScriptDDS);
				}
				else
				{
					//lpDDS[1]->BltFast(0,0,lpDDS[7],NULL,NoKey);  //备份
					BltFast(ScriptDDS,0,0,ScriptBg,NULL,NoKey);  //备份
				}
				PrintMouse(ScriptDDS,lpDDS[DDS_Mouse]); //画鼠标 必须
				FlipSurface();
				if (IsNextLine==true) getline(is,str);
				ZS=int(str.find("//"));
				str=str.substr(0,ZS); //去掉注释语句
				replace_all_distinct(str,"'","");
				replace_all_distinct(str,syh,"");
				if (str.find("return;")!=str.npos||str.find("return();")!=str.npos) {break;break;} //结束脚本
				else RunScript();
				//二级IF
				//完成
			}
		}
		else
		{
			while(str!="}") //什么时候结束
			{
				getline(is,str); //到"{"这一行
			}
		}
		}
	IfP=2;
	M_IFO.clear();
	M_IFT.clear();
	} //IF结束
	//结束
	}
	M_IFO.clear();
	M_IFT.clear();
	is.close();
	return true;
}

void CScript::RunScript() //运行一行脚本
{
	int VarVa=int(str.find_first_of("="));
	int sta=int(str.find_first_of("("));
	int end=int(str.find_last_of(")"));
	M_VAR=str.substr(0,VarVa);//获取变量
	M_CMD=str.substr(VarVa+1,sta-VarVa-1);//获取命令
	M_CAN=str.substr(sta+1,end-sta-1);//获取全部参数
	M_RIGHT=str.substr(VarVa+1,strlen(str.c_str()));
	for (int i=0;i<int(VARA.size());i++) 
	{
		replace_all_distinct(M_CAN,"["+VARA[i].Name+"]",VARA[i].Value);
		replace_all_distinct(M_CAN,VARA[i].Name,VARA[i].Value);
	}
	for (int i=0;i<MAX_CANX;i++)
	{
		sta=int(M_CAN.find(","));
        M_CANX[i]=M_CAN.substr(0,sta);
		M_CAN.replace(0,sta+1,"");
		if (stricmp(M_CANX[i].c_str(),"False")==0) CanB[i]=0;
	    else if (stricmp(M_CANX[i].c_str(),"True")==0) CanB[i]=1; //布尔变量读取
	}
	if (M_CMD.length()!=0)FenJScript(); //执行脚本
	if (M_VAR.length()!=0)FenJVar();   //分析变量,因为脚本有的有返回值
	strcpy(SMessage,M_CMD.c_str());
}
//脚本分析器 Mar.4th,2005
void CScript::FenJScript() //执行脚本
{
	if (stricmp(M_CMD.c_str(),"Random")==0) //产生随机数
    {
		strcpy(Tempc,M_CANX[0].c_str());t1=atoi(Tempc);
		itoa(random(t1),Tempc,10);
		M_Value=Tempc;
	}

	#ifdef _DebugMode
	else if (stricmp(M_CMD.c_str(),"Debug")==0)	RunMessage(MS_Debug,CanB[0],NULL,0,0,0,0,NULL,0);  //命令1,是否为调试模式
	#endif

	else if (stricmp(M_CMD.c_str(),"Close")==0) RunMessage(MS_Close,0,NULL,0,0,0,0,NULL,0); //命令2,关闭引擎

	else if (stricmp(M_CMD.c_str(),"NewMap")==0) //创建地图
	{
		strcpy(Tempc,M_CANX[0].c_str());t5=atoi(Tempc);

		strcpy(Tempc,M_CANX[2].c_str());t1=atoi(Tempc);
		strcpy(Tempc,M_CANX[3].c_str());t2=atoi(Tempc);
		strcpy(Tempc,M_CANX[4].c_str());t3=atoi(Tempc);
		strcpy(Tempc,M_CANX[5].c_str());t4=atoi(Tempc);
		strcpy(Tempc,M_CANX[6].c_str());t6=atoi(Tempc);
	    strcpy(Tempc,M_CANX[1].c_str());
		strcpy(tmpc,M_CANX[7].c_str());
		RunMessage(MS_NWMAP,t5,Tempc,t1,t2,t3,t4,tmpc,t6);
	}

	else if (stricmp(M_CMD.c_str(),"ReadATile")==0) //读取一个TILE资源到表面
	{
		strcpy(Tempc,M_CANX[0].c_str());t1=atoi(Tempc);
		strcpy(Tempc,M_CANX[1].c_str());
		RunMessage(MS_RAT,t1,Tempc,0,0,0,0,NULL,0);
	}

	else if (stricmp(M_CMD.c_str(),"MoveTo")==0) //NPC移动到XY
	{
		strcpy(Tempc,M_CANX[0].c_str());t1=atoi(Tempc);
		strcpy(Tempc,M_CANX[1].c_str());t2=atoi(Tempc);
		RunMessage(MS_RMOVETO,0,NULL,0,0,t1,t2,NULL,0);
	}

	else if (stricmp(M_CMD.c_str(),"SetActorPos")==0) //NPC瞬间移动到XY
	{
		strcpy(Tempc,M_CANX[0].c_str());t1=atoi(Tempc);
		strcpy(Tempc,M_CANX[1].c_str());t2=atoi(Tempc);
		RunMessage(MS_SETRPOS,0,NULL,0,0,t1,t2,NULL,0);
	}

	else if (stricmp(M_CMD.c_str(),"NewNPC")==0) //创建NPC
	{
		strcpy(Tempc,M_CANX[3].c_str());t1=atoi(Tempc);
		strcpy(Tempc,M_CANX[4].c_str());t2=atoi(Tempc);
		strcpy(Tempc,M_CANX[5].c_str());t3=atoi(Tempc);
		strcpy(Tempc,M_CANX[6].c_str());t4=atoi(Tempc);
		strcpy(Tempc,M_CANX[7].c_str());t5=atoi(Tempc);
		strcpy(Tempc,M_CANX[8].c_str());t6=atoi(Tempc);
		strcpy(Tempc,M_CANX[9].c_str());t7=atoi(Tempc);
        strcpy(Tempc,M_CANX[0].c_str());
		strcpy(Tempc1,M_CANX[1].c_str());
		strcpy(Tempc2,M_CANX[2].c_str());
		RunMessage(MS_NWNPC,t1,Tempc,Tempc1,Tempc2,NULL,t4,t5,t2,t3,t6,t7,CanB[10]);
	}
	else if (stricmp(M_CMD.c_str(),"LoadRole")==0) //读取Role文件
	{
		strcpy(Tempc,M_CANX[0].c_str());
		RunMessage(MS_LDROLE,0,Tempc,0,0,0,0,NULL,0);
	}
	else if (stricmp(M_CMD.c_str(),"ScriptRunIsFill")==0) ScrIsFill=IntTobool(CanB[0]);//脚本运行黑屏
    else if (stricmp(M_CMD.c_str(),"ShowPic")==0) //显示图片
	{
		strcpy(Tempc,M_CANX[0].c_str());
		RunMessage(MS_SWPIC,0,Tempc,0,0,0,0,NULL,0);

	}
	else if (stricmp(M_CMD.c_str(),"Sleep")==0) //休眠
    {
		strcpy(Tempc,M_CANX[0].c_str());t1=atoi(Tempc);
        Sleep((DWORD)t1);
	}
	else if (stricmp(M_CMD.c_str(),"DeleteRole")==0) //删除一个NPC
	{
		strcpy(Tempc,M_CANX[0].c_str());t1=atoi(Tempc);
		RunMessage(MS_DLROLE,t1,NULL,0,0,0,0,NULL,0);
	}
	else if (stricmp(M_CMD.c_str(),"NewVar")==0) AddVar(M_CANX[0],M_CANX[1]);//创建变量
    else if (stricmp(M_CMD.c_str(),"LoadMap")==0) //创建地图
	{
		strcpy(Tempc,M_CANX[0].c_str());
		RunMessage(MS_LOADMAP,0,Tempc,0,0,0,0,NULL,0);
	}
    else if (stricmp(M_CMD.c_str(),"SaveMap")==0) //保存地图
	{
		strcpy(Tempc,M_CANX[0].c_str());
		RunMessage(MS_SAVEMAP,0,Tempc,0,0,0,0,NULL,0);
	}
	
	else if (stricmp(M_CMD.c_str(),"Say")==0) //小对话
	{
	    IsNextLine=false;
		strcpy(tmpc,M_CANX[2].c_str()); t1=atoi(tmpc);
		strcpy(tmpc,M_CANX[3].c_str()); t2=atoi(tmpc);
		strcpy(Tempc,M_CANX[0].c_str());
		strcpy(tmpc,M_CANX[1].c_str());
		RunMessage(MS_SAY,0,Tempc,t1,t2,0,0,tmpc,0);
		IsNextLine=true;
	}
	else if (stricmp(M_CMD.c_str(),"PlaySound")==0) //音乐播放
	{
		strcpy(Tempc,M_CANX[0].c_str());
		RunMessage(MS_PLAYMUSIC,0,Tempc,0,0,0,0,NULL,0);
	}
	else if (stricmp(M_CMD.c_str(),"PlayVideo")==0) //视频播放(非循环)
	{
		strcpy(Tempc,M_CANX[0].c_str());
		RunMessage(MS_PLAYVIDEO,0,Tempc,0,0,0,0,NULL,0);
	}
	else if (stricmp(M_CMD.c_str(),"PlayVideoD")==0) //视频播放(循环)
	{
		strcpy(Tempc,M_CANX[0].c_str());
		RunMessage(MS_PLAYVIDEOALONG,0,Tempc,0,0,0,0,NULL,0);
	}
	else if (stricmp(M_CMD.c_str(),"StopSound")==0) RunMessage(MS_STOPMUSIC,0,NULL,0,0,0,0,NULL,0);//音乐播放
	else if (stricmp(M_CMD.c_str(),"IsSMouse")==0) RunMessage(MS_ISSM,CanB[0],NULL,0,0,0,0,NULL,0); //是否现实鼠标
	else if (stricmp(M_CMD.c_str(),"CreateMapObject")==0) //改变某Tile
	{
		strcpy(Tempc,M_CANX[0].c_str());t1=atoi(Tempc);
		strcpy(Tempc,M_CANX[1].c_str());t2=atoi(Tempc);
		strcpy(Tempc,M_CANX[2].c_str());t3=atoi(Tempc);
		strcpy(Tempc,M_CANX[3].c_str());t4=atoi(Tempc);
		strcpy(Tempc,M_CANX[4].c_str());t5=atoi(Tempc);
		strcpy(Tempc,M_CANX[5].c_str());t6=atoi(Tempc);
		RunMessage(MS_CMMO,t1,NULL,t2,t3,t4,t5,Tempc,t6);
	}
	else if (stricmp(M_CMD.c_str(),"SetMapBlock")==0) //设定障碍
	{
		//X Y FALSE/TRUE
		strcpy(Tempc,M_CANX[0].c_str());t1=atoi(Tempc);
		strcpy(Tempc,M_CANX[1].c_str());t2=atoi(Tempc);
		RunMessage(MS_SMBK,CanB[2],NULL,t1,t2,0,0,NULL,0);
	}
	else if (stricmp(M_CMD.c_str(),"SetMapHook")==0) //设定陷阱
	{
        //TRUE/FALSE X Y SN
		strcpy(Tempc,M_CANX[1].c_str());t1=atoi(Tempc);
		strcpy(Tempc,M_CANX[2].c_str());t2=atoi(Tempc);
        strcpy(Tempc,M_CANX[3].c_str());
		RunMessage(MS_SMHK,CanB[0],Tempc,t1,t2,0,0,NULL,0);
	}
	else if (stricmp(M_CMD.c_str(),"NewRole")==0) //新建Role
	{
		strcpy(Tempc,M_CANX[1].c_str());t5=atoi(Tempc);
		strcpy(Tempc,M_CANX[2].c_str());t1=atoi(Tempc);
		strcpy(Tempc,M_CANX[3].c_str());t2=atoi(Tempc);
		strcpy(Tempc,M_CANX[4].c_str());t3=atoi(Tempc);
		strcpy(Tempc,M_CANX[5].c_str());t4=atoi(Tempc);
		strcpy(tmpc,M_CANX[6].c_str());
		strcpy(Tempc,M_CANX[0].c_str());
		RunMessage(MS_NWROLE,t5,Tempc,t1,t2,t3,t4,tmpc,0);
	}
	else if (stricmp(M_CMD.c_str(),"SetMoveNPC")==0) //设定移动角色
	{
		//FALSE/TRUE X Y
		strcpy(Tempc,M_CANX[2].c_str());t1=atoi(Tempc);
		strcpy(Tempc,M_CANX[3].c_str());t2=atoi(Tempc);
		strcpy(Tempc,M_CANX[0].c_str());
		RunMessage(MS_SMN,CanB[1],Tempc,t1,t2,0,0,NULL,0);
	}
	else if (stricmp(M_CMD.c_str(),"Call")==0) //读取一个脚本文件,注意,原脚本文件不会继续执行了。。。。。。
		RunMessage(MS_RUNSCRIPT,0,(char *)M_CANX[0].c_str(),0,0,0,0,NULL,0);
	else if (stricmp(M_CMD.c_str(),"ClearVar")==0) ClearVar();//清除所有的变量
}

void CScript::FenJVar()
{
	if (M_Value.length()==0)
	{
       M_Value=M_RIGHT;
	   replace_all_distinct(M_Value,";","");
	}
	for (int i=0;i<int(VARA.size());i++)	if (VARA[i].Name==M_VAR)   VARA[i].Value=M_Value;
	M_Value.clear();//返回清空
}
bool CScript::AddVar(string Name,string Value)
{
	stVariable TVar;
	TVar.Name=Name;
    TVar.Value=Value;
	VARA.push_back(TVar);
	return true;
}
bool CScript::ClearVar()
{
	//清空变量
	VARA.clear();
	return true;
}
bool CScript::BScriptBg(char *FileName)
{
	LoadPic(false,ScriptBg,FileName);
	return true;
} //这样就可以了

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -