Ejemplo n.º 1
0
    def render_main(self):
        with Group("global", "全局", (self._global, models.Global)):
            ModelInput("energy")
            ModelInput("vigour")
            ModelInput("health")
            ModelInput("skill")
            ModelInput("atk").set_help("更换装备、升级、保存载入还原,下同")
            ModelInput("defense")
            ModelInput("critical_buff")
            ModelInput("critical")
            ModelInput("attr_wood")
            ModelInput("attr_fire")
            ModelInput("attr_earth")
            ModelInput("attr_metal")
            ModelInput("attr_water")
        self.lazy_group(StaticGroup("代码插入"), self.render_assembly_functions)

        # with Group("movement", "移动", (self._movement, models.Movement)):
        #     ModelInput("air_time")
        #     ModelInput("jump_height")
        #     ModelInput("move_speed_mult")
        #     ModelCoordWidget('coord', savable=True)

        with Group("movement", "变量", self.variable_model):
            ModelInput("jump_height", "跳跃高度")
Ejemplo n.º 2
0
    def render_main(self):
        person = (self._person, models.Character)

        with Group("player", "全局", self._global):
            ModelInput("money.money", "金钱")

        with Group("player", "角色", person):
            Choice("角色", tuple("play%d" % i for i in range(1, 5)),
                   self.weak.on_person_change)
            ModelInput("health")
            ModelInput("health_max")
            ModelCoordWidget("coord",
                             labels=('X坐标', 'Z坐标', 'Y坐标'),
                             savable=True)
            ModelCheckBox("invincible")

        self.lazy_group(
            Group("person_items", "角色物品", person, serializable=False, cols=4),
            self.render_person_items)
        self.lazy_group(
            Group("saved_items",
                  "整理界面物品",
                  self._saved_items,
                  serializable=False,
                  cols=6), self.render_saved_items)
        # self.lazy_group(StaticGroup("物品箱/宝物箱"), self.render_inventory_treasure_items)
        self.lazy_group(StaticGroup("代码插入"), self.render_assembly_functions)
Ejemplo n.º 3
0
    def render_main(self):
        with Group("global", "全局", self._global):
            ModelInput("growth_points", "成长点数")
            ModelInput("money_1p", "1p金钱")
            ModelInput("money_2p", "2p金钱")

        with Group("player", "我方角色", self.person, cols=4) as group:
            Choice("角色", ("1P", "2P"), self.on_person_change)

            for addr, name in models.PERSON_ATTRS:
                ModelInput(name)

        with group.footer:
            dialog_style = {'width': 1200, 'height': 900}
            with DialogGroup("items", "道具", self.itemholder, cols=4, dialog_style=dialog_style) as dialog_group:
                indexs = (0, 8, 1, 9, 2, 10, 3, 11, 4, 12, 5, 13, 6, 14, 7, 15)
                with ModelSelect.choices_cache:
                    for i in indexs:
                        ModelSelect("items.%d" % i, "道具%02d" % (i + 1), choices=datasets.ITEMS)
            with DialogGroup("skills", "技能", self.skillholder, dialog_style=dialog_style):
                values = [1 << i for i in range(7, -1, -1)]
                for i, labels in enumerate(datasets.SKILL_ITEMS):
                    ModelFlagWidget("have_%s" % (i + 1), "拥有", labels=labels, values=values, checkbtn=True, cols=4)
                    ModelFlagWidget("active_%s" % (i + 1), "激活", labels=labels, values=values, checkbtn=True, cols=4)

        with Group("enemy", "敌人", None, cols=4) as group:
            for addr, name in models.ENEMY_ATTRS:
                Input(name, None, addr, size=1)

        with StaticGroup("快捷键"):
            ui.Text("恢复HP: alt+h")
