Autor Tema: Pokes para todos: la historia detrás de "Knights & Demons"  (Leído 5626 veces)

Baron Ashler

  • Desarrolladores
  • Commodorero
  • ******
  • Mensajes: 40
  • SHIFT+RUN/STOP
    • Ver Perfil
    • Kabuto Factory
Muy buenas :)

Tal como amenacé en mi post de presentación, aquí vengo a contaros mis desventuras a la hora de programar nuestro primer juego para C64, "Knights & Demons". Puede que encontréis interesante este post porque es posible que os venga bien a los que empezáis a programar en C64 y/o vengáis de otros sistemas ;), a otros os hará recordar cuando empezasteis a trastear con este ordenador... otros, los que tengais más experiencia en programación, os echareis las manos a la cabeza por las burradas técnicas que pueda cometer ("pero donde vas, chiquillo, que eso no es así..." jajajaja).

Antes de empezar el rollo, os dejo los dos txt con el código fuente de ambos juegos, por si os apetece echarles un vistazo ;)
http://www58.zippyshare.com/v/23757683/file.html
... y el link para que os descargueis los juegos, por si no habeis leido mi post de presentación :)
http://kabutofactory.netne.net/index.php/juegos/10-los-buenos/16-nuevas-conversiones-para-c-64-y-zx81

Yo no tuve un Commodore de pequeño... a mi me tocó un Spectrum +2A en las navidades del 87, aunque tuve la suerte de tener amigos en todos los bandos. Uno de ellos, me invitó a su casa para enseñarme su C64. Tenía una colección monstruosa de juegos (tanto originales como piratas)... total, el tío pone a cargar el "Robocop" de Ocean (original)... cuando sonaron los primeros compases del "Ocean loader" de Johnattan Dunn lo único que acerté a decir fue "hos*** pu**!!!". Un ordenador maravilloso; desde entonces, cada vez que escucho esa melodía se me ponen los pelos como escarpias... Ya desde nuestro primer juego, "Aahku al rescate", tuvimos la intención de hacer algo para Commodore... pero me echó para atrás el Basic; pensaba que hacerlo todo a base de pokes era algo bastante engorroso. ¿Y por qué ahora con "Knights & Demons"? Pues, primero porque ahora tenemos un poquito más de experiencia con otros basics (cuando programé Aahku solo conocía el Sinclair Basic y muy poquito el Locomotive del Amstrad); y segundo, un juego de puzzle es más sencillo para iniciarse en otras plataformas porque no tienes que estar pendiente de rutinas de movimiento, detección de colisiones y esas cosas.

Todo empezó porque tenía en un .txt el código de la versión de MSX, pero no tenía ganas (ni tiempo) de ponerme a teclear en un emulador... hasta que, por casualidad, encontré el Tok64, un curioso programita MS-DOS que te transforma el código que tengas en txt a prg :D Era lo que necesitaba. Agarré el manual de usuario del C64 y empecé a estudiar como funcionaba el tema... a ver... donde están los LOCATEs... ¡No hay LOCATEs! Y ahora, ¿como sitúo algo en  cualquier lugar de la pantalla?... "si, bueeenooo, tenemos el comando TAB... también puedes utilizar los tokens ASCII (ver el manual de usuario para saber que es lo que son) tales como el carácter HOME, los cursores"... No, para un juego no me sirve... "bueeeno, también están los pokes"... Eso ya es otra cosa. La memoria de pantalla del Commodore 64 se estructura en un mapa de direcciones con la 1024 como dirección de inicio. Teniendo en cuenta que la pantalla de texto es de 40x25 caracteres, si queremos colocar algo en pantalla solo tenemos que hacer POKE 1024+x+40*y,codigodelcaracter (donde x e y hacen referencia a las posiciones numéricas de fila y columna)... "si, pero mi gráfico es de 2x2 caracteres". Pues nada, toca utilizar 4 pokes para dibujar el "muñequito". El color funciona tres cuartos de lo mismo. Al pokear el color de la tinta (poke en 53281), lo hacemos para todo lo que haya en la pantalla (mira... como en MSX...), además de lo que vayamos a poner... no queda bonito un juego monocromo, ¿no?. Aquí tenemos dos alternativas: los tokens ASCII de color dentro de un PRINT (eso lo usaremos para los textos) y los pokes (que los usaremos para los graficos del juego). Los POKES para el color funcionan como los de posición pero a partir de la dirección 55296, es decir, POKE 55296+x+40*y,codigodelcolor... si tu personaje tiene varios caracteres de colores distintos, pues ya sabes, tantos pokes como colores necesites.

