Skip to content

0.6.0: обновление игры со страницы игры, с сохранением сейвов, настроек и ярлыка Steam - #11

Merged
Aniforka merged 1 commit into
mainfrom
ccr-5d5262e3-twsugo
Oct 7, 2026
Merged

Aniforka merged 1 commit into
mainfrom
ccr-5d5262e3-twsugo

Conversation

@Aniforka

@Aniforka Aniforka commented Oct 7, 2026

Copy link
Copy Markdown
Owner

Что сделано

На странице игры появилась карточка «Обновление игры»: ссылка на новую версию (прямая, файл Mega, Яндекс.Диск, Google Drive) или файл с телефона/ПК.

  1. Загрузка — обычная задача, помеченная как обновление. Вместо новой игры архив распаковывается рядом с игрой: <папка над игрой>/.deckdrop-updates/stage-<token>. Запомненные пароли и запрос пароля работают как для любого архива. Задача заканчивается статусом «новая версия распакована» с кнопкой «открыть игру».
  2. До применения страница показывает, что сделает обновление: сколько файлов добавится и заменится (со списком), какой exe будет запускать Steam, какие файлы пользователя останутся, какие старые файлы есть только в старой версии.
  3. «Обновить» применяет, «Отмена» отбрасывает новую версию — игра не меняется.

Обновляется всё содержимое новой версии (данные, ресурсы, библиотеки, exe), поверх старой.

Почему сейвы и настройки не ломаются

  • Игра остаётся в своей папке, поэтому ярлык Steam и его AppID не меняются, а с ними префикс Proton (где большинство игр хранит сейвы и настройки), название, Proton, обложки и раскладка.
  • Если exe переименован (Game-1.2.exe → Game-1.3.exe), тот же ярлык переключается на новый (SetShortcutExe сразу или отложенная операция exe, пока нет управления Steam); запись DeckDrop переезжает вместе с ним.
  • Файлы в папках сейвов (saves, savedata, Saved…) никогда не заменяются.
  • Файлы настроек (*.ini, *.cfg, config.json…) по умолчанию остаются пользовательскими.
  • Файлы старой версии, которых нет в новой, остаются; галочка «убрать» убирает их, кроме сейвов и оставленных настроек.
  • Пока внутри папки игры работает процесс (игра запущена), обновление не применяется.
  • Архив совмещается с игрой по пути к exe, так что лишний уровень папок (Game-1.3-pc/…) ложится правильно.
  • Всё заменённое или убранное переносится (не удаляется) в .deckdrop-updates/<игра>/ с manifest.json, поэтому последнее обновление откатывается одной кнопкой; сейвы, сделанные после него, остаются. «Удалить старые файлы» освобождает место.
  • Неприменённые распаковки удаляются при запуске; удаление игры убирает и её копии обновлений.

Изменения в коде

  • Новый модуль src/deckdrop/gameupdate.py.
  • archives.finish передаёт задачи-обновления в stage_update; Job получил поле update; start_download принимает update и root (загрузка идёт на диск игры).
  • API: POST /api/game/update/link, PUT /api/game/update/upload, GET /api/game/update, POST /api/game/update/{apply,discard,rollback,drop_backup}.
  • Отложенная операция exe в steam/shortcuts.py.
  • Интерфейс, переводы en/ru, раздел «Обновление игры» в обоих README, раздел 0.6.0 в CHANGELOG.

Ограничения

  • Откатить можно только последнее обновление.
  • Ссылка на папку Mega не принимается — нужна ссылка на файл в ней.
  • Файлы архива вне папки с игрой (например, Extras/ рядом) не копируются, превью об этом не предупреждает.
  • После переименования exe старый exe остаётся в папке (и в списке на странице игры), пока его не убрать галочкой.

Проверка

  • Новый tests/test_game_update.py (10 сценариев): сейвы и настройки сохраняются; настройки заменяются, если снять галочку; «убрать» не трогает сейвы; переименованный exe сохраняет AppID и Proton; архив с лишней папкой ложится правильно; при запущенной игре и после отмены ничего не меняется; обновление по ссылке; откат возвращает старые файлы, сохраняя новые сейвы.
  • Локально прошли pyflakes, tools/changelog.py --check, сборка, все юнит-тесты (включая test_user_data.py), smoke из исходников и собранного файла, tests/ui_check.py на обоих языках.
  • В headless Chromium на телефонном экране прогнаны два обновления подряд (второе с переименованным exe) и откат.
  • На настоящем Steam Deck не проверялось, в том числе переключение ярлыка на новый exe через управление Steam.

🤖 Generated with Claude Code

https://claude.ai/code/session_0117oG9pVCiLVdgdzWJT9nJH


Generated by Claude Code

…hortcut

A new "Update the game" card takes a link (direct, Mega file, Yandex
Disk, Google Drive) or a file from the device. The download or upload
is an ordinary job marked as an update: finish() hands it to
gameupdate.stage_update, which unpacks it (remembered passwords and the
job's password prompt work as for any archive) into
<folder above the game>/.deckdrop-updates/stage-<token> instead of
making a new game, and the job ends as "update_ready".

The game page then shows what applying would do before anything
changes: new and replaced files, which exe Steam will start, save files
the new version ships that stay the user's, settings files that differ,
old files the new version lacks. The archive is lined up with the game
by the path of the exe Steam starts, so an extra folder level lands
right.

Applying keeps the game folder, so the shortcut and its app id stay and
with them the Proton prefix (where most games keep saves and settings),
name, Proton, artwork and layout. A renamed exe gets the same shortcut
(SetShortcutExe live, or a pending "exe" op until Steam control is on)
and DeckDrop's record follows it. Inside the game, files in save
folders are never replaced, settings files (*.ini, *.cfg, config.json,
...) are kept unless unticked, and old-only files stay unless "clear"
is ticked (saves and kept settings stay even then). Everything replaced
or cleared is moved into .deckdrop-updates/<game>/ with a manifest, so
the last update can be rolled back; "delete the old files" frees it.
Nothing is applied while a process runs inside the game folder.
Unapplied stages are removed at start; deleting a game removes its
update leftovers too.

tests/test_game_update.py runs the server on a throwaway game added to
Steam: saves and settings survive, settings are replaced when asked,
cleanup moves old files aside but not saves, a renamed exe keeps the
app id and Proton, a deeper archive lines up, nothing happens while the
game runs or after discarding, an update by link works, and rollback
restores the old files while keeping saves made since.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0117oG9pVCiLVdgdzWJT9nJH
@Aniforka
Aniforka merged commit b0b2bb3 into main Oct 7, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants