Hilo devlog: estoy haciendo un homenaje en pixel art al juego Flash *Elektra: Ninja Assassin* (2004, Big Spaceship). Lo recuperé de la Wayback Machine, lo decompilé, y lo estoy reconstruyendo desde cero en Phaser 3 + TS. Dev en solitario + IA, full #vibecoding. 10 sprints. 🧵
#gamedev #pixelart #desarrollodejuegos #juegosindie #programacion #typescript #phaserjs #flashgame #preservacion #solodev

El backend FMS del juego original lleva décadas caído. Solo sobrevive el SWF en Wayback. Decompilé con JPEXS, recuperé las clases AS2, y reconstruí toda las mecánicas internas del juego leyendo `main.flr` (~5300 líneas).

#vibecoding #gamedev #pixelart #desarrollodejuegos #juegosindie #programacion #typescript #phaserjs #flashgame #preservacion #solodev

Estuve a punto de tirar la toalla cuando descubrí que el cliente "main.swf" no contenía los datos de los luchadores: los cargaba dinámicamente de ficheros externos. Y estos ficheros no se habían guardado en Wayback Machine: se había perdido todo.

Por suerte, el juego contaba con un tutorial que incluía unos pantallazos gráficos que sí se incrustaron en el fichero principal. Así que, construí un editor básico para generar mi propio fichero "gamedata.xml" con la información de los luchadores.

Sprint 1 (1 semana): había que montar el esqueleto Phaser 3.90 + TypeScript + Vite, y generar un tablero de hexágonos con filas 5/6/5/6/5, añadir la lógica determinista de resolución de acciones según el canon (BLOQUEO → MOVER → ATACAR), 3 acciones por ronda, crear un "ActionChooser", y hacer que funcionase el modo "hot-seat" a 2 jugadores.

#vibecoding #gamedev #pixelart #desarrollodejuegos #juegosindie #programacion #typescript #phaserjs #flashgame #preservacion #solodev

Sorpresa en el Sprint 1: me sobra tiempo.
Y descubro que el juego original tiene una IA bastante decente montada dentro de ComputerPlayer.as.
La porto literalmente "línea por línea" a TypeScript con su propio ADR que documenta la única fuente de aleatoriedad permitida: una PRNG seedable usada solo por la CPU.
En fin, que empiezo a darme de tortas con enemigos que se mueven solos y empiezo a sonreír.
Esto marcha.

#vibecoding #gamedev #pixelart #desarrollodejuegos #juegosindie #phaserjs #solodev

Decido que necesito modo online... aunque sea en mi red local.
Monté un servidor rápidamente en localhost, basado en un un protocolo propio + WebSocketTransport + NetMatchSession, añadiento tests E2E a cliente y servidor.
El sistema es determinista: el servidor sólo enruta acciones, y los dos clientes resuelven el mismo "round".
Lo lanzo en dos ventanas de navegador distintas: no hay sonido y visualmente es horrible... pero ya tengo el "esqueleto" del juego. Y funciona.
https://youtu.be/SB8KhkBAPeI
Ninja Hunter Demo 03

YouTube
En los sprints 3 y 4 me peleé con las distintas casuísticas y escenarios de error del juego en red.
Cuando alguien cierra la pestaña, el otro jugador debe entender qué ha sucedido.
Añadí avisos de "match aborted" en las distintas vistas y botones "LEAVE MATCH", un período de gracia de 30 segundos para que el ausente se recuperase, etc.
Un refresco de navegador con F5 lanzaba un mecanismo de "recuperación con token" guardado en la "sessionStorage" que rehidrata el "match" desde el servidor.

Una vez tenemos a 2 jugadores funcionando, la siguiente capa de complejidad era el modo 3 jugadores ("matchmaker" más complejo, "timing" de rondas tri-polar) y un "round timer" de 30 segundos que rellena con acciones nulas en los slots no selecccionados.
Los "timeouts" dejan de ser silenciosos: salen en pantalla como "PLAYER XX TIMED OUT"

https://youtu.be/cWuganAukwQ

#vibecoding #gamedev #pixelart #desarrollodejuegos #juegosindie #programacion #typescript #phaserjs #flashgame #preservacion #solodev

Ninja Hunter Demo 04

YouTube
Sprint 6:
Más jerga técnica: el patrón de sincronización de red "lockstep" que estoy utilizando es maravilloso hasta que un cliente se desincroniza.
Lo arreglo añadiendo un nuevo sistema de seguridad: cada cliente envía un "hash" del estado tras cada ronda; el servidor compara y dispara "overlay" de pérdida de sincronización si difieren.
También hay que detectar las salas "zombi". Y un "ping/pong" RTT.
Rebuscado, invisible al jugador... pero necesario.

Sprint 7:
Necesito una sala de espera como la del videojuego original, y habitaciones.
El modo "online" debe empezar a parecerse a la referencia.
Añado "Room browser", "guest usernames", "bot-fill" para 2P/3P incompletos, 6 emoticonos en el combate (no quiero un chat).
La demo deja de tener pinta de "matchmaking instantáneo de Steam".

https://youtu.be/cdIr_TPVLVU

#vibecoding #gamedev #pixelart #desarrollodejuegos #juegosindie #programacion #typescript #phaserjs #flashgame #preservacion #solodev

Ninja Hunter Demo 05

YouTube

En el sprint 8 preparo el despliegue a fly.io con Dockerfile + healthcheck + rate-limiting per-IP.
El cliente lo subo a Cloudflare Workers Static Assets vía wrangler.
Añado una latencia visible en HUD arriba a la derecha en partidas net-*.

#vibecoding #gamedev #pixelart #desarrollodejuegos #juegosindie #programacion #typescript #phaserjs #flashgame #preservacion #solodev

Sprint 9:
La demo deja de parecer una demo llena de "placeholders".
Añado backgrounds pixel art (8 escenarios) comprados (Ansimuz), sprites de luchadores generados vía PixelLab y retocadas por mí manualmente, animaciones por personaje (idle / move / 3 ataques / hit / death), VFX para cada ataque, audio (SFX + música).

#vibecoding #gamedev #pixelart #desarrollodejuegos #juegosindie #programacion #typescript #phaserjs #flashgame #preservacion #solodev

Sprint 10:
Hay que empezar a hacerlo bonito.
Divido los fondos del combate en capas y les añado movimiento y efectos, parallax horizontal en cielos, FX ambientales por escenario — lluvia y truenos en la cueva, hojas cayendo en el bosque, pájaros en el atardecer, antorchas en el castillo...

También añado: transición char-select a combate, banner con el nombre del escenario al empezar combate ("STRONGHOLD OF SHADOWS"…), bitmap fonts globales, y HUD nuevo con retrato 64×64 + barras HP/EN animadas.

Y casi está terminado: reskin del roster (los nombres canon son IP de Marvel y no quiero líos).
Genero nombres y lore alternativos, y listo para meter en el horno.

La beta ya está disponible para jugar como invitado o usuario registrado aquí:
https://www.artemisninjahunter.online/

Todos los comentarios son bienvenidos a través del botón "bug" (en las esquinas).
Gracias por la atención.

https://youtu.be/gNbMPhlzQ-o

#vibecoding #gamedev #pixelart #desarrollodejuegos #juegosindie #phaserjs #solodev

ARTEMIS: NINJA HUNTER — pixel-art tactical multiplayer

Pick 3 actions per round, watch them resolve in deterministic order on a hex board. 1v1 or 1v2, vs AI or live online. Free public beta in browser.

ARTEMIS: NINJA HUNTER
Ese tablero de hexágonos con el contraste en rojo queda brutal, se nota que la lógica de resolución está bien amarrada.
Reconstruir todo eso leyendo el main.flr es una locura, respeto máximo a la preservación de los juegos de Flash