使用DLR实现无状态游戏NPC聊天脚本

时间:2010-11-15 09:07:57

标签: c# .net dynamic-language-runtime

如何使用DLR实现无状态游戏NPC聊天 - 即IronPython?

无国籍意味着这样的事情:

npc.AddText("Are you dead?")
playerIsDead = npc.GetYesNo()
if playerIsDead:
    npc.AddText("You can't be dead!")
    npc.SendOk()
else:
    npc.AddText("Okay.")
    npc.SendOk()
npc.End()

而不是:

def Talk(state, action, input):
    if action == -1:
        npc.End()
    elif state == 0:
        npc.AddText("Are you dead?")
        npc.GetYesNo()
    elif state == 1:
        if input:
            npc.AddText("You can't be dead!")
            npc.SendOk()
        else:
            npc.AddText("Okay.")
            npc.SendOk()
        npc.End()

看到区别?

我想到了一个解决方案:每个NPC对话使用一个线程,以及AutoResetEvents或类似的东西。不可行,因为在现实生活中,可能会有许多NPC对话(数百个,如果不是数千个)同时进行。不要几千个线程。

另一种方法是让GetYesNo()和其他方法不返回任何内容,而只是简单地将对话框发送到客户端,并以某种方式暂停/阻止/暂停脚本。然后,当收到输入时,它会被放入ScriptScope中常量命名的变量“input”中。

唯一的问题是,在这种情况下,如何阻止脚本,而不是每个脚本都有专用的线程?

我知道它在使用Lua的C ++中是可行的,例如GetYesNo只是发送脚本,并调用lua_yield。收到输入后,将调用其中一个lua_push(例如lua_pushinteger)方法,然后调用lua_resume。

另外,有没有人有更好的解决方案?

感谢。

1 个答案:

答案 0 :(得分:1)

如果IronPython支持fpr PEP342(通过增强型生成器协同处理),您可以将它们用于您的场景:http://docs.python.org/whatsnew/2.5.html#pep-342(例如npc.GetYesNo()上的产量并将值发送回生成器并从那里继续)