Beispiel #1
0
def query_dialogue_sentences(dialogue_key):
    """
    Query a dialogue's sentences.

    Args:
        dialogue_key: (string) dialogue's key
    """
    fields = query_fields(DIALOGUE_SENTENCES.model_name)
    records = DIALOGUE_SENTENCES.filter(dialogue_key)
    rows = []
    for record in records:
        line = [str(record.serializable_value(field["name"])) for field in fields]
        rows.append(line)

    table = {
        "fields": fields,
        "records": rows,
    }
    return table
Beispiel #2
0
def query_dialogue_sentences(dialogue_key):
    """
    Query a dialogue's sentences.

    Args:
        dialogue_key: (string) dialogue's key
    """
    fields = query_fields(DIALOGUE_SENTENCES.model_name)
    records = DIALOGUE_SENTENCES.filter(dialogue_key)
    rows = []
    for record in records:
        line = [str(record.serializable_value(field["name"])) for field in fields]
        rows.append(line)

    table = {
        "fields": fields,
        "records": rows,
    }
    return table
    def load_cache(self, dialogue):
        """
        To reduce database accesses, add a cache.
        """
        if not dialogue:
            return

        if dialogue in self.dialogue_storage:
            # already cached
            return

        # Add cache of the whole dialogue.
        self.dialogue_storage[dialogue] = {}

        # Get db model
        try:
            dialogue_record = DIALOGUES.get(dialogue)
        except Exception as e:
            return

        sentences = DIALOGUE_SENTENCES.filter(dialogue)
        if not sentences:
            return

        nexts = DIALOGUE_RELATIONS.filter(dialogue)

        dependencies = DIALOGUE_QUESTION.filter(dialogue)

        # Add db fields to data object.
        data = {}

        data["condition"] = dialogue_record.condition

        data["dependencies"] = []
        for dependency in dependencies:
            data["dependencies"].append({
                "quest": dependency.dependency,
                "type": dependency.type
            })

        data["sentences"] = []
        for sentence in sentences:
            speaker_model = self.speaker_escape.sub(self.escape_fun,
                                                    sentence.speaker)

            # get events and quests
            event_trigger = EventTrigger(None, sentence.key)
            events = event_trigger.get_events()
            provide_quest = []
            finish_quest = []
            if defines.EVENT_TRIGGER_SENTENCE in events:
                for event_info in events[defines.EVENT_TRIGGER_SENTENCE]:
                    if event_info["action"] == "ACTION_ACCEPT_QUEST":
                        action = EVENT_ACTION_SET.get(event_info["action"])
                        provide_quest.extend(
                            action.get_quests(event_info["key"]))
                    elif event_info["action"] == "ACTION_TURN_IN_QUEST":
                        action = EVENT_ACTION_SET.get(event_info["action"])
                        finish_quest.extend(
                            action.get_quests(event_info["key"]))

            data["sentences"].append({
                "key": sentence.key,
                "dialogue": dialogue,
                "ordinal": sentence.ordinal,
                "speaker_model": speaker_model,
                "icon": sentence.icon,
                "content": sentence.content,
                "event": event_trigger,
                "provide_quest": provide_quest,
                "finish_quest": finish_quest,
                "can_close": self.can_close_dialogue
            })

        # sort sentences by ordinal
        data["sentences"].sort(key=lambda x: x["ordinal"])
        count = 0
        for sentence in data["sentences"]:
            sentence["sentence"] = count
            sentence["is_last"] = False
            count += 1

        data["sentences"][-1]["is_last"] = True

        data["nexts"] = [next_one.next_dlg for next_one in nexts]

        # Add to cache.
        self.dialogue_storage[dialogue] = data
Beispiel #4
0
class DialogueHandler(object):
    """
    The DialogueHandler maintains a pool of dialogues.
    """
    speaker_escape = re.compile(r'%[%|p|n]')

    @staticmethod
    def escape_fun(word):
        """
        Change escapes to target words.
        """
        escape_word = word.group()
        char = escape_word[1]
        if char == "%":
            return char
        else:
            return "%(" + char + ")s"

    def __init__(self):
        """
        Initialize the handler.
        """
        self.can_close_dialogue = GAME_SETTINGS.get("can_close_dialogue")
        self.single_sentence_mode = GAME_SETTINGS.get(
            "single_dialogue_sentence")
        self.dialogue_storage = {}

    def load_cache(self, dialogue):
        """
        To reduce database accesses, add a cache.
        """
        if not dialogue:
            return

        if dialogue in self.dialogue_storage:
            # already cached
            return

        # Add cache of the whole dialogue.
        self.dialogue_storage[dialogue] = {}

        # Get db model
        try:
            dialogue_record = DIALOGUES.get(dialogue)
        except Exception, e:
            return

        sentences = DIALOGUE_SENTENCES.filter(dialogue)

        nexts = DIALOGUE_RELATIONS.filter(dialogue)

        dependencies = DIALOGUE_QUESTION.filter(dialogue)

        # Add db fields to data object.
        data = {}

        data["condition"] = dialogue_record.condition

        data["dependencies"] = []
        for dependency in dependencies:
            data["dependencies"].append({
                "quest": dependency.dependency,
                "type": dependency.type
            })

        data["sentences"] = []
        for sentence in sentences:
            speaker_model = self.speaker_escape.sub(self.escape_fun,
                                                    sentence.speaker)

            data["sentences"].append({
                "dialogue": dialogue,
                "ordinal": sentence.ordinal,
                "speaker_model": speaker_model,
                "icon": sentence.icon,
                "content": sentence.content,
                "action": sentence.action,
                "provide_quest": sentence.provide_quest,
                "complete_quest": sentence.complete_quest,
                "can_close": self.can_close_dialogue
            })

        # sort sentences by ordinal
        data["sentences"].sort(key=lambda x: x["ordinal"])
        count = 0
        for sentence in data["sentences"]:
            sentence["sentence"] = count
            sentence["is_last"] = False
            count += 1
        data["sentences"][-1]["is_last"] = True

        data["nexts"] = [next_one.next_dlg for next_one in nexts]

        # Add to cache.
        self.dialogue_storage[dialogue] = data