Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

寄稿:ゲームシステムの追加「サイバーパンクRED」 #540

Merged
merged 6 commits into from
May 4, 2022

Conversation

saronpasu
Copy link
Contributor

新規にダイスボットを寄稿します。
対象のルールは「サイバーパンクRED」です。
公式サイト

主な判定ダイスは「CP+x+y+z>=t」としています。
x 能力値
y 技能
z 修正値
t 難易度

難易度より大きい場合に成功
出目10で決定的成功、1回のみ追加ダイスを振り、その値だけ加算します。
出目1で決定的失敗、1回のみ追加ダイスを振り、その値だけ減算します。

頻繁に使うことを考えて、イニシアティブロールのコマンド「INIx」も備えました。
各種ランダム表については、ダイスボットだけでプレイ可能にならないように表の結果詳細については、ルールのページ参照する形にしたのと
キャラメイクに関わるランダム表はほとんど掲載していません。

また、一部の表には初版のためか誤植と思われる不整合がありました。
ルール準拠で実装するとエラーになるため、動作するように変更しています。

・ナイトシティにおける夜間の遭遇表
 ルールP.421-422
ルール記載では、出目:70-72が「ソロのチーム」結果となっていますが
出目:72-77は「ブースターギャング」結果となっており、ランダム表の72が2つの結果となるように重複しています。
このまま実装するとエラーになるため、出目:73-77、結果「ブースターギャング」となるように修正しています。

・ナイトマーケット表
 ルールP.338
1D100のランダム表ですが、出目:0-5と、出目:96-100の項目がありました。
注釈として「00は100とみなす」と但書があったので、こちらの表については
出目100の場合のみ、出目:0-5の結果と、出目:96-100の結果をどちらも選べるように表示しています。

誤植訂正が公開されたら、修正するつもりです。
よろしくおねがいします。

@codecov
Copy link

codecov bot commented Mar 31, 2022

Codecov Report

Merging #540 (b807fe7) into master (5940f6e) will increase coverage by 0.03%.
The diff coverage is 100.00%.

@@            Coverage Diff             @@
##           master     #540      +/-   ##
==========================================
+ Coverage   95.57%   95.60%   +0.03%     
==========================================
  Files         323      325       +2     
  Lines       18874    19028     +154     
==========================================
+ Hits        18039    18192     +153     
- Misses        835      836       +1     
Impacted Files Coverage Δ
lib/bcdice/game_system.rb 100.00% <100.00%> (ø)
lib/bcdice/game_system/CyberpunkRed.rb 100.00% <100.00%> (ø)
lib/bcdice/game_system/cyberpunk_red/tables.rb 100.00% <100.00%> (ø)
lib/bcdice/game_system/StrangerOfSwordCity.rb 96.72% <0.00%> (-1.32%) ⬇️
lib/bcdice/game_system/Elysion.rb 99.64% <0.00%> (+0.01%) ⬆️

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 5940f6e...b807fe7. Read the comment docs.

@GenKuzumochi
Copy link
Contributor

素早い寄稿お疲れ様です!該当ルールブックを所持していないので、誤りがあったらすいません。

BCDiceでは、CP+x>=tCPx>=tの形式でまとめてしまうのが一般的かと思います。

x 固定値(能力値、技能、修正値)
t 難易度

足し算はArithmeticEvaluator.evalを使うか、Command::Parserでいい感じにできるかと思います。

単純に数字を取るところは、シンプルにしたほうが見通しがよいかと思います。
(ルールの追加改正があればバッサリ書き換え)

ABI_RE = /(\d+)/.freeze
ABI_RE.match(cp_match[:ability])[1].to_i if cp_match[:ability]
↓
cp_match[:ability].to_i

@saronpasu
Copy link
Contributor Author

CPx>=t にまとめる形と、 Command::Parser を使うように修正しました。
それと、 Result の使い方が間違えていたようでしたので、そちらも合わせて修正しました。

Copy link
Contributor

@GenKuzumochi GenKuzumochi left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

見通しが良くなったかと思います!
また一部コメントつけました。好みが分かれる箇所もあるかと思うので、適宜無視してください。


result.text = ''
result.text += "(#{dice_cnt}D#{dice_face}"
result.text += "+#{modify_number}" unless modify_number.zero?
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

modify_numberがマイナスになることは無いでしょうか?
負の可能性があるなら、Format.modifierがいい感じに処理してくれます。

