diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index dc2ff8832f..ed0007135d 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -130,6 +130,7 @@
#define TRAIT_HEAVY_SLEEPER "heavy_sleeper"
#define TRAIT_NIGHT_VISION "night_vision"
#define TRAIT_LIGHT_STEP "light_step"
+#define TRAIT_SILENT_STEP "silent_step"
#define TRAIT_SPEEDY_STEP "speedy_step"
#define TRAIT_SPIRITUAL "spiritual"
#define TRAIT_VORACIOUS "voracious"
diff --git a/code/datums/action.dm b/code/datums/action.dm
index f64a549b29..fd33ef79b5 100644
--- a/code/datums/action.dm
+++ b/code/datums/action.dm
@@ -494,6 +494,7 @@
else
to_chat(owner, "Your hands are full!")
+//MGS Box
/datum/action/item_action/agent_box
name = "Deploy Box"
desc = "Find inner peace, here, in the box."
@@ -502,21 +503,27 @@
icon_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "deploy_box"
var/cooldown = 0
- var/obj/structure/closet/cardboard/agent/box
+ var/boxtype = /obj/structure/closet/cardboard/agent
+//Handles open and closing the box
/datum/action/item_action/agent_box/Trigger()
- if(!..())
+ . = ..()
+ if(!.)
return FALSE
- if(QDELETED(box))
- if(cooldown < world.time - 100)
- box = new(owner.drop_location())
- owner.forceMove(box)
- cooldown = world.time
- owner.playsound_local(box, 'sound/misc/box_deploy.ogg', 50, TRUE)
- else
- owner.forceMove(box.drop_location())
+ if(istype(owner.loc, /obj/structure/closet/cardboard/agent))
+ var/obj/structure/closet/cardboard/agent/box = owner.loc
+ owner.playsound_local(box, 'sound/misc/box_deploy.ogg', 50, TRUE)
+ box.open()
+ return
+ //Box closing from here on out.
+ if(!isturf(owner.loc)) //Don't let the player use this to escape mechs/welded closets.
+ to_chat(owner, "You need more space to activate this implant.")
+ return
+ if(cooldown < world.time - 100)
+ var/box = new boxtype(owner.drop_location())
+ owner.forceMove(box)
+ cooldown = world.time
owner.playsound_local(box, 'sound/misc/box_deploy.ogg', 50, TRUE)
- QDEL_NULL(box)
//Preset for spells
/datum/action/spell_action
diff --git a/code/datums/components/footstep.dm b/code/datums/components/footstep.dm
index bfcc49f453..e6c9f20de6 100644
--- a/code/datums/components/footstep.dm
+++ b/code/datums/components/footstep.dm
@@ -14,15 +14,18 @@
var/turf/open/T = get_turf(parent)
if(!istype(T))
return
-
+
var/mob/living/LM = parent
var/v = volume
var/e = e_range
if(!T.footstep || LM.buckled || LM.lying || !LM.canmove || LM.resting || LM.buckled || LM.throwing || LM.movement_type & (VENTCRAWLING | FLYING))
- if (LM.lying && !(!T.footstep || LM.movement_type & (VENTCRAWLING | FLYING))) //play crawling sound if we're lying
+ if (LM.lying && !LM.buckled && !(!T.footstep || LM.movement_type & (VENTCRAWLING | FLYING))) //play crawling sound if we're lying
playsound(T, 'sound/effects/footstep/crawl1.ogg', 15 * v)
return
-
+
+ if(HAS_TRAIT(LM, TRAIT_SILENT_STEP))
+ return
+
if(iscarbon(LM))
var/mob/living/carbon/C = LM
if(!C.get_bodypart(BODY_ZONE_L_LEG) && !C.get_bodypart(BODY_ZONE_R_LEG))
@@ -31,18 +34,18 @@
v /= 2
e -= 5
steps++
-
+
if(steps >= 3)
steps = 0
-
+
else
return
-
+
if(prob(80) && !LM.has_gravity(T)) // don't need to step as often when you hop around
return
-
+
//begin playsound shenanigans//
-
+
//for barefooted non-clawed mobs like monkeys
if(isbarefoot(LM))
playsound(T, pick(GLOB.barefootstep[T.barefootstep][1]),
@@ -50,19 +53,19 @@
TRUE,
GLOB.barefootstep[T.barefootstep][3] + e)
return
-
+
//for xenomorphs, dogs, and other clawed mobs
if(isclawfoot(LM))
if(isalienadult(LM)) //xenos are stealthy and get quieter footsteps
v /= 3
e -= 5
-
+
playsound(T, pick(GLOB.clawfootstep[T.clawfootstep][1]),
GLOB.clawfootstep[T.clawfootstep][2] * v,
TRUE,
GLOB.clawfootstep[T.clawfootstep][3] + e)
return
-
+
//for megafauna and other large and imtimidating mobs such as the bloodminer
if(isheavyfoot(LM))
playsound(T, pick(GLOB.heavyfootstep[T.heavyfootstep][1]),
@@ -70,12 +73,12 @@
TRUE,
GLOB.heavyfootstep[T.heavyfootstep][3] + e)
return
-
+
//for slimes
- if(isslime(LM))
+ if(isslime(LM))
playsound(T, 'sound/effects/footstep/slime1.ogg', 15 * v)
return
-
+
//for (simple) humanoid mobs (clowns, russians, pirates, etc.)
if(isshoefoot(LM))
if(!ishuman(LM))
@@ -87,17 +90,17 @@
if(ishuman(LM)) //for proper humans, they're special
var/mob/living/carbon/human/H = LM
var/feetCover = (H.wear_suit && (H.wear_suit.body_parts_covered & FEET)) || (H.w_uniform && (H.w_uniform.body_parts_covered & FEET))
-
+
if (H.dna.features["taur"] == "Naga" || H.dna.features["taur"] == "Tentacle") //are we a naga or tentacle taur creature
playsound(T, 'sound/effects/footstep/crawl1.ogg', 15 * v)
return
-
+
if(H.shoes || feetCover) //are we wearing shoes
playsound(T, pick(GLOB.footstep[T.footstep][1]),
GLOB.footstep[T.footstep][2] * v,
TRUE,
GLOB.footstep[T.footstep][3] + e)
-
+
if((!H.shoes && !feetCover)) //are we NOT wearing shoes
playsound(T, pick(GLOB.barefootstep[T.barefootstep][1]),
GLOB.barefootstep[T.barefootstep][2] * v,
diff --git a/code/datums/mutations/body.dm b/code/datums/mutations/body.dm
index 461c221ff8..a32220aa43 100644
--- a/code/datums/mutations/body.dm
+++ b/code/datums/mutations/body.dm
@@ -63,16 +63,14 @@
/datum/mutation/human/dwarfism/on_acquiring(mob/living/carbon/human/owner)
if(..())
return
- owner.resize = 0.8
- owner.update_transform()
+ owner.transform = owner.transform.Scale(1, 0.8)
owner.pass_flags |= PASSTABLE
owner.visible_message("[owner] suddenly shrinks!", "Everything around you seems to grow..")
/datum/mutation/human/dwarfism/on_losing(mob/living/carbon/human/owner)
if(..())
return
- owner.resize = 1.25
- owner.update_transform()
+ owner.transform = owner.transform.Scale(1, 1.25)
owner.pass_flags &= ~PASSTABLE
owner.visible_message("[owner] suddenly grows!", "Everything around you seems to shrink..")
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index fccda8bcba..737e80a26d 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -34,8 +34,6 @@
var/delivery_icon = "deliverycloset" //which icon to use when packagewrapped. null to be unwrappable.
var/anchorable = TRUE
var/icon_welded = "welded"
- var/eigen_teleport = FALSE //If the closet leads to Mr Tumnus.
- var/obj/structure/closet/eigen_target //Where you go to.
var/obj/item/electronics/airlock/lockerelectronics //Installed electronics
var/lock_in_use = FALSE //Someone is doing some stuff with the lock here, better not proceed further
@@ -188,12 +186,7 @@
if(contents.len >= storage_capacity)
return -1
if(insertion_allowed(AM))
- if(eigen_teleport) // For teleporting people with linked lockers.
- do_teleport(AM, get_turf(eigen_target), 0)
- if(eigen_target.opened == FALSE)
- eigen_target.open()
- else
- AM.forceMove(src)
+ AM.forceMove(src)
return TRUE
else
return FALSE
@@ -299,7 +292,7 @@
if(!istype(S))
return
var/brokenword = broken ? "broken " : null
- user.visible_message("You begin removing the [brokenword]lock on [src]...", "[user] begins removing the [brokenword]lock on [src]...")
+ user.visible_message("[user] begins removing the [brokenword]lock on [src]...","You begin removing the [brokenword]lock on [src]...")
playsound(loc, S.usesound, 50, 1)
lock_in_use = TRUE
if(!do_after(user, 100 * S.toolspeed, target = src))
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_stealth.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_stealth.dm
index 1c3fbd8147..94be922fdf 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_stealth.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_stealth.dm
@@ -8,33 +8,37 @@ Contents:
/obj/item/clothing/suit/space/space_ninja/proc/toggle_stealth()
- var/mob/living/carbon/human/U = affecting
- if(!U)
+ if(!affecting)
return
if(stealth)
cancel_stealth()
else
if(cell.charge <= 0)
- to_chat(U, "You don't have enough power to enable Stealth!")
+ to_chat(affecting, "You don't have enough power to enable Stealth!")
return
stealth = !stealth
- animate(U, alpha = 50,time = 15)
- U.visible_message("[U.name] vanishes into thin air!", \
+ animate(affecting, alpha = 10,time = 15)
+ affecting.visible_message("[affecting.name] vanishes into thin air!", \
"You are now mostly invisible to normal detection.")
+ RegisterSignal(affecting, list(COMSIG_MOB_ITEM_ATTACK, COMSIG_MOB_ATTACK_RANGED, COMSIG_MOB_ATTACK_HAND, COMSIG_MOB_THROW, COMSIG_PARENT_ATTACKBY), .proc/reduce_stealth)
+ RegisterSignal(affecting, COMSIG_MOVABLE_BUMP, .proc/bumping_stealth)
+/obj/item/clothing/suit/space/space_ninja/proc/reduce_stealth()
+ affecting.alpha = min(affecting.alpha + 30, 80)
+
+/obj/item/clothing/suit/space/space_ninja/proc/bumping_stealth(datum/source, atom/A)
+ if(isliving(A))
+ affecting.alpha = min(affecting.alpha + 15, 80)
/obj/item/clothing/suit/space/space_ninja/proc/cancel_stealth()
- var/mob/living/carbon/human/U = affecting
- if(!U)
- return 0
- if(stealth)
- stealth = !stealth
- animate(U, alpha = 255, time = 15)
- U.visible_message("[U.name] appears from thin air!", \
- "You are now visible.")
- return 1
- return 0
-
+ if(!affecting || !stealth)
+ return FALSE
+ stealth = !stealth
+ UnregisterSignal(affecting, list(COMSIG_MOB_ITEM_ATTACK, COMSIG_MOB_ATTACK_RANGED, COMSIG_MOB_ATTACK_HAND, COMSIG_MOB_THROW, COMSIG_PARENT_ATTACKBY, COMSIG_MOVABLE_BUMP))
+ animate(affecting, alpha = 255, time = 15)
+ affecting.visible_message("[affecting.name] appears from thin air!", \
+ "You are now visible.")
+ return TRUE
/obj/item/clothing/suit/space/space_ninja/proc/stealth()
if(!s_busy)
diff --git a/code/modules/ninja/suit/shoes.dm b/code/modules/ninja/suit/shoes.dm
index 1b935a00de..115b14b63b 100644
--- a/code/modules/ninja/suit/shoes.dm
+++ b/code/modules/ninja/suit/shoes.dm
@@ -1,4 +1,3 @@
-
/obj/item/clothing/shoes/space_ninja
name = "ninja shoes"
desc = "A pair of running shoes. Excellent for running and even better for smashing skulls."
@@ -13,3 +12,12 @@
min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT
heat_protection = FEET
max_heat_protection_temperature = SHOES_MAX_TEMP_PROTECT
+
+/obj/item/clothing/shoes/space_ninja/equipped(mob/user, slot)
+ . = ..()
+ if(slot == SLOT_SHOES)
+ ADD_TRAIT(user, TRAIT_SILENT_STEP, "ninja_shoes_[REF(src)]")
+
+/obj/item/clothing/shoes/space_ninja/dropped(mob/user)
+ . = ..()
+ REMOVE_TRAIT(user, TRAIT_SILENT_STEP, "ninja_shoes_[REF(src)]")
diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm
index b98ef764c0..ac1ef3b96a 100644
--- a/code/modules/ninja/suit/suit.dm
+++ b/code/modules/ninja/suit/suit.dm
@@ -149,12 +149,11 @@ Contents:
/obj/item/clothing/suit/space/space_ninja/examine(mob/user)
..()
- if(s_initialized)
- if(user == affecting)
- to_chat(user, "All systems operational. Current energy capacity: [DisplayEnergy(cell.charge)].")
- to_chat(user, "The CLOAK-tech device is [stealth?"active":"inactive"].")
- to_chat(user, "There are [s_bombs] smoke bomb\s remaining.")
- to_chat(user, "There are [a_boost] adrenaline booster\s remaining.")
+ if(s_initialized && user == affecting)
+ to_chat(user, "All systems operational. Current energy capacity: [DisplayEnergy(cell.charge)].\n\
+ The CLOAK-tech device is [stealth?"active":"inactive"].\n\
+ There are [s_bombs] smoke bomb\s remaining.\n\
+ There are [a_boost] adrenaline booster\s remaining.")
/obj/item/clothing/suit/space/space_ninja/ui_action_click(mob/user, action)
if(istype(action, /datum/action/item_action/initialize_ninja_suit))
diff --git a/code/modules/ninja/suit/suit_initialisation.dm b/code/modules/ninja/suit/suit_initialisation.dm
index 4b159557bc..3d80282fe7 100644
--- a/code/modules/ninja/suit/suit_initialisation.dm
+++ b/code/modules/ninja/suit/suit_initialisation.dm
@@ -48,7 +48,7 @@
/obj/item/clothing/suit/space/space_ninja/proc/ninitialize_seven(delay, mob/living/carbon/human/U)
to_chat(U, "All systems operational. Welcome to SpiderOS, [U.real_name].")
s_initialized = TRUE
- ntick()
+ START_PROCESSING(SSprocessing, src)
s_busy = FALSE
@@ -91,4 +91,5 @@
unlock_suit()
U.regenerate_icons()
s_initialized = FALSE
+ STOP_PROCESSING(SSprocessing, src)
s_busy = FALSE
diff --git a/code/modules/ninja/suit/suit_process.dm b/code/modules/ninja/suit/suit_process.dm
index 4a89a59f75..850fb837b4 100644
--- a/code/modules/ninja/suit/suit_process.dm
+++ b/code/modules/ninja/suit/suit_process.dm
@@ -1,20 +1,17 @@
-/obj/item/clothing/suit/space/space_ninja/proc/ntick(mob/living/carbon/human/U = affecting)
- //Runs in the background while the suit is initialized.
- //Requires charge or stealth to process.
- spawn while(s_initialized)
- if(!affecting)
- terminate()//Kills the suit and attached objects.
+/obj/item/clothing/suit/space/space_ninja/process()
+ if(!affecting || !s_initialized)
+ return PROCESS_KILL
- else if(cell.charge > 0)
- if(s_coold)
- s_coold--//Checks for ability s_cooldown first.
+ if(cell.charge > 0)
+ if(s_coold)
+ s_coold--//Checks for ability s_cooldown first.
- cell.charge -= s_cost//s_cost is the default energy cost each ntick, usually 5.
- if(stealth)//If stealth is active.
- cell.charge -= s_acost
+ cell.charge -= s_cost//s_cost is the default energy cost each tick, usually 5.
+ if(stealth)//If stealth is active.
+ cell.charge -= s_acost
+ affecting.alpha = max(affecting.alpha - 10, 10)
- else
- cell.charge = 0
+ else
+ cell.charge = 0
+ if(stealth)
cancel_stealth()
-
- sleep(10)//Checks every second.
diff --git a/code/modules/surgery/bodyparts/robot_bodyparts.dm b/code/modules/surgery/bodyparts/robot_bodyparts.dm
index ab31d64034..a3f8b883b4 100644
--- a/code/modules/surgery/bodyparts/robot_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/robot_bodyparts.dm
@@ -20,8 +20,8 @@
icon_state = "borg_l_arm"
status = BODYPART_ROBOTIC
- brute_reduction = 5
- burn_reduction = 4
+ brute_reduction = 2
+ burn_reduction = 1
light_brute_msg = ROBOTIC_LIGHT_BRUTE_MSG
medium_brute_msg = ROBOTIC_MEDIUM_BRUTE_MSG
@@ -41,8 +41,8 @@
icon_state = "borg_r_arm"
status = BODYPART_ROBOTIC
- brute_reduction = 5
- burn_reduction = 4
+ brute_reduction = 2
+ burn_reduction = 1
light_brute_msg = ROBOTIC_LIGHT_BRUTE_MSG
medium_brute_msg = ROBOTIC_MEDIUM_BRUTE_MSG
@@ -62,8 +62,8 @@
icon_state = "borg_l_leg"
status = BODYPART_ROBOTIC
- brute_reduction = 5
- burn_reduction = 4
+ brute_reduction = 2
+ burn_reduction = 1
light_brute_msg = ROBOTIC_LIGHT_BRUTE_MSG
medium_brute_msg = ROBOTIC_MEDIUM_BRUTE_MSG
@@ -83,8 +83,8 @@
icon_state = "borg_r_leg"
status = BODYPART_ROBOTIC
- brute_reduction = 5
- burn_reduction = 4
+ brute_reduction = 2
+ burn_reduction = 1
light_brute_msg = ROBOTIC_LIGHT_BRUTE_MSG
medium_brute_msg = ROBOTIC_MEDIUM_BRUTE_MSG
@@ -103,8 +103,8 @@
icon_state = "borg_chest"
status = BODYPART_ROBOTIC
- brute_reduction = 5
- burn_reduction = 4
+ brute_reduction = 2
+ burn_reduction = 1
light_brute_msg = ROBOTIC_LIGHT_BRUTE_MSG
medium_brute_msg = ROBOTIC_MEDIUM_BRUTE_MSG
@@ -268,38 +268,38 @@
burn_reduction = 0
max_damage = 20
-// Upgraded Surplus lims
+// Upgraded Surplus lims - Better then robotic lims
/obj/item/bodypart/l_arm/robot/surplus_upgraded
name = "reinforced surplus prosthetic left arm"
- desc = "A skeletal, robotic limb. This one is reinforced to provide better protection."
+ desc = "A skeletal, robotic limb. This one is reinforced to provide better protection, and is made of stronger parts."
icon = 'icons/mob/augmentation/surplus_augments.dmi'
- brute_reduction = 1
- burn_reduction = 1
- max_damage = 30
+ brute_reduction = 3
+ burn_reduction = 2
+ max_damage = 55
/obj/item/bodypart/r_arm/robot/surplus_upgraded
name = "reinforced surplus prosthetic right arm"
- desc = "A skeletal, robotic limb. This one is reinforced to provide better protection."
+ desc = "A skeletal, robotic limb. This one is reinforced to provide better protection, and is made of stronger parts."
icon = 'icons/mob/augmentation/surplus_augments.dmi'
- brute_reduction = 1
- burn_reduction = 1
- max_damage = 30
+ brute_reduction = 3
+ burn_reduction = 2
+ max_damage = 55
/obj/item/bodypart/l_leg/robot/surplus_upgraded
name = "reinforced surplus prosthetic left leg"
- desc = "A skeletal, robotic limb. This one is reinforced to provide better protection."
+ desc = "A skeletal, robotic limb. This one is reinforced to provide better protection, and is made of stronger parts."
icon = 'icons/mob/augmentation/surplus_augments.dmi'
- brute_reduction = 1
- burn_reduction = 1
- max_damage = 30
+ brute_reduction = 3
+ burn_reduction = 2
+ max_damage = 55
/obj/item/bodypart/r_leg/robot/surplus_upgraded
name = "reinforced surplus prosthetic right leg"
- desc = "A skeletal, robotic limb. This one is reinforced to provide better protection."
+ desc = "A skeletal, robotic limb. This one is reinforced to provide better protection, and is made of stronger parts."
icon = 'icons/mob/augmentation/surplus_augments.dmi'
- brute_reduction = 1
- burn_reduction = 1
- max_damage = 30
+ brute_reduction = 3
+ burn_reduction = 2
+ max_damage = 55
#undef ROBOTIC_LIGHT_BRUTE_MSG
#undef ROBOTIC_MEDIUM_BRUTE_MSG
diff --git a/html/changelogs/AutoChangeLog-pr-8673.yml b/html/changelogs/AutoChangeLog-pr-8673.yml
new file mode 100644
index 0000000000..6ff2c7135c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8673.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - balance: "As all things are not"
diff --git a/html/changelogs/AutoChangeLog-pr-8986.yml b/html/changelogs/AutoChangeLog-pr-8986.yml
new file mode 100644
index 0000000000..810631f5f5
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-8986.yml
@@ -0,0 +1,6 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - rscadd: "reworked ninja's stealth mode. Increased invisibility, but engaging in combat, attacking or throwing things, bumping people will temporarily lower it."
+ - rscadd: "Ninja shoes are even stealthier."
+ - code_imp: "cleaned up some 2014 tier processing code horror."
diff --git a/html/changelogs/AutoChangeLog-pr-9022.yml b/html/changelogs/AutoChangeLog-pr-9022.yml
new file mode 100644
index 0000000000..4fb48506e4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9022.yml
@@ -0,0 +1,4 @@
+author: "Ghommie (by nemvar)"
+delete-after: True
+changes:
+ - tweak: "Dwarfs are now more robust."