游戏简单任务脚本示例lua

  • 格式:doc
  • 大小:112.50 KB
  • 文档页数:15

游戏任务策划案一任务简要说明:老道炼药,需要一个天使之心,在天使加百列身上有半颗,在路西法身上有半颗。

老道交给你一个玉符,告诉你在法坛上使用可以帮你打开通往两处的通道。

并告诉你两处的坐标A、B。

(不在法坛上使用玉符无效)A坐标通往加百列,B通道通往路西法。

你站在法坛上,使用玉符进入光明前殿(或者黑暗大殿,进入先后次序不论)。

进入光明前殿遇到加百列,加百列异常高傲,称你为异教徒,你回敬他是长着鸡翅膀的不男不女的鸟人,对骂之后开始战斗。

加百列战斗策略:自身20%的几率使用光明护盾,持续5秒,每次光明护盾消失后都有20%的几率再次使用。

当自身血量低于最大血量有10%的几率使用治愈术。

当自身血量低于最大血量10%有10%的几率使用复活术,血量回满,复活术最多可使用三次。

当自身血量低于最大血量1%,且三次复活术不满则100%使用复活术。

当对方血量是当前自身血量的2倍,有10%的几率使用大预言术,大预言术50%几率为时间凝固,对方不可操作,时间5秒,50%的几率为时间逆流,对方所有属性减半,时间5秒加百列死亡后100%获得半颗光明天使之心,获得天使之心后,你自动返回法坛前,法坛前坐标为C。

进入黑暗神殿,路西法只说了声战斗吧,即开始战斗。

路西法战斗策略:当自身血量分别为最大血量的90%,70%, 50%, 30%, 10%时开始召唤生物,第一批为三个石像鬼,第二批为三个黑暗巫师,第三批为四个大恶魔,第四批为四个骨龙,第五批为五个深渊魔王。

当每死一只召唤生物,有10%的几率分别使用虚弱,中毒,恐惧,失明,四个魔法中的一个。

若召唤生物没有全部死亡,而路西法血量少于5%的时候处于无敌状态,物理和魔法攻击免疫。

杀死路西法100%获得半颗黑暗天使之心,获得后自动返回法坛前台。

你将两个半颗天使之心带到老道处,老道要你用狗血去融合了这两个半颗天使之心,使之变成一颗完整的天使之心。

你去找了半盆黑狗血,将两颗天使之心扔进去,一道光闪过,盆里出现课天使之心,你拿完整的天使之心又去交给老道,老道很满意,给了你一枚人参果,你临走好奇问老道要天使之心炼什么药,老道告诉你,没啥用,就是看鸟人脸上道貌岸然,一肚子男盗女娼的样子不爽,正好最近有点闲,拿天使之心不过是想炼一份给自己养的牛除牛虱的药而已。

你不仅为老道的恶搞而汗颜。

特别说明:1、该任务中任何死亡都做正常死亡处理,死亡后需要重新从法坛进入目的地2、当每拿到半颗天使之心,则该地图不可再次进入,输入坐标无效3、当两个半颗天使之心都已获得,则玉符自动消失4、两个场景地图不保存信息,即玩家在两个场景地图中的任一个下线后,再次上线则回到法坛前5、该任务不可重复,每个用户只能完成一次6、该任务接受后需要在任务日志中记录,用户可以随时查询,任务完成后清除任务日志7、用户获得的奖励需要做log,方便查询要求:1、写出任务基本流程,并附流程图2、按照任务编写一份伪脚本其他说明:1、所有所需的关键词、变量、以及函数由答题者自行定义,并对所定义的词、变量、函数等作出解释说明2、编写格式可以按自己的方式编写,但需作出必要的说明3、在战斗脚本部分编写,可任一选择一个战斗进行编写,也可以全部编写“老道炼药”任务策划案(初稿)一任务基本流程领取任务:1.玩家去道观(21,104)找老道对话,获得玉符,任务开始。

做任务: 2.玩家去道观所在的法坛。

3.玩家在法坛使用玉符,打开通道,输入A坐标,来到光明大殿杀死加百列,获得半颗天使之心。

4.玩家在法坛使用玉符,打开通道,输入B坐标,来到黑暗大殿杀死路西法,获得半颗天使之心。

5.玩家带着2个半颗天使之心找老道对话。

6.玩家奉命炼制天使之心,去找材料黑狗血。

还任务:7.玩家带着天使之心找老道对话,获得人参果,任务完成。

任务流程图:二加百列战斗脚本流程图AI决策流程图:三脚本相关1.函数定义:GetMissionFlag (PlayerID,MissionID) ---读取玩家某任务的任务完成标识GetMissionSpace ( ) ---读取玩家当前已接任务总数,---未达上限返回TURE,否则返回FALSE GetMissionName (MissionFlag) ---读取指定任务的任务变量名GetMissionValue(MissionFlag) ---读取指定任务的任务变量名对应的变量值TestMissionFlag (Flag) ---检测玩家任务完成标识表的状态,有变化则返回---对应任务的任务编号,否则返回FALSE GetMissionText (MissionID,MissionFlag) ---根据任务编号和任务完成标识读取任务日志说明GetPlayerLevel (PlayerID) ---读取玩家当前等级GetPlayerName (PlayerID) ---读取玩家游戏ID的呢称GetItem (ItemID) ---玩家获得指定物品LoseItem (ItemID) ---玩家失去指定物品GetMissionGain (MissionID) ---玩家获得某任务的任务奖励LookforItem (ItemID,ItemNumber) ---追踪玩家身上携带的某物品,返回TURE或FALSE PlayAnim (NPC/Player,AnimID) ---播放指定的精灵动画NPCtalk ( ) ---显示NPC当前对白Playertalk ( ) ---显示玩家当前对白ERROR( ) ---提示错误的输入信息GetPlayerHP (PlayerID) ---读取玩家当前HP值GetNPCHP (NPCID) ---读取NPC当前HP值GetPlayerDroidX ( ) ---读取玩家当前X坐标GetPlayerDroidY ( ) ---读取玩家当前Y坐标GetPlayerDroidDir ( ) ---读取玩家当前面向GetPlayerToNPCDist ( ) ---读取玩家距NPC的当前距离GetNPCDroidX ( ) ---读取NPC当前X坐标GetNPCDroidY ( ) ---读取NPC当前Y坐标GetNPCDroidDir ( ) ---读取NPC当前面向MoveNPCDroid(Dir,Dist,,Speed) ---根据给定的面向,距离和速度移动NPC GetStateTime (FreqtTime) ---计时器根据计数循环返回FALSE或1UseSkill (SkillID) ---使用指定的技能OverSkill (SkillID) ---取消指定的技能ViewPepoleInRegional (radius) ---查看区域radius内目标,返回TURE或者FALSE GetSystemTime ( ) ---读取当前系统时间,单位秒GetRanInRange (Min,Max ) ---获得[Min+1,Max-Min+1]范围内的任意整数值ChangeScence(to,from)---由from场景切换到to场景GetScenceDriod (DroidX, DroidY) ---读取玩家输入的X,Y坐标2. 附相关NPC对白配置文件:NPCdb.text(对白,文件后缀名不知道是什么类型的)-------------------------------------------------NPC对白编号--------------------------------------------------- //Dn660=“你输入的是错误的坐标,请重新输入。

”;//Db1000 =“XXX,你能力不够,还是去外面磨炼吧。

”Db1001 =“XXX,贫道有件事想请你帮忙。

”Db1002 =“道长,啥事?”Db1003 =“是这样,我炼药需要一个叫做天使之心的材料,这个材料在加百列身上有半颗,在路西法身上有半颗,你能帮我去取来吗?”Db1004 =“没问题。

”Db1005 =“XXX,快去做你的事情吧。

”Db1006 =“XXX,事情办的怎样了?”Db1007 =“抱歉,道长,我决定放弃了。

