Ejemplo n.º 1
0
    def __init__(self, game):
        self.game = game
        self.frame = Frame(self.game, True)
        self._back_button = Button(
            (self.game.width - 200) / 2, 100, 200, 40,
            resource_pack.get_translation('game.gui.pause_menu.back_to_game'))
        self._exit_button = Button(
            (self.game.width - 200) / 2, 150, 200, 40,
            resource_pack.get_translation('game.gui.pause_menu.exit'))

        def on_back_press():
            schedule_once(lambda dt: self.game.toggle_gui(), 0.1)

        def on_exit_press():
            self.game.save(0)
            self.game.on_close()
            exit(0)

        def on_resize(width, height):
            h = get_size()[1]
            self._back_button.x = (self.game.width - 200) / 2
            self._back_button.y = 100
            self._exit_button.x = (self.game.width - 200) / 2
            self._exit_button.y = 150

        self.frame.add_widget(self._back_button)
        self.frame.add_widget(self._exit_button)
        self.frame.register_event('resize', on_resize)
        self._back_button.register_event('press', on_back_press)
        self._exit_button.register_event('press', on_exit_press)
Ejemplo n.º 2
0
 def valid(self, value):
     try:
         return int(value) - (1 if self.axis == 'y' else 0)
     except:
         if value.startswith('~'):
             if value == '~':
                 return int(
                     round(get_game().player['position']
                           [ord(self.axis) -
                            120])) - (1 if self.axis == 'y' else 0)
             try:
                 delta = int(value[1:]) - (1 if self.axis == 'y' else 0)
             except:
                 raise TypeError(
                     resource_pack.get_translation(
                         'command.args.position.wrong') % value)
             else:
                 return (int(
                     round(get_game().player['position'][ord(self.axis) -
                                                         120] + delta)) -
                         (1 if self.axis == 'y' else 0))
         else:
             raise TypeError(
                 resource_pack.get_translation(
                     'command.args.position.wrong') % value)
Ejemplo n.º 3
0
    def add_block(self, position, block, immediate=True, record=True):
        """
        在 position 处添加一个方块

        :param: pssition 长度为3的元组, 要添加方块的位置
        :param: block 方块
        :param: immediate 是否立即绘制方块
        :param: record 是否记录方块更改(在生成地形时不记录)
        """
        if position in self.world:
            self.remove_block(position, immediate, record=False)
        if -64 <= position[1] < 512:
            # 建筑限制为-64格以上, 512格以下
            if record == True:
                self.change[pos2str(position)] = block
            if block in blocks:
                self.world[position] = blocks[block]
                self.world[position].on_build(position)
                self.world[position].position = position
            else:
                # 将不存在的方块替换为 missing
                self.world[position] = blocks['missing']
            self.sectors.setdefault(sectorize(position), []).append(position)
            if self.exposed(position):
                self.show_block(position)
            if not self.world[position].transparent:
                self.check_neighbors(position)
        else:
            if position[1] >= 512:
                get_game().dialogue.add_dialogue(resource_pack.get_translation('game.text.build_out_of_world')[0] % 512)
            else:
                get_game().dialogue.add_dialogue(resource_pack.get_translation('game.text.build_out_of_world')[1])
Ejemplo n.º 4
0
 def draw_label(self):
     if not self.is_init:
         if self.exclusive:
             self.dialogue.draw()
         if self.debug['debug'] and self.exclusive:
             x, y, z = self.player['position']
             rx, ry = self.player['rotation']
             mem = round(
                 psutil.Process(os.getpid()).memory_full_info()[0] /
                 1048576, 2)
             fps = pyglet.clock.get_fps()
             text = '\n'.join(
                 resource_pack.get_translation('game.text.debug'))
             text = text.replace('%(version)', VERSION['str']).replace(
                 '%(info)', ', '.join(self._info_ext))
             text = text.replace('%(xyz)',
                                 '%.1f, %.1f, %.1f' % (x, y, z)).replace(
                                     '%(rot)', '%.2f, %.2f' % (rx, ry))
             text = text.replace('%(mem)', '%.2f' % mem).replace(
                 '%(fps)', '%d' % fps)
             self.label['top'].text = text
             self.label['top'].draw()
     else:
         # 初始化屏幕
         self.loading.draw()
