Ejemplo n.º 1
0
    def export(self, compiler):
        result = ''

        faction_index = compiler.index(self._faction)
        scene_index = compiler.index(self._scene)
        scene_index |= self._scene_entry

        result += "%s %s %s %s %d %d %d %d " % (
            convert_to_identifier(self._id), replace_spaces(self._name),
            replace_spaces(self._plural), replace_spaces(str(self._image)),
            self._flags, scene_index, self._reserved, faction_index)

        result += '%d %d' % tuple(
            compiler.index(x) for x in self._upgradable_to)

        result += '\n  '

        for inventory_item in self._inventory:
            result += "%d 0 " % compiler.index(inventory_item)

        for i in range(64 - len(self._inventory)):
            result += "-1 0 "
        result += "\n "

        strength = (self._attributes & 0xff)
        agility = ((self._attributes >> 8) & 0xff)
        intelligence = ((self._attributes >> 16) & 0xff)
        charisma = ((self._attributes >> 24) & 0xff)
        starting_level = (
            self._attributes >> h_trp.level_bits) & h_trp.level_mask

        result += " %d %d %d %d %d\n" % (strength, agility, intelligence,
                                         charisma, starting_level)

        wp_word = self._proficiencies
        for wp in range(h_trp.num_weapon_proficiencies):
            wp_level = wp_word & 0x3FF
            result += " %d" % wp_level
            wp_word >>= 10
        result += "\n"

        for i in range(h_skills.num_skill_words):
            result += "%d " % ((self._skills >> (i * 32)) & 0xffffffff)
        result += "\n  "

        for fckey in (self._face_code, self._face_code2):
            word_keys = []
            for word_no in range(4):
                word_keys.append((fckey >> (64 * word_no))
                                 & 0xFFFFFFFFFFFFFFFF)
            for word_no in range(4):
                result += "%d " % word_keys[(4 - 1) - word_no]

        result += '\n\n'
        return result
Ejemplo n.º 2
0
    def export(self, compiler):
        result = ''

        faction_index = compiler.index(self._faction)
        scene_index = compiler.index(self._scene)
        scene_index |= self._scene_entry

        result += "%s %s %s %s %d %d %d %d " % (
            convert_to_identifier(self._id),
            replace_spaces(self._name),
            replace_spaces(self._plural),
            replace_spaces(str(self._image)),
            self._flags, scene_index, self._reserved, faction_index)

        result += '%d %d' % tuple(compiler.index(x) for x in self._upgradable_to)

        result += '\n  '

        for inventory_item in self._inventory:
            result += "%d 0 " % compiler.index(inventory_item)

        for i in range(64 - len(self._inventory)):
            result += "-1 0 "
        result += "\n "

        strength = (self._attributes & 0xff)
        agility = ((self._attributes >> 8) & 0xff)
        intelligence = ((self._attributes >> 16) & 0xff)
        charisma = ((self._attributes >> 24) & 0xff)
        starting_level = (self._attributes >> h_trp.level_bits) & h_trp.level_mask

        result += " %d %d %d %d %d\n" % (strength, agility, intelligence, charisma,
                                         starting_level)

        wp_word = self._proficiencies
        for wp in range(h_trp.num_weapon_proficiencies):
            wp_level = wp_word & 0x3FF
            result += " %d" % wp_level
            wp_word >>= 10
        result += "\n"

        for i in range(h_skills.num_skill_words):
            result += "%d " % ((self._skills >> (i * 32)) & 0xffffffff)
        result += "\n  "

        for fckey in (self._face_code, self._face_code2):
            word_keys = []
            for word_no in range(4):
                word_keys.append((fckey >> (64 * word_no)) & 0xFFFFFFFFFFFFFFFF)
            for word_no in range(4):
                result += "%d " % word_keys[(4 - 1) - word_no]

        result += '\n\n'
        return result
Ejemplo n.º 3
0
    def export(self, compiler):
        result = "%s %s %d %d \n" % (p_common.convert_to_identifier(
            self._id), p_common.replace_spaces(
                self._name), self._flags, self._color)

        relations = self.all_relations()[self.index]
        for relation in relations:
            result += " %f " % relations[relation]
        result += "\n"

        result += "%d " % len(self._ranks)
        for rank in self._ranks:
            result += " %s " % (p_common.replace_spaces(rank))

        return result
