› Foros › Retro y descatalogado › Consolas clásicas
theelf escribió:En general se programaba de forma exactamente como ahora, un ordenador, un teclado ,un sdk, documentos tecnicos y un manual de asm
Lo mas normal eran los dev kit, aunque habian formas genericas
Si preguntas cuales, asi q recuerde, pues capcom uso las x68k, la teradrive tenia un sdk para desarrollar en megadrive, y ese PC lleva un x86 y dos
Sobre graficos, existen herramientas muy potentes en todos los ordenadores de la epoca.La misma teradrive traia un buen editor grafico por ejemplo
La Famicom es una de esas consolas chungas, xq nintendo sirmpre fue muy cerrada.Normalmente solo con devkit oficiales
De forma casera, el famicom basic y la sc-3000, son un genial ejemplo de desarrollo prehistorico
Pac-Boy escribió:hahaha icecaap, me ha encantado tu mensaje. Me has recordado a esos programas de Discovery que hablan de las construcciones de los egipcios, los dinosaurios o de que como evolucionarán las especies dentro de millones de años (¡Futuro Salvaje!). Que a pesar de ser sólo hipótesis, lo afirman todo con una convicción que asusta.
KFR escribió:...y todo ello directamente contra el hard pero ahora mismo se suele requerir que todo sea portable y ejecutable en toda plataforma viviente e incluso online, a eso sumar carga de diferentes tipos de texturas, modelos poligonales, texturizado y renderizado tanto 2d como 3d, control de perifericos, juego online, bases de datos, etc etc etc...que te puedes hacer tus propias herramientas? si, que vas a usar librerias de terceros en muuuuuuchisimos puntos? tambien.
El director de las cinemáticas de Halo 3, CJ Cowan, ha reconocido que el desarrollo de Halo 2 no fue llevado a cabo de manera "excesivamente eficiente" en una entrevista concedida a Next-Gen.biz. La programación de la secuela tuvo varios problemas ya que "en Halo 2 no teníamos ni idea de cuál eran los plazos, ni si estábamos cumpliendo los plazos o si estábamos con retraso (...) Hasta la preproducción de Halo 3 todavíamos teníamos la mente de unos chicos en un sótano que intentaban hacer juegos, aunque teníamos un equipo de 60 o 70 personas", añadió el alto cargo de Bungie.
Con Halo 3, la mejoría fue sustancial, ya que "tenía una etapa de preproducción realmente definida, por lo que todo el equipo contaba con una visión confiada y compartida de lo que el juego iba a ser antes de que empezara el auténtico desarrollo. Suena a sentido común pero Bungie no solía hacer las cosas de esa manera." Cowan añadió que "Halo 3 fue un juego mucho más fácil de programar en términos de nivel de estrés".
KFR escribió: Porque entre prisas, pruebas, apaños para solucionar bugs, problemas imprevistos etc.. pues...al final la maxima es "el juego hay que terminarlo".
KFR escribió:Funciones funciones...a lo que estamos acostumbrado a dia de hoy pues no seria parecido xD asm es otro mundo
;============================================================
;tilemap data decompression routine from Sylvan Tale
;
; DATA is stored into RAM, not VRAM. can be modified to do so but have to read from vram.
;
; Hl = address of compressed data
; DE = RAM address to load data into
SylvanTaleTilemapDecompression:
--:
ld c,(hl) ; load control byte
inc hl ;
ld b,$08 ; repeat 8 times
-:
rr c ; evaluate a bit from control byte
jr nc,TD_decomp ; if bit 0 load new pointer
ldi ; (de) = (hl)
inc bc ; restore bc from the ldi
jr + ;
TD_decomp: ; loads new source pointer + count byte
push bc ;
ld c,(hl) ;
inc hl ;
ld b,(hl) ;
inc hl ; bc = (hl)
ld a,c ;
or b ;
jr z,TD_exit ; finish if bc = 0;
push hl ;
ld a,b ;
or $f0 ;
ld h,a ;
ld l,c ;
add hl,de ; hl = de + (bc OR $f000) = new pointer
ld a,b ;
and $f0 ;
rrca ;
rrca ;
rrca ;
rrca ; a = high nibble of b
add a,$03 ;
ld c,a ;
ld b,$00 ; counter = high nibble of b + 3
ldir ; load out previous data
pop hl ; restore pointer
pop bc ;
+
djnz - ;
jr -- ;
TD_exit:
pop bc ;
ret ;
icecaap escribió:Y lo de decir "en 6 meses tiene que estar acabado el juego/aplicación", sin hacer un estudio de estimación de costes/tiempo siempre ha pasado, o si no que se lo digan a tito Gates que lo hacía mucho
Si, cierto y conozco la forma de funcionar porque ando pooooooco a poco estudiando asm para z80 y hombre...funciones funciones...para mi son como los "go to" de otras lenguajes o lo que es lo mismo, una mierda pinchada en un palo en lo que a estructura y funcionalidad se refiereicecaap escribió:Hey! Que "funciones" también había en asm a base de labels y saltos
Sobre el juego Isometrico que comenta Raúl, al final no salió como Pinocho. Recuerdo que después de hacer 100 pantallas me hicieron diseñar otras 100 más y hacer cambios para que saliera como Pinocho, pero luego no lo sacaron. Isidro estaba haciendo la mili y en el permiso de verano se pasó veintitantos días en la oficina programando el juego y yo haciendo los gráficos y las pantallas isometricas. Recuerdo que las mapeaba en un Amstrad con un mapeador que hizo Isidro. Los gráficos los hice también en un Amstrad en el modo que tenía los pixeles cuadrados, creo recordar que era el modo1. Varios años más tarde le hicimos un reskin con gráficos más grandes y lo volvimos a intentar vender. Lo compró Laguna pero nos hizo hacer cambios para adaptarlo a la licencia de los Ottifantes. Al final la paradoja fue que como Infogrames compró Laguna y el juego ya estaba firmado lo tubo que sacar la misma empresa que no quiso el Pinocho.
magno escribió:Desde mi experiencia de 10 años ya haciendo "ingeniería inversa" a muchos juegos de RPG de SNES, tengo una ligera idea de cómo se programaban los juegos antes, y me lo llegó a confirmar un interesantísimo artículo que leí hace unos meses en el que el jefe de programación de Secret of Evermore hablaba de cómo se hizo el juego.
Más o menos, se hacía así:
* En primer lugar, nada de lo que se iba a programar se "compraba" a otros: ni físicas, ni "drivers" ni nada por el estilo, al menos entre los 4 juegos que yo he visto de Squaresoft, que a pesar de ser de la misma compañía, lo hacían grupos diferentes. En los 6 juegos (Chrono Trigger, Secret of Mana, Seiken Densetsu 3, Romancing Saga 3, Final Fantasy 6 y Treasure Hunter G), solo he visto en común ¡¡1 RUTINA!! y ni tan siquiera está programada igual (es decir, se nota claramente que la hicieron dos personas diferentes a pesar de ser el mismo algoritmo). Esta rutina era una rutina de descompresión de datos genérica.
* El director encargaba a cada grupo que se encargara de una cosa: unos diseñaban los mapas y los gráficos para ellos, otros diseñan personajes y mostruos y otros componen la música. Todo esto se hace en ordenadores dedicados a ello y no tiene relación en primer lugar con el código programado.
* Cada grupo de programación se encarga de programar en código los efectos gráficos (magias, efectos de lluvia, deformaciones y demás), los menús, las rutinas de audio (lo que vendrían a ser "drivers" de audio que se encargan de cargar en la APU las muestras de audio), las rutinas de video (acceso a VRAM, OAM para sprites y ceran el "driver" de video que se ejecuta en cada NMI, es decir, en cada VBlank) el motor de animación y el motor principal del juego.
* Cuando los gráficos se van definiendo en cuanto a tamaño de sprites, tamaño de mapas y demás, los grupos de programación van adaptando el código generado a las necesidades concretas: parámetros a pasar para las animaciones, parámetros para seleccionar músicas o sonidos, formato del script de texto y de comandos...
* Lo que programan los programadores son funciones grandotas que van llamando a otras menores para realizar el trabajo específico. Por ejemplo en el FF6 y en el RS3, el banco $C3 tenía TODO el código para los menús: cuando se pulsa el botón START, el motor principal del juego llama a la rutina $C3/0000 que toma el control para dibujar los menús, elegir las opciones que selecciona el usuario, cambiar items, equiparlos, etc. Estas rutinas modifican las variables globales que contienen el equipamiento, HP, MP, modificadores al estado, parámetros del personaje, etc, es decir, las mismas variables globales que se graban en SRAM para luego continuar la partida. En estos dos juegos, el banco $C5 contenía todo el driver de sonido, de modo que si hay que reproducir un sonido cuando mueves el cursor, las rutinas de $C3 llaman a la correspondiente en $C5 que hace que suene el sonido de aceptar, cancelar o simplemente el "cling" típico al mover el cursor.
* En cuanto al motor del juego, es un bucle infinito que va ejecutando 4 ó 5 rutinas una detrás de otra para que el juego funcione:
1) comprueba la posición del personaje y la acción que haya ejecutado (hablar con alguien, mirar un cofre, luchar)
2) comprueba si la acción va acompañada de un sonido
3) actualiza el sprite del personaje en la posición que corresponda de la animación
4) actualiza el estado de la inteligencia artificial (posición de enemigos, acciones que ocurren en paralelo, etc)
El motor del juego, en el caso del Secret of Evermore y según las palabras de su propio programador jefe, iba ejecutando los comandos que se metían en un lenguaje de scripting que ellos mismos habían creado para el juego. Este lenguaje, convertido en pseudo-código sería:
- <SET_GRAPHIC_MAP 0x54>
- <SET_TILEMAP 0x31>
- <SET_NPC 0x10>
- <SET_EVENT 0x07>
BUCLE
- <UPDATE_GRAPHICS>
- <UPDATE_NPC>
- <UPDATE_CHARACTERS>
- <CHECK_INPUT>
- <BRA BUCLE>
- <IF SALIDA_IZDA = 1 GOTO XXXXX>
- cosas a hacer si el personaje sale por la izquierda del escenario
XXXXXX
- <IF SALIDA_DCHA = 1 GOTO YYYYY>
- cosas a hacer si el personaje sale por la derecha del escenario
............
Por ejemplo, para una de las escenas del juego donde el personaje se mueve por la ciénaga, se cargan en VRAM los gráficos (bloque 0x54, que podría estar comprimido en ROM), carga la configuración del tilemap que contiene la posición en pantalla donde van esos gráficos (bloque 0x31 con la información de la posición de cada tile en pantalla), carga la lista de enemigos presentes o de otros personajes no manejados por el jugador (lista de enemigos 0x10) y crea la lista de eventos, es decir, las posiciones donde el jugador interactúa (lugares donde hay escondidos materiales para la alquimia, salidas del escenario, personajes con los que se habla) y luego entra en un bucle en el que se actualizan los gráficos del escenario (animación de la hierba, árboles...), los gráficos de los enemigos, los del personaje principal y el perro y por último, comprueba la pulsación del mando para saber dónde mover el personaje en el siguiente frame, o si se ha salido del escenario, etc...
Todo este script de comandos se codifica luego en hexadecimal y tiene esta forma:
- 0x00 0x54
- 0x01 0x31
- 0x02 0x10
- 0x03 0x07
- 0x10
- 0x11
- 0x12
- 0x13
- 0x80 0xFB
Así, las rutinas del motor lo que hacen es ir leyendo este código hexadecimal de esta forma:
* Leo un 0x00, así que sé que es la rutina que vuelca a VRAM los gráficos
* Al ejecutar esa rutina, necesito un parámetro para saber qué gráficos son los que vuelco a VRAM, y ese parámetro es 0x54, por lo que accedo a un array en ROM y en su posición 0x54 obtengo el puntero donde empiezan los datos gráficos en ROM (comprimidos o no)
* Luego leo un 0x01, que es la rutina que crea el tilemap de los gráficos
* Al ejecutar esa rutina, necesito un parámetro de nuevo para saber cuál es la composión exacta del tilemap, y ese byte es 0x31, por lo que accedo a otro array diferente en ROM donde obtengo el puntero a una tabla en ROM que es el tilemap
* Y así sucesivamente hasta que se acaba el script que es cuando se ha terminado el juego.
Este tipo de script de comandos puede estar separado del script de texto con todo el diálogo, como en el caso del Final Fantasy 6 o del Secret of Evermore, o bien mezclado todo en el mismo script, como en el Treasure Hunter G, o mitad y mitad, como en el RS3, que el script de comandos hace cosas genéricas y luego en cada escena le "pasa el control" al script de texto para decidir qué ocurre según los personajes que hayan en el grupo y qué cosas ha de decir cada uno.
En cuanto al lenguaje de programación, normalmente todas las rutinas se hacen en ASM, intentando que no sean muy largas para evitar complicarlas. Por ejemplo, en el Treasure Hunter G, el motor principal parece claramente creado en C, puesto que por aquella época ya era bastante popular y además se nota en la forma de pasar los parámetros a las rutinas. Sin embargo, cada rutina que ejecuta una pequeña acción en concreto, como descomprimir los gráficos, descomprimir los tilemaps, actualizar la posición de los sprites y tal, están claramente programadas en ASM, ya que la forma de pasarle los parámetros no es la misma que la de las funciones principales.
Espero que no os haya liado demasiado y que os haya parecido interesante
naxeras escribió:No sabía que en SNES habían llegado a programar en C, imaginé que no se hacía por rendimiento.
magno escribió:Desde mi experiencia de 10 años
..........
..........
..........
ya que la forma de pasarle los parámetros no es la misma que la de las funciones principales.
Espero que no os haya liado demasiado y que os haya parecido interesante