# PNGTuberPlusTanu TCP Control API 仕様書

## 概要

本APIは PNGTuberPlusTanu を外部アプリケーションから TCP 経由で制御するためのローカル専用APIです。 通信は 1リクエスト1レスポンス方式で、JSON を用います。
本仕様書はChatGPTに自動出力させたものを一部編集しています。

## たぬえさから利用する場合

たぬえさ3.1.4.0以降で利用可能ですが、利用できるAPIの範囲が随時更新されていくため、 最新バージョンの利用を勧めます。

オペレーションの「URL」タブから「たぬえさ内部でアクセス」にチェックを入れ、 メソッドを「PNGTuberPlusTanu」にし、引数入力欄の右にある「PNGTuberPlusTanu用」のボタンを押し、 UIに沿って入力します。

## 通信仕様

- プロトコル: TCP
- ホスト: 127.0.0.1
- ポート: 8766
- 文字コード: UTF-8
- 接続: 単発（KeepAliveなし）

## 共通レスポンス（ACK）

    {
      "ok": true | false,
      "code": "CODE",
      "message": "detail message"
    }

## コマンド一覧

### zoom

カメラのズーム倍率を変更します。

    {
      "type": "zoom",
      "value": 1.2
    }

### model

アバターモデル（.save）をロードします。

    {
      "type": "model",
      "path": "user://avatar/sample.save"
    }

### costume

モデルで定義されたコスチューム番号を切り替えます。

    {
      "type": "costume",
      "costume": 1
    }

### camera_move

カメラ位置を移動します。

    {
      "type": "camera_move",
      "x": 100,
      "y": 50,
      "duration": 0.5,
      "mode": "relative | absolute"
    }

### camera_rotate

カメラを回転させます。

    {
      "type": "camera_rotate",
      "angle": 30,
      "duration": 0.5,
      "mode": "relative | absolute"
    }

### avatar_move

アバター位置を変更します。

    {
      "type": "avatar_move",
      "x": 0,
      "y": 0,
      "duration": 0.3,
      "mode": "relative | absolute"
    }

## ACKコード一覧

- OK
- MISSING_PARAM
- INVALID_PARAM
- INVALID_JSON
- FILE_NOT_FOUND
- MAIN_NOT_FOUND
- CAMERA_NOT_FOUND
- ORIGIN_NOT_FOUND
- AVATAR_ERROR
- RESPONSE_ERROR（クライアント側）

## 備考

- JSON が壊れている場合でも Godot 側はクラッシュしません。
- duration 未指定時はデフォルト値が使用されます。
- mode 未指定時は relative になります。