~blue-maned_hawk/clyzkxmn

A procedurally generated emergently complex abstract bullet hell game.

c7b3818 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

6 months ago

c7b3818 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

6 months ago

#Clyzkxmn

Notice: Clyzkxmn is currently unfinished. The rest of this document describes what the game will be.

Clyzkxmn is a procedurally generated emergently complex abstract bullet hell game. From its simple mechanics you shall see emerge a challenge of complex gameplay, where your goal is to get the highest score you can in a uniquely-generated run.

#Installing

Download an executable of the latest version from the refs tab of the repository in the source tab of the project and execute it. Or you could just clone the master branch and compile that.

(The executable isn't a flatpak or snap or appimage or whatever fancy bullshit the cool kids are doing nowadays. It's just that, for this particular project, it happened to be feasible to procedurally-generate most things that would have been assets, bake into the binary the rest of them, and dynamically link to libraries you (probably) already have installed. This is certainly not something that is feasible for most projects, nor is it something i particularly recommend.)

#Requirements

WARNING: As of right now, this game requires your monitor to be an RGB display that supports at least 2 bits of depth per color channel, a requirement that may be increased later. There is no method by which the game can check this.

If you're using the prebuilt binary: An amd64 machine and Linux operating system is required—these are subject to change in the future if i can get other systems set up for testing.

If you're building yourself: Untested is what building for nonamd64 and nonLinux systems is. You need a POSIX-compliant C compiler that accepts -std=c23 as an argument to use C23. (Note that building has only been tested with Clang because my system has no way to use a version of GCC that isn't obsolete, but it should work, albeit with complaints—if it doesn't, do please file an issue report.) You must have in your include path for <>-type inclusions the headers for a POSIX-compliant C23 libc implementation and the headers for libwayland-client (as wayland-client.h), an implementation of the Vulkan API (as vulkan/vulkan.h), and the P99 preprocessor macro library (as either P99/p99.h or p99/p99.h). Clyzkxmn will also use liblzma (as lzma.h) if it's available. For now, you need GNU Make specifically in order to build; this will be fixed later.

NOTICE: There is a bug in wayland-scanner that means that the generated Wayland files will raise a warning. This is harmless.

In either case: You will need to be able to link to a POSIX-compliant C23 libc implementation, and to be able to link to libwayland-client and an implentation of the Vulkan API, and you should, but needn't, be able to dynamically load liblzma.so to compress logs. You must have a Wayland compositor that implements the wp_presentation, xdg_shell, zwp_linux_dmabuf_v1, zwp_pointer_constraints_v1, and zwp_relative_pointer_manager_v1 protocols; Clyzkxmn will also attempt to use the wp_content_type_manager_v1 extension if it can. Your environmental variables must include $HOME and/or $XDG_DATA_HOME; as per the XDG base directory specification, Clyzkxmn will attempt to write to either "$XDG_DATA_HOME/clyzkxmn" or "$HOME/.local/share/clyzkxmn", with the former having higher priority.

#Documentation

This file is the documentation for the mechanics of the game. (There does not yet exist any sort of proper documentation on the code. This will be fixed.)

#Goal

The primary goal of Clyzkxmn is the unenviable task of not being destroyed by the bullets. If a bullet intersects with the center of the dot on the object you control, the run ends and your score is tallied.

The secondary goal of Clyzkxmn is to get the highest score you can. The biggest factor in this is getting points, which are a different thing from the score, as explained later in this document. Points are earnt in quanta; each quantum of points you earn is multiplied by the multiplier and then rounded up to the nearest integer before being added to your quantity of points. You start the game with a multiplier of 0‱. Further details on score are at the end of this document where they make the most sense.

The game runs at 2^5^2 nanoseconds per frame; the resolution of the game is 480p@4:3 (for no really good reason at all). On each frame, there is a chance that a new generator will be added to the playfield; this chance is reduced proportionally to the number of points and basis points that would be granted by deletion of all of the bullets and generators that are already on the playfield.

Finished runs are documented in $XDG_DATA_HOME/clzyxkmn under filenames of the form Seconds from the epoch:Additional nanoseconds from the epoch.run. You can review these runs later, and you can share them with others to prove that your runs are feasible; however, these alone cannot prove that your runs are genuine. High scores are stored in $XDG_DATA_HOME/high-scores.txt.

#Object

There are two objects you can control: the one that displays as a red square, and the one that displays as a red triangle. You can move them by holding the left mouse button and moving the mouse. You can use right-click to instantly swap the object you're using at no cost; the object that you switched to will be placed in such a way that the center of the object is the same location where the center of the object you switched from was.

Your object fires one bullet per frame. The square object shoots two lines of bullets directly vertically, whereas the triangle object shoots eigh lines of bullets in a spread. Each bullet can do 1 damage when it intersects a generator (see below) and ceases to exist immediately after it has done so. Bullets are rectangles displayed in red.

You can press middle click to trigger a bomb, if you have any. The narrow object's bomb fires in a vertical beam, whereas the wide object's bomb fires in a circle centered on the object. A bomb does 2 damage per frame in its area of effect and deletes any bullets that are in or enter the area of effect.

If you get hit, the game will falter for a moment, and if you have any bombs it will fire one as a last resort. However, this last resort will consume all of the bombs that you posess, even though it only has the effect of one bomb. If you don't have any bombs when you get hit with a bullet, the run is over.

Your count of bombs is incremented by one on the first frame that one of these conditions is met:

  • TODO

#̈́Bullets

The nature of a bullet is indicated by its appearance. A bullet has a shape and a schedule of movement. The shape of a bullet determines its hitbox. The schedule of a bullet's movement consists of a number of timespans, each of which is a layer of color on the bullet, with the outermost layer being the current timespan and the innermost layer always being white; the instant a timespan ends, the layers are shifted one layer outwards, with the inner layer becoming white. Each layer contains a blue point indicating the heading of the bullet during the timespan.

The saturation of the layer indicates how much time is left in the timespan. The brightness of the layer indicates the speed of the bullet during the timespan. The layer is normally green; the yellower it is, the more intensely the bullet will rotate sunwise, or the cyaner it is, the more intensely the bullet will rotate moonwise. If the layer is magenta, the bullet will rotate to adjust the direction of its heading towards your object, with a redder layer indicating a more intense adjustment per frame.

When a bullet is deleted (from going offscreen or the effects of a bomb), points are awarded based upon the original nature of the bullet in question according to the following formula, the result of which is then subject to the multiplier:

**TODO**

#Generators

The nature of a generator is indicated by its appearance. A generator has a hitbox, a schedule of movement, a schedule of bullet generation, an amount of damage it can take, and an amount of damage which it has already taken. How these will correspond to the appearance of the generator is yet to be determined.

Generators will not terminate a run if they intersect the center of your object; however, it is probably a bad idea to be hanging around something that produces things which can terminate your runs.

The generator will be deleted and increment your multiplier by a certain quantity of basis points when it has taken more damage than it can. The total basis points of multiplier awarded is dependent upon the original nature of the generator and how quickly you deleted it. The total award of basis points is doubled if the generator was deleted due to the effects of a bomb and halved if it was deleted from going off-screen.

The formula for the number of basis points awarded for the deletion of a generator is as follows:

**TODO**

#Score

When a run ends, your score is calculated. Your score is determined by your points, time spent playing, multiplier (as in the value of your multiplier is converted into score, not the value of the multiplier affects the final score), bullets deleted through bombs, and generators deleted. The more adversity you persist through, the higher your score should be.

The score is calculated by the following formula:

**TODO**

The game will also calculate a grade for your run. These exponentially increase in difficulty to obtain as determined by the following formula:

**TODO**