bcdice 3.0.0.pre.alpha.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (258) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +21 -0
  3. data/.github/.codecov.yaml +10 -0
  4. data/.github/workflows/coverage.yaml +21 -0
  5. data/.github/workflows/lint.yaml +13 -0
  6. data/.github/workflows/test.yml +20 -0
  7. data/.gitignore +14 -0
  8. data/.rubocop.yml +96 -0
  9. data/.rubocop_todo.yml +113 -0
  10. data/CHANGELOG.md +868 -0
  11. data/Gemfile +11 -0
  12. data/LICENSE +29 -0
  13. data/README.md +38 -0
  14. data/ROADMAP.md +30 -0
  15. data/Rakefile +118 -0
  16. data/bcdice.gemspec +27 -0
  17. data/bin/repl.rb +21 -0
  18. data/docs/README.txt +2028 -0
  19. data/docs/dicebot_sort_key.md +72 -0
  20. data/docs/how_to_make_dicebot.md +453 -0
  21. data/lib/bcdice.rb +8 -0
  22. data/lib/bcdice/arithmetic_evaluator.rb +167 -0
  23. data/lib/bcdice/base.rb +423 -0
  24. data/lib/bcdice/command_parser.rb +242 -0
  25. data/lib/bcdice/common_command.rb +23 -0
  26. data/lib/bcdice/common_command/add_dice.rb +54 -0
  27. data/lib/bcdice/common_command/add_dice/node.rb +488 -0
  28. data/lib/bcdice/common_command/add_dice/parser.rb +282 -0
  29. data/lib/bcdice/common_command/add_dice/randomizer.rb +48 -0
  30. data/lib/bcdice/common_command/barabara_dice.rb +57 -0
  31. data/lib/bcdice/common_command/calc.rb +39 -0
  32. data/lib/bcdice/common_command/choice.rb +35 -0
  33. data/lib/bcdice/common_command/d66_dice.rb +63 -0
  34. data/lib/bcdice/common_command/reroll_dice.rb +190 -0
  35. data/lib/bcdice/common_command/upper_dice.rb +165 -0
  36. data/lib/bcdice/common_command/version.rb +26 -0
  37. data/lib/bcdice/dice_table.rb +8 -0
  38. data/lib/bcdice/dice_table/chain_table.rb +33 -0
  39. data/lib/bcdice/dice_table/d66_grid_table.rb +26 -0
  40. data/lib/bcdice/dice_table/d66_range_table.rb +26 -0
  41. data/lib/bcdice/dice_table/d66_table.rb +34 -0
  42. data/lib/bcdice/dice_table/range_table.rb +267 -0
  43. data/lib/bcdice/dice_table/roll_result.rb +43 -0
  44. data/lib/bcdice/dice_table/sai_fic_skill_table.rb +32 -0
  45. data/lib/bcdice/dice_table/table.rb +35 -0
  46. data/lib/bcdice/enum.rb +15 -0
  47. data/lib/bcdice/format.rb +36 -0
  48. data/lib/bcdice/game_system.rb +187 -0
  49. data/lib/bcdice/game_system/AFF2e.rb +141 -0
  50. data/lib/bcdice/game_system/AceKillerGene.rb +55 -0
  51. data/lib/bcdice/game_system/Airgetlamh.rb +117 -0
  52. data/lib/bcdice/game_system/Alsetto.rb +124 -0
  53. data/lib/bcdice/game_system/Alshard.rb +27 -0
  54. data/lib/bcdice/game_system/AlterRaise.rb +282 -0
  55. data/lib/bcdice/game_system/Amadeus.rb +622 -0
  56. data/lib/bcdice/game_system/Amadeus_Korean.rb +501 -0
  57. data/lib/bcdice/game_system/AnimaAnimus.rb +96 -0
  58. data/lib/bcdice/game_system/Arianrhod.rb +50 -0
  59. data/lib/bcdice/game_system/ArsMagica.rb +149 -0
  60. data/lib/bcdice/game_system/Avandner.rb +101 -0
  61. data/lib/bcdice/game_system/BBN.rb +143 -0
  62. data/lib/bcdice/game_system/BadLife.rb +435 -0
  63. data/lib/bcdice/game_system/BarnaKronika.rb +188 -0
  64. data/lib/bcdice/game_system/BattleTech.rb +530 -0
  65. data/lib/bcdice/game_system/BeastBindTrinity.rb +348 -0
  66. data/lib/bcdice/game_system/BeginningIdol.rb +2527 -0
  67. data/lib/bcdice/game_system/BeginningIdol_Korean.rb +2378 -0
  68. data/lib/bcdice/game_system/BladeOfArcana.rb +252 -0
  69. data/lib/bcdice/game_system/BlindMythos.rb +460 -0
  70. data/lib/bcdice/game_system/BloodCrusade.rb +423 -0
  71. data/lib/bcdice/game_system/BloodMoon.rb +213 -0
  72. data/lib/bcdice/game_system/CardRanker.rb +249 -0
  73. data/lib/bcdice/game_system/ChaosFlare.rb +181 -0
  74. data/lib/bcdice/game_system/Chill.rb +163 -0
  75. data/lib/bcdice/game_system/Chill3.rb +52 -0
  76. data/lib/bcdice/game_system/CodeLayerd.rb +132 -0
  77. data/lib/bcdice/game_system/ColossalHunter.rb +569 -0
  78. data/lib/bcdice/game_system/CrashWorld.rb +81 -0
  79. data/lib/bcdice/game_system/Cthulhu.rb +252 -0
  80. data/lib/bcdice/game_system/Cthulhu7th.rb +767 -0
  81. data/lib/bcdice/game_system/Cthulhu7th_ChineseTraditional.rb +386 -0
  82. data/lib/bcdice/game_system/Cthulhu7th_Korean.rb +383 -0
  83. data/lib/bcdice/game_system/CthulhuTech.rb +263 -0
  84. data/lib/bcdice/game_system/Cthulhu_ChineseTraditional.rb +243 -0
  85. data/lib/bcdice/game_system/Cthulhu_Korean.rb +240 -0
  86. data/lib/bcdice/game_system/DarkBlaze.rb +207 -0
  87. data/lib/bcdice/game_system/DarkDaysDrive.rb +425 -0
  88. data/lib/bcdice/game_system/DarkSouls.rb +91 -0
  89. data/lib/bcdice/game_system/DeadlineHeroes.rb +583 -0
  90. data/lib/bcdice/game_system/DemonParasite.rb +524 -0
  91. data/lib/bcdice/game_system/DetatokoSaga.rb +310 -0
  92. data/lib/bcdice/game_system/DetatokoSaga_Korean.rb +310 -0
  93. data/lib/bcdice/game_system/DiceBot.rb +17 -0
  94. data/lib/bcdice/game_system/DiceOfTheDead.rb +111 -0
  95. data/lib/bcdice/game_system/DoubleCross.rb +373 -0
  96. data/lib/bcdice/game_system/DoubleCross_Korean.rb +371 -0
  97. data/lib/bcdice/game_system/Dracurouge.rb +1856 -0
  98. data/lib/bcdice/game_system/Dracurouge_Korean.rb +310 -0
  99. data/lib/bcdice/game_system/DungeonsAndDragons.rb +19 -0
  100. data/lib/bcdice/game_system/EarthDawn.rb +225 -0
  101. data/lib/bcdice/game_system/EarthDawn3.rb +275 -0
  102. data/lib/bcdice/game_system/EarthDawn4.rb +272 -0
  103. data/lib/bcdice/game_system/EclipsePhase.rb +51 -0
  104. data/lib/bcdice/game_system/Elric.rb +36 -0
  105. data/lib/bcdice/game_system/Elysion.rb +1213 -0
  106. data/lib/bcdice/game_system/EmbryoMachine.rb +227 -0
  107. data/lib/bcdice/game_system/EndBreaker.rb +132 -0
  108. data/lib/bcdice/game_system/EtrianOdysseySRS.rb +27 -0
  109. data/lib/bcdice/game_system/Fiasco.rb +123 -0
  110. data/lib/bcdice/game_system/Fiasco_Korean.rb +122 -0
  111. data/lib/bcdice/game_system/FilledWith.rb +1543 -0
  112. data/lib/bcdice/game_system/FullMetalPanic.rb +27 -0
  113. data/lib/bcdice/game_system/FutariSousa.rb +994 -0
  114. data/lib/bcdice/game_system/FutariSousa_Korean.rb +994 -0
  115. data/lib/bcdice/game_system/Garako.rb +559 -0
  116. data/lib/bcdice/game_system/GardenOrder.rb +451 -0
  117. data/lib/bcdice/game_system/GehennaAn.rb +136 -0
  118. data/lib/bcdice/game_system/GeishaGirlwithKatana.rb +120 -0
  119. data/lib/bcdice/game_system/GoblinSlayer.rb +168 -0
  120. data/lib/bcdice/game_system/GoldenSkyStories.rb +77 -0
  121. data/lib/bcdice/game_system/Gorilla.rb +44 -0
  122. data/lib/bcdice/game_system/GranCrest.rb +518 -0
  123. data/lib/bcdice/game_system/Gundog.rb +52 -0
  124. data/lib/bcdice/game_system/GundogRevised.rb +294 -0
  125. data/lib/bcdice/game_system/GundogZero.rb +261 -0
  126. data/lib/bcdice/game_system/Gurps.rb +403 -0
  127. data/lib/bcdice/game_system/GurpsFW.rb +2330 -0
  128. data/lib/bcdice/game_system/HarnMaster.rb +208 -0
  129. data/lib/bcdice/game_system/HatsuneMiku.rb +706 -0
  130. data/lib/bcdice/game_system/Hieizan.rb +48 -0
  131. data/lib/bcdice/game_system/HouraiGakuen.rb +270 -0
  132. data/lib/bcdice/game_system/HuntersMoon.rb +503 -0
  133. data/lib/bcdice/game_system/Illusio.rb +89 -0
  134. data/lib/bcdice/game_system/InfiniteFantasia.rb +51 -0
  135. data/lib/bcdice/game_system/Insane.rb +822 -0
  136. data/lib/bcdice/game_system/Insane_Korean.rb +773 -0
  137. data/lib/bcdice/game_system/IthaWenUa.rb +38 -0
  138. data/lib/bcdice/game_system/JamesBond.rb +45 -0
  139. data/lib/bcdice/game_system/Kamigakari.rb +394 -0
  140. data/lib/bcdice/game_system/Kamigakari_Korean.rb +428 -0
  141. data/lib/bcdice/game_system/KanColle.rb +938 -0
  142. data/lib/bcdice/game_system/KemonoNoMori.rb +258 -0
  143. data/lib/bcdice/game_system/KillDeathBusiness.rb +1420 -0
  144. data/lib/bcdice/game_system/KillDeathBusiness_Korean.rb +1510 -0
  145. data/lib/bcdice/game_system/KurayamiCrying.rb +49 -0
  146. data/lib/bcdice/game_system/LiveraDoll.rb +375 -0
  147. data/lib/bcdice/game_system/LogHorizon.rb +3567 -0
  148. data/lib/bcdice/game_system/LogHorizon_Korean.rb +1407 -0
  149. data/lib/bcdice/game_system/LostRecord.rb +30 -0
  150. data/lib/bcdice/game_system/LostRoyal.rb +242 -0
  151. data/lib/bcdice/game_system/MagicaLogia.rb +1148 -0
  152. data/lib/bcdice/game_system/MeikyuDays.rb +415 -0
  153. data/lib/bcdice/game_system/MeikyuKingdom.rb +466 -0
  154. data/lib/bcdice/game_system/MeikyuKingdomBasic.rb +269 -0
  155. data/lib/bcdice/game_system/MetalHead.rb +249 -0
  156. data/lib/bcdice/game_system/MetalHeadExtream.rb +917 -0
  157. data/lib/bcdice/game_system/MetallicGuardian.rb +31 -0
  158. data/lib/bcdice/game_system/MonotoneMuseum.rb +354 -0
  159. data/lib/bcdice/game_system/MonotoneMuseum_Korean.rb +304 -0
  160. data/lib/bcdice/game_system/Nechronica.rb +211 -0
  161. data/lib/bcdice/game_system/Nechronica_Korean.rb +160 -0
  162. data/lib/bcdice/game_system/NeverCloud.rb +74 -0
  163. data/lib/bcdice/game_system/NightWizard.rb +231 -0
  164. data/lib/bcdice/game_system/NightWizard3rd.rb +24 -0
  165. data/lib/bcdice/game_system/NightmareHunterDeep.rb +117 -0
  166. data/lib/bcdice/game_system/NinjaSlayer.rb +274 -0
  167. data/lib/bcdice/game_system/NjslyrBattle.rb +54 -0
  168. data/lib/bcdice/game_system/Nuekagami.rb +293 -0
  169. data/lib/bcdice/game_system/OneWayHeroics.rb +134 -0
  170. data/lib/bcdice/game_system/OracleEngine.rb +265 -0
  171. data/lib/bcdice/game_system/OrgaRain.rb +77 -0
  172. data/lib/bcdice/game_system/Oukahoushin3rd.rb +162 -0
  173. data/lib/bcdice/game_system/Paradiso.rb +323 -0
  174. data/lib/bcdice/game_system/Paranoia.rb +64 -0
  175. data/lib/bcdice/game_system/ParanoiaRebooted.rb +109 -0
  176. data/lib/bcdice/game_system/ParasiteBlood.rb +231 -0
  177. data/lib/bcdice/game_system/Pathfinder.rb +21 -0
  178. data/lib/bcdice/game_system/Peekaboo.rb +324 -0
  179. data/lib/bcdice/game_system/Pendragon.rb +39 -0
  180. data/lib/bcdice/game_system/PhantasmAdventure.rb +73 -0
  181. data/lib/bcdice/game_system/Postman.rb +185 -0
  182. data/lib/bcdice/game_system/PulpCthulhu.rb +184 -0
  183. data/lib/bcdice/game_system/Raisondetre.rb +171 -0
  184. data/lib/bcdice/game_system/RecordOfLodossWar.rb +58 -0
  185. data/lib/bcdice/game_system/RecordOfSteam.rb +149 -0
  186. data/lib/bcdice/game_system/RokumonSekai2.rb +110 -0
  187. data/lib/bcdice/game_system/RoleMaster.rb +24 -0
  188. data/lib/bcdice/game_system/RuneQuest.rb +47 -0
  189. data/lib/bcdice/game_system/RyuTuber.rb +266 -0
  190. data/lib/bcdice/game_system/Ryutama.rb +199 -0
  191. data/lib/bcdice/game_system/SRS.rb +348 -0
  192. data/lib/bcdice/game_system/SamsaraBallad.rb +111 -0
  193. data/lib/bcdice/game_system/Satasupe.rb +1173 -0
  194. data/lib/bcdice/game_system/ScreamHighSchool.rb +128 -0
  195. data/lib/bcdice/game_system/SevenFortressMobius.rb +34 -0
  196. data/lib/bcdice/game_system/ShadowRun.rb +26 -0
  197. data/lib/bcdice/game_system/ShadowRun4.rb +49 -0
  198. data/lib/bcdice/game_system/ShadowRun5.rb +80 -0
  199. data/lib/bcdice/game_system/SharedFantasia.rb +69 -0
  200. data/lib/bcdice/game_system/ShinMegamiTenseiKakuseihen.rb +85 -0
  201. data/lib/bcdice/game_system/ShinkuuGakuen.rb +506 -0
  202. data/lib/bcdice/game_system/ShinobiGami.rb +680 -0
  203. data/lib/bcdice/game_system/ShoujoTenrankai.rb +677 -0
  204. data/lib/bcdice/game_system/Skynauts.rb +324 -0
  205. data/lib/bcdice/game_system/SteamPunkers.rb +485 -0
  206. data/lib/bcdice/game_system/StellarKnights.rb +856 -0
  207. data/lib/bcdice/game_system/SterileLife.rb +452 -0
  208. data/lib/bcdice/game_system/StrangerOfSwordCity.rb +103 -0
  209. data/lib/bcdice/game_system/StratoShout.rb +316 -0
  210. data/lib/bcdice/game_system/StratoShout_Korean.rb +314 -0
  211. data/lib/bcdice/game_system/Strave.rb +223 -0
  212. data/lib/bcdice/game_system/SwordWorld.rb +491 -0
  213. data/lib/bcdice/game_system/SwordWorld2_0.rb +295 -0
  214. data/lib/bcdice/game_system/SwordWorld2_5.rb +121 -0
  215. data/lib/bcdice/game_system/TherapieSein.rb +93 -0
  216. data/lib/bcdice/game_system/TokumeiTenkousei.rb +96 -0
  217. data/lib/bcdice/game_system/TokyoGhostResearch.rb +122 -0
  218. data/lib/bcdice/game_system/TokyoNova.rb +19 -0
  219. data/lib/bcdice/game_system/Torg.rb +364 -0
  220. data/lib/bcdice/game_system/Torg1_5.rb +139 -0
  221. data/lib/bcdice/game_system/TorgEternity.rb +414 -0
  222. data/lib/bcdice/game_system/TrinitySeven.rb +364 -0
  223. data/lib/bcdice/game_system/TunnelsAndTrolls.rb +287 -0
  224. data/lib/bcdice/game_system/TwilightGunsmoke.rb +527 -0
  225. data/lib/bcdice/game_system/Utakaze.rb +153 -0
  226. data/lib/bcdice/game_system/VampireTheMasquerade5th.rb +132 -0
  227. data/lib/bcdice/game_system/Villaciel.rb +555 -0
  228. data/lib/bcdice/game_system/WARPS.rb +33 -0
  229. data/lib/bcdice/game_system/WaresBlade.rb +34 -0
  230. data/lib/bcdice/game_system/Warhammer.rb +336 -0
  231. data/lib/bcdice/game_system/WitchQuest.rb +275 -0
  232. data/lib/bcdice/game_system/WorldOfDarkness.rb +135 -0
  233. data/lib/bcdice/game_system/YankeeYogSothoth.rb +440 -0
  234. data/lib/bcdice/game_system/YearZeroEngine.rb +134 -0
  235. data/lib/bcdice/game_system/ZettaiReido.rb +142 -0
  236. data/lib/bcdice/game_system/meikyu_kingdom/item_table.rb +383 -0
  237. data/lib/bcdice/game_system/meikyu_kingdom/kingdom_name_table.rb +89 -0
  238. data/lib/bcdice/game_system/meikyu_kingdom/landscape_table.rb +196 -0
  239. data/lib/bcdice/game_system/meikyu_kingdom/name_tables.rb +223 -0
  240. data/lib/bcdice/game_system/meikyu_kingdom/placename_table.rb +214 -0
  241. data/lib/bcdice/game_system/meikyu_kingdom/tables.rb +610 -0
  242. data/lib/bcdice/game_system/meikyu_kingdom/word_table.rb +117 -0
  243. data/lib/bcdice/game_system/meikyu_kingdom_basic/item_table.rb +380 -0
  244. data/lib/bcdice/game_system/meikyu_kingdom_basic/kingdom_table.rb +184 -0
  245. data/lib/bcdice/game_system/meikyu_kingdom_basic/name_table.rb +417 -0
  246. data/lib/bcdice/game_system/meikyu_kingdom_basic/table.rb +912 -0
  247. data/lib/bcdice/game_system/meikyu_kingdom_basic/word_table.rb +121 -0
  248. data/lib/bcdice/game_system/one_way_heroics/dungeon_table.rb +67 -0
  249. data/lib/bcdice/game_system/one_way_heroics/random_event_table.rb +166 -0
  250. data/lib/bcdice/game_system/one_way_heroics/tables.rb +668 -0
  251. data/lib/bcdice/loader.rb +37 -0
  252. data/lib/bcdice/normalize.rb +38 -0
  253. data/lib/bcdice/preprocessor.rb +87 -0
  254. data/lib/bcdice/randomizer.rb +137 -0
  255. data/lib/bcdice/repl.rb +155 -0
  256. data/lib/bcdice/user_defined_dice_table.rb +153 -0
  257. data/lib/bcdice/version.rb +3 -0
  258. metadata +304 -0
@@ -0,0 +1,223 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class Strave < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'Strave'
8
+
9
+ # ゲームシステム名
10
+ NAME = '碧空のストレイヴ'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'へきくうのすとれいふ'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = <<~MESSAGETEXT
17
+ ・モラトリアムフェイズ用判定:MPm
18
+ ・命中判定:nSTm*p
19
+
20
+ 「n」でダイス数を指定。
21
+ 「m」で目標値を指定。省略は出来ません。
22
+ 「p」で攻撃力を指定。「*」は「x」でも可。
23
+
24
+ 【書式例】
25
+ ・MP6 → 目標値6のモラトリアムフェイズ用判定。
26
+ ・5ST6*10 → 5d10で目標値6、攻撃力10の命中判定。
27
+
28
+ 【各種表】
29
+ ・所属表:AFF  VN版:AFV
30
+ ・アイデンティティ表:IDT  VN版:IDV
31
+
32
+ ※アイデンティティ表はエラッタ適用済です。
33
+ MESSAGETEXT
34
+
35
+ register_prefix([
36
+ 'MP\d+', '\d+ST\d+(x|\*)\d+',
37
+ 'AFF', 'IDT', 'AFV', 'IDV'
38
+ ])
39
+
40
+ def initialize(command)
41
+ super(command)
42
+ @sort_add_dice = true # ダイスのソート有
43
+ end
44
+
45
+ def eval_game_system_specific_command(command)
46
+ output =
47
+ case command.upcase
48
+
49
+ # MPコマンド:モラトリアムフェイズ用判定
50
+ when /MP(\d+)$/i
51
+ diceCount = 2
52
+ target = Regexp.last_match(1).to_i
53
+ checkRoll(diceCount, target, nil)
54
+
55
+ # STコマンド:命中判定
56
+ when /(\d+)ST(\d+)(x|\*)(\d+)$/i
57
+ diceCount = Regexp.last_match(1).to_i
58
+ target = Regexp.last_match(2).to_i
59
+ damage = (Regexp.last_match(4) || 0).to_i
60
+ checkRoll(diceCount, target, damage)
61
+
62
+ # 各種表
63
+ when 'AFF'
64
+ get_affiliation_table
65
+ when 'IDT'
66
+ get_identity_table
67
+ when 'AFV'
68
+ get_affiliation_table2
69
+ when 'IDV'
70
+ get_identity_table2
71
+
72
+ end
73
+
74
+ return output
75
+ end
76
+
77
+ def checkRoll(diceCount, target, damage)
78
+ target = 1 if target < 1
79
+ target = 10 if target > 10
80
+
81
+ diceArray = @randomizer.roll_barabara(diceCount, 10).sort
82
+ diceText = diceArray.join(",")
83
+
84
+ successCount = diceArray.find_all { |i| (i <= target) }.size
85
+
86
+ isDamage = !damage.nil?
87
+
88
+ if isDamage
89
+ totalDamage = successCount * damage
90
+ result = "(#{diceCount}D10\<\=#{target}) > #{diceText} > Hits:#{successCount}*#{damage} > #{totalDamage}ダメージ"
91
+ else
92
+ result = "(#{diceCount}D10\<\=#{target}) > #{diceText}"
93
+ if successCount > 0
94
+ result += " > 【成功】"
95
+ else
96
+ result += " > 【失敗】"
97
+ end
98
+ end
99
+
100
+ return result
101
+ end
102
+
103
+ def get_affiliation_table
104
+ name = '所属表:基本'
105
+ table = [
106
+ [1, 'アリウス管理委員会:あなたはアリウス管理委員会に所属している。'],
107
+ [2, 'オーヴァーブルー:あなたはオーヴァーブルーに所属している。'],
108
+ [3, 'ウォルゲイト:あなたはウォルゲイトに所属している。'],
109
+ [4, '暁部隊:あなたはかつて、反逆者・暁弥琴と同じ部隊に所属していた。'],
110
+ [5, '天文部:あなたは天文部に所属している。'],
111
+ [6, '吹奏楽部:あなたは吹奏楽部に所属している。'],
112
+ [7, '剣道部:あなたは剣道部に所属している。'],
113
+ [8, 'ボクシング部:あなたはボクシング部に所属している。'],
114
+ [9, '陸上部:あなたは陸上部に所属している。'],
115
+ [10, '茶道部:あなたは茶道部に所属している。'],
116
+ [11, 'パソコン部:あなたはパソコン部に所属している。'],
117
+ [12, '新聞部:あなたは新聞部に所属している。'],
118
+ [13, '弓道部:あなたは弓道部に所属している。'],
119
+ [14, '美術部:あなたは美術部に所属している。'],
120
+ [15, 'ミリタリー研究会:あなたはミリタリー研究会に所属している。'],
121
+ [16, '歴史研究会:あなたは歴史研究会に所属している。'],
122
+ [17, 'ロボット研究会:あなたはロボット研究会に所属している。'],
123
+ [18, '図書委員会:あなたは図書委員会に所属している。'],
124
+ [19, '任意:あなたの任意の所属を設定せよ。'],
125
+ [20, '任意:あなたの任意の所属を設定せよ。']
126
+ ]
127
+ return get_strave_1d100_table_result(name, table)
128
+ end
129
+
130
+ def get_identity_table
131
+ name = 'アイデンティティ表:基本'
132
+ table = [
133
+ [1, '戦い:戦いこそが、あなたをあなたたらしめている。'],
134
+ [2, '守護:あなたには守るべきものがある。'],
135
+ [3, '復讐:あなたは復讐を誓っている。何かに、あるいは誰かに。'],
136
+ [4, '名声:その身に浴びる脚光を、何よりも誉としている。'],
137
+ [5, '恋愛:あなたはその身を焦がす恋に生きている。'],
138
+ [6, '家族:あなたにとって、家族はかけがえの無いものだ。'],
139
+ [7, '友人:あなたは友のために戦っている。'],
140
+ [8, '部隊:共に戦う部隊の仲間が、あなたに力をくれる。'],
141
+ [9, 'ストレイヴ:あなたは自身のストレイヴを誇りに思っている。'],
142
+ [10, 'スフィアブレイク:あなたはスフィアブレイクを熱烈に目指している。'],
143
+ [11, 'お金:あなたはお金を求めている。報酬こそが自分の価値だ。'],
144
+ [12, '夢:あなたには夢がある。自分を突き動かす夢が。'],
145
+ [13, '忠誠:あなたは忠誠を誓っている。何かに、あるいは誰かに。'],
146
+ [14, '共生:あなたは、ヴァイエルと人類との共生を望んでいる。'],
147
+ [15, '居場所:自身の居場所こそが、あなたに力をくれる。'],
148
+ [16, '強制:あなたは不本意ながら今の立場にいる。'],
149
+ [17, '碧空:見上げた青空が、あなたを変えた。'],
150
+ [18, '任意:あなたの任意のアイデンティティを設定せよ。'],
151
+ [19, '任意:あなたの任意のアイデンティティを設定せよ。'],
152
+ [20, '任意:あなたの任意のアイデンティティを設定せよ。']
153
+ ]
154
+ return get_strave_1d100_table_result(name, table)
155
+ end
156
+
157
+ def get_affiliation_table2
158
+ name = '所属表:ヴァリアンスネイヴァー'
159
+ table = [
160
+ [1, 'シュヴァレ・トワール:あなたはシュヴァレ・トワールに所属している。'],
161
+ [2, 'ディープシンカー:あなたはディープシンカーに所属している。'],
162
+ [3, 'ヴェルクシュタット:あなたはヴェルクシュタットに所属している。'],
163
+ [4, 'アウスヴァル:あなたはアウスヴァルに所属している。'],
164
+ [5, '美術科:あなたは美術科に所属している。'],
165
+ [6, '哲学科:あなたは哲学科に所属している。'],
166
+ [7, '数学科:あなたは数学科に所属している。'],
167
+ [8, '地理学科:あなたは地理学科に所属している。'],
168
+ [9, '工学科:あなたは工学科に所属している。'],
169
+ [10, '体育学科:あなたは体育学科に所属している。'],
170
+ [11, '農学科:あなたは農学科に所属している。'],
171
+ [12, '歴史学科:あなたは歴史学科に所属している。'],
172
+ [13, '医学科:あなたは医学科に所属している。'],
173
+ [14, '情報学科:あなたは情報学科に所属している。'],
174
+ [15, '音楽科:あなたは音楽科に所属している。'],
175
+ [16, '心理学科:あなたは心理学科に所属している。'],
176
+ [17, '文学科:あなたは文学科に所属している。'],
177
+ [18, '任意:あなたの任意の所属を設定すること。'],
178
+ [19, '任意:あなたの任意の所属を設定すること。'],
179
+ [20, '任意:あなたの任意の所属を設定すること。']
180
+ ]
181
+ return get_strave_1d100_table_result(name, table)
182
+ end
183
+
184
+ def get_identity_table2
185
+ name = 'アイデンティティ表:ヴァリアンスネイヴァー'
186
+ table = [
187
+ [1, '戦い:戦いへの衝動が、あなたをあなたたらしめている。'],
188
+ [2, '守護:守るべきものの存在が、あなたをあなたたらしめている。'],
189
+ [3, '復讐:復讐の誓いこそが、あなたをあなたたらしめている。'],
190
+ [4, '名声:与えられた名誉こそが、あなたをあなたたらしめている。'],
191
+ [5, '恋愛:愛する者への想いが、あなたをあなたたらしめている。'],
192
+ [6, '家族:かけがえのない家族が、あなたをあなたたらしめている。'],
193
+ [7, '友人:友の存在が、あなたをあなたたらしめている。'],
194
+ [8, '部隊:部隊の戦友こそが、あなたをあなたたらしめている。'],
195
+ [9, 'ストレイヴ:ストレイヴの存在が、あなたの心を保っている。'],
196
+ [10, '宇宙:やがて来る旅立ちの日まで、あなたはあなたであろうとしている。'],
197
+ [11, 'お金:与えられる報酬のため、あなたはあなたであろうとしている。'],
198
+ [12, '夢:あなたには、己の心に誓った夢がある。'],
199
+ [13, '忠誠:その心でもって、誓った忠義がある。'],
200
+ [14, '共生:あなたは、ヴァイエルと人類との共生を望んでいる。'],
201
+ [15, '居場所:自身の居場所への思いが、あなたをあなたたらしめている。'],
202
+ [16, 'ヴァイエル:あなたと同じでありながら、あなたと異なる存在。彼らへの思いが、あなたをあなたたらしめている。'],
203
+ [17, 'エコール:自身の生きる場所への思いが、あなたをあなたたらしめている。'],
204
+ [18, '任意:あなたの任意のアイデンティティを設定せよ。'],
205
+ [19, '任意:あなたの任意のアイデンティティを設定せよ。'],
206
+ [20, '任意:あなたの任意のアイデンティティを設定せよ。']
207
+ ]
208
+ return get_strave_1d100_table_result(name, table)
209
+ end
210
+
211
+ def get_strave_1d100_table_result(name, table)
212
+ dice = @randomizer.roll_once(100)
213
+ dice2 = ((dice.to_i - 1) / 5).floor + 1
214
+ result = get_table_by_number(dice2, table)
215
+ return get_strave_table_result(name, dice, result)
216
+ end
217
+
218
+ def get_strave_table_result(name, dice, result)
219
+ return "#{name}(#{dice}) > #{result}"
220
+ end
221
+ end
222
+ end
223
+ end
@@ -0,0 +1,491 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BCDice
4
+ module GameSystem
5
+ class SwordWorld < Base
6
+ # ゲームシステムの識別子
7
+ ID = 'SwordWorld'
8
+
9
+ # ゲームシステム名
10
+ NAME = 'ソードワールドRPG'
11
+
12
+ # ゲームシステム名の読みがな
13
+ SORT_KEY = 'そおとわあると'
14
+
15
+ # ダイスボットの使い方
16
+ HELP_MESSAGE = "・SW レーティング表 (Kx[c]+m$f) (x:キー, c:クリティカル値, m:ボーナス, f:出目修正)\n"
17
+
18
+ register_prefix(['H?K\d+.*'])
19
+
20
+ def initialize(command)
21
+ super(command)
22
+ @rating_table = 0
23
+ end
24
+
25
+ # change_textで使うレーティング表コマンドの正規表現
26
+ #
27
+ # SW 2.5のダイスボットでも必要なため、共通化のために定数として定義する
28
+ RATING_TABLE_RE_FOR_CHANGE_TEXT = /\AS?H?K\d+/i.freeze
29
+
30
+ # コマンド実行前にメッセージを置換する
31
+ # @param [String] string 受信したメッセージ
32
+ # @return [String]
33
+ def replace_text(string)
34
+ # TODO: Ruby 2.4以降では Regexp#match? を使うこと
35
+ return string unless RATING_TABLE_RE_FOR_CHANGE_TEXT.match(string)
36
+
37
+ string
38
+ .gsub(/\[(\d+)\]/) { "c[#{Regexp.last_match(1)}]" }
39
+ .gsub(/@(\d+)/) { "c[#{Regexp.last_match(1)}]" }
40
+ .gsub(/\$([-+]?\d+)/) { "m[#{Regexp.last_match(1)}]" }
41
+ .gsub(/r([-+]?\d+)/i) { "r[#{Regexp.last_match(1)}]" }
42
+ end
43
+
44
+ def getRatingCommandStrings
45
+ "cmCM"
46
+ end
47
+
48
+ def check_2D6(total, dice_total, _dice_list, cmp_op, target)
49
+ if dice_total >= 12
50
+ " > 自動的成功"
51
+ elsif dice_total <= 2
52
+ " > 自動的失敗"
53
+ elsif cmp_op != :>= || target == "?"
54
+ ''
55
+ elsif total >= target
56
+ " > 成功"
57
+ else
58
+ " > 失敗"
59
+ end
60
+ end
61
+
62
+ def eval_game_system_specific_command(command)
63
+ rating(command)
64
+ end
65
+
66
+ private
67
+
68
+ #################### SWレーティング表 ########################
69
+ def rating(string) # レーティング表
70
+ string = replace_text(string)
71
+ debug("rating string", string)
72
+
73
+ commands = getRatingCommandStrings
74
+
75
+ m = /^S?(H?K[\d\+\-]+([#{commands}]\[([\d\+\-]+)\])*([\d\+\-]*)([CMR]\[([\d\+\-]+)\]|GF|H)*)/i.match(string)
76
+ unless m
77
+ debug("not matched")
78
+ return '1'
79
+ end
80
+
81
+ string = m[1]
82
+ half = string.include?("H")
83
+
84
+ rateUp, string = getRateUpFromString(string)
85
+ crit, string = getCriticalFromString(string, half)
86
+ firstDiceChanteTo, firstDiceChangeModify, string = getDiceChangesFromString(string)
87
+
88
+ key, addValue = getKeyAndAddValueFromString(string)
89
+
90
+ return '1' unless key =~ /([\d]+)/
91
+
92
+ key = Regexp.last_match(1).to_i
93
+
94
+ # 2.0対応
95
+ rate_sw2_0 = getSW2_0_RatingTable
96
+
97
+ keyMax = rate_sw2_0.length - 1
98
+ debug("keyMax", keyMax)
99
+ if key > keyMax
100
+ return "キーナンバーは#{keyMax}までです"
101
+ end
102
+
103
+ newRates = getNewRates(rate_sw2_0)
104
+
105
+ output = "KeyNo.#{key}"
106
+
107
+ output += "c[#{crit}]" if crit < 13
108
+ output += "m[#{firstDiceChangeModify}]" if firstDiceChangeModify != 0
109
+ output += "m[#{firstDiceChanteTo}]" if firstDiceChanteTo != 0
110
+ output += "r[#{rateUp}]" if rateUp != 0
111
+
112
+ output, values = getAdditionalString(string, output)
113
+
114
+ debug('output', output)
115
+
116
+ if addValue != 0
117
+ output += "+#{addValue}" if addValue > 0
118
+ output += addValue.to_s if addValue < 0
119
+ end
120
+
121
+ output += " > "
122
+
123
+ diceResultTotals = []
124
+ diceResults = []
125
+ rateResults = []
126
+ dice = 0
127
+ diceOnlyTotal = 0
128
+ totalValue = 0
129
+ round = 0
130
+
131
+ loop do
132
+ dice_raw, diceText = rollDice(values)
133
+ dice = dice_raw
134
+
135
+ if firstDiceChanteTo != 0
136
+ dice = dice_raw = firstDiceChanteTo
137
+ firstDiceChanteTo = 0
138
+ elsif firstDiceChangeModify != 0
139
+ dice += firstDiceChangeModify.to_i
140
+ firstDiceChangeModify = 0
141
+ end
142
+
143
+ # 出目がピンゾロの時にはそこで終了
144
+ if dice_raw <= 2
145
+ diceResultTotals << dice_raw.to_s
146
+ diceResults << diceText.to_s
147
+ rateResults << "**"
148
+
149
+ round += 1
150
+ break
151
+ end
152
+
153
+ dice += getAdditionalDiceValue(dice, values)
154
+
155
+ dice = 2 if dice < 2
156
+ dice = 12 if dice > 12
157
+
158
+ currentKey = [key + round * rateUp, keyMax].min
159
+ debug("currentKey", currentKey)
160
+ rateValue = newRates[dice][currentKey]
161
+ debug("rateValue", rateValue)
162
+
163
+ totalValue += rateValue
164
+ diceOnlyTotal += dice
165
+
166
+ diceResultTotals << dice.to_s
167
+ diceResults << diceText.to_s
168
+ rateResults << (dice > 2 ? rateValue : "**")
169
+
170
+ round += 1
171
+
172
+ break unless dice >= crit
173
+ end
174
+
175
+ output += getResultText(totalValue, addValue, diceResults, diceResultTotals,
176
+ rateResults, diceOnlyTotal, round, half)
177
+
178
+ return output
179
+ end
180
+
181
+ def getAdditionalString(_string, output)
182
+ values = {}
183
+ return output, values
184
+ end
185
+
186
+ def getAdditionalDiceValue(_dice, _values)
187
+ 0
188
+ end
189
+
190
+ def getCriticalFromString(string, half)
191
+ crit = half ? 13 : 10
192
+
193
+ regexp = /c\[(\d+)\]/i
194
+
195
+ if regexp =~ string
196
+ crit = Regexp.last_match(1).to_i
197
+ crit = 3 if crit < 3 # エラートラップ(クリティカル値が3未満なら3とする)
198
+ string = string.gsub(regexp, '')
199
+ end
200
+
201
+ return crit, string
202
+ end
203
+
204
+ def getDiceChangesFromString(string)
205
+ firstDiceChanteTo = 0
206
+ firstDiceChangeModify = 0
207
+
208
+ regexp = /m\[([\d\+\-]+)\]/i
209
+
210
+ if regexp =~ string
211
+ firstDiceChangeModify = Regexp.last_match(1)
212
+
213
+ unless /[\+\-]/ =~ firstDiceChangeModify
214
+ firstDiceChanteTo = firstDiceChangeModify.to_i
215
+ firstDiceChangeModify = 0
216
+ end
217
+
218
+ string = string.gsub(regexp, '')
219
+ end
220
+
221
+ return firstDiceChanteTo, firstDiceChangeModify, string
222
+ end
223
+
224
+ def getRateUpFromString(string)
225
+ rateUp = 0
226
+ return rateUp, string
227
+ end
228
+
229
+ def getKeyAndAddValueFromString(string)
230
+ key = nil
231
+ addValue = 0
232
+
233
+ if /K(\d+)([\d\+\-]*)/i =~ string # ボーナスの抽出
234
+ key = Regexp.last_match(1)
235
+ if Regexp.last_match(2)
236
+ addValue = ArithmeticEvaluator.eval(Regexp.last_match(2))
237
+ end
238
+ else
239
+ key = string
240
+ end
241
+
242
+ return key, addValue
243
+ end
244
+
245
+ def getSW2_0_RatingTable
246
+ rate_sw2_0 = [
247
+ # 0
248
+ '*,0,0,0,1,2,2,3,3,4,4',
249
+ '*,0,0,0,1,2,3,3,3,4,4',
250
+ '*,0,0,0,1,2,3,4,4,4,4',
251
+ '*,0,0,1,1,2,3,4,4,4,5',
252
+ '*,0,0,1,2,2,3,4,4,5,5',
253
+ '*,0,1,1,2,2,3,4,5,5,5',
254
+ '*,0,1,1,2,3,3,4,5,5,5',
255
+ '*,0,1,1,2,3,4,4,5,5,6',
256
+ '*,0,1,2,2,3,4,4,5,6,6',
257
+ '*,0,1,2,3,3,4,4,5,6,7',
258
+ '*,1,1,2,3,3,4,5,5,6,7',
259
+ # 11
260
+ '*,1,2,2,3,3,4,5,6,6,7',
261
+ '*,1,2,2,3,4,4,5,6,6,7',
262
+ '*,1,2,3,3,4,4,5,6,7,7',
263
+ '*,1,2,3,4,4,4,5,6,7,8',
264
+ '*,1,2,3,4,4,5,5,6,7,8',
265
+ '*,1,2,3,4,4,5,6,7,7,8',
266
+ '*,1,2,3,4,5,5,6,7,7,8',
267
+ '*,1,2,3,4,5,6,6,7,7,8',
268
+ '*,1,2,3,4,5,6,7,7,8,9',
269
+ '*,1,2,3,4,5,6,7,8,9,10',
270
+ # 21
271
+ '*,1,2,3,4,6,6,7,8,9,10',
272
+ '*,1,2,3,5,6,6,7,8,9,10',
273
+ '*,2,2,3,5,6,7,7,8,9,10',
274
+ '*,2,3,4,5,6,7,7,8,9,10',
275
+ '*,2,3,4,5,6,7,8,8,9,10',
276
+ '*,2,3,4,5,6,8,8,9,9,10',
277
+ '*,2,3,4,6,6,8,8,9,9,10',
278
+ '*,2,3,4,6,6,8,9,9,10,10',
279
+ '*,2,3,4,6,7,8,9,9,10,10',
280
+ '*,2,4,4,6,7,8,9,10,10,10',
281
+ # 31
282
+ '*,2,4,5,6,7,8,9,10,10,11',
283
+ '*,3,4,5,6,7,8,10,10,10,11',
284
+ '*,3,4,5,6,8,8,10,10,10,11',
285
+ '*,3,4,5,6,8,9,10,10,11,11',
286
+ '*,3,4,5,7,8,9,10,10,11,12',
287
+ '*,3,5,5,7,8,9,10,11,11,12',
288
+ '*,3,5,6,7,8,9,10,11,12,12',
289
+ '*,3,5,6,7,8,10,10,11,12,13',
290
+ '*,4,5,6,7,8,10,11,11,12,13',
291
+ '*,4,5,6,7,9,10,11,11,12,13',
292
+ # 41
293
+ '*,4,6,6,7,9,10,11,12,12,13',
294
+ '*,4,6,7,7,9,10,11,12,13,13',
295
+ '*,4,6,7,8,9,10,11,12,13,14',
296
+ '*,4,6,7,8,10,10,11,12,13,14',
297
+ '*,4,6,7,9,10,10,11,12,13,14',
298
+ '*,4,6,7,9,10,10,12,13,13,14',
299
+ '*,4,6,7,9,10,11,12,13,13,15',
300
+ '*,4,6,7,9,10,12,12,13,13,15',
301
+ '*,4,6,7,10,10,12,12,13,14,15',
302
+ '*,4,6,8,10,10,12,12,13,15,15',
303
+ # 51
304
+ '*,5,7,8,10,10,12,12,13,15,15',
305
+ '*,5,7,8,10,11,12,12,13,15,15',
306
+ '*,5,7,9,10,11,12,12,14,15,15',
307
+ '*,5,7,9,10,11,12,13,14,15,16',
308
+ '*,5,7,10,10,11,12,13,14,16,16',
309
+ '*,5,8,10,10,11,12,13,15,16,16',
310
+ '*,5,8,10,11,11,12,13,15,16,17',
311
+ '*,5,8,10,11,12,12,13,15,16,17',
312
+ '*,5,9,10,11,12,12,14,15,16,17',
313
+ '*,5,9,10,11,12,13,14,15,16,18',
314
+ # 61
315
+ '*,5,9,10,11,12,13,14,16,17,18',
316
+ '*,5,9,10,11,13,13,14,16,17,18',
317
+ '*,5,9,10,11,13,13,15,17,17,18',
318
+ '*,5,9,10,11,13,14,15,17,17,18',
319
+ '*,5,9,10,12,13,14,15,17,18,18',
320
+ '*,5,9,10,12,13,15,15,17,18,19',
321
+ '*,5,9,10,12,13,15,16,17,19,19',
322
+ '*,5,9,10,12,14,15,16,17,19,19',
323
+ '*,5,9,10,12,14,16,16,17,19,19',
324
+ '*,5,9,10,12,14,16,17,18,19,19',
325
+ # 71
326
+ '*,5,9,10,13,14,16,17,18,19,20',
327
+ '*,5,9,10,13,15,16,17,18,19,20',
328
+ '*,5,9,10,13,15,16,17,19,20,21',
329
+ '*,6,9,10,13,15,16,18,19,20,21',
330
+ '*,6,9,10,13,16,16,18,19,20,21',
331
+ '*,6,9,10,13,16,17,18,19,20,21',
332
+ '*,6,9,10,13,16,17,18,20,21,22',
333
+ '*,6,9,10,13,16,17,19,20,22,23',
334
+ '*,6,9,10,13,16,18,19,20,22,23',
335
+ '*,6,9,10,13,16,18,20,21,22,23',
336
+ # 81
337
+ '*,6,9,10,13,17,18,20,21,22,23',
338
+ '*,6,9,10,14,17,18,20,21,22,24',
339
+ '*,6,9,11,14,17,18,20,21,23,24',
340
+ '*,6,9,11,14,17,19,20,21,23,24',
341
+ '*,6,9,11,14,17,19,21,22,23,24',
342
+ '*,7,10,11,14,17,19,21,22,23,25',
343
+ '*,7,10,12,14,17,19,21,22,24,25',
344
+ '*,7,10,12,14,18,19,21,22,24,25',
345
+ '*,7,10,12,15,18,19,21,22,24,26',
346
+ '*,7,10,12,15,18,19,21,23,25,26',
347
+ # 91
348
+ '*,7,11,13,15,18,19,21,23,25,26',
349
+ '*,7,11,13,15,18,20,21,23,25,27',
350
+ '*,8,11,13,15,18,20,22,23,25,27',
351
+ '*,8,11,13,16,18,20,22,23,25,28',
352
+ '*,8,11,14,16,18,20,22,23,26,28',
353
+ '*,8,11,14,16,19,20,22,23,26,28',
354
+ '*,8,12,14,16,19,20,22,24,26,28',
355
+ '*,8,12,15,16,19,20,22,24,27,28',
356
+ '*,8,12,15,17,19,20,22,24,27,29',
357
+ '*,8,12,15,18,19,20,22,24,27,30',
358
+ ]
359
+
360
+ return rate_sw2_0
361
+ end
362
+
363
+ def getNewRates(rate_sw2_0)
364
+ rate_3 = []
365
+ rate_4 = []
366
+ rate_5 = []
367
+ rate_6 = []
368
+ rate_7 = []
369
+ rate_8 = []
370
+ rate_9 = []
371
+ rate_10 = []
372
+ rate_11 = []
373
+ rate_12 = []
374
+ zeroArray = []
375
+
376
+ rate_sw2_0.each do |rateText|
377
+ rate_arr = rateText.split(/,/)
378
+ zeroArray.push(0)
379
+ rate_3.push(rate_arr[1].to_i)
380
+ rate_4.push(rate_arr[2].to_i)
381
+ rate_5.push(rate_arr[3].to_i)
382
+ rate_6.push(rate_arr[4].to_i)
383
+ rate_7.push(rate_arr[5].to_i)
384
+ rate_8.push(rate_arr[6].to_i)
385
+ rate_9.push(rate_arr[7].to_i)
386
+ rate_10.push(rate_arr[8].to_i)
387
+ rate_11.push(rate_arr[9].to_i)
388
+ rate_12.push(rate_arr[10].to_i)
389
+ end
390
+
391
+ if @rating_table == 1
392
+ # 完全版準拠に差し替え
393
+ rate_12[31] = rate_12[32] = rate_12[33] = 10
394
+ end
395
+
396
+ newRates = [zeroArray, zeroArray, zeroArray, rate_3, rate_4, rate_5, rate_6, rate_7, rate_8, rate_9, rate_10, rate_11, rate_12]
397
+
398
+ return newRates
399
+ end
400
+
401
+ def rollDice(_values)
402
+ dice_list = @randomizer.roll_barabara(2, 6)
403
+ total = dice_list.sum()
404
+ dice_str = dice_list.join(",")
405
+ return total, dice_str
406
+ end
407
+
408
+ # @param rating_total [Integer]
409
+ # @param modifier [Integer]
410
+ # @param diceResults [Array<String>]
411
+ # @param diceResultTotals [Array<String>]
412
+ # @param rateResults [Array<String>]
413
+ # @param dice_total [Integer]
414
+ # @param round [Integer]
415
+ # @param half [Boolean]
416
+ def getResultText(rating_total, modifier, diceResults, diceResultTotals,
417
+ rateResults, dice_total, round, half)
418
+ sequence = []
419
+
420
+ sequence.push("2D:[#{diceResults.join(' ')}]=#{diceResultTotals.join(',')}")
421
+
422
+ if dice_total <= 2
423
+ sequence.push(rateResults.join(','))
424
+ sequence.push("自動的失敗")
425
+ return sequence.join(" > ")
426
+ end
427
+
428
+ # rate回数が1回で、修正値がない時には途中式と最終結果が一致するので、途中式を省略する
429
+ if rateResults.size > 1 || modifier != 0
430
+ text = rateResults.join(',') + Format.modifier(modifier)
431
+ if half
432
+ text = "(#{text})/2"
433
+ end
434
+ sequence.push(text)
435
+ elsif half
436
+ sequence.push("#{rateResults.first}/2")
437
+ end
438
+
439
+ if round > 1
440
+ round_text = "#{round - 1}回転"
441
+ sequence.push(round_text)
442
+ end
443
+
444
+ total = rating_total + modifier
445
+ if half
446
+ total = (total / 2.0).ceil
447
+ end
448
+
449
+ total_text = total.to_s
450
+ sequence.push(total_text)
451
+
452
+ return sequence.join(" > ")
453
+ end
454
+
455
+ def setRatingTable(tnick)
456
+ mode_str = ""
457
+ pre_mode = @rating_table
458
+
459
+ if /(\d+)/ =~ tnick
460
+ @rating_table = Regexp.last_match(1).to_i
461
+ if @rating_table > 1
462
+ mode_str = "2.0-mode"
463
+ @rating_table = 2
464
+ elsif @rating_table > 0
465
+ mode_str = "new-mode"
466
+ @rating_table = 1
467
+ else
468
+ mode_str = "old-mode"
469
+ @rating_table = 0
470
+ end
471
+ else
472
+ case tnick
473
+ when /old/i
474
+ @rating_table = 0
475
+ mode_str = "old-mode"
476
+ when /new/i
477
+ @rating_table = 1
478
+ mode_str = "new-mode"
479
+ when /2\.0/i
480
+ @rating_table = 2
481
+ mode_str = "2.0-mode"
482
+ end
483
+ end
484
+
485
+ return '1' if @rating_table == pre_mode
486
+
487
+ return "RatingTableを#{mode_str}に変更しました"
488
+ end
489
+ end
490
+ end
491
+ end