Skip to content

Instantly share code, notes, and snippets.

@ysakasin
Last active February 5, 2024 07:50
Show Gist options
  • Save ysakasin/567e44da06fe879a36536b0ee2049b9a to your computer and use it in GitHub Desktop.
Save ysakasin/567e44da06fe879a36536b0ee2049b9a to your computer and use it in GitHub Desktop.

Charaeno 開発者向け情報

Charaenoでは登録された探索者の情報を取得できるWeb APIを公開しています。本ドキュメントではその仕様を解説します。

支援のおねがい

GitHub Sponsors にて定期的な金銭的支援をしてくださるスポンサーを募集しています。ご支援いただけましたら幸いです。

https://github.com/sponsors/ysakasin

公開API一覧

APIには全てGETメソッドでアクセスします。

エンドポイント 概要
/api/v1/7th/{id}/summary 新クトゥルフ神話TRPGの探索者シートの要約
/api/v1/6th/{id}/summary クトゥルフ神話TRPGの探索者シートの要約

IDについて

Charaenoでは全ての探索者にIDが自動で割り当てられ、https://charaeno.com/7th/{id}のようにして閲覧できます。IDは21文字の英数記号(A-Za-z0-9_-)からなる文字列です。これはNano IDというUUID v4に似た、より高性能な乱数により生成されるIDです。

/api/v1/7th/{id}/summary

新クトゥルフ神話TRPGの探索者シートの要約をJSONで返却します。

出力例

https://charaeno.com/api/v1/7th/h_wQNXeiHPXDEDtG3r2ac/summary