Ejemplo n.º 4
0
    def render_main(self):

        with Group("player", "角色", self._global):
            ModelCheckBox("x_invincible", "X无敌", enable=0xFF, disable=0)
            ModelCheckBox("zero_invincible", "ZEOR无敌", enable=0xFF, disable=0)
            ModelCheckBox("axl_invincible", "AXL无敌", enable=0xFF, disable=0)
            ModelInput("hp_axl", "AXL HP")
            ModelInput("hpmax_axl", "AXL最大HP")
            ModelInput("hp_x", "X HP")
            ModelInput("hpmax_x", "X最大HP")
            ModelInput("hp_zero", "ZERO HP")
            ModelInput("hpmax_zero", "ZERO最大HP")

        with Group("global", "全局", self._global):
            ModelInput("metal", "金属")
            ModelInput("resurgence", "复活晶片")
            ModelInput("joint_attack", "双人合击气槽")
            ModelCheckBox("zero_jump", "ZERO无限跳", enable=0x02, disable=0)
            ModelCheckBox("all_weapon", "解锁全部武器", enable=0xFF, disable=0)
            ModelCheckBox("super_x", "超级装甲X", enable=0xFF, disable=0)
            ModelCheckBox("back_zero_white_axl",
                          "暗黑ZERO和坠天使AXL",
                          enable=0xFF,
                          disable=0)
            ModelCheckBox("ultimate_x", "终极装甲X", enable=0xFF, disable=0)
Ejemplo n.º 5
0
    def render_main(self):
        with Group("global", "全局", self._global):
            ModelInput("money", "金钱")
            ModelInput("exp", "驾驶员经验")

        with Group("player", "我方角色", self.person, cols=4):
            Choice("角色", datasets.PARTNERS, self.on_person_change)
            ModelInput("ability", "机体类型(海陆空)及变身能力")
            ModelInput("spiritual_type", "精神类型")
            ModelSelect("robot", "机体图", choices=datasets.ROBOTS)
            ModelInput("map_y", "地图X坐标")
            ModelInput("map_x", "地图Y坐标")
            ModelInput("map_avatar", "地图头像")
            ModelSelect("weapon_1", "上武器", choices=datasets.WEAPONS)
            ModelSelect("weapon_2", "下武器", choices=datasets.WEAPONS)
            ModelInput("mobile", "机动")
            ModelInput("strength", "强度")
            ModelInput("defense", "防卫")
            ModelInput("speed", "速度")
            ModelInput("hp", "HP")
            ModelInput("hpmax", "HP上限")
            ModelInput("move", "行动次数")
            ModelInput("spiritual", "精神")
            ModelInput("spiritual_max", "精神上限")

        self.lazy_group(Group("items", "道具", None), self.render_items)
        # self.lazy_group(Group("weapons", "武器", self.weapon), self.render_weapons)

        # with Group("enemy", "敌人", None, cols=4):
        #     for addr, name in models.ENEMY_ATTRS:
        #         Input(name, None, addr, size=1)

        with StaticGroup("快捷键"):
            ui.Text("恢复HP: alt+h")
Ejemplo n.º 6
0
    def render_main(self):
        with Group("global", "全局", self._global):
            ModelInput("turn").set_help('0~1,下面会一直累加(慎用)')
            ModelInput("minutes")
            ModelInput("seconds_1")
            ModelInput("seconds_0")
            ModelInput("our_points")
            ModelInput("enemy_points")
            ModelInput("basketry_left_top")
            ModelInput("basketry_left_middle")
            ModelInput("basketry_left_bottom")
            ModelInput("basketry_right_top")
            ModelInput("basketry_right_middle")
            ModelInput("basketry_right_bottom")
            ModelInput("ball_owner").set_help('球在人手里(0~3),地上或空中(6)')

        with Group("player", "我方角色", self.person) as group:
            Choice("角色", ("1P", "2P", "3P", "4P"), self.on_person_change)

            # ModelInput("jump")
            # ModelInput("power")
            ModelInput("character").set_help('0~3')
            with ModelSelect.choices_cache:
                ModelSelect("equip_1", instance=self.equip_holder, choices=datasets.ITEMS)
                ModelSelect("equip_2", instance=self.equip_holder, choices=datasets.ITEMS)
                ModelSelect("equip_3", instance=self.equip_holder, choices=datasets.ITEMS)

        with StaticGroup("快捷键"):
            ui.Text("B: 获得球")
            ui.Text("N: 左边耐久置0")
            ui.Text("M: 球筐耐久恢复")
