@ agnasg

Misiones en khpx

27-04-2021 1:32 PM

Desde hace 4 años he estado desarrollando un juego espacial llamado khpx. En el enlace hay más información y hay una categoría de posts dedicados al juego.

En este momento, khpx es “a hard core low level full featured pixel art solo dev mmo space game” (traducción aproximada al español: “un juego de bajo nivel, con características avanzadas, diseño gráfico tipo pixel, desarrollado por un solo programador, multijugador ambientado en el espacio

En este post voy a hablar de misiones, o quests como se llaman en inglés. khpx tiene como piedra angular los quests, como Wizard101 o World of Warcraft.

Hay varias formas de progresar en khpx, siendo las misiones la más fácil y accesible. Es posible seguir un camino separado sin hacer ninguna misión, pero conseguir algunos equipos y acceder a algunos planetas es mucho más difícil.

Quiero comparar las misiones de khpx con una misión de Runescape, el MMORPG medieval. No por alguna razón en particular, simplemente que es el juego que he estado jugando últimanente (dejé Wow al año pasado, luego del desastre de Shadowlands).

Runescape tiene sus peculiaridades. Puedes comer en medio de una pelea, lo cual te hace recuperar los hitpoints, es decir tu salud o vida. Puedes cambiar de armas inclusive en medio de la pelea. En ese sentido es bastante libre. Pero. Para tu inventario tienes solamente una bolsa de 28 posiciones. Eso es todo lo que puedes cargar. No puedes comprar una bolsa más grande, o más bolsas. Toda la economía gira alrededor de esta limitación lo que permite mantener la oferta de los recursos baja. Las libertades con las peleas se ven compensadas con esa y otras limitaciones no tan frecuentes o tros mmo. Me refiero a los combates a bajo nivel, mi personaje es nivel 36, no tengo idea cómo son las cosas más adelante.

Voy a tomar un quest de Runescape para mostrar la serie de pasos que hay que dar para completarlo, y comparar con los quests de khpx, para ver sus diferencias y similitudes. Pero no lo incluí arriba en la lista de juegos con muchos quests, porque en realidad se puede progresar en Runescape sin hacer quests.

Por ejemplo, el quest “El rescate del principe Ali“. Prefiero este quest porque su ejecución tiene más o menos sentido. Por el contrario, el quest Ernest el Pollo es de esos quests que rayan en lo absurdo, no porque uno de los protagonistas termina convertido en pollo, sino que en la búsqueda de los elementos para restituirle su forma humana, hay que resolver un puzzle de bajar y subir palancas, lo cual siempre es irritante, en mi opinión.

Voy a resumir rápidamente todo lo que hay para resolver el quest del principe Ali, para ver el nivel de complejidad involucrado:

  1. Tienes que hablar con el canciller Hassan, quien te explica que el principe Ali ha sido capturado y se encuentra cautivo en una prisión en el pueblo de Draynor. Te pide ayuda para liberarlo, y te dice que hables con Osman fuera del palacio.
  2. Osman te da algunas instrucciones y te dice que para más detalles hables con su hija Leela.
  3. Leela te dice que el plan es copiar la llave de la celda donde el principe está cautivo, disfrazarlo, sobornar al carcelero, para finalmente liberar al principe.
  4. Para ello debes conseguir 3 rollos de lana, cuerda, tinte amarillo, 1 fresa roja, un pote de harina, cenizas, un cubo de agua, arcilla blanda, una barra de bronce, 3 cervezas y 50 monedas. No, nada más.
  5. Tienes que pelear con los guardias nivel 21, o escabullirte dentro de la prisión.
  6. Con todo eso distraes a Lady Keli, quien tiene la llave, la engañas, ella te muestra la llave, le sacas una copia, regresas con Osman que te va a hacer la copia con la barra de bronce.
  7. Hablas con  Aggie (la bruja)  para que haga una pasta para cambiar el color de la piel del principe.
  8. De nuevo a la prisión, de nuevo peleas con con los guardias nivel 21, distraes al carcelero, lo sobornas con las cervezas, abres la celda, disfrazas al principe y le aplicas la pasta para cambiarle el color de piel.
  9. Sales de la prisión y regresas con el canciller quien te dará tu recompensa.

Por supuesto, todo eso no lo puedes hacer de la forma tradicional, así que necesitas una guía. En los viejos buenos tiempo de La aventura original, Galatea, y Leisure Suit Larry, se suponía que tú tenías que adivinar qué hacer en los quests, y descubrir los puzzles. Hoy en día, al menos en Runescape y World of Warcraft, eso es casi imposible. Porque, en el caso del principe Ali, y suponiendo que se te ocurre lo de disfrazarlo, ¿cómo vas a descubrir quién te puede hacer la crema para cambiar la piel? Concedo que la bruja que lo hace está cerca, pero imaginar el escenario es poco probable, a menos que comiences un interminable ensayo y error.

En khpx, los puzzles y misiones en general están diseñados en forma similar, con características de todos, incluyendo Wizard 101, otro juego que he jugado durante más de una década.

Galatea es un juego tipo parser, similar a “La aventura original”,donde parte del juego es adivinar cuál es el comando o frase que va a permitir avanzar en el juego. Yo he minimizado esto agregando una instrucción en cónsola que indica qué es lo que hay que hacer: “Hablar con Brat”, “Capturar nave TTPP-23”, “Regresar a Mirbel, hablar con Werzaat”. Así que no hay que adivinar, no se necesitan guías como con Runescape. En cierta forma es como Wizard 101, donde en pantalla aparece una flecha y una instrucción del siguiente paso que hay que dar. Si el jugador va a tratar de conseguir una guía para descubrir lo que hay que hacer, por qué no facilitar el trabajo y presentarlo en pantalla.

Esta mecánica es en el modo de dificultad “Normal”. Hay otros dos modos “Difícil” e “Imposible”, donde no hay ayudas visuales. Los jugadores tendrán que recurrir al wiki o a las guías o recordar cómo se hace en el modo normal (que no es necesariamente igual). Los 3 niveles de dificultad están presentes en la actual versión, no se si eso va a permanecer en el tiempo, pero sospecho que puede cambiar.

Como ejemplo, esta es la guía del quest “Los mools te hacen feliz” . Mools es una de las monedas en khpx. Hay 5 tipos de monedas, todas se pueden intercambiar entre ellas. La idea es utilizarlas como los tokens de Wow, como un mecanismo de controlar la economía. La tasa de intercambio varía dependiendo de la oferta y demanda entre ellas. Cada moneda se utiliza en un sector del cubo (un cubo es una región en khpx).

Esta misión tiene como objetivo la captura de un peligroso individuo llamado Neettu que está cortando las líneas de suministro al planeta Mirbel. Para ello, el jugador deberá conseguir un robot de combate tipo PHJM que realizará la captura del criminal. Pero conseguir el robot no será fácil, deberá conseguir un repuesto para el robot primero, llevando a cabo una mini-misión en la superficie del planeta, rescatando a un equipo táctico que se encuentra atrapado en la ciudad. Lamentablemente este equipo táctico se niega a ayudar al jugador a capturar a Neettu, por lo que su única alternativa es el robot de combate.

Guía para completar “Los mools te hacen feliz”

1) talk Brat              // Hablar con el npc la info. de la misión.
2) talk Lappone           // Otro npc con los detalles de la misión.
// Como vamos a llevar pasajeros necesitamos agregar un habit a nuestra
// nave, no viene por defecto. Se puede comprar o conseguir como botín
// al capturar naves. Poco probable pero posible.
3) status habitat         // Verificar el estatus del módulo habitat
5) engage Mirbel          // viajar al planeta Mirbel
// brat es el npc operador del planeta. Es un funcionario, se le llama
// genéricamente brat. Esto es común en el primer cubo, menos común en
// otras partes de la galaxia.
6) brat neettu            // preguntarle al npc "brat" por Neettu (otro npc)
7) talk noreen            // La que nos ayuda a conseguir el robot PHJM
8) capture TTPP-23        // capturar nave enemiga identificada con TTPP-23
// le entregamos el botin que capturamos y ella nos entrega el robot
9) talk noreen            // entregarle el botín de la nave TTPP-23
// pero hay un problema al robot le falta una pieza. Tenemos que regresar
// con brat para que nos ayude a conseguirla.
10) brat estetor          // Pregunt. Brat por el "estetor", parte de robot.
11) talk espiro
12) talk werzaat
// Usar el escanner de la superficie del planeta, localizar el área con
// código "airine"
13) scan map code airine 
// Mover el equipo táctico. Esta misión tiene un componente en la superficie
// del planeta, consiste en mover un equipo táctico de posición. Muy simple.
14) move team
// Más interacción con los npcs.
15) talk wezaat -> receive estetor
// Una vez entregado el "estetor" recibe un robot de penetración de 
// territorio enemigo para capturar al npc "Neettu".
16) talk noreen -> deliver esteror -> receive robot PHJM
// Usando nuevamente el escanner ubicar la zona Balbidere.
17) scan map code balbidere
// Capturar al npc Neettu utilizando el robot PHJM recibido en el pto 16 
18) capture Neettu 
// Hablar con Brat para recibir la recompensa.
19) talk brat -> profit

