2 Commits
Author SHA1 Message Date
MyLuxy 32422ca811 feat: version 1.0.1 2026-10-14 04:34:28 +02:00
MyLuxy 1942631b41 feat: Overdrive 1.0.0 2026-10-14 04:20:24 +02:00
4726 changed files with 91106 additions and 1 deletions

No files matched your search

+85
View File
@@ -0,0 +1,85 @@
name: build
on:
push:
branches: [main]
tags: ["v*"]
workflow_dispatch:
permissions:
contents: write
jobs:
ps5:
runs-on: ubuntu-24.04
timeout-minutes: 180
steps:
- uses: actions/checkout@v4
- name: Install the toolchain
run: |
sudo apt-get update
sudo apt-get install -y \
clang-18 llvm-18 llvm-18-dev cmake ninja-build nodejs npm python3-venv \
zlib1g-dev build-essential pkg-config unzip zip curl zstd exfatprogs exfat-fuse
# The build wants unversioned clang and llvm-config in --llvm.
for tool in clang clang++ llvm-config; do
sudo ln -sf "/usr/bin/$tool-18" "/usr/local/bin/$tool"
done
clang --version | head -1
llvm-config --version
- name: Install the Python dependencies
run: |
python3 -m venv "$RUNNER_TEMP/venv"
"$RUNNER_TEMP/venv/bin/pip" install --disable-pip-version-check -r ps5-react/requirements.txt
# The build spawns python3 for its own tools, so the venv goes on PATH.
echo "$RUNNER_TEMP/venv/bin" >> "$GITHUB_PATH"
- name: Check the exfat packaging
run: |
mkdir -p "$RUNNER_TEMP/check/payload"
printf 'eboot' > "$RUNNER_TEMP/check/payload/eboot.bin"
# Big enough that the image gets the same geometry as the real one.
head -c 24000000 /dev/urandom > "$RUNNER_TEMP/check/payload/data.bin"
sudo bash packaging/make-exfat.sh "$RUNNER_TEMP/check/payload" \
"$RUNNER_TEMP/check/check.exfat" CHECK
- name: Cache the downloaded sources
uses: actions/cache@v4
with:
path: ps5-react/.deps
key: deps-${{ hashFiles('ps5-react/dependencies.lock.json') }}
- name: Build
working-directory: ps5-react
run: python3 tools/build_ps5.py --app-dir "$GITHUB_WORKSPACE/app" --llvm /usr/bin
- name: Package
run: |
sudo bash packaging/make-exfat.sh ps5-react/dist/PPSA99058 Overdrive.exfat OVERDRIVE
# The in-app updater fetches one name, for an image install: the image
# alone at the root of update.zip.
zip -q -X -j update.zip Overdrive.exfat
unzip -l update.zip
ls -l Overdrive.exfat update.zip ps5-react/dist/
- name: Upload
uses: actions/upload-artifact@v4
with:
name: Overdrive
path: |
Overdrive.exfat
update.zip
ps5-react/dist/PPSA99058.receipt.json
if-no-files-found: error
- name: Release
if: startsWith(github.ref, 'refs/tags/v')
env:
GH_TOKEN: ${{ github.token }}
run: |
assets="Overdrive.exfat update.zip"
gh release create "$GITHUB_REF_NAME" $assets \
--title "Overdrive $GITHUB_REF_NAME" --generate-notes \
|| gh release upload "$GITHUB_REF_NAME" $assets --clobber
+13
View File
@@ -0,0 +1,13 @@
# Downloaded sources and build output
.deps/
.build/
dist/
node_modules/
# Python
__pycache__/
.venv/
# OS
.DS_Store
Thumbs.db
+73
View File
@@ -0,0 +1,73 @@
# Overdrive
Overdrive is a game-store front end for the PS5 (title id `PPSA99058`). This
repository holds a source reconstruction of the released application and the
tooling that builds it, so it can be changed and rebuilt.
## Layout
| Path | What it is |
| --- | --- |
| `app/` | The application: JSX sources, state, assets, catalog data, and `app.json` (title id, version, capabilities) |
| `ps5-react/` | The framework it runs on, vendored from [half144/ps5-react](https://github.com/half144/ps5-react) |
| `packaging/make-exfat.sh` | Builds the exFAT image `ShadowMount+` installs |
| `.github/workflows/build.yml` | The build |
## Building
Every push builds on `ubuntu-24.04` with clang 18 and uploads `Overdrive.exfat`
as a workflow artifact; a `v*` tag also publishes a release carrying `Overdrive.exfat`
(the image, to copy by hand) and `update.zip` (the same image alone,
which is what the app's updater fetches for an image install).
The same build locally, on any Linux with the packages the workflow installs
(`clang-18`, `llvm-18`, `cmake`, `ninja-build`, `nodejs`, `npm`, `zlib1g-dev`,
`build-essential`, `pkg-config`, `unzip`, `curl`, `exfatprogs`, and Pillow from
`ps5-react/requirements.txt`):
```sh
cd ps5-react
python3 tools/build_ps5.py --app-dir ../app --llvm /usr/bin
sudo ../packaging/make-exfat.sh dist/PPSA99058 ../Overdrive.exfat
```
The build downloads its pinned dependencies into `ps5-react/.deps` and writes
the app folder, a `.zip` and a `.receipt.json` into `ps5-react/dist`. It verifies
the result itself (`tools/verify.py`), so a green build means the payload
structure and signatures check out.
`--llvm /usr/bin` points the build at the system clang; upstream defaults to the
Homebrew LLVM path because macOS is its supported development environment.
## Fixes over upstream
Two fixes in the vendored framework, both in the build tooling and both reported
by a Linux build:
- `ps5-react/tools/common.py` read the `git apply --summary` line with a fixed
space count, which glued the file mode onto the path (`100644 <path>`) and made
every fresh dependency checkout fail on the first patch that creates a file.
It now splits on whitespace.
- `ps5-react/tools/build_ps5.py` opened the pinned LLVM package's `data.tar.zst`
with `tarfile`, which reads zstd only from Python 3.14 while the documented
minimum is 3.12. It now falls back to the `zstd` command.
Nothing else in the framework is changed.
## Installing
Copy `Overdrive.exfat` to the console and let `ShadowMount+` install
it. The image is a plain exFAT volume whose root is the app folder, 64 KiB
clusters, label `OVERDRIVE`.
Installed, the app checks this repository's releases at startup and offers a
newer one; replacing an image install needs free space for the image plus the
update next to it. A build installed before the rename keeps looking for the old
asset names and needs one manual reinstall.
## Licensing
`ps5-react/` is GPL-3.0-or-later and carries its own `LICENSE`,
`LICENSE-ATTRIBUTION` and `NOTICE`. Every dependency notice is copied into
`notices/` inside the built app; `ps5-react/docs/DEPENDENCIES.md` lists them with
their sources.
+15
View File
@@ -0,0 +1,15 @@
{
"$schema": "https://raw.githubusercontent.com/half144/ps5-react/main/app.schema.json",
"titleId": "PPSA99058",
"contentId": "UP9000-PPSA99058_00-OVERDRIVE0000000",
"name": "Overdrive",
"version": "01.001.000",
"render": { "width": 1920, "height": 1080 },
"surface": { "width": 1920, "height": 1080 },
"refreshRate": 60,
"textFonts": ["chinese", "japanese", "bengali", "devanagari", "arabic"],
"resources": ["data/releases", "data/pages", "i18n/locales"],
"filesystemAccess": "console",
"networking": true,
"timeoutSeconds": 0
}
+10
View File
@@ -0,0 +1,10 @@
// Baked fonts cover printable ASCII by default, and every codepoint outside it
// draws as `?`. The store separates genres and sources with U+00B7 and writes
// em dashes, curly quotes and ellipses, and the shipped locales add accented
// Latin and Cyrillic, so both faces bake the whole European set.
export default {
fonts: {
'Inter-Regular': { glyphs: 'european' },
'JetBrainsMono-Regular': { glyphs: 'european' },
},
};
Binary file not shown.
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+59
View File
@@ -0,0 +1,59 @@
// ../pub-game-store/native/browse/ActiveFilters.jsx
// reconstructed from the esbuild bundle in eboot.bin
import '../assets/Inter-Regular.ttf';
import { Fragment, jsx, jsxs } from 'react/jsx-runtime';
import { memo } from 'react';
import { useT } from '../i18n/index.js';
import { FACETS, facetLabel } from '../state/catalog.js';
import { useNavActions } from '../state/nav.jsx';
import { useQuery, useStoreActions, useStoreState } from '../state/store.jsx';
import { Chip } from '../ui/Chip.jsx';
import { FocusRing } from '../ui/FocusRing.jsx';
import { Text, View, useIsFocused } from '@ps5-react/core';
function ClearAll() {
const t2 = useT();
const focused = useIsFocused();
return /* @__PURE__ */ (0, jsx)(Text, { focused, style: [{ fontFamily: "Inter-Regular", fontSize: 21, color: "#a3a3ab", lineHeight: 30 }, focused ? { color: "#f2f2f3" } : null], children: t2("filters.clearAll") });
}
var ActiveFilters = (0, memo)(function ActiveFilters2() {
const t2 = useT();
const { filters } = useStoreState();
const query = useQuery();
const { setFilters, toggleFilter, setQuery, clearFilters } = useStoreActions();
const { focusLater } = useNavActions();
const chips = [
query && { label: t2("filters.queryChip", { query }), remove: () => setQuery("") },
filters.wishlist && { label: t2("filters.favorites"), remove: () => setFilters({ ...filters, wishlist: false }) },
...FACETS.flatMap(({ key }) => filters[key].map((value) => ({ label: facetLabel(key, value), remove: () => toggleFilter(key, value) })))
].filter(Boolean);
if (!chips.length) return null;
const remove = (index, action) => {
const neighbour = chips[index + 1] ?? chips[index - 1];
action();
focusLater(neighbour ? `chip:${neighbour.label}` : "catalog:filters");
};
return /* @__PURE__ */ (0, jsxs)(Fragment, { children: [
chips.map(
(chip, index) => /* @__PURE__ */ (0, jsx)(
Chip,
{
focusKey: `chip:${chip.label}`,
label: chip.label,
onPress: () => remove(index, chip.remove)
},
chip.label
)
),
chips.length > 1 && /* @__PURE__ */ (0, jsxs)(View, { onPress: () => {
clearFilters();
focusLater("catalog:filters");
}, style: (_state) => [{ height: 60, justifyContent: "center", borderRadius: 14999, paddingHorizontal: 24 }, _state.focused ? { backgroundColor: "#2b2b30" } : null], children: [
/* @__PURE__ */ (0, jsx)(FocusRing, { round: "full" }),
/* @__PURE__ */ (0, jsx)(ClearAll, {})
] })
] });
});
export { ActiveFilters };
+81
View File
@@ -0,0 +1,81 @@
// ../pub-game-store/native/browse/BrowsePage.jsx
// reconstructed from the esbuild bundle in eboot.bin
import '../assets/Inter-Regular.ttf';
import '../assets/JetBrainsMono-Regular.ttf';
import { Fragment, jsx, jsxs } from 'react/jsx-runtime';
import { memo, useState } from 'react';
import { Catalog } from './Catalog.jsx';
import { CdnRail } from './CdnRail.jsx';
import { ContinueRow } from './ContinueRow.jsx';
import { FilterDrawer } from './FilterDrawer.jsx';
import { GenreRail } from './GenreRail.jsx';
import { PageHints } from './PageHints.jsx';
import { PopularRail } from './PopularRail.jsx';
import { RecentRow } from './RecentRow.jsx';
import { Spotlight } from './Spotlight.jsx';
import { TopCharts } from './TopCharts.jsx';
import { useT } from '../i18n/index.js';
import { StoreFreeze } from '../state/store.jsx';
import { useFolderInstall } from '../state/update.js';
import { useFavoriteAction } from '../ui/GameCard.jsx';
import { Icon } from '../ui/Icon.jsx';
import { Logo } from '../ui/Logo.jsx';
import { colors } from '../ui/colors.js';
import { FocusScope, ScrollView, Text, View } from '@ps5-react/core';
function Footer() {
const t2 = useT();
return /* @__PURE__ */ (0, jsxs)(View, { style: { marginHorizontal: -48, marginTop: 120, flexDirection: "row", alignItems: "center", justifyContent: "space-between", borderTopWidth: 2, borderColor: "#2a2a2f", paddingHorizontal: 48, paddingVertical: 48 }, children: [
/* @__PURE__ */ (0, jsx)(Logo, { color: colors.muted }),
/* @__PURE__ */ (0, jsx)(Text, { style: { fontFamily: "Inter-Regular", fontSize: 21, color: "#8a8a94", lineHeight: 30 }, children: t2("browse.footer") })
] });
}
var MIGRATE_GUIDE = "github.com/MyLuxy/overdrive";
function FolderInstallNotice() {
const t2 = useT();
if (!useFolderInstall()) return null;
return /* @__PURE__ */ (0, jsxs)(View, { style: { flexDirection: "row", alignItems: "center", gap: 18, borderRadius: 18, borderWidth: 2, borderColor: "#2a2a2f", backgroundColor: "#17171a", paddingHorizontal: 30, paddingVertical: 18 }, children: [
/* @__PURE__ */ (0, jsx)(Icon, { name: "alert", size: 18, color: colors.muted }),
/* @__PURE__ */ (0, jsxs)(View, { style: { flex: 1, gap: 3 }, children: [
/* @__PURE__ */ (0, jsx)(Text, { style: { fontFamily: "Inter-Regular", fontSize: 21, color: "#a3a3ab", lineHeight: 30 }, children: t2("browse.folderInstall") }),
/* @__PURE__ */ (0, jsx)(Text, { style: { fontFamily: "JetBrainsMono-Regular", fontSize: 21, color: "#f2f2f3", lineHeight: 30 }, children: MIGRATE_GUIDE })
] })
] });
}
var Sections = (0, memo)(function Sections2({ onOpenFilters }) {
const onAction = useFavoriteAction();
return /* @__PURE__ */ (0, jsx)(FocusScope, { trap: true, onAction, children: /* @__PURE__ */ (0, jsxs)(ScrollView, { style: { flex: 1, gap: 60, paddingHorizontal: 48 }, children: [
/* @__PURE__ */ (0, jsxs)(View, { scrollAnchor: true, style: { gap: 24, paddingTop: 36 }, children: [
/* @__PURE__ */ (0, jsx)(FolderInstallNotice, {}),
/* @__PURE__ */ (0, jsx)(Spotlight, {})
] }),
/* @__PURE__ */ (0, jsx)(PopularRail, {}),
/* @__PURE__ */ (0, jsx)(CdnRail, {}),
/* @__PURE__ */ (0, jsx)(ContinueRow, {}),
/* @__PURE__ */ (0, jsx)(RecentRow, {}),
/* @__PURE__ */ (0, jsx)(TopCharts, {}),
/* @__PURE__ */ (0, jsx)(GenreRail, {}),
/* @__PURE__ */ (0, jsx)(Catalog, { onOpenFilters }),
/* @__PURE__ */ (0, jsx)(Footer, {})
] }) });
});
var BrowsePage = (0, memo)(function BrowsePage2() {
const [open, setOpen] = (0, useState)(false);
const [frozen, setFrozen] = (0, useState)(false);
const [drawer] = (0, useState)(() => ({
open: () => {
setOpen(true);
setFrozen(true);
},
close: () => setOpen(false),
closed: () => setFrozen(false)
}));
return /* @__PURE__ */ (0, jsxs)(Fragment, { children: [
/* @__PURE__ */ (0, jsx)(StoreFreeze, { frozen, children: /* @__PURE__ */ (0, jsx)(Sections, { onOpenFilters: drawer.open }) }),
/* @__PURE__ */ (0, jsx)(FilterDrawer, { open, onClose: drawer.close, onClosed: drawer.closed }),
/* @__PURE__ */ (0, jsx)(PageHints, {})
] });
});
export { BrowsePage };
+148
View File
@@ -0,0 +1,148 @@
// ../pub-game-store/native/browse/Catalog.jsx
// reconstructed from the esbuild bundle in eboot.bin
import '../assets/Inter-Regular.ttf';
import { Fragment, jsx, jsxs } from 'react/jsx-runtime';
import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';
import { ActiveFilters } from './ActiveFilters.jsx';
import { EmptyState } from './EmptyState.jsx';
import { SortSelect } from './SortSelect.jsx';
import { SPAN_MAX, fitBytes } from '../i18n/fit.js';
import { useLocale, useT } from '../i18n/index.js';
import { activeCount, filterGames, sortGames } from '../state/catalog.js';
import { useNavActions } from '../state/nav.jsx';
import { useStore } from '../state/store.jsx';
import { ButtonGlyph } from '../ui/ButtonHints.jsx';
import { FocusRing } from '../ui/FocusRing.jsx';
import { DETAILED_CAPTION, GameCard } from '../ui/GameCard.jsx';
import { px } from '../ui/scale.js';
import { FocusScope, Image, Text, View, VirtualList, useIsFocused } from '@ps5-react/core';
var STAGGER = 0.03;
var COLUMNS = 6;
var BATCH = COLUMNS * 8;
var CARD_WIDTH = 182;
var CARD_HEIGHT = 243 + DETAILED_CAPTION;
var FIRST = COLUMNS * 3;
var STEP = 3;
var AHEAD = [2, 5];
var SETTLE_MS2 = 200;
var fetched = /* @__PURE__ */ new Set();
var settle2 = null;
var coverBox = { width: px(CARD_WIDTH), height: px(Math.round(CARD_WIDTH * 4 / 3)), resizeMode: "cover" };
function prefetchBelow(games2, index) {
clearTimeout(settle2);
settle2 = setTimeout(() => prefetchRows(games2, index), SETTLE_MS2);
}
function prefetchRows(games2, index) {
const row = Math.floor(index / COLUMNS);
for (const game of games2.slice((row + AHEAD[0]) * COLUMNS, (row + AHEAD[1]) * COLUMNS)) {
if (!game.art.cover || fetched.has(game.id)) continue;
fetched.add(game.id);
Image.prefetch(game.art.cover, coverBox).catch(() => fetched.delete(game.id));
}
}
var sameGrid = (a, b) => a.signature === b.signature && a.enter === b.enter && a.games.length === b.games.length && a.games.every((game, i) => game === b.games[i]);
var Grid = (0, memo)(function Grid2({ games: games2, enter: enter3 }) {
const { openGame } = useNavActions();
const [limit, setLimit] = (0, useState)(BATCH);
const [filled, setFilled] = (0, useState)(STEP);
const entering = (0, useRef)(enter3);
(0, useEffect)(() => {
if (filled >= FIRST) {
entering.current = false;
return void 0;
}
const id = setTimeout(() => setFilled((count) => count + STEP), 0);
return () => clearTimeout(id);
}, [filled]);
const all = (0, useRef)(games2);
all.current = games2;
const renderItem = (0, useCallback)(
({ item: game, index }) => /* @__PURE__ */ (0, jsx)(
GameCard,
{
game,
width: CARD_WIDTH,
detailed: true,
rowEnd: index % COLUMNS === COLUMNS - 1,
enterDelay: entering.current ? index * STAGGER : void 0,
onFocus: () => prefetchBelow(all.current, index),
onPress: () => openGame(game.id, `card:${game.id}`)
}
),
[openGame]
);
return /* @__PURE__ */ (0, jsx)(
VirtualList,
{
style: { marginTop: 36 },
data: games2.slice(0, filled < FIRST ? filled : limit),
numColumns: COLUMNS,
itemHeight: CARD_HEIGHT,
rowGap: 40,
columnGap: 24,
initialNumRows: 3,
keyExtractor: (game) => game.id,
onEndReached: () => setLimit((count) => count + BATCH),
renderItem
}
);
}, sameGrid);
function FiltersLabel({ count }) {
const t2 = useT();
const focused = useIsFocused();
return /* @__PURE__ */ (0, jsxs)(Fragment, { children: [
/* @__PURE__ */ (0, jsx)(FocusRing, {}),
/* @__PURE__ */ (0, jsx)(Text, { focused, style: [{ fontFamily: "Inter-Regular", fontSize: 21, color: "#f2f2f3d9", lineHeight: 30 }, focused ? { color: "#f2f2f3" } : null], children: t2("filters.title") }),
count > 0 && /* @__PURE__ */ (0, jsx)(View, { style: { height: 30, minWidth: 30, alignItems: "center", justifyContent: "center", borderRadius: 14999, backgroundColor: "#f2f2f3", paddingHorizontal: 9 }, children: /* @__PURE__ */ (0, jsx)(Text, { style: { fontFamily: "Inter-Regular", fontSize: 18, fontWeight: 600, color: "#000000", lineHeight: 24 }, children: String(count) }) }),
/* @__PURE__ */ (0, jsx)(ButtonGlyph, { button: "triangle", size: 18 })
] });
}
function Catalog({ onOpenFilters }) {
const t2 = useT();
const { rtl } = useLocale();
const store = useStore();
const { filters, query } = store;
const results = (0, useMemo)(
() => sortGames(filterGames(store), store.sort),
[filters, query, store.wishlist, store.sort]
);
const settled = (0, useRef)(false);
(0, useEffect)(() => {
settled.current = true;
}, []);
const signature = JSON.stringify([filters, query, store.sort]);
const title = query ? t2("catalog.resultsFor", { query }) : filters.wishlist ? t2("catalog.favorites") : t2("catalog.library");
const filtersCount = activeCount(filters) - Number(filters.wishlist);
const onAction = (action) => {
if (action !== "triangle" && action !== "options") return false;
onOpenFilters();
return true;
};
return /* @__PURE__ */ (0, jsx)(FocusScope, { restoreFocus: false, onAction, children: /* @__PURE__ */ (0, jsxs)(View, { scrollAnchor: true, children: [
/* @__PURE__ */ (0, jsxs)(Text, { style: { fontFamily: "Inter-Regular", fontSize: 30, fontWeight: 600, color: "#f2f2f3", lineHeight: 42, letterSpacing: -0.75 }, children: [
fitBytes(title, SPAN_MAX),
/* @__PURE__ */ (0, jsx)(Text, { style: { fontWeight: 400, color: "#8a8a94" }, children: fitBytes(` ${t2("catalog.gameCount", { count: results.length })}`, SPAN_MAX) })
] }),
/* @__PURE__ */ (0, jsxs)(View, { style: { zIndex: 10, marginTop: 24, flexDirection: "row", flexWrap: "wrap", alignItems: "center", gap: 12 }, children: [
/* @__PURE__ */ (0, jsx)(View, { focusKey: "catalog:filters", onPress: onOpenFilters, style: (_state) => [
{ height: 60, flexDirection: "row", alignItems: "center", gap: 12, borderRadius: 14999, backgroundColor: "#17171a" },
rtl ? { paddingRight: 24, paddingLeft: 18 } : { paddingLeft: 24, paddingRight: 18 },
_state.focused ? { backgroundColor: "#2b2b30" } : null
], children: /* @__PURE__ */ (0, jsx)(FiltersLabel, { count: filtersCount }) }),
/* @__PURE__ */ (0, jsx)(SortSelect, {}),
/* @__PURE__ */ (0, jsx)(ActiveFilters, {})
] }),
results.length > 0 ? /* @__PURE__ */ (0, jsx)(Grid, { games: results, signature, enter: settled.current }, signature) : /* @__PURE__ */ (0, jsx)(
EmptyState,
{
query,
onlyWishlist: filters.wishlist && activeCount(filters) === 1,
onClear: store.clearFilters
}
)
] }) });
}
export { Catalog };
+74
View File
@@ -0,0 +1,74 @@
// ../pub-game-store/native/browse/CdnRail.jsx
// reconstructed from the esbuild bundle in eboot.bin
import '../assets/Inter-Regular.ttf';
import cdnCard from '../assets/cdn-card.png';
import { Fragment, jsx, jsxs } from 'react/jsx-runtime';
import { memo } from 'react';
import { GameRail } from './GameRail.jsx';
import { games } from '../data/catalog.js';
import { useT } from '../i18n/index.js';
import { CDN_HOST, NO_FILTERS, onCdn, sortGames } from '../state/catalog.js';
import { useNavActions } from '../state/nav.jsx';
import { useStoreActions } from '../state/store.jsx';
import { FocusFrame } from '../ui/FocusRing.jsx';
import { DETAILED_CAPTION, GameCard } from '../ui/GameCard.jsx';
import { Icon } from '../ui/Icon.jsx';
import { colors } from '../ui/colors.js';
import { EASE_OUT } from '../ui/ease.js';
import { px } from '../ui/scale.js';
import { Image, Text, View, motion, useIsFocused } from '@ps5-react/core';
var WIDTH = 152;
var TILE = { width: px(WIDTH * 2 + 24), height: px(Math.round(WIDTH * 4 / 3)), borderRadius: px(8) };
var CAPTION2 = { width: px(WIDTH * 2 + 24), height: px(DETAILED_CAPTION) };
var SERVED = sortGames(games.filter(onCdn), "relevance");
var lift2 = { type: "tween", duration: 0.3, ease: EASE_OUT };
function CollectionCard() {
const t2 = useT();
const focused = useIsFocused();
return /* @__PURE__ */ (0, jsxs)(Fragment, { children: [
/* @__PURE__ */ (0, jsxs)(motion.View, { style: [{ position: "relative" }, TILE], initial: false, animate: { y: focused ? -6 : 0 }, transition: lift2, children: [
/* @__PURE__ */ (0, jsx)(Image, { source: cdnCard, resizeMode: "cover", style: TILE }),
/* @__PURE__ */ (0, jsx)(FocusFrame, { round: "lg" })
] }),
/* @__PURE__ */ (0, jsxs)(View, { style: [{ paddingTop: 15 }, CAPTION2], children: [
/* @__PURE__ */ (0, jsx)(Text, { style: { fontFamily: "Inter-Regular", fontSize: 20, color: "#8a8a94", lineHeight: 24 }, children: t2("catalog.gameCount", { count: SERVED.length }) }),
/* @__PURE__ */ (0, jsx)(Text, { focused, style: [{ marginTop: 6, fontFamily: "Inter-Regular", fontSize: 23, fontWeight: 600, color: "#f2f2f3e6", lineHeight: 30 }, focused ? { color: "#f2f2f3" } : null], children: "Overdrive CDN" }),
/* @__PURE__ */ (0, jsxs)(View, { style: { marginTop: 9, flexDirection: "row", alignItems: "center", gap: 6 }, children: [
/* @__PURE__ */ (0, jsx)(Text, { focused, style: [{ fontFamily: "Inter-Regular", fontSize: 20, color: "#a3a3ab" }, focused ? { color: "#f2f2f3" } : null], children: t2("common.seeAll") }),
/* @__PURE__ */ (0, jsx)(Icon, { name: "chevronRight", size: 14, color: focused ? colors.fg : colors.muted })
] })
] })
] });
}
var CdnRail = (0, memo)(function CdnRail2() {
const { openGame, focusLater } = useNavActions();
const { setFilters, setQuery } = useStoreActions();
if (!SERVED.length) return null;
const browse = () => {
setFilters({ ...NO_FILTERS, provider: [CDN_HOST] });
setQuery("");
focusLater("catalog:filters");
};
return /* @__PURE__ */ (0, jsxs)(GameRail, { title: "Overdrive CDN", onSeeAll: browse, seeAllKey: "cdn:all", children: [
/* @__PURE__ */ (0, jsx)(View, { focusKey: "cdn:card", onPress: browse, children: /* @__PURE__ */ (0, jsx)(CollectionCard, {}) }),
SERVED.map((game, index) => {
const key = `cdn:${game.id}`;
return /* @__PURE__ */ (0, jsx)(
GameCard,
{
game,
width: WIDTH,
detailed: true,
focusKey: key,
rowEnd: index === SERVED.length - 1,
onPress: () => openGame(game.id, key)
},
game.id
);
})
] });
});
export { CdnRail };
+68
View File
@@ -0,0 +1,68 @@
// ../pub-game-store/native/browse/ContinueRow.jsx
// reconstructed from the esbuild bundle in eboot.bin
import '../assets/Inter-Regular.ttf';
import { Fragment, jsx, jsxs } from 'react/jsx-runtime';
import { memo } from 'react';
import { GameRail } from './GameRail.jsx';
import { WAITING, shownState, stateLabel } from '../downloads/labels.js';
import { fractionOf, useJobs, useProgress } from '../downloads/useQueue.js';
import { formatPercent2 } from '../i18n/core.js';
import { useT } from '../i18n/index.js';
import { getGame } from '../state/catalog.js';
import { BUSY } from '../state/download-queue.js';
import { useNavActions } from '../state/nav.jsx';
import { GameCard } from '../ui/GameCard.jsx';
import { ProgressBar } from '../ui/ProgressBar.jsx';
import { ShimmerText } from '../ui/ShimmerText.jsx';
import { Text, View, useIsFocused } from '@ps5-react/core';
var UNFINISHED = [...BUSY, "paused", "failed"];
var WIDTH2 = 152;
var STATE = { fontFamily: "Inter-Regular", fontSize: 21 };
function JobCaption({ job: job2 }) {
const t2 = useT();
const focused = useIsFocused();
const progress = useProgress(job2.id);
const fraction = fractionOf(progress);
const shown = shownState(job2);
const percent = progress?.total && job2.state !== "failed" ? ` \xB7 ${formatPercent2(Math.floor(fraction * 100))}` : "";
return /* @__PURE__ */ (0, jsxs)(Fragment, { children: [
/* @__PURE__ */ (0, jsx)(Text, { focused, style: [{ marginTop: 18, width: 225, fontFamily: "Inter-Regular", fontSize: 23, color: "#f2f2f3d9", numberOfLines: 1, ellipsizeMode: "tail" }, focused ? { color: "#f2f2f3" } : null], children: job2.title }),
/* @__PURE__ */ (0, jsx)(View, { style: { marginTop: 12 }, children: /* @__PURE__ */ (0, jsx)(ProgressBar, { fraction, width: WIDTH2, active: job2.state === "downloading" }) }),
WAITING.includes(shown) ? /* @__PURE__ */ (0, jsx)(View, { style: { marginTop: 9, width: 225 }, children: /* @__PURE__ */ (0, jsx)(ShimmerText, { textStyle: STATE, children: stateLabel(shown) }) }) : /* @__PURE__ */ (0, jsx)(Text, { style: job2.state === "failed" ? { marginTop: 9, width: 225, fontFamily: "Inter-Regular", fontSize: 21, color: "#f2f2f3", numberOfLines: 1, ellipsizeMode: "tail" } : { marginTop: 9, width: 225, fontFamily: "Inter-Regular", fontSize: 21, color: "#8a8a94", numberOfLines: 1, ellipsizeMode: "tail" }, children: job2.state === "failed" ? t2("browse.continueFailed") : `${stateLabel(job2.state)}${percent}` })
] });
}
var ContinueRow = (0, memo)(function ContinueRow2() {
const t2 = useT();
const { jobs } = useJobs();
const { push, openGame } = useNavActions();
const entries2 = jobs.filter((job2) => UNFINISHED.includes(job2.state)).map((job2) => ({ job: job2, game: getGame(job2.gameId) })).filter((entry2) => entry2.game);
if (!entries2.length) return null;
return /* @__PURE__ */ (0, jsx)(
GameRail,
{
title: t2("browse.continueDownloading"),
seeAllKey: "continue:all",
onSeeAll: () => push({ name: "downloads" }, "continue:all"),
children: entries2.map(({ job: job2, game }, index) => {
const key = `continue:${job2.id}`;
return /* @__PURE__ */ (0, jsx)(
GameCard,
{
game,
width: WIDTH2,
detailed: true,
focusKey: key,
rowEnd: index === entries2.length - 1,
onPress: () => openGame(game.id, key),
caption: /* @__PURE__ */ (0, jsx)(JobCaption, { job: job2 })
},
job2.id
);
})
}
);
});
export { ContinueRow };
+28
View File
@@ -0,0 +1,28 @@
// ../pub-game-store/native/browse/EmptyState.jsx
// reconstructed from the esbuild bundle in eboot.bin
import '../assets/Inter-Regular.ttf';
import { jsx, jsxs } from 'react/jsx-runtime';
import { useT } from '../i18n/index.js';
import { Button2 } from '../ui/Button.jsx';
import { Icon } from '../ui/Icon.jsx';
import { colors } from '../ui/colors.js';
import { Text, View } from '@ps5-react/core';
function copy(t2, query, onlyWishlist) {
if (query) return { title: t2("catalog.empty.queryTitle", { query }), hint: t2("catalog.empty.queryHint") };
if (onlyWishlist) return { title: t2("catalog.empty.wishlistTitle"), hint: t2("catalog.empty.wishlistHint") };
return { title: t2("catalog.empty.filtersTitle"), hint: t2("catalog.empty.filtersHint") };
}
function EmptyState({ query, onlyWishlist, onClear }) {
const t2 = useT();
const { title, hint } = copy(t2, query, onlyWishlist);
return /* @__PURE__ */ (0, jsxs)(View, { style: { marginTop: 36, alignItems: "center", paddingHorizontal: 36, paddingVertical: 120 }, children: [
/* @__PURE__ */ (0, jsx)(Icon, { name: onlyWishlist ? "heart" : "searchX", size: 32, color: colors.subtle }),
/* @__PURE__ */ (0, jsx)(Text, { style: { marginTop: 24, fontFamily: "Inter-Regular", fontSize: 27, fontWeight: 600, color: "#f2f2f3", lineHeight: 42 }, children: title }),
/* @__PURE__ */ (0, jsx)(Text, { style: { marginTop: 6, width: 720, textAlign: "center", fontFamily: "Inter-Regular", fontSize: 24, color: "#a3a3ab", lineHeight: 36 }, children: hint }),
/* @__PURE__ */ (0, jsx)(View, { style: { marginTop: 36 }, children: /* @__PURE__ */ (0, jsx)(Button2, { variant: "outline", label: t2("catalog.empty.browseAll"), focusKey: "catalog:empty", onPress: onClear }) })
] });
}
export { EmptyState };
+165
View File
@@ -0,0 +1,165 @@
// ../pub-game-store/native/browse/FilterDrawer.jsx
// reconstructed from the esbuild bundle in eboot.bin
import '../assets/Inter-Regular.ttf';
import { Fragment, jsx, jsxs } from 'react/jsx-runtime';
import { memo, useRef, useState } from 'react';
import { formatNumber2 } from '../i18n/core.js';
import { useT } from '../i18n/index.js';
import { FACETS, activeCount, facetCounts, facetTitle, filterGames, optionLabel } from '../state/catalog.js';
import { useNavActions } from '../state/nav.jsx';
import { useStore } from '../state/store.jsx';
import { Button2 } from '../ui/Button.jsx';
import { CdnAura, CdnSpark } from '../ui/CdnAura.jsx';
import { FocusRing } from '../ui/FocusRing.jsx';
import { useHints } from '../ui/Legend.jsx';
import { PlatformBadge } from '../ui/PlatformBadge.jsx';
import { SheetPanel } from '../ui/SideSheet.jsx';
import { EASE_OUT } from '../ui/ease.js';
import { AnimatePresence, FocusScope, ScrollView, Text, View, useIsFocused } from '@ps5-react/core';
var WIDTH3 = 480;
var slide = { type: "tween", duration: 0.24, ease: EASE_OUT };
var TILE_LIMIT = 3;
var PILL_LIMIT = 12;
function TileFace({ facet, value, label, count, active: active2 }) {
const t2 = useT();
const focused = useIsFocused();
return /* @__PURE__ */ (0, jsxs)(Fragment, { children: [
/* @__PURE__ */ (0, jsx)(FocusRing, {}),
facet === "platform" ? /* @__PURE__ */ (0, jsx)(PlatformBadge, { platforms: [value] }) : /* @__PURE__ */ (0, jsx)(Text, { style: active2 ? { fontFamily: "Inter-Regular", fontSize: 23, fontWeight: 600, color: "#000000" } : { fontFamily: "Inter-Regular", fontSize: 23, fontWeight: 600, color: "#f2f2f3" }, children: label }),
/* @__PURE__ */ (0, jsx)(Text, { style: active2 ? { fontFamily: "Inter-Regular", fontSize: 21, color: "#000000b3", lineHeight: 30 } : count === 0 ? { fontFamily: "Inter-Regular", fontSize: 21, color: "#8a8a9499", lineHeight: 30 } : focused ? { fontFamily: "Inter-Regular", fontSize: 21, color: "#f2f2f3", lineHeight: 30 } : { fontFamily: "Inter-Regular", fontSize: 21, color: "#8a8a94", lineHeight: 30 }, children: t2("catalog.gameCount", { count }) })
] });
}
var reachable2 = ({ count, active: active2 }) => count > 0 || active2;
function Tile({ focusKey, autoFocus, ...props }) {
const { active: active2, onPress } = props;
return /* @__PURE__ */ (0, jsx)(View, { focusKey, autoFocus, focusable: reachable2(props), onPress, style: (_state) => active2 ? { height: 108, flex: 1, justifyContent: "center", gap: 9, borderRadius: 12, backgroundColor: "#f2f2f3", paddingHorizontal: 24 } : [{ height: 108, flex: 1, justifyContent: "center", gap: 9, borderRadius: 12, borderWidth: 2, borderColor: "#2a2a2f", paddingHorizontal: 24 }, _state.focused ? { backgroundColor: "#212125" } : null], children: /* @__PURE__ */ (0, jsx)(TileFace, { ...props }) });
}
function PillFace({ label, count, active: active2 }) {
const focused = useIsFocused();
const empty = count === 0 && !active2;
return /* @__PURE__ */ (0, jsxs)(Fragment, { children: [
/* @__PURE__ */ (0, jsx)(FocusRing, { round: "full" }),
/* @__PURE__ */ (0, jsx)(Text, { style: active2 ? { fontFamily: "Inter-Regular", fontSize: 21, fontWeight: 600, color: "#000000", lineHeight: 30 } : empty ? { fontFamily: "Inter-Regular", fontSize: 21, color: "#8a8a9499", lineHeight: 30 } : focused ? { fontFamily: "Inter-Regular", fontSize: 21, color: "#f2f2f3", lineHeight: 30 } : { fontFamily: "Inter-Regular", fontSize: 21, color: "#f2f2f3d9", lineHeight: 30 }, children: label }),
/* @__PURE__ */ (0, jsx)(Text, { style: active2 ? { fontFamily: "Inter-Regular", fontSize: 20, color: "#00000099" } : { fontFamily: "Inter-Regular", fontSize: 20, color: "#8a8a94" }, children: formatNumber2(count) })
] });
}
function Pill({ label, count, active: active2, onPress, focusKey, autoFocus, value }) {
const cdn = value === "overdrive cdn" && !active2;
return /* @__PURE__ */ (0, jsxs)(View, { focusKey, autoFocus, focusable: reachable2({ count, active: active2 }), onPress, style: (_state2) => active2 ? { height: 60, flexDirection: "row", alignItems: "center", gap: 12, borderRadius: 14999, backgroundColor: "#f2f2f3", paddingHorizontal: 24 } : cdn ? { position: "relative", height: 60, flexDirection: "row", alignItems: "center", gap: 12, borderRadius: 14999, backgroundColor: "#17171a", paddingHorizontal: 24 } : [{ height: 60, flexDirection: "row", alignItems: "center", gap: 12, borderRadius: 14999, backgroundColor: "#17171a", paddingHorizontal: 24 }, _state2.focused ? { backgroundColor: "#2b2b30" } : null], children: [
cdn ? /* @__PURE__ */ (0, jsx)(CdnAura, { radius: 20, width: 170 }) : null,
cdn ? /* @__PURE__ */ (0, jsx)(CdnSpark, { size: 14 }) : null,
/* @__PURE__ */ (0, jsx)(PillFace, { label, count, active: active2 })
] });
}
function More({ count, onPress }) {
const t2 = useT();
const focused = useIsFocused();
return /* @__PURE__ */ (0, jsxs)(View, { onPress, style: (_state3) => [{ height: 60, flexDirection: "row", alignItems: "center", borderRadius: 14999, borderWidth: 2, borderColor: "#2a2a2f", paddingHorizontal: 24 }, _state3.focused ? { backgroundColor: "#2b2b30" } : null], children: [
/* @__PURE__ */ (0, jsx)(FocusRing, { round: "full" }),
/* @__PURE__ */ (0, jsx)(Text, { style: focused ? { fontFamily: "Inter-Regular", fontSize: 21, color: "#f2f2f3", lineHeight: 30 } : { fontFamily: "Inter-Regular", fontSize: 21, color: "#a3a3ab", lineHeight: 30 }, children: t2("filters.more", { count }) })
] });
}
function ClearFacet({ onPress }) {
const t2 = useT();
const focused = useIsFocused();
return /* @__PURE__ */ (0, jsxs)(View, { onPress, style: { borderRadius: 6, paddingHorizontal: 6 }, children: [
/* @__PURE__ */ (0, jsx)(FocusRing, {}),
/* @__PURE__ */ (0, jsx)(Text, { style: focused ? { fontFamily: "Inter-Regular", fontSize: 21, color: "#f2f2f3", lineHeight: 30 } : { fontFamily: "Inter-Regular", fontSize: 21, color: "#a3a3ab", lineHeight: 30 }, children: t2("filters.clearFacet") })
] });
}
function Facet({ facet, store, autoFocus }) {
const t2 = useT();
const [expanded, setExpanded] = (0, useState)(false);
const { focusLater } = useNavActions();
const counts = facetCounts(store, facet);
const picked = store.filters[facet.key];
const tiles = facet.options.length <= TILE_LIMIT;
const folded = !tiles && !expanded && facet.options.length > PILL_LIMIT;
const shown = folded ? facet.options.filter((option, index) => index < PILL_LIMIT || picked.includes(option.value)) : facet.options;
return /* @__PURE__ */ (0, jsxs)(View, { style: { gap: 18, borderBottomWidth: 2, borderColor: "#2a2a2f", paddingVertical: 30 }, children: [
/* @__PURE__ */ (0, jsxs)(View, { style: { height: 36, flexDirection: "row", alignItems: "center", justifyContent: "space-between" }, children: [
/* @__PURE__ */ (0, jsx)(Text, { style: { fontFamily: "Inter-Regular", fontSize: 20, fontWeight: 600, color: "#a3a3ab", letterSpacing: 1.6 }, children: facetTitle(facet.key).toUpperCase() }),
picked.length > 0 && /* @__PURE__ */ (0, jsxs)(View, { style: { flexDirection: "row", alignItems: "center", gap: 18 }, children: [
/* @__PURE__ */ (0, jsx)(Text, { style: { fontFamily: "Inter-Regular", fontSize: 21, color: "#f2f2f3", lineHeight: 30 }, children: t2("filters.selected", { count: picked.length }) }),
/* @__PURE__ */ (0, jsx)(ClearFacet, { onPress: () => {
store.setFilters({ ...store.filters, [facet.key]: [] });
focusLater(`filters:${facet.key}`);
} })
] })
] }),
/* @__PURE__ */ (0, jsxs)(View, { style: tiles ? { flexDirection: "row", gap: 18 } : { flexDirection: "row", flexWrap: "wrap", gap: 12 }, children: [
shown.map((option, index) => {
const { value } = option;
const props = {
facet: facet.key,
value,
label: optionLabel(option),
count: counts[value],
active: picked.includes(value),
onPress: () => store.toggleFilter(facet.key, value),
focusKey: index === 0 ? `filters:${facet.key}` : `filters:${facet.key}:${value}`,
autoFocus: index === 0 && autoFocus
};
return tiles ? /* @__PURE__ */ (0, jsx)(Tile, { ...props }, value) : /* @__PURE__ */ (0, jsx)(Pill, { value, ...props }, value);
}),
folded && /* @__PURE__ */ (0, jsx)(More, { count: facet.options.length - shown.length, onPress: () => {
setExpanded(true);
focusLater(`filters:${facet.key}:${facet.options[PILL_LIMIT].value}`);
} })
] })
] });
}
var HINTS3 = [{ button: "cross", label: "hints.toggle" }, { button: "circle", label: "hints.close" }];
function Panel({ onClose }) {
useHints(HINTS3);
const t2 = useT();
const store = useStore();
const { filters, clearFilters } = store;
const { focusLater } = useNavActions();
const count = activeCount(filters);
const total = filterGames(store).length;
const opened = (0, useRef)(JSON.stringify(filters));
const close = () => {
if (JSON.stringify(filters) !== opened.current) focusLater("catalog:filters");
onClose();
return true;
};
return (
// A modal: the shoulder buttons would switch the header's section under it, so every action stops here.
/* @__PURE__ */ (0, jsxs)(FocusScope, { trap: true, onBack: close, onAction: (action) => action !== "triangle" && action !== "options" || close(), children: [
/* @__PURE__ */ (0, jsxs)(View, { style: { height: 96, flexDirection: "row", alignItems: "center", gap: 18, borderBottomWidth: 2, borderColor: "#2a2a2f" }, children: [
/* @__PURE__ */ (0, jsx)(Text, { style: { fontFamily: "Inter-Regular", fontSize: 30, fontWeight: 600, color: "#f2f2f3", lineHeight: 42, letterSpacing: -0.75 }, children: t2("filters.title") }),
count > 0 && /* @__PURE__ */ (0, jsx)(View, { style: { height: 36, minWidth: 36, alignItems: "center", justifyContent: "center", borderRadius: 14999, backgroundColor: "#f2f2f3", paddingHorizontal: 12 }, children: /* @__PURE__ */ (0, jsx)(Text, { style: { fontFamily: "Inter-Regular", fontSize: 20, fontWeight: 600, color: "#000000" }, children: String(count) }) }),
/* @__PURE__ */ (0, jsx)(View, { style: { flex: 1 } }),
/* @__PURE__ */ (0, jsx)(Text, { style: { fontFamily: "Inter-Regular", fontSize: 21, color: "#a3a3ab", lineHeight: 30 }, children: t2("catalog.gameCount", { count: total }) })
] }),
/* @__PURE__ */ (0, jsxs)(ScrollView, { style: { marginHorizontal: -24, flex: 1, paddingHorizontal: 24 }, children: [
FACETS.map((facet, index) => /* @__PURE__ */ (0, jsx)(Facet, { facet, store, autoFocus: index === 0 }, facet.key)),
/* @__PURE__ */ (0, jsxs)(View, { style: { flexDirection: "row", gap: 18, paddingBottom: 36, paddingTop: 30 }, children: [
count > 0 && /* @__PURE__ */ (0, jsx)(Button2, { variant: "secondary", size: "lg", label: t2("filters.clearAll"), onPress: () => {
clearFilters();
focusLater(`filters:${FACETS[0].key}`);
} }),
/* @__PURE__ */ (0, jsx)(Button2, { variant: "primary", size: "lg", style: { flex: 1 }, label: t2("filters.show", { count: total }), onPress: close })
] })
] })
] })
);
}
var FilterDrawer = (0, memo)(function FilterDrawer2({ open, onClose, onClosed }) {
return /* @__PURE__ */ (0, jsx)(AnimatePresence, { onExitComplete: onClosed, children: open && /* @__PURE__ */ (0, jsx)(View, { style: { position: "absolute", top: 0, right: 0, bottom: 0, left: 0, zIndex: 30 }, children: /* @__PURE__ */ (0, jsx)(
SheetPanel,
{
style: { width: 720, paddingHorizontal: 36 },
initial: { x: WIDTH3 },
animate: { x: 0 },
exit: { x: WIDTH3, transition: { ...slide, duration: 0.16 } },
transition: slide,
children: /* @__PURE__ */ (0, jsx)(Panel, { onClose })
}
) }, "drawer") });
});
export { FilterDrawer };
+34
View File
@@ -0,0 +1,34 @@
// ../pub-game-store/native/browse/GameRail.jsx
// reconstructed from the esbuild bundle in eboot.bin
import '../assets/Inter-Regular.ttf';
import { Fragment, jsx, jsxs } from 'react/jsx-runtime';
import { FocusRing } from '../ui/FocusRing.jsx';
import { Icon } from '../ui/Icon.jsx';
import { colors } from '../ui/colors.js';
import { ScrollView, Text, View, useIsFocused } from '@ps5-react/core';
function TitleLink({ title }) {
const focused = useIsFocused();
return /* @__PURE__ */ (0, jsxs)(Fragment, { children: [
/* @__PURE__ */ (0, jsx)(FocusRing, {}),
/* @__PURE__ */ (0, jsx)(Text, { style: { fontFamily: "Inter-Regular", fontSize: 30, fontWeight: 600, color: "#f2f2f3", lineHeight: 42, letterSpacing: -0.75 }, children: title }),
/* @__PURE__ */ (0, jsx)(Icon, { name: "chevronRight", size: 16, color: focused ? colors.fg : colors.muted })
] });
}
var Arrow = ({ name }) => /* @__PURE__ */ (0, jsx)(View, { style: { width: 48, height: 48, alignItems: "center", justifyContent: "center", borderRadius: 14999, backgroundColor: "#17171a" }, children: /* @__PURE__ */ (0, jsx)(Icon, { name, size: 16, color: colors.muted, fixed: true }) });
var LTR = { direction: "ltr" };
function GameRail({ title, onSeeAll, seeAllKey, children }) {
return /* @__PURE__ */ (0, jsxs)(View, { scrollAnchor: true, children: [
/* @__PURE__ */ (0, jsxs)(View, { style: { marginBottom: 24, flexDirection: "row", alignItems: "center", justifyContent: "space-between" }, children: [
onSeeAll ? /* @__PURE__ */ (0, jsx)(View, { onPress: onSeeAll, focusKey: seeAllKey, style: { flexDirection: "row", alignItems: "center", gap: 6, borderRadius: 9 }, children: /* @__PURE__ */ (0, jsx)(TitleLink, { title }) }) : /* @__PURE__ */ (0, jsx)(Text, { style: { fontFamily: "Inter-Regular", fontSize: 30, fontWeight: 600, color: "#f2f2f3", lineHeight: 42, letterSpacing: -0.75 }, children: title }),
/* @__PURE__ */ (0, jsxs)(View, { style: [{ flexDirection: "row", gap: 12 }, LTR], children: [
/* @__PURE__ */ (0, jsx)(Arrow, { name: "chevronLeft" }),
/* @__PURE__ */ (0, jsx)(Arrow, { name: "chevronRight" })
] })
] }),
/* @__PURE__ */ (0, jsx)(View, { style: { marginHorizontal: -12, marginVertical: -24 }, children: /* @__PURE__ */ (0, jsx)(ScrollView, { style: [{ flexDirection: "row", gap: 36, paddingHorizontal: 12, paddingVertical: 24 }, LTR], children }) })
] });
}
export { GameRail };
+62
View File
@@ -0,0 +1,62 @@
// ../pub-game-store/native/browse/GenreCard.jsx
// reconstructed from the esbuild bundle in eboot.bin
import '../assets/Inter-Regular.ttf';
import { jsx, jsxs } from 'react/jsx-runtime';
import { memo } from 'react';
import { useT } from '../i18n/index.js';
import { genreLabel } from '../state/catalog.js';
import { Cover } from '../ui/Cover.jsx';
import { FocusFrame } from '../ui/FocusRing.jsx';
import { Icon } from '../ui/Icon.jsx';
import { Shine } from '../ui/Shine.jsx';
import { colors } from '../ui/colors.js';
import { EASE_OUT } from '../ui/ease.js';
import { Text, View, motion, useIsFocused } from '@ps5-react/core';
var spread = { type: "tween", duration: 0.3, ease: EASE_OUT };
var cover = { width: 126, height: 168, borderRadius: 12 };
var side = { width: 113, height: 151, borderRadius: 12 };
var front = { position: "absolute", left: 87, top: 24, zIndex: 10 };
var OPEN = [-12.6, 12.6];
function Fan({ covers }) {
const focused = useIsFocused();
return covers.slice(1).map(
(game, index) => /* @__PURE__ */ (0, jsx)(
motion.View,
{
style: index === 0 ? { position: "absolute", left: 18, top: 32 } : { position: "absolute", left: 169, top: 32 },
initial: false,
animate: { x: focused ? OPEN[index] : 0 },
transition: spread,
children: /* @__PURE__ */ (0, jsx)(Cover, { game, style: side, label: false })
},
game.id
)
);
}
var GenreCard = (0, memo)(function GenreCard2({ genre, count, covers, active: active2, onToggle }) {
const t2 = useT();
return /* @__PURE__ */ (0, jsxs)(
motion.View,
{
focusKey: `genre:${genre}`,
onPress: () => onToggle(genre),
selected: active2,
whileFocus: { y: -6 },
transition: spread,
style: (_state) => [{ width: 300, borderRadius: 18, backgroundColor: "#17171a", paddingHorizontal: 24, paddingBottom: 24, paddingTop: 216 }, active2 ? { backgroundColor: "#212125" } : null, _state.focused ? { backgroundColor: "#212125" } : null],
children: [
/* @__PURE__ */ (0, jsx)(Fan, { covers }),
covers[0] && /* @__PURE__ */ (0, jsx)(Cover, { game: covers[0], style: [cover, front], label: false }),
active2 && /* @__PURE__ */ (0, jsx)(View, { style: { position: "absolute", right: 18, top: 18, zIndex: 20, width: 36, height: 36, alignItems: "center", justifyContent: "center", borderRadius: 14999, backgroundColor: "#f2f2f3" }, children: /* @__PURE__ */ (0, jsx)(Icon, { name: "check", size: 14, strokeWidth: 3, color: colors.canvas }) }),
/* @__PURE__ */ (0, jsx)(Text, { style: { fontFamily: "Inter-Regular", fontSize: 24, color: "#f2f2f3", lineHeight: 36 }, children: genreLabel(genre) }),
/* @__PURE__ */ (0, jsx)(Text, { style: { fontFamily: "Inter-Regular", fontSize: 21, color: "#8a8a94", lineHeight: 30 }, children: t2("catalog.gameCount", { count }) }),
/* @__PURE__ */ (0, jsx)(Shine, { width: 200, round: "xl" }),
/* @__PURE__ */ (0, jsx)(FocusFrame, { round: "xl" })
]
}
);
});
export { GenreCard };
+46
View File
@@ -0,0 +1,46 @@
// ../pub-game-store/native/browse/GenreRail.jsx
// reconstructed from the esbuild bundle in eboot.bin
import { jsx, jsxs } from 'react/jsx-runtime';
import { useState } from 'react';
import { GenreCard } from './GenreCard.jsx';
import { games } from '../data/catalog.js';
import { useT } from '../i18n/index.js';
import { genres } from '../state/catalog.js';
import { useStoreActions, useStoreState } from '../state/store.jsx';
import { SectionHeader } from '../ui/SectionHeader.jsx';
import { ScrollView, View } from '@ps5-react/core';
var used = /* @__PURE__ */ new Set();
var RAIL = genres.map((genre) => ({ genre, matches: games.filter((game) => game.genres.includes(genre)).sort((a, b) => b.recommendations - a.recommendations) })).filter(({ matches }) => matches.length >= 3).sort((a, b) => b.matches.length - a.matches.length).map(({ genre, matches }) => {
const covers = [...matches.filter((game) => !used.has(game.id)), ...matches.filter((game) => used.has(game.id))].slice(0, 3);
covers.forEach((game) => used.add(game.id));
return { genre, count: matches.length, covers };
});
function GenreRail() {
const t2 = useT();
const { filters } = useStoreState();
const { toggleFilter } = useStoreActions();
const [toggleGenre] = (0, useState)(() => (genre) => toggleFilter("genre", genre));
return /* @__PURE__ */ (0, jsxs)(View, { scrollAnchor: true, children: [
/* @__PURE__ */ (0, jsx)(SectionHeader, { title: t2("browse.popularGenres") }),
/* @__PURE__ */ (0, jsxs)(View, { style: { position: "relative", marginHorizontal: -9, marginVertical: -30 }, children: [
/* @__PURE__ */ (0, jsx)(ScrollView, { style: [{ flexDirection: "row", gap: 18, paddingHorizontal: 9, paddingVertical: 30 }, { direction: "ltr" }], children: RAIL.map(
({ genre, count, covers }) => /* @__PURE__ */ (0, jsx)(
GenreCard,
{
genre,
count,
covers,
active: filters.genre.includes(genre),
onToggle: toggleGenre
},
genre
)
) }),
/* @__PURE__ */ (0, jsx)(View, { style: { position: "absolute", top: 0, bottom: 0, right: 0, width: 96, backgroundGradient: { type: "linear", to: "right", stops: [{ color: "transparent", offset: 0 }, { color: "#000000", offset: 1 }] } } })
] })
] });
}
export { GenreRail };
+22
View File
@@ -0,0 +1,22 @@
// ../pub-game-store/native/browse/PageHints.jsx
// reconstructed from the esbuild bundle in eboot.bin
import { useNavState } from '../state/nav.jsx';
import { HINT, useHints } from '../ui/Legend.jsx';
import { useFocus } from '@ps5-react/core';
var CATALOG = [HINT.select, { button: "triangle", label: "hints.filters" }, HINT.favorite, HINT.top, HINT.sections];
var CARDS = [HINT.select, HINT.favorite, HINT.top, HINT.sections];
function hintsFor(key) {
if (/^(card|catalog|chip):/.test(key)) return CATALOG;
if (/^(popular|recent|continue):/.test(key) && !key.endsWith(":all")) return CARDS;
return null;
}
function PageHints() {
const { focusedKey: focusedKey2 } = useFocus();
const shown = useNavState().top.name === "browse";
useHints(shown ? hintsFor(focusedKey2 ?? "") : null);
return null;
}
export { PageHints };
+44
View File
@@ -0,0 +1,44 @@
// ../pub-game-store/native/browse/PopularRail.jsx
// reconstructed from the esbuild bundle in eboot.bin
import { jsx } from 'react/jsx-runtime';
import { memo } from 'react';
import { GameRail } from './GameRail.jsx';
import { games } from '../data/catalog.js';
import { useT } from '../i18n/index.js';
import { NO_FILTERS, showcase, sortGames } from '../state/catalog.js';
import { useNavActions } from '../state/nav.jsx';
import { useStoreActions } from '../state/store.jsx';
import { GameCard } from '../ui/GameCard.jsx';
var WIDTH4 = 152;
var POPULAR = showcase(sortGames(games, "relevance"), 15);
var FIRST_POPULAR = `popular:${POPULAR[0].id}`;
var PopularRail = (0, memo)(function PopularRail2() {
const t2 = useT();
const { openGame, focusLater } = useNavActions();
const { setFilters, setQuery, setSort } = useStoreActions();
const seeAll = () => {
setFilters(NO_FILTERS);
setQuery("");
setSort("relevance");
focusLater("catalog:sort");
};
return /* @__PURE__ */ (0, jsx)(GameRail, { title: t2("browse.popularNow"), onSeeAll: seeAll, seeAllKey: "popular:all", children: POPULAR.map((game, index) => {
const key = `popular:${game.id}`;
return /* @__PURE__ */ (0, jsx)(
GameCard,
{
game,
width: WIDTH4,
detailed: true,
focusKey: key,
rowEnd: index === POPULAR.length - 1,
onPress: () => openGame(game.id, key)
},
game.id
);
}) });
});
export { FIRST_POPULAR, PopularRail };
+41
View File
@@ -0,0 +1,41 @@
// ../pub-game-store/native/browse/RecentRow.jsx
// reconstructed from the esbuild bundle in eboot.bin
import { jsx } from 'react/jsx-runtime';
import { memo, useRef } from 'react';
import { GameRail } from './GameRail.jsx';
import { useT } from '../i18n/index.js';
import { getGame, listedId } from '../state/catalog.js';
import { useNavActions, useNavState } from '../state/nav.jsx';
import { useRecent } from '../state/recent.js';
import { GameCard } from '../ui/GameCard.jsx';
function RecentRow() {
return /* @__PURE__ */ (0, jsx)(Recent, { shown: useNavState().top.name === "browse" });
}
var Recent = (0, memo)(function Recent2({ shown }) {
const t2 = useT();
const recent2 = useRecent();
const kept = (0, useRef)(recent2);
if (shown) kept.current = recent2;
const { openGame } = useNavActions();
const games2 = [...new Set(kept.current.map(listedId))].map(getGame).filter(Boolean);
if (!games2.length) return null;
return /* @__PURE__ */ (0, jsx)(GameRail, { title: t2("browse.recentlyViewed"), children: games2.map((game, index) => {
const key = `recent:${game.id}`;
return /* @__PURE__ */ (0, jsx)(
GameCard,
{
game,
width: 152,
detailed: true,
focusKey: key,
rowEnd: index === games2.length - 1,
onPress: () => openGame(game.id, key)
},
game.id
);
}) });
});
export { RecentRow };
+63
View File
@@ -0,0 +1,63 @@
// ../pub-game-store/native/browse/SortSelect.jsx
// reconstructed from the esbuild bundle in eboot.bin
import '../assets/Inter-Regular.ttf';
import { Fragment, jsx, jsxs } from 'react/jsx-runtime';
import { memo, useState } from 'react';
import { SPAN_MAX, fitBytes } from '../i18n/fit.js';
import { useLocale, useT } from '../i18n/index.js';
import { SORTS, sortLabel } from '../state/catalog.js';
import { useStoreActions, useStoreState } from '../state/store.jsx';
import { FocusRing } from '../ui/FocusRing.jsx';
import { Icon } from '../ui/Icon.jsx';
import { Menu, MenuItem } from '../ui/Menu.jsx';
import { colors } from '../ui/colors.js';
import { Text, View, motion, useIsFocused } from '@ps5-react/core';
function Trigger({ sort, open }) {
const t2 = useT();
const focused = useIsFocused();
return /* @__PURE__ */ (0, jsxs)(Fragment, { children: [
/* @__PURE__ */ (0, jsx)(FocusRing, { round: "full" }),
/* @__PURE__ */ (0, jsxs)(Text, { focused, style: [{ fontFamily: "Inter-Regular", fontSize: 21, color: "#a3a3ab", lineHeight: 30 }, focused ? { color: "#f2f2f3d9" } : null], children: [
fitBytes(t2("sort.label"), SPAN_MAX),
/* @__PURE__ */ (0, jsx)(Text, { style: { color: "#f2f2f3" }, children: fitBytes(` ${sortLabel(sort)}`, SPAN_MAX) })
] }),
/* @__PURE__ */ (0, jsx)(
motion.View,
{
initial: false,
animate: { rotate: open ? 180 : 0 },
transition: { type: "tween", duration: 0.2, ease: "easeOut" },
children: /* @__PURE__ */ (0, jsx)(Icon, { name: "chevronDown", color: focused ? colors.fg : colors.muted })
}
)
] });
}
var SortSelect = (0, memo)(function SortSelect2() {
const { rtl } = useLocale();
const { sort } = useStoreState();
const { setSort } = useStoreActions();
const [open, setOpen] = (0, useState)(false);
return /* @__PURE__ */ (0, jsxs)(View, { style: { position: "relative", zIndex: 10 }, children: [
/* @__PURE__ */ (0, jsx)(View, { focusKey: "catalog:sort", selected: open, onPress: () => setOpen((value) => !value), style: (_state) => [
{ height: 60, flexDirection: "row", alignItems: "center", gap: 12, borderRadius: 14999, backgroundColor: "#17171a" },
rtl ? { paddingRight: 24, paddingLeft: 18 } : { paddingLeft: 24, paddingRight: 18 },
open ? { backgroundColor: "#2b2b30" } : null,
_state.focused ? { backgroundColor: "#2b2b30" } : null
], children: /* @__PURE__ */ (0, jsx)(Trigger, { sort, open }) }),
/* @__PURE__ */ (0, jsx)(Menu, { open, onClose: () => setOpen(false), align: "left", rows: SORTS.length, children: SORTS.map(
(option) => /* @__PURE__ */ (0, jsx)(
MenuItem,
{
label: sortLabel(option.id),
checked: sort === option.id,
onSelect: () => setSort(option.id)
},
option.id
)
) })
] });
});
export { SortSelect };
+165
View File
@@ -0,0 +1,165 @@
// ../pub-game-store/native/browse/Spotlight.jsx
// reconstructed from the esbuild bundle in eboot.bin
import '../assets/Inter-Regular.ttf';
import { jsx, jsxs } from 'react/jsx-runtime';
import { memo, useEffect, useRef, useState } from 'react';
import { FIRST_POPULAR } from './PopularRail.jsx';
import { SpotlightList } from './SpotlightList.jsx';
import { useSlides } from './useSlides.js';
import { games } from '../data/catalog.js';
import { LATIN_IN_RTL, focusEnd, useLocale, useT } from '../i18n/index.js';
import { fromArchive, genreLabel, sortGames, summaryOf } from '../state/catalog.js';
import { useNavActions, useNavState } from '../state/nav.jsx';
import { useStoreActions, useWishlist } from '../state/store.jsx';
import { Button2 } from '../ui/Button.jsx';
import { GameLogo, logoStyle } from '../ui/GameLogo.jsx';
import { WishHeart } from '../ui/WishHeart.jsx';
import { EASE_OUT } from '../ui/ease.js';
import { AnimatePresence, Image, Text, View, motion } from '@ps5-react/core';
var NEWEST = 150;
var shuffle = (list) => {
for (let i = list.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[list[i], list[j]] = [list[j], list[i]];
}
return list;
};
function selectFeatured() {
const eligible = games.filter((game) => game.art.logo && fromArchive(game));
const pool = eligible.length >= 5 ? eligible : games.filter((game) => game.art.logo);
const byFame = [...pool].sort((a, b) => b.recommendations - a.recommendations);
const latest2 = new Set(sortGames(games, "newest").slice(0, NEWEST));
const recent2 = shuffle(byFame.filter((game) => latest2.has(game)).slice(0, 10)).slice(0, 2);
const famous = shuffle(byFame.filter((game) => !recent2.includes(game)).slice(0, 20)).slice(0, 5 - recent2.length);
return shuffle([...famous, ...recent2]);
}
var featured = selectFeatured();
var ART = { width: 1410, height: 660 };
var LOGO2 = [320, 112, 48 * 256];
function prefetchSlides() {
for (const game of featured) {
if (game.art.hero) Image.prefetch(game.art.hero, ART).catch(() => {
});
if (game.art.logo) Image.prefetch(game.art.logo, { ...logoStyle(game, ...LOGO2), resizeMode: "contain" }).catch(() => {
});
}
}
function Art({ game }) {
const [shown, setShown] = (0, useState)(game);
(0, useEffect)(() => {
if (shown === game) return void 0;
const id = setTimeout(() => setShown(game), 20);
return () => clearTimeout(id);
}, [game, shown]);
if (!shown.art.hero) return null;
return /* @__PURE__ */ (0, jsx)(
Image,
{
source: { uri: shown.art.hero },
resizeMode: "cover",
style: [{ position: "absolute", top: 0, right: 0, bottom: 0, left: 0, borderRadius: 18 }, shown.art.tint ? { ...ART, backgroundColor: shown.art.tint } : ART]
}
);
}
function Blurb({ game }) {
useT();
const { rtl } = useLocale();
const [ready, setReady] = (0, useState)(null);
const current = (0, useRef)(game.id);
current.current = game.id;
(0, useEffect)(() => {
const id2 = setTimeout(() => setReady(game.id), 800);
return () => clearTimeout(id2);
}, [game.id]);
const id = game.id;
return /* @__PURE__ */ (0, jsx)(AnimatePresence, { mode: "wait", initial: false, children: /* @__PURE__ */ (0, jsxs)(
motion.View,
{
style: { gap: 30 },
initial: { opacity: 0, y: 12 },
animate: ready === game.id ? { opacity: 1, y: 0 } : { opacity: 0, y: 12 },
exit: { opacity: 0, y: -6, transition: { type: "tween", duration: 0.15, ease: "easeIn" } },
transition: { type: "tween", duration: 0.45, ease: EASE_OUT },
children: [
/* @__PURE__ */ (0, jsx)(
GameLogo,
{
game,
width: LOGO2[0],
height: LOGO2[1],
area: LOGO2[2],
onReady: () => current.current === id && setReady(id)
}
),
/* @__PURE__ */ (0, jsx)(Text, { style: { marginBottom: -12, fontFamily: "Inter-Regular", fontSize: 21, color: "#a3a3ab", lineHeight: 30 }, children: game.genres.map(genreLabel).join(" \xB7 ") }),
/* @__PURE__ */ (0, jsx)(Text, { style: [{ width: 552, fontFamily: "Inter-Regular", fontSize: 23, color: "#f2f2f3d9", numberOfLines: 3, ellipsizeMode: "tail", lineHeight: 37 }, rtl ? LATIN_IN_RTL : void 0], children: summaryOf(game) })
]
},
game.id
) });
}
function WishButton({ id, toList }) {
const t2 = useT();
const { rtl } = useLocale();
const wishlist = useWishlist();
const { toggleWish } = useStoreActions();
const wished = wishlist.includes(id);
return /* @__PURE__ */ (0, jsx)(
Button2,
{
variant: "outline",
size: "lg",
label: wished ? t2("browse.favorited") : t2("browse.addToFavorites"),
focusKey: "spotlight:wish",
nextFocusUp: "nav:current",
nextFocusDown: FIRST_POPULAR,
...focusEnd(rtl, toList),
onPress: () => toggleWish(id),
children: /* @__PURE__ */ (0, jsx)(WishHeart, { active: wished })
}
);
}
function Spotlight() {
return /* @__PURE__ */ (0, jsx)(Carousel, { shown: useNavState().top.name === "browse" });
}
var Carousel = (0, memo)(function Carousel2({ shown }) {
const t2 = useT();
const { rtl } = useLocale();
const slides = useSlides(featured.length, shown);
const { openGame } = useNavActions();
const game = featured[slides.active];
(0, useEffect)(() => {
const id = setTimeout(prefetchSlides, 1500);
return () => clearTimeout(id);
}, []);
return /* @__PURE__ */ (0, jsxs)(View, { style: { flexDirection: "row", gap: 24 }, children: [
/* @__PURE__ */ (0, jsxs)(View, { style: { position: "relative", width: 1410, height: 660, overflow: "hidden", borderRadius: 18, backgroundColor: "#212125" }, children: [
/* @__PURE__ */ (0, jsx)(Art, { game }),
/* @__PURE__ */ (0, jsx)(View, { style: rtl ? { position: "absolute", top: 0, right: 0, bottom: 0, left: 0, backgroundGradient: { type: "linear", to: "left", stops: [{ color: "#000000", offset: 0 }, { color: "#000000bf", offset: 0.35 }, { color: "transparent", offset: 0.75 }] } } : { position: "absolute", top: 0, right: 0, bottom: 0, left: 0, backgroundGradient: { type: "linear", to: "right", stops: [{ color: "#000000", offset: 0 }, { color: "#000000bf", offset: 0.35 }, { color: "transparent", offset: 0.75 }] } } }),
/* @__PURE__ */ (0, jsx)(View, { style: { position: "absolute", top: 0, right: 0, bottom: 0, left: 0, backgroundGradient: { type: "linear", to: "top", stops: [{ color: "#000000b3", offset: 0 }, { color: "transparent", offset: 0.5 }] } } }),
/* @__PURE__ */ (0, jsxs)(View, { style: rtl ? { position: "absolute", top: 0, bottom: 0, right: 0, width: 672, justifyContent: "flex-end", padding: 60 } : { position: "absolute", top: 0, bottom: 0, left: 0, width: 672, justifyContent: "flex-end", padding: 60 }, children: [
/* @__PURE__ */ (0, jsx)(Blurb, { game }),
/* @__PURE__ */ (0, jsxs)(View, { style: { marginTop: 30, flexDirection: "row", gap: 12 }, children: [
/* @__PURE__ */ (0, jsx)(
Button2,
{
variant: "primary",
size: "lg",
label: t2("browse.viewGame"),
focusKey: "spotlight:cta",
nextFocusUp: "nav:current",
nextFocusDown: FIRST_POPULAR,
onPress: () => openGame(game.id, "spotlight:cta")
}
),
/* @__PURE__ */ (0, jsx)(WishButton, { id: game.id, toList: `spotlight:${slides.active}` })
] })
] })
] }),
/* @__PURE__ */ (0, jsx)(SpotlightList, { games: featured, slides })
] });
});
export { Spotlight };
+86
View File
@@ -0,0 +1,86 @@
// ../pub-game-store/native/browse/SpotlightList.jsx
// reconstructed from the esbuild bundle in eboot.bin
import '../assets/Inter-Regular.ttf';
import { jsx, jsxs } from 'react/jsx-runtime';
import { memo, useMemo } from 'react';
import { SLIDE_MS } from './useSlides.js';
import { focusEnd, focusStart, latin, useLocale } from '../i18n/index.js';
import { Cover } from '../ui/Cover.jsx';
import { FocusFrame } from '../ui/FocusRing.jsx';
import { Shine } from '../ui/Shine.jsx';
import { lightGame, unlight } from '../ui/lightBar.js';
import { Text, View, motion, useIsFocused } from '@ps5-react/core';
var TRACK = 240;
var cover2 = { height: "100%", aspectRatio: 0.75, borderRadius: 9 };
function Progress({ left, paused }) {
const { rtl } = useLocale();
const sign = rtl ? -1 : 1;
const x = -TRACK * left / SLIDE_MS * sign;
return /* @__PURE__ */ (0, jsx)(View, { style: { position: "absolute", left: 15, right: 15, bottom: 9, height: 3, overflow: "hidden", borderRadius: 14999, backgroundColor: "#ffffff1a" }, children: /* @__PURE__ */ (0, jsx)(
motion.View,
{
style: { position: "absolute", top: 0, bottom: 0, left: 0, width: 360, backgroundColor: "#f2f2f3" },
initial: { x: -TRACK * sign },
animate: { x: paused ? x : 0 },
transition: paused ? { type: "tween", duration: 0 } : { type: "tween", duration: left / 1e3, ease: "linear" }
}
) });
}
function Title2({ title, active: active2 }) {
const focused = useIsFocused();
const { rtl } = useLocale();
return /* @__PURE__ */ (0, jsx)(Text, { selected: active2 || focused, style: [{ width: 264, fontFamily: "Inter-Regular", fontSize: 21, color: "#a3a3ab", numberOfLines: 2, ellipsizeMode: "tail", lineHeight: 30 }, active2 || focused ? { color: "#f2f2f3" } : null], children: latin(rtl, title) });
}
var Item = (0, memo)(function Item2({ game, index, active: active2, progress, select, hold }) {
const { rtl } = useLocale();
return /* @__PURE__ */ (0, jsxs)(
View,
{
focusKey: `spotlight:${index}`,
selected: active2,
nextFocusUp: index === 0 ? "nav:current" : void 0,
...focusStart(rtl, "spotlight:wish"),
...focusEnd(rtl, `spotlight:${index}`),
onFocus: () => {
select(index);
hold(true);
lightGame(`spotlight:${index}`, game);
},
onBlur: () => {
hold(false);
unlight(`spotlight:${index}`);
},
onPress: () => select(index),
style: [{ position: "relative", flex: 1, flexDirection: "row", alignItems: "center", gap: 21, borderRadius: 18, padding: 15 }, active2 ? { backgroundColor: "#17171a" } : null],
children: [
/* @__PURE__ */ (0, jsx)(Shine, { width: 260, round: "xl" }),
/* @__PURE__ */ (0, jsx)(FocusFrame, { round: "xl" }),
/* @__PURE__ */ (0, jsx)(Cover, { game, style: cover2, label: false }),
/* @__PURE__ */ (0, jsx)(Title2, { title: game.title, active: active2 }),
progress && /* @__PURE__ */ (0, jsx)(Progress, { left: progress.left, paused: progress.paused })
]
}
);
});
function SpotlightList({ games: games2, slides }) {
const { active: active2, left, paused, select, hold } = slides;
const progress = (0, useMemo)(() => ({ left, paused }), [left, paused]);
return /* @__PURE__ */ (0, jsx)(View, { style: { width: 390, gap: 6 }, children: games2.map(
(game, index) => /* @__PURE__ */ (0, jsx)(
Item,
{
game,
index,
active: index === active2,
progress: index === active2 ? progress : null,
select,
hold
},
game.id
)
) });
}
export { SpotlightList };
+79
View File
@@ -0,0 +1,79 @@
// ../pub-game-store/native/browse/TopCharts.jsx
// reconstructed from the esbuild bundle in eboot.bin
import '../assets/Inter-Regular.ttf';
import { Fragment, jsx, jsxs } from 'react/jsx-runtime';
import { games } from '../data/catalog.js';
import { prefetchWhenSettled } from '../game/art.js';
import { latin, useLocale, useT } from '../i18n/index.js';
import { NO_FILTERS, formatCount, formatDate3, showcase, sortGames, sortLabel } from '../state/catalog.js';
import { useNavActions } from '../state/nav.jsx';
import { useStoreActions } from '../state/store.jsx';
import { Cover } from '../ui/Cover.jsx';
import { FocusFrame } from '../ui/FocusRing.jsx';
import { SectionHeader } from '../ui/SectionHeader.jsx';
import { lightGame, unlight } from '../ui/lightBar.js';
import { Text, View } from '@ps5-react/core';
var CHARTS = ["relevance", "newest", "rating"].map((id) => ({ id, games: showcase(sortGames(games, id), 5) }));
var DETAIL = {
relevance: (t2, game) => t2("browse.reviews", { count: formatCount(game.recommendations) }),
newest: (t2, game) => formatDate3(game.releaseDate)
};
var thumb = { width: 66, height: 87, borderRadius: 9 };
function Detail({ chart, game }) {
const t2 = useT();
if (chart !== "rating") return /* @__PURE__ */ (0, jsx)(Text, { style: { marginTop: 6, fontFamily: "Inter-Regular", fontSize: 21, color: "#a3a3ab" }, children: DETAIL[chart](t2, game) });
return /* @__PURE__ */ (0, jsxs)(View, { style: { marginTop: 6, flexDirection: "row", alignItems: "center", gap: 9 }, children: [
/* @__PURE__ */ (0, jsx)(View, { style: { borderRadius: 3, backgroundColor: "#f2f2f3", paddingHorizontal: 9 }, children: /* @__PURE__ */ (0, jsx)(Text, { style: { fontFamily: "Inter-Regular", fontSize: 21, fontWeight: 700, color: "#000000", lineHeight: 30 }, children: String(game.metacritic ?? "\u2014") }) }),
/* @__PURE__ */ (0, jsx)(Text, { style: { fontFamily: "Inter-Regular", fontSize: 21, color: "#a3a3ab" }, children: "Metacritic" })
] });
}
function Row3({ rank, game, chart }) {
const { rtl } = useLocale();
return /* @__PURE__ */ (0, jsxs)(Fragment, { children: [
/* @__PURE__ */ (0, jsx)(FocusFrame, {}),
/* @__PURE__ */ (0, jsx)(Text, { style: { width: 18, fontFamily: "Inter-Regular", fontSize: 21, color: "#8a8a94", lineHeight: 30 }, children: String(rank) }),
/* @__PURE__ */ (0, jsx)(Cover, { game, style: thumb, label: false }),
/* @__PURE__ */ (0, jsxs)(View, { style: { flex: 1 }, children: [
/* @__PURE__ */ (0, jsx)(Text, { style: { width: 444, fontFamily: "Inter-Regular", fontSize: 21, color: "#f2f2f3", numberOfLines: 1, ellipsizeMode: "tail", lineHeight: 30 }, children: latin(rtl, game.title) }),
/* @__PURE__ */ (0, jsx)(Detail, { chart, game })
] })
] });
}
function TopCharts() {
useT();
const { openGame, focusLater } = useNavActions();
const { setFilters, setQuery, setSort } = useStoreActions();
const seeAll = (id) => {
setFilters(NO_FILTERS);
setQuery("");
setSort(id);
focusLater("catalog:sort");
};
return /* @__PURE__ */ (0, jsx)(View, { scrollAnchor: true, style: { marginBottom: -18, marginTop: -12, flexDirection: "row", gap: 48 }, children: CHARTS.map(
(chart) => /* @__PURE__ */ (0, jsxs)(View, { style: { flex: 1 }, children: [
/* @__PURE__ */ (0, jsx)(SectionHeader, { title: sortLabel(chart.id), onSeeAll: () => seeAll(chart.id) }),
chart.games.map((game, index) => {
const key = `chart:${chart.id}:${game.id}`;
return /* @__PURE__ */ (0, jsx)(
View,
{
focusKey: key,
onPress: () => openGame(game.id, key),
onFocus: () => {
prefetchWhenSettled(game);
lightGame(key, game);
},
onBlur: () => unlight(key),
style: (_state) => [{ position: "relative", marginHorizontal: -12, flexDirection: "row", alignItems: "center", gap: 21, borderRadius: 12, padding: 12 }, _state.focused ? { backgroundColor: "#17171a" } : null],
children: /* @__PURE__ */ (0, jsx)(Row3, { rank: index + 1, game, chart: chart.id })
},
game.id
);
})
] }, chart.id)
) });
}
export { TopCharts };
+52
View File
@@ -0,0 +1,52 @@
// ../pub-game-store/native/browse/useSlides.js
// reconstructed from the esbuild bundle in eboot.bin
import { useEffect, useRef, useState } from 'react';
var SLIDE_MS = 7e3;
function useSlides(count, enabled) {
const [active2, setActive] = (0, useState)(0);
const [left, setLeft] = (0, useState)(SLIDE_MS);
const [paused, setPaused] = (0, useState)(false);
const startedAt = (0, useRef)(0);
const running = (0, useRef)(false);
const held = (0, useRef)(false);
const ranFor = (0, useRef)(0);
const current = (0, useRef)(active2);
current.current = active2;
(0, useEffect)(() => {
if (paused || !enabled) return void 0;
startedAt.current = Date.now();
running.current = true;
const id = setTimeout(() => {
setActive((index) => (index + 1) % count);
setLeft(SLIDE_MS);
}, left);
return () => {
running.current = false;
ranFor.current = Date.now() - startedAt.current;
clearTimeout(id);
};
}, [active2, left, paused, enabled]);
(0, useEffect)(() => {
if (!enabled && !held.current) setLeft((ms) => Math.max(0, ms - ranFor.current));
}, [enabled]);
const [select] = (0, useState)(() => (index) => {
if (index === current.current) return;
startedAt.current = Date.now();
setActive(index);
setLeft(SLIDE_MS);
});
const [hold] = (0, useState)(() => (on) => {
if (held.current === on) return;
held.current = on;
if (on && running.current) {
const elapsed = Date.now() - startedAt.current;
setLeft((ms) => Math.max(0, ms - elapsed));
}
setPaused(on);
});
return { active: active2, left, paused: paused || !enabled, select, hold };
}
export { SLIDE_MS, useSlides };
+2073
View File
File diff suppressed because it is too large. Load diff
+1
View File
@@ -0,0 +1 @@
{"about":[],"shots":[],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":[],"shots":[],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":["It is 1715. Pirates rule the Caribbean, terrorizing navies & humiliating empires. From sinking warships to conquering fortresses, Captain Edward Kenway stopped at nothing to earn his fortune & legend."],"shots":[{"url":"https://image.api.playstation.com/cdn/UP0001/CUSA00010_00/FREE_CONTENT805ij9Ry6cfqHpcyQh0X/PREVIEW_SCREENSHOT1_49519.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP0001/CUSA00010_00/FREE_CONTENT805ij9Ry6cfqHpcyQh0X/PREVIEW_SCREENSHOT1_49519.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP0001/CUSA00010_00/FREE_CONTENTl0nYWhylRX2cMiBdV06t/PREVIEW_SCREENSHOT2_49519.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP0001/CUSA00010_00/FREE_CONTENTl0nYWhylRX2cMiBdV06t/PREVIEW_SCREENSHOT2_49519.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP0001/CUSA00010_00/FREE_CONTENTWUrex34ldYZYgeOod1KE/PREVIEW_SCREENSHOT3_49519.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP0001/CUSA00010_00/FREE_CONTENTWUrex34ldYZYgeOod1KE/PREVIEW_SCREENSHOT3_49519.jpg?w=256&thumb=false"}],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":["Outnumbered and outgunned, but not outmatched.","Call of Duty®: Ghosts is an extraordinary step forward for one of the largest entertainment franchises of all-time.","This new chapter in the Call of Duty® franchise features a new dynamic where players are on the side of a crippled nation fighting not for freedom, or liberty, but simply to survive.","Fueling this all new Call of Duty experience, the franchise's new next-gen engine delivers stunning levels of immersion and performance, all while maintaining the speed and fluidity of 60 frames-per-second across all platforms.","Single Player Campaign Ten years after a devastating mass event, America’s borders and the balance of global power have changed forever.","As what's left of the nation's Special Operations forces, a mysterious group known only as \"Ghosts\" leads the fight back against a newly emerged, technologically-superior global power."],"shots":[{"url":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/209160/ss_40eccd8d9da36152496ed7cb625f1b3cde3848ac.1920x1080.jpg?t=1780963043","thumb":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/209160/ss_40eccd8d9da36152496ed7cb625f1b3cde3848ac.600x338.jpg?t=1780963043"},{"url":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/209160/ss_4034e8573255a5cca333b42bb78aea9ec05118dc.1920x1080.jpg?t=1780963043","thumb":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/209160/ss_4034e8573255a5cca333b42bb78aea9ec05118dc.600x338.jpg?t=1780963043"},{"url":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/209160/ss_007e6bb9311b3ebfc9441a6965699abc1f66971c.1920x1080.jpg?t=1780963043","thumb":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/209160/ss_007e6bb9311b3ebfc9441a6965699abc1f66971c.600x338.jpg?t=1780963043"}],"summary":"Outnumbered and outgunned, but not outmatched.Call of Duty®: Ghosts is an extraordinary step forward for one of the largest entertainment franchises of all-time. This new chapter in the Call of Duty® franchise features a new dynamic where…"}
+1
View File
@@ -0,0 +1 @@
{"about":["Become Aiden Pearce, a brilliant hacker whose criminal past lead to a violent family tragedy.","While on the hunt for those responsible, you will be able to tap into the city’s omnipresent security cameras, download personal information, control systems such as traffic lights and the electrical grid to stop a chase, and more."],"shots":[{"url":"https://image.api.playstation.com/cdn/UP0001/CUSA00021_00/FREE_CONTENTGvngmduMg7LudnJNGMr3/PREVIEW_SCREENSHOT1_49381.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP0001/CUSA00021_00/FREE_CONTENTGvngmduMg7LudnJNGMr3/PREVIEW_SCREENSHOT1_49381.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP0001/CUSA00021_00/FREE_CONTENThFCaZCv5Xt62o0WVpocm/PREVIEW_SCREENSHOT2_49381.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP0001/CUSA00021_00/FREE_CONTENThFCaZCv5Xt62o0WVpocm/PREVIEW_SCREENSHOT2_49381.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP0001/CUSA00021_00/FREE_CONTENTq9wnjHrvtSTFngJUJmZJ/PREVIEW_SCREENSHOT3_49381.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP0001/CUSA00021_00/FREE_CONTENTq9wnjHrvtSTFngJUJmZJ/PREVIEW_SCREENSHOT3_49381.jpg?w=256&thumb=false"}],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":["The Glade of Dreams is in trouble once again! During a 100-year nap, the nightmares multiplied and spread, creating new monsters even more terrifying than before! These creatures are the stuff of legend…","Dragons, giant toads, sea monsters, and even evil luchadores. With the help of Murfy, Rayman and Globox awake and must now help fight these nightmares and save the Teensies!"],"shots":[{"url":"https://image.api.playstation.com/cdn/UP0001/CUSA00069_00/FREE_CONTENTeYePsbRZLMtlzWsJCBxR/PREVIEW_SCREENSHOT1_51830.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP0001/CUSA00069_00/FREE_CONTENTeYePsbRZLMtlzWsJCBxR/PREVIEW_SCREENSHOT1_51830.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP0001/CUSA00069_00/FREE_CONTENTju0yVGMQotNOLaoDaWFk/PREVIEW_SCREENSHOT2_51830.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP0001/CUSA00069_00/FREE_CONTENTju0yVGMQotNOLaoDaWFk/PREVIEW_SCREENSHOT2_51830.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP0001/CUSA00069_00/FREE_CONTENT6EnlOwywxB5fpAyFDoHV/PREVIEW_SCREENSHOT3_51830.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP0001/CUSA00069_00/FREE_CONTENT6EnlOwywxB5fpAyFDoHV/PREVIEW_SCREENSHOT3_51830.jpg?w=256&thumb=false"}],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":["From Housemarque OY, the creators of the Super Stardust™ series & Dead Nation™ comes RESOGUN™, the next generation of shoot ‘em up, developed exclusively for the PlayStation®4 system.Unleash a diverse array of devastating weapons…","Destroy hordes of enemies in worlds created from millions of individual building blocks (voxels) that break up in real time as you battle to survive as the world is destroyed around you.","• Push yourself to the limits in Arcade and level based Score Attack modes and prove your skills in global leaderboards for each game mode and difficulty setting.• Join forces with your friends online and show off your skills and take down…","an intensive, ultra-responsive, fully HD, 60FPS shoot ‘em up, only on PlayStation®4 system!","This item is being licensed or sublicensed to you by Sony Computer Entertainment America and is subject to the Network Terms of Service and User Agreement, this item’s use restrictions and other applicable terms located at…","If you do not wish to accept all these terms, do not download this item."],"shots":[],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":["LEGO® Marvel™ Super Heroes features an original story crossing the entire Marvel Universe.","Players take control of Iron Man, Spider-Man, the Hulk, Captain America, Wolverine and many more Marvel characters as they unite to stop Loki and a host of other Marvel villains from assembling a super-weapon capable of destroying the world."],"shots":[{"url":"https://image.api.playstation.com/cdn/UP1018/CUSA00083_00/FREE_CONTENT4x8vbqpub2yvKXVCZlJU/PREVIEW_SCREENSHOT1_50146.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP1018/CUSA00083_00/FREE_CONTENT4x8vbqpub2yvKXVCZlJU/PREVIEW_SCREENSHOT1_50146.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP1018/CUSA00083_00/FREE_CONTENTXCTuCba8P3U4Iiydrebx/PREVIEW_SCREENSHOT2_50146.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP1018/CUSA00083_00/FREE_CONTENTXCTuCba8P3U4Iiydrebx/PREVIEW_SCREENSHOT2_50146.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP1018/CUSA00083_00/FREE_CONTENTRdiNMpLzTYzjQP6hTqR2/PREVIEW_SCREENSHOT3_50146.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP1018/CUSA00083_00/FREE_CONTENTRdiNMpLzTYzjQP6hTqR2/PREVIEW_SCREENSHOT3_50146.jpg?w=256&thumb=false"}],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":["Battlefield 4™ Premium Edition gives you new maps, modes, and more in one simple package. Complete challenging assignments to unlock new weapons.","Dominate tactical challenges in a huge interactive environment — demolish buildings shielding your enemies, lead an assault from the back of a gun boat, or make a little C4 go a long way.","In massive 64-player battles, use all your resources and play to your strengths to carve your own path to victory.Key features Dynamic battlefields — Interactive environments react to your actions in real-time, so you can trigger a shipwreck or…","Your opponents won't know what hit 'em.","More vehicles, more freedom — Control the battlefield with dozens of vehicles, from helicopters and stealth jets to gunboats and anti-airs, all designed to give you an edge on massive, chaotic maps.","An intense single-player campaign — With international tensions running high, you’ll need to evacuate critical American VIPs from Shanghai and battle against the odds to get your squad home."],"shots":[{"url":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/1238860/ss_8cd5ec2e4bf1986bc01265db93f184e38e3b1236.1920x1080.jpg?t=1777391884","thumb":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/1238860/ss_8cd5ec2e4bf1986bc01265db93f184e38e3b1236.600x338.jpg?t=1777391884"},{"url":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/1238860/ss_03f32767fd67f15723ffcd68c92e425265a0ca3d.1920x1080.jpg?t=1777391884","thumb":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/1238860/ss_03f32767fd67f15723ffcd68c92e425265a0ca3d.600x338.jpg?t=1777391884"},{"url":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/1238860/ss_006c4f68fb8389d8753bb87ba6a37903591d1ec1.1920x1080.jpg?t=1777391884","thumb":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/1238860/ss_006c4f68fb8389d8753bb87ba6a37903591d1ec1.600x338.jpg?t=1777391884"}],"summary":"Embrace unrivaled destruction in Battlefield 4™. Revel in the glorious chaos of all-out war packed with rewarding, tactical challenges in an interactive environment."}
+1
View File
@@ -0,0 +1 @@
{"about":["The Order: 1886™ introduces players to a unique vision of Victorian-Era London where Man uses advanced technology to battle a powerful and ancient foe.","As Galahad, a member of an elite order of Knights, join a centuries-old war against a powerful threat that will determine the course of history forever in this intense third-person action-adventure shooter, available exclusively on the…","• Where history and myth collide – Assume the role of Galahad, one of the most experienced Knights of The Order, and enter a unique vision of Victorian-Era London that fuses real historical figures and events with new twists on familiar myths…","Rebels declare all-out war on The Order and the police state they represent, while mankind’s true enemy, a powerful and ancient foe known as Half-breeds grows in strength and numbers in and around the city."],"shots":[{"url":"https://image.api.playstation.com/cdn/UP9000/CUSA00785_00/FREE_CONTENTlfhhSt2Jez0x3rhRlVVO/PREVIEW_SCREENSHOT2_72203.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP9000/CUSA00785_00/FREE_CONTENTlfhhSt2Jez0x3rhRlVVO/PREVIEW_SCREENSHOT2_72203.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP9000/CUSA00785_00/FREE_CONTENTmodukFEa8eRVDhATrhhV/PREVIEW_SCREENSHOT3_72203.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP9000/CUSA00785_00/FREE_CONTENTmodukFEa8eRVDhATrhhV/PREVIEW_SCREENSHOT3_72203.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP9000/CUSA00785_00/FREE_CONTENTlKzQR85ydufdqMCxc1nH/PREVIEW_SCREENSHOT4_72203.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP9000/CUSA00785_00/FREE_CONTENTlKzQR85ydufdqMCxc1nH/PREVIEW_SCREENSHOT4_72203.jpg?w=256&thumb=false"}],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":["Online features for Sound Shapes will no longer be playable from January 31, 2019 at 12:00 PM PT. Functionality will be affected in the following ways: o You will be able to play the campaign and all DLC purchases as well as create your own levels.","o You will not be able to share your levels with the community or download community created levels.","Now available on PS4™, PS3™, and PS Vita systems.","Part platformer, part music creator, Sound Shapes™ is the award winning & critically acclaimed game from Queasy Games (Everyday Shooter) that combines sight and sound into a truly unique gaming experience.","Play through albums by Beck, deadmau5, and Jim Guthrie all beautifully illustrated by artists from Capy (SUPER TIME FORCE, Might & Magic: COH), Pyramid Attack (Jabbawaki, Guitar Hero), and Superbrothers (Sword & Sworcery).","And when you've completed the Campaign, flip through the Community Milkcrate for a selection of developer and guest curated albums that feature the best of the best from the Sound Shapes community OR check out the Level Editor (a full-on music…"],"shots":[],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":["Experience award-winning Flower™, now available on PS4™, PS3™, and PS Vita systems. Flower™ lets you take control of the wind as you explore and navigate beautiful, lush environments using the SIXAXIS™ motion controls.","Journey through varied landscapes at your own pace, interacting with and changing the environment as you go, and find balance and harmony in your surroundings.","This is an interactive escape that takes you on an emotional journey like no other game you've ever experienced.","Key Features:• Simple Gameplay Controls – Controlling the game is as simple as tilting the SIXAXIS™ wireless controller in the direction you want to go.• Lush and Interactive Environments – Vast grassy fields, blowing in the breeze…","For one price, get Flower™ on PS4™, PS3™ and PlayStation®Vita systems. Purchase it on your PS4™ system and it will automatically appear for download on your PS3™ and PS Vita systems at no additional cost."],"shots":[],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":[],"shots":[],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":["Pinball Arcade is the most realistic and comprehensive pinball simulation ever created!","Play digital version of real pinball tables like Ghostbusers®, Star Trek®, AC/DC®, and many others! Along with online tournaments and additional modes to challenge yourself and compete against your friends.","Note: The following tables are cross-buy with Stern Pinball Arcade."],"shots":[{"url":"https://image.api.playstation.com/cdn/UP2058/CUSA00081_00/FREE_CONTENTgg4UvCjTajKOxu2NMgN3/PREVIEW_SCREENSHOT1_49280.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP2058/CUSA00081_00/FREE_CONTENTgg4UvCjTajKOxu2NMgN3/PREVIEW_SCREENSHOT1_49280.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP2058/CUSA00081_00/FREE_CONTENTPa4JmykN1Ig9ylPKTgoN/PREVIEW_SCREENSHOT2_49280.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP2058/CUSA00081_00/FREE_CONTENTPa4JmykN1Ig9ylPKTgoN/PREVIEW_SCREENSHOT2_49280.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP2058/CUSA00081_00/FREE_CONTENTZxnXINuBUyWFP378nTj0/PREVIEW_SCREENSHOT3_49280.png?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP2058/CUSA00081_00/FREE_CONTENTZxnXINuBUyWFP378nTj0/PREVIEW_SCREENSHOT3_49280.png?w=256&thumb=false"}],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":["The Definitive Edition of the critically acclaimed action-adventure has been rebuilt for next-gen consoles, featuring an obsessively detailed Lara and a stunningly lifelike world.","Endure high-octane combat, customize weapons and gear, and overcome grueling environments to survive Lara’s first adventure.","Additional hardware required for Remote Play."],"shots":[{"url":"https://image.api.playstation.com/cdn/UP0082/CUSA00107_00/FREE_CONTENT3c61Jniwk7iMtJ88Bqe1/PREVIEW_SCREENSHOT1_51421.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP0082/CUSA00107_00/FREE_CONTENT3c61Jniwk7iMtJ88Bqe1/PREVIEW_SCREENSHOT1_51421.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP0082/CUSA00107_00/FREE_CONTENTetEcurvoVxjtBJrZFWTf/PREVIEW_SCREENSHOT2_51421.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP0082/CUSA00107_00/FREE_CONTENTetEcurvoVxjtBJrZFWTf/PREVIEW_SCREENSHOT2_51421.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP0082/CUSA00107_00/FREE_CONTENTaWF7SAyAUtA2iSGXqfmS/PREVIEW_SCREENSHOT3_51421.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP0082/CUSA00107_00/FREE_CONTENTaWF7SAyAUtA2iSGXqfmS/PREVIEW_SCREENSHOT3_51421.jpg?w=256&thumb=false"}],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":["Batman™: Arkham Knight brings the award-winning Arkham trilogy from Rocksteady Studios to its epic conclusion. Developed exclusively for New-Gen platforms, Batman: Arkham Knight introduces Rocksteady's uniquely designed version of the Batmobile.","The highly anticipated addition of this legendary vehicle, combined with the acclaimed gameplay of the Arkham series, offers gamers the ultimate and complete Batman experience as they tear through the streets and soar across the skyline of the…","In this explosive finale, Batman faces the ultimate threat against the city that he is sworn to protect, as Scarecrow returns to unite the super criminals of Gotham and destroy the Batman forever.Product Features: “Be The Batman” – Live the…","Players will become The World’s Greatest Detective like never before with the introduction of the Batmobile and enhancements to signature features such as FreeFlow Combat, stealth, forensics and navigation.","Introducing the Batmobile – The Batmobile is brought to life with a completely new and original design featuring a distinct visual appearance and a full range of on-board high-tech gadgetry.","Designed to be fully drivable throughout the game world and capable of transformation from high speed pursuit mode to military grade battle mode, this legendary vehicle sits at the heart of the game’s design and allows players to tear through…"],"shots":[{"url":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/208650/ss_90026e46a995760d53bfa2dc1612b73960c84c94.1920x1080.jpg?t=1745534372","thumb":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/208650/ss_90026e46a995760d53bfa2dc1612b73960c84c94.600x338.jpg?t=1745534372"},{"url":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/208650/ss_4c9d5fb849b1a7169184a37db000919b276056fe.1920x1080.jpg?t=1745534372","thumb":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/208650/ss_4c9d5fb849b1a7169184a37db000919b276056fe.600x338.jpg?t=1745534372"},{"url":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/208650/ss_5da3185e4f7da999300555747be6b84b8f16164f.1920x1080.jpg?t=1745534372","thumb":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/208650/ss_5da3185e4f7da999300555747be6b84b8f16164f.600x338.jpg?t=1745534372"}],"summary":"Batman™: Arkham Knight brings the award-winning Arkham trilogy from Rocksteady Studios to its epic conclusion. Developed exclusively for New-Gen platforms, Batman: Arkham Knight introduces Rocksteady's uniquely designed version of the Batmobile."}
+1
View File
@@ -0,0 +1 @@
{"about":["Online servers are no longer available.","Welcome to Redview County, where a street-racing rivalry between cops and racers never stops as both sides compete in an all-out war featuring the fastest cars, mods and technology in a gritty open road environment.","Play as either a cop or racer, where each side of the law has its own set of high stakes challenges, rewards and consequences. Risk everything in the ultimate high stakes rivalry."],"shots":[{"url":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/1262600/ss_973335e826e450b176fdc5e54c003ffbdf48a8c2.1920x1080.jpg?t=1777394510","thumb":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/1262600/ss_973335e826e450b176fdc5e54c003ffbdf48a8c2.600x338.jpg?t=1777394510"},{"url":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/1262600/ss_25ed9eea91e7d3d582eebc4d3df2a03cbc4ac295.1920x1080.jpg?t=1777394510","thumb":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/1262600/ss_25ed9eea91e7d3d582eebc4d3df2a03cbc4ac295.600x338.jpg?t=1777394510"},{"url":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/1262600/ss_e8801aa10a3a3089d34672a7e28bcb9d711c8d46.1920x1080.jpg?t=1777394510","thumb":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/1262600/ss_e8801aa10a3a3089d34672a7e28bcb9d711c8d46.600x338.jpg?t=1777394510"}],"summary":"Erase the line between single player and multiplayer in this street-racing rivalry between Cops and Racers. Seamlessly join a world where your friends are already racing and chasing"}
+1
View File
@@ -0,0 +1 @@
{"about":["Experience award-winning flOw, now available on PS4™, PS3™, and PS Vita systems.flOw is a game about piloting an aquatic organism through a surreal biosphere where players consume other organisms, evolve, and dive into the abyss.","With an embedded design of DDA (dynamic difficulty adjustment), players with differing skill levels can intuitively customize their game experience and enjoy the game at their own pace.You can play as one of 5 creatures, each in a unique environment.","Lose yourself in the crisp “deep blue” in an organic experience that will allow you to glide, flit, and flOw through the universe.Full game key features:-Vibrant environments in full 1080p HD-Gameplay dynamically adjusts to the player's…","For one price, get flOw on PS4™, PS3™ and PlayStation®Vita systems. Purchase it on your PS4™ system and it will automatically appear for download on your PS3™ and PS Vita systems at no additional cost."],"shots":[],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":[],"shots":[],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":["Worms™ Battlegrounds brings friends and families together in the noble pursuit of self‐improvement, world domination and exploding sheep.","Form Clans, Take On The World Join together with friends and other Worms™ Battlegrounds players to form a fearsome team name your clan, design your own emblem, promote other players to act as leaders and officers.","Enter your clan into the league and fight together to make your mark on the leaderboards. Nobody wants an empty trophy cabinet!","Story Mode’ adds a ton of variety by introducing physics based contraptions for the first time ever. A plethora of interesting machinery spices up the gameplay, and makes solo Worms™ much more fun!","The single‐player game isn’t only about dealing death and destruction, it’s also about negotiating tricky swinging rope bridges and rescuing friendlies from death defying traps!","The player spends much more time playing, and much less time waiting for their A.I. opponent to take a shot."],"shots":[{"url":"https://image.api.playstation.com/cdn/UP4064/CUSA00192_00/FREE_CONTENT7RVXkzgqFvoLSDNNecf5/PREVIEW_SCREENSHOT1_53765.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP4064/CUSA00192_00/FREE_CONTENT7RVXkzgqFvoLSDNNecf5/PREVIEW_SCREENSHOT1_53765.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP4064/CUSA00192_00/FREE_CONTENTQZC7oxH749AMbuoAKPaO/PREVIEW_SCREENSHOT2_53765.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP4064/CUSA00192_00/FREE_CONTENTQZC7oxH749AMbuoAKPaO/PREVIEW_SCREENSHOT2_53765.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP4064/CUSA00192_00/FREE_CONTENTabV3ViSGhVwUr2oKyW0c/PREVIEW_SCREENSHOT3_53765.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP4064/CUSA00192_00/FREE_CONTENTabV3ViSGhVwUr2oKyW0c/PREVIEW_SCREENSHOT3_53765.jpg?w=256&thumb=false"}],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":["When the sky opens up and rains down chaos, the world needs heroes. Become the savior of Thedas in Dragon Age: Inquisition – Game of the Year Edition. You are the Inquisitor, tasked with saving the world from itself.","But the road ahead is paved with difficult decisions. Thedas is a land of strife. Factions constantly war with each other even as a larger demonic invasion has begun. And you? You and your band of champions are the only ones who can hold it together.","It’s your job to lead them...or fall.","Enthralling, choice-driven narrative — You’re not just deciding who to send into which battle in Inquisition; you’re making important decisions that shape the future of Thedas.","Each choice carries weight, and your actions can lead to a variety of outcomes.","Inquisition is a highly personalized journey, where one wrong move could set in motion a series of events that alters the physical aspects of the world itself, making your Thedas — and your heroes — feel truly unique."],"shots":[{"url":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/1222690/ss_4c90bdbb1c2567edec0778f2e8956d1a8ff1b4c3.1920x1080.jpg?t=1779987585","thumb":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/1222690/ss_4c90bdbb1c2567edec0778f2e8956d1a8ff1b4c3.600x338.jpg?t=1779987585"},{"url":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/1222690/ss_a106df995b9051e24ebe5abdec168ea3495bfda4.1920x1080.jpg?t=1779987585","thumb":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/1222690/ss_a106df995b9051e24ebe5abdec168ea3495bfda4.600x338.jpg?t=1779987585"},{"url":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/1222690/ss_e8e2d622313d983fc9eb3fd824a2e0401c247780.1920x1080.jpg?t=1779987585","thumb":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/1222690/ss_e8e2d622313d983fc9eb3fd824a2e0401c247780.600x338.jpg?t=1779987585"}],"summary":"Winner of over 130 Game of the Year awards, discover the definitive Dragon Age: Inquisition experience. The Game of the Year Edition includes the critically acclaimed game, all three official add-ons - Jaws of Hakkon, The Descent, and Trespasser…"}
+1
View File
@@ -0,0 +1 @@
{"about":["inFAMOUS Second Son, a PlayStation 4 exclusive , brings you an action adventure game where surrounded by a society that fears them, superhumans are ruthlessly hunted down and caged by the Department of Unified Protection.","Step into a locked-down Seattle as Delsin Rowe, who has recently discovered his superhuman power and is now capable of fighting back against the oppressive DUP.","Enjoy your power as you choose how you will push your awesome abilities to the limit and witness the consequences of your actions as they affect the city and people around you."],"shots":[{"url":"https://image.api.playstation.com/cdn/UP9000/CUSA00223_00/FREE_CONTENTof7RbczFsgnCGBXKzfSY/PREVIEW_SCREENSHOT1_56814.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP9000/CUSA00223_00/FREE_CONTENTof7RbczFsgnCGBXKzfSY/PREVIEW_SCREENSHOT1_56814.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP9000/CUSA00223_00/FREE_CONTENTHai72R3muzyROnkZQhcZ/PREVIEW_SCREENSHOT2_56814.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP9000/CUSA00223_00/FREE_CONTENTHai72R3muzyROnkZQhcZ/PREVIEW_SCREENSHOT2_56814.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP9000/CUSA00223_00/FREE_CONTENTWdqw2fZrc59kYPbaxZCl/PREVIEW_SCREENSHOT3_56814.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP9000/CUSA00223_00/FREE_CONTENTWdqw2fZrc59kYPbaxZCl/PREVIEW_SCREENSHOT3_56814.jpg?w=256&thumb=false"}],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":["Trine 2: Complete Story is a beautiful, award-winning sidescrolling game of action, puzzles and platforming.","Play as the three Heroes - Amadeus the Wizard, Pontius the Knight, and Zoya the Thief - and join their adventure through dangers untold in a fantastical fairytale world, including physics-based puzzles using fire, water, gravity and magic wicked…","Features: - 20 levels chock-full of adventure, hazards, physics-based puzzles, dangerous enemies and curious contraptions - Travel through breathtaking environments, including a castle by the treacherous sea, a burning desert and snowy ice…","Visit www.us.playstation.com/support/3D for details."],"shots":[{"url":"https://image.api.playstation.com/cdn/UP4029/CUSA00234_00/FREE_CONTENTZEYzwm1jbvDDpMVjLHUr/PREVIEW_SCREENSHOT1_49341.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP4029/CUSA00234_00/FREE_CONTENTZEYzwm1jbvDDpMVjLHUr/PREVIEW_SCREENSHOT1_49341.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP4029/CUSA00234_00/FREE_CONTENTeyvm08XxibwsGiWuhsU5/PREVIEW_SCREENSHOT2_49341.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP4029/CUSA00234_00/FREE_CONTENTeyvm08XxibwsGiWuhsU5/PREVIEW_SCREENSHOT2_49341.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP4029/CUSA00234_00/FREE_CONTENT1xKZtIzHmzFOh9N5UCor/PREVIEW_SCREENSHOT3_49341.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP4029/CUSA00234_00/FREE_CONTENT1xKZtIzHmzFOh9N5UCor/PREVIEW_SCREENSHOT3_49341.jpg?w=256&thumb=false"}],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":["DARE YOU ENTER THE CITY OF THE DEAD?Run-and-gun through the zombie apocalypse as hit arcade shooter Dead Nation™ shuffles onto PlayStation®4.Fight for your life alone or with a friend as Jack McReady or Scarlett Blake as you step onto the…"],"shots":[],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":[],"shots":[],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":[],"shots":[],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":["Take on an unlimited array of platform-racing challenges in the unreal world of Trials Fusion.","Using your skills to traverse across obstacle-laden, ramp-ridden courses, you must strive to set track records against the best Trials players around the globe.","Whether you’re racing alone, with friends, or in a global tournament, competition is always around you. And racing on official courses is just the beginning.","A rich world of custom courses—built by some of the most creative and skilled content creators in gaming—awaits those who are continually searching for a new, insane track to conquer.","And with long-term support of fresh features and content, the Trials experience will continue to expand and challenge players in new and exhilarating ways."],"shots":[{"url":"https://image.api.playstation.com/cdn/UP0001/CUSA00304_00/FREE_CONTENTcbHVAc2Y0lGTnaGI5GQJ/PREVIEW_SCREENSHOT1_53228.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP0001/CUSA00304_00/FREE_CONTENTcbHVAc2Y0lGTnaGI5GQJ/PREVIEW_SCREENSHOT1_53228.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP0001/CUSA00304_00/FREE_CONTENT1Tg8HFwLQgDr6WZq5FHl/PREVIEW_SCREENSHOT2_53228.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP0001/CUSA00304_00/FREE_CONTENT1Tg8HFwLQgDr6WZq5FHl/PREVIEW_SCREENSHOT2_53228.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP0001/CUSA00304_00/FREE_CONTENT2YVAlxbzQeO8TZEnIu4m/PREVIEW_SCREENSHOT3_53228.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP0001/CUSA00304_00/FREE_CONTENT2YVAlxbzQeO8TZEnIu4m/PREVIEW_SCREENSHOT3_53228.jpg?w=256&thumb=false"}],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":["Guacamelee! Gold Edition is a Metroidvania-style action-platformer set in a magical Mexican-inspired world. The game draws its inspiration from traditional Mexican culture and folklore, and features many interesting and unique characters.","Guacamelee! builds on the classic open-world Metroidvania style of games by adding deep melee combat, a new dimension switching mechanic, and cooperative local multiplayer.","The game also blurs the boundaries between combat and platforming by making many moves useful and necessary for both.","Travel through a mystical and mysterious Mexican world as a luchador using the power of your two fists to battle evil. Uncover hidden wrestling techniques like the Rooster Uppercut, and Dimension Swap to open new areas and secrets.","Key Features Use combat moves for both fighting enemies and platforming challenges Swap between multiple overlapping dimensions (World of the Living and the World of the Dead)","This Gold Edition of Guacamelee! includes the \"El Infierno\" level expansion. Brave the fires of El Infierno and prove yourself in a series of challenges to unlock powerful new costumes for Juan and Tostada Player costumes!"],"shots":[{"url":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/214770/ss_0ae81d50f72066713315c972f5a62c4111a75023.1920x1080.jpg?t=1762522710","thumb":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/214770/ss_0ae81d50f72066713315c972f5a62c4111a75023.600x338.jpg?t=1762522710"},{"url":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/214770/ss_4bc28441486c27a23e82940a31a58a329530d25f.1920x1080.jpg?t=1762522710","thumb":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/214770/ss_4bc28441486c27a23e82940a31a58a329530d25f.600x338.jpg?t=1762522710"},{"url":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/214770/ss_5d7b0cd418905f274202c2778dbb0fe8efa7db83.1920x1080.jpg?t=1762522710","thumb":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/214770/ss_5d7b0cd418905f274202c2778dbb0fe8efa7db83.600x338.jpg?t=1762522710"}],"summary":"Guacamelee! is a Metroidvania-style action-platformer set in a magical Mexican-inspired world. The game draws its inspiration from traditional Mexican culture and folklore, and features many interesting and unique characters."}
+1
View File
@@ -0,0 +1 @@
{"about":["Europe 1960. The tide of World War II has been turned using a new mysterious, advanced technology. Using unrelenting force and intimidation, a ruthless world power has brought even the most powerful of nations to their knees.","The regime now dominates the globe with an iron fist. You are the only man capable of rewriting history. In Wolfenstein: The New Order, assume the role of super soldier B.J.","Blazkowicz as he uses elite combat tactics and an arsenal of uber advanced weaponry to take down the most powerful empire the world has ever known.","Join forces with a band of dedicated resistance fighters and launch an offensive battle that spans the globe and beyond, as you seek to uncover the truth behind how this regime conquered the world so quickly.","Take on massive mechs, super soldiers, and an army of seemingly unstoppable might as you fight to free the planet from a nightmare of unimaginable tyranny."],"shots":[{"url":"https://image.api.playstation.com/cdn/UP1003/CUSA00314_00/FREE_CONTENTqIpHjrB7RHBkYVqsQRqc/PREVIEW_SCREENSHOT5_155526.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP1003/CUSA00314_00/FREE_CONTENTqIpHjrB7RHBkYVqsQRqc/PREVIEW_SCREENSHOT5_155526.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP1003/CUSA00314_00/FREE_CONTENTHGW6DhChsk7S0n2PZiQP/PREVIEW_SCREENSHOT4_155526.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP1003/CUSA00314_00/FREE_CONTENTHGW6DhChsk7S0n2PZiQP/PREVIEW_SCREENSHOT4_155526.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP1003/CUSA00314_00/FREE_CONTENTUeptLobo8T3sx9QLQms0/PREVIEW_SCREENSHOT3_155526.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP1003/CUSA00314_00/FREE_CONTENTUeptLobo8T3sx9QLQms0/PREVIEW_SCREENSHOT3_155526.jpg?w=256&thumb=false"}],"summary":"The Nazis won World War II - rally the resistance and fight back."}
+1
View File
@@ -0,0 +1 @@
{"about":["Explore ancient ruins, dodge carnivorous beasts and avoid trigger-happy hunting parties as Abe, the original Oddworld hero in this lovingly re-crafted take on PlayStation® classic Abe's Oddysee.","Once a happy floor waxer in Oddworld's biggest meat processing plant, Abe stumbles across his boss's secret plan to turn the factory's slave labor force into the latest in the RuptureFarms Tasty Treats line of novelty meat snacks.","Abe now has to save his own skin from the grinders even if simply escaping the flesh farm is only the start of his Oddysee. Many dangers await Abe on his journey to discover his people's heritage.","Built from the ground up, enjoy breathtaking visuals, enhanced audio and improved, deeper gameplay as New 'n' Tasty reignites the original Oddworld game using the latest next-generation technology.","Purchasing this content entitles you to the PS3™ system, PS4™ system, and “PS Vita” system versions!"],"shots":[{"url":"https://image.api.playstation.com/cdn/UP4134/CUSA00329_00/FREE_CONTENTS9tldzDbfdHrBsQVaJDg/PREVIEW_SCREENSHOT1_55571.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP4134/CUSA00329_00/FREE_CONTENTS9tldzDbfdHrBsQVaJDg/PREVIEW_SCREENSHOT1_55571.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP4134/CUSA00329_00/FREE_CONTENTcviRhNttaTiGskSegRSV/PREVIEW_SCREENSHOT2_55571.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP4134/CUSA00329_00/FREE_CONTENTcviRhNttaTiGskSegRSV/PREVIEW_SCREENSHOT2_55571.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP4134/CUSA00329_00/FREE_CONTENTqOJr66fcsWfKzizyFYxp/PREVIEW_SCREENSHOT3_55571.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP4134/CUSA00329_00/FREE_CONTENTqOJr66fcsWfKzizyFYxp/PREVIEW_SCREENSHOT3_55571.jpg?w=256&thumb=false"}],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":["From Patrick Plourde – Creative Director of Far Cry 3® – and Jeffrey Yohalem – winner of the Writers Guild of America Award – comes Child of Light, a digital title developed under Ubisoft Montreal.","Envisioned as a “Playable Poem” by its creators, Child of Light is a modern reimagining of our childhood fairy tales.","Set in the magical world of Lemuria, Child of Light takes us on the coming-of-age journey of Aurora, a young girl struggling to save a lost kingdom and her ailing father.","“Come, tuck yourself into bed Let me tell a story.","Of Lemuria, a kingdom past And a girl born for glory.”","The daughter of the Duke of Carniola is transported to Lemuria, a mysterious world that needs her help."],"shots":[{"url":"https://image.api.playstation.com/cdn/UP0001/CUSA00339_00/FREE_CONTENThSonVWFw1ye2mx3wXNY7/PREVIEW_SCREENSHOT1_53412.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP0001/CUSA00339_00/FREE_CONTENThSonVWFw1ye2mx3wXNY7/PREVIEW_SCREENSHOT1_53412.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP0001/CUSA00339_00/FREE_CONTENTpJKPly7lJBLS8cZuvbPC/PREVIEW_SCREENSHOT2_53412.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP0001/CUSA00339_00/FREE_CONTENTpJKPly7lJBLS8cZuvbPC/PREVIEW_SCREENSHOT2_53412.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP0001/CUSA00339_00/FREE_CONTENTAPXLfh3EBUmTlvvKSSGI/PREVIEW_SCREENSHOT3_53412.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP0001/CUSA00339_00/FREE_CONTENTAPXLfh3EBUmTlvvKSSGI/PREVIEW_SCREENSHOT3_53412.jpg?w=256&thumb=false"}],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":[],"shots":[],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":["Reclaim the Lost Kingdom brick by brick! Join Bilbo Baggins, Gandalf, Thorin and his company of Dwarves in an epic adventure across Middle-earth to recapture the Lonely Mountain in the most expansive LEGO game to date.","• Battle ravenous Trolls, dangerous Orcs and many more!","• Combine the Dwarves' unique abilities to solve puzzles - often with hilarious results!","• Explore iconic locations in Middle-earth, from the Shire to Goblin-town and beyond."],"shots":[{"url":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/285160/ss_7ebfb4755a1baddacdba1921b9e08806f0cb5430.1920x1080.jpg?t=1780599886","thumb":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/285160/ss_7ebfb4755a1baddacdba1921b9e08806f0cb5430.600x338.jpg?t=1780599886"},{"url":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/285160/ss_3dcdbb8755ba30d4cc66917a2953ff876b12b3e1.1920x1080.jpg?t=1780599886","thumb":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/285160/ss_3dcdbb8755ba30d4cc66917a2953ff876b12b3e1.600x338.jpg?t=1780599886"},{"url":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/285160/ss_082ebcfb372b3c63aa1769919b5b8052eee9e7bb.1920x1080.jpg?t=1780599886","thumb":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/285160/ss_082ebcfb372b3c63aa1769919b5b8052eee9e7bb.600x338.jpg?t=1780599886"}],"summary":"Reclaim the Lost Kingdom brick by brick! Join Bilbo Baggins, Gandalf, Thorin and his company of Dwarves in an epic adventure across Middle-earth to recapture the Lonely Mountain in the most expansive LEGO game to date."}
+1
View File
@@ -0,0 +1 @@
{"about":[],"shots":[],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":["Hotline Miami 2: Wrong Number is the brutal conclusion to the Hotline Miami saga, set against a backdrop of escalating violence and retribution over spilled blood in the original game.","Follow the paths of several distinct factions – each with their own questionable methods and uncertain motivations – as unforeseen consequences intersect and reality once again slips back into a brilliant haze of neon and bloodshed.","Purchasing this content entitles you to the PS3™, PS4™, and “PS Vita” versions!"],"shots":[{"url":"https://image.api.playstation.com/cdn/UP3643/CUSA00368_00/FREE_CONTENTXnl5uwGoCa1n0Kxssi6L/PREVIEW_SCREENSHOT1_74133.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP3643/CUSA00368_00/FREE_CONTENTXnl5uwGoCa1n0Kxssi6L/PREVIEW_SCREENSHOT1_74133.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP3643/CUSA00368_00/FREE_CONTENTFq1xaV3F9DuOnjM0ozXJ/PREVIEW_SCREENSHOT2_74133.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP3643/CUSA00368_00/FREE_CONTENTFq1xaV3F9DuOnjM0ozXJ/PREVIEW_SCREENSHOT2_74133.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP3643/CUSA00368_00/FREE_CONTENTtXWNFhVeHGTwb3Rd5OJz/PREVIEW_SCREENSHOT3_74133.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP3643/CUSA00368_00/FREE_CONTENTtXWNFhVeHGTwb3Rd5OJz/PREVIEW_SCREENSHOT3_74133.jpg?w=256&thumb=false"}],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":["Developed by Shinji Mikami and the talented team at Tango Gameworks, The Evil Within embodies the meaning of pure survival horror.","Highly-crafted environments, horrifying anxiety, and an intricate story are combined to create an immersive world that will bring you to the height of tension.","With limited resources at your disposal, you’ll fight for survival and experience profound fear in this perfect blend of horror and action."],"shots":[{"url":"https://image.api.playstation.com/cdn/UP1003/CUSA00203_00/FREE_CONTENTLzVQXbY0cXX9QJ32aMum/PREVIEW_SCREENSHOT10_62544.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP1003/CUSA00203_00/FREE_CONTENTLzVQXbY0cXX9QJ32aMum/PREVIEW_SCREENSHOT10_62544.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP1003/CUSA00203_00/FREE_CONTENTHr3U2SkSd9mAgbsxOE7k/PREVIEW_SCREENSHOT9_62544.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP1003/CUSA00203_00/FREE_CONTENTHr3U2SkSd9mAgbsxOE7k/PREVIEW_SCREENSHOT9_62544.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP1003/CUSA00203_00/FREE_CONTENTx9HZlrUwZJ1yxSW2TQsb/PREVIEW_SCREENSHOT8_62544.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP1003/CUSA00203_00/FREE_CONTENTx9HZlrUwZJ1yxSW2TQsb/PREVIEW_SCREENSHOT8_62544.jpg?w=256&thumb=false"}],"summary":"Defeat insurmountable terror and discover The Evil Within."}
+1
View File
@@ -0,0 +1 @@
{"about":["Gomez is a 2D creature living in a 2D world. Or is he? When the existence of a mysterious 3rd dimension is revealed to him, Gomez is sent out on a journey that will take him to the very end of time and space.","Use your ability to navigate 3D structures from 4 distinct classic 2D perspectives. Explore a serene and beautiful open-ended world full of secrets, puzzles and hidden treasures.","Unearth the mysteries of the past and discover the truth about reality and perception. Change your perspective and look at the world in a different way.","Purchasing this content entitles you to both the PS3™, PS4™, and PS Vita versions!","3D display with compatible 3D active glasses (sold separately) required for 3D features. Visit www.us.playstation.com/support/3D for details."],"shots":[{"url":"https://image.api.playstation.com/cdn/UP4427/CUSA00383_00/FREE_CONTENTNbznh5o4o3tUPLZRUmSR/PREVIEW_SCREENSHOT1_52621.png?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP4427/CUSA00383_00/FREE_CONTENTNbznh5o4o3tUPLZRUmSR/PREVIEW_SCREENSHOT1_52621.png?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP4427/CUSA00383_00/FREE_CONTENTys8520jZcvu6OdYRzNH0/PREVIEW_SCREENSHOT2_52621.png?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP4427/CUSA00383_00/FREE_CONTENTys8520jZcvu6OdYRzNH0/PREVIEW_SCREENSHOT2_52621.png?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP4427/CUSA00383_00/FREE_CONTENTycXNTLDq2j6Ypax855HB/PREVIEW_SCREENSHOT3_52621.png?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP4427/CUSA00383_00/FREE_CONTENTycXNTLDq2j6Ypax855HB/PREVIEW_SCREENSHOT3_52621.png?w=256&thumb=false"}],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":["When a young street hustler, a retired bank robber, and a terrifying psychopath find themselves entangled with some of the most frightening and deranged elements of the criminal underworld, the U.S.","government, and the entertainment industry, they must pull off a series of dangerous heists to survive in a ruthless city in which they can trust nobody — least of all each other.","Experience GTA Online, a dynamic and ever-evolving online universe for up to 30 players, where you can rise from street-level hustler to become a kingpin of your own criminal empire."],"shots":[],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":["When a young street hustler, a retired bank robber, and a terrifying psychopath find themselves entangled with some of the most frightening and deranged elements of the criminal underworld, the U.S.","government, and the entertainment industry, they must pull off a series of dangerous heists to survive in a ruthless city in which they can trust nobody — least of all each other.","Experience GTA Online, a dynamic and ever-evolving online universe for up to 30 players, where you can rise from street-level hustler to become a kingpin of your own criminal empire."],"shots":[],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":[],"shots":[],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":["PlayStation Plus Extra/Deluxe/Premium subscribers: This title is available in the PlayStation Plus Game Catalogue, and you may redeem it from your PS4 or PS5 console. (Redemption from web/mobile is currently unavailable.)","TowerFall Ascension is the definitive version of the hit archery combat game. Inspired by classics from the golden age of couch multiplayer, it's a local party game centering around hilarious, intense versus matches.","The core mechanics are simple and accessible, but hard to master and combat is fierce. Loot treasure chests for game-changing power-ups, master the art of catching arrows out of the air, or descend on your foes and stomp them into submission.","TowerFall is best played competitively with friends, cross-legged on the floor within punching distance of each other.","New in Ascension is the 1- or 2-player co-op Quest mode. Players work together, fighting off a variety of monsters and enemy archers across the land of TowerFall.","It's a new adventure to explore when you don't have more friends handy to square off against."],"shots":[{"url":"https://image.api.playstation.com/cdn/UP2120/CUSA00466_00/FREE_CONTENTsbaihRbDjG5OCXo2jjhK/PREVIEW_SCREENSHOT1_52746.png?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP2120/CUSA00466_00/FREE_CONTENTsbaihRbDjG5OCXo2jjhK/PREVIEW_SCREENSHOT1_52746.png?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP2120/CUSA00466_00/FREE_CONTENTpdJQvqr2TiukNTuchG8q/PREVIEW_SCREENSHOT2_52746.png?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP2120/CUSA00466_00/FREE_CONTENTpdJQvqr2TiukNTuchG8q/PREVIEW_SCREENSHOT2_52746.png?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP2120/CUSA00466_00/FREE_CONTENTGyYTM3Sea3vj6NidPwlP/PREVIEW_SCREENSHOT3_52746.png?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP2120/CUSA00466_00/FREE_CONTENTGyYTM3Sea3vj6NidPwlP/PREVIEW_SCREENSHOT3_52746.png?w=256&thumb=false"}],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":[],"shots":[],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":["This is the story of crossed destinies and broken love in a world torn apart. Of people who will try to survive the horror of the trenches, following their faithful canine companion.","In Valiant Hearts, the lives of these characters are inextricably drawn together over the course of the game. Friendship, love, sacrifice and tragedy befall each one, as they help each other retain their humanity against the horrors of war.","Video output in Full HD 1080p requires 1080p native display.","1 player 1080p HD Video Output Offline Play Enabled This item is being licensed or sublicensed to you by Sony Computer Entertainment America and is subject to the Network Terms of Service and User Agreement, this item’s use restrictions and…","If you do not wish to accept all these terms, do not download this item. One-time license fee for play on purchasing account’s designated, primary PS4™ system and other PS4 systems when signed in with purchasing account.","©2014 Ubisoft Entertainment. All Rights Reserved. Valiant Hearts: The Great War Logo, Ubisoft and the Ubisoft logo are trademarks of Ubisoft Entertainment in the U.S. and/or other countries."],"shots":[{"url":"https://image.api.playstation.com/cdn/UP0001/CUSA00478_00/FREE_CONTENTJe5r0cRkb2Glm2MdufYE/PREVIEW_SCREENSHOT1_54646.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP0001/CUSA00478_00/FREE_CONTENTJe5r0cRkb2Glm2MdufYE/PREVIEW_SCREENSHOT1_54646.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP0001/CUSA00478_00/FREE_CONTENTuhpRitaWGBiOMnr86KLR/PREVIEW_SCREENSHOT2_54646.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP0001/CUSA00478_00/FREE_CONTENTuhpRitaWGBiOMnr86KLR/PREVIEW_SCREENSHOT2_54646.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP0001/CUSA00478_00/FREE_CONTENTsRG2UKZZ9mRnVZDVwlQi/PREVIEW_SCREENSHOT3_54646.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP0001/CUSA00478_00/FREE_CONTENTsRG2UKZZ9mRnVZDVwlQi/PREVIEW_SCREENSHOT3_54646.jpg?w=256&thumb=false"}],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":["Hotline Miami is a high-octane action game overflowing with raw brutality, hard-boiled gunplay and skull crushing close combat.","Set in an alternative 1989 Miami, you will assume the role of a mysterious antihero on a murderous rampage against the shady underworld at the behest of voices on your answering machine.","Soon you'll find yourself struggling to get a grip of what is going on and why you are prone to these acts of violence.","Purchasing this content entitles you to both the PS3™, PS4™, and “PS Vita” versions!"],"shots":[{"url":"https://image.api.playstation.com/cdn/UP3643/CUSA00486_00/FREE_CONTENTnFiZPOIfLJpWsElK39Q5/PREVIEW_SCREENSHOT1_57064.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP3643/CUSA00486_00/FREE_CONTENTnFiZPOIfLJpWsElK39Q5/PREVIEW_SCREENSHOT1_57064.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP3643/CUSA00486_00/FREE_CONTENT4aG75WF2VM0QEUGtGDsP/PREVIEW_SCREENSHOT2_57064.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP3643/CUSA00486_00/FREE_CONTENT4aG75WF2VM0QEUGtGDsP/PREVIEW_SCREENSHOT2_57064.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP3643/CUSA00486_00/FREE_CONTENTeXakbFq5TNt9BnDanfKQ/PREVIEW_SCREENSHOT3_57064.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP3643/CUSA00486_00/FREE_CONTENTeXakbFq5TNt9BnDanfKQ/PREVIEW_SCREENSHOT3_57064.jpg?w=256&thumb=false"}],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":["Spelunky is a unique platformer with randomized levels that offer a challenging new experience each time you play. Journey deep underground and explore fantastic places filled with all manner of monsters, traps, and treasure.","Go solo or bring up to three friends to join you in cooperative play or frantic deathmatch!","Purchasing this content entitles you to both the PS3™, PS4™, and “PS Vita” versions!","Additional hardware required for Interconnectivity."],"shots":[{"url":"https://image.api.playstation.com/cdn/UP4407/CUSA00493_00/FREE_CONTENTFO3HJLWXBjanzTyPa2lW/PREVIEW_SCREENSHOT1_64617.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP4407/CUSA00493_00/FREE_CONTENTFO3HJLWXBjanzTyPa2lW/PREVIEW_SCREENSHOT1_64617.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP4407/CUSA00493_00/FREE_CONTENTedqlpxteJLn2jMpknqm3/PREVIEW_SCREENSHOT2_64617.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP4407/CUSA00493_00/FREE_CONTENTedqlpxteJLn2jMpknqm3/PREVIEW_SCREENSHOT2_64617.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP4407/CUSA00493_00/FREE_CONTENTAKBIFvnP3AUVN1qpvy47/PREVIEW_SCREENSHOT3_64617.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP4407/CUSA00493_00/FREE_CONTENTAKBIFvnP3AUVN1qpvy47/PREVIEW_SCREENSHOT3_64617.jpg?w=256&thumb=false"}],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":["Download the demo to play 2 hours of coop mode.","SEQUEL TO THE 1 RATED SHOOTER OF 2012*","2014 Winner Best Shooter - the Game Awards In Far Cry 4, players find themselves in Kyrat, a breathtaking, perilous and wild region of the Himalayas struggling under the regime of a despotic self-appointed king.","Using a vast array of weapons, vehicles, and animals, players will write their own story across an exotic open-world landscape."],"shots":[{"url":"https://image.api.playstation.com/cdn/UP0001/CUSA00496_00/FREE_CONTENTlpIzm82yTvTdwdGPtqAz/PREVIEW_SCREENSHOT1_54899.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP0001/CUSA00496_00/FREE_CONTENTlpIzm82yTvTdwdGPtqAz/PREVIEW_SCREENSHOT1_54899.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP0001/CUSA00496_00/FREE_CONTENTwWvRELkeqHqDRR1EKL2b/PREVIEW_SCREENSHOT2_54899.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP0001/CUSA00496_00/FREE_CONTENTwWvRELkeqHqDRR1EKL2b/PREVIEW_SCREENSHOT2_54899.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP0001/CUSA00496_00/FREE_CONTENTRVNZKWvZqfok5tgmPUbL/PREVIEW_SCREENSHOT3_54899.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP0001/CUSA00496_00/FREE_CONTENTRVNZKWvZqfok5tgmPUbL/PREVIEW_SCREENSHOT3_54899.jpg?w=256&thumb=false"}],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":[],"shots":[],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":[],"shots":[],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":[],"shots":[],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":["Locked up in a prison for super powered humans, Fetch is forced to relive tragedies from her past. Unravel her dark secret in Seattle while battling to escape snowy Curdon Cay and seek vengeance for those who wronged her."],"shots":[{"url":"https://image.api.playstation.com/cdn/UP9000/CUSA00575_00/FREE_CONTENTYGbHZVKYgILz3xkEXrz1/PREVIEW_SCREENSHOT1_62521.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP9000/CUSA00575_00/FREE_CONTENTYGbHZVKYgILz3xkEXrz1/PREVIEW_SCREENSHOT1_62521.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP9000/CUSA00575_00/FREE_CONTENTkNedeeCFX3BJ46kVpIps/PREVIEW_SCREENSHOT2_62521.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP9000/CUSA00575_00/FREE_CONTENTkNedeeCFX3BJ46kVpIps/PREVIEW_SCREENSHOT2_62521.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP9000/CUSA00575_00/FREE_CONTENTkqlDEqFve9ymp9BLuC5e/PREVIEW_SCREENSHOT3_62521.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP9000/CUSA00575_00/FREE_CONTENTkqlDEqFve9ymp9BLuC5e/PREVIEW_SCREENSHOT3_62521.jpg?w=256&thumb=false"}],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":["The best-selling LEGO Batman videogame franchise returns in an out-of-this-world, action-packed adventure!","In LEGO Batman™ 3: Beyond Gotham, the Caped Crusader joins forces with the super heroes of the DC Comics universe and blasts off to outer space to stop the evil Brainiac from destroying Earth.","Using the power of the Lantern Rings, Brainiac shrinks worlds to add to his twisted collection of miniature cities from across the universe.","Now the greatest super heroes and the most cunning villains must unite and journey to different Lantern Worlds to collect the Lantern Rings and stop Brainiac before it’s too late.","• Exciting space combat - For the first time ever, battle with Batman and his allies in outer space and the various Lantern worlds including Zamaron and Odym.","• Robust roster of DC Comics heroes and villains - Play and unlock more than 150 unique characters with amazing powers and abilities, including members of the Justice League, and BIG LEGO Figures such as Cyborg, Solomon Grundy and more."],"shots":[{"url":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/313690/ss_67bb5a7afd535cfe43dd382a342a5964d6fc74e0.1920x1080.jpg?t=1780597097","thumb":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/313690/ss_67bb5a7afd535cfe43dd382a342a5964d6fc74e0.600x338.jpg?t=1780597097"},{"url":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/313690/ss_d533f45ea1cab37689710e5125af10e70855cc5c.1920x1080.jpg?t=1780597097","thumb":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/313690/ss_d533f45ea1cab37689710e5125af10e70855cc5c.600x338.jpg?t=1780597097"},{"url":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/313690/ss_08f80367bea3ea25c76b507bd3b2fd83602e0c36.1920x1080.jpg?t=1780597097","thumb":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/313690/ss_08f80367bea3ea25c76b507bd3b2fd83602e0c36.600x338.jpg?t=1780597097"}],"summary":"The Caped Crusader joins forces with the super heroes of the DC Comics universe and blasts off to outer space to stop the evil Brainiac from destroying Earth."}
+1
View File
@@ -0,0 +1 @@
{"about":["It was an average day for Steve the intern, until he gets a strange call late at night telling him to go back to work.","When he arrives, Steve gets lost in his own paranoid delusions until tragedy strikes.","Left with no way out, Steve decides to end it all. But instead, he finds himself in..","..another world...","Another_World is a Silent Hill/P.T. inspired psychological horror game. This is my first independently developed game made with Unreal Engine 4.","Featuring an original story and music written by me."],"shots":[{"url":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/1246390/ss_a0f69f7e66b16830ef8caf7666f22b4f31c15d23.1920x1080.jpg?t=1583482121","thumb":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/1246390/ss_a0f69f7e66b16830ef8caf7666f22b4f31c15d23.600x338.jpg?t=1583482121"},{"url":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/1246390/ss_3a2e86281cdcb15f988abe3f945a3e2914278e75.1920x1080.jpg?t=1583482121","thumb":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/1246390/ss_3a2e86281cdcb15f988abe3f945a3e2914278e75.600x338.jpg?t=1583482121"},{"url":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/1246390/ss_6a1d69282302e06443fc44aebda8816bd3e47842.1920x1080.jpg?t=1583482121","thumb":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/1246390/ss_6a1d69282302e06443fc44aebda8816bd3e47842.600x338.jpg?t=1583482121"}],"summary":"Another_World is a Silent Hill/P.T. inspired psychological horror game. This is the first act for my first independently developed game made with Unreal Engine 4. Featuring an original soundtrack and story-line."}
+1
View File
@@ -0,0 +1 @@
{"about":["A RUTHLESS NEW HERO FOR A BRUTAL NEW WORLD","Play as Arno, an entirely new breed of Assassin more lethal than his ancestors. Take down your prey with a range of new weapons such as the Phantom Blade, a Hidden Blade with crossbow capabilities.","EXPERIENCE SEAMLESS PARKOUR, COMBAT, AND STEALTH GAMEPLAY","Enjoy a high degree of freedom and control over your Assassin, with parkour mechanics for seamless free running, a revamped fighting system, and enhanced stealth gameplay.","DISCOVER REVOLUTIONARY PARIS","The French Revolution turns a once magnificent city into a place of terror and chaos. Explore the stunning, full-scale open world city and witness history unfold."],"shots":[{"url":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/289650/ss_19c1c8d52d714fe8d0a0277c36832b4e0ad5def3.1920x1080.jpg?t=1786632648","thumb":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/289650/ss_19c1c8d52d714fe8d0a0277c36832b4e0ad5def3.600x338.jpg?t=1786632648"},{"url":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/289650/ss_d825c8fd7c5472d17732bf3480760dd88924e551.1920x1080.jpg?t=1786632648","thumb":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/289650/ss_d825c8fd7c5472d17732bf3480760dd88924e551.600x338.jpg?t=1786632648"},{"url":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/289650/ss_42c6e1765549541d5576ec5bdb01cbc45f376444.1920x1080.jpg?t=1786632648","thumb":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/289650/ss_42c6e1765549541d5576ec5bdb01cbc45f376444.600x338.jpg?t=1786632648"}],"summary":"Paris, 1789. In this action-adventure game, experience the French Revolution through the eyes of Arno Dorian. Become an Assassin and expose the true powers behind the Revolution for the fate of a nation."}
+1
View File
@@ -0,0 +1 @@
{"about":["Shadow Warrior is bold re-imagining of the cult classic FPS from developer Flying Wild Hog and Devolver Digital.","Blending the viciously over-the-top gunplay of its predecessor with the elegant precision of the powerful katana, Shadow Warrior is an imaginative take on the classic arcade-style shooter.","Shadow Warrior tells the offbeat tale of Zilla Enterprise’s corporate shogun Lo Wang as he is ordered to acquire a legendary blade of limitless power by his deceitful employer.","Betrayed and left for dead, Lo Wang learns of the blade’s connection to ancient gods from another realm preparing to push our world to the brink of destruction.","Now the reluctant hero must become legend through a masterful combination of gun, blade, magic and wit to uncover the truth behind the demonic invasion and banish evil back into the darkness.","Video output in Full HD 1080p requires 1080p native display."],"shots":[{"url":"https://image.api.playstation.com/cdn/UP3643/CUSA00628_00/FREE_CONTENT5EEf5Z7KZmCsgPtqqDGx/PREVIEW_SCREENSHOT1_62463.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP3643/CUSA00628_00/FREE_CONTENT5EEf5Z7KZmCsgPtqqDGx/PREVIEW_SCREENSHOT1_62463.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP3643/CUSA00628_00/FREE_CONTENTRZp1Dza29lTG9llALxlU/PREVIEW_SCREENSHOT2_62463.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP3643/CUSA00628_00/FREE_CONTENTRZp1Dza29lTG9llALxlU/PREVIEW_SCREENSHOT2_62463.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP3643/CUSA00628_00/FREE_CONTENT8RXzKyHe9Sr1474CNm36/PREVIEW_SCREENSHOT3_62463.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP3643/CUSA00628_00/FREE_CONTENT8RXzKyHe9Sr1474CNm36/PREVIEW_SCREENSHOT3_62463.jpg?w=256&thumb=false"}],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":["• A procedurally generated castle means every run is different.","• Rogue-lite. Your character dies, but with each passing your lineage grows and becomes stronger.","• Tons of unique traits making every play through special. Want to be dyslexic? Now you can!","• 10 different classes to master! Each class comes with unique abilities that change the way you play the game.","• All wizards have beards. Regardless of gender.","• Over 60 different enemies to test your skills against. Hope you like palette-swaps!"],"shots":[{"url":"https://image.api.playstation.com/cdn/UP4488/CUSA00629_00/FREE_CONTENTmP2jJdEfei8numBrTGJb/PREVIEW_SCREENSHOT1_55798.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP4488/CUSA00629_00/FREE_CONTENTmP2jJdEfei8numBrTGJb/PREVIEW_SCREENSHOT1_55798.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP4488/CUSA00629_00/FREE_CONTENTNfRZPWcAlECkNaZbBYmK/PREVIEW_SCREENSHOT2_55798.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP4488/CUSA00629_00/FREE_CONTENTNfRZPWcAlECkNaZbBYmK/PREVIEW_SCREENSHOT2_55798.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP4488/CUSA00629_00/FREE_CONTENTqYuAfTCp0j3dfh4gEwre/PREVIEW_SCREENSHOT3_55798.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP4488/CUSA00629_00/FREE_CONTENTqYuAfTCp0j3dfh4gEwre/PREVIEW_SCREENSHOT3_55798.jpg?w=256&thumb=false"}],"summary":"Rogue Legacy is a genealogical rogue-\"LITE\" where anyone can be a hero. Each time you die, your child will succeed you. Every child is unique. One child might be colorblind, another might be a dwarf with vertigo. But that's OK, because no one is…"}
+1
View File
@@ -0,0 +1 @@
{"about":["Strategy. Speed. Story. These are the core pillars of Battlefield™ Hardline, a cops vs. criminals experience unlike any other. Plan the perfect bank heist and get away with the loot before the cops take out your crew.","Rip through the streets in a muscle car and engage in high-speed pursuits as bullets whiz by from all directions.","Then take a break from epic multiplayer showdowns to play through the thrilling single-player campaign, inspired by great TV crime dramas. This is a whole new take on Battlefield.","And with the Battlefield Hardline Ultimate Edition, you'll have the complete experience. It's jam-packed with bonus content, ensuring you'll have everything you need to join your friends and get a piece of the action.","Get Battlefield Hardline Digital Deluxe — Lead your crew as detective Nick Mendoza in the single-player campaign, then take the fight online in massive 64-player battles.","There are tons of cops-vs.-criminals modes that keep the classic Battlefield gameplay feeling fresh. This edition includes special Versatility, Precision, and Suppression Battlepacks, which contain in-game weapons, XP boosters, and more."],"shots":[{"url":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/1238880/ss_496d43df7a21dc2fdaf34d4e3ec316216dbd782d.1920x1080.jpg?t=1777391940","thumb":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/1238880/ss_496d43df7a21dc2fdaf34d4e3ec316216dbd782d.600x338.jpg?t=1777391940"},{"url":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/1238880/ss_fd676e367f09f8a045a348b056d8099f799ca841.1920x1080.jpg?t=1777391940","thumb":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/1238880/ss_fd676e367f09f8a045a348b056d8099f799ca841.600x338.jpg?t=1777391940"},{"url":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/1238880/ss_77cc821daf703456260f4bd1607dce346740a42a.1920x1080.jpg?t=1777391940","thumb":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/1238880/ss_77cc821daf703456260f4bd1607dce346740a42a.600x338.jpg?t=1777391940"}],"summary":"Strategy. Speed. Story. These are the core pillars of Battlefield™ Hardline, a cops vs. criminals experience unlike any other."}
+1
View File
@@ -0,0 +1 @@
{"about":["Immerse yourself in your STAR WARS™ battle fantasies.","Feeling the ominous thud of an AT-AT stomping down on the frozen tundra of Hoth. Rebel forces firing blasters as Imperial speeder bikes zip through the lush forests of Endor.","Intense dogfights between squadrons of X-wings and TIE fighters filling the skies. Immerse yourself in the epic STAR WARS™ battles you’ve always dreamed of and create new heroic moments of your own in STAR WARS™ Battlefront™.","STAR WARS™ Battlefront™: X-Wing VR Mission will immerse players in one of the most dreamt about Star Wars fantasies – piloting an X-wing in the far reaches of space.","This all-new mission will be exclusive to PlayStation VR this holiday, and is free* for owners of STAR WARS™ Battlefront™.","* Requires Star Wars Battlefront for PS4™, PlayStation®VR, and PlayStation Camera (all sold separately)"],"shots":[{"url":"https://image.api.playstation.com/cdn/UP0006/CUSA00640_00/FREE_CONTENT3AQ4XTqGCPk2mdfe9lmp/PREVIEW_SCREENSHOT1_78642.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP0006/CUSA00640_00/FREE_CONTENT3AQ4XTqGCPk2mdfe9lmp/PREVIEW_SCREENSHOT1_78642.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP0006/CUSA00640_00/FREE_CONTENTKXJ9CvnK4JZYcOdAC57L/PREVIEW_SCREENSHOT2_78642.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP0006/CUSA00640_00/FREE_CONTENTKXJ9CvnK4JZYcOdAC57L/PREVIEW_SCREENSHOT2_78642.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP0006/CUSA00640_00/FREE_CONTENTYpEmfqt7RnGaxWfokcOE/PREVIEW_SCREENSHOT3_78642.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP0006/CUSA00640_00/FREE_CONTENTYpEmfqt7RnGaxWfokcOE/PREVIEW_SCREENSHOT3_78642.jpg?w=256&thumb=false"}],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":["From the creators of Bastion, Transistor is a sci-fi themed action RPG that invites you to wield an extraordinary weapon of unknown origin as you fight through a stunning futuristic city.","Remote Play requires PS Vita system and sufficiently robust Wi-Fi connection.","1 player 3GB minimum save size","DUALSHOCK®4","Remote Play 1080p HD Video Output Software subject to license (us.playstation.com/softwarelicense).","Online features require an account and are subject to terms of service and applicable privacy policy (playstationnetwork.com/terms-of-service & playstationnetwork.com/privacy-policy)."],"shots":[{"url":"https://image.api.playstation.com/cdn/UP2125/CUSA00502_00/FREE_CONTENTSEeKz8QLVv1qRHUmzpzd/PREVIEW_SCREENSHOT1_54118.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP2125/CUSA00502_00/FREE_CONTENTSEeKz8QLVv1qRHUmzpzd/PREVIEW_SCREENSHOT1_54118.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP2125/CUSA00502_00/FREE_CONTENTyTeZQ6Yo85CkVBosfmm7/PREVIEW_SCREENSHOT2_54118.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP2125/CUSA00502_00/FREE_CONTENTyTeZQ6Yo85CkVBosfmm7/PREVIEW_SCREENSHOT2_54118.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP2125/CUSA00502_00/FREE_CONTENT3zxrFI1xCGxXQ5MVUVbs/PREVIEW_SCREENSHOT3_54118.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP2125/CUSA00502_00/FREE_CONTENT3zxrFI1xCGxXQ5MVUVbs/PREVIEW_SCREENSHOT3_54118.jpg?w=256&thumb=false"}],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":["The critically-acclaimed title makes its debut on the PS4™ system.","Explore the ancient, mysterious world of Journey as you soar above ruins and glide across sands to discover its secrets. Play alone or in the company of a fellow traveler and explore its vast world together.","Featuring stunning visuals and a Grammy-nominated musical score, Journey delivers a breathtaking experience like no other."],"shots":[{"url":"https://image.api.playstation.com/cdn/UP9000/CUSA00694_00/FREE_CONTENTHsGH7Qbim7Pj7IF5FMZn/PREVIEW_SCREENSHOT1_88842.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP9000/CUSA00694_00/FREE_CONTENTHsGH7Qbim7Pj7IF5FMZn/PREVIEW_SCREENSHOT1_88842.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP9000/CUSA00694_00/FREE_CONTENTiH0nV4UxAaPIOoFY1e5a/PREVIEW_SCREENSHOT2_88842.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP9000/CUSA00694_00/FREE_CONTENTiH0nV4UxAaPIOoFY1e5a/PREVIEW_SCREENSHOT2_88842.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP9000/CUSA00694_00/FREE_CONTENTqRo1SIx811AvvbvaXBQq/PREVIEW_SCREENSHOT3_88842.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP9000/CUSA00694_00/FREE_CONTENTqRo1SIx811AvvbvaXBQq/PREVIEW_SCREENSHOT3_88842.jpg?w=256&thumb=false"}],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":["The world is at your fingertips as you fight for survival, explore for fortune, and dig for glory. Delve deep into cavernous expanses, test your mettle in combat, or construct your own city!","Terraria offers more than ever - including the brand new 1.4.5 Bigger and Boulder Content!","Presenting an impressive catalogue of 5,000+ items, 25+ NPCs, and 400+ enemies and blending elements of classic action games with sandbox-style creativity, Terraria is truly a unique adventure!","The latest content update includes:","NEW 1.4.5 CONTENT:","- Dead Cells crossover content – new weapons, combat accessories and more!"],"shots":[{"url":"https://image.api.playstation.com/vulcan/ap/rnd/202601/1914/74f7a8e7dbcc43a37650f244a74c132dedb6ffd97a3ffe2d.jpeg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/vulcan/ap/rnd/202601/1914/74f7a8e7dbcc43a37650f244a74c132dedb6ffd97a3ffe2d.jpeg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/vulcan/ap/rnd/202601/1914/d287b7caf455a69e7181b369613e3ebf5901d476bd0ac4bc.jpeg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/vulcan/ap/rnd/202601/1914/d287b7caf455a69e7181b369613e3ebf5901d476bd0ac4bc.jpeg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/vulcan/ap/rnd/202601/1914/c50b6ae11c60e4011ea7e847ad7a00f8738e13056d902d2b.jpeg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/vulcan/ap/rnd/202601/1914/c50b6ae11c60e4011ea7e847ad7a00f8738e13056d902d2b.jpeg?w=256&thumb=false"}],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":[],"shots":[],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":["The Binding of Isaac is a randomly generated action RPG shooter with heavy Rogue-like elements.","Following Isaac on his journey, players will find bizarre treasures that change Isaac’s form giving him super human abilities and enabling him to fight off droves of mysterious creatures, discover secrets, and fight his way to safety.","The Binding of Isaac: Rebirth is the ultimate of remakes with an all-new highly efficient game engine, all-new hand-drawn pixel style artwork, highly polished visual effects, all-new soundtrack and audio by Ridiculon, and hundreds upon hundreds of…","Gameplay Details: -4 BILLION Seeded Runs!","-20 Challenge Runs -450+ Items, including 160 new unlockables -Analog Direction movement and speed -Over 100 specialized seeds -Over 200 co-op characters -10 playable characters -100+ enemies -Over 50 bosses, including new and rare bosses -Rooms…"],"shots":[{"url":"https://image.api.playstation.com/cdn/UP2103/CUSA00792_00/FREE_CONTENTUSWQMroRuwJLkoYxaPpK/PREVIEW_SCREENSHOT1_66069.png?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP2103/CUSA00792_00/FREE_CONTENTUSWQMroRuwJLkoYxaPpK/PREVIEW_SCREENSHOT1_66069.png?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP2103/CUSA00792_00/FREE_CONTENTObGIpU9rSgXp8SceqfYF/PREVIEW_SCREENSHOT2_66069.png?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP2103/CUSA00792_00/FREE_CONTENTObGIpU9rSgXp8SceqfYF/PREVIEW_SCREENSHOT2_66069.png?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP2103/CUSA00792_00/FREE_CONTENTftL463GLh9r5m9Gaxa8n/PREVIEW_SCREENSHOT3_66069.png?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP2103/CUSA00792_00/FREE_CONTENTftL463GLh9r5m9Gaxa8n/PREVIEW_SCREENSHOT3_66069.png?w=256&thumb=false"}],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":["Lara Croft and the Temple of Osiris is the sequel to the critically-acclaimed Lara Croft and the Guardian of Light.","Featuring stunning visuals and a brand-new story, players must work together to explore the temple, defeat hordes of enemies, solve devious puzzles, and avoid deadly traps.","All the while, players will compete for treasure, powerful artifacts, and ultimate bragging rights."],"shots":[{"url":"https://image.api.playstation.com/cdn/UP0082/CUSA00794_00/FREE_CONTENTluAbrdRePDQPuoS1TWxt/PREVIEW_SCREENSHOT1_68732.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP0082/CUSA00794_00/FREE_CONTENTluAbrdRePDQPuoS1TWxt/PREVIEW_SCREENSHOT1_68732.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP0082/CUSA00794_00/FREE_CONTENTFzN8sbiirko5kvwbJP7G/PREVIEW_SCREENSHOT2_68732.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP0082/CUSA00794_00/FREE_CONTENTFzN8sbiirko5kvwbJP7G/PREVIEW_SCREENSHOT2_68732.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP0082/CUSA00794_00/FREE_CONTENTjADueDd7l4Ria30CCVCC/PREVIEW_SCREENSHOT3_68732.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP0082/CUSA00794_00/FREE_CONTENTjADueDd7l4Ria30CCVCC/PREVIEW_SCREENSHOT3_68732.jpg?w=256&thumb=false"}],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":["Explore a mysterious all-white landscape by splatting paint to reveal the world around you.","As Monroe, a 10-year-old orphan, you'll follow a swan that's stepped out of an unfinished painting and wandered off into a surreal, storybook-inspired kingdom.","Each chapter brings surprises, new ways to explore the world, a host of bizarre (and sometimes dangerous) creatures, and encounters with the eccentric king who built this empire."],"shots":[{"url":"https://image.api.playstation.com/cdn/UP9000/CUSA00695_00/FREE_CONTENTudlXCsXvgKpcWvjyfrIm/PREVIEW_SCREENSHOT1_65762.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP9000/CUSA00695_00/FREE_CONTENTudlXCsXvgKpcWvjyfrIm/PREVIEW_SCREENSHOT1_65762.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP9000/CUSA00695_00/FREE_CONTENTpYkZ2Wxh6f2lsPTJBP9H/PREVIEW_SCREENSHOT2_65762.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP9000/CUSA00695_00/FREE_CONTENTpYkZ2Wxh6f2lsPTJBP9H/PREVIEW_SCREENSHOT2_65762.jpg?w=256&thumb=false"},{"url":"https://image.api.playstation.com/cdn/UP9000/CUSA00695_00/FREE_CONTENTEXKfLI7AbSdtY3xyJegE/PREVIEW_SCREENSHOT3_65762.jpg?w=1920&thumb=false","thumb":"https://image.api.playstation.com/cdn/UP9000/CUSA00695_00/FREE_CONTENTEXKfLI7AbSdtY3xyJegE/PREVIEW_SCREENSHOT3_65762.jpg?w=256&thumb=false"}],"summary":""}
+1
View File
@@ -0,0 +1 @@
{"about":["Call of Duty®: Advanced Warfare, developed by Sledgehammer Games (co-developers of Call of Duty®: Modern Warfare® 3), harnesses the first three-year, all next-gen development cycle in franchise history.","Call of Duty®: Advanced Warfare envisions a powerful future, where both technology and tactics have evolved to usher in a new era of combat for the franchise.","Delivering a stunning performance, Academy Award® winning actor Kevin Spacey stars as Jonathan Irons - one of the most powerful men in the world - shaping this chilling vision of the future of war.","Power Changes Everything.An Advanced World Call of Duty: Advanced Warfare takes place in a plausible future in which technological progress and today’s military practices have converged with powerful consequences.","In this carefully researched and crafted vision, Private Military Corporations (PMCs) have become the dominant armed forces for countless nations outsourcing their military needs, redrawing borders and rewriting the rules of war.","And Jonathan Irons, the founder and president of the world’s largest PMC - Atlas Corporation - is at the center of it all."],"shots":[{"url":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/209650/ss_9c2a0040aec3508c40134442597987eaa01cc7c4.1920x1080.jpg?t=1785427113","thumb":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/209650/ss_9c2a0040aec3508c40134442597987eaa01cc7c4.600x338.jpg?t=1785427113"},{"url":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/209650/ss_101172dd16fc318668589aa1638dcf5d6f3f4e8a.1920x1080.jpg?t=1785427113","thumb":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/209650/ss_101172dd16fc318668589aa1638dcf5d6f3f4e8a.600x338.jpg?t=1785427113"},{"url":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/209650/ss_2979d947252eca10186ac6f18cfd556be19b4ff1.1920x1080.jpg?t=1785427113","thumb":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/209650/ss_2979d947252eca10186ac6f18cfd556be19b4ff1.600x338.jpg?t=1785427113"}],"summary":"Call of Duty®: Advanced Warfare envisions a powerful future, where both technology and tactics have evolved to usher in a new era of combat for the franchise.Power Changes Everything."}
+1
View File
@@ -0,0 +1 @@
{"about":["Malpractice Makes Perfect.","Didn’t fancy seven years at medical school? Skip straight to the operating table with Surgeon Simulator; an over-the-top operation sim, stitching together dastardly dark humour with all the seriousness of life-saving surgery.","Taking on the role of Nigel Burke, a would-be surgeon with a penchant for non-conventional tools, perform critical procedures on patients including The Heavy from TF2, an alien with a truly one-of-a-kind anatomical structure, and the 45th…","Known for its diabolically difficult controls (with each finger separately controlled by a different keyboard button), carry out terrifying transplants in theatre, high-pressure procedures along the corridor, and on-the-move operations in the back…","Steady hands? Yeah, that ain’t gonna help!","Updated for 2017, Surgeon Simulator now includes the A&E expansion pack. We’re talking slicker (and often stickier!) graphics, additional procedures, all-new environments, and a (heart) pumping soundtrack."],"shots":[{"url":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/233720/ss_2649ec090dbd500cc561a1dce6d844a6068ce242.1920x1080.jpg?t=1773072184","thumb":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/233720/ss_2649ec090dbd500cc561a1dce6d844a6068ce242.600x338.jpg?t=1773072184"},{"url":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/233720/ss_02ee2afbc5c87558de81f440fd2cb0ef42139cb2.1920x1080.jpg?t=1773072184","thumb":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/233720/ss_02ee2afbc5c87558de81f440fd2cb0ef42139cb2.600x338.jpg?t=1773072184"},{"url":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/233720/ss_1ae93f9b4ded474826a87dc024b7868a8a438941.1920x1080.jpg?t=1773072184","thumb":"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/233720/ss_1ae93f9b4ded474826a87dc024b7868a8a438941.600x338.jpg?t=1773072184"}],"summary":"Surgeon Simulator is an over-the-top operation sim, stitching together pitch-black humour with life-saving surgery. Become Dr. Burke, a would-be surgeon with a less than conventional toolkit, as he performs procedures on patients including the…"}
Loaded 100 of 4726 files, more files were not shown because too many files have changed in this diff. Show more