Fractal Block World
Version 1.01.22
Back
Each level now has a "fertile radius".
Non-block entities are only spawned
within the fertile radius.
See the description of version 1.01.22
for more.
Patches
Version 1.01.26:
- Date: January 2025
- Integer environment variables are now 64 bits
instead of 32 bits.
As a result, integer game global variables
use 64 bits.
- There is now a new xar package command: snap.
This command will take a "snapshot" of the chunk
that contains the player and will save it in the file
"Output/FileOut/chunk_snapshot.lua".
This can be used for level editing.
It will merge blocks accordingly to form "boxes",
so that the result .lua file is compressed.
Part of getting this to work involved allowing
packages to write to files in Output/FileOut.
That is, there are now API functions for writing to files.
- There is now another package on this website
here
called xar_chunk_edit.
This can be used to edit a chunk
using block creation tools in game.
Then the user can use the package's
own snap command to auto generate a .lua
block script file for that chunk.
- Colorblind friendly text boxes are now in beta.
You can read about that here.
- There is now a new rule: the program should not allocate
memory buffers that are strictly more than 9 million bytes.
These large contiguous blocks of memory are a problem
for the program.
Because of this, images loaded by the program
can have at most 2,250,000 pixels.
So, the largest square image that the program can load
is 1500 by 1500.
- If a certain variable is set, the program will allocate
and then immediately deallocate a buffer of size
9 million bytes every minute.
This is to test the memory system.
This is called the memory whisker test.
- There are now the functions ga_debug_push and ga_debug_pop
which push and pop the game's internal debug stack.
When an error occurs in the program,
the program dumps the
debug stack to "stdout.txt".
These new functions can be used
to track down where a crash occurs in Lua code.
- Added a safeguard for the double shrink glitch.
- Added a safeguard to prevent telefragging by growing.
- Mouse buttons 3,4,5 can now be bound.
Specifically, these are the mouse buttons that can be used:
SDL_BUTTON_LEFT (mouse 1),
SDL_BUTTON_RIGHT (mouse 2),
SDL_BUTTON_MIDDLE (mouse 3),
SDL_BUTTON_X1 (mouse 4),
SDL_BUTTON_X2 (mouse 5).
- There is now a custom difficulty mode.
Go to xar's package top menu, go to the difficulty menu,
go to "harder mode" and enter the password "custom".
Now set the environment variables
"game.globals.xar.difficulty.custom.dmg_from_player"
and "game.globals.xar.difficulty.custom.dmg_to_player".
These are the in-damage and out-damage multipliers.
- There is now a way to set (from Lua) the direction the camera
is looking.
It is done by calling the function ga_camera_set_look(look, left).
- The location of the xar menu to set "use true up" has changed.
- Now when you set the "use true up" variable within a menu
in the xar package, it will set your HUD attack display to either
a cylindrical or spherical model accordingly.
- Now when you set true up to true (in the xar package),
you can specify whether the player
moves up and down along the z axis or the camera up vector.
- Added a shortcut inside Fire Rate Moons.
This is a shaft down to the treasure area with no obstructions,
but there are very powerful monsters along the way.
- The "load" command can now optionally take either
"hard" or "soft" as a parameter.
In a hard load, the package is totally reloaded.
In a soft load, we only partially reload the package
to save time.
We recommend soft loads for casual players, because it is faster.
Modders on the other hand may want to do hard loads
if they make a change to the current package
on their file system and do not want to restart the program.
If no parameter is passed to the load command, the value of the bool
engine.soft_loading is used to determine if loading is soft.
- There is now a command called "saveload" which saves the game
and then immediately loads.
This requires cheating to be enabled, because of speedrunning.
The command can be used by modders.
Also, the parameters "hard" or "soft" can be passed to the command,
to specify whether the load is hard or soft.
See the load command for a description of what
"hard" and "soft" mean.
-
There is a new monster: the Iron War Vulcan.
This is identical to the War Vulcan,
except it only takes 1% damage when you are the same size as it.
This will replace the War Vulcans in Blackberries,
because killing them with rockets from the outside was too easy.
On the other hand, killing vulcans in other parts of the game
with rockets when you are the same size as them is encouraged and intended.
- The game now fixes your recorded difficulty if you attempt to beat the
game without leaving the tutorial.
Version 1.01.25:
- Date: November 2024
- The xar package now has the command
"claimtrophies".
When this command is run, you gain a Steam achievement
for every trophy that your player has already collected.
Note that you run the command by opening the console
"press ~" then type "claimtrophies" and hit enter.
- You can now create the file
"WorldNodes/xar/xar_block_overrides.txt".
This file lists xar nodes that are replaced
by Lua block scripts.
So for example suppose that xar_block_overrides.txt
has the following line:
"XAR_SMALL_YELLOW_FLOWER block_small_yellow_flower".
Then whenever the game tries to generate a chunk
of type XAR_SMALL_YELLOW_FLOWER, then
the block script block_small_yellow_flower.lua
will be used instead.
Specifically, the function
block_small_yellow_flower.__main
will be used to generate the chunk.
- Now any package that depends on the xar package
can have the __main functions of its Lua block scripts
create xar blocks.
So for example, a block script block_happy.lua could have the function
__main which creates blocks of type "XAR_SMALL_YELLOW_FLOWER".
- Now the __main functions of block scripts can
use the built in xar chunk generation code to generate them.
For example, the block script block_happy.lua can have its
__main function call create_xar_chunk("XAR_SMALL_YELLOW_FLOWER").
This will generate the xar small yellow flower chunk.
However after the call to create_xar_chunk,
the function block_happy.__main can continue to modify
the chunk.
For example, it can replace certain blocks with
other blocks.
- You can now enable and disable anisotropic filtering.
Use the variable "engine.render.anisotropic_filtering".
- There is now a command called "save passive".
This will do nothing if automatic saving is disabled.
If automatic saving is enabled, this command will save the
game only if at least five minutes have passed since
the last save or if there are 10,000 chunks that need
to be saved.
- "Constant saving" mode has been replaced with
"automatic saving", using the "save passive" command
described above.
That is, "save passive" is called whenever the player
is in a menu.
- Hardcore mode works differently.
Instead of saving the game constantly,
it uses "automatic saving".
However, if the player is in hardcore mode
and they either try to create a new game, load a game,
or exit the game, then the game will be forcibly saved.
- Now there is no rendering of "special basic entities" by the engine.
For example, green shrink rings are now rendered in Lua code
instead of being rendered in a hard coded way by the engine.
- Packages can now render weapons being held by the player.
This is accomplished by having Lua code
render meshes and modify the OpenGL matrix stack.
Indeed, from Lua code you can now render objects
in the world.
- The music system now loads music
in a separate thread.
- The system command "help" and the xar package command "help2"
have been merged into one.
Version 1.01.24:
- Date: November 2024
- Steam achievements have been added to the game.
There are currently a total of 244.
That is, there are 112 achievements for normal trophies,
21 achievements for completing the game under different
circumstances, and 111 achievements for "secret trophies".
Secret trophies are like normal trophies, but their locations
are not described in the game.
- In addition to the script Input/Scripts/program_startup.txt
run on startup (which is in the internal Lisp style language
of the program), also the script Input/Scripts/game_startup.lua
is run whenever the player loads a game.
This script can call the Lua code defined by the package.
- Now the console command "bind" exists,
which can be used to bind input events to actions.
This should be used in the game_startup.lua file.
- Now when selecting a package when starting a new game,
a thumbnail of the package is shown.
The thumbnails themselves are located in the About directory
of the package.
The About directory also contains the file about.txt,
which displays text about the package that the user sees
when selecting the package from the new game menu.
- Now from the point of view of Lua, all xar block type names
start with the prefix "XAR_".
These are the block types which are built into the C++ code.
On the other hand, the name of a block type
that is defined in Lua must start with "block_".
- All Lua functions that are called from C++ must now
start with a double underscore.
For example, "win_hud.render" is now "win_hud.__render".
- Allowed ability to turn vsync on and off.
Use the variable "engine.render.enable_vsync".
- Now the parameter "no_hud" can be passed to the screenshot command.
So, running the command "screenshot no_hud" will take a screenshot
but the hud and any other windows will not be rendered.
This is, just the world will be rendered.
- You can add music to be played while the user
is in the main menu (before a game is loaded)
by adding mp3 files to
Data/Packages/base/Music/base_main_menu.
Or, you can do this by making the mod
Input/Packages/base.
- Music now fades in and out.
- There are now meshes for both rockets and nukes.
The original mesh model and texture maps were created
by Carbo Lemons.
There are also meshes for rocket and nuke explosions.
- The variable "engine.worldgen.trust_manifest" is now true by default.
This improves chunk loading time on Linux.
Related to this, if the player deletes the manifest.txt file
in the chunks folder of their saved game,
then the engine will automatically rebuild the manifest
the next time they load that game.
The manifest is a list containing basic information
about each chunk file.
- Rewrote the command system of the xar package.
Now mods of the xar package can register their own commands.
Also, running the command gendoc generates an html file
in Output/Documentation that documents the commands for xar.
- It is now impossible to pass by certain key guards
if you do not have the correct key.
- Added another safeguard against telefragging monsters
when shrinking.
Version 1.01.23:
- Date: October 2024
- You can now add custom music to the game.
What you do is download a certain package that goes in the
Input/Packages directory, then you put songs into certain playlists
within that package.
The game will automatically call playlists with certain names
when your player is in various areas.
See here for more details.
- By creating the package Input/Packages/xar, you can override
game assets in the usual package Data/Packages/xar.
You can mod textures, sound, music, meshes, basic entities, moving entities,
environment rects, game scripts, window game scripts, and blocks.
- More properly guarded the boundary of Quicksand Grass.
- Made it so rectangular picture boxes only display the picture
on the front and back, and not on the extremely skinny sides.
Ahh, the end of an era.
- Now the user can set a variable that determines whether or not the
game is paused when the user alt-tabs.
- Now all places in the code that create directories wait for them
to be actually be created, and the program exits if too much time
has elapsed.
- Make it more difficulty to telefrag large monsters by shrinking into them.
- Now when you are spawned in the starting room when you start a new game,
the variable game.globals.xar.difficulty.speedrun_start is set to your current
time.
This way, at the end of the speedrun you can subtract this from
ga_get_game_time() to get the length of the speedrun minus the initial amount
of time it took to load the game.
In general, the speedrun_start variable is first set when the player enters
a env_rect_start_speedrun environment rect
(and the script for that is found in Data/Packages/xar/EnvRects).
- Fixed rendering problem of Q2MD2 character models.
- You can now paste into the console (control + v).
That is, you hold down the left control key and press v.
This just pastes to the last line that you are typing,
and it does not add anything beyond the first newline character found.
- You can now copy the current line being typed in the console
to the clipboard with control + c.
That is, you hold down control and press c.
You can copy the previous line of the console by doing control + 1.
You can copy the line above that one by doing control + 2, etc.
Also, if you do control + a, it copies everything in the
console window to your clipboard.
- The program now outputs the lines added to the console
to the file "Output/Console/console.txt".
- The command "gendoc" now also generates the file
Ouput/Documentation/xar/xar_builtin_block_types.txt
which lists the block names of all the C++ internal block types
used by the xar packge.
These do NOT have associated Lua block scripts.
- The xar package script win_credits.lua now calls
a script called game_credits_stats_render.lua which is responsible
for rendering the ending statistics of the player in the credits.
The user can copy this script to Input/Packages/xar/Game
and then modify this file to render whatever speedrunning
statistics the user wants.
Note how this copy overrides the original game_credits_stats_render.lua
file.
- Made it so the music volume can be set.
Also, there is a variable sound.music.pause_when_window_no_focus
specifies whether or not music is paused when the window
loses the focus.
- A red boarder is drawn around the screen when the
player's health is low.
- Improved the time it takes to start a new game (in the Xar package).
It now takes less than a second.
The key is adding a special solar system to every galaxy.
- Made a simple and an advanced version of the new game screen.
Players can switch between the two.
Version 1.01.22:
- Date: October 2024
- We increased the default draw distance.
The level radius for the player's level used to be 3,
now it is 4.
The main technical advance here is the "fertile radius".
The fertile radius determines which chunks contain non-block
entities.
So all chunks (on a level) outside the fertile radius
only contain blocks.
The fertile radius for the level of the player is still 3.
- Added new weapon mode: the Progressive Rocket.
These rockets have a very slow velocity and do not explode,
but they have a very high damage per second and
damage per ammo.
- Added a place called the "Stable Singletons Room"
next to the player's emergency waypoint.
This room has copies of some of the areas of the world,
so it is easy to come back to them later.
For example, when you enter I1 and eventually reach a
Williston City, you can touch an item which unlocks a
door in the I1 block in the Stable Singletons Room.
That block contains a copy of I1.
- The algorithm to teleport the player from one
chunk to another is now faster.
We now reuse more of the chunk tree.
Specifically, we keep the old chunk tree up until
the level where the source chunk path and the target
chunk path differ.
That is, we are building off of the old chunk tree trunk.
We call this "trunk teleporting".
- Added three large and challenging areas to I2:
Fanatic Spires, Creeping Jeni Plants, and Violets.
These require stealth and will help bridge the gap
between the early game and the late game.
- The primary homing weapon is now much better:
it launches a big ball, and if it kills a monster,
one minigun primary shot is shot towards every nearby monster.
- Rats now move slower.
- Added to the Secret Cave of Jerichos.
- Replaced white box devices in final boss area with arcades.
- Your EMP icon now looks yellow when you are close to the
boundary of your EMP sphere, and it looks red when you are outside
your EMP sphere.
Actually, it considers all EMP spheres you have detonated,
and it is red if you are outside all of them.
Remember that an EMP sphere only affects monsters on the
level where it was detonated.
- Added a windowed mode.
- Made the "Chunk Changes Object Tracker" faster
by hashing block paths differently.
Loading of chunks is now faster when the player
is hundreds of levels deep.
- Made quicksand grass 11 have X's on it to differentiate it
from quicksand grass 1 through 10.
Also we now use less quicksand grass 11 as a border
for the edges of quicksand grass 1.
- Made Oak Tree branches more interesting.