bcdice 3.15.0 → 3.16.1

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.
@@ -0,0 +1,251 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class JuinKansen_Korean < JuinKansen
6
+ # ゲームシステムの識別子
7
+ ID = "JuinKansen:Korean"
8
+
9
+ # ゲームシステム名
10
+ NAME = "주인감염"
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = "国際化:Korean:주인감염"
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~INFO_MESSAGE_TEXT
17
+ ■ 표
18
+ ・일상 표 (DAI, Daily)
19
+ ・장소 표
20
+ ・「도시」 (PCI, PlaceCity)
21
+ ・「시골」 (PCO, PlaceCountryside)
22
+ ・「시설 안」 (PFA, PlaceFacility)
23
+ ・초면 표 (FL, FirstLook)
24
+ ・친구 표 (AF, AppreciativeFriend)
25
+ ・복선 표 (FOR, Foreshadow)
26
+ ・감정 표 (EMO, Emotion)
27
+ ・상황 표 (SIT, Situation)
28
+ ・대상 표 (TAR, Target)
29
+ ・광기 표 (INS, Insanity)
30
+ ・종말 표 (DEA, Death)
31
+ ・공포 표 (FEA, Fear)
32
+ INFO_MESSAGE_TEXT
33
+
34
+ def eval_game_system_specific_command(command)
35
+ roll_tables(ALIAS[command] || command, TABLES)
36
+ end
37
+
38
+ TABLES = {
39
+ "Daily" => DiceTable::Table.new(
40
+ "일상 표",
41
+ "2D6",
42
+ [
43
+ "「목욕 중」『내용』PC 자기소개 후, 자신의 집에서 어떻게 목욕하고 있는가에 대해 간단히 설명하라.『종료조건』GM이 '몸을 다 씻었으므로 슬슬 나가려 한다' 라고 선언한다.",
44
+ "「자취」『내용』PC 자기소개 후, 자기 집에서 어떤 식사를 만들지, 자취를 잘하는지 못하는지를 설명하라.『종료조건』GM이 '요리가 완성되어 식사를 시작한다' 라고 선언한다.",
45
+ "「휴식시간」『내용』PC 자기소개 후, 직장이나 학교 휴식시간에 어디서 무엇을 하는지 간단히 설명하라.『종료조건』GM이 '슬슬 휴식시간이 끝날 것 같다' 라고 선언한다.",
46
+ "「귀가 중」『내용』PC 자기소개 후, 직장이나 학교로부터 귀가할 때 무엇을 하는지 간단히 설명하라.『종료조건』GM이 집에 도착했다고 선언한다.",
47
+ "「점심시간」『내용』PC 자기소개 후, 직장이나 학교 점심시간에 어디서 무엇을 먹는지 간단히 설명하라.『종료조건』GM이 점심시간이 슬슬 끝난다고 선언한다.",
48
+ "「업무 중」『내용』PC 자기소개 후, 직장이나 학교에서 어떤 태도로 일에 임하는지 간단히 설명하라.『종료조건』GM이 휴식시간을 알리는 종 같은 것이 울린다고 선언한다.",
49
+ "「통근,통학」『내용』PC 자기소개 후, 어떤 방법으로 통근, 통학하고 있는지 간단히 설명하라.『종료조건』GM이 직장이나 학교에 도착했다고 선언한다.",
50
+ "「휴일」『내용』PC 자기소개 후, 휴일에 무엇을 하는지 간단히 설명하라.『종료조건』GM이 '슬슬 내일 준비를 해야 한다' 라고 선언한다.",
51
+ "「자택」『내용』PC 자기소개 후, 자택에 있는 자신의 방에서 어떻게 쉬고 있는지 간단히 설명하라.『종료조건』GM이 '슬슬 잘 시간이다' 라고 선언한다.",
52
+ "「잠에서 깬 직후」『내용』PC 자기소개 후, 자택에서 기상한 직후에 어떤 행동을 하는지 간단히 설명하라.『종료조건』GM이 '출근, 통학 준비를 마쳤다' 라고 선언한다.",
53
+ "「취미」『내용』PC 자기소개 후, 자기 방에서 어떤 취미에 몰두해있는지 간단히 설명하라.『종료조건』GM이 '아쉽지만 이제 잘 시간이다' 라고 선언한다.",
54
+ ]
55
+ ),
56
+ "PlaceCity" => DiceTable::Table.new(
57
+ "장소 표「도시」",
58
+ "2D6",
59
+ [
60
+ "「사건현장」여기는 이전에 괴이사건이 일어났다는 소문이 있는 사건현장이다. 잘 보면 근처에 시든 꽃다발이 놓여있다.",
61
+ "「귀갓길」여기는 귀갓길이다. 시간대 때문인지 주변에 인기척이 없고 작은 소리에도 귀가 울릴 정도로 정적에 휩싸여 있다.",
62
+ "「근처 공원」여기는 자기 집, 회사, 학교 중 어느 한 곳의 근처에 있는 공원이다. 지금 있는 장소는 안쪽에 있는 정자로, 근처에 자판기가 나란히 있다.",
63
+ "「근처 편의점」여기는 PC의 집 근처 편의점이다. 큰 주차장이 있기 때문인지 주변이 매우 탁 트여있다.",
64
+ "「술집」여기는 어디에나 있는 술집이다. 그러나 손님이 드문드문 오고 주변에는 빈 자리가 눈에 띈다.",
65
+ "「전철역 광장」여기는 사람들이 출근이나 통학할 때 이용하는, 역의 광장이다. 그러나 지나며 마주치는 사람들의 시선이 왜인지 차갑고, 공허함마저 느껴진다.",
66
+ "「신사,절」여기는 길거리에 있는 신사, 또는 절이다. 부탁하면 액막이를 해준다는 이야기가 있는데, 실제로 그 덕을 보는지는 불확실하다.",
67
+ "「도서관」여기는 거리에 있는 공립 도서관이다. 주변에는 낡은 책이나 새로운 책 등 다양한 서적이 늘어서 있기 때문에 조사에 안성맞춤이다.",
68
+ "「강가의 길」여기는 근처에 있는 강가의 길이다. 주변에는 인기척이 없고 무기질적인 도로가 저 멀리까지 이어져있다.",
69
+ "「병원 앞」여기는 근처에 있는 한 종합병원 앞이다. 통원하는 환자로 보이는 노인이나 젊은이가 이따금 새로 만들어진 출입구를 드나들고 있다.",
70
+ "「경찰서 앞」여기는 거리에 있는 경찰서 앞이다. 이번 사건, 또는 방금 전의 괴이현상에 대해 이야기해도… 아마도, 믿지 않겠지.",
71
+ ]
72
+ ),
73
+ "PlaceCountryside" => DiceTable::Table.new(
74
+ "장소 표「시골」",
75
+ "2D6",
76
+ [
77
+ "「사건현장」여기는 이전에 괴이사건이 일어났다는 소문이 있는 사건현장이다. 잘 보면 근처에 시든 꽃다발이 놓여있다.",
78
+ "「학교 앞」여기는 마을 안쪽의 한 학교 앞이다. 그러나 몇년 전부터 폐교했다고 하며, 문은 굳게 닫혀 있고 학교 정원에는 잡초가 무성하다.",
79
+ "「공원」여기는 마을 안쪽의 공원이다. 가운데에 우두커니 서 있는 놀이기구들은 모두 녹슬어 있으며, 곳곳에 잡초가 자라나 있다.",
80
+ "「면사무소」여기는 마을의 면사무소다. 그러나 면사무소의 문은 닫혀있고 안에는 인기척이 없다.",
81
+ "「숲 속」여기는 도로에서 떨어진 곳에 있는 숲 속이다. 주변에서 동물 울음소리가 들려온다.",
82
+ "「버스 정류장」여기는 마을의 유일한 버스 정류장이다. 시간표를 보지만, 버스는 하루에 1대 밖에 오지 않는다.",
83
+ "「신사,절」여기는 마을 안에 있는 신사, 또는 절이다. 안은 녹슬어 있으며 인기척은 전무하다.",
84
+ "「논밭」여기는 마을과 떨어진 곳에 있는 논밭이다. 농한기이기 때문인지 밭은 방치되어 있으며 주변을 둘러 보아도 사람의 모습은 보이지 않는다.",
85
+ "「강가」여기는 마을과 떨어진 곳에 있는 강가이다. 눈앞의 강은 안이 투명하게 보이며, 물고기 몇몇이 헤엄치고 있다.",
86
+ "「병원 앞」여기는 마을의 작은 병원 앞이다. 그러나 오늘은 정기 휴일인지 병원이 닫혀있다.",
87
+ "「파출소 앞」여기는 마을의 유일한 파출소 앞이다. 그러나 경찰관의 모습은 보이지 않고 문도 굳게 닫혀있다.",
88
+ ]
89
+ ),
90
+ "PlaceFacility" => DiceTable::Table.new(
91
+ "장소 표「시설 안」",
92
+ "2D6",
93
+ [
94
+ "「예배당」여기는 지하에 있는, 예배당 같아보이는 곳이다. 방 안쪽에는 기묘한 모습의 석상이 있고 주위는 불길한 기운이 감돈다.",
95
+ "「숨겨진 방」여기는 숨겨진 방으로 보이는 곳이다. 방의 벽에는 혈흔으로 보이는 얼룩이 묻어있다.",
96
+ "「창고」여기는 중심지에 있는 창고다. 장소 탓인지 혹은 이변 탓인지, 주변에 기분나쁜 곰팡이가 피어있다.",
97
+ "「침대 방」여기는 침대가 있는 장소다. 내부에는 간소한 침대와 책상 만이 놓여있어 매우 살풍경하다.",
98
+ "「응접실」여기는 응접실로 보이는 방이다. 방 가운데에는 커다란 테이블과 소파가 있다.",
99
+ "「복도」여기는 시설 안으로 통하는 복도 중 하나다. 전등이 없어서인지 아니면 시간대 때문인지, 주변은 특히나 침침하다.",
100
+ "「로비」여기는 로비다. 문은 여전히 열릴 기미가 보이지 않으며, 주변은 침묵 만이 계속되고 있다.",
101
+ "「층계참」여기는 계단의 층계참이다. 주변은 몹시 침침하고 이렇다할 물건은 아무 것도 없다.",
102
+ "「지하실」여기는 지하실이다. 바닥에 옅게 먼지가 쌓여있으며, 오랜 시간 쓰지 않은 듯하다.",
103
+ "「실험실」여기는 실험실로 보이는 장소이다. 방 가운데에는 커다란 테이블이 설치되어 있으며, 왜인지 피투성이다.",
104
+ "「연구실」여기는 연구실로 보이는 장소이다. 방은 전체적으로 어둡고, 안쪽 찬장에는 기묘한 모습의 생물이 포르말린에 잠겨 늘어서 있다.",
105
+ ]
106
+ ),
107
+ "FirstLook" => DiceTable::Table.new(
108
+ "초면 표",
109
+ "2D6",
110
+ [
111
+ "「습격으로부터 구출」『내용』PC간 재회 후 【운명】이 낮은 PC가 갑자기 불량배 등에게 얽혀서, 【운명】이 높은 PC가 힘이나 기지를 발휘해 구해내는 장면을 연출하라.『종료조건』【운명】이 낮은 PC가 【운명】이 높은 PC에게 감사 인사를 한다.",
112
+ "「분실물」『내용』PC간 재회 후 【행운】이 낮은 PC가 소지품을 떨어뜨리며, 그것을 【행운】이 높은 PC가 주워 건네주는 장면을 연출하라.『종료조건』【행운】이 낮은 PC가 【행운】이 높은 PC의 [주인]을 눈치챈다.",
113
+ "「검은 그림자」『내용』PC간 재회 후 【정신】이 높은 PC가 【정신】이 낮은 PC의 등 뒤에서 검은 그림자를 목격하는 장면을 연출하라.『종료조건』【정신】이 높은 PC가 '방금… 뭐였지?'라고 묻는다.",
114
+ "「<무언가>를 봤다」『내용』PC간 재회 후, 【행운】이 낮은 PC가 어둠 속에서 <무언가>를 목격. 낯빛이 창백해지는 장면을 연출하라.『종료조건』【행운】이 높은 PC가 【행운】이 낮은 PC를 염려한다.",
115
+ "「부르는 목소리」『내용』PC간 재회후, 멀리서 으스스한, 무언가를 부르는 목소리를 들어 주위를 둘러보다 서로 눈이 마주치는 장면을 연출하라.『종료조건』PC 중 누군가가 '지금 그거... 들었어?' 라고 묻고 누군가가 답한다.",
116
+ "「지인」『내용』PC간 재회 후, 사실 지인의 지인이었다는 것이 판명되는 장면을 연출하라.『종료조건』PC간 어떤 관계인가에 대해 서로 이야기하여 결정한다.",
117
+ "「사고로부터 구출」『내용』낙하물이나 교통사고 등 【희망】이 낮은 PC가 갑자기 불사사의한 사고에 휘말려서 【희망】이 높은 PC가 구해주는 장면을 연출하라.『종료조건』【희망】이 낮은 PC가 【희망】이 높은 PC에게 감사 인사를 한다.",
118
+ "「SNS」『내용』【지성】이 높은 PC가 SNS에서 사건에 관한 발언을 하여, 【지성】이 낮은 PC와 알게되는 장면을 연출하라.『종료조건』【지성】이 낮은 PC가 '나중에 다시 만나요' 라고 답신한다.",
119
+ "「<무언가>가 보인다」『내용』PC간 재회 후, 어둠 너머에서 <무언가>를 목격, 전율하는 장면을 연출하라.『종료조건』<무언가>가 사라지며, PC 중 누군가가 '…방금 그거 봤어?' 라고 묻는다.",
120
+ "「간호」『내용』【체력】이 낮은 PC가 갑자기 <무언가>에게 습격당하는 환각을 보고 날뛰다가 우연히 나타난, 【체력】이 높은 PC에게 도움을 받는 장면을 연출하라.『종료조건』【체력】이 낮은 PC가 감사 인사를 한다.",
121
+ "「주인」『내용』PC간 재회 후, 【민첩】이 높은 PC가, 【민첩】이 낮은 PC가 가진 [주인]을 눈치채는 장면을 연출하라.『종료조건』【민첩】이 높은 PC가 자기도 같은 것이 있다고 알린다.",
122
+ ]
123
+ ),
124
+ "AppreciativeFriend" => DiceTable::Table.new(
125
+ "친구 표",
126
+ "2D6",
127
+ [
128
+ "「소중한 사람」『내용』PC간 재회 후, 사건에 관해 서로 이야기를 나누던 중 PC가 서로 자신의 [소중한 사람]에 대한 이야기를 하는 장면을 연출하라.『종료조건』PC 중 누군가가 '어쨌든 그 사람을 위해서라도 살아남아야 하겠네요' 라고 말한다.",
129
+ "「개인의 인상」『내용』PC끼리 만나 사건에 관해 서로 이야기를 나누던 중, PC 중 누군가가 다른 PC의 인상이나 인격에 대한 감상을 말하는 장면을 연출하라.『종료조건』감상을 들은 PC가 '그런가?'라고 말한다.",
130
+ "「주인에 대해」『내용』PC끼리 만나 서로의 몸에 새겨진 [주인]의 정체에 관해 생각하는 장면을 연출하라.『종료조건』PC 중 누군가가 '…결국 비밀 투성이네요. 나중에 다시 생각해볼까요?' 라고 말한다.",
131
+ "「불안과 공포」『내용』PC끼리 만나 서로 이야기를 나누던 중 【운명】이 낮은 PC가 불안에 빠져서, 【운명】이 높은 PC가 걱정하는 장면을 연출하라.『종료조건』【운명】이 낮은 PC가 '괜찮아요' 라고 답한다.",
132
+ "「정보교환」『내용』PC끼리 만나 현재 상태를 정리하기 위해 정보교환을 하는 장면을 연출하라.『종료조건』PC 중 누군가가 '…또 새로운 정보를 얻으면 연락할게요' 라고 말한다.",
133
+ "「과거와 비밀」『내용』PC끼리 만나 사건에 관해 서로 이야기를 나눌 때, PC 중 누군가가 [관계성]을 맺은 《과거나 비밀》에 대해 말한다.『종료조건』《과거나 비밀》을 밀한 PC가 '제 사정에 휘말리게 해서 죄송해요' 라고 말한다.",
134
+ "「추리」『내용』PC끼리 만나 이번 사건의 해결방법에 대해 추리하는 장면을 연출하라.『종료조건』PC 중 누군가가 '좀 더 자세히 알아봅시다. 분명 무언가 좋은 방법이 있을 거에요.' 라고 말한다.",
135
+ "「협력관계」『내용』PC끼리 만나 PC 중 누군가가 이번 사건에서 살아남기 위해 협력관계를 더욱 강화하자고 제안하는 장면을 연출하라.『종료조건』제안받은 PC가 제안을 승낙한다.",
136
+ "「소원에 대해」『내용』PC끼리 만나 사건에 대해 추리하던 중, PC 중 누군가가 자신의 [소원]에 대해 말하는 장면을 연출하라.『종료조건』[소원]을 알게된 PC가 그것에 대해 개인적인 감상을 말한다.",
137
+ "「작전회의」『내용』PC끼리 만나 【지성】이 낮은 PC가 【지성】이 높은 PC에게 좋은 지혜는 없냐고 상담하는 장면을 연출하라.『종료조건』【지성】이 높은 PC가 '…잘 될 지는 모르겠지만, 어떤 방법 하나를 시험해보겠습니다' 라고 말한다.",
138
+ "「방법이 있을 것이다」『내용』PC끼리 만나, PC 중 누군가가 '살아남을 방법은 분명히 있을 것이다' 라고 힘을 북돋는 장면을 연출하라.『종료조건』고무된 PC가 '그렇네요… 그 방법을 찾아봅시다' 라고 말한다.",
139
+ ]
140
+ ),
141
+ "Foreshadow" => DiceTable::Table.new(
142
+ "복선 표",
143
+ "1D6",
144
+ [
145
+ "PC와의 대화 중 문득 번뜩임이 일었다.",
146
+ "수수께끼의 금속 파편이 떨어져있었다. 가슴 쪽 안주머니에 넣어두자.",
147
+ "한창 대화하던 중… 갑자기 어떤 진실을 깨달았다.",
148
+ "PC로부터 격려를 받아 괜스레 기합이 들어갔다.",
149
+ "불안한 정보를 들은 순간, 소중한 사람의 얼굴이 떠올랐다.",
150
+ "그 때, 불가사의한 힘이 몸에 깃들었다.",
151
+ ]
152
+ ),
153
+ "Emotion" => DiceTable::Table.new(
154
+ "감정 표",
155
+ "1D6",
156
+ [
157
+ "존경",
158
+ "호의",
159
+ "우정",
160
+ "비호",
161
+ "신뢰",
162
+ "안심",
163
+ ]
164
+ ),
165
+ "Situation" => DiceTable::Table.new(
166
+ "상황 표",
167
+ "1D6",
168
+ [
169
+ "「불행의 연쇄」사건에 관련되었는지, PC들의 주변에 점점 불행이 일어나기 시작한다. 어떻게든 이 연쇄를 끊어야 한다…….『사용가능 능력치』【행운】",
170
+ "「보이지 않는 공포」사건이 발생한 후부터 PC들은 누군가로부터 감시받는 듯한 기분이 든다. 이럴 때야말로 마음을 강하게 먹어야 한다…….『사용가능 능력치』【정신】",
171
+ "「냉정한 행동」계속해서 일어나는 괴이현상 때문에 PC들은 약간 혼란스러운 기미가 보인다. 그러나 이럴 때야말로 냉정하게 지혜를 짜내야 한다…….『사용가능 능력치』【지성】",
172
+ "「떨림이여 멈춰라」다가오는 공포 때문에 PC들의 심신이 위축되고 쇠약해지고 있다. 그러나 이럴 때야 말로 냉정하게 행동해야 한다…….『사용가능 능력치』【민첩】",
173
+ "「위험은 코 앞에」정체를 알 수 없는 <무언가>는 틀림없이 코 앞까지 닥쳐오고 있다. 믿을 수 있는 것은 이제 우리들의 육체 뿐이다…….『사용가능 능력치』【체력】",
174
+ "「행운은 내 편」상황이 급박해지고 있다. 그러나 운 좋게도 상황이 PC들에게 유리하게 돌아가기 시작했다. 어떻게 해서든 이 기회를 살려야 한다…….『사용가능 능력치』각 PC 임의의【능력치】",
175
+ ]
176
+ ),
177
+ "Target" => DiceTable::Table.new(
178
+ "대상 표",
179
+ "1D6",
180
+ [
181
+ "【체력】이 가장 높은 대상",
182
+ "【민첩】이 가장 높은 대상",
183
+ "【지성】이 가장 높은 대상",
184
+ "【정신】이 가장 높은 대상",
185
+ "【행운】이 가장 높은 대상",
186
+ "【희망】이 가장 높은 대상",
187
+ ]
188
+ ),
189
+ "Insanity" => DiceTable::Table.new(
190
+ "광기 표",
191
+ "1D6",
192
+ [
193
+ "「도망치고 싶다」다음 [페이즈] 종료를 맞이할 때까지 PC는 공포 때문에 그 자리에서 한시라도 빨리 떠나고 싶은 충동에 휩싸인 듯한 모습을 연출하라.",
194
+ "「기억의 혼돈」다음 [페이즈] 종료를 맞이할 때까지 PC는 너무 큰 충격을 받은 나머지 본 것이나 들은 것이 무엇이었는지 떠올릴 수 없는 듯한 모습을 연출하라.",
195
+ "「흥분상태」다음 [페이즈] 종료를 맞이할 때까지 PC는 공포가 너무 심했던 나머지 사소한 일로도 짜증이 나서 PC를 힘들게 하는 반응을 한 후 '…미안합니다' 라며 후회하는 장면을 연출하라.",
196
+ "「떨고 있다」다음 [페이즈] 종료를 맞이할 때까지 PC는 공포가 너무 심했던 나머지 조금 전부터 몸을 계속 떨고 있는 상황을 연출하라.",
197
+ "「긴장상태」다음 [페이즈] 종료를 맞이할 때까지 PC는 극도의 긴장으로 몸을 자유롭게 움직이지 못해 넘어지거나 위축되는 상황을 연출하라.",
198
+ "「일시적 발광」다음 [페이즈] 종료를 맞이할 때까지 PC는 충격이 너무 심했던 나머지 일시적으로 발광해, 같은 말을 반복해서 중얼거리는 상황을 연출하라.",
199
+ ]
200
+ ),
201
+ "Death" => DiceTable::Table.new(
202
+ "종말 표",
203
+ "1D6",
204
+ [
205
+ "「엽기살인」그 후, PC가 교외의 폐가 안에서 조각난 시체로 발견된다. 경찰이 성실하게 조사하지 않았는지 결국 단서를 찾지 못하고 사건은 미궁에 빠졌다.",
206
+ "「변사」그 후, PC가 자신의 방에서 변사한 상태로 발견된다. PC의 사인은 출혈과다. 출혈이 일어난 곳의 외상은 마치 거대한 짐승에게 물린 듯한 상처였다.",
207
+ "「자살」그 후, PC가 교외에 방치된 폐가 안에서 자살한 상태로 발견된다. 그러나 유서는 발견되지 않고 그 이유는 끝끝내 알 수 없었다.",
208
+ "「쇠약사」그 후, PC의 건강이 갑자기 나빠져 입원할 수밖에 없게 되었다. 검진을 아무리 반복해도 계속 원인불명… 이윽고 PC는 체중이 반으로 줄고 결국 쇠약사했다.",
209
+ "「사고사」그 후, PC가 불의의 사고를 당해 사망한다. 그러나 해부 감식 결과, 사고로 인한 외상이 아니라 사고 직전에 내장파열이 일어난 것이 판명되었다.",
210
+ "「행방불명」그 후, PC가 행방불명이 된다. 가족은 PC에 대한 수색신고를 내지만 결국 끝끝내 PC를 찾지 못했다.",
211
+ ]
212
+ ),
213
+ "Fear" => DiceTable::Table.new(
214
+ "공포 표",
215
+ "2D6",
216
+ [
217
+ "「기분 나쁜 것」혈액, 사람의 뼈로 보이는 것, 대량의 점액 등… 기묘한 것이 갑자기 발 밑에 떨어진다.[효과계산]PC 전원에게 5+[주인÷2]d",
218
+ "「빨라지는 고동」갑작스런 종소리, 갑작스런 전화, 갑작스럽게 부르는 목소리, 갑작스러운 기척… 불안한 마음 탓인지 고작 그런 것으로 심장의 고동이 빨라진다.[효과계산]PC 3명에게 4+[주인÷2]d",
219
+ "「불안의 씨앗」말 없는 전화, 착신인 불명의 메시지, 열쇠구멍에 난 깊은 상처, 배수구의 긴 머리카락 등… 불안을 부르는 것이 눈에 띄고 만다.[효과계산]PC 1명에게 4+[주인÷2]d",
220
+ "「이상한 냄새」비린내, 쇳내, 꽃냄새 같은 방향제 냄새 등… 보통은 나지 않는 이상한 냄새가 한순간 코를 찌른다.[효과계산]PC 2명에게 3+[주인÷2]d",
221
+ "「틈새」건물의 그림자, 침대 아래, 장지문 틈새 등… 여러 사각으로부터 <무언가>의 숨결, 기척이 감돈다.[효과계산]PC 2명에게 2+[주인÷2]d",
222
+ "「시선」어딘가로부터 강한 시선을 느낀다… 그러나, 그 쪽으로 시선을 돌리면 기척이 순식간에 없어져 버렸다.[효과계산]PC 2명에게 2+[주인÷2]d",
223
+ "「이상한 소리」멀리서부터 불가사의한 금속음이나 종소리, 살점을 으깨는 듯한 소리나 끈적이는 소리 등이 들린 듯한 기분이 든다.[효과계산]PC 3명에게 3+[주인÷2]d",
224
+ "「접촉」방금 전… 무언가가 자신을 건드린 듯한, 또는 옷을 잡아당긴 듯한 기분이 든다.[효과계산]PC 3명에게 3+[주인÷2]d",
225
+ "「방금 뭐지?」옆으로 스쳐 지나간 인물, 말을 거는 인물, 무언가를 건네주는 인물… 그러나, 여기는 둘 말고 아무도 없을 터이다.[효과계산]PC 2명에게 4+[주인÷2]d",
226
+ "「보아선 안된다」다음 행동으로 넘어가려던 그 때, 한 순간 통로 너머에 <무언가>가 멈춰 서있는 듯한 기분이 들었다.[효과계산]PC 1명에게 5+[주인÷2]d",
227
+ "「암흑 속에서」PC가 갑자기 <무언가>에게 손발이 잡혀 암흑 속으로 끌려가려 한다![효과계산]PC 1명에게 6+[주인÷2]d",
228
+ ]
229
+ ),
230
+ }.transform_keys(&:upcase).freeze
231
+
232
+ ALIAS = {
233
+ "Dai" => "Daily",
234
+ "PCi" => "PlaceCity",
235
+ "PCo" => "PlaceCountryside",
236
+ "PFa" => "PlaceFacility",
237
+ "FL" => "FirstLook",
238
+ "AF" => "AppreciativeFriend",
239
+ "For" => "Foreshadow",
240
+ "Emo" => "Emotion",
241
+ "Sit" => "Situation",
242
+ "Tar" => "Target",
243
+ "Ins" => "Insanity",
244
+ "Dea" => "Death",
245
+ "Fea" => "Fear",
246
+ }.transform_keys(&:upcase).transform_values(&:upcase).freeze
247
+
248
+ register_prefix(TABLES.keys, ALIAS.keys)
249
+ end
250
+ end
251
+ end
@@ -23,6 +23,7 @@ module BCDice
23
23
  ・各種表
24
24
   ・休憩表:才覚 TBT/魅力 CBT/探索 SBT/武勇 VBT
25
25
  お祭り FBT/空振り EBT/全体 WBT/カップル LBT
26
+ お食事 FDBT
26
27
   ・ハプニング表:才覚 THT/魅力 CHT/探索 SHT/武勇 VHT
27
28
   ・視察表 RT/情報収集表 IG/ランダムマップ選択表 RMS
28
29
   ・痛打表 CAT/致命傷表 FWT/戦闘ファンブル表 CFT
@@ -31,9 +32,11 @@ module BCDice
31
32
   ・お宝表1/2/3/4/5 T1T/T2T/T3T/T4T/T5T
32
33
   ・特殊遭遇表 SE
33
34
     上級:人工 ARN/水域 WEN/自然 NEN/洞窟 CEN/天空 SEN/異界 OEN
35
+  ・他国との関係表 ORT
34
36
  ・潜在能力:スキル決定表 SDT
35
37
    基本:肉弾 BUS/射撃 SHS/星術 ASS/召喚 SUS/科学 SCS
36
38
       迷宮 LAS/交渉 NES/便利 COS/芸能 ENS/道具 TOS
39
+      一般 GES
37
40
    上級:肉弾 ABUS/射撃 ASHS/星術 AASS/召喚 ASUS/科学 ASCS
38
41
       迷宮 ALAS/交渉 ANES/便利 ACOS/芸能 AENS/道具 ATOS
39
42
  ・アイテム関連(上級不使用の場合、カッコ書きのものを使用して下さい)
@@ -53,6 +56,60 @@ module BCDice
53
56
   ・生まれ決定表 BDT/生まれ表:才覚 TBO/魅力 CBO/探索 SBO/武勇 VBO
54
57
   ・初期装備表 IEQ
55
58
   ・地名決定表 PNTx (xは個数)/迷宮風景表 MLTx (xは個数)
59
+ ・百万世界AtoZ関連
60
+  ・ご祝儀表 GIFT
61
+  ・ニュース表 NWST
62
+  ・王国ハプニング表 KDHT
63
+  ・王国試練表 KDTT
64
+  ・騎士道表 CHVT
65
+  ・儀式表 RITT
66
+  ・限定表 LIMT
67
+  ・固有の文化表 UNCT
68
+  ・後世の評価表 POET
69
+  ・高レベル特殊遭遇表 KSET
70
+  ・死霊の日々表 DODT
71
+  ・事件名表1/2 INT1/INT2
72
+  ・守護星座表 GUCT
73
+  ・需要表 DEMTx (x:名物レベル)
74
+  ・小鬼と一緒表 WLDT
75
+  ・侵略ハプニング表 INHT
76
+  ・新・情報収集表 NIGT
77
+  ・人種特徴表/人種名文字表 RACT/RNCTx (x:文字数)
78
+  ・迷宮化現象表/人体迷宮化表 HBLT/LAPT
79
+  ・勢力表 POWT
80
+  ・中立特殊遭遇表 NSET
81
+  ・超協調行動表 ECBT
82
+  ・通貨外見表/通貨材質表/通貨名称表 CUAT/CUMT/CUNT
83
+  ・天候表 WEAT
84
+  ・毒の追加効果表 PAET
85
+  ・媒体表 MEDT
86
+  ・反応表/民の反応表 REAT/PRET
87
+  ・遍歴表 HIST
88
+  ・由来表 ORIT
89
+  ・誘致表 ATRT
90
+  ・妖精の悪戯表 FAMT
91
+ ・R&R236関連
92
+  ・四字熟語系二つ名表/代入命名表/組み合わせ系二つ名表/名文句系二つ名表 FCNT/ASNT/CMNT/FPNT
93
+  ・形容表/用語表/行動表/呼び名表/称号表 DEST/TRMT/BEHT/NAMT/TTLT
94
+ ・旅する王国と無名階域関連
95
+  ・サブキャラクター反応表 CSRT
96
+  ・スキルグループ表 KSGT
97
+  ・ダイナマイト帝国:休憩表/特殊遭遇表/二つ名表/名前表 DRET/DSET/DNNT/DNAT
98
+  ・ハグルマ資本主義神聖共和国:休憩表/特殊遭遇表/二つ名表/名前表 HRET/HSET/HNNT/HNAT
99
+  ・メトロ汗国:休憩表/特殊遭遇表/二つ名表/名前表 MRET/MSET/MNNT/MNAT
100
+  ・千年王朝:休憩表/特殊遭遇表/二つ名表/名前表 TRET/TSET/TNNT/TNAT
101
+  ・遠征王国変動表/遠征道中表 EKCT/EXITx (x:修正)
102
+  ・候補生背景表/職長背景表 CABT/FOBT
103
+  ・上級ジョブ表・甲/乙 AJTA/AJTB
104
+  ・深階休憩表/特殊遭遇表 KART/KAET
105
+  ・天階休憩表/特殊遭遇表 TERT/TEET
106
+  ・星の階休憩表 HKRT
107
+  ・装備決定表 EQDT
108
+  ・大冒険時代表 GART
109
+  ・燃料表 FUET
110
+  ・反乱表 RBLT
111
+  ・旅する王国環境表/王国名決定表1/王国名決定表2/王国名決定表3 TKET/TKNT1/TKNT2/TKNT3
112
+  ・列強経歴表 GPHT
56
113
  ・D66ダイスあり
57
114
  INFO_MESSAGE_TEXT
58
115
 
@@ -73,7 +130,17 @@ module BCDice
73
130
  'ABUS', 'ASHS', 'AASS', 'ASUS', 'ASCS', 'ALAS', 'ANES', 'ACOS', 'AENS', 'ATOS',
74
131
  'SE', 'ARN', 'WEN', 'NEN', 'CEN', 'SEN', 'OEN',
75
132
  'DFT',
76
- 'PNT', 'MLT'
133
+ 'PNT', 'MLT',
134
+ 'FDBT', 'GIFT', 'NWST', 'EKCT', 'KDHT', 'KDTT', 'CHVT', 'RITT', 'LIMT', 'UNCT', 'POET',
135
+ 'KSET', 'DODT', 'INT1', 'INT2', 'GUCT', 'DEMT', 'WLDT', 'INHT', 'NIGT', 'RACT', 'RNCT',
136
+ 'HBLT', 'POWT', 'NSET', 'ECBT', 'CUAT', 'CUMT', 'CUNT', 'WEAT', 'PAET', 'MEDT', 'REAT',
137
+ 'HIST', 'PRET', 'LAPT', 'ORIT', 'ATRT', 'FAMT',
138
+ 'FCNT', 'ASNT', 'TRMT', 'BEHT', 'DEST', 'NAMT', 'TTLT',
139
+ 'CMNT', 'FPNT', 'CSRT', 'KSGT', 'DRET', 'DSET', 'DNNT', 'DNAT', 'HRET', 'HSET', 'HNNT',
140
+ 'HNAT', 'MRET', 'MSET', 'MNNT', 'MNAT', 'EXIT', 'TRET', 'TSET', 'TNNT', 'TNAT', 'CABT',
141
+ 'AJTA', 'AJTB', 'FOBT', 'KAET', 'KART', 'TEET', 'TERT', 'HKRT', 'EQDT', 'GART', 'FUET',
142
+ 'RBLT', 'TKET', 'GPHT',
143
+ 'TKNT1', 'TKNT2', 'TKNT3', 'GES', 'ORT'
77
144
  )
78
145
 
79
146
  def initialize(command)
@@ -81,6 +148,7 @@ module BCDice
81
148
 
82
149
  @sort_add_dice = true
83
150
  @d66_sort_type = D66SortType::ASC
151
+ @round_type = RoundType::CEIL
84
152
  end
85
153
 
86
154
  def kiryoku_result(_total_n, dice_list, _diff)
@@ -100,6 +168,12 @@ module BCDice
100
168
 
101
169
  if (output = roll_tables(command, TABLES))
102
170
  return output
171
+ elsif (output = roll_tables(command, A2Z_TABLES))
172
+ return output
173
+ elsif (output = roll_tables(command, RR236_TABLES))
174
+ return output
175
+ elsif (output = roll_tables(command, TK_TABLES))
176
+ return output
103
177
  else
104
178
 
105
179
  case command
@@ -248,6 +322,50 @@ module BCDice
248
322
  when /^ATOS/i
249
323
  type = '上級道具スキル'
250
324
  output, total_n = mk_advanced_tool_skill_table
325
+ when /^GUCT/i
326
+ type = '守護星座'
327
+ total_n = @randomizer.roll_once(6) * 100 + @randomizer.roll_once(6) * 10 + @randomizer.roll_once(6)
328
+ output = mk_guardian_constellation_table(total_n)
329
+ when /^DEMT(\d+)/i
330
+ type = '需要'
331
+ count = getCount(Regexp.last_match(1))
332
+ output, total_n = get_demand_table(count)
333
+ when /^RNCT(\d*)/i
334
+ type = '人種名文字'
335
+ count = getCount(Regexp.last_match(1))
336
+ output, total_n = get_race_name_character_table(count)
337
+ when /^CUMT/i
338
+ type = '通貨材質'
339
+ @total = [@randomizer.roll_barabara(2, 6).sum(), @randomizer.roll_once(6)]
340
+ total_n = @total.join(',')
341
+ output = get_currency_material_table(*@total)
342
+ when /^CMNT/i
343
+ type = '組み合わせ系二つ名'
344
+ output, total_n = mk_combination_nickname_table
345
+ when /^DEST/i
346
+ type = '形容'
347
+ total_n = @randomizer.roll_d66(D66SortType::ASC)
348
+ output = mk_descriptive_table(total_n)
349
+ when /^TRMT/i
350
+ type = '用語'
351
+ total_n = @randomizer.roll_d66(D66SortType::ASC)
352
+ output = mk_terminology_table(total_n)
353
+ when /^BEHT/i
354
+ type = '行動'
355
+ total_n = @randomizer.roll_d66(D66SortType::ASC)
356
+ output = mk_behavior_table(total_n)
357
+ when /^NAMT/i
358
+ type = '呼び名'
359
+ total_n = @randomizer.roll_d66(D66SortType::ASC)
360
+ output = mk_rr236_name_table(total_n)
361
+ when /^TTLT/i
362
+ type = '称号'
363
+ total_n = @randomizer.roll_d66(D66SortType::ASC)
364
+ output = mk_title_table(total_n)
365
+ when /^EXIT([-+]?\d*)/i
366
+ type = '遠征道中'
367
+ modify = get_modify(Regexp.last_match(1))
368
+ output, total_n = get_expedition_itinerary_table(modify)
251
369
  end
252
370
 
253
371
  if !output.nil?
@@ -261,9 +379,11 @@ module BCDice
261
379
  end
262
380
  end
263
381
  end
264
-
265
382
  require "bcdice/game_system/meikyu_kingdom_basic/item_table"
266
383
  require "bcdice/game_system/meikyu_kingdom_basic/kingdom_table"
267
384
  require "bcdice/game_system/meikyu_kingdom_basic/name_table"
268
385
  require "bcdice/game_system/meikyu_kingdom_basic/word_table"
269
386
  require "bcdice/game_system/meikyu_kingdom_basic/table"
387
+ require "bcdice/game_system/meikyu_kingdom_basic/atoz_table"
388
+ require "bcdice/game_system/meikyu_kingdom_basic/randr236_table"
389
+ require "bcdice/game_system/meikyu_kingdom_basic/tk_table"
@@ -0,0 +1,125 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bcdice/game_system/Revulture"
4
+
5
+ module BCDice
6
+ module GameSystem
7
+ class Revulture_Korean < Revulture
8
+ # ゲームシステムの識別子
9
+ ID = 'Revulture:Korean'
10
+
11
+ # ゲームシステム名
12
+ NAME = '광쇄의 리벌처'
13
+
14
+ # ゲームシステム名の読みがな
15
+ SORT_KEY = '国際化:Korean:광쇄의 리벌처'
16
+
17
+ # ダイスボットの使い方
18
+ HELP_MESSAGE = <<~HELP
19
+ ■공격 판정( xAT, xATK, xATTACK )
20
+ x: 주사위 수(덧셈 + 과 나눗셈 / 사용 가능)
21
+ 예시) 3AT, 4ATK, 5+6ATTACK, 15/2AT
22
+
23
+ □공격 판정 목표값 포함( xAT<=y, xATK<=y, xATTACK<=y )
24
+ x: 주사위 수(덧셈 + 과 나눗셈 / 사용 가능)
25
+ y: 목표값( 1 이상 6 이하. 덧셈 + 사용 가능)
26
+ 예시) 3AT<=4, 3AT<=2+1
27
+
28
+ □공격 판정 목표값&추가 대미지 포함( xAT<=y[>=a:+b], xATK<=y[>=a:+b], xATTACK<=y[z] )
29
+ x: 주사위 수(덧셈 + 과 나눗셈 / 사용 가능)
30
+ y: 목표값( 1 이상 6 이하. 덧셈 + 사용 가능)
31
+ z: 추가 대미지 규칙(자세한 내용은 후술)(※여러 개를 동시에 지정 가능)
32
+
33
+ ▽추가 대미지 규칙 [a:+b]
34
+ a: 히트 수가 a 라면
35
+  =a (히트 수가 a와 동일)
36
+  >=a (히트 수가 a 이상)
37
+ b: 대미지를 b 점 추가
38
+
39
+ 예시) 3AT<=4[>=2:+3] #ルールブックp056「グレングラントAR」
40
+ 예시) 2AT<=4[=1:+5][>=2:+8] #ルールブックp067「ファーボル・ドラゴンブレス」
41
+ HELP
42
+
43
+ ATTACK_ROLL_REG = %r{^(\d+([+/]\d+)*)?AT(TACK|K)?(<=([1-6](\+\d)*))?((\[>?=\d+:\+\d+\])+)?}i.freeze
44
+ register_prefix('\d+([+\/]\d+)*AT')
45
+
46
+ def eval_game_system_specific_command(command)
47
+ if (m = ATTACK_ROLL_REG.match(command))
48
+ roll_attack(m[1], m[5], m[7])
49
+ end
50
+ end
51
+
52
+ private
53
+
54
+ def roll_attack(dice_count_expression, border_expression, additional_damage_rules)
55
+ dice_count = Arithmetic.eval(dice_count_expression, RoundType::FLOOR)
56
+ border = Arithmetic.eval(border_expression, RoundType::FLOOR).clamp(1, 6) if border_expression
57
+
58
+ command = make_command_text(dice_count, border, additional_damage_rules)
59
+
60
+ if dice_count <= 0
61
+ return "#{command} > 주사위가 0개 입니다."
62
+ elsif border.nil? && additional_damage_rules
63
+ return "#{command} > 목표값이 지정되지 않아 추가 대미지를 계산할 수 없습니다."
64
+ end
65
+
66
+ dices = @randomizer.roll_barabara(dice_count, 6).sort
67
+
68
+ critical_hit_count = dices.count(1)
69
+ hit_count = dices.count { |dice| dice <= border } + critical_hit_count if border
70
+ damage = calc_damage(hit_count, additional_damage_rules)
71
+
72
+ message_elements = []
73
+ message_elements << command
74
+ message_elements << dices.join(',')
75
+ message_elements << "크리티컬 #{critical_hit_count}" if critical_hit_count > 0
76
+ message_elements << "히트 수 #{hit_count}" if hit_count
77
+ message_elements << "대미지 #{damage}" if damage
78
+
79
+ Result.new(message_elements.join(' > ')).tap do |r|
80
+ r.condition = hit_count > 0 if hit_count
81
+ r.critical = critical_hit_count > 0
82
+ end
83
+ end
84
+
85
+ def make_command_text(dice_count, border, additional_damage_rules)
86
+ command = "#{dice_count}attack"
87
+ command += "<=#{border}" if border
88
+ command += additional_damage_rules if additional_damage_rules
89
+
90
+ "(#{command})"
91
+ end
92
+
93
+ def calc_damage(hit_count, additional_damage_rules)
94
+ return nil unless additional_damage_rules
95
+
96
+ damage = hit_count
97
+ parse_additional_damage_rules(additional_damage_rules).each do |rule|
98
+ if rule[:condition].call(hit_count)
99
+ damage += rule[:additinal_damage]
100
+ end
101
+ end
102
+
103
+ damage
104
+ end
105
+
106
+ def parse_additional_damage_rules(source)
107
+ source.scan(/\[(>?=)(\d+):\+(\d+)\]/).map do |matched|
108
+ {
109
+ condition: make_additional_damage_condition(matched[0], matched[1].to_i),
110
+ additinal_damage: matched[2].to_i,
111
+ }
112
+ end
113
+ end
114
+
115
+ def make_additional_damage_condition(comparer, comparing_target)
116
+ case comparer
117
+ when '='
118
+ lambda { |hit_count| hit_count == comparing_target }
119
+ when '>='
120
+ lambda { |hit_count| hit_count >= comparing_target }
121
+ end
122
+ end
123
+ end
124
+ end
125
+ end