diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm
index 39187f24a95..aa17c020708 100644
--- a/code/__defines/mobs.dm
+++ b/code/__defines/mobs.dm
@@ -10,12 +10,20 @@
#define CANPUSH 0x8
#define LEAPING 0x10
#define PASSEMOTES 0x20 // Mob has a cortical borer or holders inside of it that need to see emotes.
+#define NOFALL 0x800
#define GODMODE 0x1000
#define FAKEDEATH 0x2000 // Replaces stuff like changeling.changeling_fakedeath.
#define DISFIGURED 0x4000 // Set but never checked. Remove this sometime and replace occurences with the appropriate organ code
#define XENO_HOST 0x8000 // Tracks whether we're gonna be a baby alien's mummy.
#define NO_ANTAG 0x10000 // Players are restricted from gaining antag roles when occupying this mob
+// Incorporeal movement
+#define INCORPOREAL_DISABLE 0 // Disabled
+#define INCORPOREAL_GHOST 1 // Pass through matter like a ghost
+#define INCORPOREAL_NINJA 2 // Pass through matter with a cool effect
+#define INCORPOREAL_BSTECH 3 // Like ninja, but also go across Z-levels and move in space freely
+#define INCORPOREAL_SHADE 4 // Shady
+
// Grab levels.
#define GRAB_PASSIVE 1
#define GRAB_AGGRESSIVE 2
diff --git a/code/datums/brain_damage/imaginary_friend.dm b/code/datums/brain_damage/imaginary_friend.dm
index 5d7ae134877..727ef44af42 100644
--- a/code/datums/brain_damage/imaginary_friend.dm
+++ b/code/datums/brain_damage/imaginary_friend.dm
@@ -39,7 +39,7 @@
/mob/abstract/mental
universal_understand = 1
- incorporeal_move = 1
+ incorporeal_move = INCORPOREAL_GHOST
density = 0
/mob/abstract/mental/friend
diff --git a/code/modules/admin/verbs/bluespacetech.dm b/code/modules/admin/verbs/bluespacetech.dm
index 1d2aea756f7..3e6a6162012 100644
--- a/code/modules/admin/verbs/bluespacetech.dm
+++ b/code/modules/admin/verbs/bluespacetech.dm
@@ -134,8 +134,7 @@
/mob/living/carbon/human/bst
universal_understand = 1
- status_flags = GODMODE
- var/fall_override = TRUE
+ status_flags = GODMODE|NOFALL
/mob/living/carbon/human/bst/can_inject(var/mob/user, var/error_msg, var/target_zone)
to_chat(user, SPAN_ALERT("The [src] disarms you before you can inject them."))
@@ -275,34 +274,30 @@
suicide()
/mob/living/carbon/human/bst/verb/antigrav()
- set name = "Toggle Gravity"
- set desc = "Toggles on/off falling for you."
+ set name = "Toggle Falling"
+ set desc = "Use bluespace technology to ignore gravity."
set category = "BST"
- if (fall_override)
- fall_override = FALSE
- to_chat(usr, "You will now fall normally.")
- else
- fall_override = TRUE
- to_chat(usr, "You will no longer fall.")
+ status_flags ^= NOFALL
+ to_chat(src, SPAN_NOTICE("You will [status_flags & NOFALL ? "no longer fall" : "now fall normally"]."))
/mob/living/carbon/human/bst/verb/bstwalk()
- set name = "Ruin Everything"
- set desc = "Uses bluespace technology to phase through solid matter and move quickly."
+ set name = "Toggle Incorporeal Movement"
+ set desc = "Use bluespace technology to phase through solid matter and move quickly."
set category = "BST"
set popup_menu = 0
if(!src.incorporeal_move)
- src.incorporeal_move = 2
+ src.incorporeal_move = INCORPOREAL_BSTECH
to_chat(src, SPAN_NOTICE("You will now phase through solid matter."))
else
- src.incorporeal_move = 0
+ src.incorporeal_move = INCORPOREAL_DISABLE
to_chat(src, SPAN_NOTICE("You will no-longer phase through solid matter."))
return
/mob/living/carbon/human/bst/verb/bstrecover()
- set name = "Rejuv"
- set desc = "Use the bluespace within you to restore your health"
+ set name = "Restore Health"
+ set desc = "Use bluespace to teleport in a fresh, healthy body."
set category = "BST"
set popup_menu = 0
@@ -318,7 +313,7 @@
/mob/living/carbon/human/bst/verb/bstquit()
set name = "Teleport out"
- set desc = "Activate bluespace to leave and return to your original mob (if you have one)."
+ set desc = "Jump into bluespace and continue wherever you left off. Deletes the BSTech and returns to your original mob if you have one."
set category = "BST"
var/client/C = src.client
@@ -333,7 +328,7 @@
/mob/living/carbon/human/bst/verb/tgm()
set name = "Toggle Godmode"
- set desc = "Enable or disable god mode. For testing things that require you to be vulnerable."
+ set desc = "For when you want to be vulnerable."
set category = "BST"
status_flags ^= GODMODE
@@ -429,7 +424,7 @@
canremove = 0
flash_protection = FLASH_PROTECTION_MAJOR
-/obj/item/clothing/glasses/sunglasses/bst/verb/toggle_xray(mode in list("X-Ray without Lighting", "X-Ray with Lighting", "Normal"))
+/obj/item/clothing/glasses/sunglasses/bst/verb/toggle_xray(mode in list("X-Ray without Lighting", "X-Ray with Lighting", "Darkvision", "Normal vision"))
set name = "Change Vision Mode"
set desc = "Changes your glasses' vision mode."
set category = "BST"
@@ -437,12 +432,15 @@
switch (mode)
if ("X-Ray without Lighting")
- vision_flags = (SEE_TURFS|SEE_OBJS|SEE_MOBS)
+ vision_flags = SEE_TURFS|SEE_OBJS|SEE_MOBS|SEE_BLACKNESS|SEE_SELF
see_invisible = SEE_INVISIBLE_NOLIGHTING
if ("X-Ray with Lighting")
- vision_flags = (SEE_TURFS|SEE_OBJS|SEE_MOBS)
+ vision_flags = SEE_TURFS|SEE_OBJS|SEE_MOBS|SEE_BLACKNESS|SEE_SELF
see_invisible = -1
- if ("Normal")
+ if ("Darkvision")
+ vision_flags = SEE_BLACKNESS|SEE_SELF
+ see_invisible = SEE_INVISIBLE_NOLIGHTING
+ if ("Normal vision")
vision_flags = 0
see_invisible = -1
diff --git a/code/modules/mob/abstract/observer/observer.dm b/code/modules/mob/abstract/observer/observer.dm
index af380291233..e525919ce99 100644
--- a/code/modules/mob/abstract/observer/observer.dm
+++ b/code/modules/mob/abstract/observer/observer.dm
@@ -32,7 +32,7 @@
var/ghost_cooldown = 0
var/obj/item/device/multitool/ghost_multitool
- incorporeal_move = 1
+ incorporeal_move = INCORPOREAL_GHOST
mob_thinks = FALSE
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index f6d6f1c623b..09532e8fd4d 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -5,7 +5,7 @@
tally = species.slowdown
tally += get_pulling_movement_delay()
-
+
if (istype(loc, /turf/space) || isopenturf(loc))
if(!(locate(/obj/structure/lattice, loc) || locate(/obj/structure/stairs, loc) || locate(/obj/structure/ladder, loc)))
return 0
diff --git a/code/modules/mob/living/silicon/robot/presets.dm b/code/modules/mob/living/silicon/robot/presets.dm
index 8b85f44477a..d8293a217f3 100644
--- a/code/modules/mob/living/silicon/robot/presets.dm
+++ b/code/modules/mob/living/silicon/robot/presets.dm
@@ -23,25 +23,33 @@
overclocked = TRUE
law_update = FALSE
scrambled_codes = TRUE
- status_flags = GODMODE
+ status_flags = GODMODE|NOFALL
+
+/mob/living/silicon/robot/bluespace/verb/antigrav()
+ set name = "Toggle Gravity"
+ set desc = "Use bluespace technology to ignore gravity."
+ set category = "BST"
+
+ status_flags ^= NOFALL
+ to_chat(src, SPAN_NOTICE("You will [status_flags & NOFALL ? "no longer fall" : "now fall normally"]."))
/mob/living/silicon/robot/bluespace/verb/bstwalk()
- set name = "Ruin Everything"
- set desc = "Uses bluespace technology to phase through solid matter and move quickly."
+ set name = "Toggle Incorporeal Movement"
+ set desc = "Use bluespace technology to phase through solid matter and move quickly."
set category = "BST"
set popup_menu = 0
if(!src.incorporeal_move)
- src.incorporeal_move = 2
+ src.incorporeal_move = INCORPOREAL_BSTECH
to_chat(src, SPAN_NOTICE("You will now phase through solid matter."))
else
- src.incorporeal_move = 0
+ src.incorporeal_move = INCORPOREAL_DISABLE
to_chat(src, SPAN_NOTICE("You will no-longer phase through solid matter."))
return
/mob/living/silicon/robot/bluespace/verb/bstrecover()
- set name = "Rejuv"
- set desc = "Use the bluespace within you to restore your health"
+ set name = "Restore Health"
+ set desc = "Use bluespace to teleport in a fresh, healthy body."
set category = "BST"
set popup_menu = 0
@@ -49,7 +57,7 @@
/mob/living/silicon/robot/bluespace/verb/bstquit()
set name = "Teleport out"
- set desc = "Activate bluespace to leave and return to your original mob (if you have one)."
+ set desc = "Jump into bluespace and continue wherever you left off. Deletes the BSTech and returns to your original mob if you have one."
set category = "BST"
src.custom_emote(VISIBLE_MESSAGE, "politely beeps as its lights start to flash.")
@@ -70,8 +78,8 @@
/mob/living/silicon/robot/bluespace/verb/tgm()
set name = "Toggle Godmode"
- set desc = "Enable or disable god mode. For testing things that require you to be vulnerable."
+ set desc = "For when you want to be vulnerable."
set category = "BST"
status_flags ^= GODMODE
- to_chat(src, SPAN_NOTICE("God mode is now [status_flags & GODMODE ? "enabled" : "disabled"]"))
\ No newline at end of file
+ to_chat(src, SPAN_NOTICE("God mode is now [status_flags & GODMODE ? "enabled" : "disabled"]"))
diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm
index 0dce4736f0c..4099e052e92 100644
--- a/code/modules/mob/living/simple_animal/shade.dm
+++ b/code/modules/mob/living/simple_animal/shade.dm
@@ -83,7 +83,7 @@
heat_damage_per_tick = 0
cold_damage_per_tick = 0
unsuitable_atoms_damage = 0
- incorporeal_move = 3
+ incorporeal_move = INCORPOREAL_SHADE
mob_size = 0
density = 0
speed = 1
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index c94f169464f..d5d899855a0 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -90,7 +90,7 @@
var/lying_prev = 0
var/canmove = 1
//Allows mobs to move through dense areas without restriction. For instance, in space or out of holder objects.
- var/incorporeal_move = 0 //0 is off, 1 is normal, 2 is for ninjas.
+ var/incorporeal_move = INCORPOREAL_DISABLE
var/lastpuke = 0
var/unacidable = 0
var/list/pinned = list() // List of things pinning this creature to walls (see living_defense.dm)
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index d9af3913b23..5ee4cb436fd 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -296,7 +296,7 @@
if (mob_is_human)
var/mob/living/carbon/human/H = mob
//If we're sprinting and able to continue sprinting, then apply the sprint bonus ontop of this
- if (H.m_intent == "run" && H.species.handle_sprint_cost(H, tally)) //This will return false if we collapse from exhaustion
+ if (H.m_intent == "run" && (H.status_flags & GODMODE || H.species.handle_sprint_cost(H, tally))) //This will return false if we collapse from exhaustion
tally = (tally / (1 + H.sprint_speed_factor)) * config.run_delay_multiplier
else
tally = max(tally * config.walk_delay_multiplier, H.min_walk_delay) //clamp walking speed if its limited
@@ -384,7 +384,7 @@
/client/proc/Process_Incorpmove(direct)
var/turf/mobloc = get_turf(mob)
switch(mob.incorporeal_move)
- if(1)
+ if(INCORPOREAL_GHOST)
var/turf/T = get_step(mob, direct)
if(mob.check_holy(T))
to_chat(mob, SPAN_WARNING("You cannot get past holy grounds while you are in this plane of existence!"))
@@ -392,12 +392,11 @@
else
mob.forceMove(get_step(mob, direct))
mob.dir = direct
- if(2)
- anim(mobloc,mob,'icons/mob/mob.dmi',,"shadow",,mob.dir)
+ if(INCORPOREAL_NINJA, INCORPOREAL_BSTECH)
+ anim(mobloc, mob, 'icons/mob/mob.dmi', null, "shadow", null, mob.dir)
mob.forceMove(get_step(mob, direct))
mob.dir = direct
-
- if(3)
+ if(INCORPOREAL_SHADE)
if(!mob.canmove || mob.anchored)
return
move_delay = 1 + world.time
@@ -456,6 +455,9 @@
// Return 1 for movement, 0 for none,
// -1 to allow movement but with a chance of slipping
/mob/proc/Allow_Spacemove(var/check_drift = 0)
+ if(status_flags & NOFALL || incorporeal_move == INCORPOREAL_BSTECH)
+ return 1
+
if(!Check_Dense_Object()) //Nothing to push off of so end here
return 0
diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm
index df09489dd3e..118cc1eb693 100644
--- a/code/modules/multiz/movement.dm
+++ b/code/modules/multiz/movement.dm
@@ -46,6 +46,10 @@
to_chat(src, SPAN_NOTICE("There is nothing of interest in this direction."))
return FALSE
+ if(incorporeal_move == INCORPOREAL_BSTECH)
+ forceMove(destination)
+ return TRUE
+
var/turf/start = get_turf(src)
if(!start.CanZPass(src, direction))
to_chat(src, SPAN_WARNING("\The [start] is in the way."))
@@ -113,13 +117,6 @@
else
to_chat(src, SPAN_NOTICE("There is nothing of interest in this direction."))
-/mob/living/carbon/human/bst/zMove(direction)
- var/turf/destination = (direction == UP) ? GetAbove(src) : GetBelow(src)
- if(destination)
- forceMove(destination)
- else
- to_chat(src, SPAN_NOTICE("There is nothing of interest in this direction."))
-
/**
* An initial check for Z-level travel. Called relatively early in mob/proc/zMove.
*
@@ -129,6 +126,8 @@
* FALSE otherwise.
*/
/mob/proc/can_ztravel(var/direction)
+ if(incorporeal_move == INCORPOREAL_BSTECH)
+ return TRUE
return FALSE
/mob/abstract/observer/can_ztravel(var/direction)
@@ -138,6 +137,9 @@
if(incapacitated())
return FALSE
+ if(incorporeal_move == INCORPOREAL_BSTECH)
+ return TRUE
+
if(Allow_Spacemove())
return TRUE
@@ -243,6 +245,8 @@
* FALSE otherwise.
*/
/mob/proc/CanAvoidGravity()
+ if(status_flags & NOFALL || incorporeal_move == INCORPOREAL_BSTECH)
+ return TRUE
return FALSE
// Humans and borgs have jetpacks which allows them to override gravity! Or rather,
@@ -326,6 +330,11 @@
if((locate(/obj/structure/disposalpipe/up) in below) || (locate(/obj/machinery/atmospherics/pipe/zpipe/up) in below))
return FALSE
+/mob/can_fall()
+ if(status_flags & NOFALL || incorporeal_move == INCORPOREAL_BSTECH)
+ return FALSE
+ return ..()
+
/mob/living/heavy_vehicle/can_ztravel(var/direction)
if(legs)
if(legs.hover && legs.motivator.is_functional())
@@ -379,9 +388,6 @@
return FALSE
return ..()
-/mob/living/carbon/human/bst/can_fall()
- return fall_override ? FALSE : ..()
-
/mob/abstract/eye/can_fall()
return FALSE
@@ -447,6 +453,11 @@
if (istype(loc, /turf/space) || (area && !area.has_gravity()))
return FALSE
+ if(status_flags & GODMODE) // Godmode
+ visible_message(SPAN_NOTICE("\The [src] lands flawlessly on their legs, bending their knee to the floor. They promptly stand up."))
+ playsound(src.loc, /decl/sound_category/swing_hit_sound, 50, 1)
+ return FALSE
+
visible_message("\The [src] falls and lands on \the [loc]!",
"With a loud thud, you land on \the [loc]!", "You hear a thud!")
@@ -485,6 +496,11 @@
SPAN_NOTICE("You hear an electric *whirr* right after the slam!"))
return FALSE
+ if(status_flags & GODMODE) // Godmode
+ visible_message(SPAN_NOTICE("\The [src] lands flawlessly on their legs, bending their knee to the floor. They promptly stand up."))
+ playsound(src.loc, /decl/sound_category/swing_hit_sound, 50, 1)
+ return FALSE
+
var/combat_roll = 1
if(lying)
combat_roll = 0.7 //If you're sleeping, you take less damage because your body is less rigid. It's science 'n shit.
@@ -501,7 +517,6 @@
var/z_velocity = 5*(levels_fallen**2)
var/damage = (((40 * species.fall_mod) + z_velocity) + rand(-20,20)) * combat_roll * damage_mod * aug_mod
-
var/limb_damage = rand(0,damage/2)
if(prob(30) && combat_roll >= 1) //landed on their legs
@@ -640,9 +655,6 @@
if (stat == DEAD)
SSfeedback.IncrementSimpleStat("openturf_human_deaths")
-/mob/living/carbon/human/bst/fall_impact(var/damage_mod)
- return FALSE
-
/obj/vehicle/fall_impact(levels_fallen, stopped_early = FALSE, var/damage_mod = 1)
. = ..()
if (!.)
diff --git a/html/changelogs/amunak-nofall.yml b/html/changelogs/amunak-nofall.yml
new file mode 100755
index 00000000000..e4c8c9a029b
--- /dev/null
+++ b/html/changelogs/amunak-nofall.yml
@@ -0,0 +1,13 @@
+author: Amunak
+delete-after: True
+changes:
+ - admin: "'NOFALL' is now a status flag instead of being a var specific to BSTechs. It allows the mob to move between Z-levels and through empty space; even to 'fly up' against gravity. However the tech can no longer use this to 'phase into' matter if there is something above them."
+ - admin: "For that you want to use Ruin-Everything instead: incorporeal movement now has an additional type that's just like a ninja's, but it also allows you to move between Z-levels."
+ - admin: "Adds the anti-gravity verb to the Bluespace Robot preset and starts them with 'NOFALL' on."
+ - admin: "When using 'GODMODE' you will no longer take damage when you fall; instead a cool message will be shown and a quiet thump will be played."
+ - admin: "'GODMODE' now protects you from the awful effects of running - you can run indefinitely and won't take damage from it."
+ - admin: "BSTechs now have additional vision mode - 'darkvision' for seeing normally but without lighting."
+ - admin: "Some of the more arcane BSTech verbs have been renamed and descriptions improved (with some added flavour). Rejuv -> Restore Health. Toggle-Gravity -> Toggle-Falling (we now have actual gravity on the station, so let's not confuse people). And finally Ruin-Everything -> Toggle Incorporeal Movement - as lovely as the name is, it doesn't make much sense. This isn't Kill-Everyone or whatever."
+ - refactor: "Thanks to the above changes the BST is now self-contained in a single file (well except for the robot preset)."
+ - refactor: "To facilitate the above changes several godmode and incorporeal checks have been added (mostly to movement procs). It cuts on some extra proc overrides and type checks. Also results in a more 'natural' experience when using NOFALL, GODMODE or incorporeal movement."
+ - refactor: "Changed incorporeal values to defines."