Ejemplo n.º 4
0
    def _get_quick_string_index(self, sentence):
        text = p_common.convert_to_identifier_with_no_lowercase(sentence)
        sentence = p_common.replace_spaces(sentence)

        i = min(20, len(text))
        while i <= len(text):
            auto_id = "qstr_" + text[0:i]
            if auto_id in self._quick_strings:
                # string already exists, don't do anything
                if self._quick_strings[auto_id] == sentence:
                    break
                else:
                    # auto_id exists but contains other sentence.
                    # increase auto_id
                    i += 1
            else:
                # auto_id is free, store sentence
                self._quick_strings[auto_id] = sentence
                break
        else:
            # `"qstr_" + text` is already an auto_id, use numbers
            number = 1
            base_auto_id = "qstr_" + text
            auto_id = base_auto_id + str(number)
            while auto_id in self._quick_strings:
                number += 1
                auto_id = base_auto_id + str(number)
            self._quick_strings[auto_id] = sentence

        return list(self._quick_strings.keys()).index(auto_id)
Ejemplo n.º 5
0
    def export(self, compiler):

        if isinstance(self._flags, int):
            flags = self._flags
        else:
            flags = self._flags.as_index(compiler)

        result = "%s %s %d %d %d %d "%(p_common.convert_to_identifier(self._id),
                                       p_common.replace_spaces(self._name),
                                       flags,
                                       compiler.index(self._menu),
                                       compiler.index(self._faction),
                                       self._personality)

        for member in self._members:
            result += "%d %d %d " % (compiler.index(member[0]),
                                     member[1], member[2])
            if len(member) == 4:
                result += "%d " % member[3]
            elif len(member) > 4:
                logging.warning('Troop in party template "%s" has more than 4 '
                                'parameters. Extra parameters ignored.' % self._id)
            else:
                result += "0 "
        for i in range(6 - len(self._members)):
            result += '-1 '

        result += '\n'
        return result
Ejemplo n.º 6
0
    def export(self, compiler):
        result = "%s %s %d %d \n" % (
            p_common.convert_to_identifier(self._id),
            p_common.replace_spaces(self._name),
            self._flags, self._color)

        relations = self.all_relations()[self.index]
        for relation in relations:
            result += " %f " % relations[relation]
        result += "\n"

        result += "%d " % len(self._ranks)
        for rank in self._ranks:
            result += " %s " % (p_common.replace_spaces(rank))

        return result
Ejemplo n.º 7
0
    def export(self, compiler):

        if isinstance(self._flags, int):
            flags = self._flags
        else:
            flags = self._flags.as_index(compiler)

        result = "%s %s %d %d %d %d " % (p_common.convert_to_identifier(
            self._id), p_common.replace_spaces(
                self._name), flags, compiler.index(
                    self._menu), compiler.index(
                        self._faction), self._personality)

        for member in self._members:
            result += "%d %d %d " % (compiler.index(
                member[0]), member[1], member[2])
            if len(member) == 4:
                result += "%d " % member[3]
            elif len(member) > 4:
                logging.warning('Troop in party template "%s" has more than 4 '
                                'parameters. Extra parameters ignored.' %
                                self._id)
            else:
                result += "0 "
        for i in range(6 - len(self._members)):
            result += '-1 '

        result += '\n'
        return result
Ejemplo n.º 8
0
    def _get_quick_string_index(self, sentence):
        text = p_common.convert_to_identifier_with_no_lowercase(sentence)
        sentence = p_common.replace_spaces(sentence)

        i = min(20, len(text))
        while i <= len(text):
            auto_id = "qstr_" + text[0:i]
            if auto_id in self._quick_strings:
                # string already exists, don't do anything
                if self._quick_strings[auto_id] == sentence:
                    break
                else:
                    # auto_id exists but contains other sentence.
                    # increase auto_id
                    i += 1
            else:
                # auto_id is free, store sentence
                self._quick_strings[auto_id] = sentence
                break
        else:
            # `"qstr_" + text` is already an auto_id, use numbers
            number = 1
            base_auto_id = "qstr_" + text
            auto_id = base_auto_id + str(number)
            while auto_id in self._quick_strings:
                number += 1
                auto_id = base_auto_id + str(number)
            self._quick_strings[auto_id] = sentence

        return self._quick_strings.keys().index(auto_id)
