0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

「議事録は『幻想郷の異変解決』である。――東方キャラのデッキ編成で会議を攻略する、超・尖鋭型ポートフォリオの開発記録」

0
Last updated at Posted at 2026-03-11

はじめに

「現代社会の会議。それは、無数の言葉が飛び交う、まさに『弾幕』のような場所です。私はこのカオスな状況を、東方Projectの『異変解決』の枠組みで再定義しました。キャラの個性をデッキとして編成し、各々の視点(ステータス)で会議を紐解く――これは、単なる要約アプリではなく、ビジネスを幻想郷のルールでハックする試みです。」

※注釈:本プロジェクトについて
本アプリケーションは「東方Project」の二次創作物です。
上海アリス幻樂団様の二次創作ガイドラインに基づき、個人の趣味およびポートフォリオ制作の一環として開発しています。

  1. 業務の5大要素を「ステータス」に変換
    一般的なRPGでは「攻撃力」や「守備力」がありますが、このアプリは実務(製造業や開発現場など)を想定し、以下の5項目をステータス化しました。

安全 (Safety)

品質 (Quality)

財務 (Finance)

開発 (Development)

厚生 (Welfare)

キャラクターごとにこれらの初期値を設定し、さらにスキルによる補正(バフ)がかかる仕組みです。

キャラクターデータの定義例
東方Projectのキャラクターをベースに、性格や得意分野を詳細に定義しています。

キャラクターデータの定義例

東方Projectのキャラクターをベースに、性格や得意分野を詳細に定義しています。

# ID, 名前, 種族, レアリティ, レベル, 肩書き, 一人称, 二人称, 口調, プロンプト(画像生成用), 
# モットー, スキル名, 特徴1, 特徴2, 世界観, セリフ, 趣味, 仕事観, 判断基準, アイテム, 
# 基本ステータス(安,品,財,開,厚), 固有アビリティ, 所属
('th_sanae_001', '東風谷 早苗', 'Human/Miracle', 'SSR', 10, '奇跡を起こす現人神', 
 '', 'あなた', '丁寧・情熱的', '...', '常識を塗り替える', '奇跡のDX推進', 
 '変革、信仰', 'DX、環境適応', '現代/幻想郷', '奇跡で塗り替えます!', 
 'アニメ、技術', '仕事の信仰化', '常識的な判断', '奇跡のお守り', 
 (35, 35, 35, 150, 35), ('人間の底力', {'welfare': 1.5}), ['守矢神社'])

image.png

  1. 戦略的な「デッキシステム」
    ユーザーは3人のキャラクターで「デッキ」を編成し、会議(議事録)に挑みます。
    「安全衛生委員会」の議事録を作成するのに、あえて「安全」ステータスが低いデッキで挑むと、リスクを軽視したとんでもない要約が生成される……といった、編成によるアウトプットの変化を楽しめる設計にしています。
    image.png
  2. ステータスの可視化:レーダーチャートの実装
    キャラクターの能力を直感的に把握するため、PyQtのQPainterを使用して独自のレーダーチャート・ウィジェットを作成しました。
    「素の能力(Base)」と「補正後の能力(Final)」を重ねて表示することで、アビリティの効果を一目で確認できます。

実装コード (PyQt6/PySide6)

class RadarChartWidget(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.base_stats, self.final_stats = [0]*5, [0]*5
        self.max_val, self.labels = 450, ["安全", "品質", "財務", "開発", "厚生"]

    def setData(self, base, final):
        self.base_stats, self.final_stats = base, final
        self.update()

    def paintEvent(self, event):
        p = QPainter(self)
        p.setRenderHint(QPainter.RenderHint.Antialiasing)
        w, h = self.width(), self.height()
        center, r_max = QPointF(w/2, h/2), min(w, h)/3.8
        
        # 背景の五角形ガイドラインを描画
        p.setPen(QPen(QColor(0, 212, 255, 60), 1, Qt.PenStyle.DashLine))
        for i in range(1, 6):
            r = r_max * (i/5)
            poly = QPolygonF([QPointF(center.x()+r*math.cos(a), center.y()+r*math.sin(a)) 
                             for a in [(2*math.pi*j/5)-(math.pi/2) for j in range(5)]])
            p.drawPolygon(poly)
            if i==5:
                for pts in poly: p.drawLine(center, pts)

        # ステータス多角形の描画(Base と Final の2層)
        for color, stats in [(QColor(0, 255, 255, 50), self.final_stats), (QColor(0, 132, 255, 180), self.base_stats)]:
            p.setBrush(color)
            p.setPen(QPen(Qt.GlobalColor.white, 1))
            poly = QPolygonF()
            for i in range(5):
                angle = (2*math.pi*i/5)-(math.pi/2)
                r = (min(stats[i], self.max_val)/self.max_val)*r_max
                poly.append(QPointF(center.x()+r*math.cos(angle), center.y()+r*math.sin(angle)))
            p.drawPolygon(poly)

image.png
今後は、このステータス値をLLM(Large Language Model)のプロンプトに動的に注入し、キャラクターの個性が議論の内容にリアルに反映されるエンジンを強化していく予定です。
「真面目な会議を、あえてカオスな議論に変える」ことで、新しい気づきが得られるツールを目指します。

次回の記事では、実際にFaster-Whisperで取得した音声を、これらのステータスに基づいてどう「議論」させるのか、プロンプトエンジニアリングの深淵について触れたいと思います。

続きはこちらです。https://qiita.com/kazuhisarico0128/items/fbddb26665c4b3b6ead4

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?