nuive
Tengo una carpeta de Drive para las expansiones, sí, pero la verdad que no está como pública. Es buena
idea que la ponga y la añada al post principal, y así se pueden añadir más.
nuive
De alguna forma eso se podría utilizar, pero rompería toda la estructura de la pantalla (lo que viene
siendo el funcionamiento del motor de textos) y además estaríamos en las mismas. Como un hacker añada
más variables a su ROM no hay ninguna garantía de que la dirección de RAM sea algo constante. Por eso
sí, sería interesante un espacio fijo en la RAM para estas cosas, pero como digo, prácticamente habría
que crear otro motor específicamente para esto, y sería mucho más limitado. Mis esperanzas por ahora
están puestas en el ubicador este de funciones.
nuive
Hay que tener en cuenta que el CFRU es una expansión sobre la ROM original. Por esto, para llamar a las
nuevas funciones de una forma o de otra hay que modificar ciertas rutinas en las funciones originales,
pero como se modifican las funciones sobre la ROM original (no hay que recompilar nada) el único requerimiento
es que la modificación solo puede reemplazar bytes en la función original, no expandirse, y en esto me
baso.
nuive
la dirección de la función original donde el CFRU almacenará la nueva dirección, y así calcula la dirección
de la nueva función para diferentes hacks o versiones, en tiempo real, cada vez que se carga el script.
nuive
de operaciones en ensamblador para calcular donde termina esa función, y sabiendo donde comienza y termina,
utiliza dentro de esos límites diferentes estrategias como comparaciones de bytes, búsquedas de saltos
y cosas así.
nuive
No es solo ese parche. Tanto CFRU como DPE (que es la parte de la expansión que se encarga de añadir
Pokémon, movimientos con sus animaciones, habilidades...) tienen algunos bugs. Por ejemplo, los gritos
de los Pokémon de cuarta y quinta generación están directamente extraídos de los juegos de DS sin modificar
la calidad. Si bien los gritos tienen una calidad máxima de 22kHz y por esto suenan mejor que los que
ya incluye Rojo Fuego (que son a 10,512kHz) esto implica ocupar más espacio en la ROM. Por este motivo,
en hacks como Radical Red, al añadir la novena generación (CFRU/DPE solo incluye hasta la octava) tienen
que hacer apaños que para nosotros, teniendo el sonido como fuente de información principal, no nos interesan.
En Radical Red 4.0 los Pokémon de la novena generación estaban a 44,1 kHz (quien fue el loco? ni idea)
y obviamente ocupaban casi todo el espacio de la ROM. En la 4.1 de repente todos los pokémon de la novena
tenían los gritos a 8kHz y eso se convirtió en un estropicio, empezando por el hecho de que sonaban muy
bajos y distorsionados. Ah, otra cosa, obviamente, es que las formas con gritos propios como las megas
no tenían esos gritos, solo los gritos normales con variación de tono.
Lo que hice yo fue equilibrar todos los gritos en volumen y frecuencia a 10,512kHz, de forma que quedaran
exactamente igual que los de las primeras generaciones que ya trae el juego. Con esto, incluso añadiendo
los gritos de las evoluciones, el espacio que ocupan los gritos es ahora de 5 mb aproximadamente (en
la 4.1 de Radical Red, aún con gritos a 8kHz los gritos ocupaban casi 8 mb). Y sí, aunque 3 mb parezca
una tontería, en una ROM donde el espacio máximo son 32 es una grandísima diferencia.
nuive
Lo que hice por ahora fue guardar todos los cambios que realicé en el hack, y como Radical Red es un
hack que tampoco se actualiza mucho, si sale una nueva versión pues los vuelvo a aplicar y ya. Será mucho
más rápido puesto que solo tendría que pasar el código que yo añadí a la nueva versión, y lo mismo con
los gritos.
Es una pena que no lo añadan al CFRU para que esto se pueda solucionar en otros hacks pero bueno... habrá
que trabajar con las posibilidades que tenemos.
nuive
Sí, toda la gestión de sonidos que tiene el script se hace a través de un minirreproductor que está formado
por dos DLLs que están en la carpeta lua, audio.dll y bass.dll. La DLL bass es una biblioteca de audio
que anda por ahí, la audio.dll es la que Tyler Spivey creó para comunicar Lua con Bass.
El texto a voz también se hace a través de otra DLL, la tolk, que es un proyecto que también anda por
GitHub.
nuive
No hay commit 😢. Si recuerdas, hace un año me bloquearon el GitHub varios meses, y tuve que depender
de la copia local. Durante ese tiempo formateé el ordenador y al querer actualizar esa copia me empezó
a tirar errores de permisos y propietarios y más locuras que le dieron. Pude salvar todo el proyecto
sin problemas, todo menos el historial de commits y esas cosas de GitHub.
nuive
Ah, la cámara efectúa un sonidito indicando hacia que dirección se puede mover una puerta, pero como
digo, es que ni siquiera es fácil de explicar.
nuive
Lo de la lista de movimientos es algo que aún no está solucionado. Las listas de movimientos en Esmeralda
tienen doble pestaña por lo de movimientos de combate y movimientos de concurso, y con los métodos que
intenté hasta ahora al cambiar de pestaña se desmadra todo de una manera bastante dramática.
Lo del Pokénav... creo que eso funcionó en algún momento, no recuerdo muy bien, pero se rompió una de
tantas veces que tuve que rehacer el motor de textos. Toca revisarlo.
El NVDA está activo desde que se abre el juego, por suerte a la mayoría de menús y diálogos te los detecta sin problemas. La contraseña blindstep solo se encarga de agregar los sonidos extra.sanslash332
¿Tiene soporte para lector de pantalla? o eso todavía es a puro OCR?
sanslash332
Interesante. entonces el truco que hace esta gente, es agregar nuevas funciones en espacio del rom sin usar, y en las llamadas originales a la función, reemplasan el puntero viejo con el puntero hacia la nueva función, pero dicho puntero tiene que tener un tamaño similar al antiguo para que pueda calzar en ese lugar y funcionar sin inconvenientes. que interesante hmm
sanslash332
Esto lo hace en un startUp time?
el script cuando se inicializa hace una lectura de todo el rom buscando estos puntos dinámicos para prerar las funciones a tiempo?
O lo hace en runtime reconociendo un salto y yendo al salto a penas lo detecta, sin haberlo pre-procesado antes?
A lo que voy... ¿con lua tienes acceso a toda la memoria del juego?
O solo a la ram?
porque se me olvidó, la GBA carga todo el rom en ram a la hora de inicializarse? o el rom va cargando nuevos trozos a medida que son requeridos.
sanslash332
sinceramente te fuiste a un nivel muy potente he.
Como se va dando vcuenta qué tipo de operación utilizar?
generaste algún algorítmo de cálculo, o un árbol de desición para saber como ir trabajando la función hasta que el script pueda reconocer todo lo que le interesa?
sanslash332
Me dices 5mb por el tamaño... de solo los sonidos de los gritos de los pokemon y es harto. sigue siendo harto; es un poco menos del 15% del rom solo gastado en gritos.
Luego vienen gráficos, sprites.... al final esos 32mb se pueden ir rápido, súper rápido.
Ahora bien... ¿no pueden haber roms de 64mb en GBA?
existe algún límite del procesador como tal para la lectura del tamaño del cartucho?
sanslash332
bro, te pones la soga al cuello tú solo.
ya rugiste, radical red nuive edition en el primer post. ya xd
Vas a tener que ir dándole mantención. y en serio, que chafas, queeeee chafas.
Al final no son tan opensource como dicen serlo
sanslash332
Va, creí que era una implementación normal de bass. bass la conozco, sin drama.
¿pero por qué tuvo que crear una interfás intermedia?
Si llama a audio.dll desde lua ¿por qué no llamó entonces a bass directo desde lua?
Por qué darse esa vuelta con una envoltura?
Sip, tolk la conozco. incluso la he usado.
es boneeta
sanslash332
se me había olvidado que según github, nuive es un hacker ultra peligroso xd
Pos nada. simplemente f. ultra f.
¿aunque cuando pasó lo de github? ¿no se te ocurrió tirar commits de mientras a gitlab? jaja
sanslash332
no entendí lo de la lista de movimientos con doble pestaña
te refieres a la lista de movimientos en el menú status de cada pokemon y donde salen sus movimientos?
O en todo momento tienen dos listas separadas de movimiento, una para peleas y otra para concursos. con set de conocimiento diferente para cada ocación? jajaj
sanslash332
da lo mismo, la diferencia ya entre emuladores es avismal. aunque lograses reducir a unos 5MS las funciones de buscaobjetos ultra optimizadas con luajit, en mGBA, seguiría estando entorno a los 30 o 40ms.
lo que sigue siendo aún mucho más que lo que tenemos a día de hoy
nuive
Básicamente es algo así, pero en ensamblador es mucho más complejo de diseñar, claro.
En la GBA directamente se mapea en memoria el acceso completo a la ROM, y no hay posibilidad de realizar cambio de bancos de memoria. El tamaño de mapeo
es de 32768kb (32 mb).
nuive
En ensamblador hay comandos en binario que indican un salto, el inicio de una función, el final de la misma... Esto se utiliza para delimitar donde comienza
y acaba cada función. Luego del final de la función suelen estar las constantes que utiliza esa función. A partir de ahí, es mi trabajo estudiar la función
(si tengo el código C es mucho más fácil, pero si no, toca desensamblar) e indicarle al script como procesar todos esos datos y las modificaciones que
hace en la RAM (las constantes que hay al final de cada función suelen ser direcciones de la ROM donde lee datos y direcciones de RAM donde los escribe).
nuive
Sí, parece mucho ya que es como un 15% de la ROM o más. Pero piensa que son más de 1000 gritos, luego megas, formas alternativas... según se agote el espacio
los gritos será lo primero que se sacrifique. Se almacenan en wav comprimido en una variante de dPCM un poco extraña, optimizando la compresión a cambio
de perder calidad. Al final un grito ocupa más que varios sprites juntos. Y no, a menos que alguien diseñe un decompresor de mp3 en ASM que pueda funcionar
con las ROMs de pokémon, por ahora no hay otra alternativa. Estas ROMs solo leen wav sin comprimir o wav comprimido en la variante esta rara de dPCM.
teóricamente probablemente lo hicieron, pero no lo explotan porque generarías rom no aprobechables en GBA.nuive
explicaba de la GB/C, el banking, por ejemplo). El problema es que para la GBA esa estructura no está implementada. Sería como diseñar un nuevo concepto
de ROM, un concepto en el que los 16 primeros mb se mantengan en memoria y se vaya cambiando de banco en los 16 siguientes como hace la GB. Sí, se podría,
pero sería eficiente? Funcionaría? Ni idea... quizás ya lo haya probado alguien por ahí, es muy probable, pero si a día de hoy no se implementó supongo
que es porque por lo que sea, no compensa.
nuive
CFRU es open source pero lleva bastante tiempo desatendido. Al final es algo que se hizo principalmente para Pokémon Unbound, y el desarrollador decidió
liberarlo como expansión. Además yo todo lo hice en ensamblador y CFRU es C. Escribí al desarrollador porque una vez hecho en ensamblador portarlo a C
es simple, pero como no mostró ningún interés pues...
nuive
Radical Red no es open source. Si lo fuera, podría directamente coger su código, modificarlo, y aunque no quisieran añadirlo al master, siempre sería tan
simple como combinar cambios en cada nueva versión y corregir lo que hubiera que corregir. Mi ofrecimiento fue el mismo, aportar tanto mis modificaciones
en ensamblador como en C para acoplarlas al juego (aún no siendo open source) pero es lo que digo, ni caso.
nuive
No tengo problema en añadir la ROM modificada al primer post. De hecho estoy arreglando un problema de sonido porque a veces, por algún motivo que desconozco
petardea bastante incluso con sonidos originales de Rojo Fuego cuando el propio Rojo Fuego no lo hace. Una vez solucione esto (si se puede) lo añadiré.
nuive
La diferencia parece una tontería pero es muy importante. Si se crea un módulo Lua en DLL, al margen de que sea compatible con versiones de Lua, por ejemplo,
desde 5.1 a 5.4 siempre pedirá la DLL para la que se vinculó, por ejemplo Lua 5.1. Eso es un poco desastre, porque en el caso de mGBA, por ejemplo, que
ya integra Lua sin requerir DLLs, para este tipo de módulos tienes que incluir una DLL de algo que el propio emulador ya integra en su ejecutable. Es por
esto que yo estoy totalmente en contra de esta decisión y prefiero utilizar las DLL originales de C y vincularlas a Lua mediante un .lua que puedo editar
para diferentes versiones sin necesidad de añadir bibliotecas redundantes.
nuive
Si no fuera porque rebajarme a ese nivel me parece penoso, los animaría a probar a diseñarlo ellos mismos.
nuive
Siento el doble post, pero creo que esto merece el suyo propio.
nuive
Lo importante de esto es que... bueno, en la lista de objetos, solo estas modificaciones redujeron los 70 y pico ms del mGBA a una media de 30, lo que
es algo menos de la mitad. No quiero prometer nada puesto que estoy haciendo pruebas, pero está claro que el lag de mGBA está en como accede a la memoria
de las consolas. Lua funciona todo lo rápido que debería, el problema parece que está en que el emulador tiene lag con las llamadas externas a Lua, aunque
se hagan desde el propio motor. Ahora bien, no sé hasta que punto esto se puede optimizar más, si la optimización será igual de potente que hasta ahora,
no sé como tomará esto el buscarrutas... Pero la cosa es que con un par de cambios las cosas pintan muchísimo mejor.
nuive
De todos modos, ahora que sé donde está la raíz del problema lo comunicaré en el discord de mGBA. Imagino que a los desarrolladores les interesa tener
un emulador optimizado.
nuive
Edito: Efectivamente, ya me respondió el desarrollador principal de mGBA bastante alarmado por el overhead que supone esto. Hice pruebas con VBA-RR usando
tanto LuaJIT como Lua 5.1 y es muy gracioso lo que pasa. Mientras que en mGBA esas modificaciones alteraron el rendimiento haciendo que tarde menos de
la mitad, en VBA con ambas variantes de Lua lo máximo que conseguí en un momento muy puntual fue una variación de 5 ms. Así que sí, confirmado. El problema
está en como mGBA accede a la memoria.
sanslash332
Se entiende perfectamente el cómo se hace. Se reemplazan llamadas a funciones (o expresiones) por una llamada a una nueva función en un espacio libre, donde se coloca el código nuevo, y bueno. parte del código reemplazado si es que se necesita.
Supongo eso sí, que tienes que hacer que coincidan, al menos en cantidad de bits a utilizar las llamadas a las funciones. para poder hacer un reemplazo limpio en el espacio acotado del espacio cambiado.
¿Esto no tiene problema cuando tienes que llamar a una función con parámetros?
O lo que reemplaces sea algo con parámetros.
¿En ese caso no te toca ser mucho más cuidadoso con el juego de movimiento de las firmas de las llamadas?
O incluso te podría tocar hacer un reemplazo más grande para poner parámetros en espacio de memoria que la función llamada luego pueda leer.
Es... interesante el rompecabezas que se arma ahí. muy interesante.
sanslash332
¿Las consolas más nuevas como ds / 3ds tendrán ese mismo tipo de limitaciones?
O ya tratarán al carcucho más como un disco y podrán intercambiar datos con el cartucho de manera mucho más libre y sin esos límites.
Es muy interesante.
sanslash332
Bueno, siempre tienes la alternativa de volver a hacer los gritos de pokemon como se hacían en gb/gbc.
Que no eran archivos de sonido directamente, sino que eran una función de reproducción de ciertos patrones de sonidos sinusoidales, los cuales eran modificables por parámetros. que cambiaban velocidad, pich, si eran más planos o móviles. etc.
Eran como... 13 o 16 funciones y así hicieron los sonidos de los 151. jajaja.
Hay hasta en javascript programadas esas mismas funciones.
sanslash332
teóricamente probablemente lo hicieron, pero no lo explotan porque generarías rom no aprobechables en GBA.
Al menos claro no sé, que funcionase directamente con alguna función especial...
Tipo... algo pensado para trabajar con algún tipo de flashkart, que dada cierta instrucción, el procesador de la flashkart cambie un espacio de la memoria rom con el contenido de un archivo cargado desde la sd.
Y se guarde precisamente un espacio chiquito de la memoria para mandarle esas isntrucciones al procesador interno que suelen tener las flashKarts.
Así hackroms grandes serían compatibles con emulador (que implementase ello, obviamente) y los modelos de flashkarts que implementasen ese protocolo.
Supongo que es parecido a lo que hicieron con la extención MSU1 para la snes. Que funciona tanto en flashkarts como emuladores para básicamente. reproducir música mediante streaming durante el juego.
sanslash332
¿Y forkearlo derechamente?
Si ya está tirado ¿por que no sacas tu fork?
O buscar un fork que tenga desarrollo activo. si tantos hackroms lo usan, alguien debe de estar toqueteándolo. con la constate salidas de generaciones pokemon y cosas así
sanslash332
Eso es interesante...
No sabía que podías compilar módulos lua a DLL directamente.
¿Esos dlls resultantes son exclusivamente de uso para lua? O igual siguen siendo dlls normales y si incluyesen más funciones que el módulo lua son importables por otro tipo de programas?
sanslash332
Por cierto, hace unos días andaba pensando...
Si los juegos de pokemon están ya ultra desensamblados. con código c inclusive...
¿por qué no han salido ports para pc funcionales al 100%?
Si hay ports de juegos como el mario64 o el zelda ocarine of time. Que se construyeron a partir de desensamblajes y el código sacado desde las entrañas de nintendo...
¿por qué con los pokemon no han intentado lo mismo si ya tienen juegos absolutamente compilables?
Con los disasembled projects, puedes bajarlos, correr un compilador y generar los archivos .gba.
¿Nadie ha modificado ese código fuente para vincular las funciones importantes a librerías gráficas de pc para generar el juego con un ejecutable directo?
POrque... vamos, si hiciesen eso, meterle accesibilidad sería... algo más interesante de programación directa.
sanslash332
Igual, es como te dije xd; lo redujiste a la mitad, entre 30 a 40 ms. Pero si lo revisas en tus propios números, eso sigue siendo aún peor que el escenario no obtimizado del VBA-RR jajajaja.
ojalá se pudiese correjir aunque sea un poco el m-GBA para que esos números desendiecen; por tu parte al menos lo has optimizado mucho, pero mucho.
sanslash332
¿Dijo que tenía alguna idea de por donde comenzar a atacarlo?
¿Te han dicho algo más sobre ello?
Porque será muy interesante ver como sigue evolusionando