bcdice 3.5.0 → 3.6.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 (39) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +29 -0
  3. data/i18n/FutariSousa/ja_jp.yml +705 -9
  4. data/i18n/KillDeathBusiness/ja_jp.yml +1 -1
  5. data/i18n/SwordWorld/ja_jp.yml +6 -0
  6. data/i18n/SwordWorld2_0/ja_jp.yml +37 -0
  7. data/i18n/SwordWorld2_5/ja_jp.yml +57 -0
  8. data/lib/bcdice/common_command/add_dice/node.rb +28 -4
  9. data/lib/bcdice/common_command/add_dice/parser.rb +149 -85
  10. data/lib/bcdice/dice_table/d66_parity_table.rb +8 -0
  11. data/lib/bcdice/game_system/Avandner.rb +1 -2
  12. data/lib/bcdice/game_system/Ayabito.rb +229 -0
  13. data/lib/bcdice/game_system/BattleTech.rb +1 -1
  14. data/lib/bcdice/game_system/CyberpunkRed.rb +135 -0
  15. data/lib/bcdice/game_system/DarkDaysDrive.rb +76 -41
  16. data/lib/bcdice/game_system/Elysion.rb +36 -20
  17. data/lib/bcdice/game_system/FutariSousa.rb +48 -4
  18. data/lib/bcdice/game_system/KemonoNoMori.rb +17 -17
  19. data/lib/bcdice/game_system/NeverCloud.rb +19 -8
  20. data/lib/bcdice/game_system/Shiranui.rb +145 -0
  21. data/lib/bcdice/game_system/ShuumatsuKikou.rb +298 -0
  22. data/lib/bcdice/game_system/StarryDolls.rb +318 -0
  23. data/lib/bcdice/game_system/StrangerOfSwordCity.rb +18 -5
  24. data/lib/bcdice/game_system/SwordWorld.rb +6 -6
  25. data/lib/bcdice/game_system/SwordWorld2_0.rb +16 -39
  26. data/lib/bcdice/game_system/SwordWorld2_5.rb +3 -63
  27. data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +29 -28
  28. data/lib/bcdice/game_system/cyberpunk_red/tables.rb +530 -0
  29. data/lib/bcdice/game_system/meikyu_kingdom/tables.rb +1 -1
  30. data/lib/bcdice/game_system/meikyu_kingdom_basic/table.rb +1 -1
  31. data/lib/bcdice/game_system/satasupe/tables.rb +1 -1
  32. data/lib/bcdice/game_system/sword_world/rating_options.rb +47 -0
  33. data/lib/bcdice/game_system/sword_world/rating_parsed.rb +34 -82
  34. data/lib/bcdice/game_system/sword_world/rating_parser.rb +43 -53
  35. data/lib/bcdice/game_system/sword_world/transcendent_test.rb +14 -10
  36. data/lib/bcdice/game_system.rb +4 -0
  37. data/lib/bcdice/randomizer.rb +1 -1
  38. data/lib/bcdice/version.rb +1 -1
  39. metadata +11 -2
@@ -32,15 +32,34 @@ module BCDice
32
32
   ・ランダム星座表 HOR
33
33
     ランダム星座表A HORA/ランダム星座表B HORB
34
34
   ・主人関係表 MRT/関係属性表 RAT
35
+  ・従者関係表 SRT
35
36
   ・奇跡表 MIR
36
37
   ・戦果表 BRT
37
38
   ・事件表 TRO
39
+  ・森事件表 TROF
40
+  ・庭園事件表 TROG
41
+  ・城内事件表 TROC
42
+  ・都市事件表 TROT
43
+  ・図書館事件表 TROL
44
+  ・駅事件表 TROS
45
+  ・従者トラブル表 TRS
46
+  ・リアクション表 忠誠 RAL
47
+  ・リアクション表 冷静 RAC
48
+  ・リアクション表 母性 RAM
49
+  ・リアクション表 年長者 RAO
50
+  ・リアクション表 無邪気 RAI
51
+  ・リアクション表 長老 RAE
38
52
   ・遭遇表 ENC
39
53
   ・致命傷表 FWT
40
54
   ・カタストロフ表 CAT
41
55
   ・回想表
42
56
     〈魔術師の庭〉回想表 JDSRT/〈セブンス・ヘブン〉回想表 SHRT
43
57
     /〈祝福の鐘〉回想表 BCRT/〈オメガ探偵社〉回想表 ODRT
58
+  ・出張表
59
+    〈魔術師の庭〉出張表 JDSBT/〈セブンス・ヘブン〉出張表 SHBT
60
+    /〈祝福の鐘〉出張表 BCBT/〈オメガ探偵社〉出張表 ODBT
61
+    /〈天の川商店街〉出張表 ASBT/〈ポラリス星学院〉出張表 PABT
62
+    /〈人形騎士団〉出張表 SCBT/〈人形騎士団〉への出張表 TOSCBT
44
63
  ・D66ダイスあり
45
64
  INFO_MESSAGE_TEXT
46
65
 
@@ -310,6 +329,305 @@ module BCDice
310
329
  "華麗なる事件解決! 主人の推理をたくさん手伝うことができた。キーNPCも、あなたに一目置いてくれそう。",
311
330
  ]
312
331
  ),
332
+ "SRT" => DiceTable::Table.new(
333
+ "従者関係表", # 双子座の小径p.161
334
+ "1D6",
335
+ [
336
+ "悪友",
337
+ "きょうだい",
338
+ "先輩/後輩",
339
+ "相談相手",
340
+ "部下/家臣",
341
+ "双子",
342
+ ]
343
+ ),
344
+ "TRS" => DiceTable::Table.new(
345
+ "従者トラブル表", # 双子座の小径p.163
346
+ "2D6",
347
+ [
348
+ "〈変晶体〉を見つけた従者は一人で「狭い場所/高い場所」へ行って戻れなくなってしまった。助けてあげよう。",
349
+ "星人形の活躍に嫉妬したのか、従者が「いたずらを始めた/いじけてしまった」。友情を再確認させてあげよう。",
350
+ "退屈していた従者は、ふらっとどこかへ「遊び/探索」に行ってしまった。従者の行きそうな場所を探してみよう。",
351
+ "従者が「住人/PC」に一目惚れしてしまったようで、ずっと上の空だ。うまく冒険に興味を戻してあげることはできないだろうか。",
352
+ "従者の姿が見えなくなったと思ったら、興味を引いた「子どもたち/小動物たち」に追い回され、奪い合いになっていた。助けてあげなければ!",
353
+ "従者が〈変晶体〉に取り憑かれ、「暴れだした/逃げ出した」。なんとか取り押さえて浄化しよう!",
354
+ "従者は突然、帰りたいと言い出した。「星人形が心配になった/冒険が怖くなった」ようだ……。話を聞いてあげよう。",
355
+ "不注意からか、従者が何かを「壊してしまって/盗んでしまって」住人に怒られている。仲裁してあげよう。",
356
+ "従者は「もっと強くなりたい/もっと美しくなりたい」と相談してきた。どう答えてあげればいいだろう?",
357
+ "従者は自分の体の一部が「壊れて/汚れて」しまったことに落ち込んでいるようだ。治してあげることはできないだろうか?",
358
+ "住人が従者を珍しく思い、無理やり「コレクション/商品」に加えようとしている。連れて行かれる前に救い出そう。",
359
+ ]
360
+ ),
361
+ "RAL" => DiceTable::Table.new(
362
+ "リアクション表 忠誠", # 双子座の小径p.159
363
+ "1D6",
364
+ [
365
+ "仰せの通りに",
366
+ "いえ、そのようなことは……",
367
+ "我が主の判断に誤りなどございません",
368
+ "ここは私が",
369
+ "……ハッ! 眠ってなどおりません",
370
+ "(従者の姿)の騎士として、主命を全ういたします",
371
+ ]
372
+ ),
373
+ "RAC" => DiceTable::Table.new(
374
+ "リアクション表 冷静", # 双子座の小径p.159
375
+ "1D6",
376
+ [
377
+ "嫌な予感がするわね",
378
+ "あなたがどうしたいかが大切よ",
379
+ "私にはわからないわ",
380
+ "気にする必要はないわ",
381
+ "先を急ぎましょう",
382
+ "私は(従者の姿)だけれど……あなたは本当の友達よ",
383
+ ]
384
+ ),
385
+ "RAM" => DiceTable::Table.new(
386
+ "リアクション表 母性", # 双子座の小径p.159
387
+ "1D6",
388
+ [
389
+ "あらあら、どうしたのかしら",
390
+ "頭をなでて差し上げましょう",
391
+ "素晴らしいことですわ",
392
+ "あなたの思う通りやっていいのですよ",
393
+ "なんて愛らしい子でございましょう",
394
+ "(従者の姿)の私でよければ、いっぱい甘えてくださいまし",
395
+ ]
396
+ ),
397
+ "RAO" => DiceTable::Table.new(
398
+ "リアクション表 年長者", # 双子座の小径p.159
399
+ "1D6",
400
+ [
401
+ "大丈夫、心配しなくていいよ",
402
+ "自分を信じるんだ",
403
+ "フフッ、君は本当にかわいいね",
404
+ "君の力はこんなものじゃないだろう?",
405
+ "私にできることはそう多くない",
406
+ "(従者の姿)たる私を友人に選んでくれたこと、誇りに思うよ",
407
+ ]
408
+ ),
409
+ "RAI" => DiceTable::Table.new(
410
+ "リアクション表 無邪気", # 双子座の小径p.160
411
+ "1D6",
412
+ [
413
+ "やっちゃう~?",
414
+ "楽しそうだね!",
415
+ "ボクにまかせて!",
416
+ "ボク、難しいことはわかんな~い",
417
+ "ねえねえ、遊びに行こうよ~",
418
+ "そんなこと言われても……ボク、(従者の姿)だし",
419
+ ]
420
+ ),
421
+ "RAE" => DiceTable::Table.new(
422
+ "リアクション表 長老", # 双子座の小径p.160
423
+ "1D6",
424
+ [
425
+ "ほっほ、元気がいいのう",
426
+ "どれ、ワシがやってみよう",
427
+ "こりゃあたまげた",
428
+ "ム? ウ、ウム、そうじゃな……",
429
+ "年寄りだと思って甘く見るでないぞ",
430
+ "ワシも長いこと(従者の姿)をやっとるが、こんなことは初めてじゃ",
431
+ ]
432
+ ),
433
+ "JDSBT" => DiceTable::Table.new(
434
+ "〈魔術師の庭〉出張表", # 双子座の小径p.185
435
+ "1D6",
436
+ [
437
+ "定期点検で通っている組織が人手不足になり、協力を求められた。あなたは主人にお願いされ、手伝いをしにいくことになる。",
438
+ "主人はあなたの経験になればと、しばらく別の主人の元で仕事をするよう勧めた。",
439
+ "「星人形を派遣できないか」と〈魔術師の庭〉宛に相談があり、あなたは主人のお願いで出張をすることになった。",
440
+ "多忙な星人形の点検をする時間が割けないクライアントに代わって、しばらくあなたが星人形たちの点検をすることになった。",
441
+ "体に違和感のある星人形がいるらしい。手の空いていたあなたは、クライアントの家に滞在し様子を観察することになった。",
442
+ "〈魔術師の庭〉の仕事に退屈してしまったあなたは、別の職場を体験してみることにした。",
443
+ ]
444
+ ),
445
+ "SHBT" => DiceTable::Table.new(
446
+ "〈セブンス・ヘブン〉出張表", # 双子座の小径p.185
447
+ "1D6",
448
+ [
449
+ "以前のクライアントが人手不足になり、協力を求められた。あなたは主人にお願いされ、手伝いをしにいくことになる。",
450
+ "主人の知り合いからの要望を受け、あなたは特別に派遣メイドとして通うことになった。必要ならば、仕事を手伝う場面もあるかもしれない。",
451
+ "あなたはクライアントの星人形たちに家事を教えるため、しばらく出張先に滞在することになった。",
452
+ "クライアントから、星人形にサプライズパーティーをしたいと相談された。あなた仕事を手伝うフリをして、星人形の下調べをすることにした。",
453
+ "あなたのメイド姿が大好きなクライアントから、熱のこもった出張依頼がきた。あなたは嫌な予感を覚えながら、出張先へ向かう。",
454
+ "仕事のスキルアップがしたいと思ったあなたは、一人で出張し、別の主人の元で家事を担当することになった。",
455
+ ]
456
+ ),
457
+ "BCBT" => DiceTable::Table.new(
458
+ "〈祝福の鐘〉出張表", # 双子座の小径p.185
459
+ "1D6",
460
+ [
461
+ "いつも応援してくれている組織が人手不足になり、協力を求められた。あなたは主人にお願いされ、手伝いをしにいくことになる。",
462
+ "あなたは次の役柄や脚本について研究するため、別の職場に滞在して仕事を観察することになった。",
463
+ "あなたはテレビ番組や雑誌などの企画を通じて、別の職場で職業体験をすることになった。",
464
+ "本番が近付き、練習時間は一刻でも惜しい。あなたは稽古場からほど近い、知り合いの家にしばらく泊めてもらうことにした。",
465
+ "劇団の大ファンだという星人形(あるいは主人)の熱烈な要望があり、あなたはオフの間、出張先に滞在することになった。",
466
+ "次の公演まで長期休暇をもらったあなたは、気分転換に別の主人の元で生活をすることになった。",
467
+ ]
468
+ ),
469
+ "ODBT" => DiceTable::Table.new(
470
+ "〈オメガ探偵社〉出張表", # 双子座の小径p.186
471
+ "1D6",
472
+ [
473
+ "以前捜査協力してくれた組織が人手不足になり、協力を求められた。あなたは主人にお願いされ、手伝いをしにいくことになる。",
474
+ "あなたはクライアントの周囲に起きている小さな事件の解決を依頼され、滞在しながら調査をすることになった。",
475
+ "あなたはターゲットにマークされないよう、別の主人の所持する星人形を演じることになった。",
476
+ "あなたの勘は、出張先の主人や星人形が怪しいと告げている……!あなたは潜り込んで調査をすることにした。",
477
+ "あなたは捜査のため、事件現場からほど近い別の主人の家に滞在することにした。",
478
+ "依頼が来ない……!退屈そうにしているあなたを気遣い、主人はあなたを別の主人の元で手伝わせることにした。",
479
+ ]
480
+ ),
481
+ "ASBT" => DiceTable::Table.new(
482
+ "〈天の川商店街〉出張表", # 双子座の小径p.186
483
+ "1D6",
484
+ [
485
+ "お店の常連が人手不足になり、協力を求められた。あなたは主人にお願いされ、手伝いをしにいくことになる。",
486
+ "出張先の組織が商店街のイベントに協力することになった。相手をよく知りたいと思ったあなたは、滞在しながら打ち合わせを進めることになる。",
487
+ "新商品や新サービスのアイデアを求めて、あなたは他の組織へ出張することにした。",
488
+ "以前出張に来てくれたお礼に、今度はあなたが出張することになった。しっかり働いて恩を返そう。",
489
+ "店舗の改装に伴って、お店が長期休業に入った。あなたはその間、別の主人の元で仕事を手伝うことになる。",
490
+ "お店の常連と仲良くなったあなたは、主人の計らいで出張をすることになった。楽しい思い出をたくさん作ろう。",
491
+ ]
492
+ ),
493
+ "PABT" => DiceTable::Table.new(
494
+ "〈ポラリス星学院〉出張表", # 双子座の小径p.186
495
+ "1D6",
496
+ [
497
+ "クラスの非常勤講師が人手不足になり、協力を求められた。あなたは先生にお願いされ、手伝いをしにいくことになる。",
498
+ "社会科見学の一環としてあなたは別の主人の元へ出張することになった。",
499
+ "あなたは学級新聞の取材のため、別の主人の元へ出張し、情報を集めることになった。",
500
+ "学校のイベントが近いのに、準備が終わらない!あなたはクラスメートの家に泊まりがけで準備を進めることになる。",
501
+ "非常勤講師としてやってきた主人が気になって仕方ないあなたは、自分の主人にお願いして出張をすることになった。",
502
+ "あなたは国内留学で、別の学堂へ一時的に転入することになった。新しい出会いに期待をふくらませて、あなたは出張する。",
503
+ ]
504
+ ),
505
+ "SCBT" => DiceTable::Table.new(
506
+ "〈人形騎士団〉出張表", # 双子座の小径p.187
507
+ "1D6",
508
+ [
509
+ "知り合いの主人が人手不足になり、協力を求められた。あなたは正体を隠しつつ、手伝いをしにいくことになる。",
510
+ "あなたが目を覚ますと、そこは見知らぬ組織だった。怪我をした貴方を匿ってくれいたらしい。あなたは恩返しのため、手伝いをすることになる。",
511
+ "予知夢によって〈型堕ち〉の出現を知ったあなたは、夢の通り別の主人の元へ出張し、出現を待つことにした。",
512
+ "あなたのアジトは襲撃を受けた。敵にアジトを特定されてしまったようだ。足取りを追われないよう、あなたはしばらく出張することになる。",
513
+ "この頃戦い続きだったあなたは、他の主人の元へ出張し、気持ちをリフレッシュするよう指示された。",
514
+ "主人は「自分が守っているものを知ることも大事だ」と、あなたに出張を勧めた。",
515
+ ]
516
+ ),
517
+ "TOSCBT" => DiceTable::Table.new(
518
+ "〈人形騎士団〉への出張表", # 双子座の小径p.187
519
+ "1D6",
520
+ [
521
+ "あなたの職場が〈型堕ち〉に襲われた。主人は怪我により入院、あなたは襲撃時加勢に来た〈人形騎士団〉に匿われることになった。",
522
+ "あなたは〈型堕ち〉をよく知る人物として協力を求められた。一緒に仲間を救い出そう。",
523
+ "予知夢を通じて、あなたは〈人形騎士団〉に協力しなければならないと知った。",
524
+ "あなたは〈人形騎士団〉の戦いを偶然目の当たりにし、共に戦いたいと感じた。彼らのように強くなりたいと願ったのかもしれない。",
525
+ "〈人形騎士団〉が現れ、あなたが〈型堕ち〉に狙われていることを教えてくれた。しばらく一緒に行動した方がいいだろう。",
526
+ "かつてあなたは〈人形騎士団〉と共闘し、またいつでも協力すると約束した。その約束を果たすときが来たようだ。あなたは主人に願い出る。",
527
+ ]
528
+ ),
529
+ "TROF" => DiceTable::Table.new(
530
+ "森事件表", # 双子座の小径p.191
531
+ "2D6",
532
+ [
533
+ "〈変晶体〉に取り憑かれた食虫植物が仲間を飲み込んでしまった。早く助けなければ!",
534
+ "〈変晶体〉は滝壺の中に沈んでいるようだ。しかし直接手に入れようとすれば、流れに巻き込まれて出られなくなってしまうだろう。",
535
+ "鳥の巣の中に〈変晶体〉があるようだ。親鳥は雛を守ろうと警戒している。うまく心を通わせることはできないだろうか?",
536
+ "巨岩の中から〈変晶体〉の気配がある……。破壊しなければ取り出すことはできないだろう。",
537
+ "〈変晶体〉に憑依された小動物が、巣穴の中に入っていってしまった……。おびき寄せる方法はないだろうか?",
538
+ "〈変晶体〉に憑依された動物が、仲間の大切なものを盗んでいってしまった。追いかけて取り戻そう!",
539
+ "〈変晶体〉に憑依された獰猛な動物が寝息を立てている。起こさないように近づくことはできるだろうか。",
540
+ "〈変晶体〉を持つ人形兵たちが車座になって、何かを相談している。幸い、相手はこちらに気付いていない。今なら……!",
541
+ "仲間が落とし穴に落ちてしまった。穴の底には〈変晶体〉があるようだ。救出して浄化しよう。",
542
+ "水の中を泳ぎ回る魚が〈変晶体〉を飲み込んでいるようだ。どうやって捕まえたものか……。",
543
+ "崖にかかったボロボロな吊り橋の中央に〈変晶体〉を見つけた。罠だろうか。普通に取りに行けば橋が落ちてしまいそうだが……。",
544
+ ]
545
+ ),
546
+ "TROG" => DiceTable::Table.new(
547
+ "庭園事件表", # 双子座の小径p.193
548
+ "2D6",
549
+ [
550
+ "紳士の蒐集家が、鞄の中に〈変晶体〉を入れて持ち歩いているようだ。何とか相手を傷つけず手に入れたいが、どうしようか。",
551
+ "〈変晶体〉を宿した二重型が、あなたに追いかけっこを挑んできた。捕まえれば浄化できるだろうが、果たして追いつけるだろうか……?",
552
+ "庭木に〈変晶体〉が憑依し、天高く伸びていく。〈変晶体〉は木の先端にあるようだが、取りにいくことはできるだろうか。",
553
+ "腰を痛めてしまった老いた庭師が、「代わりに木を切ってくれたら〈変晶体〉の在り処を教えよう」と言う。手早く済ます方法は……。",
554
+ "バラの茨によって雁字搦めにされ、厳重に守られた〈変晶体〉を見つけた。安全に手にする方法はあるだろうか……。",
555
+ "「侵入者だ!」〈変晶体〉に取り憑かれた人形兵たちが、武器を持ってあなたに襲いかかる!",
556
+ "獰猛そうな番犬が唸り声を上げ、あなたたちに敵意の眼差しを向けている。〈変晶体〉に憑依されているようだ。",
557
+ "〈変晶体〉に取り憑かれた花がつるを伸ばし、一行の体を締め上げる。身動きは取れないが、脱出しなければ……!",
558
+ "〈変晶体〉を取り込んだ蜂の巣から、蜂が一斉に襲いかかる!通常の攻撃では効果がなさそうだ。何か方法はないだろうか?",
559
+ "上品な女性が、衣装のほつれを気にしている。修繕できれば〈変晶体〉の在り処を教えてくれるようだ。",
560
+ "焼却炉の中で〈変晶体〉が燃え盛り、辺りに〈悪夢の霧〉を撒き散らしている。この激しい炎を止めないと、浄化はできそうにない。",
561
+ ]
562
+ ),
563
+ "TROC" => DiceTable::Table.new(
564
+ "城内事件表", # 双子座の小径p.195
565
+ "2D6",
566
+ [
567
+ "「あなたには王(姫)を救うことができるのですか?」女性があなたに問いかける。あなたが力を示せば、〈変晶体〉の場所を教えるつもりのようだ。",
568
+ "重くて大きな壺の中に〈変晶体〉を見つけた。壺の口は狭くて手は入りそうにない。どうやって手に入れようか……?",
569
+ "敵兵の武器の装飾に〈変晶体〉が埋め込まれている。できるだけ穏便に回収したいが……。",
570
+ "天井に吊るされたシャンデリアに〈変晶体〉が引っかかり、不気味な影を落としている。どうすれば手が届くだろう?",
571
+ "〈型堕ち〉にそっくりな彫像を見つけた。王冠には〈変晶体〉が使われているようだ。見張り番にバレないように回収しよう。",
572
+ "通路に飾られていた甲冑が突然動き出し襲いかかってきた!〈変晶体〉に操られているようだ。",
573
+ "ネズミが〈変晶体〉をくわえて、壁に空いた小さな穴へ逃げていった。どうやったら捕まえられるだろう……?",
574
+ "壁の向こう側から〈変晶体〉の気配がある。どこかに隠し通路があるようだが、どうすれば見つかるだろうか。",
575
+ "「これよりも私に似合う装飾品を見つければ交換してやろう」貴族の男性が胸元に〈変晶体〉のブローチをつけている。",
576
+ "〈変晶体〉の入った大砲が今にも着火しそうだ。早く止めなければ城外の遥か遠くまで飛ばされてしまう……!",
577
+ "「助けてくれれば、〈変晶体〉の在り処を教える」手枷と足枷をかけられた星人形があなたに訴える。人形兵と違い、はっきり意識があるようだ。",
578
+ ]
579
+ ),
580
+ "TROT" => DiceTable::Table.new(
581
+ "都市事件表", # 双子座の小径p.197
582
+ "2D6",
583
+ [
584
+ "信号が突如めちゃくちゃになって混乱が起きている。信号に〈変晶体〉が憑依しているようだ。暴走する車をかき分けて信号へ辿り着こう。",
585
+ "迷子の少女が泣きながら「これあげるから、お母さんのところまで連れてって!」と妙な石を差し出す。……〈変晶体〉じゃないか!",
586
+ "「そこのあんた、悪い相が出ているよ」占い師の老婆に引き止められる。手元には水晶の代わりに〈変晶体〉が……!",
587
+ "〈変晶体〉を積んだ暴走トラックがあなたたちに突っ込んできた。なんとかして止めないと〈変晶体〉もろともバラバラだ!",
588
+ "人混みの中に〈変晶体〉の気配を感じた。この中の誰かが持っているはずだ。しかしどうやって見つけ出そう?",
589
+ "厳重な鍵がついたショーケースの中に〈変晶体〉を見つけた。何か開ける方法は……?",
590
+ "「引ったくりよー!!」女性の叫び声に顔を上げると〈変晶体〉に取り憑かれた男性が逃げ去っていく!",
591
+ "工事車両の荷台に瓦礫ごと〈変晶体〉が積まれている。運ばれる前に回収しなければ……。",
592
+ "都市公園の水辺が黒く濁っている。中に〈変晶体〉が沈んでいるようだ。うまく見つけ出す方法はないだろうか?",
593
+ "〈変晶体〉を手に入れた途端、カラスの大群が襲いかかってきた! ギラギラした〈変晶体〉を狙っているようだ。",
594
+ "路上で男同士が喧嘩をしているが、様子がおかしい。殴りかかろうとする男の手には〈変晶体〉が! 喧嘩を仲裁して〈変晶体〉を手に入れよう。",
595
+ ]
596
+ ),
597
+ "TROL" => DiceTable::Table.new(
598
+ "図書館事件表", # 双子座の小径p.199
599
+ "2D6",
600
+ [
601
+ "本棚に誰かの日記が混ざっているのを見つけた。中には「邪悪な黒い宝石を入手した」とある。持ち主を見つければ、〈変晶体〉が手に入るかもしれない。",
602
+ "「探しているものが見つかる本」を発見した。文字もページもかなり多い本だが、〈変晶体〉の場所が書かれたページを見つけられただろうか……?",
603
+ "館員が〈変晶体〉のありかを教えてくれたが、道案内の内容がかなり複雑だ……。どうにかしてたどり着く方法は……。",
604
+ "本が積み上がってできた巨大な山の中から、〈変晶体〉の気配がある。なんとかして山をどかすことはできないだろうか。",
605
+ "本に触れた途端〈悪夢の霧〉が吹き出し、視界を奪われる。真っ暗で何も見えないが、はやく〈変晶体〉の影響を受けた本を見つけよう。",
606
+ "〈変晶体〉を見つけた直後、巨大な本棚が倒れてきた。このままでは〈変晶体〉を手に入れる前に全員下敷きになってしまう……!",
607
+ "絵本を開くと、お話の登場人物が飛び出して襲いかかってきた。相手は〈変晶体〉に取り憑かれているようだ。",
608
+ "〈変晶体〉の宿った本を、二人の人形兵が見張っている。うまく彼らの注意を引けないだろうか……?",
609
+ "本棚の一番上の列に〈変晶体〉が挟まっているが、はしごなどは見当たらない。よじ登るしかないのだろうか……?",
610
+ "あなたは〈変晶体〉を手に入れたが、二重型に奪われてしまう。「知らないお話を聞かせてくれたら返してあげる」と二重型は言うが……。",
611
+ "「ご本を読んでくださらない?」少女は〈悪夢の霧〉で黒く澱んだ本を抱えて言う。願いを叶えなければ〈変晶体〉が潜んだ本は離してもらえなさそうだ。",
612
+ ]
613
+ ),
614
+ "TROS" => DiceTable::Table.new(
615
+ "駅事件表", # 双子座の小径p.201
616
+ "2D6",
617
+ [
618
+ "「旅行キャンペーンお申し込みの方には〈変晶体〉プレゼント!」と書かれた張り紙を見つける。誰かの手に渡る前に回収しよう!",
619
+ "落とし物を探している老人に出会う。見つけられたら〈変晶体〉と交換してくれるようだ。",
620
+ "改札の向こうに〈変晶体〉を見つけたが、「切符がないと通れませんよ」と止められる。でも切符売り場も見つからないし、どうやって通ろうか……。",
621
+ "複数の鳩が〈変晶体〉をつついて遊んでいる。鳩に〈変晶体〉の影響が出る前に回収しよう。",
622
+ "「なんだこれは?」駅員達が〈変晶体〉を囲んで首を傾げている。なんとか説得して〈変晶体〉を渡してもらおう。",
623
+ "線路上に〈変晶体〉が落ちているが、もうすぐ列車がやってくる!列車が通過したあと、元の場所にあるかはわからない……!",
624
+ "〈変晶体〉を持った人形兵たちはあなたたちを追っていたが、人混みで見失ったようだ。うまく利用客に紛れれば、戦わずに浄化できるかもしれない。",
625
+ "停車中の電車が〈悪夢の霧〉に包まれ、乗客はパニックになっている。あの中に〈変晶体〉があるはずだ。しかしまずは乗客を救出しよう。",
626
+ "〈変晶体〉を宿した二重型があなたを線路に突き落とそうとぶつかってきた。どうにかこの場を乗り切って二重型を捕まえよう!",
627
+ "時刻表「〈変晶体〉の列車」と表示される。〈変晶体〉に憑依された列車が通過するようだ。列車を止めることなんてできるのだろうか……!?",
628
+ "路上コンサートの観客達の様子がおかしい。よく見ると演奏者の楽器に〈変晶体〉が埋め込まれている!早く浄化してみんなの目を覚まそう。",
629
+ ]
630
+ ),
313
631
  }.freeze
314
632
 
315
633
  register_prefix('\d+D6', RTT.prefixes, TABLES.keys)
@@ -37,6 +37,8 @@ module BCDice
37
37
  command = command.upcase
38
38
 
39
39
  result = checkRoll(command)
40
+
41
+ return result if result.instance_of?(Result)
40
42
  return result unless result.empty?
41
43
 
42
44
  return result
@@ -45,7 +47,8 @@ module BCDice
45
47
  def checkRoll(command)
46
48
  debug("checkRoll begin command", command)
47
49
 
48
- result = ''
50
+ result = Result.new
51
+ result.text = ''
49
52
  return result unless command =~ /^(\d+)SR([+\-]?\d+)?(>=(\d+))?$/i
50
53
 
51
54
  diceCount = Regexp.last_match(1).to_i
@@ -57,21 +60,31 @@ module BCDice
57
60
 
58
61
  totalValue = (dice + modify)
59
62
  modifyText = getModifyText(modify)
60
- result += "(#{command}) > #{dice}[#{diceList.join(',')}]#{modifyText} > #{totalValue}"
63
+ result.text += "(#{command}) > #{dice}[#{diceList.join(',')}]#{modifyText} > #{totalValue}"
61
64
 
62
65
  criticalResult = getCriticalResult(diceList)
63
66
  unless criticalResult.nil?
64
- result += " > クリティカル(+#{criticalResult}D6)"
67
+ result.critical = true
68
+ result.success = true
69
+ result.text += " > クリティカル(+#{criticalResult}D6)"
65
70
  return result
66
71
  end
67
72
 
68
73
  if isFumble(diceList, diceCount)
69
- result += ' > ファンブル'
74
+ result.fumble = true
75
+ result.failure = true
76
+ result.text += ' > ファンブル'
70
77
  return result
71
78
  end
72
79
 
73
80
  unless difficulty.nil?
74
- result += totalValue >= difficulty ? ' > 成功' : ' > 失敗'
81
+ if totalValue >= difficulty
82
+ result.success = true
83
+ result.text += ' > 成功'
84
+ else
85
+ result.failure = true
86
+ result.text += ' > 失敗'
87
+ end
75
88
  end
76
89
 
77
90
  return result
@@ -27,15 +27,15 @@ module BCDice
27
27
 
28
28
  def result_2d6(total, dice_total, _dice_list, cmp_op, target)
29
29
  if dice_total >= 12
30
- Result.critical("自動的成功")
30
+ Result.critical(translate('SwordWorld.critical'))
31
31
  elsif dice_total <= 2
32
- Result.fumble("自動的失敗")
32
+ Result.fumble(translate('SwordWorld.fumble'))
33
33
  elsif cmp_op != :>= || target == "?"
