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
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()
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)
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
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()
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()
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
def get_length(self): return 1 + grfstrings.get_string_size( self.text.value) # probability, text
def get_size(self): size = 2 for mapping in self.mappings: size += 1 + grfstrings.get_string_size(mapping[1]) return size