Ejemplo n.º 5
0
class CommandWeather(CommandBase):

    formats = [
        ArgumentCollection(type=StringArgument()),
        ArgumentCollection(type=StringArgument(),
                           duration=NumberArgument(min_=0))
    ]
    description = [
        resource_pack.get_translation('command.name.weather.help'),
        '/weather <string:type> [int:duration]'
    ]

    def execute(self):
        self.weather = {'now': '', 'duration': 0}
        if self.args['type'] in weather:
            self.weather['now'] = self.args['type']
        else:
            self.game.dialogue.add_dialogue(
                resource_pack.get_translation(
                    'command.name.weather.none_exist') % self.args['type'])
            return
        if 'duration' in self.args:
            duration = weather[self.args['type']].duration
            self.weather['duration'] = min(
                max(duration[0], self.args['duration']), duration[1])
        else:
            self.weather['duration'] = random.randint(
                *weather[self.args['type']].duration)
        weather[self.game.weather['now']].leave()
        self.game.weather = self.weather
        weather[self.game.weather['now']].change()
Ejemplo n.º 6
0
 def valid(self, value):
     if value in blocks:
         return value
     else:
         raise TypeError(
             resource_pack.get_translation('command.args.block.wrong') %
             value)
Ejemplo n.º 7
0
class CommandTime(CommandBase):
    formats = [
        ArgumentCollection(),
        ArgumentCollection(op=StringArgument('^(add|set)$'),
                           time=NumberArgument(min_=0)),
        ArgumentCollection(op=StringArgument('set'),
                           time=StringArgument('^(day|noon|night)$'))
    ]
    description = [
        resource_pack.get_translation('command.name.time.help'), '/time',
        '/time add <int:second>', '/time set <int:time>',
        '/time set <str:day|noon|night>'
    ]

    def execute(self):
        if 'op' not in self.args:
            self.game.dialogue.add_dialogue(str(int(self.game.time)))
        else:
            if self.args['op'] == 'add':
                self.game.time += self.args['time']
            elif self.args['op'] == 'set':
                if isinstance(self.args['time'], int):
                    self.game.time = self.args['time']
                elif isinstance(self.args['time'], str):
                    d = {'day': 300, 'noon': 600, 'night': 900}
                    self.game.time = int(
                        self.game.time) // 1200 * 1200 + d[self.args['time']]
            change_sky_color(0)
Ejemplo n.º 8
0
 def die(self, reason):
     if not self._data['die']:
         self._data['die'] = True
         self._data['die_reason'] = resource_pack.get_translation(
             reason) % player['name']
         get_game().dialogue.add_dialogue(self._data['die_reason'])
         get_game().toggle_gui()
         get_game().toggle_gui('die')
Ejemplo n.º 9
0
 def valid(self, value):
     if value == 'true':
         return True
     elif value == 'false':
         return False
     else:
         raise TypeError(
             resource_pack.get_translation('command.args.boolean.wrong') %
             value)
Ejemplo n.º 10
0
 def valid(self, value):
     if '=' in value:
         key, value = value.split('=', 1)
         if len(key) < 1:
             raise TypeError(
                 resource_pack.get_translation('command.args.dict.wrong') %
                 key)
         else:
             return {key: self.argument(value)}
Ejemplo n.º 11
0
 def valid(self, value):
     if self.re_expr:
         if re.match(self.re_expr, value):
             return value
         else:
             raise TypeError(
                 resource_pack.get_translation(
                     'command.args.string.not_available') % value)
     else:
         return value