result.text += ' > 失敗!'
end

return result.text
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

result自体を返す必要があります。また、テストケースもクリティカル、ファンブルに合わせて修正が必要です。

HELP

# 判定の正規表現
CP_RE = /^CP(?<ability>\d+)?(?<modifier>[+-]\d+)?(?<target>>=\d+)?/.freeze
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

定数が外部から参照できてしまうので、多分private_constantにする必要があります。
好みですが、定数の近くにコメントを書いておくのが意外と単純です。

dice.first == 10 # critical

def eval_game_system_specific_command(command)
debug("eval_game_system_specific_command begin string", command)

case command
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

cp_roll_resultやini_roll_resultの戻り地を、処理できなかった際はnilとすることで、全体が単純になります。

cp_roll_result(command) || ini_roll_result(command) || roll_table(command, TABLES)

Copy link
Member

@ysakasin ysakasin Apr 13, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@saronpasu GenKuzumochiさんが指摘している方式にしてください。

Copy link
Member

@ysakasin ysakasin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ありがとうございます。いくつかコードの指摘をしましたので、修正お願いします。

また、表についてですが、明らかな誤植がある2件は今回は追加せずに削除してください。誤植が修正され次第追加して欲しいです。

private_constant :CP_RE, :INI_RE

def cp_roll_result(command)
parser = Command::Parser.new('CP', round_type: RoundType::FLOOR).enable_suffix_number.enable_question_target
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
parser = Command::Parser.new('CP', round_type: RoundType::FLOOR).enable_suffix_number.enable_question_target
parser = Command::Parser.new('CP', round_type: RoundType::FLOOR)
.enable_suffix_number
.restrict_cmp_op_to(nil, :>=)

enable_question_target を使うのは >=? のような記述を許容してしまうので、ふさわしくありません。
また、コマンドの使用を見る限り、比較演算子は >= のみ許容されるので、restrict_cmp_op_to で制限するのが良いです。

Comment on lines 103 to 104
dices = []
dices << @randomizer.roll_once(dice_face)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
dices = []
dices << @randomizer.roll_once(dice_face)
dices = [@randomizer.roll_once(dice_face)]

Comment on lines 129 to 136
result.text = ''
result.text += "(#{dice_cnt}D#{dice_face}"
result.text += Format.modifier(modify_number) unless modify_number.zero?
result.text += "#{parsed.cmp_op}#{parsed.target_number}" if parsed.target_number
result.text += ') > '
result.text += "#{dices.first}[#{dices.first}]"
result.text += "+#{modify_number}" unless modify_number.zero?
result.text += ' > '
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
result.text = ''
result.text += "(#{dice_cnt}D#{dice_face}"
result.text += Format.modifier(modify_number) unless modify_number.zero?
result.text += "#{parsed.cmp_op}#{parsed.target_number}" if parsed.target_number
result.text += ') > '
result.text += "#{dices.first}[#{dices.first}]"
result.text += "+#{modify_number}" unless modify_number.zero?
result.text += ' > '
result.text = "(#{dice_cnt}D#{dice_face}#{Format.modifier(modify_number)}#{parsed.cmp_op}#{parsed.target_number})"
result.text += ' > '
result.text += "#{dices.first}[#{dices.first}]#{Format.modifier(modify_number)}"
result.text += ' > '

Comment on lines 150 to 153
result.text += ' > 成功!'
end
if result.failure?
result.text += ' > 失敗!'
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

! はつけずに単に成功, 失敗が良いと思います。

def eval_game_system_specific_command(command)
debug("eval_game_system_specific_command begin string", command)

case command
Copy link
Member

@ysakasin ysakasin Apr 13, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@saronpasu GenKuzumochiさんが指摘している方式にしてください。

@saronpasu
Copy link
Contributor Author

@ysakasin 指摘いただいた箇所を修正しました。確認お願いします。

@GenKuzumochi
Copy link
Contributor

INIコマンドは1d10+反応で行動値を決める的なものでしょうか?
特殊な処理がなければ、別途コマンドにする必要はなさそうです。

@saronpasu
Copy link
Contributor Author

@GenKuzumochi おっしゃる通り、1d10+反応を返すだけのものです。

@ysakasin ysakasin merged commit a490e78 into bcdice:master May 4, 2022
@ysakasin
Copy link
Member

ysakasin commented May 4, 2022

@saronpasu ありがとうございます! マージしました。

@GenKuzumochi 🤝

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants