@ agnasg

agnasg


La IA no sabe razonar

29-08-2024 5:51 PM

We’re driving Cadillacs in our dreams

Estoy tratando de limpiar un poco la bitácora de khpx de bugs viejos a los que ya le he dedicado tiempo pero que siguen ahi, incólumes, reacios a ser eliminados.

El que comencé a trabajar hoy bien temprano es con el cursor del mouse. Cuando el juego está en windowed mode, es decir, no está en full screen, o dicho de otra forma, la ventana del juego tiene los íconos del sistema para minimizar, maximizar y cerrar la ventana, y abajo están los iconos de las aplicaciones de Windows, y movemos el cursor del mouse hasta arriba, saliendo del juego, el cursor se pierde y hay que mover el mouse hasta encontrar donde se metió. Esa implementación creo que es del 2021 (o quizás del 2020) y siempre ha tenido ese problema, a pesar de mis intentos por resolverlo. Mi primera presunción es que era un problema de resolución de pantalla pero lo descarté por alguna razón. Grave error, ya veremos por qué.

Esta mañana se me ocurrió revisar de nuevo el tema de las transformaciones de view, project y world, que son las tres transformaciones que DirectX utiliza para establecer los objetos en pantalla. Agregué inicializaciones de todas estas transformaciones a la matriz identidad para garantizar que todo estaba en su estado original. Pero nada, el problema continuaba.

Se me ocurrió entonces hablar con Gemini, el ChatGPT de Google a ver si se le ocurría alguna idea adicional. Me pasó una larga lista de posibilidades, incluyendo el tema de transformaciones. Todas ya las había revisado excepto el SCISSORs, así que lo inicialicé tambien. El código antes de hacer el DrawPrimitive de DirectX quedó así:

D3DXMATRIXA16 matProj, matView, matWorld;
D3DXMatrixIdentity(&matProj);
D3DXMatrixIdentity(&matView);
D3DXMatrixIdentity(&matWorld);
g_pd3dDevice->SetTransform(D3DTS_VIEW, &matView);
g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &matProj);
g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld);
g_pd3dDevice->SetRenderState(D3DRS_SCISSORTESTENABLE, false);

Le formulé varias otras preguntas a Geminí pero se quedó ahí sugiriendo más o menos lo mismo. Así que no tuve más remedio que hacer lo que los humanos hacemos:

Pensar

Yo creo que no pasaron 5 minutos hasta que llegué a la conclusión de que tenía que revisar otra vez el tema de la resolución de la pantalla. Si la resolución de la pantalla no concuerda con la resolución interna de la aplicación, lógicamente cuando el cursor del mouse se mueve del juego al sistema y viceversa va a haber un cambio de posición, es decir no va a coincidir el posicionamiento. Si el juego está en resolución 1200 x 800 y mi pantalla está en 1910 x 1080, si el cursor está en 600,10 y sale al sistema va a aparecer en la posición alrededor del 33% de la longitud horizontal de la pantalla, mientras que en el juego, 600 corresponde al 50% de la pantalla: ¿cómo fue que no se me ocurrió eso antes? Peor, ¿por qué Gemini no me sugirió revisar la diferencia de resoluciones entre el juego y el sistema? La IA no sabe razonar, solo repite lo que encuentra en internet.

Ahora que corregí el bug me parece que era demasiado tonto y obvio. Sin embargo, estuve horas estancado dándole vueltas. Voy a tener que pensar con más frecuencia, y dejar de usar Gemini. Me aporta mejores dividendos.

Cómo migrar un juego desarrollado con SDL2 en Windows a Android: Parte 2

26-07-2024 11:13 AM

tilemovers es un juego de mover piezas tipo puzzle que tengo publicado desde hace 3 años en el Play Store con muy pocas ventas. Nunca lo he actualizado, ni agregado nuevos niveles, nada. Pero finalmente me vi obligado a hacerlo: Google me adviertió que si no lo actualizo lo van a remover del Play Store (breaking news: ya lo removieron. Actualización: ya lo publiqué de nuevo). Así que finalmente conseguí el tiempo para hacerlo.

Aquí está un largo post donde describo mis peripecias implementado el juego y todo el proceso para publicarlo: no fue fácil como se puede ver.

Lo estoy actualizando con varios detalles nuevos, cómo hacer para actualizar el último release, y algunos problemas que se pueden presentar. No voy a repetir aqui (en esta parte 2) esos temas porque ya es realmente complicado conseguir la información en ese post, el que urgentemente, requiere un índice. Coloqué las nuevas adiciones al final con la fecha. Otras correcciones quedaron sin marca alguna, para hacer más fluida la lectura (ya de por si llena de anécdotas, a veces irrelevantes, a veces impertinentes). Los nuevos visitantes lo agradecerán.

Saqué 4 versiones nuevas corrigiendo los distintos problemas. El detalle es que debes actualizar “compileSdkVersion” a 34 (hoy en día), “compileSdkVersion” lo puedes dejar por ahora en su valor actual (16, creo)

Pero todavía sigue un último error. En este momento me aparece este mensaje:

We will soon take action because your app does not adhere to Google Play Developer Program policies. [Pronto tomaremos medidas porque tu aplicación no cumple las políticas del programa de desarrolladores de Google Play.]

Esto se puede deber a que tienes una versión en alguna parte (producción o testing) que no has actualizado a la última version del API (hoy es 34). La respuesta es que no hay forma de remover este mensaje hasta que el alto concilio de Trento, el Sacro Imperio Google y demás instancias apropiadas lo decreten. Tanto en los foros de Google como en Stackoverflow se indica que no hay forma de hacer “delete” a las versiones viejas, solo se indica que puedes deshabilitar el “track” (a veces tampoco se puede deshabilitar el “track”, por ejemplo, yo no puedo hacerlo).

Así que hay que dejarlo así y que seas perdonado por la Inquisición Española y no te lleven a la hoguera.

Se cansa uno.

Hombres en fuga

16-06-2024 1:04 PM

A veces salgo a caminar alrededor de las 10:30 am, principalmente para ejercitar las piernas. Debido a mi trabajo, a que me gusta escribir (y jugar World of Warcraft) paso demasiado tiempo sentado y si no hago ejercicios, eventualmente me comienza a doler una de las piernas. Es un dolor intenso y que puede durar varios días. Pero si hago ejercicio, este dolor nunca aparece. En mis caminatas me dedico a meditar, soñar despierto, y mirar con detenimiento a lo que normalmente no le prestaría atención. Siempre están los viejitos que me miran de reojo, como acordándose cuando tenían mi edad. O las viejitas que critican con la mirada mi vestimenta deportiva y me tuercen los ojos acusándome de todo tipo de delitos, como si yo fuera la oveja negra de la familia. Están los que salen a pasear al perro, y lo persiguen y lo regañan, con la ilusión de que son los amos, cuando en realidad, son los perros los que dan las órdenes y deciden para dónde y a qué velocidad van a correr. Finalmente están los que no tienen nada que hacer y salieron a pasear. Te miran y te examinan, formulando preguntas inverosímiles en su cabeza, buscando alguna razón adicional para ignorarte con más fuerza.

También están las familias, con los niños en desórden como persiguiendo el viento, la mamá con la tía o con la abuela en cacofónica conversación, misma que la mayor parte del tiempo es imposible de seguirle el ritmo. El padre de la familia me mira con envidia, porque yo estoy solo y no tengo que pasar por todo aquello, pero inmediatamente se recompone y cambia la actitud y me mira con altivés, despreciando mi condición de hombre solitario y feliz.

Y entonces, están los hombres en fuga, sentados en un banquito, solos, mirando el infinito con esa mirada perdida, sobándose en desesperación la nuca, y mirando a todas partes esperando no ser descubiertos. Yo los miro con curiosidad porque mi sentido arácnido me ayuda a identificarlos con rapidez y certeza. Son inconfundibles. No miran el celular, no ven a las personas a la cara, sino que insisten en ocultar su rostro y su mirada como si hubieran hecho algo malo. No están esperando algo particular, ni a alguien especial. Están desamparados y toda su estampa es la de un refugiado en un país extraño y hostil.

Los hombres en fuga se reconocen fácilmente porque quedan en evidencia: una mujer nunca actuaría así. Las mujeres siempre están acompañadas, u ocupadas, o haciendo ejercicio, o sentadas pero esperando a alguien. Tienen un lenguaje corporal diferente para cada caso.

A veces me pregunto qué tipo de eventos puede llevar a un hombre a escaparse de su casa y de su vida, y preferir sentarse en un banquito que enfrentar esos eventos, o esas circunstancias. Preferir sentarse en un banquito, en vez de ver la televisión, o leer la prensa, o hacer un crucigrama, leer un libro, hablar por teléfono cosas importantes, o simplemente quedarse en la cama mirando el techo, o mejor aún, durmiendo. Es de mañana e ir a un bar no es una opción, por lo demás, estos hombres normalmente no son el tipo de hombres que irían a un bar.

El hombre en fuga es un hombre desesperado porque pase el tiempo y suceda algún suceso que le permita regresar a su casa y a su vida y que mágicamente todo se haya resuelto. Y entonces me acuerdo que hoy es el día del padre, y asumo y reconozco la gravedad de la situación, que al menos hoy, no debería tomar a la ligera, o en forma divertida. Esto no es para juegos ni para bromas. Sigo mi camino por supuesto, porque preguntarle sería inútil, o bochornoso, porque el hombre en fuga, al verse descubierto, es capaz de cualquier cosa, incluyendo, ponerse a llorar. Y reconozco que tengo muchas habilidades y destrezas, pero consolar a un hombre desvalido y abrumado por los eventos y circunstancias de su vida no se encuentra entre ellas.

Me despido del hombre en fuga que vi hoy, quizás uno de los más quebrantados que he visto, porque momentáneamente pude verlo a los ojos y descubrí lo atribulado que estaba. Espero que resuelva sus problemas, y espero que no lo haga como lo hice yo, mandando para el demonio a todo el mundo. Porque cuando haces eso, eres tú el que tendrá al demonio de compañía el resto de tu vida.

Feliz día del padre.

Subiendo 6 alts a 70

24-05-2024 12:07 PM

Repentinamente, sin previo aviso, decidí comenzar a subir mi legión de alts a nivel 70 (alts == personajes adicionales a a mi personaje principal, a este último se le llama “main“). A todos los tenía estacionados en el Garrison (Draenor) produciendo principalmente bolsas de tailoring, en diversos niveles, 45, 48, algunos en 50 y 52. Un druida, un Dark Night (DK), un Shadow Priest, un Warlock, un Rogue, un Paladin, y un Warrior. Al Warrior lo dejé por ahora en nivel 48 porque necesito siempre un alt en bajo nivel para ciertas actividades, pues, de bajo nivel.

La forma como están funcionando las cosas en wow, es que tú subes de nivel hasta 45 en cualquiera de las expansiones (Outland, Wrath of the Lich King, Pandaria, etc) y una vez que llegas a 45 te pasas a la penúltima expansión en este caso Shadowland pero como es tan mala, Blizzard decidió que también se puede usar Battle for Azeroth, la cual por casualidad es una maravillosa expansión para subier de nivel. Subí los 6 alts desde 45-52 a 60 y fue tan divertido que voy a tratar de subir un Panda y un Hunter que están en niveles 25 y 15 nada más para poder subirlos a través de Battle for Azeroth.

El mecanismo de viajar en el tiempo a las distintas expansiones controlado por Chromie le puso un poquito de orden al sistema, porque para un novato todo aquel poco de expansiones resultan confusas y realmente no se sabe por dónde comenzar. No es fácil meterse en el universo de wow. Yo comencé en Burning Crusade y era, no, mentira, también era difícil. Blizzard hace un gran esfuerzo para hacer el juego más fácil, pero a veces, el tamaño y la cantidad de expansiones conspira en contra.

Una vez que llegas a nivel 60 estás obligado a jugar en la ultima expansión (es decir, la vigente), o sea, Dragonflight. Todo el mundo aclama y aplaude hasta los codos a Dragonflight, pero a mi me parece una expansión normal. Lo que pasó es que BfA y Shadowland (particularmente esta última) fueron tan malas, tan malas, tan malas, tan malas, que por supuesto que Dragonflight fue un rotundo éxito, porque recupero el estilo original del juego. A mi no me gustó para nada las monturas Dragonriding me pareció que controlar esos dragones en vuelo es muy difícil y fastidioso. Pero aparte de eso, todo lo demás fue excelente.

Volviendo a mis alts, he estado haciendo una de las cadenas de misiones que más me gusta, que es la cadena introductoria de Tiragarde Sound, (Battle for Azeroth), el descubrimiento de la conspiración de Priscilla Ashvane para destronar a Katherine Proudmoore, la mamá de Jaina. La clave de este descubrimiento es el trabajo conjunto de Talia, la mano derecha del maestro del puerto de Boralus, y el borrachín Flynn Fairwind.

Flynn y Despala, mi alt paladin, en un descanso antes de continuar su misión en Freeport.

Todo se desarrolla en Freeport, un puerto “colorido”, donde Priscila ha hecho las conexiones para preparar su conspiración. Aquí hasta los side quests son muy divertidos, incluyendo el de Roko y Carentan, un delincuente que provoca liquidarlo sin misericordía, y sí, lo hice, 6 veces.

Luego de la cadena en Freeport, pasamos a Drusvar, donde hay un pueblo tomado por unas brujas. Todos los quests alrededor son bien divertidos, incluyendo el área donde está la bruja, donde debemos eliminar a la fauna silvestre en el área que incluye lobos y cuervos.

Un visitante inoportuno

Y este amigo aquí, Balethorn te puede visitar en cualquier momento. Él está rondando las efigies de uno de los quest, y el área donde están otros objetivos, y por alguna razón es persistente en su empeño de aparecer en el momento más inapropiado. Mi Warlock y el Shadow Priest pueden con 3-4 npcs al mismo tiempo, pero el Rogue, el Druida y el Death Knight (increíble) pueden tener problemas cuando son demasiados, y si entre ellos está Balethorn eso es una visita segura al cementerio. Hablando del Death Knight, he estado trabajando intensamente sus talentos, el dps es bajísimo y pierde health demasiado rápido. Parece que estuviera desbalanceado. Estoy jugando DK Unholy.

Como normalmente los alts llegan a Bfa (Battle for Azeroth) con un nivel alrededor de 45, estas dos áreas (Tiragarde Sound y Drusvar) son suficientes para llegar a 60-61 donde estamos obligados a regresar al presente y atender los requerimientos de Wration y Alexstraza y la nueva situación en Dragon Islands con Fyrakk, el último boss de Dragonflight. Esto claro, si se sigue el camino de hacer quests, una alternativa es hacer dungeons con lo que se puede subir de nivel más rápido. Yo no hago dungeons muy seguido, apenas los necesarios. Desde Legion le perdí el interés a esa parte del juego y ahora trabajo otros contenidos. Afortunadamente, wow tiene tanto contenido que es casi inagotable. Dragonflight en particular tiene miles de quests, y se ven por todos lados. Vas al baño y te encuentras con un quest.

Ya estamos a mediados de mayo y todavía me falta subir 4 alts de 63-64 a 70, que es un trabajo relativamente fácil pero que toma tiempo. Así que por ahora voy a ignorar el nuevo módulo de wow “Pandaria Remix“, que es una versión donde juegas la expansión Pandaria con más poderes y ciertas modificaciones divertidas. Me parece interesante pero realmente yo juego las expansiones hasta el tuétano, y volver a subir un personaje 1-70 en Pandaria es como mucho. Las cosas hay que tomarlas con moderación, inclusive wow. No, en serio. ¡En serio!