Ejemplo n.º 7
0
    def render_main(self):
        person = self.person
        chariot = self.chariot
        with Group("global", "全局", self._global):
            ModelInput("money", "金钱")
            ModelInput("battlein", "遇敌率")
            ModelCheckBox("battlein", "不遇敌", enable=0xFF, disable=0)

        with Group("player", "角色", person, cols=4):
            Choice("角色", datasets.PERSONS, self.on_person_change)
            ModelInput("level", "等级")
            ModelInput("hpmax", "HP上限")
            ModelInput("hp", "HP")
            ModelInput("atk", "攻击")
            ModelInput("defense", "守备")
            ModelInput("strength", "强度")
            ModelInput("intelli", "智力")
            ModelInput("stamina", "体力")
            ModelInput("speed", "速度")
            ModelInput("battle", "战斗")
            ModelInput("drive", "驾驶")
            ModelInput("fix", "修理")
            ModelInput("exp", "经验")

        self.lazy_group(Group("human_items", "角色装备/物品", person, cols=4), self.render_human_items)
        self.lazy_group(Group("chariot", "战车", chariot, cols=4), self.render_chariot)
        self.lazy_group(Group("chariot_items", "战车装备/物品", chariot, cols=4), self.render_chariot_items)

        with StaticGroup("快捷键"):
            ui.Text("左移: alt+left\n"
                "右移: alt+right\n"
                "上移: alt+up\n"
                "下移: alt+right\n"
                "恢复HP: alt+h")
Ejemplo n.º 8
0
    def render_main(self):
        character = (self._character, models.Character)
        team_config = (self._team_config, models.TeamConfig)
        weapon = (self._current_weapon, models.Weapon)

        with Group("global", "全局", self._global):
            self.render_global()
        self.lazy_group(Group("character", "角色", character, cols=4),
                        self.render_character)
        self.lazy_group(Group("character_ext", "角色额外", character),
                        self.render_character_ext)
        self.lazy_group(Group("vehicle", "载具", self._global),
                        self.render_vehicle)
        self.lazy_group(Group("ammo", "弹药", self._global, cols=4),
                        self.render_ammo)
        self.lazy_group(Group("weapon", "武器", weapon, cols=4),
                        self.render_weapon)
        self.lazy_group(Group("team", "团队", team_config, cols=4),
                        self.render_team)
        self.lazy_group(
            Groups("技能", self.weak.onNotePageChange, addr=team_config),
            self.render_skill)
        self.lazy_group(Group("drop_rates", "掉落率", None),
                        self.render_drop_rates)
        self.lazy_group(StaticGroup("代码插入"), self.render_assembly_functions)
        self.lazy_group(
            Group("assembly_variable", "代码变量", self.variable_model),
            self.render_assembly_variable)
        self.lazy_group(StaticGroup("快捷键"), self.render_hotkeys)
Ejemplo n.º 9
0
    def render_main(self):
        with Group("player", "角色", self.weak._player):
            self.render_player()

        self.lazy_group(Group("vehicle", "载具", self.weak._vehicle),
                        self.render_vehicle)
        self.lazy_group(Group("weapon", "武器槽", None), self.render_weapon)
        self.lazy_group(Group("global", "全局", 0, cols=4), self.render_global)
        self.lazy_group(StaticGroup("快捷键"), self.render_hotkey)
        self.lazy_group(StaticGroup("功能"), self.render_func)
        self.lazy_group(StaticGroup("工具"), self.render_tool)
Ejemplo n.º 10
0
    def render_main(self):
        with Group("global", "全局", self._global, horizontal=False):
            self.render_global()

        self.lazy_group(Group("shop", "商店购物", self._global), self.render_shop)
        self.backpack_group = Group("store",
                                    "背包",
                                    self._global,
                                    hasheader=True,
                                    cols=4)
        self.lazy_group(self.backpack_group, self.render_backpack)
        self.pokemon_group = StaticGroup("宝可梦")
        self.lazy_group(self.pokemon_group, self.render_pokemon)
Ejemplo n.º 11
0
    def render_main(self):
        datasets = self.datasets
        weak = self.weak

        with Group("global", "全局", self._global, cols=4):
            ModelInput("money")
            ModelInput("stamp")
            self.render_global_ext()

        self.lazy_group(Group("person", "角色", self.person, cols=4),
                        self.render_person)
        self.lazy_group(Group("person_ext", "角色额外", self.person, cols=4),
                        self.render_person_ext)
        self.lazy_group(Group("chariot", "战车", self.chariot, cols=4),
                        self.render_chariot)
        self.lazy_group(
            Group("chariot_items",
                  "战车物品/装备",
                  self.chariot,
                  cols=2 if self.has_holes else 4), self.render_chariot_items)
        self.lazy_group(Group("chariot_special_bullets", "特殊炮弹", self.chariot),
                        self.render_chariot_special_bullets)
        self.lazy_group(Group("battle_status", "战斗状态", self._global, cols=4),
                        self.render_battle_status)
        self.lazy_group(Group("enemy", "敌人", self.enemy, cols=4),
                        self.render_enemy)
        self.lazy_group(Groups("包裹", self.weak.onNotePageChange),
                        self.render_package_group)
        self.render_ext()

        with StaticGroup("功能"):
            self.render_functions(('enemy_weak', ))
Ejemplo n.º 12
0
    def render_main(self):
        with Group("player", "角色", self.weak._player):
            self.render_player()

        self.lazy_group(Group("vehicle", "载具", self.weak._vehicle),
                        self.render_vehicle)
        self.lazy_group(Group("weapon", "武器槽", None), self.render_weapon)
        self.lazy_group(Group("global", "全局", self), self.render_global)
        self.lazy_group(StaticGroup("快捷键"), self.render_hotkey)
        self.lazy_group(StaticGroup("载具模型"), self.render_vehicle_model)
        self.lazy_group(StaticGroup("功能"), self.render_func)

        with Group(None, "设置", None, hasfooter=False):
            self.render_config()
Ejemplo n.º 13
0
    def render_main(self):
        with Group("global", "全局", self._global):
            ModelInput("hp")
            ModelInput("hpmax")
            ModelInput("cpmax")
            ModelInput("exp")
            ModelInput("mp")
            ModelInput("dark")
            ModelInput("atk")
            ModelInput("battle_hp")
            ModelInput("battle_hpmax")
            ModelCheckBox("riku_enable")

        self.battle_cards_group = Group("battle_cards", "战斗卡片", self._global, cols=4)
        self.lazy_group(self.battle_cards_group, self.render_battle_cards)
Ejemplo n.º 14
0
 def render_sub_skill(data):
     i = 0
     for page in data:
         with Group(None, page[0], cols=4):
             for item in page[1]:
                 ModelInput('skill_mgr.skills.%d.status' % i, item)
                 i += 1
Ejemplo n.º 15
0
    def render_main(self):
        self._global = self.Global(0, self.handler)

        with Group("global", "全局", self._global):
            for item in self.fields:
                input = ModelInput(item.name)
                if item.max:
                    input.set_help('max:%d' % item.max)
Ejemplo n.º 16
0
 def render_main(self):
     with Group("global", "全局", self._global):
         ModelInput("lives")
         ModelInput("continues")
         ModelInput("score")
         ModelSelect("weapon", choices=WEAPONS)
         ModelCheckBox("invincible")
         ModelCheckBox("hit_anywhere")
Ejemplo n.º 17
0
    def render_main(self):
        self._global = Global(0, self.handler)

        with Group("global", "全局", self._global):
            ModelInput("invincible", "无敌时间(max:85)")
            ModelInput("hp", "血量(max:6)")
            ModelInput("lives", "生命(max:9)")
            ModelInput("money", "金钱")
Ejemplo n.º 18
0
    def render_main(self):
        with Group("global", "全局", self._global):
            ModelInput("money")
            ModelInput("turn")
            ModelInput("after_money")
            ModelInput("after_exp")
            ModelSelect("chapter", choices=datasets.CHAPTERS)

        with Group("robot", "机体", self.robot, cols=4):
            self.render_robot()

        with Group("pilot", "机师", self.pilot, cols=4):
            self.render_pilot()

        with StaticGroup("功能"):
            self.render_functions(('all_intensified_parts', 'all_mini_games',
                                   'all_skill_chip', 'all_move_10'))
Ejemplo n.º 19
0
    def render_main(self):
        with Group("global", "全局", self._global, cols=4):
            ModelInput("hp")
            ModelInput("hpmax")
            ModelInput("rupees")
            ModelInput("rupeesmax")
            ModelInput("bomb")
            ModelInput("array")
            ModelInput("conch")
            ModelSelect("weapon_a", choices=WEAPONS)
            ModelSelect("weapon_b", choices=WEAPONS)
            ModelSelect("bodysize", choices=("大", "小"), values=(0, 0x80))
            ModelCheckBox("all_scrolls")
            ModelCheckBox("all_skills")
            ModelCheckBox("all_map")

        self.lazy_group(Group("items", "物品", self._global), self.render_items)
