A downloadable game for Windows, macOS, and Linux

A futuristic themed block game I made as part of a youtube devlog series.

Updated 18 hours ago
StatusIn development
PlatformsWindows, macOS, Linux
Rating
Rated 4.8 out of 5 stars
(110 total ratings)
AuthorFinalForEach
GenreSurvival
Made withGIMP, Audacity, libGDX
Tags3D, blocks, Multiplayer
Average sessionAbout a half-hour
LanguagesEnglish, Spanish; Latin America
InputsKeyboard, Mouse
AccessibilityConfigurable controls
MultiplayerServer-based networked multiplayer
LinksYouTube, Discord, Official Wiki, Reddit

Download

Download
cosmic-reach-linux.zip 84 MB
Version 0.3.20 18 hours ago
Download
cosmic-reach-windows.zip 81 MB
Version 0.3.20 18 hours ago
Download
cosmic-reach-jar.zip 50 MB
Version 0.3.20 18 hours ago
Download
cosmic-reach-server.zip 12 MB
Version 0.3.20 18 hours ago

Install instructions

I recommend you download the native version for your platform if you are on x64 windows or linux.

If you want to use the jar file instead you'll need Java 17 installed to run it.

Development log

View all posts

Comments

Log in with itch.io to leave a comment.

Viewing most recent comments 1 to 40 of 239 · Next page · Last page

New Discord exclusive Cosmic Reach version.

(4 edits)

I wrote a short story about the spooky furnace screenshots that I took. 

Edit: Just had to figure out the formatting here so I can make it look decent.


Cosmic Reach - The Hunger of the Furnace


After having scraped the resources off of the walls of yet another cave, I returned to the surface, only to find that it was pitch black outside. "Eh, whatever." I said before conveniently teleporting back to my house at the click of a button. Setting foot into the damp darkness of my basement, I began prepping for another trip to the caves. 

I stowed away my entire inventory of goods whilst rummaging through each of my crates, eventually finding out that I had no more stone tools in stock. More rummaging ensued, attempting to quickly look through the crates for sticks and basalt while my head occasionally decides to look towards a different direction for some reason. However, the beast that oversees the stocked goods, the Furnace Monster, let out a growl, and flared its eyes that were fixated upon me. 

"FEED... ME..." said the Furnace Monster, its deep voice echoing within the confines of the brick walls. "I've not enough wood for you." I replied. "It is of a rather tedious task to chop down enough trees to satisfy your hunger." The Furnace Monster's eyes flared brighter, illuminating the darkness that obscures the basement's layout. The stony furnace beast was not happy. 

"I.. AM... HUNGRY!.." said the Furnace Monster, with its angry voice shaking the brick walls. "GIVE... ME... WOOD... NOW!.." After catering to the furnace beast for several years, this monster is trying my patience. The more it demanded wood from me, the more it made my blood boil, fueling the growing seeds of rage deep within me. 

Ignoring the beast's orders, I began crafting more stone tools, having not the time to deal with its constant bellyaching. The Furnace Monster grew enraged, and it growled before letting out a huge roar that broke a few blocks, a couple vertical slabs, and even breaking a crate that was filled with neatly organized goods. "FEED... ME... NOOOOOWWWW!!!"

Upon turning to face the Furnace Monster,  I saw the mess of items strewn about the basement floor, and the sight of it all caused the fiery storm of rage within me to explode into a supernova of anger, and the rush of adrenaline that coursed through my veins turned me into a nightmare force of reckoning far greater than the Furnace Monster could ever hope to be. 

Staring deeply into the eyes of the Furnace Monster, I said unto it in a stern voice "I was kind enough to care for you all these years, giving you the comfort and warmth of my shelter when you sought me out for protection from the swarm of Interceptors."  And I continued, saying "I even went the extra mile to gather the leaf blocks and feed them to you, I wanted to ensure that you were happy and full." 

Regardless of my words, the Furnace Monster cared not, and it only kept its angry glowing red eyes fixated upon me in a futile attempt to intimidate me. I stood my ground and returned the roar, saying "Your unending hunger leaves me with nothing left to work with, constantly depleting my entire stock of wood and leaf blocks!" I continued, saying "And without a fuel source, I have nothing left to smelt ores, which prevents me from crafting better tools! How can I gather more stacks of wood when you are constantly burning through all of my resources?!" 

The stony furnace beast roared once more, its eyes glowed much brighter and began to spout fire, and the threatening display of aggression had shown that it was preparing to attack. The Furnace Monster, having been such a good friend of mine for so many years, has now become a hostile enemy, launching its first attack upon me. 

It grabbed me with its ghostly hands and pulled me towards its face before opening its mouth, revealing the brightly smoldering hot light of the lava within its stomach. Before I even had a chance to break free from the Furnace Monster's grip, it chucked me right into the searing hot pool of lava, inflicting an incredibly high amount of damage that took my life before presenting me with two options to choose from. 

