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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +111 -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/Dracurouge/ko_kr.yml +1284 -205
- data/i18n/Emoklore/ja_jp.yml +1 -0
- data/i18n/Emoklore/ko_kr.yml +1 -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/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/Emoklore.rb +34 -9
- data/lib/bcdice/game_system/Emoklore_Korean.rb +10 -2
- 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/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 +8 -213
- 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/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 +7 -81
- 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 +6 -95
- 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/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 +42 -0
- data/lib/bcdice/version.rb +1 -1
- metadata +87 -2
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
ja_jp:
|
|
2
|
+
ZombiLine:
|
|
3
|
+
success_critical: "成功(クリティカル)"
|
|
4
|
+
success_fumble: "成功(ファンブル)"
|
|
5
|
+
success: "成功"
|
|
6
|
+
failure_fumble: "失敗(ファンブル)"
|
|
7
|
+
failure: "失敗"
|
|
8
|
+
SST:
|
|
9
|
+
name: "ストレス症状表"
|
|
10
|
+
type: "1D10"
|
|
11
|
+
items:
|
|
12
|
+
- '憤怒:一番近い敵を攻撃(成功率+20%)しにいきます。近くに敵がいない場合、誰かのストレスを+1させます。 頭に血が上り、誰かに怒りをぶつけます。'
|
|
13
|
+
- '逃避:落下してでも敵から逃げるように移動します。周囲に敵が居ない場合、現実逃避します。 耐えられなくなり、逃げ出します。'
|
|
14
|
+
- '幻覚:戦闘中は、「行動放棄(全AP)」します。戦闘以外なら、幻覚を見て笑います。 自分が望む幻覚が見えます。'
|
|
15
|
+
- '絶叫:戦闘中は、「注目を集める(2AP)」をします。戦闘以外なら、無意味に叫びます。 思わず叫んでしまいます。'
|
|
16
|
+
- '自傷:自ら【怪我】を負います。戦闘中は「自傷行為(1AP)」をして自分が【怪我】します。 思わず自分を傷つけます。'
|
|
17
|
+
- '不安:誰かのストレスを1上げます。近くに誰も居ない場合、泣き出します。 不安にかられて余計なことを言います。'
|
|
18
|
+
- '忌避:その場から一番近い対象に「石(1AP)」を投げます。それができない場合、【転倒】してうずくまります。 嫌悪感から全てを拒みます。'
|
|
19
|
+
- '暴走:一番近い敵を攻撃しにいきます。近くに敵がいない場合、周りの意見も聞かずに安直な行動をします。 冷静でいられなくなり、直情的になります。'
|
|
20
|
+
- '混乱:近くにいるランダムな対象に格闘で攻撃しにいきます。それができない場合、「行動放棄(全 AP)」します。 世界全てが敵に見えて攻撃します。'
|
|
21
|
+
- '開眼:ストレスは0まで下がります。あなたは教祖となって教義をひとつつくって「布教」できます。次の症状が出るまで効果は続きます。 ゾンビだらけの世界の真理を見つけます。'
|
|
22
|
+
IT:
|
|
23
|
+
name: "食材表"
|
|
24
|
+
items:
|
|
25
|
+
raw: '生モノ食材'
|
|
26
|
+
suspicious: '怪しい食材'
|
|
27
|
+
dangerous: '危ない食材'
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
ko_kr:
|
|
2
|
+
ZombiLine:
|
|
3
|
+
success_critical: "성공(크리티컬)"
|
|
4
|
+
success_fumble: "성공(펌블)"
|
|
5
|
+
success: "성공"
|
|
6
|
+
failure_fumble: "실패(펌블)"
|
|
7
|
+
failure: "실패"
|
|
8
|
+
SST:
|
|
9
|
+
name: "스트레스 증상표"
|
|
10
|
+
type: "1D10"
|
|
11
|
+
items:
|
|
12
|
+
- '[분노] 가장 가까이 있는 적을 공격(성공률 +20%)합니다. 가까이 적이 없는 경우, 누군가의 스트레스를 +1시킵니다. / 설명: 머리에 피가 몰려 누군가에게 화를 터트립니다.'
|
|
13
|
+
- '[도피] 낙하하더라도 적에게서 도망치려 이동합니다. 주변에 적이 없는 경우, 현실도피를 하려 합니다. / 설명: 견딜 수 없게 되어 도망칩니다.'
|
|
14
|
+
- '[환상] 전투 중에는 「행동방치(전AP)」를 합니다. 전투 이외의 경우, 환상을 보며 웃음을 흘립니다. / 설명: 자신이 꿈꾸는 환상을 봅니다.'
|
|
15
|
+
- '[절규] 전투 중에는 비명을 지르며 「주목을 모은다(2AP)」를 합니다. 전투 이외의 경우, 무의미한 소리를 지릅니다. / 설명: 생각없이 비명을 지릅니다.'
|
|
16
|
+
- '[자해] 스스로 【상처】를 입습니다. 전투 중에는 「자해행위(1AP)」로 스스로에게 【상처】를 입힙니다. / 설명: 생각없이 자신에게 상처를 입힙니다.'
|
|
17
|
+
- '[불안] 누군가의 스트레스를 1 올립니다. 근처에 아무도 없는 경우, 울음을 터트립니다. / 설명: 불안해져 쓸데없는 말을 지껄입니다.'
|
|
18
|
+
- '[기피] 그 자리에서 가장 가까이 있는 대상에게 「돌(1AP)」을 던집니다. 그게 불가능한 경우, 【넘어짐】상태가 됩니다. / 설명: 혐오감으로 모든 것을 거부합니다.'
|
|
19
|
+
- '[폭주] 가장 가까이 있는 적에게 공격을 가합니다. 가까이 적이 없는 경우 주변의 의견을 듣지 않고 제멋대로 행동을 합니다. / 설명: 냉정을 찾지 못하고 제멋대로 행동합니다.'
|
|
20
|
+
- '[혼란] 가까이 있는 무작위 대상에게 격투로 공격을 가합니다. 그게 불가능한 경우 「행동방치(전AP)」를 합니다. / 설명: 세상 모든 것이 적으로 보여 공격합니다.'
|
|
21
|
+
- '[개안] 스트레스가 0까지 떨어집니다. 당신은 교조가 되어 교의를 한가지 정해 「포교」할 수 있습니다. 다음 증상이 나올 때까지 효과가 지속됩니다. / 설명: 좀비투성이 세상의 진리를 보았습니다.'
|
|
22
|
+
IT:
|
|
23
|
+
name: "식재료 표"
|
|
24
|
+
items:
|
|
25
|
+
raw: '신선 식재료'
|
|
26
|
+
suspicious: '수상한 식재료'
|
|
27
|
+
dangerous: '위험한 식재료'
|
data/i18n/ko_kr.yml
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
ko_kr:
|
|
2
2
|
success: 성공
|
|
3
3
|
failure: 실패
|
|
4
|
+
critical: 크리티컬
|
|
4
5
|
fumble: 펌블
|
|
5
6
|
RTT:
|
|
6
7
|
rtt_format: '랜덤 특기 결정표(%<category_dice>d,%<row_dice>d) > %<text>s'
|
|
7
8
|
rttn_format: '지정특기(%<category_name>s)표(%<row_dice>d) > %<text>s'
|
|
9
|
+
rct_format: '랜덤 분야표(%<category_dice>d) > %<category_name>s'
|
data/i18n/zh_hant.yml
CHANGED
|
@@ -4,5 +4,5 @@ zh_hant:
|
|
|
4
4
|
fumble: 大失敗
|
|
5
5
|
critical: 大成功
|
|
6
6
|
RTT:
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
rtt_format: "隨機特技表(%<category_dice>d,%<row_dice>d) > %<text>s"
|
|
8
|
+
rttn_format: "%<category_name>s領域隨機特技表(%<row_dice>d) > %<text>s"
|
|
@@ -6,6 +6,27 @@ module BCDice
|
|
|
6
6
|
module DiceTable
|
|
7
7
|
# 左側(十の位)のみ Range を用いる D66 表
|
|
8
8
|
class D66LeftRangeTable < D66Table
|
|
9
|
+
class << self
|
|
10
|
+
def from_i18n(key, locale)
|
|
11
|
+
table = I18n.t(key, locale: locale)
|
|
12
|
+
converted_items = table[:items].map do |item|
|
|
13
|
+
[conv_string_range(item[0]), item[1]]
|
|
14
|
+
end
|
|
15
|
+
new(table[:name], table[:d66_sort_type], converted_items)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def conv_string_range(x)
|
|
19
|
+
if x.include?("..")
|
|
20
|
+
return Range.new(*x.split("..", 2).map { |n| Integer(n) })
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
raise(
|
|
24
|
+
ArgumentError,
|
|
25
|
+
"invalid format"
|
|
26
|
+
)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
9
30
|
# @param name [String] 表の名前
|
|
10
31
|
# @param sort_type [Symbol] 出目入れ替えの方式 BCDice::D66SortType
|
|
11
32
|
# @param items [Array<(Range, Array<String>)>] 表の項目の配列
|
|
@@ -17,29 +17,43 @@ module BCDice
|
|
|
17
17
|
AB{n}>={dif} n=10面ダイスの数、dif=難易度
|
|
18
18
|
- 技能判定(クリティカル・ファンブルあり)
|
|
19
19
|
ABT{n}>={dif} n=10面ダイスの数、dif=難易度
|
|
20
|
+
- ダメージチェック
|
|
21
|
+
DMG>={dif} dif=ダメージ難易度
|
|
20
22
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
例:
|
|
24
|
-
例:ABT3
|
|
25
|
-
例:
|
|
23
|
+
※ 技能判定、ダメージチェックともにダイス結果、難易度に対して四則演算(+ - * /)を用いた複数ボーナスを含めることが可能です。計算結果の小数は切り捨てられます。
|
|
24
|
+
|
|
25
|
+
例:AB2>=5 (一般技能を活用して難易度5の技能判定。 クリファンなし。)
|
|
26
|
+
例:ABT3>=15 (専門技能を活用して難易度15の技能判定。クリファンあり。)
|
|
27
|
+
例:AB1+1+2>=8 (一般技能を活用せず難易度8の技能判定。 ボーナスとして+1と+2点の補正あり。 クリファンなし。)
|
|
28
|
+
例:ABT3-3>=10+2 (専門技能を活用して難易度10+2の技能判定。ペナルティとして-3点の補正あり。クリファンあり。)
|
|
29
|
+
例:ABT2>=4/8/12 (一般技能を活用して難易度4/8/12の段階的な技能判定。クリファンあり。)
|
|
30
|
+
例:DMG>=50 (難易度50の判定。)
|
|
31
|
+
例:DMG>=20+50 (難易度20+50の判定。)
|
|
26
32
|
INFO_MESSAGE_TEXT
|
|
27
33
|
|
|
28
|
-
register_prefix('ABT
|
|
34
|
+
register_prefix('ABT?', 'DMG')
|
|
29
35
|
|
|
30
36
|
def eval_game_system_specific_command(command)
|
|
31
|
-
return roll_skills(command)
|
|
37
|
+
return roll_skills(command) || roll_damage_check(command)
|
|
32
38
|
end
|
|
33
39
|
|
|
34
40
|
def roll_skills(command)
|
|
35
|
-
m = %r{AB(T?)(\d+)([
|
|
41
|
+
m = %r{^AB(T?)(\d+)((?:[-+]\d+)*)>=(\d+(?:/\d+)*)((?:[-+]\d+)*)$}.match(command)
|
|
36
42
|
return nil unless m
|
|
37
43
|
|
|
38
44
|
# 値の取得
|
|
39
45
|
use_cf = m[1] != ''
|
|
40
46
|
times = m[2].to_i
|
|
41
|
-
|
|
42
|
-
|
|
47
|
+
|
|
48
|
+
# 値の計算
|
|
49
|
+
bonus = m[3] != '' ? Arithmetic.eval(m[3], RoundType::FLOOR) : 0
|
|
50
|
+
return nil unless bonus
|
|
51
|
+
|
|
52
|
+
base_targets = m[4].split('/').map(&:to_i)
|
|
53
|
+
target_bonus = m[5] != '' ? Arithmetic.eval(m[5], RoundType::FLOOR) : 0
|
|
54
|
+
return nil unless target_bonus
|
|
55
|
+
|
|
56
|
+
targets = base_targets.map { |t| t + target_bonus }
|
|
43
57
|
target = targets[0]
|
|
44
58
|
min_target = targets.min
|
|
45
59
|
max_target = targets.max
|
|
@@ -107,15 +121,8 @@ module BCDice
|
|
|
107
121
|
end
|
|
108
122
|
|
|
109
123
|
# ボーナスがある場合の処理
|
|
110
|
-
bonus_text =
|
|
111
|
-
bonus_result = ''
|
|
112
|
-
if bonus != 0
|
|
113
|
-
if bonus > 0
|
|
114
|
-
bonus_text = "+"
|
|
115
|
-
end
|
|
116
|
-
bonus_text += bonus.to_s
|
|
117
|
-
bonus_result = "#{total} > "
|
|
118
|
-
end
|
|
124
|
+
bonus_text = m[3]
|
|
125
|
+
bonus_result = m[3] == '' ? '' : "#{total} > "
|
|
119
126
|
|
|
120
127
|
# Resultクラスに結果を入れる
|
|
121
128
|
Result.new.tap do |r|
|
|
@@ -126,6 +133,48 @@ module BCDice
|
|
|
126
133
|
r.failure = !is_success
|
|
127
134
|
end
|
|
128
135
|
end
|
|
136
|
+
|
|
137
|
+
def roll_damage_check(command)
|
|
138
|
+
parser = Command::Parser.new("DMG", round_type: BCDice::RoundType::FLOOR).restrict_cmp_op_to(:>=)
|
|
139
|
+
parsed = parser.parse(command)
|
|
140
|
+
return nil unless parsed
|
|
141
|
+
|
|
142
|
+
# 値の計算
|
|
143
|
+
dif = parsed.target_number
|
|
144
|
+
return nil unless dif
|
|
145
|
+
|
|
146
|
+
# ダイスロール
|
|
147
|
+
dice_result = @randomizer.roll_once(100)
|
|
148
|
+
|
|
149
|
+
# Result用変数宣言
|
|
150
|
+
is_success = false
|
|
151
|
+
|
|
152
|
+
# 結果判定
|
|
153
|
+
if dice_result < (dif / 5)
|
|
154
|
+
is_success = false
|
|
155
|
+
second_result = @randomizer.roll_once(100)
|
|
156
|
+
if second_result >= dif
|
|
157
|
+
result_str = "失敗 > 弱点追加 > #{second_result} > 戦闘不能状態"
|
|
158
|
+
else
|
|
159
|
+
result_str = "失敗 > 弱点追加 > #{second_result} > 死亡状態"
|
|
160
|
+
end
|
|
161
|
+
elsif dice_result < (dif / 2)
|
|
162
|
+
result_str = "失敗 > 弱点追加 > 戦闘不能状態"
|
|
163
|
+
is_success = false
|
|
164
|
+
elsif dice_result < dif
|
|
165
|
+
result_str = "失敗 > 戦闘不能状態"
|
|
166
|
+
is_success = false
|
|
167
|
+
else
|
|
168
|
+
result_str = "成功"
|
|
169
|
+
is_success = true
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
Result.new.tap do |r|
|
|
173
|
+
r.text = "(#{command}) > #{dice_result} > #{result_str}"
|
|
174
|
+
r.success = is_success
|
|
175
|
+
r.failure = !is_success
|
|
176
|
+
end
|
|
177
|
+
end
|
|
129
178
|
end
|
|
130
179
|
end
|
|
131
180
|
end
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require "bcdice/base"
|
|
4
|
+
|
|
3
5
|
module BCDice
|
|
4
6
|
module GameSystem
|
|
5
7
|
class Airgetlamh < Base
|
|
@@ -41,9 +43,7 @@ module BCDice
|
|
|
41
43
|
・15AAx4c0 → 15d10で目標値6、威力4、クリティカル無しの命中判定。
|
|
42
44
|
MESSAGETEXT
|
|
43
45
|
|
|
44
|
-
register_prefix(
|
|
45
|
-
'\d*A[AL]'
|
|
46
|
-
)
|
|
46
|
+
register_prefix('\d*A[AL]')
|
|
47
47
|
|
|
48
48
|
def initialize(command)
|
|
49
49
|
super(command)
|
|
@@ -51,64 +51,87 @@ module BCDice
|
|
|
51
51
|
end
|
|
52
52
|
|
|
53
53
|
def eval_game_system_specific_command(command)
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
else
|
|
64
|
-
criticalTrigger = (Regexp.last_match(8) || 0).to_i
|
|
65
|
-
criticalNumber = (Regexp.last_match(10) || 1).to_i
|
|
66
|
-
end
|
|
67
|
-
criticalNumber = 3 if criticalNumber > 4
|
|
68
|
-
|
|
69
|
-
return checkRoll(diceCount, target, damage, criticalTrigger, criticalNumber)
|
|
54
|
+
check_roll(command)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
private
|
|
58
|
+
|
|
59
|
+
def parse_check_roll(command)
|
|
60
|
+
m = /(\d+)?A(A|L)(\d+)?(?:[X*](\d+)(?:\+(\d+))?)?(?:C(\d+))?$/i.match(command)
|
|
61
|
+
unless m
|
|
62
|
+
return nil
|
|
70
63
|
end
|
|
71
64
|
|
|
72
|
-
|
|
65
|
+
dice_count = m[1]&.to_i || 2
|
|
66
|
+
target = m[3]&.to_i || 6
|
|
67
|
+
damage = m[4].to_i
|
|
68
|
+
critical_trigger = m[5].to_i
|
|
69
|
+
critical_number = m[6]&.to_i || 1
|
|
70
|
+
|
|
71
|
+
if m[2] == "L"
|
|
72
|
+
critical_trigger = 0
|
|
73
|
+
critical_number = 0
|
|
74
|
+
elsif critical_number > 4
|
|
75
|
+
critical_number = 3
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
return {
|
|
79
|
+
dice_count: dice_count,
|
|
80
|
+
target: target,
|
|
81
|
+
damage: damage,
|
|
82
|
+
critical_trigger: critical_trigger,
|
|
83
|
+
critical_number: critical_number,
|
|
84
|
+
}
|
|
73
85
|
end
|
|
74
86
|
|
|
75
|
-
def
|
|
76
|
-
|
|
77
|
-
|
|
87
|
+
def check_roll(command)
|
|
88
|
+
parsed = parse_check_roll(command)
|
|
89
|
+
unless parsed
|
|
90
|
+
return nil
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
dice_count = parsed[:dice_count]
|
|
94
|
+
target = parsed[:target]
|
|
95
|
+
damage = parsed[:damage]
|
|
96
|
+
critical_trigger = parsed[:critical_trigger]
|
|
97
|
+
critical_number = parsed[:critical_number]
|
|
98
|
+
|
|
99
|
+
total_success_count = 0
|
|
100
|
+
total_critical_count = 0
|
|
78
101
|
text = ""
|
|
79
102
|
|
|
80
|
-
|
|
103
|
+
roll_count = dice_count
|
|
81
104
|
|
|
82
|
-
while
|
|
83
|
-
|
|
84
|
-
|
|
105
|
+
while roll_count > 0
|
|
106
|
+
dice_array = @randomizer.roll_barabara(roll_count, 10).sort
|
|
107
|
+
dice_text = dice_array.join(",")
|
|
85
108
|
|
|
86
|
-
|
|
87
|
-
|
|
109
|
+
success_count = dice_array.count { |i| i <= target }
|
|
110
|
+
critical_count = dice_array.count { |i| i <= critical_number }
|
|
88
111
|
|
|
89
|
-
|
|
90
|
-
|
|
112
|
+
total_success_count += success_count
|
|
113
|
+
total_critical_count += critical_count
|
|
91
114
|
|
|
92
115
|
text += "+" unless text.empty?
|
|
93
|
-
text += "#{
|
|
116
|
+
text += "#{success_count}[#{dice_text}]"
|
|
94
117
|
|
|
95
|
-
|
|
118
|
+
roll_count = critical_count
|
|
96
119
|
end
|
|
97
120
|
|
|
98
121
|
result = ""
|
|
99
|
-
|
|
122
|
+
is_damage = (damage != 0)
|
|
100
123
|
|
|
101
|
-
if
|
|
102
|
-
|
|
124
|
+
if is_damage
|
|
125
|
+
total_damage = total_success_count * damage + total_critical_count * critical_trigger
|
|
103
126
|
|
|
104
|
-
result += "(#{
|
|
105
|
-
result += " + Trigger:#{
|
|
106
|
-
result += " > #{
|
|
127
|
+
result += "(#{dice_count}D10\<\=#{target}) > #{text} > Hits:#{total_success_count}*#{damage}"
|
|
128
|
+
result += " + Trigger:#{total_critical_count}*#{critical_trigger}" if critical_trigger > 0
|
|
129
|
+
result += " > #{translate('Airgetlamh.damage', count: total_damage)}"
|
|
107
130
|
else
|
|
108
|
-
result += "(#{
|
|
131
|
+
result += "(#{dice_count}D10\<\=#{target}) > #{text} > #{translate('Airgetlamh.success_count', count: total_success_count)}"
|
|
109
132
|
end
|
|
110
133
|
|
|
111
|
-
result += " / #{
|
|
134
|
+
result += " / #{translate('Airgetlamh.critical', count: total_critical_count)}" if total_critical_count > 0
|
|
112
135
|
|
|
113
136
|
return result
|
|
114
137
|
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "bcdice/game_system/Airgetlamh"
|
|
4
|
+
|
|
5
|
+
module BCDice
|
|
6
|
+
module GameSystem
|
|
7
|
+
class Airgetlamh_Korean < Airgetlamh
|
|
8
|
+
# ゲームシステムの識別子
|
|
9
|
+
ID = 'Airgetlamh:Korean'
|
|
10
|
+
|
|
11
|
+
# ゲームシステム名
|
|
12
|
+
NAME = '붉은 고탑의 에어게트람'
|
|
13
|
+
|
|
14
|
+
# ゲームシステム名の読みがな
|
|
15
|
+
SORT_KEY = '国際化:Korean:붉은 고탑의 에어게트람'
|
|
16
|
+
|
|
17
|
+
HELP_MESSAGE = <<~MESSAGETEXT
|
|
18
|
+
【Reg2.0『THE ANSWERER』~】
|
|
19
|
+
・조사 판정(성공 수 표시):[n]AA[m]
|
|
20
|
+
・명중 판정(대미지 표시):[n]AA[m]*p[+t][Cx]
|
|
21
|
+
【~Reg1.1『승화(昇華)』】
|
|
22
|
+
・조사 판정(성공 수 표시):[n]AL[m]
|
|
23
|
+
・명중 판정(대미지 표시):[n]AL[m]*p
|
|
24
|
+
----------------------------------------
|
|
25
|
+
[]안의 커맨드는 생략 가능.
|
|
26
|
+
|
|
27
|
+
「n」으로 주사위 수(공격 횟수)지정. 생략 시「2」.
|
|
28
|
+
「m」으로 목표값 지정. 생략 시「6」.
|
|
29
|
+
「p」으로 위력 지정.「*」는「x」로 대체 가능.
|
|
30
|
+
「+t」으로 크리티컬 트리거 지정. 생략 가능.
|
|
31
|
+
「Cx」으로 크리티컬 값 지정. 생략 시「1」, 최대값「3」,「0」은 크리티컬 없음.
|
|
32
|
+
|
|
33
|
+
공격력 지정으로 명중 판정이 되며, 성공 수가 아닌 대미지를 결과로 표시합니다.
|
|
34
|
+
크리티컬 히트 수만큼 자동으로 추가 굴림 처리를 합니다.
|
|
35
|
+
(AL 커맨드에서는 크리티컬 처리를 하지 않습니다)
|
|
36
|
+
|
|
37
|
+
【사용 예시】
|
|
38
|
+
・AL → 2d10으로 목표값 6의 조사 판정.
|
|
39
|
+
・5AA7*12 → 5d10으로 목표값 7, 위력 12의 명중 판정.
|
|
40
|
+
・AA7x28+5 → 2d10으로 목표값 7, 위력 28, 크리티컬 트리거 5의 명중 판정.
|
|
41
|
+
・9aa5*10C2 → 9d10으로 목표값 5, 위력 10, 크리티컬 값 2의 명중 판정.
|
|
42
|
+
・15AAx4c0 → 15d10으로 목표값 6, 위력 4, 크리티컬 없음의 명중 판정.
|
|
43
|
+
MESSAGETEXT
|
|
44
|
+
|
|
45
|
+
register_prefix_from_super_class()
|
|
46
|
+
|
|
47
|
+
def initialize(command)
|
|
48
|
+
super(command)
|
|
49
|
+
@locale = :ko_kr
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -45,76 +45,89 @@ module BCDice
|
|
|
45
45
|
end
|
|
46
46
|
|
|
47
47
|
def eval_game_system_specific_command(command)
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
isCritical = true
|
|
58
|
-
criticalNumber = 2
|
|
59
|
-
else
|
|
60
|
-
criticalNumber = 0
|
|
61
|
-
end
|
|
62
|
-
end
|
|
63
|
-
target = (Regexp.last_match(3) || 3).to_i
|
|
64
|
-
damage = (Regexp.last_match(6) || 0).to_i
|
|
65
|
-
return checkRoll(rapid, target, damage, isCritical, criticalNumber)
|
|
48
|
+
check_roll(command)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
private
|
|
52
|
+
|
|
53
|
+
def parse_check_roll(command)
|
|
54
|
+
m = /(\d+)AL(C|G)?(\d+)?((x|\*)(\d+))?$/i.match(command)
|
|
55
|
+
unless m
|
|
56
|
+
return nil
|
|
66
57
|
end
|
|
67
58
|
|
|
68
|
-
|
|
59
|
+
rapid = m[1].to_i
|
|
60
|
+
enable_critical = m[2].nil? || m[2] == "G"
|
|
61
|
+
critical_number =
|
|
62
|
+
case m[2]
|
|
63
|
+
when "G"
|
|
64
|
+
2
|
|
65
|
+
when "C"
|
|
66
|
+
0
|
|
67
|
+
else
|
|
68
|
+
1
|
|
69
|
+
end
|
|
70
|
+
target = m[3]&.to_i || 3
|
|
71
|
+
damage = m[6].to_i
|
|
72
|
+
|
|
73
|
+
return {
|
|
74
|
+
rapid: rapid,
|
|
75
|
+
enable_critical: enable_critical,
|
|
76
|
+
critical_number: critical_number,
|
|
77
|
+
target: target,
|
|
78
|
+
damage: damage,
|
|
79
|
+
}
|
|
69
80
|
end
|
|
70
81
|
|
|
71
|
-
def
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
rollCount = rapid
|
|
82
|
+
def check_roll(command)
|
|
83
|
+
parsed = parse_check_roll(command)
|
|
84
|
+
unless parsed
|
|
85
|
+
return nil
|
|
86
|
+
end
|
|
77
87
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
88
|
+
rapid = parsed[:rapid]
|
|
89
|
+
enable_critical = parsed[:enable_critical]
|
|
90
|
+
critical_number = parsed[:critical_number]
|
|
91
|
+
target = parsed[:target]
|
|
92
|
+
damage = parsed[:damage]
|
|
81
93
|
|
|
82
|
-
|
|
83
|
-
|
|
94
|
+
total_success_count = 0
|
|
95
|
+
total_critical_count = 0
|
|
96
|
+
text = ""
|
|
84
97
|
|
|
85
|
-
|
|
86
|
-
if i <= target
|
|
87
|
-
successCount += 1
|
|
88
|
-
end
|
|
98
|
+
roll_count = rapid
|
|
89
99
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
end
|
|
100
|
+
while roll_count > 0
|
|
101
|
+
dice_array = @randomizer.roll_barabara(roll_count, 6).sort
|
|
102
|
+
dice_text = dice_array.join(",")
|
|
94
103
|
|
|
95
|
-
|
|
96
|
-
|
|
104
|
+
success_count = dice_array.count { |v| v <= target }
|
|
105
|
+
critical_count = dice_array.count { |v| v <= critical_number }
|
|
106
|
+
total_success_count += success_count
|
|
107
|
+
total_critical_count += 1 if critical_count > 0
|
|
97
108
|
|
|
98
109
|
text += "+" unless text.empty?
|
|
99
|
-
text += "#{
|
|
110
|
+
text += "#{success_count}[#{dice_text}]"
|
|
100
111
|
|
|
101
|
-
break unless
|
|
112
|
+
break unless enable_critical
|
|
102
113
|
|
|
103
|
-
|
|
114
|
+
roll_count = critical_count
|
|
104
115
|
end
|
|
105
116
|
|
|
106
|
-
|
|
117
|
+
is_damage = (damage != 0)
|
|
107
118
|
|
|
108
|
-
if
|
|
109
|
-
|
|
119
|
+
if is_damage
|
|
120
|
+
total_damage = total_success_count * damage
|
|
110
121
|
|
|
111
|
-
|
|
122
|
+
damage_text = translate("Alsetto.damage", total_damage: total_damage)
|
|
123
|
+
result = "(#{rapid}D6\<\=#{target}) > #{text} > Hits:#{total_success_count}*#{damage} > #{damage_text}"
|
|
112
124
|
else
|
|
113
|
-
|
|
125
|
+
success_text = translate("Alsetto.success_count", success_count: total_success_count)
|
|
126
|
+
result = "(#{rapid}D6\<\=#{target}) > #{text} > #{success_text}"
|
|
114
127
|
end
|
|
115
128
|
|
|
116
|
-
if
|
|
117
|
-
result += "
|
|
129
|
+
if enable_critical
|
|
130
|
+
result += translate("Alsetto.triumph", critical_count: total_critical_count)
|
|
118
131
|
end
|
|
119
132
|
|
|
120
133
|
return result
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'bcdice/game_system/Alsetto'
|
|
4
|
+
|
|
5
|
+
module BCDice
|
|
6
|
+
module GameSystem
|
|
7
|
+
class Alsetto_Korean < Alsetto
|
|
8
|
+
# ゲームシステムの識別子
|
|
9
|
+
ID = 'Alsetto:Korean'
|
|
10
|
+
|
|
11
|
+
# ゲームシステム名
|
|
12
|
+
NAME = '시편의 알세토'
|
|
13
|
+
|
|
14
|
+
# ゲームシステム名の読みがな
|
|
15
|
+
SORT_KEY = '国際化:Korean:시편의 알세토'
|
|
16
|
+
|
|
17
|
+
# ダイスボットの使い方
|
|
18
|
+
HELP_MESSAGE = <<~MESSAGETEXT
|
|
19
|
+
・성공 판정:nAL[m] ・트라이엄프 없음:nALC[m]
|
|
20
|
+
・명중 판정:nAL[m]*p ・트라이엄프 없음:nALC[m]*p
|
|
21
|
+
・명중 판정(건슬링거의 근원시):nALG[m]*p
|
|
22
|
+
[] 내부는 생략 가능.
|
|
23
|
+
|
|
24
|
+
AL 커맨드는 트라이엄프 수만큼, 자동으로 추가 주사위 굴림 처리를 수행합니다.
|
|
25
|
+
「n」으로 주사위 수를 지정.
|
|
26
|
+
「m」으로 목표치를 지정. 생략 시에는 기본값인 「3」이 사용됩니다.
|
|
27
|
+
「p」로 공격력을 지정. 「*」 대신 「x」도 사용 가능.
|
|
28
|
+
공격력을 지정하면 명중 판정이 되며, 성공수가 아닌 대미지를 결과로 표시합니다.
|
|
29
|
+
|
|
30
|
+
ALC 커맨드는 트라이엄프 없이 성공수, 대미지를 결과로 표시합니다.
|
|
31
|
+
ALG 커맨드는 「2 이하」에서 트라이엄프 처리를 수행합니다.
|
|
32
|
+
|
|
33
|
+
【사용 예시】
|
|
34
|
+
・5AL → 5d6에서 목표치 3.
|
|
35
|
+
・5ALC → 5d6에서 목표치 3. 트라이엄프 없음.
|
|
36
|
+
・6AL2 → 6d6에서 목표치 2.
|
|
37
|
+
・4AL*5 → 4d6에서 목표치 3, 공격력 5의 명중 판정.
|
|
38
|
+
・7AL2x10 → 7d6에서 목표치 2, 공격력 10의 명중 판정.
|
|
39
|
+
・8ALC4x5 → 8d6에서 목표치 4, 공격력 5, 트라이엄프 없는 명중 판정.
|
|
40
|
+
MESSAGETEXT
|
|
41
|
+
|
|
42
|
+
register_prefix_from_super_class()
|
|
43
|
+
|
|
44
|
+
def initialize(command)
|
|
45
|
+
super(command)
|
|
46
|
+
|
|
47
|
+
@locale = :ko_kr
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|