## About PR Adds an industrial themed away site for Odyssey scenarios. The map starts with a shuttle, broken by a randomized destruction feature. Actors or the crew may choose to repair it to make it fly once more ### Detailed Changelog <details><summary>Details</summary> <p> - Added a new map_effect, randomized destruction. It comes with two varieties and different impact ranges. The way it work is the effect chooses a random amount of turfs in the area it's placed on, and calls `ex_act` on applicable contents in the turf. - Added unused sprites for low railing and documented relevant functions in the existing code. - Made it so when a railing has an open end that doesn't connect to anywhere, it'll apply an end cap, making it look more smooth. - Added ceiling lattices. - Adjusted unit tests to avoid conflicts that may occur with ceiling lattices. - Fixed a bug where the Odyssey subsystem repeatedly added lastly loaded z-level to the scenario z-levels, instead of all relevant levels to the site. This was causing issues in Odyssey maps with shuttles. - Fixed hydrogen tank not using its sprite. Also recoloured the tank to match modern hydrogen canister colour. - Fixed `/obj/machinery/door/airlock/maintenance` not using its intended appearance. </p> </details> ## Images <img width="4128" height="2528" alt="StrongDMM-2025-11-10 21 33 47" src="https://github.com/user-attachments/assets/09d8b671-457c-4ec5-88ac-e503641a0531" /> <img width="3424" height="2016" alt="StrongDMM-2025-11-10 21 34 27" src="https://github.com/user-attachments/assets/943b8529-7f2a-41db-a7be-e57d5d30ead7" /> <img width="1312" height="800" alt="StrongDMM-2025-11-10 21 34 52" src="https://github.com/user-attachments/assets/f665800a-367b-466e-a16e-a6f0b122e3bd" /> <img width="997" height="999" alt="Screenshot_54" src="https://github.com/user-attachments/assets/c06667c6-0dfc-4dc4-af67-821f36ad2933" /> <img width="997" height="1001" alt="Screenshot_55" src="https://github.com/user-attachments/assets/848a2847-9eb0-450a-87e9-08c371aaf78a" /> <img width="998" height="992" alt="Screenshot_61" src="https://github.com/user-attachments/assets/e6174cb5-d4d6-4afc-82ab-bbf412eda607" /> <img width="998" height="990" alt="Screenshot_63" src="https://github.com/user-attachments/assets/cc838bdc-9e22-4aed-ad16-0f8722442b8a" />
maplint
maplint is a tool that lets you prohibit anti-patterns in maps through simple rules. You can use maplint to do things like ban variable edits for specific types, ban specific variable edits, ban combinations of types, etc.
Making lints
To create a lint, create a new file in the lints folder. Lints use YAML, which is very expressive, though can be a little complex. If you get stuck, read other lints in this folder.
Typepaths
The root of the file is your typepaths. This will match not only that type, but also subtypes. For example:
/mob/dog:
# We'll get to this...
...will define rules for /mob/dog, /mob/dog/corgi, /mob/dog/beagle, etc.
If you only want to match a specific typepath, prefix it with =. This:
=/mob/dog:
...will only match /mob/dog specifically.
Alternatively, if you want to match ALL types, enter a single *, for wildcard.
banned
The simplest rule is to completely ban a subtype. To do this, fill with banned: true.
For example, this lint will ban /mob/dog and all subtypes:
/mob/dog:
banned: true # Cats FTW
banned_neighbors
If you want to ban other objects being on the same tile as another, you can specify banned_neighbors.
This takes a few forms. The simplest is just a list of types to not be next to. This lint will ban either cat_toy or cat_food (or their subtypes) from being on the same tile as a dog.
/mob/dog:
banned_neighbors:
- /obj/item/cat_toy
- /obj/item/cat_food
This also supports the = format as specified before. This will ban /mob/dog being on the same tile as /obj/item/toy only.
/mob/dog:
banned_neighbors:
- =/obj/item/toy # Only the best toys for our dogs
Anything in this list will not include the object itself, meaning you can use it to make sure two of the same object are not on the same tile. For example, this lint will ban two dogs from being on the same tile:
/mob/dog:
banned_neighbors:
- /mob/dog # We're a space station, not a dog park!
However, you can add a bit more specificity with identical: true. This will prohibit other instances of the exact same type and variable edits from being on the same tile.
/mob/dog:
banned_neighbors:
# Purebreeds are unnatural! We're okay with dogs as long as they're different.
/mob/dog: { identical: true }
Finally, if you need maximum precision, you can specify a regular expression to match for a path. If we wanted to ban a /mob/dog from being on the same tile as /obj/bowl/big/cat, /obj/bowl/small/cat, etc, we can write:
/mob/dog:
banned_neighbors:
CAT_BOWLS: { pattern: ^/obj/bowl/.+/cat$ }
banned_variables
To ban all variable edits, you can specify banned_variables: true for a typepath. For instance, if we want to block dogs from getting any var-edits, we can write:
/mob/dog:
banned_variables: true # No var edits, no matter what
If we want to be more specific, we can write out the specific variables we want to ban.
/mob/dog
banned_variables:
- species # Don't var-edit species, use the subtypes
We can also explicitly create allowlists and denylists of values through allow and deny. For example, if we want to make sure we're not creating invalid bowls for animals, we can write:
/obj/bowl/dog:
banned_variables:
species:
# If we specify a species, it's gotta be a dog
allow: ["beagle", "corgi", "pomeranian"]
/obj/bowl/humans:
banned_variables:
species:
# We're civilized, we don't want to eat from the same bowl that's var-edited for animals
deny: ["cats", "dogs"]
Similar to banned_neighbors, you can specify a regular expression pattern for allow/deny.
/mob/dog:
banned_variables:
# Names must start with a capital letter
name:
allow: { pattern: '^[A-Z].*$' }
help
If you want a custom message to go with your lint, you can specify "help" in the root.
help: Pugs haven't existed on Sol since 2450.
/mob/dog/pug:
banned: true