einstein/einsteingame/messages.py

66 lines
2.0 KiB
Python

import struct
from .buffer import Buffer
from .formatter import Formatter
class Messages(object):
def __init__(self):
self.__messages = {}
def load(self, resources):
buf = Buffer()
resources.forEachInGroup('messages', lambda res: self.loadFromResource(res, buf))
def loadFromResource(self, resource, buf):
if not resource:
return
cnt = resource.getVariantsCount()
for variant in resource.variants:
if variant:
try:
score = variant.i18nScore
data = variant.getData()
self.loadBundle(score, data)
except Exception as e:
print("Error loading text bundle {}: {}".format(resource.getName(), e))
raise
def loadBundle(self, score, data):
if data[0:3] != b"CMF":
raise Exception("Invalid format of message file!")
version = struct.unpack('i', data[3:7])[0]
if version != 1:
raise Exception("Unknown version of message file!")
offset = struct.unpack('i', data[len(data) - 4:])[0]
cnt = struct.unpack('i', data[offset:offset + 4])[0]
offset += 4
for i in range(0, cnt):
sz = struct.unpack('i', data[offset:offset + 4])[0]
offset += 4;
if sz > 0:
name = data[offset:offset + sz].decode('utf-8')
msgOffset = struct.unpack('i', data[offset + sz:offset + sz + 4])[0]
if name in self.__messages:
ss = self.__messages[name]
if ss['score'] <= score:
ss['score'] = score
ss['message'] = Formatter(data, msgOffset)
else:
self.__messages[name] = {
"score": score,
"message": Formatter(data, msgOffset),
}
offset += sz + 4
msg = Messages()