Файл приключений в Колоссальной пещере: расшифровка из двоичного (?) В читаемый формат (Python) - PullRequest
0 голосов
/ 19 марта 2019

Я уверен, что многие из вас, ребята, знают об игре Colossal Cave Adventure 1976 года.Я загрузил его на свой Mac, и он позволяет сохранить ваш прогресс и сохранить его в файле .adv, который вы можете открыть и возобновить игру с того места, где остановились.Я открыл его в TextEdit (изменил его на файл .txt), и он выглядит как целый беспорядок зашифрованного текста Бога - знает, на каком языке.Я прикрепил картинку

https://i.stack.imgur.com/RkBlb.png

, а также ссылку на диске Google в файл .txt

https://drive.google.com/file/d/1Ku4QO4cpx61X8mS9bBgGK3AyViczczNl/view?usp=sharing Почему-то на диске GoogleПредварительный просмотр выглядит как китайский или другой язык, но если вы загрузите .txt, вы увидите, что это то же самое, что и изображение igmur.

Я запустил файл через python, используя это: import io with io.open(filename, 'rb') as f: text = f.read()

И text дал мне это: https://drive.google.com/file/d/1KyjdPxUDkBy5ATZfg1GdIexeP9nK-Km6/view?usp=sharing

Просто образец этого (нажмите на ссылку выше, чтобы увидеть полный файл): b '\ xc1 \ xdfd \ x00 \ x84K \ xfd \ xcb \XFF \ x93 \ XCB \ xf9 \ x90 \\ xA9 \ xd5 \ XDB \ x10 \ XAF \ XDB \ XB5 {_ \ xd1 \ xf9 \ xcaw \ XD2 \ xc13 \ x8e \ xd1 \ xd6 \ x06 \ xce \ xe3V \ xd0\ xa8

Попытка расшифровать его в Python дала мне эту ошибку: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc1 in position 0: invalid start byte

Я попытался расшифровать его многими способами, и все они потерпели неудачу.Мне нужно расшифровать это в нечто читаемое.Как мне и на каком «языке текста» это написано?

Спасибо

1 Ответ

1 голос
/ 19 марта 2019

Ничего подобного взламыванию классических игр.

Какая версия? Оригинал написан на Фортране и работает на PDP-11. Так что это не тот, который у вас есть.

Возможно, у вас последняя версия OSS? https://gitlab.com/esr/open-adventure

Итак, вам нужно взглянуть на конкретную реализацию игры и взять структуры данных, которые она использует для сохранения игрового состояния.

Вот что вы хотите сделать:

git clone https://gitlab.com/esr/open-adventure.git open-adventure
make
./advent

Это запускает игру и помещает вас в нее.

Welcome to Adventure!!  Would you like instructions?

> no

You are standing at the end of a road before a small brick building.
Around you is a forest.  A small stream flows out of the building and
down a gully.

> save

I can suspend your Adventure for you so that you can resume later, but
it will cost you 5 points.

Is this acceptable?

> yes

OK

File name: saved_game

Richs-MBP:open-adventure randrews$ ls -l saved_game 
-rw-r--r--  1 randrews  staff  3192 Mar 18 19:11 saved_game
Richs-MBP:open-adventure randrews$ file saved_game
saved_game: data
Richs-MBP:open-adventure randrews$ strings saved_game
E'HTH

Это двоично, хорошо. Итак, мы идем за исходником игры.

saveresume.c - отличное место для старта.

Внутри мы находим ссылку на struct game_t в коде, который suspend() s в игре. И эта структура определена в advent.h

Похоже:

struct game_t {
    int32_t lcg_x;
    int abbnum;                  // How often to print int descriptions
    score_t bonus;               // What kind of finishing bonus we are getting
    loc_t chloc;                 // pirate chest location
    loc_t chloc2;                // pirate chest alternate location
    turn_t clock1;               // # turns from finding last treasure to close
    turn_t clock2;               // # turns from warning till blinding flash
    bool clshnt;                 // has player read the clue in the endgame?
    bool closed;                 // whether we're all the way closed
    bool closng;                 // whether it's closing time yet
    bool lmwarn;                 // has player been warned about lamp going dim?
    bool novice;                 // asked for instructions at start-up?
    bool panic;                  // has player found out he's trapped?
    bool wzdark;                 // whether the loc he's leaving was dark
    bool blooded;                // has player drunk of dragon's blood?
... it is big! ...
    obj_t link[NOBJECTS * 2 + 1];// object-list links
    loc_t place[NOBJECTS + 1];   // location of object
    int hinted[NHINTS];          // hinted[i] = true iff hint i has been used.
    int hintlc[NHINTS];          // hintlc[i] = how int at LOC with cond bit i
    int prop[NOBJECTS + 1];      // object state array */
};

И это то, что в вашем файле. Получите удовольствие, взяв код игры C и используя функции приостановки / возобновления, чтобы загрузить сохраненный файл и взломать его, чтобы вы напились крови драконов!

...