STEAM PAGE AND DEMO ARE NOW AVAILABLE: https://store.steampowered.com/app/868160/Code_Terraform/

A deep programming game on a frozen alien planet. Write real code to drive rovers, run power grids, fabricate parts, and fly drone fleets across the world. Your scripts run while you plan your next move. The more you terraform, the more the planet responds.

Wishlist on Steam: https://store.steampowered.com/app/868160/Code_Terraform/

Discord to chat about the game: https://discord.gg/hUrK2MRn8s

Updated 17 days ago
StatusIn development
PlatformsHTML5
Rating
Rated 4.3 out of 5 stars
(6 total ratings)
AuthorSpyros
GenreSimulation
TagsAtmospheric, Automation, colony-sim, factory, Idle, Incremental, programming, Sandbox, Space, terraform
LinksSteam
AI DisclosureAI Assisted, Code, Graphics, Sounds

Development log

Comments

Log in with itch.io to leave a comment.

There is no explanation on how to connect to earth?? i've got the thermometer and transmitter but im stuck now

Hi !

Please feel free to visit our Discord,  I am always there among a lot of people and we are discussing and solving things together ! It's a lot of fun :)

In terms of earth connectivity once you get the transmitter do sth like:

transmitter.connect("earth")

and now this transmitter is connected to earth. Next is to send the thermometer value like:

transmitter.transmit("current_temperature", temp)

The INFO tab of uplink.py tells you all the info on how to connect to earth and DOCS(top right button) have even more details about how things work :)

(1 edit)

alright i just think it'd be good to add that in the tutorial as i was confused (beginner programmer) it also wasn't in the info tab

I have changed a lot of of DOCS/info in the current version, it's just that they are not in the demo build.

The full game also has a dedicated Tutorial mode outside of the game that teaches new players the language and the game mechanics.

(+1)

Maybe a silly question but where can I find the main menu song? I love it!

I've been asked a lot about it ! Nice to see that people like it so much. It's custom made only for the game though, it's not out there anywhere else :)

(+1)

I guess I'll have to buy the game when it comes out on steam just to listen to it then. Great work on this! 

:D I hope you still like the game !

(2 edits)

A couple interesting things to note:

Some puzzles refer to a range, but since 'out of range submission' and 'no submission' are the same penalty, but the latter takes longer, the solutions always just end up being 'if greater than minimum'. Might be worth reworking the puzzles to either approach from below or from above

Scripts aren't automatically copied between machines when you add a new one, just making it so other machines copy machine_1 when first made would be an easy QoL boost! 


The generated music gets a little... incoherent, might be worth reprompting the generator for it!
   

I do generally like the game though, and the puzzles going for it, so I'll have to watch the steam page for it, I suppose!

Thanks ! Do you have an example for the range one ? I want to check it but i am not sure what you are talking about :/For
For scripts copy there is a mechanism actually when computer is unlocked, through variants. 
The music tracks I curated 1-1 and I liked them but it's a matter of preference for sure :D

Thanks !

For example, with the pressure mechanic, you only need to check if you're above the lowest threshold, as if you're somehow above the window, you might as well 'bail early' rather than wait! The oxygen is the same, but admittedly it's hard to tell because I can only load my save for a few seconds before the ending triggers again


It does seem like the variants won't auto-apply, maybe they have to be named something specific, but it just made scaling up a little funky (not that you do that too much)


I'll also note it's a little odd that charging stations and bulk storage are so late that I actually hit the end of the demo before unlocking them, but I at least got to run a furnace for a little while!

Hmm I'll check it but it should honor the thresholds. Will take a closer look.

Yes variants do not auto apply that is true. This is a feature I could add for sure, it's a good idea.

In terms of the lateness of some stuff, apologies, I basically had to end the demo somehow haha and I chose to do it via tearraforming at a certain stage because the game scope is huge there are a ton of things down the line, I just had to end it somehow :) And I am still testing a ton of stuff too !

Thanks for the feedback !

To clarify what I mean:

There is no "practical" difference between dumping at 61 waste, or 100 waste, aside from spending more time to get to that point. It's not a technical issue here, but a quirk of the design of the puzzle itself!


Ultimately this 'optimization' makes no difference, as there is no code-complexity, character restriction, or other factor to optimize against, but just something I noticed while putting things together! 

ah yes, this is correct. I felt i should make this one relatively easy because it's one of the starting scripts in the game :)

This is always returning efficiency as 0, not sure if (or how) I made the mistake.

condition = self.thermal_state()
efficiency = self.efficiency()
ideal = 0
print("Running Heating Test.")
print(f"Current Conditions Are: {condition}.")
for w in range(10):
  self.set_power(w)
  sleep(2)
  print(f"{efficiency}% at {w} watts.")
  if efficiency == 100:
    ideal = w
print(f"Reached 100% efficiency for {condition} at {ideal}.")

Explicitly getting the component doesn't work either.

... I can just read it off the in-game display (that's what the sleep is for) but it's definitely bothering me.

Hi !

Two things going on. 

 efficiency = self.efficiency() at the top of the script captures the number 0 once into a variable. The print inside the loop is using that captured value, not re-calling the method. 

Also, notice there was a real one-tick lag bug where `efficiency()` returned the previous tick's value (so even a correct loop banked the wrong optimum); that's fixed in the latest demo build I'm pushing now. Should give you clean readings. With your sleep it would fine anyway.

I just found another bug 

I don't know exactly if that's the cause, but while I was doing the scanner "puzzle", my console started being spammed by

earth: Reading confirmed. current_temperature = -62.878989082094144 verified.

which is something from the first puzzle, except I had put it in a while true loop because I thought it was going to be necessary however, after completing the puzzle, I could no longer modify the code and I thought it had simply been deleted.

And the spam in the log started mutch later, so I really don't know why it's reactivated now.

Yes, the scripts have a MUTE button that mutes any prints, it's not really a bug, they are all using a global console on purpose.

That said, it's annoying yes, but it's temporary because the moment the computer research opens up you can modify all scripts as you like via the Scripts tab.

(+1)

Why did you implement pop like that? It took me 15 minutes to find the bug in my code because of it. XD

You should probably make it throw an error if you give it an argument or make it support poping by index 

(+1)

oh I see what you mean oops ! I fixed it! Will upload the new demo shortly.

Now pop(2) will pop by index indeed. Thanks for this, it was problematic indeed !

Thought I'd let you know: restarted and weird UI inconsistencies seem to happen if you sequence skip during the booting. For example, I booted and activated power in the same script. Then activated sensors. However, the bottom right tip is still telling me to activate sensors.

(2 edits) (+1)

Good catch! Found and fixed it. There was a race in the onboarding tutorial logic where the next tip's listener wired up *after* the action it was waiting for had already happened. Only affects the boot → sensors → uplink tip chain; nothing else uses this pattern. Will roll out in the next demo build. Thanks for the report!

The game is so complex that these(hopefully not breaking) errors will happen from time to time. It gets especially complex later so I absolutely want to be fixing everything I can as best as I possibly can.

What?

Hi! Thanks for trying the game.

The transmitter behaves like a regular Python object — every `get_component("transmitter")` call returns a *new* instance. So your script creates two separate transmitters: the first one connects to earth, the second one (used for transmit) is a fresh instance that hasn't connected yet.

Fix is to assign once and reuse:

t = get_component("transmitter")
t.connect("earth")
t.transmit("current_temperature", get_component("thermometer").get_value())
(2 edits)

Oh! Java brain made me think 'get' was getting a static object, not making a new one.

Yes, totally got you, they are not static or singletons, they act like class instances pretty much. But you are absolutely right, i should probably make that more clear in the DOCS. I will add sth to clarify it a bit better.

(+1)

Yeah, wasn't even sure what language it was at first, tbh, so the standard was hard to tell. Thanks for the response!

(2 edits) (+1)

No worries, I have actually already added a reference about this in the DOCS of the game, it's a very good point. I added this to the Components page in DOCS (not live in the demo yet)

**Each call is a new instance**
`get_component(id)` is a factory — every call creates a fresh wrapper, like instantiating a Python class. For machines tied to a physical entity (rover, smelter, generator), wrappers all read and write through the same backing data, so it feels singleton-ish in practice — setting a value from one wrapper is visible from another.
For purely virtual components like the `transmitter`, each wrapper is independent:
```
# Fails — two separate transmitters, only the first is connected:
get_component("transmitter").connect("earth")
get_component("transmitter").transmit("weather", 42)
# Works — one transmitter, used twice:
t = get_component("transmitter")
t.connect("earth")
t.transmit("weather", 42)
```
Wrappers are just objects — make one, make ten, each is independent.

Thanks for the feedback and helping me make the game better ! Appreciated !

Is your intent that only people with existing knowledge of python should play?  Perhaps the tutorial should mention any of this?

No, it's not required to have knowledge of Python but for sure programming knowledge helps. The DOCS and info tabs should be pretty informational though to help guide even novice people to the field.

(1 edit)

cool game. How to get suff out of the rover without the autofeeder?  also how to get the content info of the rover since it has no racks, the only info that I can get is `self.cargo.count()` and `self.cargo.capacity().

It also would be great if the demo simply would stall at the end and let the user explore the elements he already unlocked instead of the hard ending. I was a bit upset that I could not unlock and try all the things not labeled "only full game"

Hi, thanks ! 

You need the autofeeder research to move things to inventory/bins/warehouse etc. It's a required research for transporting items, but it's fairly easy to get early.

Notice that the info tab is a presentation of the rover's fundamentals, but the DOCS have the full API specification. 


That said, the rover is designed to be a more primitive vehicle. The pioneer is more granular on purpose. For .cargo on the rover you get count() and capacity() — there's no per-mineral readout because it's a single integrated bin, your script just tracks the id of what you are carrying. Pioneer uses racks that are way more versatile and intended for the first line of transportation in the game

Yeah the demo has an ending based on terraforming, but I feel like it has a good amount of content available and also one can go slow on the terraforming to test various things slowly. I just had to have some sort of an ending that makes sense :) The full game will be available in 2-3 months though so hopefully people can enjoy the rest of the game, it gets very deep later with outposts,drones,smelting, fabrication etc..

(1 edit)

seems I made the mistake to set up  two of each terra forming device. I got the drill and the rafinery way before the autofeeder that I am now unable to get because the game ends before this. And I can not load it and and stop all devices before the game ends again :-(

(1 edit)

It's not a mistake, it's actually the correct way to play it, but notice that the DEMO progress bar above is based on terraforming. Full game will of course be completely open, you would be able to do whatever you like. For the demo, If you want you can always start a new game, it should be easy to copy the scripts you already made so that you can see the remaining demo features. 

will the game be only released on steam or also here or on gog?

Yes, it will absolutely be released on steam and other platforms as well if people ask for it. In fact, the Steam page is currently being reviewed and I expect it to be up in a 2-3 days or even earlier. The steam link is in this page, below, and it will be accessible shortly, feel free to wishlist it there if you like. The full release will probably be around August/September.

as a beginner programmer, this game is a blast. would like the option to see previous codes though

(2 edits)

Hi thanks !! You mean you want to see the scripts you have written ? They are all there ! Nothing is lost. They are in the code tabs of the components that use them and you can also create and save variants and notes about any specific script. Let me know if I can help find it, feel free to join us on Discord, we are chatting about the game and things that will be added in the future etc..



I have actually worked on a feature that displays all scripts and allows managing from a dashboard, to make it easier to check previous scripts at any time, and manage it in one place too

(+1)

Really enjoyed the game!

Happy to hear ! Have fun !

(+1)

Good luck!

Thanks much ! Appreciated :)

I got stuck after sending the current temperature and recieving the first 1000 credits. I bought and deployed a solar generator and battery, got the solar to be perpendicular to the sun and all that. But then I realized I couldn't find where the initial code box went, or figure out what my next contract was. I found the console and the docs, but how do I find that main coding terminal that had my contract?

(1 edit)

There is a Manage button in the the cards of components click on it and the window of the script comes up (info/code) tab

It is the transmitter component (check DOCS)

it should be like :

transmitter.transmit("xenogenetics", [values])
for a given contract.

Feel free to join our discord I can help faster, I am usually around, and we already have people joining and discussing about various game scripting etc..

(+1)

damn this is really good took a break from bitburner to play a game that reminds me of bitburner

Thank you so much, I am so glad you are enjoying it :)

(+1)

Really enjoyed the game! :) Never thought I'd be resting from programming while doing another type of programming. The internal coding seems to be very professional with value assignment, chain of operations and classes, I wonder if it's just a simulation or a real Python interpreter out there :)


(3 edits)

Haha, that's how programmers rest from programming, don't we :D ? Thanks for the kind words, I tried to make it as detailed and as scalable as possible. The idea is to give the player the tools to do whatever they like in this world. It's completely open to them how they can interact  with the components and there is really a ton that a player can do however they like in  the late game.

It is a custom interpreter indeed, it's not actual Python but it behaves like it yes :)