def select_ban(): #选择禁用 a.page() a.mode() a.t('敬请期待') a.t() a.b('困顿', a.goto, select_difficulty)
def status_bar(): data = a.tmp() succubus = data['succubus'] a.divider() #状态栏 a.mode('grid', 4) a.t('第{}天'.format(a.tmp()['day'])) a.t('{}'.format(a.tmp()['day_time']), style={'color': '#ff0'}) a.t() a.t('{}'.format(a.tmp()['succubus'].name)) a.t() a.t('{}G'.format(a.tmp()['money'])) a.t() a.t('{}ml'.format(a.tmp()['s***n'])) a.t() a.t('level:{}'.format(succubus.level)) a.t() a.t('生命') a.progress(succubus.health, succubus.max_health, [{ 'width': '100px' }, { 'background-color': '#0f0' }]) a.t('{}/{}'.format(succubus.health, succubus.max_health)) a.t() a.t('俘虏:{}'.format(len(data['prisoner_list']))) a.t() a.t('succubus:{}'.format(len(data['family_list'])))
def think(): a.page() a.t('你稍加思索,很快便得出了结论。', True) a.t() a.t('那椅子上的活物,没有错的话,', True) a.t() a.t('应该是一位熟睡的') a.t('少女', style={'color': 'red'}) a.t('。', True) a.t() a.t('因为你触碰到了她的身体,闻到了少女特有的香气。', True) a.t() a.t('你继续进行着调查,发现自己的推论完全正确。', True) a.t() a.t('甚至还有更加惊人的发现……', True) a.t() a.t('这个少女是被绑在了椅子上!', True) a.t() a.t('而且她的神智似乎也要渐渐恢复了。', True) a.t() a.t('这时候,你选择……', True) a.t() a.page() a.mode('grid', 1) a.t() a.t() a.t('未完待续……') a.t() a.t() a.b('打群主!', a.goto, bit)
def title(): a.page() a.mode('grid', 1) a.h('主页面') a.t() a.b('新的旅程', a.goto, creat_new_game.select_succubus) a.t()
def select_inherit(): #选择继承 a.page() a.mode() a.t('敬请期待') a.t() a.b('绝缘', a.goto, select_ban)
def select_location(): #选择出生地 def change_location(selection): # description = a.dat()['location'][location['value']]['description'] # a.t(description) a.tmp()['location_mode'] = selection['index'] a.repeat() pass a.page() a.mode('grid', 1) a.t('何处?') a.divider() a.mode() a.t() a.t() a.radio(['平原'], change_location, a.tmp()['location_mode']) a.t() description = a.dat()['location'][a.tmp()['location_mode']]['description'] a.t(description) a.t() a.divider() a.b('下一步', a.goto, select_inherit) a.t() a.b('何人?', a.back)
def bit(): a.page() a.mode('grid', 1) a.t() a.t() a.t('群主:“哎呀哎呀别打啦!”') a.t() a.t() a.b('好吧,饶你一命', a.goto, goon)
def sys_buttons(): a.divider() a.mode('grid', 4) a.b('存档', a.goto, save_button) a.t() a.b('读档', a.goto, load_button) a.t() a.b('设置', a.goto, settings) a.t() a.b('放弃', a.goto, giveup)
def ui_code(): a.page() a.mode('grid', 1) a.h('代码组织教程') a.t() a.t() a.t('和以前是一样的嘛!') a.t() a.t() a.b('也就是说还没写咯?', a.back)
def ui_mod(): def rest(): a.msg('我会很快搞定的,等我!') a.back() a.page() a.mode('grid', 1) a.h('我还没想好怎么写教程……') a.t() a.t() a.b('我先暂时不用吧', rest)
def fate_map(): #每日走向选择展示 a.divider(text='前路') a.mode('grid', 10) random_create() for i in range(1, 20 + 1): for j in range(0, 10): card = fate_card(a.tmp()['fate_map'][21 - i][j]) card.print_card(is_able=True) #a.t(a.tmp()['fate_map'][i][j]) 测试用 a.t()
def main(): time.sleep(1) a.init() a.mode('grid', 1) a.h('Succubus Dungeon') a.t() a.t() a.t('version {}'.format(version)) a.t() a.b('♥', a.goto, title) a.t() a.b('测试用', a.goto, test)
def ui_egg(): """ 作者:@Miswanting """ a.clear() for pic in a.data['data.ba']: a.page() a.mode('grid', 1, compact=True) for line in pic: a.t(line) a.t() time.sleep(0.1) a.clear() ui_grid_2()
def show_main(): #此处为测试用界面0.1 data = a.tmp() succubus = data['succubus'] a.page() a.mode() a.t('此处为主界面') status_bar() #状态栏 #考虑放置每日三选一计划或者是地宫结构图? fate_map() #考虑放置一些检查选项,如检查设施情况,查看配方,已经拥有的遗物,查看地宫结构等。 check_buttons() #考虑放置系统相关,如设置,存读档案,回到标题,放弃等 sys_buttons()
def ui_line_mode(): # 默认模式(左对齐) a.page() a.mode() a.h('一、默认排版(左对齐)') a.t() a.t('由a.mode()切换排版模式。当前是默认排版,所有控件从左往右排列,使用a.t()进行换行。') a.divider() a.t('【普通文字】') a.t('【未换行】') a.t() a.t('【已换行】') a.t() a.t() a.divider() a.b('下一页', ui_grid_mode) a.t() a.t() a.b('返回', a.back)
def cover(): a.title('EraDemo') a.dat()['123'] = 1 print(a.dat()) a.page() a.mode('grid', 1) a.h('EraDemo') a.t() a.t() a.b('新的游戏', a.goto, new_game) a.t() a.t() a.b('继续游戏') a.t() a.t() a.b('游戏设置') a.t() a.t() a.b('退出游戏')
def check_buttons(): #考虑放置一些检查选项,如检查设施情况,查看配方,已经拥有的遗物,查看地宫结构等。 a.divider(text='查看') a.mode('grid', 5) a.b('拥有怪物', a.goto, check_monster) a.t() a.b('地宫设施', a.goto, check_facility) a.t() a.b('俘虏', a.goto, check_prisoner) a.t() a.b('眷族', a.goto, check_family) a.t() a.b('配方', a.goto, check_formula) a.t() a.b('遗物', a.goto, check_reliquary) a.t() a.b('杂项', a.goto, check_information) a.t() a.b('图鉴', a.goto, check_Illustrated)
def select_succubus(number=0): #选择起源模板 def goto_select_location(number): a.tmp()['succubus'] = succubus(number) a.tmp()['succubus_mode'] = number a.tmp()['location_mode'] = 0 a.goto(select_location) a.page() a.mode('grid', 1) a.h('起源') a.t() a.divider() a.mode('grid', 3) a.b('<--', change_number, -1) a.t() a.t('何人?') a.t() a.b('-->', change_number, 1) a.divider() a.mode('grid', 3) selected_mode = succubus() a.t() a.h(selected_mode.name, style={'opacity': '0.6'}) a.t() a.t() a.t('生命:{}'.format(selected_mode.health)) a.t() a.t('攻击:{}'.format(selected_mode.atk)) a.t() a.t('防御:{}'.format(selected_mode.dEf)) for i in range(3): a.t() a.t() a.t() a.t(selected_mode.description, style={'font-style': 'italic'}) a.t() for i in range(3): a.t() a.t() a.t() a.b('何处?', goto_select_location, number) a.t() a.divider() a.mode() a.b('沉睡', a.back)
def test(number=1): a.page() a.mode() x = succubus() a.t(x.name) a.t() a.mode('grid', 1) for i in range(0, 10): a.t('┏') for j in range(0, len('┃ ☢ ┃')): a.t('━') a.t('┓') a.t() a.t('┃[☢]┃') a.t() a.t('┗') for j in range(0, len('┃ ☢ ┃')): a.t('━') a.t('┛') a.t()
def ui_grid_mode(): # 网格模式(三列) a.page() a.h('二、网格模式(三列)') a.t() a.t('由a.mode("grid", 3)切换到3列的网格模式,单元格内不支持换行,换行a.t()在这里代表的是换下一单元格。') a.divider() a.mode('grid', 3) a.t('【文字】') a.t('【同单元格的文字】') a.t() a.t('【下一单元格的文字】') a.t() a.t('【摩多摩多】') a.t() a.t('【摩多摩多】') a.t() a.divider() a.mode() a.b('下一页', ui_center_mode) a.t() a.b('返回', a.back)
def select_difficulty(): def goto_difficulty(difficulty): a.clear() #初始化新游戏,考虑之后用一个函数代替,此处先作测试用途 a.tmp()['day'] = 1 a.tmp()['money'] = 0 a.tmp()['s***n'] = 0 a.tmp()['day_time'] = '日间' a.tmp()['prisoner_list'] = [] a.tmp()['family_list'] = [] a.tmp()['difficulty'] = difficulty show_main() #选择难度 a.page() a.mode('grid', 1) a.h('前往哪一个世界?') a.divider() a.mode() #此处放置难度世界列表 a.b('普通', goto_difficulty, 1) a.divider() a.mode('line', 1) a.b('返回', a.back)
def action(type): a.page() if type == 'polite': a.t('你轻声说:“你好,请不要紧张,我不会伤害你的。”', True) a.t() a.t('少女疑惑地睁大了双眼:“你有病吧?快来干我!”', True) a.t() a.t('你:“???(黑人问号)”', True) a.page() a.mode('grid', 1) a.t() a.t() a.h('你死了') a.t() a.t() a.t('获得成就:《???》') a.t() a.t() a.b('重新开始', a.back, 5) elif type == 'direct': a.t('你说:“嘘……', True) a.t('想活命的话就别出声,', True) a.t('明白吗?”', True) a.t() a.t('少女迷茫地看着你,似乎', True) elif type == 'rude': a.t('你一个箭步冲上去,用手捂住她的嘴,在她还没反应过来之前就完全控制住了她。”', True) a.t() a.t('迷の少女:') a.t('“唔!”', True, style={'shake_duration': 3}) a.t() a.t('少女惊恐地睁大了双眼,不停地挣扎着,但身体被绑得结结实实,只能在原地不停的扭动。', True) a.t() a.t('纤细的腰肢在尽力地挣扎,但似乎收效不大。', True) a.t() a.t('你仅仅是堵住了她的嘴。', True) a.t() a.t('然后你就被扶她透了。被一群', True)
def ui_grid_1(): """ 作者: @m.l (有改动) """ # ---------默认排版模式 a.page() # 新页面 a.mode() # 默认排版模式。 a.h('一、默认排版', rank=4) a.t() a.t('由a.mode()切换排版模式。当前是默认排版,所有控件从左往右排列,使用a.t()进行换行。') a.t() a.b('按钮1') a.b('按钮2') a.t() a.b('按钮3') a.t() a.divider() a.b('下一页', ui_grid_2) a.t() a.b('返回', a.back)
def ui_center_mode(): # 网格模式的特殊用法(单列居中) a.page() a.h('三、网格模式的特殊用法(单列居中)') a.t() a.t('由a.mode()切换排版模式。当前是默认排版,所有控件从左往右排列,使用a.t()进行换行。') a.divider() a.mode('grid', 1) graph = [ '墙墙窗窗墙墙窗窗墙墙', '墙 门', '墙 墙', '墙汉汉汉汉 墙', '墙 汉 墙', '墙皂我 汉 墙', '墙 汉 门', '墙墙墙墙墙墙墙墙墙墙', ] for line in graph: a.t(line) a.t() a.t() a.divider() a.mode() a.b('返回', a.back)
def ui_grid_2(): """ 作者: @m.l (有改动) """ a.page() # 新页面 a.h('二、网格排版【居中】', rank=4) a.mode('grid', 1) # 网格排版,示例一:居中控件 apple = [ '墙墙窗窗墙墙窗窗墙墙', '墙 门', '墙 墙', '墙汉汉汉汉 墙', '墙 汉 墙', '墙皂我 汉 墙', '墙 汉 门', '墙墙墙墙墙墙墙墙墙墙', ] a.t('该段文字居中,由a.mode("grid",1)切换为网格排版,参数‘1’为每一行所含的最大【控件集合】数') a.t() a.t('网格排版,在使用紧凑样式时,行间距离会比默认排版时更加紧密,因此你可以实现一些不可描述的场面') a.t() a.t('紧凑网格排版如下▼') a.t() a.mode('grid', 1, compact=True) for n in range(0, len(apple)): a.t(apple[n]) a.t() a.mode() # 建议在使用完网格排版后,运行该代码,把排版模式切换回默认模式。 a.t() a.divider() # 使用网格后,分割线的使用代码。 a.b('上一页', ui_grid_1) a.b('下一页', ui_grid_3) a.t() a.b('返回', a.back) a.b('彩蛋', ui_egg)
def ui_grid_3(): """ 作者: @m.l (有改动) """ a.page() a.h('三、网格排版【网格】', rank=4) a.t() a.t('【默认样式】') # ---------网格排版模式 a.mode('grid', 3) # 网格排列,一行3列 a.b('按钮1') a.b('按钮2') a.t() a.b('按钮3') a.t() a.b('按钮4') a.t() a.b('按钮5') a.t() a.b('按钮6') a.mode() a.t() a.t('【线框样式】') a.mode('grid', 3, celled=True) # celled,带 a.b('按钮1') a.b('按钮2') a.t() a.b('按钮3') a.t() a.b('按钮4') a.t() a.b('按钮5') a.t() a.b('按钮6') a.mode() a.t() a.t('【紧凑样式】') a.mode('grid', 3, compact=True, celled=True) a.b('按钮1') a.b('按钮2') a.t() a.b('按钮3') a.t() a.b('按钮4') a.t() a.b('按钮5') a.t() a.b('按钮6') a.mode() a.t() a.divider() a.b('上一页', ui_grid_2) a.t() a.b('返回', a.back)
def ui_widgets(): def button_result(): a.msg('按钮已按下') def rate_result(new_rate): a.msg('您的评分为{}分。'.format(new_rate)) def radio_result(new_ratio): a.msg('现在选中的是第{}位的“{}”。'.format( new_ratio['index'], new_ratio['value'] )) def check_result(new_check): a.msg('现在复选框的值为:{}'.format(new_check)) def input_result(new_input): a.msg('输入框中的文本为:{}'.format(new_input)) def dropdown_result(new_dropdown): a.msg('下拉菜单中的值为第{}位的“{}”。'.format( new_dropdown['index'], new_dropdown['value'] )) a.page() a.h('控件一览', 1, {'color': '#eee'}) a.mode('line') a.t('【我是几个文字】') a.t('【我跟在左边文字后面】') a.t() # 换行 a.t('【我被换行了……】') a.t('而我有色彩', style={'color': '#f00', 'background-color': '#0f0'}) a.t() # 再换行 a.t('【当你看见我时,你需要点鼠标左键或右键】', True) a.t() # 再换行 a.t('【当你看见我时,你还是需要点鼠标左键或右键】', True) a.t() # 再换行 a.b('我是一个红按钮', button_result, style={'background-color': '#f00'}) a.b('我是一个不能按的按钮', button_result, disabled=True) a.b('快拿鼠标指着我!', button_result, popup='被你戳到了,好爽~') a.divider('我是显而易见的分割线') a.t('作为进度条,我当前值为50,总共100,在界面上显示为 100px 长:') a.progress(50, 100, [{'width': '100px'}, {}]) a.t() a.t('如果给这个游戏引擎评分,5分满分,我目前给4分:') a.rate(4, 5) a.t() a.t('我是一个可以点的评分哦~点击之后请在后端控制台查看效果~(对着当前评分再点击一次可以取消评分哦~(等价于评0分)):') a.rate(2, 5, rate_result) a.t() a.t('我是一个单选,目前默认选中第二项(索引为1)修改之后请在后端控制台查看效果:') a.radio(['一', '二', '三'], radio_result, 1) a.t() a.t('我是一个复选框,目前默认已选中,修改之后请在后端控制台查看效果:') a.check('我是一个复选框哦!', check_result, True) a.t() a.t('我是输入框,修改之后请在后端控制台查看效果:') a.input(input_result, '我是默认值哦~') a.t() a.t('多行文本输入框:TODO') a.t() a.t('我是一个下拉菜单哦!(下拉选择项目并在后端查看效果):') a.dropdown(['甲', '乙', '丙'], dropdown_result, 1) a.t() a.t('多选下拉菜单:TODO') a.t() a.t('以上,就是目前支持的全部控件及用法啦~') a.t() a.t('如果您需要新增,请跟作者联系哦~') a.t() a.b('返回', a.back)
def cover(): # 函数的定义十分简单,一目了然,我就不赘述了。丢一个参考链接吧: # 参见:[定义函数](https://docs.python.org/zh-cn/3/tutorial/controlflow.html#defining-functions) # 函数定义好后,就能够被引用了!下面我们来往里面填充内容吧! a.title('Dev Guide with Era.js v{}'.format(a.version)) # 首先,这是名为title的API,它的作用也特别直白:设置游戏窗口标题。 # 标题就是括号里面的内容,但为什么会使用format函数呢?是因为我们要往字符串中塞入一个代表版本的变量。 # 参见:[字符串函数](https://docs.python.org/zh-cn/3/library/stdtypes.html#str.format) # 参见:[格式字符串语法](https://docs.python.org/zh-cn/3/library/string.html#formatstrings) # 现在,我们新建一个页面,将原来的单按钮顶下去! a.page() # 这是名为page的API,作用是新建一个页面,之后的所有控件都在新的页面中生成。 # 引擎只会显示最新的一个页面,旧的页面会被模糊掉,但不会模糊得十分彻底,而是能够让人勉强看清,以免玩家错过关键信息。 # 接下来就轮到调整页面版式了! # 在默认情况下,页面中的内容都是左对齐的,但这种排布方式不一定都美观,因此我们在这里改变一个排版方式: a.mode('grid', 1) # 这是名为mode的API负责改变页面排版方式。 # 在这里,我们将排版方式改为了“grid”(网格),并且给了他一个参数“1”。 # 则代表我们将排版模式变成了一个一列网格。 # 而且网格有一个比较重要的特点,就是在网格中的对齐方式都是居中对齐 # 这样,我们通过生成一个一列网格来实现了每行居中的功能。 # 现在,让我们往网格里面装东西吧! a.t() # 噫?这是装了个什么东西? # 这就是传说中的最常用、最有用、最好用的控件——文本控件! # 而如果我们不往里面装文本的话(比如现在这个),会发生什么? # 答案是换行(换档)! # 什么意思呢?比如如果我们的排版模式是`line`,那么执行这个语句,就相当于回车键, # 后续的内容都会在下一行进行显示。 # 而如果我们的排版模式是`grid`,这里我们以三列网格为例,执行这个语句,我们的光标就会从第一行第一个单元格,跳转到第二个单元格。 # 而如果我们的光标本来就在第一行的第三个单元格,那么执行之后就会跳转到第二行的第一个单元格。 # 而在这里,我们在一列网格中使用,作用就是从第一行第一个单元格,跳转到第二行第一个单元格,也就意味着换了一行而已。 # 都是为了美观呀!美观! # 好了,终于可以开始装东西了,来! a.h('Era.js 开发向导') # 这是标题,用法很简单就不赘述了,我们换行 a.t() # 再显示一行文字。 a.t('Version: {}'.format(a.version)) # 这里语法与title一样,都是进行了字符串格式化。没有什么特别值得说的东西。 # 接下来,我们进行几次换行 for _ in range(4): a.t() # 一行行换行毕竟太麻烦,这里我们使用循环进行5次换行。再生成控件的话,就会在比较靠下的地方了。 a.b(' 页面逻辑教程 ', a.goto, ui_logic) a.t() a.t() a.b(' 控件教程 ', a.goto, ui_widgets) a.t() a.t() a.b(' 排版教程 ', a.goto, ui_compose) a.t() a.t() a.b(' 数据管理教程 ', a.goto, ui_data) a.t() a.t() a.b(' 代码组织教程 ', a.goto, ui_code) a.t() a.t() a.b(' 模组教程 ', a.goto, ui_mod) a.t() a.t() a.b(' 退出教程 ', a.msg, '右上角嘛~ 真是的!') a.t()
def ui_data(): def ui_support_file_format(): a.page() a.h('支持的数据文件格式列表') a.t() a.t() a.t('配置文件:*.inf, *.ini, *.cfg, *.config') a.t() a.t('配置文件的基本格式均为【变量名】=【数据】的格式,适用于存储简单的、易于玩家修改的配置数据。') a.t() a.t('表格文件:*.csv') a.t() a.t('CSV文件可以被常见的表格程序打开,但其本身不支持任何排版,若需要储存大量二维数据可以考虑这个方法。十分利于开发者进行编辑修改。') a.t() a.t('JSON文件:*.json') a.t() a.t('JSON文件易于储存结构化的数据,系统读写速度非常快,但面向开发者的可读性要稍差一点。') a.t() a.t('YAML文件:*.yaml, *.yml') a.t() a.t('YAML文件和JSON文件类似,适用于储存、输入结构化的数据,系统读写速度没有JSON快,但面向开发者的可读性特别高,推荐使用。') a.t() a.t('ZIP文件:*.zip') a.t() a.t('ZIP文件是常见的容器文件,里面的文件格式均为JSON,能够整合多个数据文件,方便与其他玩家共享数据时使用。') a.t() a.t('文本文件:*.txt') a.t() a.t('最常见的文本文件,读取之后的数据结构为列表,每一行就是列表中的一项,用法全看开发者如何打算。') a.t() a.t('存档文件:*.save, *.sav') a.t() a.t('Era.js游戏引擎特有的存档文件,没有什么特别的东西需要介绍的。') a.t() a.t() a.b('返回', a.back) def ui_call_data(): a.page() a.h('数据调用') a.t() a.t() a.h('调用配置文件', 3) a.t() a.t('配置文件放在【config/】文件夹中,通过a.cfg()函数进行调用。') a.t() a.t() a.h('调用静态数据文件', 3) a.t() a.t('数据文件放在【data/】文件夹中,通过a.dat()函数进行调用。') a.t() a.t() a.h('调用可存档数据', 3) a.t() a.t('可存档数据是指通过a.sav()函数进行增删查改的数据,而“存档文件”可以理解为“可存档数据”的一个“快照”。当我们进行“保存游戏”的操作时,游戏引擎会将“可存档数据”进行全拷贝并自动生成“存档文件”存放在【save/】文件夹中,而当我们读取存档时,游戏引擎读取“存档文件”中的数据并对“可存档数据”进行完全覆盖。') a.t() a.t('出于非技术原因,我们约定,可存档数据中的数据不包括Python的对象(如函数、类等)。', style={'color': 'white'}) a.t() a.t() a.h('调用临时数据', 3) a.t() a.t('“临时数据”是指游戏运行时生成、供全局调用、但无需保存进存档文件的数据。可通过a.tmp()函数进行调用。当全局数据不知道放哪儿时,放这里准没错。') a.t() a.t() a.b('返回', a.back) def ui_save_data(): a.page() a.h('存档数据管理') a.t() a.t() a.h('保存存档', 3) a.t() a.t('使用a.save()函数可以直接保存存档,详情请参见API。') a.t() a.t() a.h('加载存档', 3) a.t() a.t('使用a.load()函数可以直接加载存档,详情请参见API。') a.t() a.t() a.h('保存存档预设控件', 3) a.t() a.t('引擎提供了一个预设控件函数a.widget_save(),让你可以生成一个块级控件') a.t() a.t() a.h('加载存档预设控件', 3) a.t() a.t('a.widget_load()') a.t() a.t() a.h('保存存档预设界面', 3) a.t() a.t('a.ui_save()') a.t() a.t() a.h('加载存档预设界面', 3) a.t() a.t('a.ui_load()') a.t() a.t() a.b('返回', a.back) def ui_api_tips(): a.page() a.h('API使用注意事项') a.t() a.t() a.t('在设置文件根节点时我们可能遇到这个问题:') a.t() a.t('a.dat("test.list")=[1,2,3]') a.t() a.t('会报错,原因是python会将等号左侧识别为一个函数,而不会将他识别为一个函数的返回值。') a.t() a.t('我们可以用下列代码来代替:') a.t() a.t('a.dat()["test.list"]=[1,2,3]') a.t() a.t() a.b('返回', a.back) a.page() a.mode() a.h('数据管理教程') a.t() a.t() a.t('在v0.2中,数据系统与v0.1相比,有了较大改变,我们来逐项说明。') a.t() a.t('引擎支持的数据文件格式参见:') a.b('格式列表', a.goto, ui_support_file_format) a.t() a.t('调用文件的API进行了变更,参见:') a.b('数据调用', a.goto, ui_call_data) a.t() a.t('新版引擎对存档的支持进行了增强,参见:') a.b('存档数据管理', a.goto, ui_save_data) a.t() a.t('新的API在使用时有一些需要注意的地方,参见:') a.b('API使用注意事项', a.goto, ui_api_tips) a.t() a.t() a.b('返回', a.back)