import inspect from hydro_roll_core.development import Character from typing import Literal, List, Tuple, Union, Dict, Generic, Optional, TYPE_CHECKING class Identity: """ 身份 ---- 在这个部分里,角色的基本信息会得到细化充 实,而这些要素几乎没有游戏效果。这些就是角色 扮演要素——它们让角色成为“人”,而不只是属 性和技能的简单罗列。玩家可以现在就填完这些信 息,也可以填一部分,然后跳到生成属性和技能的 部分;或者先放在一边,留待进一步了解角色的游 戏系统要素之后再来填写。 """ def t_name(self) -> str: """姓名: 给角色起个合适的名字""" def t_race(self) -> Optional[Literal["人类"]]: """种族: 基础规则只包含“人类”,但当然也可以是其他种族""" def t_gender(self) -> Literal["女性", "男性"]: """性别: “女性”或者“男性”,或者特定设定中适用的任意性别——在游戏系统中,性别之间没有任何差异""" def t_dominant_hand(self) -> Optional[Literal["左撇子", "右撇子"]]: """惯用手: 角色是右撇子还是左撇子?任选一个——在游戏系统中没有差异""" def t_height_and_weight(self) -> Union[int, str]: """身高和体重: 请根据你的体型(SIZ)来决定。不需要是具体的数字,可以只大概写上“高个”、“普通身材”或者“块头大”""" _siz = int(Attributes.SIZ) _pre_load_dict = { (0, 20): "常年患病在身", (21, 40): "体弱多病", (41, 60): "不会生什么大毛病", (61, 80): "健硕,浑身湿透也不会感冒", (81, 100): "身体素质极好,精神抖擞", } for k, v in _pre_load_dict.items(): if k[0] <= _siz <= k[1]: return v def t_description(self) -> str: """描述: 角色的简单外观描述,可能包含颜色特征(发色、瞳色、肤色)、姿态、穿着打扮等等""" def t_age(self) -> Union[int, str]: """年龄: 挑一个适合角色的年龄,记得参照角色属性""" def t_feature(self) -> str: """特征: 参照外貌(APP)属性,角色是否有明显的特征?这可以是显眼的伤疤、塌掉的鼻子、奇特的发型、或者不同寻常的穿着。请写下一些特征。外貌越高或者越低,特征就会越多""" def t_job(self) -> str: """职业:指角色的事业,他们最受认同的职业,或者他们谋生的方式。章节 2.7 中给出了一份职业列表""" class Attributes: """ 属性 ---- 基本角色扮演中的角色可以用多种方式来评估。 最基础的是属性,也就是角色的天生能力,诸如如 聪明、强壮、魅力等等。这些都不是后天学得的能 力,但有时可以通过训练和成功的使用来增强。正 常人类的属性低至 3(极其糟糕),高至 18(人类 巅峰),平均值在 10 或 11。属性越高,这名角色 在该项能力上就越强大。 这些属性是:力量、体质、体型、智力、意志、 敏捷以及外貌,以下是详细描述:11111111111 """ def t_STR(self) -> Union[int, str]: """力量(STR): 力量就是指角色的气力大小。这不一定是指单纯的肌肉强度,而是指角色能多有效地运用肌肉力量来完成困难的体力任务。投掷 3D6 来决定力量。""" def t_CON(self) -> Union[int, str]: """体质(CON): 体质是对角色的健壮程度和韧性的度量。它能帮助玩家抵抗疾病,但它最显著的作用是确定角色在死亡前能承受多少伤害。投掷 3D6 来决定体质。""" def t_SIZ(self) -> Union[int, str]: """体型(SIZ): 体型是指角色的块头有多大。它不一定是单纯指身高——而是指身体重量的大概范围。体型较高的角色可能会非常高(并且瘦),也可能是身高普通但重量超标。投掷 2D6+6 来决定体型。""" def t_INT(self) -> Union[int, str]: """智力(INT): 智力是指角色有多聪明:不一定是指记住了多少信息,而是指逻辑思考能力、思维有多敏锐,解决问题的能力有多强,以及直觉有多强。投掷 2D6+6 来决定智力。""" def t_POW(self) -> Union[int, str]: """意志(POW): 意志是一个无形的属性,它是指角色的意志力、精力以及灵魂能量。意志较高的角色时刻都充满能量,他非常幸运,并且存在感很强,而意志较低的角色时常会被忽略或忘记,常常会倒霉。投掷3D6来决定POW。""" def t_DEX(self) -> Union[int, str]: """敏捷(DEX): 敏捷是指角色肉搏战时的平衡性、身体速度以及总体上的灵巧程度。敏捷决定角色在战斗中的行动速度,同时也和闪避技能基础值有关。投掷 3D6 来决定敏捷。""" def t_APP(self) -> Union[int, str]: """外貌(APP): 外貌属性囊括了几个方面,包括魅力,优雅、美貌/英俊,乃至角色对他人的吸引力。外貌较高的角色在人群中会特别显眼,因为魅力与气质在他身上无形地交融在一起。投掷 3D6 来决定外貌。(在某些版本的规则里,魅力(CHA)取代了外貌)""" def d_1(self): """如果所得的属性与想要的有出入,玩家可将 3 点属性从一项转移到另一项去。例如,如果比起聪 明的角色更偏强壮的角色,就可以将 3 点从智力移 到力量上去。玩家无需一次移满 3 点,也不是必须 要移动点数。 玩家应当查看这组属性,并思考这些数字代表 了什么。角色是不是强壮而笨拙?矮小且行动迅速? 或者各方面都很普通?比起诉诸暴力,他是不是更 善于思考? 如果数值与玩家想要的角色类型并不匹配,那 么玩家应该询问主持人是否可以从头来过,重新骰 一组新的属性。只要所有玩家机会相同,并且对自 己所得结果感觉满意,一切就都没有问题。 """ class AttributesCheck: """ 属性检定 -------- 角色的许多能力都可以用技能来衡量。但是, 有时也需要一种基于属性的简单检定来决定角色是 否能在行动中取得成功。如果存在对抗数值,请使 用对抗表(详见下文)。如果没有明显的数值要对 抗,那就使用属性检定。 每次属性检定都是与属性*5 进行对比,以百分 比成功率的形式体现。例如,力量为 10 的情况下, 气力检定要与10*5进行对比,也可以用成功率50% 来表示。 """ def t_strength_check(self): """气力检定: 要运用力量来对某种环境物体施加 影响,就会用到气力检定,该检定是基于力量 *5。要做完一百个俯卧撑就要进行一次气力检 定。""" def t_endurance_check(self): """耐力检定:长时间的体力运动和对身体耐受力 的考验都会用到体质检定,该检定是基于体质 *5。若要避免染上普通感冒或是要喝下一整瓶 色拉酱,都需要进行一次耐力检定。""" def t_inspiration_check(self): """灵感检定:角色偶然间的灵光一闪,以及他是 否“知晓”某种玩家知道的信息,能否能弄清 玩家不曾知晓的事,这些都会用到灵感检定。 游戏主持人有时也可以用这项检定来推动不知 道接下来该做什么(与此同时他们的角色应该 知道)的玩家。从用图钉标示出一系列犯罪现 场的城市地图中找出规律,会需要一次灵感检 定。""" def t_luck_check(self): """幸运检定:幸运检定用于决定命运是否愿意给 角色一个喘息的机会,或者是让他在随机的运 气是决定性因素的场合里(例如,轮盘赌)侥 幸成功。该检定是基于意志*5。要决定掷硬币 时谁获胜,或者谁是那个倒霉蛋,就会用到幸 运检定。 """ def t_dexterity_check(self): """灵巧检定:灵巧检定适用于天然的手眼协调能 力比训练更加重要的场合,像是在容易滑倒的 表面上奔跑,或是在东西落地前抓住它。该检 定是基于敏捷*5。如果角色要接住伴随着一声 “接好了!”向他丢过来的东西,就会需要一次 灵巧检定。""" def t_charm_check(self): """魅力检定:这是指纯粹的魅力,也就是依靠出 众的外表和个人魅力来吸引注意力、取信于人 的能力。该检定是基于外貌*5。要吸引保安的 注意,让他放自己进入一家高档俱乐部,就会 需要一次魅力检定。""" class DerivedAttributes(Character.Attribute): """这些属性是由其他属性衍生而来,并且可能会因其他因素(例如种族)而增减。""" def t_MOV(self) -> Union[int, str]: """移动力(MOV):移动力(MOV)是一项游 戏数值,它决定了角色在一个战斗轮中可以移 动多远。所有人类的移动力都是 10。移动力是 一个灵活的数值,但通常来说,一点移动力意 味着能移动一米。如果是奔跑,那么每一点移 动力可以移动三米。""" def t_HP(self) -> Union[int, str]: """生命值:生命值(HP)等于角色的体质与体 型之和的一半(向上取整)。角色受到肉体伤 害或其他形式的伤害时,生命值就会扣除相应 点数。当角色的生命值降至 1 或 2 点时,他会 陷入昏迷。如果生命值在战斗轮结束时为零, 角色就会死去""" def t_PP(self) -> Union[int, str]: """能量值(PP):能量值等于意志(POW), 用于施展魔法或使用其他能力。当角色的能量 值降到 0 点时,他会陷入昏迷。在完整的一天 (需包含一晚的睡眠)后,能量值会完全回复。""" def t_damage_bonus(self) -> Union[int, str]: """伤害加值:体型更大,更强壮的角色在使用近 战武器时会给他的敌人造成更多伤害。角色使 用任何近战武器进行攻击时,都要加上这项伤 害调整。把力量和体型相加,然后对照下表: *伤害加值* +------------+--------------+ | 力量+体型 | 伤害调整 | +------------+--------------+ | 2 to 12 | –1D6 | +------------+--------------+ | 13 to 16 | –1D4 | +------------+--------------+ | 17 to 24 | 无 | +------------+--------------+ | 25 to 32 | +1D4 | +------------+--------------+ | 33 to 40 | +1D6 | +------------+--------------+ | 41 to 56 | +2D6 | +------------+--------------+ """ _damage_adjustment = { (2, 12): "-1D6", (13, 16): "-1D4", (17, 24): "", (25, 32): "+1D4", (33, 40): "+1D6", (41, 56): "+2D6", } _str = int(Attributes.t_STR) _siz = int(Attributes.t_SIZ) _str_plus_siz = _str + _siz for k, v in _damage_adjustment.items(): if k[0] <= _str_plus_siz <= k[1]: return v class Skills: """ 技能 ---- 以下是一份角色可能使用的技能的列表。技能 的高低以技能概率(也就是角色尝试使用这项技能 时的百分成功率)的形式来表示,其数值介于 0% (无论如何都不可能成功)和 100%或更高之间 (意味着只要不掷出 00 就都会成功)。技能的基 础成功率已在技能名字后的括号中给出,所以只要 这个数字高于 00%,你就至少有百分之一的机会成 功使用该技能。在使用数值为 01%的技能时,成功 通常意味着撞大运。如果技能值是 00%,那么无论 如何尝试都不可能成功。 角色投入到某项技能中的技能点数会与基础值 相加。游戏主持人可以根据游戏背景来调整技能基 础值。 如果角色的某项技能低于 05%,那他在这方面 是个倒霉的门外汉。如果技能在 06-25%之间,那 他是个新手。技能在 51-75%之间意味着他是个能 力优秀的专业人士。专家在对应方面会有 76-90% 的技能,而 91%甚至更高意味着角色在这项技能上 是一位大师。技能高于 100%就意味着角色在一定 程度上,拥有其他人无法掌握的神秘知识或能力。 技能数值也可以表示基本的能力。25%的技能 值并不是说角色日常使用这项技能时会有四分之三 的几率失败——而是说在紧张的情况下(例如冒险、 战斗、等等),角色只有四分之一的机会成功。大 部分像是开车去工作这样的日常活动都不需要技能 检定,只要这些事处在合理的能力范围内,但像是 在繁忙的十字路口高速转向,同时用手枪向窗外射 击就肯定需要一次检定。 许多技能都有专精项,标注在技能名称后的括 号中。专精项是能细分技能的具体子技能。例如, 角色拥有70%的知识(法律),并不意味着他在所有 知识领域都有 70%的了解,而是单指法律这一项。 除非在技能的其余专精项中另行投入技能点,否则 就仍会是基础值。 """ def t_1(self): """估价(15%): 评估物品的价值,或是判断它是否具有某种不能一眼看出的能力。""" def t_2(self): """艺术(各类)(05%):颜料画、绘画、雕塑、 照相或者其他艺术种类。每一种艺术都是一个 专精项,因此艺术(摄影)是一项技能,而艺 术(颜料画)是另一项。推荐的艺术专精项包 括建筑、书法、电影、绘画、摄影、雕塑等等。""" def t_3(self): """炮术(各类)(%随武器而定):使用重型武 器的能力,包括投石器、火炮、导弹发射器等。""" def t_4(self): """议价(05%):可以顺利进行讨价还价。在游 戏主持人的裁量下,成功使用这项技能可以让 一件物品的价格从某个范围(难以企及>极其 珍贵>昂贵>价格合理>不贵>便宜>免费)降至 更低的范围。上述范围仅仅是建议,可以根据 需要来修改。""" def t_5(self): """搏斗(25%):能在近身搏斗中击中对方,不 论是用拳、头槌、脚踢或是用嘴咬。成功的搏 斗攻击会给对手造成 1D3 点伤害。""" def t_6(self): """攀爬(40%):可以沿着墙壁、绳索或其他难 以攀缘的表面进行攀爬。""" def t_7(self): """指挥(05%):指挥小队至大队的随从参与战 斗或者其他需要组织纪律的事,并协调他们的 行动。如果这项技能失败了,那么所有人都是 各自为战,无法有效地进行合作。""" def t_8(self): """手艺(各类)(05%):可以制造实物物品, 像是木工、铁匠、缝纫、烹饪。与艺术相比, 手艺通常会更加实用,但会更难获得荣誉和认 可。每一种手艺都是一个专精项。""" def t_9(self): """爆破(01%):能设置并引爆爆破物,让其发 挥最大效果。所有人都能拉开手榴弹拉环—— 而爆破则适用于临时用家用化学品制作炸弹, 或者将爆炸物安装在合适的位置来炸塌一栋建 筑的场合。""" def t_10(self): """伪装(01%):用于隐藏身份或相貌,或者运 用化妆和变装的手段来假扮成另一个人或物。""" def t_11(self): """闪避(敏捷*2%):可以免受物理攻击的伤害。  驾驶车辆(各类)(20%或 1%):可以驾驶 陆上载具。对于现代世界的角色,驾驶基础值 是 20%;而其他时代的基础值是 01%。每一种 载具(如汽车、马车、战车、卡车等)都是一 个专精项。""" def t_12(self): """能量武器(各类)(%视武器专精项):能使 用能量武器瞄准目标并射击。每一种能量武器 都是一个专精项,例如能量手枪及能量步枪。  礼仪(05%):知晓社交场合中的言行要求, 也懂得某个社会阶层的各类社交礼仪。""" def t_13(self): """话术(05%):通过交谈摆脱困境,或是在来 不及据理力争的时候能用话语唬住对方。  精细操作(05%):指手指灵活性,对匆忙之 中拆解物品或是对手的协调性要求较高的工作 尤为重要。这可以用于撬锁。""" def t_14(self): """枪械(各类)(%视武器专精项):使用枪械 瞄准目标并射击。每一种枪械都是一个专精项, 例如机枪、手枪、左轮、步枪、霰弹枪和冲锋 枪。""" def t_15(self): """急救(30%或智力×1):治疗轻伤。对于来 自现代或未来的角色,本技能的基础值是 30%; 而在历史时期,基础值是智力×1。每次成功 使用急救可以让一名受伤的角色恢复 1D3 点生 命值,而特殊成功能恢复 1D3+3 点生命值。""" def t_16(self): """飞行(敏捷×½或敏捷×4):如果角色是使 用技术手段(例如喷气背包)来飞行,那么技 能基础值是敏捷×½。如果角色天生就有飞行 能力(例如生有翅膀),基础值是敏捷×4。 一般飞行并不需要检定——在飞行中做出机动 动作、进行战斗或是表演复杂的飞行特技,才 会用到这个技能。""" def t_17(self): """博弈(智力+意志):知晓各种概率游戏(例: 卡牌,骰子)的规则及概率算法,以及如何赢 得这类游戏。""" def t_18(self): """擒抱(25%):指摔跤和其他依靠平衡及姿势 来压制或束缚对手的徒手搏斗术。""" def t_19(self): """重型机械(各类)(01%):操作和维护重型 机械,如工厂印刷机、打谷机等等。每种不同 的重型机械技能都是一个专精项。""" def t_20(self): """重型武器(各类)(%视武器专精项):使用 重型武器瞄准目标并射击。每种不同的重型武 器技能都是一个专精项,例如巴祖卡火箭弹, 重型机枪、转管机枪和火箭发射器等等)""" def t_21(self): """躲藏(10%):能避免自己或者物品被人看见。 经常会和潜行结合使用。""" def t_22(self): """洞察(05%):根据其他角色下意识的行为, 揣测他/她没有表露的想法和/或动机。在某些 背景下,洞察可能会有洞察(精灵)或者洞察 (外星人)的专精项。""" def t_23(self): """跳跃(25%):跃过障碍物或跳出一段距离。 对多数人类而言,成功的跳跃能让他跳出三米 远或是一米高。""" def t_24(self): """知识(各类)(05%或01%):熟知某一特定 学术分支的知识。对现代或未来的角色,基础 值是 05%;对历史时期中的角色,基础值是 01%。每一种知识技能都是一个专精项。知识 的专精项数量众多,其中就包括人类学、考古 学、区域知识(某一地区)、民俗学、团体知 识(某个组织)、历史、语言学、文学、神话 知识、神秘学、政治、街头知识等等。""" def t_25(self): """语 言 ( 各 类 ) ( 母 语 : 智 力 × 5, 其 他 : 00%):能说和听懂一种语言。语言(母语) 是角色自身的母语,其基础值是智力×5。通 常来说,玩家角色用母语和其他同样使用这种 语言的人交流并不涉及语言检定。语言(其他) 是另外的语言,其基础值是 00%。每一种其他 语言都是一个专精项。""" def t_26(self): """聆听(25%):能听见响动或是微弱的声音, 例如有人正悄悄通过你身边,或是有怪物正在 靠近。""" def t_27(self): """读写能力(各类)(%等于语言基础值):主 要适用于教育并不普及的背景。角色能读懂并 理解他所阅读的东西。在那些并不一定存在文 字记载的背景下,这项技能的基础值可能是 00%。""" def t_28(self): """武术(01%):运用源自严格训练的搏斗技巧, 给对手造成更猛烈的打击,或是用手脚格挡攻 击避免受到伤害。游戏主持人可以限定谁能使 用武术,也可以调整初始技能值。与其他技能 不同的是,武术并不是单独检定:如果角色能 成功进行一次搏斗攻击,并且投掷出的数值也 低于或等于武术的技能值,那么伤害骰(但并 不包括伤害加值)就可翻倍。在运用搏斗技能 招架近战武器的场合,武术可以帮助角色抵消 3 点伤害。""" def t_29(self): """医学(05%或 00%):能通过药物,疗法和手 术等手段治疗严重的伤病。对于现代或未来的 角色,技能基础值是 05%;对于历史时期中的 角色,基础值是 00%。医学治疗是一个费时较 多的过程,并不能立即回复生命值。""" def t_30(self): """近战武器(各类)(%视武器专精项):使用 近战(白刃战)武器进行战斗,包括攻击和格 挡。每一种近战武器技能是一个专精项,例如 斧子、棍棒、匕首、连枷、锤子、狼牙棒、戟、 矛、杖、剑等。""" def t_31(self): """远程武器(各类)(%视武器专精项):使用 某种“人力”发射的武器瞄准并击中目标。每 一种远程武器是一个专精项,例如弓、十字弩、 长矛等等。""" def t_32(self): """导航(10%):能借助易于辨识的地标、星座 来寻找并绘制路线,或是能通过地图找到方向。  表演(各类)(05%):某种形式的娱乐节目 或表演,可以是音乐、演戏、体操、喜剧等等。 每一种表演都是一个专精项。""" def t_33(self): """说服(15%):用逻辑、道理和情绪感染力说 服某人,让他同意特定的行动方案或思路。和 话术不同的是,说服需要时间和支持论据,也 需要对方愿意倾听。""" def t_34(self): """驾驶载具(各类)(01%):驾驶空中、海上 或太空载具。每一种载具都是一个专精项,并 且有些载具需要多名驾驶员才能操控。""" def t_35(self): """能量放射(敏捷×2):如果游戏中可以使用 超凡力量(魔法,超能力,灵能等等),那么 这个技能就是引导超凡力量来攻击目标的能力。""" def t_36(self): """精神治疗(01%):用精神病学和精神分析来 确定病人的精神问题并予以治疗。急救能治疗 身体,但精神治疗可以治愈心灵。这种治疗过 程时间长,要分多次进行,并且需要深入的个 人精神状态评估和心理咨询。若是用于历史时 期,则这个技能是指灵性咨询。""" def t_37(self): """维修(各类)(15%):修理因损坏、卡壳、 被拆开或是其他原因无法正常工作的东西。每 一种类型的维修都是一个专精项,例如电气维 修、电子维修、机械维修、结构维修、量子维 修等等。""" def t_38(self): """查阅资料(25%):查阅某种信息来源(图书 馆、报刊档案、计算机网络、互联网、巫师的 魔法书等),从中找到需要的信息。""" def t_39(self): """骑术(各类)(01%):能骑乘动物,并能在 遇到糟糕情况时保持对它的控制。骑乘每一种 动物(马、龙、巨型猫头鹰等)都是一个专精 项。""" def t_40(self): """科学(各类)(01%):精通自然科学方面的 某个学术领域。每一种科学技能都是一个专精 项,例如天文学、生物学、植物学、化学、基 因学、地理学、数学、气象学、物理学、动物 学等等。""" def t_41(self): """感知(10%):综合了嗅觉、味觉和触觉—— 能通过这些感官察觉细微的或是隐藏起来的事 物。""" def t_42(self): """盾牌(各类)(%视盾牌类型):用盾牌招架 攻击。每一种盾牌技能都是一个专精项,例如 小圆盾、能量盾、全身盾、半身盾、斗盾、步 兵圆盾、鸢盾、圆盾等等。""" def t_43(self): """妙手(05%):魔术手法和误导技巧,例如扒 窃、藏硬币、耍纸牌和其他依赖手法的小把戏。""" def t_44(self): """侦查(25%):能发现容易被忽略或者被隐藏 起来的物品。""" def t_45(self): """地位(各类)(15%):指社会地位,或者说 让自己所处的社会环境更有利于自己的能力, 例如借钱、赢得亲睐、给其他人留下好印象等 等。每一种地位技能都是一个专精项。专精项 可能包括:城市(特定城市)、群体(某个群 体或组织)、上流社会、宗教、种族(特定种 族)等等。""" def t_46(self): """潜行(10%):悄然行动从而避免被发现,或 是采取其他隐秘的行动;""" def t_47(self): """战术(01%):对情势进行战术评估,洞悉战 场情况和敌人所用的战术,并得出一个最优解。 通常会用于军事及政治场合。""" def t_48(self): """游泳(25%):能在水中自如移动,不会溺水。""" def t_49(self): """教导(10%):向其他人传授知识。更多信息 参见 17 页的成长章节。""" def t_50(self): """技术(各类)(00%):能使用某种复杂的设 备或技术工艺。该技能的基础值会随背景而变, 故而应由游戏主持人酌情决定。每一种技术都 是一个专精项,例如计算机编程、计算机使用、 电子学、机器人技术、传感器系统、攻城器械、 陷阱等等。""" def t_51(self): """投掷(25%):瞄准并投掷物品(飞镖、橄榄 球、棒球、石块、帽子等等),让它从空中划 过并击中目标。和远程武器技能不同的是,所 有并非专门作为武器的物品都笼统地归类在这 个技能下,并且检定成功也并不一定表示对目 标造成了伤害。""" def t_52(self): """追踪(10%):跟踪人的脚印和野兽的足迹等 等,寻找其来处或去处。""" def d_1(self): """ 如有需要,游戏主持人可以按照给定的背景修 改技能列表,使其与设定相符。游戏主持人可以自 由地删除技能,给技能重新命名,也可以加入新的 技能。例如,在中世纪奇幻背景中可能用不到能量 武器、重型机械、心理分析或者技术。技能的初始数 值也可以根据具体的战役和背景来调整。 """ class Weapons: ... class Armor: ... class Equipment: ... class BRPCharacter(Character): """ 角色卡 ------ 每名玩家都需要一张位于本书末尾的角色卡。 你也可以将所有内容都写在白纸上,但角色卡会让一切大大简化。角色卡包含这些部分: - 身份: 这是角色的基础信息:这方面的信息并没有任何游戏效果,但能帮助细化角色的身份; - 属性和检定: 这些数值描述了角色的各项素质,例如他有多么强壮、聪明、迅速或者迷人。检定是基于属性,即是掷百分骰来决定角色能否完成一项任务。 - 生命值: 这个数值用于衡量角色在死亡前能承受多少伤害。块头更大和/或更加健康的角色拥有更多生命值(HP),而体型更小和/或更虚弱的角色生命值也就更少。 - 技能: 指角色与生俱来、或是通过训练、教育所获得的能力。每一项都用百分比成功率表达,用于检定角色是否取得成功。 - 武器: 指角色使用的武器或攻击方式,此外还描述了它们对其他角色造成伤害的方式; - 护甲: 角色穿着的任意护甲,可能会降低玩家受到攻击时承受的伤害; - 装备: 角色可以携带的也许能派上用场的其他物品。 """ def t_identity(self) -> Identity: ... def t_attributes(self) -> Attributes: ... def t_attribute_check(self) -> AttributesCheck: ... def t_skills(self) -> Skills: ... def t_weapons(self) -> Weapons: ... def t_armor(self) -> Armor: ... def t_equipment(self) -> Equipment: ... brp = BRPCharacter() class_docstring = BRPCharacter.__doc__ print(f"{class_docstring}") for name, method in inspect.getmembers(brp, predicate=inspect.ismethod): if name.startswith("t_"): print(f"{method.__doc__}") print(f"{inspect.signature(method).return_annotation.__doc__}")