# $Id: data_format.html,v 1.2 1999-05-04 23:04:53+09 hir Exp hir $

last updated : [99.4.27 (Tue) 22:44:47]

倉庫番の画面データとトレースデータの保存形式について

by ひらまつ

もくじ


はじめに

この文書には、倉庫番のための について、現在のフォーマット/試案をまとめてあります。

現状と今後の見通し


倉庫番関係のファイル

倉庫番のプログラムが扱うファイルは、次の三つを想定しています。
  1. 画面データ
  2. 途中経過セーブデータ
  3. 解答データ

画面データ

現在、画面集のアーカイブとして収集・整理しているものです。画面データその もの以外に、タイトル、作者、手数制限、コメントなどの情報を含みます。

これは、製品版の名称、制作者、テーマなどで分類した「画面セット」の単位で まとめて、ディレクトリを掘って管理されています。

(例)perfect, yos_weekly, upside-down-scratch, ...

この画面セットのキーと面数を指定すれば画面データは一意に定まります。

(例) perfect #290, yos_weekly #31, upside-down-scratch #23, ...

途中経過セーブデータ

(基本的には)初期画面イメージ+トレースデータで、途中経過/解答手順を記録 します。任意のファイル名で記録できます。

解答データ

初期画面イメージ+トレースデータとして記録する点では上と同じです。異なる のは次の二点です。 ゲーム中に「解答を再生」を指示すると、このデータを再生します。また、この ファイルが存在するか否かは、プレイヤーがその面を解いているかどうかの判定 に利用されます。

(例)自力で解答済ならば、自動解答プログラムを起動できる


ファイル名

現在、画面データは
screen.1
screen.2
screen.3
...
screen.10
screen.11
...
screen.100
screen.101
同様に、Mule版の解答データは"answer.[0-9]+"というファイル名で記録してい ます。これは、もとはといえば xsokobanのファイル名のつけ方に由来している のですが、 という問題があります。

そこで、将来は、面数のほうはゼロを補って「.」の前の部分に含め、("010"等、 最大 3桁?)共通の拡張子を持つ形式へと移行する予定です。

しかしながら、いろいろなプログラムが従来のファイル名の形式を前提にしてい るというしがらみがあって、なかなか変更に踏み切れずに今までずるずるきてい ます……


画面データフォーマット

一般に流通している画面イメージに、必要に応じてタグを追加してその他の情報 を記録しています。

画面イメージ

画面イメージに記録しているキャラクターシンボルは以下の通りです。これは、 たいていのフリーウェア版の倉庫番で扱っている形式と同じになっています。
「 」 空白
「#」 壁
「.」 格納地点
「$」 荷物
「@」 プレイヤー
「*」 格納地点上の荷物
「+」 格納地点上のプレイヤー

追加情報

画面イメージに続いて次のタグを持つ情報が追加できます。これらはすべて省略 可能です。また、タグは大文字小文字を区別しません(「limit:」「LIMIT:」 「Limit:」は全て同じ意味を持ちます)。
(画面イメージ)
Title: タイトル
Author: 作者
Limit: 手数制限
Comment:
コメント
Comment-End:


トレースデータの基本コンセプト

おおむね、次のように考えています。

トレースデータフォーマット

[初期画面イメージ]
---saved-image---
[セーブ時の画面イメージ]
---information---
status:cleared

screen-set:perfect
level:1

platform:XEmacs sokoban
version:1.0
options:hint-level 3
player:hir

time-stamp:Mon Jun 22 16:30:35 1998
moves:70
pushes:26

first-time-stamp:Mon Jun 22 16:41:02 1998
first-moves:72
first-pushes:26
---trace-data---
[トレースデータ]

初期画面イメージ

画面データフォーマットを参照してくださ い。

セーブ時の画面イメージ

これも、画面データフォーマットを参照し てください。初期画面とトレースデータからセーブ時の画面イメージは得られま すが、処理を簡単にするために用意しています。

information(追加情報)

この部分には、画面データ、トレースデータ本体以外の追加情報を記録します。 これらはすべて省略可能です。また、仕様を拡張する場合も

タグ: 値

という形で記録します。記録できるものは何でもありとして、プログラムが扱い 方を知らないものは単に無視します。

空行は意味を持ちませんが見やすくするために適宜挿入できます。

status:

セーブ時の状態/最後までクリアしているか否か、を示しています。

screen-set:

画面データが属する画面セット

level:

画面データの面数。画面セットと面数がわかれば画面データは特定できます。特 にどこにも属さない面(例:その場で作った適当な画面データ)の場合は、ファイ ル名、または画面のソースを記録します(ということでいいのだろうか?)

(例 1)
screen-file:/tmp/work/screen.1
(例 2)
screen-source:/home/hir/Mail/sokoban/117
region-beginning:2947
region-end:3409

platform:

トレースデータの作成に用いたプログラムに関する情報です。トレースデータを 残すようなプログラムの種別としては、今のところ、倉庫番を(人が)プレイする ためのプログラム、自動解答プログラムが考えられますが、まだあるかもしれま せん(たとえば私は、解答手順のオプティマイザを作りたいです)。 倉庫番プログラムでは、
platform: 倉庫番プログラムの名称
version: プログラムのバージョン
options: 特筆すべきオプション(マウス簡易操作 ON/OFF、ヒントレベル等)
player: プレイヤー名
自動解答プログラムでは
solver: 自動解答プログラムの名称
version: プログラムのバージョン
options: 起動時に与えたオプション
という感じでしょうか。

time-stamp:

トレースデータが作成された/セーブしたり、解答データが記録された日時です。 時刻のフォーマットは特に定めていません。

moves:

記録されている手数(=プレイヤーが歩いた数)です。

pushes:

このトレースデータでプレイヤーが何回荷物を押しているかを記録しています。

first-time-stamp:, first-moves:, first-pushes:

最初に解いた時の日時、手数、荷物を押した数を記録します。最初の頃から自分 はこれくらい進歩したんだなあ、という感傷のためにあるだけで、深い意味はあ りません。

[トレースデータ]

トレースデータの実体です。次のいずれかから成ります。

空行が意味を持つことに注意してください。データを見やすくするのと同時に、 実際の動作の区切りでもあります。


実例

倉庫番パーフェクト 1面の解答データです。

簡単に記録した例


 #######
 # @...#
 #   ####
###$    #
#   #$# #
# $ #   #
#   #####
#####
---saved-image---
 #######
 # @***#
 #   ####
###     #
#   # # #
#   #   #
#   #####
#####
---information---
status:completed
screen-set:perfect
level:1

time-stamp:Fri Mar 12 16:22:56 1999
moves:70
pushes:26
---trace-data---
dDDllddrrUUUUluRRRlldddlldRdrUUUUluRRddrrrddllUdrruulLLulDDlddrUUUUluR

できるだけ詳しく記録した例


 #######
 # @...#
 #   ####
###$    #
#   #$# #
# $ #   #
#   #####
#####
---saved-image---
 #######
 # @***#
 #   ####
###     #
#   # # #
#   #   #
#   #####
#####
---information---
status:completed
screen-set:perfect
level:1

time-stamp:Fri Mar 12 16:22:56 1999
moves:70
pushes:26

first-time-stamp:Mon Jun 22 16:41:02 1998
first-moves:72
first-pushes:26
---trace-data---
; $(3,3) -> *(6,1)
; @(3,1) -> +(5,1)
; 18 moves / 9 pushes
; total: 18 moves / 9 pushes
"最初に運べる荷物はこれしかない"
dDDllddrrU
UUUluRRR

