Crate babalcore

Source

Structs§

FakeInput
A fake input used for tests, to simulate user inputs.
InputJump
Used to handle jump input. This is to encapsulate all the nitty-picky logic about considering a button is still pressed a fraction of seconds after it has been pressed, etc. It does not actually poll and/or listens to the real hardware, it just keeps track of what’s happening with push/pop operations.
InputSteer
An object to tract steering, that is, going left, or going right. This does not actually poll/reacts to the physical controllers, it just collects “go right” or “go left” informations then aggregates and consolidates them.
Level
Contains the level definition, where are slabs, and of what type.
Player
PlayerEvent
PointsCounter
Row
Slab
TimeTracker

Enums§

PlayerEventKind
Events which can be triggered by the player.
Skill
Different skills.
SlabDef
Different defs of slabs (those rectangles the ball can roll on). A def is what defines a slab, it will be translated into a kind at runtime. Typically some defs can be “a random slab”, or even “a slab that varies with time”, etc.
SlabKind
Different kind of slabs (those rectangles the ball can roll on).

Constants§

ABSOLUTE_LENGTH_MAX
Indices for rows can not be bigger than this. It is insanely big though, at 100 slabs per sec, it represents 1 million seconds, which is more than 10 days of continuous play.
BASE_KEYBOARD_ACC_VALUE
When first pressing a key, this value is put in the accumulator. This is to avoid waiting for the first repeat to actually do something.
DEFAULT_KEYBOARD_SENSIBILITY
Keyboard sensibility, one way to think of it is “how many pixels should be a corresponding mouse move, if it lasted 1 second”. So moving the mouse of 1000 pixels in 1 second is equivalent to keeping a move arrow pressed for 1 second. Setting it to negative value will invert keyboard.
DEFAULT_MOUSE_SENSIBILITY
Default mouse sensibility, as this is an arbitrary unit, default is 1. Setting it to a negative value will invert mouse.
DEFAULT_STICKINESS_SECS_F64
By default, the stickiness is set to a bit more than 1/10th of a second. This means that if player pushes a jump control less than 1/10th of a second before it can actually jump, the jump is still recorded as valid.
INTENSITY_MAX
Maximum intensity.
INTENSITY_MIN
Minimum intensity.
MAX_ITEM
PLAYER_EVENT_BOOST
PLAYER_EVENT_CATCH_UP
PLAYER_EVENT_CHANGE_COLUMN
PLAYER_EVENT_FALL
PLAYER_EVENT_FINISH
PLAYER_EVENT_HIGH_SCORE
PLAYER_EVENT_JUMP
PLAYER_EVENT_LAND
PLAYER_EVENT_OVERDRIVE
PLAYER_EVENT_PERCENT_TIME
PLAYER_EVENT_START
PLAYER_EVENT_THOUSAND_SCORE
SLIDING_LENGTH_MAX
History about one level will be kept only below this limit. Above it, the initial slabs will disappear. This should really not be a problem as for a complete restart, we can reinitialize with a seed, and otherwise it stills allows going back in time by 10k slabs, which means several minutes even at high speed.
TIME_TRACKER_MAX_SEC
Maximum number of seconds we can track. This is related to the limit of a mantissa in 64-bit IEEE numbers, which is about 10^15. Since we count in msec, we have to divide to take away 3 digits. This is still several centuries.
WIDTH_MAX
A maximum width, most playable values should range from 6 to 12, so 32 is already a lot. To simplify/optimize code, program uses fixed size rows, set to the WIDTH_MAX. With slabs of 4 or 8 bytes, it means only 256 bytes (worst case) for a row. With this setting, a 10_000 rows level, playable for about an hour, at 3 slabs/sec still fits into 30Mb of memory.

Traits§

InputQuery
A trait to abstract the input query interface, it is mostly used for testing the game logic without having real inputs.
LevelQuery

Functions§

boxcar
Boxcar function as defined here: https://en.wikipedia.org/wiki/Boxcar_function With A=1, a=0, b=1, so it is 0 if x<0, 1 if x>0 and x<1 an 1 if x>1.
fade_in
Fade in func, 0 if x<0, linear between 0 and 1, 1 if x>0.
fade_out
Fade out func, 1 if x<0, linear between 0 and 1, 0 if x>0.
format_type_of
Return a string describing the type.
generate_first_row
generate_next_row
heaviside_step
Heavyside step function as defined here: https://en.wikipedia.org/wiki/Heaviside_step_function It is 1 is x > 0, and 0 if x < 0.
pulse
Pulse func as defined here: https://en.wikipedia.org/wiki/Pulse_wave The global period is 1, the alpha value can be used to control the ratio between 1s and 0s.
sawtooth_wave
Sawtooth wave func as defined here: https://en.wikipedia.org/wiki/Sawtooth_wave It alternates between values of -1 and 1, with a global period of 1. It switches between them at x == 0.5.
sine_wave
Sine wave func as defined here: https://en.wikipedia.org/wiki/Sine_wave It’s a simple sinusoid, only this one has a period of 1 instead of 2PI. The idea is to be able to use it as a drop in for triangle_wave for instance, without introducing a 2*PI factor. If you want a real sin, just use the builtin func.
square_wave
Square wave func as defined here: https://en.wikipedia.org/wiki/Square_wave It alternates between values of -1 and 1, with a global period of 1. It switches between them at x == 0.5.
triangle_wave
Triangle wave func as defined here: https://en.wikipedia.org/wiki/Triangle_wave It alternates between values of -1 and 1, with a global period of 1. It switches between them at x == 0.5.
unwrap_now
Return the time contained in the option if it is defined. If not (None was passed) returns the result of an actual call to Instant::now(). This is useful for testing: in mainstream production code, just pass None, but for testing it is possible to pass fake instants.