From 36a4d06fec898e2dd87510b2e3d83de1d8f1bf55 Mon Sep 17 00:00:00 2001 From: MY4k Date: Sat, 28 Feb 2026 00:21:41 +0900 Subject: [PATCH] =?UTF-8?q?BlackJacket:i18n=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- i18n/BlackJacket/ja_jp.yml | 79 +++++++ i18n/BlackJacket/ko_kr.yml | 79 +++++++ lib/bcdice/game_system/BlackJacket.rb | 170 +++++---------- lib/bcdice/game_system/BlackJacket_Korean.rb | 213 +------------------ 4 files changed, 222 insertions(+), 319 deletions(-) create mode 100644 i18n/BlackJacket/ja_jp.yml create mode 100644 i18n/BlackJacket/ko_kr.yml diff --git a/i18n/BlackJacket/ja_jp.yml b/i18n/BlackJacket/ja_jp.yml new file mode 100644 index 000000000..9f47fccb0 --- /dev/null +++ b/i18n/BlackJacket/ja_jp.yml @@ -0,0 +1,79 @@ +ja_jp: + BlackJacket: + action_judge: "行為判定(成功率:%d%)" + fumble: "失敗 > ファンブル! パワーの代償2倍&振り直し不可" + critical: "成功 > クリティカル! パワーの代償1/2" + misery: "失敗 > ミザリー! パワーの代償2倍&振り直し不可" + death_chart_result: "デスチャート(%s)[マイナス値:%d + 1D10(->%d) = %d] > %s : %s" + death_chart_under: "10以下" + death_chart_over: "20以上" + chart_name: + physical: "肉体" + mental: "精神" + social: "環境" + death_charts: + physical: + - "何も無し。キミは奇跡的に一命を取り留めた。闘いは続く。" + - "激痛が走る。以後、イベント終了時まで、全ての判定の成功率-10%。" + - "もう、体が動かない……。キミは[硬直2]を受ける。" + - "渾身の一撃!! キミは〈生存〉判定を行なう。失敗した場合、[死亡]する。" + - "突然、目の前が真っ暗になった。キミは[気絶2]を受ける。" + - "以後、イベント終了時まで、全ての判定の成功率-20%。" + - "記録的一撃!! キミは〈生存〉-20%の判定を行なう。失敗した場合、[死亡]する。" + - "生きているのか死んでいるのか。キミは[瀕死2]を受ける。" + - "叙事詩的一撃!! キミは〈生存〉-30%の判定を行なう。失敗した場合、[死亡]する。" + - "以後、イベント終了時まで、全ての判定の成功率-30%。" + - "神話的一撃!! キミは宙を舞って三回転ほどした後、地面に叩きつけられる。見るも無惨な姿。肉体は原型を留めていない(キミは[死亡]した)。" + mental: + - "何も無し。キミは歯を食いしばってストレスに耐えた。" + - "以後、イベント終了時まで、全ての判定の成功率-10%。" + - "云い知れぬ恐怖がキミを襲う。キミは[恐怖2]を受ける。" + - "とても傷ついた。キミは〈意思〉判定を行なう。失敗した場合、[絶望]してNPCとなる。" + - "キミは意識を失った。キミは[気絶2]を受ける。" + - "以後、イベント終了時まで、全ての判定の成功率-20%。" + - "信じる者にだまされたような痛み。キミは〈意思〉-20%の判定を行なう。失敗した場合、[絶望]してNPCとなる。" + - "仲間に裏切られたのかも知れない。キミは[混乱2]を受ける。" + - "あまりに残酷な現実。キミは〈意思〉-30%の判定を行なう。失敗した場合、[絶望]してNPCとなる。" + - "以後、イベント終了時まで、全ての判定の成功率-30%。" + - "宇宙開闢の理に触れるも、それは人類の認識限界を超える何かであった。キミは[絶望]し、以後NPCとなる。" + social: + - "何も無し。キミは黒い噂を握りつぶした。" + - "以後、イベント終了時まで、全ての判定の成功率-10%。" + - "ピンチ! 以後、ラウンド終了時まで、キミはカルマを使用できない。" + - "悪い噂が流れる。キミは〈交渉〉判定を行なう。失敗した場合、キミは仲間からの信頼を失って[無縁]され、NPCとなる。" + - "以後、イベント終了時まで、代償にクレジットを消費するパワーを使用できない。" + - "キミの悪評が世間に知れ渡る。協力者からの支援が打ち切られる。以後、シナリオ終了時まで、全ての判定の成功率-20%。" + - "裏切り!! キミは〈経済〉-20%の判定を行なう。失敗した場合、キミは周囲からの信頼を失い、[無縁]され、NPCとなる。" + - "以後、シナリオ終了時まで、【環境】系の技能のレベルがすべて0となる。" + - "捏造報道? 身に覚えのない背信行為がスクープとして報道される。キミは〈心理〉-30%の判定を行なう。失敗した場合、キミは人としての尊厳を失い、[無縁]を受ける。" + - "以後、イベント終了時まで、全ての判定の成功率-30%。" + - "キミの名は史上最悪の汚点として歴史に刻まれる。もはらキミを信じる仲間はなく、キミを助ける社会もない。キミは[無縁]され、以後NPCとなる。" + table: + CPC: + name: "チャレンジ・ペナルティ・チャート" + type: "1D10" + items: + - "逝去\n助けるべきNPC(ヒロインなど)が死亡する。" + - "黒星\n敵が目的を成就し、事件はPCの敗北で終了する。そのまま余韻フェイズへ。" + - "活性\n敵のボスのライフを2倍にしたうえで決戦フェイズを開始する。" + - "攻勢\n敵ボスの与ダメージに+2D6の修正を与えたうえで決戦フェイズを開始する。" + - "大挙\n敵の数(ボス以外)を2倍にしたうえで決戦フェイズを開始する。" + - "暗黒\nすべてのエリアを[暗闇]にしたうえで決戦フェイズを開始する。" + - "猛火\n2つの戦場エリアを[ダメージゾーン2]にして、決戦フェイズを開始する。" + - "伏兵\n敵の半分をエリア1とエリア2に移動させた状態で決戦フェイズを開始する。" + - "満腹\nボス以外の敵のライフをすべて2倍にしたうえで決戦フェイズを開始する。" + - "封印\n決戦フェイズの間、PCはカルマを使用できない。決戦フェイズを開始する。" + STC: + name: "サイドトラック・チャート" + type: "1D10" + items: + - "邂逅\n偶然、NPCと出会う。どのNPCが現れるかはGMが決定すること。" + - "事故\n交通事故に出くわす。周囲ではパニックが起きているかも知れない。" + - "午睡\n強烈な睡魔に襲われる。まさか、新手のヴィランの能力か?" + - "告白\nNPCのひとりから、今まで秘めていた思いを吐露される。" + - "設定\n新たな設定が明かされる。実はNPCの父だったとか、生来目が見えん、とか。" + - "刺客\n何者かから攻撃を受ける。第3勢力か?" + - "会敵\n偶然、仇敵のひとりと出くわす。追うべきか? 無視すべきか?" + - "不審\n怪しい人物を見かける。追うべきか? 無視すべきか?" + - "遭遇\nシナリオと関係のないヴィラン組織と遭遇する。" + - "平和\n特に何も起きなかった。" \ No newline at end of file diff --git a/i18n/BlackJacket/ko_kr.yml b/i18n/BlackJacket/ko_kr.yml new file mode 100644 index 000000000..ce2ffe0a6 --- /dev/null +++ b/i18n/BlackJacket/ko_kr.yml @@ -0,0 +1,79 @@ +ko_kr: + BlackJacket: + action_judge: "행위판정(성공률:%d%)" + fumble: "실패 > 펌블! 파워의 대가(코스트) 2배 & 재굴림 불가" + critical: "성공 > 크리티컬! 파워의 대가(코스트) 절반으로 감소" + misery: "실패 > 미저리! 파워의 대가(코스트) 2배 & 재굴림 불가" + death_chart_result: "데스 차트(%s)[마이너스 값:%d + 1D10(->%d) = %d] > %s : %s" + death_chart_under: "10이하" + death_chart_over: "20이상" + chart_name: + physical: "육체" + mental: "정신" + social: "환경" + death_charts: + physical: + - "효과 없음. 당신은 기적적으로 목숨을 건졌다. 싸움은 계속된다." + - "격한 통증을 느낀다. 이후 이벤트가 끝날 때까지 모든 판정의 성공률에 -10%." + - "더이상 몸이 움직이지 않는다…… 당신은 [경직 2]를 받는다." + - "혼신의 일격!! 당신은 〈생존〉 판정을 한다. 실패할 경우 [사망]한다." + - "갑자기 눈앞이 캄캄해진다. 당신은 [기절 2]를 받는다." + - "이후, 이벤트 종료까지 모든 판정의 성공률 -20%." + - "기록적인 일격!! 당신은 〈생존〉 -20% 으로 판정한다. 실패할 경우 [사망]한다." + - "사느냐 죽느냐. 당신은 [빈사 2]를 받는다." + - "역사에 한 획을 그을 일격!! 당신은 <생존> -30% 으로 판정한다. 실패할 경우 [사망]한다." + - "이후, 이벤트 종료 시까지 모든 판정의 성공률 -30%." + - "신화적 일격!! 공중에서 세 바퀴 정도 회전한 후 땅바닥에 내동댕이쳐진다. 보기에도 끔찍한 모습. 육체는 원형을 유지하지 못했다. 당신은 [사망]한다." + mental: + - "효과 없음. 당신은 이를 악물고 스트레스를 견뎌냈다." + - "이후, 이벤트 종료 시까지 모든 판정의 성공률 -10%." + - "말할 수 없는 공포가 당신을 엄습한다. 당신은 [공포 2]를 받는다." + - "상처를 많이 받았다. 당신은 〈의지〉 판정을 한다. 실패할 경우 [절망] 상태가 되어서 NPC가 된다." + - "의식을 잃었다. 당신은 [기절 2]를 받는다." + - "이후, 이벤트 종료 시까지 모든 판정의 성공률 -20%." + - "신뢰했던 자에게 속은 아픔. 당신은 〈의지〉 -20% 으로 판정한다. 실패할 경우, [절망] 상태가 되어서 NPC가 된다." + - "동료에게 배신 당한 것일지도 모른다. 당신은 [혼란 2]를 받는다." + - "너무나 참혹한 현실. 당신은 〈의지〉 -30% 으로 판정한다. 실패할 경우 [절망] 상태가 되어서 NPC가 된다." + - "이후, 이벤트 종료 시까지 모든 판정의 성공률 -30%." + - "천지개벽의 이치 그 이상. 그것은 인류의 인식한계를 뛰어넘는 무언가였다. 당신은 [절망] 상태가 된 후 NPC가 된다." + social: + - "효과 없음. 당신은 뒤숭숭한 소문을 무시했다." + - "이후, 이벤트 종료 시까지 모든 판정의 성공률 -10%." + - "위험한 상태! 이후, 라운드 종료 시까지 당신은 카르마를 사용할 수 없다." + - "나쁜 소문이 돈다. 당신은 〈교섭〉 판정을 한다. 실패할 경우 당신은 동료들의 신뢰를 잃고 [무연고] 상태가 된 후 NPC가 된다." + - "이후, 시나리오 종료 시까지 대가(코스트)에 크레딧을 소비하는 파워를 사용할 수 없다." + - "당신의 악평이 세상에 널리 알려진다. 협력자로부터의 지원이 중단된다. 이후 시나리오 종료 시까지 모든 판정의 성공률 -20%." + - "배신!! 당신은 〈경제〉 -20% 으로 판정한다. 실패할 경우 당신은 주위로부터 신용을 잃고, [무연고] 상태가 되어 NPC가 된다." + - "이후, 시나리오 종료 시까지 【환경】 계열의 기능 레벨이 모두 0이 된다." + - "날조 보도? 기억나지 않는 배신 행위가 특종으로 보도된다. 당신은 〈심리〉 -30% 으로 판정한다. 실패할 경우 당신은 인간으로서의 존엄성을 잃고, [무연고]가 된다." + - "이후, 이벤트 종료 시까지 모든 판정 성공률 -30%." + - "당신의 이름은 사상 최악의 오점으로 영원히 역사에 새겨진다. 이제 당신을 믿는 동료는 없고 당신을 돕는 사회도 없다. 당신은 [무연고] 상태가 된 후 NPC가 된다." + table: + CPC: + name: "챌린지・패널티 차트" + type: "1D10" + items: + - "사망\n도와야 할 NPC (히로인 등)가 사망한다." + - "흑성\n적이 목적을 성취하고, 사건은 PC의 패배로 끝난다. 그대로 여운 페이즈로 넘어갈 것." + - "활성\n적 보스의 라이프를 2배로 한 다음 결전 페이즈를 개시한다." + - "공세\n적 보스의 대미지에 +2D6의 수정을 준 후 결전 페이즈를 개시한다." + - "대거\n적의 수(보스 제외)를 2배로 한 후 결전 페이즈를 개시한다." + - "암흑\n모든 에리어(구역)을 [어둠]으로 만든 다음 결전 페이즈를 개시한다." + - "맹화\n전투 에리어(구역) 2개를 [대미지 존 2]로 취급한 후, 결전 페이즈를 개시한다." + - "복병\n적의 절반을 에리어(구역) 1과 에리어(구역) 2로 이동시킨 후, 결전 페이즈를 개시한다." + - "만복\n보스 이외의 적의 라이프를 모두 2배로 한 다음, 결전 페이즈를 개시한다." + - "봉인\nPC는 결전 페이즈 동안 카르마를 사용할 수 없다. 결전 페이즈를 개시한다." + STC: + name: "사이드 트랙 차트" + type: "1D10" + items: + - "해후\n우연히 NPC와 만난다. 어떤 NPC가 나타날지는 GM이 결정한다." + - "사고\n교통사고를 당한다. 주변에서 패닉이 일어나고 있을지도 모른다." + - "낮잠\n지독한 졸음이 몰려온다. 설마, 신참 빌런의 능력인가?" + - "고백\nNPC 한 명이 지금까지 간직하고 있던 마음을 당신에게 고백한다." + - "설정\n새로운 설정이 밝혀진다. 사실은 NPC의 아버지였다든가, 선천적으로 눈이 보이지 않는다든가." + - "자객\n누군가로부터 공격을 받는다. 제3세력인가?" + - "불청객\n우연히 원수 한 명과 마주친다. 상황에 따라서 바로 전투가 발생할지도 모른다." + - "의심\n수상한 사람을 눈치챘다. 따라가야 하나? 무시해야 하나?" + - "조우\n시나리오와 관계없는 빌런 조직과 조우한다." + - "평화\n별일 없었다." \ No newline at end of file diff --git a/lib/bcdice/game_system/BlackJacket.rb b/lib/bcdice/game_system/BlackJacket.rb index e3d8ee5f4..0dab5bf0e 100644 --- a/lib/bcdice/game_system/BlackJacket.rb +++ b/lib/bcdice/game_system/BlackJacket.rb @@ -1,6 +1,9 @@ # frozen_string_literal: true +require 'bcdice/base' require 'bcdice/dice_table/range_table' +require 'bcdice/dice_table/table' +require "bcdice/format" module BCDice module GameSystem @@ -32,8 +35,15 @@ class BlackJacket < Base ・サイドトラック・チャート(STC) INFO_MESSAGE_TEXT + register_prefix( + 'BJ', + 'DC[LSC]', + 'CPC', + 'STC' + ) + def eval_game_system_specific_command(command) - resolute_action(command) || roll_death_chart(command) || roll_tables(command, TABLES) + resolute_action(command) || roll_death_chart(command) || roll_tables(command, self.class::TABLES) end private @@ -52,7 +62,7 @@ def resolute_action(command) result = action_result(roll_result, dice10, dice01, success_rate) sequence = [ - "行為判定(成功率:#{success_rate}%)", + translate("BlackJacket.action_judge", rate: success_rate), "1D100[#{dice10},#{dice01}]=#{roll_result_text}", roll_result_text.to_s, result.text @@ -62,29 +72,23 @@ def resolute_action(command) result end - SUCCESS_STR = "成功" - FAILURE_STR = "失敗" - CRITICAL_STR = (SUCCESS_STR + " > クリティカル! パワーの代償1/2").freeze - FUMBLE_STR = (FAILURE_STR + " > ファンブル! パワーの代償2倍&振り直し不可").freeze - MISERY_STR = (FAILURE_STR + " > ミザリー! パワーの代償2倍&振り直し不可").freeze - def action_result(total, tens, ones, success_rate) if total == 100 - Result.fumble(MISERY_STR) + Result.fumble(translate("BlackJacket.misery")) elsif success_rate <= 0 - Result.fumble(FUMBLE_STR) + Result.fumble(translate("BlackJacket.fumble")) elsif total <= success_rate - 100 - Result.critical(CRITICAL_STR) + Result.critical(translate("BlackJacket.critical")) elsif tens == ones if total <= success_rate - Result.critical(CRITICAL_STR) + Result.critical(translate("BlackJacket.critical")) else - Result.fumble(FUMBLE_STR) + Result.fumble(translate("BlackJacket.fumble")) end elsif total <= success_rate - Result.success(SUCCESS_STR) + Result.success(translate("success")) else - Result.failure(FAILURE_STR) + Result.failure(translate("failure")) end end @@ -112,24 +116,25 @@ def initialize(name, chart) # @param randomizer [Randomizer] # @param minus_score [Integer] + # @param locale [Symbol] # @return [String] - def roll(randomizer, minus_score) + def roll(randomizer, minus_score, locale) dice = randomizer.roll_once(10) key_number = dice + minus_score - key_text, chosen = at(key_number) + key_text, chosen = at(key_number, locale) - return "デスチャート(#{@name})[マイナス値:#{minus_score} + 1D10(->#{dice}) = #{key_number}] > #{key_text} : #{chosen}" + return I18n.translate("BlackJacket.death_chart_result", locale: locale, name: @name, minus: minus_score, dice: dice, key: key_number, key_text: key_text, chosen: chosen) end private # key_numberの10から20がindexの0から10に対応する - def at(key_number) + def at(key_number, locale) if key_number < 10 - ["10以下", @chart.first] + [I18n.translate("BlackJacket.death_chart_under", locale: locale), @chart.first] elsif key_number > 20 - ["20以上", @chart.last] + [I18n.translate("BlackJacket.death_chart_over", locale: locale), @chart.last] else [key_number.to_s, @chart[key_number - 10]] end @@ -142,103 +147,42 @@ def roll_death_chart(command) return m end - chart = DEATH_CHARTS[m[1]] + chart = self.class::DEATH_CHARTS[m[1]] minus_score = m[2].to_i - return chart.roll(@randomizer, minus_score) + return chart.roll(@randomizer, minus_score, @locale) end - DEATH_CHARTS = { - 'L' => DeathChart.new( - '肉体', - [ - "何も無し。キミは奇跡的に一命を取り留めた。闘いは続く。", - "激痛が走る。以後、イベント終了時まで、全ての判定の成功率-10%。", - "もう、体が動かない……。キミは[硬直2]を受ける。", - "渾身の一撃!! キミは〈生存〉判定を行なう。失敗した場合、[死亡]する。", - "突然、目の前が真っ暗になった。キミは[気絶2]を受ける。", - "以後、イベント終了時まで、全ての判定の成功率-20%。", - "記録的一撃!! キミは〈生存〉-20%の判定を行なう。失敗した場合、[死亡]する。", - "生きているのか死んでいるのか。キミは[瀕死2]を受ける。", - "叙事詩的一撃!! キミは〈生存〉-30%の判定を行なう。失敗した場合、[死亡]する。", - "以後、イベント終了時まで、全ての判定の成功率-30%。", - "神話的一撃!! キミは宙を舞って三回転ほどした後、地面に叩きつけられる。見るも無惨な姿。肉体は原型を留めていない(キミは[死亡]した)。", - ] - ), - 'S' => DeathChart.new( - '精神', - [ - "何も無し。キミは歯を食いしばってストレスに耐えた。", - "以後、イベント終了時まで、全ての判定の成功率-10%。", - "云い知れぬ恐怖がキミを襲う。キミは[恐怖2]を受ける。", - "とても傷ついた。キミは〈意思〉判定を行なう。失敗した場合、[絶望]してNPCとなる。", - "キミは意識を失った。キミは[気絶2]を受ける。", - "以後、イベント終了時まで、全ての判定の成功率-20%。", - "信じる者にだまされたような痛み。キミは〈意思〉-20%の判定を行なう。失敗した場合、[絶望]してNPCとなる。", - "仲間に裏切られたのかも知れない。キミは[混乱2]を受ける。", - "あまりに残酷な現実。キミは〈意思〉-30%の判定を行なう。失敗した場合、[絶望]してNPCとなる。", - "以後、イベント終了時まで、全ての判定の成功率-30%。", - "宇宙開闢の理に触れるも、それは人類の認識限界を超える何かであった。キミは[絶望]し、以後NPCとなる。", - ] - ), - 'C' => DeathChart.new( - '環境', - [ - "何も無し。キミは黒い噂を握りつぶした。", - "以後、イベント終了時まで、全ての判定の成功率-10%。", - "ピンチ! 以後、ラウンド終了時まで、キミはカルマを使用できない。", - "悪い噂が流れる。キミは〈交渉〉判定を行なう。失敗した場合、キミは仲間からの信頼を失って[無縁]され、NPCとなる。", - "以後、イベント終了時まで、代償にクレジットを消費するパワーを使用できない。", - "キミの悪評が世間に知れ渡る。協力者からの支援が打ち切られる。以後、シナリオ終了時まで、全ての判定の成功率-20%。", - "裏切り!! キミは〈経済〉-20%の判定を行なう。失敗した場合、キミは周囲からの信頼を失い、[無縁]され、NPCとなる。", - "以後、シナリオ終了時まで、【環境】系の技能のレベルがすべて0となる。", - "捏造報道? 身に覚えのない背信行為がスクープとして報道される。キミは〈心理〉-30%の判定を行なう。失敗した場合、キミは人としての尊厳を失い、[無縁]を受ける。", - "以後、イベント終了時まで、全ての判定の成功率-30%。", - "キミの名は史上最悪の汚点として歴史に刻まれる。もはらキミを信じる仲間はなく、キミを助ける社会もない。キミは[無縁]され、以後NPCとなる。", - ] - ) - }.freeze - - TABLES = { - "CPC" => DiceTable::Table.new( - "チャレンジ・ペナルティ・チャート", - "1D10", - [ - "逝去\n助けるべきNPC(ヒロインなど)が死亡する。", - "黒星\n敵が目的を成就し、事件はPCの敗北で終了する。そのまま余韻フェイズへ。", - "活性\n敵のボスのライフを2倍にしたうえで決戦フェイズを開始する。", - "攻勢\n敵ボスの与ダメージに+2D6の修正を与えたうえで決戦フェイズを開始する。", - "大挙\n敵の数(ボス以外)を2倍にしたうえで決戦フェイズを開始する。", - "暗黒\nすべてのエリアを[暗闇]にしたうえで決戦フェイズを開始する。", - "猛火\n2つの戦場エリアを[ダメージゾーン2]にして、決戦フェイズを開始する。", - "伏兵\n敵の半分をエリア1とエリア2に移動させた状態で決戦フェイズを開始する。", - "満腹\nボス以外の敵のライフをすべて2倍にしたうえで決戦フェイズを開始する。", - "封印\n決戦フェイズの間、PCはカルマを使用できない。決戦フェイズを開始する。" - ] - ), - "STC" => DiceTable::Table.new( - "サイドトラック・チャート", - "1D10", - [ - "邂逅\n偶然、NPCと出会う。どのNPCが現れるかはGMが決定すること。", - "事故\n交通事故に出くわす。周囲ではパニックが起きているかも知れない。", - "午睡\n強烈な睡魔に襲われる。まさか、新手のヴィランの能力か?", - "告白\nNPCのひとりから、今まで秘めていた思いを吐露される。", - "設定\n新たな設定が明かされる。実はNPCの父だったとか、生来目が見えん、とか。", - "刺客\n何者かから攻撃を受ける。第3勢力か?", - "会敵\n偶然、仇敵のひとりと出くわす。追うべきか? 無視すべきか?", - "不審\n怪しい人物を見かける。追うべきか? 無視すべきか?", - "遭遇\nシナリオと関係のないヴィラン組織と遭遇する。", - "平和\n特に何も起きなかった。", - ] - ), - }.freeze + class << self + private - register_prefix( - 'BJ', - 'DC[LSC]', - TABLES.keys - ) + def translate_tables(locale) + { + "CPC" => DiceTable::Table.from_i18n("BlackJacket.table.CPC", locale), + "STC" => DiceTable::Table.from_i18n("BlackJacket.table.STC", locale), + } + end + + def translate_death_charts(locale) + { + 'L' => DeathChart.new( + I18n.translate("BlackJacket.chart_name.physical", locale: locale), + I18n.translate("BlackJacket.death_charts.physical", locale: locale) + ), + 'S' => DeathChart.new( + I18n.translate("BlackJacket.chart_name.mental", locale: locale), + I18n.translate("BlackJacket.death_charts.mental", locale: locale) + ), + 'C' => DeathChart.new( + I18n.translate("BlackJacket.chart_name.social", locale: locale), + I18n.translate("BlackJacket.death_charts.social", locale: locale) + ), + } + end + end + + TABLES = translate_tables(:ja_jp).freeze + DEATH_CHARTS = translate_death_charts(:ja_jp).freeze end end end diff --git a/lib/bcdice/game_system/BlackJacket_Korean.rb b/lib/bcdice/game_system/BlackJacket_Korean.rb index 5fd82fa8c..0d6c1f306 100644 --- a/lib/bcdice/game_system/BlackJacket_Korean.rb +++ b/lib/bcdice/game_system/BlackJacket_Korean.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true require 'bcdice/game_system/BlackJacket' -require 'bcdice/dice_table/range_table' module BCDice module GameSystem @@ -22,7 +21,7 @@ class BlackJacket_Korean < BlackJacket  예)BJ80  크리티컬,펌블 여부는 자동으로 판정합니다.  「BJ50+20-30」처럼 값을 가감하여 기재할 수 있습니다. -  성공률의 상한은 100%、하한은 0% 입니다. +  성공률의 상한은 100%, 하한은 0% 입니다. ・데스 차트 (DCxY)  x:차트 종류. 육체:DCL, 정신:DCS, 환경:DCC  Y=마이너스 값 @@ -33,213 +32,15 @@ class BlackJacket_Korean < BlackJacket ・사이드 트랙 차트(STC) INFO_MESSAGE_TEXT - def eval_game_system_specific_command(command) - resolute_action(command) || roll_death_chart(command) || roll_tables(command, TABLES) - end - - private - - def resolute_action(command) - m = /^BJ(\d+([+-]\d+)*)$/.match(command) - unless m - return nil - end - - success_rate = ArithmeticEvaluator.eval(m[1]) - - roll_result, dice10, dice01 = roll_d100 - roll_result_text = format('%02d', roll_result) - - result = action_result(roll_result, dice10, dice01, success_rate) - - sequence = [ - "행위판정(성공률:#{success_rate}%)", - "1D100[#{dice10},#{dice01}]=#{roll_result_text}", - roll_result_text.to_s, - result.text - ] - - result.text = sequence.join(" > ") - result - end - - SUCCESS_STR = "성공" - FAILURE_STR = "실패" - CRITICAL_STR = (SUCCESS_STR + " > 크리티컬! 파워의 대가(코스트) 절반으로 감소").freeze - FUMBLE_STR = (FAILURE_STR + " > 펌블! 파워의 대가(코스트) 2배 & 재굴림 불가").freeze - MISERY_STR = (FAILURE_STR + " > 미저리! 파워의 대가(코스트) 2배 & 재굴림 불가").freeze - - def action_result(total, tens, ones, success_rate) - if total == 100 - Result.fumble(MISERY_STR) - elsif success_rate <= 0 - Result.fumble(FUMBLE_STR) - elsif total <= success_rate - 100 - Result.critical(CRITICAL_STR) - elsif tens == ones - if total <= success_rate - Result.critical(CRITICAL_STR) - else - Result.fumble(FUMBLE_STR) - end - elsif total <= success_rate - Result.success(SUCCESS_STR) - else - Result.failure(FAILURE_STR) - end - end - - def roll_d100 - dice10 = @randomizer.roll_once(10) - dice10 = 0 if dice10 == 10 - dice01 = @randomizer.roll_once(10) - dice01 = 0 if dice01 == 10 - - roll_result = dice10 * 10 + dice01 - roll_result = 100 if roll_result == 0 + register_prefix_from_super_class() - return roll_result, dice10, dice01 + def initialize(command) + super(command) + @locale = :ko_kr end - class DeathChart - def initialize(name, chart) - @name = name - @chart = chart.freeze - - if @chart.size != 11 - raise ArgumentError, "unexpected chart size #{name.inspect} (given #{@chart.size}, expected 11)" - end - end - - # @param randomizer [Randomizer] - # @param minus_score [Integer] - # @return [String] - def roll(randomizer, minus_score) - dice = randomizer.roll_once(10) - key_number = dice + minus_score - - key_text, chosen = at(key_number) - - return "데스 차트(#{@name})[마이너스 값:#{minus_score} + 1D10(->#{dice}) = #{key_number}] > #{key_text} : #{chosen}" - end - - private - - # key_numberの10から20がindexの0から10に対応する - def at(key_number) - if key_number < 10 - ["10이하", @chart.first] - elsif key_number > 20 - ["20이상", @chart.last] - else - [key_number.to_s, @chart[key_number - 10]] - end - end - end - - def roll_death_chart(command) - m = /^DC([LSC])(\d+)$/i.match(command) - unless m - return m - end - - chart = DEATH_CHARTS[m[1]] - minus_score = m[2].to_i - - return chart.roll(@randomizer, minus_score) - end - - DEATH_CHARTS = { - 'L' => DeathChart.new( - '육체', - [ - "효과 없음. 당신은 기적적으로 목숨을 건졌다. 싸움은 계속된다.", - "격한 통증을 느낀다. 이후 이벤트가 끝날 때까지 모든 판정의 성공률에 -10%.", - "더이상 몸이 움직이지 않는다…… 당신은 [경직 2]를 받는다.", - "혼신의 일격!! 당신은 〈생존〉 판정을 한다. 실패할 경우 [사망]한다.", - "갑자기 눈앞이 캄캄해진다. 당신은 [기절 2]를 받는다.", - "이후, 이벤트 종료까지 모든 판정의 성공률 -20%.", - "기록적인 일격!! 당신은 〈생존〉 -20% 으로 판정한다. 실패할 경우 [사망]한다.", - "사느냐 죽느냐. 당신은 [빈사 2]를 받는다.", - "역사에 한 획을 그을 일격!! 당신은 <생존> -30% 으로 판정한다. 실패할 경우 [사망]한다.", - "이후, 이벤트 종료 시까지 모든 판정의 성공률 -30%.", - "신화적 일격!! 공중에서 세 바퀴 정도 회전한 후 땅바닥에 내동댕이쳐진다. 보기에도 끔찍한 모습. 육체는 원형을 유지하지 못했다. 당신은 [사망]한다.", - ] - ), - 'S' => DeathChart.new( - '정신', - [ - "효과 없음. 당신은 이를 악물고 스트레스를 견뎌냈다.", - "이후, 이벤트 종료 시까지 모든 판정의 성공률 -10%.", - "말할 수 없는 공포가 당신을 엄습한다. 당신은 [공포 2]를 받는다.", - "상처를 많이 받았다. 당신은 〈의지〉 판정을 한다. 실패할 경우 [절망] 상태가 되어서 NPC가 된다.", - "의식을 잃었다. 당신은 [기절 2]를 받는다.", - "이후, 이벤트 종료 시까지 모든 판정의 성공률 -20%.", - "신뢰했던 자에게 속은 아픔. 당신은 〈의지〉 -20% 으로 판정한다. 실패할 경우, [절망] 상태가 되어서 NPC가 된다.", - "동료에게 배신 당한 것일지도 모른다. 당신은 [혼란 2]를 받는다.", - "너무나 참혹한 현실. 당신은 〈의지〉 -30% 으로 판정한다. 실패할 경우 [절망] 상태가 되어서 NPC가 된다.", - "이후, 이벤트 종료 시까지 모든 판정의 성공률 -30%.", - "천지개벽의 이치 그 이상. 그것은 인류의 인식한계를 뛰어넘는 무언가였다. 당신은 [절망] 상태가 된 후 NPC가 된다.", - ] - ), - 'C' => DeathChart.new( - '환경', - [ - "효과 없음. 당신은 뒤숭숭한 소문을 무시했다.", - "이후, 이벤트 종료 시까지 모든 판정의 성공률 -10%.", - "위험한 상태! 이후, 라운드 종료 시까지 당신은 카르마를 사용할 수 없다.", - "나쁜 소문이 돈다. 당신은 〈교섭〉 판정을 한다. 실패할 경우 당신은 동료들의 신뢰를 잃고 [무연고] 상태가 된 후 NPC가 된다.", - "이후, 시나리오 종료 시까지 대가(코스트)에 크레딧을 소비하는 파워를 사용할 수 없다.", - "당신의 악평이 세상에 널리 알려진다. 협력자로부터의 지원이 중단된다. 이후 시나리오 종료 시까지 모든 판정의 성공률 -20%.", - "배신!! 당신은 〈경제〉 -20% 으로 판정한다. 실패할 경우 당신은 주위로부터 신용을 잃고, [무연고] 상태가 되어 NPC가 된다.", - "이후, 시나리오 종료 시까지 【환경】 계열의 기능 레벨이 모두 0이 된다.", - "날조 보도? 기억나지 않는 배신 행위가 특종으로 보도된다. 당신은 〈심리〉 -30% 으로 판정한다. 실패할 경우 당신은 인간으로서의 존엄성을 잃고, [무연고]가 된다.", - "이후, 이벤트 종료 시까지 모든 판정 성공률 -30%.", - "당신의 이름은 사상 최악의 오점으로 영원히 역사에 새겨진다. 이제 당신을 믿는 동료는 없고 당신을 돕는 사회도 없다. 당신은 [무연고] 상태가 된 후 NPC가 된다.", - ] - ) - }.freeze - - TABLES = { - "CPC" => DiceTable::Table.new( - "챌린지・패널티 차트", - "1D10", - [ - "사망\n도와야 할 NPC (히로인 등)가 사망한다.", - "검은 별\n적이 목적을 성취하고, 사건은 PC의 패배로 끝난다. 그대로 여운 페이즈로 넘어갈 것.", - "활성\n적 보스의 라이프를 2배로 한 다음 결전 페이즈를 개시한다.", - "공세\n적 보스의 대미지에 +2D6의 수정을 준 후 결전 페이즈를 개시한다.", - "대거\n적의 수(보스 제외)를 2배로 한 후 결전 페이즈를 개시한다.", - "암흑\n모든 에리어(구역)을 [어둠]으로 만든 다음 결전 페이즈를 개시한다.", - "맹화\n전투 에리어(구역) 2개를 [대미지 존 2]로 취급한 후, 결전 페이즈를 개시한다.", - "복병\n적의 절반을 에리어(구역) 1과 에리어(구역) 2로 이동시킨 후, 결전 페이즈를 개시한다.", - "만복\n보스 이외의 적의 라이프를 모두 2배로 한 다음, 결전 페이즈를 개시한다.", - "봉인\nPC는 결전 페이즈 동안 카르마를 사용할 수 없다. 결전 페이즈를 개시한다." - ] - ), - "STC" => DiceTable::Table.new( - "사이드 트랙 차트", - "1D10", - [ - "해후\n우연히 NPC와 만난다. 어떤 NPC가 나타날지는 GM이 결정한다.", - "사고\교통사고를 당한다. 주변에서 패닉이 일어나고 있을지도 모른다.", - "낮잠\n지독한 졸음이 몰려온다. 설마, 신참 빌런의 능력인가?", - "고백\nNPC 한 명이 지금까지 간직하고 있던 마음을 당신에게 고백한다.", - "설정\n새로운 설정이 밝혀진다. 사실은 NPC의 아버지였다든가, 선천적으로 눈이 보이지 않는다든가.", - "자객\n누군가로부터 공격을 받는다. 제3세력인가?", - "불청객\n우연히 원수 한 명과 마주친다. 상황에 따라서 바로 전투가 발생할지도 모른다.", - "의심\n수상한 사람을 눈치챘다. 따라가야 하나? 무시해야 하나?", - "조우\n시나리오와 관계없는 빌런 조직과 조우한다.", - "평화\n별일 없었다.", - ] - ), - }.freeze - - register_prefix( - 'BJ', - 'DC[LSC]', - TABLES.keys - ) + TABLES = translate_tables(:ko_kr).freeze + DEATH_CHARTS = translate_death_charts(:ko_kr).freeze end end end