Ignore:
Timestamp:
01/08/11 01:41:53 (9 years ago)
Author:
technomage
Message:

Patch by Technomage

  • Added support for dynamic/conditional dialogue roots;
  • Updated the Dialogue class to hold RootDialogueSections?, which are

DialogueSections? with a conditional statement used to select them as
the root section of dialogue;

as a "default_root_section" attribute, which is used as the default
root of the dialogue;

  • Moved the getRootSection method from the Dialogue class to the

DialogueParser? class as getRootDialogueSection and updated it to
evaluate the RootDialogueSection? conditionals;

syntax;

  • Updated the YAML dialogue files with the new syntax;
  • Updated the test_dialogueprocessor.py unittests;
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/game/scripts/dialogueparsers.py

    r690 r698  
    4444 
    4545from scripts import COPYRIGHT_HEADER 
    46 from scripts.dialogue import Dialogue, DialogueSection, DialogueResponse 
     46from scripts.dialogue import (Dialogue, DialogueSection, DialogueResponse, 
     47    RootDialogueSection) 
    4748from scripts.dialogueactions import DialogueAction 
    4849 
     
    191192        dialogue_dict['NPC_NAME'] = dialogue.npc_name 
    192193        dialogue_dict['AVATAR_PATH'] = dialogue.avatar_path 
    193         dialogue_dict['START_SECTION'] = dialogue.start_section_id 
     194        dialogue_dict['DEFAULT_ROOT_SECTION'] = \ 
     195            self._representDialogueSection(dumper, 
     196                                           dialogue.default_root_section) 
    194197        # NOTE Technomage 2010-11-16: Dialogue stores its sections in an 
    195198        #     OrderedDict, so a round-trip load, dump, and load will preserve 
    196199        #     the order of DialogueSections. 
    197         sections_list_node = dumper.represent_list([]) 
    198         sections_list = sections_list_node.value 
    199         for section in dialogue.sections.values(): 
    200             section_node = self._representDialogueSection(dumper, section) 
    201             sections_list.append(section_node) 
    202         dialogue_dict['SECTIONS'] = sections_list_node 
     200        if (len(dialogue.root_sections) > 0): 
     201            root_sections_list_node = dumper.represent_list([]) 
     202            root_sections_list = root_sections_list_node.value 
     203            for root_section in dialogue.root_sections: 
     204                root_section_node = \ 
     205                    self._representRootDialogueSection(dumper, root_section) 
     206                root_sections_list.append(root_section_node) 
     207            dialogue_dict['ROOT_SECTIONS'] = root_sections_list_node 
     208        if (len(dialogue.setions) > 0): 
     209            sections_list_node = dumper.represent_list([]) 
     210            sections_list = sections_list_node.value 
     211            for section in dialogue.sections.values(): 
     212                section_node = self._representDialogueSection(dumper, section) 
     213                sections_list.append(section_node) 
     214            dialogue_dict['SECTIONS'] = sections_list_node 
    203215         
    204216        for key, value in dialogue_dict.items(): 
     
    213225            dialogue_node.value.append((key_node, value_node)) 
    214226        return dialogue_node 
     227     
     228    def _representRootDialogueSection(self, dumper, root_section): 
     229        root_section_node = dumper.represent_dict({}) 
     230        root_section_dict = OrderedDict() 
     231        root_section_dict['ID'] = root_section.id 
     232        root_section_dict['CONDITION'] = dumper.represent_scalar( 
     233            'tag:yaml.org,2002:str', 
     234            root_section.condition, 
     235            style='"' 
     236        ) 
     237        for key, value in root_section_dict.items(): 
     238            if (isinstance(key, yaml.Node)): 
     239                key_node = key 
     240            else: 
     241                key_node = dumper.represent_data(key) 
     242            if (isinstance(value, yaml.Node)): 
     243                value_node = value 
     244            else: 
     245                value_node = dumper.represent_data(value) 
     246            root_section_node.value.append((key_node, value_node)) 
     247        return root_section_node 
    215248     
    216249    def _representDialogueSection(self, dumper, dialogue_section): 
     
    313346        npc_name = None 
    314347        avatar_path = None 
    315         start_section_id = None 
     348        default_root_section = None 
     349        root_sections = [] 
    316350        sections = [] 
    317351         
     
    323357                elif (key == u'AVATAR_PATH'): 
    324358                    avatar_path = loader.construct_object(value_node) 
    325                 elif (key == u'START_SECTION'): 
    326                     start_section_id = loader.construct_object(value_node) 
     359                elif (key == u'DEFAULT_ROOT_SECTION'): 
     360                    default_root_section = \ 
     361                        self._constructDialogueSection(loader, value_node) 
     362                elif (key == u'ROOT_SECTIONS'): 
     363                    for root_section_node in value_node.value: 
     364                        root_section = self._constructRootDialogueSection( 
     365                                loader, 
     366                                root_section_node 
     367                        ) 
     368                        root_sections.append( 
     369                            root_section 
     370                        ) 
    327371                elif (key == u'SECTIONS'): 
    328372                    for section_node in value_node.value: 
     
    336380         
    337381        dialogue = Dialogue(npc_name=npc_name, avatar_path=avatar_path, 
    338                             start_section_id=start_section_id, 
     382                            default_root_section=default_root_section, 
     383                            root_sections=root_sections, 
    339384                            sections=sections) 
    340385        return dialogue 
    341386     
     387    def _constructRootDialogueSection(self, loader, root_section_node): 
     388        id = None 
     389        text = None 
     390        condition = None 
     391        responses = [] 
     392        actions = [] 
     393        root_section = None 
     394         
     395        try: 
     396            for key_node, value_node in root_section_node.value: 
     397                key = key_node.value 
     398                if (key == u'ID'): 
     399                    id = loader.construct_object(value_node) 
     400                elif (key == u'SAY'): 
     401                    text = loader.construct_object(value_node) 
     402                elif (key == u'CONDITION'): 
     403                    condition = loader.construct_object(value_node) 
     404                elif (key == u'RESPONSES'): 
     405                    for response_node in value_node.value: 
     406                        dialogue_response = self._constructDialogueResponse( 
     407                            loader, 
     408                            response_node 
     409                        ) 
     410                        responses.append(dialogue_response) 
     411                elif (key == u'ACTIONS'): 
     412                    for action_node in value_node.value: 
     413                        action = self._constructDialogueAction(loader, 
     414                                                             action_node) 
     415                        actions.append(action) 
     416        except (AttributeError, TypeError, ValueError) as e: 
     417            raise DialogueFormatError(e) 
     418        else: 
     419            root_section = DialogueSection(id=id, text=text, 
     420                                           condition=condition, 
     421                                           responses=responses, 
     422                                           actions=actions) 
     423         
     424        return root_section 
     425     
    342426    def _constructDialogueSection(self, loader, section_node): 
    343         id = None 
     427        id_ = None 
    344428        text = None 
    345429        responses = [] 
     
    351435                key = key_node.value 
    352436                if (key == u'ID'): 
    353                     id = loader.construct_object(value_node) 
     437                    id_ = loader.construct_object(value_node) 
    354438                elif (key == u'SAY'): 
    355439                    text = loader.construct_object(value_node) 
     
    369453            raise DialogueFormatError(e) 
    370454        else: 
    371             dialogue_section = DialogueSection(id=id, text=text, 
     455            dialogue_section = DialogueSection(id_=id_, text=text, 
    372456                                               responses=responses, 
    373457                                               actions=actions) 
Note: See TracChangeset for help on using the changeset viewer.