top of page

Get emailed new posts

As expected, I changed the Boxer enemy in Relentless Waves. My first attempt to replace it was an enemy that rotates independently (instead of just rotating towards where the player is), and occasionally it will fire a giant beam at where it’s rotated to. My brief testing with it showed it was either super easy to avoid, or just completely unfair. Then I had the idea of, what if an enemy tried to attack you from the sides instead? I tried it as an enemy that shoots bullets that move to the opposite edge of the screen. It picks a location on the edge of the screen, then fires a stream of 10 bullets, all from that location, before picking a new location. This worked out better, and I like that it creates patterns where you have to move between the bullets. Giving this enemy a name and design was really hard though. Eventually I decided to make it a factory shooting tires at you, which sounded funny.


Then for All Shapes and Sizes, I first made a few minor changes. I changed the animation for shapes spawning, instead of just popping into existence, they grow into the shape, which I think looks better. Then I tried to add something new, which was a struggle. The first thing I tried was an upgrader, it turns the first shape it touches into the next shape. The idea was that it could be a wild card shape, but it ended up being way too strong, instantly turning hearts into crowns. I briefly considered having the ability to drop a star, except the star would fade away over time, which would mean you have to quickly merge it with another star to make use of it. But I didn’t see how to communicate this with just a visual design, so I scrapped it. Finally I came up with something, an item that warps the first shape it touches to the other side of the level. This worked great, it’s very helpful when you have 2 of the same shape, but they’re nowhere near each other.


I probably would’ve gotten more done on those games this week (I wanted to find a new cheat/challenge for RW, and a new level for ASAS), but instead I spent a few days figuring out more improvements to translations. The first is how to get the information from google sheets. The initial code for downloading it and converting it into a format that can be read by the code was very messy and confusing. I realized an easier way to do it: the code can just download it directly as a tab-seperated-value sheet, which is so much easier to work with.


Another thing was improving on how to share and upload the translation file for other people to work with. Now the game lets you download the base English tsv file, and then let you upload your own tsv file into the game. This was tricky to do because browser games don’t let you do things like this. It turns out I needed to use an entirely different programming language just to handle this, but I didn’t want to learn that, so I just had ChatGPT code it for me. I don’t like using ChatGPT to write huge chunks of code for me, but I’ve found it’s not so bad when it comes to fixing quick code errors, and it did do this upload/download thing for me (I would’ve never figured out how to do it myself).


On sunday I had to play Guandan again, which I learned is the name of the card game my mom plays. I have to say, after playing it a 3rd time in one year, I’m pretty much done with it. Every time I find it harder to tolerate the flaws in it. The leveling up system and supposed co-op-ness still feels completely pointless and too complicated. Another issue with this game, and with consecutive turn games in general, is that you have to remember a bunch of things: the turn order, whose turn it is, and if they’re done or not. People constantly forgot all of these things, and this is a game where each turn is like a couple seconds. It shouldn’t be hard at all, and yet it was. Also the game takes too long to set up (even with machines to handle shuffling and card dealing). I also dislike how the game keeps going after someone’s won, as now the winner has to sit there waiting for everyone else to finish, which is very boring.


I bought Pacific months ago, but sunday was the first time I got to play it against other people. I don’t remember every single card I chose, but I started off with some fish and boats, moved them to Peru, and then someone played Holiday in Peru, so I ended up with 10 hotels in Peru and played industry cards every turn for +$10. I had fun, but the other players struggled with how complex the game is due to having to read multiple cards all at once, and how the 4 tokens worked. This experience made me think, maybe I should make a game for this kind of audience. For sure some of my games are not easily accessible for kids, non-gamers, non-English speakers, and/or older people. Randomly Generated RPG is complex and has a lot of reading, Relentless Waves requires fast and precise movements, etc. I think All Shapes and Sizes is the best fit, but it’s possible I need a more simple game that anyone could play.


Next week, there will actually be 2 posts next week. On Dec 31 I’ll write a retrospective on all games I made this year, and the usual weekly one on Jan 02.

Some bad news for the game mentioned last time (which I’ll call the dungeon game). The ideas for it haven’t been coming to me. One big issue with having obstacles spawn in random locations is that they can lead to either really easy levels (one half of the screen has nothing there and you zoom past the level) or really unfair ones (especially since you have 1 health). Which means already this game has hit a dead end and I’ll have to do something else.


Instead I went back and did a little more work on previous games. For Randomly Generated RPG I did a little rebalancing and fixed a few visual bugs. Since I’ve been updating these games, I decided I needed an in-game way to tell players what had changed in each update. This was something I had figured out a while ago, but for some reason didn’t bother adding in. On the title screen of each game, there is a dropdown that displays a date, and changing to that date displays a textbox, and in that textbox I can write what changes were made on that day. Originally I would type the update notes into scriptableobjects, but then I realized I needed it to be translatable, and I switched it to use enums (which I implemented last week). 


Most of the work went into new enemies for Relentless Waves. In the past I tried and gave up on an enemy that followed you around in the past, but this time I tried the idea again. One issue I had is that if there were two enemies that followed you around, it was possible for them to overlap each other in their movement, and then they were pretty much the same enemy. It had to do something other than shoot bullets at you. Then I took an idea I had from the dungeon game, which is that it can have orbs that orbit it. This idea combined pretty well with a moving enemy, since if the enemy never moved, the orbs would be very predictable and easy to avoid. And if they do overlap, their orbs will be in different positions for you to avoid. I ended up theming it as a planet with moons orbiting it.


The last enemy took a lot of work for me to figure out what it should be. The concept was, the enemy had a shield, but you can lower the shield, and while it’s raising back up, you go in and attack. The question then was how to lower the shield. My first attempt was, you had to step on some switch in a random location. That sounded cool, because staying in one spot for a period of time makes you vulnerable to other bullets. I also surrounded the switch with walls that hurt you if you touched them. But the random placement was a huge problem. If there were multiple of these things, they could end up very close to each other, and there’d be no way to touch them without hitting any of the walls. Then I realized I could drop the switch idea and have it where if you’re directly below the enemy, it’ll drop its shield down on you. That pretty much solved the problem, and I themed it as a mechanical crane lifting and dropping some concrete. But now it resembled the knight a lot, who shoots downwards. Since knight was already one of the easiest enemies, I changed it to also shoot a bullet at you as well.


I had also tried another enemy that followed you around. I tried an enemy where its position changes depending on where you are on the screen. If you’re around the middle of the screen, it will move just above you. If you’re slightly below the middle of the screen, it will go below you and you can’t hit it. What I discovered was that 1) the math to determine its position was hard to calculate, 2) since it hovers just above you it’s hard to avoid its bullets, and 3) if you didn’t know its mechanic it just felt like it moved randomly. I also tried an enemy that just rushed at you, like a melee enemy. And I tried it out as a boxing glove, but a day later I got rid of it as it didn’t impress me much. I want to get to 15 enemies, but haven’t come up with a replacement yet, and the game is only at 14 enemies. Probably there’s a way to fix the concept mentioned above, where you have to stand still in an area surrounded by walls.


Unless I get a sudden burst of inspiration for the dungeon game, I guess for now I’ll continue tweaking old games. I’ll definitely try to figure out a new enemy for Relentless Waves, but I think I’ll also try to find something to add to All Shapes and Sizes. With how simple the gameplay is, and the failure of saving shapes for later, I don’t really know what I can add. I don’t know if I will be able to figure out any new levels, game modes, or items to drop. Just looking at my github, I have barely added things to this game after releasing it in December 2023. But I guess it’s possible I get an idea.

As prophesied, I’m now starting a new game that’s an action game. My initial inspiration was actually Doodle Jump, with the part where you move upwards in a level and avoid obstacles along the way. I programmed that part at first, where the camera scrolls up as you go upwards, but realized it was annoying. I had to have obstacles spawn in before you reached them, and also had to delete obstacles that were below the screen, and it was hard to make it feel right. Then I realized a much simpler way to do it: instead of moving the camera at all, just have it so when you reach the edge of the screen, the player is warped to the start, delete all obstacles, and spawn new ones (and I can have a screen fade in fade out). 


I think the hardest part of this game will be trying to make it different from Relentless Waves. After all, both games are basically about avoiding random obstacles for as long as you can, and I don’t want to make the same game twice. I think the main differences will be, no enemies you have to fight, the obstacles don’t fire bullets, and instead the obstacles will be more about making it tricky to navigate throughout the level. I have no idea if I’ll actually come up with enough ideas to make this work. If all else fails, they can just end up being new enemies for Relentless Waves (which isn’t even that bad of an outcome).


Even though I’ve started a new game, I worked on some other things too. A while ago I talked about doing another game design presentation, this time on consecutive vs simultaneous turn games. I’ve started on that, although there are some things I’m still figuring out. First is that unlike the Temporum one, I can’t really focus the presentation on one game, because the whole topic is comparing 2 very different types of games. But also, what can I talk about? Right now I explain the main pros (faster, no turn order advantage) and cons (collision issue) with simultaneous turn games, but is there anything else? I can talk about some solutions to the collision issue, but would I only be explaining solutions from my own games? 


On tuesday, I made some fairly major gameplay changes to Randomly Generated RPG. The first is that I dropped speed and luck entirely. I don’t think they impact the game enough, and were less useful and intuitive than power and defense. Dropping speed meant I had to change how turns work, but there’s a very easy fix. First players take all their turns in order, then enemies take all their turns in order. The other thing is changing the ability pie for Knight and Wizard. It used to be, Knight changes power and defense, Wizard changes speed and luck, Angel can do anything. Now it’s become, Knight only changes defense (for players and enemies), Wizard only changes power, and Angel can do both. Most of the abilities that had to be changed just switched to changing power or defense instead. There was maybe one ability that I had to replace completely, due to the new ability pie / being too similar to other existing abilities. 


Then I decided that angry giving +2 power was probably too strong. Especially for the Wizard, when angry they can deal tons of damage to all enemies at once. I changed it to +1 power and +1 defense as the bonus, and I’m confident it’ll be more balanced (both for players and enemies). I held off on doing all these changes for a while (especially dropping speed and luck), worrying that it would take a ton of work to change everything else (the changes in February took over a week), but these changes took under 2 hours to implement. Turns out removing code is much faster than adding code.


I also found a better way to handle translations. The tricky thing is, there are 2 kinds of lines that need to be translated: ones that are just text (like “play”), and ones that need substitution (“[number] health”). The ones that are just text are ideally all in one enum, but the substitutions ideally are each their own function. The solution is that I can have editor scripts write code for me. The editor script can read the English txt file, and figure out which translated lines can be in an enum, and which ones should be in a function. Then the editor script can generate the code for me. It makes things much easier. 


The question then is, how much of these new innovations should be included in updates to previous games? Like I already went through every bit of text in Randomly Generated RPG; am I really going to do all of that again? It’s still a battle between “I’m no longer actively working on this game and I rarely add new features” and “this is a game I’m proud of and I want to keep it up to date”. For sure for much older games (like Mutating Forest), they will just stay outdated forever, but for the actually good games (like Relentless Waves) it’s more a question. Currently I’m going with, no don’t change the old code, it’s doing its job (until it no longer does its job, then ok I’ll change the code).

Thomas Tang (DZ)

tt2195@nyu.edu

+1 (646) 236-5503

Redmond, WA

©2025 by Thomas Tang

bottom of page