Skip to content

guimaraf/3sxw

Repository files navigation

3SXW

A port of the greatest fighting game of all time for modern platforms - fork with fixes and improvements.

This is a hard fork of 3SX, the original Street Fighter III: 3rd Strike PC port project.

Requires an official copy of Street Fighter III: 3rd Strike or Street Fighter Anniversary Collection for PlayStation 2 to play.

Based on a decompilation of the PlayStation 2 port.

Legal notice

  • This repository is an independent fan-made reverse engineering and portability project.
  • It is not affiliated with, endorsed by, sponsored by, or approved by Capcom.
  • Capcom, Street Fighter, Street Fighter III: 3rd Strike, and all related names, logos, characters, audio, artwork, and game assets are the property of their respective rights holders.
  • This repository does not include the original game assets, audio, artwork, BIOS, firmware, or other proprietary data required to play the game.
  • To use this project, you must provide your own legally obtained original copy of the game.
  • If you do not own an original copy, do not use this project.

Changes in this fork

Save system - 100% working

The save system has been fixed and is fully operational. Saving and loading progress works reliably, with no errors or data corruption.

Virtual Memory Cards for slots 1 and 2 are created and formatted automatically when first needed. Save data and match replays have been validated on both cards, including closing the game, reopening it, and loading the stored content. Removing the data/saves/ directory simply causes clean cards to be created again on the next save operation.

All files stay in the project folder

In the original project, save files, configuration, and other data were stored in directories spread across the operating system (for example AppData\\Roaming\\CrowdedStreet\\3SX\\ on Windows). In this fork, all files generated by the game are kept inside the executable's own folder:

File type Location
Save / progress <game folder>/data/saves/slot1/ and <game folder>/data/saves/slot2/
Replays <game folder>/data/saves/slot1/ and <game folder>/data/saves/slot2/
Configuration <game folder>/data/config
Key mapping <game folder>/data/keymap
Critical error log <game folder>/data/error.log
Screenshots <game folder>/prints/
Optional bezel <game folder>/data/img/bezel.png
Required game resource <game folder>/resources/SF33RD.AFS

This makes the game 100% portable: just copy the folder to another location or computer and everything will work without reinstalling. Startup also verifies that the local data/ directory can be created, written, read, and cleaned up before the game begins using it.

Input and window behavior

  • Press F11 or Alt+Enter to switch between windowed and fullscreen modes.
  • Alt+Enter is suppressed from gameplay input, so it does not activate Start or add player 2 in Arcade Mode.
  • A fullscreen toggle requests the normal in-game pause during a match, while menu navigation remains unaffected.
  • When focus is lost during gameplay, controller and keyboard states are cleared and the match enters pause as soon as gameplay resumes, including round and stage transitions.
  • Disconnecting a controller clears its previous state and preserves the existing in-game reconnect flow.
  • Analog sticks and triggers use a 25% deadzone to reduce drift without making directional inputs feel excessively long.
  • Sequential fighting-game commands and direction-plus-button transitions were regression-tested without changing the original game-side command recognition.
  • Only one game instance can run in the same operating-system session. A second launch displays an error and exits before accessing resources, saves, audio, or gameplay state.

Optional 16:9 bezel

The installation step copies the bundled img/bezel.png to <game folder>/data/img/bezel.png. Set bezel = true in <game folder>/data/config to display it around the 4:3 game area. The setting defaults to false.

The bezel is loaded once at startup and is shown only while the game is fullscreen and the actual renderer output is 16:9. It is automatically hidden in windowed mode, after Alt+Enter, when the window is manually stretched, and on non-16:9 displays. It is rendered above the game and scanline layers, using its transparent center to preserve the 4:3 image.

The installed image can be replaced without recompiling the project, but the game must be restarted to reload it. For predictable transparency, custom images should use an 8-bit RGBA PNG with a 16:9 resolution and a fully transparent center; 1920x1080 with a centered 1440x1080 transparent opening is recommended. A missing or invalid file is reported in data/error.log, and the game continues normally with black side bars. F12 screenshots include the bezel whenever it is active. Only distribute artwork that you have permission to use.

Optional scanlines

Set scanlines = true in <game folder>/data/config to apply scanlines only to the 4:3 game image in both windowed and fullscreen modes. The setting defaults to false. Use scanline-opacity to control the effect intensity from 0 to 100; its default value is 20, and values outside this range are clamped and reported in data/error.log.

The scanline pattern is generated once at startup, follows the original 224-line game image, and is rendered in one additional blended texture operation per frame. It does not add another frame buffer, alter input processing, or perform per-frame allocations. System messages remain above the effect, the 16:9 bezel is rendered above it, and F12 screenshots include scanlines whenever they are enabled.

External configuration application

The project includes a standalone SDL3 configuration application. On Windows, run sf3config.exe next to SF3.exe to edit every setting currently supported by data/config: fullscreen, window dimensions, scale mode, bezel, scanlines, scanline opacity, and player rendering above the HUD. The Windows interface uses the system Segoe UI font with antialiasing for clear, native-looking text without bundling another font or DLL.

3SXW Configurator in English

The configurator starts in English (EN-US) on every launch. Use the left and right arrows in the < EN-US > selector at the top of the window to switch the complete interface immediately between English (EN-US), Brazilian Portuguese (PT-BR), and French (FR-FR). This choice is limited to the current configurator session and does not add or change any game setting.

All built-in configurator text is centralized in appConfig/src/language.c. To add another compiled language, add its code to the enum in appConfig/src/language.h, add a complete translation entry in language.c, and rebuild. The language selector reads this table automatically. On Windows, sf3config.exe also embeds img/Hugo.ico as its application icon.

The generated configuration uses these defaults:

Setting Default
Fullscreen true
Window size 640x480
Scale mode nearest
Bezel false
Scanlines false
Scanline opacity 20
Players above HUD false

The application preserves comments and unknown settings, validates supported values, and replaces the configuration through a temporary file only after writing succeeds. Changes take effect the next time the game starts. Its source code is under appConfig/src/, its intermediate build output is under appConfig/build/, and cmake --install build --prefix build/application installs it beside the game executable. Generated binaries under appConfig/build/ are intentionally not tracked by Git.

JPEG screenshots

Press F12 to capture the current game screen. Screenshots are stored as high-quality JPEG files under prints/, using names in the following format:

sf3_YYYY-MM-DD_HH-MM-SS-mmm.jpg

Pixel readback remains on the main thread as required by SDL3. RGB conversion, JPEG encoding, and disk writing run on a low-priority worker thread with a bounded queue, reducing gameplay stalls while screenshots are generated. Pending accepted captures are completed during normal shutdown, and incomplete files are removed after errors.

FFmpeg dependency builds explicitly enable the MJPEG encoder used by this feature. Existing checkouts upgrading from an older dependency build must run build.bat deps once on Windows, or rebuild the dependencies using the platform-specific build script on Linux or macOS.

Resource validation and error handling

The resource startup flow validates SF33RD.AFS before gameplay begins. If the file is missing, the game can extract it from a legally obtained compatible PlayStation 2 image. Invalid images are rejected with the expected filename reported in data/error.log; canceling resource selection now closes the game instead of reopening the dialog indefinitely.

Critical runtime failures are written to the portable data/error.log file in Release builds. Texture, audio, resource, and screenshot failure paths include the affected file or operation whenever that information is available.

Rendering and audio stability

The sprite rendering path uses bounded buffering and asynchronous queue processing to avoid the repeated creation and destruction pattern that caused micro-stuttering in the original port. Texture operations include additional validation and fail safely when a resource cannot be prepared.

Audio resource reads and processing use asynchronous queues so music transitions and other I/O do not unnecessarily block the gameplay frame. Shutdown paths drain or cancel pending work before releasing their resources.

Build, installation and platform status

