def usage_menu(ctrl): ret = [ ui.menuitem("使用", value=0, validator=ctrl.validator, goto=ctrl.select), ui.menuitem("给与", value=1, validator=ctrl.validator, goto=ctrl.select), ui.menuitem("丢弃", value=2, goto=ctrl.select) ] return ret
def load_map(arg): ret = [ui.menuitem("另存为")] for file in os.listdir("%s/../../data/maps" % os.path.dirname(__file__)): if not file.endswith(".py") or file.startswith("__init__.py"): continue ret.append(ui.menuitem(file[:-3], goto=lambda x: load_map_module(x))) ui.menu(ret, goback=True)
def item_menu(ctrl): smenu = [] for itm, person, valid in ctrl.items: suffix_list = [] if len(ctrl.persons) > 1: suffix_list.append("持有人:%s" % ui.colored(person.name, attrs=["bold"])) if "Equip" in itm.tags: suffix_list.append("数量:1,耐久度:%s/%s" % (itm.durability_current, itm.durability)) else: suffix_list.append("数量:%s" % person.quantities[itm.tpl_id]) if ctrl.showmoney and itm.tpl_id != "ITEM_MONEY": if ctrl.moneystyle == 0: money_num = itm.money else: money_num = int(itm.money * 0.4) suffix_list.append("价值:%s" % ui.byellow(money_num)) if itm in person.equipment: suffix_list.append(ui.colored("装备中", color="green")) suffix = "(%s)" % ",".join(suffix_list) if not valid: mitem = ui.menuitem(itm.name + ui.bgrey(suffix), value=(itm, person), validator=lambda x: False) else: comments = ui.item(itm) mitem = ui.menuitem(ui.rank(itm) + suffix, comments=comments, value=(itm, person), goto=ctrl.select) smenu.append(mitem) return smenu
def element_menu(ctrl): ret = [ ui.menuitem("建筑", value="ELEMENT_BUILDING", goto=ctrl.select), ui.menuitem("城墙", value="ELEMENT_WALL", goto=ctrl.select), ui.menuitem("塔楼", value="ELEMENT_TOWER", goto=ctrl.select), ui.menuitem("岩石", value="ELEMENT_ROCK", goto=ctrl.select) ] return ret
def transport_menu(ctrl): targets = ctrl.targets tmenu = [] tmenu.append(ui.menuitem("留在原处", value="", goto=ctrl.select)) for target in targets: tmenu.append( ui.menuitem("前往%s" % target["name"], value=(target["scenario"], target["location"]), goto=ctrl.select)) return tmenu
def world_menu(team): title = ui.colored("队员一览:%s队" % team.leader.name, color="yellow", attrs=["bold"]) ret = [ ui.menuitem("移动", goto=lambda x: WorldMovePositionOrder()), ui.menuitem("交谈", goto=lambda x: WorldTalkPositionOrder()), ui.menuitem("赠与", goto=lambda x: WorldGivePositionOrder()), ui.menuitem("探索", goto=lambda x: WorldExplorePositionOrder()), ui.menuitem("建设", goto=lambda x: WorldBuildPositionOrder()), ui.menuitem("攻击", goto=lambda x: WorldAttackPositionOrder()), ui.menuitem("休息", goto=lambda x: WorldRestOrder()), ui.menuitem( "队伍", goto=lambda x: ui.menu(member_menu(), title=title, goback=True, backmethod=lambda: WorldPlayerOrder())), ui.menuitem( "系统", goto=lambda x: ui.menu(system_menu, columns=2, width=15, goback=True, backmethod=lambda: WorldPlayerOrder())) ] return ret
def handler_superskill_select_control(ctrl): skmenu = [] for sk in ctrl.superskills: comments = [Item.one("ITEM_%s" % sk.tpl_id[11:]).description] skmenu.append( ui.menuitem(ui.rank(sk), value=sk, comments=comments, goto=ctrl.select)) skmenu.append(ui.menuitem("离开", value='', goto=ctrl.select)) ui.menu(skmenu, title=ctrl.title)
def build_menu(person, pos): bmenu = [ ui.menuitem( "建造建筑", goto=lambda x: ui.menu(buildings_menu(person, pos), goback=True)), ui.menuitem( "拆除建筑", goto=lambda x: ui.menu(buildings_menu(person, pos), goback=True)), ui.menuitem( "改造地形", goto=lambda x: ui.menu(terran_menu(person, pos), goback=True)) ] return bmenu
def list_modules(arg, map_func, newbuild=False): ret = [] if newbuild: ret.append(ui.menuitem("新建地图组", goto=lambda x: new_module(x, map_func))) for file in os.listdir("%s/../../data/maps" % os.path.dirname(__file__)): if not file.endswith(".py") or file.startswith("__init__.py"): continue ret.append( ui.menuitem(file[:-3], goto=lambda x: list_maps(x, map_func, newbuild))) ui.echo() ui.menu(ret, title="请选择目标地图组:", goback=True)
def team_menu(p): ret = [ ui.menuitem("状态", value=p, goto=lambda x: profile(x)), ui.menuitem( "物品", value=p, goto=lambda x: PersonItemChooseOrder(subject=x, quantity=1, candidates=x.team.members, order=PersonItemOrder)), ui.menuitem("转移", value=p, goto=lambda x: PersonItemChooseOrder( subject=x, candidates=x.team.members, order=PersonItemTransferOrder)), ui.menuitem("技能", value=p, goto=lambda x: PersonSkillOrder(subject=x)), ui.menuitem("装备", value=p, goto=lambda x: PersonEquipmentOrder(subject=x)), ui.menuitem("配方", value=p, goto=lambda x: PersonRecipeChooseOrder(subject=x)), ui.menuitem("切磋"), ui.menuitem("离队", validator=lambda x: False) ] return ret
def equip_menu(person): emenu = [ ui.menuitem( "主手卸下", goto=lambda x: PersonEquipOffOrder(subject=person, position=0)), ui.menuitem("主手装上", goto=lambda x: PersonItemChooseOrder( subject=person, persons=[person], object=person, quantity=1, order=PersonEquipOnOrder, orderarg={"position": 0}, tags=set(["Weapon"]), backmethod=lambda: PersonEquipmentOrder( subject=self.subject, fromoff=True))), ui.menuitem( "副手卸下", goto=lambda x: PersonEquipOffOrder(subject=person, position=1)), ui.menuitem("副手装上", goto=lambda x: PersonItemChooseOrder( subject=person, persons=[person], object=person, quantity=1, order=PersonEquipOnOrder, orderarg={"position": 1}, tags=set(["Weapon"]), backmethod=lambda: PersonEquipmentOrder( subject=self.subject, fromoff=True))), ui.menuitem( "身体卸下", goto=lambda x: PersonEquipOffOrder(subject=person, position=2)), ui.menuitem("身体装上", goto=lambda x: PersonItemChooseOrder( subject=person, persons=[person], object=person, quantity=1, order=PersonEquipOnOrder, orderarg={"position": 2}, tags=set(["Armor"]), backmethod=lambda: PersonEquipmentOrder( subject=self.subject, fromoff=True))), ui.menuitem( "饰品卸下", goto=lambda x: PersonEquipOffOrder(subject=person, position=3)), ui.menuitem("饰品装上", goto=lambda x: PersonItemChooseOrder( subject=person, persons=[person], object=person, quantity=1, order=PersonEquipOnOrder, orderarg={"position": 3}, tags=set(["Ornament"]), backmethod=lambda: PersonEquipmentOrder( subject=self.subject, fromoff=True))) ] return emenu
def files_menu(func, allow_new=False): load_menu = [] if allow_new: load_menu.append(ui.menuitem("新建存档", goto=lambda x: new_file(func))) loaddir = options.SAVEFILE_PATH for itm in os.listdir(loaddir): apath = loaddir + "/" + itm if not apath.endswith(".savefile"): continue mtime = os.stat(apath).st_mtime mtime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(mtime)) showword = "%s (%s)" % (itm, mtime) load_menu.append( ui.menuitem(showword, value=apath, goto=lambda x: func(x))) ui.menu(load_menu, title="当前可用存档:", goback=True)
def list_maps(arg, map_func, newbuild=False): ret = [] if newbuild: ret.append(ui.menuitem("新建地图", goto=lambda x: new_map(x, map_func))) nomod = False try: globals.MAP_MODULE = importlib.import_module("proj.data.maps.%s" % arg) except Exception as e: nomod = True if not nomod: for m in dir(globals.MAP_MODULE): if not m.startswith("MAP_"): continue ret.append(ui.menuitem(m, value=m, goto=lambda x: map_func(x))) ui.echo() ui.menu(ret, title="请选择目标地图:", goback=True)
def handler_item_inlay_select_control(ctrl): imenu = [] for idx, inlay in enumerate(ctrl.item.inlays): enabled = "filled" not in inlay if enabled: name_str = inlay["name"] comments = [ "接受材料:%s" % "、".join([ui.tag(acp) for acp in inlay["accept"]]) ] validator = lambda x: True else: name_str = inlay["name"] comments = ["已强化:%s" % ui.rank(inlay["filled"])] comments.extend([ ui.effect(effe, grey=True) for effe in inlay["filled"].effects if effe.name is not None ]) validator = lambda x: False imenu.append( ui.menuitem(name_str, value=idx, comments=comments, validator=validator, goto=ctrl.select)) ret = ui.menu(imenu, title="请选择你要强化的部位:", goback=True, backmethod=ctrl.close) return ret
def item_menu(persons, obj, tags=None, showmoney=False, moneystyle=0, show_comments=True, filter=None): smenu = [] for person in persons: for itm in person.items: show_state = 0 if filter is not None: show_state = filter(person, obj, itm, tags) if show_state == 2: continue suffix_list = [] if len(persons) > 1: suffix_list.append("持有人:%s" % ui.colored(person.name, attrs=["bold"])) if "Equip" in itm.tags: suffix_list.append("数量:1,耐久度:%s/%s" % (itm.durability_current, itm.durability)) else: suffix_list.append("数量:%s" % person.quantities[itm.tpl_id]) if showmoney and itm.tpl_id != "ITEM_MONEY": suffix_list.append("价值:%s" % ui.colored( itm.money if moneystyle == 0 else int(itm.money * 0.4), color="yellow", attrs=["bold"])) if itm in person.equipment: suffix_list.append(ui.colored("装备中", color="green")) suffix = "(%s)" % ",".join(suffix_list) if show_state == 1: mitem = ui.menuitem( ui.rank(itm) + ui.colored(suffix, color="grey", attrs=["bold"]), value=(itm, person), validator=lambda x: False) elif show_comments: comments = ui.item(itm) mitem = ui.menuitem(ui.rank(itm) + suffix, comments=comments, value=(itm, person)) else: mitem = ui.menuitem(ui.rank(itm) + suffix, value=(itm, person)) smenu.append(mitem) return smenu
def editor_menu(ctrl): ret = [ ui.menuitem("地形", goto=ctrl.terran), ui.menuitem("物件", goto=ctrl.element), ui.menuitem("人物", goto=ctrl.person), ui.menuitem("擦除", goto=ctrl.erase), ui.menuitem("裁扩", goto=ctrl.resize), ui.menuitem("坐标", goto=ctrl.coordinate), ui.menuitem("缩略", goto=ctrl.thumbnail), ui.menuitem("镜头", goto=ctrl.camera), ui.menuitem("保存", goto=ctrl.save) ] return ret
def person_menu(point, map, include_self=False): ret = [] team = map.loc_entity[point] for m in team.members: if m == context.PLAYER and not include_self: continue ret.append(ui.menuitem(m.name, value=m)) return ret
def task_menu(): tmenu = [] for t in context.tasks_index: tlist = context.tasks[t] bold = context.tasks_status[t] tmenu.append( ui.menuitem(t, value=(t, tlist), bold=bold, goto=task_method)) return tmenu
def handler_explore_tool_select_control(ctrl): i_menu = item_menu(ctrl) i_menu.insert( 0, ui.menuitem("徒手", value=(None, ctrl.team.leader), goto=ctrl.select)) ui.menu(i_menu, title=ui.byellow(ctrl.title), goback=True, backmethod=ctrl.close)
def handler_world_explore_tool(ctx): itm_menu = [ui.menuitem("徒手", value="")] itm_menu.extend(item_menu(ctx.subject.members, None, filter=ctx.filter)) if len(itm_menu) == 1: ret = itm_menu[0].value else: ret = ui.menu(itm_menu, title="以下工具可用于该地块探索:", goback=True) return ret
def handler_world_attack_select(ctx): ret = ui.menu([ui.menuitem(m.name, value=m) for m in ctx.subject.members], title=ui.colored("请选择需要出战的角色:", color="yellow", attrs=["bold"]), multiple=True, multiple_range=[1, ctx.number]) return ret
def skill_menu(ctrl): smenu = [] skills = ctrl.skills for sk, errormsg in skills: comments = [ui.skill(sk)] for effe in sk.effects: comments.append(ui.effect(effe)) if errormsg is None: sk_str = "%s:%s" % (ui.rank(sk.belongs), ui.rank(sk)) smenu.append( ui.menuitem(sk_str, comments=comments, value=sk, goto=ctrl.select)) else: sk_str = "%s:%s(%s)" % (sk.belongs.name, sk.name, errormsg) smenu.append(ui.menuitem(sk_str, validator=lambda x: False)) return smenu
def skill_menu(person): smenu = [] for sk in person.skills: sk_str = "%s:%s" % (ui.rank(sk.belongs), ui.rank(sk)) comments = [ui.skill(sk)] for effe in sk.effects: comments.append(ui.effect(effe)) smenu.append(ui.menuitem(sk_str, comments=comments, value=sk)) return smenu
def handler_person_item_object(ctx): person_menu = [] for c in ctx.candidates: person_menu.append(ui.menuitem(c.name, value=c)) if len(person_menu) == 1: return person_menu[0].value else: ret = ui.menu(person_menu, title="你选择你要作用的人物:", goback=True) return ret
def superskill_menu(ctrl): superskill = ctrl.superskill person = ctrl.person ret = [] for idx, nd in enumerate(superskill.nodes): learn_sts = superskill.learn_status(person, idx) enable = True if learn_sts == -1: nd_str = nd.name + ui.nodecond(nd) enable = False elif learn_sts == 0: nd_str = nd.name + "(已习得)" enable = False elif nd == person.studying: nd_str = nd.name + "(修炼中)" enable = False else: nd_str = nd.name comments = [nd.description] grey = not enable for nt in nd.tags: if nt.startswith("SKILL_"): sk = Skill.one(nt) if "Neigong" not in sk.style: comments.append(ui.skill(sk, grey=grey)) for effe in sk.effects: comments.append(ui.effect(effe, grey=grey)) else: for effe in sk.effects: comments.append(ui.effect(effe.exertion, grey=grey)) if enable: ret.append( ui.menuitem(nd_str, value=nd, comments=comments, goto=ctrl.select)) else: ret.append( ui.menuitem(nd_str, value=nd, comments=comments, validator=lambda x: False)) return ret
def equip_menu(ctrl): emenu = [ ui.menuitem("主手卸下", value=0, goto=ctrl.equip_off), ui.menuitem("主手装上", value=(0, set(["Weapon"])), goto=ctrl.equip_on), ui.menuitem("副手卸下", value=1, goto=ctrl.equip_off), ui.menuitem("副手装上", value=(1, set(["Weapon"])), goto=ctrl.equip_on), ui.menuitem("身体卸下", value=2, goto=ctrl.equip_off), ui.menuitem("身体装上", value=(2, set(["Armor"])), goto=ctrl.equip_on), ui.menuitem("饰品卸下", value=3, goto=ctrl.equip_off), ui.menuitem("饰品装上", value=(3, set(["Ornament"])), goto=ctrl.equip_on) ] return emenu
def resize_menu(ctrl): ret = [ ui.menuitem("左边界扩展", value=("x", 1, True), goto=ctrl.select), ui.menuitem("左边界剪裁", value=("x", -1, True), goto=ctrl.select), ui.menuitem("右边界扩展", value=("x", 1, False), goto=ctrl.select), ui.menuitem("右边界剪裁", value=("x", -1, False), goto=ctrl.select), ui.menuitem("上边界扩展", value=("y", 1, True), goto=ctrl.select), ui.menuitem("上边界剪裁", value=("y", -1, True), goto=ctrl.select), ui.menuitem("下边界扩展", value=("y", 1, False), goto=ctrl.select), ui.menuitem("下边界剪裁", value=("y", -1, False), goto=ctrl.select) ] return ret
def recipe_menu(ctrl): str_list = [ "一", "二", "三", "四", "五", "六", "七", "八", "九", ] rmenu = [] for idx, ownerrecipe in enumerate(ctrl.recipes): owner, recipe = ownerrecipe enabled = recipe.check(ctrl.persons) if len(recipe.materials) == 0: comments = ["无"] else: comments = [",".join(["任意%s" % ui.tag(k) if isinstance(k, str) else ui.rank(k, grey=not enabled) + ui.colored("×%s" % v, color=None if enabled else "grey", attrs=None if enabled else ["bold"]) \ for k, v in recipe.materials])] showword = ("方案%s" % str_list[idx]) if ctrl.sub else recipe.name suffix = [] if enabled: if not ctrl.sub: suffix.append("持有人:%s" % owner.name) if owner not in ctrl.persons: suffix.append( "费用:%s" % ui.byellow(str(25 + recipe.tmpdict.get("money", 0)))) if len(suffix) > 0: showword += "(%s)" % ",".join(suffix) mitem = ui.menuitem(showword, value=(owner, recipe), comments=comments, goto=ctrl.select) else: mitem = ui.menuitem(showword + "(材料不足)", comments=comments, validator=lambda x: False) rmenu.append(mitem) return rmenu
def handler_person_select_control(ctrl): person_menu = [] for c in ctrl.candidates: person_menu.append(ui.menuitem(c.name, value=c, goto=ctrl.select)) if len(person_menu) == 1 and ctrl.canskip: ctrl.select(person_menu[0].value) else: ret = ui.menu(person_menu, title=ui.byellow(ctrl.title), goback=True, backmethod=ctrl.close)
def handler_person_dialog_branch(ctx): menulist = [] ui.echo("%s:" % ctx.subject.name) for b in ctx.branches: bold = ctx.name not in context.script_status or \ b not in context.script_status[ctx.name] menulist.append( ui.menuitem(ctx.conversation[b]["content"], value=b, bold=bold)) ret = ui.menu(menulist) ui.echo() return ret