aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/examples/BRP/src/character.py
blob: 54503eb6a5c01a3ea348d3a75d64d119305b2981 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
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__}")