bcdice 3.16.1 → 3.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +111 -0
  3. data/i18n/Airgetlamh/ja_jp.yml +5 -0
  4. data/i18n/Airgetlamh/ko_kr.yml +5 -0
  5. data/i18n/Alsetto/ja_jp.yml +5 -0
  6. data/i18n/Alsetto/ko_kr.yml +5 -0
  7. data/i18n/AnimaAnimus/ja_jp.yml +28 -0
  8. data/i18n/AnimaAnimus/ko_kr.yml +28 -0
  9. data/i18n/BlackJacket/ja_jp.yml +79 -0
  10. data/i18n/BlackJacket/ko_kr.yml +79 -0
  11. data/i18n/Bloodorium/ja_jp.yml +3 -0
  12. data/i18n/Bloodorium/ko_kr.yml +3 -0
  13. data/i18n/Cthulhu/ko_kr.yml +1 -1
  14. data/i18n/Dracurouge/ko_kr.yml +1284 -205
  15. data/i18n/Emoklore/ja_jp.yml +1 -0
  16. data/i18n/Emoklore/ko_kr.yml +1 -0
  17. data/i18n/FutariSousa/ja_jp.yml +70 -0
  18. data/i18n/FutariSousa/ko_kr.yml +157 -0
  19. data/i18n/HatsuneMiku/ja_jp.yml +579 -0
  20. data/i18n/HatsuneMiku/ko_kr.yml +579 -0
  21. data/i18n/Irisbane/ja_jp.yml +27 -0
  22. data/i18n/Irisbane/ko_kr.yml +27 -0
  23. data/i18n/JuinKansen/ja_jp.yml +168 -0
  24. data/i18n/JuinKansen/ko_kr.yml +168 -0
  25. data/i18n/KemonoNoMori/ja_jp.yml +229 -0
  26. data/i18n/KemonoNoMori/ko_kr.yml +229 -0
  27. data/i18n/KizunaBullet/ko_kr.yml +653 -0
  28. data/i18n/MagicPunk/ja_jp.yml +5 -0
  29. data/i18n/MagicPunk/ko_kr.yml +5 -0
  30. data/i18n/MorkBorg/ja_jp.yml +34 -0
  31. data/i18n/MorkBorg/ko_kr.yml +34 -0
  32. data/i18n/Nechronica/ko_kr.yml +43 -0
  33. data/i18n/NegikureNegimaki/ja_jp.yml +6 -0
  34. data/i18n/NegikureNegimaki/ko_kr.yml +6 -0
  35. data/i18n/Nuekagami/ja_jp.yml +219 -0
  36. data/i18n/Nuekagami/ko_kr.yml +219 -0
  37. data/i18n/Revulture/ja_jp.yml +8 -0
  38. data/i18n/Revulture/ko_kr.yml +8 -0
  39. data/i18n/SRS/ja_jp.yml +4 -0
  40. data/i18n/SRS/ko_kr.yml +4 -0
  41. data/i18n/ShinobiGami/ja_jp.yml +879 -0
  42. data/i18n/ShinobiGami/ko_kr.yml +876 -0
  43. data/i18n/StarryDolls/ja_jp.yml +456 -0
  44. data/i18n/StarryDolls/ko_kr.yml +456 -0
  45. data/i18n/StratoShout/ja_jp.yml +8 -8
  46. data/i18n/SwordWorld2_5/ja_jp.yml +48 -0
  47. data/i18n/Ventangle/ja_jp.yml +4 -0
  48. data/i18n/Ventangle/ko_kr.yml +4 -0
  49. data/i18n/YearZeroEngine/ja_jp.yml +12 -0
  50. data/i18n/YearZeroEngine/ko_kr.yml +12 -0
  51. data/i18n/ZombiLine/ja_jp.yml +27 -0
  52. data/i18n/ZombiLine/ko_kr.yml +27 -0
  53. data/i18n/ko_kr.yml +2 -0
  54. data/i18n/zh_hant.yml +2 -2
  55. data/lib/bcdice/dice_table/d66_left_range_table.rb +21 -0
  56. data/lib/bcdice/game_system/Aionia.rb +68 -19
  57. data/lib/bcdice/game_system/Airgetlamh.rb +64 -41
  58. data/lib/bcdice/game_system/Airgetlamh_Korean.rb +53 -0
  59. data/lib/bcdice/game_system/Alsetto.rb +63 -50
  60. data/lib/bcdice/game_system/Alsetto_Korean.rb +51 -0
  61. data/lib/bcdice/game_system/AnimaAnimus.rb +15 -32
  62. data/lib/bcdice/game_system/AnimaAnimus_Korean.rb +39 -0
  63. data/lib/bcdice/game_system/BlackJacket.rb +57 -113
  64. data/lib/bcdice/game_system/BlackJacket_Korean.rb +8 -206
  65. data/lib/bcdice/game_system/Bloodorium.rb +1 -1
  66. data/lib/bcdice/game_system/Bloodorium_Korean.rb +34 -0
  67. data/lib/bcdice/game_system/ChroniclesOfDarkness2e.rb +163 -0
  68. data/lib/bcdice/game_system/Cthulhu7th_Korean.rb +471 -300
  69. data/lib/bcdice/game_system/DeadlineHeroes_Korean.rb +273 -0
  70. data/lib/bcdice/game_system/Dracurouge_Korean.rb +25 -19
  71. data/lib/bcdice/game_system/DungeonsAndDragons5.rb +106 -73
  72. data/lib/bcdice/game_system/DungeonsAndDragons5_Korean.rb +53 -0
  73. data/lib/bcdice/game_system/DungeonsAndDragons_Korean.rb +61 -0
  74. data/lib/bcdice/game_system/Emoklore.rb +34 -9
  75. data/lib/bcdice/game_system/Emoklore_Korean.rb +10 -2
  76. data/lib/bcdice/game_system/FateCoreSystem.rb +10 -6
  77. data/lib/bcdice/game_system/FullMetalPanic_Korean.rb +28 -0
  78. data/lib/bcdice/game_system/FutariSousa.rb +37 -12
  79. data/lib/bcdice/game_system/FutariSousa_Korean.rb +25 -8
  80. data/lib/bcdice/game_system/GaiaCare.rb +40 -0
  81. data/lib/bcdice/game_system/GardenOrder.rb +2 -2
  82. data/lib/bcdice/game_system/GardenOrderReEdit.rb +849 -0
  83. data/lib/bcdice/game_system/GardenOrder_Korean.rb +839 -0
  84. data/lib/bcdice/game_system/HatsuneMiku.rb +51 -605
  85. data/lib/bcdice/game_system/HatsuneMiku_Korean.rb +56 -0
  86. data/lib/bcdice/game_system/HunterTheReckoning5th.rb +15 -11
  87. data/lib/bcdice/game_system/Irisbane.rb +17 -30
  88. data/lib/bcdice/game_system/Irisbane_Korean.rb +52 -0
  89. data/lib/bcdice/game_system/JuinKansen.rb +41 -208
  90. data/lib/bcdice/game_system/JuinKansen_Korean.rb +8 -213
  91. data/lib/bcdice/game_system/KemonoNoMori.rb +67 -276
  92. data/lib/bcdice/game_system/KemonoNoMori_Korean.rb +62 -0
  93. data/lib/bcdice/game_system/KinAriel.rb +117 -0
  94. data/lib/bcdice/game_system/KizunaBullet_Korean.rb +109 -0
  95. data/lib/bcdice/game_system/KutuluRevised.rb +94 -0
  96. data/lib/bcdice/game_system/LiverLabyrinth.rb +321 -0
  97. data/lib/bcdice/game_system/Lost.rb +89 -0
  98. data/lib/bcdice/game_system/MagicPunk.rb +85 -0
  99. data/lib/bcdice/game_system/MagicPunk_Korean.rb +39 -0
  100. data/lib/bcdice/game_system/MarvelHeroicRoleplaying.rb +144 -0
  101. data/lib/bcdice/game_system/MetallicGuardian_Korean.rb +28 -0
  102. data/lib/bcdice/game_system/MorkBorg.rb +170 -0
  103. data/lib/bcdice/game_system/MorkBorg_Korean.rb +49 -0
  104. data/lib/bcdice/game_system/NanimonaiMura.rb +112 -0
  105. data/lib/bcdice/game_system/Nechronica_Korean.rb +6 -6
  106. data/lib/bcdice/game_system/NegikureNegimaki.rb +140 -0
  107. data/lib/bcdice/game_system/NegikureNegimaki_Korean.rb +48 -0
  108. data/lib/bcdice/game_system/NeonUnderRealm.rb +122 -0
  109. data/lib/bcdice/game_system/NinjaSlayer2.rb +170 -49
  110. data/lib/bcdice/game_system/Nuekagami.rb +19 -261
  111. data/lib/bcdice/game_system/Nuekagami_Korean.rb +43 -0
  112. data/lib/bcdice/game_system/ParanoiaPerfect.rb +74 -0
  113. data/lib/bcdice/game_system/PastFutureParadox.rb +2245 -55
  114. data/lib/bcdice/game_system/PreciousDays.rb +170 -0
  115. data/lib/bcdice/game_system/Revulture.rb +8 -5
  116. data/lib/bcdice/game_system/Revulture_Korean.rb +7 -81
  117. data/lib/bcdice/game_system/Ryutama.rb +46 -46
  118. data/lib/bcdice/game_system/SRS.rb +4 -4
  119. data/lib/bcdice/game_system/SRS_Korean.rb +67 -0
  120. data/lib/bcdice/game_system/ShinobiGami.rb +154 -1047
  121. data/lib/bcdice/game_system/ShinobiGami_Korean.rb +102 -0
  122. data/lib/bcdice/game_system/StarryDolls.rb +70 -508
  123. data/lib/bcdice/game_system/StarryDolls_Korean.rb +80 -0
  124. data/lib/bcdice/game_system/StratoShout.rb +1 -1
  125. data/lib/bcdice/game_system/SwordWorld.rb +28 -2
  126. data/lib/bcdice/game_system/SwordWorld2_0.rb +1 -1
  127. data/lib/bcdice/game_system/SwordWorld2_5.rb +67 -3
  128. data/lib/bcdice/game_system/TacticalExorcist.rb +222 -0
  129. data/lib/bcdice/game_system/TenkaRyouran_Korean.rb +30 -0
  130. data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +38 -33
  131. data/lib/bcdice/game_system/Ventangle.rb +8 -7
  132. data/lib/bcdice/game_system/Ventangle_Korean.rb +6 -95
  133. data/lib/bcdice/game_system/Warhammer4.rb +202 -6
  134. data/lib/bcdice/game_system/WerewolfTheApocalypse5th.rb +20 -15
  135. data/lib/bcdice/game_system/WorldEndScrapyard.rb +333 -0
  136. data/lib/bcdice/game_system/WorldsEndFrontline_Korean.rb +26 -0
  137. data/lib/bcdice/game_system/YearZeroEngine.rb +7 -7
  138. data/lib/bcdice/game_system/YearZeroEngine_Korean.rb +46 -0
  139. data/lib/bcdice/game_system/ZombiLine.rb +29 -36
  140. data/lib/bcdice/game_system/ZombiLine_Korean.rb +37 -0
  141. data/lib/bcdice/game_system/cthulhu7th_Korean/full_auto.rb +294 -0
  142. data/lib/bcdice/game_system/cthulhu7th_Korean/rollable.rb +43 -0
  143. data/lib/bcdice/game_system/sword_world/rating_options.rb +9 -0
  144. data/lib/bcdice/game_system/sword_world/rating_parsed.rb +19 -0
  145. data/lib/bcdice/game_system/sword_world/rating_parser.rb +229 -149
  146. data/lib/bcdice/game_system/sword_world/transcendent_test.rb +1 -0
  147. data/lib/bcdice/game_system.rb +42 -0
  148. data/lib/bcdice/version.rb +1 -1
  149. metadata +87 -2
