Files
DroidDeck/docs/development/gamejolt-store.md

4.4 KiB

Game Jolt store

The Game Jolt Store tab mirrors the itch.io one: browse, search, game page, build picker, installs, library, collections and updates.

Sign-in

Game Jolt shows the normal sign-in card until an account is signed in. Signing in opens StoreLoginActivity on https://gamejolt.com/login (GameJoltLogin). The flow is not a token redirect: Game Jolt is a single-page site, so StoreLoginActivity.Client.doUpdateVisitedHistory also reports navigations, and any gamejolt.com page outside the sign-in, sign-up and legal paths counts as signed in. finish reads the WebView cookies, asks /web/search/games?q=a for the top-level user, and stores the cookie header and the user through GameJoltAuth (encrypted, StoreAccounts). The log names the cookies and the user keys, never their values.

Data

GameJoltApi talks to https://gamejolt.com/site-api/web/... with the stored cookies. Games come back as {payload, user}; GameJoltCatalog turns a game into a CatalogItem (paid only when sellable.type is paid).

Browse queries (GameJoltBrowse.queryString): section= is always sent first (featured, hot, best, new). Game Jolt answers 404 to any browse request without it, even an empty one. The rest are tag=, f_price=, and f_os[], f_browser[], f_maturity[], f_status[], f_partners[], page=. Every page logs its query, status and game count. The filters are drop-down menus (BrowseDropdown, shared with the itch bar). Devlog games have no playable copy, so the status filter only offers complete and early access, and a browse always asks for those two. With mature content off, adult is stripped from the query, including a stored one.

Prices

GameJoltPricing.of reads sellable.pricings[] (amounts in cents). The promotional entry is the current price and the regular entry the original, only when the original is higher; the percent uses integer math. USD (or no currency) formats as $12.34, another currency as 12.34 EUR. CatalogItem carries finalPrice, originalPrice and discountPercent, so tiles and the game page show prices and sale badges.

Library and collections

GameJoltLibrary.sync fetches /web/library/games/owned/@<user> (paged, at most every ten minutes, forced by the refresh action) and merges the games into the store library as owned. GameJoltCollections lists the read-only collections: followed games (/web/library/games/followed/@<user>) and the account's playlists (/web/library/games/playlist/<id>). The Library page shows them through the same CollectionsButton as itch. Ownership comes from sellables[0].is_owned; packages[0].is_game_owner is not reliable. Library chips list a store when it has games in the list; a signed-in Itch.io or Game Jolt account keeps its chip, in store order, so its collections stay reachable.

Builds and installs

GameJoltBuilds.parse reads the overview payload, keeps the newest release of each package and marks Windows builds installable. The picker (GameJoltBuildPicker) installs Windows builds of free games and of paid games the account owns; Linux builds say "Not supported yet" and everything else, including paid games not owned, opens the Game Jolt page. GameJoltInstaller asks builds/get-download-url/<id> for a signed link on every attempt, resumes with Range, unpacks through StoreArchiveUnpacker (shared with itch) and picks the launch option or an exe. An update downloads again and merges through ItchStaging, like itch.

Updates

GameJoltUpdates works like ItchUpdates (see itch-updates.md). The install record keeps the release published_on as installVersion and gameId, buildId and packageId in extra. evaluate compares them with the current builds: a newer release of the same package is an update; if the package is gone, the first installable Windows build is offered as a replaced build. The automatic check runs when the Game Jolt Library source opens, at most every six hours, one game per second. A Check for updates button on an installed game's page checks that game only. Updates stage through ItchStaging and the safe folder. Uninstalling or finishing an install clears the record. Install folders use Store.folder, so the Itch.io display name never moves them.

Controller

The menus, chips and buttons are the shared components (MenuItem, AnchoredMenu, ValueChip, BrowseChip, IconAction) that already take focus and confirm from a controller. The first menu entry takes initial focus.