倉庫番のレベル

XTshekとDOSの時代には、サイズが10キロバイト未満の小さなバイナリとして実装されたバージョンの倉庫番がありました。 この奇跡はpusher.exeと呼ばれ、 次のように見えました。







シンプルなレベルでしたが、これはどうですか?







これは、DOSEmuを介して基本的に起動されます: DOSEmu -exit pusher.exe







実行するのが面倒、デモを見ることができます:







そして、このような小さなバイナーに60のレベルがどのように適合するかが私にとって興味深いものになりました。 少しIDAを掘った後、私はbinarの `pusher.exe`からすべてのレベルを取り出してテキスト形式で印刷するプログラムを作成しました。



 ************************************* Maze: 1 File offset: 148C, DS:00FC, table offset: 0000 Size X: 22 Size Y: 11 End: 14BD Length: 50 XXXXX XX X* X XXX *XXX X * * X XXX X XXX X XXXXXX XX XXX XXXXXXX ..X X * * ..X XXXXX XXXX X@XXXX ..X X XXX XXXXXX XXXXXXXX *************************************
      
      





すべてのレベルを一度にダウンロードできます



レベルは、ハフマン-可変長ビットチェーンのようなものによって圧縮されます。 各レベルは次のようにエンコードされます。

そして、すべての60レベル。



pushermaps.cファイルでは、単純な解凍プログラム全体を見ることができます。



分解の過程で、レベルは便利なテキストで形成されましたが、まだ圧縮された形式で、例えば:



 level_01 db 16h, 0Bh, 0A2h, 0DFh, 38h, 32h, 1Fh, 38h, 2Ah, 3, 0E6h db 12h, 0C0h, 0A5h, 0F2h, 83h, 2, 81h, 3, 0E4h, 12h, 82h db 25h, 6, 0CDh, 64h, 22h, 51h, 0ACh, 11h, 0A1h, 0Ah, 5 db 0E5h, 11h, 0B1h, 14h, 82h, 29h, 82h, 31h, 0A0h, 0E1h db 2Ch, 18h, 0D1h, 0CFh, 80h, 0Ch, 8 level_02 db 0Eh, 0Ah, 0F6h, 58h, 0Ch, 68h, 0Dh, 94h, 0C6h, 80h db 85h, 2, 82h, 18h, 0D0h, 15h, 4Ch, 10h, 0C6h, 0C2h, 18h db 21h, 8Dh, 1, 6, 4, 39h, 10h, 0A0h, 81h, 80h, 85h, 2 db 8, 20h, 60h, 34h, 1Bh, 0Ch, 1Eh, 0CAh, 7, 4 level_03 db 11h, 0Ah, 0E3h, 9Fh, 0Eh, 7, 0C2h, 11h, 42h, 1Fh, 8 db 50h, 23h, 0E0h, 85h, 4, 0Ch, 1Eh, 84h, 8, 0A6h, 0B4h db 10h, 85h, 2, 82h, 59h, 0D4h, 28h, 14h, 90h, 0D6h, 83h db 0DFh, 7Ch, 0Eh, 1
      
      







そのため、シンプルでコンパクトな倉庫番をどこかで楽しもうとするなら、 既成のいくつかのレベルを取ることができます。



インターネットには倉庫番のレベルがたくさんあり、自動格子があることは知っていますが、これは20年以上前にビナールで逆アセンブラーを使って掘っていたファンを完全に取り消すわけではありません。



GitHub'eのプロジェクト-github.com/begoon/sokoban-maps (誰かが興味を持っているなら)。



All Articles