pinkcateye.com

September 1, 2025

Did you know that C# is the best language to code an AI? When you're coding AI, the efficiency of the C language is necessary, but you also need the garbage collection. C# automatically allocates and frees memory for you so which is necessary when making something like an AI that constantly has new responses. New responses constantly need memory freed and allocated at so many points, so with C# it's easier to do that automatically.

June 1, 2025

Low-level languages are closer to binary. They're closer to what the computers actually see as code. They're easier to compile, and they look more impressive on a resume, but they're harder to write. Binary may look simple because it's a bunch of ones and zeros, but actually trying to write a command in binary would be horrible. You'd be really prone to errors because you'd have to remember that every letter is a different set of bits. So, you would end up with a lot of glitches, and you would probably destroy your CPU in the process. In binary, if one thing goes wrong, then your CPU will probably die because it's so close to the system. C is actually a low-level language on its own unless you use the runtime. Instead of using the runtime, I use pure WinAPI, and I use a custom start point with a flag to tell the compiler to use a custom start point instead of int main(). You don't actually have to load the C Runtime Library (CRT), which effectively renders it a low-level language by avoiding a single library.
Isn't that cool?
But then you're forced to use only the Windows API, which is often harder for developing multi-platform stuff because you have to re-code the entire program to work with a different operating system. Whereas high-level languages can be ported between operating systems. However, I don't have to worry too much about that because Mac's APIs are actually quite similar to Window's. Almost anything written in a higher-level language is essentially bloatware these days because they're running all the libraries and the runtimes even when it's not efficient. Conversely, low-level languages are harder to code, but they are more efficient. You have more control over what the computer's actually doing, and they end up having more payoff in the long run. They're also more challenging to code because you have to custom-code certain things (like how to play sound), but because of that, they look more impressive on a resume. Anyone can code in high-level languages; it's really easy to code with them because they were designed for ease of use. However, I personally am not a fan because "easy to code" does not always equal "more efficient software". I also often strip out the GCC watermark and replace it with my own watermark in a hex editor: "with love from pinkcateye.com". It's not necessary, but I like to do it to make the program my own.

May 23, 2025

Alternative Data Streams (ADS) are like using a file as a directory. However, it only works on windows because of the NTFS filesystem. A TXT file can be utilized as a folder ("data.txt:altdatastream"). These files cannot be seen because the host files can't be opened as directories, so they're hidden from plain sight, but they're really useful. Windows sometimes uses it to hide system files, and lately I've found out that I can use it for save and load systems in one of my games. I'll call this game "GameA". Using Alternative Data Streams, I can make GameA look stateless. There are no random save files around the directory that you can just delete, because the save file is hidden as an Alternative Data Stream inside the EXE. So, you can't mess with a save. You can't edit it. You can't share it with your friends and cheat, because if you try and share an EXE that has an Alternative Data Stream attached, it won't send the stream. The Alternative Data Stream is really fragile. You can move the file without breaking the stream, but since Alternative Data Streams are a Windows-only thing, you can't put a file with an Alternative Data Stream attached in Gmail and have the Alternative Data Stream send with the file, because the stream will get deleted. You can't try and send it to anyone. With Alternative Data Streams, you can't cheat in GameA because the save files would be in the Alternative Data Streams. You can't share save files. It's a fun little way of making the files user-specific without a server, and without writing a whole bunch of code to link to a pinkcateye.com server and put your saves there. It softlocks save data to your identity without having to worry about extra servers and accounts. It also saves me from coding a bunch of encryption methods, because that would take too much time. It would also take up unnecessary space on the player's computer.
Just by using this little system that Windows has built in for me, I can create an efficient save and load system with a built-in anti-cheat that doesn't require extra coding. I'm not usually a hardcore stickler about anti-cheat. I'm not Nintendo - they're cuckoo about petty anti-cheat. In most of my games, the player can load whatever save they want, but GameA is different. Part of the psychological horror of GameA is the lack of control, and the fact that the game is supposed to be one-and-done. GameA uses time loops as a heavy part of the plot, and the way that the time loops work messes with the replay systems so that the player can't ever replay a specific loop. Nope. The only method of replaying brings the player into a new loop or continues where they left off in that specific loop. It's not meant to be replayed. It's meant to be played through only once and then never played again. It's meant to be a unique experience. The loop only ever happens once to the characters and once to the player. Hence, the anti-cheat. I hope this doesn't sound too anti-player, but here's a fine line between preserving the experience of a game and being anti-player.