; $(2,5) -> *(5,1)
; +(5,1) -> +(4,1)
; 19 moves / 7 pushes
; 37 moves / 16 pushes (total)
"二個目の荷物を片付ける"
lldddlldRd
rUUUUluRR

; $(5,4) -> *(4,1)
; +(4,1) -> @(3,1)
; 33 moves / 10 pushes
; 70 moves / 26 pushes (total)
"最後の荷物/これは左のスペースを使って回して運ぶ"
ddrrrddllU
drruulLLul
DDlddrUUUU
luR


拡張仕様の構想

当初から、Emacs版の倉庫番では、トレースデータには任意の S式を置けるよう にするつもりでした。

S式というのは"Symbolic Expression"の訳で、Lispで記述できるデータ構造の基 本となるものです(これはとてもおおざっぱな説明なので突っ込まないでくださ い……)。

ここまで説明してきた仕様でトレースデータを記述すると、実際にemacs-lisp (というかLisp)で読み込むプログラムでは、その処理はとても横着できるように なっています。

コメントは勝手に読み飛ばされるので何も考える必要はありません。空行を「マ ウスによる指示」を示すシンボルに変換した後、先頭と末尾にカッコを補って

(
トレースデータ
)
として読むと、全体を一気に読み込めるようになっています(ずるい……)。あと は、移動シンボルを個々のシンボルに分解するだけです。

「任意の S式が置ける」ことによって具体的に何をやりたいかというと、現在よ りも記述力を高めて、トレースデータには何でも好きなものを組み込めるように しようということです。たとえば、現状でも

"メッセージ"
によって一定時間メッセージを表示できますが、実際に使ってみると、断片的な 文章だけでは記述力が足りないと感じられます。そんなとき、画面の一部をマー クアップする関数を用意すれば、トレースデータに次のように記述することで、 一定時間、指定した領域を強調表示することができます。

(例)