But little did the Furnace Monster know that I had quickly chucked an entire stack of C4 blocks into the smoldering hot air right before my unfortunate demise, causing an explosion so great that the fabric of reality froze and became partially unstable. I clicked on the Respawn button a few times, but the world was struggling to keep up, forcing me to be patient and let it calculate the entire aftermath. 

It took a minute before the world finally caught up, and upon respawning in the house, I was greeted to the constant sounds of explosions coming from within the basement. I snickered, hearing the seemingly endless explosions coming from the same spot below. It took a good 3 minutes for the explosions to stop, and when I walked down into the basement to check out the aftermath, I busted out in laughter, I was in tears from what I was seeing! 

An entire stack of C4 blocks exploding in the same spot had created an empty sphere with the exact same radius that a single block of C4 would make! Oh the nonsensical nature of it all, it felt like watching a good comedy unfold before my eyes, and honestly, I needed a good laugh! Seeing the empty spherical chunk that had consumed a bit of my basement, I giggled a little and shook my head, saying "Oh you silly Furnace Monster, you forgot that this world is still in version 3.19 pre-alpha, didn't you?" 

I shrugged and said "Well, you'll just have to be a bit more patient before I can gather stacks of wood and leaf blocks more efficiently!" Despite the silliness of the recent chain of events, the world continued on without the Furnace Monster constantly nagging me for wood, and I was once again back to mining for ores, and punching Interceptors to get free blocks. 

This is the chaos that I live for. This is Cosmic Reach. 

hell yeah new creepypasta just dropped

When I wrote that story, I decided to combine the horror aspect with a hint of comedy. The comedy bits are sort of just 4th wall breaks, referencing a specific bug in the second paragraph and referencing some of the features in the game. 

The 3.19 pre-alpha version reference at the end of the story is a cleverly subtle way to tell the reader when this story was first written.


Screenshots taken by me (Sebbog) taken today, January 22, 2025, on a Windows 11 computer running Cosmic Reach on the itch launcher, of Cosmic Reach by FinalForEach or FFE, version pre-alpha-0.3.19.

I know controller support is in development, but PLEASE add thumbstick Deadzone support in the settings somewhere. Not all of us have perfectly good controllers ;-;

The game detects tiny, and I mean *tiny* changes in the thumbstick direction, so when I let go of the stick, my character still turns/moves slowly. I'm talking a fly breathing on my controller would be detected by the game. Turning and walking speeds feel good with a controller though.

Game looks very pretty! Can't wait to see what becomes of it.

(+1)

"Mom, there's a scary monster in the basement!"

The scary monster:

"Oh sweetie, there's no monster down there." 

*turns on light*

"That's just daddy's forge!"

A behind-the-scenes look at how I managed to make the furnaces look like a set of creepypasta horror eyes, I made use of some kind of light rendering bug that makes light bleed through the corners of blocks.

It would be really cool if this bug was somehow turned into a feature, maybe there could be some kind of chisel tool that we could craft which allows us to right-click on a block to allow the light to bleed through the corners.

Imagine the creative possibilities when you see this, I went into a cave and surrounded a blue light with slabs to make it look like some kind of radioactive block.

Tortellini Soup has a new YouTube channel.
https://www.youtube.com/@AliceWintersoft
https://www.youtube.com/watch?v=CtM634gYVAE

The first video.

From the official discord server. Screenshot was taken today, December 29, 2024.

(+1)

this is like, minecraft. but better

(-1)

ip to join?

IP?

(+1)

New FinalForEach upload!!! 

(+1)

He finally uploaded again: 

i know this was from the previous update, but i really gotta admit that i LOVE the new fog feature

anyways, here's some wallpapers for anyone to use :D these were all screenshots from me

oh hey the game just updated

correct

(1 edit)

Can we get the source code? I'm making my own voxel game, and was having issues with the block place/break raycasting skipping over blocks. Took me like 15 minutes to find the class I needed, and only found it through the debug menu. It's also really hard to understand the code because it's decompiled, there's no comments, I have to guess at some of the variable names, and have to manually find classes and methods. 

This screenshot was taken today, November 24, 2024,  18:44:05 (6:44:05 PM) UTC+1

FinalForEach, FFE, Cosmic Reach,  CR, Cosmic Reach devlog, Cosmic Reach devlogs, Cosmic Reach discord server.

A new devlog is coming out soon.

been waiting for a way to obtain AND place water in survival, great update :D

this game’s really cool how long did it take for you to make it

I've been working on it since August of last year!

It says: "unable to authenticate your account", what do I do to do that?

If you aren't running it through the itch launcher, then do so, otherwise you'll need to pass in your itch api key through an environment variable. Let me know if you still have trouble!

Thanks!

this is one of the happiest moments in my life.


This screenshot was taken today, November 3, 2024, 13:32:21 UTC+1.

Cosmic Reach multiplayer Cosmic Reach discord server

If anyone is looking for an anarchy survival server for the new update, Cosmic Anarchy has been running for a while with the discord prereleases and it has updated to the full release now.

IP: even-firefox.gl.at.ply.gg:12364

(1 edit)

Cool server, kinda laggy tho.  I played for a little while but got frustrated with how nothing would load.  Despite that, I have high hopes for the server's future


This screenshot was taken today, October 28, 2024, 15:34:43 UTC+1 by me (Sebbog)

Cosmic Reach 0.3.2-pre8 Cosmic Reach pre release versions Cosmic Reach discord versions 0.3.2 pre release 8 Cosmic Reach 0.3.2-pre7 Cosmic Reach pre release versions Cosmic Reach discord versions 0.3.2 pre release 7 Cosmic Reach Multiplayer



This screenshot was taken by Sebbog (me) today October 28, 2024 15:30:49 UTC+1

Cosmic Reach 0.3.2-pre99 Cosmic Reach pre release versions Cosmic Reach discord versions 0.3.2 pre release 9 Cosmic Reach Multiplayer

how to write a bug report??
just in case here is the bug

I pressed ESC to pause and pressed it again mistakenlly.

This screenshot was taken today, October 20, 2024, 01:01:32 UTC+2


Cosmic Reach 0.3.2-pre6 Cosmic Reach pre release versions Cosmic Reach discord versions 0.3.2 pre release 6

This screenshot was taken today, October 8, 2024, 04:38:48 UTC+2

Cosmic Reach 0.3.2-pre5


Four new Discord only updates. Screenshot was taken today, October 7, 2024,  21:16:51 UTC+2. Cosmic Reach multiplayer is nearly done.

Hopefully 0.3.2 will be fully ready within the next few weeks (?). Multiplayer will change things a lot.

agreed.

and i can't wait until we get an official character model

New Discord exclusive update. https://discord.com/invite/geAmdvpXv2

Screenshot was taken today on October 6, 2024 00:02:13 UTC+2

(1 edit)

bug

  1. water splits
(+1)

The screenshot was taken on September 14, 2024, 9:29:51 PM UTC+2.

The update has now been released, 0.3.0.

(3 edits)

its realy fun to play with collerd light and I almost dont have a lot of issues compaired to the previous time: When in a cave I dont get a lot of rendering issues, but I seem to have some dark block blobs that seem to exist, but also not! and a bit of the orginail rendering glitch, 2024-09-13_20-16-36.png but a lot less than before. my last post from 3 month ago It seem to have picked up java 21 and I have more than 3 or 4 java versions installed on my pc: java 8, 16, 17 and 21 image of java versions: image.png game debug log java 21 picked up: image.png I cant change it as far as I know, if someone knows how to change the java version used in the game when launched via itch (example: in itch, some setting), plz. reply where! I find it playeble at the moment even with the rendering glitch what may be caused by using java 21 instead of my installed java 17 (added replies with more info)

close up shot of java versions: image.png close up to logs: image.png Black blob: (note: image is dark) 2024-09-13_20-55-03.png render glitch at night: 2024-09-13_20-55-13.png render glitch at day: 2024-09-13_20-56-44.png

(1 edit)

Debug log: (1/2)

* Game version: 0.2.5
* Ran for : 6 minutes, 30 seconds
* Current time: 2024-09-13 at 21:00:38.515505400+02:00[Europe/Amsterdam]
* Operating system: Windows 10 10.0
* Arch: amd64
* Java VM name: Java HotSpot(TM) 64-Bit Server VM
* Java runtime version: 21.0.4+8-LTS-274
* System user language: nl
* CPU model: Intel(R) Core(TM) i5-6400 CPU @ 2.70GHz
* Save location free / total space: 549,98 GB / 930,703 GB
* Available processors: 4
* Native heap use: 19 MB
* Java heap use: 19 MB
* Max memory available: 3,967 GB
* RAM available: 15,863 GB
* getGLVersion: 
Type: OpenGL
Version: 4:6:0
Vendor: Intel
Renderer: Intel(R) HD Graphics 530
* Prestart error logs: 
[LWJGL] OpenGL debug message
    ID: 0x0
    Source: SHADER COMPILER
    Type: OTHER
    Severity: MEDIUM
    Message: SHADER_ID_COMPILE other warning has been generated. GLSL compile warning(s) for shader 22, "": WARNING: 0:1: '' :  #version directive missing


[LWJGL] OpenGL debug message
    ID: 0x0
    Source: SHADER COMPILER
    Type: OTHER
    Severity: MEDIUM
    Message: SHADER_ID_COMPILE other warning has been generated. GLSL compile warning(s) for shader 23, "": WARNING: 0:5: '' :  #version directive missing


[LWJGL] OpenGL debug message
    ID: 0x0
    Source: SHADER COMPILER
    Type: OTHER
    Severity: MEDIUM
    Message: SHADER_ID_COMPILE other warning has been generated. GLSL compile warning(s) for shader 25, "": WARNING: 0:1: '' :  #version directive missing


[LWJGL] OpenGL debug message
    ID: 0x0
    Source: SHADER COMPILER
    Type: OTHER
    Severity: MEDIUM
    Message: SHADER_ID_COMPILE other warning has been generated. GLSL compile warning(s) for shader 26, "": WARNING: 0:5: '' :  #version directive missing



