bcdice 3.0.0.pre.alpha.1

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 (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