Hasta aquí fue todo más o menos bien, pero el manual del C64 no me explicaba algo que en Spectrum, Amstrad y MSX ya sabía a la perfección: utilizar los caracteres definidos por el usuario (UGD) para los gráficos del juego. Así que la primera versión, con los caracteres ASCII estandar del C64 como gráficos, resultó jugable pero más fea que pegarle a un padre... mirad que belleza :P...



No me podía que creer que el C64 no tuviera UGDs... mira que me harté de buscar por San Google y en algunos foros como el de Lemon64; hasta que dí con el "Programmers Reference Guide" en Commodore.ca. Capitulo 5, Advanced Color and Graphics Commands... Gloria bendita!!!! :P A diferencia de Spectrum (tiene un espacio reservado de 21 caracteres definibles), Amstrad o MSX (en ambos, puedes "pisar" el juego de caracteres en ROM con los tuyos propios), para el Commodore hay que hacer una cosa cuanto menos curiosa: copiar a una posición de memoria todo el juego de caracteres en ROM, para posteriormente poder redefinirlos e indicarle al ordenador mediante pokes que tenemos que usar ese juego de caracteres y no el de la ROM... pufff, que lío :P ... para colmo, los caracteres no los podemos copiar en cualquier lugar de la memoria, tenemos que copiarlos en unos bancos de memoria específicos (hay 14 disponibles) que se encuentran a partir de la dirección 2048. En el manual te recomiendan que utilices bancos de memorias altos, ya que la 2048 es la dirección en la que empieza el programa BASIC que vayamos a crear y pueden haber conflictos... yo utilicé el banco 14 (a partir de la dirección 14336).. y aun así tuve problemas... como el programa ocupaba más de 12kb, se "pisaba" con el espacio reservado para los caracteres y cuando empezaba el juego se llenaba la pantalla de glitches... madreeee, que desastreeee! Total, a recortar tamaño... empecé por quitar todos los espacios en el código; como vi que era insuficiente, empecé a recortar textos y, al final, me pasé recortando y quité también la animación de la transformación de las fichas... aunque eso ultimo me vino bien, porque tampoco aportaba nada y enlentecía el juego (si veis en el listado del juego un montón de lineas RETURN seguidas, ahí era donde estaban las rutinas de transformación... las dejé para no tener que liarme a cambiar gosubs :P)



Por fin, ya teníamos gráficos, un poco "spectrumnianos", pero son nuestros demonios y nuestros caballeros ;) Puse las imágenes del work-in-progress en nuestro facebook y Fog (de los foros de World of Spectrum) me comentó que podía transformar los gráficos a multicolor desde Basic y que podía compilarlo para ganar velocidad. Lo del multicolor fue otra historia que también tiene su miga... tras otra entretenida lectura al "Programmers Guide" conseguí entender como iba el asunto. El Commodore tiene dos modos gráficos: uno de caracteres y otro de sprites... el de sprites no lo voy a tocar, primero porque no me servía para este tipo de juego, y segundo porque desconozco como va. El de caracteres, a su vez, tiene dos modos: el hi-res (alta resolución pero con solo dos colores por caracter, uno para tinta y otro para el fondo, como en Spectrum) y el multicolor (de más baja resolución, pero con cuatro colores por carácter). Es interesante saber que cambiar del modo hi-res al multicolor era tan sencillo como utilizar un par de pokes para activar el modo e indicarle al sistema cuales eran los otros dos colores que íbamos a utilizar... sin embargo, aplicar los colores a los caracteres era otro cantar.

El modo multicolor funciona de la siguiente manera: una vez activado, todo lo que tenemos en pantalla pasa a tener una resolución más baja porque agrupa cada dos pixeles a uno solo con color. Me explico, todos sabemos que un carácter es un bloque de 8x8 pixeles que puede tener dos valores: 1 o 0, pixel o no-pixel. El multicolor mode lo que hace es transformar el bloque de 8x8 en uno de 4x8, agrupando los pixeles de dos en dos y asignándoles el color que previamente hayas indicado en función de la combinación binaria de estos dos pixeles, a saber: 0-0 para el color de fondo, 0-1 para el multicolor1, 1-0 para el multicolor2 y 1-1 para la tinta... ¿seguís ahí? ¿os habéis perdido? ¿no? Pues ahora viene la segunda parte: recordáis el poke para pintar el carácter de un color, ¿no? el 55296+... Pues bien utilizamos el mismo poke, solo que los códigos para el color varían un poco; si utilizamos los valores del 0 al 7 pintamos el carácter en modo hi-res con el color correspondiente, mientras que si utilizamos los valores del 8 al 15 pintamos el carácter en low-res con el color correspondiente junto con los otros dos colores que faltan (por ejemplo, si utilizamos el valor 2, pintamos el carácter en hi-res en color rojo, mientras que si utilizamos el valor 10 pintamos el carácter en multicolor con color rojo para la tinta, junto con los dos otros colores que previamente hayamos definido)... por eso, en nuestro juego aparece en la misma pantalla elementos en alta resolución, como los marcadores o el cursor, junto con elementos multicolor, como las fichas de juego (demonios y caballeros).



Lo del multicolor terminó saliendo, pero, por desgracia, lo del compilador no funciono. Probé con el Basic Boss Compiler, el Blitz y el Basic 64 Compiler... ná, un mojón pa mi. También intenté buscar información sobre como meter pantallas de carga, y dí con los tape loader (TapGen, Tape Master Pro...), pero claro, como no conozco bien como funciona el C64, no conseguí nada de ellos. Aun así, con el bloque de Basic pelao y sin pantalla de carga, creo que el juego está bastante "potable" :D. Otra cosa es el "A.R.C.O.S.", que aun siguiendo la misma estrategia estrategia txt+Tok64 y analizando un poco como hacer una rutina de detección de colisiones (muy simple y similar a otros sistemas como el MSX o el ZX81, PEEK a la posición de pantalla que me devuelve el valor del carácter ASCII que la ocupa, y un IF con el valor para hacer la colisión...), poco he podido hacer con la extrema lentitud que sufre el juego...

... y ya contaré otro día mis peripecias con el C16... que ya habéis tenido bastante por hoy... :P

Muchísimas gracias por aguantar el tostón... :)
Baron.

marcos64

  • Commodore Master
  • *****
  • Mensajes: 2825
    • Ver Perfil
    • http://marcos64.orgfree.com/
Re:Pokes para todos: la historia detrás de "Knights & Demons"
« Respuesta #1 en: Junio 27, 2013, 09:44:07 »
Ante todo felicitarte por tu esfuerzo.

Lo que cuentas en algunos momentos me ha traido recuerdos  ;D

Aun asi hay algunas cosas como:

El Commodore tiene dos modos gráficos: uno de caracteres y otro de sprites...

que resultan curiosos  ;)


Hasta aquí fue todo más o menos bien, pero el manual del C64 no me explicaba algo que en Spectrum, Amstrad y MSX ya sabía a la perfección: utilizar los caracteres definidos por el usuario (UGD) para los gráficos del juego. Así que la primera versión, con los caracteres ASCII estandar del C64 como gráficos, resultó jugable pero más fea que pegarle a un padre... mirad que belleza :P...




Quizas puedas aprovechar esta version para realizar una conversion a PET, el BASIC es el mismo, creo que solo cambiarian las posiciones de memoria. Eso seria un puntazo  :D
http://marcos64.orgfree.com/
Actualizacion 22/4/2018: Actualizada Load'N'Run numero 5 con nuevos TAPs y PRGs.

Bieno

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 3123
  • PRINT"ADORA A TU COMMODORE"
    • Ver Perfil
    • bieno64
Re:Pokes para todos: la historia detrás de "Knights & Demons"
« Respuesta #2 en: Junio 27, 2013, 12:07:11 »
Excelente la narración y "puesta en escena". Me ha servido para refrescar, también, el tema de los sprites.

Carlos

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 638
    • Ver Perfil
Re:Pokes para todos: la historia detrás de "Knights & Demons"
« Respuesta #3 en: Junio 27, 2013, 12:38:12 »
.... El Commodore tiene dos modos gráficos: uno de caracteres y otro de sprites...

Esto no es correcto, el commodore tiene modos gráficos tipo carácter y tipo bitmap, concretamente son 5:

-Modo carácter (3)
            Modo carácter hires
            Modo carácter multicolor
            ECM (Extended Color Mode)
-Modo bitmap (2)
            Modo bitmap hires
            Modo bitmap multicolor

Los sprites son algo independiente, pueden convivir en cualquiera de los 5 modos.
« última modificación: Junio 27, 2013, 14:54:22 por Carlos »

Bizbyte

  • Commodorista
  • ***
  • Mensajes: 58
  • SYS 0
    • Ver Perfil
Re:Pokes para todos: la historia detrás de "Knights & Demons"
« Respuesta #4 en: Junio 27, 2013, 18:46:30 »
Felicidades por el juego!  :), y gracias por compartir tus experiencias en el desarrollo del mismo.

Baron Ashler

  • Desarrolladores
  • Commodorero
  • ******
  • Mensajes: 40
  • SHIFT+RUN/STOP
    • Ver Perfil
    • Kabuto Factory
Re:Pokes para todos: la historia detrás de "Knights & Demons"
« Respuesta #5 en: Junio 28, 2013, 10:09:19 »
Buenas!

Gracias a todos por vuestros comentarios.

@marcos64: la versión con los carateres ascii no la conservo. Tengo la mala costumbre de reemplazar las versiones antiguas con lo nuevo que voy programando. Pero si tu me dices que el basic es el mismo que el C64, pues no me importaría hacer un port para PET. El problema sería la memoria: el K&D en su versión de C64 son unos 10-12kb mas o menos, y el PET me parece (corregidme si me equivoco) que tiene 4kb, como el VIC-20, no?

@carlos: es verdad, gracias por la puntualización. Los que venimos de Spectrum (que solo tiene un modo y es mixto para caracteres y graficos) o de Amstrad (que tiene tres modos, pero que también son mixtos) nos hacemos un lío con tanto modo (por lo menos yo, que soy especialmente torpe :P)

@bieno y bizbyte: gracias. Que no os quepa duda que este será nuestro primero de muchos juegos para este magnífico sistema ;)

marcos64

  • Commodore Master
  • *****
  • Mensajes: 2825
    • Ver Perfil
    • http://marcos64.orgfree.com/
Re:Pokes para todos: la historia detrás de "Knights & Demons"
« Respuesta #6 en: Junio 28, 2013, 13:06:07 »
El PET original si que tiene 4KB pero enseguida lo ampliaron a 8KB. De todas formas lo mas comun es que tengan 32KB, al menos eso creo. Ten encuenta que hay muchas variantes del PET (que en Europa se suelen llamar CBM).

Igualmente los primeros PET tienen el BASIC 1 pero los posteriores tienen el BASIC 2 y los ultimos BASIC 4 (que tiene retrocompatibilidad con el 2).

El VIC20 tiene 5KB pero las ampliaciones de memoria eran y son muy comunes.

Tambien hay que tener en cuenta que los primeros PET tienen pantalla de 40 columnas y los posteriores de 80 columnas.

Segun tengo entendido el PET (o CBM) mas comun es el 4032: 40 columnas, 32KB y BASIC 4. Seria una buena eleccion. De todas formas puedes trastear con todos los modelos en el VICE.
http://marcos64.orgfree.com/
Actualizacion 22/4/2018: Actualizada Load'N'Run numero 5 con nuevos TAPs y PRGs.

Errazking

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 762
  • SYS 0
    • Ver Perfil
Re:Pokes para todos: la historia detrás de "Knights & Demons"
« Respuesta #7 en: Octubre 12, 2015, 20:36:04 »
Baron, no es por tocar las narices, que también, pero el enlace al txt con el listado del programa ya no funciona.
¿Podrías volver a subirlo?
No sé si se podría poner en el ftp del foro...
Gracias de antemano... ;)

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 11069
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Pokes para todos: la historia detrás de "Knights & Demons"
« Respuesta #8 en: Octubre 12, 2015, 20:38:54 »
Se podría adjuntar al foro. De todos modos si el juego está hecho en BASIC sería suficiente con parar el programa ¿no?

Errazking

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 762
  • SYS 0
    • Ver Perfil
Re:Pokes para todos: la historia detrás de "Knights & Demons"
« Respuesta #9 en: Octubre 12, 2015, 20:40:44 »
No se me había ocurrido, gracias por el appunte josepzin...;)

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1013
  • SYS 8*4096
    • Ver Perfil
Re:Pokes para todos: la historia detrás de "Knights & Demons"
« Respuesta #10 en: Octubre 12, 2015, 20:46:49 »
Si está protegido contra run/Stop no podrás.
La otra es poner el FC3, cargar el juego, reset y OLD para recuperar el programa.
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1018
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Pokes para todos: la historia detrás de "Knights & Demons"
« Respuesta #11 en: Noviembre 08, 2015, 15:20:51 »
Jolin,..no me habia dado cuenta de éste hilo, voy a leerlo y os cuento, que seguro que se dicen cosas interesantes..

   chao