📄 cscript.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 + -