--------------------------- cut here ---------------------------
(sokoban-mark-region 'room-by-intial-relocation '((14 8) (15 8) (16 8) (14 9) (15 9) (16 9)))
"これで前半の整理が終わって、この領域に荷物一個分の余裕ができた"
(sokoban-unmark-region 'room-by-intial-relocation)
--------------------------- cut here ---------------------------
上の例で使っている関数の仕様は私が即席ででっちあげたものです。このように、 任意の S式を書いていいことにしておいて、それを実行時に評価すれば、なんで もありの世界になります。

つまり、現状で一定時間メッセージを表示する

"メッセージ"

は、

(sokoban-display-message "メッセージ")
の省略形で、特例として文字列リテラルが出てきたときは上のように処理 するという約束にすぎません。あまり複雑にすると使いこなすのが面倒か もしれませんが、拡張が可能な枠組を用意しておくことは無駄ではないと 考えています。

本当は、トレースデータを編集するための、倉庫番トレースデータ編集モードを 作ろうという構想があったのですが、、、


関連投稿

画面データフォーマット、トレースデータフォーマットの他、マウスシンボルの 意味、ファイル名の形式等について触れられている投稿です。 わずかでも関係ありそうなものは拾っておきましたが、ざっとみてリストアップ しただけなので抜けがある可能性大です。

* ... 内容が重要と思われるもの。

  [sokoban-ML - No.00244] Re: 	VB版ついに完成!              takaken
* [sokoban-ML - No.00245] trace data format                   hir
* [sokoban-ML - No.00246] Re: trace data format               takaken
  [sokoban-ML - No.00247] Re: trace data format               Twink
* [sokoban-ML - No.00251] Re:  trace data format              hir
  [sokoban-ML - No.00252] mouse symbol in undo stack          hir
  [sokoban-ML - No.00253] Re:  mouse symbol in undo stack     takaken
  [sokoban-ML - No.00254] Re:  mouse symbol in undo stack     hir
  [sokoban-ML - No.00290] authors of revenge etc.             hir
  [sokoban-ML - No.00291] Re:  authors of revenge etc.        yoshio
* [sokoban-ML - No.00294] trace data format (continued)       hir
* [sokoban-ML - No.00296] Re:  trace data format (continued)  takaken
* [sokoban-ML - No.00299] Re:  trace data format (continued)  hir
  [sokoban-ML - No.00300] Re:  trace data format (continued)  takaken
  [sokoban-ML - No.00302] Re:  trace data format (continued)  yoshio
  [sokoban-ML - No.00304] download trouble etc.               hir
  [sokoban-ML - No.00306] Re:  download trouble etc.          takaken
  [sokoban-ML - No.00307] euc code and snapshot function etc. hir
  [sokoban-ML - No.00308] ETC....                             okiyasu
  [sokoban-ML - No.00312] snapshot function                   hir
  [sokoban-ML - No.00313] Re:  ETC....                        hir
  [sokoban-ML - No.00321] Re: 件名$,0[>o                      Twink
  [sokoban-ML - No.00322] Re:  snapshot function              takaken
  [sokoban-ML - No.00331] how to arrange etc.                 hir
  [sokoban-ML - No.00338] etc.                                hir
  [sokoban-ML - No.00345] Re:  File name of screen            yoshio
  [sokoban-ML - No.00351] 色々                                okiyasu
  [sokoban-ML - No.00383] 環境問題                            monry
  [sokoban-ML - No.00389] Re:  環境問題                       takaken
  [sokoban-ML - No.00390] Re:  環境問題                       hir
  [sokoban-ML - No.00454] 面データのファイル名について        monry
  [sokoban-ML - No.00457] Re:  mic氏からのメール              yoshio
  [sokoban-ML - No.00460] Re:  面データのファイル名について   hir
  [sokoban-ML - No.00461] 倉庫番研究室あれこれ                monry
  [sokoban-ML - No.00463] Re:  倉庫番研究室あれこれ           takaken
  [sokoban-ML - No.00465] Re:  面データのファイル名について   monry
  [sokoban-ML - No.00475] Re:  倉庫番研究室あれこれ           monry
  [sokoban-ML - No.00765] Re:  [prog] programs by yoshio      yoshio
  [sokoban-ML - No.00766] Re:  [prog] programs by yoshio      hir
  [sokoban-ML - No.00767] comment extension etc.              hir
  [sokoban-ML - No.00768] Re:  [prog] programs by yoshio      yoshio
  [sokoban-ML - No.00770] monry-light (4) etc.                hir
  [sokoban-ML - No.00773] Re:  monry-light (4) etc.           yoshio
  [sokoban-ML - No.00845] Re: [prog] how to handle duplicated stages hir
  [sokoban-ML - No.00851] Mac 版「倉庫番セレクション」 097面  kazuo
* [sokoban-ML - No.00852] Re:  Mac 版「倉庫番セレクション」 097面 hir
* [sokoban-ML - No.00854] Re:  Mac 版「倉庫番セレクション」 097面 deepgreen
* [sokoban-ML - No.00858] Re:  [prog] standard data type      yoshio
* [sokoban-ML - No.00864] trace data format                   hir
* [sokoban-ML - No.00865] Re:  [prog] standard data type      hir
* [sokoban-ML - No.00900] [map] mic-scratch-99 ready          hir
* [sokoban-ML - No.00901] RE:  [map] トレースデータ仕様       deepgreen
* [sokoban-ML - No.00904] RE:  [map] トレースデータ仕様       hir
  [sokoban-ML - No.00976] Sokoban HP 作成にあたってのお願い   deepgreen


その他

このページへのリンクはご自由にどうぞ。また引用、転載は自由です。さらに、 新しい提案は歓迎です。

HTMLで書き始めてしまったのですが、plain textの方がよかったでしょうか。

英語版も用意したいところですが、余力あればということにさせてください……


[もどる]……事情によりブラウザの「Back」で戻ってください。