Ejemplo n.º 20
0
    def render_battle_cards(self):
        with ModelSelect.choices_cache:
            for i in range(self.BATTLE_CARDS_PAGE_LENGTH):
                ModelSelect("battle_cards.%d+battle_cards_offset.card_type" % i, "", choices=BATTLE_CARDS)
                ModelSelect("battle_cards.%d+battle_cards_offset.card_value" % i, "",
                    choices=map(str, range(10)))

        with Group.active_group().footer:
            Pagination(self.on_battle_cards_page, self.BATTLE_CARDS_PAGE_TOTAL)
Ejemplo n.º 21
0
 def render_weapon(self):
     player = self.weak._player
     self.weapon_views = []
     for i in range(1, len(self.WEAPON_LIST)):
         self.weapon_views.append(
             WeaponWidget(player, "weapon%d" % i, "武器槽%d" % i, i,
                          self.SLOT_NO_AMMO, self.WEAPON_LIST))
     with Group.active_group().footer:
         ui.Button(label="一键最大", onclick=self.weapon_max)
Ejemplo n.º 22
0
    def render_package_group(self):
        datasets = self.datasets

        def on_page_change(self, page, item=None):
            setattr(self._global, "{}_offset".format(item['key']),
                    (page - 1) * self.IREM_PAGE_LENGTH)
            item['group'].read()

        def render_items(self, item=None):
            with ModelSelect.choices_cache:
                for i in range(self.IREM_PAGE_LENGTH):
                    ModelSelect("{0}.{1}+{0}_offset.item".format(
                        item['key'], i),
                                "",
                                choices=item['source'].choices,
                                values=item['source'].values)
                    ModelInput(
                        "{0}.{1}+{0}_offset.count".format(item['key'], i),
                        "数量")
            with Group.active_group().footer:
                Pagination(partial(on_page_change, self.weak, item=item),
                           item['page_count'])

        for item in (
            {
                'key': 'humen_items',
                'label': '道具',
                'source': datasets.HUMEN_ITEM,
                'page_count': 25
            },
            {
                'key': 'potions',
                'label': '恢复道具',
                'source': datasets.POTION,
                'page_count': 3
            },
            {
                'key': 'battle_items',
                'label': '战斗道具',
                'source': datasets.BATTLE_ITEM,
                'page_count': 6
            },
            {
                'key': 'equips',
                'label': '装备',
                'source': datasets.ALL_EQUIP,
                'page_count': 45
            },
        ):
            item['group'] = Group(item['key'],
                                  item['label'],
                                  self._global,
                                  cols=4)
            self.lazy_group(item['group'],
                            partial(render_items, self.weak, item=item))
            setattr(self._global, "{}_offset".format(item['key']), 0)
Ejemplo n.º 23
0
    def render_pokemon(self):
        # pokemon = self.weak._pokemon
        active_pokemon = self._active_pokemon

        ui.RadioBox("带着的宝可梦",
                    className="expand",
                    choices=tuple(str(i) for i in range(1, 7)),
                    onselect=self.on_active_pokemo_swith)

        with Groups(None, self.weak.onNotePageChange):
            with Group("basic", "基本", active_pokemon):
                ModelInput("breedInfo.bIntimate", "亲密度", spin=True, max=255)
                ModelSelect("breedInfo.wBreed",
                            "种族",
                            choices=self.datasets.BREED_NAMES)
                ModelInput("Header.dwChar", "性格值", hex=True)
                ModelInput("Header.dwID", "ID", hex=True)
                ModelSelect("personality",
                            "性格",
                            choices=self.datasets.PERSONALITYS,
                            onselect=self.on_personality_select)
                ui.Text("性格描述", className="vcenter")
                self.personality_desc = ui.Text("", className="vcenter")
                ModelSelect("breedInfo.wItem",
                            "手持道具",
                            choices=self.datasets.ITEMS)
                ModelInput("breedInfo.dwExp", "经验值")
            with Group("basic", "能力", active_pokemon):
                pass
            with Group("basic", "技能", active_pokemon):
                pass
            with Group("basic", "缎带", active_pokemon):
                pass
            with Group("basic", "其它", active_pokemon):
                pass

        with ui.Horizontal(className="expand"):
            ui.Button("读入",
                      className="btn_sm",
                      onclick=self.read_active_pokemon)
            ui.Button("写回",
                      className="btn_sm",
                      onclick=self.write_active_pokemon)