@@ -1,5 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "bcdice/game_system/cthulhu7th_Korean/rollable"
4
+ require "bcdice/game_system/cthulhu7th_Korean/full_auto"
5
+
3
6
  module BCDice
4
7
  module GameSystem
5
8
  class Cthulhu7th_Korean < Base
@@ -15,369 +18,537 @@ module BCDice
15
18
  # ダイスボットの使い方
16
19
  HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
17
20
  ・판정 CC(x)<=(목표치)
18
-  x:보너스, 패널티 주사위:Bonus/Penalty Dice (2~-2). 생략 가능.
19
-  대실패:Fumble/실패:Failure/보통 성공:Regular success/
20
-  어려운 성공:Hard success/대단한 성공:Extreme success/
21
-  대성공:Critical success 자동판정.
22
- 예)CC<=30 CC(2)<=50 CC(-1)<=75
23
-
24
- ・조합 판정 (CBR(x,y))
25
-  목표치 x y 로 동시에 %판정을 한다.
21
+  x:보너스, 페널티 주사위 (2~-2). 생략 가능.
22
+  목표치가 없어도 1D100은 표시됨.
23
+  대실패 / 실패 / 보통 성공 / 어려운 성공 /
24
+  극단적 성공 / 대성공 자동 판정.
25
+  예)CC<=30 CC(2)<=50 CC(+2)<=50 CC(-1)<=75 CC-1<=50 CC1<=65 CC+1<=65 CC
26
+
27
+ ・기능 판정의 난이도 지정 CC(x)<=(목표치)(난이도)
28
+  목표치 뒤에 난이도를 지정하여
29
+  성공 / 실패 / 대성공 / 대실패 를 자동 판정.
30
+  난이도 지정:
31
+   r:보통 h:어려운 e:극단적 c:대성공
32
+  예)CC<=70r CC1<=60h CC-2<=50e CC2<=99c
33
+
34
+ ・대항 판정 (CBR(x,y))
35
+  목표치 x와 y로 % 판정을 진행하여 성패를 판정.
26
36
   예)CBR(50,20)
27
37
 
28
- ・연사(Full Auto)판정 FAR(w,x,y,z)
29
-  w:탄수(1~100), x:기능 수치(1~100), y:고장 넘버
30
-  z:보너스, 패널티 주사위(-2~2). 생략 가능.
31
-  명중수와 관통수, 잔탄수만을 계산. 데미지는 계산하지 않습니다.
32
- 예)FAR(25,70,98) FAR(50,80,98,-1)
38
+ ・자동 사격 무기의 사격 판정(연사) FAR(w,x,y,z,d,v)
39
+  w:탄환 수(1~100), x:기능치(1~100), y:고장 수치,
40
+  z:보너스, 페널티 다이스(-2~2). 생략 가능.
41
+  d:지정한 난이도에서 연사를 종료(보통:r, 어려운:h, 극단적:e). 생략 가능.
42
+  v:연사할 탄환 수를 변경. 생략 가능.
43
+  명중 수와 관통 수, 남은 탄환 수만 산출. 대미지 산출은 하지 않음.
44
+ 예)FAR(25,70,98) FAR(50,80,98,-1) far(30,70,99,1,R)
45
+   far(25,88,96,2,h,5) FaR(40,77,100,,e,4) fAr(20,47,100,,,3)
46
+
47
+ ・각종 표
48
+  【광기 관련】
49
+  ・광기의 발작(실시간) BMR
50
+  ・광기의 발작(요약) BMS
51
+  ・공포증의 예  PH / 집착증의 예 MA
52
+
53
+  【마법 관련】
54
+  ・주문의 강행 판정 실패 표
55
+   비교적 약한 주문의 부작용 FCL/강력한 주문의 부작용 FCM
56
+   ※일본어로 출력됩니다.
33
57
  INFO_MESSAGE_TEXT
34
58
 
35
- register_prefix('CC', 'CBR', 'FAR')
36
-
37
- def initialize(command)
38
- super(command)
39
-
40
- @bonus_dice_range = (-2..2)
41
- end
59
+ register_prefix('CC', 'CBR', 'FAR', 'BMR', 'BMS', 'FCL', 'FCM', 'PH', 'MA')
42
60
 
43
61
  def eval_game_system_specific_command(command)
44
62
  case command
