diff --git a/code/game/objects/structures/crates_lockers/closets/l3closet.dm b/code/game/objects/structures/crates_lockers/closets/l3closet.dm
index 7c54614aa7..4074230d8d 100644
--- a/code/game/objects/structures/crates_lockers/closets/l3closet.dm
+++ b/code/game/objects/structures/crates_lockers/closets/l3closet.dm
@@ -38,7 +38,7 @@
..()
new /obj/item/clothing/suit/bio_suit/security(src)
new /obj/item/clothing/head/bio_hood/security(src)
-
+ new /obj/item/weapon/gun/energy/taser/xeno/sec(src)
/obj/structure/closet/l3closet/janitor
icon_state = "bio_janitor"
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index a8c12ed082..c28580fe6f 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -17,6 +17,8 @@
var/can_defib = 1 //Horrible damage (like beheadings) will prevent defibbing organics.
var/hiding = 0 // If the mob is hiding or not. Makes them appear under tables and the like.
+ var/active_regen = FALSE //Used for the regenerate proc in human_powers.dm
+ var/active_regen_delay = 300
/mob/living/carbon/human/New(var/new_loc, var/new_species = null)
@@ -1343,7 +1345,13 @@
return 0
/mob/living/carbon/human/slip(var/slipped_on, stun_duration=8)
- if((species.flags & NO_SLIP) || (shoes && (shoes.item_flags & NOSLIP)))
+ var/list/equipment = list(src.w_uniform,src.wear_suit,src.shoes)
+ var/footcoverage_check = FALSE
+ for(var/obj/item/clothing/C in equipment)
+ if(C.body_parts_covered & FEET)
+ footcoverage_check = TRUE
+ break
+ if((species.flags & NO_SLIP && !footcoverage_check) || (shoes && (shoes.item_flags & NOSLIP))) //Footwear negates a species' natural traction.
return 0
if(..(slipped_on,stun_duration))
return 1
diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm
index f1ece7f6e7..445d06a802 100644
--- a/code/modules/mob/living/carbon/human/human_powers.dm
+++ b/code/modules/mob/living/carbon/human/human_powers.dm
@@ -235,36 +235,50 @@
/mob/living/carbon/human/proc/regenerate()
set name = "Regenerate"
- set desc = "Allows you to regrow limbs and heal organs."
+ set desc = "Allows you to regrow limbs and heal organs after a period of rest."
set category = "Abilities"
if(nutrition < 250)
- to_chat(src, "You lack the biomass regrow anything!")
+ to_chat(src, "You lack the biomass to begin regeneration!")
return
- nutrition -= 200
+ if(active_regen)
+ to_chat(src, "You are already regenerating tissue!")
+ return
+ else
+ active_regen = TRUE
+ src.visible_message("[src]'s flesh begins to mend...")
- for(var/obj/item/organ/I in internal_organs)
- if(I.damage > 0)
- I.damage = 0
- to_chat(src, "You feel a soothing sensation within your [I.name]...")
+ var/delay_length = round(active_regen_delay * species.active_regen_mult)
+ if(do_after(src,delay_length))
+ nutrition -= 200
- // Replace completely missing limbs.
- for(var/limb_type in src.species.has_limbs)
- var/obj/item/organ/external/E = src.organs_by_name[limb_type]
- if(E && E.disfigured)
- E.disfigured = 0
- if(E && (E.is_stump() || (E.status & (ORGAN_DESTROYED|ORGAN_DEAD|ORGAN_MUTATED))))
- E.removed()
- qdel(E)
- E = null
- if(!E)
- var/list/organ_data = src.species.has_limbs[limb_type]
- var/limb_path = organ_data["path"]
- var/obj/item/organ/O = new limb_path(src)
- organ_data["descriptor"] = O.name
- to_chat(src, "You feel a slithering sensation as your [O.name] reform.")
- update_icons_all()
+ for(var/obj/item/organ/I in internal_organs)
+ if(I.damage > 0)
+ I.damage = max(I.damage - 30, 0) //Repair functionally half of a dead internal organ.
+ to_chat(src, "You feel a soothing sensation within your [I.name]...")
+
+ // Replace completely missing limbs.
+ for(var/limb_type in src.species.has_limbs)
+ var/obj/item/organ/external/E = src.organs_by_name[limb_type]
+ if(E && E.disfigured)
+ E.disfigured = 0
+ if(E && (E.is_stump() || (E.status & (ORGAN_DESTROYED|ORGAN_DEAD|ORGAN_MUTATED))))
+ E.removed()
+ qdel(E)
+ E = null
+ if(!E)
+ var/list/organ_data = src.species.has_limbs[limb_type]
+ var/limb_path = organ_data["path"]
+ var/obj/item/organ/O = new limb_path(src)
+ organ_data["descriptor"] = O.name
+ to_chat(src, "You feel a slithering sensation as your [O.name] reform.")
+ update_icons_all()
+ active_regen = FALSE
+ else
+ to_chat(src, "Your regeneration is interrupted!")
+ nutrition -= 75
+ active_regen = FALSE
/mob/living/carbon/human/proc/hide_humanoid()
set name = "Hide"
@@ -281,4 +295,4 @@
else
layer = MOB_LAYER
hiding = 0
- to_chat(src, "You have stopped hiding.")
\ No newline at end of file
+ to_chat(src, "You have stopped hiding.")
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index 1986b8416a..f91633f22a 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -42,6 +42,7 @@
var/blood_volume = 560 // Initial blood volume.
var/bloodloss_rate = 1 // Multiplier for how fast a species bleeds out. Higher = Faster
var/hunger_factor = 0.05 // Multiplier for hunger.
+ var/active_regen_mult = 1 // Multiplier for 'Regenerate' power speed, in human_powers.dm
var/taste_sensitivity = TASTE_NORMAL // How sensitive the species is to minute tastes.
diff --git a/code/modules/mob/living/carbon/human/species/station/prometheans.dm b/code/modules/mob/living/carbon/human/species/station/prometheans.dm
index 3704b2f912..3eb801dc9d 100644
--- a/code/modules/mob/living/carbon/human/species/station/prometheans.dm
+++ b/code/modules/mob/living/carbon/human/species/station/prometheans.dm
@@ -39,7 +39,7 @@ var/datum/species/shapeshifter/promethean/prometheans
virus_immune = 1
blood_volume = 560
min_age = 1
- max_age = 5
+ max_age = 10
brute_mod = 0.75
burn_mod = 2
oxy_mod = 0
@@ -56,7 +56,7 @@ var/datum/species/shapeshifter/promethean/prometheans
body_temperature = 310.15
- siemens_coefficient = 0.3
+ siemens_coefficient = 0.4
rarity_value = 5
genders = list(MALE, FEMALE, NEUTER, PLURAL)
diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station.dm b/code/modules/mob/living/silicon/robot/robot_modules/station.dm
index 17e6fe252c..96fee9bb51 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules/station.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules/station.dm
@@ -511,6 +511,7 @@ var/global/list/robot_modules = list(
src.modules += new /obj/item/weapon/handcuffs/cyborg(src)
src.modules += new /obj/item/weapon/melee/baton/robot(src)
src.modules += new /obj/item/weapon/gun/energy/taser/mounted/cyborg(src)
+ src.modules += new /obj/item/weapon/gun/energy/taser/xeno/sec/robot(src)
src.modules += new /obj/item/taperoll/police(src)
src.modules += new /obj/item/weapon/reagent_containers/spray/pepper(src)
src.emag = new /obj/item/weapon/gun/energy/laser/mounted(src)
diff --git a/code/modules/xenobio/items/weapons.dm b/code/modules/xenobio/items/weapons.dm
index a1aba76dab..d06ab9fdd3 100644
--- a/code/modules/xenobio/items/weapons.dm
+++ b/code/modules/xenobio/items/weapons.dm
@@ -56,20 +56,33 @@
name = "xeno taser gun"
desc = "Straight out of NT's testing laboratories, this small gun is used to subdue non-humanoid xeno life forms. \
While marketed towards handling slimes, it may be useful for other creatures."
- desc = "An easy to use weapon designed by NanoTrasen, for NanoTrasen. This weapon is designed to subdue lesser \
- xeno lifeforms at a distance. It is ineffective at stunning larger lifeforms such as humanoids."
icon_state = "taserold"
fire_sound = 'sound/weapons/taser2.ogg'
charge_cost = 120 // Twice as many shots.
projectile_type = /obj/item/projectile/beam/stun/xeno
accuracy = 2 // Make it a bit easier to hit the slimes.
description_info = "This gun will stun a slime or other lesser lifeform for about two seconds, if hit with the projectile it fires."
+ description_fluff = "An easy to use weapon designed by NanoTrasen, for NanoTrasen. This weapon is designed to subdue lesser \
+ xeno lifeforms at a distance. It is ineffective at stunning larger lifeforms such as humanoids."
/obj/item/weapon/gun/energy/taser/xeno/robot // Borg version
self_recharge = 1
use_external_power = 1
recharge_time = 3
+/obj/item/weapon/gun/energy/taser/xeno/sec //NT's corner-cutting option for their on-station security.
+ desc = "An NT Mk30 NL retrofitted to fire beams for subduing non-humanoid xeno life forms."
+ icon_state = "taserblue"
+ item_state = "taser"
+ projectile_type = /obj/item/projectile/beam/stun/xeno/weak
+ charge_cost = 240
+ accuracy = 0 //Same accuracy as a normal Sec taser.
+ description_fluff = "An NT Mk30 NL retrofitted after the events that occurred aboard the NRS Prometheus."
+
+/obj/item/weapon/gun/energy/taser/xeno/sec/robot //Cyborg variant of the security xeno-taser.
+ self_recharge = 1
+ use_external_power = 1
+ recharge_time = 3
/obj/item/projectile/beam/stun/xeno
icon_state = "omni"
@@ -83,7 +96,10 @@
tracer_type = /obj/effect/projectile/laser_omni/tracer
impact_type = /obj/effect/projectile/laser_omni/impact
-/obj/item/projectile/beam/stun/xeno/on_hit(var/atom/target, var/blocked = 0)
+/obj/item/projectile/beam/stun/xeno/weak //Weaker variant for non-research equipment, turrets, or rapid fire types.
+ agony = 3
+
+/obj/item/projectile/beam/stun/xeno/on_hit(var/atom/target, var/blocked = 0, var/def_zone = null)
if(istype(target, /mob/living))
var/mob/living/L = target
@@ -91,15 +107,15 @@
if(istype(L, /mob/living/simple_animal/slime))
var/mob/living/simple_animal/SA = L
if(SA.intelligence_level <= SA_ANIMAL) // So it doesn't stun hivebots or syndies.
- SA.Weaken(2) // Less powerful since its ranged, and therefore safer.
+ SA.Weaken(round(agony/2)) // Less powerful since its ranged, and therefore safer.
if(isslime(SA))
var/mob/living/simple_animal/slime/S = SA
- S.adjust_discipline(2)
+ S.adjust_discipline(round(agony/2))
// Prometheans.
if(ishuman(L))
var/mob/living/carbon/human/H = L
if(H.species && H.species.name == "Promethean")
- var/agony_to_apply = 60 - agony
- H.apply_damage(agony_to_apply, HALLOSS)
- ..()
\ No newline at end of file
+ if(agony == initial(agony))
+ agony = round((14 * agony) - agony) //60-4 = 56, 56 / 4 = 14. Prior was flat 60 - agony of the beam to equate to 60.
+ ..()
diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi
index 4bb7b955a0..06490a3cb4 100644
Binary files a/icons/obj/gun.dmi and b/icons/obj/gun.dmi differ