发表于 2008-7-20 09:591#
楼主## 套用经典关卡流程 ##
本流程来自 真武林关卡套路。
/*
Attribute for SN_1 by ZMJ 2005/10/10
*/
#include "npctypes.pst"
#include "snopt.pst"
/////////////////////////////////////////////////////// BASIC此处为常用全局配置数据
int Level = GetConfig(3);
int Rule = GetSNRule(Level);
int RoundTime = GetSNTime(Level);
int PlayerSpawn = 14;
int PlayerSpawnDir = 0;
int PlayerWeapon = GetSNWeapon(Level);
int PlayerWeapon2 = GetSNWeapon2(Level);
int PlayerHP = GetSNHP(Level);
int PlayerSpeed = GetSNSpeed(Level);
int PlayerExps = GetPlayerExps();
/////////////////////////////////////////// BEG 此处为全局该关数据变量
int c1;
int c2;
int c3;
int curtime;
int gb_lastime = -1;
int gb_updatime = -1;
int gb_trg = 0;
int gb_trg2 = 0;
int gb_scence = 0;
int gameover = 0;
int i;
int tmp1;
int tmp2;
int gb_val1 = -1;
int gb_val2 = -1;
/////////////////////////////////////////// END
////////////////////////////
此处为小关卡过关打印升级信息
PrintSnapOver(int player, int beg, int end, int clear)
{
int speed;
PlayerExps = PlayerExps+GetNewExps3(beg, end);
if(clear == 1)
{
RemoveSnapNAlly(beg, end);
RemoveSnapAlly(3, 16);
}
speed = GetSnapSpeeder(PlayerSpeed, PlayerExps);
Say(player, "升级: ", PlayerSpeed-speed, " 内力: ", 120-speed);
Say(player, "****************",120-speed,"****************");
Say(player, "-------经验值 : ", PlayerExps, "----------");
PlayerSpeed = speed;
UpdateSnapReward(Level, player, PlayerSpeed);
}
////////////////////////////
此处判断改关是否结束的统一遵守条件
QueryIsGameOver(int player)
{
if (gameover==0 && GetHP(player)<=0)
{
gameover = -1;
gb_trg = 99;
gb_lastime = curtime;
return 1;
}
if ((gameover==1 || gameover==-1))
{
if(curtime-gb_lastime >= 15)
{
if(gameover==1) {Save(PlayerExps);}
GameOver(gameover);
gameover = 2;
}
return 1;
}
return 0;
}
此处时刻关注玩家升级后得到新的属性使用
QueryIsUpdateAI(int player)
{
if(gb_scence == 0)
{
return 0;
}
if(gb_updatime == -1)
{
gb_updatime = curtime;
}
if(curtime-gb_updatime>=PlayerSpeed)
{
UpdatePlayerOpt(player, PlayerSpeed);
gb_updatime = curtime;
return 1;
}
return 0;
}
此处是关卡的引子幕
ExecScence0(int player)
{
if(gb_scence != 0)
{
return 0;
}
c1 = GetChar("旁白");
if (c1 < 0)
{
return 0;
}
if(gb_val1 == -1)
{
ReadConfig();
gb_trg = GetTrg();
gb_trg2 = GetTrg2();
gb_scence = GetScens();
gb_lastime = curtime;
Say(c1, "读取进度中...");
Say(c1, "读取进度中...");
Say(c1, "读取进度中...");
if(gb_scence == 1)
{
自动补丁记录到你已经玩过了第0幕,新开始的第1幕剧情起始
AddNPC("爱莲云雪a1");
AddNPC("巡城兵士a1");
AddNPC("逻城兵士a1");
PlayerPerform("block", 1);
}
if(gb_scence == 2)
{
自动补丁记录到你已经玩过了第1幕,新开始的第2幕剧情起始
AddNPC("爱莲云雪b1");
}
gb_val1 = 1;
return 1;
}
if(gb_trg == 0)
{
引子幕旁白发表的感慨
Perform(c1, "pause", 2);
Perform(c1, "say", "小虾米剑术也颇有长进。");
Perform(c1, "pause", 2);
Perform(c1, "say", "日月如梭,眨眼间小虾米到异域山已经练剑二年多了!");
Perform(c1, "pause", 4);
PlayerPerform("block", 0);
PlayerPerform("pause", 10);
PlayerPerform("block", 1);
gb_lastime = curtime;
gb_trg ++;
return 1;
}
if(gb_trg==1 && curtime-gb_lastime>=12)
{
gb_scence ++;
gb_trg = 0;
return 1;
}
return 1;
}
关卡第1幕的剧情运行
ExecScence1(int player)
{
if(gb_scence != 1)
{
return 0;
}
if(gb_trg == 0)
{
AddNPC("1师父2");
gb_trg2 = 0;
gb_trg ++;
gb_lastime = curtime;
}
进入下一幕
if(gb_trg==5 && curtime-gb_lastime>=12)
{
c1 = GetChar("爱莲云雪");
Perform(c1, "use", 15);
Perform(c1, "use", 15);
gb_trg = 0;
gb_trg2 = 0;
PlayerPerform("block", 0);
SaveConfig(PlayerExps, 0, 0, 4, 0);
gb_scence ++;
FullPlayerHP(player);
}
return 1;
}
关卡第2幕的剧情运行
ExecScence2(int player)
{
if(gb_scence != 2)
{
return 0;
}
return 1;
}
关卡第。。。幕的剧情运行
//////////////////////////////////////////////////////////////
OnStart()
{
InitSNData();
AddNPC("旁白2");
}
OnUpdate()
{
int player = GetAnyChar("player");
if (player < 0)
{
return 0;
}
获取关卡当前时间,供剧情使用
curtime = GetGameTime();
统一遵守的游戏结束判断,剧情幕内可以再有自己的其他条件判断
if(QueryIsGameOver(player) == 1)
{
return 0;
}
游戏玩家属性实时更新使用
QueryIsUpdateAI(player);
运行第0幕剧情
if(ExecScence0(player) == 1)
{
return 0;
}
运行第1幕剧情
if(ExecScence1(player) == 1)
{
return 0;
}
运行第2幕剧情
if(ExecScence2(player) == 1)
{
return 0;
}
运行第。。。幕剧情
由于ExecScenceX内部会判断当前是第x幕,所以每幕剧情不会混联,此时每幕只需关心本幕剧情设计
我们增加剧情只需要添加更多的ExecScence3, ExecScence4, ExecScence5, 。。。 即可
return 0;
}
祝大家愉快,明明白白我的深意。

本流程来自 真武林关卡套路。
/*
Attribute for SN_1 by ZMJ 2005/10/10
*/
#include "npctypes.pst"
#include "snopt.pst"
/////////////////////////////////////////////////////// BASIC此处为常用全局配置数据
int Level = GetConfig(3);
int Rule = GetSNRule(Level);
int RoundTime = GetSNTime(Level);
int PlayerSpawn = 14;
int PlayerSpawnDir = 0;
int PlayerWeapon = GetSNWeapon(Level);
int PlayerWeapon2 = GetSNWeapon2(Level);
int PlayerHP = GetSNHP(Level);
int PlayerSpeed = GetSNSpeed(Level);
int PlayerExps = GetPlayerExps();
/////////////////////////////////////////// BEG 此处为全局该关数据变量
int c1;
int c2;
int c3;
int curtime;
int gb_lastime = -1;
int gb_updatime = -1;
int gb_trg = 0;
int gb_trg2 = 0;
int gb_scence = 0;
int gameover = 0;
int i;
int tmp1;
int tmp2;
int gb_val1 = -1;
int gb_val2 = -1;
/////////////////////////////////////////// END
////////////////////////////
此处为小关卡过关打印升级信息
PrintSnapOver(int player, int beg, int end, int clear)
{
int speed;
PlayerExps = PlayerExps+GetNewExps3(beg, end);
if(clear == 1)
{
RemoveSnapNAlly(beg, end);
RemoveSnapAlly(3, 16);
}
speed = GetSnapSpeeder(PlayerSpeed, PlayerExps);
Say(player, "升级: ", PlayerSpeed-speed, " 内力: ", 120-speed);
Say(player, "****************",120-speed,"****************");
Say(player, "-------经验值 : ", PlayerExps, "----------");
PlayerSpeed = speed;
UpdateSnapReward(Level, player, PlayerSpeed);
}
////////////////////////////
此处判断改关是否结束的统一遵守条件
QueryIsGameOver(int player)
{
if (gameover==0 && GetHP(player)<=0)
{
gameover = -1;
gb_trg = 99;
gb_lastime = curtime;
return 1;
}
if ((gameover==1 || gameover==-1))
{
if(curtime-gb_lastime >= 15)
{
if(gameover==1) {Save(PlayerExps);}
GameOver(gameover);
gameover = 2;
}
return 1;
}
return 0;
}
此处时刻关注玩家升级后得到新的属性使用
QueryIsUpdateAI(int player)
{
if(gb_scence == 0)
{
return 0;
}
if(gb_updatime == -1)
{
gb_updatime = curtime;
}
if(curtime-gb_updatime>=PlayerSpeed)
{
UpdatePlayerOpt(player, PlayerSpeed);
gb_updatime = curtime;
return 1;
}
return 0;
}
此处是关卡的引子幕
ExecScence0(int player)
{
if(gb_scence != 0)
{
return 0;
}
c1 = GetChar("旁白");
if (c1 < 0)
{
return 0;
}
if(gb_val1 == -1)
{
ReadConfig();
gb_trg = GetTrg();
gb_trg2 = GetTrg2();
gb_scence = GetScens();
gb_lastime = curtime;
Say(c1, "读取进度中...");
Say(c1, "读取进度中...");
Say(c1, "读取进度中...");
if(gb_scence == 1)
{
自动补丁记录到你已经玩过了第0幕,新开始的第1幕剧情起始
AddNPC("爱莲云雪a1");
AddNPC("巡城兵士a1");
AddNPC("逻城兵士a1");
PlayerPerform("block", 1);
}
if(gb_scence == 2)
{
自动补丁记录到你已经玩过了第1幕,新开始的第2幕剧情起始
AddNPC("爱莲云雪b1");
}
gb_val1 = 1;
return 1;
}
if(gb_trg == 0)
{
引子幕旁白发表的感慨
Perform(c1, "pause", 2);
Perform(c1, "say", "小虾米剑术也颇有长进。");
Perform(c1, "pause", 2);
Perform(c1, "say", "日月如梭,眨眼间小虾米到异域山已经练剑二年多了!");
Perform(c1, "pause", 4);
PlayerPerform("block", 0);
PlayerPerform("pause", 10);
PlayerPerform("block", 1);
gb_lastime = curtime;
gb_trg ++;
return 1;
}
if(gb_trg==1 && curtime-gb_lastime>=12)
{
gb_scence ++;
gb_trg = 0;
return 1;
}
return 1;
}
关卡第1幕的剧情运行
ExecScence1(int player)
{
if(gb_scence != 1)
{
return 0;
}
if(gb_trg == 0)
{
AddNPC("1师父2");
gb_trg2 = 0;
gb_trg ++;
gb_lastime = curtime;
}
进入下一幕
if(gb_trg==5 && curtime-gb_lastime>=12)
{
c1 = GetChar("爱莲云雪");
Perform(c1, "use", 15);
Perform(c1, "use", 15);
gb_trg = 0;
gb_trg2 = 0;
PlayerPerform("block", 0);
SaveConfig(PlayerExps, 0, 0, 4, 0);
gb_scence ++;
FullPlayerHP(player);
}
return 1;
}
关卡第2幕的剧情运行
ExecScence2(int player)
{
if(gb_scence != 2)
{
return 0;
}
return 1;
}
关卡第。。。幕的剧情运行
//////////////////////////////////////////////////////////////
OnStart()
{
InitSNData();
AddNPC("旁白2");
}
OnUpdate()
{
int player = GetAnyChar("player");
if (player < 0)
{
return 0;
}
获取关卡当前时间,供剧情使用
curtime = GetGameTime();
统一遵守的游戏结束判断,剧情幕内可以再有自己的其他条件判断
if(QueryIsGameOver(player) == 1)
{
return 0;
}
游戏玩家属性实时更新使用
QueryIsUpdateAI(player);
运行第0幕剧情
if(ExecScence0(player) == 1)
{
return 0;
}
运行第1幕剧情
if(ExecScence1(player) == 1)
{
return 0;
}
运行第2幕剧情
if(ExecScence2(player) == 1)
{
return 0;
}
运行第。。。幕剧情
由于ExecScenceX内部会判断当前是第x幕,所以每幕剧情不会混联,此时每幕只需关心本幕剧情设计
我们增加剧情只需要添加更多的ExecScence3, ExecScence4, ExecScence5, 。。。 即可
return 0;
}
祝大家愉快,明明白白我的深意。

UID 12792