* Exception logs: 
java.lang.RuntimeException: Caused a manual crash, not a bug!
SHADERS:
* ChunkShader: chunk.vert.glsl, chunk.frag.glsl
    VERTEX: #version 150
    #ifndef chunk_vert_glsl
    #define chunk_vert_glsl
    
    //in vec3 a_position;
    //in int a_uvAoPackedColorAttrib;
    
    in vec4 a_lighting;
    uniform vec3 u_batchPosition;
    uniform mat4 u_projViewTrans;
    uniform mat4 u_modelMat;
    
    out vec2 v_texCoord0;
    out vec3 worldPos;
    out vec4 blocklight;
    out vec3 faceNormal;
    
    #ifndef common_bitUnpacker_glsl
    #define common_bitUnpacker_glsl
    #define GET_TEX_COORDS getTexCoordsFromUVIdx(int(a_uvIdx))
    #define GET_VERT_NORMAL getVertNormalFromIdx(int(a_uvIdx))
    #define GET_FACE_NORMAL getFaceNormalFromIdx(int(a_uvIdx))
    #define GET_BLOCK_VERT_POSITION getBlockVertexPosition(int(a_uvIdx), int(a_positionPacked))
    
    #define NUM_FLOATS_PER_FACE_UVTEXBUFF (2 + 3 + 3 + 3)
    
    in float a_positionPacked;
    in float a_uvIdx;
    uniform samplerBuffer texBuffer;
    
    vec2 getTexCoordsFromUVIdx(int modelId)
    {
        int i = NUM_FLOATS_PER_FACE_UVTEXBUFF * modelId;
        return vec2(texelFetch(texBuffer, i).r, 
                    texelFetch(texBuffer, i+1).r);
    }
    vec3 getVertNormalFromIdx(int modelId)
    {
        int i = NUM_FLOATS_PER_FACE_UVTEXBUFF * modelId;
        return vec3(texelFetch(texBuffer, i+2).r,
                    texelFetch(texBuffer, i+3).r,
                    texelFetch(texBuffer, i+4).r);
    }
    vec3 getFaceNormalFromIdx(int modelId)
    {
        int i = NUM_FLOATS_PER_FACE_UVTEXBUFF * modelId;
        return vec3(texelFetch(texBuffer, i+5).r,
                    texelFetch(texBuffer, i+6).r,
                    texelFetch(texBuffer, i+7).r);
    }
    
    vec3 getBlockVertexPosition(int modelId, int packedPosition)
    {
        int i = NUM_FLOATS_PER_FACE_UVTEXBUFF * modelId;
        vec3 offset = vec3(texelFetch(texBuffer, i+8).r,
                    texelFetch(texBuffer, i+9).r,
                    texelFetch(texBuffer, i+10).r);
    
        int px = (packedPosition >> 12) & 0x3F;
        int py = (packedPosition >> 6) & 0x3F;
        int pz = (packedPosition) & 0x3F;
        vec3 blockPos = vec3(float(px), float(py), float(pz));
    
        return blockPos + offset;
    }
    
    int getUvAoBits(int uvAoPackedColor)
    {
        return (uvAoPackedColor >> 16) & 65535;
    }
    
    int getPackedColorBits(int uvAoPackedColor)
    {
        return uvAoPackedColor & 65535;
    }
    
    vec4 getBlockLight(int packedColorBits)
    {
        return vec4(((packedColorBits) & 15), (packedColorBits >> 4) & 15, (packedColorBits >> 8) & 15, (packedColorBits >> 12)) / 16.0;
    }
    #endif //common_bitUnpacker_glsl
    
    
    void main() 
    {
        worldPos = GET_BLOCK_VERT_POSITION + u_batchPosition;
        
        //int packedColorBits = getPackedColorBits(a_uvAoPackedColorAttrib);
        blocklight = a_lighting;//getBlockLight(packedColorBits);
        
        //int uvAoBits = getUvAoBits(a_uvAoPackedColorAttrib);
        v_texCoord0 = GET_TEX_COORDS;
    
        faceNormal = GET_FACE_NORMAL;
    
        gl_Position = (u_projViewTrans * u_modelMat * vec4(worldPos, 1.0));
    }
    #endif //chunk_vert_glsl
    
    FRAG: #version 150
    #ifndef chunk_frag_glsl
    #define chunk_frag_glsl
    #ifdef GL_ES 
    precision mediump float;
    #endif
    
    uniform vec3 skyAmbientColor;
    uniform vec4 tintColor;
    uniform vec3 worldAmbientColor;
    
    in vec2 v_texCoord0;
    in vec3 worldPos;
    in vec4 blocklight;
    in vec3 faceNormal;
    
    uniform sampler2D texDiffuse;
    uniform vec3 u_sunDirection;
    
    out vec4 outColor;
    
    void main() 
    {
        vec2 tilingTexCoords = v_texCoord0;
    
        vec4 texColor = texture(texDiffuse, v_texCoord0);
    
        if(texColor.a == 0)
        {
            discard;
        }
    
        vec3 blockAmbientColor = skyAmbientColor * max(dot(u_sunDirection, faceNormal), 0.5);
    
        // https://www.desmos.com/calculator
        // y\ =\ \frac{30}{1+e^{-15\left(\frac{x}{25}\right)^{2}}}-15
        vec3 it =  pow(15*blocklight.rgb / 25.0, vec3(2));
        vec3 t = 30.0/(1.0 + exp(-15.0 * it)) - 15;
        vec3 lightTint = max(t/15, blocklight.a * blockAmbientColor);
    
        //lightTint = max(lightTint, vec3(0.1));
        //texColor = vec4(1);
       
        outColor = tintColor * vec4(texColor.rgb * lightTint, texColor.a);
    
        outColor.rgb = max(outColor.rgb, texColor.rgb * worldAmbientColor);
    
    }
    #endif //chunk_frag_glsl
    