On Windows, build.bat configures, compiles, and installs the portable application in Release mode by default. Use build.bat deps for the first build or after dependency changes, and build.bat Debug for a Debug build. The install step assembles the game, runtime libraries, sf3config.exe, and the bundled bezel under build/application/.

The sound shutdown interface is now declared consistently between the game and port layers, fixing the previous Clang SPU_Quit undeclared-function build failure when warnings are treated as errors.

Windows is the primary and extensively tested target. Linux and macOS build and installation flows are prepared, but runtime validation on real Linux and Mac hardware is still pending. See the platform-specific Windows, Linux, and macOS guides.

GitHub Actions builds and installs portable Windows, Linux, and macOS application folders for every push and pull request to main. Each platform folder is published as a workflow artifact for download. The separate manual release workflow continues to produce the distributable archives.

Gill available from the start

In the original game, the character Gill must be unlocked by clearing the game with every character. In this fork, the game initializes the official Gill unlock prerequisite on a fresh save, so Gill is available to all players from the beginning while still following the normal in-game unlock state.

The domestic-version flow for Extra Options / Extra Mode is preserved: to unlock it, clear Arcade Mode with Gill and save the game. After saving, Extra Options remains available when the game is opened again.

Gill has also been validated in Arcade Mode, including the car bonus stage and Sean's parry bonus stage.

Runtime debug mode

This fork includes a runtime debug mode enabled with --debug-mode. It records diagnostic sessions under data/debug/ with frame timing, render, audio, I/O, and input logs to help investigate stutter and performance issues.

See debug-mode.md for commands, generated files, and reporting instructions.


Resources

Find instructions on how to build the project for Windows, Linux or macOS, plus the contribution guide and third-party notices, in the repository documentation.


Community

Join the Discord server to discuss the project, report bugs or share your ideas.

Discord server


Acknowledgments

This project uses:


3SXW

Um port do maior jogo de luta de todos os tempos para plataformas modernas - fork com correcoes e melhorias.

Este e um hard fork de 3SX, o projeto original de port do Street Fighter III: 3rd Strike para PC.

Requer uma copia oficial de Street Fighter III: 3rd Strike ou Street Fighter Anniversary Collection para PlayStation 2 para jogar.

Baseado em uma decompilacao do port para PlayStation 2.

Aviso legal

  • Este repositorio e um projeto independente de fans, voltado a engenharia reversa e portabilidade.
  • Ele nao possui afiliacao, endosso, patrocinio ou aprovacao da Capcom.
  • Capcom, Street Fighter, Street Fighter III: 3rd Strike e todos os nomes, logos, personagens, audios, artes e assets relacionados pertencem aos seus respectivos detentores de direitos.
  • Este repositorio nao inclui os assets originais do jogo, audios, artes, BIOS, firmware ou outros dados proprietarios necessarios para jogar.
  • Para usar este projeto, voce deve fornecer sua propria copia original obtida legalmente.
  • Se voce nao possui uma copia original, nao utilize este projeto.

Mudancas neste fork

Sistema de save 100% funcional

O sistema de salvamento foi corrigido e esta totalmente operacional. Salvar e carregar progresso funciona de forma confiavel, sem erros ou corrupcao de dados.

Os Memory Cards virtuais dos slots 1 e 2 sao criados e formatados automaticamente quando usados pela primeira vez. Saves e replays de partidas foram validados nos dois cartoes, incluindo fechar o jogo, abri-lo novamente e carregar o conteudo gravado. Remover a pasta data/saves/ apenas faz com que novos cartoes limpos sejam criados na proxima operacao de salvamento.

Todos os arquivos ficam na pasta do projeto

No projeto original, arquivos de save, configuracoes e outros dados eram armazenados em diretorios espalhados pelo sistema operacional (por exemplo AppData\\Roaming\\CrowdedStreet\\3SX\\ no Windows). Neste fork, todos os arquivos gerados pelo jogo ficam dentro da propria pasta do executavel:

