Karla 
ArchFox

注册日期: Nov 2001
来 自: 灰色荒野
发贴数量: 580 |
如何在游戏中创造NPC?(四)【作者:Ctrl_Z】
让你的NPC稍微活动一下!(For BG I)
假设我们已经创建了一个新的NPC,可是让他/她呆呆地站在那里发楞总不是一件如意的事情。和新创建的NPC产生一些互动会有趣很多,不是吗?
这次,我会让我创建的NPC——我们就叫她Fly吧——给我一个小小的任务。
当然如果你还不会在游戏中创建NPC的话,可以参照以前的“如何在游戏中创建NPC(一)、(二)、(三)”
在我的override目录下关于新创建的NPC的文件有:
Fly.cre,Fly.dlg,FOver.bcs,FGene.bcs,FRace.bcs
Fly出现在Candlekeep Inn的底楼最东面的房间里。
现在打开IDU(Infinity Dialog Utility),打开override目录下的Fly.dlg文件。
我想在打开的窗口中应该只有一个‘HELLO!’吧,而且边上的‘conditon’中也写着‘NumTimesTalkedTo(0)’
我们已经不需要它了,删除这句话。
现在对话框里是一片空白。
我们这次要做的主要任务就是:
“在Candlekeep Inn里,我遇到了一位名字叫Fly的精灵女魔法师(AR2616,[734,293]),她的手被一只狼咬伤了。所以希望我能为她找到一瓶医疗药水(healing potion,code otn08),她说她会在Candlekeep Inn的二楼等我(AR2617,[375.202])。我找到了药水,交给了她,她很高兴能够认识我。在她离开的时候,她告诉我,如果以后有机会能够去博德之门的话,她会很乐意为我做向导的。然后,她给了我一瓶药水(code otn05),就走了……”
很有趣的开始,是吗?
那就让我们开始吧。
我们一共需要三段对话
(I) 在IDU的空白处点击鼠标右键,选择“add top-level text”
Text:“你好,令人敬畏的战士。我叫Fly,来自博德之门,今天刚到这里。你能帮我一个忙吗,<CHARNAME>? 呵呵,别那样惊奇地看着我,我知道你的名字是因为这里的人都这么叫你。”
Condition: Global(“TalkToFly”,“GLOBAL”,0)
保存。
****************************
1.<CHARNAME>在文本中出现,程序会自动引用你主角的名字。
2.Global(“TalkToFly”,“GLOBAL”,0)是开始这段对话(而不是其他对话)的条件,在结束这段对话的时候,我们就要改变这个条件,不要让这段对话再次出现。
3.“TalkToFly”在这里是一个全程变量,每个变量在一开始创建的时候都是设置成为0,所以不必担心这个Condition是否会成立。
4.是不是很奇怪为什么这里不用NumTimesTalkedTo(0)来作为条件?后面我们会提到的,别急。
****************************
鼠标右键点击已经创建好的第一句话,选择“add dialog option”
Text:“当然可以,女士。不知你需要什么样的帮助?”
Condition:[none]
Action:[none]
Journal Text:[none]
保存
****************************
1.以上就是你的回答,在游戏中也只有这样一个选择,你可以加入一些新的对话,不过那应该是在你熟练掌握之后。而现在,我们还是简单一点吧。
2.Condition(可以参照TRIGGER.IDS)为空,因为这个回答不需要什么条件。不过也可以有,比如根据你的声望值:ReputationGT(Player1,20)来决定是不是有这个对话选项。
3.Action(可以参照ACTION.IDS)为空,不过之后的对话中就会有了。
4.Journal Text:这一项是随便你的,决定了是不是要写入日志,写些什么。
****************************
在第二句话上点击鼠标右键,选择“add dialog text”
Text:“哦,你就像他们说的一样,是个热心肠的男子汉。你要知道,来这儿的路上,我遇到了一只恶狼,虽然我侥幸逃过一劫,但是我的手还是被它咬伤了。如果你愿意的话,可不可以帮我弄一瓶医疗药水,我想那会对治疗我的伤口很有效的。如果你找到的话,可以上二楼,我在那里等你。”
保存
****************************
这里没有Condition很正常
****************************
在第三句话的基础上,选择“add dialog option”
Text:“放心,女士。我想我能够帮助你,我会尽快把你需要的带来的。”
Conditon:[none]
Action:SetGlobal(“TalkToFly”,“GLOBAL”,1)
EscapeArea()
保存
****************************
1.现在我们看到“TalkToFly”这个变量已经得到了改变,也就保证了再次和Fly对话的时候就不会出现第一次的那句话了,否则每次对话
Global(“TalkToFly”,“GLOBAL”,0)总是会成立,那么总是第一句话,情节就无法发展了。
2.EscapeArea()是让Fly离开这张地图,但是全程变量“TalkToFly”却不会因此消失。
****************************
第一段的对话也就到这里结束了。
在开始写第二段对话之前,我们还有一些准备工作要做。
那就是要让我们的精灵女魔法师Fly出现在Candlekeep Inn的二楼的那个房间里(AR2617,[375.202]),然而这不是对话所能办到的。能够做到这一点的是:环境AI。就像人物AI一样,环境AI决定了当前环境在什么条件下会发生什么事情。我们不会希望在和Fly交谈之后,上了二楼找不到她;当然也不希望在没有和Fly交谈之前,就在二楼找到她了吧。这些都是由环境AI决定的。
打开ISE(Infinity Script Editor)
输入文本:
IF
Global(“TalkToFly”,“GLOBAL”,1)
!Exists(“Fly”)/*如果Fly没有出现*/
!Dead(“Fly”) /*并且Fly也没有死*/
THEN
RESPONSE #100
CreateCreature(“Fly”,[375.202],0)
END
保存为AR2617.BAF,然后Compile to:AR2617.BCS,复制到override目录下。
***************************
1.!Exists(“Fly”),!Dead(“Fly”) 这两个条件很重要,前一个防止了不必要的死循环,后一个避免了bug的出现。
2.注意CreateCreature函数的格式,注意各种标点符号的用法,最后的一个参数0表示所创造的生物脸的朝向。
***************************
这样,当你拿着药水到二楼的时候,就可以找到她了。
现在我们又要继续我们的对话制作了。
不过现在出现了两中情况,第一:你没有找到药水。第二:你找到了。
我们先制作第一种情况的对话:
(II)在IDU的空白处点击鼠标右键,选择“add top-level text”
Text: “你找到药水了吗?我真的非常需要它。不过如果那实在很困难的话,就算了。”
Condition:Global(“TalkToFly”,“GLOBAL”,1)
!PartyHasItem(“POTN08”)/*如果队伍中没有人有医疗药水*/
保存
****************************
1.你看到这段对话之后,不会有任何选项。不过还是会在这句话先面出现一个
Option:<No Text>的标志,这是为了如果需要设置一定的Action或者Journal而产生的。不太理解的话也没有关系。
2.另外很重要的一点,就是上面所说的为什么在第一次对话的时候没有用NumTimesTalkedTo(0)的原因,似乎在CreateCreature之后NumTimesTalkedTo(0)又成立了,所以会出现很大的麻烦,就是会重复第一次的对话,而且是死循环。于是就用
Global(“TalkToFly”,“GLOBAL”,0)来替代了。
****************************
然后就是第二中情况的对话:
(III)在IDU的空白处点击鼠标右键,选择“add top-level text”
Text:“哦,是的,这就是我要找的药水。我真的非常感谢你,<CHARNAME>。”
Condition:Global(“TalkToFly”,“GLOBAL”,1)
PartyHasItem(“POTN08”)/*如果队伍中有人持有医疗药水*/
保存
*****************************
不会有任何问题吧?
*****************************
在这句话先面添加选项:
Text:“这是我的荣幸,Fly。”
Condition:[none]
Action:TakePartyItem(“POTN08”) /*Party has lost an item*/
保存
*****************************
很简单,是吗?
*****************************
继续向下推进:
Text:“我现在感觉好多了,<CHARNAME>。我这里有一瓶药水,我想你会需要的。我要走了。如果将来你有机会去博德之门的话,一定要来找我。我可以带你好好游玩一次。现在,我要走了。再见~”
保存
*****************************
……
*****************************
最后一次推进:
Text:“再见!”
Conditon:[none]
Action:GiveItemCreate(“POTN05”,LastTalkedToBy)
AddexperienceParty(100)
SetGlobal(“TalkToFly”,“GLOBAL”,2)
EscapeArea()
Journal Text:[]
保存
******************************
1.GiveItemCreate表示创造一件物品给目标,和GiveItem的唯一区别就是,前者无须拥有物品,而后者一定要有物品。
2.SetGlobal(“TalkToFlyer”,“GLOBAL”,2)很重要,是针对环境AI而设置的,因为后面跟了
EscapeArea(),所以就使环境AI中的!Exists(“Fly”)成立,然后!Dead(“Fly”)也成立了,如果没有把“TalkToFly”变成‘2’的话,三个条件同时成立,那么bug自然就出现了。
******************************
最后的工作就是test了,开始一个新游戏,去看看吧。~~
另外,Fly给你的药水是Potion of Fire Giant Strength,可以把力量提升到22,如果你是战士的话,那么Fly所在那个房间里的箱子,你就可以轻松打开,里面有一块价值1000的宝石……让我们感谢Fly吧。
PS:因为本人水平有限,上文可能会有疏漏,如果有谁发现的话,请及时跟帖纠正。
向版主报告此贴 | IP地址: 已记录
|