Jump to content

Search the Community

Showing results for tags 'tutorial'.



More search options

  • Search By Tags

    Type tags separated by commas. These are keywords which should describe the item of content.
  • Search By Author

Content Type


Forums

  • Cities: Skylines
    • Cities: Skylines General Discussion
    • Cities: Skylines Modding - Open Discussion
    • Cities: Skylines Showcase
    • Cities: Skylines City Journals
    • Cities: Skylines Technical Help Q&A
  • SimCity (2013)
    • SimCity (2013) General Discussion
    • SimCity (2013) Modding - Open Discussion
    • SimCity (2013) Region Games
    • SimCity (2013) Showcase
    • SimCity (2013) Technical Help Q&A
  • SimCity 4 Players Forum
    • SimCity 4 General Discussion
    • SC4 Showcase
    • SC4 City Journals
    • SC4 Mac Users
    • SC4 Bugs & Technical Issues
  • SimCity 4 Builders Forum
    • SC4 - Custom Content
    • SC4 BAT - Open Discussion
    • SC4 Modding - Open Discussion
  • Simtropolis Social Forum
    • New Members Information
    • Simtropolis Related
    • General Off-Topic
    • Current Events
    • Architecture & Urban Planning
  • Gamer Topics
    • SimCity 3000
    • City-Building Games
    • Gaming Talk
    • Indie Projects
  • Trixies Forum
    • Trixie Awards - Community Discussion
  • Simtropolis Challenges
    • ST Challenges - Info and Discussion
  • Club-owners Club's Club Discussion
  • Simtropolis en Español's Plaza Mayor
  • Simtropolis en Español's Soporte Técnico
  • Simtropolis en Español's Parque Industrial
  • SimCampus Students's Topics
  • The Transit and Aviation Geeks Club's Topics
  • Arden County City Council's Topics
  • Alliance of Independent Nations on Simtropolis's Discussion
  • The Major Club's Topics
  • Project Rich Water's Topics
  • Guardians of the Galaxy's Topics
  • New Washington's Topics
  • Everything about details's Topics

Categories

  • SimCity 4
    • SC4 Reference
    • SC4 Tutorials
    • BAT & Lot Editor Tutorials
    • Modding Information
    • Mapping & Terraforming
  • Other Games
  • Simtropolis Articles
    • Interviews

Categories

  • News
  • News
  • News

Categories

  • SimCity 4 Buildings
    • Lots
    • Mods & Tools
    • Maps
    • Props
    • Textures
    • 3ds Models
  • PLEX (Main Files)
    • Custom Lots & Mods
    • CDK - Coastal Development Kit
    • MTP - Mountain Theme Pack
    • SPAM - SimPeg Agricultural Mods
    • PEG Utopian Series
  • Cities: Skylines Buildings
    • Maps
    • Roads & Traffic
    • Vehicle Assets
    • Game Mods
    • Props
    • Programs & Tools
  • SimCity (2013) Buildings
    • Game Mods
    • Roads & Traffic
    • Vehicles
    • Programs & Tools
    • User Interface
  • SimCity 3000 Files
    • SC3K Maxis Files
    • Cities & Maps
  • CitiesXL Buildings
    • Mods & Tools
    • Maps
    • Textures & Props
    • Lots
    • 3d Models
  • Simtropolis en Español's Descargas
  • Club-owners Club's Dirk's Files
  • The Major Club's Files
  • Project Rich Water's Files
  • Guardians of the Galaxy's Files
  • New Washington's Files
  • Everything about details's Files

City Journals

There are no results to display.

There are no results to display.

Calendars

  • Weekly Challenge
  • Extended Challenge
  • Monthly Challenge
  • Content Challenge
  • Voting Period
  • Alliance of Independent Nations on Simtropolis's Alliance Calendar
  • Club-owners Club's Events
  • SimCampus Students's Events
  • SimCampus Students's Noggin Thinkers Dates
  • Arden County City Council's Events
  • The Major Club's Events
  • Project Rich Water's Events
  • Guardians of the Galaxy's Events
  • New Washington's Events
  • Everything about details's Events

Skype


Location


Interests


City-building game(s)

Found 78 results

  1. A SimCity 4 Tutorial Cloud Oriented Region Import Method Adding Painted Streams by CorinaMarie@Simtropolis In this guide I present a method to create a grayscale image from which to render a random rolling hills terrain map that has water streams and rivers added. Here's a random sample of a map I created using this method: Note: The following is merely an alternative method to create a semi-realistic, fictional region map for SC4. Before you waste any time reading this please be aware that the defacto standards for map making are: SC4 Mapper, SC4 Terraformer, and Landscape Designer. Use them if you want something better. Also, as mentioned by @RobertLM78 in a reply in this thread there is another one by Ordio called Simcity 4 Region and Config Creator. However, many peeps have said they cannot run those programs on later versions of Windoze or other OS's so what I'm presenting here is simply another method by which one can make a decent map with minimal time and effort. I'm using GIMP for this guide because it's free to anyone. Any good image editing program will have the same tools I use in this guide. The method is quick and easy. Initial Steps 1. Load your SimCity 4 Rush Hour or Deluxe game and create a new region. Name it whatever you want. For this tutorial I'll use Cloud Map. Exit the game, or at a minimum, exit the new region by opening a different region. This is so the existing config.bmp file is not in use. 2. Create a new config.bmp file. For this tutorial mine will be 12x12 pixels. See Config.bmp: How to Make it Yours if you are not already familiar with it. 3. Save that config.bmp into the new region folder you just made. (Overwrite the existing one.) 4. You should now have region.ini and your config.bmp in your new region folder. Making the Grayscale Image 1. Go outside and take a picture of some clouds. 2. Load the picture into a decent imaging program. 3. [Optional] Crop it if there are cloudless parts you don't want in the image. In Gimp it's the Rectangle Select Tool over in the upper left of the tools box. Or you can press R. Draw a box around the part you want to keep. Then go to the Image Menu and select Crop to Selection... 4. Scale the image to the appropriate size based on the config.bmp you will be using. As we learned in @Birdin's config.bmp guide we multiply the dimensions of config.bmp by 64 and add 1. So 12 * 64 = 768 + 1 = 769. The height and width are the same since my config.bmp is 12 x 12. Go to the Image Menu and select Scale Image... That brings up this Scale Image dialog box. First click the little linked chain to the right of the Width and Height boxes to break the chain. This tells the program that we are not concerned about keeping the cropped selection proportional to the original image. Type in the Width and Height dimensions that you calculated in the beginning of this step. For this tutorial I entered 769 in both boxes. Then click the Scale button. 5. Convert to grayscale. Go to the Image Menu and select Mode --> Grayscale. 6. Export the image as a .Bmp file. Go to the File Menu and select Export As ... When the export dialog box comes up, look in the lower left for the little bitty plus sign in a box by the Select File Type (By Extension) and click it. That will open up the File Type selection box. Scroll down and click Windows BMP image. In the upper left in the name box, type in Gray 1 in front of the .bmp. Note only the name portion is pre-highlighted in blue indicating what part to type over. (Brilliant programming imo.) Remember which folder you export (save) the file to. That's indicated by my arrow in this next pic. Mine is going into My Documents. Click the Export Button. The next dialog box has some options. I simply click the Export Button. (I believe one could select the Run-Length Encoded to reduce the file size. I haven't tested that, so I leave it unchecked.) And here's what I created: 8. Close all files. I personally do not let it save my original clouds with the cropping and changes so that way I still have my unaltered original. 9. Close your imaging program. (Or if your comp has plenty of memory, just minimize it.) First Render (These interim steps are what I did when learning. I skip them now I know what I'm doing.) 1. In SimCity 4, open the new region you created. Mine is called Cloud Map. 2. Press the magic key combination of Shift+Ctrl+Alt+r. This brings up the file selection box. 3. Drill down to where you saved your grayscale image file and select Gray 1.bmp then click Ok. 4. Now wait while the map is rendered. You will see Creating New City like this: And here's our first draft render. Note that it's way too choppy. We will fix that soon. The reason I did this preliminary render is to see what part is water. Tweaking the Grayscale Image 1. Reopen Gray 1.bmp in your image editor. We will paint in our rivers and streams before we smooth out the rough, choppy bumps. Select the Paintbrush tool and set it to Acrylic 05. Leave the size at 20 point for now. I selected Acrylic cause it adds a random pattern to the edges of what you paint. 2. Click the foreground color selection box. It's right under all the tools on the left. That brings up the Change Foreground Color choices. Type 40 in Red, Green, and Blue. Yes, I already hear peeps saying: Wait, that's too dark. Stay with me on this. 3. Now paint in streams / rivers. A twitchy hand actually improves the realism. 4. Now to smooth out the choppiness of the hills. From the Filters menu select Blur --> Gaussian Blur... This also blends the rivers and streams so that's why I picked color level 40 (which equates to 120 meters height after rendering but doesn't count the blur merging). This'll be an area to experiment on your own based on your original cloud picture. 5. In the next dialog box change the Blur Radius to 10.0. Or pick your own number. Higher numbers means more smoothing and lower ones give less. 6. Export the image as Gray 2.bmp. Here's my new grayscale: 7. And here it is rendered: The map is now ready to paint trees in game or load your favorite terrain and tree and other landscape related mods. Or, tweak it some more. Further Refinement 1. Let's say I want everything to be a little lower elevation to get a bit more water. From the Colors menu select Levels... 2. Then I adjust the Gamma Level to 0.85. (I derived this number thru trial and error for this particular cloud image.) 3. Here's the new Grayscale image I exported as Gray 3.Bmp: 4. Here it is rendered: 5. And then I painted Maxis trees in every tile: Edit 2016.11.02 I've discovered a couple new things. I started with this cloud picture: Then in GIMP I did the normal stuff outlined above and then I used the Burn Tool to lighten the banks of the rivers: And I blurred it after that. Here's the grayscale I created: Another new thing I noticed is having mods for terrain, rocks, water, and beaches already installed means the import rendering colors the region view with them so I don't have to go into each tile to do that. Here it is rendered: Then I did go in and paint Maxis trees as thick as the program would allow: ^ What I really like is the banks of the rivers seem more realistic to me inasmuch as they show the effect of previous flooding. Also my heavier use of Gaussian Blur means the map is much more friendly when using a slope mod to lay out the transportation network. Where to go from here 1. You can alter the gray shade of your paintbrush to a lighter one and paint along the sides of the streams to create gentler slopes if you like. It's best to do that before adding the blur cause the blur does a bunch of evening out. (See my edit above. Using the Burn Tool works even better for this.) 2. If your cloud picture has a much lighter blue sky you might want to play with brightness, contrast, or color levels to darken it before for you start any other part of the editing. Use the Color Picker Eyedropper to see what shade any given area in your grayscale is. Providing you have not installed a Height Mod with an alteration to the scale factor and/or sea level, grayscale 83 is slightly below sea level. Lower values are farther under water. Grayscale 84 is slightly above water. Higher values are then higher elevations up to a max of 255 (white). 3. Experiment with various options in the imaging program. Render and see what you get. Learning by doing is loads of fun. 4. Experiment with altering the moisture content as discussed here to change the ground texture appearance. 5. Extract the Terrain Properties exemplar from Simcity_1.dat and play around with the variables there like ImageImportScaleFactor and SeaLevel or the Erosion settings. And Lastly Feel free to post your map creations in this thread. Ideally, post both the final grayscale image and then a region screenshot. Reply with what you've discovered that might be useful to other peeps.
  2. Finnbhennach's Crypt

    "Behold, a curious place, where evil BATs come alive and devour your mind!" Original post reserved for project updates, announcements, and tutorials when appropriate. Finnbhennach's Crypt. Fri, Oct 20, 2017. New York City: Blocks of Midtown, Manhattan I. "Ongoing Projects w/ Status Updates" New York City: Blocks of Midtown, Manhattan II. "Future Projects"
  3. In this tutorial, we will create a simple mod that removes some of the ugly vanilla billboard props. You will learn how to work with loading hooks, prefab collections and the ModTools scene explorer. Step 1: Project Setup Create a new project named "CityBeautifier" in VS2017, following Method 2 in Tutorial 0 (working with a text editor is still possible in this tutorial, but not recommended) Your IUserMod implementation should look like this: using ICities; namespace CityBeautifier { public class CityBeautifierMod : IUserMod { public string Name => "City Beautifier"; public string Description => "Removes some ugly props"; } } Tip: The arrow syntax (=>) is a shorthand for the property syntax (get { return ...; }) used in the 0. tutorial. Both are equivalent. Step 2: Loading Hook The Mod API of Cities: Skylines contains various extension interfaces. You can create classes implementing these interfaces to hook into the game. The most important interface is ILoadingExtension. A class implementing this interface will get notified when the loading process begins and when it completes, and when a save is unloaded. Create a new file called CityBeautifierLoading.cs in the Solution Explorer. Add the following content to the file: using ColossalFramework.UI; using ICities; namespace CityBeautifier { public class CityBeautifierLoading : ILoadingExtension { // called when level loading begins public void OnCreated(ILoading loading) { } // called when level is loaded public void OnLevelLoaded(LoadMode mode) { // create dialog panel ExceptionPanel panel = UIView.library.ShowModal<ExceptionPanel>("ExceptionPanel"); // display a message for the user in the panel panel.SetMessage("City Beautifier", "The level is loaded!", false); } // called when unloading begins public void OnLevelUnloading() { } // called when unloading finished public void OnReleased() { } } } Tip: You can also extend the class LoadingExtensionBase. It allows you to override a single loading method instead of implementing all methods Now compile the mod (F6). If there are any compilation errors, use the error list in VS2017 to locate and fix the error (View > Error List) When the compilation was successful, run the game. Enable the mod in content manager (if your mod does not show up, you probably forgot to setup the post build script). Now create or load a city. You will see the dialog panel as soon as the loading screen disappears: Close the game (UI development requires a complete restart after every change) Step 3: Working with the Prefab Collection Our goal is the removal of various props which are attached to buildings. To do that, we have to access the collection of loaded buildings, more specifically building prefabs. Prefabs vs. Instances: Building prefabs are templates for building instances. That means when a building instance is spawned, it uses the properties, textures and models defined in the building prefab. Modifying the building prefab usually causes all building instances to change. There are also prefabs for trees, props, vehicles and networks. Prefab classes of the game always end with Info (e.g. BuildingInfo, PropInfo, ...). All building prefabs can be found in the PrefabCollection<BuildingInfo>. We will now learn how to cycle through all buildings in this collection. Replace the OnLevelLoadedMethod with this code, then compile the mod and run the game: public void OnLevelLoaded(LoadMode mode) { // total number of loaded building assets int buildingPrefabCount = PrefabCollection<BuildingInfo>.LoadedCount(); // create a message string for the user string message = "Number of building assets: " + buildingPrefabCount; // create dialog panel ExceptionPanel panel = UIView.library.ShowModal<ExceptionPanel>("ExceptionPanel"); // display the message in the panel panel.SetMessage("City Beautifier", message, false); } This will output the total number of loaded building prefabs: Now we will create a list of all building names, using a simple for loop. The LoadedCount() method returns the total number of prefabs. We can use the GetLoaded(uint) method to get the prefab objects, using a number in range 0 <= index < buildingPrefabCount: public void OnLevelLoaded(LoadMode mode) { int buildingPrefabCount = PrefabCollection<BuildingInfo>.LoadedCount(); string message = "Number of building assets: " + buildingPrefabCount; // append a list of building names to the message for(uint index = 0; index < buildingPrefabCount; index++) { // get the building asset with the given index from the collection BuildingInfo prefab = PrefabCollection<BuildingInfo>.GetLoaded(index); // append a separator and the name of the asset to the message message += ", "; message += prefab.name; } ExceptionPanel panel = UIView.library.ShowModal<ExceptionPanel>("ExceptionPanel"); panel.SetMessage("City Beautifier", message, false); } The output looks like this: We learned how to access the building prefabs. In the next step, we will use ModTools to dive deeper into the structure of BuildingInfo objects. Step 4: Exploring and modifying building prefabs with the ModTools scene explorer Subscribe to ModTools and enable the mod in content manager. Create or load a city and click on a building you want to inspect. Then use the "Find in Scene Explorer" button. I picked one of the commercial buildings that is decorated with ugly billboards: The properties displayed in the scene explorer belong to the building instance. Props are defined in the building prefab. Luckily the prefab can be found right at the top (expand the "Info" property). Scroll down and expand the "m_props" property. You will see a list of prop items: Expand the items of the list to find out more about the props. Here you can change properties like position, probability and angle. Find the prop you want to remove and set the probability to 0: The prop will disappear instantly. Repeat the step for all props you want remove. Create a list of all prop names, like this: Billboard_big_variation_02 Billboard_big_variation_04 neon-yakisoba-noodles neon-burned-bean-coffee neon-morellos Billboard_big_variation Billboard_big_variation_01 Problem: The changes you applied to the prefabs are not permanent because prefabs are loaded from game/.crp files when you load your city. In the next step, we will change the probability values programmatically, in the loading class of our mod. Step 5: Modify building props programmatically We will remove the panel/message used in Step 3. Instead, we will add another nested for loop to cycle through all prop items of every building prefab: public void OnLevelLoaded(LoadMode mode) { for(uint index = 0; index < PrefabCollection<BuildingInfo>.LoadedCount(); index++) { // get the building prefab with the given index from the collection BuildingInfo prefab = PrefabCollection<BuildingInfo>.GetLoaded(index); // skip prefabs without props if(prefab == null || prefab.m_props == null) continue; for (int propIndex = 0; propIndex < prefab.m_props.Length; propIndex++) { // get the prop item BuildingInfo.Prop propItem = prefab.m_props[propIndex]; // skip trees/undefined props etc. if (propItem.m_prop == null) continue; string propName = propItem.m_prop.name; // check if the prop name equals one of the banned props if (propName == "Billboard_big_variation" || propName == "Billboard_big_variation_01" || propName == "Billboard_big_variation_02" || propName == "Billboard_big_variation_04" || propName == "neon-yakisoba-noodles" || propName == "neon-burned-bean-coffee" || propName == "neon-morellos") { // set the probability to zero to hide the props propItem.m_probability = 0; } } } } The continue keyword is a control statement of the for loop. It skips the execution of the current iteration and moves along to the next iteration of the loop. Tip: Instead of using the equals operator (==), you can use the Contains method to detect all prop names containing a certain string: if (propName.Contains("Billboard_big") || propName.Contains("neon-")) { propItem.m_probability = 0; } The result (before-after): You can see that the mod removes the billboards from all buildings. We reached our goal! Happy Coding! Tip: You can also remove trees with the same technique: if (propItem.m_tree == null) continue; string treeName = propItem.m_tree.name; Tip: You can limit the replacement to buildings with a certain name, or buildings of certain zone type: for(uint index = 0; index < PrefabCollection<BuildingInfo>.LoadedCount(); index++) { BuildingInfo prefab = PrefabCollection<BuildingInfo>.GetLoaded(index); if(prefab == null || prefab.m_props == null) continue; // filter by name if(!prefab.name.Contains("Blockhouse")) continue; // filter by building/service type if (prefab.m_class.m_service != ItemClass.Service.Industrial) continue; // ... } Next part:
  4. In this tutorial, we will replicate the functionality of the "Make Historical" checkbox in SimCity 4 (stop building from leveling up). The mod will utilize the same interfaces as the Control Building Level Up mod. You will learn how to inspect and modify user interfaces with ModTools, how the info panels of the game work, how to add a checkbox to the UI, how to control building level up with the official API, how to get notified when a building is added/removed and how to serialize custom data in the savegame. Once again, we will use the loading and threading hooks provided by the API. Step 1: Project Setup Create a new project named "MakeHistorical" in VS2017, following Method 2 in Tutorial 0 (working with a text editor is still possible in this tutorial, but not recommended) Your IUserMod implementation should look like this: using ICities; namespace MakeHistorical { public class MakeHistoricalMod : IUserMod { public string Name => "Make Historical"; public string Description => "Prevents the level up of buildings"; } } Step 2: Data Storage with Serialization Hook Data Structure We will store the ids (ushort) of the historical building instances in the savegame. Like in Tutorial 2 Step 4, we will create a data class that holds our data: using System.Collections.Generic; namespace MakeHistorical { public class MakeHistoricalData { public List<ushort> HistoricalBuildingIds { get; set; } = new List<ushort>(); } } The game requires additional savegame data to be in byte[] (byte array) format (basically zeros and ones, very low level). Luckily, Colossal Order provides a few useful tools to convert data classes to byte arrays (package ColossalFramework.IO). To use these tools, our data class must implement the IDataContainer interface. Extend the class like this: using System.Collections.Generic; using System.Linq; using ColossalFramework.IO; namespace MakeHistorical { public class MakeHistoricalData : IDataContainer { // The key for our data in the savegame public const string DataId = "MakeHistorical"; // Version of data save format // This is important when you add new fields to MakeHistoricalData public const int DataVersion = 0; public List<ushort> HistoricalBuildingIds { get; set; } = new List<ushort>(); // This serializes the object (to bytes) public void Serialize(DataSerializer s) { // convert ushort list to int array int[] ids = HistoricalBuildingIds.Select(id => (int)id).ToArray(); s.WriteInt32Array(ids); } // This reads the object (from bytes) public void Deserialize(DataSerializer s) { int[] ids = s.ReadInt32Array(); // convert int array to ushort list HistoricalBuildingIds = ids.Select(id => (ushort)id).ToList(); } // Validates that all building ids are active public void AfterDeserialize(DataSerializer s) { if (!BuildingManager.exists) return; List<ushort> validatedBuildingIds = new List<ushort>(); Building[] buildingInstances = BuildingManager.instance.m_buildings.m_buffer; // itertate through all building ids, filter active ids foreach (ushort buildingId in HistoricalBuildingIds) { if (buildingInstances[buildingId].m_flags != Building.Flags.None) { validatedBuildingIds.Add(buildingId); } } HistoricalBuildingIds = validatedBuildingIds; } } } What happened? We added the constants DataId and DataVersion. We will use these in the next step We implemented the Serialize method: In this method, we convert our list of ushort numbers to an integer array (the serializer does not support ushort) and pass it to a DataSerializer, which converts our array to bytes. We implemented the Deserialize method, which does the opposite of Serialize We implemented AfterDeserialize, which validates that all deserialized building ids belong to buildings (important when the mod was disabled for some time, to keep the data clean) Serialization System Colossal Order provides a serialization hook for mods (ISerializableDataExtension/SerializableDataExtensionBase). This hook is invoked when the savegame data is loaded, and when the user presses the save button. The game also provides a storage interface (ISerializableData) that allows us to write byte arrays to savegame and read byte arrays from savegame. Combined with the data class and the byte array conversion tools provided by Colossal Order, we will use this hook to save our data. Add a new MakeHistoricalDataManager class: using ColossalFramework.IO; using ICities; using System.IO; using UnityEngine; namespace MakeHistorical { public class MakeHistoricalDataManager : SerializableDataExtensionBase { // The data object of our mod private MakeHistoricalData _data; public override void OnLoadData() { // Get bytes from savegame byte[] bytes = serializableDataManager.LoadData(MakeHistoricalData.DataId); if (bytes != null) { // Convert the bytes to MakeHistoricalData object using (var stream = new MemoryStream(bytes)) { _data = DataSerializer.Deserialize<MakeHistoricalData>(stream, DataSerializer.Mode.Memory); } Debug.LogFormat("Data loaded (Size in bytes: {0})", bytes.Length); } else { _data = new MakeHistoricalData(); Debug.Log("Data created"); } } public override void OnSaveData() { byte[] bytes; // Convert the MakeHistoricalData object to bytes using (var stream = new MemoryStream()) { DataSerializer.Serialize(stream, DataSerializer.Mode.Memory, MakeHistoricalData.DataVersion, _data); bytes = stream.ToArray(); } // Save bytes in savegame serializableDataManager.SaveData(MakeHistoricalData.DataId, bytes); Debug.LogFormat("Data saved (Size in bytes: {0})", bytes.Length); } } } What happens here? The _data property stores our mod data The OnLoadData method attempts to read the saved byte array from the savegame. If the array was found, it converts the bytes to a MakeHistoricalData object (our data structure). If no array was found, it creates a new MakeHistoricalData object (new city or mod enabled for the first time). The OnSaveData method converts the MakeHistoricalData object to bytes, then saves the bytes in the savegame. Tip: To understand how data versioning works, look at this example data manager. Singleton To make the data readable from other classes, we will make MakeHistoricalDataManager implement a simple singleton pattern. We willl also add a few methods to lookup, add and remove building ids: // Singleton getter public static MakeHistoricalDataManager Instance { get; private set; } public bool IsHistorical(ushort buildingId) { return _data.HistoricalBuildingIds.Contains(buildingId); } public void AddBuildingId(ushort buildingId) { if (_data.HistoricalBuildingIds.Contains(buildingId)) return; _data.HistoricalBuildingIds.Add(buildingId); Debug.Log($"Historical Building {buildingId} added"); } public void RemoveBuildingId(ushort buildingId) { if (!_data.HistoricalBuildingIds.Contains(buildingId)) return; _data.HistoricalBuildingIds.Remove(buildingId); Debug.Log($"Historical Building {buildingId} removed"); } public override void OnCreated(ISerializableData serializedData) { base.OnCreated(serializedData); Instance = this; // initialize singleton } public override void OnReleased() { Instance = null; // reset singleton } Now we can use a simple statement to check if a building is historical: bool h = MakeHistoricalDataManager.Instance.IsHistorical(1234); Final code of the MakeHistoricalDataManager class. Step 3: Removing destroyed buildings from the list We have to remove buildings from the list when they are buldozed. Luckily CO added a hook just for that (not documented in the wiki): using ICities; using UnityEngine; namespace MakeHistorical { public class MakeHistoricalBuildingMonitor : BuildingExtensionBase { public override void OnBuildingReleased(ushort id) { if (MakeHistoricalDataManager.Instance.IsHistorical(id)) { // Remove demolished/destroyed buildings from the list of historical buildings MakeHistoricalDataManager.Instance.RemoveBuildingId(id); } } } } Tip: With the IBuildingExtension/BuildingExtensionBase hook, you can also manipulate which buildings are spawned, and there are hooks for building creation and relocation. Step 4: Inspecting And Manipulating User Interfaces with ModTools and ILSpy Like in SimCity 4, we will add a "Make Historical" checkbox to the building info window: To do that, we have to find out how to access the info window programmatically. ModTools supports us with its "debug view". You can toggle it with CTRL + R. Then move your mouse over the info panel (so that the tint of the panel changes to green) and press CTRL + F: The UI window component is now displayed in the ModTools scene explorer. The class name of the element is ZonedBuildingWorldInfoPanel. In the scene explorer, we can change properties like the colour, size and position of the window. We can also look at the child UI elements (buttons, text labels). The position of the child elements is determined by the relativeLayout property. Noted values: Height: 321 Left Padding: 14 (based on the child element positions) Bottom Padding: 27 (based on the child element positions) Now that we know the class name, we can locate the class in ILSpy to find out how to access it programmatically: ZonedBuildingWorldInfoPanel is a subclass of WorldInfoPanel, which contains a static Show<>() method: // WorldInfoPanel (taken from ILSpy) public static void Show<TPanel>(Vector3 worldMousePosition, InstanceID instanceID) where TPanel : WorldInfoPanel { TPanel tPanel = UIView.library.Show<TPanel>(typeof(TPanel).Name, false); tPanel.SetTarget(worldMousePosition, instanceID); tPanel.component.opacity = 1f; } After further investigation (use ILSpy's "Analyze" feature), you will find a Get<>() method in UIView.library which returns the ZonedBuildingWorldInfoPanel instance: var panel = UIView.library.Get<ZonedBuildingWorldInfoPanel>(typeof(ZonedBuildingWorldInfoPanel).Name); Note: There is only one panel instance, which is just filled with the data of the currently selected building. The panel even exists when no building is selected, it's just hidden. Step 5: Adding a Checkbox to the Info Panel Finding the right property values for user interfaces is a finicky task, especially when you have to restart the game after every little change. Using the ModTools console, we can add and modify our checkbox while the game is running. Run this script in the ModTools console (F7): var panel = UIView.library.Get<ZonedBuildingWorldInfoPanel>(typeof(ZonedBuildingWorldInfoPanel).Name); var checkBox = panel.component.AddUIComponent<UICheckBox>(); checkBox.width = panel.component.width; checkBox.height = 20f; checkBox.clipChildren = true; UISprite sprite = checkBox.AddUIComponent<UISprite>(); sprite.spriteName = "ToggleBase"; sprite.size = new Vector2(16f, 16f); sprite.relativePosition = Vector3.zero; checkBox.checkedBoxObject = sprite.AddUIComponent<UISprite>(); ((UISprite)checkBox.checkedBoxObject).spriteName = "ToggleBaseFocused"; checkBox.checkedBoxObject.size = new Vector2(16f, 16f); checkBox.checkedBoxObject.relativePosition = Vector3.zero; checkBox.label = checkBox.AddUIComponent<UILabel>(); checkBox.label.text = " "; checkBox.label.textScale = 0.9f; checkBox.label.relativePosition = new Vector3(22f, 2f); checkBox.name = "MakeHistorical"; checkBox.text = "Make Historical"; This will add everything that is required for a checkbox, giving it the name "MakeHistorical". It is still in the wrong position: Tip: SamsamTS created a very useful utility class that allows you to create various UI elements. The code above was copied from that class. With ModTools, we can experiment with the position without restarting the game. Execute this code in the ModTools console: var panel = UIView.library.Get<ZonedBuildingWorldInfoPanel>(typeof(ZonedBuildingWorldInfoPanel).Name); var checkBox = panel.component.Find<UICheckBox>("MakeHistorical"); checkBox.relativePosition = new Vector3(14f, 164f + 130f + 5f); Result: Now we just have to increase the height of the window a little bit. Execute this code in the ModTools console: var panel = UIView.library.Get<ZonedBuildingWorldInfoPanel>(typeof(ZonedBuildingWorldInfoPanel).Name); panel.component.height = 321f + 5f + 20f; Result: Now, we will put the code we just executed with the console into the loading hook of our mod: using ColossalFramework.UI; using ICities; using UnityEngine; namespace MakeHistorical { public class MakeHistoricalLoading : LoadingExtensionBase { private UICheckBox _makeHistoricalCheckBox; public override void OnLevelLoaded(LoadMode mode) { if (_makeHistoricalCheckBox != null) return; ZonedBuildingWorldInfoPanel panel = UIView.library.Get<ZonedBuildingWorldInfoPanel>(typeof(ZonedBuildingWorldInfoPanel).Name); UICheckBox checkBox = panel.component.AddUIComponent<UICheckBox>(); checkBox.width = panel.component.width; checkBox.height = 20f; checkBox.clipChildren = true; UISprite sprite = checkBox.AddUIComponent<UISprite>(); sprite.spriteName = "ToggleBase"; sprite.size = new Vector2(16f, 16f); sprite.relativePosition = Vector3.zero; checkBox.checkedBoxObject = sprite.AddUIComponent<UISprite>(); ((UISprite)checkBox.checkedBoxObject).spriteName = "ToggleBaseFocused"; checkBox.checkedBoxObject.size = new Vector2(16f, 16f); checkBox.checkedBoxObject.relativePosition = Vector3.zero; checkBox.label = checkBox.AddUIComponent<UILabel>(); checkBox.label.text = " "; checkBox.label.textScale = 0.9f; checkBox.label.relativePosition = new Vector3(22f, 2f); checkBox.name = "MakeHistorical"; checkBox.text = "Make Historical"; checkBox.relativePosition = new Vector3(14f, 164f + 130f + 5f); panel.component.height = 321f + 5f + 16f; _makeHistoricalCheckBox = checkBox; } } } Compile the mod (F6). If there are any compilation errors, use the error list in VS2017 to locate and fix the error (View > Error List) When the compilation was successful, run the game. Enable the mod in content manager (if your mod does not show up, you probably forgot to setup the post build script). Now create or load a city, open the building info window for a growable building. Et voila: Step 6: Processing Checkbox Events To process checkbox events, we will add a delegate to the CheckedChange event: public override void OnLevelLoaded(LoadMode mode) { ... checkBox.eventCheckChanged += (component, check) => { ushort buildingId = WorldInfoPanel.GetCurrentInstanceID().Building; if (check) { MakeHistoricalDataManager.Instance.AddBuildingId(buildingId); } else { MakeHistoricalDataManager.Instance.RemoveBuildingId(buildingId); } }; } Clicking the checkbox now triggers the data manager: Step 7: Monitoring the ZonedBuildingWorldInfoPanel with a Threading Hook There is another problem: The checkbox is not updated when you select a building. We will use a threading hook to update the checkbox: using ColossalFramework.UI; using ICities; namespace MakeHistorical { public class MakeHistoricalPanelMonitor : ThreadingExtensionBase { private ZonedBuildingWorldInfoPanel _panel; private UICheckBox _makeHistoricalCheckBox; private ushort _lastBuildingId = 0; // called every frame public override void OnUpdate(float realTimeDelta, float simulationTimeDelta) { if (!FindComponents()) return; if (_panel.component.isVisible) { ushort buildingId = WorldInfoPanel.GetCurrentInstanceID().Building; if (_lastBuildingId != buildingId) { // display the right checkbox state _makeHistoricalCheckBox.isChecked = MakeHistoricalDataManager.Instance.IsHistorical(buildingId); _lastBuildingId = buildingId; } } else { _lastBuildingId = 0; } } private bool FindComponents() { if (_panel != null && _makeHistoricalCheckBox != null) return true; _panel = UIView.library.Get<ZonedBuildingWorldInfoPanel>(typeof(ZonedBuildingWorldInfoPanel).Name); if (_panel == null) return false; _makeHistoricalCheckBox = _panel.component.Find<UICheckBox>("MakeHistorical"); return _makeHistoricalCheckBox != null; } } } Step 8: Controlling Building Level Up It took quite some time to get to this point (UI and serialization are always very time consuming). The last missing piece is the ILevelUpExtension/LevelUpExtensionBase hook, which monitors and manipulates the level up behaviour of buildings. Probably the least complicated part of the mod: using ICities; namespace MakeHistorical { public class MakeHistoricalLevelUpMonitor : LevelUpExtensionBase { public override ResidentialLevelUp OnCalculateResidentialLevelUp(ResidentialLevelUp levelUp, int averageEducation, int landValue, ushort buildingID, Service service, SubService subService, Level currentLevel) { if (MakeHistoricalDataManager.Instance.IsHistorical(buildingID)) { levelUp.targetLevel = currentLevel; } return levelUp; } public override CommercialLevelUp OnCalculateCommercialLevelUp(CommercialLevelUp levelUp, int averageWealth, int landValue, ushort buildingID, Service service, SubService subService, Level currentLevel) { if (MakeHistoricalDataManager.Instance.IsHistorical(buildingID)) { levelUp.targetLevel = currentLevel; } return levelUp; } public override IndustrialLevelUp OnCalculateIndustrialLevelUp(IndustrialLevelUp levelUp, int averageEducation, int serviceScore, ushort buildingID, Service service, SubService subService, Level currentLevel) { if (MakeHistoricalDataManager.Instance.IsHistorical(buildingID)) { levelUp.targetLevel = currentLevel; } return levelUp; } public override OfficeLevelUp OnCalculateOfficeLevelUp(OfficeLevelUp levelUp, int averageEducation, int serviceScore, ushort buildingID, Service service, SubService subService, Level currentLevel) { if (MakeHistoricalDataManager.Instance.IsHistorical(buildingID)) { levelUp.targetLevel = currentLevel; } return levelUp; } } } The logic is very simple: When the building is historical, the target level is set to the current building level. And we are done! Buildings with the "Make Historical" checkbox enabled will no longer level up. The list of historical buildings is stored in the savegame. Happy Coding! Download Source
  5. In this tutorial, we will create a basic mod in two different ways: With a simple text editor, and with the Visual Studio IDE. Cities: Skylines uses the Unity Engine, which is based on Mono, an open source implementation of the .NET framework that runs on Windows, Mac and Linux. That means the same code can be used on all of these platforms. The .NET framework is comparable to Java. It's basically a set of libraries and a virtual machine that runs your .NET applications. C# is the most common programming language that can be used to create .NET applications and libraries. It's very similar to Java (just better!). After writing your mod in C#, you have to compile it to create machine readable code. Cities: Skylines comes with an integrated compiler. It works like this: [.cs files containing raw C# code] → [COMPILER] → [compiled .dll file] The .dll file is your compiled mod (what you usually download from the Workshop). Alternatively, your can use an external compiler like the one provided by Visual Studio (see Method 2). Method 1: Using Notepad, let the game compile First we will create a mod with the tools provided by the game. The game searches for mod source folders in the directory C:\Users\<YourName>\AppData\Local\Colossal Order\Cities_Skylines\Addons\Mods. In this folder, create a new directory named "FirstMod". Inside of the new directory, create another folder named "Source". That's the directory for the .cs files Open Notepad (or your favourite text editor) and enter this code: // Makes UnityEngine and Cities: Skylines API classes available for use using ICities; using UnityEngine; // the namespace makes the names of your classes unique. // Naming: You can just use the name of your mod, it doesn't really matter. Spaces are not allowed. namespace Tutorial { // This defines a class that implements IUserMod. // The class defines the name and description displayed in the content manager. // The game searches for these classes. Every working mod must contain one class implementing IUserMod. // Naming: Just append "Mod" to the name of your mod, like "NetworkSkins" -> "NetworkSkinsMod". Spaces are not allowed. public class MyFirstMod : IUserMod { // this defines the title of your mod displayed in content manager public string Name { get { return "My First Mod"; } } // this defines the description of your mod displayed in content manager public string Description { get { return "Hello World, this is my first mod!"; } } } } (Lines starting with "//" are comments. You can add your own or remove them without affecting anything.) Save the file in the "Source" directory. Name it FirstMod.cs (in the file type dropdown, select "All Files"). Now just start your game. The game compiles your mod on start up. You will find it in the content manager: You will also notice a new .dll file in your mod directory. That's your compiled mod: So far we didn't add functionality to the mod. It only spawns the item in content manager. The big problem of Notepad and the game compiler is that it is hard to find errors in your code. You will have to restart your game many times. That's where Visual Studio comes into play... Method 2: Using Visual Studio (recommended) Visual Studio is a specialized IDE for C#/.NET development. It helps you to find errors in your code, and it autocompletes code statements for you, and it compiles your mod much faster than the game. It is also a requirement for advanced modding techniques like detours. The following tutorials will be based on Visual Studio. First of all, download and install Visual Studio Community 2017 for free. Make sure that the .NET desktop development feature is checked. Also enable the individual component .NET Framework 3.5 development tools. Step 1: Project Setup Create a new project in VS2017: Select File > New > Project On the left, select Templates > Visual C# > Windows Classic Desktop Select "Class Library (.NET Framework)" In the top, select ".NET Framework 3.5" in the dropdown menu (Important!) In the bottom, enter "SecondMod" as the name and solution name. and choose a location for your project files (e.g. your desktop) Press OK Visual Studio will create a project that looks like this: On the right, you can see the Solution Explorer with a list of .cs files. Visual Studio created a file named Class1.cs to get us started. If you want, you can rename the .cs file to match your mod name (Right click in solution explorer > Rename). Step 2: Dependencies Before we continue, we have to set up two things in the project. You always have to do it when you create a new mod project: First, we will add the modding API (ICities), UnityEngine, ColossalFramework and the game assembly (Assembly-CSharp) as dependencies. In the solution explorer, right click the "References" item and select "Add reference..."). Now use the "Browse..." button in the bottom to select the following .dll files. The files are located in the folder: Steam\steamapps\common\Cities_Skylines\Cities_Data\Managed Step 3: Post Build Script Secondly, we will add a so-called post build script: It automatically puts the compiled dll file into the C:SL mod directory when you compile with Visual Studio: Right-click your project in the Solution Explorer and choose Properties Select Build Events on the left hand side of the property sheet Paste the following in the Post-build event command line: mkdir "%LOCALAPPDATA%\Colossal Order\Cities_Skylines\Addons\Mods\$(SolutionName)" del "%LOCALAPPDATA%\Colossal Order\Cities_Skylines\Addons\Mods\$(SolutionName)\$(TargetFileName)" xcopy /y "$(TargetPath)" "%LOCALAPPDATA%\Colossal Order\Cities_Skylines\Addons\Mods\$(SolutionName)" Step 4: Writing the Mod Now we are finally ready for the creation of the actual mod. Replace the contents of Class1.cs with this code: using ICities; using UnityEngine; namespace Tutorial { public class MySecondMod : IUserMod { public string Name { get { return "My Second Mod"; } } public string Description { get { return "I made this with VS2017"; } } } } Step 5: Compilation Press F6 (or Build > Build Solution) to compile the mod. The mod should appear in your mod directory. Now start the game and enjoy the listing of your useless mod in content manager Happy Coding! Next part:
  6. Tutorial : create a road

    Hello everybody, Today I post a video tutorial on the roads. often compliment me about my road (MMP) and ask how to do it well. I hope that it will meet the expectations of some people. I wish you a good viewing! See you soon for future new updates will happen soon! Rock : STEX - Murimk MMP Rocks - Pack 1 Road : LEX - RRP Draggable Paths ChrisAdamas3997 STEX - FrankU Heblem Sand addon STEX - VIP Carpack vol1 STEX - VIP Carpack vol2 STEX - VIP Carpack vol3 Vegetation : LEX - RRP Pasture Flora LEX - BSC - VIP girafe ashes LEX - BSC - VIP girafe bushes LEX - BSC - VIP girafe chestnuts LEX - BSC - VIP girafe feather grass LEX - BSC - VIP girafe lupins LEX - BSC - VIP girafe maples v2 LEX - BSC - VIP girafe narcissus LEX - BSC - VIP girafe norway maples LEX - BSC - VIP girafe oaks Various : LEX - Les Murets de l'Aubrac Orange TSC STEX - Bikes STEX - Nams 48people MMP STEX - VIP AubracWallMMP STEX - VIP RuralPack Thank you! Excuse me. I put the links of all MMPs used in this video. Thank you! Thank you! What is ASAP? Thank you for your comment! The speed of the video is x2.05. So I had about 20 minutes IRL to create this scene. Thank you Silur! Thank you for your nice comment! It takes a little practice at first to build straight roads. But one learns quickly! Thank you TekindusT! Thank you for your comment! Anything is possible with SC4! We learn new things every day, me too! Thank you. MMP routes have advantages, but also disadvantages. Everything depends on the context of their use. Thank you from the comment, I am glad that this is useful.
  7. This is just a mini tutorial showing industrial freight preferences for how it chooses to ship its goods out of town. The main principle is that they want the quickest route to the neighborhood connection. (I tried to explain this in chat, but I feel I wasn't able to convey my idea very well.) In the following picture the key elements are: The industries in the upper left are zoned so their street access is to the north which means the rear of the buildings are to the south and adjacent to the rail line. The truck traffic for the farms north of the rail line passes by a rail station before it connects to the road. The industry and farms south of the east/west road are farther from the train station and therefore do not use it. The main thing is that in order to convince them to use the freight station, it must appear to them as the quickest route. They will not drive a wee bit further to get to it if there is a neighborhood road connection in their sight. In this next picture, I'm showing how the industry is zoned so the rear of their buildings are adjacent to the rail line. When that is the case they will just toss the freight directly onto a train. No train station is needed. I made the industrial zones face the direction I wanted by holding the Ctrl Key and then drawing the zone starting at the street and then dragging away from it. I hope this clarifies what I was saying in chat. Edit: This was created to illustrate a principle. It is NOT a recommendation for how to deal with slopes.
  8. In this tutorial, we will create a simple mod that globally replaces vanilla road trees with custom trees made by MrMaison. Like in Tutorial 1, we will use a loading hook, prefab collections and the ModTools scene explorer. You will also learn how to add settings to your mod. Step 1: Exploring and modifying network and tree prefabs with the ModTools scene explorer Before writing the actual mod, we will apply the replacement with the ModTools scene explorer. Just like buildings, networks and trees are defined as prefabs (NetInfo and TreeInfo, see Tutorial 1 Step 3). There are various way to find these prefabs in the ModTools scene explorer. The easiest way that works for vanilla and workshop assets is the ToolsController. "Tools" in Cities: Skylines allow you to interact with the game world. The most obvious tool is the bulldozer, but there are also tools for the placement of objects, zoning, transport line creation and camera control. For this tutorial, we will access the TreeTool and the NetTool, which hold a reference to the tree/network prefab you are placing. Select a tree you in the Landscaping panel. I chose the Royal Palm made by MrMaison. While the placement mode is enabled, open the ModTools scene explorer (CTRL + E). On the left, select Tool Controller > TreeTool. You will see the properties of the TreeTool on the right. The currently selected tree prefab is stored in the m_prefab property. Press the "Copy" button to copy the reference of the tree prefab to the ModTools clipboard (it does not copy the actual data, just the memory address of the prefab). Tip: For every prefab (prop, building, network, ...) there is also a "Preview" button that displays a model viewer, and more importantly, a "Plop" button that allows you to plop the asset. With this button, you can place assets which are not available in the panels of the game, like props or sub-buildings. Now, select a road with trees in the Roads panel. I chose the "Large Avenue with Grass" that was added by the MT update. Open the scene explorer and select Tool Controller > NetTool. On the right, expand the m_prefab property (the currently selected network prefab). You can now see the properties of the network prefab. The structure of a network prefab looks like this: NetInfo: Network Prefab ├ m_nodes[]: Array of objects defining meshes/textures for intersections ├ m_segments[]: Array of objects defining meshes/textures for segments ├ m_lanes[]: Array of NetInfo.Lane objects │ └ NetInfo.Lane: Defines a lane used by vehicles or pedestrians + prop/tree decoration │ ├ m_laneProps │ │ └ m_props[]: Array of prop items │ │ └ NetLaneProps.Prop: Like BuildingInfo.Prop, defines the position a prop/tree │ │ ├ m_prop/m_finalProp: The prop prefab │ │ ├ m_tree/m_finalTree: The tree prefab │ │ ├ m_probability: Probability that the prop/tree spawns │ │ ├ m_repeatDistance: Distance between two props/trees │ │ └ ... │ └ ... └ ... Expand the m_lanes array and search for the lane that contains the tree prop items you want to replace. In case of the "Large Avenue with Grass", navigate to m_lanes > m_lanes.[0] > m_laneProps > m_props > m_props.[4]: Click the "Paste" button on the right for the properties m_finalTree and m_tree. This will assign the custom tree prefab we copied earlier to the prop item: You will instantly see the result: The trees of all avenues in the city have been replaced. In the next steps, we will create a mod that automates the replacement. Step 2: Project Setup Create a new project named "RoadTreeReplacer" in VS2017, following Method 2 in Tutorial 0 (working with a text editor is still possible in this tutorial, but not recommended) Your IUserMod implementation should look like this: using ICities; namespace RoadTreeReplacer { public class RoadTreeReplacerMod : IUserMod { public string Name => "Road Tree Replacer"; public string Description => "Replaces the boring Oak roadside trees with MrMaison's creations"; } } Step 3: Loading Hook & Tree Replacement Logic Create a new file called RoadTreeReplacerLoading.cs in the Solution Explorer. This file will contain our ILoadingExtension implementation that is invoked by the game when a save is loaded (See Tutorial 1 Step 2). Like in the last tutorial, we will use the static PrefabCollection class to find our network and tree prefab. Add the following contents to the file: using UnityEngine; using ICities; namespace RoadTreeReplacer { public class RoadTreeReplacerLoading : LoadingExtensionBase { public override void OnLevelLoaded(LoadMode mode) { // Find the network NetInfo netPrefab = PrefabCollection<NetInfo>.FindLoaded("Avenue Large With Grass"); // Find the tree we want to use as a replacement TreeInfo treePrefab = PrefabCollection<TreeInfo>.FindLoaded("909448182.Royal Palm_Data"); // Check if both prefabs are loaded, cancel if not if (netPrefab == null) { Debug.LogError("RTR: The network could not be found"); return; } if (treePrefab == null) { Debug.LogError("RTR: The replacement tree could not be found"); return; } // cancel if lanes array is null (networks without lanes) if (netPrefab.m_lanes == null) return; // iterate through all lanes foreach (NetInfo.Lane lane in netPrefab.m_lanes) { // cancel if lane props array is null (networks without lanes) if (lane?.m_laneProps?.m_props == null) continue; // iterate through all lane props of that lane foreach (NetLaneProps.Prop laneProp in lane.m_laneProps.m_props) { if (laneProp == null) continue; // if the tree/finalTree field is set, replace it with our tree prefab if (laneProp.m_tree != null) { laneProp.m_tree = treePrefab; } if (laneProp.m_finalTree != null) { laneProp.m_finalTree = treePrefab; } } } Debug.Log("RTR: Replacement successful!"); } } } Tip: You can use the Debug.Log(...) method to add log entries to the output_log.txt. The log entries are also displayed in the ModTools console, which can be used for debugging your mod. Now compile the mod (F6). If there are any compilation errors, use the error list in VS2017 to locate and fix the error (View > Error List) When the compilation was successful, run the game. Enable the mod in content manager (if your mod does not show up, you probably forgot to setup the post build script). Now create or load a city. The tree replacement is now automated. You will also see the success message in the ModTools console: Before we proceed with the next step, we will move our replacement code to a separate ReplaceNetTrees method. We can call this method multiple times with a single line of code: using UnityEngine; using ICities; namespace RoadTreeReplacer { public class RoadTreeReplacerLoading : LoadingExtensionBase { public override void OnLevelLoaded(LoadMode mode) { ReplaceNetTrees("Avenue Large With Grass", "909448182.Royal Palm_Data"); ReplaceNetTrees("Medium Road Decoration Trees", "909448182.Royal Palm_Data"); } private void ReplaceNetTrees(string netName, string treeName) { NetInfo netPrefab = PrefabCollection<NetInfo>.FindLoaded(netName); TreeInfo treePrefab = PrefabCollection<TreeInfo>.FindLoaded(treeName); if (netPrefab == null) { Debug.LogError($"RTR: The network {netName} could not be found"); return; } if (treePrefab == null) { Debug.LogError($"RTR: The replacement tree {treeName} could not be found"); return; } if (netPrefab.m_lanes == null) return; foreach (NetInfo.Lane lane in netPrefab.m_lanes) { if (lane?.m_laneProps?.m_props == null) continue; foreach (NetLaneProps.Prop laneProp in lane.m_laneProps.m_props) { if (laneProp == null) continue; if (laneProp.m_tree != null) laneProp.m_tree = treePrefab; if (laneProp.m_finalTree != null) laneProp.m_finalTree = treePrefab; } } Debug.Log($"RTR: Replacement of tree in network {netName} successful!"); } } } Step 4: Adding Mod Settings Right now the functionality of the mod is fixed, there is no way to configure which trees are replaced. Adding settings to a mod is a difficult task. It will require 3 components: User interface with checkboxes or dropdown menus (using the settings API provided by CO, or a custom window) Data structure for the settings data (usually a C# class, or a set of key-value pairs) Serialization System (to .xml file, or save game) To keep it simple, we will only add a simple settings page with 3 dropdown options (Small Road Tree, Medium Road Tree, Large Road Tree), with a fixed number of trees to choose from (Default, Royal Palm, Weeping Silver Birch, River Red Gum Small). The settings will saved in a .xml file in the Cities: Skylines installation directory. The settings are global, that means the mod applies the same settings to all cities (in one of the next tutorials, I will show you how to save additional data in the save game). Serialization System Add a new file called Configuration.cs and paste this code. It is a very minimalistic serialization library that I've written some time ago. It does all the heavy lifting for you (loading and saving of .xml files, transformation from/to C# objects). It is not important to understand what happens internally, you just have to understand how to use it. The library provides a method to load your configuration data: YourConfiguration config = Configuration<YourConfiguration>.Load(); And to save it: Configuration<YourConfiguration>.Save(); You only have to provide the data class that defines the structure of the .xml file. Data Structure Add a new class named RoadTreeReplacerConfiguration. This data class contains the string options we want to save: namespace RoadTreeReplacer { [ConfigurationPath("RoadTreeReplacer.xml")] public class RoadTreeReplacerConfiguration { public string SmallRoadTree { get; set; } = "909448182.Royal Palm_Data"; public string MediumRoadTree { get; set; } = "909448182.Royal Palm_Data"; public string LargeRoadTree { get; set; } = "909448182.Royal Palm_Data"; } } The [ConfigurationPath] attribute is read by the serialization library. The strings on the right are the default values used when a new configuration is created. User Interface Some time ago, CO added a simple settings API that allows you to create simple setting menus with a few lines of code. To use it, add a new method called OnSettingsUI to your IUserMod implementation: using System; using System.Collections.Generic; using ICities; namespace RoadTreeReplacer { public class RoadTreeReplacerMod : IUserMod { public string Name => "Road Tree Replacer"; public string Description => "Replaces the boring Oak roadside trees with MrMaison's creations"; // The strings displayed in the dropdown private static readonly string[] OptionLabels = { "Default", "Royal Palm", "Weeping Silver Birch", "River Red Gum" }; // The corresponding prefab names private static readonly string[] OptionValues = { "Tree2Variant", "909448182.Royal Palm_Data", "765126845.Weeping Silver Birch_Data", "742114726.River Red Gum small_Data" }; // Sets up a settings user interface public void OnSettingsUI(UIHelperBase helper) { // Load the configuration RoadTreeReplacerConfiguration config = Configuration<RoadTreeReplacerConfiguration>.Load(); // Small Roads int smallSelectedIndex = GetSelectedOptionIndex(config.SmallRoadTree); helper.AddDropdown("Small Road Tree", OptionLabels, smallSelectedIndex, sel => { // Change config value and save config config.SmallRoadTree = OptionValues[sel]; Configuration<RoadTreeReplacerConfiguration>.Save(); }); // Medium Roads int mediumSelectedIndex = GetSelectedOptionIndex(config.MediumRoadTree); helper.AddDropdown("Medium Road Tree", OptionLabels, mediumSelectedIndex, sel => { // Change config value and save config config.MediumRoadTree = OptionValues[sel]; Configuration<RoadTreeReplacerConfiguration>.Save(); }); // Large Roads int largeSelectedIndex = GetSelectedOptionIndex(config.LargeRoadTree); helper.AddDropdown("Large Road Tree", OptionLabels, largeSelectedIndex, sel => { // Change config value and save config config.LargeRoadTree = OptionValues[sel]; Configuration<RoadTreeReplacerConfiguration>.Save(); }); } // Returns the index number of the option that is currently selected private int GetSelectedOptionIndex(string value) { int index = Array.IndexOf(OptionValues, value); if (index < 0) index = 0; return index; } } } What happens here? Load the config data with the Load method provided by the library Get the index of the dropdown option that should be selected at first Add a dropdown option with label, options, selected index and a callback (called when selection is changed) (Repeat 2. and 3. for medium and large roads) The OptionLabels array contains the strings displayed in the dropdown menus. The other array, OptionValues, contains the internal names of the prefabs. The callback is a lamda function that takes the selected index (0-3). It saves the value that corresponds to the selected index in the configuration file. The game automatically creates a settings page for mods which are implementing the OnSettingsUI method. No further steps are needed. Tip: Other methods for UI element generation: AddButton(), AddCheckbox(), AddGroup(), AddSlider(), AddSpace(), AddTextfield() Step 5: Using the configuration values in our loading hook In the RoadTreeReplacerLoading class, replace the OnLevelLoaded method: public override void OnLevelLoaded(LoadMode mode) { // Load the configuration RoadTreeReplacerConfiguration config = Configuration<RoadTreeReplacerConfiguration>.Load(); ReplaceNetTrees("Basic Road Decoration Trees", config.SmallRoadTree); ReplaceNetTrees("Oneway Road Decoration Trees", config.SmallRoadTree); ReplaceNetTrees("Medium Road Decoration Trees", config.MediumRoadTree); ReplaceNetTrees("Avenue Large With Grass", config.MediumRoadTree); ReplaceNetTrees("Avenue Large With Buslanes Grass", config.MediumRoadTree); ReplaceNetTrees("Large Road Decoration Trees", config.LargeRoadTree); ReplaceNetTrees("Large Oneway Decoration Trees", config.LargeRoadTree); } This will replace the trees of all vanilla roads with the trees selected in the settings. And we are done! After changing the options for the first time, the settings are saved to .xml: Note: To apply the changed settings, you have to reload your city. Happy Coding! Download Source Next part:
  9. Right now I only have little time, and I'm not able to write new mods. But I want to share my knowlege about Cities: Skylines mod development with you! Mod Development Tutorials
  10. Version 1.0.0

    85 Downloads

    Source Code of the Make Historical Mod Tutorial for Cities: Skylines. Created with Visual Studio 2017
  11. Hi. Decided to try and put together a youtube series which will follow the development of a pretty generic US city - probably somewhere on the mid/southern US east coast. If you're relatively new to the game and frustrated with the level of realism people here, on youtube and on reddit achieves, the series contain quite a few tips and my reasoning for different kinds of development strategies - as well as balancing between detailing and functionality. You'll not find me spend +10 minutes detailing a small area, instead i try to balance it out differently with just enough detailing to give a realistic vibe - but not enough detailing to let one single neighbourhood steal 10 fps from me In the first part i built the downtown core of the city; And in the second part i built a simple low income and crime ridden neighbourhood in close proximity to downtown;
  12. In this tutorial, we will replicate the functionality of the Show Limits mod. Like in Tutorial 1, we will use the default alert window to display the limits. You will learn how to use ILSpy for reverse engineering, how to access singleton manager objects, how to work with building/tree instances and how to listen to keyboard shortcuts. Step 1: Exploring the game source code in ILSpy Download the latest version of ILSpy (select "Download Binaries"). ILSpy is an open source decompiler that allows you to take a look at the source code of the game and other mods. It's basically the opposite of a compiler: [compiled .dll file] → [DECOMPILER] → [.cs files containing raw C# code] The restored source code is not exactly the same as the original code. Names of variables defined in methods are lost, which makes the code harder to read. Some parts of the loading code are not readable (enumerators), but that won't bother us. Open the Assembly-CSharp.dll file in ILSpy (C:\Program Files (x86)\Steam\steamapps\common\Cities_Skylines\Cities_Data\Managed). On the left, expand the source tree: The tree contains all classes and structs of the game. Select one of them to view the source code. There are different types of classes, here are the most common ones: ...Info: Prefabs or other assets (see Tutorial 1 and 2) Building, Citizen, District, NetLane, NetNode, NetSegment, PropInstance, TransportLine, TreeInstance, Vehicle, ZoneBlock (structs): Instances of objects, managed by a simulation system. There is a limit how many instances of a certain type can exist. ...AI: AI behaviour attached to prefabs, calculating the behavior of object instances. ...Manager: A simulation system, responsible for rendering, simulation and creation/deletion of instances ...Tool: Tool for interacting with the city ...Collection: A collection of prefabs or assets ...Properties: Properties for simulation systems, like colors, shaders and constants ...Panel: UI elements ...Wrapper: Implementation of the official modding API The various manager classes are the key components of the game. Managers extend the Singleton<> class. The singleton pattern is a software design pattern that ensures that only one instance of a class exists. You can easily access a singleton in Cities: Skylines with the static instance field: string cityName = SimulationManager.instance.m_metaData.m_CityName; Debug.Log("Name of the city: " + cityName); Alternatively: Singleton<SimulationManager>.instance Tip: You can run these code snippets with the ModTools console (F7) Today we will take a look at the TreeManager and BuildingManager to display the number of trees and buildings. Tree Manager Select the TreeManager in ILSpy. After scrolling down a few lines in the source code, you will find the constant MAX_TREE_COUNT and the integer field m_treeCount: Outputting these numbers will lead to the desired result. We will go a step further and check how the m_treeCount field is calculated. Right click the m_treeCount item in the left sidebar and select "Analyze": The panel at the bottom displays which methods are reading the field, and which methods are assigning values to the field. For example, the AssetEditorChirpPanel and EditorChirpPanel are reading the field to display the number of trees in the asset/map editor. The field is modified by 3 methods of the TreeManager: CreateTree: When a new tree instance is placed, increment the value by 1. ReleaseTreeImplementation: When a tree instance is deleted, decrement the value by 1 Data.AfterDeserialize: After a save game is loaded, recalculate the tree count The last method is particularly interesting. Double click it to view the source code of the method: The method calls TreeManager.instance.m_trees.ItemCount() to calculate the number of trees. m_trees is a special kind of array list (Array16<TreeInstance>) that is used by the game to manage instances of trees, props, buildings etc. The list contains a fixed number of TreeInstance structs (262144 in case of trees). When a new tree is created, one of the unused items from the listt is activated and used to describe the state, position and type of a tree. A few lines above you can see how the game iterates through the list to modify the active items. Tip: You can also use the "Analyze" feature on methods and classes. It will help you to understand how the different components of the game are connected. Building Manager Now, select the BuildingManager on the left. You will notice that the BuildingManager contains the same kind of fields: const int MAX_BUILDING_COUNT: The max number of building instances int m_buildingCount: The current number of building instances Array16<Building> m_buildings: The array list containing the building instances Step 2: Outputting the limits with ModTools Before writing our mod, we will create a ModTools script to see if everything works: int treeCount = TreeManager.instance.m_treeCount; int maxTreeCount = TreeManager.MAX_TREE_COUNT; Debug.Log("Number of trees: " + treeCount + " of " + maxTreeCount); int buildingCount = BuildingManager.instance.m_buildingCount; int maxBuildingCount = BuildingManager.MAX_BUILDING_COUNT; Debug.Log("Number of buildings: " + buildingCount + " of " + maxBuildingCount); Load or create a city and open the ModTools console (F7). In the bottom of the console, paste the script and press the "Run" button: Step 3: Project Setup Create a new project named "ShowLimits" in VS2017, following Method 2 in Tutorial 0 (working with a text editor is still possible in this tutorial, but not recommended) Your IUserMod implementation should look like this: using ICities; namespace ShowLimits { public class ShowLimitsMod : IUserMod { public string Name => "Show Limits"; public string Description => "Displays the number of buildings and trees in your city (Hotkey CTRL + I)"; } } Step 4: Threading Hook & Hotkeys The IThreadingExtension/ThreadingExtensionBase is another hook provided by the official modding API. Classes implementing IThreadingExtension are invoked before, during and after every simulation tick (many times per second). It is important that the contained code is very light-weight (no IO operations, like reading configuration files, no object construction...). We will use the hook to check if the player is pressing they keyboard shortcut (CTRL + I). Create a new class called ShowLimitsThreading: using ColossalFramework.UI; using ICities; using UnityEngine; namespace ShowLimits { public class ShowLimitsThreading : ThreadingExtensionBase { private bool _processed = false; public override void OnUpdate(float realTimeDelta, float simulationTimeDelta) { if ((Input.GetKey(KeyCode.LeftControl) || Input.GetKey(KeyCode.RightControl)) && Input.GetKey(KeyCode.I)) { // cancel if they key input was already processed in a previous frame if (_processed) return; _processed = true; // compose message int treeCount = TreeManager.instance.m_treeCount; int maxTreeCount = TreeManager.MAX_TREE_COUNT; int buildingCount = BuildingManager.instance.m_buildingCount; int maxBuildingCount = BuildingManager.MAX_BUILDING_COUNT; string message = $"Trees: {treeCount} of {maxTreeCount}\nBuildings: {buildingCount} of {maxBuildingCount}"; // display message ExceptionPanel panel = UIView.library.ShowModal<ExceptionPanel>("ExceptionPanel"); panel.SetMessage("Show Limits", message, false); } else { // not both keys pressed: Reset processed state _processed = false; } } } } Now compile the mod (F6). If there are any compilation errors, use the error list in VS2017 to locate and fix the error (View > Error List) When the compilation was successful, run the game. Enable the mod in content manager (if your mod does not show up, you probably forgot to setup the post build script). Now create or load a city. Press Ctrl + I: Happy Coding! Download Source Next Part:
  13. Version 1.0.0

    47 Downloads

    Source Code of the Show Limits Mod Tutorial for Cities: Skylines. Created with Visual Studio 2017
  14. Version 1.0.0

    69 Downloads

    Source Code of the Road Tree Replacer Mod Tutorial for Cities: Skylines. Created with Visual Studio 2017
  15. Hello Guys. In this Video I go through the stages of creating the most realistic, and functional mini Roundabout. Roundabout workshop Pack - http://steamcommunity.com/sharedfiles/filedetails/?id=918308844
  16. Tutorial : create a river 2

    Hello everyone, Tonight a short 13-minute video to show the construction of a river. I made this video because the previous one was too accelerated. There is nothing new, the video will seem just slower! Good viewing! Rock : STEX - Murimk MMP Rocks - Pack 1 STEX - Murimk MMP Rocks - Pack 2 STEX - Paeng's Free Waters STEX - Rock 'n' Stones Vegetation : LEX - BSC - VIP girafe berries LEX - BSC - VIP girafe bushes LEX - BSC - VIP girafe cattails LEX - BSC - VIP girafe chestnuts LEX - BSC - VIP girafe elms LEX - BSC - VIP girafe feather grass LEX - BSC - VIP girafe honey locust LEX - BSC - VIP girafe lupins LEX - BSC - VIP girafe norway maples LEX - BSC - VIP girafe narcissus LEX - BSC - VIP girafe rowan trees LEX - BSC - VIP girafe sparaxis LEX - RRP Pasture Flora STEX - Logging Set STEX - Aesculus MMPSeasonal flora STEX - VIP orange Fagus MMPSeasonal flora Water : STEX - RFR Plopwater Pack Various : STEX - FrankU Heblem Sand addon STEX - Nams 48people MMP STEX - RFR Deers and Wild Boars Thank you for your comment! The grass that I use is a personal mod Girafe manufactured for me, I talk to him can be shared. The titles of the tracks are available in al description of the video on YouTube! - 00:00 BrunuhVille - Winterwolf - 05:26 Jon Henrik Fjällgren - Jag Är Fri (Manne Leam Frijje) - 08:30 Omnia - I Don't Speak Human For trees is this mod: Logging Set , in the rocks are main these: Murimk MMP Rocks - Pack 1 , Murimk MMP Rocks - Pack 2 and Rock 'n' Stones . Thanks you Hellken! Thank you for your comment! ^^ Tkanks you CorinaMarie! Thank you very much, glad you like it! Here is the link if you want to download my Plugins folder: link removed You're welcome! All mods are in French, I translated everything, remade all the descriptions and all images of the lots. Everything is sorted by category. The folder 1.2. not translated yet and there is still a lot of new image. I will soon (that is why it is written "à faire" EN: "to do"). The NAM folder (3.1.) Is not touch in order to leave intact for the reading direction of folders inside of it. Folder 3.2. about the airport is not changed either. Because it contains a lot of items and they are never used much. The RCI areas (4.1. / 4.2. / 4.3. / 4.4.) Are sorted by type and wealth. Then the 5.1. and 5.2. files. are dependencies and mods that affect the gameplay. The lots that are modified are those that can "plopper". As for the police buildings, fire, schools, monuments, etc ... The other lots ("growable") are not changed. Warning: If you would like to use all my plugins folder as is, you must imperatively keep the order of numbering of file as they are (1.1 to 5.3.)! Sensitive files are 3.1. to 3.6. (Transport). Inside thereof they still have a multitude of mods (z_mod) sorted to size. For those who understand French, see also this page about my plugins: FR - ToutSimCities - My plugins (subject: R.C.D.) , If you do not understand French, the images will be easy enough to understand I think. If you have any questions about Plugins, please contact me by message. Good fun! I am happy to read your comment. SC4 is the master of city-builder, CS can not beat it, even if it is good. I can only encourage you to start SC4 and to a CJ! Thank you!
  17. Tutorial : Create a pond

    Hello everyone, For a moment I did not return to the forums because I had quite a lot to do. So to come back nicely I decided to make a video before continuing my Dahammas area. It is a video related to the creation of a pond, I hope you like it! Water : STEX - Paeng's Free Waters Rock : STEX - Murimk MMP Rocks - Pack 1 STEX - VIP RuralPack Vegetation : LEX - BSC - VIP girafe ashes LEX - BSC - VIP girafe bushes LEX - BSC - VIP girafe cattails LEX - BSC - VIP girafe chestnuts LEX - BSC - VIP girafe daisy LEX - BSC - VIP girafe elms LEX - BSC - VIP girafe feather grass LEX - BSC - VIP girafe lupins LEX - BSC - VIP girafe narcissus LEX - BSC - VIP girafe norway maples LEX - BSC - VIP girafe oaks LEX - BSC - VIP girafe poppies LEX - BSC - VIP girafe sparaxis LEX - RRP Pasture Flora Various : LEX - Mayor Mode Ploppable Livestock LEX - SFBT Craftsmen House by voltaic STEX - FrankU Heblem Sand addon STEX - Nams 48people MMP STEX - VIP AubracWallMMP It's a bit like a habit, and even if there's a mistake you have to keep going because the video is spinning and I can not do too much time. Despite that, we do not see it, but I sometimes have moments of hesitation during the video. Thank you for your comment! Thank you very much raynev1! Thank to you! Seeing elsewhere is always interesting even when one is able to do the same.
  18. Good morning gentlemen ! So many years without a post, you may think I had quit SC4 for good ! But in fact no, I'm still lurking around on the forums and city journals like a ghost... Anyway, I post today here as I just rediscovered a long conversation I had with our map guru Drunkapple (also known as Dobdriver) when I was trying various mapping techniques and discovering the joys of 16-bit mapping techniques. At the time this conversation begun, I had already uploaded some 8-bit maps, elaborated from my own solitary experimentations and get noticed by Drunk who started the chat with me. I thought this long dialogue could be an usefull tutorial for anyone interested about accurate SC4 mapping, finding the good tools, the good dimension formulas and the good spots on the internet where DEM gems are hiding. I'm almost sure that Drunk would have agree to see this text here and, if he reads me (one never knows), let me cheer up a beer with him ! So here it is : a "from the foundry" brutal Copy/Paste of our private conversation from 2011-2012 ! Part 1 of 3 drunkapple 434 Started conversation: November 5, 2011 · Report G'Day Izi, That is a lovely collection of maps you are amassing. A couple of things: Do you have or can you get photoshop or photoshop elements? One does need to do work on these maps outside of terraformer etc and ps or elements is about the only software easily available that works on 16bit pngs and tiffs. I downloaded your La Isla Tiburon and Cabo Tepoca map. What formula are you using to scale latitude and longitude? I ask because your map is a little under scaled both in latitude and longitude. After exhaustive experimentation and a lot of walking with a tape measure... ( Nah all bloody lies). Hunting around on the internet led me to some sites with the conclusions that although latitude does change slightly north to south, there was an accepted constant that 1 degree of latitude is equal to 111.325km over the entire globe. This in SC4 is equal to 7124.8 pixels which can be rounded up to 7125 pixels. This is okay to use but as SC4 is binary: 1 pixel = 16m, 64 pixels = 1 small city tile = 1096m, there is an extra 96m in every small city tile so I divide the above figure by 1.024 to give a result of 6958 pixels for 1 degree. Remember this is the same for all maps irrespective of latitude or longitude. Longitude as you well know changes considerably as one travels further from the equator both north and south. The formula I found to determine longitude at any given latitude is: Cosine(latitude) x 111.325 or you can use cos (lat) x 7125 if no binary scaling or lastly cos(lat) x 6958. Again this is 1 whole degree. I usually only scale for longitude at the point of interest in the map with everything else being either slightly wider or narrower, but one can scale over the whole map by using transform-perspective if one desires. The difference in 1 degree of longitude at 60 latitude is about 1.6km or about 105 pixels and decreases as one moves toward the equator. For interest 1 degree of longitude at 60 lat is about 55.66km. I have used that method when making large scale maps over a couple of degrees of latitude. Cheers drunk(always) ps. I'd take what blade says with a grain of salt. Aside from a few individual countries 1" arc data is not available world-wide. Quote Izidor44 91 Replied: November 7, 2011 · Report Good morning Drunkapple, nice to read some words from you. Very honored too, as I consider you and your maps as an absolute model I thank you very much for these advices about dimensions calculations, I was just living in a medieval world, where everything is flat. And you, heretic, come here to say to me that we live on a globe ? In fact, my method is pretty archaic and, shame on me, completelly ignoring the fact that the Earth is rounded : I simply searched around the internet a distance calculator between two geographic points. For each DEM map, I enter coordinates of each corner. According to this calculator, distance between two corners of the same longitude is always 111,122 km on every latitude on the globe. Given that, in my medieval world, 1 km = 64 pixels, it gives 7111,808 pixels, rounded to 7112. This is this number I enter when resizing my original map. Same action was done for longitude calculation. At this point of the reading, you should think : "What a $%&^! ! : only empirical deductions and estimations, and absolutelly no trigonometrical approach for calculation !" So, after reading you, can I say that ? 1 degree distance in longitude is always 111,325 km formula for distance calculation on latitude, in kilometers : Cos(lat) x 111,325 km Example : distance of 1 degree between a point of 47 degrees of latitude and a point of 48 degrees in latitude is : Cos(47) x 111,325 = 75,923 km ...is that correct ? Now, let's convert all those measures in pixels : 111,325 km gives : 111,325 x 64 / 1,024 = 6957,8 px, rounded to 6958 px 75,923 km gives : 75,923 x 64 / 1,024 = 4745,2, rounded to 4745 px A map of 75,923 x 111,325 km will be converted in a 4745 x 6958 px picture. Do you agree ? --- Regarding Photoshop, I don't earn it and only work on GIMP freeware at the moment. I know this program cannot handle 16 bit pictures, but I would be very interested to know HOW your work on this type of files ? At present, my method of working is based on Microdem software, Gimp, and SC4T. I use layers to redraw rivers and streams or specific areas... but I would be curious to know how YOU do the job I've experienced Fantatsicoast a bit, but cannot see where I can put it on my methodology... Cheers ! Quote drunkapple 434 Replied: November 17, 2011 · Report G'Day Izi, Thank you Izi. Moi! Heretic, but I'm the president of the Flat Earth Society. Yep, you look like you've got that ok. I presume that was a typo: 1 degree distance in longitude is always 111,325 km. It's latitude is always = 111.325km. North to south or height. Longitude is cos(lat) x 111.325km. East to west or width. eg. Paris is at lat N48° 51' 26.95", the distance of one degree of longitude at Paris is cos(48.86)x111.325 = 73.24km It almost seems there are no free editors out there that handle 16bit images, I certainly haven't found one yet and I've been trying a few out but nothing. I'll keep looking though. Most think dem maps are hard to produce, the hardest bit is converting the files to a usable format and finding a 16bit editor. The part that makes a map shine is the water as you discovered when when you asked Blade to make the French map, dem doesn't really follow the coasts all that well and a helping hand goes along way to fixing that. By the way that is his pretty much stock in trade answer you received. And while his maps are certainly playable and by god he's made a lot of them, they are neither particularly accurate in scale or terrain and the water is mostly just something else again. My method for collecting water has never really changed. I use the satellite images from google maps at 200 or 500m (depending how good the images are). I also use alt-print screen to capture and paste them into photoshop, on top of each other in layers. (This is so I only have to do one crop to cut them all out.) Once I've collected them all sometimes up to 60 individual images I paste and align them in a new image. You can use the blink method to check the alignment is good, but there are usually distinct pixels on the border. I then merge and save the behemoth. Next take a perfectly good mouse and choose lasso and start drawing around the coasts, rivers and lakes. Again not so hard but can be terribly time consuming. Save often by creating a new layer and painting what you have lassoed. (It does get easier the more you do:))) A good colour to paint it is the 1st or 2nd below sea level. Does GIMP have a transform tool? Next open your dem image in 8bits it should be bright enough to see the detail and copy and paste your painted water layer onto your dem, it will be much larger than the map so use transform to make it smaller. Pulling and pushing on the sides until it fits and aligns with all the features on the dem. If it mostly fits but there are a few places where the rivers jump out of their banks or the coast doesn't quite align, then and only then use a warp command (again I don't know if GIMP has this transform command). This will allow you to pull parts of the water about without upsetting other parts too much. Doing water levels and whatnot has changed considerably over time and I will go into that in more detail in another post. I tried out the first script thing he wrote and it worked quite well, but I never tried fantasycoast as I couldn't be bothered installing dotnet4 and besides I feel I can make better coasts than puter generated ones anyhow. Whew! How's that. Cheers mate. Quote drunkapple 434 Replied: November 17, 2011 · Report G'Day Izi, How are you today? Ok ditch your 8bit stuff I've found a 16bit editor that can open and save 16bit pngs ;<). It's not free but relatively cheap at 59euros, certainly a damn sight cheaper than photoshop. It has layers, will work in French and has a 30 day trial period. It supports both 32bit and 64bit operating systems and there is a Mac version also if that is your bent. Allround worth a go I should think. Photoline Now does Microdem export out 16bit files? Because if it doesn't... Well you get the picture. Cheers mate. PS. Here's my basicColors.ini for mapper and terraformer. Quote Izidor44 91 Replied: November 18, 2011 · Report Good day mister President, nice to read you again ! First, thank you for your colors I completelly agree with your point of view about Blade's map of french Brittany. Knowing the region very well, as I spend most of my holidays in this area, I was a 16-bit... ...oops... a bit disappointed when receiving his map. I didn't recognize very well the coastline and some areas... At this time, I was thinking this map was just a rather crude DEM conversion to SC4 standards. Now, I may think we agree about the fact that sea and coastline is probably one of the most important thing on a map. With mountains, sea is the first any SC4 map-uploader guy will look at carrefully before doing anything, no ? My first attemps at ameliorating the shoreline quality were based on GIMP tools. In my file, sea is represented with a "true" blue color, and land is grey. When selecting the blue area and using some specific tools, this selection was very well. But many details were still lacking... So, I started to add layers, with Google map view screenshot, and I repainted in blue over it. After merging the whole blue zones, I had a "sea layer". However, I only redrawn some details, like harbour and streams... ...not the whole coastline ! Now, reading you, I finally admit (you know I'm so lazy) that I would have to draw the whole map ! This is very time consuming as you said, but not impossible of course. I'm now working at a map of Almeria (Spain) with your advices and method. But don't expect to see the map too soon ! About those famous 16-bit... First, let me point you to the Microdem page : http://www.usna.edu/Users/oceano/pguth/website/microdem/microdemdown.htm Please upload the software, as it is completlly free. Sadly, after reading for hours the help files, I think this program doesn't export 16 images. I please ask you to have a look, as I'm getting lost with all that stuff... I've also download the trial version of Photoline and will have a look to. It looks like GIMP for many tools (here too, you may have a look to this free software), but I don't figure out how 16 bit works... I also have seen the Global Mapper free download, which seems to be the ideal tool, but very expensive ! Well, as you can guess, I'm a bit confused about all that. I can probably improve at making 8 bit maps (which is my first goal for the moment), but 16 bit world is still very foggy for me... dooh ! Cheers from Paris, Izi Quote drunkapple 434 Replied: November 19, 2011 · Report G'Day Izi, I am not going to load that piece of dinosaur snot on my 'puter ever again. I have three or four times previously and every time I never get it to work. I don't like reading copious quantities of garbled garbage to to get a piece of sh!tty software to work. I have always thought of Microdem as written by boffins for boffins! Anyhow on a brighter note. I'm glad you popped up as it has given me the reminder to continue to develop mapping techniques, I normally use Global Mapper and Photoshop and had progressed to the point where I could churn them out quite rapidly depending on what water there was to incorporate. The paid version of GMapper converts quite well to tiff which of course PS can deal with but as you've found out it ain't cheap, and using it as a one trick pony tends to make it prohibitively expensive. Last year I developed a technique to convert hgt files using a nice little freeware proggy called 3dem and terragen to convert to through a variety of types ending with a raw file which PS could open. (The guys' had PS). 3dem outputs a 32bit tiff while PS can open it, it struggles to work effectively with it. I made one map using the technique to prove it up, (Notorious in two centuries, Tasman Peninsula) and was quite satisfied with the outcome. Now enter Photoline, Photoline is able to correctly open the 32bit tiff from 3dem as a hdr image. The image is ranged from black to white irrespective of actual height (this can be re-ranged in terraformer). The bicubic interpolation algorithm for resizing looks a little better than PS's and does not do spurious dark artifacts around the coast line. Lastly you just need to crop the map out and save it as a .png and make a config. Tonal manipulation is not required if the map is not including the highest part of the dem. Aside from being a frail, shaky piece of crap, unfortunately terraformer has a few bugs that unfortunately Wouanagaine is never going to fix. It amazes me how people bemoan Maxis for not fixing bugs in SC4 yet those very same people are guilty of the same crime with their own software. Anyhow the bug that affects this technique is that terraformer flat tops the final 7% of the greyscale at the white end. ie over 6000m everything is flat, mapper on the other hand will show everything up the the correct 6553.6m. The full 16bit range but alas has no compressor for setting the elevations. Like everything it is fixable: The flat topping started around 2040m (2290m in SC4) so I set the high in terraformer's compressor to this figure and exported a new .png. On the original map from 3dem I lowered the output level in Photoline from 100% to 93% in Histogram Correction and exported another map. The real height of the affected area is about 2173m (2423m in SC4) and this what I set terraformers compressor to. The lower level on both maps was set to 193m (443m in sc4) and exported another map from terraformer. I then layered these in Photoline and cut and pasted the piece I wanted. There are no manipulations for the join (blurring etc). As the height of the fixer map is 133m higher I first tried with a lower limit setting 133m higher also but this left a visible scar as such. While most would not notice or care I do. If you like I could write a more coherent tutorial for you concerning all this stuff. Oh I cannot really remember the addy for 3dem so you can get it Here ;<). Greetz from Darwin Cheers drunk(still) Quote drunkapple 434 Replied: November 20, 2011 · Report G'Day Izi, Late breaking news!!! Hold your water on patching I have discovered something cool!! It's an extra step but it saves making a second map or jiggering with tones and the histogram. Quote Izidor44 91 Replied: November 21, 2011 · Report Dear FES* member, I'm always very proud and unpatient to read your posts ! As I'm waiting your last discovery, I would like to list you the actual tests I did today. The source : First, let's grab some candies over there : http://edcsns17.cr.usgs.gov/NewEarthExplorer/ This USGS website allows you to download DEM maps in .dt1 or .bil format from areas all around the world. Converting these raw datas : I used to open the .dt1 format with Microdem and save a magnified image in PNG (8 bit) in order to edit it in GIMP, but things are changing ! I now open the same file and save it as a GeoTiff file. I then open the GeoTiff file with 3DEM, change the projection settings and resave it, still in Geotiff format. Opening the beast : Let's start serious things : I fire up PhotoLine (let's call it PL) and import my last file as a raw picture. Then, I set the layer properties to greyscale - 32 bits and save the whole thing in a PNG format. Of course, for the moment, I'm not talking about rescaling and retouching anything. I just want to see if all the factory I'm building produces 16 bit stuff. Testing with SC4 Mapper : First, please imagine my old frustration with this software, as I really never succeeded before as creating a new region importing 16 bit datas. Today, things appear to be quite different ! Testing with SC4 Terraformer : Same procedure here, with the difference that I can't select directly a 16 bit png greyscale, on the countrary with SC4M. Of course, on my examples, still no modifications or compression. QUESTIONS ! 1/ Is this procedure is usefull ? What is the difference between my ol'8 bit handcraft method and this new one ? 2/ About resizing : can I do it in PL, or is there a thing to do before ? 3/ About sea, streams, harbour and other details : I guess I have to "paint" the see in black, on a new layer, but how can I realize a "gradient" effect, from the seashore to the bottom of the ocean ? Is this doable in SC4T with the compressor ? 4/ About SC4T compressor : can you teach me HOW this works ? Do you only use that function to set proper elevations, and doing nothing before (like in PS) ? Take care, Iz44 * FES : Flat Earth Society ;-P Quote drunkapple 434 Replied: November 30, 2011 · Report G'Day Izi, How are things going mate? Mmmm they're nice lollies. Earth Explorer looks to be the successor of the seamless server, a truly ugly and clunky piece of snot. To that extent I decided to find their storehouse of goodies. and consequently have been using the tradesman's entrance ever since. http://dds.cr.usgs.gov/srtm/version2_1/. SRTM1 directory is US 1 second data, SRTM3 directory is the rest of the world 3 second data and SWBD directory is the water shape files you found that are quite inaccurate and the reason I do not use them. Oh I've tried them. The files are named for the lat and long of the bottom left or southwest corner and are in .hgt format. They can be opened in 3dem and also no registration is necessary to download. A truly wonderous cavern of treasure! Okay back to EE, I tried it out until it said log in to collect, GRRRR, I didn't. Does it serve the dem in any other format? Not that it matters so much as .bil files will open in 3dem without the need to go via that dino snot Microdem. I tried out your method anyhow making a 16bit tiff in gmapper then running that through 3dem and on to PL. While it delineates the water, it is not overly accurate and you could easily end up making maps like some other well known mapper ;<). Other more important things though: because the importation method - Camera Raw, PL change it to RGB and assigns new values to all the pixels changing all the original heights but when converting back to greyscale the old values are not restored. The test map I am using - Hiroshima the original top height was 5600+m, the camera raw version produces a top height of 6100+m causing several large flattop areas. When re-sizing the elevations with TF the intermediate elevations are also out. I just had to re-load my OS as terraformer started acting up and even deleting and replacing it with a new copy didn't fix it. Out with the trusty ghost and 10 minutes later all is new, the whole 24 gigs of c drive including programs are now fresh as a newborn's bum ;<) Basically I'd drop the import as camera raw as it is fraught with many things to ruin a good map, including inaccurate water mask, inaccurate elevations, the change to rgb, and the change to 32bit. There is enough work with capturing good water to keep one busy without making the dem conversion a fiddle faddle every time. That said the only way to eventually get 'puter generated water is to keep experimenting with different techniques and I like that you experiment. I like it that you came along because it spurred me to experiment again and I think the following method I will describe is currently about the most accurate for the intermediate elevations I have used so far. In times past my intermediates could range +/-10m again while most would not notice or care I do and I had ended using a customised rgb method which is especially useful for raising ground below sea level. This new method is simple clicks not requiring the use of the histogram or anything. Very quick, very simple, very good. Le Technique. 1. Go to the candy store, either EE or the Treasure Cave. Personally I prefer the treasure cave to the point I downloaded everything from it so I have all the SRTM dem on my hard drive ;<). If you still prefer EE download the files in .bil format. If you use the treasure cave the files are in .hgt format. Both formats will open in 3dem. 2. Start 3dem and choose SRTM then navigate to your file(s) and select it/them. Yes you can open more than one. 3. Once it opens with your map click File>Save Geo Tiff DEM and then click OK in the Dialogue. Personally I do not change the projection as it changes the map size and I have not tested that with my lat and long formula. Close 3dem. 4. Start PL and click File>Open and navigate to your newly created tif image, select it and click Open. On the header bar along with it's name it will say HDR Gray Picture. 5. Zoom in and look for any dead (black) pixels around the area you wish to make the map. When you find some zoom right in and use the Color Picker (I wish they wouldn't use American spelling, it 5hits me). The colour picker is nice because it shows the value of the pixel, dead pixels usually show as -2.1. You can test all the pixels around the spot, when you find an appropriate one to use click it with the colour picker and change tools to the pencil (make sure to change the size to 1px) and click the dud. Continue in this fashion until you have fixed all the duds in the area of interest. It pays to put keyboard shortcuts on these tools to make switching between easier, faster and all around more enjoyable, I use V for the colour picker and B for the pencil. They are next to each other so it is very easy. 6. Next is to resize it, click Layer>Layer Scale and in the dialogue for Mode choose Formula and for Interpolation choose Bicubic and type in the width and height figures then click OK. 7. Last operation in PL for now is to cut out the map, we will assume for now it will not be including the highest area of the dem. 8. Now Save As or Export, it does not seem to make any difference. File sizes are the same, if you choose Export select Export again from the flyout. 9. Make and paint a config. Close PL. Now it's on the Terraformer, Terraformer will open maps from any directory as long as there is a valid config.bmp in there. So you do not need to store all your map making files in SC4's region directory. We will also assume that this map will encompass the sea. 10. Open your map, the first job is to ascertain the highest point also remembering that we are not including the highest elevations of the dem. Click Compressor and in the dialogue change only "max height will map to" to say 255 and click OK. Everything will sink below sea level. Scan the Overview and find the top that is poking above sea level, now open google maps or google earth, (I use maps) switch to terrain and find that high point of your map. If it is named You may well find a height on the ether webby for it otherwise we just use a best gestimate between the contour lines. 11. Ok back in TF click Configuration tools>Undo last terraforming. Go back to Global tools and click Compressor again, this time input 250 into "min height will map to" and the figure you garnered from the terrain plus 250m allowing for SC4's sea level into "max height will map to". Leave "unchanged value" at 0. 12. Last thing is to export it as a 16bit png. You now have a very accurately scaled map in lat/long and elevation (No bogus artifacts as in my previous efforts but you do need to scale lat and long first in PL before elevation in TF or you will get artifacts). Close TF. The actual making of the map to this point is by far quicker than both writing it or reading it. OK now some additions: I. Making a map that does not include the sea. Follow to point 10 and then... 11. Ok back in TF click Configuration tools>Undo last terraforming. Go back to Global tools and click Compressor again, this time input 245 into "min height will map to" and click OK. Scan the Overview and find the puddle of water again checking the terrain in google maps or earth for the low point. Now you have both the low and high points of your map, Undo the last terraforming and in the compressor input these numbers remembering to add 250m to both to allow for SC4's sea level. 12. Export it as a 16bit png. II. Some non-coastal maps are not conducive to adding rivers, it depends on how quickly riverbed rises over the map and sometimes the lowest points of the map do not contain rivers. In these cases I leave the maps at full height and add no water, this requires the punter to add the river with PW if they wish and are not too lazy (most punters I think are too lazy though). In other cases the maps can have rivers aded with no ill effects. This step follows from point 11. 12. After setting the highest and lowest elevation click Lower Terran and input the low height minus 250, then click OK. This will lower the whole map by that amount and the lowest point will be at sea level. The elavation falls will remain accurate between the high and low points. 13. Export as a 16bit png. III. Making maps with the highest parts of the dem and the 6000m bug in terraformer. I discovered this bug when I made Hunza Valley. Rakaposhi is over 7800m, when I lowered the valley to 251m Rakaposhi was still at a height of 6239m and opening in TF it was bloody flat along with Ulta and a fair amount of other country side. I fixed it by compressing it 239m, trust me it's still a fair old drag to climb to 6000m though ;<). This was importing the 16bit png, I don't know if it affects importing an SC4M file though. But and there is always a but! It does not affect importing game files from SC4's region directory ;<))). So the fix without making a second map goes like this after point 9. 10. Start Mapper and Create Region from 16bit PNG. 11. Save region. Close mapper. 12. Start Terraformer and choose to open your newly created region in MyDocs>SC4>Regions. Now follow along from point 10 in the main technique. This is quite a rapid process to create the map ready for water. So far I have not used PL for the water side of things but I shall be testing soon. I am comfortable using PS and have not found the feather tools and others necessary to create good water in PL. I will be checking them soon though. I collect all water in rgb and 8bits so if you are comfortable with the gimp you can continue to use this capture water. Can you input colours with hexadecimal numbers in gimp? If so use 0c0b09 as the water colour equates to 247.8m in SC4. This has taken a few days, a few hours and a few computer re-installs to get here, so I'll leave it at that for the time being. We will get on to water and the pasting on to a map and contours etc. I promise. Take it easy and good experimenting Cheers drunk(again) Quote Izidor44 91 Replied: December 1, 2011 · Report Hi DrunkApple, First, let me say that your last post is pure gold for me ! All these indications are unvaluable, thank you ! I've also had a look to the treasure cave you indicated. I found it very usefull and better than the other web interface. All this is saved and bookmarked I very carefully followed your steps with a new .hgt file, it's the south western french coast and the spanish border, along the Atlantic coast : Maximum elevation is 1294 meters (1044 meters in real life). Some zones of dead pixels have been repaired, the whole map has been correctly scaled and edited in SC4T. Absolutelly no smoothing at all. Now, I plan to draw the water line, but I wonder how can it be accuratelly possible. What about editing a "shoreline" layer in PL, PS or GIMP, using the overview PNG file (rather that the elevation PNG file exported from SC4T) as background ? I wonder if it is easier this way... ...so I will experiment that ! - draw the complete shoreline and rivers with the 0c0b09 colour (possible in GIMP, I've checked). - create a "gradient" effect from 0c0b09 to 000000 colour in this zone (I still don't know how to do that) - put the layer onto the elevation PNG file exported from SC4T before and merge both - import this new file in SC4T What do you think about that ? Cheers from rainy Paris, Izi Quote drunkapple 434 Replied: December 2, 2011 · Report G'Day Izi, Cool, did you find it made sense and easy to follow? Now you could make a shore line from the overview but it still would not be accurate because it was generated from the dem in the first place and as we have seen previously the dem is not that accurate. Comparison There are two overviews, one is from a water collection as you suggested from the overview, the other is from my normal method of collection, ie lots of google images and lasso them cows pardner. While at first glance it looks okay, closer inspection reveals a lot of work is still required to attain a good standard. Whilst the vertical rise of SRTM is usable The horizontal is quite piss poor and much of the smaller islands are just missing altogether. They are the same dem and you can layer them and blink for a good comparison. You do not have much water to lasso in your map above so is a good practise for lassoing it. when you have done so I'll fill you in on pasting on to the dem and adjusting the gradients. Of all the parts of map production this is the piece I have experimented the most with. Nothing is more heartbreaking than capturing all that small detail then losing it when painting it on. we were having a big storm yesterday also when you wrote. probably copped a couple of inches. Cheers drunk(as usual) Quote drunkapple 434 Replied: December 3, 2011 · Report G'day Izi, This next comparison is using those water .shp files overlaid on the dem, unfortunately 3dem will not open shp files so I made it in gmapper. The image is a 3 layered tiff the bottom layer is gmapper's output, the middle is my water overview and the top is the basic water generated from the bottom file. Again you can see the inaccuracies of the shp files, they may be useful for a simple coast but for a complex coast like Stockholm I do not think it is the answer. Shape File Comparison I think the answer to collecting water lies somewhere in being able to convert the google images into 16 or 256 colours to be able to easily magic wand the sea accurately and quickly. Lassoing is accurate but can be dreadfully slow. Cheers drunk(already) Quote Izidor44 91 Replied: December 3, 2011 · Report Bonjour Drunk ! After reading and seeing what you've prepaired here, it really seems that the lassoing technique is the better one. However, I tried a little variant, which is, in fact, not really the best one : I used the terrain rendering (I mean no satellite photos) of the Google map site, and collected numerous screenshots of the coast and major rivers on my map. In fact, I had in mind to select, after everyrhing was collected and correctly scaled, all the blue color of those Google images and put it as a zone in a new layer. This zone is then filled in black. Unfortunatelly, this method still requires many corrections. The Google map still have texts and roads which make impossible a perfect selection of the water at first. I still had to walk around the map and correct some spots, like bridges, harbour, etc... So I think it is better to use real images. Finally I had a complete layer where water = black. (I mean 000000). Saved this layer as a separate file, opened it in PL, converted it in HDR grey 32 bit, and pasting it as a layer on the original PNG file I exported before from SC4T. Sounds intelligent or not ? If I continue this way, some difficulties appear : - change the 000000 colour of the sea layer to 0c0b09 in PL - create a gradient effect of this black zone (how to ?) - correctly merge the two images and see what happened in SC4T I have followed all your precious indications to start something else : the Saratov region, Russia. This main town is along the Volga River. Look at this magnific river there, with all these curves... How can it be possible to edit water here ? I think the lassoing technique with real images would be very hard... ...it is why I started to see what would be possible with "terrain" map Google screenshots. You see ? Well, I continue to experiment and will post here (probably on Monday) some examples of what I'm talking about here PS : the Burgas map I will upload Monday too is born from this drawing technique you told me. But I'm still not very about the quality of the result. Cheers, Izy, the young apprentice ! (edited to add the pictures) Quote Izidor44 91 Replied: December 5, 2011 · Report Hi Drunk, Here is the last step about this map ! The main drawback is the "gradient effect" of the water zone. I still don't know how to do that in PL. Before in Gimp, I filled the water zone in "grey" (I mean not a complete black) and methodically reduced the zone by 3 or 4 pixels, then filled again the zone with a darker grey. And I continued until I reached almost pitch black value. You see ? Here, the bottom of the sea is 230 meters (-20 m), and this setting was done with the SC4T compressor tool. Still not satisfied about that Quote Izidor44 91 Replied: December 8, 2011 · Report Hi Drunk, I finally successed in making a gradient effect all along a coastline : Contour was made in an "hybrid" way : I collected the satellite photo from Google, and put them in GIMP, over the SC4T overview picture. I used this software only because I feel more easy than in PL. I opened PL and add another layer (greyscale 16 bit) and drew a contour line. Then, I created a inner gradient effect to the black zone. This contour layer was then copied and pasted on the PNG file I exported from SC4T at first. Merged the 2 layers and imported again the new PNG file in SC4T. The only drawback for the moment is that the gradient effect considers the border of the picture (here left border) as the border of the gradient too. I had to flatten everything in SC4T... The gradient setting is still too strong maybe... Cheers, Izi Quote drunkapple 434 Replied: December 14, 2011 · Report G'Day Izi, Yes that variant does work but you have to check between the images and the terrain (or map) at how accurate it is. Some countries have very accurate map and terrain water while others, it is quite slap dash. And sometimes countries have quite good water in places and other parts it looks like dog piddle running down a tree. I usually scale the water after I have painted it as it is much easier to do all the fiddly stuff with the biggest images. Also you will get softer edges on the water if you layer a larger image on the map and transform it down in size. I would not worry about converting it before pasting onto your map as it will become 16bit and greyscale and therefore unnecessary to be 32bit. The things I need to find in PL is the feather command and change colours. I will write to you shortly Cheers drunk(as per usual) Quote Izidor44 91 Replied: December 16, 2011 · Report Hi Drunk, How are you ? Nice I hope. Have you seen the Saratov map I finished ? Today, we're enjoying a little storm around here, rainy and very windy... About PL, I've tried the "Inner gradient" function. You can find it in the "Effects" menu, then "Layer Styles", then "Inner gradient" at the bottom of the list. Before using this, I select the whole black zone corresponding to water, then launch the effect. You can adjust the gradient by moving the little buttons from right to left... ...well, I'm sure you already know to do all that in PS. The drawback with this function is that the inner gradient runs along the border of the map (if the water zone touches the border, of course). It's then necessary to erase and softer it ; I do that in SC4T. If you find a trick to avoid that drawback... ...let me know how to do ! At first, you will find your layer a bit strange, where water zone has an almost white or transparent border. I then modify the layer style from "normal" to "Multiplicate" or "multiply" (don't know the exact english version) and adjust slightly the transparancy (between 100 and 90% max.). I check the color values and then, I merge the two layers : background and "water". Sometimes, several tests are usefull Actually, it's the way I found the make gradients in PL. It's not perfect but it works ! Please tell me if it's possible to improve this method or if you can do the same effect another way. About "painting" : I first collect the satellite photos and adjust their dimensions before painting the water. I will follow your advice and do the countrary : keep the images full size to draw, before adjusting it over the map. I plan to make two other maps of Vietnam, Da Nang and Ho Chi Minh with this technique ! Take care Mr Map Guru ! Izi Quote drunkapple 434 Replied: December 18, 2011 · Report G'Day Izi, Thanks I'm fine but my modem blew up the other day, lightning. We get a lot of that at this time of the year. And then last night I almost lost 290GB of data on a usb drive. I formatted it with a 32GB fat partition, somehow the drive names and letters had got mixed up while I was making a bootable virus stick for ghost. Luckily I found a great little proggy called testdisk and it ditched the fat partition and re-wrote the partition table. Phew. I had a looksy at your map and it looks great, you are one fast learner amigo! Righto, this is the latest water pasting/painting technique I use. Some parts I have been using for a while now but the last bits I have only been using for a few maps and it appears to be okay. I'll start from after pasting onto the dem, if I need to warp the water it changes the colour to the equivalent 257m in which case I use change color and set the output to -4 otherwise the colour will remain 0c0b09. Pasted, transformed, set to go. 1. Make a layer copy of the water, so now you have two water layers, This helps the definition of the smaller creeks. 2. Select the water with the magic wand, feather it by one pixel. make a new layer between the dem and the water and paint it with the colour 0a0c0c. This is just above sea level and will help give definition to the coast and also give a very smooth coast. 3. De-select and re-select the water, not the new layer. Contract the selection by three pixels and feather by one pixel. Copy the water and paste on to a new layer above. Use change colour and set the output to -5. 4. Select the water and contract it by 5 pixels and feather by 2 pixels. Copy the top layer and paste on to a new layer. Again use change colour and set output to -5. 5. Back to the water layer and select it again, contract it by 7 pixels and feather by 2, copy the new top layer and paste again on to another layer. Change colour by -5. 6. Once again select the water and contract it, this time 12 pixels and feather it by 3 pixels. Copy the topmost layer and paste to a new layer. Change colour this time by -12. 7. Okay the drill is select the water and contract it by 22 and feather it by 6 pixels. Copy the top layer and paste it onto a new layer, change colour by -18. 8. One to go. Select the water, contract it by 37 pixels and feather it by 8 pixels now copy the top layer and paste it on to a new layer, change the colour by -24. 9. Flatten the image to background and save. Waters done ;<) almost. 10. Fire up terraformer and load the map. click compressor in the minimum box input 65 and in the Unchanged Value box input 250 and click ok. Now that's it, job's done water is finished. That is how I do it with photoshop, I just have to find the feather, contract and change colour commands in PL and my technique will be ready to publish *The only other number one can use in the "Unchanged Value" box is 250. When it is left at 0 terraformer stretches the whole map from the lowest height through to the highest. When one inputs 250 terraformer will only stretch the map from sea level. it will do this either way from sea level to the lowest point or from sea level to the highest point. It is one nifty trick. Although I personally think terraformer and mapper are both flaky, shaky proggies. Compressor is by far the best 16bit histogram manager. This will keep you occupied for a while. Hopefully your storms will ease and you will have a fine Christmas. All the best for the festive season to you and yours. Take Care drunk(sloshed) Quote Izidor44 91 Replied: December 25, 2011 · Report Hi Drunk, Just this small note to wish you a Merry Christmas to you and yours A little hint about PL : after 30 days you think you need to register ? NOPE ! Just reinstall the whole thing and the countdown restarts from the beginning Some days of holidays for me : no mapping session scheduled, just try to PLAY the game by itself (which was rather rare these times). Cheers with a glass of Champagne ! Izi Quote drunkapple 434 Replied: December 28, 2011 · Report G'Day Izi, Thanks mate, I hope you had a swish time. Mine was alright although I worked on Christmas Day. Not so for New years though. That's very thoughtful of them not to leave a bomb so you cannot re-install. Three hearty cheers for PL. Them Huns aren't too bad after all ;<) One thing I may not have mentioned is Accuracy is Ones Hallmark. And another, you may notice that your last map has not received the complimentary 1 star(s) (yet). That my dear friend is because he has not been on since a few hours before you uploaded it. To tell the truth a lot of the time that was what kept me going making so many just to give him the 5hits so to speak. In time if you are observant you will also see who it is. I have photos (or screen shots). Play the game? I haven't really played the game for years. All the best for the coming New Year to you and your beloved. Mmmmm, Champers! Cheers, chugga lug lug. drunk(crissed as a picket or vise versa) Quote Izidor44 91 Replied: December 29, 2011 · Report Hi Drunk, Some holidays for me, far away from my mapping machine... but before leaving house and closing the suitcase, I've finished rendering the Saratov Region : Map is 14 x 14 big tiles, so 196 cities to open = quite a long time in front of the screen ! I was wondering if it could be better for me to wait before uploading maps, that I have 3 or 4 files to upload, rather than only one. Then, the main page of the Simtropolis site is full of MY maps ahahah ! Then, I will wait to finish the last maps before uploading : - Saratov (done) - Tucson (not rendered) - Sanya (China) (not rendered) - Pskov (Russia) (small, but not finished at all) I still have to experiment the lassoing technique further on, as I recently discovered it in PL : much more accurate and rather simple. Before, I was painting with a 1 pixel wide brush and it was difficult to make small details and long lines (like in harbours for example). Be sure that I will try Pskov map that way. I agree with you about the idea of the hallmark : accuracy is the challenging part of mapping, no ? Come back at mapping probably next year ! Cheers and Happy New Year ! Izi Quote drunkapple 434 Replied: December 29, 2011 · Report That looks swell! Quote drunkapple 434 Replied: January 16, 2012 · Report G'Day Izi, I must say it has been a lovely month seeing the maps rated more fairly without snotbox being around to stick his grubby little finger on them. They do garner less ratings though but I suspect that was to try to compensate for the c_cksucker. It would be nice to think he won't be back, unfortunately though he has been around since 2005 so I suspect he will be. Anyhow mate you are starting to make some really grand maps, I see them up on the STEX and momentarily I think that's mine then realise it's one of yours ;<). I do hope you continue to make maps because I see in how you have progressed you have great ability and understanding of your 'puter and programs and the necessary skills to achieve the results of A class maps. Continual improvement via new techniques and programs is essential though because without that we would be still scratching on rocks. Chin, chin drunk(already) Quote Izidor44 91 Replied: January 16, 2012 · Report Hi Drunk, Thanks for the kind words, I'm always very honored to read your comments and posts about my maps (yes, it's supposed to be... ...maps). Each time you realease your works, or just posting screenshots in forums, I feel like a child in front of the Christmas tree, looking at all those presents I have to open ! I hope my modest contribution can do the same for other SC4 fans... ...so let's keep practicing and progressing (I try to) ! As almost nobody still have replied on my Simtropolis topic, I started to look at the "Map requests" topic, in order to make me a little "known" by the forumers. Arnhem and Ubatuba are those 2 maps which result from this. Recently, another guy suggested in a private conversation another Croatian spot called Sibenik, which could be interesting to do. Some other maps are in the pipe too : a croatian map of Dubrovnik (you will think I'm always around that area of the world !), Jefferson city in Missouri and (little wink from me to you as you realeased Hiroshima some times ago) Nagasaki, Japan. Recently, I was wondering how to render the maps in SC4 with specific terrain mods. I usually use "Italian" mod, but snow appears at about 500 meters above sea level. Then, some maps can really appear completelly white of snow, which is an effect I don't want to have sometimes. I disabled the mod, but the standard maxis textures don't please me. Do you have any suggestion or (even better) a mod to upload in schedule ? Another question : how do you upload files in the LEX ? I'm still wondering if it could be usefull/smart to upload the maps in STEX and/or LEX... What is your opinion about that ? Final question about Arkanghelsk : where did you find the DEM datas ? The northern part of the world seems to not be available in the server. When looking closely at the map, it seems that the contours are slightly more "straight" and geometric than in other files you've made, no ? Anyway, the mapping machine is still running, no worries about that ! I keep looking at Google Earth, rolling on the planet and thinking : "Hey, here it could be nice... ...oh wait, that spot is better... ...oh wait... ...etc" ! Feel like child in a candy store. Always glad to share a conversation with you, Cheers (and what about red wine this time ?), Izi Quote drunkapple 434 Replied: January 25, 2012 · Report G'Day Izi, I think you are the one I have been looking for! Do not be disturbed that nobody yet replies in your thread, the important thing is to keep posting and advertising your wares. It keeps your thread on the first page and near the top. I myself am not a big commenter in threads but if you look at my thread on sc4d you will see it took quite a lot of posts before people started rolling in, now it is one of the most looked at "threads per comment" on their site. If you look at all the "I've started a thread" threads here at simtrop you will notice that after a few half-arsed maps they give up and their thread sort of dies a lonely death and soon gets buried beneath the plethora of "mapper and/or terraformer doesn't work" threads. You also have another request in the Sibenik comments for Pula. I started on the back end of the request threads last year and have so far made about five of them, I'll race you to the middle. It seemed such a shame that these people requested maps and nobody could be bothered to make them. I was hoping to have more done but as my requests grew and grew and grew throughout the year I had less spare time to continue, but this year I shall endeavour to complete that task. I also took a look at sc4d's map request board and will make a start on that soon. Here is a little mod for Italia with the high snow variation, it needs to load after the terrain mod. It will work with Cycledogg's other terrain mods also with varying results because he individualised the terrain exemplar for the different mods. It will take the snow up to about 4000m. Hmmm the bsc, I once seen them described as neckbeards and I would say it's mostly appropriate. Some are okay but most who run the site can be a bit of a pain, pretentious and presumptious. Their boards do not garner as many downloads either. I applied when TD was formed on Joel's request. Submit three items for our scrutineers for admission to upload to the lex is what it said. You will notice that my lex admission thread has been moved and is un-viewable because after the first three maps I sent them and one of them whined like a banshee that they were too big, the mountains were too rugged and where there was no beach there was no beach. I felt I had a right of reply and fair stuck it up them ;<). Anyhow fourteen maps (I wasn't going to let the bastards beat me.) and the flying carpet mod later they finally relented but changed their rules and said I was only allowed to upload maps (The cheating pricks.). They also stipulated I had to be a map scrutineer of which there has only been one map submitted since. I wonder if they will ask me to scrutineer yours ;<) So make three small maps 16 or 20 by (as rugged as you like), two small images for each 250x180px and a jazzy readme. they have some template .html files which is what mine started as and I have slowly changed them over the course of time. Read the uploading to the lex thread at sc4d. Then submit them, it may take a few months. Mine took about 8 months but some have been trying for years and others just give up. See I said you had an eye for detail. Yes the Archangel'sk map was made with dem that was made from Russian topo maps. That is the only dem available for such northern climes as the SRTM all stops at 60 degrees. Nobody else ever notices these things. I've got about 700gigs of dem on file. Mmmm Don't mind the odd bottle myself. Chin chin Cheers drunk(as usual)
  19. So as a beginner, working with the real highway (RHW) puzzle pieces can be pretty daunting, especially when trying to create interchanges. As a beginner myself I wanted to construct an Avenue/Real Highway interchange, but after a lot of trial and error was unsuccessful. That is, until I cracked it. This Avenue/Real Highway interchange tutorial is aimed at the novice SimCity player who wants to get into the RHW a little more and needs a step-by-step approach to creating a standard, but useful interchange. Warning: The following post contains a lot of pictures, but hopefully will be helpful. Step 1. Choose a real highway starter piece from the menu highway menu. I decided to use the 8S starter piece. Press tab to find the correct puzzle piece. You can use any of them, but I chose to use the 8S for this tutorial. Make sure that the yellow lines are in the middle (important for direction of traffic) and place on the ground. Using the RHW2 from the highway menu, drag through the starter pieces and elongate the highway to the desired length. This tutorial requires a bit of space, so drag at least 30 tiles or so. Now go to your hole digger lots (found under misc. transportation) and choose the 15m sunken hole digger lot. Place the digger with the arrow facing away from the highway, 4 tiles out, and repeat on the opposite side of the highway, opposite the other digger. Starting one tile towards the highway, drag a road through the digger lot for 10 tiles. Do the same on both sides. There should now be a sunken alley. Using the road piece, press individually to bring the sunken level of road to the same height. This should be 2x5 tiles facing away from the highway. Once level, bulldoze them. Next, remove a section of the highway in the middle of the sunken holes to leave space for the tunnel. Choose the avenue and then place it on the sloped terrain and drag to the opposite side. If done correctly, a tunnel will be formed. Then drag the end pieces of the avenue out at least 15 tiles or so. Then drag the highway back by using RHW2 to form the completed highway again. Now we have completed a sunken avenue under a highway and with the first stage complete we can now move onto the ramps. Using the RHW2, move 4 tiles along the highway from the middle of the avenue. Now we are going to create a ramp. This is a 3-step motion. 1. Drag out 1 tile, 2. Drag up 1 tile. 3. Drag outwards 2 tiles. This should build a B1 ramp. This ramp can also be found in the ramps puzzle pieces and just placed on the highway, but this is a great and fast way to place a ramp exactly where you want it. Next, click on the build highway and ramps button and then scroll down to the real highway wide radius smooth curve puzzle piece. Press tab until you get to the MIS-45 degree piece. The puzzle piece should be placed so it is 1 tile out and 1 tile down from the end of the ramp piece. Make sure that the yellow line is on the same side as the ramp and place on the ground. It is important to keep the yellow lines on the same side as each other at all times. Using tab, scroll through to the 90-degree smooth puzzle piece and orientate it with the yellow line on the same side as the 45-degree piece and place it 2 tiles down from the 45-degree piece. Next, go to your road/rural highway puzzle pieces. Press tab until you get to the Ave-4 type B1 entrance. Move over to the avenue and place it 6 tiles from the entrance of the tunnel. Using the RHW2 piece, drag from the ramp diagonally 2 tiles so it squares up to the 90-degree puzzle piece. Using the RHW2, drag from the now elongated avenue ramp to connect to the 90-degree puzzle piece. These should now connect. Now drag diagonally from the highway ramp to the top of the 45-degree puzzle piece and they should also connect. The final step is to use a filler piece (found under the highway icon). Make sure to orientate the yellow line the same as the other MIS pieces and connect the 45 degree puzzle piece to the 90 degree puzzle piece. Now you have a complete and finished loop. Go to the other side of the highway and repeat the process to create a secondary loop. Now the final stage is to connect the final 2 ramps to complete the interchange. Using the same technique earlier to create a ramp on the highway (drag out 1 tile, up 1 tile, out 2 tiles). 12 tiles from the middle of the tunnel create a B1 ramp. Drag the ramp at a diagonal using the RHW2 towards the avenue. Now go back to your road/rural highway puzzle piece and press tab to get to the Ave-4 type B1 puzzle piece. This should be placed at an angle so when placed it can be dragged diagonally to meet up with the highway ramp. In this instance it is 11 tiles from the entrance of the tunnel. Drag the ramps together to form a straight diagonal connection. Repeat the process on the other side, opposite the other curved interchange you made. There we go, hopefully now you have a completed Avenue/Highway interchange ready to be used. Edit 1 - as mentioned by @Jeffrey500, there are a couple of missing links that I discovered and moved further up the highway. These are an exit ramp in north moving traffic and an entrance ramp on south moving traffic. Here is a quick diagram to show how you could incorporate them to this interchange. Still learning
  20. I'm working on custom street lights for Network Skins. I developed a small code snippet that works similar to Sub-Buildings Enabler. But instead of setting the sub building property, it adds light effects to props (Street lights are just props). That means you can start making your own street lights right now (will publish the mod in less than 24h): Create a new mesh for the light. The column should be at 0|0|0, the road is located at -x Import the prop in the asset editor Set "Create Ruining" and "Use Color Variations" to false Change the category of the street light to "Road": With ModTools scene explorer (CTRL + E), use the upper search bar to search for "Road". Expand the NetCollection on the left Expand "m_prefabs" > "m_prefabs.[0] = Basic Road" on the right Scroll down to find "m_class". Press the "Copy" button on the right Now use the search bar and search for "Tool Controller" Expand "ToolController" > "m_editPrefabInfo" Scroll down to find "m_class". Press the "Paste" button on the right. "m_class" should now be set to "Small Road (ItemClass) Save the prop (write down the names you entered) Now follow the Sub-Buildings Enabler tutorial to setup the light effects xml config: crp and xml must be in the same directory (like mentioned in the tutorial) The name of the file must be "LightPropsDefinition.xml" instead of "SubBuildingsDefinition.xml" The content must look similar to this Quick explanation of the file: "Large Sodium-vapor Street Light" is the name of the prop (like the name of the main building in sub-buildings enabler) "Street Light Medium Road" is the name of the existing light effect you want to apply (here is a list of all available light effects) The effect name also defines the light color. Position and Direction define the location of the light Find light effect names with Mod Tools: Edit: List can be found here: https://gist.github.com/boformer/4197263476ba10198501
  21. So, those FLUPs in NAM really had me confuzzled for a while. I'm going to attempt a tutorial which I wish I could've found whilst I was having difficulties in learning this concept. I simply don't do well with videos as instructions and all the nicely written tutorials I found have long since lost their pictures. For all the peeps who already know these basic steps I'll ask if I'm over thinking this and how could this be improved. For peeps using NAM for the first time I hope this proves helpful. (I'm using way more pics than is prolly necessary cause I like seeing each actual step and the change which occurs.) Let's start with the thriving metropolis of First FLUP (Population: 5). It's simply a Road running East/West with a house on the west portion. A Street runs North/South intersecting the Road to the east of the house. At the north end of the Street is a farm. Using the Route Query tool we see that 2 pedestrians walk to the farm and one freight truck goes south from the farm, turns west, and drives off the map at the Road's neighborhood connection. What I'm going to do is for a proof of concept rather than a suggestion on city layout. First I bulldozed the Street connections both north and south of the East/West Road. (Bulldoze one tile on either side and leave the Road still fully intact.) Next I select FLUP from the Transportation Tools / Build Roads menu and hover it over the Road where the intersection used to be. By default it is the Ramp for underground Road. Now I tap the Tab key until it changes to Diagonal underground route under straight Road. This is a preliminary step to get to what I really want. (This part was not at all intuitive to me.) Then use the End key until it changes to Straight underground route under straight Road. (It looks like a narrow dirt path running perpendicular to the Road.) And here it is after plopping. (It now looks like a normal road with the same kind of sidewalks you get next to commercial zoning.) Going back to the Transportation Tools I select FLUP again. (It's back to the Ramp for underground Road.) I position it one square north of the Road at the south end of the Street in the empty space. Press Tab key until it changes to Street ramp connecting to underground road. Press Home key once and it rotates to the proper orientation: Now click to plop it and we see the Street going down a ramp which looks like it's going under the road. With this particular FLUP still on the cursor I moved directly south of the Road in the space between the rest of the Street. At this point I thought I could just use Home or End keys to rotate it into position, but NO, that didn't work. So, I moved south one more tile so it was on top of the Street and then it auto rotated. Next I moved it back one tile north next to the Road. And here it is after plopping: To test that it would actually allow traffic thru, I then connected the east end of the Road with the south end of the Street forming a small square with them: And using the Route Query tool we see 2 cars and 1 freight truck are now using the FLexible UnderPass. Edit: Useful tip suggested by @Mandarin(a): Use Shift-Tab to cycle thru the items in reverse order. This is especially useful if you hit Tab too many times and want to go back to a previous option. Note: This is the ideal part of a community helping each other. I was aware of this, but it did not occur to me to include it when I was writing this guide. Edit 2: FLUPs can be use as underwater tunnel too. See Ro-Bo's: How to Build Underwater Tunnel Using Flexible Underpasses (FLUPs). Edit 3: I've added a Tutorial for Road under Rail to this thread. Edit 4: Added Tutorial for Avenue under Rail.
  22. From this thread: With this thread being 8 years old, I wonder if I'm crying in the dark... That file, by thy451, speaks of the same file here at ST but in HTML version with pictures. Anyone knows anything about it ? Mod Note: Please don't re-start 8 year old threads, if you need to refer to it, start a new one with a link to the old one, I've split the topic and done this for you in this instance.
  23. How to Do It (S3-22-E)

    How to Do It - Explain the steps to do something relating to a city-building game Season 3 - Challenge #22 - Extended (27 days) - Results Announced Here! Thanks to @CorinaMarie for the challenge idea. Make no mistake, there are many incredible contributions shared daily amongst our community. Files on the STEX, images in City Journals, and guides in the Forums and Omnibus, just to name a few. But whatever the format, there is always a process to follow. The road to reach an end product can greatly vary in complexity. From a simple custom interchange, some intricate MMP work, or a complex BAT with dazzling night lighting, along with all the bells and whistles! However quite often, particularly in the case of images, the exact creative process remains undocumented. We only see the end product, not the steps the author took to achieve the finished creation. As you've probably already guessed, this challenge is rather different than usual. Instead of (simply) creating an image or content item, we're asking you to produce a tutorial explaining the process. How do you get from A to B? Aim to make your tutorial detailed enough to include all necessary steps, while still being easy enough for other people to accurately follow. By doing so, it should be possible to reproduce the desired result, at least to a satisfactory standard. Specifications Your tutorial must be posted inside the Omnibus: http://community.simtropolis.com/omnibus/ Difficulty: It can be simple, complex, or something in the middle. If you like, you may base the tutorial around one of your own entries (image or content), produced from a current or previous Simtropolis Challenge. Include objectives at the start. What is the end goal? The tutorial should flow in a step by step format. It may be composed using a selection of text, pictures, diagrams or videos. Multiple parts (articles) may be posted if needed. Check formatting is suitable. Check spelling and grammar for accuracy. See the Possible Ideas section below for a few examples. This is an Extended challenge running for 27 days. Submission Requirements Your tutorial explains how to follow a process, and achieve a desired end result incorporating a city-building game. You may use any city-building game -- including SimCity 4, Cities: Skylines, SimCity (2013), and CitiesXL / XXL. For the purpose of voting, please check your tutorial has an appropriate title. Your tutorial must be created solely by yourself, without any assistance from anyone else. As well as the text, this also applies to any included media (e.g. images, diagrams and/or video). You may NOT enter a tutorial you've previously posted before the start of this challenge (16th December 2016). You may continue editing or adding to your tutorial, up until the start of voting. To qualify for entry, please ensure your tutorial is posted in the Omnibus, and complies with these requirements. Possible Ideas Here are a few ideas to get you started, just giving examples of ways to go about this challenge: Note: The following is not a complete list, or a requirement: How to: Create an in-game image, including any editing. Create an item of custom content (e.g. building, lot, mod or map). Execute an in-game strategy (e.g. zoning, funding). Use an in-game function (e.g. MMPs for SimCity 4). Use an item of custom content. Use a custom content tool, or other program related to the chosen game. Install or manage custom content (e.g. plugins folder organisation). Perform a technical task related to the chosen game (e.g. graphics, command line parameters, optimisation). Play the chosen game. (Just the basics!) Leaderboard Rankings A new leaderboard system is currently running for this season. This has been designed to incorporate all challenges, linking with each set of results. Each place in a challenge has points on offer -- the higher you finish, the more points you gain. Then at the end of the season, prizes will be given out to the top 10 in the final standings, with the winner being crowned the Grand Champion! This Extended challenge is eligible for the "Overall" and "Weekly & Extended" leaderboards. Full details and the current standings can be viewed in the following topic: The winner will be the top ranked entry. Reputation prizes will be awarded based on the number of entries, and the overall average rating. See this topic for more info. For this Extended challenge, rep prizes will be given for both entries, along with points for the "Overall" and "Weekly & Extended" leaderboards. It'll be really interesting to see how this unique challenge pans out. Good luck!
  24. AutoHotkey as a Modding Tool

    From the album How to Do It (S3-22-E)

    Before voting, please remember to: [View the Tutorial] This tutorial is aimed towards any custom content creator who regularly, or semi-regularly has to perform repetitive tasks in the Reader or any other application. Simple text scripts can be used to quickly and easily automate such tasks. Skills learned can also be applied to any program or procedure outside of Sc4 also. This tutorial is worded simply so those with zero programming experience can complete their first script. This tutotial only covers a few of the basics. There are hundreds of more advanced functions for more experienced users. The AutoHotkey Help file is a great resource for this.
  25. How to make a visually pleasing slope

    From the album How to Do It (S3-22-E)

    Before voting, please remember to: [View the Tutorial] …exactly the way you want it, without the help of a slope mod. Yes, it‘s right. We’ll attempting the almost impossible: Creating a slope that looks good, exactly the way we want it, without resorting to a slope mod. The goal of this tutorial shall be: We will be (for demonstrational purposes) making an overpass with the height of 7.5m over a railway line, where the terrain rises exactly by 1.5m per city tile. (This requires making a slope that takes up 5 city tiles.)
×

Help Keep Simtropolis Online, Open & Free!

stexcollection-header.png

Would you be able to help us catch up after a bit of a shortfall?

We had a small shortfall last month. Your donation today would help us catch up for this month.

Make a Donation, Get a Gift!

We need to continue to raise enough money each month to pay for expenses which includes hardware, bandwidth, software licenses, support licenses and other necessary 3rd party costs.

By way of a "Thank You" gift, we'd like to send you our STEX Collector's DVD. It's some of the best buildings, lots, maps and mods collected for you over the years. Check out the STEX Collections for more info.

Each donation helps keep Simtropolis online, open and free!

Thank you for reading and enjoy the site!

More About STEX Collections