Ejemplo n.º 12
0
    def __init__(self, game):
        self.game = game
        self.frame = Frame(self.game, True)
        self.frame.set_background_color((220, 0, 0, 100))
        self._text_die = ColorLabel(
            text=resource_pack.get_translation('game.text.die'),
            x=self.game.width / 2,
            y=0.8 * self.game.height,
            font_size=42,
            anchor_x='center',
            anchor_y='center')
        self._text_reason = ColorLabel(text=get_game().player['die_reason'],
                                       anchor_x='center',
                                       anchor_y='center',
                                       x=self.game.width / 2,
                                       y=0.7 * self.game.height,
                                       font_size=15)
        self._respawn = Button(
            ((self.game.width - 200) / 2), 0.7 * self.game.height, 200, 40,
            resource_pack.get_translation('game.text.respawn'))

        def on_press():
            self.game.player['die'] = False
            self.game.player['position'] = self.game.player['respawn_position']
            self.game.toggle_gui()

        def on_resize(width, height):
            self._text_die.x = width / 2
            self._text_die.y = 0.8 * height
            self._text_reason.x = width / 2
            self._text_reason.y = 0.7 * height
            self._respawn.x = (width - 200) / 2
            self._respawn.y = 0.7 * height

        def on_die():
            self._text_reason.text = get_game().player['die_reason']

        self.frame.add_widget(self._text_die)
        self.frame.add_widget(self._text_reason)
        self.frame.add_widget(self._respawn)
        get_game().register_event('die', on_die)
        self.frame.register_event('resize', on_resize)
        self._respawn.register_event('press', on_press)
Ejemplo n.º 13
0
class CommandSay(CommandBase):

    formats = [ArgumentCollection(text=StringArgument())]
    description = [
        resource_pack.get_translation('command.name.say.help'),
        '/say <string:str>'
    ]

    def execute(self):
        self.game.dialogue.add_dialogue(self.args['text'])
Ejemplo n.º 14
0
class CommandSeed(CommandBase):

    formats = [ArgumentCollection()]
    description = [
        resource_pack.get_translation('command.name.seed.help'), '/seed'
    ]

    def execute(self):
        self.game.dialogue.add_dialogue(
            resource_pack.get_translation('general.seed') + ': ' +
            str(self.game.world.seed))
Ejemplo n.º 15
0
 def run_command(self, s):
     # 运行命令
     command = s.split(' ')[0]
     if command not in commands:
         match = get_close_matches(s, list(commands.keys()), n=1)
         if len(match) == 1:
             self.dialogue.add_dialogue(
                 resource_pack.get_translation('command.not_found')[1] %
                 (command, match[0]))
         else:
             self.dialogue.add_dialogue(
                 resource_pack.get_translation('command.not_found')[0] %
                 command)
     else:
         try:
             log_info('Run command: %s' % s)
             cmd = commands[command](self, s)
         except TypeError as error:
             self.dialogue.add_dialogue('Arguments error: %s' %
                                        error.args[0])
         else:
             cmd.execute()
Ejemplo n.º 16
0
 def valid(self, value):
     try:
         value = self.type(value)
     except:
         raise TypeError(
             resource_pack.get_translation(
                 'command.args.number.not_a_number') % value)
     else:
         if (self.range[0] is not None) and (self.range[1] is not None):
             if self.range[0] <= value <= self.range[1]:
                 return value
         elif self.range[0] is not None:
             if self.range[0] <= value:
                 return value
         elif self.range[1] is not None:
             if self.range[1] >= value:
                 return value
         else:
             return value
         # 都没有匹配后运行到这里生成错误信息
         if (self.range[0] is not None) and (self.range[1] is not None):
             raise TypeError(
                 resource_pack.get_translation(
                     'command.args.number.not_between') %
                 (self.range[0], self.range[1]))
         elif self.range[0] is not None:
             raise TypeError(
                 resource_pack.get_translation(
                     'command.args.number.is_small') %
                 (value, self.range[0]))
         elif self.range[1] is not None:
             raise TypeError(
                 resource_pack.get_translation('command.args.number.is_big')
                 % (value, self.range[1]))
         else:
             raise TypeError(
                 resource_pack.get_translation('command.args.number.wrong')
                 % value)
Ejemplo n.º 17
0
class CommandTeleport(CommandBase):

    formats = [
        ArgumentCollection(x=PositionArgument('x'),
                           y=PositionArgument('y'),
                           z=PositionArgument('z'))
    ]
    description = [
        resource_pack.get_translation('command.name.teleport.help'),
        '/tp <position>'
    ]

    def execute(self):
        self.game.player['position'] = tuple(self.args.values())
Ejemplo n.º 18
0
class CommandGameMode(CommandBase):

    formats = [ArgumentCollection(mode=NumberArgument())]
    description = [
        resource_pack.get_translation('command.name.gamemode.help'),
        '/gamemode <number:mode>'
    ]

    def execute(self):
        if self.args['mode'] in [0, 1]:
            self.game.player['gamemode'] = self.args['mode']
            if self.args[0] == 1:
                self.game.player['flying'] = True
            else:
                self.game.player['flying'] = False
Ejemplo n.º 19
0
class CommandSetBlock(CommandBase):

    formats = [
        ArgumentCollection(x=PositionArgument('x'),
                           y=PositionArgument('y'),
                           z=PositionArgument('z'),
                           block=BlockArgument())
    ]
    description = [
        resource_pack.get_translation('command.name.setblock.help'),
        '/setblock <position> <block>'
    ]

    def execute(self):
        self.game.world.add_block(
            tuple(self.args['x'], self.args['y'], self.args['z']),
            self.args['block'])
Ejemplo n.º 20
0
class CommandHelp(CommandBase):

    formats = [ArgumentCollection(), ArgumentCollection(cmd=StringArgument())]
    description = [
        resource_pack.get_translation('command.name.help.help'), '/help',
        '/help <string:command>'
    ]

    def execute(self):
        global commands
        if len(self.args) == 0:
            cmds = ''
            for key, value in commands.items():
                cmds += '/' + key + ' - ' + value.description[0] + '\n'
            self.game.dialogue.add_dialogue(cmds)
        elif 'cmd' in self.args:
            cmd = commands[self.args['cmd']]
            self.game.dialogue.add_dialogue('\n'.join(cmd.description[1:]))
Ejemplo n.º 21
0
 def execute(self):
     self.weather = {'now': '', 'duration': 0}
     if self.args['type'] in weather:
         self.weather['now'] = self.args['type']
     else:
         self.game.dialogue.add_dialogue(
             resource_pack.get_translation(
                 'command.name.weather.none_exist') % self.args['type'])
         return
     if 'duration' in self.args:
         duration = weather[self.args['type']].duration
         self.weather['duration'] = min(
             max(duration[0], self.args['duration']), duration[1])
     else:
         self.weather['duration'] = random.randint(
             *weather[self.args['type']].duration)
     weather[self.game.weather['now']].leave()
     self.game.weather = self.weather
     weather[self.game.weather['now']].change()
Ejemplo n.º 22
0
    def __init__(self, game):
        width, height = get_size()
        self.game = game
        self.frame = Frame(self.game, True)
        self._inventory = Image(
            (width - 352) / 2, (height - 332) / 2,
            resource_pack.get_resource(
                'textures/gui/containers/inventory').get_region(
                    0, 90, 176, 166))
        self._inventory.sprite.scale = 2
        self._label = ColorLabel(
            text=resource_pack.get_translation('game.gui.craft.name'),
            color='black',
            anchor_x='left',
            font_size=12,
            x=(width - 352) / 2 + 194,
            y=height - (height - 332) / 2 - 28,
            shadow=False)
        self._slots = BagSlot((width - 352) / 2 + 16, (height - 332) / 2 + 164)
        self._table = CraftingTable((width - 352) / 2 + 196,
                                    height - (height - 332) / 2 - 36, 2)
        self._table.set_output(112, -20)

        def on_resize(width, height):
            self._inventory.sprite.position = (width - 352) / 2, (height -
                                                                  332) / 2
            self._label.x = (width - 352) / 2 + 194
            self._label.y = height - (height - 332) / 2 + 284
            self._slots.resize((width - 352) / 2 + 16,
                               (height - 332) / 2 + 164)
            self._table.resize((width - 352) / 2 + 196,
                               height - (height - 332) / 2 - 36)

        self.frame.register_event('resize', on_resize)
        self.frame.add_widget(self._inventory)
        self.frame.add_widget(self._label)
        for slot in self._slots.slots():
            self.frame.add_widget(slot)
        for slot in self._table.slots():
            self.frame.add_widget(slot)
Ejemplo n.º 23
0
 def execute(self):
     self.game.dialogue.add_dialogue(
         resource_pack.get_translation('general.seed') + ': ' +
         str(self.game.world.seed))
Ejemplo n.º 24
0
def get_translation(name):
    return _resource_pack.get_translation(name)