Ok so you want to create your own maps huh? Well... first things first you have to know the limits and constraints. You also have to seriously question your ability.
Of course, you have two options. One is to edit the map files themselves in a text editor, the other is to settle with altering the objects on existing maps using my ModWizard utility and then renaming the file it saves.
If you are after information on the actual mission file itself and the extra information contained within it, then read on. Otherwise, follow that link to the ModWizard utility and have some fun driving around the map placing different objects.
Now I don't mean to question your computer knowledge or insinuate that you are too stupid to even try. The fact that you managed to get to this page puts you head and shoulders above some of the people who have asked me how to create maps. One such person hadn't even heard of Notepad or SimpleText.
What you will need:
- Any basic text editor. WordPad goes.
- You should also make a backup copy of any files you want to open up and tinker with.
Where are the files?
For PC:
Inside the ThinkTanks folder - wherever you installed it to, and by default:
c:\Program Files\BraveTree\ThinkTanks\
The mission files are located within:
game\data\missions\
For Mac (OSX):
On Mac OS X, CTRL-Click on the ThinkTanks application. Choose "Show Package Contents" from the pop-up menu. Mission files are located within:
Contents\Resources\game\data\missions
The Filenames
The filenames in question are TT1_1.mis through to TT3_4.mis
Don't touch the files ending in .ml or .ter. These are mission lighting and terrain files and are both compiled by the Torque game engine. Each .mis file has an associated .ml and .ter file, but it is the .mis file that controls where to place everything and what colours / textures to use.
IMPORTANT!
If any of this has confused you so far. Then stop right here, and just go to someone else's site and download theirs. You don't want to go messing up any files unless you know what you are doing. If you do, and Think Tanks no longer runs properly, or crashes unexpectedly, then you have messed up and will need to re-install (unless you have made backup copies of all the files you touched, in which case you can just rename them back again).
Mission file naming convention
The first number refers to the map type
- Lush
Spooky
Frantic
- TT1_1.mis = Medulla Mesa (Lush)
TT1_2.mis = Hypothalamus Hills (Lush)
TT1_3.mis = Cranium Crater (Lush)
TT1_4.mis = Freudian Flats (Lush)
TT2_1.mis = Hippocampus Hollow (Spooky)
TT2_2.mis = Comatose Canyon (Spooky)
TT2_3.mis = Greymatter Gorge (Spooky)
TT2_4.mis = Pituitary Plateau (Spooky)
TT3_1.mis = Synaptic Slopes (Frantic)
TT3_2.mis = Ganglia Gully (Frantic)
TT3_3.mis = Neurotic Nexus (Frantic)
TT3_4.mis = Receptor Ridge (Frantic)
Make a backup! You might think you can remember all the changes you made, but if you made a mistake editing it, why assume you won't when you try and put it back how it was!
Ok, so now open it in your text editor. You'll see that it's comprised of a whole load of configuration groups. Now to explain what they all are, and what does what.
Modding the mission (.mis) files
Let's examine file TT1_3.mis, "Cranium Crater". It begins:
Code: Select all
//--- OBJECT WRITE BEGIN ---
new SimGroup(MissionGroup) {
musicTrack = "Lush";
The next line creates the MissionGroup for the game. This will contain everything to do with the current level, the terrain, objects, spawn locations and so on.
musicTrack indicates which music file to play (if you have game music turned on) Options for this inclue: "Lush", "Spooky" or "Frantic".
Any statement line or variable declaration must end with a semi-colon. This signifies the end of the line when it is being compiled. If you omit one of these, it will not compile correctly and you'll ahve a messed up map.
All the data for new objects or groups is contained within squiggly brackets. { marks the beginning, and }; marks the end. You'll notice here that this one isn't yet closed. That's because all the other objects are held within this MissionGroup object. The last }; at the bottom of file is what closes this declaration.
Code: Select all
new ScriptObject(MissionInfo) {
name = "Cranium Crater";
};
Code: Select all
new MissionArea(MissionArea) {
area = "-256 -256 512 512";
flightCeiling = "200";
flightCeilingRange = "0";
floor = "60";
locked = "false";
};
Area = "x y width height"; (and thats imagining you are looking down on the map from above). If you want to allow people to travel to the islands beyond the main landmass, you will need to change these values to increase the area in which you can drive around without dying. Using "-512 -512 1024 1024" will do just that.
flightCeiling does nothing. Changing this value won't change anything in the game so you might as well just leave it as it is.
flightCeilingRange again, ignore this. It doesn't do anything.
floor = "height" This is what controls the kill zone of the fog. If set to "0" the the fog won't kill you, and the larger the number, typically the height of the fog, the higher the kill-zone will start. If you set it too high, then you won't be able to drive anywhere and will instantly die when you spawn.
locked again, this is irrelevant. Ignore it.
Code: Select all
new Sky(Sky) {
position = "0 0 0";
rotation = "1 0 0 0";
scale = "1 1 1";
visibleDistance = "1000";
useSkyTextures = "1";
renderBottomTexture = "0";
SkySolidColor = "0.547000 0.641000 0.789000 0.000000";
fogDistance = "300";
fogColor = "0.820000 0.828000 0.844000 1.000000";
fogVolume1 = "1 1 1";
fogVolume2 = "1 1 1";
fogVolume3 = "40 1 55";
materialList = "~/data/skies/sky_day.dml";
windVelocity = "1 1 0";
windEffectPrecipitation = "0";
noRenderBans = "0";
fogVolumeColor1 = "128.000000 128.000000 128.000000 -222768174765569860000000000000000000000.000000";
fogVolumeColor2 = "128.000000 128.000000 128.000000 0.000000";
fogVolumeColor3 = "128.000000 128.000000 128.000000 0.000000";
cloudSpeed1 = "0.0001";
locked = "true";
cloudSpeed3 = "0.0003";
cloudHeightPer2 = "0";
cloudSpeed2 = "0.0002";
cloudHeightPer1 = "0";
cloudHeightPer0 = "0";
};
visibleDistance: This controls how far into the distance you can see and tells the game how much to draw to the screen. Ensure that this value is higher than the fogDistance value.
useSkyTextures: "1" = yes to show sky textures, "0" is to turn them off.
renderBottomTexture: again, "1" is on, and "0" turns them off. Most of the time you wont need this as you wont see them anyway.
SkySolidColor: This is the "Red Green Blue Alpha" colour of the sky. Each colour component is within the range of 0 to 1 where 1 is a full amount of that colour.
fogDistance: This controls how far away the fog is visible from.
fogVolume1, fogVolume2, fogVolume3: These control layers of fog/mist. The first value in the quotation marks is the density of the fog, the second if the height at which this 'band of fog starts, and the last is the height that the band stops at. Make sure that the three layers do not overlap. For example (if floor = 60;, you might have the following:
fogVolume1 = "150 1 20";
fogVolume2 = "100 21 40";
fogVolume3 = "50 41 60";
A density value of 1 is virtually clear and a higher value (eg 300) is very thick.
fogVolumeColor1, fogVolumeColor2, fogVolumeColor3: These are the colour values (Red Green Blue Alpha) of the fog bands. and each colour component ranges from 0 to 255.
cloudSpeed1, cloudSpeed2, cloudSpeed3: These are the speeds of the three cloud layers. Values range from between 0 and 1, but the current settings here are pretty good and I certainly wouldn't bother changing them.
cloudHeightPer1, cloudHeightPer2, cloudHeightPer3: This is the height of each of the three cloud layers, again, there is not much point in changing these as they work nicely. Values range from 0 to 1.
Code: Select all
new Sun() {
direction = "0.799447 0.368102 -0.474748";
color = "0.988000 0.985000 0.980000 1.000000";
ambient = "0.420000 0.420000 0.400000 0.400000";
rotation = "1 0 0 0";
locked = "true";
scale = "1 1 1";
};
direction: This is the "X Y Z" direction of the sunlight.
color: The "Red Green Blue Alpha" colour of the sunlight (each component ranges from 0 to 1)
ambient: The "Red Green Blue Alpha" colour of the ambient lighting emitted. (Values from 0 to 1)
Code: Select all
new TerrainBlock(Terrain) {
rotation = "1 0 0 0";
scale = "1 1 1";
detailTexture = "~/data/terrains/details/detail1";
terrainFile = "./TT1_3.ter";
squareSize = "8";
tile = "0";
blockShift = "7";
locked = "false";
position = "-1024 -1024 0";
};
The squareSize can also be adjusted to create alter the map, decreasing this value will squish the map up, making it smaller and the the mountains and hills taller. Increasing it will stretch out the map making everything larger and flatter.
Spawn Places
Now for the various spawn locations. It starts off as follows:
Code: Select all
new SimGroup(PlayerDropPoints) {
Code: Select all
new SimGroup(GreenPlayerDropPoints) {
Code: Select all
new SpawnSphere() {
position = "-28.2286 84.5148 104.24";
rotation = "-0.098637 0.0124813 0.995045 199.327";
scale = "1 1 1";
dataBlock = "SpawnSphereMarker";
radius = "1";
lockCount = "0";
indoorWeight = "100";
locked = "false";
outdoorWeight = "100";
sphereWeight = "100";
homingCount = "0";
};
to the end, the console window will be automatically logged to a file called console.log and you can then copy and paste the positions from there.
position: the position of the spawn location ("X Y Z")
rotation: angle of rotation (i.e. which direction it is facing) The first three values are X-axis rotation, Y-axis rotation and Z-axis rotation, and the fourth is the angle of rotation (in radians) about the pole that these rotations will yield. If you use the PositionGrabber, you'll get the values automatically. Trying to guess them correctly is a futile exercise.
Everything else is irrelevant and should be left alone. Scale works for no items in ThinkTanks.
Code: Select all
};
new SimGroup(BluePlayerDropPoints) {
Then the BluePlayerDropPoints group is closed, as is the still open main group: PlayerDropPoints. (within which both the green set and blue set were)
Ok.. now the various objects around the map
Trees and Rocks
There are various different objects around the maps and these look like the following:
Code: Select all
new TSStatic() {
position = "42.2319 43.0103 82.8227";
rotation = "-0.0475431 -0.967796 -0.247207 72.8298";
scale = "1 1 1";
shapeName = "~/data/shapes/Green/rockgreen03.dts";
treeLighting = "0";
lightBoost = "0";
};
Trees and Rocks have exactly the same structure but point to different files. the only other difference between them is the treeLighting value.
position: get this from using the PositionGrabber script.
rotation: get this from using the PositionGrabber script.
shapeName: this refers to a shape file. You can see which shapes you have available by checking within your shapes folders and can adjust the filepath accordingly to point to a different object if required.
treeLighting: If this static object is a tree, then you should change this value to a "1", otherwise it is a "0".
The other values are irrelevant and dont do anything.
Booster pads and arrows
Code: Select all
new Boost() {
position = "-65.8657 -173.658 87.4534";
rotation = "-0.439101 -0.526267 0.728171 5.27431";
scale = "1 1 1";
dataBlock = "TestJump";
lightBoost = "0";
};
position: get this from using the PositionGrabber script.
rotation: get this from using the PositionGrabber script.
dataBlock: This has three possible values, "Boost1" (a stationary arrow pad), "TestBoost" (a four-state arrow pad that rotates every use), or "TestJump" (a bounce pad)
The other values are irrelevant and dont do anything.
Ammo Reload
Code: Select all
new PowerUp() {
position = "41.15 25.0831 83.0342";
rotation = "0.0373977 -0.0634508 -0.997284 94.2066";
scale = "1 1 1";
dataBlock = "Reload";
lightBoost = "0";
};
position: get this from using the PositionGrabber script.
rotation: get this from using the PositionGrabber script.
dataBlock: This should be set to "reload";
The other values are irrelevant and dont do anything.
Power-Ups
Code: Select all
new PowerUp() {
position = "-28.3081 95.7332 107.95";
rotation = "0 0 -1 66.4631";
scale = "1 1 1";
dataBlock = "TestPowerup";
lightBoost = "0";
};
position: get this from using the PositionGrabber script.
rotation: get this from using the PositionGrabber script.
dataBlock: This should be set to "TestPowerup";
The other values are irrelevant and dont do anything.
And finally...
Code: Select all
};
//--- OBJECT WRITE END ---
The Game Prefs
Ok, so we have looked through the .mis file and altered that a bit, now what about changing the preferences for the game and customising any Bot names and so on?
This file is called prefs.cs and is found in the ThinkTanks\Game\Server\ folder.
Again, be sure to back up and make a copy of the original before editing it.
In this file are all the bot names and tanks, and various other server settings. It will contain something similar to the following code snippets:
Code: Select all
$Pref::Server::BanTime = 1800;
Code: Select all
$pref::Server::Bot0 = "GoldHeavyTank";
$pref::Server::Bot1 = "SilverMediumTank";
$pref::Server::Bot2 = "BronzeLightTank";
$pref::Server::Bot3 = "GoldLightTank";
$pref::Server::Bot4 = "SilverMediumTank";
$pref::Server::Bot5 = "BronzeHeavyTank";
Options for the bots are:
- GoldHeavyTank
SilverHeavyTank
BronzeHeavyTank
GoldMediumTank
SilverMediumTank
BronzeMediumTank
GoldLightTank
SilverLightTank
BronzeLightTank
BabyBoss
BossTank
Code: Select all
$pref::Server::BotName0 = "Hum [Bot]";
$pref::Server::BotName1 = "Tom [Bot]";
$pref::Server::BotName2 = "Mal [Bot]";
$pref::Server::BotName3 = "Ri [Bot]";
$pref::Server::BotName4 = "Gul [Bot]";
$pref::Server::BotName5 = "Gum [Bot]";
Code: Select all
$pref::Server::BotTeam0 = "GreenTeam";
$pref::Server::BotTeam1 = "GreenTeam";
$pref::Server::BotTeam2 = "GreenTeam";
$pref::Server::BotTeam3 = "BlueTeam";
$pref::Server::BotTeam4 = "BlueTeam";
$pref::Server::BotTeam5 = "BlueTeam";
Each Bot therefore has a line for the type of tank, its name, and its team.
Code: Select all
$Pref::Server::ConnectionError = "You do not have the correct
version of the Torque Game Engine or the related art needed
to connect to this server, please contact the server
operator to obtain the latest version of this game.";
Code: Select all
$Pref::Server::DisplayOnMaster = "Always";
Code: Select all
$Pref::Server::FloodProtectionEnabled = 1;
Code: Select all
$Pref::Server::gameTypeIndex = 0;
Code: Select all
$Pref::Server::KickBanTime = 300;
Code: Select all
$pref::Server::MaxBots = 6;
Code: Select all
$Pref::Server::MaxChatLen = 120;
Code: Select all
$Pref::Server::MaxPlayers = 10;
Code: Select all
$Pref::Server::missionIndex = 1;
Code: Select all
$pref::Server::missionWorld = 1;
Code: Select all
$Pref::Server::Name = "ThinkTanks Server";
Code: Select all
$Pref::Server::PasswordEnabled = 0;
Code: Select all
$Pref::Server::Password = "bogus";
Code: Select all
$pref::Server::SavePassword = "oldpassword";
Code: Select all
$Pref::Server::Port = 28000;
Code: Select all
$Pref::Server::RegionMask = 2;
Code: Select all
$pref::Server::ReplaceBots = 1;
Code: Select all
$Pref::Server::TimeLimit = 20;
Credits
All these information was made by -Z- for http://www.planetthinktanks.com and slightly edited by me.
To view the original files: Go Here.