Beispiel #1
0
 def get_size(self):
     if self.skip_default_langid:
         size = 0
     else:
         size = 6 + grfstrings.get_string_size(
             grfstrings.get_translation(self.string))
     for lang_id in grfstrings.get_translations(self.string):
         # 6 is for "T" (1), id (4), langid (1)
         size += 6 + grfstrings.get_string_size(
             grfstrings.get_translation(self.string, lang_id))
     return size
Beispiel #2
0
 def write(self, file):
     name = grfstrings.get_translation(self.name)
     desc = grfstrings.get_translation(self.description)
     size = 6 + grfstrings.get_string_size(name) + grfstrings.get_string_size(desc)
     file.start_sprite(size)
     file.print_bytex(8)
     # Write the grf version
     file.print_bytex(8)
     file.print_string(self.grfid.value, False, True)
     file.print_string(name)
     file.print_string(desc)
     file.end_sprite()
Beispiel #3
0
def parse_string_to_dword(string):
    """
    Convert string literal expression of length 4 to it's equivalent 32 bit number.

    @param string: Expression to convert.
    @type  string: L{Expression}

    @return: Value of the converted expression (a 32 bit integer number, little endian).
    @rtype:  C{int}
    """
    if not isinstance(string, StringLiteral) or grfstrings.get_string_size(
            string.value, False, True) != 4:
        raise generic.ScriptError("Expected a string literal of length 4",
                                  string.pos)

    pos = string.pos
    string = string.value
    bytes = []
    i = 0
    try:
        while len(bytes) < 4:
            if string[i] == '\\':
                bytes.append(int(string[i + 1:i + 3], 16))
                i += 3
            else:
                bytes.append(ord(string[i]))
                i += 1
    except ValueError:
        raise generic.ScriptError("Cannot convert string to integer id", pos)

    return bytes[0] | (bytes[1] << 8) | (bytes[2] << 16) | (bytes[3] << 24)
Beispiel #4
0
    def get_length_styles(self):
        if len(self.style_names) == 0:
            return 0

        size = 0
        for _lang, txt in self.style_names:
            size += 1 + grfstrings.get_string_size(txt)  # Language ID, text
        return size + 1  # Terminating 0
Beispiel #5
0
 def write(self, file):
     size = 4 + self.size
     for text in self.texts:
         size += grfstrings.get_string_size(text)
     file.start_sprite(size)
     file.print_bytex(4)
     file.print_bytex(self.feature)
     file.print_bytex(self.lang)
     file.print_bytex(len(self.texts))
     file.print_varx(self.id, self.size)
     for text in self.texts:
         file.print_string(text)
     file.newline()
     file.end_sprite()
Beispiel #6
0
    def write(self, file):
        size = 4
        if not isinstance(self.msg, int):
            size += grfstrings.get_string_size(self.msg)
        if self.data is not None:
            size += grfstrings.get_string_size(self.data) + len(
                self.extra_params)

        file.start_sprite(size)
        file.print_bytex(0x0B)
        self.severity.write(file, 1)
        file.print_bytex(self.lang)
        if isinstance(self.msg, int):
            file.print_bytex(self.msg)
        else:
            file.print_bytex(0xFF)
            file.print_string(self.msg)
        if self.data is not None:
            file.print_string(self.data)
            for param in self.extra_params:
                param.write(file, 1)
        file.newline()
        file.end_sprite()
Beispiel #7
0
 def print_string(self, value, final_zero=True, force_ascii=False):
     assert self.in_sprite
     self.file.write('"')
     if not grfstrings.is_ascii_string(value):
         if force_ascii:
             raise generic.ScriptError(
                 "Expected ascii string but got a unicode string")
         self.file.write('Þ')  # b'\xC3\x9E'.decode('utf-8')
     self.file.write(value.replace('"', '\\"'))
     self.byte_count += grfstrings.get_string_size(value, final_zero,
                                                   force_ascii)
     self.file.write('" ')
     if final_zero:
         self.print_bytex(0)
         # get_string_size already includes the final 0 byte
         # but print_bytex also increases byte_count, so decrease
         # it here by one to correct it.
         self.byte_count -= 1
Beispiel #8
0
 def get_length(self):
     return 1 + grfstrings.get_string_size(
         self.text.value)  # probability, text
Beispiel #9
0
 def get_size(self):
     size = 2
     for mapping in self.mappings:
         size += 1 + grfstrings.get_string_size(mapping[1])
     return size