{
  "name": "大宮 龍馬",
  "occupation": "学芸員",
  "age": "25",
  "sex": "男",
  "residence": "",
  "birthplace": "",
  "characteristics": {
    "str": 85,
    "con": 40,
    "pow": 60,
    "dex": 45,
    "app": 50,
    "siz": 70,
    "int": 65,
    "edu": 70
  },
  "attribute": {
    "hp": 11,
    "mp": 12,
    "mov": 8,
    "build": 1,
    "db": "+1D4",
    "san": {
      "value": 65,
      "max": 99
    },
    "luck": 78
  },
  "skills": [
    {
      "name": "威圧",
      "value": 15,
      "edited": false
    },
    {
      "name": "言いくるめ",
      "value": 5,
      "edited": false
    },
    {
      "name": "医学",
      "value": 1,
      "edited": false
    },
    {
      "name": "運転(自動車)",
      "value": 20,
      "edited": false
    },
    {
      "name": "運転()",
      "value": 20,
      "edited": false
    },
    {
      "name": "応急手当",
      "value": 30,
      "edited": false
    },
    {
      "name": "オカルト",
      "value": 55,
      "edited": true
    },
    {
      "name": "隠密",
      "value": 50,
      "edited": false
    },
    {
      "name": "回避",
      "value": 22,
      "edited": false
    },
    {
      "name": "科学()",
      "value": 1,
      "edited": false
    },
    {
      "name": "鍵開け",
      "value": 1,
      "edited": false
    },
    {
      "name": "鑑定",
      "value": 5,
      "edited": false
    },
    {
      "name": "機械修理",
      "value": 10,
      "edited": false
    },
    {
      "name": "聞き耳",
      "value": 20,
      "edited": false
    },
    {
      "name": "近接戦闘(格闘)",
      "value": 40,
      "edited": true
    },
    {
      "name": "近接戦闘()",
      "value": 0,
      "edited": false
    },
    {
      "name": "クトゥルフ神話",
      "value": 0,
      "edited": false
    },
    {
      "name": "芸術/制作()",
      "value": 5,
      "edited": false
    },
    {
      "name": "経理",
      "value": 5,
      "edited": false
    },
    {
      "name": "考古学",
      "value": 1,
      "edited": false
    },
    {
      "name": "コンピューター",
      "value": 5,
      "edited": false
    },
    {
      "name": "サバイバル()",
      "value": 10,
      "edited": false
    },
    {
      "name": "自然",
      "value": 10,
      "edited": false
    },
    {
      "name": "射撃(拳銃)",
      "value": 20,
      "edited": false
    },
    {
      "name": "射撃(ライフル/ショットガン)",
      "value": 25,
      "edited": false
    },
    {
      "name": "射撃(弓)",
      "value": 50,
      "edited": true
    },
    {
      "name": "重機械操作",
      "value": 1,
      "edited": false
    },
    {
      "name": "信用",
      "value": 40,
      "edited": true
    },
    {
      "name": "心理学",
      "value": 10,
      "edited": false
    },
    {
      "name": "人類学",
      "value": 76,
      "edited": true
    },
    {
      "name": "水泳",
      "value": 20,
      "edited": false
    },
    {
      "name": "精神分析",
      "value": 1,
      "edited": false
    },
    {
      "name": "説得",
      "value": 10,
      "edited": false
    },
    {
      "name": "操縦()",
      "value": 1,
      "edited": false
    },
    {
      "name": "跳躍",
      "value": 20,
      "edited": false
    },
    {
      "name": "追跡",
      "value": 10,
      "edited": false
    },
    {
      "name": "手さばき",
      "value": 10,
      "edited": false
    },
    {
      "name": "電気修理",
      "value": 10,
      "edited": false
    },
    {
      "name": "電子工学",
      "value": 1,
      "edited": false
    },
    {
      "name": "投擲",
      "value": 20,
      "edited": false
    },
    {
      "name": "登攀",
      "value": 20,
      "edited": false
    },
    {
      "name": "図書館",
      "value": 82,
      "edited": true
    },
    {
      "name": "ナビゲート",
      "value": 10,
      "edited": false
    },
    {
      "name": "変装",
      "value": 5,
      "edited": false
    },
    {
      "name": "法律",
      "value": 5,
      "edited": false
    },
    {
      "name": "ほかの言語()",
      "value": 1,
      "edited": false
    },
    {
      "name": "母国語(日本語)",
      "value": 70,
      "edited": false
    },
    {
      "name": "魅惑",
      "value": 15,
      "edited": false
    },
    {
      "name": "目星",
      "value": 56,
      "edited": true
    },
    {
      "name": "歴史",
      "value": 35,
      "edited": true
    },
    {
      "name": "伝承(馬)",
      "value": 31,
      "edited": true
    },
    {
      "name": "乗馬",
      "value": 60,
      "edited": true
    }
  ],
  "possessions": [
    {
      "name": "財布",
      "count": "",
      "detail": ""
    }
  ],
  "weapons": [
    {
      "name": "素手",
      "value": "25",
      "damage": "1D3+DB",
      "range": "",
      "attacks": "",
      "ammo": "",
      "malfunction": ""
    }
  ],
  "credit": {
    "spendingLevel": "2万円",
    "cash": "16万円",
    "assetsDetails": "400万円"
  },
  "backstory": [
    {
      "name": "容姿の描写",
      "entries": [
        {
          "text": "肩幅が広く、流鏑馬の経験などから上半身は非常によく鍛えられているが、下半身のトレーニングはおざなりで歪な体格をしている。"
        }
      ]
    },
    {
      "name": "イデオロギー/信念",
      "entries": [
        {
          "text": "人間と多くの動物には不思議な縁がある。それを証明するために興味深い逸話や神話を収集し、分析し、世に広める。",
          "keyConnection": true
        }
      ]
    },
    {
      "name": "重要な人々",
      "entries": [
        {
          "text": "祖父、大宮 禅一。馬に関する逸話、神話をいつも話してくれた。そして馬との上手な付き合い方、馬と人間の関係性の素晴らしさを教えてくれた。流鏑馬につても、馬についても最もお手本となる存在。"
        }
      ]
    },
    {
      "name": "意味のある場所",
      "entries": [
        {
          "text": "実家の蔵。先祖と馬に関する膨大な記録が残されており、いまだに目を通しきれていない。訪れるたびに新たな発見がある。"
        }
      ]
    },
    {
      "name": "秘蔵の品",
      "entries": [
        {
          "text": "蹄鉄:実家で共に育った愛馬の蹄鉄。神道としては何の意味もないが、幸運のお守りとして自室のドアに飾っている。"
        }
      ]
    },
    {
      "name": "特徴",
      "entries": [
        {
          "text": "おしゃべり。互いに言葉を使うのだから、馬と比べて人間と心を通じ合わせるのは楽だと思っている。"
        }
      ]
    },
    {
      "name": "負傷、傷跡",
      "entries": []
    },
    {
      "name": "恐怖症、マニア",
      "entries": []
    },
    {
      "name": "魔導書、呪文、アーティファクト",
      "entries": []
    },
    {
      "name": "遭遇した超自然の存在",
      "entries": [
        {
          "text": "ギャア=ヨトン"
        },
        {
          "text": "クン=ヤンの民"
        }
      ]
    }
  ],
  "fellows": [
    {
      "name": "丘 瑠人",
      "url": "https://charaeno.sakasin.net/7th/SrHMXtSovC4nDvjyKmgol"
    }
  ],
  "note": "家は神社。高校生くらいまで流鏑馬をやらされていた。\n\n\n「まあ、馬みたいなもんだよ」「これは…… 馬じゃないね」\n\n\n【通過シナリオ】\n  - 苦難の民は陰界と消ゆ",
  "chatpalette": "1D100<={SAN} 正気度ロール\nCC<=78 幸運\nCC<=85 STR\nCC<=40 CON\nCC<=60 POW\nCC<=45 DEX\nCC<=50 APP\nCC<=70 SIZ\nCC<=65 アイディア\nCC<=70 知識\nCC<=55 オカルト\nCC<=22 回避\nCC<=20 聞き耳\nCC<=40 近接戦闘(格闘)\nCC<=50 射撃(弓)\nCC<=40 信用\nCC<=76 人類学\nCC<=82 図書館\nCC<=70 母国語(日本語)\nCC<=56 目星\nCC<=35 歴史\nCC<=31 伝承(馬)\nCC<=60 乗馬\n1D3+{DB} 素手"
}

TypeScriptによるインターフェース定義

export interface Investigator {
  name: string       // 名前
  occupation: string // 職業
  age: string        // 年齢
  sex: string        // 性別
  residence: string  // 住所
  birthplace: string // 出身

  // 各能力値の現在値
  characteristics: {
    str: number
    con: number
    pow: number
    dex: number
    app: number
    siz: number
    int: number
    edu: number
  }

  // 耐久力等の現在値および最大正気度
  attribute: {
    hp: number    // 耐久力
    mp: number    // マジック・ポイント
    mov: number   // 移動率
    build: number // ビルド
    db: string    // ダメージ・ボーナス。0の場合には "+0" となる
    san: {
      value: number
      max: number
    },
    luck: number
  },

  skills: Array<Skill>
  weapons: Array<Weapon>
  possessions: Array<Possession> // 装備と所持品

  // 収入と財産
  credit: {
    spendingLevel: string
    cash: string
    assetsDetails: string
  }
  backstory: Array<Backstory>
  fellows: Array<Fellow> // 仲間の探索者
  note: string
  chatpalette: string  // チャットパレットに用いるための改行区切りのコマンド一覧
  portraitURL?: string // 探索者プロフィール画像のURL
}


interface Skill {
  name: string
  value: number   // 技能の合計値
  edited: boolean // 技能値が編集されているかどうか。技能の合計値が初期値と異なる場合 true となる
}