Tipo de arquivo Localizacao
Save / progresso <pasta do jogo>/data/saves/slot1/ e <pasta do jogo>/data/saves/slot2/
Replays <pasta do jogo>/data/saves/slot1/ e <pasta do jogo>/data/saves/slot2/
Configuracoes <pasta do jogo>/data/config
Mapeamento de teclas <pasta do jogo>/data/keymap
Log de erros criticos <pasta do jogo>/data/error.log
Capturas de tela <pasta do jogo>/prints/
Moldura opcional <pasta do jogo>/data/img/bezel.png
Recurso obrigatorio do jogo <pasta do jogo>/resources/SF33RD.AFS

Isso torna o jogo 100% portatil: basta copiar a pasta para outro local ou computador e tudo funcionara normalmente, sem necessidade de reinstalacao. Antes de usar o armazenamento, a inicializacao tambem verifica se a pasta local data/ pode ser criada, gravada, lida e limpa corretamente.

Comportamento de input e janela

  • Pressione F11 ou Alt+Enter para alternar entre os modos janela e tela cheia.
  • Alt+Enter e suprimido do input do jogo, portanto nao ativa Start nem adiciona o jogador 2 no Arcade Mode.
  • Alternar a tela durante uma partida solicita a pausa normal do jogo, sem interferir na navegacao dos menus.
  • Quando a janela perde o foco durante o gameplay, os estados do teclado e dos controles sao limpos e a partida entra em pausa assim que o gameplay comeca ou retorna, inclusive durante transicoes de round e cenario.
  • Desconectar um controle limpa seu estado anterior e preserva o fluxo de reconexao exibido pelo proprio jogo.
  • Analogicos e gatilhos usam deadzone de 25%, reduzindo drift sem deixar os comandos direcionais excessivamente longos.
  • Comandos sequenciais de jogos de luta e transicoes entre direcao e botao foram testados novamente sem alterar o reconhecimento de comandos original do jogo.
  • Somente uma instancia do jogo pode ser executada na mesma sessao do sistema operacional. Uma segunda abertura exibe um erro e encerra antes de acessar recursos, saves, audio ou o estado do gameplay.

Moldura opcional em 16:9

O passo de instalacao copia a imagem img/bezel.png fornecida pelo projeto para <pasta do jogo>/data/img/bezel.png. Defina bezel = true em <pasta do jogo>/data/config para exibi-la ao redor da area 4:3 do jogo. A opcao usa false como valor padrao.

A moldura e carregada uma vez na inicializacao e aparece somente quando o jogo esta em tela cheia e a saida real do renderer esta em 16:9. Ela desaparece automaticamente no modo janela, depois de Alt+Enter, quando a janela e esticada manualmente e em monitores que nao estejam em 16:9. Ela e renderizada acima das camadas do jogo e das scanlines, usando seu centro transparente para preservar a imagem 4:3.

A imagem instalada pode ser substituida sem recompilar o projeto, mas o jogo precisa ser reiniciado para recarrega-la. Para garantir uma transparencia previsivel, imagens personalizadas devem usar preferencialmente um PNG RGBA de 8 bits com resolucao 16:9 e centro totalmente transparente; recomenda-se 1920x1080 com uma abertura transparente central de 1440x1080. Arquivos ausentes ou invalidos sao informados em data/error.log, e o jogo continua normalmente com faixas laterais pretas. As capturas feitas com F12 incluem a moldura quando ela estiver ativa. Distribua apenas artes que voce tenha permissao para usar.

Scanlines opcionais

Defina scanlines = true em <pasta do jogo>/data/config para aplicar scanlines somente sobre a imagem 4:3 do jogo, tanto no modo janela quanto em tela cheia. A opcao usa false como valor padrao. Use scanline-opacity para controlar a intensidade do efeito entre 0 e 100; o valor padrao e 20, e valores fora desse intervalo sao limitados e informados em data/error.log.

