Как можно реализовать игровой 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.
Кроме того, есть ли у кого-нибудь лучшие решения?
Спасибо.