Una capa de compatibilidad de código abierto para iOS / macOS que ejecuta Diablo II: Resurrected con la expansión Reign of the Warlock. Lleva a iPhone, iPad y Mac, completa, la edición de Nintendo Switch que compraste, expansión incluida: el código original del juego se ejecuta de forma nativa, todos los controles se rehicieron para pantalla táctil, la tasa de fotogramas se mantiene en 60 fps y entras a una partida un segundo después del menú principal. Ahora también hay una versión nativa para macOS (primera versión): en un Mac con Apple silicon se abre con doble clic y funciona con teclado, ratón y mando. Apple TV 4K (3.ª generación, A15) cuenta con un port de la comunidad (versión preliminar para desarrolladores) que, hasta ahora, solo ha llegado a la pantalla de selección de personaje en el dispositivo de su autor; consulta la tabla de dispositivos más abajo.
Esto no es una demo técnica que «más o menos funciona». Es una versión móvil pulida para jugar a diario, desde tu primer personaje hasta el contenido de fin de juego.
Plataformas: iPhone / iPad (iOS 26 o posterior; iOS 18 – 25 con la compilación para API antiguas) · Mac (Apple silicon, macOS 26 o posterior; macOS 15 – 25 con la compilación para API antiguas) · Apple TV 4K (3.ª generación, A15; port de la comunidad, versión preliminar para desarrolladores) · Versión del juego: edición de Switch con Reign of the Warlock, 1.0.34.0 (corresponde a la versión de PC 3.3.94012) · Español / English / 中文 / Русский · Licencia: MIT · Aporta tus propios archivos del juego
English: README.md · 中文: README.zh-CN.md
| 100% | 60 fps | aprox. 1 s | aprox. 3,8 W |
|---|---|---|---|
| La jugabilidad original, porque es el programa original | Estables, sin caídas una vez que el dispositivo se calienta | Del menú principal a una partida | Consumo de todo el dispositivo a 60 fps |
Es:
- El propio programa aarch64 del juego, ejecutándose directamente en el dispositivo, sin CPU emulada. iPhone y Switch usan la misma clase de procesador; solo se reescriben las pocas instrucciones que no pueden ejecutarse sin cambios bajo el kernel de Apple, y todos los demás bytes del programa quedan exactamente como se publicaron. Todas las clases, todas las palabras rúnicas (Runewords), las zonas de terror (Terror Zones), los jefes, las reglas de botín y el desarrollo de las misiones son idénticos al original.
- Los servicios de plataforma que el juego espera —llamadas al sistema, sistema de archivos, API gráfica, audio, entrada— los proporciona un pequeño anfitrión (host) escrito para las plataformas de Apple. La API gráfica está reimplementada por completo sobre Metal de Apple, sin ninguna capa de emulación en medio, y los shaders se traducen sin conexión a partir de los originales del juego.
- Un port pensado para teléfonos y llevado hasta el final: un esquema de control táctil completo, pantalla de borde a borde en iPhone y pantalla completa real en iPad, compatibilidad con mandos, modo de ahorro de energía, sincronización de partidas guardadas, inglés y chino, y todo un conjunto de modos de fin de juego y mejoras de calidad de vida que el original nunca tuvo.
No es:
- Un emulador, juego en la nube ni streaming.
- Una fuente de contenido del juego. No contiene ninguno ni distribuye ninguno. En este repositorio no hay programa del juego, arte, textos, tablas de datos ni shaders; todo eso se genera en tu propia máquina a partir de tus propios archivos (consulta docs/GAME_FILES.md (en inglés)). Lo que sí incluye el repositorio es la información de interfaz que registramos para que el port funcione —descripciones de interfaz de los shaders, la tabla de funciones de la API gráfica, direcciones dentro del programa y similares—, detallada elemento por elemento en docs/DERIVED.md (en inglés).
- En línea. No hay multijugador; el juego funciona totalmente sin conexión y no necesita ninguna cuenta en línea.
Los 44 iPhone y iPad de la beta cerrada —35 dispositivos registrados para instalación directa (25 iPhone y 10 iPad), más 9 cuentas de TestFlight con un dispositivo cada una— completaron Normal, Pesadilla e Infierno con varios personajes, y la experiencia fue excelente. Desde un iPhone 14 Pro Max con 6 GB de memoria hasta el iPad Pro más reciente, ningún dispositivo se quedó atrás.
| Modelos | |
|---|---|
| iPhone | 14 Pro Max, 15, 15 Pro, 15 Pro Max, 16 Plus, 16 Pro, 16 Pro Max, 17 Pro Max y más |
| iPad | iPad Air, iPad mini, iPad Pro de 11 pulgadas y de 12,9 / 13 pulgadas (incluidos M2 y M4) y más |
| Modelo más modesto probado | iPhone 14 Pro Max (A16, 6 GB): 60 fps impecables |
iPhone y iPad comparten un único paquete de instalación.
Medido en un dispositivo real (iPhone 17 Pro Max):
| Elemento | Lectura |
|---|---|
| Tasa de fotogramas en partida | 60 fps, estables, sin caídas una vez que el dispositivo se calienta |
| Apertura de la app | 0,15 s |
| Hasta el menú principal | aprox. 1 s |
| Del menú principal a una partida | aprox. 1 s |
| Quick Restart (reinicio rápido), de vuelta en partida | aprox. 1,2 s |
| Fotograma más largo al cambiar de acto | aprox. 0,1 s |
| Consumo de todo el dispositivo, 60 fps | aprox. 3,8 W (en el campamento, brillo al 50%): casi 5 horas de juego continuo con una carga completa |
| Consumo de todo el dispositivo, modo de ahorro de energía a 30 fps | aprox. 1,85 W, cerca de la mitad que a 60 fps, para aproximadamente el doble de autonomía |
Condiciones de medición: el consumo es el de todo el dispositivo, medido el 2026-10-10 en un iPhone 17 Pro Max, de pie en el campamento del Acto I con el brillo al 50%; los 60 fps y el modo de ahorro de energía se midieron en la misma escena. La autonomía se calcula a partir del consumo medido y la capacidad de la batería, no jugando de carga completa a vacía. Los tiempos de apertura y de entrada a partida se midieron en el mismo modelo en 2026-10; las lecturas de tasa de fotogramas y de cambio de acto se tomaron en el mismo modelo el 2026-10-12 recorriendo zonas y cambiando de acto tras entrar en una partida.
El paquete de instalación ocupa apenas algo más de 100 MB. Los recursos del juego (unos 5,6 GB) se colocan en el teléfono por separado, y actualizar la app no toca ni tus partidas guardadas ni los recursos.
Por qué es tan rápido: el programa se ejecuta de forma nativa y ni una sola instrucción pasa por emulación; los gráficos van directamente a Metal; todos los shaders se traducen sin conexión y se compilan de antemano, así que no se compila nada al entrar en una escena nueva. Los chips más antiguos (A16 y anteriores, como la familia iPhone 14 y el iPhone 15) no admiten el formato de texturas comprimidas original del juego; necesitan un paquete de texturas adicional creado a partir de tus propios archivos del juego, y con él también funcionan a la tasa de fotogramas completa; consulta docs/LEGACY_DEVICES.md (en inglés).
Esto no es un mando pegado sobre la pantalla. Cada panel y cada acción se rehicieron para los dedos con un único principio de diseño: conservar el lenguaje de interfaz original y usar gestos en lugar de añadir botones a la pantalla. El tamaño del texto y de las zonas táctiles está pensado para los dedos. Sabes jugar en cuanto lo tomas en tus manos, y sigue siendo cómodo en sesiones largas.
- Moverse: un joystick virtual con diagonales precisas; toca a un PNJ o el suelo para ir hasta allí automáticamente; las puertas, los portales y las entradas de cuevas se pueden tocar en toda su superficie.
- Combatir: pulsa un botón de habilidad para lanzarla, mantenlo pulsado para seguir lanzándola, arrastra para apuntar en cualquier ángulo; los monstruos cercanos se seleccionan automáticamente. Dos juegos de habilidades. Las habilidades de tus armas secundarias se lanzan con un solo toque —el juego cambia de arma, lanza la habilidad y vuelve a cambiar— y el botón muestra las cargas restantes.
- Barra de vida del jefe: fija en la parte superior de la pantalla, con el porcentaje restante.
- Objetos: tocar, tocar dos veces, mantener pulsado y arrastrar y soltar siguen a tu dedo. Toca dos veces una pieza de equipo para equiparla o quitártela; arrastra un objeto a cualquier parte del panel del vendedor para venderlo; en una pila, tocar dos veces toma 1 y mantener pulsado toma 3; mantén pulsada una casilla vacía del inventario para ordenarlo todo.
- Texto: se escribe con el teclado del sistema. Los nombres de personaje pueden estar en chino; deja el nombre en blanco para obtener uno aleatorio.
- Pantalla: en iPhone, la pantalla 19,5:9 se llena de borde a borde, sin chocar con la muesca ni con las esquinas redondeadas; en iPad, el juego ocupa toda la pantalla y la interfaz se centra sola al abrir un panel; la imagen 3D se puede aclarar.
Conecta un mando y pulsa cualquier botón: la interfaz cambia a la distribución original para mando, con indicaciones de botones en la parte inferior de cada panel. Toca la pantalla y vuelves al instante a la interfaz táctil. El inventario, el alijo (Stash), el árbol de habilidades, la Chronicle y los ajustes se pueden manejar por completo con el mando, con la misma asignación de botones que en Switch.
Terminar el juego original es solo el principio. Sin tocar las reglas originales, añadimos todo un conjunto de contenido de fin de juego que te mantiene farmeando.
Se entra por el portal rojo de Harrogath tras completar Infierno. Hay 100 niveles y los monstruos se hacen más fuertes en cada uno; llena la barra de progreso y derrota al Rift Guardian en menos de 15 minutos para superar un nivel. Cada 2 niveles superados otorgan +1 punto de habilidad y +5 puntos de atributo, y el límite de nivel de las habilidades sube de 20 a 40. Cada 10 niveles hay una recompensa por la primera vez que lo superas, y superar el nivel 10 desbloquea seis nuevas ranuras de equipo para tu mercenario.
- Endgame Boss Rush (desafío de jefes de fin de juego): se desbloquea tras completar Infierno y tiene 12 fases; la fase 11 es Diablo Clone y la fase 12 son los tres jefes Uber.
- Modo Elysium (se elige al crear el personaje): objetos únicos ×5, objetos de conjunto ×3, runas ×5; la probabilidad de «no soltar nada» se reduce a una décima parte, y los jefes siempre sueltan botín como en la primera vez que los matas.
- Kill Board (tablero de muertes): para cada jefe, el número de muertes, la hora de la primera muerte, cuántos objetos únicos y de conjunto ha soltado, y tus tiempos de muerte mejor y promedio.
- Alijo Chronicle: cada objeto único y de conjunto identificado tiene su propia casilla fija, compartida por todos los personajes, con búsqueda y con depósito y retirada; el botón Deposit envía allí con un solo toque los objetos únicos y de conjunto de tu inventario y del Cubo horádrico.
- Alijo (Stash): ampliado a 14 columnas, con 5 páginas personales y 5 páginas compartidas.
- Trove: las páginas de gemas, runas y materiales fusionadas en una sola, con la cuadrícula de creación del Cubo horádrico en el centro, para que encontrar cosas y crear objetos ya no implique ir saltando entre páginas. Las runas, gemas y materiales que pongas en las páginas personales o compartidas se archivan aquí automáticamente.
- Pouch: un inventario ampliado. Las runas y gemas que encuentres por el mundo van a él automáticamente y no ocupan espacio en el inventario.
| Relanzamiento automático de mejoras | Las habilidades de mejora (buffs) que has aprendido no necesitan una ranura en la barra de habilidades: cuando una mejora se agota, se vuelve a lanzar en cuanto te quedas quieto; las mejoras que vienen de tus armas secundarias (como Battle Orders de Call to Arms) cambian de arma, se relanzan y vuelven a cambiar solas |
| Pociones y cinturón | El consumo automático tiene dos niveles: una poción de curación por debajo del 50% de vida y una poción de rejuvenecimiento por debajo del 30%; tu mercenario recibe pociones automáticamente con la misma regla. Las pociones del suelo se recogen automáticamente cuando hay espacio en el cinturón; toca dos veces una casilla vacía del cinturón para rellenarlo entero |
| Filtro de botín | A partir de Pesadilla, el filtro de botín original se activa automáticamente para ocultar lo que estorba: filtrado ligero en Pesadilla, intenso en Infierno |
| Recogida automática | Las runas y gemas de bajo nivel van directamente al Pouch; las de alto nivel se dejan para que las recojas tú |
| Avisos de botín valioso | Las runas de alto nivel y los objetos únicos levantan un haz de luz y caen con un sonido distinto; el teléfono vibra con una de tres intensidades —suave, media o fuerte— según su valor |
| Asistente de palabras rúnicas | Mantén pulsada una base con engarces para ver las palabras rúnicas que puede formar y sus atributos; cuando tengas las runas, engárzalas todas con un solo toque |
| Guía en el minimapa | Cada mapa marca su Waypoint y sus salidas; cada objetivo de misión aparece en el mapa; cuando un objetivo está fuera de la pantalla, su nombre se escribe a lo largo del borde |
| Tareas tediosas eliminadas | Identificación gratuita, Town Portal gratuito sin necesidad de pergaminos, aparición justo al lado del Waypoint, Quick Restart, mercancía de los vendedores renovable |
| Partidas guardadas | Se guardan de inmediato al cambiar de app, al cerrarla deslizando o al salir; sincronización por iCloud entre dispositivos (requiere firmar con una cuenta de desarrollador de pago) |
La mayoría de las funciones se pueden activar o desactivar una por una en el juego, en Options → Custom.
Todo el juego cambia entre español, inglés, chino y ruso en Opciones → Extras; tras reiniciar, la interfaz queda en el idioma que elegiste. La primera vez que lo abres sigue el idioma de tu dispositivo (el español de España usa los textos esES del juego y el de otras regiones, los textos latinoamericanos esMX; el ruso usa los textos ruRU). En español y en ruso, los objetos, las habilidades y los monstruos usan la terminología oficial del juego, y todo lo que añadimos —Grieta superior, Crónica, la página de ajustes, las indicaciones de gestos y los rótulos del mapa— también está traducido (las notas de objetos solo existen en chino y español). El ruso es el texto ruRU del juego, sin variantes regionales. Voces: en español quedan en inglés; en ruso se usan las voces rusas originales si tus archivos del juego las incluyen (un paquete hecho con los datos completos del juego las trae) y, si no, en inglés; en chino, voces en chino.
flowchart LR
G["Your game files<br/>(program + resources)"] --> P["Rewriter<br/>changes only a few instructions"]
G --> S["Shader translation<br/>original → Metal"]
P --> H["Host<br/>system services"]
S --> X["Graphics layer<br/>the graphics API on Metal"]
H --> A["iOS app<br/>touch and interface"]
X --> A
| Parte | Dónde | Qué hace |
|---|---|---|
| Reescritor del programa | dm/tools/patch_nso.py |
Reescribe solo las pocas instrucciones que no pueden ejecutarse sin cambios bajo el kernel de Apple (registros de puntero de hilo, llamadas al sistema, temporizadores) y deja el resto del programa byte a byte como se publicó |
| Anfitrión (host) | dm/host |
Carga el programa reescrito y proporciona los servicios de plataforma a los que llama |
| Gráficos | dm/gfx |
Implementa la API gráfica del juego sobre Metal; los shaders se traducen sin conexión a partir de los originales del juego |
| App de iOS | dm/ios |
El contenedor de la app, los controles táctiles y la interfaz |
| Verificación | dm/verify |
Comprueba que el código reescrito se comporta exactamente igual que el original, además de las barreras de regresión por las que pasa cada cambio |
Por qué puedes confiar en él: la estabilidad no es cuestión de suerte. Las herramientas de pruebas y verificación forman parte del proyecto: pruebas unitarias para el anfitrión y la capa gráfica, una comprobación de equivalencia para cada instrucción reescrita, regresión con recorridos automatizados por script para la interfaz táctil y pruebas de humo en dispositivos reales. Empieza por make -C dm/host/tests run, make -C dm/gfx/tests run y dm/verify/regress.sh (ejecútalos dentro del entorno de Python preparado en el paso 2 más abajo; regress.sh además necesita brew install llvm). Cómo contribuir se explica en CONTRIBUTING.md (en inglés).
Mínimo: un chip A14 / M1 o posterior: la capa gráfica necesita Metal 3, que Apple admite a partir de A14 / M1 (consulta Metal support on Apple devices y Metal Feature Set Tables de Apple).
| Dispositivo | ¿Se puede jugar? | Cómo | Qué tan seguros estamos |
|---|---|---|---|
| iPhone / iPad, A17 Pro y posteriores (iPhone 15 Pro y posteriores, iPhone 16 y posteriores, iPad con chips de la serie M) | Sí | iOS 26 o posterior: el contenedor predeterminado / la compilación predeterminada; iOS 18 – 25: el contenedor para iOS 18 / la compilación para API antiguas (en inglés) | Dispositivos principales, jugados a diario |
| iPhone / iPad, A16 y anteriores (todos los modelos de iPhone 14, iPhone 15 / 15 Plus, serie iPhone 13, etc.) | Sí, con un paso adicional | Crea un Legacy Device Pack (paquete para dispositivos antiguos) a partir de tus propios archivos del juego como se indica en docs/LEGACY_DEVICES.md (en inglés) e inclúyelo al crear el paquete de instalación; la división por sistema es la misma que en la fila anterior | Jugado por jugadores: iPhone 14 Pro Max (A16, 6 GB) a 60 fps; iPhone 13 Pro Max (A15, 6 GB) en el modo de 30 fps |
| Dispositivos con 4 GB de RAM (como el iPad mini de 6.ª generación o el iPad Air de 4.ª generación) | Funciona, pero la memoria va muy justa (seguimos reduciendo el uso de memoria) | Igual que la fila de A16 y anteriores (con el Legacy Device Pack) | Probado por un jugador: en un iPad mini 6 (A15, 4 GB, iPadOS 27), unos minutos del Acto I funcionaron a 50–58 fps tras la reducción automática de calidad, con avisos constantes de memoria del sistema y a solo unos 560 MB por debajo del límite de memoria del sistema; las escenas cargadas, con muchos monstruos y efectos, pueden ser cerradas por el sistema. En una versión anterior, un iPad Air 4 (A14, 4 GB) fue cerrado por el sistema unos segundos después de abrirse |
| Chips A14 con 6 GB de RAM o más (como el iPhone 12 Pro / 12 Pro Max) | Aún no hay reportes | Igual que la fila de A16 y anteriores | Si lo has probado, abre un Issue y cuéntanos |
| Chips A13 y anteriores (como la serie iPhone 11 y el iPad Pro de 2020) | No compatible | — | El chip gráfico no admite Metal 3 (probado por un jugador en un iPad Pro con A12Z; las referencias de Apple están encima de la tabla); la app lo indica al abrirse en lugar de cerrarse inesperadamente |
| Mac, Apple silicon | Sí (App nativa de macOS) | macOS 26 o posterior: la compilación predeterminada; macOS 15 – 25: la compilación para API antiguas (en inglés). Teclado, ratón y mando funcionan; lo que puede hacer cada uno está en docs/MAC.md (en inglés) | Un jugador ha jugado con la compilación para API antiguas en macOS 15.7.7 |
| Apple TV 4K (3.ª generación, A15) | Port de la comunidad (@yinqingyan, aportado bajo la licencia MIT con el consentimiento del autor), versión preliminar para desarrolladores | Compílalo como se indica en dm/tvos/README.md (en inglés) y copia los archivos del juego y el Legacy Device Pack dentro de la app; solo en hardware real, el Simulador no puede ejecutarlo; las partidas guardadas viven en el directorio Caches, que el sistema puede vaciar | Llegó a la pantalla de selección de personaje en hardware real; entrar en la partida, la asignación completa del mando y las partidas guardadas aún no están verificados, y los mantenedores no lo han probado en hardware real |
| Mac con Intel | No compatible | — | — |
Qué significan los diálogos de la App
- "One More Step for This Device" («Un paso más para este dispositivo»): este teléfono puede ejecutar el juego; el paquete de instalación se creó sin el Legacy Device Pack. Crea el paquete como se indica en docs/LEGACY_DEVICES.md (en inglés), vuelve a crear el paquete de instalación con él y reinstala.
- "Device Not Supported … iPhone 15 Pro and later can play" («Dispositivo no compatible… se puede jugar en iPhone 15 Pro y posteriores»): es el texto antiguo de antes de la v1.0.9. Tienes una versión antigua; actualiza a la más reciente. En dispositivos A16 y anteriores, sigue después el punto anterior.
Qué no tiene un paquete que compilas tú mismo, en comparación con las compilaciones de nuestro grupo de pruebas: la versión pública se puede compilar e instalar con un Apple ID gratuito. Tres cosas de las compilaciones de nuestro grupo de pruebas no están en ella: la sincronización de partidas guardadas por iCloud (la App necesita el permiso de firma de iCloud, que un paquete autofirmado no tiene), la descarga de paquetes y recursos dentro de la App, y los avisos de nueva versión (estas dos usan nuestro propio servidor). El juego en sí y las funciones que añadimos son los mismos.
Ambas rutas empiezan con los archivos del juego que compraste: la edición de Switch de Diablo II: Resurrected más la expansión Reign of the Warlock, actualizada a la 1.0.34.0 (la versión que muestra la consola; corresponde a la versión de PC 3.3.94012, y los nombres de directorio y las herramientas de este repositorio usan este último número). Este proyecto está hecho para la versión con esa expansión; usarlo sin la expansión no está soportado ni se ha verificado. Cómo prepararlos se explica en docs/GAME_FILES.md (en inglés).
Este proyecto proporciona únicamente herramientas y un contenedor de instalación que no contiene ningún contenido del juego. No distribuimos ni respaldamos, y no nos hacemos responsables de, ningún tercero que distribuya recursos del juego, ejecutables del juego o paquetes de instalación que contengan contenido del juego. Usa únicamente archivos del juego que poseas legalmente.
Este proyecto está implementado y verificado sobre la edición de Switch 1.0.34.0 (que corresponde a la versión de PC 3.3.94012), y por defecto las herramientas solo aceptan esa versión. Usuarios de la comunidad han informado de que adaptaron otras versiones por su cuenta siguiendo la estructura de este repositorio y que las ejecutaron con éxito. Las tablas de reglas están agrupadas por versión del juego (en dm/tools/patch_nso.py, indexadas por el build ID del programa principal); te invitamos a contribuir con la versión que hayas adaptado.
Primero revisa tu dispositivo: la tabla «Qué dispositivos son compatibles» de arriba te indica qué compilación usar y si además necesitas un Legacy Device Pack.
| Con un Mac | Sin un Mac | |
|---|---|---|
| Computadora | Un Mac con Apple silicon y Xcode instalado | Windows / Linux / un Mac sin Xcode |
| Método | Una compilación completa desde el código fuente | Descarga un «contenedor» (shell) sin contenido del juego, usa la herramienta de empaquetado para añadir tu propio contenido del juego y luego instálalo con una herramienta de sideloading (instalación externa) |
| Estado | La ruta principal; todo lo anterior proviene de ella | Funciona de principio a fin en Windows, desde crear el paquete hasta jugar en un dispositivo, y el programa del juego generado en los dos sistemas es idéntico byte a byte; el único paso que nadie ha probado todavía es firmar con una herramienta de sideloading: pruébalo y cuéntanos |
| Instrucciones | Los tres pasos de abajo | docs/NO_XCODE.md (en inglés) |
La cuenta de Apple usada para firmar: una cuenta de desarrollador de pago te da todo; un Apple ID gratuito también sirve (sin sincronización de partidas guardadas por iCloud, y la app tiene que volver a firmarse y reinstalarse cada 7 días). La lista completa de dependencias está en docs/DEPENDENCIES.md (en inglés).
-
Pon tus archivos del juego en el espacio de trabajo (por defecto
~/dm-work, o defineDM_ROOT):~/dm-work/data/switch/3.3.94012/Update/ExeFS/ main, sdk, subsdk0 ~/dm-work/data/switch/3.3.94012/Update/RomFS/ data/…
-
Prepara el espacio de trabajo. Esto revisa tus herramientas, reescribe el programa del juego y traduce los shaders del juego a Metal. La primera ejecución tarda un rato; las siguientes se saltan lo que ya está hecho.
./setup.sh source ~/dm-work/build/cache/dm/venv/bin/activate # run everything after this inside the Python environment setup prepared; if you changed DM_ROOT, use it in place of ~/dm-work
-
Completa tus datos de firma y compila la app:
cp dm/ios/local.env.example dm/ios/local.env # set DM_TEAM_ID and DM_BUNDLE_ID; with a free Apple ID also set DM_FREE_ACCOUNT=1 and DM_IOS_UDID, and keep the phone connected while building cd dm/ios && ./run.sh build # targets both iPhone and iPad by default; for iPhone only: DM_DEVICE_FAMILY=1 ./run.sh build
La primera vez que abras la app en tu teléfono, te pedirá la «carpeta de recursos del juego» (game resource folder): los 18 archivos de recursos de tus archivos del juego. Dónde ponerlos se explica en la sección "The "game resource folder" that goes on the phone" de docs/GAME_FILES.md (en inglés).
./setup.sh check es una revisión de estado: informa elemento por elemento del estado de esta computadora, las herramientas, los archivos del juego y la configuración de firma, y para todo lo que falte indica dónde conseguirlo y qué comando ejecutar a continuación; no cambia nada. Si lo que tienes es un paquete completo del juego (.xci / .nsp), ./setup.sh <game package> <prod.keys> primero extrae los archivos del juego en su lugar y luego continúa (instala hactool antes). Vuelve a ejecutar ./setup.sh después de cada actualización a un nuevo commit: recompila los binarios parcheados y la biblioteca de shaders para el código fuente actual (los pasos que ya están al día se omiten). También reescribe tres archivos del repositorio que cambian según las huellas de tus herramientas locales (dm/gfx/tools/dmsh_chain.lock, dm/gfx/nvn/dmsh_chain.h, dm/gfx/nvn/c1_full.tsv); es lo esperado, no hagas commit de ellos.
Después del mismo ./setup.sh, un comando más compila una App nativa de macOS que se abre con doble clic y funciona con teclado, ratón y mando, sin cuenta de desarrollador:
source ~/dm-work/build/cache/dm/venv/bin/activate
dm/tools/mac_app.sh # macOS 26 or later: produces ~/dm-work/out/macapp/D2R Mobile.app
DM_MAC_M3=1 dm/tools/mac_app.sh # macOS 15 – 25: produces D2R Mobile M3.appLa interfaz es la interfaz para mando del original. Teclado: Espacio confirma, Esc vuelve atrás, Intro, la tecla = abre el menú / un personaje nuevo, W A S D mueven, y cada uno de los demás botones del mando tiene una tecla. Ratón: al hacer clic en un monstruo, un PNJ o un objeto, caminas hasta él e interactúas, y se puede hacer clic en las ranuras de habilidad, las casillas de pociones y las indicaciones de teclas de la parte inferior, en los botones y pestañas de los paneles, en las figuras de las clases al crear un personaje y en el minimapa; al hacer clic en un suelo vacío caminas hasta allí y, si mantienes pulsado, sigues caminando; al hacer clic en un monstruo lo atacas, y los objetos funcionan con doble clic y arrastre. Con teclado, las indicaciones en pantalla muestran teclas del teclado. Las partidas guardadas se quedan en este Mac (una App que compilas tú no tiene sincronización por iCloud) y se pueden importar a mano desde un iPhone / iPad. La tabla de teclas, cómo crear un personaje, qué puede hacer el ratón, los pasos de importación y las carencias conocidas están en docs/MAC.md (en inglés). El teclado y un mando físico aún no los ha manejado ninguna persona; si lo pruebas, cuéntanos cómo te fue.
Descarga nuestro paquete «contenedor» precompilado (D2RMobile-shell-build-input.zip; D2RMobile-shell-ios18-build-input.zip para iOS 18 – 25), que no contiene ningún contenido del juego, desde la página de Releases de este repositorio, añade tus propios archivos del juego, crea el paquete de instalación en Windows o Linux y luego fírmalo e instálalo con una herramienta de sideloading. El contenedor es material de entrada para la compilación, no una app para instalar (si lo instalas tal cual, solo muestra un diálogo y no inicia el juego); cuando pases a una nueva versión, vuelve a crear el paquete de instalación con el nuevo contenedor. Solo en esta ruta, como la computadora que crea el paquete no tiene el compilador de shaders de Apple, el primer arranque en el teléfono dedica unos 7 minutos a compilar shaders (una sola vez, con barra de progreso); un paquete compilado con Xcode no tiene ese paso. Los pasos, y hasta qué punto se ha verificado cada uno, están en docs/NO_XCODE.md (en inglés).
| Elemento | Estado |
|---|---|
| Juego en línea | Fuera del alcance del proyecto; totalmente sin conexión |
Paquetes del juego .nsp / .xci |
Las herramientas solo comprueban la versión del programa principal y no distinguen formatos de paquete; nosotros recorrimos todo el proceso con un .xci, y los usuarios han informado de que los paquetes .nsp también funcionan perfectamente |
| Firmar e instalar con una herramienta de sideloading (Sideloadly, AltStore y similares) | No verificado; abre un issue y cuéntanos cómo te fue |
| Crear el paquete en Linux | No verificado (verificado en Windows y Mac) |
| Dispositivos que no se han actualizado a iOS 26 / macOS 26 | Se puede jugar con la compilación para API antiguas (mínimo iOS 18.0 / macOS 15.0): docs/OLDER_SYSTEMS.md (en inglés); la tabla completa de dispositivos está en «Qué dispositivos son compatibles», más arriba |
| Dispositivos A16 y anteriores (familia iPhone 14, iPhone 15 / 15 Plus, etc.) | Se puede jugar; necesitan un Legacy Device Pack y una App compilada con él: docs/LEGACY_DEVICES.md (en inglés). "One More Step for This Device" (las versiones antiguas dicen "Device Not Supported") en la App significa que falta este paso |
| Las entradas de «veredicto en una línea» y «nombre chino antiguo» en las notas de los objetos | Estas dos tablas de contenido no se incluyen en el repositorio; puedes aportar las tuyas, consulta dm/ios/tools/annot/README.md |
- Si encuentras un problema, abre un issue (hay una plantilla); adjuntar el archivo que exporta Share Diagnostics en el menú de pausa es lo que más ayuda.
- En los puntos marcados como no verificados, cuéntanos si funcionaron o no. Cualquiera de las dos respuestas es valiosa.
- Para cambiar el código: primero consigue que pasen los puntos de entrada de pruebas de arriba. Cada cambio tiene que superar las barreras de regresión.
Llevarlo a otras plataformas: este enfoque no se limita a iPhone y iPad. Los Mac con Apple silicon ya tienen una versión nativa (consulta «Jugar directamente en un Mac», más arriba), compilada a partir del mismo programa del juego y el mismo anfitrión; Apple TV también tiene un port de la comunidad (versión preliminar para desarrolladores, consulta la tabla de dispositivos). Los teléfonos Android usan la misma clase de procesador, así que el programa del juego también se ejecuta allí de forma nativa, y el camino está totalmente abierto: las únicas partes que hay que sustituir son las caras del anfitrión y de la capa gráfica que dan a la plataforma. El autor no tiene ningún teléfono Android a mano, y le encantaría ver a alguien llevarlo a Android.
Llevarlo a otros juegos: alguien ya ha probado otros juegos de Switch sobre el mismo anfitrión. El anfitrión tiene algunos comportamientos que están activados por defecto en iOS y se escribieron para este juego en concreto; otro juego tropieza con ellos primero, así que desactívalos o sácalos antes de empezar:
dm/host/hle_oe.c: la escala de renderizado 3D vale 0.75 por defecto en iOS, yscale3d_tickla reescribe en desplazamientos dentro del renderizador de este juego; con otro juego, eso es un puntero descontrolado.dm/host/hle_fs.c: la siembra del alijo compartido en el primer arranque (DM_STASH_SEED) y los ajustes predeterminados de la distribución táctil (DM_TOUCH_DEFAULTS) están activados por defecto en iOS.dm/host/main.c: el limitador de vaciado de partidas guardadas parchea una constante en una dirección fija del programa del juego;argv[0]está fijado en el código como"D2R".dm/host/hle_time.c: el interruptor de prueba de hora fija reconoce una dirección fija del programa del juego.front_game_resendm/host/front_mac.m: las resoluciones en modo televisor / portátil están fijadas en el código en 1600×900 / 1280×720.dm/host/dm_cloudsync.c: los directorios de personajes se reconocen por.d2s.dm/host/dm_cursor.cydm/host/dm_world.c: los archivos completos son específicos de este juego.
Lo más limpio sería mover estos valores predeterminados a una configuración por juego y mantener el anfitrión libre de valores predeterminados específicos de un juego; los pull requests en esa dirección son bienvenidos.
| Documento | Contenido |
|---|---|
| dm/README.md (en inglés) | Cómo funciona el conjunto, estructura de directorios, comandos habituales, los archivos fuente del anfitrión |
| dm/gfx/README.md (en inglés) | La capa gráfica y la cadena de traducción de shaders |
| dm/ios/README.md (en inglés) | El contenedor de iOS, la compilación y las pruebas de humo |
| dm/verify/README.md (en inglés) | Qué comprueba cada herramienta de verificación y qué necesita |
| docs/GAME_FILES.md (en inglés) | Archivos del juego: cuáles necesitas, cómo obtenerlos de tu propia consola, dónde ponerlos |
| docs/DEPENDENCIES.md (en inglés) | Dependencias y licencias de terceros |
| docs/NO_XCODE.md (en inglés) | Compilar sin Xcode y sin un Mac |
| docs/MAC.md (en inglés) | Jugar en un Mac: compilar la App de macOS, asignación de teclas, carencias conocidas |
| docs/LEGACY_DEVICES.md (en inglés) | Dispositivos antiguos (A16 y anteriores): crear el paquete de texturas y ponerlo en el teléfono |
| docs/OLDER_SYSTEMS.md (en inglés) | Sistemas antiguos (iOS 18 – 25, macOS 15 – 25): compilar la versión para API antiguas y combinarla con el Legacy Device Pack |
| docs/qa-rift-pet-life.md (en inglés) | Lista de comprobación de regresión para la vida de los esbirros en las Greater Rifts (qué se ha ejecutado y qué no; se agradecen aportaciones) |
| docs/DERIVED.md (en inglés) | Material relacionado con el juego en este repositorio: qué hay, qué no hay y por qué |
Debes poseer el juego, incluida la expansión Reign of the Warlock. Este es un proyecto independiente y sin fines comerciales. No está afiliado a Blizzard Entertainment ni a Nintendo, ni cuenta con su respaldo o patrocinio. Diablo y Blizzard Entertainment son marcas comerciales de Blizzard Entertainment, Inc.; Nintendo Switch es una marca comercial de Nintendo. Úsalo solo con una copia del juego que poseas.
Este proyecto se apoya en el trabajo de código abierto que aparece a continuación. Gracias a sus autores y mantenedores.
- Ryujinx (Ryubing 1.3.2, MIT):
dm/third_party/ryujinxincluye sin cambios su traductor de shaders (los proyectos Ryujinx.Graphics.Shader, Spv.Generator y Ryujinx.Common), que traduce los shaders del juego de Switch a SPIR-V. Durante el desarrollo también ejecutamos el juego original en un Ryujinx parcheado como referencia para comparar imágenes y estado del juego (consulta dm/verify/README.md (en inglés); los scripts que lo compilan y lo controlan no están en este repositorio). - deko3d (devkitPro, zlib): el algoritmo de tamaño de disposición de texturas de
dm/gfx/nvn/nvn_tex.cestá portado de él. - nvn.h (h1k421, MIT): las declaraciones de la API gráfica en
dm/gfx/nvn/include/nvn.h. - libdeflate (Eric Biggers, MIT): descompresión de los datos del juego.
- bcdec (iOrange, MIT o Unlicense): decodificación de texturas BC en dispositivos que no admiten los formatos BC.
- FLIP (NVIDIA, BSD 3-Clause): la métrica de diferencia de imagen usada en las comprobaciones de calidad de imagen.
- Parche de corrección sin conexión (LFS Mod Offline Fix): las 7 reescrituras de
dm/tools/patch_nso.pyque permiten que el juego funcione sin conexión provienen de este parche de la comunidad. No tenemos un registro fiable de dónde se publicó por primera vez ni de quién lo escribió; si lo sabes, abre un Issue. - Herramientas usadas para compilar y verificar: SPIRV-Cross (de SPIR-V a Metal Shading Language), XcodeGen, .NET, Capstone y Unicorn (desensamblado y comprobaciones de equivalencia de las reescrituras), Pillow, numpy, lz4, astcenc (el Legacy Device Pack), hactool (extracción de archivos de un paquete del juego), libimobiledevice y LLVM. Las versiones y los enlaces están en docs/DEPENDENCIES.md (en inglés).
- Contribuciones de la comunidad: Joe Hu informó y diagnosticó varios problemas de la Greater Rift y propuso una matriz de verificación; seedds encontró y diagnosticó el problema del formato de vista del render target en otro port (#36). Ambos figuran como coautores en los commits correspondientes.
MIT, consulta LICENSE. El código de terceros conserva su propia licencia en su propio directorio; consulta docs/DEPENDENCIES.md (en inglés).






