34
34
  nil
35
35
  elsif total >= target
36
- Result.success("成功")
36
+ Result.success(translate('success'))
37
37
  else
38
- Result.failure("失敗")
38
+ Result.failure(translate('failure'))
39
39
  end
40
40
  end
41
41
 
@@ -65,11 +65,11 @@ module BCDice
65
65
  keyMax = rate_sw2_0.length - 1
66
66
  debug("keyMax", keyMax)
67
67
  if command.rate > keyMax
68
- return "キーナンバーは#{keyMax}までです"
68
+ return Result.new(translate('SwordWorld.keynumber_exceeds', keyMax: keyMax))
69
69
  end
70
70
 
71
71
  if command.infinite_roll?
72
- return Result.new("C値を#{command.min_critical}以上にしてください")
72
+ return Result.new(translate('SwordWorld.infinite_critical', min_critical: command.min_critical))
73
73
  end
74
74
 
75
75
  newRates = getNewRates(rate_sw2_0)
@@ -99,7 +99,7 @@ module BCDice
99
99
  return nil
100
100
  end
101
101
 
102
- node = TranscendentTest.new(cmd.critical, cmd.modify_number, cmd.cmp_op, cmd.target_number)
102
+ node = TranscendentTest.new(cmd.critical, cmd.modify_number, cmd.cmp_op, cmd.target_number, @locale)
103
103
  node.execute(@randomizer)
