Jump to content
  • Announcements

    • Dirktator

      Got the wrong discs? Or didn't receive them in the mail?   06/20/2018

      For those who opted for physical discs -- if you donated between April - June and you received the WRONG discs or NO discs in the mail, please email stexcd@simtropolis.com and include your donation info such as Paypal transaction ID and we will get this rectified!
    • CorinaMarie

      Outages - STEX re-available to guests :)   09/21/2018

      Update: 25 Sept, 2018 @ 18:57 EDT With the success of Dirk's server tweaks we have now brought the STEX back online for guests. Their download speed will be unchanged from 500 kB/s, but we are temporarily adding a 10 second delay as well as one download at a time allowed. The 20 downloads per day limit will remain the same as it's always been. We'll see how this test goes and if successful then bring the Gallery back and later remove the additional temporary restrictions we've imposed for downloads. Update: 25 Sept, 2018 @ 13:20 EDT Dirktator our Webmaster has adjusted the site's server configuration in attempt to resolve the degraded performance. Should this provide a notable improvement, we will attempt to bring the STEX fully back online later this evening and see how it goes. Here's hoping! For now the STEX remains online to members only with the same download throttling in place. Update: 25 Sept, 2018 @ 08:00 EDT As previously mentioned we are temporarily adding a few limits for member downloads. Transfer speed will be dropped to 1,024 kB/s (previously 2,048 kB/s), one download at a time (previously unlimited simultaneous downloads), and a 10 second delay before the download starts (previously a zero second delay). Again, these are temporary measures we are taking in the hopes that it will keep the site from going totally offline. Update: 25 Sept, 2018 @ 07:15 EDT The site went totally unresponsive twice overnight. Cyclone Boom was able to get us going again. The underlying server issue is still eluding us. We will need to go the other direction in an attempt to balance member access to the STEX while not losing the site altogether. This means the planned reopening of the STEX for guest downloads will be postponed and we may need to place some temporary limits on members such as reducing the file transfer speed, the number of simultaneous downloads, and a short waiting time before the download starts. To be honest, this really sucks. On the other hand, any usable access to the files will be better than none at all. We appreciate everyone's patience while we struggle with these problems. Update: 24 Sept, 2018 @ 21:00 EDT All seems to still be working with quick response times. As mentioned below we will continue this test until tomorrow evening before adding guests back to the settings. Tis now my bedtime so please don't break anything while I sleep. But, if anything seems wacky, please post in the ST Bugs Thread. Update: 24 Sept, 2018 @ 19:45 EDT We've been up for one hour with this STEX test and so far server loads are looking good, page load times seem normal, and avatar hover overs are mostly zippy fast. The plan is to run with this configuration until tomorrow evening to give us plenty of time to see if the site stays responsive before we add the STEX access back for guests. (Rest assured, dear guests, we are not trying to force you to join ST. It's just that we have to figure out what has been causing the site to totally crash.) Update: 24 Sept, 2018 @ 18:41 EDT We've brought the STEX back online for members only as our next test. This test might also overload the site as there is some underlying bug which we have not yet identified. Both Cyclone Boom and I are here to keep an eye on the performance. Should ST get overloaded and go down you will first start seeing long page load times and eventually 522/524 errors from Cloudflare. At that point CB will work his magic and then you'll start seeing a 403 Forbidden error. (This means all access is blocked so the site can re-recover.) And then in about 10-15 minutes we'll bring it back without the STEX again should this bad stuff happen causing the aforementioned site crash. See also: My initial Bugs Thread post and CB's recent post there saying we are up in test mode for members. Update: 23 Sept, 2018 @ 22:22 EDT The site stayed up a wee bit longer, but still succumbed to whatever is causing the trouble. At this point we are taking the STEX and the Gallery offline, but will try to keep the forums going. Update: 23 Sept, 2018 @ 18:59 EDT Cyclone Boom has optimized all database tables which is sort of like defragmenting a hard drive. We've brought the site back online and are hoping it helps with the problems. The previous message (below) still applies until we are sure everything is fixed. Previous message: Simtropolis is experiencing random spikes of heavy server load and excessive lag to the point the whole site becomes unresponsive. We've been taking it offline to let it catch up with the load and then bringing it back. This is the best stop gap measure we have at the moment. If you are creating a new topic or post I suggest making a copy and paste to a text editor before clicking the submit button as we can't be sure it won't go offline at the wrong moment for you.
    • CorinaMarie

      A Separate Bug   09/24/2018

      We are also having trouble with the Contact Us thinger. I do receive them (and they come to me as an email), but now when I reply they immediately bounce back. This could be due to peeps providing invalid email addresses or it could be an actual problem. I do reply to all of them so if you don't get a response within 24 hours you might consider sending me a private message here on ST instead. -Cori (PM me here.)

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 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 & Lot Workshop
    • SC4 Modding - Open Discussion
    • NAM & Transit Networks
  • SimCity (2013)
    • SimCity (2013) General Discussion
    • SimCity (2013) Modding - Open Discussion
    • SimCity (2013) Region Games
    • SimCity (2013) Showcase
    • SimCity (2013) Technical Help Q&A
  • 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
  • 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
  • Furry Community's Topics
  • New Washington's Topics
  • Everything about details's Topics
  • CityBuildingMasters X's Topics
  • City Journal Club's Topics
  • City Journal Club's Photo Shopping, Type Faces, Page Layout !
  • City Journal Club's Writing
  • Coolio Club For Cool Children's Topics
  • Atlantic Energy Co.'s Topics
  • Micropolis's Topics
  • City-Builders.info's Topics
  • SimCity Polska Organization'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
  • SimCityPolska Files
  • 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
  • Furry Community's Files
  • New Washington's Files
  • Everything about details's Files
  • CityBuildingMasters X's Files
  • City Journal Club's Files
  • Coolio Club For Cool Children's Files
  • Atlantic Energy Co.'s Files
  • Micropolis's Files
  • City-Builders.info's Files
  • SimCity Polska Organization'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
  • Furry Community's Events
  • New Washington's Events
  • Everything about details's Events
  • CityBuildingMasters X's Events
  • City Journal Club's Events
  • Coolio Club For Cool Children's Events
  • Atlantic Energy Co.'s Events
  • Micropolis's Events
  • City-Builders.info's Events
  • SimCity Polska Organization's Events

Skype


Interests


City-building game(s)

Found 84 results

  1. Hello guys i just have done some research before start a new city and thought about share with you the best of what i found first thing is this vídeo, explaining How to make an attractive city, by the School of Life. this video shows 6 topics about how a city can be prettier : not be so chaotic or so ordered must have visible life must be compact must have easy orientation and some mistery must have a ordered scale must have local places to go [Click to see the video] take a look and post your opinion maybe i make some posts like this one, what do you think about it?
  2. Greetings Simtropolis mapping community. I wanted to raise the question regarding the creation of geographical region maps. in the 'mapping-terraforming' section i found a tutorial about this put together in 2011, but it is unfortunately rather outdated and doesn't necessarily hold up to contemporary processes. I have been independently working towards the goal of taking DEM data and converting it into sc4 maps with varying levels fidelity and success. given the difficulty of the journey (many fruitless days spent scouring google searches and reading 5-10 year old tutorials full of links for websites that no longer exist) i though i would attempt to provide my own tutorial on the process i have undertaken. Before doing so i thought i should do a double check with the community just to ensure i haven't missed anything obvious (Perhaps a 2018 current mapping process for working with DEM's?). I can see that there has been a lot of discussion to this end including threads and tutorials started by @Izidor44 and @drunkapple, though many of those remain open ended, and that was many years ago. So, if anyone happens to have a contemporary tutorial process for processing geographic based regions i'll be pleased to see it. In the meanwhile i'll keep plugging along with my process i have started and will also be pleased to share it when i have all my findings completed. Edit: The first video in the tutorial series is complete and starts the process of describing in detail what is DEM data.
  3. Welcome everyone! Today I want to present the second entry of my earthworks tutorial series! Today we're covering the basics of building a main, two-lane road into a town across rolling/undulating terrain! I would appreciate if forum members could give me some feedback on the tutorial entry's format. This time I'm posting a slideshow video, as it was easier to make than wrestling image hosting sites with a huge upload that was gonna have about 70 screenshots. For general discussions and polls on this tutorial series, visit: Mods featured: * Network Addon Mod 36: * BRF Tunnel and Slope Mod: * CPT Meadowshire Terrain Mod: http://sc4devotion.com/csxlex/lex_filedesc.php?lotGET=58 * CPT Meadowshire Coast Tree Mod: http://sc4devotion.com/csxlex/lex_filedesc.php?lotGET=60 * B98 Beach Extend Mod: * RVT Coast Mod 2009:
  4. The very first post of this tutorial series!! Earthwork Fundamentals 1: Starting a Town Welcome to Emeragrove!! Population: 0 Infrastructure: just a neighbor connection Trees: 0 Citizen complaints: 0 ...Huh....not a whole lot of action in here. Maybe we can change that! Our blank slate: a large city tile with a river running along the western side and rolling terrain on almost all of its land area. We will settle next to the head of navigation of the small river, highlighted by the saddle shape in red. We want to investigate the terrain characteristics in the area, we start by activating the “terrainquery” cheat (Ctrl+X, then write "terrainquery"). This allows us to obtain the tridimensional coordinates for any point within the city tile. We find that, towards the northwest of our view, the terrain’s elevation (y = 258.9 meters above SimCity level) is a meager 8.9 meters above the game’s sea level (250.0 meters). Moving towards the southeast, we find a slightly more elevated position, at 260.8 meters above SimCity level. We secure this elevation by plopping road tiles to form a flat surface we want to propagate via cut and fill. This matters because if the starting terrain is too low, the slope cannot be demonstrated effectively and Sims are at risk of losing everything to a river flood within the floodplain area. We then continue placing single road squares in a checkerboard pattern and emphasizing the boundaries of the terrain we intend to level off. One convenient way to do this is to plop a sufficiently long stretch of road squares along which we’ll be dragging the roads proper to level additional terrain along the stretch of squares. We keep dragging roads until covering an area sufficiently large to host our town’s historic center. Now, we zoom in towards an edge of the flattened terrain. As you can notice, the slope between the leveled terrain and the floodplain may be too steep for comfort or even safety (landslide risks, perhaps?). We can now fix that by dragging short stubs of road, starting at the flattened area’s edge. These stubs should be one square shorter than the distance needed to directly touch the floodplain. We continue this operation until we have the particular edge covered. Then we begin doing the same along the diagonal edge. Notice how the stub is dragged from the protruding corner of the tile.
  5. Greetings to all fellow mayors and Simtropolitan citizens! I want to present you a series of tutorials revolving around a very immersing part of the game: earthworks! Why? Because it's a very fundamental aspect of any construction in real life and can add aesthetic and functional depth to your cities. I came up with a series of tutorials I'll be developing for this purpose, ranging from the most fundamental aspects to highly demanding applications of in-game earthmoving to shape the destiny of your city. Perhaps the biggest gain players can get from mastering earthworks is making rugged terrain regions all that much more enjoyable. It may be tempting to always go with a very flat region to make building easy, but that approach makes players miss the opportunity of a challenging terrain resulting in a thrilling and wonderful landscape. I'll be making these based on my main ongoing region, the Sinnoh Region, as the one fundamental geographic element that defines it are its mountains. One favor I ask followers of this series is to avoid posting on the tutorial threads until they have been constructed. Their completion will be announced here and in the meantime, the corresponding comments can be made here. Finally, before we start, I would like everyone's feedback on which category should I tackle next after completing the fundamentals tutorial. ESSENTIAL TOOLS: Network Addon Mod, latest version (currently the 36, versions 34 and 35 will still be adequate). In particular, make sure to have the NAM hole digging lots, these are super important to do a lot of the required steps I'll be showing. Slope mode of your choice (in my case, the BRF Tunnel and Slope Mod). I recommend this one in particular because it's one of the most strict slope mods available for SimCity 4. I currently use an older version which still did not include a dedicated Real Highway (RHW) slope, but that isn't a problem for me as you'll all learn during the tutorials. Region with hilly, rolling and/or mountainous terrain--anything that isn't a super flat expanse of nothingness will do. God Terraforming in Mayor Mode (or if not your thing, use the cheat to activate God mode terraforming tools in Mayor Mode T U T O R I A L S E R I E S : A. EARTHWORKS FUNDAMENTALS: (in the making) Starting a town (Emeragrove): now available! Main local road (Emeragrove): screenshots available, pending writing Bridge across river (Emeragrove): upcoming Power lines (Emeragrove): upcoming B. EARTHWORKS APPLIED TO MAJOR TRANSPORTATION PROJECTS AND URBAN RENEWAL (future) Rural Freeway Segment (Route 203) Rural Freeway Interchanges (Route 203) River Diversion (Jubilife) Urban Freeway Retrofit (Jubilife) Median Mass Transit (Jubilife) Suburban Freeway Retrofit (Route 204) C. MOUNTAIN MADNESS (future) Difficult mountain crossing (Oreburgh-Pal Park) Mountain Railway (Oreburgh-Pal Park) Dam and reservoir (Pal Park) Mine expansion (Oreburgh) Tunnels across mountains (Route 216) D. COASTAL CHALLENGE (future) Seaport (Jubilife Port) Power Plant (Jubilife Port) Beaches (Hotel Grand Lake) City straddling the sea (Sunyshore) Building a linear breakwater (Seabreak Path) Building an island (Flower Paradise) Underwater tunnels (Jubilife)
  6. Hey all I was wondering the region map that is built into SC4 as the default tutorial is that map available to download and play? I messed around with it but it's proprietary to the tutorial so it's not really playable only as a tutorial. Thanks! Robdragon
  7. A Neat Little Tool to use with the "Raise the UI Mod" Here is a tutorial explaining how to automatically raise SimCity 4's user interface (UI) when switching to windowed mode. This may specifically be useful for those who wish to alternate between running SC4 windowed and in full screen. Please Note To achieve this, it requires copying and saving simple command line scripts (.cmd), and adjusting relevant paths. The problem being, when running the game windowed and with a custom resolution, you may notice the taskbar inconveniently overlays the UI like so: To workaround this limitation, in Windows it's possible to use the "Auto-hide the taskbar" option from Taskbar Properties. This does what it says, and makes the taskbar hidden from view when not hovered over. However, this requires toggling back the setting once exiting the game. So while that works it's not the most ideal solution since to run the game windowed, it may be desired to have quick access to the taskbar at all times. A means of fixing this is by raising up the UI slightly. Then the taskbar can still be seen in full view while not obscuring the lower-positioned menu options in the game. A useful mod which does exactly this is the appropriately named Raise the UI Mod. Which upon installation in Plugins, will solve the problem like so: However... What if you'd then wish to play the game full screen, or often swap between both modes? Perhaps doing so would be useful if needing convenient access to other programs while playing. But later would like to change over based on your monitor configuration, or to benefit from the reduced memory usage in full screen. At least from testing, I found there was around 18% less system RAM used in a fully loaded large tile. This can be done manually by moving the mod in and out of Plugins when needed. But in terms of automating the process, that's where my little command line scripts may come in handy. Should that sound of interest, keep on reading on... Note: This is really intended for those comfortable working with batch files, and so this may not be the ideal solution for everyone. Prerequisites SimCity 4 Deluxe / RH installed and patched at least to the EP1 update. Digital versions other than Origin should come fully pre-patched. Although Notepad or a plain text editor will do the job, I recommend using Notepad++ to benefit from syntax highlighting. A Windows operating system (this has been tested on Win 7). Download the Raise the UI Mod created by @warrior. A local folder created outside of Plugins. Setting Up First of all, the initial step is to decide where you'd like to store the mod when not needed. This will be a holding folder and can be anywhere outside from your Plugins folder. Then when running the game windowed, it'll be moved into your Plugins so then the UI is raised accordingly. So either create a new folder, or copy the path of an existing folder where Raise the UI Mod.dat can be stored. A simple way of copying the path is by right clicking the location bar in Windows Explorer: Then click the "Copy address as text" option as highlighted. At the top of both scripts (which we'll get to in a moment), there are 4 adjustable options: File=<File Name> Description: This is the file name name of the mod, so needn't be changed unless renaming the actual file. E.g. File=Raise the UI Mod.dat PluginPath=<Path> Description: The location inside your Plugins folder to contain the mod. This can be in the root or inside a subfolder structure of your choice. Unless modified it should be the one in Documents. Leave out quotes since those are added in the main body of the code. E.g. PluginPath=C:\Users\<Account>\Documents\SimCity 4\Plugins HoldPath=<Path> Description: Here is the location of the holding folder where the mod will be stored. Use the "Copy address as text" method described earlier to make sure this is correctly specified. It can be set anywhere of your choice, providing the folder is fully accessible. E.g. HoldPath=C:\Users\<Account>\Documents\SimCity 4\Hold UI Mod TheGame="" "<Game Location>" <Shortcut Parameters> Description: It wouldn't be any use without starting the game itself, and that's what this option does. Here there are 2 variables which can be tailored specifically. The location of the game's executable file, and also the parameters (switches) used to set a custom resolution, toggle windowed or full screen, force SC4 to run on a single core, skip the intro, or any other such options. E.g. Disc based game: TheGame="" "C:\Program Files (x86)\Maxis\SimCity 4 Deluxe\Apps\SimCity 4.exe" -CustomResolution:enabled -r1600x900x32 -w E.g. Digital game from GOG: TheGame="" "C:\GOG Games\SimCity 4 Deluxe Edition\Apps\SimCity 4.exe" -CustomResolution:enabled -r1600x900x32 -w For a custom resolution, this must be specified to the desired screen width and height. The above examples represent my own monitor's size of 1600x900 pixels. The x32 at the end is the bit colour depth, which in normal circumstances can be safely left as is. Those using Steam or other launchers may need to experiment with workarounds to start the game directly for this to work. The empty quotes ("") at the beginning are required since they pass a null title in the command. However the rest of the command can simply be copied over from an existing desktop shortcut Target line, with the format being identical. Note: Where applicable for it to be valid, the <Account> path must be changed to the name of your user account. Windowed Script Here is the script for running the game windowed. It does the following: First checks whether Raise the UI Mod.dat is located in your Plugins folder. If found, the game is started using any parameters specified. If not present, it moves Raise the UI Mod.dat from the holding folder to your Plugins, before starting the game. Should the file not be found in the holding folder, a message pops up in a command window making that known. For Example (Modify custom paths as needed) @Echo Off Set File=Raise the UI Mod.dat Set PluginPath=C:\Users\<Account>\Documents\SimCity 4\Plugins Set HoldPath=C:\Users\<Account>\Documents\SimCity 4\Hold UI Mod Set TheGame="" "C:\Program Files (x86)\Maxis\SimCity 4 Deluxe\Apps\SimCity 4.exe" -CustomResolution:enabled -r1600x900x32 -w If Not Exist "%PluginPath%\%File%" ( If Not Exist "%HoldPath%\%File%" ( Start "" cmd /C "Echo %File% not found in: &Echo( %HoldPath% &Echo( &Pause" Goto :End ) Else Move "%HoldPath%\%File%" "%PluginPath%" ) Else ( Goto :StartSC4 ) :StartSC4 Start %TheGame% :End Exit Important: For the game's parameters, it's essential the -w switch is used, or else the game won't be told to run windowed. Full Screen Script Here is the script for running the game in full screen. It does the following: Checks whether Raise the UI Mod.dat is located in your Plugins folder. If found, it moves the file back to your holding folder, then starts the game. If not found, it just starts the game, also using any parameters specified. For Example (Modify custom paths as needed) @Echo Off Set File=Raise the UI Mod.dat Set PluginPath=C:\Users\<Account>\Documents\SimCity 4\Plugins Set HoldPath=C:\Users\<Account>\Documents\SimCity 4\Hold UI Mod Set TheGame="" "C:\Program Files (x86)\Maxis\SimCity 4 Deluxe\Apps\SimCity 4.exe" -CustomResolution:enabled -r1600x900x32 -f If Exist "%PluginPath%\%File%" ( Move "%PluginPath%\%File%" "%HoldPath%\%File%" ) Else ( Goto :StartSC4 ) :StartSC4 Start %TheGame% Important: For the game's parameters, it's essential the -f switch is used here, or else the game won't be told to run in full screen. Saving the Scripts Both work by saving them as command line scripts with the .cmd file extension. This can be done using any plain text editor, including Windows Notepad. Personally as hinted above, I would recommend Notepad++ for the benefit of the code syntax highlighting. It also handily comes with many other features for manipulating text, featuring a powerful find & replace tool with regex ability (advanced search mode). But in terms of what's required here as a simple copy, paste and save to file, these are just little extras which you may find useful for other projects in future. The end goal is to have both scripts saved, ideally for convenience to the same folder. For instance: The actual task of saving is very simple. I'll describe the steps for both Notepad++ and Windows Notepad using the windowed mode code. However as this part may well be self-explanatory, feel free to skip the following instructions and continue onto setting up the desktop shortcuts. Using Notepad++ OR Using Windows Notepad Creating Desktop Shortcuts To run either of the scripts, it's possible by navigating to their folder and double clicking on them. This will do the job just fine. However for accessibility and since it's probably what you're already familiar with, I recommend linking each via a shortcut placed on your desktop (or wherever is convenient). Then there will be two shortcuts – One referencing the windowed script, the other for full screen. Step 1 of 3 First make a copy of your existing SC4 shortcut. Or if you don't have one already, go to your game's installation path and open the Apps subfolder. Then right click the executable file ( SimCity 4.exe ), and in the context menu choose: Send to > Desktop (create shortcut). Then make a duplicate copy so you've got two exactly the same. Rename accordingly to whatever you'd like them called. For example: For the next steps I'll explain the process with the windowed shortcut. Repeat the same for your full screen one... Step 2 of 3 The next task involves editing the Target path in the shortcut. Right click and open the Properties. Then remove the current path pointing to the game's executable. This is no longer needed because the script does this part, along with passing the parameters to set a custom resolution and toggle between windowed or full screen modes. Then paste in the path to the script like so: Note: This can be easily obtained by navigating to the script, holding the Shift key, then right clicking and choosing the Copy as path option. If you copied in a path which didn't contain spaces, the quotation marks will automatically be removed from the Target line upon saving and opening the shortcut Properties. Those are only needed to preserve a path should there be any spaces included. Step 3 of 3 Click Apply, then OK and close the shortcut. Repeat for the full screen shortcut or vice versa. At this point it's good to go, but there is an additional adjustment possible should you wish... Addendum A big thanks to @CorinaMarie for inspiration behind this idea, helping me with technical aspects, and also sharing many valuable suggestions along the way. There could be other uses with this or similar techniques. For example, to potentially expand and tailor scripts specifically to: Move another mod file in and out, such as the Diagonal Bridge Enabler. Control sets of custom content by moving multiple files in and out of your Plugins folder as needed. Have a multiple choice option in the command line for using certain shortcut parameters. Log the time when starting SC4 to keep track of how long you're in the mayor's office. Create incremental backups of your Regions before starting the game. So that brings this tutorial to a conclusion. Once you've saved both scripts and created the shortcuts, the game can then be fully enjoyed in either full screen or windowed mode with a simple double click. Hopefully this may come in useful and even inspire other possibilities. Be creative! Any feedback, comments or questions welcome.
  8. Where can i find a most basic how to tutorial in using NAM RHW? Whats the proper set up for connecting neighbors using NAM for example 8C? Currently overwhelmed.
  9. Version 1.0.0

    215 Downloads

    Source Code of the Make Historical Mod Tutorial for Cities: Skylines. Created with Visual Studio 2017
  10. 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
  11. Version 1.0.0

    111 Downloads

    Source Code of the Show Limits Mod Tutorial for Cities: Skylines. Created with Visual Studio 2017
  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

    185 Downloads

    Source Code of the Road Tree Replacer Mod Tutorial for Cities: Skylines. Created with Visual Studio 2017
  14. 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. Note: If you are using a Mac, you may have to add the System.Xml dependency to your project 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:
  15. 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:
  16. 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:
  17. 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
  18. 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
  19. 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)
  20. 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;
  21. 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.
  22. 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
  23. 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.
  24. Hello skyliners, Because you Liked my video: https://youtu.be/3LqNaP5nruo with the Hypnotic tunnel and wanted to see a tutorial, then I did one and did my best to make it easy. Hope you will enjoy it and create some crazy tunnels! Cheers!
×

Thank You for the Continued Support!

Simtropolis relies mainly on member donations to continue operating. Without your support, we just would not be able to be entering our 15th year online!  You've really help make this a great community.

But we still need your support to stay online. If you're able to, please consider a donation to help us stay up and running, so that we can help keep bringing SimCity players together to share our creations.

Make a Donation, Get a Gift!

Expand your city with the best from the Simtropolis Echange.
Make a donation and get one or all three discs today!

stexcollection-header.png

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