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,72 @@
1
+ # ゲームシステム名の読みがなの設定方法
2
+
3
+ BCDice Ver2.04.00から、各ダイスボットにゲームシステム名の読みがなを設定することが必要となりました。
4
+ これは、ダイスボットを自然な順序で並び替えることを目的としています。
5
+ この文書では、ゲームシステム名の読みがなの設定方法について説明します。
6
+
7
+ ## 読みがなを定義する場所
8
+
9
+ ダイスボットのクラスに `SORT_KEY` という定数を作り、読み仮名を定義します。
10
+
11
+ ```ruby
12
+ class KariDice < DiceBot
13
+ # ...
14
+
15
+ # ゲームシステム名の読みがな
16
+ SORT_KEY = 'かりたいす'
17
+
18
+ # ...
19
+ end
20
+ ```
21
+
22
+ ## 読みがな設定の指針
23
+
24
+ 以下のルールを参考にして、読みがなを設定してください。
25
+
26
+ * JIS X 4061(後述)に沿って表記する。
27
+ * 副題に類する部分は省略する。
28
+ * 例:心衝想機TRPGアルトレイズ → あるとれいす
29
+ * 発音する記号は発音に合わせて表記する。
30
+ * 例:ダンジョンズ&ドラゴンズ → たんしよんす**あんと**とらこんす
31
+ * 空白や発音しない記号(中点 `・` など)は省略する。
32
+ * 例:ダイス・オブ・ザ・デッド → たいすおふさてつと
33
+ * 例:セブン=フォートレス メビウス → せふんふおおとれすめひうす
34
+ * 例外:小数点 `.` は省略しない。
35
+ * 例:ソードワールド2.0 → そおとわあると2.0
36
+ * 略語として使われているアルファベットは、半角アルファベットで表記する
37
+ * 例:艦これRPG → かんこれRPG
38
+ * 例:剣の街の異邦人TRPG → けんのまちのいほうしんTRPG
39
+ * 数は半角アラビア数字(`0`、`1`、…、`9`)で表記する。
40
+ * 版数はアラビア数字のみで代表し、表記する。
41
+ * 例:シャドウラン第4版 → `しやとうらん4`
42
+ * 日本語以外のゲームシステムの場合、`国際化:[言語名英語]:[システム名訳]` の形式とする。
43
+ * 例:克蘇魯神話(中国語繁体字版クトゥルフ神話TRPG) → 国際化:Chinese Traditional:克蘇魯神話
44
+
45
+ ### JIS X 4061とは
46
+
47
+ JIS X 4061とは、日本語の文字列の並び替えの順序についての規格です。
48
+ ここでは、読みがなの導出においてよく使われるルールのみを簡単に説明します。
49
+ 詳しくは、Wikipedia「[日本語文字列照合順番](https://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E8%AA%9E%E6%96%87%E5%AD%97%E5%88%97%E7%85%A7%E5%90%88%E9%A0%86%E7%95%AA)」を参照してください。
50
+
51
+ 1. 読みがなをひらがなで書く。
52
+ 2. 清音文字でない文字を清音文字に置き換える。
53
+ * 小書き文字:「ぁ」「っ」「ゃ」など → 「あ」「つ」「や」など
54
+ * 濁点付き文字:「が」「ば」など → 「か」「は」など
55
+ * 半濁点付き文字:「ぱ」「ぴ」など → 「は」「ひ」など
56
+ 3. 長音符「ー」を、直前の母音で置き換える。
57
+ * 前の文字が「あ」「か」「さ」「た」「な」「は」「ま」「や」「ら」「わ」→「あ」
58
+ * 前の文字が「い」「き」「し」「ち」「に」「ひ」「み」「り」「ゐ」→「い」
59
+ * 前の文字が「う」「く」「す」「つ」「ぬ」「ふ」「む」「ゆ」「る」→「う」
60
+ * 前の文字が「え」「け」「せ」「て」「ね」「へ」「め」「れ」「ゑ」→「え」
61
+ * 前の文字が「お」「こ」「そ」「と」「の」「ほ」「も」「よ」「ろ」「を」→「お」
62
+ * 例外:前の文字が「ん」→「ん」
63
+
64
+ 以下に読みがなの導出例を示します。
65
+
66
+ * パラサイトブラッド → はらさいとふらつと
67
+ * 手順1:ぱらさいとぶらっど
68
+ * 手順2:はらさいとふらつと
69
+ * エースキラージーン → ええすきらあしいん
70
+ * 手順1:えーすきらーじーん
71
+ * 手順2:えーすきらーしーん
72
+ * 手順3:ええすきらあしいん
@@ -0,0 +1,453 @@
1
+ # ダイスボットのつくりかた
2
+
3
+ ## 概要
4
+
5
+ ここでは「どどんとふ」のダイスボットを自作してみたい人用に具体的な手順について記述しています。
6
+
7
+
8
+ ## そもそもダイスボットって何?
9
+
10
+ 「ダイス+ロボット」でダイスボット。
11
+ 元々はチャットソフトでダイスを振ってくれるロボットの様なツールを指す言葉ですね。
12
+ どどんとふではそのネーミングを引き継いでゲーム用のダイステキストを処理する機能を「ダイスボット」と呼んでいます。
13
+
14
+
15
+ ## ダイスボットの自作って?
16
+
17
+ どどんとふで遊ぼうと思ったゲームがダイスボットの一覧に無い。
18
+ そんな時にどうするか?
19
+
20
+ 作者に頼むのもモチロンいいですね。
21
+
22
+ でも、超マイナールールだったり自作TRPGだったり、あるいは単純にプログラミングってのが楽しそうだったり。
23
+ 色んな理由で自分で作りたくなる時ってのはあるものです。
24
+ そんなダイスボットの自作が出来ちゃうのがどどんとふの魅力の一つ。
25
+ オープンソースの素晴らしさというわけですね。
26
+
27
+ どどんとふのダイスボットは「Ruby」というプログラミング言語でソースコードを書くことで追加・変更することができます。
28
+ 「うっはープログラミングとかサッパリだわー」という人は、流石にこの先は読まなくてもOKです。
29
+
30
+ 「Ruby!いいね!俺大好きなんだよ!」なんて酔狂な方はもちろんウェルカム!
31
+ でもここでは、どちらかというと「Rubyかー、この機会にちょっと勉強してみようかな?」という方向けに説明を進めていきます。
32
+
33
+
34
+ ## 環境の用意
35
+
36
+ それではWindows環境向けにダイスボットを自作するための手順を説明していきましょう。
37
+ (Unix系OSの人なら当然Rubyはインストール済みと信じて説明は割愛。)
38
+
39
+ ダイスボットの作成のためにはWindows用のRuby実行環境を作成する必要があります。
40
+ [RubyInstaller](https://rubyinstaller.org/)の「Download」ページから、 `Ruby+Devkit 2.X.X-X (x64)` (Xは任意の数字)をダウンロードします。
41
+
42
+ あとは、インストーラーの指示に従ってインストール。
43
+ そしてインストールディレクトリの bin にパスを通します。(パスを通す、の意味が知らない人はネットで検索だ!)
44
+ Ruby 2.6.5のデフォルトだと `C:\Ruby26-x64\bin` ですかね。
45
+ ruby.exe のある場所にパスを通すのがポイントです。
46
+ 後はコマンドプロンプト開いて(コマンドプロンプト、の意味が分からない人はネットで(略))、
47
+
48
+ ```
49
+ ruby -v
50
+ ```
51
+
52
+ とコマンドを実行して、Rubyのバージョン情報が表示されればOKです。
53
+ 準備万端。それではダイスボットを作っていきましょう!
54
+
55
+
56
+ ## 自作ダイスボットの作り方:その1 名前大事!
57
+
58
+ 今回サンプルとして作るダイスボット用に架空のゲームシステムがあるとしましょう。
59
+
60
+ ```
61
+ タイトル
62
+ 仮ダイス
63
+
64
+ 判定方法
65
+ 6面ダイスをX個振るシステム。
66
+ 判定コマンドは KDx>=y(xはダイスロール数、yは目標値)
67
+ ```
68
+
69
+ これをダイスボットで実装する方法を考えて行きましょう。
70
+
71
+ まずは `src/diceBot` ディレクトリを開きます。
72
+ その中に `_Template.rb` という名前のファイルがあります。
73
+
74
+ テンプレート、TRPGでもよく使われる単語ですね。
75
+ 要は「ひな型」って意味でして、それをもとに作れば1から作るよりも楽だよーってニュアンスですね。
76
+ ではでは、そのニュアンスを信じて `_Template.rb` ファイルを元に作ってみましょう。
77
+ `_Template.rb` ファイルをコピーして、今回のゲーム用のタイトルをファイル名に付けましょう。
78
+ タイトルが「仮ダイス」ですから
79
+
80
+  **KariDice.rb**
81
+
82
+ ですかね。
83
+ このKariDiceという名前は「ダイスボットの型名」と呼んで他でも使いますので「ファイル名なんてなんでもいいや」とか思わずにしっかり決めてくださいね。
84
+ プログラミングでは命名が何より大事ですので。
85
+ この `KariDice.rb` を以降は編集していきます。
86
+
87
+
88
+ ## 自作ダイスボットの作り方:その2 まずは形から
89
+
90
+ `KariDice.rb` はまだ中身は `_Template.rb` ファイルのままですね。
91
+ この中身をチョイチョイっと書き換えて仮ダイスを実装していきましょう。
92
+ ファイルを開いて、
93
+
94
+ ```ruby
95
+ class Template < DiceBot
96
+ ```
97
+
98
+ ここを、今回のダイスボットは名前が `KariDice` なので
99
+
100
+ ```ruby
101
+ class KariDice < DiceBot
102
+ ```
103
+
104
+ と書き換え。ファイル名の(~.rb)部分と同じにするわけですね。
105
+
106
+ 続いて
107
+
108
+ ```ruby
109
+ # ゲームシステムの識別子
110
+ ID = 'SystemID'
111
+
112
+ # ゲームシステム名
113
+ NAME = 'ゲームシステム名'
114
+
115
+ # ゲームシステム名の読みがな
116
+ SORT_KEY = 'けえむしすてむめい'
117
+ ```
118
+
119
+
120
+
121
+ ```ruby
122
+ # ゲームシステムの識別子
123
+ ID = 'KariDice'
124
+
125
+ # ゲームシステム名
126
+ NAME = '仮ダイス'
127
+
128
+ # ゲームシステム名の読みがな
129
+ SORT_KEY = 'かりたいす'
130
+ ```
131
+
132
+ に変更。
133
+ `ID` ではファイル名と同じ英文字でのファイル名と同じ英文字での型名を、`NAME` では日本語のゲーム名を定義しています。
134
+ また、`SORT_KEY` ではゲーム名の読みがなを定義します。辞書と同じ並び順になるように、濁点を省いたひらがなで設定してください(詳しくは「[ゲームシステム名の読みがなの設定方法](./dicebot_sort_key.md)」を参照)。
135
+
136
+ では書き間違いがないか、念のため `KariDice.rb` の置いてあるディレクトリで
137
+
138
+ ```
139
+ ruby -cw KariDice.rb
140
+ ```
141
+
142
+ とコマンドを実行しましょう。
143
+
144
+ ```
145
+ Syntax OK
146
+ ```
147
+
148
+ と表示されれば問題ありません。
149
+
150
+ エラーが表示される場合はそこに文法間違いがあるので確認しましょう。
151
+ もうこれだけでダイスボットとしての形は整ったことになります!
152
+
153
+
154
+ ## 自作ダイスボットの作り方:その3 テストファースト!
155
+
156
+ では、今回実装する予定の判定コマンドを実装していきましょう。
157
+ 定義はこうでしたね。
158
+
159
+ ```
160
+ 判定方法
161
+ 6面ダイスをX個振るシステム。
162
+ 判定コマンドは KDx>=y(xはダイスロール数、yは目標値)
163
+ ```
164
+
165
+ これを実装するには、
166
+
167
+ ```ruby
168
+ setPrefixes([])
169
+ ```
170
+
171
+
172
+
173
+ ```ruby
174
+ def rollDiceCommand(command)
175
+ ''
176
+ end
177
+ ```
178
+
179
+ の2つのメソッドを書き換えることになります。
180
+ 引数の `command` にダイスボットとして入力した文字列が渡されますので、そこからロールの判定を行い、結果の文字列を戻り値に渡せばOKです。
181
+ では早速実装!
182
+
183
+ …とその前に、動作テストの用意をしましょう。
184
+ どどんとふのダイスボットには、作成時の動作検証がしやすいように動作テスト用の仕組みが用意されています(「ユニットテスト」と呼ばれます)。
185
+ これを活用すればダイスボットが正しく動いているかをどどんとふ上で確認しなくてもよいのでとっても楽です。
186
+ `src` に移動。
187
+ そこにある `test.rb` がテスト用のスクリプト。 そして `test/data/` 配下にあるテキストファイルが全てテスト用のデータです。
188
+
189
+ ここでは例として [Cthulhu.txt](../src/test/data/Cthulhu.txt) を開きましょう。
190
+
191
+ ```
192
+ ============================
193
+ input:
194
+ 1D100<=10
195
+ output:
196
+ Cthulhu : (1D100<=10) > 98 > 致命的失敗
197
+ rand:98/100
198
+ ============================
199
+ input:
200
+ 1D100<=10
201
+ output:
202
+ Cthulhu : (1D100<=10) > 45 > 失敗
203
+ rand:45/100
204
+ ============================
205
+ ```
206
+
207
+
208
+ といった記述が並んでいますね。
209
+ テストデータの書式は
210
+
211
+ ```
212
+ input:
213
+ (テストしたいデータ)
214
+ output:
215
+ (ダイスボットの型名) : (出力される文字列)
216
+ rand:(テストしたいダイスの出目)
217
+ ```
218
+
219
+
220
+ となります。
221
+ また、複数テストデータを記述するときは、データの間を
222
+ ```
223
+ ============================
224
+ ```
225
+ で区切る必要があります。
226
+
227
+ `output` の「(ダイスボットの型名):」はダイスボットの内部で自動的に生成されるので常に必要です。
228
+ 実際に表示される文字を意識したいので、省略はできなくなっています。
229
+ `rand` では `1/6,2/6` のように「(出目)/(ロールするダイス)」を `,` で区切って並べる形で記述します。
230
+ これを使えば3D6で「1, 1, 1」を出すようなパターンでも `1/6,1/6,1/6` と記述してしまえばすぐ検証できるわけですね。便利!
231
+
232
+ 今回は、新しいテストデータファイル `KariDice.txt` を作成してみましょう。
233
+ .rb と同じ名前でテストデータの .txt を作成するわけですね。
234
+
235
+ ```
236
+ input:
237
+ KD3>=10
238
+ output:
239
+ KariDice : (KD3>=10) > 10[2,5,3] > 成功
240
+ rand:2/6,5/6,3/6
241
+ ============================
242
+ input:
243
+ KD3>=10
244
+ output:
245
+ KariDice : (KD3>=10) > 9[1,5,3] > 失敗
246
+ rand:1/6,5/6,3/6
247
+ ```
248
+
249
+ そしてテストの実行。
250
+
251
+ ```
252
+ ruby test.rb KariDice
253
+ ```
254
+
255
+ このコマンドを実行すると、以下のように出力されます。
256
+
257
+ ```
258
+ ruby test.rb KariDice
259
+ XX
260
+
261
+ [Failures]
262
+ Game type: KariDice
263
+ Index: 1
264
+ Input:
265
+ KD3>=10
266
+ Expected:
267
+ KariDice : (KD3>=10) > 10[2,5,3] > 成功
268
+ Result:
269
+ ダイス残り:2/6, 5/6, 3/6
270
+ Rands: 2/6, 5/6, 3/6
271
+ ===========================
272
+ Game type: KariDice
273
+ Index: 2
274
+ Input:
275
+ KD3>=10
276
+ Expected:
277
+ KariDice : (KD3>=10) > 9[1,5,3] > 失敗
278
+ Result:
279
+ ダイス残り:1/6, 5/6, 3/6
280
+ Rands: 1/6, 5/6, 3/6
281
+ ```
282
+
283
+
284
+ これは `xx` と `x` が2つなので「テスト2件に失敗」を示します。成功なら `..` となって、「OK」が表示されます。
285
+ ここでは判定成功時と失敗時の2件の動作を確認して、両方に失敗したということですね。
286
+ 早く「OK」が表示されるのが楽しみですね!
287
+
288
+ 以後は「ソースコードを変更したらテストを実行して動作を確認」、
289
+ 新しい実装をする時には「先にテストデータを作って、動作確認」を繰り返すことになります。
290
+ 「テスト→実装→テスト→実装→…」の順ですね。
291
+
292
+ ちなみに、こうやって先にテストを作ってからプログラムを作成する方法を「テストファースト」って呼んだりします。
293
+ ぜひ実践していきましょう!
294
+
295
+
296
+ ## 自作ダイスボットの作り方:その4 そして実装
297
+
298
+ 準備もできたので、ダイスボットの実装を。
299
+
300
+ まずはコマンドを `setPrefixes` で定義して、どどんとふに教えてやる必要があります。**忘れがちなので注意!**
301
+
302
+ ```ruby
303
+ setPrefixes(['KD\d+>=\d+'])
304
+ ```
305
+
306
+ ポイントは、文字列を `" "` ではなく `' '` で囲むことです。
307
+ こうしないと `d` が `\` 文字でエスケープされてしまい、`\d` という文字列にならないのですね。
308
+ 正規表現相当の文字をここで文字列として定義してRubyとActionScript両方で使っているので、扱いにクセがあります。
309
+ 分かりにくい場合は、今後の拡張性も考えて
310
+ `setPrefixes(['KD.\*'])`
311
+ みたいに手を抜いた記述にしてしまうのも手です。
312
+ とりあえず動かしてみたいですしね。
313
+ 次にコマンドの判定部分を実装。
314
+
315
+ ```ruby
316
+ def rollDiceCommand(command)
317
+ debug("rollDiceCommand Begin")
318
+
319
+ m = /^KD(\d+)>=(\d+)$/.match(command)
320
+ unless m
321
+ return ''
322
+ end
323
+
324
+ debug("command", command)
325
+
326
+ diceCount = m[1].to_i
327
+ target = m[2].to_i
328
+
329
+ total, diceText, _ = roll(diceCount, 6)
330
+ result = (total >= target ? "成功" : "失敗")
331
+
332
+ debug("rollDiceCommand result")
333
+
334
+ return "(#{command}) > #{total}[#{diceText}] > #{result}"
335
+ end
336
+ ```
337
+
338
+ これで成否判定は実装完了。
339
+ rollメソッドはDiceBotクラスで実装済みのメソッドで、
340
+
341
+ ```
342
+ 合計, ダイスの文字列, [その他のデータ] = roll(ダイス数, ダイス種別)
343
+ ```
344
+
345
+ みたいに使います。今回は `[その他のデータ]` は使わないので省略して
346
+
347
+ ```
348
+ 合計, ダイスの文字列, _ =
349
+ ```
350
+
351
+ となっています。 `=` の直前に `, _` があるのがポイントです。
352
+ この書き方で `[その他のデータ]` は無視するよーって宣言しているわけですね。
353
+ あと、
354
+
355
+ ```ruby
356
+  debug("rollDiceCommand Begin")
357
+ ```
358
+
359
+ と書いている箇所はデバッグ用の文字列です。
360
+ さっきテストを実行したときに
361
+
362
+ ```
363
+ Index: 1
364
+ ```
365
+
366
+ みたいな表示がありましたが、ここにあるIndexというのはテストの通番でして、
367
+
368
+ ```
369
+ ruby test.rb KariDice 1
370
+ ```
371
+
372
+ のようにテスト時にダイスボット名と共にインデックス番号を指定すると、そのテスト1件だけを実行してくれます。
373
+ 特定のテストを詳細に検証する時に使うわけですが、その際にはデバッグ文が出力されるようになります。
374
+
375
+ たとえば、
376
+
377
+ ```
378
+ debug("command", command)
379
+ ```
380
+
381
+ と書くと
382
+
383
+ ```
384
+ command : "KD3>=10"
385
+ ```
386
+
387
+ みたいにデバッグ文が出力されるので読みやすく検証に便利です。
388
+ つまりテストでは
389
+
390
+ ```
391
+ ruby test.rb (ダイスボット名)
392
+ ```
393
+
394
+ で全体を確認しつつ、失敗パターンをピックアップ確認したいときは
395
+
396
+ ```
397
+ ruby test.rb (ダイスボット名) (インデックス番号)
398
+ ```
399
+
400
+ で実行。これがテストの王道ということですね。
401
+
402
+ あ、ちなみに
403
+
404
+ ```
405
+ ruby test.rb
406
+ ```
407
+
408
+ だけなら全ダイスボットのテストが実行されます。
409
+ 最後の最後に試しておくと、他に影響を与えていないことが確認できて安心です。
410
+
411
+ さてさて、では先ほど提示した内容を実装してテストしてみましょう。
412
+
413
+ ```
414
+ ruby test.rb KariDice
415
+ ..
416
+ OK.
417
+ ```
418
+
419
+ 「OK」が表示されました!やったね!!
420
+
421
+
422
+ ## 自作ではなく、拡張する場合の注意点
423
+
424
+ ダイスボットを自作するのではなく、既存のダイスボットを拡張する、という方も多いでしょう。
425
+ その場合も、基本的には同じ手順で大丈夫です。
426
+ ただ、ここでひとつ注意が必要となるのが「後方互換性」について。
427
+
428
+ 「どどんとふ」では過去のバージョンとの互換性を何よりも重視しています。
429
+ オンセ用に作った自キャラ用のダイスボットのコマンドがある日急に使えなくなる、というのは最も避けたい事態ですね。
430
+ なので、コマンドや機能を拡張する場合には既存の機能を変更しないのが大事です。
431
+ これが「後方互換性」です。
432
+
433
+ もちろん、オリジナルのダイスボットを作る場合や、個人的に拡張する場合には自由に作ってOKですが、
434
+ 「完成したら公式にも送ろう…」なんて素晴らしいことを考えている方は注意していただければと思います。
435
+
436
+
437
+ ## 終わりに
438
+
439
+ ここまでできれば、後は同じことの繰り返しでダイスボットを実装できます。
440
+
441
+ まとめると
442
+
443
+ 1. テストファーストでテスト作成し失敗することを確認。
444
+ 2. コードを実装、テスト。
445
+ 3. うまく動かなかったらインデックス指定しデバッグ表示で内容確認。
446
+ 4. OKが表示されたら祝杯!
447
+
448
+ こんな感じですね。
449
+
450
+ テストデータの作成にはパターンの網羅や以上・以下の閾値確認など色々ポイントがあるんですが、
451
+ それ書き出すとまた長文になりそうなので各自で工夫してみてくださいね。
452
+
453
+ ではでは!