マップデータについて
外部ツール開発者向けマップデータフォーマット仕様
概要
ツクセカでは、マップデータのエクスポート・インポートに対応しています。
外部のマップエディターやツールを開発される方は、このフォーマットに従ってデータ生成をお願いいたします。
JSON構造
{
"version": 3,
"width": 10, // マップの幅(タイル単位)
"height": 8, // マップの高さ(タイル単位)
"baseLayer1": [...], // 基本レイヤー1(必須)
"baseLayer2": [...], // 基本レイヤー2(オーバーレイ)
"frontLayer": [...], // 前面レイヤー(プレイヤーより前面)
"passabilityMap": [...], // 通行可能性マップ
"startPosition": {...}, // 開始位置
"actionPoints": [...], // アクションポイント
"spriteSheet": {...}, // スプライトシート設定
"mobs": [...] // モブ(NPC)配列(オプション)
}
フィールド詳細説明
■基本フィールド
version number 必須
マップフォーマットのバージョン番号
固定値: 3
width number 必須
マップの幅(タイル単位)
有効範囲: 8
~ 50
整数値のみ
height number 必須
マップの高さ(タイル単位)
有効範囲: 8
~ 50
整数値のみ
■レイヤー配列
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"
}
プロパティ詳細
1
: ニワトリ
2
: スライム
3
: UFO
4
: エイリアン(2D)
-1
: カスタムモブ(要: mobId)
"static"
: 静止
"random"
: ランダム移動(基準位置から3タイル以内)
"vertical"
: 上下移動のみ
"horizontal"
: 左右移動のみ
"slow"
: 2秒ごとに移動
"normal"
: 1秒ごとに移動
"fast"
: 0.5秒ごとに移動
"none"
: アクションなし
"dialogue"
: ダイアログ表示(要: dialogueName, dialogueContent)
"move"
: プレイヤー移動(要: moveX, moveY)
カスタムモブ専用プロパティ
"/xxx/yyy/zzz.webp"
"/xxx/yyy/zzz.png"
dialogueName
: 最大50文字dialogueContent
: 最大500文字、改行は\n
で表現moveX
,moveY
: マップ内の有効な座標である必要があります- モブは移動可能なマスでのみ移動します
mobId
: カスタムモブ(mobType = -1)の場合は必須faceImagePath
,avatarImagePath
: カスタムモブ使用時に必須
重要: mobType=-1のカスタムモブはインポート時に「にわとり(mobType=1)」に自動変換されます(画像データが含まれないため)
制約
配列サイズ
- すべてのレイヤー配列は
[height][width]
のサイズである必要があります - 各行の要素数が一致している必要があります
- passabilityMapも同じサイズである必要があります
数値範囲
- 座標:
0
~width-1
またはheight-1
- マップサイズ:
8
~50
文字列制限
- 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)はユーザー固有のモブです。 マップのインポート時にはカスタムモブは「にわとり」に自動変換されます。