HOW TO: Final Frontier - System / Planet Editing

JeBuS27

Heretic
Joined
Sep 21, 2005
Messages
321
The Final Frontier mod in Beyond The Sword drastically changes the concept of cities into Solar Systems containing Planets. I struggled to find a way to edit the Planets contained in a Solar System, and noticed that others were looking for the same information. So here's a guide on one way to do it. It's probably not the best way, and almost certainly not the prettiest or easiest, but it works.

Step One - Create a Map and Place a System

First off, start a new game with Final Frontier mod. Use a Duel map with just 2 players. This is for simplicity's sake. Start up the game and go to the WorldBuilder.

Assuming you have entered the WorldBuilder, select the map/terrain editing mode and hover over the menu tiles until you find one that says "Solar System". On my system, the icon is that of an Oasis from regular civ. I don't know if this is an oversight or a bug.

With the "Solar System" terrain selected, choose a spot on the map, and place your new System. At this point you should have a bunch of dashed circles orbiting the tile you selected for your System. You're probably wondering why there's no star or planets visible. I spent quite a bit of time looking for some hidden menus or controls that allowed me to add a Star and Planets to this barren system. I never did find any.

For an explanation on the empty Systems, see Step 6. For now, though, we're going to move on to something else.


Step Two - Save and Reload

Let's save our newly modified map. This is going to be a pain in the neck, but go ahead and quit the game you're currently in, and start up a new game, using Final Frontier mod and using our new map as a Scenario. Head back into the WorldBuilder.

Notice how that System you created and left empty now has a Star and Planets orbiting it? For the life of me, I couldn't find any controls that allowed me to customize this new System. There was nothing that let me choose the Star color, the Planet types, numbers... nothing at all. I was stumped.


Step Three - Colonize It

Then go to Player Mode / Building and select "Colonize Star System". Plop a colony down on your new System. You may be prompted for a name, go ahead and enter something unique that you'll remember, you can change it later if you choose. We're going to be searching through text for this name later, so don't make it anything too common for Civ, or you may have trouble locating the needle in the needle stack.

At this point, it looks like things are going to be pretty simple, just like in normal Civ4 map editing, go to the city editor... but it's not. Go ahead and try to use the City Edit mode. Select your new System and see what you get. That menu isn't very useful, is it?

You're probably wondering where the controls are to edit the Planets you see orbiting in that System you just created. If they aren't on the Terrain controls, and they aren't in the City controls, where can they possibly be?


Step Four - Acceptance

The painful truth is, there's no way to change the Planets in the WorldBuilder. If you were to exit the game, and load up this WBS map as a scenario, your new System would be there, and it will get a randomly generated bunch of Planets. The number, type, size, and orbit will all be random, every time you start a new game on that map.

So all we can do is accept that things won't be easy, and move on.


Step Five - The Console

This is where things start to get complicated. If you haven't already done so, you will need to enable the cheat console. To do so, you will need to exit Civ4, so save your WB map and exit.

Warning: This procedure involves editing a game file. Be sure to create a backup copy of the "CivilizationIV.ini" file before proceeding.

The file is usually located in "My Documents\My Games\Civ4\"

Open the file and search for the line of text
Code:
CheatCode = 0
Change this line to
Code:
CheatCode = chipotle
Save the file.

From now on, whenever you're in a game and press "Shift + ~" during game, the Python console window will appear on screen. Pressing "~" will result in a less functional cheat version of the console, that is useless for our purposes, so make sure you hit that Shift key.


Step Six - Figuring Out What's Going On

Earlier I promised an explanation for the empty System, and here it comes. In the Python code, when a new CvSystem object is created in the game, it is created as a blank slate. It receives no Star or Planets, and is essentially waiting for you to add to it. The problem there is obvious, we don't have any menus to affect those new Systems.

So you might be wondering how the Star and Planets showed up when we reloaded the map. Well, I'll tell you how. When a game is started there is an algorithm that looks at every plot on the map and checks if it has a System in it. If it does, it then goes on to create a random System with a Star and Planets. It will do this every time a new game starts.

Your Systems will all be in the same position on the map, but they may be of a completely different composition every time you play a game on that map. I don't know about you, but that's not exactly the level of control I want when I'm creating a scenario.


Step Seven - Needles in Needle Stacks

Remember how I told you to name your new colony something you'd remember? Well here's why.

Find and open your WB save file with a text editor (Notepad will work, don't use Wordpad). The WBS files are (mostly) plain text files, and as such, human readable, if not always human understandable. This is not a tutorial on WBS, so I won't explain everything about them here.

With your text editor search for the name of your colony. This should bring you to a section of the file that looks similar to this
Code:
a.
	FeatureType=FEATURE_SOLAR_SYSTEM, FeatureVariety=0
	RouteType=ROUTE_ROAD
	TerrainType=TERRAIN_TUNDRA
	PlotType=2
	BeginCity
		CityOwner=0
		CityName=New Tokyo
		CityPopulation=1
	EndCity
	TeamReveal=0,
EndPlot
Above that, you'll see a lot of "aI0" and similar. These are our enemies and our friends. Scroll up past all of that, and you'll find something that looks like this
Code:
BeginPlot
	x=20,y=7
	ScriptData=(lp0
The x and y coordinates of your colony are what we need. So remember those (or write them down if you are likely to forget them).

Now, if you've closed the game, load back up your map as a scenario so we can get this show on the road.

[note: There is an alternative way to find the coordinates of a plot. In game, hold the "Shift" button while hovering over a tile.]


Step Eight - Getting Down and Dirty With a Snake

Warning: I'm about to begin using the console and the Python language. Things will probably only get more confusing from here on for many of you.

In the game now, I hit "Shift + ~" to bring up the Python console. If you did this correctly, a line of text will display the Python version number. If you don't see the line of text with the Python version number, you only hit "~", so try again.

Now we start entering Python into the console
Code:
import CvEventInterface, pickle
em = CvEventInterface.getEventManager()
Enter both of the lines above one at a time into the console. Make sure your capitalization is correct, and that you have all periods and parentheses. The import statements give us access to classes and methods we'll be using. "em" is our event manager, in this case it's a "CvFinalFrontierEvents" object. It will allow us to find and access our System.

Next, we'll take our coordinates of our colony and put them in
Code:
pPlot = CyMap().plot(X,Y)
Replace "X" and "Y" with the x and y coordinates of your colony. This line gets the information about the "CyPlot" object that our System is on. A Plot is a tile on the map.

Now to get our System and its ScriptData
Code:
pSystem = em.getSystemAt(pPlot.getX(), pPlot.getY())
aData = pickle.loads(pPlot.getScriptData())
"pSystem" is a "CvSystem" object that represents our new System. "aData" is an array (arrays are called "lists" in Python) that contains all of the information about our System and its Planets. It is our bread and butter.

So let's see what "aData" has in store for us.
Code:
print aData
This will print the entire contents of the "aData" list to the console. It contains information about the Star, and 2 to 8 Planets in the system. You should see a whole lot of 0s and a few other numbers as well as names of the Planets in the System.


Step Nine - Making Sense of the Data

The "aData" list is a zero-based list. What that means is the first element in the list is at "aData[0]", the second element is at "aData[1]", and so on.

The first four elements of the "aData" list are information about the System.
0 = SunType
1 = SelectedPlanet
2 = BuildingPlanetRing
3 = NumPlanets

SunType can be one of five types currently
0 = Yellow
1 = Orange
2 = White
3 = Red
4 = Blue

SelectedPlanet is the ring on which the currently selected planet is located. This is a number between 1 and 8, counting outwards from the Star. In the our solar system, 1 would be Mercury, 2 would be Venus, 3 would be Earth, etc.

BuildingPlanetRing is the ring where the planet that is currently the focus of production is located. It is numbered just like SelectedPlanet.

NumPlanets is a total of the number of Planets in this System. Value should be between 1 and 8.

Next in the "aData" list comes the Planets. The individual Planets are enclosed in brackets []. This means that each Planet's data is actually in a list of its own. So we have lists inside of a list. Depending on the System, there will be 1 to 8 such sub-lists.

The elements in a Planet list are arranged as follows
Code:
0 = Name
1 = X
2 = Y
3 = PlanetType
4 = PlanetSize
5 = OrbitRing
6 = isMoon
7 = isRings
8 = Population
9 = isDisabled
10 through 10 + N = hasBuilding
10 + N + 1 through 10 + N + 1 + N = BuildingProduction
N is the number of buildings available in the Mod

The Planet's name will appear like this.
Code:
u'Omnicron Theta'
I have not yet tested the importance of the "u" at the beginning and whether or not it can be omitted. For now, I just put it there. The quotation marks are necessary for the name to be recognized as a string.

The Planet's X and Y are its coordinates (ie, the X and Y coordinates of the plot the System is on). [side note: I would wager that while this information appears redundant (planets are contained in a system), it is in fact necessary for the serialization process of pickling.]

PlanetType can be one of seven types currently:
0 = Blue
1 = Grey
2 = Green
3 = Orange
4 = Red
5 = Yellow
6 = White

PlanetSize can be one of three types currently:
0 = Small
1 = Medium
2 = Large

OrbitRing is the ring on which the Planet orbits the Star. It can currently be any number between 1 and 8.

isMoon indicates if the Planet has a moon. It can be either 0 or 1 (equivalent to True or False in Python).

isRings indicates if the Planet has rings. It can be either 0 or 1.

Population indicates how much of the City Population is assigned to the Planet.

isDisabled indicates if the Planet is disabled. It can be either 0 or 1. A Planet is disabled when nuked. It results in an uninhabitable Star graphic orbiting the main System Star in place of the Planet.

hasBuilding indicates if the Planet has the building. It can be either 0 or 1. hasBuilding may have as many entries as there are possible buildings to be built.

buildingProduction indicates how much production is already allocated to a building on a Planet. buildingProduction may have as many entries as there are possible buildings to be built.

Now that we have an overview of the data available to us, let's do something with it.


Step Ten - God of the Stars

So now you want to know how to go about changing all that data that was just spit out at you, don't you? Well, let's dive in.

Code:
aData[0] = 3
aData[1] = 2
aData[2] = 1
I've just told the "aData" list that I want the Star to be red, the second Planet to be selected, and the first Planet to be where production is used. (Let's not change the number of Planets just yet, there are a few quirks yet to be explained there.)

Code:
pSystem.setData(aData)
pSystem.updateDisplay()
Now we use the "setData" method to put our new data into our System. We then tell the System to update its graphics. These are both important steps. Forgetting to "setData" will leave your changes out. Forgetting to "updateDisplay" will cause you not to see any changes you've made.

And let's not forget to update our plot with the new data.
Code:
pPlot.setScriptData(pickle.dumps(aData))

If you've put all of that in correctly, you should see the results in your game immediately.


Step Eleven - Lesser Heavenly Bodies

Now for what you've been waiting for, editing the Planets.

As I said before, each Planet sub-list is distinguishable by its set of brackets [] inside of the "aData" list. The entire sub-list is considered one element in the "aData" list. As such, the first Planet in the "aData" list is the fourth element.
Code:
aPlanet1 = aData[4]
print aPlanet1
This should display just the single Planet's data. I estimate that FF Planets have about 50 data elements right now, most of which is building info.

To edit a Planet, we do just like we did to the System.
Code:
aPlanet1[0] = u'Goober'
aPlanet1[3] = 6
aPlanet1[4] = 3
aPlanet1[6] = True
aPlanet1[7] = True
aData[4] = aPlanet1
pSystem.setData(aData)
pSystem.updateDisplay()
pPlot.setScriptData(pickle.dumps(aData))
For the sake of brevity, I didn't include any building infos. When changing the OrbitRing, you should be sure that there's not multiple Planets on the same ring, as only one will show up in game. When changing the Population on a planet, you should also be sure to change the population of the City on the Plot. Simply changing the population of the Planet will result in negative unassigned citizens. For a description of what isDisabled does, read back a bit.


Step Twelve - An Alternative to Lists

Managing and editing the lists is a bit tedious, isn't it? There's an easier way to go about this, but I wanted you to at least have a passing familiarity with the ScriptedData. You'll need it later if you want to understand what's going on.

Now, for the easier way of editing. Let's start with our System again.
Code:
pSystem.setSunType(0)
pSystem.setSelectedPlanet(1)
pSystem.setBuildingPlanetRing(2)

pPlot.setScriptData(pSystem.getData())
pSystem.updateDisplay()
This does exactly the same thing as what we did before, but if you ask me, it looks a bit better and is more easily understood. Rather than using the Plot's ScriptData to change the System, we're changing the System then updating the Plot's ScriptData. There are various other methods available in CvSolarSystem.py, but one rather glaring omission is a method to remove a planet from a System. It's not that it can't be done, there's just no helper method available already. [side note: This will be remedied later]

Now, we'll take a look at how we can edit Planets a bit easier. I'll use the Planet on the first orbital ring, but you can do whatever you've got available.
Code:
pPlanet1 = pSystem.getPlanet(1)
pPlanet1.setName("Goober")
pPlanet1.setPlanetType(6)
pPlanet1.setPlanetSize(3)

pPlot.setScriptData(pickle.dumps(pSystem.getData()))
pSystem.updateDisplay()
Once again this does exactly what we did before. There are additional methods available, look in CvSolarSystem.py. And once again, there are some methods notably lacking: setIsMoon and setIsRings. [side note: This will be remedied later]

Don't get too attached to the changes you've made so far. They can't be kept, so don't do too much.


Step Thirteen - What Do You Mean I Can't Keep My Changes?!

Quite simply put, the code in Final Frontier just doesn't support loading the ScriptData you save to the WBS file. It saves it just fine, as you have seen with all of the "aI0" in the WBS file. But the way Final Frontier parses the WBS file, it doesn't allow reading multiple lines of ScriptData. So instead of reading in 40+ lines of ScriptData, it reads in only "(lp0", the first line of the ScriptData. In order to remedy this, I modified two files in the Final Frontier mod.
Code:
Mods\Beyond the Sword\Final Frontier\Assets\Python\CvFinalFrontierEvents.py
Mods\Beyond the Sword\Final Frontier\Assets\Python\pyWB\CvWBDesc.py
In these files, I edited areas where ScriptData was read and written from / to a file. Essentially, I replaced all of the newline characters ("\n") with tab characters ("\t") before writing the ScriptData to file. This allows the ScriptData to be written in one very very very long line. And thus it allows it to be read back in, as one very very very long line. When reading the ScriptData back in I replace the tab character with a newline character, to restore it to its original state.

I also changed how CvFinalFrontierEvents.py onGameStart() and loadSystemsFromPlots() methods work. Previously, onGameStart() simply created random systems for every system in the WBS file, regardless of its ScriptData. I changed loadSystemsFromPlots() to load the System's ScriptData when available, and if it's not available, create a random System. onGameStart() now uses loadSystemsFromPlots() rather than the old random algorithm. However, there is still a problem in that I can't see a way to differentiate between a normal game start (ie, just hitting "Play Now!") and a scenario start (ie, hitting "Load Scenario"). Let me explain why this is a problem.

Since the FF mod was originally intended only to be played with random maps, any time a game starts, all of the civilizations are given their bonuses. Some get extra population, others get technologies, etc. This also happens when you load a scenario, because when a scenario starts, it also uses the onGameStart event method. So when your scenario is loaded, it will throw those bonuses onto your map, despite the fact that your map may already have had them in place. So, the work-around here is, when designing your scenario, make sure you take into account that your WBS probably has the civ specific bonuses already applied to it. You probably should manually remove them from the WBS.

An easy way to demonstrate this problem is to start up a new game as New Earth. Save a WBS of that map, then reload it as a scenario. Notice how high the population of New Earth System is? Just edit the System to remove population (back to 1) then save the WBS again. Moral of the story? Take into account the civ bonuses.

There are some other quirks inherent to FF as well. When in WorldBuilder, if you remove a Solar System from the map, the ScriptData for that System doesn't seem to be removed in the WBS file. So you'll have to do that manually, until I (or somebody else) decide to muck around with the WorldBuilder code. There are some other WB things wrong too, but I just can't seem to recall them at the moment. I'm sure you'll run across them.


Step Fourteen - Other File Changes

Another file I changed was:
Code:
Mods\Beyond the Sword\Final Frontier\Assets\Python\CvSolarSystem.py
I added the following methods:
Code:
CvSystem
-removePlanet(iRingID)
### safely removes a Planet from the System

CvPlanet
-setIsMoon(bValue)
### sets whether the Planet has a moon
-setIsRings(bValue)
### sets whether the Planet has rings


Step Fifteen - Enjoy!

Hopefully this guide was clear enough for everybody to understand. If you need any clarification on anything, let me know. I've attached the 3 files I changed. You can put them either straight into the Final Frontier mod folder (back up your originals), or figure out where else you can put them to be modular. I've not bothered to learn to do that yet. :p
 

Attachments

I've found that the buttons in the WorldBuilder show up incorrectly because the VarietyButton tag isn't properly defined for the terrain features in CIV4ArtDefines_Feature.xml

To correct it, copy the info from each feature's Button tag into its VarietyButton tag. Forest is the Asteroids, and it has 3 VarietyButtons, so make sure you get them all. Or you can just take 2 of the varieties out as all three are the same, and you only need one.

For the lazy among you, I've included my modified CIV4ArtDefines_Feature.xml
Code:
<?xml version="1.0"?>
<!-- edited with XMLSPY v2004 rel. 2 U (http://www.xmlspy.com) by Jason Winokur (Firaxis Games) -->
<!-- Sid Meier's Civilization 4 -->
<!-- Copyright Firaxis Games 2005 -->
<!-- -->
<!-- Modified by: JeBuS -->
<!-- -->
<!-- Feature art path information -->
<Civ4ArtDefines xmlns="x-schema:CIV4ArtDefinesSchema.xml">
	<FeatureArtInfos>
		<FeatureArtInfo>
			<Type>ART_DEF_FEATURE_SOLAR_SYSTEM</Type>
			<bAnimated>1</bAnimated>
			<bRiverArt>0</bRiverArt>
			<TileArtType>TILE_ART_TYPE_NONE</TileArtType>
			<LightType>LIGHT_TYPE_NONE</LightType>
			<fScale>1.0</fScale>
			<fInterfaceScale>1.0</fInterfaceScale>
			<Button>,Art/Interface/Buttons/Units/Transport.dds,Art/Interface/Buttons/FinalFrontier2_Atlas.dds,2,4</Button>
			<FeatureVariety>
				<FeatureArtPieces>
					<FeatureArtPiece>
						<ModelFile>Art/Terrain/Features/SolarSystem/SolarSystem.nif</ModelFile>
						<Connections></Connections>
					</FeatureArtPiece>
				</FeatureArtPieces>
				<FeatureDummyNodes>
					<FeatureDummyNode>
						<Tag>FEATURE_DUMMY_TAG_ORBIT_1</Tag>
						<Name>OrbitRing_01</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_DUMMY_TAG_ORBIT_2</Tag>
						<Name>OrbitRing_02</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_DUMMY_TAG_ORBIT_3</Tag>
						<Name>OrbitRing_03</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_DUMMY_TAG_ORBIT_4</Tag>
						<Name>OrbitRing_04</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_DUMMY_TAG_ORBIT_5</Tag>
						<Name>OrbitRing_05</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_DUMMY_TAG_ORBIT_6</Tag>
						<Name>OrbitRing_06</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_DUMMY_TAG_ORBIT_7</Tag>
						<Name>OrbitRing_07</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_DUMMY_TAG_ORBIT_8</Tag>
						<Name>OrbitRing_08</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_DUMMY_TAG_PLANET_1</Tag>
						<Name>Planet_Dummy_1</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_DUMMY_TAG_PLANET_2</Tag>
						<Name>Planet_Dummy_02</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_DUMMY_TAG_PLANET_3</Tag>
						<Name>Planet_Dummy_03</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_DUMMY_TAG_PLANET_4</Tag>
						<Name>Planet_Dummy_04</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_DUMMY_TAG_PLANET_5</Tag>
						<Name>Planet_Dummy_05</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_DUMMY_TAG_PLANET_6</Tag>
						<Name>Planet_Dummy_06</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_DUMMY_TAG_PLANET_7</Tag>
						<Name>Planet_Dummy_07</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_DUMMY_TAG_PLANET_8</Tag>
						<Name>Planet_Dummy_08</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_DUMMY_TAG_BUILDING_0</Tag>
						<Name>Building_Dummy_0</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_DUMMY_TAG_BUILDING_1</Tag>
						<Name>Building_Dummy_1</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_DUMMY_TAG_BUILDING_2</Tag>
						<Name>Building_Dummy_02</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_DUMMY_TAG_BUILDING_3</Tag>
						<Name>Building_Dummy_03</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_DUMMY_TAG_BUILDING_4</Tag>
						<Name>Building_Dummy_04</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_DUMMY_TAG_BUILDING_5</Tag>
						<Name>Building_Dummy_05</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_DUMMY_TAG_BUILDING_6</Tag>
						<Name>Building_Dummy_06</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_DUMMY_TAG_BUILDING_7</Tag>
						<Name>Building_Dummy_07</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_DUMMY_TAG_BUILDING_8</Tag>
						<Name>Building_Dummy_08</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_DUMMY_TAG_BUILDING_9</Tag>
						<Name>Building_Dummy_09</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_DUMMY_TAG_SUN</Tag>
						<Name>Sun_Dummy</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_SUN</Tag>
						<Name>Art/Terrain/Features/SolarSystem/Sun.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_SUN_YELLOW</Tag>
						<Name>Art/Terrain/Features/SolarSystem/Sun_Yellow.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_SUN_ORANGE</Tag>
						<Name>Art/Terrain/Features/SolarSystem/Sun_Orange.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_SUN_WHITE</Tag>
						<Name>Art/Terrain/Features/SolarSystem/Sun_White.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_SUN_RED</Tag>
						<Name>Art/Terrain/Features/SolarSystem/Sun_Red.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_SUN_BLUE</Tag>
						<Name>Art/Terrain/Features/SolarSystem/Sun_Blue.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_TEXTURE_TAG_BLUE_PLANET</Tag>
						<Name>Art/Terrain/Features/SolarSystem/Blue_Planet.dds</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_TEXTURE_TAG_GRAY_PLANET</Tag>
						<Name>Art/Terrain/Features/SolarSystem/GrayPlanet.dds</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_TEXTURE_TAG_GREEN_PLANET</Tag>
						<Name>Art/Terrain/Features/SolarSystem/Green_Planet.dds</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_TEXTURE_TAG_ORANGE_PLANET</Tag>
						<Name>Art/Terrain/Features/SolarSystem/OrangePlanet.dds</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_TEXTURE_TAG_RED_PLANET</Tag>
						<Name>Art/Terrain/Features/SolarSystem/RedPlanet.dds</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_TEXTURE_TAG_YELLOW_PLANET</Tag>
						<Name>Art/Terrain/Features/SolarSystem/YellowPlanet.dds</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_TEXTURE_TAG_WHITE_PLANET</Tag>
						<Name>Art/Terrain/Features/SolarSystem/WhitePlanet.dds</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_LARGE_PLANET</Tag>
						<Name>Art/Terrain/Features/SolarSystem/Planet_Large.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_MEDIUM_PLANET</Tag>
						<Name>Art/Terrain/Features/SolarSystem/Planet_Medium.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_SMALL_PLANET</Tag>
						<Name>Art/Terrain/Features/SolarSystem/Planet_Small.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_LARGE_PLANET_GLOW</Tag>
						<Name>Art/Terrain/Features/SolarSystem/Planet_Large_Glow.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_MEDIUM_PLANET_GLOW</Tag>
						<Name>Art/Terrain/Features/SolarSystem/Planet_Medium_Glow.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_SMALL_PLANET_GLOW</Tag>
						<Name>Art/Terrain/Features/SolarSystem/Planet_Small_Glow.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_LARGE_PLANET_CLOUDS</Tag>
						<Name>Art/Terrain/Features/SolarSystem/Planet_Large_Clouds.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_MEDIUM_PLANET_CLOUDS</Tag>
						<Name>Art/Terrain/Features/SolarSystem/Planet_Medium_Clouds.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_SMALL_PLANET_CLOUDS</Tag>
						<Name>Art/Terrain/Features/SolarSystem/Planet_Small_Clouds.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_LARGE_PLANET_RINGS</Tag>
						<Name>Art/Terrain/Features/SolarSystem/Planet_Large_Ring.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_MEDIUM_PLANET_RINGS</Tag>
						<Name>Art/Terrain/Features/SolarSystem/Planet_Medium_Ring.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_SMALL_PLANET_RINGS</Tag>
						<Name>Art/Terrain/Features/SolarSystem/Planet_Small_Ring.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_LARGE_PLANET_MOON</Tag>
						<Name>Art/Terrain/Features/SolarSystem/Planet_Large_Moon.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_MEDIUM_PLANET_MOON</Tag>
						<Name>Art/Terrain/Features/SolarSystem/Planet_Medium_Moon.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_SMALL_PLANET_MOON</Tag>
						<Name>Art/Terrain/Features/SolarSystem/Planet_Small_Moon.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_LARGE_PLANET_POPULATION_1</Tag>
						<Name>Art/Terrain/Features/SolarSystem/planet_large_population_level1.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_LARGE_PLANET_POPULATION_2</Tag>
						<Name>Art/Terrain/Features/SolarSystem/planet_large_population_level2.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_LARGE_PLANET_POPULATION_3</Tag>
						<Name>Art/Terrain/Features/SolarSystem/planet_large_population_level3.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_MEDIUM_PLANET_POPULATION_1</Tag>
						<Name>Art/Terrain/Features/SolarSystem/planet_medium_population_level1.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_MEDIUM_PLANET_POPULATION_2</Tag>
						<Name>Art/Terrain/Features/SolarSystem/planet_medium_population_level2.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_MEDIUM_PLANET_POPULATION_3</Tag>
						<Name>Art/Terrain/Features/SolarSystem/planet_medium_population_level3.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_SMALL_PLANET_POPULATION_1</Tag>
						<Name>Art/Terrain/Features/SolarSystem/planet_small_population_level1.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_SMALL_PLANET_POPULATION_2</Tag>
						<Name>Art/Terrain/Features/SolarSystem/planet_small_population_level2.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_SMALL_PLANET_POPULATION_3</Tag>
						<Name>Art/Terrain/Features/SolarSystem/planet_small_population_level3.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_LARGE_PLANET_SELECTION</Tag>
						<Name>Art/Terrain/Features/SolarSystem/selector_large.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_MEDIUM_PLANET_SELECTION</Tag>
						<Name>Art/Terrain/Features/SolarSystem/selector_medium.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_SMALL_PLANET_SELECTION</Tag>
						<Name>Art/Terrain/Features/SolarSystem/selector_small.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_LARGE_PLANET_MAG_LEV_NETWORK</Tag>
						<Name>Art/Terrain/Features/SolarSystem/Planet_Large_MagLev.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_MEDIUM_PLANET_MAG_LEV_NETWORK</Tag>
						<Name>Art/Terrain/Features/SolarSystem/Planet_Medium_MagLev.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_SMALL_PLANET_MAG_LEV_NETWORK</Tag>
						<Name>Art/Terrain/Features/SolarSystem/Planet_Small_MagLev.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_LARGE_PLANET_COMMERCIAL_SATELLITES</Tag>
						<Name>Art/Terrain/Features/SolarSystem/Planet_Large_Satellite.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_MEDIUM_PLANET_COMMERCIAL_SATELLITES</Tag>
						<Name>Art/Terrain/Features/SolarSystem/Planet_Medium_Satellite.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_SMALL_PLANET_COMMERCIAL_SATELLITES</Tag>
						<Name>Art/Terrain/Features/SolarSystem/Planet_Small_Satellite.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_CAPITAL_SHIPYARD</Tag>
						<Name>Art/Structures/Improvements/CapitalShipyard/CapitalShipyard.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_SQUADRON_FACTORY</Tag>
						<Name>Art/Structures/Improvements/SquadronFactory/SquadronFactory.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_SQUADRON_DEFENSE_NETWORK</Tag>
						<Name>Art/Structures/Improvements/SquadronDefense/SquadronDefense.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_STAR_FORTRESS</Tag>
						<Name>Art/Structures/Improvements/StarFortress/StarFortress.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_ASTRAL_GATE_1</Tag>
						<Name>Art/Structures/Improvements/AscendancyGate/AscendancyGate_01.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_ASTRAL_GATE_2</Tag>
						<Name>Art/Structures/Improvements/AscendancyGate/AscendancyGate_02.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_ASTRAL_GATE_3</Tag>
						<Name>Art/Structures/Improvements/AscendancyGate/AscendancyGate_03.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_ASTRAL_GATE_4</Tag>
						<Name>Art/Structures/Improvements/AscendancyGate/AscendancyGate_04.nif</Name>
					</FeatureDummyNode>
					<FeatureDummyNode>
						<Tag>FEATURE_MODEL_TAG_ASTRAL_GATE_5</Tag>
						<Name>Art/Structures/Improvements/AscendancyGate/AscendancyGate_05.nif</Name>
					</FeatureDummyNode>
				</FeatureDummyNodes>
				<bGenerateRotations>0</bGenerateRotations>
				<VarietyButton>,Art/Interface/Buttons/Units/Transport.dds,Art/Interface/Buttons/FinalFrontier2_Atlas.dds,2,4</VarietyButton>
			</FeatureVariety>
		</FeatureArtInfo>
		<FeatureArtInfo>
			<Type>ART_DEF_FEATURE_ICE</Type>
			<bAnimated>1</bAnimated>
			<bRiverArt>0</bRiverArt>
			<TileArtType>TILE_ART_TYPE_HALF_TILING</TileArtType>
			<LightType>LIGHT_TYPE_SUN</LightType>
			<fScale>1.0</fScale>
			<fInterfaceScale>1.0</fInterfaceScale>
			<Button>,Art/Interface/Buttons/Units/Transport.dds,Art/Interface/Buttons/FinalFrontier2_Atlas.dds,6,4</Button>
			<FeatureVariety>
				<FeatureArtPieces>
					<FeatureArtPiece>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice01_01.nif</ModelFile>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice01_02.nif</ModelFile>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice01_03.nif</ModelFile>
						<Connections>NW</Connections>
					</FeatureArtPiece>
					<FeatureArtPiece>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice02_01.nif</ModelFile>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice02_02.nif</ModelFile>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice02_03.nif</ModelFile>
						<Connections>NE</Connections>
					</FeatureArtPiece>
					<FeatureArtPiece>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice03_01.nif</ModelFile>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice03_02.nif</ModelFile>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice03_03.nif</ModelFile>
						<Connections>NW NE</Connections>
					</FeatureArtPiece>
					<FeatureArtPiece>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice04_01.nif</ModelFile>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice04_02.nif</ModelFile>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice04_03.nif</ModelFile>
						<Connections>SE</Connections>
					</FeatureArtPiece>
					<FeatureArtPiece>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice05_01.nif</ModelFile>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice05_02.nif</ModelFile>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice05_03.nif</ModelFile>
						<Connections>NW SE</Connections>
					</FeatureArtPiece>
					<FeatureArtPiece>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice06_01.nif</ModelFile>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice06_02.nif</ModelFile>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice06_03.nif</ModelFile>
						<Connections>NE SE</Connections>
					</FeatureArtPiece>
					<FeatureArtPiece>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice07_01.nif</ModelFile>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice07_02.nif</ModelFile>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice07_03.nif</ModelFile>
						<Connections>NW NE SE</Connections>
					</FeatureArtPiece>
					<FeatureArtPiece>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice08_01.nif</ModelFile>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice08_02.nif</ModelFile>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice08_03.nif</ModelFile>
						<Connections>SW</Connections>
					</FeatureArtPiece>
					<FeatureArtPiece>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice09_01.nif</ModelFile>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice09_02.nif</ModelFile>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice09_03.nif</ModelFile>
						<Connections>NW SW</Connections>
					</FeatureArtPiece>
					<FeatureArtPiece>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice10_01.nif</ModelFile>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice10_02.nif</ModelFile>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice10_03.nif</ModelFile>
						<Connections>NE SW</Connections>
					</FeatureArtPiece>
					<FeatureArtPiece>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice11_01.nif</ModelFile>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice11_02.nif</ModelFile>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice11_03.nif</ModelFile>
						<Connections>NW NE SW</Connections>
					</FeatureArtPiece>
					<FeatureArtPiece>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice12_01.nif</ModelFile>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice12_02.nif</ModelFile>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice12_03.nif</ModelFile>
						<Connections>SE SW</Connections>
					</FeatureArtPiece>
					<FeatureArtPiece>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice13_01.nif</ModelFile>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice13_02.nif</ModelFile>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice13_03.nif</ModelFile>
						<Connections>NW SE SW</Connections>
					</FeatureArtPiece>
					<FeatureArtPiece>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice14_01.nif</ModelFile>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice14_02.nif</ModelFile>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice14_03.nif</ModelFile>
						<Connections>NE SE SW</Connections>
					</FeatureArtPiece>
					<FeatureArtPiece>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice15_01.nif</ModelFile>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice15_02.nif</ModelFile>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice15_03.nif</ModelFile>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice15_04.nif</ModelFile>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice15_05.nif</ModelFile>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice15_06.nif</ModelFile>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice15_07.nif</ModelFile>
						<ModelFile>Art/Terrain/Features/FinalFrontier/IcePack/Ice15_08.nif</ModelFile>
						<Connections>NW NE SE SW</Connections>
					</FeatureArtPiece>
				</FeatureArtPieces>
				<FeatureDummyNodes/>
				<bGenerateRotations>0</bGenerateRotations>
				<VarietyButton>,Art/Interface/Buttons/Units/Transport.dds,Art/Interface/Buttons/FinalFrontier2_Atlas.dds,6,4</VarietyButton>
			</FeatureVariety>
		</FeatureArtInfo>
		<FeatureArtInfo>
			<Type>ART_DEF_FEATURE_JUNGLE</Type>
			<bAnimated>1</bAnimated>
			<bRiverArt>0</bRiverArt>
			<TileArtType>TILE_ART_TYPE_NONE</TileArtType>
			<LightType>LIGHT_TYPE_SUN</LightType>
			<fScale>1.0</fScale>
			<fInterfaceScale>1.0</fInterfaceScale>
			<Button>,Art/Interface/Buttons/Units/Transport.dds,Art/Interface/Buttons/FinalFrontier2_Atlas.dds,4,4</Button>
			<FeatureVariety>
				<FeatureArtPieces>
					<FeatureArtPiece>
						<ModelFile>Art/Terrain/Features/FinalFrontier/SuperNova/SuperNova.nif</ModelFile>
						<Connections></Connections>
					</FeatureArtPiece>
				</FeatureArtPieces>
				<FeatureDummyNodes/>
				<bGenerateRotations>0</bGenerateRotations>
				<VarietyButton>,Art/Interface/Buttons/Units/Transport.dds,Art/Interface/Buttons/FinalFrontier2_Atlas.dds,4,4</VarietyButton>
			</FeatureVariety>
		</FeatureArtInfo>
		<FeatureArtInfo>
			<Type>ART_DEF_FEATURE_OASIS</Type>
			<bAnimated>1</bAnimated>
			<bRiverArt>0</bRiverArt>
			<TileArtType>TILE_ART_TYPE_NONE</TileArtType>
			<LightType>LIGHT_TYPE_SUN</LightType>
			<fScale>4.0</fScale>
			<fInterfaceScale>1.0</fInterfaceScale>
			<Button>,Art/Interface/Buttons/Units/Transport.dds,Art/Interface/Buttons/FinalFrontier2_Atlas.dds,3,4</Button>
			<FeatureVariety>
				<FeatureArtPieces>
					<FeatureArtPiece>
						<ModelFile>Art/Structures/Improvements/BlackHole/BlackHole.nif</ModelFile>
						<Connections></Connections>
					</FeatureArtPiece>
				</FeatureArtPieces>
				<FeatureDummyNodes/>
				<bGenerateRotations>0</bGenerateRotations>
				<VarietyButton>,Art/Interface/Buttons/Units/Transport.dds,Art/Interface/Buttons/FinalFrontier2_Atlas.dds,3,4</VarietyButton>
			</FeatureVariety>
		</FeatureArtInfo>
		<FeatureArtInfo>
			<Type>ART_DEF_FEATURE_GRAV_FIELD</Type>
			<bAnimated>0</bAnimated>
			<bRiverArt>1</bRiverArt>
			<TileArtType>TILE_ART_TYPE_NONE</TileArtType>
			<LightType>LIGHT_TYPE_SUN</LightType>
			<fScale>1.0</fScale>
			<fInterfaceScale>1.0</fInterfaceScale>
			<Button>,Art/Interface/Buttons/Units/Transport.dds,Art/Interface/Buttons/FinalFrontier2_Atlas.dds,3,4</Button>
			<FeatureVariety>
				<FeatureArtPieces/>
				<FeatureDummyNodes/>
				<bGenerateRotations>0</bGenerateRotations>
				<VarietyButton>,Art/Interface/Buttons/Units/Transport.dds,Art/Interface/Buttons/FinalFrontier2_Atlas.dds,3,4</VarietyButton>
			</FeatureVariety>
		</FeatureArtInfo>
		<FeatureArtInfo>
			<Type>ART_DEF_FEATURE_SUPERNOVA_AREA</Type>
			<bAnimated>0</bAnimated>
			<bRiverArt>1</bRiverArt>
			<TileArtType>TILE_ART_TYPE_NONE</TileArtType>
			<LightType>LIGHT_TYPE_SUN</LightType>
			<fScale>1.0</fScale>
			<fInterfaceScale>1.0</fInterfaceScale>
			<Button>,Art/Interface/Buttons/Units/Transport.dds,Art/Interface/Buttons/FinalFrontier2_Atlas.dds,4,4</Button>
			<FeatureVariety>
				<FeatureArtPieces/>
				<FeatureDummyNodes/>
				<bGenerateRotations>0</bGenerateRotations>
				<VarietyButton>,Art/Interface/Buttons/Units/Transport.dds,Art/Interface/Buttons/FinalFrontier2_Atlas.dds,4,4</VarietyButton>
			</FeatureVariety>
		</FeatureArtInfo>
		<FeatureArtInfo>
			<Type>ART_DEF_FEATURE_FOREST</Type>
			<bAnimated>1</bAnimated>
			<bRiverArt>0</bRiverArt>
			<TileArtType>TILE_ART_TYPE_HALF_TILING</TileArtType>
			<LightType>LIGHT_TYPE_SUN</LightType>
			<fScale>1.0</fScale>
			<fInterfaceScale>1.0</fInterfaceScale>
			<Button>,Art/Interface/Buttons/Units/Transport.dds,Art/Interface/Buttons/FinalFrontier2_Atlas.dds,5,4</Button>
			<FeatureVariety>
				<FeatureArtPieces>
					<FeatureArtPiece>
						<ModelFile>Art/Terrain/Features/Asteroids/Asteroids_01_01.nif</ModelFile>
						<Connections>NW</Connections>
					</FeatureArtPiece>
					<FeatureArtPiece>
						<ModelFile>Art/Terrain/Features/Asteroids/Asteroids_02_01.nif</ModelFile>
						<Connections>NE</Connections>
					</FeatureArtPiece>
					<FeatureArtPiece>
						<ModelFile>Art/Terrain/Features/Asteroids/Asteroids_03_01.nif</ModelFile>
						<Connections>NW NE</Connections>
					</FeatureArtPiece>
					<FeatureArtPiece>
						<ModelFile>Art/Terrain/Features/Asteroids/Asteroids_04_01.nif</ModelFile>
						<Connections>SE</Connections>
					</FeatureArtPiece>
					<FeatureArtPiece>
						<ModelFile>Art/Terrain/Features/Asteroids/Asteroids_05_01.nif</ModelFile>
						<Connections>NW SE</Connections>
					</FeatureArtPiece>
					<FeatureArtPiece>
						<ModelFile>Art/Terrain/Features/Asteroids/Asteroids_06_01.nif</ModelFile>
						<Connections>NE SE</Connections>
					</FeatureArtPiece>
					<FeatureArtPiece>
						<ModelFile>Art/Terrain/Features/Asteroids/Asteroids_07_01.nif</ModelFile>
						<Connections>NW NE SE</Connections>
					</FeatureArtPiece>
					<FeatureArtPiece>
						<ModelFile>Art/Terrain/Features/Asteroids/Asteroids_08_01.nif</ModelFile>
						<Connections>SW</Connections>
					</FeatureArtPiece>
					<FeatureArtPiece>
						<ModelFile>Art/Terrain/Features/Asteroids/Asteroids_09_01.nif</ModelFile>
						<Connections>NW SW</Connections>
					</FeatureArtPiece>
					<FeatureArtPiece>
						<ModelFile>Art/Terrain/Features/Asteroids/Asteroids_10_01.nif</ModelFile>
						<Connections>NE SW</Connections>
					</FeatureArtPiece>
					<FeatureArtPiece>
						<ModelFile>Art/Terrain/Features/Asteroids/Asteroids_11_01.nif</ModelFile>
						<Connections>NW NE SW</Connections>
					</FeatureArtPiece>
					<FeatureArtPiece>
						<ModelFile>Art/Terrain/Features/Asteroids/Asteroids_12_01.nif</ModelFile>
						<Connections>SE SW</Connections>
					</FeatureArtPiece>
					<FeatureArtPiece>
						<ModelFile>Art/Terrain/Features/Asteroids/Asteroids_13_01.nif</ModelFile>
						<Connections>NW SE SW</Connections>
					</FeatureArtPiece>
					<FeatureArtPiece>
						<ModelFile>Art/Terrain/Features/Asteroids/Asteroids_14_01.nif</ModelFile>
						<Connections>NE SE SW</Connections>
					</FeatureArtPiece>
					<FeatureArtPiece>
						<ModelFile>Art/Terrain/Features/Asteroids/Asteroids_15_01.nif</ModelFile>
						<ModelFile>Art/Terrain/Features/Asteroids/Asteroids_15_02.nif</ModelFile>
						<ModelFile>Art/Terrain/Features/Asteroids/Asteroids_15_03.nif</ModelFile>
						<Connections>NW NE SE SW</Connections>
					</FeatureArtPiece>
				</FeatureArtPieces>
				<FeatureDummyNodes/>
				<bGenerateRotations>0</bGenerateRotations>
				<VarietyButton>,Art/Interface/Buttons/Units/Transport.dds,Art/Interface/Buttons/FinalFrontier2_Atlas.dds,5,4</VarietyButton>
			</FeatureVariety>
		</FeatureArtInfo>
		<FeatureArtInfo>
			<Type>ART_DEF_FEATURE_FALLOUT</Type>
			<bAnimated>1</bAnimated>
			<bRiverArt>0</bRiverArt>
			<TileArtType>TILE_ART_TYPE_NONE</TileArtType>
			<LightType>LIGHT_TYPE_SUN</LightType>
			<fScale>1.0</fScale>
			<fInterfaceScale>1.0</fInterfaceScale>
			<Button>,Art/Interface/Buttons/Units/Transport.dds,Art/Interface/Buttons/FinalFrontier2_Atlas.dds,7,4</Button>
			<FeatureVariety>
				<FeatureArtPieces>
					<FeatureArtPiece>
						<ModelFile>Art/Terrain/Features/FinalFrontier/Radiation/Radiation.nif</ModelFile>
						<Connections></Connections>
					</FeatureArtPiece>
				</FeatureArtPieces>
				<FeatureDummyNodes/>
				<bGenerateRotations>0</bGenerateRotations>
				<VarietyButton>,Art/Interface/Buttons/Units/Transport.dds,Art/Interface/Buttons/FinalFrontier2_Atlas.dds,7,4</VarietyButton>
			</FeatureVariety>
		</FeatureArtInfo>
	</FeatureArtInfos>
</Civ4ArtDefines>
 
Thanks, it took me 2 days to figure out what was going on, so I figured I'd save everybody else some time. I only wish I had this to read when I started. :p
 
Seems like an awful lot of work...can't someone write an editor that does all this more easily? :-)
 
I'm sure someone probably could, but it won't be me. You'd still have to fix the python code even if you had an editor. Editor won't do you much good if Civ4 can't read the file properly. ;)
 
I'm wondering if anyone else has had trouble getting this to work. I feel as though I'm missing something. I can successfully get as far as "print aData," but after that I can't really get anything to work the way it should.

The best I've done so far is change the star color using pSystem.setSunType(0 - 4), but it's not permanent. I can see it even when I go back to "print aData," which shows the value as unchanged even though it worked cosmetically. Because of that it seems, whenever I try the "pSystem.updateDisplay()" command it reverts back to its original color.

It appears as though nothing I change in the lists actually saves, even though I use the "pSystem.setData(aData)" command at the end. Nothing is affected in the aData or on screen after telling it to save and update the display. As far as planets go, the best I can manage is to rename them. All the alternative commands save that one come up as invalid.

So, in short, trying the first method to alter the lists does not work at all for me, and I've had very limited success using the alternative method with the "set" commands. I'm hoping that someone else who had this problem and figured out what they were doing wrong could share some insight, because I just can't seem to catch whatever it is I'm missing here. I have modified my BtS config file and I'm using the right console (the shift + ~ one that shows the Python version number).
 
I'm at work right now, but when I get home in about 5 hours, I'll take a look and try to see what's going on.

But if I had to guess right now, it sounds like you're not using the setData method after you change the aData array.
 
Venator, I can't reproduce what you're describing, when using my guide as is. However, I have an idea of what you're doing wrong.

When you use pSystem.setSunType(), you said that the graphics do change. That means your change worked. From there, you should update the pPlot's scriptdata via pPlot.setScriptData(pSystem.getData()).

So if you wanted to just change the SunType, it would look something like this:
Code:
pSystem.setSunType(1)
pPlot.setScriptData(pSystem.getData())
pSystem.updateDisplay()

It sounds like, for some reason you're then using pSystem.setData(aData). You shouldn't do that. aData contains outdated (stale) information if you've already used the sequence above. Before using aData again, you should update it with the new information that the helper functions assigned to it.
Code:
aData = pSystem.getData()

You should use one method or the other of those shown, not both, for just this reason. By getting the aData as well as using the CvSolarSystem methods, you are essentially trying to keep track of the same set of data twice. But if you aren't careful about updating both sets when either changes, you can leave old data in one of them, which would cause the symptoms you're describing.
 
Well, that's cleared up one problem. I had been trying to once again change the sun type using the aData method after successfully using the pSystem/pPlanet commands. So at least now I know why it kept reverting back to its original color. Using "pPlot.setScriptData(pSystem.getData())" always results in an error for me, and I forgot to try and see if "pSystem.updateDisplay()" would work regardless, but going into the system interface works for updating the image well enough.

I can't seem to figure out, though, why the aData method does not work for me at all. It's as though the changes simply will not save. I thought I was following the guide exactly, but maybe I've been overlooking something. If you have the time and would not mind looking at them, I took two screenshots of that one and have included them in a zip file here. I'm using the star as an example again, but that's my problem with anything using the aData method.

I'm also having trouble still doing many things with the alternative method. It seems as though a lot of them just don't work. For example, I can change planets' names using it, but nothing else that I've tried so far. At first I thought I must have missed something there, since almost none of it works, but the fact that I can change names makes me inclined to believe it must be something else. A screenshot of that is also in the zip.
 

Attachments

I can't believe I didn't notice this before, and I apologize for it. I got my programming languages mixed up, and thought that Python did reference assignments.

What this means for you is, during the step that you do
Code:
iStarType = aData[0]
iStarType = 3
you should instead do
Code:
aData[0] = 3

The middle man approach won't work here, and I'll make the appropriate changes to the guide. I added them as an after thought, trying to make it easier for the non-programming folk. Sorry for the headache.
 
Ah, now it works perfectly. Thank you very much for your assistance.
 
That's good to hear.
 
Alright, seeing all of the effort necessary to get Final Frontier WorldBuilder Save working made me feel bad, so I spent a couple days adding the ability to store Star System/Planet information in WorldBuilder Saves. :D You can only do so in the text (i.e. there's nothing added to the interface in the WorldBuilder to do so), but now you'll only need a few lines to keep track of this stuff. It'll be available in the next patch.

Jon

Code:
	FeatureType=FEATURE_SOLAR_SYSTEM, FeatureVariety=0
		StarType=ORANGE_STAR
		PlanetType=GREEN_PLANET, OrbitRing=2, PlanetSize=0, HasMoon=1, HasRings=0
		PlanetType=WHITE_PLANET, OrbitRing=6, PlanetSize=2, HasMoon=0, HasRings=0
		PlanetType=BLUE_PLANET, OrbitRing=8, PlanetSize=1, HasMoon=0, HasRings=1
		PlanetType=RED_PLANET, OrbitRing=7, PlanetSize=2, HasMoon=0, HasRings=0
		PlanetType=RED_PLANET, OrbitRing=3, PlanetSize=2, HasMoon=0, HasRings=0
		PlanetType=RED_PLANET, OrbitRing=5, PlanetSize=0, HasMoon=0, HasRings=0
 
That will certainly be helpful, thanks Jon.
 
Just a small hint: The "u" in front of a string signifies it as a unicode string in python. It's probably necessary, but I didn't have a decent look at python in this game yet.
 
Greetings all,

I created a small modification to allow you to edit planet names within the game UI itself... and without having to fool around with the python console.

I've attached a copy of the updated python file; you can use a diff program if you're interested to see how I did it, but if you don't care how it works, just copy the attached .py file to your Beyond the Sword\Mods\Final Frontier\Assets\Python directory.

*** I recommend you make a backup of your CvFinalFrontierEvents.py file before you overwrite the file, in case you want to roll back my changes. Backups are always a good thing. ***

After you've copied the new .py file, restart Civ. To rename a planet in a star system, open up the star system (i.e. city) screen and RIGHT CLICK on any of the planets that are orbiting the star in the center of the screen. A dialog should pop up with the name of the planet you've selected; enter the new name and press OK, and poof...you're done.

Enjoy!
 

Attachments

Absolutely. Feel free to use it/modify it/distribute it however you like.

FYI, I only tested single-player mode (because that's all I play) but if your mod is multiplayer, you should run a quick test to make sure that the planet renaming stuff works okay. I think it should, but I didn't test it. The scenario where you'd most likely see a problem, if there is one, is if two human players modify planet names at the same time. Also, if your espionage level is high enough to have city visibility, you might be able to rename another player's planets; I didn't test that case, either.

Note to modders out there, if you want to use CyPopupReturn, (i.e. if you need to get text out of a dialog) this code has a working example.
 
Back
Top Bottom