Skip to content

NPC с диалогами

op-hui edited this page Sep 15, 2015 · 6 revisions

###Для начала для самых маленьких

В этом гайде я покажу как запилить говорящую NPC, твою мамку, даже небо, даже аллаха.

И так. В движке муДАча находим файл evennia_server\mu2ch\typeclasses\npc.py - здесь мы пилим всех наших неписей.

Все нужные модули уже подключены но всякий случай тебе понадобиться:

from evennia.contrib import menusystem

Далее создаем нашему NPC свой класс и метод срабатывающий при создании NPC:

class T_Abu(simpleNPC:
    """
    This implements a simple Object using the talk command and using the
    conversation defined above. .
    """	
    def at_object_creation(self):
         "This is called when object is first created."

Этот класс мы будем в дальнейшем присваивать создаваемым нами объектам.

Далее строим сам диалог:

class T_Abu(simpleNPC):
    """
    This implements a simple Object using the talk command and using the
    conversation defined above. .
    """	

    def at_object_creation(self):
        "This is called when object is first created."
        # store the conversation.

	CONV = {"START": {"text": "Привет анон. Я %s. Добро пожаловать на Мудач. Снова." % self.key,
                  "links": ["i1", "i2"],
                  "linktexts": ["Ты кто?",
                                "Что делать?"],
                  "keywords": None,
                  "callback": None},
        "i1": {"text": "Я абу. Я шатаю Макабу.",
                  "links": ["START", "END"],
                  "linktexts":["Хочу еще кое что спросить.",
                               "Ясно. Пока"],
                 "keywords": None,
                 "callback": None},
        "i2": {"text": "Шатать Макабу Конечно!",
                 "links": ["START", "END"],
                 "linktexts": ["Хочу спросить?",
                               "Ясно. Пока"],
                 "keywords": None,
                 "callback": None},
        }

Поясняю за структуру. Диалог состоит из веток. В каждой ветке есть текст от npc, привязка к другим веткам и список вариантов ответа. Вариант привязывается к ветке по средствам двух массивов - Links и LinksTexts. Номер ветки в массиве Links будет соответствовать варианту ответа из массива LinksTexts. При выборе например первого варианта будет запущена ветка по первой ссылке. Надеюсь вы поняли. И так расписываем все ветки.

"START" - имя ветки. Обязательная ветка. Первая ветка, которая будет показана при начале разговора. Далее идет массив ее параметров.
"text" - Текст ветки. Ну типа что npc тебе говорит
"links" - Массив ссылок на ветки, соответственно порядку а массиве linktexts. Здесь указываешь имена веток.
"linktexts" - Варианты твоих ответов, соответственно порядку в массиве links
"keywords": - ключевые слова (это тебе не нужно)
"callback": - калбек (это тебе не нужно)
"END" - заканчивает диалог

Когда наш диалог расписан. Задаем нашему npc этот диалог и описание.

     self.db.conversation = CONV
     self.db.desc = "Это Абу. Он шатает Макабу."
     self.db.npc = True

Теперь в заходим в игру и тестим.

     @create/drop Абу:npc.T_Abu

Что бы поговорить с ним нужно использовать команду

 talk Абу
 или ск Абу (ск на русском)

###Теперь для скиловых

Теперь нужно сделать чтобы Абу шатал Макабу. Данная диалоговая система поддерживает выполнение команд при выборе варианта.

подключаем модули

    from evennia import Command, CmdSet, utils
    from evennia.contrib import menusystem
    from evennia import create_object
    from evennia import DefaultObject, CmdSet

Создаем новую команду для нашего Абу. Этой командой он будет забирать у нас макабу. Класс наследуется от класса Command. Про поле key поясню отдельно:

    class CmdMakabuShatal(Command):

	key="1"
	locks = "cmd:all()"
        #функция(метод) для работы команды self передавать обязательно.
	def func(self):
                #определяем того кто вызвал эту команду(игрок).
		caller = self.caller 
                #берем у нашего игрока поле где указано с кем он сейчас говорит(задается при вызове команды talk)
		talking_to = caller.search(caller.db.last_talk_with, location=caller.location)
                #ищем у игрока в инвенторе Макабу
		makaba = caller.search("Макаба", location=caller)
                #если нет макабы то переходим на ветку i1
		if not makaba : 
			self.menutree.goto("i1")
                #а если есть то отдаем ее ему и идем на ветку i2
		else : 
			makaba.move_to(talking_to,quiet=True)
                        #теперь он шатает макабу и возращает ее нам
                        makaba.key = "Пошатанная макаба"
                        makaba.db.desc = "Абу пошатал эту макабу"  
                        makaba.move_to(caller,quiet=True)
                        self.menutree.goto("i2")

Готово

Теперь модифицируем наши ветки диалога. Тут вступают в дело еще два параметра SelectCmds и KeyWords. При указании команд для варианта выбора работает тот же принцип что и c ссылками. Варианты где нет команд помечаются "None" Также keyWord для команды должен совпадать с полем команды key(желательно использовать цифры):

    	CONV = {"START": {"text": "Привет анон. Я %s. Добро пожаловать на Мудач. Снова. Есть макаба пошатать?" % self.key,
                  "links": ["i1", "END"],
                  "linktexts": ["Дать макабу пошатать",
                                "Уйти"],
                  "selectcmds":[CmdTruff,None],
                  "keywords": ["1","2"],
                  "callback": None},
        "i1": {"text": "Я пошатал макабу для тебя.",
                  "links": ["END"],
                  "linktexts":["Уйти."],
                 "keywords": None,
                 "callback": None},
        "i2": {"text": "У тебя нет макабы. Уходи.",
                 "links": ["END"],
                 "linktexts": ["Уйти."],
                 "keywords": None,
                 "callback": None},
        }

... PROFIT Удаляем старого Абу, так как у него храниться еще старый диалог.

@create/drop Абу:npc.T_Abu

Создаем у себя макабу

@create Макаба

И идем говорить с Абу. По окончании дилога у нас должны быть Пошатанная Макаба