Original
Two full years
First of all, do you remember that my game MUST had a shooting mini game, well, not anymore, but now has a dance fighting mini game, yeah I also didn’t saw that one coming, oh by the way, I’ve been living in Japan for the last year and a half and learning Japanese, while I’m doing not just one game, but two games, and let me tell you its damn hard, and still not rewarding, but it’s hard.
So let’s start from the beginning shall we? I promise all the Japan thing will be short, and gonna explain more about the game, in future posts for each feature.
日本語ははるかに難しい
2023 I came to Japan, if you know me I love to travel and most of my travels were looking for a place where I felt comfortable and part of the society, plot twist, that place doesn’t exist, but Japan is the closest place where you can do or be pretty much whoever you want and no one will judge you, or at least the wont do it in your face, also its a safe country, clean, delicious food and a lot of gaming industry, if its necessary I’ll elaborate my reasons in another post, but this one is about games.
Playdate updates
Since my last update I build and integrate several systems and tools into the game, I’ll proceed to list them in that way in my next post I can talk deeply about how was the process or the main take aways from each improvement:
- Integrated Noble Engine for the scene management.
- Created a dynamic rendering of scenes, from a Lua table where all the information of the level is stored.
- Created a shadow and light system so the main character has a lamp that need to recharge to move faster and see whats on the room.
- A secret (not anymore) sanity system.
- A custom pause menu with a map of the ship and a list of items that you have recovered.
- Different enemies that follow you with different moving patterns, actually it’s pretty basic.
- An event system, where you can trigger dialogues in certain parts of the game.
- A dialog system, with different types of dialogs and a Functional UI that displays different characters.
- A better light system where your torch now has direction.
- Tested the game on device and had to rethink all the shadow system to improve performance, also redo all the scene loading system to improve performance.
At this point I was mostly coding everything by myself with a little help of AI just to “improve” my terrible if statements and logic pasta sauce, but after the performance improvements I was trapped…
I am my worst enemy
Have to be honest, I’m really proud of the scene and levels stored in tables logic, was a big “look imma dev” moment for me, been struggling with imposter syndrome for years, but I also trapped myself in a really complex way to create levels, I have to write, E V E R Y T H I N G, that means for each chair or pro item I need to write the X coordinates, Y coordinates, Z index, make sure wasn’t colliding with any other element, and of course LEVEL DESIGN, so I try several solutions for this self created trouble.
Figma
My first plan was creating the levels in Figma and copy-paste the x and y positions, not really a solution but at least gave me the visual key to create the levels NOT FEASIBLE.
LDTK
LDTK is an amazing tool for creating 2D levels, and the amazing Playdate community already created a library to integrate the levels made in LDTK, the issue, for me I needed to learn to use the tool and rebuild all the scene system and that was also a lot of effort, especially cuz wasn’t sure it would work as I wanted.
Create your own tool
Yes, I did the most overkill solution, I coded a completely separate app, in another completely different language, just to create the levels, and you must be thinking, “ahh he always talks about css and html, for sure was a web tool” wrong my little internet friend, I went full bananas and used Swift and created a macOS & iPadOS tool. OK I vibe coded the app, took me literally a weekend to make it. Is it a good app? Sure no. Is it bulletproof? Hell no. Is its UI and UX a chef’s kiss? Damn no. It’s ugly as Freddy Krueger eating lemons — but it’s functional. I can create levels in minutes, and even dialogues, so all the BETA DEV of my game is way easier. Was so proud of the app that I presented it in the Swift Kansai meet-up.
More improvements
Sure, with this tool the scope of my development went from 1 week to create a room, to 20 minutes to create a room full of dialogues, items, and enemies, which let me make more improvements:
- Implemented Panels for comic cutscenes.
- New title screen.
- A dancing fight scene where you need to dance to fight the enemies.
- Achievements! (thanks to the Playdate community).
- FULL JAPANESE SUPPORT (thanks to ChatGPT).
- Custom scene transitions.
- New items like the antigravity boots and holes in the ground.
- Enemies now bounce and don’t get stuck against the props.
- Enemies now can grow power and EAT the props.
Stop
At this point I just stopped and decided to create a little demo, like a real demo. Nowadays the game is like a demo but at the end, you just end in a room where there’s nothing. It would be good to have a message saying “thank you” and giving people more information about the game or the development of the game.
To be honest there was a huge leap in speed and improvements since I embraced AI, and let them modify my code or “improve this, and improve that”, but at the same time it’s a luck game. A few times the code generated by AI won’t work or changes a simple if statement for a super complex table pointer dynamic if-else-do-while statement super bulletproof for the future.
Well, that’s kinda the update and summary of these 2 years of development of the game and my life. This was more about the game than my life, so see you in the next one. Happy hunting!
Dos años completos
Antes que nada, ¿recuerdas que mi juego SÍ O SÍ tenía que tener un mini juego de disparos? Bueno, ya no, pero ahora tiene un mini juego de pelea bailando, sí, yo tampoco me lo esperaba. Por cierto, llevo el último año y medio viviendo en Japón y aprendiendo japonés, mientras hago no uno sino dos juegos, y les digo que es increíblemente difícil. Sin recompensa todavía, pero difícil.
Vamos desde el principio, ¿sí? Prometo que lo de Japón lo hago corto, y voy a explicar más sobre el juego en posts futuros para cada feature.
日本語ははるかに難しい
En 2023 llegué a Japón. Si me conocen saben que amo viajar, y la mayoría de mis viajes eran en busca de un lugar donde me sintiera cómodo y parte de la sociedad. El giro de la trama: ese lugar no existe. Pero Japón es lo más cercano a un lugar donde puedes ser o hacer prácticamente lo que quieras sin que nadie te juzgue, o al menos no lo harán en tu cara. También es un país seguro, limpio, con comida deliciosa y mucha industria del gaming. Si es necesario, elaboraré mis razones en otro post, pero este es sobre juegos.
Actualizaciones del Playdate
Desde mi última actualización construí e integré varios sistemas y herramientas en el juego. Los voy a listar para que en el próximo post pueda hablar a fondo de cada proceso y los aprendizajes principales de cada mejora:
- Integré Noble Engine para la gestión de escenas.
- Creé un renderizado dinámico de escenas, desde una tabla Lua donde se almacena toda la información del nivel.
- Creé un sistema de sombras y luz para que el personaje principal tenga una lámpara que necesita recargarse para moverse más rápido y ver qué hay en la habitación.
- Un sistema de cordura secreto (ya no tan secreto).
- Un menú de pausa personalizado con un mapa del barco y una lista de objetos que has recuperado.
- Enemigos con distintos patrones de movimiento que te persiguen, la verdad bastante básico.
- Un sistema de eventos donde puedes activar diálogos en ciertas partes del juego.
- Un sistema de diálogos con distintos tipos de diálogos y una UI funcional que muestra personajes diferentes.
- Un sistema de luz mejorado donde tu antorcha ahora tiene dirección.
- Probé el juego en el dispositivo y tuve que repensar todo el sistema de sombras para mejorar el rendimiento, y también rehice todo el sistema de carga de escenas.
En ese punto estaba programando casi todo solo, con algo de ayuda de AI para “mejorar” mis terribles if statements y mi lógica de salsa de pasta, pero después de las mejoras de rendimiento me quedé atascado…
Soy mi peor enemigo
Siendo honesto, estoy muy orgulloso de la lógica de escenas y niveles almacenados en tablas, fue un gran momento de “miren, soy dev” para mí. He luchado con el síndrome del impostor por años, pero también me atrapé en una forma muy compleja de crear niveles. Tengo que escribir, T O D O, lo que significa que para cada silla o ítem tengo que escribir la coordenada X, coordenada Y, índice Z, asegurarme de que no colisionara con otro elemento, y por supuesto DISEÑO DE NIVELES. Intenté varias soluciones para este problema que yo mismo me creé.
Figma
Mi primer plan fue crear los niveles en Figma y copiar y pegar las posiciones X e Y. No era realmente una solución, pero al menos me daba la clave visual para crear los niveles. NO ERA VIABLE.
LDTK
LDTK es una herramienta increíble para crear niveles 2D, y la maravillosa comunidad de Playdate ya creó una librería para integrar los niveles hechos en LDTK. El problema era que yo necesitaba aprender a usar la herramienta y reconstruir todo el sistema de escenas, lo que también era mucho esfuerzo, especialmente porque no estaba seguro de que funcionara como quería.
Crear tu propia herramienta
Sí, hice la solución más extrema posible: programé una app completamente separada, en un lenguaje completamente diferente, solo para crear los niveles. Y seguramente piensan: “ah, siempre habla de css y html, seguro fue una web tool”. Error, amigo de internet, me fui de lleno y usé Swift y creé una herramienta para macOS e iPadOS. Está bien, la vibe codié, me tomó literalmente un fin de semana hacerla. ¿Es una buena app? Para nada. ¿Es a prueba de balas? Ni de cerca. ¿Su UI y UX es un manjar? Para nada. Es tan fea como Freddy Krueger comiendo limones, pero funciona. Puedo crear niveles en minutos, e incluso diálogos, así que todo el BETA DEV de mi juego es mucho más fácil. Estaba tan orgulloso de la app que la presenté en el meet-up de Swift Kansai.
Más mejoras
Con esta herramienta, el tiempo de desarrollo pasó de 1 semana para crear una habitación a 20 minutos para crear una habitación llena de diálogos, objetos y enemigos, lo que me permitió hacer más mejoras:
- Implementé Panels para las cinemáticas de cómic.
- Nueva pantalla de título.
- Una escena de pelea bailando donde tienes que bailar para luchar contra los enemigos.
- ¡Logros! (gracias a la comunidad de Playdate).
- SOPORTE COMPLETO EN JAPONÉS (gracias a ChatGPT).
- Transiciones de escenas personalizadas.
- Nuevos objetos como las botas antigravedad y hoyos en el suelo.
- Los enemigos ahora rebotan y no se quedan atascados contra los props.
- Los enemigos ahora pueden ganar poder y COMERSE los props.
Para
En ese punto simplemente paré y decidí crear una demo, una demo de verdad. Actualmente el juego es como una demo pero al final te quedas en una habitación donde no hay nada. Estaría bien tener un mensaje de “gracias” y darle a la gente más información sobre el juego o su desarrollo.
Para ser honesto, hubo un salto enorme en velocidad y mejoras desde que abracé la AI y la dejé modificar mi código o “mejorar esto y lo otro”, pero al mismo tiempo es un juego de suerte. Varias veces el código generado por la AI no funciona o cambia un simple if por un super complejo puntero de tabla dinámico if-else-do-while súper a prueba de balas para el futuro.
Bueno, eso es básicamente la actualización y el resumen de estos 2 años de desarrollo del juego y mi vida. Este post fue más sobre el juego que sobre mi vida, así que nos vemos en el siguiente. ¡Buena caza!
꼬박 2년
우선, 제 게임에 슈팅 미니게임이 반드시 있어야 했던 거 기억하세요? 이제 없어요. 대신 댄스 파이팅 미니게임이 생겼어요. 저도 예상 못 했습니다. 참고로 지난 1년 반 동안 일본에 살면서 일본어를 배우고 있는데, 게임도 한 개가 아니라 두 개를 만들고 있어요. 정말 힘들고 아직 보람을 못 느끼고 있지만, 힘듭니다.
처음부터 시작해볼까요? 일본 이야기는 짧게 하겠다고 약속해요. 게임에 대해서는 각 기능별로 나중에 자세히 설명할게요.
日本語ははるかに難しい
2023년에 일본에 왔어요. 저를 아는 분들은 알겠지만 여행을 정말 좋아하고, 대부분의 여행은 편안하게 사회의 일원으로 느낄 수 있는 곳을 찾는 과정이었어요. 반전: 그런 곳은 존재하지 않아요. 하지만 일본은 거의 뭐든 하거나 될 수 있고, 아무도 판단하지 않는(적어도 면전에서는) 가장 가까운 곳이에요. 안전하고, 깨끗하고, 음식이 맛있고, 게임 산업이 풍성해요. 필요하면 다른 포스트에서 이유를 더 설명할게요. 이번 건 게임 이야기예요.
Playdate 업데이트
지난 업데이트 이후로 여러 시스템과 도구를 게임에 구축하고 통합했어요. 다음 포스트에서 각 개선 사항의 과정이나 핵심 내용을 깊이 이야기할 수 있도록 목록으로 정리할게요:
- 씬 관리를 위해 Noble Engine 통합.
- 레벨의 모든 정보가 저장된 Lua 테이블에서 씬을 동적으로 렌더링하는 기능 제작.
- 메인 캐릭터가 더 빠르게 이동하고 방 안을 보기 위해 충전이 필요한 램프를 가지는 그림자와 빛 시스템 제작.
- 비밀(이제는 비밀이 아닌) 정신 건강 시스템.
- 배의 지도와 회수한 아이템 목록이 있는 커스텀 일시 정지 메뉴.
- 다양한 이동 패턴으로 따라오는 적들, 사실 꽤 기본적이에요.
- 게임의 특정 부분에서 대화를 트리거할 수 있는 이벤트 시스템.
- 다양한 유형의 대화와 다른 캐릭터를 표시하는 기능적인 UI가 있는 대화 시스템.
- 이제 횃불에 방향이 생긴 더 나은 빛 시스템.
- 기기에서 게임을 테스트하고 성능 향상을 위해 그림자 시스템 전체를 재고했고, 씬 로딩 시스템도 다시 만들었어요.
이 시점에서 대부분은 직접 코딩하고 있었고, 끔찍한 if 문과 스파게티 로직을 “개선”하기 위해 AI의 도움을 조금 받고 있었어요. 하지만 성능 개선 이후로 막혀버렸어요…
나 자신이 최대의 적
솔직히 말하면, 테이블에 씬과 레벨을 저장하는 로직이 정말 자랑스러워요. 오랫동안 사기꾼 증후군과 싸워온 저에게 “봐봐, 나 개발자잖아”라는 큰 순간이었어요. 하지만 동시에 레벨 제작을 굉장히 복잡한 방식으로 만들어버렸어요. 전 부 다 써야 해요. 즉 의자 하나나 소품 하나를 위해 X 좌표, Y 좌표, Z 인덱스를 쓰고, 다른 요소와 충돌하지 않는지 확인하고, 물론 레벨 디자인도 해야 하죠. 스스로 만든 이 문제에 대해 여러 해결책을 시도했어요.
Figma
첫 번째 계획은 Figma에서 레벨을 만들고 x와 y 좌표를 복사-붙여넣기 하는 거였어요. 진짜 해결책은 아니었지만 적어도 레벨 제작을 위한 시각적 힌트는 줬어요. 실현 불가능했어요.
LDTK
LDTK는 2D 레벨을 만드는 훌륭한 도구이고, 놀라운 Playdate 커뮤니티가 이미 LDTK로 만든 레벨을 통합하는 라이브러리를 만들었어요. 문제는 도구 사용법을 배우고 씬 시스템 전체를 재구축해야 했는데, 그것도 많은 노력이 필요했고, 원하는 대로 작동할지 확신도 없었어요.
직접 툴 만들기
네, 가장 극단적인 해결책을 선택했어요. 레벨을 만들기 위해서만 완전히 다른 언어로 완전히 별도의 앱을 코딩했어요. “아, 항상 css랑 html 얘기하니까 분명 웹 툴이겠지”라고 생각하겠죠? 틀렸어요, 인터넷 친구여, 완전히 극단으로 가서 Swift를 쓰고 macOS & iPadOS 툴을 만들었어요. 네, 바이브 코딩으로 만들었고 문자 그대로 주말 하루 만에 완성했어요. 좋은 앱인가요? 전혀요. 완벽한가요? 거의 아니에요. UI와 UX가 훌륭한가요? 당연히 아니에요. 레몬을 먹는 Freddy Krueger만큼 못생겼지만 기능은 해요. 몇 분 안에 레벨을 만들 수 있고, 대화도 만들 수 있어서 게임의 BETA DEV 전체가 훨씬 쉬워졌어요. 앱이 너무 자랑스러워서 Swift Kansai 미팅에서 발표했어요.
더 많은 개선
이 툴 덕분에 개발 범위가 방 하나 만드는 데 1주일에서 대화, 아이템, 적이 가득한 방을 20분 만에 만들 수 있게 됐고, 더 많은 개선이 가능해졌어요:
- 만화 컷씬을 위해 Panels 구현.
- 새로운 타이틀 화면.
- 적과 싸우기 위해 춤을 춰야 하는 댄스 파이팅 씬.
- 업적! (Playdate 커뮤니티 덕분에).
- 완전한 일본어 지원 (ChatGPT 덕분에).
- 커스텀 씬 전환.
- 반중력 부츠와 바닥의 구멍 같은 새로운 아이템들.
- 적이 이제 바운스하고 소품에 끼지 않아요.
- 적이 이제 파워를 키워서 소품을 먹을 수 있어요.
멈추다
이 시점에서 그냥 멈추고 진짜 데모를 만들기로 했어요. 요즘 게임은 데모 같긴 한데 마지막에 아무것도 없는 방에서 끝나요. “감사합니다”라는 메시지와 게임이나 개발에 대한 더 많은 정보를 주는 게 좋을 것 같아요.
솔직히 AI를 받아들이고 코드를 수정하거나 “이걸 개선해, 저것도 개선해”라고 시키기 시작한 이후로 속도와 개선 면에서 엄청난 도약이 있었어요. 하지만 동시에 운에 맡기는 게임이기도 해요. AI가 생성한 코드가 작동하지 않거나, 단순한 if 문을 미래를 위해 완벽하게 설계된 초복잡한 동적 테이블 포인터 if-else-do-while 문으로 바꿔버리는 경우도 몇 번 있었어요.
그래서 이게 지난 2년간 게임 개발과 제 삶의 업데이트와 요약이에요. 제 삶보다 게임 얘기가 더 많았는데, 다음에 또 만나요. 해피 헌팅!
まる2年
まず、私のゲームにシューティングミニゲームが絶対必要だったのを覚えてる?もうそれはないけど、代わりにダンスファイトミニゲームができた。そう、私も予想してなかった。あと、この1年半ほど日本に住んで日本語を勉強しながら、1本じゃなくて2本のゲームを作ってるんだけど、本当に大変で、まだ全然報われてない。でも大変だよ。
最初から話していこうか。日本の話は短くまとめる、約束する。ゲームについてはそれぞれの機能ごとに今後の投稿で詳しく説明するよ。
日本語ははるかに難しい
2023年に日本に来た。私を知ってる人なら分かると思うけど、旅が大好きで、ほとんどの旅は自分が心地よく社会の一部として感じられる場所を探すためだった。どんでん返し:そんな場所は存在しない。でも日本は、自分がやりたいことや自分らしくいることをほぼ自由にできて、誰にも判断されない(少なくとも面と向かっては)、そんな場所に一番近い。安全で清潔で、食べ物は美味しく、ゲーム業界も盛ん。理由はまた別の投稿で詳しく書くかもしれないけど、今回はゲームの話。
Playdate のアップデート
前回のアップデート以来、いくつかのシステムとツールをゲームに組み込んだ。次の投稿でそれぞれの改善について詳しく話せるよう、まずリストアップしておく:
- シーン管理に Noble Engine を統合した。
- レベルの情報をすべて格納した Lua テーブルから、シーンを動的にレンダリングする仕組みを作った。
- 主人公がランプを持ち、充電することで速く動いたり部屋の中を見たりできる影と光のシステムを作った。
- 秘密の(もう秘密じゃないけど)正気度システム。
- 船のマップと回収したアイテムのリストが表示されるカスタムポーズメニュー。
- 異なる動きのパターンで追いかけてくる敵たち。まあ基本的なものだけど。
- ゲームの特定の場所でダイアログをトリガーできるイベントシステム。
- 複数の種類のダイアログと、異なるキャラクターを表示する機能的な UI を持つダイアログシステム。
- 松明に方向ができた、改良された光のシステム。
- 実機でゲームをテストして、パフォーマンス向上のために影システムを全面的に見直し、シーン読み込みシステムも作り直した。
この時点では、ほぼ自力でコーディングしていて、ひどい if 文とスパゲッティなロジックを「改善」してもらうためにちょっとだけ AI を使っていた。でもパフォーマンス改善の後、行き詰まってしまった…
自分が最大の敵
正直に言うと、テーブルにシーンとレベルを格納するロジックはすごく誇りに思ってる。長年インポスター症候群と戦ってきた私にとって、「見て、俺って開発者じゃん」という大きな瞬間だった。でも同時に、レベルを作るのがものすごく複雑な仕組みに自分を追い込んでしまった。椅子1つやアイテム1つのために、全 部書かなきゃいけない。X座標、Y座標、Zインデックス、他の要素と衝突していないかの確認、そしてもちろんレベルデザイン。この自分で作った問題に対していくつかの解決策を試した。
Figma
最初の計画は Figma でレベルを作って X と Y のポジションをコピペするというもの。本当の解決策ではなかったけど、少なくともレベルを作る視覚的な手がかりにはなった。実用的じゃなかった。
LDTK
LDTK は 2D レベルを作るための素晴らしいツールで、素晴らしい Playdate コミュニティ がすでに LDTK で作ったレベルを統合するライブラリを作っていた。問題は、ツールの使い方を覚えてシーンシステム全体を作り直す必要があったことで、それも大変な作業だったし、思い通りに動くかどうかも確信が持てなかった。
自分でツールを作る
そう、一番やりすぎな解決策を選んだ。レベルを作るためだけに、全く別の言語で完全に別のアプリをコーディングした。「あー、いつも css と html の話をしてるから、きっと Web ツールだ」と思ってるでしょ?違う。インターネットの友達よ、思いっきり振り切って Swift を使い、macOS & iPadOS ツールを作った。まあ、バイブコーディングで作ったんだけど、文字通り週末1回で完成した。良いアプリ?全然。完璧?ほど遠い。UI と UX は最高?まったく。レモンをかじる Freddy Krueger くらい醜いけど、機能はする。数分でレベルを作れるし、ダイアログまで作れる。だからゲームの BETA DEV がずっと楽になった。アプリがとても誇らしかったので、Swift Kansai のミートアップで発表した。
さらなる改善
このツールのおかげで、開発のスコープが1部屋を作るのに1週間かかっていたのが、ダイアログ・アイテム・敵が揃った部屋を20分で作れるようになった。それによってさらなる改善が可能になった:
- コミックカットシーンのために Panels を実装した。
- 新しいタイトル画面。
- 敵と戦うためにダンスが必要なダンスファイトシーン。
- 実績!(Playdate コミュニティ のおかげ)
- 完全な日本語サポート(ChatGPT のおかげ)。
- カスタムシーントランジション。
- 反重力ブーツや床の穴など新しいアイテム。
- 敵がバウンドするようになり、プロップに引っかかる問題が解決された。
- 敵がパワーアップしてプロップを食べられるようになった。
停止
この時点で一度立ち止まり、ちゃんとしたデモを作ることにした。今のゲームはデモっぽいけど、最後は何もない部屋で終わってしまう。「ありがとう」というメッセージとゲームや開発についての情報を伝えられるといい。
正直なところ、AI を取り入れてコードを修正させたり「これを改善して、あれも改善して」とお願いするようになってから、スピードと改善の面で大きな飛躍があった。でも同時に運ゲーでもある。AI が生成したコードが動かなかったり、シンプルな if 文を超複雑な動的テーブルポインタの if-else-do-while に置き換えてくることが何度かあった。
まあ、これがゲーム開発と私の生活、この2年間のアップデートとまとめだ。人生よりゲームの話が多かったけど、次回また会おう。ハッピーハンティング!