Diceboy Sunshine models were remade recently
Working on this discovery/mystery game called Above The Clouds. It’s a terrain based game and is my first proper take at such a game with 3 years of terrain modelling done in commisions.
Here is the game if you want to check it out ! : Beyond The Clouds - Roblox
Still going with Guardians: Battle Arena, focusing on PC/Console/Tablet now. Just introduced ranked games:
League of Legends in Roblox, nice
new global illumination module i’ve made for my gfxs
pre-existing modules on the devfourm didn’t meet my needs, they all had bad results
Made a gun in raw studio just for fun, gotta love unions then meshing from exporting obj and then optimizing.
Named it the GS-P21, the name a secret, the reason, yes.
I am currently working on an Dungeons type game which uses an isometric camera system.
What I’m working on?
Well… I introduce to you my “rosebud” and beloved project; breezy isle.
The reason why I call it my rosebud is due to it being the best experience I’ve ever taken out of paper so far. Apart from it being a stand-alone project, it’s meant to be a realistic/vibe-styled experience, having more mechanics than in any other project I’ve ever constructed!
I’m very proud of myself and how this is turning out, as it is a giant step-up in my career as a Roblox developer. Regardless of it still not being finished, my expectations to release it out in the seven seas lie around late January and mid March of 2025. Why? Simple. There are unfinished mechanics — or they require polishing —, uncompleted scripting, my list goes on.
Anyhow, I’ve decided to break down some of my favorite mechanics I’ve introduced into this experience, together with an array of photographs! Drum roll, please.
drum roll
I) Favorite mechanics!
When I said I created stacks of mechanics, I wasn’t joking. Here are a few — or maybe a couple — of mechanics I’ve designed! Some are unfinished, some need polishing, and some are completed.
- Treasure hunt/Daily rewards | Self-explanatory, but they’re a bit different. The treasure hunt isn’t looking around sand for a prompt or click detector, but you need a key hidden inside a shipwreck — undergoing investigation — and locate a treasure chest scattered in one out of five manually chosen locations — also inside the shipwreck!
- Realistic swimming | I’ve decided to introduce a depleting oxygen — client-sided — system to the game, for that pinch of realism. It’s also presented with bubble confetti!
- Seashell collection | Walking around pointlessly in a beach is boring, right? Well, not with this mechanic! You’ll eventually bump into seashells lying around the shore, just waiting to be collected! (Influences the fishing mechanic)
- Fishing | Self-explanatory, though you can buy rod upgrades — like a simulator — for your fishing rod, explore deeper oceans with fishing boats, and sell that fish for some useful goodies!
- Scuba-diving | Who said you couldn’t explore corals around these parts? Buy better swimming gear, say hi to dolphins, and enjoy the waters! (Impacted by the Oxygen mechanic).
II) Gallery!
Give your eyes a little treat — varies from person to person!
These images may contain bright light that may impact certain individuals. Viewer discretion is advised.
Looking forward for more amazing content! Might as well ask for public testing later when this experience is up and running. Regardless…
Cya around!
Working on a souls-like, here’s some stuff from our latest dev blog:
Sprint animation showcase
Custom animation editor I made to ease our animators workflow
In-game environment screenshot
an algorithm to encode binary voxels (essentially a 3-dimensional table storing booleans) into a buffer, which can then be further serialized to JSON via base64.
It uses LZW compression to store the coordinates of the voxels. Best case scenario it uses 3 bytes to represent each voxel regardless of location, although it is limited by the 32 bit signed integer limit.
buffer format explanation for nerds
The buffer format is [flag][size][dictionary][data]
-
flag
is a u8 representing the format to use for decoding the data, which is either u8, u16, or u32 (8, 16, or 32 respectively) -
size
is a u32 representing the length of the LZW dictionary, which is just a stream of numbers where the index is the ID -
dictionary
is4*size
bytes long because all elements use i32 (4 byte integer) -
data
takes up the remaining buffer, and depending on theflag
it uses either u8, u16, or u32 to represent IDs from the dictionary.- it is read in groups of 3 to represent the coordinates (X, Y, and Z) so the length of
data
is always a multiple of 3.
- it is read in groups of 3 to represent the coordinates (X, Y, and Z) so the length of
Code snippets
Encoder:
...
local b: buffer
if i < 2^8 then -- unsigned 8 bit encoding
b = buffer.create(5 + i*4 + #data)
buffer.writeu8(b, 0, 8)
buffer.writeu32(b, 1, i)
for j, v in mapList do
buffer.writei32(b, j*4+1, v)
end
for j, v in data do
buffer.writeu8(b, j+i*4+4, v)
end
elseif i < 2^16 then -- unsigned 16 bit encoding
b = buffer.create(5 + i*4 + #data*2)
buffer.writeu8(b, 0, 16)
buffer.writeu32(b, 1, i)
for j, v in mapList do
buffer.writei32(b, j*4+1, v)
end
for j, v in data do
buffer.writeu16(b, i*4+j*2+3, v)
end
else -- unsigned 32 bit encoding
b = buffer.create(5 + i*4 + #data*4)
buffer.writeu8(b, 0, 32)
buffer.writeu32(b, 1, i)
for j, v in mapList do
buffer.writeu32(b, j*4+1, v)
end
for j, v in data do
buffer.writeu32(b, i*4+j*4+1, v)
end
end
...
Decoder:
...
local t: Tensor.Tensor<boolean> = Tensor.new()
if intLen == 8 then
for i = 1, mapLen do
map[i] = buffer.readi32(b, i*4+1)
end
for i = mapLen*4+5, buffer.len(b)-1, 3 do
local x: number = buffer.readu8(b, i)
local y: number = buffer.readu8(b, i+1)
local z: number = buffer.readu8(b, i+2)
t:Set(map[x], map[y], map[z], true)
end
elseif intLen == 16 then
for i = 1, mapLen do
map[i] = buffer.readi32(b, i*4+1)
end
for i = mapLen*4+5, buffer.len(b)-1, 6 do
local x: number = buffer.readu16(b, i)
local y: number = buffer.readu16(b, i+2)
local z: number = buffer.readu16(b, i+4)
t:Set(map[x], map[y], map[z], true)
end
else
for i = 1, mapLen do
map[i] = buffer.readi32(b, i*4+1)
end
for i = mapLen*4+5, buffer.len(b)-1, 12 do
local x: number = buffer.readu32(b, i)
local y: number = buffer.readu32(b, i+4)
local z: number = buffer.readu32(b, i+8)
t:Set(map[x], map[y], map[z], true)
end
end
...
base64 may unintentionally spell out profanity
Are your models inspired by Half Life by any chance?
they’re made for a game centered around the events of half life one so, i dont know man you tell me :o)
Seems really interesting! Do you have a timeframe for when this could release?