top of page

Progress on the current battling game is going well. I’m now at 28 cards, and should be content complete next week. I also added a card gallery to let you check out all the cards. One downside is that since I don’t have a desktop, that makes it much harder to test any online things. I used to have my laptop and desktop both have Unity open, and then they can both connect to a room and I can try stuff out. But I can’t really do any of that stress testing for the moment, which may mean I have to delay the game in order to give me time to do that.


This week I also went back and updated a few other games. I think when it comes to my older games, the only ones I want to keep somewhat up to date are my best ones, which are Randomly Generated RPG, All Shapes and Sizes, and Relentless Waves. I think the code for all those games are also pretty bad by my standards today, but rewriting those games from scratch would be a poor use of time (especially since I’m not actively updating them anymore). 


For Randomly Generated RPG, there wasn’t much to do, other than fixing some (fairly bad) bugs, and improving some code that manages translations and spreadsheets. But I also decided to change how abilities for players are randomly selected. Previously it was just completely random, but I decided it would be more fair if there was something that reduced the chance that you get instantly stuck. Now the Knight will always have at least 3 attacking abilities, at least 2 ways to change emotions, and at least one way to change stats. And something similar for Angel and Wizard. 


For All Shapes and Sizes I also fixed a couple bugs, but I also made it work with any translations. Adding translations to a game after it’s done is usually super annoying and I don’t want to do it for any other game with lots of text (Randomly Generated RPG got a pass since it’s such an important game), but All Shapes and Sizes had less than 40 lines to translate, so I went for it.


Relentless Waves got a slightly larger update. Several months ago, when I was toying around with Relentless Waves, I considered adding a lightbulb enemy, where when you destroyed it the screen would turn black and you couldn’t see any bullets. At the time, I couldn’t figure out how to make that work. I thought I would have to manually change every bullet and enemy’s opacity every single second when they’re not immediately around you, which I didn’t want to do. But nowadays I know Unity better and I figured out an easy way to do it. I created a sprite that’s a giant black square with a transparent circle in the middle. In the game, I put the player in the middle of that circle, and I set that sprite to have a higher sprite priority than everything else in the game. Now the sprite covers up everything on screen, except for anything in the circle since it’s transparent. It worked out, except I changed the lightbulb to blacken the screen every time it’s hit instead of just once when it dies, to make it more annoying. 


I also decided to add an endless mode to the game. It’s always a wave of 6 enemies, and you keep playing it until you lose. One thing I’ve gotten less fond of about the game’s main gameplay mode is that it gets harder over time, but not meaningfully. Randomly Generated RPG adds more enemies every wave, but the enemies have different tiers, and you can make your players stronger. In Relentless Waves, the enemies are all the same tier, and you can’t make yourself stronger. This makes the earlier waves feel less important, like you could remove them and not feel like there’s any difference in gameplay. The endless mode makes all waves the same, which I think makes more sense for this kind of game. 


I also wrote a quick script to count the number of lines used in a project, and here’s some data:


All Shapes and Sizes: 886 lines of code, 17 scripts, 38 lines to translate

Relentless Waves: 914 lines of code, 28 scripts, 39 lines to translate

Randomly Generated RPG: 2912 lines of code, 32 scripts, 736 lines to translate

My current game: 2929 lines of code, 63 scripts, 167 lines to translate (all of which will increase over the next week)


The first 2 games are pretty small and simple. Randomly Generated RPG was my largest game, but a lot of the character abilities could be handled by spreadsheet instructions, which reduced the code and script count by a lot. All the cards in the current game are manually programmed, and it also needs to work online, which is why there’s a lot more code needed there. But I do think my current game’s code is the best out of all the games so far, and is also the most reusable for any future games that want it.

For some reason the blog on the website didn’t work on Nov 14, which is why this didn’t go up. But I did write this post on that night.


While making cards, I made some changes to the game’s rules. First I planned on having a Play phase and a Defend phase. But I decided to merge both of them into one phase. One reason is it just seemed faster gameplay-wise. The other reason is with how actions worked. You can only use actions when playing cards, which means if you get any +actions during a Defend phase, you can’t use it that turn. Which means during a Defend phase, there’s no difference between “+action this round” and “+action next round.” Now that you can play cards during a Defend phase, there will be a difference between those 2 effects. Plus Play effects are restricted to doing things that Defend abilities can (e.g. they can only affect you and your cards).


Another change I made is with card abilities. My original intention is you can choose which abilities you want to use, and skip any you don’t want. But now I changed it to, you have to do as many as you can do. If you can’t pay for its cost (e.g. an ability costs 1 shield but you have 0) you’re fine, and you can choose the order for your abilities, but if you can use the ability, you have to. The reason why is to have abilities that aren’t actually a good trade. If a Defend/Attack ability is net-negative, it wouldn’t affect the math for a card, because you can just never use it. But if you’re forced to use that ability, that does affect the math. The main reason I want this is to have more variety in abilities/penalties, and for some potential combos (such as ordering your abilities to never have to pay for a bad ability).


I also changed how decisions are handled in the code. Mostly this is just cleaning up the existing code to be easier to work with. But also the old way was messy. Every time you had to choose an option on the screen, it created a window in the center of the screen with some buttons with text on them, and when you made your decision the game would delete that window. I got rid of this by reusing the same buttons and not having a window anymore. The only tricky part I haven’t quite figured out is what if you have to click on cards that aren’t on the screen, and how to do that without a window. Possibly for that situation I’ll have to just use a window. I don’t really know how to make “I talk about how I improved code” super interesting to talk about, but it does make my life way easier.


As for finishing the game, I’m at about 11 cards, and I think I want about 40 cards. I’m also aiming for the game to be done at the end of November. Which means I’ll have to make at least 2 cards every day for 2 weeks. Each individual card isn’t too difficult to program, the bottleneck is more thinking of what they’ll do and getting art for them. A lot of other miscellaneous features like resigning and summarizing what each player did at the end of the game is done too, it’s all down to the cards now.

I've finished programming most of the things required for the game to be playable. The only things left really are: being able to toggle whose hand you're seeing when spectating, and seeing stats at the end of the game. But for now it's to most of the fun part of making card games, actually making cards.


I decided that instead of green and red coins, I should give them actual symbols. I decided that green coins can be a shield, and red coins can be a sword. Which makes sense, since shields are (mostly) used in the phase where you use abilities that help you (and I'll call it the Defend phase now), and swords are (mostly) used in the phase when you use abilities to attack the other player (the Attack phase). I also cleaned up a lot of the code related to making decisions/undos, and for accessing custom properties. I'm sure there are even more ways they can be cleaned up, but even just right now it's so much easier to work with.


One thing I worried about when making cards is, abilities in the Attack phase may be very limited in variety. Mostly this phase will be attacking the other player and their cards, but there's not much else that can be done. If I want players to spend resources like their cards, swords, shields, and actions in the Attack phase, then I can't make any attacking abilities that interact with the other player's resources. Which means I can't do anything like "they discard a card" or "they lose a sword." Another idea is, you can stun a card. Stunned cards can't use any of their abilities, but works weird in the Attack phase (you stun their card, but that card is still attacking you. Another idea I had is, you can stun a card. If a card is stunned, you can't use its abilities. But one weird thing about this would be: if you stun another player's card in the attack phase, that card can still attack you. The stun would have to apply to the next round instead.


At first I was going to accept that I couldn't make any of these effects, but while typing this I had a solution. I could have these effects happen at the start of next round instead. For "they lose a sword", if it happened later, it won't have any issues of, 2 players are trying to change something at the same time. It also won't have issues like, they already spent all their swords and the ability just misses. I could even make Defend abilities that make your next turn better ("next round, +1 shield"). This all sounds great, although I don't think I can do things like "they lose 1 action next round" cause if that ability is stacked, they can never do anything for the rest of the game.

Thomas Tang (DZ)

tt2195@nyu.edu

+1 (646) 236-5503

Redmond, WA

©2025 by Thomas Tang

bottom of page