O padrao de scanlines e gerado uma unica vez na inicializacao, acompanha as 224 linhas da imagem original do jogo e usa apenas uma operacao adicional de textura com transparencia por frame. O recurso nao adiciona outro framebuffer, nao altera o processamento de input e nao realiza alocacoes a cada frame. Mensagens do sistema permanecem acima do efeito, a moldura 16:9 e renderizada acima dele e as capturas feitas com F12 incluem as scanlines quando estiverem habilitadas.

Aplicativo externo de configuracao

O projeto inclui um aplicativo independente de configuracao feito em SDL3. No Windows, execute sf3config.exe ao lado de SF3.exe para editar todas as opcoes atualmente aceitas por data/config: tela cheia, dimensoes da janela, modo de escala, bezel, scanlines, intensidade das scanlines e renderizacao dos jogadores acima do HUD. A interface do Windows usa a fonte Segoe UI do sistema com antialiasing, oferecendo textos claros e com aparencia nativa sem incluir outra fonte ou DLL.

Configurador 3SXW em ingles

O configurador sempre inicia em ingles (EN-US). Use as setas esquerda e direita do seletor < EN-US > no topo da janela para alternar imediatamente toda a interface entre ingles (EN-US), portugues do Brasil (PT-BR) e frances (FR-FR). A escolha vale somente para a sessao atual do configurador e nao adiciona nem altera nenhuma opcao do jogo.

Todos os textos internos do configurador ficam centralizados em appConfig/src/language.c. Para adicionar outro idioma compilado, inclua seu codigo no enum de appConfig/src/language.h, adicione uma entrada de traducao completa em language.c e recompile. O seletor de idiomas le essa tabela automaticamente. No Windows, o sf3config.exe tambem incorpora img/Hugo.ico como icone do aplicativo.

A configuracao criada usa estes valores padrao:

Opcao Valor padrao
Tela cheia true
Tamanho da janela 640x480
Modo de escala nearest
Moldura false
Scanlines false
Intensidade das scanlines 20
Jogadores acima do HUD false

O aplicativo preserva comentarios e opcoes desconhecidas, valida os valores suportados e somente substitui a configuracao por meio de um arquivo temporario depois que a gravacao termina corretamente. As mudancas entram em vigor na proxima inicializacao do jogo. O codigo-fonte fica em appConfig/src/, a saida intermediaria em appConfig/build/, e cmake --install build --prefix build/application instala o configurador ao lado do executavel do jogo. Os binarios gerados em appConfig/build/ nao sao versionados pelo Git.

Capturas de tela em JPEG

Pressione F12 para capturar a tela atual do jogo. As imagens sao armazenadas como arquivos JPEG de alta qualidade dentro de prints/, usando nomes no seguinte formato:

sf3_YYYY-MM-DD_HH-MM-SS-mmm.jpg

A leitura dos pixels permanece na thread principal, conforme exigido pelo SDL3. A conversao RGB, a codificacao JPEG e a gravacao no disco sao executadas por uma worker thread de baixa prioridade com fila limitada, reduzindo travamentos durante a criacao das imagens. Capturas aceitas e ainda pendentes sao concluidas durante o encerramento normal, e arquivos incompletos sao removidos em caso de erro.

A compilacao das dependencias habilita explicitamente o encoder MJPEG do FFmpeg usado por esse recurso. Ao atualizar um checkout com dependencias antigas, execute build.bat deps uma vez no Windows ou recompile as dependencias usando o script especifico da plataforma no Linux ou macOS.

Validacao de recursos e tratamento de erros

O fluxo de inicializacao valida o arquivo SF33RD.AFS antes de iniciar o gameplay. Se ele estiver ausente, o jogo pode extrai-lo de uma imagem de PlayStation 2 compativel e obtida legalmente. Imagens invalidas sao recusadas e o nome esperado e registrado em data/error.log; cancelar a selecao do recurso agora encerra o jogo em vez de reabrir a janela indefinidamente.

