Grand Theft Auto III · Re3 Android Evolved
Grand Theft Auto III
OrigenWindows
TecnologíaPort Nativo C/C++ (Reimplementación de Motor)
Disponible paraAndroid
Ver proyecto oficialSobre el proyecto
Grand Theft Auto III es un videojuego de acción y aventura de mundo abierto de disparos en tercera persona de 2001 desarrollado por DMA Design y publicado por Rockstar Games. Es la tercera entrada principal de la serie Grand Theft Auto, después de Grand Theft Auto 2 de 1999, y la quinta instalación en general.
3 versiones de Grand Theft Auto III
Estás viendo: Re3 Android Evolved
Información oficial del proyecto
RE3 Android Evolved
Intro
En este repositorio vas a encontrar el código fuente completamente reversado de GTA III, con un port a Android completo y jugable agregado en este fork.
re3 (el proyecto original, GTAmodding/re3) fue dado de baja por DMCA en 2021; este fork parte de mrxenginner/re3, un mirror preservado del código.
Funciona en Windows, Linux, MacOS, FreeBSD y Android (este fork), en x86, amd64, arm y arm64.
El renderizado lo maneja librw (D3D9, OpenGL 2.1+, OpenGL ES 2.0+), la reimplementación open-source de RenderWare.
El audio funciona con OpenAL.
📱 Sobre este fork: RE3 Android Evolved
Este fork es hermano de revc-android-port-evolved (el mismo trabajo, para GTA Vice City) — misma metodología, mismo autor.
A diferencia de reVC, este repositorio (re3) no tenía ningún soporte de Android previo, en ningún lado — ni siquiera un esqueleto parcial. Todo lo que hay en android/, cmake/android/, src/skel/android/ y src/skel/sdl2/ fue portado desde cero, usando revc-android-port-evolved como plantilla y adaptando cada pieza línea por línea contra el código real de este repo (que en varios archivos compartidos seguía siendo GLFW-only, sin la rama SDL2 que reVC ya tenía).
Estado actual: ✅ jugable de punta a punta. Compila, instala, arranca, carga los assets, el menú principal responde al tacto (scroll y confirmación), se puede iniciar partida nueva, conducir, disparar y el HUD/radar se ve correcto. Ver capturas abajo y la sección de pendientes para lo que falta pulir.
✅ Arreglos aplicados
Build / compilación
android/launcher/: proyecto Gradle + CMake completo desde cero (no existía).cmake/android/AndroidConfig.cmake: conecta los binarios prebuilt de SDL2/OpenAL/mpg123 por ABI a los mismosfind_package()que usan los builds de escritorio vía Conan. También fuerzaLIBRW_PLATFORM=GL3yLIBRW_GL3_GFXLIB=SDL2en librw (por defecto no tienen equivalente para Android).vendor/librwre-apuntado a codepdbh/librw-re3-android (ramaandroid-sdl2-fixes): librw nunca había compilado su backend SDL2 para Android —find_package(OpenGL)no tiene rama Android (linkeado directo a GLESv3+EGL en su lugar) yDEVICEGETNUMSUBSYSTEMS/DEVICEGETCURRENTSUBSYSTEM/etc. estaban sin implementar para SDL2 (assert(0)en cada arranque —psSelectDevice()los consulta siempre).src/CMakeLists.txt: lib compartida (no ejecutable) en Android,ANDROID_x32por ABI, todos los defines que el código espera (ANDROID,RW_GL3,LIBRW_SDL2, etc.).src/skel/crossplatform.h,core/Pad.cpp,core/Frontend.cpp,core/ControllerConfig.cpp: a diferencia de reVC, ninguno de estos tenía una ramaLIBRW_SDL2— usaban GLFW sin condicional (GLFWwindow*a secas,GLFW_MOUSE_BUTTON_*,glfwGetCursorPos()directo). Agregadas las ramas SDL2 que faltaban.
Assets / almacenamiento
GameActivity.getArguments()pasa--dirapuntando aAlmacenamiento interno/re3GTA, pide "Todos los archivos" (MANAGE_EXTERNAL_STORAGE) en runtime si falta.main()(sdl2.cpp) hacechdir()a esa carpeta apenas parsea--dir— el motor entero resuelve rutas relativas contra el directorio de trabajo, que en Android no tiene ningún valor útil por defecto.casepath()(crossplatform.cpp, el resolvedor de rutas case-insensitive): abríaopendir("/")para cualquier ruta absoluta — Android no lo permite aunque tengas el permiso de almacenamiento. Ahora ancla la resolución enStorageRootBuffer(la ruta real y fija de la carpeta del juego) en vez de engetcwd(), que era inestable: cada vez queCFileMgr::SetDir()cambiaba de subcarpeta y volvía a la raíz, el directorio de trabajo quedaba pegado en la subcarpeta anterior y todas las cargas relativas posteriores fallaban — esto era la causa real de lo que parecía un cuelgue nativo indefinido al arrancar (en realidadCTxdStore::LoadTxdreintentando para siempre unopen()que nunca iba a funcionar).TxdStore.cpp: el reintento de carga de texturas ahora tiene un límite (1000 intentos) en Android en vez de ser infinito, para que un archivo realmente corrupto/faltante falle con un log en vez de trabar el hilo.CdStream_posix.cpp: sacadoO_NOATIMEen Android — requiere ser dueño del archivo, y los archivos del juego llegan copiados por otro proceso (adb push, gestor de archivos, MTP por USB), así que siempre fallaba con EPERM.re3.ini(mINI::INIFile) era un global no-lazy construido con ruta relativa antes de que--dirse parsee — ahora es lazy (GetIniFile()), se construye recién en el primer uso real.USE_UNNAMED_SEMahora también cubre Android (antes solo Switch) — bionic no soporta semáforos con nombre (sem_open()siempre falla), abortaba en el primer streaming thread.- Bug de concatenación sin
/en la ruta degamecontrollerdb.txt(mismo tipo de bug que reVC tenía en su logger).
Controles táctiles
Port completo de la arquitectura de reVC (TouchControls.h/.cpp, TouchControlsView.java, CaptureTouchPad()/CapturePad()), pero con la semántica de botones re-verificada contra los bindings reales de GTA III (no asumida igual a reVC):
- III no tiene celular — el botón L1 en el layout "a pie" es "centrar cámara detrás del jugador" (CAM), no "atender teléfono" como en reVC.
MapIdToButtonId()en este repo switchea sobre el orden ordinal de GLFW (nunca tuvo backend SDL2 propio), no sobreSDL_CONTROLLER_BUTTON_*como en reVC.CaptureTouchPad()/CapturePad()usan un enumGAME_BTN_*que respeta ese orden GLFW en vez de reusar los índices SDL2 de reVC directamente.InitDefaultControlConfigJoyPad(16)llamado una vez al arrancar si hace falta (mismo fix que reVC necesitó, mismo motivo: solo se dispara con un gamepad físico conectado).- Menú táctil: tocar una opción ahora la resalta Y la confirma correctamente.
CMenuManager::ProcessButtonPresses()lee el estado de hover un frame antes de queDraw()lo recalcule para la posición actual — un mouse real no lo nota (descansa varios frames sobre el botón antes del clic), pero un toque aparece ya posicionado sobre el botón desde el primer frame. Se retrasa un frame la confirmación del tap (no la posición) para darle tiempo aDraw()de calcular el hover correcto antes de leerlo. - No se podía pausar manejando. El botón de pausa (Start) nunca se posicionaba en el layout de vehículo — no faltaba un mapeo, directamente el botón no existía en pantalla mientras conducías (mismo bug que tenía reVC).
- El botón de cámara (VISTA/L1 CAM) se superponía al minimapa y se veía ovalado en vez de redondo (su hitbox era un rectángulo ancho, no un círculo). Movido a un costado, fuera del área del radar, y ahora circular como el resto de los botones.
Radar / HUD
- Radar reposicionado arriba-izquierda (
RADAR_TOP) enRadar.cppyHud.cpp— el stick de movimiento está abajo-izquierda y lo tapaba.
Apuntado / target-lock
CCamera::m_bUseMouse3rdPerson(defaulttrue, "cámara con mouse en 3ra persona") bloqueabaFindWeaponLockOnTarget()por completo — sin mouse en Android, quedaba permanentemente entrue. Arreglo puntual (variable local, solo dentro deProcessPlayerWeapon(), solo Android) sin tocar la bandera global (también maneja la cámara con stick en otros archivos).
✨ Mejoras / features nuevas
- Controles con íconos en vez de texto: los botones que antes mostraban una palabra en español (CORRER, SALTAR, DISPARAR, SUBIR, SALIR, CAM, APUNTAR, VISTA, GAS, FRENO, FRENO MANO, RADIO, BOCINA) ahora muestran un gráfico propio en su lugar — 12 íconos distintos en total (CAM y VISTA comparten el mismo, ambos son "cámara"), más rápido de reconocer de un vistazo. (III no tiene botón de teléfono, a diferencia de reVC, así que un ícono menos que en el fork hermano.)
📋 Pendientes
- Probado a fondo solo en un dispositivo (Adreno clase Snapdragon 8 Elite, Android 16) — falta feedback de otras GPUs/versiones de Android.
- R3 (mirar atrás / alternar sumisiones) no tiene botón táctil propio en el layout actual (mismo gap que reVC).
- Libs vendored (SDL2/OpenAL/mpg123) no están alineadas a 16KB de página (Android 15+ lo pide para APKs nuevos) — hoy es solo una advertencia de compatibilidad, no bloquea instalación.
- Seguir jugando para encontrar bugs específicos de Android que todavía no aparecieron en las pruebas.
Installation
- re3 requiere los assets originales del juego — necesitás tener una copia de GTA III legítima.
- Android: instalá el APK (ver Releases), copiá los archivos del juego a
Almacenamiento interno/re3GTA, concedé el permiso "Todos los archivos" cuando se pida. - PC: compilá desde código fuente (ver más abajo) o descargá un build de GTAmodding/re3 (el proyecto original, con builds automatizados para Windows/Linux/MacOS).
Screenshots
<p float="left"> <img src="docs/screenshot_driving.png" width="420" alt="Conduciendo en re3 Android"> <img src="docs/screenshot_menu.png" width="420" alt="Menú principal táctil en re3 Android"> </p>Improvements
Los mismos cambios y mejoras del re3 original (configurables en core/config.h):
- Muchos bugs grandes y chicos arreglados
- Archivos de usuario (guardados y configuración) en la carpeta raíz del juego
- Configuración en
re3.inien vez degta3.set - Menú de debug (Ctrl-M)
- Cámara de debug (Ctrl-B)
- Cámara rotable
- Soporte XInput (Windows)
- Sin pantallas de carga entre islas
- Soporte de peds "skinned" (modelos de Xbox/Mobile)
- Widescreen (HUD, menú y FOV correctamente escalados)
- MatFX, alpha test, partículas, iluminación y lluvia estilo PS2/Xbox
- Menú con mapa, más opciones, configuración de controlador
Building from Source
Android
Requisitos: Android SDK + NDK 27.2.12479018, CMake 3.22.1 (instalables vía sdkmanager).
git clone --recurse-submodules https://github.com/codepdbh/re3-android-port-evolved.git
cd re3-android-port-evolved/android/launcher
Creá android/launcher/local.properties con sdk.dir=<ruta a tu Android SDK>.
Si tu JDK del sistema es muy nuevo para Gradle 8.11.x, agregá a android/launcher/gradle.properties (no lo commitees):
org.gradle.java.home=<ruta al JBR de Android Studio>
Luego:
./gradlew assembleDebug
El APK queda en android/launcher/app/build/outputs/apk/debug/.
PC (Windows / Linux / MacOS / FreeBSD)
Ver las instrucciones del re3 original — sin cambios en este fork para esas plataformas.
Contributing
Este fork sigue las mismas reglas de contribución que el re3 original — ver CODING_STYLE.md. Los cambios específicos de Android están detrás de #if defined ANDROID en todos lados, no afectan el resto de las plataformas.
Apoyá el proyecto
Si te sirvió este port, suscribite a mi canal de YouTube (@DanielMcDt) y dejá una ⭐ en el repositorio — ayuda un montón a que más gente lo encuentre.
License
No estamos en posición de darle una licencia a este código.
Debe usarse solo con fines educativos, de documentación y de modding.
No fomentamos la piratería ni el uso comercial.
Por favor mantené el trabajo derivado open source y dale crédito apropiado.