Cómo se puede ver la estructura es algo así como lo siguiente:

  1. Conflicto. Es el motivador. Lo que motiva a nuestro personaje. Tiene un componente de “drama”, “tragedia”, con un peligro inminente. Por supuesto, nosotros no vamos a arriesgar nuestro pellejo y perder tiempo sin una jugosa recompensa. A veces es solamente en dinero, pero también puede ser un equipo. En este caso, un potente robot PHJM que vamos a necesitar para avanzar en el juego.
  2. La ayuda. Hay uno o varios npcs (personajes no controlados por el jugador) que ayudarán al jugador. En el caso de “Los mools te hacen feliz” hay 4 npcs colaborando. A veces.
  3. Mala suerte. No todo es fácil, las cosas salen mal, hay un npc enemigo imposible de vencer o un equipo difícil de conseguir. En nuestro caso el robot que necesitamos le falta un repuesto. Para colmo, al tratar de conseguirlo nos topamos con un equipo táctico que nos puede ayudar a completar la misión. Ups, se niegan a colaborar. Estos elementos ayudan a calibrar la dificultad de la misión.
  4. Conclusión. Al final todo sale bien y logramos nuestro objetivo. Cobramos nuestra recompensa y somos felices.

Decía que iba a hablar de sus diferencias y similitudes pero realmente no hay grandes diferencias, es muy similar. Como estoy diseñando misiones todos los días (== al menos 1 a la semana) puedo destacar algunos elementos importantes:

  1. Un conflicto con sentido. Claro que va a haber misiones del tipo “Mata a 10 ratas”, pero mi objetivo es que este tipo de misiones rutinarias sean mínimas. Normalmente van a tener sentido con el ambiente y con los objetivos del juego.
  2. Muchos npcs. Me gusta cuando las misiones involucran múltiples npcs. Eso le da mucho realismo, y e incrementa la inmersión. El drama entre los npcs tambiés es un elemento interesante, y la forma como interactúan entre ellos. Ofrece una oportunidad para que el jugador explore una dimensión oscura de los personajes y descubra las historias entre ellos.
  3. Recompensas que valgan la pena. Las misiones siempre tienen dinero o equipos como recompensas. En wow es común complicados quests con un maní de recompensa. Sí es divertido, pero frustrante.
  4. Montañas rusas montadas sobre carruseles girando en un risco. No hay una trama lineal en ningún quests o cadena de quests en khpx. Los enemigos terminan siendo amigos, la recompensa viene del lugar menos esperado, cuando todo parece haber terminado es cuando apenas estamos empezando. Etc.. Esa es la idea.