Falhas criticas em runtime sao registradas no arquivo portatil data/error.log, inclusive em builds Release. Os tratamentos de textura, audio, recursos e capturas informam o arquivo ou a operacao afetada sempre que essa informacao estiver disponivel.

Estabilidade de renderizacao e audio

O fluxo de renderizacao de sprites usa buffers limitados e processamento assincrono da fila, evitando o padrao de criacao e destruicao repetida que causava micro-stuttering no port original. Operacoes de textura possuem validacoes adicionais e falham de forma segura quando algum recurso nao pode ser preparado.

Leituras e processamento de recursos de audio usam filas assincronas para que transicoes de musica e outras operacoes de I/O nao bloqueiem desnecessariamente o frame do jogo. Durante o encerramento, trabalhos pendentes sao concluidos ou cancelados antes da liberacao dos recursos.

Compilacao, instalacao e estado das plataformas

No Windows, o build.bat configura, compila e instala a aplicacao portatil em Release por padrao. Use build.bat deps na primeira compilacao ou depois de alterar dependencias, e build.bat Debug para uma build Debug. O passo de instalacao monta o jogo, as bibliotecas de runtime, o sf3config.exe e a moldura fornecida pelo projeto dentro de build/application/.

A interface de encerramento do sistema de som agora esta declarada de forma consistente entre as camadas do jogo e do port, corrigindo o erro anterior do Clang que informava a funcao SPU_Quit como nao declarada quando os avisos eram tratados como erros.

O Windows e a plataforma principal e foi amplamente testado. Os fluxos de compilacao e instalacao para Linux e macOS estao preparados, mas a validacao de execucao em hardware real com Linux e Mac ainda esta pendente. Consulte os guias especificos para Windows, Linux e macOS.

O GitHub Actions compila e instala pastas portateis para Windows, Linux e macOS em cada push e pull request para main. A pasta de cada plataforma e publicada como artefato do workflow para download. O workflow manual de release continua responsavel pelos arquivos distribuiveis compactados.

Gill disponivel desde o inicio

No jogo original, o personagem Gill precisa ser desbloqueado terminando o jogo com todos os personagens. Neste fork, o jogo inicializa o pre-requisito oficial de desbloqueio do Gill em um save novo, entao Gill ja fica disponivel para todos os jogadores desde o inicio, mantendo o estado normal de desbloqueio usado pelo proprio jogo.

O fluxo da versao domestica para Extra Options / Extra Mode foi preservado: para liberar esse modo, termine o Arcade Mode com Gill e salve o jogo. Depois de salvar, Extra Options continua disponivel ao abrir o jogo novamente.

Gill tambem foi validado no Arcade Mode, incluindo o bonus do carro e o bonus de parry do Sean.

Modo debug em runtime

Este fork inclui um modo debug em runtime ativado com --debug-mode. Ele grava sessoes de diagnostico em data/debug/ com logs de frame timing, renderizacao, audio, I/O e input para ajudar a investigar stutter e problemas de performance.

Veja debug-mode.md para comandos, arquivos gerados e instrucoes de reporte.


Recursos

Encontre instrucoes sobre como compilar o projeto para Windows, Linux ou macOS, alem do guia de contribuicao e dos avisos de terceiros, na documentacao do repositorio.


Comunidade

Junte-se ao servidor do Discord para discutir o projeto, reportar bugs ou compartilhar suas ideias.

Servidor do Discord


Agradecimentos

Este projeto usa:

  • FFmpeg para reproducao de ADX e codificacao das capturas JPEG
  • SDL3 para gerenciamento de janela, entrada, saida de som e renderizacao
  • libcdio / libiso9660 para leitura de arquivos .iso
  • zlib para descompressao de arquivos
  • argparse para parsing de argumentos CLI
  • minizip-ng para descompactacao de .zip
  • TF-PSA-Crypto para calculo de checksum

About

Hard Fork to 3sx

Resources

Contributing

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages