mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-11 10:11:09 +00:00
## The Voidwalker Adds a new antagonist, the Voidwalker! It's a rare antag that spawns in space when there's at least 40 people Design doc is here: https://hackmd.io/jE4YScP8RPykXo37rTBV2Q (there's some deviations) No biddle ## Summary Spooky space antag that moves around space, ambushing people either in space or near space. They can move through glass, have an ability to stamina drain you if they remain in your vision for 8 seconds, can temporarily remove glass windows to drag you through them and deal ~~stamina damage~~ incredibly violence. Upon being taken, they can be kidnapped and cursed, muting and pacifying the person and sending them to the void. ## Passive   Passive abilities: - Permanent space flight and indoor flight - Space regen - Slowdown when in gravity - Space camo (very low alpha when in space - Can freely move through unshocked glass - Mute, but can hear all station frequencies (excluding binary) - Will quickly die when on planets or moons (obviously can't roll on icebox) - 10 brute armor and 20 burn armor. They can't wear any form of armor and don't have any get out of jail free cards, so I think it'll help with their survivability a slight bit ## Abilities **Void eater:** Literally just a light-eater but instead of eating light it instantly shatters windows, but restores them after a few seconds **Space Dive:** New ability that lets you move under the station with a 2 second do_after, so they can still get to closed of space spots without being as annoying as heretic space shift **Unsettle:** Remain in view of the target for 8 seconds to give them a short stun, slurring and 80 stamina damage, but announce your presence and location to them. Both you and your target can move, as long as you remain in their view. **Space Kidnap:** When your target is incapacitated and in space, you can drag them into the cosmic void. They'll be returned cursed after undergoing a sort of reverse heretic sacrifice (more on that in the next section). [Showcase of all the above abilities!](https://youtu.be/NJ01H28PV9w) ## Voided Crew A brain trauma received when you get kidnapped. While under it's influence, you are muted and pacified. You will die in planetary gravity and cannot enter space.  It can be cured with a lobotomy or by dying in planetary gravity. You get warned to avoid the Voidwalker. The voidwalker now does extra damage and gets the option to glass gib you if you die, leaving just a brain ## Loot On death, the Voidwalker shatters into glass and drops a cosmic skull. Looking into the skull gives you a stable version of the Voided brain trauma. It doesn't give you pacifism and doesn't ban you from space. It also makes you space immune and gives you the ability to walk through unshocked glass after 2 seconds do_after. Sprites for the cosmic skull by Justice12354 and Rex9001! I'll throw up a video showcasing death and their sprites on Sunday ## Why It's Good For The Game We don't have any space centered antagonists. The closest we have are Space Dragons, but they have to go deep into the station anyway. I'm also quite fond of simpler antagonists, like revenant and nightmare. Give people the tools, and they'll make the fun themselves. I've been comparing the Voidwalker with the Nightmare. Both are goalles, simple antagonists, but where the Nightmare's gimmick is darkness, the Voidwalker's gimmick is space. They also get a dark tentacle arm so they can murderize people, but it only gets them to crit. After that they can drag people into the "void" to kidnap them. This is mostly to encourage the Voidwalker not to just space them cause that's kinda lame. They still can though, just in-case it would be very funny ## Changelog 🆑 Time-Green, Justice12354, Rex9001 add: Adds the Voidwalker, a new rare space based midround antagonist! code: Adds the ability to texture limbs and bodypart_overlays Sprite: Cosmic skull sprites by Justice12354 and Rex9001 /🆑 - [x] Add a better kidnapping mechanic, instead of just teleporting someone to a station turf - [x] Add an armblade or weapon or something, unarmed combat is kinda ass for this - [x] Fix the antag preview not rendering textures - [x] Prevent them from space phasing when in combat so they can actually be killed in space combat, even if really fucking hard - [x] Nerf visibility for people with space parallax disabled, probably also something to improve camo with colored parallax - [x] Replace the stamina damage stuff - [x] Cool rework of space phase idea I have - [x] Update/implement vidual effects - [x] Implement names ## Considerations There's a few things that I might change or implement later, depending on how it actually plays. It's a space focused antag, but there might not be enough people near space in a given round. An ability to let them "capture" area's or let them turn into a meteor or something might be needed later if they turn out to be too passive. They might also be _too_ oppressive in space. I designed them for near-space combat, but may've made them insanely overpowered in in raw space combat. Probably wont do biddle, but might add more powers that you can reroll every few minutes or something (like blob). Either wat it wont be this PR --------- Co-authored-by: carlarctg <53100513+carlarctg@users.noreply.github.com> Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Co-authored-by: Jacquerel <hnevard@gmail.com>
109 lines
3.8 KiB
Plaintext
109 lines
3.8 KiB
Plaintext
/// Define for the pickweight value where you get no parallax
|
|
#define PARALLAX_NONE "parallax_none"
|
|
|
|
SUBSYSTEM_DEF(parallax)
|
|
name = "Parallax"
|
|
wait = 2
|
|
flags = SS_POST_FIRE_TIMING | SS_BACKGROUND | SS_NO_INIT
|
|
priority = FIRE_PRIORITY_PARALLAX
|
|
runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
|
|
var/list/currentrun
|
|
var/planet_x_offset = 128
|
|
var/planet_y_offset = 128
|
|
/// A random parallax layer that we sent to every player
|
|
var/atom/movable/screen/parallax_layer/random/random_layer
|
|
/// Weighted list with the parallax layers we could spawn
|
|
var/random_parallax_weights = list(
|
|
/atom/movable/screen/parallax_layer/random/space_gas = 35,
|
|
/atom/movable/screen/parallax_layer/random/asteroids = 35,
|
|
PARALLAX_NONE = 30,
|
|
)
|
|
|
|
//These are cached per client so needs to be done asap so people joining at roundstart do not miss these.
|
|
/datum/controller/subsystem/parallax/PreInit()
|
|
. = ..()
|
|
|
|
set_random_parallax_layer(pick_weight(random_parallax_weights))
|
|
|
|
planet_y_offset = rand(100, 160)
|
|
planet_x_offset = rand(100, 160)
|
|
|
|
/datum/controller/subsystem/parallax/fire(resumed = FALSE)
|
|
if (!resumed)
|
|
src.currentrun = GLOB.clients.Copy()
|
|
|
|
//cache for sanic speed (lists are references anyways)
|
|
var/list/currentrun = src.currentrun
|
|
|
|
while(length(currentrun))
|
|
var/client/processing_client = currentrun[currentrun.len]
|
|
currentrun.len--
|
|
if (QDELETED(processing_client) || !processing_client.eye)
|
|
if (MC_TICK_CHECK)
|
|
return
|
|
continue
|
|
|
|
var/atom/movable/movable_eye = processing_client.eye
|
|
if(!istype(movable_eye))
|
|
continue
|
|
|
|
while(isloc(movable_eye.loc) && !isturf(movable_eye.loc))
|
|
movable_eye = movable_eye.loc
|
|
//get the last movable holding the mobs eye
|
|
|
|
if(movable_eye == processing_client.movingmob)
|
|
if (MC_TICK_CHECK)
|
|
return
|
|
continue
|
|
|
|
//eye and the last recorded eye are different, and the last recorded eye isnt just the clients mob
|
|
if(!isnull(processing_client.movingmob))
|
|
LAZYREMOVE(processing_client.movingmob.client_mobs_in_contents, processing_client.mob)
|
|
LAZYADD(movable_eye.client_mobs_in_contents, processing_client.mob)
|
|
|
|
processing_client.movingmob = movable_eye
|
|
if (MC_TICK_CHECK)
|
|
return
|
|
currentrun = null
|
|
|
|
/// Generate a random layer for parallax
|
|
/datum/controller/subsystem/parallax/proc/set_random_parallax_layer(picked_parallax)
|
|
if(picked_parallax == PARALLAX_NONE)
|
|
return
|
|
|
|
random_layer = new picked_parallax(null, /* hud_owner = */ null, /* template = */ TRUE)
|
|
RegisterSignal(random_layer, COMSIG_QDELETING, PROC_REF(clear_references))
|
|
random_layer.get_random_look()
|
|
|
|
/// Change the random parallax layer after it's already been set. update_player_huds = TRUE will also replace them in the players client images, if it was set
|
|
/datum/controller/subsystem/parallax/proc/swap_out_random_parallax_layer(atom/movable/screen/parallax_layer/new_type, update_player_huds = TRUE)
|
|
set_random_parallax_layer(new_type)
|
|
|
|
if(!update_player_huds)
|
|
return
|
|
|
|
//Parallax is one of the first things to be set (during client join), so rarely is anything fast enough to swap it out
|
|
//That's why we need to swap the layers out for fast joining clients :/
|
|
for(var/client/client as anything in GLOB.clients)
|
|
client.parallax_layers_cached?.Cut()
|
|
client.mob?.hud_used?.update_parallax_pref(client.mob)
|
|
|
|
/datum/controller/subsystem/parallax/proc/clear_references()
|
|
SIGNAL_HANDLER
|
|
|
|
random_layer = null
|
|
|
|
/// Called at the end of SSstation setup, in-case we want to run some code that would otherwise be too early to run (like GLOB. stuff)
|
|
/datum/controller/subsystem/parallax/proc/post_station_setup()
|
|
random_layer?.apply_global_effects()
|
|
|
|
/// Return the most dominant color, if we have a colored background (mostly nebula gas)
|
|
/datum/controller/subsystem/parallax/proc/get_parallax_color()
|
|
var/atom/movable/screen/parallax_layer/random/space_gas/gas = random_layer
|
|
if(!istype(gas))
|
|
return
|
|
|
|
return gas.parallax_color
|
|
|
|
#undef PARALLAX_NONE
|