”Db1008 =“办好了。

”Db1009 = “太好了,XXX你真是少年英豪,贫道一直很看好你,恩,这个人参果送给你,希望你不要辜负贫道一番心意。

”Db1010 =“道长你太客气了。

哦,对了,顺便问下,道长你准备炼什么灵丹妙药呀?”Db1011 =“没啥用,就是看那鸟人表面道貌岸然,其实一肚子男盗女娼的样子不爽,我正好最近有点闲,拿天使之心不过是想炼一份给自己养的牛除牛虱的药而已。

”Db1012 =“XXX,贫道要的是完整的天使之心,你用狗血去融合了这两个半颗天使之心,使之变成一颗完整的天使之心,然后再找我吧。

”Db1013 =“XXX,不要和贫道开玩笑了,快点去完成吧。

”Db1014 =“XXX,很遗憾你放弃了。

”Db1015 =“XXX,很高兴见到你,上次多谢你帮忙。

”Db1016 =“嘎嘎,哪来的异教徒,还不向仁慈的主忏悔?”Db1017 =“我呸!你丫的狂什么,不过是一个长着鸡翅膀的不男不女的鸟人。

”Db1018 =“气死我也,主会原谅我的,受死吧!”Db1019 =“嘎嘎,看你往哪跑!”Db1020 =“嘎嘎…”Db1021 =“别得意了,战斗才刚刚开始。

”Db1022 =“嘎嘎,很失望吧。

”Db1023 =“该死,不可能的事情,我居然被打败了!”Db1024 =“可恶!”Db1025 =“难以置信,我会输给一个卑贱的人类么?”Db1026 =“别妄想反抗了,快来乖乖受死吧!”Db1027 =“还在挣扎,也好,我就来导演一场猫戏老鼠的精彩演出,嘎嘎!”Db1028 =“觉悟吧,你死定了。

”//;;//3.任务脚本:Mission.lua--------------------------------------------------导入API----------------------------------------------------- int HAPI_GetMissionFlag (lua_state *pluastate)int HAPI_GetMissionName (lua_state *pluastate)int HAPI_GetMissionValue(lua_state *pluastate)int HAPI_TestMissionFlag (lua_state *pluastate)int HAPI_GetMissionText (lua_state *pluastate)-----------------------------------------------脚本主体-------------------------------------------------------- Func_Mission ( )//;;//If (TestMissionFlag ( )) thenIf (TestMissionFlag ( ) = = 01) then ---记录新任务信息Flag= TestMissionFlag ( );Mission={ };Mission[Flag]={GetMissionName (Flag)= GetMissionValue (Flag)};ElseMission={ };Mission[TestMissionFlag ( )]=nil; ---删除指定任务信息EndElse if (LookforMissionText ( )) then ---查询指定任务日志Print (GetMissionText(MissionID, MissionFlag));Else if (LookforMissionTable ( ) ) then ---查询玩家当前任务列表信息Print (Mission);EndEnd4.老道(npc47)的脚本:npc47.lua--------------------------------------------------导入API----------------------------------------------------- int HAPI_GetMissionFlag (lua_state *pluastate)int HAPI_GetMissionSpace (lua_state *pluastate)int HAPI_GetPlayerLevel (lua_state *pluastate)int HAPI_GetPlayerName (lua_state *pluastate)int HAPI_GetItem (lua_state *pluastate)int HAPI_GetMissionGain (lua_state *pluastate)int HAPI_LookforItem (lua_state *pluastate)int HAPI_PlayAnim (lua_state *pluastate)int HAPI_NPCtalk (lua_state *pluastate )int HAPI_Playertalk (lua_state *pluastate)-------------------------------------------------常量声明-------------------------------------------------------- Level=50------------------------------------------------对话脚本-------------------------------------------------------- Func_npc47 ( )# define XXX GetPlayerName ( PlayerID) ;If (GetPlayerLevel (PlayerID)<Level) thenNPCtalk (Db1000);EndMissionFlag= GetMissionFlag (PlayerID,Mission112) --读取玩家该任务的完成标识If (MissionFlag= =00) then ---玩家没有领取过该任务If (GetMissionSpace ( )) then ---玩家还可以领取任务NPCtalk (Db1001);Playertalk (Db1002);NPCtalk (Db1003);Playertalk (Db1004);GetItem(Item250); --获得道具玉符Else ---玩家领取任务已达上限NPCtalk(Db1005);Else if (MissionFlag= =01) thenNPCtalk (Db1006,Db1007,Db1008);If (Answer= = Db1007) thenMissionFlag=10;Else if (LookforItem (Item368,1)) then ---察看玩家身上是否携带天使之心NPCtalk (Db1009);Playertalk(Db1010);NPCtalk(Db1011)GetMissionGain (Mission112) ; --获得任务奖励(人参果)Else if ((LookforItem (Item366,1)) then---查看玩家身上是否携带2个半颗天使之心If ((LookforItem (Item367,1)) thenNPCtalk (Db1012);ElseNPCtalk (Db1013);EndEndElse if (MissionFlag= =10) thenNPCtalk (Db1014);Else if (MissionFlag= =11) thenNPCtalk (Db1015);EndEnd5.加百列(npc112)的脚本:npc112.lua--------------------------------------------------导入API----------------------------------------------------- int HAPI_NPCtalk (lua_state *pluastate )int HAPI_Playertalk (lua_state *pluastate )int HAPI_ERROR (lua_state *pluastate )int HAPI_GetPlayerHP (lua_state *pluastate)int HAPI_GetNPCHP (lua_state *pluastate)int HAPI_GetPlayerDroidX (lua_state *pluastate )int HAPI_GetPlayerDroidY (lua_state *pluastate)int HAPI_GetPlayerDroidDir (lua_state *pluastate)int HAPI_GetPlayerToNPCDist (lua_state *pluastate)int HAPI_GetNPCDroidX (lua_state *pluastate)int HAPI_GetNPCDroidY (lua_state *pluastate )int HAPI_GetNPCDroidDir (lua_state *pluastate)int HAPI_MoveNPCDroid (lua_state *pluastate)int HAPI_GetSystemTime (lua_state *pluastate )int HAPI_GetRanInRange (lua_state *pluastate)int HAPI_GetStateTime (lua_state *pluastate)int HAPI_UseSkill (lua_state *pluastate)int HAPI_ViewPlayerInRegional (lua_state *pluastate)-------------------------------------------------常量声明-------------------------------------------------------- // Direction //NORTH=0;SOUTH=2;EAST=4;WEST=6;------------------------------------------------------------------------------------------------------------------- OriginalX=12; --加百列原来的X坐标OriginalY=20; ---加百列原来的Y坐标Speed=10;---加百列的移动速度Radius=20; ---加白列可以察觉目标的区域半径HP=5000;---加百列的生命满值Rarity=0; ---指定的几率值FreqAttack=1; ---加百列的攻击频率(s)AttackDist=4; ---加百列的有效攻击距离OrdinaryAttack=1; ---普通攻击BrightShield=121; ---光明护盾BrightState =0; ---光明护盾状态CD=5; ---光明状态有效持续时间(s)Therapy=122; ---治疗术Resurrection=123; ---复活术Cout=0; ---加百列复活术已使用次数BigPrediction_1=124; ---大预言术之时间凝固BigPrediction_2=125 ---大预言术之时间倒流-----------------------------------------------定义函数------------------------------------------------------- // ---获得需要面对玩家的方向Function GetPlayerFaceDir ( )NPCDroidX= GetNPCDroidX ( );NPCDroidY= GetNPCDroidY ( );PlayerDroidX= GetNPCDroidX ( );PlayerDroidY= GetNPCDroidY ( );If (NPCDroidX < PlayerDroidX) thenReturn EAST;ElseRetuun WEST;EndIf (NPCDroidY < PlayerDroidY ) thenReturn SOUTH;ElseReturn NORTH;EndReturn NORTH; ---End// ---获得返回原处需要面对的方向Function GetMoveBackDir ( )NPCDroidX= GetNPCDroidX ( );NPCDroidY= GetNPCDroidY ( );If (NPCDroidX < OriginalX) thenReturn EAST;Else if (NPCDroidY < OriginalY ) then Return SOUTH;Else if (NPCDroidX > OriginalX) then Return WEST;Else if (NPCDroidY >OriginalY) then Return NORTH;Else return FALSE;EndEnd// ---光明护盾的AI策略Function BrightShield ( ) --- If (BrightState = = 0) thenRarity= GetRanInRange (0, 9);If (GetRanInRange (0, 4) = = 1) thenAI = BrightShield;BrightState = 1;T0 = GetSystemTime ( );NPCtalk (Db1020);Else AI = FALSE;EndElse T=GetSystemTime ( ) ;AI=FALSE;If (tT– t0 = = CD) thenBrightState=0;EndReturn AI;End// ---复活术的AI策略Function Resurrection ( )NPCHP=GetNPCHP ( NPC112);If (NPCHP<HP/100) thenIf (Cout<3) thenAI= Resurrection;If (Cout = = 0) thenNPCtalk (Db1021);Else NPCtalk(Db1022);EndElse AI=FALSE;NPCtalk (Db1023);EndElse if (NPCHP<HP/10) thenRarity=GetRanInrange (0,9);If (Cout<3) thenIf (Rarity = = 1) thenAI=Resurrection;If (Cout = = 0) thenNPCtalk (Db1021);Else NPCtalk(Db1022);EndElse AI= FALSE;If (Rarity = = 10) thenNPCtalk (Db1024);EndEndElse AI= FALSE;If (Rarity = = 2) thenNPCtalk (Db1025);EndEndElse AI= FALSE;EndReturn AI;End// ---治疗术的AI策略Function Therapy ( )NPCHP=GetNPCHP ( NPC112);Rarity=GetRanInrange (0,9);If (NPCHP<HP) thenIf (Rarity = = 1) thenAI=Therapy;NPCtalk (Db1021);Else AI= FALSE;If (Rarity = = 10) thenNPCtalk (Db1024);EndEndElse AI= FALSE;If (Rarity = = 2) thenNPCtalk (Db1026);Else if (Rarity = = 3) thenNPCtalk (Db1027);EndEndReturn AI;End// ---大预言术的AI策略Function BigPrediection ( )NPCHP=GetNPCHP ( NPC112);PlayerHP= GetPlayerHP ( );If (NPCHP<=PlayerHP/2) thenRarity=GetRanInrange (0,9);If (Rarity = =1) thenNPCtalk (Db1028);If (GetRanInrange (0,1)= = 1) thenAI= BigPrediection_1;Else AI= BigPrediection_2;EndElse AI=FALSE;NPCtalk (Db1024);EndReturn AI;End-----------------------------------------------脚本主体------------------------------------------------------- Func_npc112 ()------------------------------------------------对话脚本-------------------------------------------------------- NPCtalk (Db1016);Playertalk (Db1017);NPCtalk (Db1018);------------------------------------------------战斗脚本--------------------------------------------------------// 主循环//While (GetNPCHP (npc112)) do ---加百列未死亡时If (ViewPepoleInRegional (Radius)) then ---发现目标While (GetPlayerHP()) do ---玩家未死亡NPCtalk (Db1019);Dir= GetPlayerFaceDir ( ); ---获得需要面对玩家的方向Dist=RanInRange (3, 20); ---随机获得加百列的移动距离While (Dist) doIf (BrightShield ( )) thenDir= GetPlayerFaceDir ( );UseSkill (BrightShield);Else if (Resurrection ( )) thenDir= GetPlayerFaceDir ( );UseSkill (Resurrection);Else if (Therapy ()) thenDir= GetPlayerFaceDir ( );UseSkill (Therapy);Else if (BigPrediection ( )) thenDir= GetPlayerFaceDir ( );UseSkill (BigPrediection ( ));Else if (GetPlayerToNPCDist<= AttackDist) thenDir= GetPlayerFaceDir ( );UseSkill (OrdinaryAttack);EndMoveNPCDroid (Dir, Dist, Speed); ---移动加百列If (ViewPepoleInRegional (Radius)) thenDist=Dist-1;Else Dist=0; ---失去目标EndEndEnd ---玩家死亡或下线End ---玩家离开加百列警觉区域Dir=GetMoveBackDir;If (Dir) thenMoveNPCDroid (Dir, Dist, Speed);EndEnd ---加百列被玩家杀死GetItem (Item366); ---掉落半颗天使之心End6.路西法(npc140)的脚本:npc150.lua(略)7.场景脚本:(道观)cj21.lua;(光明大殿)cj42.lua;(黑暗大殿)cj60.lua(道观)cj21.lua:----------------------------------------导入API函数--------------------------------------------------------- Int HAPI_ChangeScence(lua_state *pluastate)////Int HAPI_GetScenceDriod (lua_state *pluastate)----------------------------------------------------脚本主体---------------------------------------------------- Func_ cj21 ( )//;;//If (GetScenceDriod (X, Y) = “20,211”) then ---输入坐标AChangeScence (cj42, cj21); ---传送到光明大殿Else if (GetScenceDriod (X, Y) =”202,11”) then ---输入坐标BChangeScence (cj60, cj21); ---传送到黑暗大殿Else return ERROR (Db660); ---如果输入错误信息,返回提示EndEnd(光明大殿)Cj42.lua:----------------------------------------导入API函数--------------------------------------------------------- Int HAPI_ChangeScence(lua_state *pluastate)int HAPI_GetPlayerHP (lua_state *pluastate)int HAPI_LookforItem (lua_state *pluastate)////----------------------------------------------------脚本主体---------------------------------------------------- Func_ cj42 ( )//;;//If (GetPlayerHP () = =0) then ---如果玩家死亡ChangeScence (cj21, cj42); ---被传送回道观里的法坛PlayerDroidX=44; ---法坛坐标C(44,148)PlayerDroidY=148;EndIf (LookforItem (Item366, 1)) then ---如果杀死加百列获得半颗天使之心ChangeScence (cj21, cj42);EndEnd(黑暗大殿)Cj60.lua:----------------------------------------导入API函数--------------------------------------------------------- Int HAPI_ChangeScence(lua_state *pluastate)int HAPI_GetPlayerHP (lua_state *pluastate)int HAPI_LookforItem (lua_state *pluastate)//;//----------------------------------------------------脚本主体---------------------------------------------------- Func_ cj60 ( )//;;//If (GetPlayerHP () = =0) then ---如果玩家死亡ChangeScence (cj21, cj60); ---被传送回道观里的法坛PlayerDroidX=44; ---法坛坐标C(44,148)PlayerDroidY=148;EndIf (LookforItem (Item367, 1)) then ---如果杀死路西法获得半颗天使之心ChangeScence (cj21, cj60);EndEnd7.物品脚本:玉符(Item250),半颗天使之心(Item366),半颗天使之心(Item367),天使之心(Item368),人参果(Item321)(玉符)Item250.lua:----------------------------------------导入API函数--------------------------------------------------------- int HAPI_LookforItem (lua_state *pluastate)int HAPI_LoseItem (lua_state *pluastate)////----------------------------------------------------脚本主体---------------------------------------------------- Func_ Item250 ( )//;;//If (LookforItem (Item366, 1)) then ---查看玩家身上是否携带有2个半颗天使之心If (LookforItem (Item367, 1))LoseItem (Item250); ---玉符消失EndEnd经验不足,存在许多语法错误和格式错误,引起阅读不便,还请各位见谅。