概要

ツクセカでは、マップデータのエクスポート・インポートに対応しています。
外部のマップエディターやツールを開発される方は、このフォーマットに従ってデータ生成をお願いいたします。

JSON構造

{
  "version": 3,
  "width": 10,              // マップの幅(タイル単位)
  "height": 8,              // マップの高さ(タイル単位)
  "baseLayer1": [...],      // 基本レイヤー1(必須)
  "baseLayer2": [...],      // 基本レイヤー2(オーバーレイ)
  "frontLayer": [...],      // 前面レイヤー(プレイヤーより前面)
  "passabilityMap": [...],  // 通行可能性マップ
  "startPosition": {...},   // 開始位置
  "actionPoints": [...],    // アクションポイント
  "spriteSheet": {...},     // スプライトシート設定
  "mobs": [...]            // モブ(NPC)配列(オプション)
}

フィールド詳細説明

■基本フィールド

version number 必須

マップフォーマットのバージョン番号

固定値: 3

width number 必須

マップの幅(タイル単位)

有効範囲: 850

整数値のみ

height number 必須

マップの高さ(タイル単位)

有効範囲: 850

整数値のみ

■レイヤー配列

baseLayer1 number[][] 必須

基本レイヤー1のタイル配列(最背面)

配列サイズ: [height][width]

各要素: タイルインデックス(-1 = タイルなし、0以上 = タイルあり)

// 横4マスx縦3マスの例
[
  [9, 7, 10, 10], // 1行目
  [15, 0, 0, 15], // 2行目
  [16, 0, 0, 17]  // 3行目
]

baseLayer2 number[][] 必須

基本レイヤー2のタイル配列(baseLayer1の上に重なる、プレイヤーよりは背面)

配列サイズ: [height][width]

各要素: タイルインデックス(-1 = タイルなし、0以上 = タイルあり)

frontLayer number[][] 必須

前面レイヤーのタイル配列(プレイヤーやモブより前面に表示)

配列サイズ: [height][width]

各要素: タイルインデックス(-1 = タイルなし、0以上 = タイルあり)

passabilityMap boolean[][] 必須

通行可能性マップ(衝突判定)

配列サイズ: [height][width]

各要素: true = 通行可能、false = 通行不可

// 横4マスx縦3マスの例(周囲が壁、中央が通行可能)
[
  [false, false, false, false],  // 上端の壁
  [false, true , true , false],  // 中央のみ通行可能
  [false, false, false, false]   // 下端の壁
]

■オブジェクトフィールド

startPosition object 必須

プレイヤーの初期スポーン位置

{
  "x": 4,  // X座標(0ベース、0 ≤ x < width)
  "y": 6   // Y座標(0ベース、0 ≤ y < height)
}

座標は通行可能な位置である必要があります

spriteSheet object 必須

スプライトシート設定

{
  "tileSize": 16  // 1タイルあたりのピクセル数
}

tileSize 有効値: 8, 16, 20, 24, 32, 40, 48, 64

インポート時に合わせて指定するマップタイルのスプライトシート画像(このマップデータと一緒に使用する前提の画像)における、1タイルあたりのピクセル数を指定します

■アクションポイント

actionPoints array 必須

マップ上のインタラクティブポイントの配列

空配列も可(アクションポイントなしの場合)

タイプ: move(マップ外移動)
{
  "x": 4,
  "y": 7,
  "type": "move",
  "content": "https://example.com/page.html"  // 遷移先URL
}

contentは有効なHTTP/HTTPSのURLである必要があります

タイプ: move_seamless(マップ外移動(同一世界))
{
  "x": 2,
  "y": 1,
  "type": "move_seamless",
  "content": {
    "mapCode": "abc123def456",  // 移動先マップのコード(必須)
    "x": 14,                    // 移動先のX座標(オプション)
    "y": 3                      // 移動先のY座標(オプション)
  }
}

移動時に確認ダイアログが出ず、アイリスアウト/インの視覚効果が付きます

mapCodeには移動先マップのコードを指定する必要があります

x, yを省略した場合、移動先マップのstartPositionが使用されます

タイプ: move_internal(マップ内移動)
{
  "x": 10,
  "y": 5,
  "type": "move_internal",
  "content": {
    "x": 15,  // 移動先のX座標
    "y": 20   // 移動先のY座標
  }
}

移動先座標は同一マップ内の有効な座標である必要があります

タイプ: message(メッセージ表示)
{
  "x": 7,
  "y": 1,
  "type": "message",
  "content": "時計は12時を指しているようだ。"
}

最大文字数: 500文字

改行は \n で表現

タイプ: image(画像表示)
{
  "x": 6,
  "y": 3,
  "type": "image",
  "content": {
    "imagePath": "/xxx/yyy/zzz.jpg", // 画像パス
    "description": "美味しそうなコーヒー" // 画像の説明
  }
}

