Files
Bubberstation/code/datums/elements/mirage_border.dm
Time-Green a47835a04f 1X3 ICEBOX | Wilderness Expansion (Now not extremely slow!) (#91920)
## About The Pull Request
Turns the surface z-level of icebox into a 1x3 area, effectively adding
2 wilderness new z-levels surrounding the station

Because it's not always clear to other people what I'm talking about,
this is what I mean with making the surface level a 3x3 z-level

The wilderness z-levels are gridlinked, instead of crosslinked, which
just means the connections are consistent and not randomized. If you
keep going right, you will always end up where you started again,
eventually. This also removes the black border around the surface icebox
z-level (cause you can just go there now)

**Wilderness levels**
I've added some Z-level templates that can be generated. They're
incredibly basic, but all can spawn runes on them as well.
- Snow planes (5x)
- Ice planes (1x)
- Forest planes (1x)
- Mountain planes (1x)

I've also tweaked surface generation quite a bit. It being completely
covered in bones always felt weird, and the intersparsed rocks and
chasms never sat right with me. The default overworldgen is now more
like the Forested trait, but with more sparse trees.

All of this is modular btw. You can increase the amount of z-levels,
make any space z-level be unrandomized gridlinked or add your own
wilderness z-levels (either to your own map or icebox)

## Why It's Good For The Game
Icebox exploration is kind of depressing. We have this unique setting,
but we can't really go anywhere? You can go down and find that one pool,
which is about the peak of exploration of icebox.

Now you can literally explore the entire round and get incredibly lost!
It's also a great opportunity for mappers! (Especially since the
templates I made were made rather quickly as I wasn't sure if this had
merit).

2 extra z-levels isn't a lot, but it'll let us further develop planetary
wilderness z-levels further without impacting load times that much.
Maybe 3x3 icebox can be real in the future, but for now 1x3 icebox will
have to do
2025-08-15 01:58:58 -05:00

47 lines
1.7 KiB
Plaintext

/**
* Creates a mirage effect allowing you to see around the world border, by adding the opposite side to its vis_contents.
*/
/datum/element/mirage_border
/datum/element/mirage_border/Attach(datum/target, turf/target_turf, direction, range=world.view)
. = ..()
if(!isturf(target))
return ELEMENT_INCOMPATIBLE
#ifdef TESTING
// This is a highly used proc, and these error states never occur, so limit it to testing.
// If something goes wrong it will runtime anyway.
if(!target_turf || !istype(target_turf) || !direction)
stack_trace("[type] improperly attached with the following args: target=\[[target_turf]\], direction=\[[direction]\], range=\[[range]\]")
return ELEMENT_INCOMPATIBLE
#endif
var/atom/movable/mirage_holder/holder = new(target)
var/x = target_turf.x
var/y = target_turf.y
var/z = clamp(target_turf.z, 1, world.maxz)
holder.vis_contents += block(
x - (direction & WEST ? range : 0), y - (direction & SOUTH ? range : 0), z,
x + (direction & EAST ? range : 0), y + (direction & NORTH ? range : 0), z
)
if(direction & SOUTH)
holder.pixel_y -= ICON_SIZE_Y * range
if(direction & WEST)
holder.pixel_x -= ICON_SIZE_X * range
/datum/element/mirage_border/Detach(atom/movable/target)
. = ..()
var/atom/movable/mirage_holder/held = locate() in target.contents
if(held)
qdel(held)
INITIALIZE_IMMEDIATE(/atom/movable/mirage_holder)
// Using /atom/movable because this is a heavily used path
/atom/movable/mirage_holder
name = "Mirage holder"
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
/// If we, hypothetically, spawned on a turf that calls init (so non-space tiles), we would be transported to the other Z, which would be very bad
/atom/movable/mirage_holder/forceMove(atom/destination)
return FALSE