Los quests en Wow, Runescape y en Wizard101 tienen otro objetivo adicional que es la experiencia que generan. Yo todavía no tengo definida la experiencia (xp) en khpx porque el poder se mide por los recursos que se posee, no por una estadística numérica. Es probable que implemente algo al respecto, pero mi visión es diferente.

La razón es que en khpx hay el concepto de “poder” que es más o menos equivalente a xp pero no es un simple número, sino que viene dado por un conjunto de recursos que posees. Robots, granjas, minas, centros de tecnología, industrias y muy importante el ejército a tu cargo. Para conquistar un planeta y tomar control de sus recursos necesitas un equipo de npcs y robots. Y eso lo consigues a través de las misiones.

Mentira. Si es un número, o termina siendo un número y tiene que existir porque los jugadores quieren saber tu “iLevel” (o poder) para saber lo que puedes o no puedes hacer. Si no existe, los jugadores lo van a inventar o implementar, bien con un plugin, o con una tabla en una página web. En Wow no existía y al final algo tuvo que surgir porque cuando armas raids necesitas saber el poder de cada jugador.

En Runescape en cambio todo gira alrededor de tus skills, no de una simple barra de xp que va avanzando como en Wow. En wow, hay un quiebre en el juego, primero avanzas en xp, y luedo tienes que acumular “algo” (artifact power o azerite o lo que sea) que te permite incrementar el poder de tus armas. En khpx el “poder” se mide a través de tus naves, robots y equipos de npcs, y recursos y es así desde el comienzo hasta el final.

El “poder” entonces te permite saber lo que puedes hacer o no, a través del comando “consider“, que te indica si te puedes enfrentar a un enemigo o tratar de conquistar un planeta.

¿Y por qué ese nombre tan explícito, prosaico: “poder“? Porque el fin del juego es ganarle al emperador de todos los emperadores, lo que te va a permitir ser el amo y señor del universo. ¿Y qué logras con eso?

Poder.

