-
Notifications
You must be signed in to change notification settings - Fork 187
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
ステラナイツの表追加 #107
ステラナイツの表追加 #107
Conversation
基本 霧と桜のマルジナリア 紫弾のオルトリヴート
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
膨大な量の表追加、お疲れさまです。また、Tableクラスは他のダイスボットの表でも使えそうで便利だと思いました。DiceBotクラスを小さくできる可能性があるので、今後他のダイスボットにも導入していきたいですね。
Tableクラスの追加分について、コメントします。Tableクラスでは、コンストラクタで type
を見て呼び出し方の判断および @type
への記録を行い、roll
メソッドで @type
に応じて適切な処理を呼び出しています。これは、要するに roll
メソッドについてのダックタイピングを可能にしたいということではないでしょうか? その場合、単純に roll
メソッドを持つ別々のクラスを作る方が分かりやすいと考えました。例えば、以下のように3つのクラスを作るのはいかがでしょうか?
# 通常のダイスロールで項目を選ぶ1次元の表
# クラス名はRoll20のRollableTableに倣いました
class RollableTable
# 表を初期化する
# @param [String] name 表の名前
# @param [String] roll_type 項目を選ぶときのダイスロールの方法("2d6" など)
# @param [Array<String>] items 表の項目の配列
def initialize(name, roll_type, items)
# ...
end
# ダイスロールを行い、項目を選ぶ
# @param [BCDice] bcdice BCDice
# @return [String] 選ばれた項目
def roll(bcdice)
# ...
end
end
# D66ダイスロールで項目を選ぶ2次元の表
class D66GridTable
# 表を初期化する
# @param [String] name 表の名前
# @param [Array<Array<String>>] items 2次元の表項目
def initialize(name, items)
# ...
end
# ダイスロールを行い、項目を選ぶ
# @param [BCDice] bcdice BCDice
# @return [String] 選ばれた項目
def roll(bcdice)
# ...
end
end
# D66ダイスロールで項目を選ぶ1次元の表
# 疎な表になるため、Hashで項目を用意する
class D66FlatTable
# 表を初期化する
# @param [String] name 表の名前
# @param [Hash<Integer, String>] items 表の項目のHash
def initialize(name, items)
# ...
end
# ダイスロールを行い、項目を選ぶ
# @param [BCDice] bcdice BCDice
# @return [String] 選ばれた項目
def roll(bcdice)
# ...
end
end
上記のようにクラスを作ると、ステラナイツの場合、以下のように表を定義することになります。
TABLES = {
"GAT" => RollableTable.new(
"所属組織決定",
"1D6",
GAKUEN_TABLE
),
"HOT" => D66GridTable.new(
"希望表",
HOPE_TABLE
),
# ...
}
指摘いただいたテーブルの種類でクラスを分ける方式が良さそうなので、別PRでクラスを作ってからこのPRに適用してみます。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
問題ないと思います!
追加内容
基本
GAT:所属組織決定 (Gakuen Table)
HOT:希望表 (Hope Table)
DET:絶望表 (Despair Table)
WIT:願い事表 (Wish Table)
YST:あなたの物語表 (Your Story Table)
YSTA:あなたの物語表:異世界 (YST Another World)
PET:性格表 (Personality Table)
性格表を2回振り、性格を決定する
霧と桜のマルジナリア
YSTM:あなたの物語表:マルジナリア世界 (YST Marginalia)
STM:シチュエーション表:マルジナリア世界 (ST Marginalia)
YSTL:あなたの物語表:手紙世界 (YST Letter)
YSTR:あなたの物語表:リコレクト・ドール (YST Recollect-doll)
STBR:シチュエーション表B:場所(リコレクト・ドール) (ST B Recollect-doll)
STCR:シチュエーション表C:リコレクト (ST C Recollect)
STBS:シチュエーション表B:シトラセッティング (ST B Sut Tu Real)
STE:シチュエーション表:エクリプス専用 (ST Eclipse)
紫弾のオルトリヴート
FT:フラグメント表 (Fragment Table)
フラグメント表を5回振る
FTx:フラグメント表をx回振る
YSTB:あなたの物語表:ブリンガー (YST Bringer)
YSTF:あなたの物語表:フォージ (YST Forge)
STAL:シチュエーション表:オルトリヴート (ST Alt-Levoot)