interface Weapon {
  name: string        // 名前
  value: string       // 技能値。数値とは限らないことに注意
  damage: string      // ダメージ
  range: string       // 射程
  attacks: string     // 攻撃回数
  ammo: string        // 装弾数
  malfunction: string // 故障ナンバー
}

interface Possession {
  name: string   // 名前
  count: string  // 所持数。数値とは限らないことに注意
  detail: string // 物品の詳細説明
}

interface Backstory {
    name: string
    entries: Array<BackstoryEntry>
}

interface BackstoryEntry {
  text: string
  keyConnection?: boolean // エントリがキーコネクションに指定されていると true となる
}

interface Fellow {
  name: string
  url: string  // 妥当なURLとは限らないことに注意
}

/api/v1/6th/{id}/summary

クトゥルフ神話TRPGの探索者シートの要約をJSONで返却します。

出力例

https://charaeno.com/api/v1/6th/Ot1AbujwN3lYS3zpUP_hE/summary

{
  "name": "試験 ためす",
  "occupation": "試験官",
  "degree": "博士(試験)",
  "birthplace": "",
  "mentalDisorder": "",
  "age": "",
  "sex": "",
  "characteristics": {
    "str": 10,
    "con": 10,
    "pow": 10,
    "dex": 10,
    "app": 10,
    "siz": 10,
    "int": 18,
    "edu": 21
  },
  "attribute": {
    "hp": 10,
    "mp": 10,
    "db": "+0",
    "san": {
      "value": 50,
      "max": 99
    }
  },
  "skills": [
    {
      "name": "言いくるめ",
      "value": 5,
      "edited": false
    },
    {
      "name": "医学",
      "value": 55,
      "edited": true
    },
    {
      "name": "運転(自動車)",
      "value": 20,
      "edited": false
    },
    {
      "name": "運転()",
      "value": 20,
      "edited": false
    },
    {
      "name": "応急手当",
      "value": 30,
      "edited": false
    },
    {
      "name": "オカルト",
      "value": 5,
      "edited": false
    },
    {
      "name": "回避",
      "value": 20,
      "edited": false
    },
    {
      "name": "化学",
      "value": 1,
      "edited": false
    },
    {
      "name": "鍵開け",
      "value": 1,
      "edited": false
    },
    {
      "name": "隠す",
      "value": 15,
      "edited": false
    },
    {
      "name": "隠れる",
      "value": 10,
      "edited": false
    },
    {
      "name": "機械修理",
      "value": 20,
      "edited": false
    },
    {
      "name": "聞き耳",
      "value": 25,
      "edited": false
    },
    {
      "name": "クトゥルフ神話",
      "value": 0,
      "edited": false
    },
    {
      "name": "芸術()",
      "value": 5,
      "edited": false
    },
    {
      "name": "経理",
      "value": 60,
      "edited": true
    },
    {
      "name": "考古学",
      "value": 1,
      "edited": false
    },
    {
      "name": "忍び歩き",
      "value": 10,
      "edited": false
    },
    {
      "name": "写真術",
      "value": 10,
      "edited": false
    },
    {
      "name": "重機械操作",
      "value": 1,
      "edited": false
    },
    {
      "name": "乗馬",
      "value": 5,
      "edited": false
    },
    {
      "name": "信用",
      "value": 15,
      "edited": false
    },
    {
      "name": "心理学",
      "value": 25,
      "edited": true
    },
    {
      "name": "人類学",
      "value": 1,
      "edited": false
    },
    {
      "name": "水泳",
      "value": 25,
      "edited": false
    },
    {
      "name": "制作()",
      "value": 5,
      "edited": false
    },
    {
      "name": "精神分析",
      "value": 1,
      "edited": false
    },
    {
      "name": "生物学",
      "value": 1,
      "edited": false
    },
    {
      "name": "説得",
      "value": 15,
      "edited": false
    },
    {
      "name": "操縦()",
      "value": 1,
      "edited": false
    },
    {
      "name": "地質学",
      "value": 1,
      "edited": false
    },
    {
      "name": "跳躍",
      "value": 25,
      "edited": false
    },
    {
      "name": "追跡",
      "value": 10,
      "edited": false
    },
    {
      "name": "電気修理",
      "value": 10,
      "edited": false
    },
    {
      "name": "電子工学",
      "value": 1,
      "edited": false
    },
    {
      "name": "天文学",
      "value": 51,
      "edited": true
    },
    {
      "name": "投擲",
      "value": 25,
      "edited": false
    },
    {
      "name": "登攀",
      "value": 40,
      "edited": false
    },
    {
      "name": "図書館",
      "value": 75,
      "edited": true
    },
    {
      "name": "ナビゲート",
      "value": 10,
      "edited": false
    },
    {
      "name": "値切り",
      "value": 5,
      "edited": false
    },
    {
      "name": "博物学",
      "value": 60,
      "edited": true
    },
    {
      "name": "物理学",
      "value": 51,
      "edited": true
    },
    {
      "name": "変装",
      "value": 1,
      "edited": false
    },
    {
      "name": "法律",
      "value": 5,
      "edited": false
    },
    {
      "name": "ほかの言語()",
      "value": 1,
      "edited": false
    },
    {
      "name": "母国語(日本語)",
      "value": 99,
      "edited": false
    },
    {
      "name": "マーシャルアーツ",
      "value": 1,
      "edited": false
    },
    {
      "name": "目星",
      "value": 75,
      "edited": true
    },
    {
      "name": "薬学",
      "value": 1,
      "edited": false
    },
    {
      "name": "歴史",
      "value": 70,
      "edited": true
    },
    {
      "name": "拳銃",
      "value": 20,
      "edited": false
    },
    {
      "name": "サブマシンガン",
      "value": 15,
      "edited": false
    },
    {
      "name": "ショットガン",
      "value": 30,
      "edited": false
    },
    {
      "name": "ライフル",
      "value": 25,
      "edited": false
    },
    {
      "name": "キック",
      "value": 25,
      "edited": false
    },
    {
      "name": "組みつき",
      "value": 25,
      "edited": false
    },
    {
      "name": "こぶし",
      "value": 50,
      "edited": false
    },
    {
      "name": "頭突き",
      "value": 10,
      "edited": false
    }
  ],
  "possessions": [
    {
      "name": "五角えんぴつ",
      "count": "1",
      "detail": "「五角」を「合格」にかけた願掛けアイテム"
    }
  ],
  "weapons": [
    {
      "name": "キック",
      "value": "",
      "damage": "1D6+DB",
      "range": "タッチ",
      "attacks": "1",
      "ammo": "",
      "malfunction": "",
      "hp": ""
    },
    {
      "name": "こぶし",
      "value": "",
      "damage": "1D3+DB",
      "range": "タッチ",
      "attacks": "1",
      "ammo": "",
      "malfunction": "",
      "hp": ""
    },
    {
      "name": "頭突き",
      "value": "",
      "damage": "1D4+DB",
      "range": "タッチ",
      "attacks": "1",
      "ammo": "",
      "malfunction": "",
      "hp": ""
    }
  ],
  "personalData": {
    "address": "",
    "description": "",
    "family": "",
    "insanity": "",
    "injuries": "",
    "scar": ""
  },
  "credit": {
    "income": "",
    "cash": "",
    "deposit": "",
    "personalProperty": "",
    "realEstate": ""
  },
  "mythosTomes": "",
  "artifactsAndSpells": "",
  "encounters": "",
  "note": "テスト\n\nテスト",
  "chatpalette": "1D100<={SAN} 正気度ロール\nCCB<=50 幸運\nCCB<=50 STR×5\nCCB<=50 CON×5\nCCB<=50 POW×5\nCCB<=50 DEX×5\nCCB<=50 APP×5\nCCB<=50 SIZ×5\nCCB<=90 アイディア\nCCB<=105 知識\nCCB<=55 医学\nCCB<=20 回避\nCCB<=25 聞き耳\nCCB<=60 経理\nCCB<=25 心理学\nCCB<=51 天文学\nCCB<=75 図書館\nCCB<=60 博物学\nCCB<=51 物理学\nCCB<=99 母国語(日本語)\nCCB<=75 目星\nCCB<=70 歴史\nCCB<=25 キック\nCCB<=25 組みつき\nCCB<=50 こぶし\nCCB<=10 頭突き\n1D6+{DB} キック\n1D3+{DB} こぶし\n1D4+{DB} 頭突き"
}

TypeScriptによるインターフェース定義

export interface Investigator {
  name: string           // 名前
  occupation: string     // 職業
  birthplace: string     // 出身
  degree: string         // 学校・学位
  mentalDisorder: string // 精神的な障害
  age: string // 年齢
  sex: string // 性別

  // 各能力値の現在値
  characteristics: {
    str: number
    con: number
    pow: number
    dex: number
    app: number
    siz: number
    int: number
    edu: number
  }

  // 耐久力等の現在値および最大正気度
  attribute: {
    hp: number // 耐久力
    mp: number // マジック・ポイント
    db: string // ダメージ・ボーナス。0の場合には "+0" となる
    san: {
      value: number // 正気度
      max: number   // 最大正気度
    },
  },


  skills: Array<Skill>
  weapons: Array<Weapon>
  possessions: Array<Possession> // 装備と所持品

  personalData: {
    address: string     // 住所
    description: string // 描写
    family: string      // 家族&友人
    insanity: string    // 狂気の症状
    injuries: string    // 負傷
    scar: string        // 傷跡など
  }

  credit: {
    income: string           // 収入
    cash: string            // 手持ち現金
    deposit: string          // 預金
    personalProperty: string // 個人資産
    realEstate: string       // 不動産
  }

  mythosTomes: string        // 読んだクトゥルフ神話の魔導書
  artifactsAndSpells: string // アーティファクト/学んだ呪文
  encounters: string         // 遭遇した超自然の存在
  note: string
  chatpalette: string  // チャットパレットに用いるための改行区切りのコマンド一覧
  portraitURL?: string // 探索者プロフィール画像のURL
}

