Discord 上で動く 和風カジノ Bot。 ただのギャンブルツールではなく、座敷童というキャラクターと「縁を結んでいく」育成体験を、賭博メカニクスの上に重ねた構造。
「賭けて、勝って、負けて、座敷童に少しずつ気に入られていく Discord Bot」
現在の開発・本番運用は v2 ブランチ で進めています(main は v1 時代のスナップショット)。
v2 以降の主な追加要素:
- 二種目通貨経済(エテル ⇄ Gil 両替・/両替)
- VIP 月会員制度(/vip・奥座敷の特典)
- 対人ゲーム7種(/勝負 丁半 / チンチロ / サシ / ブラックジャック / インディアン / 5枚交換ポーカー / 板)
- 奥座敷ホールデム(/勝負 奥ポーカー・VIP専用テキサスホールデム、サイドポット対応)
- 卓を立てる(勝負と連動するプライベートVCの自動生成・デポジット制)
- 連鎖ボーナス(燃える炉)(ソロ連勝で配当倍率ブースト)
- 釈迦の心づけ / 釈迦の説法(オーナー専用の褒章 / 罰則)
- /管理 設定 のパネル化(チャンネル・ロール・ログ送信先を UI から)
- アステル(座敷童キャラの段階・好感度・モード制御)
- トランザクションフィード(取引ログのライブ送信)
VPS(ConoHa)では v2 を pull → npm run build → pm2 restart で本番反映。
個別の機能やバグ修正は v2 に直接コミットしていく開発スタイル。
- キャラクター駆動:全ての勝敗・操作に座敷童のセリフが付き、好感度・覚醒段階・モード(default / tsundere / yami)でセリフが動的に変化
- 7段階の覚醒システム:幽か → 灯し → 宿り → 結び → 花憑き → 常盤 → 顕現。段階に応じてデイリー倍率・加護率・JPボーナス・福税軽減が解放
- 五行属性(覚醒3で解放):木 / 火 / 土 / 金 / 水。相生 ×1.2、相剋 ×1.5
- インフレ抑制経済:累進奉納(福の重み)/残高上限/動的ハウスエッジ/プール分配の4層構造で長期インフレを抑制
- 11種のスラッシュコマンド、
/遊ぶ配下に6ゲームを集約 - 冪等で壊れない設計:bet ロック、SAVEPOINT トランザクション、起動時の自動返金、PM2 自動再起動
| コマンド | 内容 |
|---|---|
/遊ぶ 巻物 |
🎰 百鬼夜行巻物(スロット、JP 付き) |
/遊ぶ 札遊び |
🃏 花札勝負(ブラックジャック) |
/遊ぶ 暴落 |
📈 龍脈昇り(クラッシュ) |
/遊ぶ 丁半 |
🎴 丁半博打(ハイ&ロー) |
/遊ぶ 輪盤 |
🎡 運命の水鏡(共有型ルーレット) |
/遊ぶ 賽 |
🎲 チンチロ |
/競馬 |
🏇 神馬競走(パリミューチュエル、土日 21:00 自動開催) |
/龍脈 |
📈 龍脈相場(5銘柄、3時間ごとに値動き) |
/福分け |
📅 デイリーボーナス |
/座敷童 |
覚醒 status / mode / element |
/案内 |
ホーム画面 |
- 言語: TypeScript 5.7 (strict)
- ランタイム: Node.js 24(
node:sqliteを使うため 22+ 必須) - ライブラリ: discord.js v14 / node-cron / dotenv
- 永続化: SQLite(WAL モード、foreign_keys ON)
- プロセス管理: PM2
- デプロイ先: ConoHa VPS(Ubuntu 24.04)
npm install.env をプロジェクト直下に作成:
DISCORD_TOKEN=... # 必須
CLIENT_ID=... # 必須
GUILD_ID= # 任意:開発時のみ即時デプロイ用
RACE_CHANNEL_ID= # 任意:定期競馬の開催チャンネル
OWNER_ID= # 任意:監視ダッシュボードから集計除外npm run deploy# 開発(ts-node)
npm run dev
# 本番(ビルド + node)
npm run build
npm startnpm run pm2:start
npm run pm2:logs
npm run pm2:restartsrc/
├─ index.ts — エントリ、interaction ルータ
├─ config.ts — 環境変数読込
├─ deploy-commands.ts — スラッシュコマンド登録
│
├─ core/ — 横断ドメインロジック
│ ├─ db.ts — DB 初期化・マイグレーション
│ ├─ bank.ts — 残高操作・bet バリデーション
│ ├─ economy.ts — 福の重み・動的HE・プール分配
│ ├─ dialogue.ts — 座敷童セリフエンジン
│ ├─ zashikiStage.ts — 7段階覚醒システム
│ ├─ quests.ts — クエスト
│ └─ scheduler.ts — cron スケジューラ
│
├─ games/ — 各ゲーム実装
├─ ui/ — Embed / ホーム画面 / パネル
└─ admin/ — /管理 コマンド
所持金が多いほど勝利金から自動天引き:
| 所持金 | 奉納率 |
|---|---|
| ≤ 10,000 | 0% |
| ≤ 50,000 | 5% |
| ≤ 100,000 | 10% |
| ≤ 300,000 | 20% |
| それ以上 | 30% |
天引き分は JP プール / 底辺保護プールへ。覚醒段階6で 50% 軽減。
サーバー全体の小判総量を playerCount × 15,000 と比較し、デフレ時は -2%、インフレ時は +2% を自動補正。最終 HE は 0〜15% にクランプ。
ハウスが吸収した小判は 20% → JP / 30% → 底辺保護 / 50% → 消滅。50%消滅が長期インフレへの最終ブレーキ。
| 格 | 必要 Lv | bet 上限 |
|---|---|---|
| 👤 人間 | 1 | 500 |
| 🌗 半妖 | 10 | 2,000 |
| 👹 妖 | 25 | 10,000 |
| 🐉 大妖 | 50 | 50,000 |
| ⛩️ 神 | 100 | 100,000 |
validateBet()— integer / safe integer / 範囲チェックadjustBalance()— 負残高拒否、Number.isSafeIntegerでオーバーフロー防御game_sessionsテーブルでゲーム単位ロック、競馬はis_racingの原子 UPDATE- 金銭操作は
runTransaction(SAVEPOINT) でアトミック - 起動時
refundStaleBetsOnStartup()で未精算競馬ベットを全額返金 - interaction / process 例外吸収で 1リクエスト失敗による全停止を防止
- PM2 で落ちても自動再起動、メモリ 500M 超でも再起動
| cron 式 | 内容 |
|---|---|
0 21 * * 6,0 |
競馬:土日 21:00 JST 自動開催 |
0 */3 * * * |
龍脈相場:3時間ごとに全銘柄更新 |
TZ=Asia/Tokyo を PM2 env で強制。
npm run backupscripts/backup.sh を毎日 04:30 cron 実行。sqlite3 .backup で online backup、7日以上前は自動削除。
Private project.