Kotlin/JavaでBCDiceを動かす

# Kotlin/JavaでBCDiceを動かす
## BCDiceとは
> 日本で最も使われている、TRPG用ダイスロール処理システムです。どどんとふ、ココフォリア、ユドナリウム、TRPGスタジオなど様々なオンセツールで使われています。
> https://bcdice.org/ からの引用
## Kotlin/JavaからBCDiceを用いる方法
### 1. APIサーバーを使用した方法
BCDiceには公式からbcdice-apiというWebサーバーが公開されています。

https://github.com/bcdice/bcdice-api

自分でホストすることもできますし、有志によって維持/管理されているサーバーもあります。

https://api-status.bcdice.org/

Kotlin/JavaからもこれらのAPIサーバーにアクセスすることで、BCDiceを用いることができます。

### 2. bcdice-ktを用いる
今回の本題はこのbcdice-ktを用いる方法です。
これは私が学生時代にDiscordBot用に作成したもので、APIサーバーに依存せずにBCDiceを用いることができます。

https://github.com/simple-timer/bcdice-kt

## bcdice-kt
### Gradle・Maven
GradleとMavenなどのパッケージマネージャーを用いることで使用できます。
#### Gradle
```gradle
repositories {
    maven { url 'https://jitpack.io' }
}

dependencies {
    implementation 'com.github.simple-timer:bcdice-kt:VERSION'
}
```
#### Maven
```xml
<repositories>
    <repository>
        <id>jitpack.io</id>
        <url>https://jitpack.io</url>
    </repository>
</repositories>

<dependency>
    <groupId>com.github.simple-timer</groupId>
    <artifactId>bcdice-kt</artifactId>
    <version>VERSION</version>
</dependency>
```

### 実行時の下準備
bcdice-ktは内部にBCDice本体を内包していません。ですので、**初回起動時はインターネット上からBCDiceをダウンロード/インストールする必要があります**。すでにダウンロードされている場合、それ以降はインターネットに接続されている必要がありません。
インストールの確認後、`setup()`で初期化処理を行います。

#### Kotlin

```java
val bcdice = BCDice()

//動作に必要なファイルがインストールされているかを確認
if (!bcdice.wasInstalled()) {
    //インストール
    bcdice.install()
}

//ゲームシステム読み込みなどのセットアップを行う
bcdice.setup()
```

#### Java

```java
BCDice bcdice = new BCDice();

//動作に必要なファイルがインストールされているかを確認
if(!bcdice.wasInstalled()){
//インストール
    bcdice.install();
}

//ゲームシステム読み込みなどのセットアップを行う
bcdice.setup();
```

### ダイスロール
ダイスロールを行うには、ゲームシステムを指定する必要があります。
ゲームシステムの一覧は、公式の**対応ゲームシステム一覧**をご覧ください。

https://bcdice.org/systems/

#### Kotlin

```kotlin
/*
実行時の下準備をあらかじめ行う
 */


//ゲームシステムを取得
val gameSystem = bcdice.getGameSystem("Cthulhu7th")

val result = gameSystem.roll("CC+1")
println(result.text) //結果のテキスト
```

#### Java

```java
/*
実行時の下準備をあらかじめ行う
 */


//ゲームシステムを取得
GameSystem gameSystem = bcdice.getGameSystem("Cthulhu7th");

GameSystem.DiceResult result = gameSystem.roll("CC+1");
System.out.println(result.getText()); //結果のテキスト
```

### オリジナル表

オリジナル表にも対応しています。

https://docs.bcdice.org/original_table.html

#### Kotlin

```kotlin
/*
実行時の下準備をあらかじめ行う
 */


//テーブルのデータをテキストで作成
val text = """
    飲み物表
    1D6
    1:水
    2:緑茶
    3:麦茶
    4:コーラ
    5:オレンジジュース
    6:選ばれし者の知的飲料
""".trimIndent()

val result = bcdice.rollOriginalTable(text)
println(result.text) //結果のテキスト
```
```kotlin
/*
実行時の下準備をあらかじめ行う
 */


//テーブルのデータをTableDataとして作成
val tableData = OriginalTable.TableData(
    "飲み物表",
    "1D6", 
    mapOf(
        1 to "水",
        2 to "緑茶",
        3 to "麦茶",
        4 to "コーラ",
        5 to "オレンジジュース",
        6 to "選ばれし者の知的飲料"
    )
)

val result = bcdice.rollOriginalTable(tableData)
println(result.text) //結果のテキスト
```

#### Java

```java
/*
実行時の下準備をあらかじめ行う
 */


//テーブルのデータをテキストで作成
String text = """
飲み物表
1D6
1:水
2:緑茶
3:麦茶
4:コーラ
5:オレンジジュース
6:選ばれし者の知的飲料
""";

Result result = bcdice.rollOriginalTable(text);
System.out.println(result.getText()); //結果のテキスト
```
```java
/*
実行時の下準備をあらかじめ行う
 */


//テーブルのデータをTableDataとして作成
OriginalTable.TableData tableData = new OriginalTable.TableData(
    "飲み物表",
    "1D6",
    Map.of(
        1, "水",
        2, "緑茶",
        3, "麦茶",
        4, "コーラ",
        5, "オレンジジュース",
        6, "選ばれし者の知的飲料"
    )
);

//テーブルを作成
Result result = bcdice.rollOriginalTable(tableData);
System.out.println(result.getText()); //結果のテキスト
```