interface Skill {
  name: string
  value: number   // 技能の合計値
  edited: boolean // 技能値が編集されているかどうか。技能の合計値が初期値と異なる場合 true となる
}

interface Weapon {
  name: string        // 名前
  value: string       // 技能値。数値とは限らないことに注意
  damage: string      // ダメージ
  range: string       // 射程
  attacks: string     // 攻撃回数
  ammo: string        // 装弾数
  malfunction: string // 故障ナンバー
  hp: string          // 耐久力
}

interface Possession {
  name: string   // 名前
  count: string  // 所持数。数値とは限らないことに注意
  detail: string // 物品の詳細説明
}
@smatsuodev
Copy link

/api/v1/6th/{id}/summaryのinterfaceですが、
34行目の

wapons: Array<Wapons>

wapons: Array<Wapon>

のtypoではないでしょうか?

@ysakasin
Copy link
Author

@Massyu5296 指摘ありがとうございます! 誤植なので早速修正しました。

@smatsuodev
Copy link

ありがとうございます!
とてもシンプルで見やすいデザインに感動しました!
専門分野がある技能も追加しやすくて助かります!

@HillTopTRPG
Copy link

interfaceの WaponWeapon
メンバの waponsweapons
のtypoではないでしょうか

@ysakasin
Copy link
Author

@HillTopTRPG 指摘ありがとうございます。応答とドキュメントを正しいスペルに修正しました。

@HillTopTRPG
Copy link

お疲れ様です…!
ご対応ありがとうございます!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment