If you wish to make an apple pie from scratch, you must first invent the universe
...fuck.
This guide will show you how to:
- Swap out one biome for any other on any planet's surface, including custom biomes you create
- Pick your biome's surface textures, grass, shrubs, trees and rocks
- Populate your biome with scannable plants ("flora") and scannable animals ("fauna")
Note that in the Creation Kit, a "biome" mostly controls terrain textures, grass, plants, rocks, and flora and fauna. As far as I can tell it doesn't affect the shape of the terrain or landsape, even though some biomes have names like "Hills" or "Mountains" that imply this.
To follow this guide you'll need some familiarity with the Creation Kit and xEdit, as well as a basic understanding of Python and the ability to edit and run Python scripts. I've included some example code with thorough comments but if you've never used Python or any other scripting/programming language before you may struggle with this step. Because I used a Python script to swap out biomes, you can't "paint" the biome map like an image and this method also doesn't allow you to create new planets, only modify existing ones.
The Python step could be removed with a relatively simple tool that can do the replacement and allow "painting" biomes on surfaces, but I don't have the skills needed to make applications like that. Part of the reason I made this mod and guide is to share what I've learned so other people with different skills can build and iterate on what I've done, so if you think you can make a tool like that, please go ahead and do it! All I ask is that it's released for free for everyone and that you credit PixelRick before you credit me – he figured out the structure of the biome map files, I just hacked his scripts to replace biomes and got it working in the Creation Kit.
Replacing Biomes
Open the Creation Kit (CK) and find the planet you want to edit in the galaxy view. In the Terraforming tab you should see which biomes it has, e.g. Jemison has DeciduousForestLifeJemison, ConiferousForestLife01, MountainsLife03, FrozenLife07 and OceanLife04. Most planets have generic numbered biomes, though some planets have unique ones, usually for cities or handplaced quest locations. Note down the Form IDs of any biomes you want to replace (these are the strings of eight numbers and letters after the Editor ID). Note that ocean biomes affect the textures, rocks, plants, flora and fauna that spawn in coastal regions.
If you want to replace a planet's biome with an existing default biome, note down its Form ID. If you want to use a new custom biome instead, you need to create it first so that the CK assigns it a Form ID. The easiest way to do this is to right click on an existing biome that's similar to what you want and click "Duplicate". Give it a useful and memorable Editor ID and note down the Form ID. You can edit the biome itself later, for now we just need the Form ID, but it's useful to give it a different in-game name since this is what will show up from orbit and help you see if it's worked. If you made a custom biome, make sure to save it to a new ESP file.
As a worked example, in this guide I'm going to replace Jemison's mountains biome with a custom one that has snow and trees. Checking Jemison's planet record, its mountains are the MountainsLife03 biome which has a Form ID of 002636BA. I duplicated MountainsLife03 and changed its Editor ID to JemisonSnowyMountainsLife, and the CK assigned it a Form ID of 01000809. I edited the biome just to change its name to "Subalpine Highlands", so I can see if it worked.
Close the CK and use Bethesda Archive Extractor or a similar tool to open Starfield - PlanetData.ba2 and extract the biome map of the planet you want to edit, placing it into a temporary folder somewhere. In our example, I extracted jemison.biom since that controls Jemison's biome placement.
This part requires some understanding of Python. Don't ask me for help with basic Python programming or errors, there are plenty of resources available online. From PixelRick's Github repository, make a copy of biom.py and biomes.csv and place them in the same temporary folder as your biome map. The biom.py script can read, open and save .biom files but doesn't do anything by itself. You need to add code to tell it which file to open, to open it, do any edits, then save a new file. Here's an example, commented to explain each step:# Create a new, empty BiomFile object
jemison_biome_map = BiomFile()
# Tell the object to load the biome map for Jemison
jemison_biome_map.load("jemison.biom")
# Define the Form ID of the old biome we want to replace, taken from the CK
# In this example, this is MountainsLife03, the default "Mountains" biome on Jemison
old_biome = "002636BA"
# Define the Form ID of the new biome to take its place, taken from the CK
# In this example, this is my custom JemisonSnowyMountainsLife biome
new_biome = "01000809"
# Replace the old biome with the new one in the north and south biome grids
# The int() functions converts the Form ID from hexadecimal to normal numbers, since PixelRick's code reads Form IDs from the biome map as normal numbers
jemison_biome_map.biomeGridN[jemison_biome_map.biomeGridN == int(old_biome, 16)] = int(new_biome, 16)
jemison_biome_map.biomeGridS[jemison_biome_map.biomeGridS == int(old_biome, 16)] = int(new_biome, 16)
# Save the edited biome map with a new filename
jemison_biome_map.save("jemison_new.biom")
Add this code to the bottom of biom.py, making sure to replace the values of old_biome and new_biome with the Form IDs you noted down earlier and the names of the biome map file to the one you extracted. If you want to replace multiple biomes at once, you can duplicate the code that replaces the biomes in the north and south grids for each replacement, changing which Form IDs are used each time. After running this script in Python, you should now have a new file called jemison_new.biom in your temporary folder. This file needs to be placed in your Starfield directory to override the default one, so copy it into Starfield\Data\planetdata\biomemaps then rename it to jemison.biom, since it needs the same filename as the original to override it. Make sure both your game and CK ini files are set to load loose files.
If you used only default game biomes, you're done! Load Starfield and test that it worked. Your new biome won't have flora and fauna, because those are defined by the planet, so jump to that section below to do that.
If you're using new custom biomes, there's a few more steps to get them working. Open the CK and go to the planet you modified in the galaxy view. In the Terraforming tab, it will still show the old biomes. On each biome you replaced, right-click it and replace it with your new biome. Then on the top menu, go to Galaxy → Generate BIome Placements. This might take a minute or two, during time which the CK will look like it's crashed, so leave it alone til its done. Then save your plugin and your new biomes should work in-game and be fully landable. This can be hard to tell if you duplicated existing biomes without changing them, which is why it was helpful to give it a distinct name that's visible when selecting a landing site from orbit. The biome map view in the CK's galaxy map won't show your new biomes until you restart the CK, but you can continue to work on it without restarting if you want.
Editing Biomes
Now that your custom biome is placed and works, you can start to edit its properties. The left-hand side of the biome editing window has a variety of basic properties, most of which are either fairly easy to understand... or a complete mystery to me. It's worth just reading through them and messing around with them to see what they do. I'm going to cover the Terrain Data and Object Generation tabs in detail, because those are the ones I spent the most time learning, but the Marker Objects tab is also important for defining what objects the biome uses to fill in generic placeholder markers, like rock markers, shrub markers or tree markers.
Terrain Data
This tab controls what textures and materials are used for the ground, as well as ground cover. This is separated into categories like "Solid", "Talus", "Flat In", "Flat Out" and so on which I think refer to the slope of the terrain, but I found these a little hard to wrap my head around so it's worth just playing around with them to see how they work in-game. "Land Texture" controls exactly what it sounds like and gives options for sand, dirt, grass, tarmac and a bunch of others, and you can quickly preview a texture by selecting it and clicking the pencil icon next to it, which will pop up a window with the texture in it. "Ground Cover" controls meshes that are placed over that land, the most obvious example being grass but this also includes broken sticks, ferns, moss, mushrooms and chunks of rock or ice. The Alternate Data column on the right hand side allows variations within one category, so for example in the Talus category you can have it randomly alter between grassy or rocky textures. When you're done editing, make sure to click the Apply button at the bottom, then the OK button. If you only click OK, it may not save your changes.
Object Generation
This tab controls the dynamic placement of packins on the terrain of your biome. A "packin" is a cluster of objects that the CK can treat as if it were a single object, and are a very powerful tool with lots of uses, but biomes use them to dynamically place clusters of rocks, trees, shrubs and so on. If you want to swap out the biome's shrubs, trees and rocks, this tab is how you do it. If you look at this tab for an existing biome, you'll see that it has a list of packins it can distribute, separated into the same categories as terrain textures. Each category then has subcategories based on the footprint size of the packin. Packins know what size they are, so when you add one it will automatically go into the correct category. There are lots of default packins available with all kinds of things, but in general you should try to stick to packins that start with "PI" and have a size in their name, since these are the ones intended for use in biomes. You can also create your own packins! I created a few empty packins which I used to reduce the amount of rock clusters laying around in Jemison's prairies. However bear in mind that packins also contain flora markers, which are placeholders that the game fills in with your flora, so if none of your biome's packins have flora markers, no flora will appear in your biome. Each category has sliders to weight how common each packin is within that category only, so you can adjust their incidence. For example with my empty packins, I added a few other packins into the same categories, but set the probability for the empty ones very high so that the other packins are present but rare.
Flora
If you want to add flora from the base game, this is simple – go to your planet in the galaxy view and in the Per Biome Data tab, find the Flora box, right click to add new flora, and select the one you want.
Once you've added the flora to your biome, make sure to click off onto another biome, then back. This is some kind of weird UI behaviour – if you don't click off the biome, sometimes the CK forgets what you added and reverts the list back to default.
To make custom flora, find an existing flora, duplicate it and modify it. In the edit menu you can change the name and pick the base model (the plant itself) and the pod model (the model that disappears when you harvest it). There are also keywords and other properties but I didn't mess with any of these. If you've made custom flora, they won't appear in the Flora box in the Per Biome Data tab unless you make them available for the biome. Go to the biome record (the original one, not in the planet editor) and in the Biome Data tab, go to the All Possible Flora box and add your flora to the list. Then go back to the Per Biome Data for your planet and you'll be able to add your new flora.
This list also defines what resources harvesting your flora yield, but its a little weird. All the default flora have fibre resources but the planet record overrides it with the drop-down next to the flora. This appears to be used so that the same flora placed on different planets can yield different resources, but when I added my own custom flora I didn't have the option for the normal organic resources in that override menu. Instead, I set the resources on the flora object itself, which worked fine because I only placed that flora on Jemison and nowhere else.
Fauna
If you want to add fauna from the base game, this is simple – go to your planet in the galaxy view and in the Per Biome Data tab, find the Creatures box, and right click to add new creatures. Creatures are named in a pattern based on their star system, planet and role, for example Jemison's Herding Cutterhead Herbivores are PCM_Alpha-Centauri_Jemison_Prey01. There shouldn't be a problem with adding creatures from other planets to your biome, but bear in mind that creatures dynamically change their textures depending on the biome, so may not look the same in different places.
Once you've added a creature to your biome, make sure to click off onto another biome, then back. This is some kind of weird UI behaviour – if you don't click off the biome, sometimes the CK forgets what you added and reverts the list back to default. While this can also happen with the flora lists, the creature lists are particularly bad for forgetting what you've added, so take extra care here.
Making your own creatures is made very easy by the CK's Creature Creator, which can be found under Gameplay on the top bar. There are a lot of properties in the creature tool, but if you select one of the dropdowns and click the pencil icon next to it, it will bring up a window that usually has an explanation of what that property does. The most important is Skin, which is the creature's model. If you want to make aquatic animals, you need to pick a skin that's either a floater, manta or swimmer and select Swimmer in one of the the Environmental Behaviour fields, otherwise these creature types will be flying in the air.
Fauna will be automatically assigned names based on their model and behaviours, for example default Jemison has the "Herding Cutterhead Herbivore" and the "Pack Coralbug". You can override this name but if you created your creature from scratch in the Creature Creator menu, the name field may be greyed out and uneditable. The workaround I used for this was to duplicate the ashta (PCM_Cheyenne_Akila_Ashta under Actors), remove the CCT_Unique_Ashta keyword from it and give it a custom name, then edit it. If you click the "Creature Tool" button at the top of its edit window, it brings up the Creature Creator and allows you to edit all of its properties while keeping the name field editable, and the "Modify" button saves it. In my plugin, I made a creature called PCM_CREATURE_TEMPLATE that's just a cleaned duplicate of the ashta, so if you're loading my plugin file you can use that as a base to duplicate and edit. These custom names are possible because of the CCT_Instance_Name_Blank keyword, which removes the default prefixes and suffixes applied to a creature based on its behaviours.
Cleaning and Publishing
Something annoying about adding custom biomes is that the "Generate Biome Placements" step you had to do to make custom biomes show up seems to do that for every planet in the game. It doesn't meaningfully change any other planet, because their biome maps haven't changed, but it does mean that your plugin now overwrites a small amount of data for every planet in the game, which can cause compatibility problems. As far as I can tell, it only overrides the biome placement property, which should have no effect in-game, but mods shouldn't overwrite records that the author didn't intend to change, so before releasing your mod you need to clean your plugin file by removing the edits to these records.
To do this, open your ESP in a version of xEdit that can edit ESP files and delete all planet records you didn't intend to change. In this case, my plugin was only supposed to affect Jemison, so under JemisonBiomeOverhaul.esp in xEdit, I checked the Planets section and deleted all edits to all planets except Jemison. You should also check through your plugin for any other records you might have accidentally changed and delete those changes too. Before publishing your mod, open it in the CK to convert it into either a small or full ESM (medium ESMs have some complicated technical problems so should be avoided for the moment). Never release Starfield mods as ESPs, they are only for work in progress, all released mods should be ESMs. Then package the ESM with the biome map file in the correct directory structure. In theory you could pack the biome map file into a ba2 archive but this is probably unnecessary unless you've edited lots of planets.
And that's it! You're done! Enjoy your new world.
4 comments