40 Commits
Author SHA1 Message Date
Samuel Fontes 6f43d6556f Fix(Window): kept the taskbar from staying over fullscreen (#1021)
EN-US

- Fixed the window being created maximized when the game starts in fullscreen or borderless, which left the Windows taskbar on top
- Added a fallback to borderless fullscreen when exclusive fullscreen fails, and raised the window after switching
- Added AllowSetForegroundWindow(ASFW_ANY) before run.py and the Rust launcher start the game
- Credited Samue1Fontes (#1020)

---

PT-BR

- Corrigida a janela criada maximizada quando o jogo abre em tela cheia ou sem borda, o que deixava a barra de tarefas do Windows por cima
- Adicionado um plano B para tela cheia sem borda quando a tela cheia exclusiva falha, e a janela passa a vir para a frente depois da troca
- Adicionado AllowSetForegroundWindow(ASFW_ANY) antes de o run.py e o launcher Rust iniciarem o jogo
- Creditado Samue1Fontes (#1020)
2026-11-01 12:46:31 -03:00
Felipe Prado 54cc7637b5 Refactor(Upscaler): removed NVIDIA DLSS support
EN-US

- Removed NVIDIA DLSS upscaling and frame generation integrations
- Removed DLSS options, dependencies and packaging steps
- Preserved AMD FSR upscaling and 2x frame generation

---

PT-BR

- Removidas as integra??es de upscaling e gera??o de quadros NVIDIA DLSS
- Removidas as op??es, depend?ncias e etapas de empacotamento do DLSS
- Preservados o upscaling AMD FSR e a gera??o de quadros 2x
2026-10-29 21:46:57 -03:00
Claude e5baa464cf Merge remote-tracking branch 'origin/pr/1005' into validation/prs-968-973-1005-1007
PR #1005 (runtime/memory fixes) merged cleanly; no conflicts.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01QvgK1mNfg7vthFr245prXW
2026-10-29 00:21:09 +00:00
KandClaude Opus 5.5 68012b2bc3 Feat(Controls/Gameplay Enhancement): Switch Attacks On-Demand Instead of Cycled (#749)
An opt-in Controls option (GOW3_SWITCH_ATTACKS=1). L1 + d-pad direction
switches to that weapon with its switch attack (the weapon in Kratos'
hands does its attack again); L1 + Cross does the switch attack of the
weapon in his hands instead of cycling. The d-pad alone switches as
before.

# Switch attacks on L1 + d-pad and L1 + Cross

[Video
Showcase.webm](https://github.com/user-attachments/assets/306dece5-b2e4-4bbb-865d-bbaba9c214ed)

In the game, L1 + Cross cycles to the next weapon with that weapon's
switch attack, and the d-pad switches weapons with no attack. This PR
adds an opt-in option, *Switch attacks on L1 + d-pad and L1 + Cross* on
the Controls page (`SPARTAN_SWITCH_ATTACKS=1`), off by default, that
puts every switch attack on demand:

- **L1 + a d-pad direction** switches to that weapon with its switch
attack. With the weapon already in Kratos' hands, it does its attack
again.
- **L1 + Cross** does the switch attack of the weapon in his hands
instead of cycling to the next one.
- **The same weapon's switch attack again** waits 0.8 seconds after the
last one. In the game each L1 + Cross also changed the weapon, so the
attacks' short recovery could not be repeated. Switching to another
weapon's attack is not held back.
- **The d-pad alone** switches as before.

Nothing presses buttons for the player. The game's own move system takes
the game's own branches to the switch attacks. Only the input that takes
them and the weapon they go to change:

- **The data.** Holding L1 puts Kratos in a block move. Block moves hold
ordinary "Cross just pressed" (and in a few moves "Cross held") branches
to the switch-attack moves (`MOV_*Transition`), one per weapon that
follows in the cycle. Each weapon has two switch-attack moves, a common
one and a rarer one. The switch-attack move's script selects its weapon
(`SCR_EnableWeapon`).
- **Input check hook (`0xeb290`).** Those branches answer the pad's
request instead of Cross. The game also checks them from a second loop
(`0xe9a70`, in the air among others), where they are never taken, so
Cross cycles nowhere. Every other condition of the move stays the
game's: when he can switch, ownership, the timing window.
- **Input queue hook (`0xe4063`).** The branch the move chose is swapped
for one of the game's own branches to the requested weapon's switch
attack, of the same kind and, when there is one, the same timing. The
branches are found once, by scanning the hero's move data (all 42 are
found in game: 36 for Cross just pressed, 6 for Cross held).
- **D-pad select hook (`0x6b240`).** Notes the player stats (weapon in
hand, weapons owned).
- **Stubs that call C.** The hooks are written in `tools/switch_stubs.s`
and call C functions in `runtime_pad.c` through `sysv_abi`, saving the
registers that are live at each site. `tests/test_switch_hook.cpp` runs
every stub from frames laid out like the game's, and finds the sites in
the reference eboot.
- **Tutorial text.** The Weapon Switching tutorial cards (texts 190,
283, 286) now end with "Hold [L1Button] to attack when switching
weapons. / Use [L1Button] and [XButton] to repeat switch attacks." This
covers all 16 `R_LANG_*.WAD` files, on copies mounted by `run.py` only
while the option is on (`scripts/switch_text.py`). The game folder is
never written. A language whose font lacks one of the new characters
keeps its own text.
- **More mounts.** The probe now takes up to 24 `--mount` arguments (was
8) and the runtime up to 32 mounts (was 16), so the glyphs' copies and
the 16 language copies fit together.
- **Research for whoever changes combat next.** `docs/moves.md` records
how the game picks Kratos' next move: the move and branch layouts, input
kinds, the input queue, the player stats offsets, the d-pad and weapon
functions, and the method that found them. That method was a record-only
build that logs what the move system does, described there so it can be
rebuilt.

Tested in game: L1 + Cross with each weapon, L1 + each owned direction
from each weapon (standing and mid-combo), and the d-pad alone, with the
Cestus, Claws and Blades. The log shows every request reaching the
requested weapon's switch attack. A press during a move that cannot
switch does nothing, as in the game (L1 + Triangle, then L1 + Cross,
jumps there as it does without the option). The English tutorial text
has been checked in game. German has been reviewed by a native speaker.
The other languages are my translations and would benefit from a native
check. The C++ tests pass; the Python suite fails only the tests that
fail on an unmodified main in the same environment (tkinter, network
share).

---------

Co-authored-by: Claude Opus 5.5 <[email protected]>
2026-10-28 20:37:24 -03:00
Rajinder SinghandFelipePrado0 96debe8fac Fix(Linux): restore trophy names and unlock persistence in AppImage (#1062) (#1070)
Closes #1062

### Problem Summary
In SpartanPort Linux AppImage v2.7.0 (notably on Steam Deck / SteamOS),
three trophy-related issues were reported:
1. In-game trophy lists showed generic labels (`Trophy ID0`, `Trophy
ID1`) rather than decrypted names.
2. In-game unlock toast notifications displayed generic titles (`Trophy
ID XX`).
3. Trophy unlock states failed to persist across application restarts in
both the game runtime and the launcher.

### Confirmed Root Cause
All three symptoms stem from asymmetric user-directory path resolution
between the launcher, runtime services, and the Linux AppImage read-only
mount:
1. `AppRun` runs the launcher with working directory (`cwd`) set to the
read-only SquashFS mount `/tmp/.mount_spartaXXXX/usr/share/spartanport`.
2. The launcher wrote `trophy_texts.txt` to
`~/.local/share/spartanport/user/`, but only exported `SPARTAN_USER_DIR`
if a custom directory was configured in settings (leaving it unset for
default configurations).
3. `src/runtime_services.c` checked `getenv("SPARTAN_USER_DIR")` and
defaulted to `"user"`, without querying `runtime_file_user_dir()`. In
the AppImage environment, reading `"user/trophy_texts.txt"` failed
(`ENOENT`), causing names to default to `"Trophy ID %d"`, and writing
`"user/trophies.dat"` failed with `EROFS` (Read-only file system),
losing unlock progress on exit.
4. Following the merge of the Rust launcher (`launcher-rust/`, PR #959),
`Paths::from_env` in `launcher-rust/src/core/paths.rs` omitted
`SPARTAN_USER_DIR`, causing `paths.user_dir("")` to fall back strictly
to `data_dir.join("user")` even when `SPARTAN_USER_DIR` was set
externally (such as by `AppRun`). Meanwhile, `RunPlan::read` in
`launcher-rust/src/runner/plan.rs` inspected `SPARTAN_USER_DIR` from the
environment, leading to a path mismatch between trophy text
generation/UI and the runtime `--user` probe argument.

### Solution
- **`src/runtime_services.c`**: Added `trophy_dir()` helper which
queries `SPARTAN_USER_DIR` (if non-empty), falls back to
`runtime_file_user_dir()`, and then defaults to `"user"`. Applied
`trophy_dir()` to both `trophy_open_text()` and `trophy_state_path()`.
- **`launcher-rust/src/core/paths.rs`**: Added `user_dir_default`
resolved from non-empty `SPARTAN_USER_DIR`, defaulting to
`data_dir.join("user")`. `paths.user_dir(&self, settings_user_dir:
&str)` strictly enforces precedence:
  1. Explicit saved `user_dir` setting.
  2. Inherited nonempty `SPARTAN_USER_DIR`.
  3. Default `SPARTAN_DATA_DIR/user`.
- **`launcher-rust/src/core/env.rs`**: `write_trophy_texts()` writes to
`paths.user_dir(&settings.get_str("user_dir"))`. Inherited
`SPARTAN_USER_DIR` in the launcher environment is preserved unless
explicitly overridden by `settings['user_dir']`.
- **`launcher-rust/src/ui/pages/game.rs`**: Updated saves placeholder
text to display `state.paths.user_dir("")` instead of hardcoding
`data_dir.join("user")`.
- **`launcher/spartanport_launcher_win.py`**: Unconditionally exports
`SPARTAN_USER_DIR` resolved to `user_dir = s.get('user_dir') or
str(DATA_DIR / 'user')` and writes `trophy_texts.txt` there.
- **`run.py`**: Propagates `SPARTAN_USER_DIR` to child processes after
resolving and creating `user_dir`.
- **`src/probe.c`**: When `--user` is provided, exports
`SPARTAN_USER_DIR` using `_putenv_s` on Windows and `setenv` on POSIX.
- **`packaging/linux/AppRun`**: Exports
`SPARTAN_USER_DIR=${SPARTAN_USER_DIR:-$SPARTAN_DATA_DIR/user}` and
ensures both directories exist before launching.

### Changed Files
- `launcher-rust/src/core/paths.rs`: Resolve `SPARTAN_USER_DIR` in
`Paths::from_env`, update `user_dir()`, add `user_dir_default()`, and
add unit tests.
- `launcher-rust/src/core/env.rs`: Added regression tests verifying
`game_environment` trophy text generation with inherited and explicit
user directories.
- `launcher-rust/src/ui/pages/game.rs`: Use `paths.user_dir("")` for
default saves folder placeholder.
- `src/runtime_services.c`: Centralized user-directory resolution helper
`trophy_dir()`.
- `launcher/spartanport_launcher_win.py`: Unconditionally set
`SPARTAN_USER_DIR` and write trophy texts.
- `run.py`: Propagate `SPARTAN_USER_DIR` to probe environment.
- `src/probe.c`: Export `SPARTAN_USER_DIR` when `--user` option is
specified.
- `packaging/linux/AppRun`: Initialize and export `SPARTAN_USER_DIR`.
- `tests/test_services.c`: Unit regression tests for directory
precedence, custom paths, toast names, and persistence across restarts.
- `tests/test_trophies.py`: Integration tests for default/custom paths,
AppRun XDG environment, and paths with spaces.

### Verification and Test Results
- **Linux (`x86_64-unknown-linux-gnu`, Ubuntu WSL)**:
  - `cargo check`: passed (exit code 0).
  - `cargo fmt -- --check`: passed (exit code 0).
  - `cargo test --lib core::paths`: 13 passed; 0 failed (exit code 0).
  - `cargo test --lib core::env`: 13 passed; 0 failed (exit code 0).
  - `cargo test --test env_contract`: 5 passed; 0 failed (exit code 0).
  - `cargo test --lib`: 729 passed; 0 failed (exit code 0).
- Native C runtime test (`test_services.c`): `services test: ok` (exit
code 0).
- Python trophy tests (`test_trophies.py`): 13 passed; 0 failed; 0
skipped (exit code 0).
- **Windows (`x86_64-pc-windows-gnullvm`)**:
  - `cargo check`: passed (exit code 0).
  - `cargo fmt -- --check`: passed (exit code 0).
  - `cargo test --lib core::paths`: 12 passed; 0 failed (exit code 0).
  - `cargo test --lib core::env`: 13 passed; 0 failed (exit code 0).
  - `cargo test --test env_contract`: 5 passed; 0 failed (exit code 0).
  - `cargo test --lib`: 739 passed; 0 failed (exit code 0).
- Native C runtime test (`test_services.c`): `services test: ok` (exit
code 0).
- Python trophy tests (`test_trophies.py`): 13 passed; 0 failed; 4
skipped (Windows-specific skips) (exit code 0).
- **Launcher controls tests**: `test_launcher_controls.py` (59/59 passed
on both platforms).
- **Save and backup tests**: `test_save_backup.py` (10/10 passed) and
`test_launcher_save.py` (17/17 passed).

### PR #973 Integration Status
Tested via a 3-way integration in a temporary worktree with PR #973 HEAD
(`GabrielTeles845:trophy-notifications`). Both branches modify
`src/runtime_services.c`, `launcher/spartanport_launcher_win.py`,
`tests/test_services.c`, and `tests/test_trophies.py`.
- Functionally, `trophy_dir()` enables PR #973's multilingual trophy
texts (`%s/trophy_texts/%s.txt`) to locate the writable user directory
on Linux AppImage.
- One minor merge conflict occurred in `tests/test_services.c` where
both branches appended test cases to `main()`. This was cleanly resolved
by keeping both test suites.
- Combined tests (`test_services`, `test_trophies.py`,
`ui-language-test`) passed with exit code 0.

### Backward Compatibility
- Binary format of `trophies.dat` is unchanged (four 32-bit bitmask
integers).
- Existing player unlock files and save directories remain untouched and
are loaded seamlessly across restarts.

### Hardware Limitations Notice
Automated tests and environment simulations verify AppRun path
generation, C services, Python and Rust launcher environments, and
filesystem read/write isolation. Live in-game trophy unlock triggers via
physical Steam Deck buttons during proprietary game image execution
(`BCUS98111`/`BCES00510`) were not tested due to the lack of proprietary
game assets and physical console hardware.

---------

Co-authored-by: FelipePrado0 <[email protected]>
2026-10-26 16:07:46 -03:00
JgamrotandSupermedo 863e49e9a0 Fix(Memory): started on Windows when guest memory exceeds the commit limit
On Windows the guest pool (SPARTAN_DMEM_MB plus 1 GiB flexible) was one
SEC_COMMIT section, about 9 GiB at 1440p and more above it. On 8-16 GB PCs
with a small page file Windows refused it (error 1450) and the game exited
with code 21. A refused commit now retries with SEC_RESERVE and commits each
range as the game maps it. If that fails too, a pool above 5056 MiB falls back
to the retail size, and sceKernelGetDirectMemorySize creates the pool first so
the game sees what it got. Exit 21 stays the last resort. The launcher's
memory warning and the README describe the new behaviour.

Lineage:
- Supermedo/bloodborne_pc@7c9ebcbb0f (Supermedo, 2026-10-16): on a commit-limit failure use SEC_RESERVE and commit ranges as the game maps them
- Jgamrot/bloodborne_pc@53d7e7f7ba (Jgamrot, 2026-10-18): fall back to the retail 5056 MiB pool; direct_size creates the pool first
- Final form: Jgamrot/bloodborne_pc@53d7e7f7ba. Not taken: Jgamrot/bloodborne_pc@9af0aa2795 (reserve the free parts around ranges a DLL already holds; main has the same fix since #1076), DarkIzuku/bloodborne_pc@72ad3928c4 (same commit-on-demand, written for a separate win32_memory.c layout SpartanPort does not have)

Adapted for SpartanPort: BB_GUEST_COMMIT_ON_MAP and BB_TEST_REFUSE_DMEM became
SPARTAN_*. pool_create() returns the host error rather than printing it. Only
the final failure prints SpartanPort's "cannot create (or map) ... MiB of
guest memory" line and exits 21, because the launchers' exit hints
(launcher-rust/src/core/log.rs and the Python launcher) match any line
containing "of guest memory" and would otherwise give memory advice after a
fallback that worked. For the same reason the progress lines avoid that
phrase. A mid-game commit failure prints the page-file wording both recognise.
The pool-fallback half of Jgamrot's tests/test_low_handles.c is a
--direct-memory-size mode in tests/test_runtime.c, run by
tests/test_runtime.py with and without SPARTAN_TEST_REFUSE_DMEM. The
launcher's memory warning (launcher-rust/src/runner/guest_memory.rs, the
launcher since #959, and scripts/guest_memory.py for run.py) and the run.py
comment no longer say that the pool is committed in full at start; the Rust
parity test pins the Python text. Releasing memory clears only the pages
already committed. The source committed the whole released range first, which
spent commit charge on memory the game never used and could exit 21 in the
case this fixes. The pool size is set once, atomically: callers read it before
taking the lock, and a thread that read it before the pool existed could
otherwise undo the fallback. The README's page-file entry also names the
mid-game "cannot commit ... guest memory" line.

Co-authored-by: Supermedo <[email protected]>
Ported-by: Mahdi Akbari Zarkesh <[email protected]>
2026-10-26 10:59:36 +03:30
Felipe Prado e4bbc128e7 Feat(Launcher): added upscaler presets above 1080p to the Rust launcher
EN-US

- Added the Upscaling section to the Rust launcher's Graphics page, with
  the six presets and each one's render size at the chosen resolution
- Added resolution patches above 1080p: each size is made from the
  smallest built-in patch that fits (720p, 1440p, 4K or 8K), with its
  Video Arena
- Fixed presets at the display size: the scene renders 2 pixels short, so
  the upscaler runs (Native AA and Ultra Quality)
- Removed the Enable the upscaler switch: the Upscaler choice's Off does
  it, and a one-time migration keeps it off for whoever had it unchecked
- Added the Upscaler and Quality Preset rows to the native Display menu
  build (menu version 23)
- Updated the Python graphics options, fixtures, snapshots and parity docs

Validation:

- Passed the full Rust suite and the parity doc tests
- Validated the Graphics page in the PT and EN snapshots

---

PT-BR

- Adicionada a seção Upscaling à página Gráficos do launcher Rust, com os
  seis presets e a resolução de cada um na resolução escolhida
- Adicionados patches de resolução acima de 1080p: cada tamanho é gerado
  do menor patch embutido que o comporta (720p, 1440p, 4K ou 8K), com o
  Video Arena dele
- Corrigidos os presets no tamanho da tela: a cena renderiza 2 pixels
  menor, para o upscaler rodar (AA nativo e Ultra Quality)
- Removida a opção Ativar o upscaler: o Desligado do seletor Upscaler faz
  isso, e uma migração única o mantém desligado para quem estava com a
  opção desmarcada
- Adicionadas as linhas Upscaler e Preset de qualidade à geração do menu
  Exibição nativo (versão 23 do menu)
- Atualizados as opções gráficas em Python, os fixtures, os snapshots e os
  docs de paridade

Validação:

- Aprovada a suíte Rust completa e os testes dos docs de paridade
- Validada a página Gráficos nos snapshots em PT e EN
2026-10-25 19:51:50 -03:00
Felipe Prado 04be2ed6a9 Chore(Merge): merged main into temporal-upscaler
EN-US

- Merged main, with the Rust launcher, into the temporal upscaler branch

---

PT-BR

- Integrada a main, com o launcher Rust, à branch do upscaler temporal
2026-10-25 19:51:49 -03:00
Felipe Prado bf9181bd4f Fix(Upscaler): fixed black eyes and dark frames at the game's own size
EN-US

- Fixed presets that land on 1920x1080 (Ultra Quality at 1440p) taking every
  scene pass for HUD: black eyes and a darker frame
- Removed the resolution patch at the game's own size; the texture corruption
  fix stays applied

---

PT-BR

- Corrigidos os presets que caem em 1920x1080 (Ultra Quality em 1440p)
  tratando todo passe da cena como HUD: olhos pretos e frame mais escuro
- Removido o patch de resolução no tamanho nativo do jogo; o Texture
  Corruption Fix continua aplicado
2026-10-25 13:21:08 -03:00
Felipe Prado 9f501f6432 Feat(Upscaler): added scaled presets with Ultra Quality
EN-US

- Added render sizes per preset (Ultra Quality 77%, Quality 67%, Balanced 59%,
  Performance 50%, Ultra Performance 33%), even and at least 640x360
- Added a resolution patch generated for each preset size from the 720p patch,
  applied at start with SPARTAN_RENDER_RES and SPARTAN_OUTPUT_RES
- Added FSR 3.1 scaling on the composite through the scaled path, with the HUD
  drawn at the output size
- Fixed the scaled frame showing only its top-left part: the finished UI image
  is copied to the display buffer as is
- Fixed darker scaled frames: the sRGB composite is read as UNORM by FSR
- Added tests for the preset sizes and the generated patch

---

PT-BR

- Adicionadas resoluções de render por preset (Ultra Quality 77%, Quality 67%,
  Balanced 59%, Performance 50%, Ultra Performance 33%), pares e no mínimo
  640x360
- Adicionado patch de resolução gerado para o tamanho de cada preset a partir
  do patch de 720p, aplicado no início com SPARTAN_RENDER_RES e
  SPARTAN_OUTPUT_RES
- Adicionada escala do FSR 3.1 sobre a composição pelo caminho com escala, com
  o HUD desenhado na resolução de saída
- Corrigido o frame com escala mostrando só o canto superior esquerdo: a
  imagem final da UI é copiada para o buffer de exibição sem alteração
- Corrigidos frames mais escuros com escala: a composição sRGB é lida como
  UNORM pelo FSR
- Adicionados testes dos tamanhos por preset e do patch gerado
2026-10-25 12:24:29 -03:00
Richard Heise bb978618d2 Add per-control mapping for generic USB controllers (#694)
EN-US

- Added per-control mapping for generic USB controllers in the launcher
- Added input capture, clearing, live preview and persistent SDL profiles
- Resolved integration conflicts with main and preserved keyboard remapping
- Validated controller configuration and gameplay on Windows
- Passed 27 mapper tests and 59 keyboard/control tests

Chinese and Indonesian translation coverage remains pending.

---

PT-BR

- Adicionado mapeamento por comando para controles USB genéricos no launcher
- Adicionadas captura de entradas, limpeza, prévia em tempo real e persistência dos perfis SDL
- Resolvidos conflitos de integração com a main e preservado o remapeamento de teclado
- Validados configuração do controle e funcionamento no jogo no Windows
- Aprovados 27 testes do mapeador e 59 de teclado/controles

A cobertura de traduções em chinês e indonésio continua pendente.
2026-10-23 01:38:53 -03:00
Felipe Prado 138f9e6f8e Feat(Menu): expanded native graphics, display and control settings (#980)
EN-US

Expanded the native options menus with graphics, display, controller and mouse settings, sharing preferences with the launcher and Insert menu.

- Added Graphics Settings with queued frames, asynchronous shaders, RCAS sharpening, anisotropic filtering and restore defaults.
- Added resolution, aspect ratio, frame rate limits, monitor, display mode, VSync and HDR to Display.
- Added button icon choices, vibration strength and mouse settings while preserving the original Controls options.
- Added scrolling indicators and Yes/No confirmations for restoring defaults and applying changes that require a restart.

Validation:
- Passed 260 targeted Python tests and two native tests.
- Built the Windows executable and manually validated the native menus.
- Simulated merging into main at 5abea30 without conflicts.
- Left dedicated HDR and multiple-monitor hardware validation pending.

---

PT-BR

Ampliados os menus nativos de opções com ajustes gráficos, de exibição, controle e mouse, compartilhando preferências com o launcher e o menu Insert.

- Adicionadas Configurações Gráficas com quadros enfileirados, shaders assíncronos, nitidez RCAS, filtragem anisotrópica e restauração dos padrões.
- Adicionados resolução, proporção, limites de FPS, monitor, modo de exibição, VSync e HDR em Exibição.
- Adicionadas opções de ícones, intensidade da vibração e configurações do mouse, preservando as opções originais de Controles.
- Adicionados indicadores de rolagem e confirmações de Sim/Não para restaurar padrões e aplicar alterações que exigem reinício.

Validação:
- Aprovados 260 testes Python focados e dois testes nativos.
- Compilado o executável Windows e validados manualmente os menus nativos.
- Simulado o merge na main em 5abea30 sem conflitos.
- Mantida pendente a validação específica de HDR e múltiplos monitores em hardware.
2026-10-22 23:39:07 -03:00
Felipe Prado cb2c5bd8dd Feat(Menu): added native display settings
EN-US

- Added resolution, aspect ratio, frame rate limit, engine frame rate,
  monitor, display mode, VSync and HDR controls to Display
- Added Apply and Restart with Yes/No confirmation
- Shared monitor and HDR preferences with the launcher

---

PT-BR

- Adicionados controles de resolução, proporção, limite de FPS, FPS do
  motor, monitor, modo de exibição, VSync e HDR em Exibição
- Adicionado Aplicar e reiniciar com confirmação de Sim/Não
- Compartilhadas as preferências de monitor e HDR com o launcher
2026-10-22 21:46:12 -03:00
Rajinder Singh 9749bd5b7e Fix(Localization): localize native Exit to Desktop menu (#649) (#779)
* Fix(Localization): localize native Exit to Desktop menu (#649)

- Add localized translations for the native Exit to Desktop menu option in scripts/pause_menu.py, supporting Japanese (デスクトップに戻る), Traditional Chinese (返回桌面), Portuguese, Spanish, French, German, Italian, Polish, and Russian while preserving English as default and fallback.
- Support language resolution from language IDs (e.g. 0 for ja, 10 for zh, 1 for en) or language codes, defaulting to GOW3_LANGUAGE env var.
- Update pause_menu.build to include the resolved language in stamp.json and bump VERSION to 7, ensuring cached R_UI.WAD is properly invalidated on language change.
- Pass GOW3_LANGUAGE from run.py through pause_menu_args into pause_menu.build.
- Add regression tests covering label resolution, cache invalidation, and language-specific patching.

* Fix(Localization): normalize language input and add locale aliases (#649)
2026-10-20 11:27:17 -03:00
Felipe Prado 226fb0e969 Refactor(Branding): renamed the project to SpartanPort (#755)
EN-US

- Renamed code, binaries, packaging, CI and docs to SpartanPort, with the SP monogram and the SpartanPort logo
- Renamed only the names in the shadPS4 core and the FSR patch, keeping authors, dates and licenses
- Added scripts/legacy.py, the only place with the former name, kept for three releases
- Added a one-time copy of the game settings, the launcher settings and the Linux data folder from their former names, without overwriting or deleting anything
- Updated the Linux data move to leave the GPU caches (user/cache) and the run views (out/) in the former folder
- Added forwarding of the former GOW3_ variables to SPARTAN_
- Added the launcher under its former names, so the 2.5.0 updater and existing shortcuts keep working
- Added a note to the READMEs that the project was gow3_pc and that 2.5.0 players keep their saves and settings
- Passed the full Python suite (531 tests, 0 failures) and the Windows zip and Linux AppImage CI builds

---

PT-BR

- Renomeados código, executáveis, empacotamento, CI e docs para SpartanPort, com o monograma SP e o logotipo SpartanPort
- Renomeados só os nomes no núcleo do shadPS4 e no patch do FSR, mantendo autores, datas e licenças
- Adicionado o scripts/legacy.py, único lugar com o nome antigo, mantido por três releases
- Adicionada a cópia única das configurações do jogo, das configurações do launcher e da pasta de dados do Linux a partir dos nomes antigos, sem sobrescrever nem apagar nada
- Atualizada a migração da pasta de dados do Linux para deixar os caches da GPU (user/cache) e as pastas de execução (out/) na pasta antiga
- Adicionado o repasse das variáveis GOW3_ antigas para SPARTAN_
- Adicionado o launcher com os nomes antigos, para que o atualizador da 2.5.0 e os atalhos existentes continuem funcionando
- Adicionada aos READMEs a nota de que o projeto era o gow3_pc e de que jogadores da 2.5.0 mantêm saves e configurações
- Aprovadas a suíte Python completa (531 testes, 0 falhas) e as builds de CI do zip do Windows e da AppImage do Linux
2026-10-19 18:18:13 -03:00
Felipe Prado 55ab9ee935 Feat(Graphics): added live engine frame rate switching (#622)
* Feat(Graphics): added live engine frame rate switching

EN-US

- Added a live engine frame rate (60, 100, 120, 240) in the in-game menu, without a restart
- Added R3 + L1 + R1 on the controller and F9 on the keyboard to cycle the engine frame rate, with an on-screen notice
- Added the engine frame rate globals lookup by signature in the loader, published after the image protection
- Updated every launch to take the 240 FPS patch, so each lower rate is written live and keeps the swing energy fix
- Updated the present limit to never exceed the live engine rate, including unlimited and the uncapped presets
- Fixed Kratos being pushed back on ledges and walls above 60 FPS by allowing a switch to 60 in place (#114, #535)
- Validated in game in one launch: 60.0, 100.0 and 120.0 FPS measured at each rate, and the #114 ledge crossed at 60
- Passed the pad, pad map, graphics settings and graphics options tests

---

PT-BR

- Adicionada a troca ao vivo do frame rate do motor (60, 100, 120, 240) no menu do jogo, sem reiniciar
- Adicionado R3 + L1 + R1 no controle e F9 no teclado para percorrer o frame rate do motor, com aviso na tela
- Adicionada a busca por assinatura das globais do frame rate do motor no loader, publicadas depois da proteção da imagem
- Atualizada toda abertura para usar o patch de 240 FPS, assim cada taxa menor é escrita ao vivo e mantém a correção da swing energy
- Atualizado o limite de apresentação para nunca passar do frame rate do motor, inclusive em ilimitado e nos presets uncapped
- Corrigido o Kratos sendo empurrado de volta em bordas e paredes acima de 60 FPS, permitindo trocar para 60 na hora (#114, #535)
- Validado no jogo em uma abertura: 60,0, 100,0 e 120,0 FPS medidos em cada taxa, e a borda do #114 atravessada a 60
- Aprovados os testes de pad, mapa do pad, configurações gráficas e opções gráficas

* Fix(Launcher): marked Engine frame rate as a live option

EN-US

- Removed the restart mark from Engine frame rate, which now changes live in the game

---

PT-BR

- Removida a marca de reinício de Engine frame rate, que agora muda ao vivo no jogo
2026-10-18 02:25:13 -03:00
Kris 4ccf29d604 Feat(Input): added controller diagrams to the pause menu (#234)
EN-US

- Added Xbox and Nintendo diagrams to the existing button icon option, without manual mod installation
- Loaded scripts/mods.py from disk in the packaged launcher
- Recognized the selected game's regional folders while keeping system files protected
- Credited Kristian Andreev for the contribution in #234
- Validated both diagrams in game and passed the Python suite (493 tests, 72 skipped)

---

PT-BR

- Adicionadas imagens Xbox e Nintendo à opção existente de ícones, sem instalação manual de mod
- Carregado scripts/mods.py do disco no launcher empacotado
- Reconhecidas as pastas regionais do jogo selecionado, mantendo os arquivos de sistema protegidos
- Preservados os créditos de Kristian Andreev pela contribuição na #234
- Validadas as duas imagens no jogo e aprovada a suíte Python (493 testes, 72 ignorados)
2026-10-17 23:46:41 -03:00
Matheus Santos a553618901 Feat(Menu): added Exit to Desktop to the game's menus (#462)
EN-US

- Added an Exit to Desktop row to the pause menu and the Options screen, asking the game's own quit question
- Added a signature hook on the menu script's builtin call that ends the process for the new row
- Built the patched R_UI.WAD in out/, on top of the glyph copy, mounted only once the hook is in
- Refused any menu script the patch does not recognise, keeping the game's own menus

---

PT-BR

- Adicionada a linha Exit to Desktop ao menu de pausa e à tela de Opções, com a pergunta de saída do próprio jogo
- Adicionado um hook por assinatura na chamada nativa do script de menus que encerra o processo pela linha nova
- Gerado o R_UI.WAD alterado em out/, sobre a cópia dos ícones, montado só depois que o hook é instalado
- Recusado qualquer script de menu que o patch não reconheça, mantendo os menus do próprio jogo
2026-10-17 22:25:24 -03:00
coniose e25254ee84 Feat(Input): added keyboard keys as in-game button icons (#471)
EN-US

- Added the Keyboard option to In-game button icons, drawing the keys of the Controls tab
- Added keyboard keys to Match my controller when no gamepad is connected
- Updated the READMEs and added keyboard glyph tests

---

PT-BR

- Adicionada a opção Keyboard em In-game button icons, desenhando as teclas da aba Controls
- Adicionadas as teclas do teclado ao Match my controller quando não há controle conectado
- Atualizados os READMEs e adicionados testes dos ícones de teclado
2026-10-17 16:20:53 -03:00
f5b15898f8 Feat(Mods): game patches in mods and the Ultrawide mod (21:9 / 32:9, Hor+ field of view) (beta) (#202)
* Feat(Patches): ultrawide 21:9 (3440x1440) com campo de visão Hor+ (beta)

A câmera do jogo tem campo de visão horizontal fixo: só trocar a resolução
para 21:9 corta a imagem em cima e embaixo ("zoom"). O novo
"Resolution Patch - 3440x1440" ajusta a resolução, o aspect ratio do modo de
vídeo e multiplica a tangente do FOV por k = (3440/1440)/(16/9) = 43/32 nos
quatro pontos onde as câmeras a leem (projeção, dois construtores dos vetores
de culling e a câmera padrão). Cada ponto vira um jmp para duas cavernas
encadeadas em paddings de NOP, e um nono padding guarda k. Tudo é achado por
assinatura, como os outros patches.

- patches: entrada nova no XML (gerada por tools/make_ultrawide_patch.py).
- tools/make_ultrawide_patch.py: gera a entrada para outro tamanho e, com
  --rebase, reescreve os Address para os da build de referência d85c8135.
- scripts/graphics_options.py, launcher e menu do jogo (gpu/shim): a nova
  opção na lista de resoluções; o menu convertia qualquer valor desconhecido
  em "native" ao salvar.
- tests: opções, requisitos de memória, cadeia de cavernas e salvar/carregar
  a resolução no teste C++.
- docs/ultrawide.md e README.

Testado só na build 6e72330e (atualização completa 01.02) em monitor
3440x1440. Os Address das linhas novas são os da 6e72.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>

* Feat(Patches): ultrawide 2560x1080, 3840x1600 e 5120x1440 (não testados) e aviso das cutscenes

A issue #180 pede o 21:9 e vários comentários pedem o 32:9 (5120x1440). Quem
fez o patch só tem um monitor 3440x1440, então os outros tamanhos usam o mesmo
código com outros números e estão marcados como "não testados" na nota do
patch, no docs/ultrawide.md e nos READMEs, para a comunidade testar.

- patches: entradas 2560x1080, 3840x1600 e 5120x1440 (tools/make_ultrawide_patch.py
  agora marca na nota o que não foi testado: TESTED_IN_GAME).
- scripts/graphics_options.py, launcher e menu do jogo: os quatro tamanhos na lista.
- tests: requisitos de memória, cadeia de cavernas, aspect ratio e salvar/carregar
  para os quatro tamanhos.
- docs/ultrawide.md e READMEs: tabela de situação por tamanho e o aviso de que as
  cutscenes continuam com bordas (são vídeos 16:9 pré-renderizados; esticá-los
  deformaria a imagem).

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>

* Feat(Mods): mods com patches de jogo; o ultrawide vira o mod Ultrawide

Redesenha o ultrawide como um mod, em vez de patches embutidos:

- scripts/mods.py: uma pasta de mod pode trazer patches de jogo (XML com
  assinaturas em <mod>/patches/*.xml), com ou sem dvdroot_ps4. discover(),
  patch_files() e enabled_patch_files() (só os mods ativos, na ordem de carga).
- scripts/patches.py: merge_patch_files() junta os patches embutidos e os dos
  mods (mesmo nome: o do mod vale), resolution_names(), default_enabled() e
  patches.py --mod-patches.
- run.py e scripts/graphics_options.py: as resoluções "Resolution Patch -
  <WxH>" dos mods ativos viram opções de Render resolution
  (GOW3_EXTRA_RESOLUTIONS); com o mod desativado a resolução volta a native.
- launcher: Render resolution lista as resoluções dos mods ativos (a lista é
  recarregada ao abrir) e a página Mods marca os mods com patches.
- menu do jogo (gpu/shim): a lista de resoluções lê GOW3_EXTRA_RESOLUTIONS.
- extras/mods/Ultrawide: o mod (3440x1440 testado; 2560x1080, 3840x1600 e
  5120x1440 marcados como não testados) gerado por tools/make_ultrawide_patch.py.
- Os patches embutidos e as listas fixas de resolução ficam como estavam.
- tests, docs/MODS.md, docs/ultrawide.md e os READMEs.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>

* Feat(Mods): resoluções 16:10 (1920x1200, 2560x1600) no mod Ultrawide

Para telas mais altas que 16:9 a câmera (campo horizontal fixo) já mostra
mais em cima e embaixo sem deformar, então essas entradas só mudam a
resolução e o aspect ratio (k = 1, sem cavernas nem mudança de FOV). Pedidas
em #168 e #185; não testadas no jogo (marcadas assim na nota do patch, no
README do mod e nos docs). 4:3 não está incluído.

- tools/make_ultrawide_patch.py: gera entradas para proporções <= 16:9 sem
  tocar a câmera; só gera cavernas quando k > 1.
- tests: entradas 16:10 (requisitos de memória, aspect ratio, resolução e
  nenhum ponto de câmera tocado).

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>

* Feat(Mods): mods em .zip direto na pasta de mods

Um mod pode ser largado na pasta de mods como <nome>.zip: ao abrir o launcher
ou iniciar o jogo (mods.discover) ele é extraído numa pasta com o nome do zip,
de novo se o zip mudar. Uma pasta de mesmo nome criada pelo usuário nunca é
substituída; caminhos perigosos (.., absolutos, letra de unidade), links e zips
que passam de 16 GiB são recusados, e um zip que não abre ou não é um mod é
ignorado com aviso no log.

- scripts/mods.py: unpack_zips() e zip_members().
- tools/zip_mod.py: gera o .zip de uma pasta de mod.
- tests/test_mods.py: zip com patches e com assets, pasta por fora, zip
  alterado (sem sobras), pasta do usuário preservada, zips inseguros e inválidos.
- docs/MODS.md, docs/ultrawide.md e README do mod.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>

* Docs(Mods): "How to install" do mod Ultrawide e dos mods em .zip

- extras/mods/Ultrawide/README.md: como instalar nas versões depois da 2.2.0
  (largar o Ultrawide.zip na pasta mods) e na 2.2.0 (instalador de um clique
  anexado ao PR #202: INSTALL.bat, UNINSTALL.bat e o menu de resolução).
- README.md, README.pt-BR.md e README.es.md: como instalar um mod (.zip na
  pasta mods) e o link para o README do mod.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>

* Fix(Video): black out bars around cutscenes

The game draws H.264 cutscenes in a centered 16:9 picture and
never clears the rest of the display buffer. At the Ultrawide
mod's sizes the last 3D frame stayed at the sides (top and
bottom at 16:10), reported on #202 as a freeze. While
libSceVideodec hands out pictures, the post-process pass draws
everything outside that picture black. Sizes within 1% of 16:9
are untouched.

Refs #202

* Docs(Mods): note black cutscene bars and 16:9 menus

2.3.0 ignores mod zips too, so the mod README no longer says
every version after 2.2.0 reads them.

Refs #202

* Docs(Ultrawide): tamanhos testados pela comunidade e limitações conhecidas

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>

* Feat(Ultrawide): marca 5120x1440, 1920x1200 e 2560x1600 como testados pela comunidade

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>

* Docs(Ultrawide): o instalador serve para a 2.2.0 e a 2.3.0

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>

* Fix(Mods): blocked ZIP extraction outside mod folders

EN-US

- Rejected nested Windows drive paths and alternate data streams
- Rejected traversal paths disguised with trailing dots or spaces
- Checked extraction folders and destinations before extracting files
- Added regression tests and validated Windows and Linux behavior

---

PT-BR

- Rejeitados caminhos com unidades Windows internas e fluxos alternativos
- Rejeitada travessia disfarçada com pontos ou espaços finais
- Verificados a pasta e os destinos antes da extração dos arquivos
- Adicionados testes de regressão e validado o comportamento no Windows e Linux

Refs #202

---------

Co-authored-by: Claude Sonnet 5.5 <[email protected]>
Co-authored-by: devLucasEmiliano <[email protected]>
Co-authored-by: Felipe Prado <[email protected]>
2026-10-16 00:11:03 -03:00
Felipe Prado ed89454f9f Fix(Discord): fixed Rich Presence lifecycle and application identity
- Updated the Discord application ID
- Fixed activity association with the native game PID
- Added reconnection while preserving the original start time
- Added PING/PONG handling and bounded shutdown
- Fixed overwritten Spanish translations
- Added protocol and process lifecycle tests
2026-10-14 19:28:33 -03:00
Benjamin Mora 96bb3c3f2a Feat(Discord): add Discord Rich Presence support and translations (#217) 2026-10-14 17:38:50 -03:00
Felipe Prado e4eb0abf1a Merge pull request #113 from brunoweierich-ctrl/fix/aviso-memoria-4k
Fix(Run): avisar quando a memória do jogo não cabe na RAM
2026-10-14 09:16:27 -03:00
Matheus Santos 9155cdc69d Feat(Input): ícones de botões do jogo conforme o controle
Opção opcional, desligada por padrão, em Controles > Ícones dos botões no
jogo: Original, Igual ao meu controle, Xbox ou Nintendo (#133). Vale para
os avisos de tutorial, a lista de golpes e os botões dos QTEs.

- Adicionado: scripts/glyphs.py desenha os ícones com o Pillow e grava
  cópias de R_UI.WAD e R_PERM.WAD em out/glyphs, trocando só os pixels das
  texturas DDS (mesmo tamanho e formato); a pasta do jogo nunca é alterada
- Adicionado: gow3-probe --gamepad informa o tipo e as letras do controle
  pelo SDL3, e --mount guest=host monta as cópias sobre os arquivos do jogo
- Atualizado: run.py liga tudo por GOW3_GLYPH_STYLE (auto, xbox, nintendo)
  e segue o remapeamento de GOW3_PAD_MAP; sem a variável nada é detectado,
  gerado ou montado
- Atualizado: o menu do port nomeia os botões no mesmo estilo (GOW3_GLYPHS)
- Adicionados: testes do gerador, do run.py, do launcher e do probe

Fora do escopo: o desenho do controle no menu de pausa continua um
DualShock 4, e trocar de controle com o jogo aberto pede reinício.
2026-10-13 16:13:18 -03:00
devLucasEmiliano a445c6edb6 Feat(Run): gerar a tabela ISA quando o probe reporta conjuntos ausentes 2026-10-13 02:50:11 -03:00
Bruno Rodrigues BittencourtandClaude Opus 5.5 64d97cf5e7 Fix(Run): aviso de memória cita o fechamento (error 1450), não tela preta
A tela preta na abertura era um impasse na troca de quadros (#119), não
falta de memória. O que a falta de commit causa é o jogo fechar ao
criar o pool ("cannot create ... MiB of guest memory (error 1450)")
quando o page file não cresce a tempo; o aviso e os comentários passam a
dizer isso.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-13 02:01:39 -03:00
Bruno Rodrigues Bittencourt 752cda18c7 Fix(Run): avisar quando a memória do jogo não cabe na RAM
O pool de memória do guest (runtime_memory.c) é comprometido inteiro na
partida (SEC_COMMIT). Com o patch de 4K são ~12 GiB: num PC de 16 GB com
os stream buffers na RAM do sistema, a partida depende do Windows aumentar
o page file a tempo. Quando não aumenta, o jogo fecha com error 1450;
quando a alocação passa mas a memória acaba logo depois, a tela fica preta
sem nenhum erro no log (issue #111).

run.py agora compara o pool + uma margem com a RAM instalada e escreve um
aviso no log sugerindo Stream buffer memory = GPU memory, page file maior
ou resolução menor. Não muda o comportamento do jogo.
2026-10-13 00:54:48 -03:00
Felipe Prado f4e4ffe5d2 Fix(Launcher): corrigida codificação UTF-8 na preparação do jogo
- Corrigida: saída dos scripts em ambientes com codificação GBK
- Corrigida: leitura de caminhos Unicode retornados pelos scripts
- Adicionados: testes de regressão para stdout e stderr
2026-10-13 00:23:22 -03:00
Felipe Prado b907d8a9f2 Chore(Merge): integrada a main (PR #73) na gow3
- Integrado: AppImage do Linux, atalho da Steam, pasta de update separada e traduções do PR #73
- Mantido: patches e cheats achados por assinatura, que já cobrem o eboot 6e72
- Removido: perfil de patches por hash do cuesta4, substituído pelas assinaturas
2026-10-12 21:17:59 -03:00
Felipe Prado b10c4607a4 Feat(Patches): patches e cheats achados por assinatura em qualquer versão
- Adicionado: assinaturas em cada linha do XML de patches e nos ganchos de cheats, barra de vida e multiplicadores
- Adicionado: recálculo de lea, call, jmp e mov relativos para o build encontrado
- Adicionado: ferramenta tools/make_signatures.py para gerar assinaturas
- Removido: travas de CUSA01623 01.02 e do hash do eboot.bin
- Corrigido: FPS do motor, DMEM e VBlank calculados pelos patches realmente aplicados
- Atualizado: launcher mostra patches não encontrados no último início
- Adicionado: testes no build de referência, num build deslocado e contra os bytes conhecidos do eboot 6e72
2026-10-12 20:27:44 -03:00
weversonl 1283947198 Feat(Linux): ícone próprio no AppImage e na janela do jogo
O build do AppImage usa packaging/linux/gow3.png, quando existe, como ícone do AppImage e do launcher
(senão launcher/gow3.png). No Linux o run.py usa esse ícone na janela do jogo no lugar do icon0.png e
define SDL_APP_ID=gow3, para o ambiente gráfico associar a janela ao atalho .desktop.
2026-10-12 20:24:16 -03:00
weversonl 37a5dca45f Feat(Linux): run.py multiplataforma e reinício do jogo no Linux
run.py passa a rodar no Windows e no Linux (espera por PID, nomes sem .exe, shlex.join), prepara o
jogo com a pasta de update (GOW3_PATCH_DIR), usa GameMode (prefixo) e MangoHud (camada Vulkan) quando
o launcher pede e deixa os upscalers desligados salvo o interruptor experimental.

- run.sh vira um invólucro fino (--software, nix-shell, build.sh) e chama o run.py.
- probe.c: o reinício no Linux executa GOW3_RESTART_COMMAND; sem --after, já que o probe troca de
  imagem no lugar de terminar.
- test_mods usa o run.py com o preparo do jogo substituído; pulado no Windows.
2026-10-12 19:59:06 -03:00
Felipe Prado 440dfdd429 Fix(FPS): corrigido jogo acelerado sem o patch de FPS do motor
- Corrigido: limite de apresentação nunca passa do FPS real do motor (60 sem o patch)
- Adicionado: GOW3_ENGINE_FPS com o FPS aplicado, exibido no log e no menu do jogo
- Atualizado: resumo do launcher avisa quando os patches não valem para o eboot
- Adicionado: testes de PresentLimit, applied_engine_fps e game_patchable
2026-10-12 13:59:26 -03:00
Felipe Prado 8bb38e7f4a Feat(Graphics): adiciona configurações gráficas no menu Insert
- Adicionada seção Graphics com modo de tela (janela, sem borda, tela cheia), VSync,
  limite de FPS (30, 60, 120, 240, ilimitado) e shaders assíncronos aplicados ao vivo
- Adicionadas resolução, teto de FPS do motor e modos de readback com Apply and restart
- Adicionada volta automática à configuração anterior quando o reinício não mostra o jogo
- Adicionado patch experimental de 240 FPS
- Atualizado launcher para ler e gravar as mesmas opções no gow3.ini
- Removidos do launcher os antigos tela cheia, modo de apresentação e limite de FPS
- Adicionados testes das opções gráficas, da montagem de patches e do launcher
2026-10-09 22:58:43 -03:00
Felipe Prado 5527b1dd00 Feat(Saves): adiciona backup automático dos saves
- Adicionado save_backup.py com cópia antes de cada abertura e limite de 10 backups
- Adicionada restauração no launcher com confirmação e backup do estado atual
- Adicionados testes de cópia, rotação, pasta vazia e nomes inválidos
2026-10-09 21:35:05 -03:00
Felipe Prado a7cf186e0c Refactor(Core): renomeado o prefixo bb e bbport para gow3
- Renomeados arquivos, alvos e binários (gow3gpu, gow3-probe, gow3-play)
- Renomeadas variáveis GOW3_*, identificadores Gow3*, gow3.ini e magics G3*
- Atualizado o patch do fsr-vulkan com as variáveis novas
2026-10-08 20:21:04 -03:00
Felipe Prado 3a0712ab03 Refactor(Launcher): removida a lógica exclusiva do Bloodborne
- Removido patches/Bloodborne.xml, presets de FPS, efeitos, cheats e resolução por patch
- Removido o hack de som do save e as páginas do Bloodborne no launcher e no menu do jogo
- Removido o launcher GTK de Linux e o pacote Nix passou a iniciar o jogo direto
- Atualizado patches.py, run.py e run.sh para usar só o perfil CUSA01623 v01.02
- Atualizado mods.py para aceitar só o layout dvdroot_ps4
- Atualizados os testes e limpas as traduções sem uso
2026-10-08 20:21:04 -03:00
Felipe Prado e749951f5a Fix(Patches): corrigidos endereços dos patches do GoW3 para o eboot v01.02
- Corrigidos endereços de resolução (+0x10 e -0x120) conferidos byte a byte no eboot
- Removidos 120 FPS e Skip Intro, cujo código não bate com este eboot
- Adicionada checagem de sha256 do eboot antes de aplicar os patches
- Adicionada seleção exata de patches do launcher (BB_PATCHES_ONLY)
- Corrigido run.py para não aplicar a escala de resolução do Bloodborne em outros jogos
- Adicionados padrões do GoW3 no run.py (sem upscaler, leitura linear, ícone da janela)
2026-10-08 07:42:04 -03:00
Felipe Prado 4589fb97f6 Feat(Patches): adicionado perfil por jogo com patches do GoW3
- Adicionado perfil de jogo por TITLE_ID com arquivo de patches e versão
- Adicionado patches/God_of_War_III_Remastered.xml para CUSA01623 v01.02
- Adicionada leitura de DMEM e VBlank exigidos pelas notas dos patches
- Adicionada regra de patch de resolução exclusivo com o Texture Fix
- Atualizado run.py para aplicar presets de FPS só ao Bloodborne
- Atualizado título do menu Insert para usar o nome do jogo
- Adicionados testes de perfil, seleção e requisitos dos patches
2026-10-07 23:44:14 -03:00
Supermedo 0af6cd4b3b Windows port
Builds and runs bbport natively on 64-bit Windows 10 (1903+) and 11 with the MSYS2 CLANG64
toolchain, from the same sources as the Linux build.

- Loader and runtime: guest TLS through a TEB TLS slot, the PS4 address range kept as
  placeholders for section views, vectored exception handling with bb_setjmp/bb_longjmp,
  high-resolution sleeps, Windows file, time, thread and memory back ends (src/compat_win.*).
- Renderer: builds against libc++ and winpthreads; avoids GetThreadId system calls on the hot
  path (cached recorder/bind-helper state), portable shader cache directory.
- run.py replaces run.sh; patches.py applies the 1.09 patches only to a 1.09 game; mods use
  junctions/hard links when symlinks are not allowed.
- Windows launcher (Tkinter) with every setting, 13 languages, frame cap option, FSR 4 asset
  download, desktop shortcut and a Buy Me a Coffee link; packaged with PyInstaller as
  Bloodborne.exe so players need no Python.
- Bloodborne-style icon for the launcher, bb-probe.exe and bb-gpu-capabilities.exe.
- README: Windows section, build notes (packaging/windows/README.md) and credits.
2026-10-06 19:54:58 +02:00