You are Newsboy, a professional delivery agent for politikers, phreakers, mobbers, and most any other high-end entity who wishes for discreet, careful, and highly professional deliveries. You live in an age when the human mind has been joined into the intergalactic network known as The Mesh.
Some have even made the leap towards total abandonment of the physical world, referring to it derisively as "meatspace." These people are known as Transcendents and have moved their conscious mind away from the material world into the ever-changing Mesh. You exist in a special place here, for you near-seemlessly hop through meatspace and the Mesh. It is, after all, an intrinsic part of your excellent service.
However, during a job in meatspace, you are framed by the brutish Corps for killing a young Kapital president. As they move to eradicate your consciousness you quickly transfer your conscious mind to Transcendence.
It is here that you must find your way back to your body before the Corps can crack into your material mind.
The game plays from a 2D third-person perspective using a completely custom engine made entirely in this month (more on that afterwards). You use METABITs to defend yourself from hostile entities such as z0mbie processes. These METABITs level up the more rogue processes they absorb, thereby increasing damage output.
Mac OS X .app coming soon - binaries already built.
The source code is released under the GPLv3, so feel free to modify it, fix it, or whatever else you please under that license. If you do any of these things, let me know, as I'd be curious. :]
To build the source, you will need the development libraries for:
If you would like to build the source on Windows, you will either need to have a Mingw build environment, or you will have to convert to your appropriate build environment. To do the latter would be fairly straight forward, as the Makefile doesn't do anything special beyond collect all .c files, compile them, then link into the Newsboy binary.
Newsboy uses a custom engine written in C and SDL2 - it currently weighs in at approximately 14k lines of code. It uses SDL2_image, SDL2_ttf, and SDL2_mixer, as well as OpenGL for accelerated rendering of 2D sprites(textured quads) and zooming.
It also hosts some interesting, although currently underused, features.
The first of these is nanosecond precision. The entire timer system relies on nanoseconds, however the in-game delta use is generally in milliseconds. Why was this done? Because it was fun.
The second is the animation system. Although also underused, the animation system was designed and implemented to drive portions of game logic and physics. To begin with, each animation contains a set, such as "walk", "idle", etc., and each set contains a "face", generally for the cardinal directions. Each face contains frames, which consist of an image string and a tag string.
When particular tags are encountered during particular sets, game logic and physics can be affected. For example, when the player is in the "walk" set and a "walk" tag is found on the current frame, then an amount of force is applied during that frame. This leads to more natural movement. In addition, this approach helps with smoothing animation between sets, as the "walk" state can only be ended if a "pass" frame is encountered (the "pass" frame is the one that is visually the closest to the standard "idle" frames).
Although not all of the specifications have been implemented as of yet, the engine uses a trigger->event(s) system. To specify, a Trigger is a rectangular location on the map that can be interacted with via collision or otherwise by different types of entities, such as the player, enemies, metabits, or projectiles. Furthermore, Triggers have different behaviors, such as one-time use, looping, delays, etc.. Finally, Triggers can link to a theoretically unlimited amount of Events.
Events also exist as rectangular locations, but should be thought of as function calls. They are given a "type" id, which corresponds to a function call, such as those for starting/stopping music, spawning entities, changing animation sets, etc. From there they must be provided with the appropriate amount of parameters (with specific data types of "string", "int" or "char") for that function call. I will be writing more on how to use this system for map development, as the number of functions and their parameters are only discoverable through the source.
Although Events are referred to via string in the map editor and the map data files, when the map is loaded in a live map structure, the strings are converted into integers and accessed via index.
There are other neat features which I will also provide, likely after code cleanup, comment-adding, and bugfixes.