forked from Ports/goldeneye-pc-port
release: v0.4.0 site/README consistency + Web 1.0 re-skin
- Docs site: drop jekyll-theme-cayman for a hand-rolled _layouts/default.html
(masthead band + middot text nav + footer with last-updated stamp and legal
line; head re-plumbed with {% seo %}, viewport, favicon); head-custom.html
fully rewritten to the chosen design tokens - charcoal/off-white/amber,
Libre Baskerville headings over system sans, square corners, 1px borders,
flat (no gradients/shadows), mermaid wrapper re-skinned.
- docs/index.md: v0.4.0 status (native widescreen, aim system, rebinding,
crosshair, rumble, rebuilt overlay); Honest status replaced by the v0.4.0
release-notes known issues; body anchor-nav line; legal footer moved to
layout.
- security-and-fidelity-status.md: front matter so {% seo %} titles it.
- README.md: v0.4.0 truth pass (status, Working/Known issues, Deck preset
2x MSAA / 250% per code, background stats 981 commits / 283 findings,
comparison table, GEPD-default controls paragraph, earlier builds) plus
markdown-native motifs matching the site: top anchor-nav line, --- section
rules, last-updated footer stamp, license badge in the amber accent.
- release-notes: SFTP sideload mention (leftover from the Deck session).
This commit is contained in:
1 parent
ad20cf210a
commit
64913054ce
7 files changed
+308
-250
No files matched your search
@@ -282,7 +282,7 @@ to install.
|
||||
`prepare-assets/ge007-convert` inside the bundle; you can also run it
|
||||
manually; it prints what it's doing.)
|
||||
|
||||
**Steam Deck:** sideload the unpacked folder (USB or a file manager), do
|
||||
**Steam Deck:** sideload the unpacked folder (SFTP, USB or a file manager), do
|
||||
steps 2–3, then add the executable to Games → *Add Game* as a non-Steam
|
||||
game. The first launch in Game Mode picks up the Deck preset (native
|
||||
1280×800, 2× MSAA, vsync) automatically if no config exists yet.
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
# GoldenEye 007 PC Port
|
||||
|
||||
[](https://github.com/jkdansereau/goldeneye-pc-port/actions/workflows/ci.yml)
|
||||

|
||||

|
||||
|
||||
[Download](#download) · [Status](#status) · [Roadmap](#roadmap) · [Building](#building) · [Docs](#documentation) · [Legal](#legal)
|
||||
|
||||
A native PC port of _GoldenEye 007_ (Rare, 1997, Nintendo 64), compiled from
|
||||
the [GoldenEye 007 decompilation](https://github.com/n64decomp/007): the
|
||||
@@ -12,7 +14,7 @@ in a dedicated `port/` layer, following the architecture of the
|
||||
[Perfect Dark PC port](https://github.com/fgsfdsfgs/perfect_dark), the same
|
||||
Rare "Indy" engine family, one hardware generation apart.
|
||||
|
||||
**v0.3.0** is out for Windows and Linux (including Steam Deck, where the
|
||||
**v0.4.0** is out for Windows and Linux (including Steam Deck, where the
|
||||
Linux bundle sideloads as-is) and runs the full campaign at a steady 60 fps
|
||||
with known rough edges ([Status](#status)). Free to download, build on and
|
||||
modify (you bring the ROM).
|
||||
@@ -44,6 +46,8 @@ account of what worked and what didn't.
|
||||
from live v0.3.0 play sessions.</em>
|
||||
</p>
|
||||
|
||||
---
|
||||
|
||||
## Download
|
||||
|
||||
| Platform | Bundle | Notes |
|
||||
@@ -53,8 +57,8 @@ account of what worked and what didn't.
|
||||
|
||||
Both bundles contain **no ROM and no game assets**: you supply your own
|
||||
(see [Requirements](#requirements)), which keeps the release legal to
|
||||
distribute. Earlier builds: v0.2.2, v0.2.1, v0.2.0, and v0.1.0 alpha, same
|
||||
page. You can also build it yourself; see [Building](#building).
|
||||
distribute. Earlier builds: v0.3.0, v0.2.2, v0.2.1, v0.2.0, and v0.1.0
|
||||
alpha, same page. You can also build it yourself; see [Building](#building).
|
||||
|
||||
### Quick start
|
||||
|
||||
@@ -67,12 +71,14 @@ included or distributed. Then:
|
||||
2. Make a `data/` folder next to the executable and drop the ROM in as `ge007.ntsc-final.z64`.
|
||||
3. Launch the executable from that folder. The first run takes a few extra seconds: it detects the ROM and generates the derived asset folders once (no Python or other tooling needed).
|
||||
|
||||
Read the [Status](#status) caveats first: v0.3.0 has known rough edges,
|
||||
Read the [Status](#status) caveats first: v0.4.0 has known rough edges,
|
||||
listed plainly there.
|
||||
|
||||
---
|
||||
|
||||
## Status
|
||||
|
||||
**v0.3.0 - playable, with known rough edges.** The full single-player
|
||||
**v0.4.0 - playable, with known rough edges.** The full single-player
|
||||
campaign is completable end to end (all 20 missions, Agent difficulty,
|
||||
playtested), at a steady 60 fps; all 20 solo missions — plus the
|
||||
end-of-campaign credits sequence — load, render and run crash-free, verified
|
||||
@@ -87,15 +93,19 @@ game's logic: [Security & fidelity status](docs/security-and-fidelity-status.md)
|
||||
start), front-end menu navigation on the left stick to match the F10 overlay
|
||||
(D282); all 20 solo missions load, render and are crash-free (full campaign
|
||||
playtested end to end at Agent difficulty, including the ending sequence); steady 60 fps
|
||||
(software RSP off the presentation critical path); full audio: in-level music and SFX; keyboard + mouse (click-to-lock, proportional aim mode, a single
|
||||
simplified sensitivity control) and a modern dual-stick controller layout;
|
||||
native widescreen at any aspect ratio (undistorted world, HUD anchored to the
|
||||
screen edges, 4:3 menus pillarboxed); Bond is fixed in cutscenes (no more
|
||||
(software RSP off the presentation critical path); full audio: in-level music and SFX; keyboard + mouse (click-to-lock, an aim style of your
|
||||
choice — N64 or centred FPS-style — with per-device sensitivity) and a modern
|
||||
dual-stick controller layout (use/reload/weapon-cycle on A/X/Y, rumble-pak
|
||||
vibration on supported pads); native widescreen at any aspect ratio
|
||||
(undistorted world, HUD anchored to the screen edges, 4:3 menus pillarboxed);
|
||||
in-game key rebinding (keyboard/mouse) with a GEPD-style default layout;
|
||||
crosshair customization (opt-in); Bond is fixed in cutscenes (no more
|
||||
floating or spin-glitching) and his third-person model positioning generally
|
||||
is right the large majority of the time now, at most a small drift when off; file-backed saves; faithful N64 progression
|
||||
by default (F10 → *All unlocked* opens every level, 007 mode and the full
|
||||
cheat menu); F10 in-game options overlay (resolution, frame cap, MSAA,
|
||||
filtering, FOV, sensitivity); Windows and Linux, including Steam Deck.
|
||||
cheat menu); F10 in-game options overlay (display, audio, gameplay, HUD;
|
||||
resolution, frame cap, MSAA, filtering, FOV, sensitivity); Windows and
|
||||
Linux, including Steam Deck.
|
||||
|
||||
**Known issues:**
|
||||
|
||||
@@ -103,10 +113,10 @@ filtering, FOV, sensitivity); Windows and Linux, including Steam Deck.
|
||||
~10 s before resuming the scripted shootout — a latent race that exists in
|
||||
the N64 original too (where it softlocks permanently); the port detects and
|
||||
auto-recovers it (D318).
|
||||
- **Native widescreen is new in v0.4.0**: the world renders undistorted at
|
||||
your display's aspect (wider view, same vertical FOV) and the HUD keeps its
|
||||
shape; front-end menus are shown 4:3 with side bars. The F10 *Native
|
||||
widescreen* toggle restores the old stretched frame.
|
||||
- With native widescreen on, the F10 options overlay stretches with the
|
||||
window instead of pillarboxing like the front-end menus (legible; cosmetic;
|
||||
the F10 *Native widescreen* toggle restores the old stretched frame
|
||||
throughout). The world/HUD widescreen rendering itself is correct (D335b).
|
||||
- The Rareware front-end logo shows a subtle texture-filtering artifact
|
||||
(Nintendo logo and legal page are clean). Cosmetic only (D75).
|
||||
- This release ships NTSC (US) assets; PAL/JP ROMs are not supported in this
|
||||
@@ -118,7 +128,8 @@ filtering, FOV, sensitivity); Windows and Linux, including Steam Deck.
|
||||
original progression you need to preserve.
|
||||
- Assorted further cosmetic defects are tracked in
|
||||
[`docs/dev/GRAPHICS-BACKLOG.md`](docs/dev/GRAPHICS-BACKLOG.md).
|
||||
- No macOS or ARM support; no controller rebinding UI.
|
||||
- No macOS or ARM support. Keyboard/mouse rebinding shipped in v0.4.0;
|
||||
controller-button rebinding is not supported yet.
|
||||
|
||||
Root causes and fix status for every item: the [release notes](https://github.com/jkdansereau/goldeneye-pc-port/releases)
|
||||
and the finding log in [`docs/dev/findings.md`](docs/dev/findings.md).
|
||||
@@ -130,8 +141,8 @@ it straight from the [releases page](https://github.com/jkdansereau/goldeneye-pc
|
||||
unzip, drop your ROM in `data/`, launch it once (the first run generates the
|
||||
derived assets), and add the executable as a non-Steam game. SDL2 is bundled, so no dependencies need
|
||||
installing. On SteamOS the first launch seeds `ge007.ini` with Deck-friendly
|
||||
defaults: native 1280×800 fullscreen, VSync, MSAA 4, and 150% draw/LOD
|
||||
distance (the authored N64 fade distances read short on the close-up panel);
|
||||
defaults: native 1280×800 fullscreen, VSync, 2× MSAA, and 250% draw/LOD
|
||||
distance (the N64-authored fade distances read short on the close-up 7" panel);
|
||||
everything is changeable in the options overlay and persists afterwards.
|
||||
**Do that first launch in Game Mode, not Desktop Mode** — an ini created by
|
||||
an earlier Desktop Mode launch (e.g. while testing before adding it as a
|
||||
@@ -152,6 +163,8 @@ options, **A** steps the selected option forward, **B** steps it back, and
|
||||
filtering cycle, sliders step in increments. With a keyboard attached the same
|
||||
overlay is `F10` + arrows/Enter.
|
||||
|
||||
---
|
||||
|
||||
## Roadmap
|
||||
|
||||
No fixed timeline or committed feature list — this is spare-time work — but
|
||||
@@ -160,7 +173,8 @@ directionally, on the way to v1.0:
|
||||
- Working through the [known issues](#status) above and the fuller list in
|
||||
[`docs/dev/findings.md`](docs/dev/findings.md).
|
||||
- **PAL and JP ROM support** ([issue #85](https://github.com/jkdansereau/goldeneye-pc-port/issues/85)); NTSC-U is the only supported region today.
|
||||
- **Controller rebinding UI**, and macOS/ARM builds.
|
||||
- **Controller (pad) button rebinding UI** (keyboard/mouse rebinding shipped
|
||||
in v0.4.0), and macOS/ARM builds.
|
||||
- **LAN multiplayer**: reviving GoldenEye's original split-screen/deathmatch
|
||||
netplay across multiple PCs on a local network. Genuinely under
|
||||
consideration, but early and not started; no ETA.
|
||||
@@ -171,11 +185,14 @@ Not currently planned: new game modes GE never shipped (e.g. co-op), online (non
|
||||
multiplayer, ray tracing. If any of these matter to you, open an issue —
|
||||
it helps prioritize.
|
||||
|
||||
---
|
||||
|
||||
## Beyond playing
|
||||
|
||||
- **Tweak it**: `ge007.ini` and the F10 in-game overlay expose resolution,
|
||||
frame cap, MSAA, texture filtering, FOV/draw distance and mouse feel;
|
||||
launch with `-fresh` for a clean-slate run.
|
||||
frame cap, MSAA, texture filtering, FOV/draw distance, mouse feel, key
|
||||
rebinding, crosshair and vibration; launch with `-fresh` for a clean-slate
|
||||
run.
|
||||
- **Read it**: [`docs/internals.md`](docs/internals.md) maps the
|
||||
architecture and the software RSP; [`docs/porting-notes.md`](docs/porting-notes.md)
|
||||
is the catalogue of N64→PC bug classes hit along the way. Game logic in
|
||||
@@ -186,6 +203,8 @@ it helps prioritize.
|
||||
the ground rules for getting changes in, and [`docs/dev/`](docs/dev/) is
|
||||
the raw engineering record behind every fix.
|
||||
|
||||
---
|
||||
|
||||
## Background
|
||||
|
||||
The port was built by two coding agents, a local open-weight model
|
||||
@@ -195,8 +214,8 @@ asset pipeline, first frames), and **Claude Code** (Sonnet 5, Opus 5 for the
|
||||
hardest bugs) joining for the collaborative phase (the 21-level sweep, the
|
||||
ABI finding catalog, SDL input, front end), handing work back and forth
|
||||
through shared written notes, directed by one person part-time. In short:
|
||||
36 days (16 Aug – 20 Sep), ~835 commits, 199 findings root-caused and
|
||||
logged (`D1`–`D321`).
|
||||
43 days (16 Aug – 28 Sep), 981 commits, 283 findings root-caused and
|
||||
logged (`D1`–`D405`).
|
||||
|
||||
The full write-up (timeline, handoff mechanism, effort breakdown, an honest
|
||||
"what worked / what didn't"): [`docs/dev/agentic-development.md`](docs/dev/agentic-development.md).
|
||||
@@ -204,6 +223,8 @@ The workflow itself: [`docs/dev-process.md`](docs/dev-process.md). To cite the
|
||||
project or its findings: [`CITATION.cff`](CITATION.cff) (GitHub's "Cite this
|
||||
repository" menu).
|
||||
|
||||
---
|
||||
|
||||
## How this differs from the other GoldenEye PC projects
|
||||
|
||||
This is a native port of the original 1997 Nintendo 64 game, built from its
|
||||
@@ -219,13 +240,15 @@ code with this one.
|
||||
| **How** | Decompilation-based source port: human-reconstructed C, compiled for the host; game logic runs as written | Static binary recompilation: the shipped machine code is auto-translated to C; no source-level understanding |
|
||||
| **Lineage** | [GoldenEye 007 decompilation](https://github.com/n64decomp/007) + [Perfect Dark PC port](https://github.com/fgsfdsfgs/perfect_dark) engine family | Xbox 360 "…Recompiled" static-recompilation family |
|
||||
| **Renderer** | Software RSP → OpenGL | Hardware (Vulkan) |
|
||||
| **Status** | v0.3.0 public release; full campaign playable at 60 fps (see [Status](#status)) | Playable full game |
|
||||
| **Status** | v0.4.0 public release; full campaign playable at 60 fps (see [Status](#status)) | Playable full game |
|
||||
| **Why it exists** | To run the *original* N64 game from source, and as a [case study in AI-agent collaboration](#background) on a hard low-level codebase | To get a playable PC release of the remaster |
|
||||
|
||||
They answer a different question: how to get the *remaster* onto PC by
|
||||
machine translation. This project answers how to get the *original 1997
|
||||
game* onto PC, running from its reconstructed source.
|
||||
|
||||
---
|
||||
|
||||
## Requirements
|
||||
|
||||
You need a GoldenEye 007 (Nintendo 64) ROM that you legally own, in
|
||||
@@ -245,6 +268,8 @@ The port also relies on the decompilation's asset-extraction step, which pulls
|
||||
the level, model, texture and music data out of your ROM at build time. That
|
||||
step, too, requires your ROM and is part of [Building](#building).
|
||||
|
||||
---
|
||||
|
||||
## Building
|
||||
|
||||
Prerequisites: CMake >= 3.16, a C/C++ toolchain, SDL2, zlib, OpenGL, Python 3,
|
||||
@@ -284,6 +309,8 @@ cd goldeneye-pc-port
|
||||
The executable is written to `build-pc/ge007.x86_64` (on Windows,
|
||||
`build-pc/ge007.x86_64.exe`).
|
||||
|
||||
---
|
||||
|
||||
## Running
|
||||
|
||||
1. Create a `data/` directory in the repo root.
|
||||
@@ -323,12 +350,15 @@ accepts and B cancels. RB's *updated graphics* toggle cannot be provided by
|
||||
the original N64 port (no remastered assets); it is reserved. Back opens PC
|
||||
options rather than Xbox's *view scores*; exact menu parity is not claimed.
|
||||
The other Xbox schemes (1.2 Christmas, 1.3 Frost, 1.4 Elektra) are planned,
|
||||
not yet selectable. Input → Bindings → Movement/Actions edits **keyboard/mouse
|
||||
not yet selectable. Keyboard → Bindings edits **keyboard/mouse
|
||||
only**; a controller can navigate those pages and use B to go back, but
|
||||
controller-button rebinding is not supported yet.
|
||||
|
||||
Mouse sensitivity, Y-inversion and the aim/turn split are tunable in the
|
||||
`[Input]` section of `ge007.ini`.
|
||||
F10 overlay (*Keyboard → Sensitivity*) or the `[Input]` section of
|
||||
`ge007.ini`.
|
||||
|
||||
---
|
||||
|
||||
## How it works
|
||||
|
||||
@@ -361,6 +391,8 @@ tools_pc/ PC-port helper + analysis scripts
|
||||
docs/ see below
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Documentation
|
||||
|
||||
Key docs are also published as a site:
|
||||
@@ -376,6 +408,8 @@ Key docs are also published as a site:
|
||||
| [`docs/dev/`](docs/dev/) | The raw engineering record: the full finding log, per-level status, graphics backlog, playtest matrices, and [`docs/dev/game-behavior-reference.md`](docs/dev/game-behavior-reference.md) (a secondary-sourced playtest reference for how the retail game is meant to behave; repo-only, code is ground truth). |
|
||||
| [`docs/SetupGuide.md`](docs/SetupGuide.md), [`docs/StyleGuide.md`](docs/StyleGuide.md) | Inherited from the decompilation this repo forks. |
|
||||
|
||||
---
|
||||
|
||||
## Credits
|
||||
|
||||
This port is a thin layer on a large amount of other people's work.
|
||||
@@ -433,6 +467,8 @@ This port is a thin layer on a large amount of other people's work.
|
||||
- [pi](https://pi.dev/): the local coding-agent harness.
|
||||
- [Claude / Claude Code](https://claude.com/claude-code) (Anthropic).
|
||||
|
||||
---
|
||||
|
||||
## Legal
|
||||
|
||||
This is a non-commercial fan preservation/research project, in the same
|
||||
@@ -465,3 +501,7 @@ The original work in this repository, the port layer (`port/`), the PC build
|
||||
system, `tools_pc/`, and the documentation, is released under the MIT License;
|
||||
see [`LICENSE`](LICENSE). Everything inherited from the upstream decompilation
|
||||
is covered by [`NOTICE`](NOTICE), not by that license.
|
||||
|
||||
---
|
||||
|
||||
*Last updated 2026-09-28 — v0.4.0.*
|
||||
+3
-1
@@ -7,7 +7,9 @@ title: GoldenEye 007 PC Port
|
||||
# tagline on every page. Per-page meta/og descriptions come from each page's
|
||||
# front matter `description:` (see index.md), not from here.
|
||||
description: N64 GoldenEye 007, decompiled for PC.
|
||||
theme: jekyll-theme-cayman
|
||||
# No GitHub theme: the site uses a hand-rolled _layouts/default.html plus the
|
||||
# design in _includes/head-custom.html (charcoal/off-white/amber, square and
|
||||
# flat.)
|
||||
show_downloads: false
|
||||
|
||||
# Canonical site location - used by jekyll-seo-tag (canonical URLs, og: tags)
|
||||
|
||||
+147
-173
@@ -3,267 +3,242 @@
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@400;500;600;700&family=IBM+Plex+Mono:wght@400;500&display=swap" rel="stylesheet">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Libre+Baskerville:ital,wght@0,400;0,700;1,400&display=swap" rel="stylesheet">
|
||||
|
||||
<style>
|
||||
/* ----------------------------------------------------------------------
|
||||
Design pass over the stock Cayman theme.
|
||||
Restrained "spy-tech" palette: near-black, slate, a single amber accent.
|
||||
Loaded after the theme stylesheet, so these rules win without !important.
|
||||
Hand-rolled site theme (replaces jekyll-theme-cayman, 2026-09-28).
|
||||
Look: committed charcoal/off-white/amber "night desk" — flat and square,
|
||||
serif display type (Libre Baskerville) over a system sans body, thin
|
||||
amber rules between sections, text navigation separated by middots.
|
||||
No gradients, no shadows, no rounded corners, no theme switcher.
|
||||
--------------------------------------------------------------------- */
|
||||
:root {
|
||||
color-scheme: light dark;
|
||||
--ink: #14171c;
|
||||
--ink-soft: #3d444d;
|
||||
--ink-mute: #626b76;
|
||||
--line: #e4e6e9;
|
||||
--bg: #ffffff;
|
||||
--bg-soft: #f7f8fa;
|
||||
--accent: #b7791f;
|
||||
--accent-ink: #8a5a12;
|
||||
--header-1: #0d1117;
|
||||
--header-2: #1c2530;
|
||||
--radius: 8px;
|
||||
--measure: 44rem;
|
||||
--bg: #1b1b1d; /* charcoal page */
|
||||
--bg-soft: #232326; /* code / alt rows */
|
||||
--bg-deep: #141416; /* code blocks, masthead */
|
||||
--ink: #e8e6e3; /* off-white body text */
|
||||
--ink-soft: #b5b1a9; /* secondary text */
|
||||
--ink-mute: #8d897f; /* captions, footer */
|
||||
--line: #3a3a3e; /* 1px borders */
|
||||
--accent: #ffb454; /* amber/gold */
|
||||
--accent-hi: #ffd08a; /* link hover */
|
||||
--measure: 44rem;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
--ink: #e7eaee;
|
||||
--ink-soft: #b9c0c9;
|
||||
--ink-mute: #8b939e;
|
||||
--line: #2a2f37;
|
||||
--bg: #0f1216;
|
||||
--bg-soft: #171b21;
|
||||
--accent: #e0a94a;
|
||||
--accent-ink: #f0c274;
|
||||
--header-1: #0a0d11;
|
||||
--header-2: #161d27;
|
||||
}
|
||||
}
|
||||
html { background: var(--bg); }
|
||||
|
||||
body {
|
||||
font-family: "IBM Plex Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
|
||||
margin: 0;
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
|
||||
"Helvetica Neue", Arial, sans-serif;
|
||||
font-size: 16.5px;
|
||||
line-height: 1.7;
|
||||
color: var(--ink);
|
||||
background: var(--bg);
|
||||
font-size: 17px;
|
||||
line-height: 1.7;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
text-rendering: optimizeLegibility;
|
||||
}
|
||||
|
||||
/* ---- Header --------------------------------------------------------- */
|
||||
.page-header {
|
||||
position: relative;
|
||||
isolation: isolate;
|
||||
text-align: center;
|
||||
padding: 4rem 1rem 3.75rem;
|
||||
background: linear-gradient(135deg, var(--header-1), var(--header-2));
|
||||
border-bottom: 1px solid rgba(224, 169, 74, 0.28);
|
||||
/* ---- Masthead -------------------------------------------------------- */
|
||||
.site-masthead {
|
||||
background: var(--bg-deep);
|
||||
border-bottom: 1px solid var(--accent);
|
||||
}
|
||||
.page-header::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
z-index: -1;
|
||||
background-image: url("{{ '/img/attract-bunker1.png' | relative_url }}");
|
||||
background-size: cover;
|
||||
background-position: center 38%;
|
||||
opacity: 0.16;
|
||||
filter: grayscale(0.35) contrast(1.05);
|
||||
}
|
||||
.page-header::after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
z-index: -1;
|
||||
background: linear-gradient(180deg, rgba(13,17,23,0.35), rgba(13,17,23,0.82));
|
||||
}
|
||||
.project-name {
|
||||
font-weight: 700;
|
||||
letter-spacing: -0.02em;
|
||||
font-size: 2.4rem;
|
||||
margin: 0 0 0.4rem;
|
||||
color: #fff;
|
||||
text-shadow: 0 1px 24px rgba(0,0,0,0.5);
|
||||
}
|
||||
.project-tagline {
|
||||
font-weight: 400;
|
||||
font-size: 1.12rem;
|
||||
line-height: 1.55;
|
||||
color: #d3d9e0;
|
||||
opacity: 1;
|
||||
max-width: 42rem;
|
||||
margin: 0 auto 1.6rem;
|
||||
}
|
||||
.page-header .btn {
|
||||
display: inline-block;
|
||||
padding: 0.5rem 1.1rem;
|
||||
margin: 0.3rem 0.25rem 0;
|
||||
font-size: 0.9rem;
|
||||
font-weight: 500;
|
||||
letter-spacing: 0.01em;
|
||||
color: #f3f5f7;
|
||||
background: rgba(255,255,255,0.06);
|
||||
border: 1px solid rgba(255,255,255,0.22);
|
||||
border-radius: var(--radius);
|
||||
transition: background 0.15s ease, border-color 0.15s ease, transform 0.15s ease;
|
||||
}
|
||||
.page-header .btn:hover {
|
||||
background: rgba(224,169,74,0.16);
|
||||
border-color: var(--accent);
|
||||
text-decoration: none;
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
|
||||
/* ---- Body ---------------------------------------------------------- */
|
||||
.main-content {
|
||||
.masthead-inner {
|
||||
max-width: 52rem;
|
||||
margin: 0 auto;
|
||||
padding: 3rem 1.5rem 1rem;
|
||||
color: var(--ink);
|
||||
font-size: 17px;
|
||||
padding: 2.6rem 1.5rem 1.6rem;
|
||||
text-align: center;
|
||||
}
|
||||
.main-content p,
|
||||
.main-content ul,
|
||||
.main-content ol,
|
||||
.main-content blockquote { max-width: var(--measure); }
|
||||
.masthead-title {
|
||||
display: inline-block;
|
||||
font-family: "Libre Baskerville", Georgia, "Times New Roman", serif;
|
||||
font-weight: 700;
|
||||
font-size: 2.1rem;
|
||||
line-height: 1.25;
|
||||
color: var(--ink);
|
||||
text-decoration: none;
|
||||
letter-spacing: 0.01em;
|
||||
}
|
||||
.masthead-title:hover { color: var(--accent); }
|
||||
.masthead-tagline {
|
||||
margin-top: 0.5rem;
|
||||
color: var(--ink-mute);
|
||||
font-size: 0.95rem;
|
||||
}
|
||||
.masthead-nav {
|
||||
margin-top: 1.3rem;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
.masthead-nav a {
|
||||
color: var(--accent);
|
||||
text-decoration: none;
|
||||
padding: 0.1rem 0.15rem;
|
||||
}
|
||||
.masthead-nav a:hover { color: var(--accent-hi); text-decoration: underline; }
|
||||
.nav-sep { color: var(--ink-mute); padding: 0 0.35rem; }
|
||||
|
||||
.main-content h1,
|
||||
.main-content h2,
|
||||
.main-content h3,
|
||||
.main-content h4 {
|
||||
/* ---- Content ---------------------------------------------------------- */
|
||||
.doc-content {
|
||||
max-width: 52rem;
|
||||
margin: 0 auto;
|
||||
padding: 2.5rem 1.5rem 1rem;
|
||||
}
|
||||
.doc-content p,
|
||||
.doc-content ul,
|
||||
.doc-content ol,
|
||||
.doc-content blockquote { max-width: var(--measure); }
|
||||
|
||||
.doc-content h1,
|
||||
.doc-content h2,
|
||||
.doc-content h3,
|
||||
.doc-content h4 {
|
||||
font-family: "Libre Baskerville", Georgia, "Times New Roman", serif;
|
||||
font-weight: 700;
|
||||
line-height: 1.35;
|
||||
color: var(--ink);
|
||||
font-weight: 600;
|
||||
letter-spacing: -0.015em;
|
||||
line-height: 1.3;
|
||||
margin-top: 2.4rem;
|
||||
margin-bottom: 0.9rem;
|
||||
}
|
||||
.main-content h1 { font-size: 1.9rem; }
|
||||
.main-content h2 {
|
||||
font-size: 1.4rem;
|
||||
padding-bottom: 0.35rem;
|
||||
border-bottom: 1px solid var(--line);
|
||||
}
|
||||
.main-content h3 { font-size: 1.15rem; }
|
||||
.main-content > h1:first-child { margin-top: 0.5rem; }
|
||||
.doc-content h1 { font-size: 1.75rem; }
|
||||
.doc-content h2 { font-size: 1.35rem; }
|
||||
.doc-content h3 { font-size: 1.1rem; }
|
||||
.doc-content > h1:first-child { margin-top: 0.5rem; }
|
||||
|
||||
.main-content a {
|
||||
color: var(--accent-ink);
|
||||
.doc-content a {
|
||||
color: var(--accent);
|
||||
text-decoration: underline;
|
||||
text-decoration-color: rgba(183,121,31,0.4);
|
||||
text-decoration-color: rgba(255, 180, 84, 0.45);
|
||||
text-underline-offset: 2px;
|
||||
}
|
||||
.main-content a:hover {
|
||||
color: var(--accent);
|
||||
.doc-content a:hover {
|
||||
color: var(--accent-hi);
|
||||
text-decoration-color: currentColor;
|
||||
}
|
||||
@media (prefers-color-scheme: dark) {
|
||||
.main-content a { color: var(--accent); }
|
||||
|
||||
.doc-content hr {
|
||||
border: 0;
|
||||
height: 1px;
|
||||
background: var(--accent);
|
||||
opacity: 0.5;
|
||||
margin: 2.5rem 0;
|
||||
}
|
||||
|
||||
.main-content blockquote {
|
||||
color: var(--ink-mute);
|
||||
.doc-content blockquote {
|
||||
color: var(--ink-soft);
|
||||
border-left: 3px solid var(--accent);
|
||||
padding: 0.2rem 0 0.2rem 1.1rem;
|
||||
margin-left: 0;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
.main-content hr {
|
||||
height: 1px;
|
||||
background: var(--line);
|
||||
border: 0;
|
||||
margin: 2.5rem 0;
|
||||
}
|
||||
|
||||
/* Lead paragraph on doc pages (the italic summary under the H1) */
|
||||
.main-content > p > em:only-child {
|
||||
.doc-content > p > em:only-child {
|
||||
font-style: normal;
|
||||
color: var(--ink-soft);
|
||||
font-size: 1.05rem;
|
||||
}
|
||||
|
||||
/* ---- Code --------------------------------------------------------- */
|
||||
.main-content code {
|
||||
font-family: "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, monospace;
|
||||
/* ---- Code ------------------------------------------------------------ */
|
||||
.doc-content code {
|
||||
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
||||
font-size: 0.86em;
|
||||
background: var(--bg-soft);
|
||||
border: 1px solid var(--line);
|
||||
border-radius: 4px;
|
||||
padding: 0.12em 0.4em;
|
||||
color: var(--ink);
|
||||
}
|
||||
.main-content pre {
|
||||
background: var(--header-1);
|
||||
.doc-content pre {
|
||||
background: var(--bg-deep);
|
||||
border: 1px solid var(--line);
|
||||
border-radius: var(--radius);
|
||||
padding: 1rem 1.15rem;
|
||||
max-width: var(--measure);
|
||||
overflow-x: auto;
|
||||
line-height: 1.55;
|
||||
}
|
||||
.main-content pre code {
|
||||
.doc-content pre code {
|
||||
background: transparent;
|
||||
border: 0;
|
||||
padding: 0;
|
||||
color: #e6edf3;
|
||||
color: var(--ink);
|
||||
font-size: 0.84rem;
|
||||
}
|
||||
|
||||
/* ---- Tables ------------------------------------------------------- */
|
||||
.main-content table {
|
||||
/* ---- Tables ----------------------------------------------------------- */
|
||||
.doc-content table {
|
||||
border-collapse: collapse;
|
||||
display: table;
|
||||
width: 100%;
|
||||
max-width: var(--measure);
|
||||
margin: 1.5rem 0;
|
||||
font-size: 0.92rem;
|
||||
}
|
||||
.main-content table th,
|
||||
.main-content table td {
|
||||
.doc-content table th,
|
||||
.doc-content table td {
|
||||
border: 1px solid var(--line);
|
||||
padding: 0.5rem 0.75rem;
|
||||
text-align: left;
|
||||
}
|
||||
.main-content table th { background: var(--bg-soft); font-weight: 600; }
|
||||
.main-content table tr { background: transparent; }
|
||||
.main-content table tr:nth-child(2n) { background: var(--bg-soft); }
|
||||
.doc-content table th { background: var(--bg-soft); font-weight: 600; }
|
||||
.doc-content table tr:nth-child(2n) { background: #1f1f22; }
|
||||
|
||||
.main-content img {
|
||||
border-radius: var(--radius);
|
||||
/* ---- Images & gallery -------------------------------------------------- */
|
||||
.doc-content img {
|
||||
border: 1px solid var(--line);
|
||||
border-radius: 0;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
/* ---- Footer ------------------------------------------------------- */
|
||||
.doc-content details {
|
||||
max-width: var(--measure);
|
||||
border: 1px solid var(--line);
|
||||
background: var(--bg-soft);
|
||||
padding: 0.6rem 0.9rem;
|
||||
margin: 1.5rem 0;
|
||||
}
|
||||
.doc-content summary { cursor: pointer; color: var(--accent); }
|
||||
|
||||
/* ---- Footer ------------------------------------------------------------- */
|
||||
.site-footer {
|
||||
max-width: 52rem;
|
||||
margin: 3rem auto 0;
|
||||
padding: 1.5rem 1.5rem 2.5rem;
|
||||
border-top: 1px solid var(--line);
|
||||
color: var(--ink-mute);
|
||||
font-size: 0.86rem;
|
||||
}
|
||||
.site-footer a { color: var(--accent-ink); }
|
||||
@media (prefers-color-scheme: dark) { .site-footer a { color: var(--accent); } }
|
||||
.footer-inner { max-width: var(--measure); }
|
||||
.footer-stamp {
|
||||
color: var(--ink-soft);
|
||||
font-size: 0.88rem;
|
||||
margin: 0 0 0.8rem;
|
||||
}
|
||||
.footer-stamp a { color: var(--accent); text-decoration: none; }
|
||||
.footer-stamp a:hover { color: var(--accent-hi); text-decoration: underline; }
|
||||
.footer-legal {
|
||||
color: var(--ink-mute);
|
||||
font-size: 0.8rem;
|
||||
line-height: 1.6;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
@media (max-width: 42rem) {
|
||||
.project-name { font-size: 1.9rem; }
|
||||
.page-header { padding: 3rem 1rem 2.75rem; }
|
||||
.main-content { padding-top: 2rem; }
|
||||
.masthead-title { font-size: 1.7rem; }
|
||||
.masthead-inner { padding: 2rem 1rem 1.2rem; }
|
||||
.doc-content { padding-top: 1.8rem; }
|
||||
}
|
||||
|
||||
/* ---- Mermaid diagrams ------------------------------------------------ */
|
||||
/* ---- Mermaid diagrams ---------------------------------------------------- */
|
||||
/* Kramdown renders ```mermaid fences as <pre><code class="language-mermaid">.
|
||||
The script below hands their text to mermaid and swaps in the SVG. Keep
|
||||
the pre unstyled (no dark code background) while it waits to render. */
|
||||
.main-content pre.mermaid,
|
||||
.main-content pre > code.language-mermaid {
|
||||
the pre unstyled (no code-block background) while it waits to render. */
|
||||
.doc-content pre.mermaid,
|
||||
.doc-content pre > code.language-mermaid {
|
||||
background: transparent;
|
||||
border: 0;
|
||||
color: var(--ink);
|
||||
padding: 0;
|
||||
}
|
||||
.main-content pre.mermaid { text-align: center; overflow-x: auto; }
|
||||
.main-content pre.mermaid:not([data-processed]) { visibility: hidden; }
|
||||
.doc-content pre.mermaid { text-align: center; overflow-x: auto; }
|
||||
.doc-content pre.mermaid:not([data-processed]) { visibility: hidden; }
|
||||
</style>
|
||||
|
||||
<script type="module">
|
||||
@@ -271,7 +246,6 @@
|
||||
|
||||
// Move each ```mermaid code block's text into a <pre class="mermaid"> that
|
||||
// mermaid.run() recognises.
|
||||
const dark = window.matchMedia("(prefers-color-scheme: dark)").matches;
|
||||
document.querySelectorAll("pre > code.language-mermaid").forEach((code) => {
|
||||
const pre = document.createElement("pre");
|
||||
pre.className = "mermaid";
|
||||
@@ -282,7 +256,7 @@
|
||||
mermaid.initialize({
|
||||
startOnLoad: false,
|
||||
securityLevel: "loose", // our own docs; needed for <br/> in node labels
|
||||
theme: dark ? "dark" : "neutral",
|
||||
theme: "dark",
|
||||
});
|
||||
mermaid.run({ querySelector: "pre.mermaid" });
|
||||
</script>
|
||||
@@ -0,0 +1,48 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<link rel="icon" type="image/png" href="{{ '/img/attract-bunker1.png' | relative_url }}">
|
||||
{%- seo -%}
|
||||
{%- include head-custom.html -%}
|
||||
</head>
|
||||
<body>
|
||||
<header class="site-masthead">
|
||||
<div class="masthead-inner">
|
||||
<a class="masthead-title" href="{{ '/' | relative_url }}">{{ site.title }}</a>
|
||||
<div class="masthead-tagline">{{ site.description }}</div>
|
||||
<nav class="masthead-nav">
|
||||
<a href="{{ '/' | relative_url }}">Home</a><span class="nav-sep">·</span>
|
||||
<a href="{{ '/internals' | relative_url }}">Internals</a><span class="nav-sep">·</span>
|
||||
<a href="{{ '/porting-notes' | relative_url }}">Porting notes</a><span class="nav-sep">·</span>
|
||||
<a href="{{ '/building' | relative_url }}">Building</a><span class="nav-sep">·</span>
|
||||
<a href="{{ '/dev-process' | relative_url }}">Dev process</a><span class="nav-sep">·</span>
|
||||
<a href="{{ '/dev/agentic-development' | relative_url }}">Two-agent study</a>
|
||||
</nav>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="doc-content">
|
||||
{{ content }}
|
||||
</main>
|
||||
|
||||
<footer class="site-footer">
|
||||
<div class="footer-inner">
|
||||
<p class="footer-stamp">
|
||||
Last updated 2026-09-28 — v0.4.0
|
||||
<span class="nav-sep">·</span>
|
||||
<a href="https://github.com/jkdansereau/goldeneye-pc-port">GitHub</a>
|
||||
<span class="nav-sep">·</span>
|
||||
<a href="https://github.com/jkdansereau/goldeneye-pc-port/releases">Releases</a>
|
||||
</p>
|
||||
<p class="footer-legal">
|
||||
Non-commercial fan preservation/research project. No ROM or game assets
|
||||
are distributed; you supply a ROM you already own. Not affiliated with
|
||||
or endorsed by Nintendo, Rare, Microsoft, MGM, Danjaq, or EON
|
||||
Productions.
|
||||
</p>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
+36
-48
@@ -1,36 +1,39 @@
|
||||
---
|
||||
title: GoldenEye 007 PC Port
|
||||
# v0.3.0: status bumped from v0.2.1; Honest-status bullets synced with the
|
||||
# README's v0.3.0 known issues (D255/D282/F10-dup/overscan items removed as
|
||||
# fixed). Description kept at 133 chars (Bing's 160 limit).
|
||||
# v0.4.0: status bumped from v0.3.0; Honest status replaced by the v0.4.0
|
||||
# release-notes known issues (rainbow/water/z-fight/cameras/trees/muzzle/
|
||||
# stretched-widescreen/gunshot items all fixed; D335b F10-overlay stretch is
|
||||
# the new widescreen residual). Description kept short (Bing's 160 limit).
|
||||
description: >-
|
||||
A native PC port of the 1997 N64 classic, built from decompiled source with
|
||||
a software RSP. v0.3.0 for Windows, Linux and Steam Deck.
|
||||
a software RSP. v0.4.0 for Windows, Linux and Steam Deck.
|
||||
---
|
||||
|
||||
<!-- v0.2.1 (Bing SEO): the "# GoldenEye 007 PC Port" h1 was removed here --
|
||||
the Cayman masthead already renders the site title as an <h1>, so the page
|
||||
was emitting two h1 tags. -->
|
||||
|
||||
A native PC port of the original 1997 Nintendo 64 _GoldenEye 007_, compiled
|
||||
from the game's [decompiled source](https://github.com/n64decomp/007) with the
|
||||
N64's graphics coprocessor (RSP) running in software, the same architecture
|
||||
as the [Perfect Dark PC port](https://github.com/fgsfdsfgs/perfect_dark), the
|
||||
same Rare "Indy" engine family, one hardware generation apart.
|
||||
|
||||
**Status: v0.3.0.** The full single-player campaign runs at a steady 60 fps
|
||||
and is completable end to end (all 20 missions playtested); all 20 missions
|
||||
load and run clean on Windows, Linux and Steam Deck, and audio (music + SFX)
|
||||
plays throughout. The known rough edges — mostly cosmetic rendering defects,
|
||||
stretched-not-native widescreen, and missing features — are listed plainly
|
||||
under [Honest status](#honest-status).
|
||||
[Download](#download) · [See it running](#see-it-running) · [Honest status](#honest-status) · [Documentation](#documentation)
|
||||
|
||||
**Status: v0.4.0.** The full single-player campaign runs at a rock-stable
|
||||
60 fps and is completable end to end (all 20 missions playtested on Windows
|
||||
and Steam Deck). This release adds **native widescreen** (on by default —
|
||||
undistorted world at your display's aspect, 4:3 menus pillarboxed), a
|
||||
**complete aim system** (N64 or centred PC style, for mouse *and*
|
||||
controller), **in-game key rebinding** with a GEPD-style default layout,
|
||||
**crosshair customization**, real **rumble-pak haptics** on supported
|
||||
gamepads, and a **rebuilt options overlay** with fine-tuning rows (frame cap,
|
||||
MSAA, draw/LOD distance, HUD scale). The remaining rough edges are few and
|
||||
mostly cosmetic — listed plainly under [Honest status](#honest-status).
|
||||
|
||||
**This is a pre-1.0 release, not a finished product** — v1.0 is the target
|
||||
for a polished, feature-complete build; expect rough edges and missing
|
||||
features until then. See the
|
||||
[README's Roadmap section](https://github.com/jkdansereau/goldeneye-pc-port#roadmap)
|
||||
for direction (PAL/JP support, real widescreen, LAN multiplayer under
|
||||
consideration, and more).
|
||||
for direction (PAL/JP support, controller-button rebinding, LAN multiplayer
|
||||
under consideration, and more).
|
||||
|
||||
<p align="center">
|
||||
<img src="media/goldeneye-gh-preview.gif" width="70%"
|
||||
@@ -190,34 +193,25 @@ catalogue: [Porting notes](porting-notes.md).
|
||||
|
||||
## Honest status
|
||||
|
||||
- **Particle colours** can still drift through a rainbow palette
|
||||
intermittently: one genuine cause is fixed this release, a second hasn't
|
||||
been found yet (D252).
|
||||
- **Some muzzle flashes draw an extra erroneous long flash** straight up from
|
||||
the gun, on top of the correct one. Cosmetic only (D303).
|
||||
- Water levels show a moving seam between two water patterns (D245);
|
||||
occasional z-fighting on some geometry (D308); in-level security-camera
|
||||
props can occasionally face backwards (D307). Minor and cosmetic.
|
||||
- **The front-end Nintendo logo renders as two white blobs** and the Rareware
|
||||
logo's texture filtering looks off (D75).
|
||||
- Surface 1's 2D billboard trees render as a solid wall of tree texture
|
||||
instead of discrete sprites; under active investigation (D236).
|
||||
- **Widescreen is stretched, not native**: 16:9 stretches the 4:3 frame to
|
||||
fill the display; automatic FOV scaling keeps the framing comfortable and
|
||||
gameplay is unaffected, but a distortion-free native widescreen render is
|
||||
still on the roadmap. Distant geometry can also drop out on the biggest
|
||||
open levels (D249).
|
||||
- **Gunshot SFX can sound off during sustained/rapid fire** (D240/D241).
|
||||
- **`All unlocked` is highly experimental** — don't enable it until you have
|
||||
at least one save written, or it can break audio and mouse aim
|
||||
(D257/D259/D281).
|
||||
- Bond's cutscene positioning is fixed and right the large majority of the
|
||||
time now; on the rare occasion he's off it's a small drift — no more
|
||||
floating or spin-glitching (D173/D292/D243).
|
||||
- No macOS/ARM support; no controller rebinding UI yet.
|
||||
- On Facility, if gas leaks during Ourumov's monologue he can pause for up to
|
||||
~10 s before resuming the scripted shootout — a latent race that exists in
|
||||
the N64 original too (where it softlocks permanently); the port detects and
|
||||
auto-recovers it. (D318)
|
||||
- With native widescreen on, the F10 options overlay stretches with the
|
||||
window instead of pillarboxing like the front-end menus (legible; cosmetic;
|
||||
the F10 *Native widescreen* toggle restores the old stretched frame
|
||||
throughout). The world/HUD widescreen rendering itself is correct. (D335b)
|
||||
- The front-end Rareware logo shows a subtle texture-filtering artifact
|
||||
(the Nintendo logo and legal page are clean). Cosmetic only. (D75)
|
||||
- **`All unlocked` is experimental**: the fresh-install corruption case is
|
||||
fixed, but saves made while it is on are not guaranteed recoverable by
|
||||
switching it off — complete a level normally first, and back up
|
||||
`data/ge007.eep` before enabling it. (D387)
|
||||
- No macOS or ARM support. Keyboard/mouse rebinding shipped in v0.4.0;
|
||||
controller-button rebinding is not supported yet.
|
||||
|
||||
The full list, with root causes and fix status: the
|
||||
[README's Status section](https://github.com/jkdansereau/goldeneye-pc-port#status)
|
||||
[release notes](https://github.com/jkdansereau/goldeneye-pc-port/releases)
|
||||
and the [finding log](https://github.com/jkdansereau/goldeneye-pc-port/tree/main/docs/dev).
|
||||
|
||||
## Documentation
|
||||
@@ -227,9 +221,3 @@ and the [finding log](https://github.com/jkdansereau/goldeneye-pc-port/tree/main
|
||||
- [Internals](internals.md): architecture, the software RSP-emulation approach, GoldenEye-vs-Perfect-Dark engine differences, the phased plan.
|
||||
- [Porting notes](porting-notes.md): the recurring Nintendo 64 → PC bug classes hit during the port, with fixes.
|
||||
- [Building](building.md): full build and asset-extraction guide.
|
||||
|
||||
---
|
||||
|
||||
<small>Non-commercial fan preservation/research project. No ROM or game assets
|
||||
are distributed; you supply a ROM you already own. Not affiliated with or
|
||||
endorsed by Nintendo, Rare, Microsoft, MGM, Danjaq, or EON Productions.</small>
|
||||
@@ -1,3 +1,9 @@
|
||||
---
|
||||
title: Security & fidelity status
|
||||
description: What a release actually installs (no networking, no telemetry, no ROM or assets)
|
||||
and how faithfully the port tracks the original N64 game's logic.
|
||||
---
|
||||
|
||||
# Security & fidelity status
|
||||
|
||||
This page answers two questions plainly: *what does installing this put on
|
||||
|
||||
Reference in new issue
Block a user