Ejemplo n.º 9
0
    def export(self, compiler):
        result = ''

        result += "%s %s %d %s %s %f %f %f %f %f %s " % \
                  (convert_to_identifier(self._id),
                   replace_spaces(self._no_tag_id),
                   self._flags, self._mesh, self._body, self._min_pos[0],
                   self._min_pos[1], self._max_pos[0], self._max_pos[1],
                   self._water_level,
                   self._terrain_code)

        result += "\n  %d " % len(self._passages)
        for passage in self._passages:
            result += " %d " % self.get_scene_index(passage)

        result += "\n  %d " % len(self._chest_troops)
        for chest_troop in self._chest_troops:
            troop_no = compiler.index(chest_troop, tag='trp')
            if troop_no == 0:
                logging.error('Unable to find chest-troop "%s" in scene "%s"' %
                              (chest_troop, self._id))
            result += " %d " % troop_no
        result += "\n"

        if self._outer_scene:
            result += " %s " % self._outer_scene
        else:
            result += " 0 "
        result += '\n'

        return result
Ejemplo n.º 10
0
    def compile(self, types=()):
        if not types:
            types = objects.ALL_TYPES

        for object_type in types:
            if object_type == objects.Slot:
                # slots are not exported
                continue

            logging.info('Compiling "%s"' % object_type.__name__)

            if objects.HEADERS[object_type]:
                result = objects.HEADERS[object_type] + '\n'
            else:
                result = ''

            # "sound" needs samples exported
            if object_type == objects.Sound:
                result += object_type.export_samples()

            # "Party" needs 2 len's.
            if object_type == objects.Party:
                result += "%d " % len(object_type.objects)
            result += "%d\n" % len(object_type.objects)

            for id in object_type.objects:
                logging.debug('Compiling "%s.%s"' % (object_type.__name__, id))
                # add to _all_entities keeps a track of all cases.
                if object_type in objects.TAG_TO_OBJECT_TYPE.values():
                    self._all_entities.add("%s_%s" % (object_type.tag, id))

                try:
                    result += object_type.objects[id].export(self)
                except Exception as e:
                    import sys
                    raise e

            with open(self._export_dir + '/' + objects.FILE_NAMES[object_type],
                      'wb') as f:
                f.write(result.replace('\n', '\r\n').encode('utf-8'))

        # save quick strings
        result = "%d\n" % len(self._quick_strings)
        for q_string in self._quick_strings:
            result += "%s %s\n" % \
                      (q_string,
                       p_common.replace_spaces(self._quick_strings[q_string]))

        with open(self._export_dir + '/quick_strings.txt', 'wb') as f:
            f.write(result.replace('\n', '\r\n').encode('utf-8'))

        # export dialog states
        result = ''
        for dialog_state in objects.Dialog.dialog_states:
            result += "%s\n" % dialog_state

        with open(self._export_dir + '/' + 'dialog_states.txt', 'wb') as f:
            f.write(result.replace('\n', '\r\n').encode('utf-8'))

        self.save_logs()
Ejemplo n.º 11
0
    def export(self, compiler):
        result = ''

        result += "%s %s %d %s %s %f %f %f %f %f %s " % \
                  (convert_to_identifier(self._id),
                   replace_spaces(self._no_tag_id),
                   self._flags, self._mesh, self._body, self._min_pos[0],
                   self._min_pos[1], self._max_pos[0], self._max_pos[1],
                   self._water_level,
                   self._terrain_code)

        result += "\n  %d " % len(self._passages)
        for passage in self._passages:
            result += " %d " % self.get_scene_index(passage)

        result += "\n  %d " % len(self._chest_troops)
        for chest_troop in self._chest_troops:
            troop_no = compiler.index(chest_troop, tag='trp')
            if troop_no == 0:
                logging.error('Unable to find chest-troop "%s" in scene "%s"' %
                              (chest_troop, self._id))
            result += " %d " % troop_no
        result += "\n"

        if self._outer_scene:
            result += " %s " % self._outer_scene
        else:
            result += " 0 "
        result += '\n'

        return result
Ejemplo n.º 12
0
    def export(self, compiler):
        result = " {id} {name} {name} {meshes_number} ".format(
            id=convert_to_identifier(self._id), name=replace_spaces(self._name), meshes_number=len(self._meshes)
        )

        for mesh in self._meshes:
            result += " %s %d " % (mesh[0], mesh[1])

        # hp share the same bits as attack type since items cannot have both.
        hp = hi.get_hit_points(self._stats)
        if hi.get_thrust_damage(self._stats) + hi.get_swing_damage(self._stats) > 0:
            hp = 0
        result += " %d %d %d %d %f %d %d %d %d %d %d %d %d %d %d %d %d\n" % (
            self._flags,
            self._capabilities,
            self._slot_no,
            self._value,
            hi.get_weight(self._stats),
            hi.get_abundance(self._stats),
            hi.get_head_armor(self._stats),
            hi.get_body_armor(self._stats),
            hi.get_leg_armor(self._stats),
            hi.get_difficulty(self._stats),
            hp,
            hi.get_speed_rating(self._stats),
            hi.get_missile_speed(self._stats),
            hi.get_weapon_length(self._stats),
            hi.get_max_ammo(self._stats),
            hi.get_thrust_damage(self._stats),
            hi.get_swing_damage(self._stats),
        )

        result += " %d\n" % len(self._factions)
        for faction in self._factions:
            result += " %d" % compiler.index(faction)
        if self._factions:
            result += "\n"

        result += "%d\n" % len(self._triggers)
        for trigger in self._triggers:
            result += "%f " % trigger[0]
            result += compiler.process_statement_block(self.name, 1, trigger[1])
            result += "\n"
        result += "\n"

        return result
Ejemplo n.º 13
0
    def export(self, compiler):
        result = " {id} {name} {name} {meshes_number} ".format(
            id=convert_to_identifier(self._id),
            name=replace_spaces(self._name),
            meshes_number=len(self._meshes))

        for mesh in self._meshes:
            result += " %s %d " % (mesh[0], mesh[1])

        # hp share the same bits as attack type since items cannot have both.
        hp = hi.get_hit_points(self._stats)
        if hi.get_thrust_damage(self._stats) + hi.get_swing_damage(
                self._stats) > 0:
            hp = 0
        result += " %d %d %d %d %f %d %d %d %d %d %d %d %d %d %d %d %d\n" % \
                  (self._flags, self._capabilities, self._slot_no, self._value,
                   hi.get_weight(self._stats),
                   hi.get_abundance(self._stats),
                   hi.get_head_armor(self._stats),
                   hi.get_body_armor(self._stats),
                   hi.get_leg_armor(self._stats),
                   hi.get_difficulty(self._stats),
                   hp,
                   hi.get_speed_rating(self._stats),
                   hi.get_missile_speed(self._stats),
                   hi.get_weapon_length(self._stats),
                   hi.get_max_ammo(self._stats),
                   hi.get_thrust_damage(self._stats),
                   hi.get_swing_damage(self._stats))

        result += " %d\n" % len(self._factions)
        for faction in self._factions:
            result += " %d" % compiler.index(faction)
        if self._factions:
            result += "\n"

        result += "%d\n" % len(self._triggers)
        for trigger in self._triggers:
            result += "%f " % trigger[0]
            result += compiler.process_statement_block(self.name, 1,
                                                       trigger[1])
            result += "\n"
        result += "\n"

        return result
Ejemplo n.º 14
0
    def export(self, compiler):
        #if (party[5] >= 0):
        #  add_tag_use(tag_uses,tag_faction,party[5])

        if isinstance(self._flags, int):
            flags = self._flags
        else:
            flags = self._flags.as_index(compiler)

        result = " 1 %d %d " % (self.index, self.index)
        result += "%s %s %d " % (p_common.convert_to_identifier(self.id),
                                 p_common.replace_spaces(self._name),
                                 flags)
        if isinstance(self._menu, str):
            menu_index = compiler.index(self._menu)
        else:
            menu_index = self._menu
        result += "%d " % menu_index

        result += "%d %d %d %d %d " % (compiler.index(self._template),
                                       compiler.index(self._faction),
                                       self._personality, self._personality,
                                       self._ai_behavior)

        if isinstance(self._ai_target, str):
            ai_target_index = compiler.index(self._ai_target)
        else:
            ai_target_index = self._ai_target

        result += "%d %d " % (ai_target_index, ai_target_index)

        result += "%f %f " % (self._init_position[0], self._init_position[1])
        result += "%f %f " % (self._init_position[0], self._init_position[1])
        result += "%f %f 0.0 " % (self._init_position[0], self._init_position[1])

        result += "%d " % len(self._members)
        for member in self._members:
            # todo: add_tag_use(tag_uses,tag_troop,member[0])
            result += "%d %d 0 %d " % (compiler.index(member[0]),
                                       member[1], member[2])

        result += "\n%.4f\n" % ((3.1415926 / 180.0) * self._bearing)

        return result
Ejemplo n.º 15
0
    def export(self, compiler):
        #if (party[5] >= 0):
        #  add_tag_use(tag_uses,tag_faction,party[5])

        if isinstance(self._flags, int):
            flags = self._flags
        else:
            flags = self._flags.as_index(compiler)

        result = " 1 %d %d " % (self.index, self.index)
        result += "%s %s %d " % (p_common.convert_to_identifier(
            self.id), p_common.replace_spaces(self._name), flags)
        if isinstance(self._menu, str):
            menu_index = compiler.index(self._menu)
        else:
            menu_index = self._menu
        result += "%d " % menu_index

        result += "%d %d %d %d %d " % (compiler.index(
            self._template), compiler.index(self._faction), self._personality,
                                       self._personality, self._ai_behavior)

        if isinstance(self._ai_target, str):
            ai_target_index = compiler.index(self._ai_target)
        else:
            ai_target_index = self._ai_target

        result += "%d %d " % (ai_target_index, ai_target_index)

        result += "%f %f " % (self._init_position[0], self._init_position[1])
        result += "%f %f " % (self._init_position[0], self._init_position[1])
        result += "%f %f 0.0 " % (self._init_position[0],
                                  self._init_position[1])

        result += "%d " % len(self._members)
        for member in self._members:
            # todo: add_tag_use(tag_uses,tag_troop,member[0])
            result += "%d %d 0 %d " % (compiler.index(
                member[0]), member[1], member[2])

        result += "\n%.4f\n" % ((3.1415926 / 180.0) * self._bearing)

        return result
Ejemplo n.º 16
0
 def export(self, compiler):
     return "%s %s\n" % (p_common.convert_to_identifier(self._id),
                         p_common.replace_spaces(self._string))
Ejemplo n.º 17
0
 def export(self, compiler):
     result = "%s %d %s " % (self.id, self._flags, p_common.replace_spaces(self._resource_name))
     result += ' '.join(['%f' % i for i in self._trans + self._rot + self._scale])
     result += '\n'
     return result
Ejemplo n.º 18
0
    def compile(self, types=()):
        if not types:
            types = objects.ALL_TYPES

        for object_type in types:
            if object_type == objects.Slot:
                # slots are not exported
                continue

            logging.info('Compiling "%s"' % object_type.__name__)

            if objects.HEADERS[object_type]:
                result = objects.HEADERS[object_type] + '\n'
            else:
                result = ''

            # "sound" needs samples exported
            if object_type == objects.Sound:
                result += object_type.export_samples()

            # "Party" needs 2 len's.
            if object_type == objects.Party:
                result += "%d " % len(object_type.objects)
            result += "%d\n" % len(object_type.objects)

            for id in object_type.objects:
                logging.debug('Compiling "%s.%s"' % (object_type.__name__, id))
                # add to _all_entities keeps a track of all cases.
                if object_type in objects.TAG_TO_OBJECT_TYPE.values():
                    self._all_entities.add("%s_%s" % (object_type.tag, id))

                try:
                    result += object_type.objects[id].export(self)
                except Exception as e:
                    import sys
                    raise type(e), type(e)('"%s" happens at "%s".' %
                                           (e.message, object_type.objects[id].name)), \
                        sys.exc_info()[2]

            with open(self._export_dir + '/' + objects.FILE_NAMES[object_type], 'wb') as f:
                f.write(result.replace('\n', '\r\n'))

        # save quick strings
        result = "%d\n" % len(self._quick_strings)
        for q_string in self._quick_strings:
            result += "%s %s\n" % \
                      (q_string,
                       p_common.replace_spaces(self._quick_strings[q_string]))

        with open(self._export_dir + '/quick_strings.txt', 'wb') as f:
            f.write(result.replace('\n', '\r\n'))

        # export dialog states
        result = ''
        for dialog_state in objects.Dialog.dialog_states:
            result += "%s\n" % dialog_state

        with open(self._export_dir + '/' + 'dialog_states.txt', 'wb') as f:
            f.write(result.replace('\n', '\r\n'))

        self.save_logs()
Ejemplo n.º 19
0
    def export(self, compiler):
        result = "%s %d\n %s %s %s\n" % (self._no_tag_id, self._flags, self._body,
                                         self._calf, self._hand)
        result += " %s %d " % (self._head, len(self._faces))
        for face_key in self._faces:
            result += "skinkey_%s %d %d %f %f %s " % \
                      (p_common.convert_to_identifier(face_key[4]),
                       face_key[0],
                       face_key[1],
                       face_key[2],
                       face_key[3],
                       p_common.replace_spaces(face_key[4]))

        result += "\n%d\n" % len(self._hair_meshes)
        for mesh_name in self._hair_meshes:
            result += " %s " % mesh_name

        result += "\n %d\n" % len(self._beard_meshes)
        for bmn in self._beard_meshes:
            result += "  %s\n" % bmn
        result += '\n'

        result += " %d " % len(self._hair_textures)
        for tex in self._hair_textures:
            result += " %s " % tex
        result += "\n"

        result += " %d " % len(self._beard_textures)
        for tex in self._beard_textures:
            result += " %s " % tex
        result += "\n"

        result += " %d "%len(self._face_textures)
        for tex in self._face_textures:
            color = tex[1]
            hair_mats = tex[2]
            hair_colors = []
            if len(tex) > 3:
                hair_colors = tex[3]
            result += " %s %d %d %d "%(tex[0], color, len(hair_mats),
                                       len(hair_colors))
            for hair_mat in hair_mats:
                result += " %s "%(p_common.replace_spaces(hair_mat))
            for hair_color in hair_colors:
                result += " %d " % hair_color
        result += "\n"

        result += " %d " % len(self._voices)
        for voice_rec in self._voices:
            result += " %d %s " % (voice_rec[0], voice_rec[1])
        result += "\n"

        result += " %s %f " % (self._skeleton, self._scale)
        result += "\n%d %d\n" % (compiler.index(self._blood_particles[0]),
                                 compiler.index(self._blood_particles[1]))

        result += "%d\n" % len(self._face_constraints)
        for constraint in self._face_constraints:
            result += "\n%f %d %d " % (constraint[0], constraint[1],
                                       (len(constraint) - 2))
            for i_pair in range(len(constraint)):
                if i_pair > 1:
                    result += " %f %d" % (constraint[i_pair][0],
                                          constraint[i_pair][1])
        result += "\n"
        return result
Ejemplo n.º 20
0
 def export(self, compiler):
     return "%s %s %s\n" % (self.id, p_common.replace_spaces(
         self._name), p_common.replace_spaces(self._description))
Ejemplo n.º 21
0
 def export(self, compiler):
     result = "%s %s " % (self.id, p_common.replace_spaces(self._name))
     result += "%d %d %s\n" % (self._flags, self._max_level,
                               self._description.replace(" ", "_"))
     return result
Ejemplo n.º 22
0
 def export(self, compiler):
     result = "%s %s " % (self.id, p_common.replace_spaces(self._name))
     result += "%d %d %s\n" % (self._flags, self._max_level,
                               self._description.replace(" ", "_"))
     return result
Ejemplo n.º 23
0
 def export(self, compiler):
     return "%s %s %s\n"% (self.id, p_common.replace_spaces(self._name),
                           p_common.replace_spaces(self._description))