Внедрение сценариев NPC в чате без сохранения состояния с использованием DLR - PullRequest
1 голос
/ 15 ноября 2010

Как можно реализовать игровой NPC-чат без состояния, используя DLR - то есть 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 () и другие методы ничего не возвращать, а вместо этого просто отправить пакет диалога клиенту и каким-то образом приостановить / заблокировать / приостановить выполнение сценария.,Затем, когда ввод получен, он помещается в переменную с постоянным именем «input» или около того в ScriptScope.

Единственная проблема в этом случае - как блокировать скрипт, не имея выделенногопоток на сценарий?

Я знаю, что это возможно в C ++ с Lua, например, GetYesNo просто отправляет сценарий и вызывает lua_yield.Когда ввод получен, вызывается один из методов lua_push (например, lua_pushinteger), а затем вызывается lua_resume.

Кроме того, есть ли у кого-нибудь лучшие решения?

Спасибо.

1 Ответ

1 голос
/ 15 ноября 2010

Если IronPython имеет поддержку fpr PEP342 (сопрограммы через расширенные генераторы), вы можете использовать их для своего сценария: http://docs.python.org/whatsnew/2.5.html#pep-342 (например, вывести на npc.GetYesNo() и отправить значение обратно в генератор и продолжить оттуда).

...