Por qué hacerlo fácil (versión 2021)

14-04-2021 5:36 AM

Suicidio es los opuesto de poesía
Anne Sexton

Ojalá yo no tenga que aprender Kubernetes o trabajar diariamente con docker

Mi relación con los contenedores es como cuando hoy en día alguien trata de aprender vi (o su moderna encarnación, vim): ¿cómo voy a aprender todo eso? Y más importante, ¿por qué? Tú entras en Notepad++, o Visual Studio, o Visual Code, y todo es fácil como pelar mandarinas.

Este es un artículo donde se explica lo simple que es Kubernetes, y cómo su configuración puede ser manipulada o visualizada con curl. Buena introducción, buena explicación, pero es increíble la rapidez como se te ensucian las manos. Ahí mismo estás enredado en decenas de archivos con cientos de líneas de código json con complicadas o desconocidas configuraciones cuyas repercusiones pueden cambiar tu vida. Claro, cualquiera de esas configuraciones te pueden hacer perder horas de trabajo!

Lo mismo sucede con docker. Hace poco tenía que hacer unas correcciones en un sistema java. Pues pasé el 90% del tiempo instalando/configurando docker. ¡Pero si es simple!:

docker-compose up -d --build
docker-compose up

¿Qué tiene de difícil eso?

En cambio, otro cliente tenía un problema con una base de datos, así que me envió un máquina virtual (virtualbox) con vagrant. En 15 minutos ya estaba trabajando el problema (esos 15 minutos los dediqué principalmente a descargar los archivos. Abrir el ambiente fue cosa de un comando vagrant).

Hoy en día que estamos en la era de los SAAS, los startup, me desordena los nervios ver las explicaciones de arquitecturas basadas en managed Kubernetes cluster, caching, load balancing, complicados cron, etc. Por otro lado remoteok es un index.php en cloudflare. Listo. Yo entiendo que manejar millones de requests por segundo requiere infraestructura, pero ¿por qué hacerlo tan complicado?, estamos aquí para divertirnos, ¿no?

Hay soluciones simples disponibles (con un costo por supuesto), Netlify + Google App por ejemplo. Lidiar con Docker, Kubernetes realmente no vale la pena a menos que seas un guru, lo cual solo se logra con un largo, penoso y doloroso camino de golpes y sufrimiento. Discusión en hacker news.

Enlaces de mitad de marzo

15-03-2021 8:19 AM

Counting the red stars and those of plum-colour.
The sun rises under the pillar of your tongue.
My hours are married to shadow.
No longer do I listen for the scrape of a keel
On the blank stones of the landing.

Sylvia Plath – The Colossus

El jurado mueve la cabeza en señal de reprobación

En chess.com, las jugadas están clasificadas con una notación propia del sitio (no reconocida por alguna organización de ajedrez). Hay el movimiento “inexacto” (“inaccuracy”), que no es el mejor movimiento que podemos hacer (hay otras mejores jugadas). Tenemos el “error” (“mistake”) que es una jugada que nos coloca en posición perdedora, y tenemos la “metida de pata” (“blunder”) que es la jugada por la que vamos a perder la partida de ajedrez.

Estaba pensando en esto, y se me ocurrió que sería interesante que un jurado evalue nuestras decisiones del día a día, indicando, con una bandera, cuando metemos la pata, con un movimiento negativo de la cabeza cuando cometemos un error, y frunciendo el entrecejo cuando tomamos una decisión “inexacta”. Nos ahorraríamos muchas molestias y años perdidos en nuestras vidas.

¿Quién utiliza sscanf () en estos días?

Hay varios artículos en internet en estos días (este por ejemplo) sobre los problemas que puede generar sscanf () al desempeño de una aplicación. Mi pregunta es, ¿quién utiliza sscanf () en estos días? Hace 30 años cuando lo estaba usándo por primera vez en un sistema de nómina, descubrí dolorosamente los bugs que puede generar. Un colega de aquellos tiempos descubrió viendo por encima de mi hombro, que mi solución fue reemplazar sscanf () por mi propio parser. “¿Y todo eso para no usar sscanf()?” Y sigo haciendo algo parecido hoy en día pero con la ayuda de C++ STL.

La anécdota es cierta, yo estaba haciendo un sistema de nómina y él uno de cuentas por pagar.

Sobre khpx y nuevas librerías

Llegó a mis manos raylib (discusión en hackernews) un game framework que permite hacer fácilmente prototypes. Es realmente sencillo, y viene integrado con notepad++ y macros para hacer la compilación y las pruebas en dos o tres simples pasos. Tiene soporte para Windows, Linux, MacOS, RPI, Android, HTML5, incluye todas las funciones básicas, 2d, Animated 3d models, audio, fonts, módulo para simulaciones de fisica cuántica (mentira, Newton solamente) y más. En la discusión algunos parecen indicar que Godot or love2d son mejores frameworks, y la documentación de raylib deja mucho que desear (“un canal en Discord no es sustituto para documentación”). Quizás lo utilice para la implementación de la parte física en khpx, pero lo demás lo voy a manejar con mi propia implementación y Imgui.

Febrero de 2021

16-02-2021 9:11 AM

¿Motor gráfico?

Para mi próximo juego quiero trabajar 3d así que SDL no es una opción. Mi respuesta para esto desde hace años es Irlicht como se puede ver, pero quise revisar qué otras opciones hay hoy en día:

Unreal y Unity

La razón por la que los descarto es porque la descarga es de más de 10gb (20gb en el caso de Unreal). Estoy huyéndole a esos paquetes tan grandes, porque paquetes grandes son grandes problemas y ya yo tengo suficientes.

Godot

El lenguaje de scripting es GDNative, algo parecido a python. No se puede hacer juegos usando directamente C++ lo cual lo hace inviable para mi. Al parecer hay varias y sólidas razones para eso como dice aquí, y dice que usar C++ es posible pero preparar el ambiente y linkear las librerías necesarias es demasiado trabajo Sin embargo, el artículo de Wikipedia dice lo contrario, o no lo menciona, lo cual me parece bien raro. Como al parecer hay polémica al respecto mejor paso.

Urho3D

He estado revisando sus características y luce bien. El único detalle es que no parece ser popular. Para usar una engine casi desconocida tengo con Irrlicht. Pero yo no la descartaría. La voy a colocar como un quizás por ahora.

Conclusión

El “deber ser” es seguir la corriente y utilizar Unreal o Unity , pero como cualquiera de esas alternativas me va tomar demasiado tiempo (meses) voy a dejar estos planes en suspenso por ahora. Aunque /r/playmygame hay historias todos los días de personas que dicen más o menos algo como esto: “jamás he programado, nunca he estudiado matemática, soy un perfecto idiota, y luego de 7 meses trabajando con Unity aquí está mi primer juego“. Y entonces un video de un juego con calidad AAA, que parece hecho por Blizzard en su tiempo libre. Y hay 100 comentarios y 200 upvotes. Por ejemplo. Como odio ese tipo de mercadeo.

Noy hay cambio de planes entonces, sigo con khpx, y en el tiempo libre trabajaré la nueva versión de tilemovers y el juego nuevo que tentativamente se llamará Carrusel, es 2.5 d y tiene elementos de arcade, platformer y puzzle, y lo voy a hacer con irrlicht (por ahora).

¡Patéame las pelotas!

Finalmente flash dejó de existir luego de que en diciembre su mortífero creador (Adobe) lo descontinuara definitivamente. Ha habido anécdotas y chistes sobre el hecho, como aquéllos cuentos que solemos narrar en los velorios. Pero el mejor que he oído es esta nota en slashdot donde nos cuentan que el sistema ferroviario de una ciudad china (Dalian) dejó de funcionar porque estaba escrito en flash!. ¿La solución? Pues consiguieron una versión pirata y lo pusieron andar de nuevo. Enlace. (En los comentarios podemos leer: Mi nombre es Zhang Wei, me gusta que me peguen pinzas en los pezones y que me pateen los testículos pero sobretodo me gusta escribir sistemas ferroviarios en flash!)

Enumeraciones caóticas

¿Alguien se ha dado cuenta que Rayuela, de Julio Cortázar es una inmensa lista de enumeraciones caóticas?

bastoncillos de marfil, plumas de pájaro lira, monedas rituales, fósiles mágicos, estrellas de mar, pescados secos, fotografías de concubinas reales, ofrendas de cazadores, enormes escarabajos embalsamados

Las nubes aplastadas y rojas sobre el barrio latino de noche, el aire húmedo
con todavía algunas gotas de agua que un viento desganado tiraba contra la ventana malamente iluminada, los vidrios sucios, uno de ellos roto y arreglado con un pedazo de esparadrapo rosa

quién sabe si Jelly Roll iba a estar en ese andén, en ese piano, en esa hora”

Epílogo

Así que ese es el reporte, la explicación, los detalles de la situación, el estatus, el avance de los proyectos, las actividades, las líneas de pensamiento de este convulsionado, inquietante, pertubador 2021 que parece ser la continuación, el epílogo, la elegía de un nefasto, terrible y odioso 2020. Se cansa, se agota, se obstina uno.