104
104
  when 'FT'
105
105
  get_fumble_table
@@ -116,20 +116,19 @@ module BCDice
116
116
 
117
117
  def rollDice(command, round)
118
118
  if command.semi_fixed_val > 0
119
+ # 常に片方の出目を固定
119
120
  dice = @randomizer.roll_once(6)
120
121
  return dice + command.semi_fixed_val, "#{dice},#{command.semi_fixed_val}"
121
- end
122
- if round == 0 && command.tmp_fixed_val > 0
122
+ elsif round == 0 && command.tmp_fixed_val > 0
123
+ # 回転前だけ片方の出目を固定
123
124
  dice = @randomizer.roll_once(6)
124
125
  return dice + command.tmp_fixed_val, "#{dice},#{command.tmp_fixed_val}"
125
- end
126
- unless command.greatest_fortune
127
- return super(command, round)
128
- end
129
-
130
- if command.greatest_fortune
126
+ elsif command.greatest_fortune
127
+ # グレイテスト・フォーチュン
131
128
  dice = @randomizer.roll_once(6)
132
129
  return dice * 2, "#{dice},#{dice}"
130
+ else
131
+ return super(command, round)
133
132
  end
134
133
  end
135
134
 
@@ -138,43 +137,21 @@ module BCDice
138
137
  end
139
138
 
140
139
  def growth_step
141
- d1 = @randomizer.roll_once(6)
142
- d2 = @randomizer.roll_once(6)
143
-
144
- a1 = get_ability_by_dice(d1)
145
- a2 = get_ability_by_dice(d2)
146
-
147
- return a1 != a2 ? "[#{d1},#{d2}]->(#{a1} or #{a2})" : "[#{d1},#{d2}]->(#{a1})"
148
- end
140
+ table = DiceTable::Table.from_i18n("SwordWorld2_0.GrowthTable", @locale)
141
+ r1 = table.roll(@randomizer)
142
+ r2 = table.roll(@randomizer)
149
143
 
150
- def get_ability_by_dice(dice)
151
- ['器用度', '敏捷度', '筋力', '生命力', '知力', '精神力'][dice - 1]
144
+ return r1.value != r2.value ? "[#{r1.value},#{r2.value}]->(#{r1.body} or #{r2.body})" : "[#{r1.value},#{r2.value}]->(#{r1.body})"
152
145
  end
153
146
 
154
147
  def get_fumble_table()
155
- table = [
156
- 'この表を2回振り、その両方を適用する。(同じ出目による影響は累積しない)。この自動失敗により得られる経験点は、+50点される',
157
- 'ダメージに、攻撃者を強化している「剣のかけら」の数が追加される',
158
- 'ダメージに、攻撃者の「レベル」が追加される',
159
- 'ダメージ決定を2回行い、より高い方を採用する',
160
- '合算ダメージを2倍する',
161
- '防護点無効'
162
- ]
163
- text, num = get_table_by_1d6(table)
164
- return "防御ファンブル表(#{num}) → #{text}"
148
+ table = DiceTable::Table.from_i18n("SwordWorld2_0.FumbleTable", @locale)
149
+ return table.roll(@randomizer)
165
150
  end
166
151
 
167
152
  def get_tangle_table()
168
- table = [
169
- '頭や顔:牙や噛みつきなどにおける命中力判定及び、魔法の行使やブレスに-2のペナルティ修正を受ける',
170
- '武器や盾:武器の使用不可、又は盾の回避力修正及び防護点を無効化する',
171
- '腕や手:武器や爪などにおける命中力判定に-2のペナルティ修正、盾を持つ腕方の腕ならその盾の回避力修正及び防護点を無効化する',
172
- '脚や足:移動不可、更に回避力判定に-2のペナルティ修正を受ける ※両足に絡んでも累積しない',
173
- '胴体:生命・精神抵抗力を基準値に用いる判定を除き、あらゆる行為判定に-1のペナルティ修正を受ける',
174
- '特殊:尻尾や翼などに命中。絡められた部位を使用する判定において-2のペナルティ修正、またはそこが使えていたことによるボーナス修正を失う ※存在しない場合は決め直し'
175
- ]
176
- text, num = get_table_by_1d6(table)
177
- return "絡み効果表(#{num}) → #{text}"
153
+ table = DiceTable::Table.from_i18n("SwordWorld2_0.TangleTable", @locale)
154
+ return table.roll(@randomizer)
178
155
  end
179
156
  end
180
157
  end
@@ -84,66 +84,6 @@ module BCDice
84
84
 
85
85
  register_prefix('H?K', 'Gr', '2D6?@\d+', 'FT', 'TT', 'Dru', 'ABT')
86
86
 
87
- ABYSS_CURSE_TABLE = DiceTable::D66GridTable.new(
88
- 'アビスカース表', [
89
- [
90
- "「自傷の」 装備時 この武具を装備中に装備者がクリティカルを発生させた時、装備者のHPが5点減少する。",
91
- "「嘆きの」 装備時 近くに敵がいたり、長い緊張状態が続くと涙が止まらなくなる。戦闘中なら「射程:術者(自身)」「射程:接触」以外の効果で対象を選べなくなる。",
92
- "「優しき」 装備時 敵に同情してしまう。敵対するキャラクターを対象にする場合、対象のHPが1点以上減少しているなら命中力判定、魔法行使判定に-2のペナルティ修正を受ける。",
93
- "「差別の」 装備時 特定の分類に対して与える物理ダメージ・魔法ダメージが2点減少する。分類は「分類決定表」で無作為に決定する。",
94
- "「脆弱な」 装備時 魔法ダメージを受けるたび、そのダメージが+1点される。",
95
- "「無謀な」 装備時 防護点が2点減少する(最低0)。",
96
- ], [
97
- "「重い」 装備時 強化した武具の必要筋力が+2される。威力、防護点などは変化なし。",
98
- "「難しい」 装備時 いかなる威力表使用時でも、③④欄の数値が威力に関係なく「0」になる(自動失敗ではない)。",
99
- "「軟弱な」 装備時 精神抵抗力判定に-1のペナルティ修正を受ける。",
100
- "「病弱な」 装備時 生命抵抗力判定に-1のペナルティ修正を受ける。",
101
- "「過敏な」 装備時 特定の属性から受ける物理ダメージ、魔法ダメージが2点上昇する。属性は「属性決定表」で無作為に決定する。",
102
- "「陽気な」 装備時 精神抵抗判定に失敗するたび、笑いが止まらなくなる。次の手番終了時まで行動判定(『Ⅰ』123頁)に-1のペナルティ修正を受ける。この効果は累積する。",
103
- ], [
104
- "「たどたどしい」 装備時 話をする時に言葉に詰まったり、言い間違えたりしやすくなる。魔法行使判定に-1のペナルティ修正を受ける。",
105
- "「代弁する」 装備時 自身の会話は、そのまま武具が魔法文明語の聞き取りづらい声で話す。装備中は魔法文明語以外の言語で会話は行えず、妖精魔法、魔動機術を行使できなくなる。",
106
- "「施しは受けない」 装備時 戦闘中、「抵抗:任意」の効果を受け入れた場合、次の手番終了時まで生命抵抗力、精神抵抗力に-2のペナルティ修正を受ける。",
107
- "「死に近い」 携行時 常に生死判定に「冒険者レベル」と同じ値のペナルティ修正を受ける。",
108
- "「おしゃれな」 携行時 その武具を常に華美に飾りたくなる。収入を得るたび、その1割以上をこの武具の装飾に費やさなければならない(効果などに変化はない)。",
109
- "「マナを吸う」 携行時 魔法や練技など、自身の意思でMPを消費する効果を使用する場合、すべてのMP消費が1点上昇する。",
110
- ], [
111
- "「鈍重な」 携行時 移動力が半分(端数切り上げ)になる。",
112
- "「定まらない」 携行時 戦闘中の手番開始時に1dし、出目が「1」なら《ターゲッティング》とそれを前提とした戦闘特技を習得していないものとして扱う。",
113
- "「錯乱の」 携行時 戦闘中の手番開始時に1dし、出目が「1」なら近接攻撃を含む「射程:接触」の対象に効果を使用する際、対象は同じ位置(エリア、座標)の全てのキャラクター(敵味方含む)から無作為に選ばれる。",
114
- "「足絡みの」 携行時 戦闘中の手番開始時に1dし、出目が「1」ならその場で即座に転倒する。手番中には起き上がれない。",
115
- "「滑り落ちる」 携行時 戦闘中の手番開始時に1dし、出目が「1」なら手に装備または保持しているものをすべてその場に落とす(その手番の主動作で拾う事は可能)。",
116
- "「悪臭放つ」 携行時 強い悪臭を放つ。所持しているだけで他のキャラクターに不快感を与え、隠密判定に-2のペナルティ修正を受ける。さらに冒険者ランク(『Ⅱ』137頁)が1段階低いものとして扱われる。",
117
- ], [
118
- "「醜悪な」 携行時 武具の見た目が悪く、魅力がない。売却する際、基本取引価格の4分の1の価格で売却する。さらに冒険者ランク(『Ⅱ』137頁)が1段階低いものとして扱われる。",
119
- "「唸る」 携行時 その武具から常に羽虫が飛び交うような音が響く。隠密判定、危険感知判定に-4のペナルティ修正を受ける。",
120
- "「ふやけた」 携行時 水を吸ったようにふやけた質感をしている。追加ダメージ-1(武器)、防護点-1(鎧、盾)。病気属性の効果に対する生命抵抗力、精神抵抗力判定に-4のペナルティ修正を受ける。",
121
- "「古傷の」 携行時 HPを回復する効果(休息による回復を含む)を受けた場合、その回復量が1点減少する。",
122
- "「まばゆい」 携行時 光などを弾いて強く輝く。自身は常に視界が悪い事による-1のペナルティ修正を受ける。",
123
- "「栄光なき」 携行時 行為判定で自動成功した際、自動成功とは扱わず、2dを振り直し、その後の出目に従う。この効果は1日に1回のみ発揮される。",
124
- ], [
125
- "「正直者の」 携行時 嘘、方便がすぐばれるようになる。真偽判定の対象となる場合、-4のペナルティ修正を受ける。",
126
- "「乗り物酔いの」 携行時 揺れに弱くなる。自身の足以外の手段で10分以上移動した後、1時間、行動判定に-1のペナルティ修正を受ける。",
127
- "「碧を厭う」 携行時 自然の中では落ち着かなくなる。自然環境(『Ⅰ』108頁)では行動判定に-1のペナルティ修正を受ける。",
128
- "「我慢できない」 携行時 セッション中に1日の始まりを迎えるたび、趣味や嗜好品などに「冒険者レベル×10」ガメルを出費しなければならない。趣味や嗜好品が消費できない環境であれば、翌日の朝まで最大HP、最大MPが「冒険者レベル」点減少する。",
129
- "「つきまとう」 携行時 この武具が気がつけば身の回りにある。この武具以外での命中力判定、魔法行使判定(武器)、回避力判定(鎧、盾)に-4のペナルティ修正を受ける。",
130
- "「のろまな」 携行時 戦闘開始処理の「戦闘準備」をいっさい行えなくなる。",
131
- ],
132
- ]
133
- )
134
-
135
- ABYSS_CURSE_CATEGORY_TABLE = DiceTable::D66ParityTable.new(
136
- "アビスカース分類決定表",
137
- ["蛮族", "動物", "植物", "アンデッド", "魔法生物", "「蛮族」「動物」「植物」「アンデッド」「魔法生物」から任意"],
138
- ["魔動機", "幻獣", "妖精", "魔神", "人族", "「魔動機」「幻獣」「妖精」「魔神」「人族」から任意"]
139
- )
140
-
141
- ABYSS_CURSE_ATTR_TABLE = DiceTable::D66ParityTable.new(
142
- "アビスカース属性決定表",
143
- ["土", "水・氷", "炎", "風", "雷", "純粋エネルギー"],
144
- ["断空", "衝撃", "毒", "病気", "呪い", "精神効果"]
145
- )
146
-
147
87
  def eval_game_system_specific_command(command)
148
88
  case command
149
89
  when /^dru\[(\d+),(\d+),(\d+)\]/i
@@ -192,13 +132,13 @@ module BCDice
192
132
  end
193
133
 
194
134
  def get_abyss_curse_table
195
- table_result = ABYSS_CURSE_TABLE.roll(@randomizer)
135
+ table_result = DiceTable::D66GridTable.from_i18n('SwordWorld2_5.AbyssCurseTable', @locale).roll(@randomizer)
196
136
  additional =
197
137
  case table_result.value
198
138
  when 14 # 「差別の」における分類決定表
199
- ABYSS_CURSE_CATEGORY_TABLE.roll(@randomizer).to_s
139
+ DiceTable::D66ParityTable.from_i18n('SwordWorld2_5.AbyssCurseCategoryTable', @locale).roll(@randomizer).to_s
200
140
  when 25 # 「過敏な」における属性決定表
201
- ABYSS_CURSE_ATTR_TABLE.roll(@randomizer).to_s
141
+ DiceTable::D66ParityTable.from_i18n('SwordWorld2_5.AbyssCurseAttrTable', @locale).roll(@randomizer).to_s
202
142
  end
203
143
  final_result = [
204
144
  table_result.to_s,