Changes

Jump to navigation Jump to search

Modding

3,241 bytes added, 2 months ago
Common folder: +FIOS for Solar System Initializers!?
This guide is intended to lower the entry barriers to the world of Stellaris modding. However, there is still a learning curve to it, and it cannot replace the need to read some working vanilla code, and do lots of trial and error experimentation!
<div style="float: right;" class="mw-collapsible">{{ModdingNavbox}}</div>
__TOC__
{{Template:ModdingNavbox}}== Guidelines ==
==Guidelines== *'''Create a mod for your modifications''': use a [[#Mod_structureMod structure|personal mod]] even for small changes, and never directly modify the game files in the Steam Stellaris folder, as they may be overwritten without warning.*'''Use a good text editor''' (recommended: [https://code.visualstudio.com / Visual Studio Code]) to edit files and search into multiple files. A good text editor can also format the displayed text so that braces can be collapsed if complete, and complete/incomplete pairs are highlighted.
*'''Use the Error.log file to get execution errors''': The log folder can be found right next to the mod folder. Good Editors usually have the ability to track changes to files from outside the program and prompt for a reload, thus showing you errors with one glance at the file. Note that some modifications need a game to be loaded or even the option to be used on screen/in the back-end before their code will run.
*'''Use CWTools for advanced validation and auto-complete''': CWTools is a syntax validator for Stellaris modding, developed as an extension for Visual Studio Code and also available for Sublime. Read the [https://forum.paradoxplaza.com/forum/index.php?threads/tool-cwtools-a-mod-validating-extension-for-vs-code.1066033/ forum post] by the developer for more info.
*'''Minimize overwrites of vanilla files''', unless that is your main goal or somehow necessary (on_action triggers). Adding separate files and use [[#Game structure|loading from folders]] whenever possible, to improve mod compatibility and maintenance. Your files can have any name, all files in the folder will be loaded by the game. So choose a prefix no one else will ever use like the name of your mod. Even DLC follows that pattern.
*'''Use a proper merge tool''' (like [http://winmerge.org/ WinMerge], or the Visual Studio Code Extension [https://marketplace.visualstudio.com/items?itemName=L13RARY.l13-diff L13 Diff] ), to [[Merging guide|merge between folders]], and update modified vanilla files to a new vanilla patch.
*'''Backup your work''' to avoid losing everything. Consider using a source control system like [https://git-scm.com/ Git] and a collaborative forge like [https://github.com/ GitHub] to manage team collaboration.
*'''Use UTF-8 encoding''' for text and .mod files.*'''Use UTF-8 with BOM''' for localization, and name list, and .mod files.
*'''Indent properly''' and, again, use a good text editor, to easily spot unclosed curly braces. Vanilla uses 1 tab for indentation rather than spaces.
*'''Use comments''' starting with a # character, to remember your reasons for writing tricky stuff.
==Mod management== 
The first steps of modding is getting to know where the mods are located, how they're structured and what to do when uploading your first mod!
===Mod folder location=== 
{| class="wikitable"
| '''! OS''' || '''!! Path'''
|-
| Linux || <code>~/.local/share/Paradox Interactive/Stellaris/mod</code>
|-
| Windows || <code>C:\Users\<Username>\Documents\Paradox Interactive\Stellaris\mod</code>
|-
| Mac OS ||<code>~/Documents/Paradox Interactive/Stellaris/mod</code>
|}
Mods from the Steam Workshop will be placed in <code>...\SteamLibrary\SteamApps\workshop\content\281990</code>, sorted by their Workshop ID.<br>
Mods from Paradox Mods will be placed in the mod folder location, named <code>PDX_*MOD_ID*</code>.
===File and folder structure=== 
Getting the structure set up correctly when creating a mod is essential for it to run properly.
This is the required structure inside the main mod folder:
* <code>modname.mod</code> - Includes the information used by the Stellaris launcher* <code>modname</code> - Folder where all the modified files are placed, in the same [[#Game structure|file and folder structure]] as the game folder
** Mod contents
** <code>descriptor.mod</code> - Required for the [[Patch_2Patch 2.4|new launcher]] added in patch 2.4. Ignored in the old launcher.** <code>thumbnailimage.pngext</code> - Must – PNG and JPEG files are supported. With the new 2.4 launcher, must be a PNG named <code>thumbnail, only PNG files supported.png</code>
<code>modname.mod</code> and <code>descriptor.mod</code> both contain the mod information that the launcher uses when displaying the mod and uploading it.<br>
These files are best kept identical The 2.4 launcher prefers <code>descriptor.mod</code> and will modify <code>modname.mod</code> to prevent any missing datamatch the information in <code>descriptor.mod</code>, however if the file is not found, though it'll use the information in <code>modname.mod</code>. The pre-2.4 launcher ignores it.<br>The <code>path="XXX"</code> is not needed in descriptor.mod.<br>
Note that folder and file names are case sensitive on Mac OS X and Linux.
 
'''modname.mod structure'''<br>
| <code>path</code>
| modname.mod: '''Yes'''<br>descriptor.mod: '''No''' (Ignored)
| Defines which folder is the mod's folder. It is relative to ''...\Documents\Paradox Interactive\Stellaris\'' folder.
| <code>path="mod/MyStellarisMod"</code>
|-
| No
| Specifies if the mod should be loaded after the listed mod(s), if they exist.<br>Very useful for submods or compatibility patches to make sure they overrule certain mods.
| <pre>dependencies={
"My Other Stellaris Mod"
"Not My Stellaris Mod"
}</pre>
|-
| <code>picture<code>
| <code>tags</code>
| No
| List of tags for [[Steam Workshop]]. Using tags besides the predefined ones may prevent uploading on Paradox Mods.<br>Warning: don't forget quotes for tags that contain spaces.| <pre>tags={
"Tag1"
"Tag2"
}</pre>
|-
| <code>supported_version</code>
| <code>remote_file_id="1234567890"</code>
|}
The data structure is similar to the proprietary Valve Data Format.<ref>VDF is a ad-hoc file format designed by Valve to support storage of hierarchical data, which is also used by [https://developer.valvesoftware.com/wiki/SDK_Installation Steam]. Open VDF parser: https://github.com/rossengeorgiev/vdf-parser/, [https://github.com/shravan2x/Gameloop.Vdf for .NET]</ref>
'''Example modname.mod file:'''<br><pre>name="Somemod"
path="mod/somemod"
dependencies={
picture="thumbnail.png"
remote_file_id="1234567890"
supported_version="2.4.*"</pre> === Adding a thumbnail ===
===Adding a thumbnail===
The Steam Workshop allows for a preview thumbnail picture that'll be displayed when searching for mods and as a preview picture if you haven't uploaded any, otherwise it'll be placed to the right of the preview pictures.<br>
It's recommended to make the thumbnail 512px × 512px at minimum, which is used by the workshop frontpage.<br>
Additionally, the thumbnail file should be under '''1 &nbsp;MB''' in size, otherwise, it will not be uploaded.<br>
Both JPEG and PNG are supported, and after 2.4, the image file must be named '''thumbnail''' and be of type PNG.
# Make sure the Stellaris launcher is closed, so that it doesn't revert your changes
You can always update the thumbnail at any time by updating the mod.
===Creating a mod=== 
You can use the game launcher to set up a the mod structure for you by following these simple steps according to your launcher of choice:
{| style="text-align:center;" class="wikitable"
|5||colspan="2"| Insert the relevant information and click '''Create Mod''' at the bottom
|-
|6||colspan="2"| Navigate to the [[#Mod_folder_locationMod folder location|mod folder]] and locate your mod folder
|-
|7||colspan="2"| Start modding!
|}
===Uploading and updating a mod=== 
Uploading and updating a mod follows the the same procedure, depending on your launcher of choice:
{| style="text-align:center;" class="wikitable"
|10||colspan="2"|Navigate to the mod service of choice and locate your mod;<br>'''Steam Workshop''', visit the [https://steamcommunity.com/app/281990/workshop/ Workshop] page, and locate the "Files you've posted" button by hovering over "Your Files" on the right<br>'''Paradox Mods''', visit the [https://mods.paradoxplaza.com/ Mods] page, login, and click "My uploaded mods" in the dropdown menu that appears when hovering over your name
|-
|+ style="caption-side:bottom;font-size:small;"|* - The inserted description will replace the current one used on the mod page!
|}
==Game data== 
* [[Console commands]], useful for debugging mods.
* [[Defines]], which allows you to influence some hardcoded vanilla behaviors
* [[Map]], used for pre-generated galaxy maps
==Game structure==
Below is a list of game files and folders, listed alongside the modding guide for each.
==== Stellaris/common/ ====
 {| class = "wikitable"
!Folder/File
!Summary
| [[Decision modding|Decisions]]
|-
| defines | Basic game behaviors and settings
| [[Defines]]
|-
| deposit_categories
| Deposit categories relevant to deposit generation.
| [[Planet Generation modding|PlanetsPlanet Generation]]
|-
| deposits
| Setup for the deposits of resources found on planetsas well as blockers spawned on habitable planets.| [[Planet Generation modding|PlanetsPlanet Generation]]
|-
| diplo_phrases
| lawsuits
| Unused.
|
|-
| leader_classes
| Definitions for map modes to be used in the galaxy view.
| [[Map Mode modding|Map Modes]]
|-
| megastructures
| Definations for megastructures.
| [[Megastructure modding|Megastructures]]
|-
| name_lists
| notification_modifiers
| A variation of static modifiers. They have no modifiers and can only be added to empires.
| [[Modifiers#Static_ModifiersStatic Modifiers|Static Modifiers]]
|-
| observation_station_missions
| planet_modifiers
| Spawn chances planet modifiers (f.e. lush, hazardous weather, etc.).
| [[Planet Generation modding|PlanetsPlanet Generation]]
|-
| policies
|-
| pop_faction_types
| Population faction types and personalities
| [[Pop Faction modding|Pop Factions]]
|-
|-
| section_templates
| Different Ship AI and how it actsContainer of components that consist actual ships.
| [[Ship modding|Ship]]
|-
|-
| <del>spaceport_modules</del> ''(Deprecated)''
|
|
|-
| Definitions for species rights.
| [[Species modding|Species]]
|-
| star_classes
| Types of solar systems (NOT individual stars themselves!)
| [[System modding|Systems]]
|-
| starbase_buildings
| Definitions for starbase buildings that each starbase can only have one of each of them.
| [[Starbase modding|Starbases]]
|-
| starbase_levels
| Definitions for starbase levels.
| [[Starbase modding|Starbases]]
|-
| starbase_modules
| Definitions for starbase modules.
| [[Starbase modding|Starbases]]
|-
| starbase_types
| Definitions for starbase types. To players, no effects, flavor only. To the AI, a starbase auto-build guide.
| static_modifiers
| Blocks of [[Modifiers]] to be added to objects.
| [[Modifiers#Static_ModifiersStatic Modifiers|Static Modifiers]]
|-
| strategic_resources
| Definitions for subject types.
| [[Diplomacy modding|Diplomacy]]
|-
| system_types
| Definitions for system types. No effects, flavor only.
| [[Technology modding|Technology]]
|-
| terraform
| Definitions for terraform methods.
| [[Planet modding|Planets]]
|-
| trade_conversions
| Definitions for trade value conversions.
| [[Economy modding|Economy]]
|-
| <del>tile_blockers</del> ''(Deprecated)''
|
|
|-
| tradition_categories
| Definitions for tradition groups.
| [[Tradition modding|Traditions]]
|-
| traditions
| Definitions for traditions.
==== Stellaris/events/ ====
 {| class = "wikitable"
!Folder/File
!Summary
| [[Event modding|Events]]
|}
 
==== Stellaris/flags/ ====
 {| class = "wikitable"
!Folder/File
!Summary
| [[Flag modding|Flags]]
|}
 
==== Stellaris/fonts/ ====
 {| class = "wikitable"
!File
!Summary
| [[Font modding|Fonts]]
|}
 
==== Stellaris/gfx/ ====
 {| class = "wikitable"
!Folder/File
!Summary
==== Stellaris/interface/ ====
 {| class = "wikitable"
!Folder
!Summary
==== Stellaris/localisation/ ====
 {| class = "wikitable"
!File
!Summary
!Guides
|-
| *l_simp_chinese.yml
| Contains Chinese localisation
| [[Localisation modding|Localisation]]
|-
| *l_english.yml
==== Stellaris/map/ ====
 {| class = "wikitable"
!Folder/File
!Summary
==== Stellaris/music/ ====
 {| class = "wikitable"
!Folder/File
!Summary
|-
| songs.txt
|
| [[Music modding|Music]]
|}
==== Stellaris/prescripted_countries/ ====
 {| class = "wikitable"
!Folder/File
!Summary
==== Stellaris/sound/ ====
 {| class = "wikitable"
!Folder/File
!Summary
|}
==Overwriting Specific Elements==
Occasionally, it is possible to overwrite a specific game element without needing to replace the entire vanilla file. In some cases adding an element with a similar identifier into another file will duplicate that element for the game. But in other cases, the version that comes first (First In, Only Served; FIOS)/last (Last In, Only Served; LIOS) will be used instead. <ref>https://forum.paradoxplaza.com/forum/index.php?threads/object-types-that-can-be-replaced-in-separate-files.990537/</ref>. The order in which files are processed is based on ASCIIbetical order of the filenames. If the names are the same, they'll be processed based on the reverse-ASCIIbetical order of the mod display name, with vanilla always being first (if it's at the ''top'' of the mod list, it'll be loaded ''last''). Note that if there are multiple mods with the same display name, only the one whose mod file comes first, will be used.
Note that this feature is not documented and thus might be subject to arbitrary changes between versions.
{{SVersion|2.25}} ===Common Folderfolder === 
{{box wrapper}}
{| class ="mw-collapsible wikitable" style="float: left; margin-left: 10px;"|+ A-N (Agendas -– Notification<br/>Name ListsModifiers)
|-
! File Type
! Overwrite<br/>Type
! Error Log
! Notes
| LIOS
| Object key already exists
|
|-
| AI Budget
| | |
|-
| Ambient Objects
| | |
|-
| Anomalies
| LIOS
| Object key already exists
|
|-
| Armies
| LIOS
| Object key already exists
|
|-
| Artifact Actions
| LIOS
| Object key already exists
|
|-
| Ascension Perks
| LIOS
| Object key already exists
|
|-
| Asteroid Belts
| | |
|-
| Attitudes
| LIOS
| Object key already exists
|
|-
| Bombardment Stances
| LIOS
| Object key already exists
|
|-
| Buildings
| LIOS
| Object key already exists
| Breaks auto-<br>generated modifiers
|-
| Button Effects
| | |
|-
| Bypass
| LIOS
| Object key already exists
|
|-
| Casus Belli
| LIOS
| Object key already exists
|
|-
| Colony Types
| LIOS
| Object key already exists
|
|-
| Colors
| | |
|-
| Component Sets
| FIOS
| Object key already exists
|
|-
| Component Tags
| | |
|-
| Component Templates
| FIOS
| Object key already exists
|
|-
| Country Customization
| | |
|-
| Country Types
| LIOS
| Object key already exists
|
|-
| Decisions
| LIOS
| Object key already exists
|
|-
| style="height: 92px90px" | Defines
| LIOS
| {{small|''[none]''}}
| The block the define is<br/>in must be included as well.<br/>E.g: ''NGameplay = {<br/>POLICY_YEARS = 10 }''
|-
| Deposit Categories
| | |
|-
| Deposits
| LIOS
| Object key already exists
|
|-
| Diplomatic Phrases
| | |
|-
| Diplomatic Economy
| LIOS
| Object key already exists
|
|-
| Diplomatic Actions
| LIOS
| Object key already exists
|
|-
| style="height: 47px45px" | Districts
| LIOS
| Object key already exists
| Breaks maxauto-<br/>districts modifiergenerated modifiers
|-
| Economic Categories
| | |
|-
| Edicts
| LIOS
| Object key already exists
|
|-
| style="height: 47px45px" | Ethics
| LIOS
| {{small|''[none]''}}
| Might break "selected<br/>ethic" graphic
|-
| Event Chains
| FIOS
| {{small|''[none]''}}
|
|-
| Fallen Empires
| | |
|-
| Game Rules
| LIOS
| {{small|''[none]''}}
|
|-
| Global Ship Designs
| FIOS
| A ship design already exists
|
|-
| Governments
| LIOS
| Object key already exists
|
|-
| ├───Authorities
| LIOS
| Object key already exists
|
|-
| └───Civics
| LIOS
| Object key already exists
|
|-
| Graphical Culture
| | |
|-
| Leader Classes
| LIOS
| Object key already exists
|
|-
| Mandates
| LIOS
| Object key already exists
|
|-
| Map Modes
| LIOS
| Object key already exists
|
|-
| Megastructures
| LIOS
| Object key already exists
|
|-
| Name Lists
||||-| Notification Modifiers| | |
|}
{| class ="mw-collapsible wikitable" style="float: left; margin-left: 10px;"|+ NO-Z (Notification ModifiersObservation Station<br/>Missions - War Goals)
|-
! File Type
! Overwrite<br/>Type
! Error Log
! Notes
|-
| Notification Modifiers
|
|
|
|-
| Observation Station Missions
| | |
|-
| style="height: 46px" | On Actions
| NO
| {{small|''[none]''}}
| Cannot modify<br/>existing entries
|-
| Opinion Modifiers
| DUPL/LIOS
| {{small|''[none]''}}
| <code>add_opinion_modifier</code> is LIOS
|-
| Personalities
| LIOS†LIOS
| Object key already exists
|
|-
| Planet Classes
| LIOS
| {{small|''[none]''}}
|
|-
| Planet Modifiers
| LIOS
| Object key already exists
|
|-
| Policies
| LIOS
| Object key already exists
|
|-
| Pop Categories
| LIOS
| Object key already exists
|
|-
| Pop Faction Types
| LIOS
| Object key already exists
|
|-
| style="height: 46px" | Pop Jobs| N/ALIOS [?]
| {{small|''[none]''}}
| Neither entry usedBreaks auto-<br>generated modifiers
|-
| Precursor Civilizations
| | |
|-
| Random Names
| | |
|-
| Scripted Effects
| LIOS
| Object key already exists
|
|-
| Scripted Localisation
| | |
|-
| Scripted Triggers
| LIOS
| Object key already exists
|
|-
| Scripted Variables
| FIOS
| Variable name taken
|
|-
| Section Templates
| FIOS
| Duplicate section template found
|
|-
| Sector Focuses
| LIOS
| Object key already exists
|
|-
| Sector Types
| | |
|-
| Ship Behaviors
| FIOS
| Behavior name already exists
|
|-
| Ship Sizes
| LIOS
| Object key already exists
|
|-
| Solar System Initializers
| FIOS
| Initializer already exists
|
|-
| Special Projects
| FIOS
| Object key already exists
|
|-
| style="height: 46px" | Species Archetypes
| LIOS
| Object key already exists
| Breaks bonusauto-<br/>trait points modifiergenerated modifiers
|-
| Species Classes
| LIOS
| Object key already exists
|
|-
| Species Names
| | |
|-
| style="height: 46px" | Species Rights
| LIOS
| Object key already exists
| Effect tooltips are<br/>independent of the effects
|-
| Star Classes
| FIOS
| |
|-
| Starbase Buildings
| LIOS
| Object key already exists
|
|-
| Starbase Levels
| LIOS
| Object key already exists
|
|-
| Starbase Modules
| LIOS
| Object key already exists
|
|-
| Starbase Types
| LIOS
| Object key already exists
|
|-
| style="height: 69px" | Start Screen Messages| FIOS| {{small|''[none]''}}| The first valid part for each<br>location will be used and the<br>rest discarded without issue.
|-
| Static Modifiers
| FIOS
| {{small|''[none]''}}
|
|-
| Strategic Resources
| FIOS
| {{small|''[none]''}}
|
|-
| Subjects
| LIOS
| Object key already exists
|
|-
| System Types
| LIOS
| Object key already exists
|
|-
| Technology
| LIOS
| Duplicate technology
|
|-
| └───Tiers
| LIOS
| |
|-
| Terraform (Links)
| DUPL
| {{small|''[none]''}}
|
|-
| Trade Conversions
| LIOS
| Object key already exists
|
|-
| style="height: 46px" | Traditions
| LIOS
| Object key already exists
| DUPL
| {{small|''[none]''}}
|
|-
| War Goals
| LIOS
| Object key already exists
|
|}
{{end box wrapper}}
FIOS - First in, only served
LIOS - Last in, only served
DUPL - Duplicates
NO – Cannot individually overwrite
Please note that these have not been everything could be tested extensively tested=== Localisation folder ===
===Localisation Folder===
Localisation is likely LIOS
A guide for overwriting localisation can be found [[Localisation_moddingLocalisation modding#Overwriting_Vanilla_TextOverwriting Vanilla Text|here]]. === Events folder ===
===Events Folder===
Events are treated as FIOS
=== Interface folder === Interface is likely LIOS ==Tools & utilities== * [http://notepad-plus-plus.org/ Notepad++] - Powerful editor to change files.* [http://winmerge.org/ WinMerge] - Contrasts the difference between two text files. Useful for updating mods.* [https://code.visualstudio.com/ VS Code] - Powerful, hackable, free open source editor from Microsoft.* [[Maya exporter]] - Clausewitz Maya Exporter to create your own 3D models.* [https://github.com/a1studmuffin/SpaceshipGenerator/ Spaceship Generator] - A Blender script to procedurally generate 3D spaceships* [https://forum.paradoxplaza.com/forum/index.php?threads/modding-tool-retalyx-stellaris-static-galaxy-generator-v0-9.951308/ Static Galaxy Generator] - A static galaxy generator and editor for your mods. ([https://steamcommunity.com/sharedfiles/filedetails/?id=699098812 How to use])* [[Steam Workshop]] - The place for where you can share your creations with other players.* [https://www.sublimetext.com/ Sublime Text] - Powerful, moddable, hackable text editor. Install packages as your needs evolve.
* [https://reddit.com/r/StellarisMods Stellaris Modding Subreddit]
* [https://discord.gg/bHVez2C The Stellaris Modding Den] - the central modding discord for Stellaris.* [https://docs.google.com/document/d/17knnrF_RzaVFo_s66360m7rCypSH6yMTymA8B0jpTog/edit Paradox Graphics - A Comprehensive Guide] - In-depth documentation for preparing 3d models for Clausewitz engine games like Stellaris. == Advanced tips == * For the bigger mods using a source control management tool (Git, …), it is handy to create a symbolic link between Stellaris mod folder and the working directory of the local repository, especially if the mod also has sub-mods. Note that you'll still need to copy the .mod file(s) manually, but they rarely change. Run the following command from the parent directory of main git folder, replacing:** <mod_path_name> by the value of <code>path</code> attribute from .mod file** <git_mod_folder> by the name of the sub-folder that contain mod data (folders common, decisions, events, etc…) mklink /J "%USERPROFILE%\Documents\Paradox Interactive\Stellaris\mod\<mod_path_name>" ".\<git_mod_folder>" === Testing Mods ===
==External links==Certain, more obscure console commands (that don't show up if you type 'help' in the console) are extremely useful in the process of testing a mod.[https:* <code>observe</code> – switches you to Observer Mode. You will no longer play as any specific character – this will allow the game to run for a long period of time, uninterrupted. It also makes every invisible trait and secret religion visible.* <code>run</forumcode> <filename.paradoxplazatxt> – runs script in a txt file located in the in the Documents install directory.com/forum/indexIt will be executed from the player's scope.php?threads/stellaris-dev-diary-31-modding-scripting-anomaliesUseful for testing tricky scripts – you can just have the script open in a different window, run it, tweak the script, save it, and run it again – it will be recompiled every time.923348* <small><s><code>reloadevents</ Stellaris Dev Diary #31 - Modding code> – reloads and recompiles every single event (Scripting Anomaliesmay take a while depending on your hardware)]. Useful if you want to tweak an entire event or chain of events without rebooting the game every time.<br /s>[https:not yet implemented</small>* <small><s><code>reloadloc</forumcode> – reloads the entire localisation table.paradoxplazaUseful if you spot a typo while testing your mod, or if you are trying to fit as much text in an event frame as possible.com</forums> not yet implemented</index.php?threads/stellaris-dev-diary-32-modding-art.924762/ Stellaris Dev Diary #32 - Modding art]small>
More [[Console commands]] are available on the main page, and are very useful for more specific alterations like adding lovers or killing people. == External links == [https://forum.paradoxplaza.com/forum/index.php?threads/stellaris-dev-diary-31-modding-scripting-anomalies.923348/ Stellaris Dev Diary #31 – Modding (Scripting Anomalies)]<br>[https://forum.paradoxplaza.com/forum/index.php?threads/stellaris-dev-diary-32-modding-art.924762/ Stellaris Dev Diary #32 – Modding art] ==See also==
*[[Mods]]
<references />
<br /><br />{{Template:ModdingNavbox}}
[[Category:Modding|#]]
Autopatrol
102
edits

Navigation menu