45
- when /CC/i
46
- return getCheckResult(command)
47
- when /CBR/i
48
- return getCombineRoll(command)
49
- when /FAR/i
50
- return getFullAutoResult(command)
51
- end
52
-
53
- return nil
54
- end
55
-
56
- def getCheckResult(command)
57
- nil unless /^CC([-\d]+)?<=(\d+)/i =~ command
58
- bonus_dice_count = Regexp.last_match(1).to_i # 보너스, 패널티 주사위의 개수
59
- diff = Regexp.last_match(2).to_i
60
-
61
- return "에러. 목표치는 1 이상입니다." if diff <= 0
62
-
63
- unless @bonus_dice_range.include?(bonus_dice_count)
64
- return "에러. 보너스, 패널티 주사위의 수치는 #{@bonus_dice_range.min}~#{@bonus_dice_range.max}입니다."
65
- end
66
-
67
- output = ""
68
- output += "(1D100<=#{diff})"
69
- output += " 보너스, 패널티 주사위[#{bonus_dice_count}]"
70
-
71
- units_digit = rollPercentD10
72
- total_list = getTotalLists(bonus_dice_count, units_digit)
73
-
74
- total = getTotal(total_list, bonus_dice_count)
75
- result_text = getCheckResultText(total, diff)
76
-
77
- output += " > #{total_list.join(', ')} > #{total} > #{result_text}"
78
-
79
- return output
80
- end
81
-
82
- def rollPercentD10
83
- dice = @randomizer.roll_once(10)
84
- dice = 0 if dice == 10
85
-
86
- return dice
87
- end
88
-
89
- def getTotalLists(bonus_dice_count, units_digit)
90
- total_list = []
91
-
92
- tens_digit_count = 1 + bonus_dice_count.abs
93
- tens_digit_count.times do
94
- bonus = rollPercentD10
95
- total = (bonus * 10) + units_digit
96
- total = 100 if total == 0
97
-
98
- total_list.push(total)
63
+ when /^CC/i
64
+ skill_roll(command)
65
+ when /^CBR/i
66
+ combine_roll(command)
67
+ when /^FAR/i
68
+ getFullAutoResult(command)
69
+ when "BMR" # 狂気の発作(リアルタイム)
70
+ roll_bmr_table()
71
+ when "BMS" # 狂気の発作(サマリー)
72
+ roll_bms_table()
73
+ when "FCL" # キャスティング・ロールのプッシュに失敗した場合(小)
74
+ roll_1d8_table("キャスティング・ロール失敗(小)表", FAILED_CASTING_L_TABLE)
75
+ when "FCM" # キャスティング・ロールのプッシュに失敗した場合(大)
76
+ roll_1d8_table("キャスティング・ロール失敗(大)表", FAILED_CASTING_M_TABLE)
77
+ when "PH" # 恐怖症表
78
+ roll_1d100_table("恐怖症表", PHOBIAS_TABLE)
79
+ when "MA" # マニア表
80
+ roll_1d100_table("マニア表", MANIAS_TABLE)
99
81
  end
100
-
101
- return total_list
102
82
  end
103
83
 
104
- def getTotal(total_list, bonus_dice_count)
105
- return total_list.min if bonus_dice_count >= 0
106
-
107
- return total_list.max
108
- end
109
-
110
- def getCheckResultText(total, diff, fumbleable = false)
111
- if total <= diff
112
- return "대성공" if total == 1
113
- return "대단한 성공" if total <= (diff / 5)
114
- return "어려운 성공" if total <= (diff / 2)
115
-
116
- return "보통 성공"
117
- end
118
-
119
- fumble_text = "대실패"
120
-
121
- return fumble_text if total == 100
122
-
123
- if total >= 96
124
- if diff < 50
125
- return fumble_text
84
+ class ResultLevel
85
+ LEVEL = [
86
+ :fumble,
87
+ :failure,
88
+ :success,
89
+ :regular_success,
90
+ :hard_success,
91
+ :extreme_success,
92
+ :critical,
93
+ ].freeze
94
+
95
+ LEVEL_TO_S = {
96
+ critical: "대성공",
97
+ extreme_success: "극단적 성공",
98
+ hard_success: "어려운 성공",
99
+ regular_success: "보통 성공",
100
+ success: "성공",
101
+ fumble: "대실패",
102
+ failure: "실패",
103
+ }.freeze
104
+
105
+ def self.with_difficulty_level(total, difficulty)
106
+ fumble = difficulty < 50 ? 96 : 100
107
+
108
+ if total == 1
109
+ ResultLevel.new(:critical)
110
+ elsif total >= fumble
111
+ ResultLevel.new(:fumble)
112
+ elsif total <= difficulty
113
+ ResultLevel.new(:success)
126
114
  else
127
- return fumble_text if fumbleable
115
+ ResultLevel.new(:failure)
128
116
  end
129
117
  end
130
118
 
131
- return "실패"
132
- end
133
-
134
- def getCombineRoll(command)
135
- return nil unless /CBR\((\d+),(\d+)\)/i =~ command
136
-
137
- diff_1 = Regexp.last_match(1).to_i
138
- diff_2 = Regexp.last_match(2).to_i
139
-
140
- total = @randomizer.roll_once(100)
141
-
142
- result_1 = getCheckResultText(total, diff_1)
143
- result_2 = getCheckResultText(total, diff_2)
144
-
145
- successList = ["대성공", "대단한 성공", "어려운 성공", "보통성공"]
146
-
147
- succesCount = 0
148
- succesCount += 1 if successList.include?(result_1)
149
- succesCount += 1 if successList.include?(result_2)
150
- debug("succesCount", succesCount)
151
-
152
- rank =
153
- if succesCount >= 2
154
- "성공"
155
- elsif succesCount == 1
156
- "부분적 성공"
119
+ def self.from_values(total, difficulty, fumbleable = false)
120
+ fumble = difficulty < 50 || fumbleable ? 96 : 100
121
+
122
+ if total == 1
123
+ ResultLevel.new(:critical)
124
+ elsif total >= fumble
125
+ ResultLevel.new(:fumble)
126
+ elsif total <= (difficulty / 5)
127
+ ResultLevel.new(:extreme_success)
128
+ elsif total <= (difficulty / 2)
129
+ ResultLevel.new(:hard_success)
130
+ elsif total <= difficulty
131
+ ResultLevel.new(:regular_success)
157
132
  else
158
- "실패"
133
+ ResultLevel.new(:failure)
159
134
  end
135
+ end
160
136
 
161
- return "(1d100<=#{diff_1},#{diff_2}) > #{total}[#{result_1},#{result_2}] > #{rank}"
162
- end
163
-
164
- def getFullAutoResult(command)
165
- return nil unless /^FAR\((-?\d+)(,(-?\d+))(,(-?\d+))(,(-?\d+))?\)/i =~ command
166
-
167
- bullet_count = Regexp.last_match(1).to_i
168
- diff = Regexp.last_match(3).to_i
169
- broken_number = Regexp.last_match(5).to_i
170
- bonus_dice_count = (Regexp.last_match(7) || 0).to_i
171
-
172
- output = ""
173
-
174
- # 최대(8번*(PC기능 수치 최대값/10))=72발밖에 쏠 수 없으니 상한
175
- bullet_count_limit = 100
176
- if bullet_count > bullet_count_limit
177
- output += "\n탄약이 너무 많습니다. 장전된 탄약을 #{bullet_count_limit}개로 변경합니다.\n"
178
- bullet_count = bullet_count_limit
137
+ def initialize(level)
138
+ @level = level
139
+ @level_index = LEVEL.index(level)
140
+ raise ArgumentError unless @level_index
179
141
  end
180
142
 
181
- return "탄약은 1 이상입니다." if bullet_count <= 0
182
- return "목표치는 1 이상입니다." if diff <= 0
143
+ def success?
144
+ @level_index >= LEVEL.index(:success)
145
+ end
183
146
 
184
- if broken_number < 0
185
- output += "\n고장 넘버는 1 이상입니다. 마이너스 기호를 제거합니다.\n"
186
- broken_number = broken_number.abs
147
+ def failure?
148
+ @level_index <= LEVEL.index(:failure)
187
149
  end
188
150
 
189
- unless @bonus_dice_range.include?(bonus_dice_count)
190
- return "\n에러. 보너스, 패널티 주사위의 수치는 #{@bonus_dice_range.min}~#{@bonus_dice_range.max}입니다."
151
+ def critical?
152
+ @level == :critical
191
153
  end
192
154
 
193
- output += "보너스, 패널티 주사위 [#{bonus_dice_count}]"
194
- output += rollFullAuto(bullet_count, diff, broken_number, bonus_dice_count)
155
+ def fumble?
156
+ @level == :fumble
157
+ end
195
158
 
196
- return output
159
+ def to_s
160
+ LEVEL_TO_S[@level]
161
+ end
197
162
  end
198
163
 
199
- def rollFullAuto(bullet_count, diff, broken_number, dice_num)
200
- output = ""
201
- loopCount = 0
202
-
203
- counts = {
204
- hit_bullet: 0,
205
- impale_bullet: 0,
206
- bullet: bullet_count,
207
- }
208
-
209
- # 난이도 변경용 루프
210
- 4.times do |more_difficlty|
211
- output += getNextDifficltyMessage(more_difficlty)
212
-
213
- # 패널티 다이스를 줄이면서 굴리는 용 루프
214
- while dice_num >= @bonus_dice_range.min
215
-
216
- loopCount += 1
217
- hit_result, total, total_list = getHitResultInfos(dice_num, diff, more_difficlty)
218
- output += "\n#{loopCount}번째: > #{total_list.join(', ')} > #{hit_result}"
219
-
220
- if total >= broken_number
221
- output += " 총알 걸림"
222
- return getHitResultText(output, counts)
223
- end
224
-
225
- hit_type = getHitType(more_difficlty, hit_result)
226
- hit_bullet, impale_bullet, lost_bullet = getBulletResults(counts[:bullet], hit_type, diff)
164
+ private
227
165
 
228
- counts[:hit_bullet] += hit_bullet
229
- counts[:impale_bullet] += impale_bullet
230
- counts[:bullet] -= lost_bullet
166
+ include Rollable
231
167
 
232
- return getHitResultText(output, counts) if counts[:bullet] <= 0
168
+ def roll_1d8_table(table_name, table)
169
+ total_n = @randomizer.roll_once(8)
170
+ index = total_n - 1
233
171
 
234
- dice_num -= 1
235
- end
236
-
237
- dice_num += 1
238
- end
172
+ text = table[index]
239
173
 
240
- return getHitResultText(output, counts)
174
+ return "#{table_name}(#{total_n}) > #{text}"
241
175
  end
242
176
 
243
- def getHitResultInfos(dice_num, diff, more_difficlty)
244
- units_digit = rollPercentD10
245
- total_list = getTotalLists(dice_num, units_digit)
246
- total = getTotal(total_list, dice_num)
177
+ def roll_1d100_table(table_name, table)
178
+ total_n = @randomizer.roll_once(100)
179
+ index = total_n - 1
247
180
 
248
- fumbleable = getFumbleable(more_difficlty)
249
- hit_result = getCheckResultText(total, diff, fumbleable)
181
+ text = table[index]
250
182
 
251
- return hit_result, total, total_list
183
+ return "#{table_name}(#{total_n}) #{text}"
252
184
  end
253
185
 
254
- def getHitResultText(output, counts)
255
- return "#{output}\n> #{counts[:hit_bullet]}발이 명중, #{counts[:impale_bullet]}발이 관통, 잔탄 #{counts[:bullet]}발"
256
- end
257
-
258
- def getHitType(more_difficlty, hit_result)
259
- successList, impaleBulletList = getSuccessListImpaleBulletList(more_difficlty)
260
-
261
- return :hit if successList.include?(hit_result)
262
- return :impale if impaleBulletList.include?(hit_result)
263
-
264
- return ""
265
- end
186
+ def skill_roll(command)
187
+ m = /^CC([-+]?\d+)?(?:<=(\d+)([RHEC])?)?$/.match(command)
188
+ unless m
189
+ return nil
190
+ end
266
191
 
267
- def getBulletResults(bullet_count, hit_type, diff)
268
- bullet_set_count = getSetOfBullet(diff)
269
- hit_bullet_count_base = getHitBulletCountBase(diff, bullet_set_count)
270
- impale_bullet_count_base = (bullet_set_count / 2.to_f)
192
+ bonus_dice = m[1].to_i
193
+ difficulty = m[2]&.to_i
194
+ difficulty_level = m[3]
195
+
196
+ if difficulty == 0
197
+ difficulty = nil
198
+ elsif difficulty_level == "H"
199
+ difficulty /= 2
200
+ elsif difficulty_level == "E"
201
+ difficulty /= 5
202
+ elsif difficulty_level == "C"
203
+ difficulty = 0
204
+ end
271
205
 
272
- lost_bullet_count = 0
273
- hit_bullet_count = 0
274
- impale_bullet_count = 0
206
+ if bonus_dice == 0 && difficulty.nil?
207
+ dice = @randomizer.roll_once(100)
208
+ return "(1D100) > #{dice}"
209
+ end
275
210
 
276
- if !isLastBulletTurn(bullet_count, bullet_set_count)
211
+ if bonus_dice.abs > 100
212
+ return "보너스, 페널티 주사위의 값은 -100 이상, 100 이하로 지정해 주세요."
213
+ end
277
214
 
278
- case hit_type
279
- when :hit
280
- hit_bullet_count = hit_bullet_count_base # 보통명중한 탄수의 계산
215
+ total, total_list = roll_with_bonus(bonus_dice)
281
216
 
282
- when :impale
283
- hit_bullet_count = impale_bullet_count_base.floor
284
- impale_bullet_count = impale_bullet_count_base.ceil # 관통한 탄수의 계산
217
+ expr = difficulty.nil? ? "1D100" : "1D100<=#{difficulty}"
218
+ result =
219
+ if difficulty_level
220
+ ResultLevel.with_difficulty_level(total, difficulty)
221
+ elsif difficulty
222
+ ResultLevel.from_values(total, difficulty)
285
223
  end
286
224
 
287
- lost_bullet_count = bullet_set_count
288
-
289
- else
290
-
291
- case hit_type
292
- when :hit
293
- hit_bullet_count = getLastHitBulletCount(bullet_count)
294
-
295
- when :impale
296
- halfbull = bullet_count / 2.to_f
297
-
298
- hit_bullet_count = halfbull.floor
299
- impale_bullet_count = halfbull.ceil
225
+ sequence = [
226
+ "(#{expr}) 보너스, 페널티 주사위[#{bonus_dice}]",
227
+ total_list.join(", "),
228
+ total,
229
+ result,
230
+ ].compact
231
+
232
+ Result.new.tap do |r|
233
+ r.text = sequence.join(" > ")
234
+ if result
235
+ r.condition = result.success?
236
+ r.critical = result.critical?
237
+ r.fumble = result.fumble?
300
238
  end
301
-
302
- lost_bullet_count = bullet_count
303
239
  end
304
-
305
- return hit_bullet_count, impale_bullet_count, lost_bullet_count
306
240
  end
307
241
 
308
- def getSuccessListImpaleBulletList(more_difficlty)
309
- successList = []
310
- impaleBulletList = []
311
-
312
- case more_difficlty
313
- when 0
314
- successList = ["어려운 성공", "보통 성공"]
315
- impaleBulletList = ["대성공", "대단한 성공"]
316
- when 1
317
- successList = ["어려운 성공"]
318
- impaleBulletList = ["대성공", "대단한 성공"]
319
- when 2
320
- successList = []
321
- impaleBulletList = ["대성공", "대단한 성공"]
322
- when 3
323
- successList = ["대성공"]
324
- impaleBulletList = []
325
- end
326
-
327
- return successList, impaleBulletList
242
+ def getFullAutoResult(command)
243
+ FullAuto.eval(command, @randomizer)
328
244
  end
329
245
 
330
- def getNextDifficltyMessage(more_difficlty)
331
- case more_difficlty
332
- when 1
333
- return "\n 난이도가 어려운 성공으로 변경"
334
- when 2
335
- return "\n 난이도가 대단한 성공으로 변경"
336
- when 3
337
- return "\n 난이도가 대성공으로 변경"
338
- end
339
-
340
- return ""
341
- end
246
+ def combine_roll(command)
247
+ m = /^CBR\((\d+),(\d+)\)$/.match(command)
248
+ return nil unless m
342
249
 
343
- def getSetOfBullet(diff)
344
- bullet_set_count = diff / 10
250
+ difficulty_1 = m[1].to_i
251
+ difficulty_2 = m[2].to_i
345
252
 
346
- if (diff >= 1) && (diff < 10)
347
- bullet_set_count = 1 # 기능 수치가 9 이하일 때의 최저수치 보장 처리
348
- end
253
+ total = @randomizer.roll_once(100)
349
254
 
350
- return bullet_set_count
351
- end
255
+ result_1 = ResultLevel.from_values(total, difficulty_1)
256
+ result_2 = ResultLevel.from_values(total, difficulty_2)
352
257
 
353
- def getHitBulletCountBase(diff, bullet_set_count)
354
- hit_bullet_count_base = (bullet_set_count / 2)
258
+ rank =
259
+ if result_1.success? && result_2.success?
260
+ "성공"
261
+ elsif result_1.success? || result_2.success?
262
+ "일부 성공"
263
+ else
264
+ "실패"
265
+ end
355
266
 
356
- if (diff >= 1) && (diff < 10)
357
- hit_bullet_count_base = 1 # 기능 수치가 9 이하일 때의 최저수치 보장
267
+ Result.new.tap do |r|
268
+ r.text = "(1d100<=#{difficulty_1},#{difficulty_2}) #{total}[#{result_1},#{result_2}] #{rank}"
269
+ r.success = result_1.success? && result_2.success?
270
+ r.failure = result_1.failure? && result_2.failure?
358
271
  end
359
-
360
- return hit_bullet_count_base
361
272
  end
362
273
 
363
- def isLastBulletTurn(bullet_count, bullet_set_count)
364
- ((bullet_count - bullet_set_count) < 0)
365
- end
274
+ # 表一式
275
+ # 即時の恐怖症表
276
+ def roll_bmr_table()
277
+ total_n = @randomizer.roll_once(10)
278
+ text = MADNESS_REAL_TIME_TABLE[total_n - 1]
366
279
 
367
- def getLastHitBulletCount(bullet_count)
368
- # 잔탄 1발일 때의 최저수치 보장 처리
369
- if bullet_count == 1
370
- return 1
371
- end
280
+ time_n = @randomizer.roll_once(10)
372
281
 
373
- count = (bullet_count / 2.to_f).floor
374
- return count
282
+ return "狂気の発作(リアルタイム)(#{total_n}) #{text}(1D10>#{time_n}ラウンド)"
375
283
  end
376
284
 
377
- def getFumbleable(more_difficlty)
378
- # 성공이 49 이하일때만이기 때문에 펌블치는 상승
379
- return (more_difficlty >= 1)
285
+ MADNESS_REAL_TIME_TABLE = [
286
+ '健忘症:探索者は、最後に安全な場所にいた時からあとに起こった出来事の記憶を持たない。例えば、朝食を食べていた次の瞬間には怪物と向かい合っている。これは1D10ラウンド続く。',
287
+ '身体症状症:探索者は1D10ラウンドの間、狂気によって視覚や聴覚に異常が生じたり、四肢の1つまたは複数が動かなくなる。',
288
+ '暴力衝動:赤い霧が探索者に降り、1D10ラウンドの間、抑えの利かない暴力と破壊を敵味方を問わず周囲に向かって爆発させる。',
289
+ '偏執症:探索者は1D10ラウンドの間、重い偏執症に襲われる。誰もが探索者に襲い掛かろうとしている。信用できる者はいない。監視されている。裏切ったやつがいる。これはわなだ。',
290
+ '重要な人々:探索者のバックストーリーの重要な人々を見直す。探索者はその場にいた人物を、自分にとっての重要な人々だと思い込む。人間関係の性質を考慮した上で、探索者はそれに従って行動する。1D10ラウンド続く。',
291
+ '失神:探索者は失神する。1D10ラウンド後に回復する。',
292
+ 'パニックになって逃亡する:探索者は利用できるあらゆる手段を使って、可能なかぎり遠くへ逃げ出さずにはいられない。それが唯一の車両を奪って仲間を置き去りにすることであっても。探索者は1D10ラウンドの間、逃げ続ける。',
293
+ '身体的ヒステリーもしくは感情爆発:探索者は1D10ラウンドの間、笑ったり、泣いたり、あるいは叫んだりし続け、行動できなくなる。',
294
+ '恐怖症:探索者は新しい恐怖症に陥る。恐怖症表(PHコマンド)をロールするか、キーパーが恐怖症を1つ選ぶ。恐怖症の原因は存在しなくとも、その探索者は次の1D10ラウンドの間、それがそこにあると思い込む。',
295
+ 'マニア:探索者は新しいマニアに陥る。マニア表(MAコマンド)をロールするか、キーパーがマニアを1つ選ぶ。その探索者は次の1D10ラウンドの間、自分の新しいマニアに没頭しようとする。'
296
+ ].freeze
297
+
298
+ # 略式の恐怖表
299
+ def roll_bms_table()
300
+ total_n = @randomizer.roll_once(10)
301
+ text = MADNESS_SUMMARY_TABLE[total_n - 1]
302
+
303
+ time_n = @randomizer.roll_once(10)
304
+
305
+ return "狂気の発作(サマリー)(#{total_n}) > #{text}(1D10>#{time_n}時間)"
380
306
  end
307
+
308
+ MADNESS_SUMMARY_TABLE = [
309
+ '健忘症:探索者が意識を取り戻すと、見知らぬ場所におり、自分が誰かもわからない。記憶は時間をかけてゆっくりと戻るだろう。',
310
+ '盗難:探索者は1D10時間後に意識を取り戻すが、盗難の被害を受けている。傷つけられてはいない。探索者が秘蔵の品を身に着けていた場合(「探索者のバックストーリー」参照)、〈幸運〉ロールを行い、それが盗まれていないか判定する。値打ちのあるものはすべて自動的に失われる。',
311
+ '暴行:探索者は1D10時間後に意識を取り戻し、自分が暴行を受け、傷ついていることに気づく。耐久力は狂気に陥る前の半分に減少している。ただし重症は生じていない。盗まれたものはない。どのようにダメージが加えられたかは、キーパーに委ねられる。',
312
+ '暴力:探索者は暴力と破壊の噴流を爆発させる。探索者が意識を取り戻した時、その行動を認識し記憶していることもあればそうでないこともある。探索者が暴力を振るった物、もしくは人、そして相手を殺してしまったのか、あるいは単に傷つけただけなのかはキーパーに委ねられる。',
313
+ 'イデオロギー/信念:探索者のバックストーリーのイデオロギーと信念を参照する。探索者はこれらの1つの権化となり、急進的かつ狂気じみて、感情もあらわに主張するようになる。例えば、宗教に関係する者は、その後地下鉄で声高に福音を説教しているところを目撃されるかもしれない。',
314
+ '重要な人々:探索者のバックストーリーの重要な人々を参照し、なぜその人物との関係が重要かを考える。時間がたってから(1D10時間以上)、探索者はその人物に近づくための最善の行動、そしてその人物との関係にとって最善の行動をとる。',
315
+ '収容:探索者は精神療養施設あるいは警察の留置所で意識を取り戻す。探索者は徐々にそこにいたった出来事を思い出すかもしれない。',
316
+ 'パニック:探索者は非常に遠い場所で意識を取り戻す。荒野で道に迷っているか、列車に乗っているか、長距離バスに乗っているかもしれない。',
317
+ '恐怖症:探索者は新たな恐怖症を獲得する。恐怖症表(PHコマンド)をロールするか、キーパーがどれか1つ選ぶ。探索者は1D10時間後に意識を取り戻し、この新たな恐怖症の対象を避けるためにあらゆる努力をする。',
318
+ 'マニア:探索者は新たなマニアを獲得する。マニア表(MAコマンド)をロールするか、キーパーがどれか1つ選ぶ。この狂気の発作の間、探索者はこの新たなマニアに完全に溺れているだろう。これがほかの人々に気づかれるかどうかは、キーパーとプレイヤーに委ねられる。'
319
+ ].freeze
320
+
321
+ # キャスティング・ロールのプッシュに失敗した場合(小)
322
+ FAILED_CASTING_L_TABLE = [
323
+ '視界がぼんやりするか、あるいは一時的な失明。',
324
+ '悲鳴、声、あるいはほかの雑音が肉体から発せられる。',
325
+ '強風やほかの大気の現象。',
326
+ '術者、ほかのその場に居合わせた者が出血する。あるいは環境(例えば、壁)から出血する。',
327
+ '奇妙な幻視と幻覚。',
328
+ 'その付近の小動物たちが爆発する。',
329
+ '硫黄の悪臭。',
330
+ 'クトゥルフ神話の怪物が偶然召喚される。'
331
+ ].freeze
332
+
333
+ # キャスティング・ロールのプッシュに失敗した場合(大)
334
+ FAILED_CASTING_M_TABLE = [
335
+ '大地が震え、壁に亀裂が入って崩れる。',
336
+ '叙事詩的な電撃。',
337
+ '血が空から降る。',
338
+ '術者の手がしなび、焼けただれる。',
339
+ '術者は不自然に年をとる(年齢に+2D10歳、30ページの「年齢」を参照し、能力値に修正を適用すること)。',
340
+ '強力な、あるいは無数のクトゥルフ神話存在が現れ、術者を手始めに、近くの全員を攻撃する!',
341
+ '術者や近くの全員が遠い時代か場所に吸い込まれる。',
342
+ 'クトゥルフ神話の神格が偶然招来される。'
343
+ ].freeze
344
+
345
+ # 恐怖症表 공포증 표
346
+ PHOBIAS_TABLE = [
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
+ '8恐怖症:8の数字が怖い。',
412
+ '歯恐怖症:歯が怖い。',
413
+ '夢恐怖症:夢が怖い。',
414
+ '名称恐怖症:特定の言葉(1つまたは複数)を聞くのが怖い。',
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
+ '13恐怖症:13の数字が怖い。',
441
+ '衣類恐怖症:衣服が怖い。',
442
+ '魔女恐怖症:魔女と魔術が怖い。',
443
+ '黄色恐怖症:黄色や「黄色」という言葉が怖い。',
444
+ '外国語恐怖症:外国語が怖い。',
445
+ '外国人恐怖症:外国人が怖い。',
446
+ '動物恐怖症:動物が怖い。',
447
+ ].freeze
448
+
449
+ # マニア表 집착증 표
450
+ MANIAS_TABLE = [
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
+ '偏執マニア:ただ1つの思想やアイデアへの異常な執着。',
521
+ '虚言マニア:異常なほどにうそをついたり、誇張して話す。',
522
+ '疾病マニア:想像上の病気に苦められる幻想。',
523
+ '記録マニア:あらゆるものを記録に残そうという強迫的衝動。',
524
+ '名前マニア:人々、場所、ものなどの名前への執着',
525
+ '単語マニア:ある単語を繰り返したいという押さえ切れない欲求。',
526
+ '爪損傷マニア:指の爪をむしったりはがそうとする強迫的衝動。',
527
+ '美食マニア:1種類の食物への異常な愛。',
528
+ '不平マニア:不平を言うことへの異常な喜び。',
529
+ '仮面マニア:仮面や覆面を着けたいという強迫的衝動。',
530
+ '幽霊マニア:幽霊への執着。',
531
+ '殺人マニア:殺人への病的な傾向。',
532
+ '光線マニア:光への病的な願望。',
533
+ '放浪マニア:社会の規範に背きたいという異常な欲望。',
534
+ '長者マニア:富への強迫的な欲望。',
535
+ '病的虚言マニア:うそをつきたくてたまらない強迫的衝動。',
536
+ '放火マニア:火をつけることへの強迫的衝動。',
537
+ '質問マニア:質問したいという激しい強迫的衝動。',
538
+ '鼻マニア:鼻をいじりたいという強迫的衝動。',
539
+ '落書きマニア:いらずら書きや落書きへの執着。',
540
+ '列車マニア:列車と鉄道旅行への強い魅了。',
541
+ '知性マニア:誰かが信じられないほど知的であるという幻想。',
542
+ 'テクノマニア:新技術への執着。',
543
+ 'タナトスマニア:誰かが死を招く魔術によって呪われているという信念。',
544
+ '宗教マニア:その人が神であるという信仰。',
545
+ 'かき傷マニア:かき傷をつけることへの強迫的衝動。',
546
+ '手術マニア:外科手術を行なうことへの不合理な嗜好。',
547
+ '抜毛マニア:自分の髪を引き抜くことへの切望。',
548
+ '失明マニア:病的な視覚障害。',
549
+ '異国マニア:外国のものへの執着。',
550
+ '動物マニア:動物への正気でない溺愛。',
551
+ ].freeze
381
552
  end
382
553
  end
383
554
  end