Ejemplo n.º 24
0
    def render_main(self):
        self._global = Global(0, self.handler)

        with Group("global", "全局", self._global):
            ModelCheckBox("invincible_1", "1P无敌", enable=0xff, disable=0)
            ModelCheckBox("invincible_2", "2P无敌", enable=0xff, disable=0)
            ModelSelect("weapon_1", "1P武器", choices=BULLETS, values=BULLET_VALUES)
            ModelSelect("weapon_2", "2P武器", choices=BULLETS, values=BULLET_VALUES)
            ModelInput("lives_1", "1P生命")
            ModelInput("lives_2", "2P生命")
Ejemplo n.º 25
0
 def render_train_items(self):
     datasets = self.datasets
     with ModelSelect.choices_cache:
         for i in range(10):
             ModelSelect("train_items.%d+train_items_offset.item" % i,
                         "",
                         choices=datasets.ITEMS)
             ModelInput("train_items.%d+train_items_offset.count" % i, "数量")
     with Group.active_group().footer:
         Pagination(self.on_train_items_page, self.TRAIN_ITEMS_PAGE_TOTAL)
Ejemplo n.º 26
0
    def render_main(self):
        self._global = Global(0, self.handler)

        with Group("global", "全局", self._global):
            ModelInput("hp", "HP")
            ModelInput("hpmax", "最大HP")
            ModelCheckBox("invincible", "无敌", enable=0xFF, disable=0)
            ModelSelect("dragon", "当前龙", choices=DRAGONS)

        with StaticGroup("功能"):
            self.render_functions(('hp_max', 'all_dragons', 'all_tools'))
Ejemplo n.º 27
0
    def render_main(self):
        self._global = Global(0, self.handler)

        with Group("global", "全局", self._global):
            ModelInput("bomb_count")
            ModelInput("bomb_power")
            ModelInput("level")
            ModelInput("invincible")
            ModelCheckBox("through_bomb")
            ModelCheckBox("timebomb")
            ModelCheckBox("through_wall")
Ejemplo n.º 28
0
    def render_main(self):
        self._global = Global(0, self.handler)

        with Group("global", "全局", self._global):
            ModelInput("lives_1", "1P生命")
            ModelInput("lives_2", "2P生命")
            ModelCheckBox("invincible_1", "1P无敌", enable=0xFF, disable=0)
            ModelCheckBox("invincible_2", "2P无敌", enable=0xFF, disable=0)
            # ModelInput("level", "关卡(0-4)")
            ModelFlagWidget("medicine_1", "1P药水效果", labels=MEDICINE)
            ModelFlagWidget("medicine_2", "2P药水效果", labels=MEDICINE)
Ejemplo n.º 29
0
    def render_main(self):
        self._global = Global(0, self.handler)

        with Group("global", "全局", self._global):
            ModelInput("hp", "HP(max:47)")
            ModelInput("star", "星星")
            ModelInput("lives", "生命")
            # ModelInput("credits", "分数")
            ModelCheckBox("invincible", "闪光无敌")
            ModelCheckBox("invincible2", "状态无敌")
            ModelInput("form", "形态")
            ModelSelect("ability", "能力", choices=ABILITY)
Ejemplo n.º 30
0
    def render_main(self):
        with Group("global", "全局", self._global):
            ModelInput("time", "时间")
            ModelInput("money", "金钱")
            ModelInput("get_money", "战后金钱")
            ModelInput("get_exp", "战后经验")
            ModelInput("battlein", "遇敌率")
            ModelCoordWidget("town_pos",
                             "城镇坐标",
                             length=2,
                             type=int,
                             savable=True,
                             preset=self.coords)
            ModelCoordWidget("map_pos",
                             "地图坐标",
                             length=2,
                             type=int,
                             savable=True,
                             preset=self.coords)

        self.lazy_group(Group("player", "角色", self.person, cols=4),
                        self.render_person)
        self.skills_group = Group("skills", "角色精神力", self.person)
        self.lazy_group(self.skills_group, self.render_skills)
        self.lazy_group(Group("skills", "角色物品", self.person, cols=4),
                        self.render_items)
        self.lazy_group(Group("djinnis", "角色精灵", self.person),
                        self.render_djinnis)
        self.lazy_group(StaticGroup("快捷键"), self.render_hotkeys)