import inspect
from hrc.dev import Character
from typing import Literal, Union, Optional


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__}")