* ChunkShader: chunk-water.vert.glsl, chunk-water.frag.glsl
    VERTEX: #version 150
    #ifndef chunk_water_vert_glsl
    #define chunk_water_vert_glsl
    
    //in vec3 a_position;
    //in int a_uvAoPackedColorAttrib;
    in vec4 a_lighting;
    uniform vec3 u_batchPosition;
    
    uniform mat4 u_projViewTrans;
    uniform mat4 u_modelMat;
    uniform float u_time;
    uniform vec3 cameraPosition;
    
    out vec2 v_texCoord0;
    out vec4 blocklight;
    out float waveStrength;
    out vec3 worldPos;
    out vec3 toCameraVector;
    
    #ifndef common_bitUnpacker_glsl
    #define common_bitUnpacker_glsl
    #define GET_TEX_COORDS getTexCoordsFromUVIdx(int(a_uvIdx))
    #define GET_VERT_NORMAL getVertNormalFromIdx(int(a_uvIdx))
    #define GET_FACE_NORMAL getFaceNormalFromIdx(int(a_uvIdx))
    #define GET_BLOCK_VERT_POSITION getBlockVertexPosition(int(a_uvIdx), int(a_positionPacked))
    
    #define NUM_FLOATS_PER_FACE_UVTEXBUFF (2 + 3 + 3 + 3)
    
    in float a_positionPacked;
    in float a_uvIdx;
    uniform samplerBuffer texBuffer;
    
    vec2 getTexCoordsFromUVIdx(int modelId)
    {
        int i = NUM_FLOATS_PER_FACE_UVTEXBUFF * modelId;
        return vec2(texelFetch(texBuffer, i).r, 
                    texelFetch(texBuffer, i+1).r);
    }
    vec3 getVertNormalFromIdx(int modelId)
    {
        int i = NUM_FLOATS_PER_FACE_UVTEXBUFF * modelId;
        return vec3(texelFetch(texBuffer, i+2).r,
                    texelFetch(texBuffer, i+3).r,
                    texelFetch(texBuffer, i+4).r);
    }
    vec3 getFaceNormalFromIdx(int modelId)
    {
        int i = NUM_FLOATS_PER_FACE_UVTEXBUFF * modelId;
        return vec3(texelFetch(texBuffer, i+5).r,
                    texelFetch(texBuffer, i+6).r,
                    texelFetch(texBuffer, i+7).r);
    }
    
    vec3 getBlockVertexPosition(int modelId, int packedPosition)
    {
        int i = NUM_FLOATS_PER_FACE_UVTEXBUFF * modelId;
        vec3 offset = vec3(texelFetch(texBuffer, i+8).r,
                    texelFetch(texBuffer, i+9).r,
                    texelFetch(texBuffer, i+10).r);
    
        int px = (packedPosition >> 12) & 0x3F;
        int py = (packedPosition >> 6) & 0x3F;
        int pz = (packedPosition) & 0x3F;
        vec3 blockPos = vec3(float(px), float(py), float(pz));
    
        return blockPos + offset;
    }
    
    int getUvAoBits(int uvAoPackedColor)
    {
        return (uvAoPackedColor >> 16) & 65535;
    }
    
    int getPackedColorBits(int uvAoPackedColor)
    {
        return uvAoPackedColor & 65535;
    }
    
    vec4 getBlockLight(int packedColorBits)
    {
        return vec4(((packedColorBits) & 15), (packedColorBits >> 4) & 15, (packedColorBits >> 8) & 15, (packedColorBits >> 12)) / 16.0;
    }
    #endif //common_bitUnpacker_glsl
    
    
    void main() 
    {
        worldPos = GET_BLOCK_VERT_POSITION + u_batchPosition;
    
        v_texCoord0 = GET_TEX_COORDS;
        blocklight = a_lighting;
    
        toCameraVector = cameraPosition - worldPos;
        vec3 normal = GET_VERT_NORMAL;
    
    
        float xOff = 0;
        float zOff = 0;
        if(normal.y < 0)
        {
            //waveStrength = 0.2;
            xOff = normal.x * -0.001;
            zOff = normal.z * -0.001;
        }
        //else
        {
            float waveSpeed = 0.25;
            float waveTime = waveSpeed * u_time;
            float scale = 5;
            float wavePositionA = 10 * (cos(worldPos.x*scale) + sin(worldPos.z*scale));
            float wavePositionB = 10 * (sin(worldPos.x*scale) + cos(worldPos.z*scale));
    
            waveStrength = 0.1 * (sin(waveTime + wavePositionA) * cos(waveTime + wavePositionB));
        }
        
        gl_Position = u_projViewTrans * u_modelMat * vec4(worldPos.x + xOff, worldPos.y + waveStrength - 0.2, worldPos.z + zOff, 1.0);
    }
    #endif //chunk_water_vert_glsl
    
    FRAG: #version 150
    #ifndef chunk_water_frag_glsl
    #define chunk_water_frag_glsl
    #ifdef GL_ES 
    precision mediump float;
    #endif
    
    uniform float u_time;
    uniform vec3 skyAmbientColor;
    uniform vec3 skyColor;
    uniform vec4 tintColor;
    uniform vec3 worldAmbientColor;
    
    in vec2 v_texCoord0;
    in vec4 blocklight;
    in float waveStrength;
    in vec3 worldPos;
    in vec3 toCameraVector;
    
    uniform sampler2D texDiffuse;
    uniform sampler2D noiseTex;
    
    out vec4 outColor;
    
    void main() 
    {
    
        vec2 numTiles = floor(v_texCoord0);
        vec2 tilingTexCoords = v_texCoord0;
        
        if(numTiles.xy != vec2(0, 0))
        {
            tilingTexCoords = (v_texCoord0 - numTiles);
            vec2 flooredTexCoords = floor((v_texCoord0 - numTiles) * 16) / 16;
            numTiles = numTiles + vec2(1,1);
    
            tilingTexCoords = flooredTexCoords + mod(((tilingTexCoords - flooredTexCoords) * numTiles) * 16, 1) / 16;
        }
    
        vec4 texColor = texture(texDiffuse, tilingTexCoords);
    
        vec3 viewVector = normalize(toCameraVector);
        vec3 faceNormal = vec3(0.0, 1.0, 0.0);
        float fresnel = abs(dot(viewVector, faceNormal));
    
        vec2 noiseUV = 0.2*vec2(waveStrength - 0.1) + worldPos.xz / 16.0;
        noiseUV+=vec2(u_time*0.02);
        vec2 distortion = fresnel * texture(noiseTex, noiseUV).rg;
        vec3 waterColor = texColor.rgb;
    
        fresnel = pow(fresnel, mix(3, 1, 2*(waveStrength - 0.1 + distortion.r/3.0)));
        fresnel = pow(fresnel, 0.35);
        waterColor = mix(waterColor * 0.5, waterColor, 0.5 + 0.5*waveStrength*(1-fresnel));```
(1 edit)

debug log: (2/2)

        waterColor = mix(waterColor, skyColor, blocklight.a * (1-fresnel));
    
    
        vec3 lightTint = max(blocklight.rgb, blocklight.a * skyAmbientColor);
        float alpha = mix(texColor.a*2.0, texColor.a*0.5, fresnel);
        
        if(alpha == 0)
        {
            discard;
        }
    
        outColor = vec4(waterColor * lightTint, alpha);
        outColor.rgb = mix(outColor.rgb, skyColor, blocklight.a * (1-fresnel));
        outColor *= tintColor;
        outColor.rgb = max(outColor.rgb, texColor.rgb * worldAmbientColor);
    }
    #endif //chunk_water_frag_glsl
    
* SkyStarShader: sky-star.vert.glsl, sky-star.frag.glsl
    VERTEX: #version 150
    #ifndef sky_star_vert_glsl
    #define sky_star_vert_glsl
    
    in vec3 a_position;
    
    uniform mat4 u_projViewTrans;
    
    void main() 
    {
        gl_Position = u_projViewTrans * vec4(a_position, 1.0);
        
    }
    #endif //sky_star_vert_glsl
    
    FRAG: #version 150
    #ifndef sky_star_frag_glsl
    #define sky_star_frag_glsl
    #ifdef GL_ES 
    precision mediump float;
    #endif
    
    out vec4 outColor;
    
    void main() 
    {
        outColor = vec4(1);
    }
    #endif //sky_star_frag_glsl
    
* SkyShader: sky.vert.glsl, sky.frag.glsl
    VERTEX: #version 150
    #ifndef sky_vert_glsl
    #define sky_vert_glsl
    
    in vec3 a_position;
    in vec3 a_normal;
    
    uniform mat4 u_projViewTrans;
    uniform vec3 cameraPosition;
    
    out vec3 v_position;
    out vec3 v_position_adjusted;
    out vec3 v_normal;
    
    void main() 
    {
        v_normal = a_normal;
        vec3 p = a_position;// - vec3(0, min(cameraPosition.y, 20), 0);
        gl_Position = u_projViewTrans * vec4(p, 1.0);
        v_position = p;
        v_position_adjusted = p;// + vec3(0, cameraPosition.y - 32, 0);
    }
    #endif //sky_vert_glsl
    
    FRAG: #version 150
    #ifndef sky_frag_glsl
    #define sky_frag_glsl
    #ifdef GL_ES 
    precision mediump float;
    #endif
    
    in vec3 v_position;
    in vec3 v_position_adjusted;
    in vec3 v_normal;
    out vec4 outColor;
    uniform vec3 u_sunDirection;
    uniform vec3 cameraPosition;
    
    void main() 
    {
        vec3 pos_normal = normalize(v_position);
        vec3 pos_adj_normal = normalize(v_position);
        float sunRadius = 0.005;
        float sun_dot = dot(u_sunDirection, pos_normal);
        float noon_dot = dot(u_sunDirection, vec3(0, 1, 0));
        float sunFactor = (sun_dot - (1 - sunRadius)) / sunRadius;
        float horizonFactor = 1-abs(pos_adj_normal.y);
        
        vec3 upperColor = vec3(0.1, 0.4, 0.7);
        float upperHalfFactor = sqrt(max(0, dot(vec3(0,1,0), pos_adj_normal)));
        float upperColorFactor = upperHalfFactor * clamp(1 - (pow(1 - noon_dot, 3)), 0, 1);
        vec3 lowerColor = vec3(0.2, 0.4, 0.7) * 3;
        float lowerColorFactor = (1 - max(0, upperHalfFactor)) * max(0, (noon_dot +0.75)/1.75);
        vec3 skyColor = (upperColor * upperColorFactor) + (lowerColor * lowerColorFactor);
    
        float sunsetOrSunRiseFactor = pow(1-abs(noon_dot), 2);
        vec3 redHorizonColor = vec3(3, 0, 0) * pow(horizonFactor,4) * sunsetOrSunRiseFactor;
        skyColor = max(skyColor, redHorizonColor);
    
        vec3 crossDir = cross(u_sunDirection, vec3(0,1,0));
        float sunHorizonFlareFactor = pow(1 - pow(dot(cross(u_sunDirection, crossDir), pos_normal), 2), 8) * pow(1 - abs(noon_dot), 4) * sun_dot;// * max(0, (noon_dot+0.25)/1.25);
        vec3 sunFlareHorizonColor = vec3(1,1,0) * sunHorizonFlareFactor;
        skyColor = max(skyColor, sunFlareHorizonColor);
    
    
        vec3 sunColor = vec3(1, 0.9, 0.6) * sunFactor;
    
        skyColor = max(skyColor, sunColor);
    
        float alpha = max(0.1, max(min(length(skyColor), (sun_dot+2)/3), min(1, round(sunFactor*2)))) + max(0, noon_dot);
        alpha = max(0, min(alpha, 1));
       
        outColor = vec4(skyColor / alpha, alpha);
    }
    #endif //sky_frag_glsl
    
* EntityShader: entity.vert.glsl, entity.frag.glsl
    VERTEX: #version 150
    #ifndef entity_vert_glsl
    #define entity_vert_glsl
    
    in vec3 a_position;
    in vec2 a_texCoord0;
    
    out vec2 v_texCoord0;
    
    uniform mat4 u_projViewTrans;
    uniform mat4 u_modelMat;
    
    void main() 
    {
        v_texCoord0 = a_texCoord0;
        gl_Position = u_projViewTrans * u_modelMat * vec4(a_position, 1.0);    
    }
    #endif //entity_vert_glsl
    
    FRAG: #version 150
    #ifndef entity_frag_glsl
    #define entity_frag_glsl
    #ifdef GL_ES 
    precision mediump float;
    #endif
    
    in vec2 v_texCoord0;
    
    uniform sampler2D texDiffuse;
    uniform vec4 tintColor;
    
    out vec4 outColor;
    
    void main() 
    {
        vec4 texColor = texture(texDiffuse, v_texCoord0);
    
        if(texColor.a == 0)
        {
            discard;
        }
    
        outColor = texColor * tintColor;
    }
    #endif //entity_frag_glsl
    
* SpriteBatchShader: death-screen.vert.glsl, death-screen.frag.glsl
    VERTEX: #version 150
    #ifndef death_screen_vert_glsl
    #define death_screen_vert_glsl
    
    in vec4 a_position;
    in vec4 a_color;
    in vec2 a_texCoord0;
    
    uniform mat4 u_projTrans;
    
    out vec4 v_color;
    out vec2 v_texCoords;
    
    void main()
    {
       v_color = a_color;
       v_color.a = v_color.a * (255.0/254.0);
       v_texCoords = a_texCoord0;
       gl_Position =  u_projTrans * a_position;
    }
    #endif //death_screen_vert_glsl
    
    FRAG: #version 150
    #ifndef death_screen_frag_glsl
    #define death_screen_frag_glsl
    
    in vec4 v_color;
    in vec2 v_texCoords;
    
    uniform sampler2D u_texture;
    uniform float u_time;
    
    out vec4 outColor;
    
    void main()
    {
        float s1 = u_time + v_texCoords.y*100 + 3*cos(u_time/10 + v_texCoords.x);
        float s2 = dot(normalize(vec2(v_texCoords)-0.5), vec2(sin(u_time), cos(u_time)));
    
        outColor = v_color * texture2D(u_texture, v_texCoords) * vec4(vec3((0.9 + 0.1*sin(s1))), 1) * (6+s2)/7;
    }
    #endif //death_screen_frag_glsl
    
* ItemShader: assets/base/shaders/item_shader.vert.glsl, assets/base/shaders/item_shader.frag.glsl
    VERTEX: #version 150
    #ifndef assets_base_shaders_item_shader_vert_glsl
    #define assets_base_shaders_item_shader_vert_glsl
    
    // Contributors: Shfloop, Mr-Zombii
    
    in vec3 a_position;
    in vec2 a_texCoord0;
    in vec3 a_normal;
    out vec2 v_texCoord0;
    
    uniform mat4 u_projViewTrans;
    uniform mat4 u_modelMat;
    
    out vec3 v_normal;
    
    void main()
    {
    
        v_normal = normalize(a_normal); // Mult by u_modelMat for world space vectors
        v_texCoord0 = a_texCoord0;
        gl_Position = u_projViewTrans * u_modelMat * vec4(a_position, 1.0);
    }
    #endif //assets_base_shaders_item_shader_vert_glsl
    
    FRAG: #version 150
    #ifndef assets_base_shaders_item_shader_frag_glsl
    #define assets_base_shaders_item_shader_frag_glsl
    #ifdef GL_ES
    precision mediump float;
    #endif
    
    // Contributors: Shfloop, Mr-Zombii
    
    in vec2 v_texCoord0;
    in vec3 v_normal;
    
    uniform sampler2D texDiffuse;
    uniform vec4 tintColor;
    uniform int isInSlot;
    
    out vec4 outColor;
    
    void main()
    {
        // arbitrary numbers might want to mess around with
        float faceShade = abs(dot(vec3(0,0,1), v_normal) ) + 0.6;
        faceShade *= abs(dot(vec3(0,1,0), v_normal) + 0.8);
        faceShade *= 1.0;
        vec4 texColor = texture(texDiffuse, v_texCoord0);
    
        if(texColor.a == 0)
        {
            discard;
        }
    
        if (isInSlot == 1) {
            outColor = texColor;
            return;
        } else outColor = vec4(texColor.rgb * faceShade , texColor.a) * tintColor;
    }
    #endif //assets_base_shaders_item_shader_frag_glsl
    

    at finalforeach.cosmicreach.gamestates.OptionsMenu$10.onClick(OptionsMenu.java:292)
    at finalforeach.cosmicreach.ui.UIElement.drawBackground(UIElement.java:145)
    at finalforeach.cosmicreach.gamestates.GameState.drawUIElements(GameState.java:121)
    at finalforeach.cosmicreach.gamestates.OptionsMenu.render(OptionsMenu.java:335)
    at finalforeach.cosmicreach.BlockGame.render(BlockGame.java:132)
    at com.badlogic.gdx.backends.lwjgl3.Lwjgl3Window.update(Lwjgl3Window.java:387)
    at com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application.loop(Lwjgl3Application.java:193)
    at com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application.<init>(Lwjgl3Application.java:167)
    at finalforeach.cosmicreach.lwjgl3.Lwjgl3Launcher.createApplication(Lwjgl3Launcher.java:104)
    at finalforeach.cosmicreach.lwjgl3.Lwjgl3Launcher.main(Lwjgl3Launcher.java:92)```
(+1)

good game, hell next thing you know there's gonna be modding support.

there is modding support from at least few months

(+1)

minecraft: moon edition

hopefully people don't say that this was copied/inspired by another block building game

is infinite miner like game...

It's a pixark clone

i thought it was a eaglercraft clone

(1 edit)
_01 clone

this game is actually frickin sweet

a way to wire the colored bulbs together and program how they turn on and off would be awesome! imaging using red, green, and blue bulbs to make a functioning display!

that's what makes this game awesome :D the lightning and shadows too, it's clever how they depend on daylight rather than just if a block is there or not

will you make a  mac port pls

Download cosmic-reach-jar.zip and unzip it. That will give you a .jar file. You should be able to just double click that to run it.

Although the game does state that mac is not supported, I've been following the game's development for a while now on my mac, and haven't noticed any issues.

thx but can you open it with later versions of java

Sorry for the late reply

I have java 22, 17, and 1.8 installed, pretty sure 22 is the latest, so yes

Deleted 145 days ago
Deleted 145 days ago

Mac version eventually?

There is no platform-specific release for mac yet, but you can download the "jar" version and run it. If you don't have already, you need to install a Java 17 (or later) Runtime so you can run .jar files.

Viewing most recent comments 1 to 40 of 239 · Next page · Last page