重要: imageタイプのアクションポイントはインポート時に無視されます(画像データが含まれないため)

■モブ(NPC)

mobs array オプション

マップ上のNPCキャラクターの配列

空配列も可(モブがいない場合)

// プリセットモブの例
{
  "x": 8,                     // モブのX座標(0 ≤ x < width)
  "y": 2,                     // モブのY座標(0 ≤ y < height)
  "mobType": 2,               // モブの種類(1-4: プリセット、-1: カスタム)
  "movePattern": "random",    // 移動パターン
  "moveSpeed": "normal",      // 移動速度
  "contactAction": "dialogue", // 接触時のアクション

  // contactAction が "dialogue" の場合の必須フィールド
  "dialogueName": "スライム",
  "dialogueContent": "ぷるぷる!\nこんにちは!",

  // contactAction が "move" の場合の必須フィールド
  "moveX": null,              // 移動先X座標
  "moveY": null               // 移動先Y座標
}

// カスタムモブの例
{
  "x": 10,
  "y": 12,
  "mobType": -1,              // カスタムモブを示す値
  "mobId": 42,                // カスタムモブのID
  "faceImagePath": "/xxx/yyy/zzz.webp",  // 顔画像パス
  "avatarImagePath": "/xxx/yyy/zzz.png", // アバター画像パス
  "movePattern": "static",
  "moveSpeed": "normal",
  "contactAction": "none"
}
プロパティ詳細
mobType
1: ニワトリ 2: スライム 3: UFO 4: エイリアン(2D) -1: カスタムモブ(要: mobId)
movePattern
"static": 静止 "random": ランダム移動(基準位置から3タイル以内) "vertical": 上下移動のみ "horizontal": 左右移動のみ
moveSpeed
"slow": 2秒ごとに移動 "normal": 1秒ごとに移動 "fast": 0.5秒ごとに移動
contactAction
"none": アクションなし "dialogue": ダイアログ表示(要: dialogueName, dialogueContent) "move": プレイヤー移動(要: moveX, moveY)
カスタムモブ専用プロパティ
mobId
カスタムモブのID(mobType = -1 の場合に必須) ユーザーが事前に登録したカスタムモブのIDが入る
faceImagePath
モブの顔画像パス(mobType = -1 の場合に必須) 例: "/xxx/yyy/zzz.webp"
avatarImagePath
モブのアバター画像パス(mobType = -1 の場合に必須) 例: "/xxx/yyy/zzz.png"
  • dialogueName: 最大50文字
  • dialogueContent: 最大500文字、改行は \n で表現
  • moveX, moveY: マップ内の有効な座標である必要があります
  • モブは移動可能なマスでのみ移動します
  • mobId: カスタムモブ(mobType = -1)の場合は必須
  • faceImagePath, avatarImagePath: カスタムモブ使用時に必須

重要: mobType=-1のカスタムモブはインポート時に「にわとり(mobType=1)」に自動変換されます(画像データが含まれないため)

制約

配列サイズ

  • すべてのレイヤー配列は [height][width] のサイズである必要があります
  • 各行の要素数が一致している必要があります
  • passabilityMapも同じサイズである必要があります

数値範囲

  • 座標: 0width-1 または height-1
  • マップサイズ: 850

文字列制限

  • URL: http:// または https:// で始まる必要があります
  • メッセージ: 最大500文字

サンプルデータ

実際にインポート可能なマップデータのサンプルです。
(サイズ: 10×8タイル、アクションポイント5個、モブ3体を含む実践的なサンプル)

サンプルの概要

  • マップサイズ: 10×8タイル
  • タイルサイズ: 16ピクセル
  • アクションポイント:
    • 外部URL移動 × 2
    • シームレス移動 × 1
    • メッセージ表示 × 1
    • 画像表示 × 1
  • モブ:
    • ニワトリ(静止)
    • スライム(ランダム移動、ダイアログ付き)
    • UFO(上下移動、プレイヤー移動アクション)

重要な注意事項

📍

座標系について

座標系は左上が原点 (0,0) です。 X軸は右方向、Y軸は下方向に増加します。 すべての配列は0ベースインデックスです。

🎨

タイルインデックス

タイルインデックスは、スプライトシート内の位置を示します。 計算式: row * columns + column スプライトシート画像のサイズはtileSizeの倍数である必要があります。

💾

エクスポート/インポート

インポート時、画像タイプのアクションポイントは無視されます。 タイル画像はインポート時に合わせてアップロードが必要です。

🚶

モブの制限

モブは基準位置から最大3タイルまでしか移動しません。 モブの初期位置は通行可能な場所に設定してください。 1マップあたりのモブ数に制限はありませんが、パフォーマンスに注意してください。

🐔

カスタムモブについて

カスタムモブ(mobType = -1)はユーザー固有のモブです。 マップのインポート時にはカスタムモブは「にわとり」に自動変換されます。