bcdice 3.15.0 → 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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +140 -0
- data/i18n/Airgetlamh/ja_jp.yml +5 -0
- data/i18n/Airgetlamh/ko_kr.yml +5 -0
- data/i18n/Alsetto/ja_jp.yml +5 -0
- data/i18n/Alsetto/ko_kr.yml +5 -0
- data/i18n/AnimaAnimus/ja_jp.yml +28 -0
- data/i18n/AnimaAnimus/ko_kr.yml +28 -0
- data/i18n/BlackJacket/ja_jp.yml +79 -0
- data/i18n/BlackJacket/ko_kr.yml +79 -0
- data/i18n/Bloodorium/ja_jp.yml +3 -0
- data/i18n/Bloodorium/ko_kr.yml +3 -0
- data/i18n/Cthulhu/ko_kr.yml +1 -1
- data/i18n/DoubleCross/ja_jp.yml +2 -2
- data/i18n/Dracurouge/ko_kr.yml +1284 -205
- data/i18n/Emoklore/ja_jp.yml +1 -0
- data/i18n/Emoklore/ko_kr.yml +8 -0
- data/i18n/FutariSousa/ja_jp.yml +70 -0
- data/i18n/FutariSousa/ko_kr.yml +157 -0
- data/i18n/HatsuneMiku/ja_jp.yml +579 -0
- data/i18n/HatsuneMiku/ko_kr.yml +579 -0
- data/i18n/Irisbane/ja_jp.yml +27 -0
- data/i18n/Irisbane/ko_kr.yml +27 -0
- data/i18n/JuinKansen/ja_jp.yml +168 -0
- data/i18n/JuinKansen/ko_kr.yml +168 -0
- data/i18n/KemonoNoMori/ja_jp.yml +229 -0
- data/i18n/KemonoNoMori/ko_kr.yml +229 -0
- data/i18n/KizunaBullet/ko_kr.yml +653 -0
- data/i18n/MagicPunk/ja_jp.yml +5 -0
- data/i18n/MagicPunk/ko_kr.yml +5 -0
- data/i18n/MorkBorg/ja_jp.yml +34 -0
- data/i18n/MorkBorg/ko_kr.yml +34 -0
- data/i18n/Nechronica/ko_kr.yml +43 -0
- data/i18n/NegikureNegimaki/ja_jp.yml +6 -0
- data/i18n/NegikureNegimaki/ko_kr.yml +6 -0
- data/i18n/Nuekagami/ja_jp.yml +219 -0
- data/i18n/Nuekagami/ko_kr.yml +219 -0
- data/i18n/Revulture/ja_jp.yml +8 -0
- data/i18n/Revulture/ko_kr.yml +8 -0
- data/i18n/SRS/ja_jp.yml +4 -0
- data/i18n/SRS/ko_kr.yml +4 -0
- data/i18n/ShinobiGami/ja_jp.yml +879 -0
- data/i18n/ShinobiGami/ko_kr.yml +876 -0
- data/i18n/SkynautsBouken/ja_jp.yml +28 -28
- data/i18n/StarryDolls/ja_jp.yml +456 -0
- data/i18n/StarryDolls/ko_kr.yml +456 -0
- data/i18n/StratoShout/ja_jp.yml +8 -8
- data/i18n/SwordWorld2_5/ja_jp.yml +48 -0
- data/i18n/Ventangle/ja_jp.yml +4 -0
- data/i18n/Ventangle/ko_kr.yml +4 -0
- data/i18n/YearZeroEngine/ja_jp.yml +12 -0
- data/i18n/YearZeroEngine/ko_kr.yml +12 -0
- data/i18n/ZombiLine/ja_jp.yml +27 -0
- data/i18n/ZombiLine/ko_kr.yml +27 -0
- data/i18n/ko_kr.yml +2 -0
- data/i18n/zh_hant.yml +2 -2
- data/lib/bcdice/dice_table/d66_left_range_table.rb +21 -0
- data/lib/bcdice/game_system/Aionia.rb +68 -19
- data/lib/bcdice/game_system/Airgetlamh.rb +64 -41
- data/lib/bcdice/game_system/Airgetlamh_Korean.rb +53 -0
- data/lib/bcdice/game_system/Alsetto.rb +63 -50
- data/lib/bcdice/game_system/Alsetto_Korean.rb +51 -0
- data/lib/bcdice/game_system/AnimaAnimus.rb +15 -32
- data/lib/bcdice/game_system/AnimaAnimus_Korean.rb +39 -0
- data/lib/bcdice/game_system/BlackJacket.rb +57 -113
- data/lib/bcdice/game_system/BlackJacket_Korean.rb +8 -206
- data/lib/bcdice/game_system/Bloodorium.rb +1 -1
- data/lib/bcdice/game_system/Bloodorium_Korean.rb +34 -0
- data/lib/bcdice/game_system/ChroniclesOfDarkness2e.rb +163 -0
- data/lib/bcdice/game_system/Cthulhu7th_Korean.rb +471 -300
- data/lib/bcdice/game_system/DeadlineHeroes_Korean.rb +273 -0
- data/lib/bcdice/game_system/Dracurouge_Korean.rb +25 -19
- data/lib/bcdice/game_system/DungeonsAndDragons5.rb +106 -73
- data/lib/bcdice/game_system/DungeonsAndDragons5_Korean.rb +53 -0
- data/lib/bcdice/game_system/DungeonsAndDragons_Korean.rb +61 -0
- data/lib/bcdice/game_system/EdgeFlippers.rb +315 -0
- data/lib/bcdice/game_system/Emoklore.rb +34 -9
- data/lib/bcdice/game_system/Emoklore_Korean.rb +50 -0
- data/lib/bcdice/game_system/FateCoreSystem.rb +10 -6
- data/lib/bcdice/game_system/FullMetalPanic_Korean.rb +28 -0
- data/lib/bcdice/game_system/FutariSousa.rb +37 -12
- data/lib/bcdice/game_system/FutariSousa_Korean.rb +25 -8
- data/lib/bcdice/game_system/GaiaCare.rb +40 -0
- data/lib/bcdice/game_system/Garactier.rb +1 -1
- data/lib/bcdice/game_system/GardenOrder.rb +2 -2
- data/lib/bcdice/game_system/GardenOrderReEdit.rb +849 -0
- data/lib/bcdice/game_system/GardenOrder_Korean.rb +839 -0
- data/lib/bcdice/game_system/HatsuneMiku.rb +51 -605
- data/lib/bcdice/game_system/HatsuneMiku_Korean.rb +56 -0
- data/lib/bcdice/game_system/HunterTheReckoning5th.rb +15 -11
- data/lib/bcdice/game_system/Irisbane.rb +17 -30
- data/lib/bcdice/game_system/Irisbane_Korean.rb +52 -0
- data/lib/bcdice/game_system/JuinKansen.rb +41 -208
- data/lib/bcdice/game_system/JuinKansen_Korean.rb +46 -0
- data/lib/bcdice/game_system/KemonoNoMori.rb +67 -276
- data/lib/bcdice/game_system/KemonoNoMori_Korean.rb +62 -0
- data/lib/bcdice/game_system/KinAriel.rb +117 -0
- data/lib/bcdice/game_system/KizunaBullet_Korean.rb +109 -0
- data/lib/bcdice/game_system/KutuluRevised.rb +94 -0
- data/lib/bcdice/game_system/LiverLabyrinth.rb +321 -0
- data/lib/bcdice/game_system/Lost.rb +89 -0
- data/lib/bcdice/game_system/MagicPunk.rb +85 -0
- data/lib/bcdice/game_system/MagicPunk_Korean.rb +39 -0
- data/lib/bcdice/game_system/MarvelHeroicRoleplaying.rb +144 -0
- data/lib/bcdice/game_system/MeikyuKingdomBasic.rb +122 -2
- data/lib/bcdice/game_system/MetallicGuardian_Korean.rb +28 -0
- data/lib/bcdice/game_system/MorkBorg.rb +170 -0
- data/lib/bcdice/game_system/MorkBorg_Korean.rb +49 -0
- data/lib/bcdice/game_system/NanimonaiMura.rb +112 -0
- data/lib/bcdice/game_system/Nechronica_Korean.rb +6 -6
- data/lib/bcdice/game_system/NegikureNegimaki.rb +140 -0
- data/lib/bcdice/game_system/NegikureNegimaki_Korean.rb +48 -0
- data/lib/bcdice/game_system/NeonUnderRealm.rb +122 -0
- data/lib/bcdice/game_system/NinjaSlayer2.rb +170 -49
- data/lib/bcdice/game_system/Nuekagami.rb +19 -261
- data/lib/bcdice/game_system/Nuekagami_Korean.rb +43 -0
- data/lib/bcdice/game_system/ParanoiaPerfect.rb +74 -0
- data/lib/bcdice/game_system/PastFutureParadox.rb +2245 -55
- data/lib/bcdice/game_system/PreciousDays.rb +170 -0
- data/lib/bcdice/game_system/Revulture.rb +8 -5
- data/lib/bcdice/game_system/Revulture_Korean.rb +51 -0
- data/lib/bcdice/game_system/Ryutama.rb +46 -46
- data/lib/bcdice/game_system/SRS.rb +4 -4
- data/lib/bcdice/game_system/SRS_Korean.rb +67 -0
- data/lib/bcdice/game_system/ShinobiGami.rb +154 -1047
- data/lib/bcdice/game_system/ShinobiGami_Korean.rb +102 -0
- data/lib/bcdice/game_system/StarryDolls.rb +70 -508
- data/lib/bcdice/game_system/StarryDolls_Korean.rb +80 -0
- data/lib/bcdice/game_system/StratoShout.rb +1 -1
- data/lib/bcdice/game_system/SwordWorld.rb +28 -2
- data/lib/bcdice/game_system/SwordWorld2_0.rb +1 -1
- data/lib/bcdice/game_system/SwordWorld2_5.rb +67 -3
- data/lib/bcdice/game_system/TacticalExorcist.rb +222 -0
- data/lib/bcdice/game_system/TenkaRyouran_Korean.rb +30 -0
- data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +38 -33
- data/lib/bcdice/game_system/Ventangle.rb +8 -7
- data/lib/bcdice/game_system/Ventangle_Korean.rb +41 -0
- data/lib/bcdice/game_system/Warhammer4.rb +202 -6
- data/lib/bcdice/game_system/WerewolfTheApocalypse5th.rb +20 -15
- data/lib/bcdice/game_system/WorldEndScrapyard.rb +333 -0
- data/lib/bcdice/game_system/WorldsEndFrontline_Korean.rb +26 -0
- data/lib/bcdice/game_system/YearZeroEngine.rb +7 -7
- data/lib/bcdice/game_system/YearZeroEngine_Korean.rb +46 -0
- data/lib/bcdice/game_system/ZombiLine.rb +29 -36
- data/lib/bcdice/game_system/ZombiLine_Korean.rb +37 -0
- data/lib/bcdice/game_system/cthulhu7th_Korean/full_auto.rb +294 -0
- data/lib/bcdice/game_system/cthulhu7th_Korean/rollable.rb +43 -0
- data/lib/bcdice/game_system/meikyu_kingdom_basic/atoz_table.rb +1184 -0
- data/lib/bcdice/game_system/meikyu_kingdom_basic/randr236_table.rb +254 -0
- data/lib/bcdice/game_system/meikyu_kingdom_basic/table.rb +54 -0
- data/lib/bcdice/game_system/meikyu_kingdom_basic/tk_table.rb +755 -0
- data/lib/bcdice/game_system/sword_world/rating_options.rb +9 -0
- data/lib/bcdice/game_system/sword_world/rating_parsed.rb +19 -0
- data/lib/bcdice/game_system/sword_world/rating_parser.rb +229 -149
- data/lib/bcdice/game_system/sword_world/transcendent_test.rb +1 -0
- data/lib/bcdice/game_system.rb +47 -0
- data/lib/bcdice/version.rb +1 -1
- metadata +96 -2
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'bcdice/game_system/DungeonsAndDragons'
|
|
4
|
+
|
|
5
|
+
module BCDice
|
|
6
|
+
module GameSystem
|
|
7
|
+
class DungeonsAndDragons_Korean < DungeonsAndDragons
|
|
8
|
+
# ゲームシステムの識別子
|
|
9
|
+
ID = 'DungeonsAndDragons:Korean'
|
|
10
|
+
|
|
11
|
+
# ゲームシステム名
|
|
12
|
+
NAME = '던전 앤 드래곤'
|
|
13
|
+
|
|
14
|
+
# ゲームシステム名の読みがな
|
|
15
|
+
SORT_KEY = '国際化:Korean:던전 앤 드래곤'
|
|
16
|
+
|
|
17
|
+
# ダイスボットの使い方
|
|
18
|
+
HELP_MESSAGE = "※ 이 다이스봇은 방의 시스템 이름 표시용입니다.\n"
|
|
19
|
+
|
|
20
|
+
# 성공 결과 문자열
|
|
21
|
+
def success_text
|
|
22
|
+
"성공"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# 실패 결과 문자열
|
|
26
|
+
def failure_text
|
|
27
|
+
"실패"
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# 크리티컬 결과 문자열
|
|
31
|
+
def critical_text
|
|
32
|
+
"크리티컬"
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# 펌블 결과 문자열
|
|
36
|
+
def fumble_text
|
|
37
|
+
"펌블"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Base.check_result(total, rand_results, cmp_op, target)를 오버라이드
|
|
41
|
+
def check_result(total, rand_results, cmp_op, target)
|
|
42
|
+
# target이 '?' 같은 문자열일 경우 nil 반환
|
|
43
|
+
return nil if target.is_a?(String)
|
|
44
|
+
|
|
45
|
+
# 크리티컬/펌블 처리 (D&D 룰: 1 = 펌블, 20 = 크리티컬)
|
|
46
|
+
dice_total = rand_results.map(&:value).sum
|
|
47
|
+
if rand_results.map(&:sides) == [20]
|
|
48
|
+
return Result.critical(critical_text) if dice_total == 20
|
|
49
|
+
return Result.fumble(fumble_text) if dice_total == 1
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# 일반 성공/실패 판정
|
|
53
|
+
if total.send(cmp_op, target)
|
|
54
|
+
Result.success(success_text)
|
|
55
|
+
else
|
|
56
|
+
Result.failure(failure_text)
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module BCDice
|
|
4
|
+
module GameSystem
|
|
5
|
+
class EdgeFlippers < Base
|
|
6
|
+
# ゲームシステムの識別子
|
|
7
|
+
ID = 'EdgeFlippers'
|
|
8
|
+
|
|
9
|
+
# ゲームシステム名
|
|
10
|
+
NAME = 'EDGE FLIPPERS'
|
|
11
|
+
|
|
12
|
+
# ゲームシステム名の読みがな
|
|
13
|
+
SORT_KEY = 'えつしふりつはあす'
|
|
14
|
+
|
|
15
|
+
# ダイスボットの使い方
|
|
16
|
+
HELP_MESSAGE = <<~MESSAGETEXT
|
|
17
|
+
■ 汎用コマンド
|
|
18
|
+
xHD+ySD=t,t,t
|
|
19
|
+
人間ダイスと怪異ダイスをロールして、特定の出目があるか判定します。
|
|
20
|
+
x: 人間ダイスの数
|
|
21
|
+
y: 怪異ダイスの数
|
|
22
|
+
t: 必要な出目(省略化)
|
|
23
|
+
|
|
24
|
+
■ 拮抗判定
|
|
25
|
+
xHD+ySD=Xi
|
|
26
|
+
人間ダイスと怪異ダイスをロールして、ゾロ目が必要数あるか判定します。
|
|
27
|
+
i: 必要なゾロ目の個数
|
|
28
|
+
|
|
29
|
+
■ 全力判定
|
|
30
|
+
xHFD>=t
|
|
31
|
+
xSFD>=t
|
|
32
|
+
x: ダイスの数
|
|
33
|
+
t: 目標値(省略時20)
|
|
34
|
+
|
|
35
|
+
■ 存在判定
|
|
36
|
+
EXIST -> 2HD+2SD
|
|
37
|
+
|
|
38
|
+
■ 都市判定
|
|
39
|
+
xHCD -> xHD=1,2,3,4
|
|
40
|
+
|
|
41
|
+
■ 超常判定
|
|
42
|
+
nSPD -> nSD=7,8,9,10
|
|
43
|
+
|
|
44
|
+
■ 術式判定
|
|
45
|
+
TD
|
|
46
|
+
|
|
47
|
+
■ ランダム表
|
|
48
|
+
BAET:【人間】にも【怪異】にも影響のある後遺症
|
|
49
|
+
HAET:【人間寄り】の時に影響のある後遺症
|
|
50
|
+
SAET:【怪異寄り】の時に影響のある後遺症
|
|
51
|
+
MESSAGETEXT
|
|
52
|
+
|
|
53
|
+
def eval_game_system_specific_command(command)
|
|
54
|
+
roll_hs(command) || roll_alias(command) || roll_fullpower(command) || roll_technical(command) || roll_tables(command, TABLES)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
private
|
|
58
|
+
|
|
59
|
+
class HSCommand
|
|
60
|
+
class << self
|
|
61
|
+
def parse(command)
|
|
62
|
+
m = /^(?:(\d+)HD(?:\+(\d+)SD)?|(\d+)SD(?:\+(\d+)HD)?)(?:=(?:([\d,]+)|X(\d+)))?$/.match(command)
|
|
63
|
+
return nil unless m
|
|
64
|
+
|
|
65
|
+
h = m[1]&.to_i || m[4]&.to_i || 0
|
|
66
|
+
s = m[2]&.to_i || m[3]&.to_i || 0
|
|
67
|
+
targets = parse_target(m[5])
|
|
68
|
+
same_value = m[6]&.to_i
|
|
69
|
+
|
|
70
|
+
if h == 0 && s == 0
|
|
71
|
+
return nil
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
return HSCommand.new(h, s, targets, same_value)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
private
|
|
78
|
+
|
|
79
|
+
def parse_target(str)
|
|
80
|
+
return nil unless str
|
|
81
|
+
|
|
82
|
+
str.split(",").filter { |s| !s.empty? }.map(&:to_i).sort
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def initialize(h, s, targets, same_value)
|
|
87
|
+
@h = h
|
|
88
|
+
@s = s
|
|
89
|
+
@targets = targets
|
|
90
|
+
@same_value = same_value
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def roll(randomizer)
|
|
94
|
+
@hv = randomizer.roll_barabara(@h, 6).sort
|
|
95
|
+
@sv = randomizer.roll_barabara(@s, 10).sort
|
|
96
|
+
values = (@hv + @sv).sort
|
|
97
|
+
|
|
98
|
+
@is_success = if @targets
|
|
99
|
+
subset?(values, @targets)
|
|
100
|
+
elsif @same_value
|
|
101
|
+
values.group_by(&:itself).any? { |_k, v| v.length >= @same_value }
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
Result.new.tap do |r|
|
|
105
|
+
r.text = [expr(), result_values(), result_label].compact.join(" > ")
|
|
106
|
+
unless @is_success.nil?
|
|
107
|
+
r.condition = @is_success
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
private
|
|
113
|
+
|
|
114
|
+
def subset?(superset, subset)
|
|
115
|
+
return true if subset.empty?
|
|
116
|
+
|
|
117
|
+
i = 0
|
|
118
|
+
superset.each do |a|
|
|
119
|
+
b = subset[i]
|
|
120
|
+
if b == a
|
|
121
|
+
i += 1
|
|
122
|
+
if i == subset.length
|
|
123
|
+
return true
|
|
124
|
+
end
|
|
125
|
+
elsif a > b
|
|
126
|
+
return false
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
return false
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def expr
|
|
134
|
+
"(#{expr_body()}#{expr_cond()})"
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def expr_body
|
|
138
|
+
if @h != 0 && @s != 0
|
|
139
|
+
"#{@h}HD+#{@s}SD"
|
|
140
|
+
elsif @h != 0
|
|
141
|
+
"#{@h}HD"
|
|
142
|
+
else
|
|
143
|
+
"#{@s}SD"
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def expr_cond
|
|
148
|
+
if @targets
|
|
149
|
+
"=#{@targets.join(',')}"
|
|
150
|
+
elsif @same_value
|
|
151
|
+
"=X#{@same_value}"
|
|
152
|
+
else
|
|
153
|
+
""
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
def result_values
|
|
158
|
+
d6 = !@hv.empty? ? "D6[#{@hv.join(',')}]" : nil
|
|
159
|
+
d10 = !@sv.empty? ? "D10[#{@sv.join(',')}]" : nil
|
|
160
|
+
[d6, d10].compact.join(" ")
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
def result_label
|
|
164
|
+
case @is_success
|
|
165
|
+
when true
|
|
166
|
+
"成功"
|
|
167
|
+
when false
|
|
168
|
+
"失敗"
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
def roll_hs(command)
|
|
174
|
+
cmd = HSCommand.parse(command)
|
|
175
|
+
return nil unless cmd
|
|
176
|
+
|
|
177
|
+
cmd.roll(@randomizer)
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
def parse_target(str)
|
|
181
|
+
return nil unless str
|
|
182
|
+
|
|
183
|
+
str.split(",").filter { |s| !s.empty? }.map(&:to_i).sort
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
def subset?(superset, subset)
|
|
187
|
+
return true if subset.empty?
|
|
188
|
+
|
|
189
|
+
i = 0
|
|
190
|
+
superset.each do |a|
|
|
191
|
+
b = subset[i]
|
|
192
|
+
if b == a
|
|
193
|
+
i += 1
|
|
194
|
+
if i == subset.length
|
|
195
|
+
return true
|
|
196
|
+
end
|
|
197
|
+
elsif a > b
|
|
198
|
+
return false
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
return false
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
def roll_alias(command)
|
|
206
|
+
case command
|
|
207
|
+
when "EXIST"
|
|
208
|
+
return roll_hs("2HD+2SD")
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
m = /^(\d+)(HCD|SPD)$/.match(command)
|
|
212
|
+
return nil unless m
|
|
213
|
+
|
|
214
|
+
n = m[1].to_i
|
|
215
|
+
case m[2]
|
|
216
|
+
when "HCD"
|
|
217
|
+
roll_hs("#{n}HD=1,2,3,4")
|
|
218
|
+
when "SPD"
|
|
219
|
+
roll_hs("#{n}SD=7,8,9,10")
|
|
220
|
+
end
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
def roll_fullpower(command)
|
|
224
|
+
parser = Command::Parser.new(/[HS]FD/, round_type: @round_type)
|
|
225
|
+
.disable_modifier.enable_prefix_number.restrict_cmp_op_to(nil, :>=)
|
|
226
|
+
parsed = parser.parse(command)
|
|
227
|
+
return nil unless parsed
|
|
228
|
+
|
|
229
|
+
n = parsed.prefix_number
|
|
230
|
+
side = parsed.command == "HFD" ? 6 : 10
|
|
231
|
+
target = parsed.target_number || 20
|
|
232
|
+
return nil if n == 0
|
|
233
|
+
|
|
234
|
+
dice = @randomizer.roll_barabara(n, side).sort
|
|
235
|
+
sum = dice.sum()
|
|
236
|
+
tries = [dice]
|
|
237
|
+
while sum < target
|
|
238
|
+
dice = @randomizer.roll_barabara(n, side).sort
|
|
239
|
+
tries.push(dice)
|
|
240
|
+
sum += dice.sum()
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
Result.new.tap do |r|
|
|
244
|
+
r.text = "(#{n}#{parsed.command}>=#{target})"
|
|
245
|
+
tries.each do |ds|
|
|
246
|
+
r.text += " > #{ds.sum}[#{ds.join(',')}]"
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
is_success = tries.length < 5
|
|
250
|
+
r.text += " > #{sum}(#{tries.length}回)"
|
|
251
|
+
r.text += is_success ? " > 成功" : " > 失敗"
|
|
252
|
+
r.condition = is_success
|
|
253
|
+
end
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
def roll_technical(command)
|
|
257
|
+
return nil unless command == "TD"
|
|
258
|
+
|
|
259
|
+
value = @randomizer.roll_once(10)
|
|
260
|
+
is_success = value <= 2
|
|
261
|
+
Result.new.tap do |r|
|
|
262
|
+
r.text = "(TD) > #{value} > #{is_success ? '成功' : '失敗'}"
|
|
263
|
+
r.condition = is_success
|
|
264
|
+
end
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
TABLES = {
|
|
268
|
+
"BAET" => DiceTable::Table.new(
|
|
269
|
+
"【人間】にも【怪異】にも影響のある後遺症",
|
|
270
|
+
"1D12",
|
|
271
|
+
[
|
|
272
|
+
"鏡に映らない:鏡や水面に姿が映らなくなる。他者から見えなくなるわけではない",
|
|
273
|
+
"部分的に透明:身体のどこかが透明になる",
|
|
274
|
+
"部分的欠落:身体のどこかが消えて触ることもできなくなる。生命維持に影響はない",
|
|
275
|
+
"角が生える:角が生えてくる。元から角がある場合はさらに追加",
|
|
276
|
+
"しっぽ:動物のしっぽが生える",
|
|
277
|
+
"けもみみ:動物の耳が頭に生える",
|
|
278
|
+
"影がなくなる:自分の影がなくなってしまう",
|
|
279
|
+
"涙が止まらない:ずっと涙が流れ続けて止まらなくなる",
|
|
280
|
+
"視界の端に何かいる:常に視界の端に何かがいて、踊っている",
|
|
281
|
+
"耳鳴り:ずっと耳鳴りがやまない。たまに幻聴がする",
|
|
282
|
+
"美しい幻聴:時々他人の声が現実離れした美しい声に変わって聞こえる",
|
|
283
|
+
"皮膚の下のうごめき:皮膚の下でずっと何かが蠢いているように感じられる",
|
|
284
|
+
]
|
|
285
|
+
),
|
|
286
|
+
"HAET" => DiceTable::Table.new(
|
|
287
|
+
"【人間寄り】の時に影響のある後遺症",
|
|
288
|
+
"1D6",
|
|
289
|
+
[
|
|
290
|
+
"幻肢の感覚:存在しない追加の腕や翼の感覚がある",
|
|
291
|
+
"声変わり:普段とは違う声になってしまう",
|
|
292
|
+
"怪異の片鱗:【怪異寄り】のときの容姿の一部が【人間寄り】の時にも出てしまう",
|
|
293
|
+
"幻覚:時折やけに生々しい幻覚が見えるようになる",
|
|
294
|
+
"恐怖:あらゆるものが怖く見える",
|
|
295
|
+
"怪異言語:【人間】の領域には存在しない謎の言語が理解できる",
|
|
296
|
+
]
|
|
297
|
+
),
|
|
298
|
+
"SAET" => DiceTable::Table.new(
|
|
299
|
+
"【怪異寄り】の時に影響のある後遺症",
|
|
300
|
+
"1D6",
|
|
301
|
+
[
|
|
302
|
+
"吸精体質:他者に触れると生命力を吸収してしまう。特に仲の良い相手だとより強くなる",
|
|
303
|
+
"威圧する視線:あなたの視線は周囲に強烈な威圧感を与えてしまう",
|
|
304
|
+
"キメラ:あなたの容姿の一部が、他の【越境者】の【怪異寄り】のときの容姿のものと同じになる",
|
|
305
|
+
"異なる怪異:あなた本来の【怪異】の姿とは違う姿に変化してしまう",
|
|
306
|
+
"ポルターガイスト:周囲でラップ音や部品の浮遊といった怪現象が多発する",
|
|
307
|
+
"人間そのもの:【怪異寄り】のときでも人間そのものの容姿になってしまう",
|
|
308
|
+
]
|
|
309
|
+
),
|
|
310
|
+
}.freeze
|
|
311
|
+
|
|
312
|
+
register_prefix('\d+HD', '\d+SD', '\d+HCD', '\d+SPD', '\d+HFD', '\dSFD', 'EXIST', 'TD', TABLES.keys)
|
|
313
|
+
end
|
|
314
|
+
end
|
|
315
|
+
end
|
|
@@ -17,10 +17,15 @@ module BCDice
|
|
|
17
17
|
|
|
18
18
|
# ダイスボットの使い方
|
|
19
19
|
HELP_MESSAGE = <<~MESSAGETEXT
|
|
20
|
-
・技能値判定(xDM<=y)
|
|
20
|
+
・技能値判定(xDM<=y / xDM<=yEz)
|
|
21
21
|
"(個数)DM<=(判定値)"で指定します。
|
|
22
22
|
ダイスの個数は省略可能で、省略した場合1個になります。
|
|
23
|
-
|
|
23
|
+
個数や判定値には四則演算(+-*/)を使用できます。
|
|
24
|
+
末尾にEzを付けるとダイス数にzを加算します。E-zで減算も可能です。
|
|
25
|
+
例)2DM<=5 DM<=8 2+2DM<=5 → 4個で判定値5
|
|
26
|
+
2DM<=5E2 → 4個で判定値5 / 3DM<=5E-1 → 2個で判定値5
|
|
27
|
+
※ダイス数が0以下になる場合は確定失敗
|
|
28
|
+
|
|
24
29
|
・技能値判定(sDAa+z)
|
|
25
30
|
"(技能レベル)DA(能力値)+(ダイスボーナス)"で指定します。
|
|
26
31
|
ダイスボーナスの個数は省略可能で、省略した場合0になります。
|
|
@@ -30,7 +35,7 @@ module BCDice
|
|
|
30
35
|
MESSAGETEXT
|
|
31
36
|
|
|
32
37
|
# ダイスボットで使用するコマンドを配列で列挙する
|
|
33
|
-
register_prefix('
|
|
38
|
+
register_prefix('[-+*/\d]*DM<=', '(B|\d*)DA')
|
|
34
39
|
|
|
35
40
|
CRITICAL_VALUE = 1
|
|
36
41
|
FUMBLE_VALUE = 10
|
|
@@ -41,7 +46,7 @@ module BCDice
|
|
|
41
46
|
# @return [nil] 無効なコマンドだった場合
|
|
42
47
|
def eval_game_system_specific_command(command)
|
|
43
48
|
case command
|
|
44
|
-
when
|
|
49
|
+
when %r{^[-+*/\d]*DM<=[-+*/\d]+}
|
|
45
50
|
roll_dm(command)
|
|
46
51
|
when /^(B|\d*)DA\d+(\+)?\d*/
|
|
47
52
|
roll_da(command)
|
|
@@ -93,21 +98,37 @@ module BCDice
|
|
|
93
98
|
# @param [String] command コマンド
|
|
94
99
|
# @return [Result, nil] コマンドの結果
|
|
95
100
|
def roll_dm(command)
|
|
96
|
-
m =
|
|
101
|
+
m = %r{^([-+*/\d]+)?DM<=([-+*/\d]+)(E(-?\d+))?$}.match(command)
|
|
97
102
|
unless m
|
|
98
103
|
return nil
|
|
99
104
|
end
|
|
100
105
|
|
|
101
|
-
|
|
102
|
-
|
|
106
|
+
base_dice_str = m[1]
|
|
107
|
+
threshold_str = m[2]
|
|
108
|
+
modifier = m[4]&.to_i
|
|
109
|
+
|
|
110
|
+
base_dice = base_dice_str ? Arithmetic.eval(base_dice_str, RoundType::FLOOR) : 1
|
|
111
|
+
success_threshold = Arithmetic.eval(threshold_str, RoundType::FLOOR)
|
|
112
|
+
return nil unless base_dice && success_threshold
|
|
113
|
+
|
|
114
|
+
num_dice = modifier ? base_dice + modifier : base_dice
|
|
115
|
+
|
|
116
|
+
# ダイス数が0以下の場合は確定失敗
|
|
103
117
|
if num_dice <= 0
|
|
104
|
-
return
|
|
118
|
+
return Result.fumble("(#{command}) > #{translate('Emoklore.dice_count_zero')}")
|
|
105
119
|
end
|
|
106
120
|
|
|
107
121
|
# ダイスロール本体
|
|
108
122
|
result = dice_roll(num_dice, success_threshold)
|
|
109
123
|
|
|
110
|
-
|
|
124
|
+
# 出力フォーマット:算術式やダイスボーナスがある場合は展開形を表示
|
|
125
|
+
has_arithmetic = base_dice_str&.match?(%r{[-+*/]}) || threshold_str.match?(%r{[-+*/]})
|
|
126
|
+
values_changed = (base_dice_str && base_dice_str != base_dice.to_s) || threshold_str != success_threshold.to_s
|
|
127
|
+
if modifier || (has_arithmetic && values_changed)
|
|
128
|
+
result.text = "(#{command}) > (#{num_dice}DM<=#{success_threshold}) > #{result.text}"
|
|
129
|
+
else
|
|
130
|
+
result.text = "(#{num_dice}DM<=#{success_threshold}) > #{result.text}"
|
|
131
|
+
end
|
|
111
132
|
return result
|
|
112
133
|
end
|
|
113
134
|
|
|
@@ -124,6 +145,10 @@ module BCDice
|
|
|
124
145
|
num_dice = (m[1] == "B" ? 1 : (m[1]&.to_i || 1)) + bonus
|
|
125
146
|
success_threshold = m[1].to_i + m[2].to_i
|
|
126
147
|
|
|
148
|
+
if num_dice <= 0
|
|
149
|
+
return Result.fumble("(#{command}) > #{translate('Emoklore.dice_count_zero')}")
|
|
150
|
+
end
|
|
151
|
+
|
|
127
152
|
result = dice_roll(num_dice, success_threshold)
|
|
128
153
|
|
|
129
154
|
result.text = "(#{command}) > (#{num_dice}DM<=#{success_threshold}) > #{result.text}"
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'bcdice/game_system/Emoklore'
|
|
4
|
+
|
|
5
|
+
module BCDice
|
|
6
|
+
module GameSystem
|
|
7
|
+
class Emoklore_Korean < Emoklore
|
|
8
|
+
# ゲームシステムの識別子
|
|
9
|
+
ID = "Emoklore:Korean"
|
|
10
|
+
|
|
11
|
+
# ゲームシステム名
|
|
12
|
+
NAME = "에모크로아TRPG"
|
|
13
|
+
|
|
14
|
+
# ゲームシステム名の読みがな
|
|
15
|
+
#
|
|
16
|
+
# 「ゲームシステム名の読みがなの設定方法」(docs/dicebot_sort_key.md)を参考にして
|
|
17
|
+
# 設定してください
|
|
18
|
+
SORT_KEY = "国際化:Korean:에모크로아TRPG"
|
|
19
|
+
|
|
20
|
+
# ダイスボットの使い方
|
|
21
|
+
HELP_MESSAGE = <<~MESSAGETEXT
|
|
22
|
+
・기능치 판정(xDM<=y / xDM<=yEz)
|
|
23
|
+
"(개수)DM<=(판정치)"로 판정합니다.
|
|
24
|
+
주사위의 개수는 생략 가능하며, 생략 시 1개로 설정됩니다.
|
|
25
|
+
주사위 개수와 판정치에는 사칙연산(+-*/)을 사용할 수 있습니다.
|
|
26
|
+
수식 끝에 Ez를 붙이면 주사위 수에 z를 더합니다. E-z로 빼기도 가능합니다.
|
|
27
|
+
ex)2DM<=5 DM<=8 2DM<=3+2
|
|
28
|
+
2+2DM<=5 → 주사위 4개로 판정치 5
|
|
29
|
+
2DM<=5E2 → 주사위 2+2 = 주사위 4개로 판정치 5
|
|
30
|
+
3DM<=5E-1 → 주사위 3-1 = 주사위 2개로 판정치 5
|
|
31
|
+
※주사위 수가 0 이하가 되는 경우 확정 실패
|
|
32
|
+
|
|
33
|
+
・기능치 판정(sDAa+z)
|
|
34
|
+
"(기능 레벨)DA(능력치)+(주사위 보너스)"로 판정합니다.
|
|
35
|
+
주사위 보너스의 개수는 생략 가능하며, 생략 시 0개로 설정됩니다.
|
|
36
|
+
기능 레벨에는 1~3의 수치를 입력합니다. 기본 기능으로 판정하려면 기능 레벨에"b"를 입력하세요.
|
|
37
|
+
주사위 개수는 기능 레벨과 주사위 보너스 개수에 따라 결정되며, s+z개의 주사위를 굴립니다. (s="b"인 경우 s=1)
|
|
38
|
+
판정치는 s+a 입니다.(s="b"인 경우에는 s=0)
|
|
39
|
+
MESSAGETEXT
|
|
40
|
+
|
|
41
|
+
register_prefix_from_super_class()
|
|
42
|
+
|
|
43
|
+
def initialize(command)
|
|
44
|
+
super(command)
|
|
45
|
+
|
|
46
|
+
@locale = :ko_kr
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -16,13 +16,13 @@ module BCDice
|
|
|
16
16
|
HELP_MESSAGE = <<~MESSAGETEXT
|
|
17
17
|
■ ファッジダイスによる判定 (xDF+y>=t)
|
|
18
18
|
ファッジダイスをx個ダイスロールし、結果を判定します。
|
|
19
|
-
x: ダイス数
|
|
19
|
+
x: ダイス数(省略時4)
|
|
20
20
|
y: 修正値(省略可)
|
|
21
|
-
t:
|
|
22
|
-
例)4DF, 4DF>=3, 4DF+1>=3
|
|
21
|
+
t: 目標値(省略可)
|
|
22
|
+
例)4DF, 4DF>=3, 4DF+1>=3, DF, DF>=3, DF+1>=3
|
|
23
23
|
MESSAGETEXT
|
|
24
24
|
|
|
25
|
-
register_prefix('\d
|
|
25
|
+
register_prefix('\d*DF')
|
|
26
26
|
|
|
27
27
|
def eval_game_system_specific_command(command)
|
|
28
28
|
roll_df(command)
|
|
@@ -40,7 +40,9 @@ module BCDice
|
|
|
40
40
|
return nil
|
|
41
41
|
end
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
dice_x = 4
|
|
44
|
+
dice_x = parsed.prefix_number if parsed.prefix_number
|
|
45
|
+
dice_list = roll_fate_dice(dice_x)
|
|
44
46
|
total = dice_list.sum() + parsed.modify_number
|
|
45
47
|
|
|
46
48
|
fate_dice_list = dice_list.map do |i|
|
|
@@ -103,7 +105,9 @@ module BCDice
|
|
|
103
105
|
if target.nil?
|
|
104
106
|
Result.new
|
|
105
107
|
elsif total == target
|
|
106
|
-
Result.success("Tie")
|
|
108
|
+
Result.success("Tie(+0)")
|
|
109
|
+
elsif total == target + 1
|
|
110
|
+
Result.success("Succeed(+1)")
|
|
107
111
|
elsif total >= target + 3
|
|
108
112
|
Result.critical("Succeed with Style")
|
|
109
113
|
elsif total >= target
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'bcdice/game_system/FullMetalPanic'
|
|
4
|
+
|
|
5
|
+
module BCDice
|
|
6
|
+
module GameSystem
|
|
7
|
+
class FullMetalPanic_Korean < FullMetalPanic
|
|
8
|
+
# ゲームシステムの識別子
|
|
9
|
+
ID = 'FullMetalPanic:Korean'
|
|
10
|
+
|
|
11
|
+
# ゲームシステム名
|
|
12
|
+
NAME = '풀 메탈 패닉! RPG'
|
|
13
|
+
|
|
14
|
+
# ゲームシステム名の読みがな
|
|
15
|
+
SORT_KEY = '国際化:Korean:풀 메탈 패닉! RPG'
|
|
16
|
+
|
|
17
|
+
set_aliases_for_srs_roll('MG', 'FP')
|
|
18
|
+
|
|
19
|
+
register_prefix_from_super_class()
|
|
20
|
+
|
|
21
|
+
def initialize(command)
|
|
22
|
+
super(command)
|
|
23
|
+
|
|
24
|
+
@locale = :ko_kr
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|