[src] dies!")
- new /obj/effect/decal/cleanable/spiderling_remains(src.loc)
+ new /obj/effect/decal/cleanable/spiderling_remains(loc)
qdel(src)
/obj/structure/spider/spiderling/healthcheck()
@@ -143,7 +146,7 @@
/obj/structure/spider/spiderling/process()
if(travelling_in_vent)
- if(istype(src.loc, /turf))
+ if(istype(loc, /turf))
travelling_in_vent = 0
entry_vent = null
else if(entry_vent)
@@ -190,7 +193,7 @@
var/target_atom = pick(nearby)
walk_to(src, target_atom)
if(prob(40))
- src.visible_message("\The [src] skitters[pick(" away"," around","")].")
+ visible_message("[src] skitters[pick(" away"," around","")].")
else if(prob(10))
//ventcrawl!
for(var/obj/machinery/atmospherics/unary/vent_pump/v in view(7,src))
@@ -203,8 +206,8 @@
if(amount_grown >= 100)
if(!grow_as)
grow_as = pick(typesof(/mob/living/simple_animal/hostile/poison/giant_spider))
- var/mob/living/simple_animal/hostile/poison/giant_spider/S = new grow_as(src.loc)
- S.faction = faction
+ var/mob/living/simple_animal/hostile/poison/giant_spider/S = new grow_as(loc)
+ S.faction = faction.Copy()
S.master_commander = master_commander
if(player_spiders && !selecting_player)
selecting_player = 1
@@ -213,9 +216,10 @@
if(candidates.len)
var/mob/C = pick(candidates)
- S.key = C.key
- if(master_commander)
- to_chat(S, "You are a spider who is loyal to [master_commander], obey [master_commander]'s every order and assist them in completing their goals at any cost.")
+ if(C)
+ S.key = C.key
+ if(S.master_commander)
+ to_chat(S, "You are a spider who is loyal to [S.master_commander], obey [S.master_commander]'s every order and assist them in completing their goals at any cost.")
qdel(src)
/obj/effect/decal/cleanable/spiderling_remains
@@ -232,7 +236,8 @@
health = 60
/obj/structure/spider/cocoon/New()
- icon_state = pick("cocoon1","cocoon2","cocoon3")
+ ..()
+ icon_state = pick("cocoon1","cocoon2","cocoon3")
/obj/structure/spider/cocoon/Destroy()
visible_message("[src] splits open.")
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 6764f192e69..91cc00384b0 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -225,7 +225,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
else
to_chat(user, "You burn your hand on [src]!")
var/obj/item/organ/external/affecting = H.get_organ("[user.hand ? "l" : "r" ]_arm")
- if(affecting && affecting.take_damage(0, 5)) // 5 burn damage
+ if(affecting && affecting.receive_damage(0, 5)) // 5 burn damage
H.UpdateDamageIcon()
H.updatehealth()
return
@@ -454,9 +454,9 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
var/obj/item/organ/internal/eyes/eyes = H.get_int_organ(/obj/item/organ/internal/eyes)
if(!eyes) // should still get stabbed in the head
var/obj/item/organ/external/head/head = H.bodyparts_by_name["head"]
- head.take_damage(rand(10,14), 1)
+ head.receive_damage(rand(10,14), 1)
return
- eyes.take_damage(rand(3,4), 1)
+ eyes.receive_damage(rand(3,4), 1)
if(eyes.damage >= eyes.min_bruised_damage)
if(M.stat != 2)
if(!(eyes.status & ORGAN_ROBOT) || !(eyes.status & ORGAN_ASSISTED)) //robot eyes bleeding might be a bit silly
@@ -472,7 +472,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
if(M.stat != 2)
to_chat(M, "You go blind!")
var/obj/item/organ/external/affecting = H.get_organ("head")
- if(affecting.take_damage(7))
+ if(affecting.receive_damage(7))
H.UpdateDamageIcon()
else
M.take_organ_damage(7)
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index be9a4a2094d..8a82d3cd73a 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -75,7 +75,7 @@
var/obj/item/organ/internal/eyes/eyes = H.get_int_organ(/obj/item/organ/internal/eyes)
if(M.stat == DEAD || !eyes || M.disabilities & BLIND) //mob is dead or fully blind
to_chat(user, "[M]'s pupils are unresponsive to the light!")
- else if((XRAY in M.mutations) || (eyes.colourblind_darkview && eyes.colourblind_darkview == eyes.get_dark_view())) //The mob's either got the X-RAY vision or has a tapetum lucidum (extreme nightvision, i.e. Vulp/Tajara with COLOURBLIND & their monkey forms).
+ else if((XRAY in M.mutations) || eyes.get_dark_view() >= 8) //The mob's either got the X-RAY vision or has a tapetum lucidum (extreme nightvision, i.e. Vulp/Tajara with COLOURBLIND & their monkey forms).
to_chat(user, "[M]'s pupils glow eerily!")
else //they're okay!
if(M.flash_eyes(visual = 1))
diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm
index 2d790a8df1f..9d0f39285bc 100644
--- a/code/game/objects/items/robot/robot_items.dm
+++ b/code/game/objects/items/robot/robot_items.dm
@@ -36,198 +36,3 @@
name = "Overdrive"
icon = 'icons/obj/decals.dmi'
icon_state = "shock"
-
-#define BORG_HUG 0
-#define BORG_HUG_SUPER 1
-#define BORG_HUG_SHOCK 2
-#define BORG_HUG_CRUSH 3
-
-/obj/item/borg/cyborghug
- name = "Hugging Module"
- icon_state = "hugmodule"
- desc = "For when a someone really needs a hug."
- var/mode = BORG_HUG //0 = Hugs 1 = "Hug" 2 = Shock 3 = CRUSH
- var/ccooldown = 0
- var/scooldown = 0
- var/shockallowed = FALSE//Can it be a stunarm when emagged. Only PK borgs get this by default.
- var/boop = FALSE
-
-/obj/item/borg/cyborghug/attack_self(mob/living/user)
- if(isrobot(user))
- var/mob/living/silicon/robot/P = user
- if(P.emagged && shockallowed)
- if(mode < BORG_HUG_CRUSH)
- mode++
- else
- mode = BORG_HUG
- else if(mode < BORG_HUG_SUPER)
- mode++
- else
- mode = BORG_HUG
- switch(mode)
- if(BORG_HUG)
- to_chat(user, "Power reset. Hugs!")
- if(BORG_HUG_SUPER)
- to_chat(user, "Power increased!")
- if(BORG_HUG_SHOCK)
- to_chat(user, "BZZT. Electrifying arms...")
- if(BORG_HUG_CRUSH)
- to_chat(user, "ERROR: ARM ACTUATORS OVERLOADED.")
-
-/obj/item/borg/cyborghug/attack(mob/living/M, mob/living/silicon/robot/user)
- if(M == user)
- return
- switch(mode)
- if(BORG_HUG)
- if(M.health >= config.health_threshold_crit)
- if(user.zone_sel.selecting == "head")
- user.visible_message("[user] playfully boops [M] on the head!", \
- "You playfully boop [M] on the head!")
- user.do_attack_animation(M)
- playsound(loc, 'sound/weapons/tap.ogg', 50, 1, -1)
- else if(ishuman(M))
- if(M.lying)
- user.visible_message("[user] shakes [M] trying to get \him up!", \
- "You shake [M] trying to get \him up!")
- else
- user.visible_message("[user] hugs [M] to make \him feel better!", \
- "You hug [M] to make \him feel better!")
- if(M.resting)
- M.resting = FALSE
- M.update_canmove()
- else
- user.visible_message("[user] pets [M]!", \
- "You pet [M]!")
- playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
- if(BORG_HUG_SUPER)
- if(M.health >= config.health_threshold_crit)
- if(ishuman(M))
- if(M.lying)
- user.visible_message("[user] shakes [M] trying to get \him up!", \
- "You shake [M] trying to get \him up!")
- else if(user.zone_sel.selecting == "head")
- user.visible_message("[user] bops [M] on the head!", \
- "You bop [M] on the head!")
- user.do_attack_animation(M)
- else
- user.visible_message("[user] hugs [M] in a firm bear-hug! [M] looks uncomfortable...", \
- "You hug [M] firmly to make \him feel better! [M] looks uncomfortable...")
- if(M.resting)
- M.resting = FALSE
- M.update_canmove()
- else
- user.visible_message("[user] bops [M] on the head!", \
- "You bop [M] on the head!")
- playsound(loc, 'sound/weapons/tap.ogg', 50, 1, -1)
- if(BORG_HUG_SHOCK)
- if(!scooldown)
- if(M.health >= config.health_threshold_crit)
- if(ishuman(M))
- M.electrocute_act(5, "[user]", safety = 1)
- user.visible_message("[user] electrocutes [M] with their touch!", \
- "You electrocute [M] with your touch!")
- M.update_canmove()
- else
- if(!isrobot(M))
- M.adjustFireLoss(10)
- user.visible_message("[user] shocks [M]!", \
- "You shock [M]!")
- else
- user.visible_message("[user] shocks [M]. It does not seem to have an effect", \
- "You shock [M] to no effect.")
- playsound(loc, 'sound/effects/sparks2.ogg', 50, 1, -1)
- user.cell.charge -= 500
- scooldown = TRUE
- spawn(20)
- scooldown = FALSE
- if(BORG_HUG_CRUSH)
- if(!ccooldown)
- if(M.health >= config.health_threshold_crit)
- if(ishuman(M))
- user.visible_message("[user] crushes [M] in their grip!", \
- "You crush [M] in your grip!")
- else
- user.visible_message("[user] crushes [M]!", \
- "You crush [M]!")
- playsound(loc, 'sound/weapons/smash.ogg', 50, 1, -1)
- M.adjustBruteLoss(15)
- user.cell.charge -= 300
- ccooldown = TRUE
- spawn(10)
- ccooldown = FALSE
-
-#undef BORG_HUG
-#undef BORG_HUG_SUPER
-#undef BORG_HUG_SHOCK
-#undef BORG_HUG_CRUSH
-
-/obj/item/borg/cyborghug/peacekeeper
- shockallowed = TRUE
-
-/obj/item/device/harmalarm
- name = "Sonic Harm Prevention Tool"
- desc = "Releases a harmless blast that confuses most organics. For when the harm is JUST TOO MUCH"
- icon_state = "megaphone"
- var/cooldown = 0
- var/emagged = FALSE
-
-/obj/item/device/harmalarm/emag_act(mob/user)
- emagged = !emagged
- if(emagged)
- to_chat(user, "You short out the safeties on the [src]!")
- else
- to_chat(user, "You reset the safeties on the [src]!")
-
-/obj/item/device/harmalarm/attack_self(mob/user)
- var/safety = !emagged
- if(cooldown > world.time)
- to_chat(user, "The device is still recharging!")
- return
-
- if(isrobot(user))
- var/mob/living/silicon/robot/R = user
- if(R.cell.charge < 1200)
- to_chat(user, "You don't have enough charge to do this!")
- return
- R.cell.charge -= 1000
- if(R.emagged)
- safety = FALSE
-
- if(safety)
- user.visible_message("[user] blares out a near-deafening siren from its speakers!")
- for(var/mob/living/carbon/M in get_mobs_in_view(9, user))
- if(!M.check_ear_prot())
- M.AdjustConfused(6)
- to_chat(M, "The siren pierces your hearing!")
- audible_message("HUMAN HARM")
- playsound(get_turf(src), 'sound/AI/harmalarm.ogg', 70, 3)
- cooldown = world.time + 200
- log_game("[key_name(user)] used a Cyborg Harm Alarm in ([user.x],[user.y],[user.z])")
- if(isrobot(user))
- var/mob/living/silicon/robot/R = user
- if(R.connected_ai)
- to_chat(R.connected_ai, "
NOTICE - Peacekeeping 'HARM ALARM' used by: [user]
")
-
- return
-
- user.audible_message("BZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZT")
- for(var/mob/living/carbon/human/H in get_mobs_in_view(9, user))
- if(istype(H.l_ear, /obj/item/clothing/ears/earmuffs) || istype(H.r_ear, /obj/item/clothing/ears/earmuffs) || H.ear_deaf)
- continue
- var/earsafety = FALSE
- if(H.check_ear_prot())
- earsafety = TRUE
-
- if(earsafety)
- H.AdjustConfused(5)
- H.AdjustStuttering(10)
- H.Jitter(10)
- else
- H.Weaken(2)
- H.AdjustConfused(10)
- H.AdjustStuttering(15)
- H.Jitter(25)
-
- playsound(get_turf(src), 'sound/machines/warning-buzzer.ogg', 130, 3)
- cooldown = world.time + 600
- log_game("[key_name(user)] used an emagged Cyborg Harm Alarm in ([user.x],[user.y],[user.z])")
diff --git a/code/game/objects/items/weapons/RSF.dm b/code/game/objects/items/weapons/RSF.dm
index 85ff13fe370..e87ced24668 100644
--- a/code/game/objects/items/weapons/RSF.dm
+++ b/code/game/objects/items/weapons/RSF.dm
@@ -84,76 +84,3 @@ RSF
playsound(loc, 'sound/machines/click.ogg', 10, 1)
var/type_path = configured_items[mode][3]
new type_path(spawn_location)
-
-/obj/item/weapon/cookiesynth
- name = "\improper Cookie Synthesizer"
- desc = "A self-recharging device used to rapidly deploy cookies."
- icon = 'icons/obj/tools.dmi'
- icon_state = "rcd"
- var/matter = 10
- var/toxin = FALSE
- var/cooldown = 0
- var/cooldowndelay = 10
- var/emagged = FALSE
- w_class = WEIGHT_CLASS_NORMAL
-
-/obj/item/weapon/cookiesynth/examine(mob/user)
- ..()
- to_chat(user, "It currently holds [matter]/10 cookie-units.")
-
-/obj/item/weapon/cookiesynth/attackby()
- return
-
-/obj/item/weapon/cookiesynth/emag_act(mob/user)
- emagged = !emagged
- if(emagged)
- to_chat(user, "You short out [src]'s reagent safety checker!")
- else
- to_chat(user, "You reset [src]'s reagent safety checker!")
- toxin = FALSE
-
-/obj/item/weapon/cookiesynth/attack_self(mob/user)
- var/mob/living/silicon/robot/P = null
- if(isrobot(user))
- P = user
- if(emagged && !toxin)
- toxin = TRUE
- to_chat(user, "Cookie Synthesizer Hacked.")
- else if(P.emagged && !toxin)
- toxin = TRUE
- to_chat(user, "Cookie Synthesizer Hacked.")
- else
- toxin = FALSE
- to_chat(user, "Cookie Synthesizer Reset.")
-
-/obj/item/weapon/cookiesynth/process()
- if(matter < 10)
- matter++
-
-/obj/item/weapon/cookiesynth/afterattack(atom/A, mob/user, proximity)
- if(cooldown > world.time)
- return
- if(!proximity)
- return
- if(!(istype(A, /obj/structure/table) || isfloorturf(A)))
- return
- if(matter < 1)
- to_chat(user, "[src] doesn't have enough matter left. Wait for it to recharge!")
- return
- if(isrobot(user))
- var/mob/living/silicon/robot/R = user
- if(!R.cell || R.cell.charge < 400)
- to_chat(user, "You do not have enough power to use [src].")
- return
- var/turf/T = get_turf(A)
- playsound(loc, 'sound/machines/click.ogg', 10, 1)
- to_chat(user, "Fabricating Cookie..")
- var/obj/item/weapon/reagent_containers/food/snacks/cookie/S = new /obj/item/weapon/reagent_containers/food/snacks/cookie(T)
- if(toxin)
- S.reagents.add_reagent("pancuronium", 2.4)
- if(isrobot(user))
- var/mob/living/silicon/robot/R = user
- R.cell.charge -= 100
- else
- matter--
- cooldown = world.time + cooldowndelay
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm
index 36ef7167d85..650173d29eb 100644
--- a/code/game/objects/items/weapons/grenades/flashbang.dm
+++ b/code/game/objects/items/weapons/grenades/flashbang.dm
@@ -37,7 +37,7 @@
var/mob/living/carbon/human/H = M
var/obj/item/organ/internal/eyes/E = H.get_int_organ(/obj/item/organ/internal/eyes)
if(E)
- E.take_damage(8, 1)
+ E.receive_damage(8, 1)
if(M.flash_eyes(affect_silicon = 1))
M.Stun(max(10/distance, 3))
diff --git a/code/game/objects/items/weapons/lighters.dm b/code/game/objects/items/weapons/lighters.dm
index 6525351fd67..fb863582b83 100644
--- a/code/game/objects/items/weapons/lighters.dm
+++ b/code/game/objects/items/weapons/lighters.dm
@@ -50,7 +50,7 @@
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/affecting = H.get_organ("[user.hand ? "l" : "r" ]_hand")
- if(affecting.take_damage( 0, 5 )) //INFERNO
+ if(affecting.receive_damage( 0, 5 )) //INFERNO
H.UpdateDamageIcon()
H.updatehealth()
user.visible_message("After a few attempts, [user] manages to light the [src], they however burn their finger in the process.")
diff --git a/code/game/objects/items/weapons/shards.dm b/code/game/objects/items/weapons/shards.dm
index 7b87deadb3e..71e0e079282 100644
--- a/code/game/objects/items/weapons/shards.dm
+++ b/code/game/objects/items/weapons/shards.dm
@@ -47,7 +47,7 @@
if(affecting.status & ORGAN_ROBOT)
return
to_chat(H, "[src] cuts into your hand!")
- if(affecting.take_damage(force*0.5))
+ if(affecting.receive_damage(force*0.5))
H.UpdateDamageIcon()
H.updatehealth()
@@ -84,7 +84,7 @@
if(affecting.status & ORGAN_ROBOT)
return
H.Weaken(3)
- if(affecting.take_damage(5, 0))
+ if(affecting.receive_damage(5, 0))
H.UpdateDamageIcon()
H.updatehealth()
..()
diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm
index 8794c09014b..3f00657881b 100644
--- a/code/game/objects/items/weapons/storage/firstaid.dm
+++ b/code/game/objects/items/weapons/storage/firstaid.dm
@@ -165,12 +165,12 @@
/obj/item/weapon/storage/firstaid/tactical/New()
..()
if(empty) return
- new /obj/item/clothing/accessory/stethoscope( src )
- new /obj/item/weapon/defibrillator/compact/combat/loaded(src)
new /obj/item/weapon/reagent_containers/hypospray/combat(src)
- new /obj/item/weapon/reagent_containers/food/pill/patch/styptic(src)
- new /obj/item/weapon/reagent_containers/food/pill/patch/silver_sulf(src)
- new /obj/item/weapon/reagent_containers/ld50_syringe/lethal(src)
+ new /obj/item/weapon/reagent_containers/food/pill/patch/synthflesh(src) // Because you ain't got no time to look at what damage dey taking yo
+ new /obj/item/weapon/reagent_containers/food/pill/patch/synthflesh(src)
+ new /obj/item/weapon/reagent_containers/food/pill/patch/synthflesh(src)
+ new /obj/item/weapon/reagent_containers/food/pill/patch/synthflesh(src)
+ new /obj/item/weapon/defibrillator/compact/combat/loaded(src)
new /obj/item/clothing/glasses/hud/health/night(src)
return
diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm
index 3ce0f32d47a..7666e9f9851 100644
--- a/code/game/objects/items/weapons/swords_axes_etc.dm
+++ b/code/game/objects/items/weapons/swords_axes_etc.dm
@@ -1,9 +1,7 @@
/* Weapons
* Contains:
* Banhammer
- * Sword
* Classic Baton
- * Energy Shield
*/
/*
diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm
new file mode 100644
index 00000000000..c78d8d0e2b4
--- /dev/null
+++ b/code/game/objects/obj_defense.dm
@@ -0,0 +1,57 @@
+
+/obj/proc/take_damage()
+ return
+
+//the sound played when the obj is damaged.
+/obj/proc/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
+ switch(damage_type)
+ if(BRUTE)
+ if(damage_amount)
+ playsound(src, 'sound/weapons/smash.ogg', 50, 1)
+ else
+ playsound(src, 'sound/weapons/tap.ogg', 50, 1)
+ if(BURN)
+ playsound(src.loc, 'sound/items/welder.ogg', 100, 1)
+
+/obj/singularity_act()
+ ex_act(1)
+ if(src && !qdeleted(src))
+ qdel(src)
+ return 2
+
+//// FIRE
+
+/obj/fire_act(global_overlay=1)
+ if(!burn_state)
+ burn_state = ON_FIRE
+ fire_master.burning += src
+ burn_world_time = world.time + burntime*rand(10,20)
+ if(global_overlay)
+ overlays += fire_overlay
+ return 1
+
+/obj/proc/burn()
+ empty_object_contents(1, loc)
+ var/obj/effect/decal/cleanable/ash/A = new(loc)
+ A.desc = "Looks like this used to be a [name] some time ago."
+ fire_master.burning -= src
+ qdel(src)
+
+/obj/proc/extinguish()
+ if(burn_state == ON_FIRE)
+ burn_state = FLAMMABLE
+ overlays -= fire_overlay
+ fire_master.burning -= src
+
+/obj/proc/tesla_act(power)
+ being_shocked = TRUE
+ var/power_bounced = power * 0.5
+ tesla_zap(src, 3, power_bounced)
+ addtimer(src, "reset_shocked", 10)
+
+/obj/proc/reset_shocked()
+ being_shocked = FALSE
+
+//the obj is deconstructed into pieces, whether through careful disassembly or when destroyed.
+/obj/proc/deconstruct(disassembled = TRUE)
+ qdel(src)
\ No newline at end of file
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index 60f9538fde0..daea457e696 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -9,10 +9,14 @@
var/list/attack_verb = list() //Used in attackby() to say how something was attacked "[x] has been [z.attack_verb] by [y] with [z]"
var/sharp = 0 // whether this object cuts
var/in_use = 0 // If we have a user using us, this will be set on. We will check if the user has stopped using us, and thus stop updating and LAGGING EVERYTHING!
-
+ var/can_deconstruct = TRUE
var/damtype = "brute"
var/force = 0
+ var/obj_integrity //defaults to max_integrity
+ var/max_integrity = 500
+ var/integrity_failure = 0 //0 if we have no special broken behavior
+
var/Mtoollink = 0 // variable to decide if an object should show the multitool menu linking menu, not all objects use it
var/burn_state = FIRE_PROOF // LAVA_PROOF | FIRE_PROOF | FLAMMABLE | ON_FIRE
@@ -25,7 +29,8 @@
/obj/New()
. = ..()
-
+ if(obj_integrity == null)
+ obj_integrity = max_integrity
if(on_blueprints && isturf(loc))
var/turf/T = loc
if(force_blueprints)
@@ -158,10 +163,6 @@
if(istype(M) && M.client && M.machine == src)
src.attack_self(M)
-
-/obj/proc/alter_health()
- return 1
-
/obj/proc/hide(h)
return
@@ -253,12 +254,6 @@ a {
user.set_machine(src)
onclose(user, "mtcomputer")
-/obj/singularity_act()
- ex_act(1.0)
- if(src && isnull(gcDestroyed))
- qdel(src)
- return 2
-
/obj/singularity_pull(S, current_size)
if(anchored)
if(current_size >= STAGE_FIVE)
@@ -269,40 +264,9 @@ a {
/obj/proc/container_resist(var/mob/living)
return
-/obj/proc/tesla_act(var/power)
- being_shocked = 1
- var/power_bounced = power * 0.5
- tesla_zap(src, 3, power_bounced)
- addtimer(src, "reset_shocked", 10)
-
-/obj/proc/reset_shocked()
- being_shocked = 0
-
/obj/proc/CanAStarPass()
. = !density
-/obj/fire_act(global_overlay=1)
- if(!burn_state)
- burn_state = ON_FIRE
- fire_master.burning += src
- burn_world_time = world.time + burntime*rand(10,20)
- if(global_overlay)
- overlays += fire_overlay
- return 1
-
-/obj/proc/burn()
- empty_object_contents(1, loc)
- var/obj/effect/decal/cleanable/ash/A = new(loc)
- A.desc = "Looks like this used to be a [name] some time ago."
- fire_master.burning -= src
- qdel(src)
-
-/obj/proc/extinguish()
- if(burn_state == ON_FIRE)
- burn_state = FLAMMABLE
- overlays -= fire_overlay
- fire_master.burning -= src
-
/obj/proc/empty_object_contents(burn = 0, new_loc = loc)
for(var/obj/item/Item in contents) //Empty out the contents
Item.forceMove(new_loc)
diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm
index 91b232c051a..2f05d26dd53 100644
--- a/code/game/objects/structures.dm
+++ b/code/game/objects/structures.dm
@@ -138,7 +138,7 @@
if(affecting)
to_chat(M, "You land heavily on your [affecting.name]!")
- affecting.take_damage(damage, 0)
+ affecting.receive_damage(damage, 0)
if(affecting.parent)
affecting.parent.add_autopsy_data("Misadventure", damage)
else
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 931b777552f..4c8a2528b1e 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -33,9 +33,6 @@
dump_contents()
return ..()
-/obj/structure/closet/alter_health()
- return get_turf(src)
-
/obj/structure/closet/CanPass(atom/movable/mover, turf/target, height=0)
if(height==0 || wall_mounted) return 1
return (!density)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
index 9f1783381f5..2805d0c0c51 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
@@ -247,6 +247,7 @@
new /obj/item/clothing/head/helmet/space/eva/paramedic(src)
new /obj/item/device/sensor_device(src)
new /obj/item/key/ambulance(src)
+ new /obj/item/weapon/pinpointer/crew(src)
/obj/structure/closet/secure_closet/reagents
name = "chemical storage closet"
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index 38a8fe42377..36ff8dc2455 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -234,6 +234,7 @@
..()
new /obj/item/weapon/storage/briefcase(src)
new /obj/item/weapon/storage/firstaid/adv(src)
+ new /obj/item/weapon/pinpointer/crew(src)
new /obj/item/weapon/storage/belt/security/sec(src)
new /obj/item/weapon/grenade/flashbang(src)
new /obj/item/device/flash(src)
diff --git a/code/game/objects/structures/curtains.dm b/code/game/objects/structures/curtains.dm
index 0fbc7b97879..d80f7bc8afd 100644
--- a/code/game/objects/structures/curtains.dm
+++ b/code/game/objects/structures/curtains.dm
@@ -67,7 +67,7 @@
else
. = ..()
-/obj/structure/curtain/proc/deconstruct(disassembled = TRUE)
+/obj/structure/curtain/deconstruct(disassembled = TRUE)
new /obj/item/stack/sheet/cloth(loc, 2)
new /obj/item/stack/sheet/plastic(loc, 2)
new /obj/item/stack/rods(loc, 1)
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index c8877b320ff..42f6a20e261 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -9,7 +9,6 @@
var/health = 200
var/can_displace = TRUE //If the girder can be moved around by crowbarring it
var/metalUsed = 2 //used to determine amount returned in deconstruction
- var/can_deconstruct = TRUE
/obj/structure/girder/examine(mob/user)
. = ..()
@@ -42,7 +41,7 @@
take_damage(rand(25, 75))
return
-/obj/structure/girder/proc/take_damage(amount)
+/obj/structure/girder/take_damage(amount)
health -= amount
if(health <= 0)
new /obj/item/stack/sheet/metal(get_turf(src))
@@ -369,7 +368,7 @@
var/atom/movable/mover = caller
. = . || mover.checkpass(PASSGRILLE)
-/obj/structure/girder/proc/deconstruct(disassembled = TRUE)
+/obj/structure/girder/deconstruct(disassembled = TRUE)
if(can_deconstruct)
var/remains = pick(/obj/item/stack/rods,/obj/item/stack/sheet/metal)
new remains(loc)
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index 36215a850c5..c04e2e94583 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -11,7 +11,6 @@
level = 3
var/health = 10
var/broken = 0
- var/can_deconstruct = TRUE
var/rods_type = /obj/item/stack/rods
var/rods_amount = 2
var/rods_broken = 1
@@ -243,7 +242,17 @@
visible_message("[user] has hit [src] with [I]!")
take_damage(I.force * 0.3, I.damtype)
-/obj/structure/grille/proc/deconstruct(disassembled = TRUE)
+/obj/structure/grille/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
+ switch(damage_type)
+ if(BRUTE)
+ if(damage_amount)
+ playsound(src, 'sound/effects/grillehit.ogg', 80, 1)
+ else
+ playsound(src, 'sound/weapons/tap.ogg', 50, 1)
+ if(BURN)
+ playsound(src, 'sound/items/welder.ogg', 80, 1)
+
+/obj/structure/grille/deconstruct(disassembled = TRUE)
if(!loc) //if already qdel'd somehow, we do nothing
return
if(can_deconstruct)
@@ -258,20 +267,10 @@
transfer_fingerprints_to(R)
qdel(src)
-/obj/structure/grille/proc/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
- switch(damage_type)
- if(BURN)
- if(sound_effect)
- playsound(loc, 'sound/items/welder.ogg', 80, 1)
- if(BRUTE)
- if(sound_effect)
- if(damage)
- playsound(loc, 'sound/effects/grillehit.ogg', 80, 1)
- else
- playsound(loc, 'sound/weapons/tap.ogg', 50, 1)
- else
- return
- health -= damage
+/obj/structure/grille/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
+ if(sound_effect)
+ play_attack_sound(damage_amount, damage_type, damage_flag)
+ health -= damage_amount
if(health <= 0)
if(!broken)
obj_break()
diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm
index 0dad11674b5..66680ecc8f5 100644
--- a/code/game/objects/structures/mineral_doors.dm
+++ b/code/game/objects/structures/mineral_doors.dm
@@ -54,7 +54,7 @@
/obj/structure/mineral_door/attack_animal(mob/user)
return TryToSwitchState(user)
-
+
/obj/structure/mineral_door/attack_ghost(mob/user)
if(user.can_advanced_admin_interact())
SwitchState()
@@ -68,11 +68,11 @@
return !density
/obj/structure/mineral_door/proc/TryToSwitchState(atom/user)
- if(isSwitchingStates)
+ if(isSwitchingStates)
return
if(isliving(user))
var/mob/living/M = user
- if(world.time - user.last_bumped <= 60)
+ if(world.time - user.last_bumped <= 60)
return //NOTE do we really need that?
if(M.client)
if(iscarbon(M))
@@ -101,7 +101,7 @@
air_update_turf(1)
update_icon()
isSwitchingStates = 0
-
+
if(close_delay != -1)
spawn(close_delay)
Close()
@@ -157,7 +157,7 @@
if(hardness <= 0)
deconstruct(FALSE)
-/obj/structure/mineral_door/proc/deconstruct(disassembled = TRUE)
+/obj/structure/mineral_door/deconstruct(disassembled = TRUE)
var/turf/T = get_turf(src)
if(sheetType)
if(disassembled)
diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm
index 540c2e079aa..744bd26fc85 100644
--- a/code/game/objects/structures/morgue.dm
+++ b/code/game/objects/structures/morgue.dm
@@ -92,10 +92,6 @@
return
return
-/obj/structure/morgue/alter_health()
- return loc
-
-
/obj/structure/morgue/attack_hand(mob/user as mob)
if(connected)
for(var/atom/movable/A as mob|obj in connected.loc)
@@ -290,10 +286,6 @@
return
return
-/obj/structure/crematorium/alter_health()
- return loc
-
-
/obj/structure/crematorium/attack_hand(mob/user as mob)
if(cremating)
to_chat(usr, "It's locked.")
diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm
new file mode 100644
index 00000000000..d9eff5b9ea3
--- /dev/null
+++ b/code/game/objects/structures/plasticflaps.dm
@@ -0,0 +1,135 @@
+/obj/structure/plasticflaps
+ name = "plastic flaps"
+ desc = "Completely impassable - or are they?"
+ icon = 'icons/obj/stationobjs.dmi'
+ icon_state = "plasticflaps"
+ density = 0
+ anchored = 1
+ layer = 4
+ var/list/mobs_can_pass = list(
+ /mob/living/carbon/slime,
+ /mob/living/simple_animal/mouse,
+ /mob/living/silicon/robot/drone,
+ /mob/living/simple_animal/bot/mulebot
+ )
+ var/state = PLASTIC_FLAPS_NORMAL
+
+/obj/structure/plasticflaps/examine(mob/user)
+ . = ..()
+ switch(state)
+ if(PLASTIC_FLAPS_NORMAL)
+ to_chat(user, "[src] are screwed to the floor.")
+ if(PLASTIC_FLAPS_DETACHED)
+ to_chat(user, "[src] are no longer screwed to the floor, and the flaps can be sliced apart.")
+
+/obj/structure/plasticflaps/attackby(obj/item/W, mob/user, params)
+ add_fingerprint(user)
+ if(isscrewdriver(W))
+ if(state == PLASTIC_FLAPS_NORMAL)
+ playsound(loc, W.usesound, 100, 1)
+ user.visible_message("[user] unscrews [src] from the floor.", "You start to unscrew [src] from the floor...", "You hear rustling noises.")
+ if(do_after(user, 180*W.toolspeed, target = src))
+ if(state != PLASTIC_FLAPS_NORMAL)
+ return
+ state = PLASTIC_FLAPS_DETACHED
+ anchored = FALSE
+ to_chat(user, "You unscrew [src] from the floor.")
+ else if(state == PLASTIC_FLAPS_DETACHED)
+ playsound(loc, W.usesound, 100, 1)
+ user.visible_message("[user] screws [src] to the floor.", "You start to screw [src] to the floor...", "You hear rustling noises.")
+ if(do_after(user, 40*W.toolspeed, target = src))
+ if(state != PLASTIC_FLAPS_DETACHED)
+ return
+ state = PLASTIC_FLAPS_NORMAL
+ anchored = TRUE
+ to_chat(user, "You screw [src] to the floor.")
+ else if(iswelder(W))
+ if(state == PLASTIC_FLAPS_DETACHED)
+ var/obj/item/weapon/weldingtool/WT = W
+ if(!WT.remove_fuel(0, user))
+ return
+ playsound(loc, WT.usesound, 100, 1)
+ user.visible_message("[user] slices apart [src].", "You start to slice apart [src].", "You hear welding.")
+ if(do_after(user, 120*WT.toolspeed, target = src))
+ if(state != PLASTIC_FLAPS_DETACHED)
+ return
+ to_chat(user, "You slice apart [src].")
+ var/obj/item/stack/sheet/plastic/five/P = new(loc)
+ P.add_fingerprint(user)
+ qdel(src)
+ else
+ . = ..()
+
+/obj/structure/plasticflaps/CanPass(atom/A, turf/T)
+ if(istype(A) && A.checkpass(PASSGLASS))
+ return prob(60)
+
+ var/obj/structure/stool/bed/B = A
+ if(istype(A, /obj/structure/stool/bed) && B.buckled_mob)//if it's a bed/chair and someone is buckled, it will not pass
+ return 0
+
+ if(istype(A, /obj/structure/closet/cardboard))
+ var/obj/structure/closet/cardboard/C = A
+ if(C.move_delay)
+ return 0
+
+ if(istype(A, /obj/vehicle)) //no vehicles
+ return 0
+
+ var/mob/living/M = A
+ if(istype(M))
+ if(M.lying)
+ return ..()
+ for(var/mob_type in mobs_can_pass)
+ if(istype(A, mob_type))
+ return ..()
+ if(istype(A, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = M
+ if(H.species.is_small)
+ return ..()
+ return 0
+
+ return ..()
+
+
+/obj/structure/plasticflaps/CanAStarPass(ID, to_dir, caller)
+ if(istype(caller, /mob/living))
+ for(var/mob_type in mobs_can_pass)
+ if(istype(caller, mob_type))
+ return 1
+
+ var/mob/living/M = caller
+ if(!M.ventcrawler && M.mob_size > MOB_SIZE_SMALL)
+ return 0
+ return 1
+
+/obj/structure/plasticflaps/ex_act(severity)
+ switch(severity)
+ if(1)
+ qdel(src)
+ if(2)
+ if(prob(50))
+ qdel(src)
+ if(3)
+ if(prob(5))
+ qdel(src)
+
+/obj/structure/plasticflaps/deconstruct(disassembled = TRUE)
+ if(can_deconstruct)
+ new /obj/item/stack/sheet/plastic/five(loc)
+ qdel(src)
+
+/obj/structure/plasticflaps/mining //A specific type for mining that doesn't allow airflow because of them damn crates
+ name = "airtight plastic flaps"
+ desc = "Heavy duty, airtight, plastic flaps."
+
+/obj/structure/plasticflaps/mining/initialize()
+ air_update_turf(1)
+ ..()
+
+/obj/structure/plasticflaps/mining/Destroy()
+ air_update_turf(1)
+ return ..()
+
+/obj/structure/plasticflaps/mining/CanAtmosPass(turf/T)
+ return 0
\ No newline at end of file
diff --git a/code/game/response_team.dm b/code/game/response_team.dm
index f8a11af6026..47f026841f7 100644
--- a/code/game/response_team.dm
+++ b/code/game/response_team.dm
@@ -51,7 +51,7 @@ var/ert_request_answered = 0
to_chat(src, "This role is not yet available to you. You need to wait another [player_age_check] days.")
return 0
- if(has_enabled_antagHUD == 1 && config.antag_hud_restricted)
+ if(cannotPossess(src))
to_chat(src, "Upon using the antagHUD you forfeited the ability to join the round.")
return 0
diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm
index 28393927f20..e3bb99d52fe 100644
--- a/code/game/verbs/ooc.dm
+++ b/code/game/verbs/ooc.dm
@@ -82,21 +82,8 @@ var/global/admin_ooc_colour = "#b82e00"
if(!config.disable_ooc_emoji)
msg = "[msg]"
- msg = apply_formatting(msg)
-
to_chat(C, "OOC: [display_name]: [msg]")
-/proc/apply_formatting(message)
- var/static/regex/italics = new("(?$1")
- message = strikethrough.Replace(message, "$1")
- message = escape.Replace(message, "$1")//jesus christ, regex
-
- return message
-
/proc/toggle_ooc()
config.ooc_allowed = ( !config.ooc_allowed )
if(config.ooc_allowed)
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index d2266b9a70f..28df27026a6 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -171,7 +171,6 @@ var/list/admin_verbs_debug = list(
/client/proc/map_template_upload,
/client/proc/view_runtimes,
/client/proc/admin_serialize,
- /client/proc/admin_deserialize,
/client/proc/jump_to_ruin,
/client/proc/toggle_medal_disable,
/client/proc/startadmintickets,
diff --git a/code/modules/admin/verbs/serialization.dm b/code/modules/admin/verbs/serialization.dm
index 41ba5d11aa1..1c087b9e8fc 100644
--- a/code/modules/admin/verbs/serialization.dm
+++ b/code/modules/admin/verbs/serialization.dm
@@ -3,7 +3,7 @@
set desc = "Turns your marked object into a JSON string you can later use to re-create the object"
set category = "Debug"
- if(!check_rights(R_ADMIN))
+ if(!check_rights(R_ADMIN|R_DEBUG))
return
if(!istype(holder.marked_datum, /atom/movable))
@@ -18,7 +18,7 @@
set desc = "Creates an object from a JSON string"
set category = "Debug"
- if(!check_rights(R_ADMIN|R_DEBUG))
+ if(!check_rights(R_SPAWN)) // this involves spawning things
return
var/json_text = input("Enter the JSON code:","Text") as message|null
diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm
index e22923fa965..1e7cd0f089c 100644
--- a/code/modules/assembly/mousetrap.dm
+++ b/code/modules/assembly/mousetrap.dm
@@ -53,7 +53,7 @@
affecting = H.get_organ(type)
H.Stun(3)
if(affecting)
- affecting.take_damage(1, 0)
+ affecting.receive_damage(1, 0)
H.updatehealth()
else if(ismouse(target))
var/mob/living/simple_animal/mouse/M = target
diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm
index be88df0c4e4..48979fa9cab 100644
--- a/code/modules/awaymissions/corpse.dm
+++ b/code/modules/awaymissions/corpse.dm
@@ -117,7 +117,7 @@
name = "Syndicate Commando"
corpseuniform = /obj/item/clothing/under/syndicate
corpsesuit = /obj/item/clothing/suit/space/hardsuit/syndi
- corpseshoes = /obj/item/clothing/shoes/combat
+ corpseshoes = /obj/item/clothing/shoes/magboots/syndie
corpsegloves = /obj/item/clothing/gloves/combat
corpseradio = /obj/item/device/radio/headset
corpsemask = /obj/item/clothing/mask/gas/syndicate
diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm
index 5effa505d7a..94453e2c058 100644
--- a/code/modules/awaymissions/mission_code/wildwest.dm
+++ b/code/modules/awaymissions/mission_code/wildwest.dm
@@ -215,4 +215,76 @@
to_chat(C, "You have regenerated.")
C.visible_message("[usr] appears to wake from the dead, having healed all wounds.")
C.update_canmove()
- return 1
\ No newline at end of file
+ return 1
+
+/obj/item/device/wildwest_communicator
+ name = "Syndicate Comms Device"
+ icon_state = "gangtool-red"
+ item_state = "walkietalkie"
+ desc = "Use to communicate with the syndicate base commander."
+ var/used = FALSE
+
+/obj/item/device/wildwest_communicator/attack_self(mob/living/user)
+
+ if(!is_away_level(user.z))
+ to_chat(user, "The communicator emits a faint beep. Perhaps it is out of range?")
+ return
+
+ if(used)
+ to_chat(user, "The communicator buzzes, and then dies. Apparently nobody is responding.")
+ return
+
+ var/initial_question = "The communicator buzzes, and you hear a voice on the line, almost lost in the static. 'Hello? Who is this?'."
+ to_chat(user, initial_question)
+
+ var/const/option_explorer = "(TRUTH) Explorers."
+ var/const/option_bluff = "(BLUFF) Weapons delivery."
+ var/const/option_threat = "(THREAT) NT, here to kick your ass!"
+ var/const/option_syndicate = "(SYNDI) Agent reporting in..."
+ var/list/response_choices = list(option_explorer, option_bluff, option_threat)
+
+ if(istype(user, /mob/living) && user.mind)
+ if(user.mind.special_role == "Traitor")
+ response_choices |= option_syndicate
+
+ var/selected_choice = input(user, "How do you respond on the comms device?", "Response to Syndicate") as null|anything in response_choices
+
+ if(!selected_choice)
+ return
+ switch(selected_choice)
+ if(option_explorer)
+ to_chat(user, "The communicator buzzes, and you hear the voice again: 'Hah! You sure picked the wrong asteroid to explore. Get em, boys!'")
+ if(option_bluff)
+ to_chat(user, "The communicator buzzes, and you hear the voice again: 'Really? I think not. Get them!'")
+ if(option_threat)
+ to_chat(user, "The communicator buzzes, and you hear the voice again: 'Oh really now?' You hear a clicking sound. 'Team, get back here. We have trouble'. Then the line goes dead.")
+ for(var/obj/effect/landmark/L in landmarks_list)
+ if(L.name == "wildwest_syndipod")
+ var/obj/spacepod/syndi/P = new /obj/spacepod/syndi(get_turf(L))
+ P.name = "Syndi Recon Pod"
+ if(L.name == "wildwest_syndibackup")
+ var/mob/living/simple_animal/hostile/syndicate/ranged/space/R = new /mob/living/simple_animal/hostile/syndicate/ranged/space(get_turf(L))
+ R.name = "Syndi Recon Team"
+ if(option_syndicate)
+ to_chat(user, "The communicator buzzes, and you hear the voice again: 'Well, I'll be damned. An agent out here? You must be off-mission! Leave my troops alone, and they will do the same for you. Our Commander will handle you himself.'")
+ stand_down()
+ used = TRUE
+
+/obj/item/device/wildwest_communicator/proc/stand_down()
+ for(var/mob/living/simple_animal/hostile/syndicate/ranged/wildwest/W in living_mob_list)
+ W.on_alert = FALSE
+
+/mob/living/simple_animal/hostile/syndicate/ranged/wildwest
+ var/on_alert = TRUE
+
+/mob/living/simple_animal/hostile/syndicate/ranged/wildwest/ListTargets()
+ if(on_alert)
+ return ..()
+ return list()
+
+/mob/living/simple_animal/hostile/syndicate/ranged/wildwest/death(gibbed)
+ if(!on_alert)
+ say("How could you betray the Syndicate?")
+ for(var/mob/living/simple_animal/hostile/syndicate/ranged/wildwest/W in living_mob_list)
+ W.on_alert = TRUE
+ ..(gibbed)
\ No newline at end of file
diff --git a/code/modules/client/preference/loadout/loadout_donor.dm b/code/modules/client/preference/loadout/loadout_donor.dm
index edf7e173730..9e13662a7d8 100644
--- a/code/modules/client/preference/loadout/loadout_donor.dm
+++ b/code/modules/client/preference/loadout/loadout_donor.dm
@@ -25,14 +25,6 @@
path = /obj/item/clothing/suit/furcoat
cost = 2
-/datum/gear/donor/lord_admiral
- display_name = "Lord Admiral Coat"
- path = /obj/item/clothing/suit/lordadmiral
-
-/datum/gear/donor/lord_admiral_hat
- display_name = "Lord Admiral Hat"
- path = /obj/item/clothing/head/lordadmiralhat
-
/datum/gear/donor/kamina
display_name = "Spiky Orange-tinted Shades"
path = /obj/item/clothing/glasses/fluff/kamina
diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm
index c478eb9bab2..a351d3f5032 100644
--- a/code/modules/client/preference/preferences.dm
+++ b/code/modules/client/preference/preferences.dm
@@ -611,6 +611,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if(available_in_playtime)
HTML += "[rank] \[ " + get_exp_format(available_in_playtime) + " as " + job.get_exp_req_type() + " \] | "
continue
+ if(job.barred_by_disability(user.client))
+ HTML += "[rank] \[ DISABILITY \] | "
+ continue
if(!job.player_old_enough(user.client))
var/available_in_days = job.available_in_days(user.client)
HTML += "[rank] \[IN [(available_in_days)] DAYS] | "
diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm
index 348a9178721..7142d230c83 100644
--- a/code/modules/customitems/item_defines.dm
+++ b/code/modules/customitems/item_defines.dm
@@ -749,6 +749,19 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
icon_state = "dusty_jacket"
+/obj/item/clothing/suit/fluff/supplymaster_jacket //Denthamos: Henry Grandpa Gadow
+ name = "faded NT Supply Master's Coat"
+ desc = "A faded leather overcoat bearing a worn out badge from the NAS Crescent on the shoulder, and a designation tag of Supply Master on the front. A tarnished gold nameplate says H.Gadow on it."
+ icon_state = "supplymaster_jacket_open"
+ item_state = "supplymaster_jacket_open"
+ ignore_suitadjust = 0
+ suit_adjusted = 1
+ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/toy,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter)
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+ cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS
+ actions_types = list(/datum/action/item_action/button)
+ adjust_flavour = "unbutton"
+
/obj/item/clothing/suit/storage/labcoat/fluff/aeneas_rinil //Socialsystem: Lynn Fea
name = "Robotics labcoat"
desc = "A labcoat with a few markings denoting it as the labcoat of roboticist."
@@ -1232,4 +1245,4 @@
righthand_file = 'icons/mob/inhands/fluff_righthand.dmi'
icon_state = "sheetcosmos"
item_state = "sheetcosmos"
- item_color = "sheetcosmos"
\ No newline at end of file
+ item_color = "sheetcosmos"
diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm
index 40f258b0c2a..3470302c057 100644
--- a/code/modules/economy/ATM.dm
+++ b/code/modules/economy/ATM.dm
@@ -81,6 +81,9 @@ log transactions
/obj/machinery/atm/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/card))
+ if(!powered())
+ return
+
if(!held_card)
user.drop_item()
I.forceMove(src)
@@ -91,6 +94,8 @@ log transactions
else if(authenticated_account)
if(istype(I, /obj/item/stack/spacecash))
//consume the money
+ if(!powered())
+ return
var/obj/item/stack/spacecash/C = I
authenticated_account.money += C.amount
playsound(loc, pick('sound/items/polaroid1.ogg', 'sound/items/polaroid2.ogg'), 50, 1)
@@ -118,7 +123,7 @@ log transactions
to_chat(user, "Artificial unit recognized. Artificial units do not currently receive monetary compensation, as per Nanotrasen regulation #1005.")
return
ui_interact(user)
-
+
/obj/machinery/atm/attack_ghost(mob/user)
ui_interact(user)
diff --git a/code/modules/hydroponics/grown/nettle.dm b/code/modules/hydroponics/grown/nettle.dm
index 52f60d06b18..b6ae3ee3508 100644
--- a/code/modules/hydroponics/grown/nettle.dm
+++ b/code/modules/hydroponics/grown/nettle.dm
@@ -57,7 +57,7 @@
var/organ = ((H.hand ? "l_":"r_") + "arm")
var/obj/item/organ/external/affecting = H.get_organ(organ)
if(affecting)
- if(affecting.take_damage(0, force))
+ if(affecting.receive_damage(0, force))
H.UpdateDamageIcon()
to_chat(H, "The nettle burns your bare hand!")
return 1
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index e6b9136958e..4a51bb53351 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -1,5 +1,3 @@
-#define HYDRO_CYCLES_PER_AGE 2 //Adjust this to adjust how many hydroponics cycles it takes to increase age. Positive integers only.
-
/obj/machinery/hydroponics
name = "hydroponics tray"
icon = 'icons/obj/hydroponics/equipment.dmi'
@@ -22,7 +20,6 @@
var/lastproduce = 0 //Last time it was harvested
var/lastcycle = 0 //Used for timing of cycles.
var/cycledelay = 200 //About 10 seconds / cycle
- var/current_cycle = 0 //Used for tracking when to age
var/harvest = 0 //Ready to harvest?
var/obj/item/seeds/myseed = null //The currently planted seed
var/rating = 1
@@ -155,10 +152,7 @@
lastcycle = world.time
if(myseed && !dead)
// Advance age
- current_cycle++
- if(current_cycle == HYDRO_CYCLES_PER_AGE)
- age++
- current_cycle = 0
+ age++
if(age < myseed.maturation)
lastproduce = age
@@ -1029,5 +1023,3 @@
qdel(src)
else
..()
-
-#undef HYDRO_CYCLES_PER_AGE
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index bac0df5b7f4..80d575b9d1f 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -495,7 +495,7 @@
var/buildstacktype = /obj/item/stack/sheet/metal
var/buildstackamount = 5
-/obj/structure/fans/proc/deconstruct()
+/obj/structure/fans/deconstruct()
if(buildstacktype)
new buildstacktype(loc, buildstackamount)
qdel(src)
diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm
index 037a3f520b3..1c5af7e36f1 100644
--- a/code/modules/mob/living/carbon/brain/posibrain.dm
+++ b/code/modules/mob/living/carbon/brain/posibrain.dm
@@ -47,7 +47,7 @@
to_chat(O, "\A [src] has been activated. (Teleport | Sign Up)")
/obj/item/device/mmi/posibrain/proc/check_observer(var/mob/dead/observer/O)
- if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
+ if(cannotPossess(O))
return 0
if(jobban_isbanned(O, "Cyborg") || jobban_isbanned(O,"nonhumandept"))
return 0
@@ -133,7 +133,7 @@
if(!check_observer(O))
to_chat(O, "You cannot be \a [src].")
return
- if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
+ if(cannotPossess(O))
to_chat(O, "Upon using the antagHUD you forfeited the ability to join the round.")
return
if(jobban_isbanned(O, "Cyborg") || jobban_isbanned(O,"nonhumandept"))
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 5cf6df7fe60..ecde87a5a16 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -68,7 +68,7 @@
var/mob/living/carbon/human/H = src
var/obj/item/organ/external/organ = H.get_organ("chest")
if(istype(organ))
- if(organ.take_damage(d, 0))
+ if(organ.receive_damage(d, 0))
H.UpdateDamageIcon()
H.updatehealth()
@@ -327,15 +327,15 @@
if(1)
to_chat(src, "Your eyes sting a little.")
if(prob(40)) //waiting on carbon organs
- E.take_damage(1, 1)
+ E.receive_damage(1, 1)
if(2)
to_chat(src, "Your eyes burn.")
- E.take_damage(rand(2, 4), 1)
+ E.receive_damage(rand(2, 4), 1)
else
to_chat(src, "Your eyes itch and burn severely!")
- E.take_damage(rand(12, 16), 1)
+ E.receive_damage(rand(12, 16), 1)
if(E.damage > E.min_bruised_damage)
AdjustEyeBlind(damage)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 4029be62d0d..dad8fae62f7 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -715,7 +715,7 @@
if(!I || !L || I.loc != src || !(I in L.embedded_objects))
return
L.embedded_objects -= I
- L.take_damage(I.embedded_unsafe_removal_pain_multiplier*I.w_class)//It hurts to rip it out, get surgery you dingus.
+ L.receive_damage(I.embedded_unsafe_removal_pain_multiplier*I.w_class)//It hurts to rip it out, get surgery you dingus.
I.forceMove(get_turf(src))
usr.put_in_hands(I)
usr.emote("scream")
diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm
index 9a96ec72c28..c216badda93 100644
--- a/code/modules/mob/living/carbon/human/human_damage.dm
+++ b/code/modules/mob/living/carbon/human/human_damage.dm
@@ -37,7 +37,7 @@
if(sponge)
if(species)
amount = amount * species.brain_mod
- sponge.take_damage(amount, 1)
+ sponge.receive_damage(amount, 1)
brainloss = sponge.damage
else
brainloss = 200
@@ -112,7 +112,7 @@
var/obj/item/organ/external/O = get_organ(organ_name)
if(amount > 0)
- O.take_damage(amount, 0, sharp=is_sharp(damage_source), used_weapon=damage_source)
+ O.receive_damage(amount, 0, sharp=is_sharp(damage_source), used_weapon=damage_source)
else
//if you don't want to heal robot organs, they you will have to check that yourself before using this proc.
O.heal_damage(-amount, 0, internal=0, robo_repair=(O.status & ORGAN_ROBOT))
@@ -126,7 +126,7 @@
var/obj/item/organ/external/O = get_organ(organ_name)
if(amount > 0)
- O.take_damage(0, amount, sharp=is_sharp(damage_source), used_weapon=damage_source)
+ O.receive_damage(0, amount, sharp=is_sharp(damage_source), used_weapon=damage_source)
else
//if you don't want to heal robot organs, they you will have to check that yourself before using this proc.
O.heal_damage(0, -amount, internal=0, robo_repair=(O.status & ORGAN_ROBOT))
@@ -240,7 +240,7 @@
if(!parts.len)
return
var/obj/item/organ/external/picked = pick(parts)
- if(picked.take_damage(brute, burn, sharp))
+ if(picked.receive_damage(brute, burn, sharp))
UpdateDamageIcon()
updatehealth()
speech_problem_flag = 1
@@ -285,7 +285,7 @@
var/burn_was = picked.burn_dam
- update |= picked.take_damage(brute_per_part, burn_per_part, sharp, used_weapon)
+ update |= picked.receive_damage(brute_per_part, burn_per_part, sharp, used_weapon)
brute -= (picked.brute_dam - brute_was)
burn -= (picked.burn_dam - burn_was)
@@ -355,7 +355,7 @@ This function restores all organs.
if(species)
damage = damage * species.brute_mod
- if(organ.take_damage(damage, 0, sharp, used_weapon))
+ if(organ.receive_damage(damage, 0, sharp, used_weapon))
UpdateDamageIcon()
if(LAssailant && ishuman(LAssailant)) //superheros still get the comical hit markers
@@ -372,7 +372,7 @@ This function restores all organs.
dmgIcon.pixel_y = (!lying) ? rand(-11,9) : rand(-10,1)
flick_overlay(dmgIcon, attack_bubble_recipients, 9)
- receive_damage()
+ receiving_damage()
if(BURN)
damageoverlaytemp = 20
@@ -380,7 +380,7 @@ This function restores all organs.
if(species)
damage = damage * species.burn_mod
- if(organ.take_damage(0, damage, sharp, used_weapon))
+ if(organ.receive_damage(0, damage, sharp, used_weapon))
UpdateDamageIcon()
// Will set our damageoverlay icon to the next level, which will then be set back to the normal level the next mob.Life().
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 9783673bc33..6f6bb6ade48 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -311,7 +311,7 @@ emp_act
L.embedded_objects |= I
I.add_mob_blood(src)//it embedded itself in you, of course it's bloody!
I.forceMove(src)
- L.take_damage(I.w_class*I.embedded_impact_pain_multiplier)
+ L.receive_damage(I.w_class*I.embedded_impact_pain_multiplier)
visible_message("[I] embeds itself in [src]'s [L.name]!","[I] embeds itself in your [L.name]!")
hitpush = 0
skipcatch = 1 //can't catch the now embedded item
@@ -358,10 +358,10 @@ emp_act
if("brute")
if(M.force > 20)
Paralyse(1)
- update |= affecting.take_damage(rand(M.force/2, M.force), 0)
+ update |= affecting.receive_damage(rand(M.force/2, M.force), 0)
playsound(src, 'sound/weapons/punch4.ogg', 50, 1)
if("fire")
- update |= affecting.take_damage(0, rand(M.force/2, M.force))
+ update |= affecting.receive_damage(0, rand(M.force/2, M.force))
playsound(src, 'sound/items/Welder.ogg', 50, 1)
if("tox")
M.mech_toxin_damage(src)
diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm
index 7c5642658e3..0c64abdec40 100644
--- a/code/modules/mob/living/carbon/human/human_organs.dm
+++ b/code/modules/mob/living/carbon/human/human_organs.dm
@@ -21,7 +21,7 @@
if(E.is_broken() && E.internal_organs && E.internal_organs.len && prob(15))
var/obj/item/organ/internal/I = pick(E.internal_organs)
custom_pain("You feel broken bones moving in your [E.name]!", 1)
- I.take_damage(rand(3,5))
+ I.receive_damage(rand(3,5))
//handle_stance()
handle_grasp()
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index fe210b697d1..ccddc56ca16 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -707,7 +707,7 @@
Paralyse(5/sober_str)
Drowsy(30/sober_str)
if(L)
- L.take_damage(0.1, 1)
+ L.receive_damage(0.1, 1)
adjustToxLoss(0.1)
else //stuff only for synthetics
if(alcohol_strength >= spark_start && prob(25))
@@ -879,11 +879,11 @@
var/obj/item/organ/external/BP = X
for(var/obj/item/I in BP.embedded_objects)
if(prob(I.embedded_pain_chance))
- BP.take_damage(I.w_class*I.embedded_pain_multiplier)
+ BP.receive_damage(I.w_class*I.embedded_pain_multiplier)
to_chat(src, "[I] embedded in your [BP.name] hurts!")
if(prob(I.embedded_fall_chance))
- BP.take_damage(I.w_class*I.embedded_fall_pain_multiplier)
+ BP.receive_damage(I.w_class*I.embedded_fall_pain_multiplier)
BP.embedded_objects -= I
I.forceMove(get_turf(src))
visible_message("[I] falls out of [name]'s [BP.name]!","[I] falls out of your [BP.name]!")
@@ -977,7 +977,7 @@
var/obj/item/clothing/mask/M = H.wear_mask
if(M && (M.flags_cover & MASKCOVERSMOUTH))
return
- if(NO_BREATHE in species.species_traits)
+ if(NO_BREATHE in H.species.species_traits)
return //no puking if you can't smell!
// Humans can lack a mind datum, y'know
if(H.mind && (H.mind.assigned_role == "Detective" || H.mind.assigned_role == "Coroner"))
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 8c81980eb8e..42e461b6e03 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -896,13 +896,13 @@
// And animate the attack!
animate(I, alpha = 175, pixel_x = 0, pixel_y = 0, pixel_z = 0, time = 3)
-/atom/movable/proc/receive_damage(atom/A)
+/atom/movable/proc/receiving_damage(atom/A)
var/pixel_x_diff = rand(-3,3)
var/pixel_y_diff = rand(-3,3)
animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff, time = 2)
animate(pixel_x = initial(pixel_x), pixel_y = initial(pixel_y), time = 2)
-/mob/living/receive_damage(atom/A)
+/mob/living/receiving_damage(atom/A)
..()
floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure we restart the bouncing after the next movement.
diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm
index f29b402dd50..991bc5c61c7 100644
--- a/code/modules/mob/living/silicon/pai/recruit.dm
+++ b/code/modules/mob/living/silicon/pai/recruit.dm
@@ -360,7 +360,7 @@ var/datum/paiController/paiController // Global handler for pAI candidates
return 0
if(!player_old_enough_antag(O.client,ROLE_PAI))
return 0
- if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
+ if(cannotPossess(O))
return 0
if(!(O in respawnable_list))
return 0
diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm
index c0e8af8e998..2099b99f1b1 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone.dm
@@ -263,7 +263,7 @@
/mob/living/silicon/robot/drone/proc/request_player()
for(var/mob/dead/observer/O in player_list)
- if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
+ if(cannotPossess(O))
continue
if(jobban_isbanned(O,"nonhumandept") || jobban_isbanned(O,"Drone"))
continue
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm
index 767a78e1f77..790ecaa399a 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm
@@ -118,7 +118,7 @@
var/joinedasobserver = 0
if(istype(src,/mob/dead/observer))
var/mob/dead/observer/G = src
- if(G.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
+ if(cannotPossess(G))
to_chat(usr, "Upon using the antagHUD you forfeited the ability to join the round.")
return
if(G.started_as_observer == 1)
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 67b2f2c0f97..9524e3a9327 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -274,11 +274,7 @@ var/list/robot_verbs_default = list(
/mob/living/silicon/robot/proc/pick_module()
if(module)
return
- var/list/modules = list("Standard", "Engineering", "Medical", "Miner", "Janitor", "Service")
- if(!config.forbid_secborg)
- modules += "Security"
- if(!config.forbid_peaceborg)
- modules += "Peacekeeper"
+ var/list/modules = list("Standard", "Engineering", "Medical", "Miner", "Janitor", "Service", "Security")
if(islist(force_modules) && force_modules.len)
modules = force_modules.Copy()
if(security_level == (SEC_LEVEL_GAMMA || SEC_LEVEL_EPSILON) || crisis)
@@ -354,11 +350,6 @@ var/list/robot_verbs_default = list(
module_sprites["Noble-SEC"] = "Noble-SEC"
status_flags &= ~CANPUSH
- if("Peacekeeper")
- module = new /obj/item/weapon/robot_module/peacekeeper(src)
- module_sprites["Peacekeeper"] = "peace"
- status_flags &= ~CANPUSH
-
if("Engineering")
module = new /obj/item/weapon/robot_module/engineering(src)
module.channels = list("Engineering" = 1)
@@ -411,7 +402,7 @@ var/list/robot_verbs_default = list(
feedback_inc("cyborg_[lowertext(modtype)]",1)
rename_character(real_name, get_default_name())
- if(modtype == "Medical" || modtype == "Security" || modtype == "Combat" || modtype == "Peacekeeper" || modtype == "Nations")
+ if(modtype == "Medical" || modtype == "Security" || modtype == "Combat" || modtype == "Nations")
status_flags &= ~CANPUSH
choose_icon(6,module_sprites)
@@ -1181,14 +1172,18 @@ var/list/robot_verbs_default = list(
if(module.type == /obj/item/weapon/robot_module/janitor)
var/turf/tile = loc
if(isturf(tile))
- tile.clean_blood()
+ var/floor_only = TRUE
if(istype(tile, /turf/simulated))
var/turf/simulated/S = tile
S.dirt = 0
for(var/A in tile)
if(istype(A, /obj/effect))
if(is_cleanable(A))
- qdel(A)
+ var/obj/effect/decal/cleanable/blood/B = A
+ if(istype(B) && B.off_floor)
+ floor_only = FALSE
+ else
+ qdel(A)
else if(istype(A, /obj/item))
var/obj/item/cleaned_item = A
cleaned_item.clean_blood()
@@ -1209,6 +1204,8 @@ var/list/robot_verbs_default = list(
cleaned_human.update_inv_shoes(0,0)
cleaned_human.clean_blood()
to_chat(cleaned_human, "[src] cleans your face!")
+ if(floor_only)
+ tile.clean_blood()
return
#undef BORG_CAMERA_BUFFER
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 1b3f0b96313..3d95987bcf8 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -229,22 +229,6 @@
fix_modules()
-/obj/item/weapon/robot_module/peacekeeper
- name = "peacekeeping robot module"
- module_type = "Standard"
-
-/obj/item/weapon/robot_module/peacekeeper/New()
- ..()
- modules += new /obj/item/weapon/cookiesynth(src)
- modules += new /obj/item/device/harmalarm(src)
- modules += new /obj/item/weapon/reagent_containers/borghypo/peace(src)
- modules += new /obj/item/taperoll/police(src)
- modules += new /obj/item/borg/cyborghug/peacekeeper(src)
- modules += new /obj/item/weapon/extinguisher(src)
- emag = new /obj/item/weapon/reagent_containers/borghypo/peace/hacked(src)
-
- fix_modules()
-
/obj/item/weapon/robot_module/janitor
name = "janitorial robot module"
module_type = "Janitor"
diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
index e45d5a1a391..fb0d156cdbf 100644
--- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
+++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm
@@ -237,7 +237,7 @@
E = locate() in get_turf(src)
if(!E)
var/obj/structure/spider/eggcluster/C = new /obj/structure/spider/eggcluster(src.loc)
- C.faction = faction
+ C.faction = faction.Copy()
C.master_commander = master_commander
if(ckey)
C.player_spiders = 1
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm
index 2124a31078c..592f8230edd 100644
--- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/ghost.dm
@@ -16,7 +16,7 @@
humanize_prompt += " Role: [spider_role_summary]"
if(user.ckey in ts_ckey_blacklist)
error_on_humanize = "You are not able to control any terror spider this round."
- else if(user.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
+ else if(cannotPossess(user))
error_on_humanize = "You have enabled antag HUD and are unable to re-enter the round."
else if(spider_awaymission)
error_on_humanize = "Terror spiders that are part of an away mission cannot be controlled by ghosts."
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 82a9778ab47..0b0c44868ab 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -67,7 +67,7 @@
var/gold_core_spawnable = CHEM_MOB_SPAWN_INVALID //if CHEM_MOB_SPAWN_HOSTILE can be spawned by plasma with gold core, CHEM_MOB_SPAWN_FRIENDLY are 'friendlies' spawned with blood
- var/master_commander = null //holding var for determining who own/controls a sentient simple animal (for sentience potions).
+ var/mob/living/carbon/human/master_commander = null //holding var for determining who own/controls a sentient simple animal (for sentience potions).
var/mob/living/simple_animal/hostile/spawner/nest
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 43b12417215..227138e2dfb 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -51,17 +51,17 @@
return 1
return 0
-proc/isLivingSSD(mob/M)
+/proc/isLivingSSD(mob/M)
return istype(M) && M.player_logged && M.stat != DEAD
-proc/isAntag(A)
+/proc/isAntag(A)
if(istype(A, /mob/living/carbon))
var/mob/living/carbon/C = A
if(C.mind && C.mind.special_role)
return 1
return 0
-proc/isNonCrewAntag(A)
+/proc/isNonCrewAntag(A)
if(!isAntag(A))
return 0
@@ -85,21 +85,28 @@ proc/isNonCrewAntag(A)
return 1
-proc/iscuffed(A)
+/proc/cannotPossess(A)
+ var/mob/dead/observer/G = A
+ if(G.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
+ return 1
+ return 0
+
+
+/proc/iscuffed(A)
if(istype(A, /mob/living/carbon))
var/mob/living/carbon/C = A
if(C.handcuffed)
return 1
return 0
-proc/hassensorlevel(A, var/level)
+/proc/hassensorlevel(A, var/level)
var/mob/living/carbon/human/H = A
if(istype(H) && istype(H.w_uniform, /obj/item/clothing/under))
var/obj/item/clothing/under/U = H.w_uniform
return U.sensor_mode >= level
return 0
-proc/getsensorlevel(A)
+/proc/getsensorlevel(A)
var/mob/living/carbon/human/H = A
if(istype(H) && istype(H.w_uniform, /obj/item/clothing/under))
var/obj/item/clothing/under/U = H.w_uniform
@@ -170,7 +177,7 @@ proc/getsensorlevel(A)
p++
return t
-proc/slur(phrase, var/list/slurletters = ("'"))//use a different list as an input if you want to make robots slur with $#@%! characters
+/proc/slur(phrase, var/list/slurletters = ("'"))//use a different list as an input if you want to make robots slur with $#@%! characters
phrase = html_decode(phrase)
var/leng=lentext(phrase)
var/counter=lentext(phrase)
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index c043af9817f..9d16d66a64c 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -236,6 +236,10 @@
if(!IsJobAvailable(rank))
to_chat(src, alert("[rank] is not available. Please try another."))
return 0
+ var/datum/job/thisjob = job_master.GetJob(rank)
+ if(thisjob.barred_by_disability(client))
+ to_chat(src, alert("[rank] is not available due to your character's disability. Please try another."))
+ return 0
job_master.AssignRole(src, rank, 1)
@@ -300,7 +304,6 @@
AnnounceArrival(character, rank, join_message)
callHook("latespawn", list(character))
- var/datum/job/thisjob = job_master.GetJob(rank)
if(!thisjob.is_position_available() && thisjob in job_master.prioritized_jobs)
job_master.prioritized_jobs -= thisjob
qdel(src)
@@ -389,7 +392,7 @@
"Supply" = list(jobs = list(), titles = supply_positions, color = "#ead4ae"),
)
for(var/datum/job/job in job_master.occupations)
- if(job && IsJobAvailable(job.title))
+ if(job && IsJobAvailable(job.title) && !job.barred_by_disability(client))
activePlayers[job] = 0
var/categorized = 0
// Only players with the job assigned and AFK for less than 10 minutes count as active
diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm
index 9f867692153..f72d4bfccda 100644
--- a/code/modules/modular_computers/computers/item/computer.dm
+++ b/code/modules/modular_computers/computers/item/computer.dm
@@ -30,9 +30,8 @@
var/max_hardware_size = 0 // Maximal hardware w_class. Tablets/PDAs have 1, laptops 2, consoles 4.
var/steel_sheet_cost = 5 // Amount of steel sheets refunded when disassembling an empty frame of this computer.
- var/obj_integrity = 100
- var/integrity_failure = 50
- var/max_integrity = 100
+ integrity_failure = 50
+ max_integrity = 100
armor = list(melee = 0, bullet = 20, laser = 20, energy = 100, bomb = 0, bio = 100, rad = 100, fire = 0, acid = 0)
// Important hardware (must be installed for computer to work)
diff --git a/code/modules/modular_computers/computers/item/computer_damage.dm b/code/modules/modular_computers/computers/item/computer_damage.dm
index 689e8c99ab7..2623794fa9d 100644
--- a/code/modules/modular_computers/computers/item/computer_damage.dm
+++ b/code/modules/modular_computers/computers/item/computer_damage.dm
@@ -24,7 +24,7 @@
if(prob(75))
take_damage(obj_integrity, BRUTE)
-/obj/item/device/modular_computer/proc/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1)
+/obj/item/device/modular_computer/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1)
. = ..()
var/component_probability = min(50, max(damage_amount*0.1, 1 - obj_integrity/max_integrity))
switch(damage_flag)
diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm
index 9e07fc19ddb..edc1f2277fa 100644
--- a/code/modules/modular_computers/computers/machinery/modular_computer.dm
+++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm
@@ -28,9 +28,8 @@ var/list/global_modular_computers = list()
var/base_active_power_usage = 100 // Power usage when the computer is open (screen is active) and can be interacted with. Remember hardware can use power too.
var/base_idle_power_usage = 10 // Power usage when the computer is idle and screen is off (currently only applies to laptops)
- var/obj_integrity = 300
- var/integrity_failure = 150
- var/max_integrity = 300
+ integrity_failure = 150
+ max_integrity = 300
var/obj/item/device/modular_computer/processor/cpu = null // CPU that handles most logic while this type only handles power and other specific things.
diff --git a/code/modules/modular_computers/hardware/_hardware.dm b/code/modules/modular_computers/hardware/_hardware.dm
index 4f752fdac10..f1fe147e393 100644
--- a/code/modules/modular_computers/hardware/_hardware.dm
+++ b/code/modules/modular_computers/hardware/_hardware.dm
@@ -9,8 +9,7 @@
var/obj/item/device/modular_computer/holder = null
// Computer that holds this hardware, if any.
- var/obj_integrity = 200
- var/max_integrity = 200
+ max_integrity = 200
var/power_usage = 0 // If the hardware uses extra power, change this.
var/enabled = 1 // If the hardware is turned off set this to 0.
@@ -77,7 +76,7 @@
return TRUE // Good to go.
// Handles damage checks
-/obj/item/weapon/computer_hardware/proc/take_damage(damage_amount)
+/obj/item/weapon/computer_hardware/take_damage(damage_amount)
obj_integrity = max(obj_integrity - damage_amount, 0)
/obj/item/weapon/computer_hardware/examine(var/mob/user)
diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm
index a438d98afdc..de2608f5a81 100644
--- a/code/modules/paperwork/photocopier.dm
+++ b/code/modules/paperwork/photocopier.dm
@@ -250,7 +250,7 @@
var/mob/living/carbon/human/H = ass
to_chat(H, "Something smells toasty...")
var/obj/item/organ/external/G = H.get_organ("groin")
- G.take_damage(0, 30)
+ G.receive_damage(0, 30)
spawn(20)
H.emote("scream")
emag_cooldown = world.time + EMAG_DELAY
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index 98a34066749..57a6e77b660 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -457,7 +457,7 @@
to_chat(user, "You try to remove the light [fitting], but you burn your hand on it!")
var/obj/item/organ/external/affecting = H.get_organ("[user.hand ? "l" : "r" ]_hand")
- if(affecting.take_damage( 0, 5 )) // 5 burn damage
+ if(affecting.receive_damage( 0, 5 )) // 5 burn damage
H.UpdateDamageIcon()
H.updatehealth()
return
diff --git a/code/modules/power/supermatter/sm_shard.dm b/code/modules/power/supermatter/sm_shard.dm
index d4c1109e16e..b768915a836 100644
--- a/code/modules/power/supermatter/sm_shard.dm
+++ b/code/modules/power/supermatter/sm_shard.dm
@@ -56,7 +56,7 @@
var/obj/item/organ/external/affecting = H.get_organ(pick("l_foot", "r_foot"))
if(affecting.status & ORGAN_ROBOT)
return
- if(affecting.take_damage(5, 20))
+ if(affecting.receive_damage(5, 20))
H.UpdateDamageIcon()
H.updatehealth()
if(!(H.species && (H.species.flags & NO_PAIN)))
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index f2beec3f6bc..71ac935153b 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -71,6 +71,7 @@
if(!isliving(target))
return 0
var/mob/living/L = target
+ var/mob/living/carbon/human/H
if(blocked < 100) // not completely blocked
if(damage && L.blood_volume && damage_type == BRUTE)
var/splatter_dir = dir
@@ -81,11 +82,23 @@
else
var/blood_color = "#C80000"
if(ishuman(target))
- var/mob/living/carbon/human/H = target
+ H = target
blood_color = H.species.blood_color
new /obj/effect/overlay/temp/dir_setting/bloodsplatter(target_loca, splatter_dir, blood_color)
if(prob(33))
- L.add_splatter_floor(target_loca)
+ var/list/shift = list("x" = 0, "y" = 0)
+ var/turf/step_over = get_step(target_loca, splatter_dir)
+
+ if(get_splatter_blockage(step_over, target, splatter_dir, target_loca)) //If you can't cross the tile or any of its relevant obstacles...
+ shift = pixel_shift_dir(splatter_dir) //Pixel shift the blood there instead (so you can't see wallsplatter through walls).
+ else
+ target_loca = step_over
+ L.add_splatter_floor(target_loca, shift_x = shift["x"], shift_y = shift["y"])
+ if(istype(H))
+ for(var/mob/living/carbon/human/M in step_over) //Bloody the mobs who're infront of the spray.
+ M.bloody_hands(H)
+ /* Uncomment when bloody_body stops randomly not transferring blood colour.
+ M.bloody_body(H) */
var/organ_hit_text = ""
if(L.has_limbs)
@@ -110,6 +123,15 @@
add_logs(firer, L, "shot", src, reagent_note)
return L.apply_effects(stun, weaken, paralyze, irradiate, slur, stutter, eyeblur, drowsy, blocked, stamina, jitter)
+/obj/item/projectile/proc/get_splatter_blockage(var/turf/step_over, var/atom/target, var/splatter_dir, var/target_loca) //Check whether the place we want to splatter blood is blocked (i.e. by windows).
+ var/turf/step_cardinal = !(splatter_dir in list(NORTH, SOUTH, EAST, WEST)) ? get_step(target_loca, get_cardinal_dir(target_loca, step_over)) : null
+
+ if(step_over.density && !step_over.CanPass(target, step_over, 1)) //Preliminary simple check.
+ return TRUE
+ for(var/atom/movable/border_obstacle in step_over) //Check to see if we're blocked by a (non-full) window or some such. Do deeper investigation if we're splattering blood diagonally.
+ if(border_obstacle.flags&ON_BORDER && get_dir(step_cardinal ? step_cardinal : target_loca, step_over) == turn(border_obstacle.dir, 180))
+ return TRUE
+
/obj/item/projectile/proc/vol_by_damage()
if(damage)
return Clamp((damage) * 0.67, 30, 100)// Multiply projectile damage by 0.67, then clamp the value between 30 and 100
diff --git a/code/modules/reagents/chemistry/reagents/admin.dm b/code/modules/reagents/chemistry/reagents/admin.dm
index a7fc7fa6108..785ac17a598 100644
--- a/code/modules/reagents/chemistry/reagents/admin.dm
+++ b/code/modules/reagents/chemistry/reagents/admin.dm
@@ -20,7 +20,7 @@
var/mob/living/carbon/human/H = M
for(var/thing in H.internal_organs)
var/obj/item/organ/internal/I = thing
- I.take_damage(-5)
+ I.receive_damage(-5)
for(var/obj/item/organ/external/E in H.bodyparts)
if(E.mend_fracture())
E.perma_injury = 0
diff --git a/code/modules/reagents/chemistry/reagents/medicine.dm b/code/modules/reagents/chemistry/reagents/medicine.dm
index 20144bff374..b135d076818 100644
--- a/code/modules/reagents/chemistry/reagents/medicine.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine.dm
@@ -92,7 +92,7 @@
//Mitocholide is hard enough to get, it's probably fair to make this all internal organs
for(var/obj/item/organ/internal/I in H.internal_organs)
- I.take_damage(-0.4)
+ I.receive_damage(-0.4)
..()
/datum/reagent/medicine/mitocholide/reaction_obj(obj/O, volume)
@@ -512,7 +512,7 @@
var/mob/living/carbon/human/H = M
var/obj/item/organ/internal/eyes/E = H.get_int_organ(/obj/item/organ/internal/eyes)
if(istype(E))
- E.take_damage(-1)
+ E.receive_damage(-1)
M.AdjustEyeBlurry(-1)
M.AdjustEarDamage(-1)
if(prob(50))
diff --git a/code/modules/reagents/chemistry/reagents/toxins.dm b/code/modules/reagents/chemistry/reagents/toxins.dm
index 17bd4bde862..72014dd1021 100644
--- a/code/modules/reagents/chemistry/reagents/toxins.dm
+++ b/code/modules/reagents/chemistry/reagents/toxins.dm
@@ -246,7 +246,7 @@
if(prob(75))
var/obj/item/organ/external/affecting = H.get_organ("head")
if(affecting)
- affecting.take_damage(5, 10)
+ affecting.receive_damage(5, 10)
H.UpdateDamageIcon()
H.emote("scream")
else
@@ -272,7 +272,7 @@
if(prob(75))
var/obj/item/organ/external/affecting = H.get_organ("head")
if(affecting)
- affecting.take_damage(0, 20)
+ affecting.receive_damage(0, 20)
H.UpdateDamageIcon()
H.emote("scream")
else
@@ -624,7 +624,7 @@
if(!H.unacidable)
var/obj/item/organ/external/affecting = H.get_organ("head")
- affecting.take_damage(0, 75)
+ affecting.receive_damage(0, 75)
H.UpdateDamageIcon()
H.emote("scream")
H.status_flags |= DISFIGURED
@@ -1132,30 +1132,3 @@
M.electrocute_act(rand(5,20), "Teslium in their body", 1, 1) //Override because it's caused from INSIDE of you
playsound(M, "sparks", 50, 1)
..()
-
-/datum/reagent/peaceborg/confuse
- name = "Dizzying Solution"
- id = "dizzysolution"
- description = "Makes the target off balance and dizzy"
- metabolization_rate = 1.5 * REAGENTS_METABOLISM
-
-/datum/reagent/peaceborg/confuse/on_mob_life(mob/living/M)
- M.AdjustConfused(3, bound_lower = 0, bound_upper = 5)
- M.AdjustDizzy(3, bound_lower = 0, bound_upper = 5)
- if(prob(20))
- to_chat(M, "You feel confused and disorientated.")
- ..()
-
-/datum/reagent/peaceborg/tire
- name = "Tiring Solution"
- id = "tiresolution"
- description = "An extremely weak stamina-toxin that tires out the target. Completely harmless."
- metabolization_rate = 1.5 * REAGENTS_METABOLISM
-
-/datum/reagent/peaceborg/tire/on_mob_life(mob/living/M)
- var/healthcomp = (M.maxHealth - M.health)
- if(M.staminaloss < (45 - healthcomp)) //At 50 health you would have 200 - 150 health meaning 50 compensation. 60 - 50 = 10, so would only do 10-19 stamina.)
- M.adjustStaminaLoss(10)
- if(prob(30))
- to_chat(M, "You feel like you should sit down and take a rest...")
- ..()
\ No newline at end of file
diff --git a/code/modules/reagents/chemistry/reagents/water.dm b/code/modules/reagents/chemistry/reagents/water.dm
index 5c7657e9407..fe2afae85be 100644
--- a/code/modules/reagents/chemistry/reagents/water.dm
+++ b/code/modules/reagents/chemistry/reagents/water.dm
@@ -46,7 +46,7 @@
if(prob(75))
var/obj/item/organ/external/affecting = H.get_organ("head")
if(affecting)
- affecting.take_damage(5, 10)
+ affecting.receive_damage(5, 10)
H.UpdateDamageIcon()
H.emote("scream")
else
@@ -75,7 +75,7 @@
if(prob(75))
var/obj/item/organ/external/affecting = H.get_organ("head")
if(affecting)
- affecting.take_damage(0, 20)
+ affecting.receive_damage(0, 20)
H.UpdateDamageIcon()
H.emote("scream")
else
@@ -132,18 +132,27 @@
taste_message = "floor cleaner"
/datum/reagent/space_cleaner/reaction_obj(obj/O, volume)
- if(istype(O, /obj/effect/decal/cleanable))
- qdel(O)
+ if(is_cleanable(O))
+ var/obj/effect/decal/cleanable/blood/B = O
+ if(!(istype(B) && B.off_floor))
+ qdel(O)
else
- O.color = initial(O.color)
+ if(!istype(O, /atom/movable/lighting_overlay))
+ O.color = initial(O.color)
O.clean_blood()
/datum/reagent/space_cleaner/reaction_turf(turf/T, volume)
if(volume >= 1)
- T.color = initial(T.color)
- T.clean_blood()
+ var/floor_only = TRUE
for(var/obj/effect/decal/cleanable/C in src)
- qdel(C)
+ var/obj/effect/decal/cleanable/blood/B = C
+ if(istype(B) && B.off_floor)
+ floor_only = FALSE
+ else
+ qdel(C)
+ T.color = initial(T.color)
+ if(floor_only)
+ T.clean_blood()
for(var/mob/living/carbon/slime/M in T)
M.adjustToxLoss(rand(5,10))
diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm
index 4377b2eebfc..685b73d18d9 100644
--- a/code/modules/reagents/reagent_containers/borghydro.dm
+++ b/code/modules/reagents/reagent_containers/borghydro.dm
@@ -33,15 +33,6 @@
reagent_ids = list("syndicate_nanites", "potass_iodide", "ether")
bypass_protection = 1
-/obj/item/weapon/reagent_containers/borghypo/peace
- name = "Peace Hypospray"
- reagent_ids = list("dizzysolution","tiresolution")
-
-/obj/item/weapon/reagent_containers/borghypo/peace/hacked
- desc = "Everything's peaceful in death!"
- icon_state = "borghypo_s"
- reagent_ids = list("dizzysolution","tiresolution","tirizene","sulfonal","sodium_thiopental","cyanide","neurotoxin2")
-
/obj/item/weapon/reagent_containers/borghypo/New()
..()
for(var/R in reagent_ids)
diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm
index eca60146cc3..68ab233ea16 100644
--- a/code/modules/reagents/reagent_containers/pill.dm
+++ b/code/modules/reagents/reagent_containers/pill.dm
@@ -54,13 +54,13 @@
/obj/item/weapon/reagent_containers/food/pill/tox
name = "Toxins pill"
desc = "Highly toxic."
- icon_state = "pill5"
+ icon_state = "pill21"
list_reagents = list("toxin" = 50)
/obj/item/weapon/reagent_containers/food/pill/initropidril
name = "initropidril pill"
desc = "Don't swallow this."
- icon_state = "pill5"
+ icon_state = "pill21"
list_reagents = list("initropidril" = 50)
/obj/item/weapon/reagent_containers/food/pill/adminordrazine
diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm
index 7b090fc4f77..1aae13e1f0d 100644
--- a/code/modules/recycling/disposal.dm
+++ b/code/modules/recycling/disposal.dm
@@ -197,10 +197,6 @@
update()
return
-// can breath normally in the disposal
-/obj/machinery/disposal/alter_health()
- return get_turf(src)
-
// attempt to move while inside
/obj/machinery/disposal/relaymove(mob/user as mob)
if(user.stat || src.flushing)
diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm
index c3a0c1a030a..29a7f9746a7 100644
--- a/code/modules/research/xenobiology/xenobiology.dm
+++ b/code/modules/research/xenobiology/xenobiology.dm
@@ -458,7 +458,7 @@
return FALSE
if(!O.can_reenter_corpse)
return FALSE
- if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
+ if(cannotPossess(O))
return FALSE
return TRUE
diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm
index d24853a7948..4a060385dea 100644
--- a/code/modules/shuttle/supply.dm
+++ b/code/modules/shuttle/supply.dm
@@ -782,143 +782,6 @@
icon_state = "shuttle3"
requires_power = 0
-/obj/structure/plasticflaps
- name = "\improper plastic flaps"
- desc = "Completely impassable - or are they?"
- icon = 'icons/obj/stationobjs.dmi'
- icon_state = "plasticflaps"
- density = 0
- anchored = 1
- layer = 4
- var/list/mobs_can_pass = list(
- /mob/living/carbon/slime,
- /mob/living/simple_animal/mouse,
- /mob/living/silicon/robot/drone,
- /mob/living/simple_animal/bot/mulebot
- )
- var/state = PLASTIC_FLAPS_NORMAL
- var/can_deconstruct = TRUE
-
-/obj/structure/plasticflaps/examine(mob/user)
- . = ..()
- switch(state)
- if(PLASTIC_FLAPS_NORMAL)
- to_chat(user, "[src] are screwed to the floor.")
- if(PLASTIC_FLAPS_DETACHED)
- to_chat(user, "[src] are no longer screwed to the floor, and the flaps can be sliced apart.")
-
-/obj/structure/plasticflaps/attackby(obj/item/W, mob/user, params)
- add_fingerprint(user)
- if(isscrewdriver(W))
- if(state == PLASTIC_FLAPS_NORMAL)
- playsound(loc, W.usesound, 100, 1)
- user.visible_message("[user] unscrews [src] from the floor.", "You start to unscrew [src] from the floor...", "You hear rustling noises.")
- if(do_after(user, 180*W.toolspeed, target = src))
- if(state != PLASTIC_FLAPS_NORMAL)
- return
- state = PLASTIC_FLAPS_DETACHED
- anchored = FALSE
- to_chat(user, "You unscrew [src] from the floor.")
- else if(state == PLASTIC_FLAPS_DETACHED)
- playsound(loc, W.usesound, 100, 1)
- user.visible_message("[user] screws [src] to the floor.", "You start to screw [src] to the floor...", "You hear rustling noises.")
- if(do_after(user, 40*W.toolspeed, target = src))
- if(state != PLASTIC_FLAPS_DETACHED)
- return
- state = PLASTIC_FLAPS_NORMAL
- anchored = TRUE
- to_chat(user, "You screw [src] from the floor.")
- else if(iswelder(W))
- if(state == PLASTIC_FLAPS_DETACHED)
- var/obj/item/weapon/weldingtool/WT = W
- if(!WT.remove_fuel(0, user))
- return
- playsound(loc, WT.usesound, 100, 1)
- user.visible_message("[user] slices apart [src].", "You start to slice apart [src].", "You hear welding.")
- if(do_after(user, 120*WT.toolspeed, target = src))
- if(state != PLASTIC_FLAPS_DETACHED)
- return
- to_chat(user, "You slice apart [src].")
- var/obj/item/stack/sheet/plastic/five/P = new(loc)
- P.add_fingerprint(user)
- qdel(src)
- else
- . = ..()
-
-/obj/structure/plasticflaps/CanPass(atom/A, turf/T)
- if(istype(A) && A.checkpass(PASSGLASS))
- return prob(60)
-
- var/obj/structure/stool/bed/B = A
- if(istype(A, /obj/structure/stool/bed) && B.buckled_mob)//if it's a bed/chair and someone is buckled, it will not pass
- return 0
-
- if(istype(A, /obj/structure/closet/cardboard))
- var/obj/structure/closet/cardboard/C = A
- if(C.move_delay)
- return 0
-
- if(istype(A, /obj/vehicle)) //no vehicles
- return 0
-
- var/mob/living/M = A
- if(istype(M))
- if(M.lying)
- return ..()
- for(var/mob_type in mobs_can_pass)
- if(istype(A, mob_type))
- return ..()
- if(istype(A, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = M
- if(H.species.is_small)
- return ..()
- return 0
-
- return ..()
-
-
-/obj/structure/plasticflaps/CanAStarPass(ID, to_dir, caller)
- if(istype(caller, /mob/living))
- for(var/mob_type in mobs_can_pass)
- if(istype(caller, mob_type))
- return 1
-
- var/mob/living/M = caller
- if(!M.ventcrawler && M.mob_size > MOB_SIZE_SMALL)
- return 0
- return 1
-
-/obj/structure/plasticflaps/ex_act(severity)
- switch(severity)
- if(1)
- qdel(src)
- if(2)
- if(prob(50))
- qdel(src)
- if(3)
- if(prob(5))
- qdel(src)
-
-/obj/structure/plasticflaps/proc/deconstruct(disassembled = TRUE)
- if(can_deconstruct)
- new /obj/item/stack/sheet/plastic/five(loc)
- qdel(src)
-
-/obj/structure/plasticflaps/mining //A specific type for mining that doesn't allow airflow because of them damn crates
- name = "\improper Airtight plastic flaps"
- desc = "Heavy duty, airtight, plastic flaps."
-
-/obj/structure/plasticflaps/mining/initialize()
- air_update_turf(1)
- ..()
-
-/obj/structure/plasticflaps/mining/Destroy()
- air_update_turf(1)
- return ..()
-
-/obj/structure/plasticflaps/mining/CanAtmosPass(turf/T)
- return 0
-
#undef ORDER_SCREEN_WIDTH
#undef ORDER_SCREEN_HEIGHT
#undef SUPPLY_SCREEN_WIDTH
diff --git a/code/modules/spacepods/spacepod.dm b/code/modules/spacepods/spacepod.dm
index be18f6a6516..47912c1c90f 100644
--- a/code/modules/spacepods/spacepod.dm
+++ b/code/modules/spacepods/spacepod.dm
@@ -545,6 +545,13 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment
icon_state = "pod_mil"
health = 400
+/obj/spacepod/syndi
+ name = "syndicate spacepod"
+ desc = "An armed spacepod painted in syndicate colors."
+ icon_state = "pod_synd"
+ health = 400
+ unlocked = FALSE
+
/obj/spacepod/sec/New()
..()
var/obj/item/device/spacepod_equipment/weaponry/burst_taser/T = new /obj/item/device/spacepod_equipment/weaponry/taser
diff --git a/code/modules/surgery/bones.dm b/code/modules/surgery/bones.dm
index 80ae04dfaaf..640d6879f34 100644
--- a/code/modules/surgery/bones.dm
+++ b/code/modules/surgery/bones.dm
@@ -101,7 +101,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message(" [user]'s hand slips, damaging the bone in [target]'s [affected.name] with \the [tool]!" , \
" Your hand slips, damaging the bone in [target]'s [affected.name] with \the [tool]!")
- affected.take_damage(5)
+ affected.receive_damage(5)
return 0
/datum/surgery_step/mend_skull
@@ -135,7 +135,7 @@
user.visible_message("[user]'s hand slips, damaging [target]'s face with \the [tool]!" , \
"Your hand slips, damaging [target]'s face with \the [tool]!")
var/obj/item/organ/external/head/h = affected
- h.take_damage(10)
+ h.receive_damage(10)
h.disfigured = 1
return 0
diff --git a/code/modules/surgery/cavity_implant.dm b/code/modules/surgery/cavity_implant.dm
index 269980346a8..f0cc1c993ce 100644
--- a/code/modules/surgery/cavity_implant.dm
+++ b/code/modules/surgery/cavity_implant.dm
@@ -62,7 +62,7 @@
var/obj/item/organ/external/chest/affected = target.get_organ(target_zone)
user.visible_message(" [user]'s hand slips, scraping around inside [target]'s [affected.name] with \the [tool]!", \
" Your hand slips, scraping around inside [target]'s [affected.name] with \the [tool]!")
- affected.take_damage(20)
+ affected.receive_damage(20)
/datum/surgery_step/cavity/make_space
name = "make cavity space"
diff --git a/code/modules/surgery/encased.dm b/code/modules/surgery/encased.dm
index decc2d05c19..fc4275bbf38 100644
--- a/code/modules/surgery/encased.dm
+++ b/code/modules/surgery/encased.dm
@@ -61,7 +61,7 @@
user.visible_message(" [user]'s hand slips, cracking [target]'s [affected.encased] with \the [tool]!" , \
" Your hand slips, cracking [target]'s [affected.encased] with \the [tool]!" )
- affected.take_damage(20)
+ affected.receive_damage(20)
affected.fracture()
return 0
@@ -113,7 +113,7 @@
var/self_msg = " Your hand slips, cracking [target]'s [affected.encased]!"
user.visible_message(msg, self_msg)
- affected.take_damage(20)
+ affected.receive_damage(20)
affected.fracture()
return 0
@@ -164,7 +164,7 @@
var/self_msg = " Your hand slips, bending [target]'s [affected.encased] the wrong way!"
user.visible_message(msg, self_msg)
- affected.take_damage(20)
+ affected.receive_damage(20)
affected.fracture()
return 0
diff --git a/code/modules/surgery/face.dm b/code/modules/surgery/face.dm
index 7f3d49c6045..200d5305ad9 100644
--- a/code/modules/surgery/face.dm
+++ b/code/modules/surgery/face.dm
@@ -50,7 +50,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message(" [user]'s hand slips, slicing [target]'s throat wth \the [tool]!" , \
" Your hand slips, slicing [target]'s throat wth \the [tool]!" )
- affected.take_damage(60)
+ affected.receive_damage(60)
target.AdjustLoseBreath(4)
return 0
diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm
index e07fd0c4725..dea9b7f282c 100644
--- a/code/modules/surgery/generic.dm
+++ b/code/modules/surgery/generic.dm
@@ -51,7 +51,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message(" [user]'s hand slips, slicing open [target]'s [affected.name] in a wrong spot with \the [tool]!", \
" Your hand slips, slicing open [target]'s [affected.name] in a wrong spot with \the [tool]!")
- affected.take_damage(10)
+ affected.receive_damage(10)
return 0
/datum/surgery_step/generic/clamp_bleeders
@@ -85,7 +85,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message(" [user]'s hand slips, tearing blood vessals and causing massive bleeding in [target]'s [affected.name] with \the [tool]!", \
" Your hand slips, tearing blood vessels and causing massive bleeding in [target]'s [affected.name] with \the [tool]!",)
- affected.take_damage(10)
+ affected.receive_damage(10)
return 0
/datum/surgery_step/generic/retract_skin
@@ -238,6 +238,6 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message(" [user]'s hand slips, sawing through the bone in [target]'s [affected.name] with \the [tool]!", \
" Your hand slips, sawwing through the bone in [target]'s [affected.name] with \the [tool]!")
- affected.take_damage(30)
+ affected.receive_damage(30)
affected.fracture()
return 0
diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm
index 4d5e46e8ef4..1c96940a6d6 100644
--- a/code/modules/surgery/organs/augments_arms.dm
+++ b/code/modules/surgery/organs/augments_arms.dm
@@ -53,7 +53,9 @@
/obj/item/organ/internal/cyberimp/arm/emag_act()
return 0
-/obj/item/organ/internal/cyberimp/arm/gun/emp_act(severity)
+/obj/item/organ/internal/cyberimp/arm/emp_act(severity)
+ if(emp_proof)
+ return
if(prob(15/severity) && owner)
to_chat(owner, "[src] is hit by EMP!")
// give the owner an idea about why his implant is glitching
@@ -141,6 +143,8 @@
/obj/item/organ/internal/cyberimp/arm/gun/emp_act(severity)
+ if(emp_proof)
+ return
if(prob(30/severity) && owner && !crit_fail)
Retract()
owner.visible_message("A loud bang comes from [owner]\'s [parent_organ == "r_arm" ? "right" : "left"] arm!")
@@ -251,6 +255,8 @@
/obj/item/organ/internal/cyberimp/arm/power_cord/emp_act(severity)
// To allow repair via nanopaste/screwdriver
// also so IPCs don't also catch on fire and fall even more apart upon EMP
+ if(emp_proof)
+ return
damage = 1
crit_fail = TRUE
diff --git a/code/modules/surgery/organs/augments_eyes.dm b/code/modules/surgery/organs/augments_eyes.dm
index 67f33c4989d..71c88b81d4f 100644
--- a/code/modules/surgery/organs/augments_eyes.dm
+++ b/code/modules/surgery/organs/augments_eyes.dm
@@ -27,7 +27,7 @@
M.update_sight()
/obj/item/organ/internal/cyberimp/eyes/emp_act(severity)
- if(!owner)
+ if(!owner || emp_proof)
return
if(severity > 1)
if(prob(10 * severity))
diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm
index 7d5e03ea046..125bea64018 100644
--- a/code/modules/surgery/organs/augments_internal.dm
+++ b/code/modules/surgery/organs/augments_internal.dm
@@ -30,7 +30,7 @@
parent_organ = "head"
/obj/item/organ/internal/cyberimp/brain/emp_act(severity)
- if(!owner)
+ if(!owner || emp_proof)
return
var/stun_amount = 5 + (severity-1 ? 0 : 5)
owner.Stun(stun_amount)
@@ -91,7 +91,7 @@
r_hand_obj = null
/obj/item/organ/internal/cyberimp/brain/anti_drop/emp_act(severity)
- if(!owner)
+ if(!owner || emp_proof)
return
var/range = severity ? 10 : 5
var/atom/A
@@ -138,7 +138,7 @@
owner.SetWeakened(STUN_SET_AMOUNT)
/obj/item/organ/internal/cyberimp/brain/anti_stun/emp_act(severity)
- if(crit_fail)
+ if(crit_fail || emp_proof)
return
crit_fail = 1
spawn(90 / severity)
@@ -158,6 +158,8 @@
origin_tech = "materials=2;biotech=3"
/obj/item/organ/internal/cyberimp/mouth/breathing_tube/emp_act(severity)
+ if(emp_proof)
+ return
if(prob(60/severity) && owner)
to_chat(owner, "Your breathing tube suddenly closes!")
owner.AdjustLoseBreath(2)
@@ -203,7 +205,7 @@
synthesizing = 0
/obj/item/organ/internal/cyberimp/chest/nutriment/emp_act(severity)
- if(!owner)
+ if(!owner || emp_proof)
return
owner.reagents.add_reagent("????",poison_amount / severity) //food poisoning
to_chat(owner, "You feel like your insides are burning.")
@@ -258,13 +260,13 @@
reviving = 1
/obj/item/organ/internal/cyberimp/chest/reviver/emp_act(severity)
- if(!owner)
+ if(!owner || emp_proof)
return
if(reviving)
revive_cost += 200
else
cooldown += 200
- if(istype(owner, /mob/living/carbon/human))
+ if(ishuman(owner))
var/mob/living/carbon/human/H = owner
if(H.stat != DEAD && prob(50 / severity))
H.set_heartattack(TRUE)
diff --git a/code/modules/surgery/organs/blood.dm b/code/modules/surgery/organs/blood.dm
index 987b5cf53e4..bc19b6c6159 100644
--- a/code/modules/surgery/organs/blood.dm
+++ b/code/modules/surgery/organs/blood.dm
@@ -229,7 +229,7 @@
return list("O-", "O+")
//to add a splatter of blood or other mob liquid.
-/mob/living/proc/add_splatter_floor(turf/T, small_drip)
+/mob/living/proc/add_splatter_floor(turf/T, small_drip, shift_x, shift_y)
if(get_blood_id() != "blood")//is it blood or welding fuel?
return
if(!T)
@@ -260,29 +260,50 @@
return
// Find a blood decal or create a new one.
- var/obj/effect/decal/cleanable/blood/B = locate() in T
- if(!B)
+ var/obj/effect/decal/cleanable/blood/B
+ if(!(locate(B) in T) || pixel_x || pixel_y)
B = new /obj/effect/decal/cleanable/blood/splatter(T)
+ else
+ B = locate() in T
B.transfer_mob_blood_dna(src) //give blood info to the blood decal.
if(temp_blood_DNA)
B.blood_DNA |= temp_blood_DNA
+ B.pixel_x = (shift_x)
+ B.pixel_y = (shift_y)
B.update_icon()
+ if(shift_x || shift_y)
+ B.off_floor = TRUE
+ B.layer = BELOW_MOB_LAYER //So the blood lands ontop of things like posters, windows, etc.
-/mob/living/carbon/human/add_splatter_floor(turf/T, small_drip)
+/mob/living/carbon/human/add_splatter_floor(turf/T, small_drip, shift_x, shift_y)
if(!(NO_BLOOD in species.species_traits))
..()
-/mob/living/carbon/alien/add_splatter_floor(turf/T, small_drip)
+/mob/living/carbon/alien/add_splatter_floor(turf/T, small_drip, shift_x, shift_y)
if(!T)
T = get_turf(src)
- var/obj/effect/decal/cleanable/blood/xeno/B = locate() in T.contents
- if(!B)
+ var/obj/effect/decal/cleanable/blood/xeno/B
+ if(!(locate(B) in T) || pixel_x || pixel_y)
B = new(T)
+ else
+ B = locate() in T
B.blood_DNA["UNKNOWN DNA"] = "X*"
+ B.pixel_x = (shift_x)
+ B.pixel_y = (shift_y)
+ if(shift_x || shift_y)
+ B.off_floor = TRUE
+ B.layer = BELOW_MOB_LAYER
-/mob/living/silicon/robot/add_splatter_floor(turf/T, small_drip)
+/mob/living/silicon/robot/add_splatter_floor(turf/T, small_drip, shift_x, shift_y)
if(!T)
T = get_turf(src)
- var/obj/effect/decal/cleanable/blood/oil/B = locate() in T.contents
- if(!B)
- B = new(T)
\ No newline at end of file
+ var/obj/effect/decal/cleanable/blood/oil/B
+ if(!(locate(B) in T) || pixel_x || pixel_y)
+ B = new(T)
+ else
+ B = locate() in T
+ B.pixel_x = (shift_x)
+ B.pixel_y = (shift_y)
+ if(shift_x || shift_y)
+ B.off_floor = TRUE
+ B.layer = BELOW_MOB_LAYER
diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm
index b730c4d559b..39c79865b62 100644
--- a/code/modules/surgery/organs/lungs.dm
+++ b/code/modules/surgery/organs/lungs.dm
@@ -40,7 +40,7 @@
var/cold_level_1_damage = COLD_GAS_DAMAGE_LEVEL_1 //Keep in mind with gas damage levels, you can set these to be negative, if you want someone to heal, instead.
var/cold_level_2_damage = COLD_GAS_DAMAGE_LEVEL_2
var/cold_level_3_damage = COLD_GAS_DAMAGE_LEVEL_3
- var/cold_damage_type = BURN
+ var/cold_damage_types = list(BURN = 1)
var/hot_message = "your face burning and a searing heat"
var/heat_level_1_threshold = 360
@@ -49,7 +49,7 @@
var/heat_level_1_damage = HEAT_GAS_DAMAGE_LEVEL_1
var/heat_level_2_damage = HEAT_GAS_DAMAGE_LEVEL_2
var/heat_level_3_damage = HEAT_GAS_DAMAGE_LEVEL_3
- var/heat_damage_type = BURN
+ var/heat_damage_types = list(BURN = 1)
/obj/item/organ/internal/lungs/insert(mob/living/carbon/M, special = 0, dont_remove_slot = 0)
..()
@@ -269,25 +269,33 @@
species_traits = H.species.species_traits
if(!(COLDRES in H.mutations) && !(RESISTCOLD in species_traits)) // COLD DAMAGE
- var/cold_modifier = H.species.coldmod
+ var/CM = abs(H.species.coldmod)
+ var/TC = 0
if(breath_temperature < cold_level_3_threshold)
- H.apply_damage_type(cold_level_3_damage*cold_modifier, cold_damage_type)
+ TC = cold_level_3_damage
if(breath_temperature > cold_level_3_threshold && breath_temperature < cold_level_2_threshold)
- H.apply_damage_type(cold_level_2_damage*cold_modifier, cold_damage_type)
+ TC = cold_level_2_damage
if(breath_temperature > cold_level_2_threshold && breath_temperature < cold_level_1_threshold)
- H.apply_damage_type(cold_level_1_damage*cold_modifier, cold_damage_type)
+ TC = cold_level_1_damage
+ if(TC)
+ for(var/D in cold_damage_types)
+ H.apply_damage_type(TC * CM * cold_damage_types[D], D)
if(breath_temperature < cold_level_1_threshold)
if(prob(20))
to_chat(H, "You feel [cold_message] in your [name]!")
if(!(HEATRES in H.mutations) && !(RESISTHOT in species_traits)) // HEAT DAMAGE
- var/heat_modifier = H.species.heatmod
+ var/HM = abs(H.species.heatmod)
+ var/TH = 0
if(breath_temperature > heat_level_1_threshold && breath_temperature < heat_level_2_threshold)
- H.apply_damage_type(heat_level_1_damage*heat_modifier, heat_damage_type)
+ TH = heat_level_1_damage
if(breath_temperature > heat_level_2_threshold && breath_temperature < heat_level_3_threshold)
- H.apply_damage_type(heat_level_2_damage*heat_modifier, heat_damage_type)
+ TH = heat_level_2_damage
if(breath_temperature > heat_level_3_threshold)
- H.apply_damage_type(heat_level_3_damage*heat_modifier, heat_damage_type)
+ TH = heat_level_3_damage
+ if(TH)
+ for(var/D in heat_damage_types)
+ H.apply_damage_type(TH * HM * heat_damage_types[D], D)
if(breath_temperature > heat_level_1_threshold)
if(prob(20))
to_chat(H, "You feel [hot_message] in your [name]!")
@@ -326,4 +334,4 @@
cold_level_1_damage = -COLD_GAS_DAMAGE_LEVEL_1 //They heal when the air is cold
cold_level_2_damage = -COLD_GAS_DAMAGE_LEVEL_2
cold_level_3_damage = -COLD_GAS_DAMAGE_LEVEL_3
- cold_damage_type = BRUTE //more specifically they heal brute
\ No newline at end of file
+ cold_damage_types = list(BRUTE = 1, BURN = 0.5)
\ No newline at end of file
diff --git a/code/modules/surgery/organs/organ.dm b/code/modules/surgery/organs/organ.dm
index f43438417d5..ba89166e8b5 100644
--- a/code/modules/surgery/organs/organ.dm
+++ b/code/modules/surgery/organs/organ.dm
@@ -29,6 +29,7 @@
var/sterile = FALSE //can the organ be infected by germs?
var/tough = FALSE //can organ be easily damaged?
+ var/emp_proof = FALSE //is the organ immune to EMPs?
/obj/item/organ/Destroy()
@@ -168,7 +169,7 @@
..()
if(germ_level >= INFECTION_LEVEL_TWO)
if(prob(3)) //about once every 30 seconds
- take_damage(1,silent=prob(30))
+ receive_damage(1,silent=prob(30))
/obj/item/organ/proc/rejuvenate()
damage = 0
@@ -219,7 +220,7 @@
W.time_inflicted = world.time
//Note: external organs have their own version of this proc
-/obj/item/organ/proc/take_damage(amount, silent = 0)
+/obj/item/organ/proc/receive_damage(amount, silent = 0)
if(tough)
return
if(status & ORGAN_ROBOT)
@@ -252,43 +253,45 @@
min_broken_damage = 35
/obj/item/organ/external/emp_act(severity)
- if(!(status & ORGAN_ROBOT))
+ if(!(status & ORGAN_ROBOT) || emp_proof)
return
if(tough)
switch(severity)
if(1)
- take_damage(0, 5.5)
+ receive_damage(0, 5.5)
if(owner)
owner.Stun(10)
if(2)
- take_damage(0, 2.8)
+ receive_damage(0, 2.8)
if(owner)
owner.Stun(5)
else
switch(severity)
if(1)
- take_damage(0, 20)
+ receive_damage(0, 20)
if(2)
- take_damage(0, 7)
+ receive_damage(0, 7)
/obj/item/organ/internal/emp_act(severity)
- if(!robotic)
+ if(!robotic || emp_proof)
return
if(robotic == 2)
switch(severity)
if(1.0)
- take_damage(20, 1)
+ receive_damage(20, 1)
if(2.0)
- take_damage(7, 1)
+ receive_damage(7, 1)
else if(robotic == 1)
- take_damage(11, 1)
+ receive_damage(11, 1)
/obj/item/organ/internal/heart/emp_act(intensity)
+ if(emp_proof)
+ return
if(owner && robotic == 2)
Stop() // In the name of looooove~!
owner.visible_message("[owner] clutches their chest and gasps!","You clutch your chest in pain!")
else if(owner && robotic == 1)
- take_damage(11,1)
+ receive_damage(11,1)
/obj/item/organ/proc/remove(var/mob/living/user,special = 0)
if(!istype(owner))
diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm
index f03c05c934a..0d077a7999b 100644
--- a/code/modules/surgery/organs/organ_external.dm
+++ b/code/modules/surgery/organs/organ_external.dm
@@ -171,7 +171,7 @@
DAMAGE PROCS
****************************************************/
-/obj/item/organ/external/take_damage(brute, burn, sharp, used_weapon = null, list/forbidden_limbs = list(), ignore_resists = FALSE)
+/obj/item/organ/external/receive_damage(brute, burn, sharp, used_weapon = null, list/forbidden_limbs = list(), ignore_resists = FALSE)
if(tough && !ignore_resists)
brute = max(0, brute - 5)
burn = max(0, burn - 4)
@@ -194,7 +194,7 @@
// Damage an internal organ
if(internal_organs && internal_organs.len)
var/obj/item/organ/internal/I = pick(internal_organs)
- I.take_damage(brute * 0.5)
+ I.receive_damage(brute * 0.5)
brute -= brute * 0.5
if(status & ORGAN_BROKEN && prob(40) && brute)
@@ -246,7 +246,7 @@
if(possible_points.len)
//And pass the pain around
var/obj/item/organ/external/target = pick(possible_points)
- target.take_damage(brute, burn, sharp, used_weapon, forbidden_limbs + src, ignore_resists = TRUE) //If the damage was reduced before, don't reduce it again
+ target.receive_damage(brute, burn, sharp, used_weapon, forbidden_limbs + src, ignore_resists = TRUE) //If the damage was reduced before, don't reduce it again
if(dismember_at_max_damage && body_part != UPPER_TORSO && body_part != LOWER_TORSO) // We've ensured all damage to the mob is retained, now let's drop it, if necessary.
droplimb(1) //Clean loss, just drop the limb and be done
@@ -524,7 +524,7 @@ Note that amputating the affected organ does in fact remove the infection from t
for(var/obj/item/organ/external/E in children) //Factor in the children's brute and burn into how much will transfer
total_brute += E.brute_dam
total_burn += E.burn_dam
- parent.take_damage(total_brute, total_burn, ignore_resists = TRUE) //Transfer the full damage to the parent, bypass limb damage reduction.
+ parent.receive_damage(total_brute, total_burn, ignore_resists = TRUE) //Transfer the full damage to the parent, bypass limb damage reduction.
parent = null
spawn(1)
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index 90932612438..cefc03f5a1c 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -297,7 +297,7 @@
var/eye_colour = "#000000"
var/list/colourmatrix = null
var/list/colourblind_matrix = MATRIX_GREYSCALE //Special colourblindness parameters. By default, it's black-and-white.
- var/colourblind_darkview = null
+ var/list/replace_colours = LIST_GREYSCALE_REPLACE
var/dependent_disabilities = null //Gets set by eye-dependent disabilities such as colourblindness so the eyes can transfer the disability during transplantation.
var/dark_view = 2 //Default dark_view for Humans.
var/weld_proof = null //If set, the eyes will not take damage during welding. eg. IPC optical sensors do not take damage when they weld things while all other eyes will.
@@ -312,10 +312,7 @@
return colourmatrix
/obj/item/organ/internal/eyes/proc/get_dark_view() //Returns dark_view (if the eyes are organic) for see_invisible handling in species.dm to be autoprocessed by life().
- if(!robotic && colourblind_darkview && owner.disabilities & COLOURBLIND) //Returns special darkview value if colourblind and it exists, otherwise reuse current.
- return colourblind_darkview
- else
- return dark_view
+ return dark_view
/obj/item/organ/internal/eyes/insert(mob/living/carbon/human/M, special = 0)
..()
@@ -401,16 +398,16 @@
if(owner.getToxLoss() >= 60 && !owner.reagents.has_reagent("charcoal"))
//Healthy liver suffers on its own
if(damage < min_broken_damage)
- take_damage(0.2 * PROCESS_ACCURACY)
+ receive_damage(0.2 * PROCESS_ACCURACY)
//Damaged one shares the fun
else
var/obj/item/organ/internal/O = pick(owner.internal_organs)
if(O)
- O.take_damage(0.2 * PROCESS_ACCURACY)
+ O.receive_damage(0.2 * PROCESS_ACCURACY)
//Detox can heal small amounts of damage
if(damage && damage < min_bruised_damage && owner.reagents.has_reagent("charcoal"))
- take_damage(-0.2 * PROCESS_ACCURACY)
+ receive_damage(-0.2 * PROCESS_ACCURACY)
// Get the effectiveness of the liver.
var/filter_effect = 3
diff --git a/code/modules/surgery/organs/subtypes/drask.dm b/code/modules/surgery/organs/subtypes/drask.dm
index 9c204cd92f3..8560d2408ec 100644
--- a/code/modules/surgery/organs/subtypes/drask.dm
+++ b/code/modules/surgery/organs/subtypes/drask.dm
@@ -15,6 +15,7 @@
/obj/item/organ/internal/liver/drask
name = "metabolic strainer"
icon = 'icons/obj/surgery_drask.dmi'
+ icon_state = "kidneys"
alcohol_intensity = 0.8
species = "Drask"
diff --git a/code/modules/surgery/organs/subtypes/standard.dm b/code/modules/surgery/organs/subtypes/standard.dm
index a18613d55af..8efff94e872 100644
--- a/code/modules/surgery/organs/subtypes/standard.dm
+++ b/code/modules/surgery/organs/subtypes/standard.dm
@@ -210,7 +210,7 @@
..()
-/obj/item/organ/external/head/take_damage(brute, burn, sharp, used_weapon = null, list/forbidden_limbs = list(), ignore_resists = FALSE)
+/obj/item/organ/external/head/receive_damage(brute, burn, sharp, used_weapon = null, list/forbidden_limbs = list(), ignore_resists = FALSE)
..(brute, burn, sharp, used_weapon, forbidden_limbs, ignore_resists)
if(!disfigured)
if(brute_dam > 40)
diff --git a/code/modules/surgery/organs/subtypes/tajaran.dm b/code/modules/surgery/organs/subtypes/tajaran.dm
index 746abd6e601..a1313934037 100644
--- a/code/modules/surgery/organs/subtypes/tajaran.dm
+++ b/code/modules/surgery/organs/subtypes/tajaran.dm
@@ -2,15 +2,16 @@
alcohol_intensity = 1.4
species = "Tajaran"
-/obj/item/organ/internal/eyes/tajaran /*Most Tajara see in full colour as a result of genetic augmentation, although it cost them their darksight (darksight = 2)
- unless they choose otherwise by selecting the colourblind disability in character creation (darksight = 8 but colourblind).*/
+/obj/item/organ/internal/eyes/tajaran
name = "tajaran eyeballs"
species = "Tajaran"
colourblind_matrix = MATRIX_TAJ_CBLIND //The colour matrix and darksight parameters that the mob will recieve when they get the disability.
- colourblind_darkview = 8
+ replace_colours = LIST_TAJ_REPLACE
+ dark_view = 8
/obj/item/organ/internal/eyes/tajaran/farwa //Being the lesser form of Tajara, Farwas have an utterly incurable version of their colourblindness.
name = "farwa eyeballs"
species = "Farwa"
colourmatrix = MATRIX_TAJ_CBLIND
dark_view = 8
+ replace_colours = LIST_TAJ_REPLACE
diff --git a/code/modules/surgery/organs/subtypes/vulpkanin.dm b/code/modules/surgery/organs/subtypes/vulpkanin.dm
index af3d9deab09..be851c43486 100644
--- a/code/modules/surgery/organs/subtypes/vulpkanin.dm
+++ b/code/modules/surgery/organs/subtypes/vulpkanin.dm
@@ -2,15 +2,17 @@
alcohol_intensity = 1.4
species = "Vulpkanin"
-/obj/item/organ/internal/eyes/vulpkanin /*Most Vulpkanin see in full colour as a result of genetic augmentation, although it cost them their darksight (darksight = 2)
- unless they choose otherwise by selecting the colourblind disability in character creation (darksight = 8 but colourblind).*/
+
+/obj/item/organ/internal/eyes/vulpkanin
name = "vulpkanin eyeballs"
species = "Vulpkanin"
colourblind_matrix = MATRIX_VULP_CBLIND //The colour matrix and darksight parameters that the mob will recieve when they get the disability.
- colourblind_darkview = 8
+ replace_colours = LIST_VULP_REPLACE
+ dark_view = 8
/obj/item/organ/internal/eyes/vulpkanin/wolpin //Being the lesser form of Vulpkanin, Wolpins have an utterly incurable version of their colourblindness.
name = "wolpin eyeballs"
species = "Wolpin"
colourmatrix = MATRIX_VULP_CBLIND
dark_view = 8
+ replace_colours = LIST_VULP_REPLACE
diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm
index 0b3ac65974d..15f86021c6c 100644
--- a/code/modules/surgery/organs_internal.dm
+++ b/code/modules/surgery/organs_internal.dm
@@ -71,12 +71,14 @@
var/implements_extract = list(/obj/item/weapon/hemostat = 100, /obj/item/weapon/kitchen/utensil/fork = 70)
var/implements_mend = list(/obj/item/stack/medical/bruise_pack = 20,/obj/item/stack/medical/bruise_pack/advanced = 100,/obj/item/stack/nanopaste = 100)
var/implements_clean = list(/obj/item/weapon/reagent_containers/dropper = 100,
+ /obj/item/weapon/reagent_containers/syringe = 100,
/obj/item/weapon/reagent_containers/glass/bottle = 90,
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 85,
/obj/item/weapon/reagent_containers/food/drinks/bottle = 80,
/obj/item/weapon/reagent_containers/glass/beaker = 75,
/obj/item/weapon/reagent_containers/spray = 60,
/obj/item/weapon/reagent_containers/glass/bucket = 50)
+
//Finish is just so you can close up after you do other things.
var/implements_finsh = list(/obj/item/weapon/scalpel/laser/manager = 100,/obj/item/weapon/retractor = 100 ,/obj/item/weapon/crowbar = 90)
var/current_type
@@ -129,13 +131,16 @@
for(var/obj/item/organ/internal/I in affected.internal_organs)
if(I)
- if(C.reagents.total_volume < GHETTO_DISINFECT_AMOUNT)
+ if(C.reagents.total_volume <= 0) //end_step handles if there is not enough reagent
user.visible_message("[user] notices [tool] is empty.", \
- "You notice [tool] is empty")
+ "You notice [tool] is empty.")
return 0
var/msg = "[user] starts pouring some of [tool] over [target]'s [I.name]."
var/self_msg = "You start pouring some of [tool] over [target]'s [I.name]."
+ if(istype(C,/obj/item/weapon/reagent_containers/syringe))
+ msg = "[user] begins injecting [tool] into [target]'s [I.name]."
+ self_msg = "You begin injecting [tool] into [target]'s [I.name]."
user.visible_message(msg, self_msg)
if(H && affected)
H.custom_pain("Something burns horribly in your [affected.name]!",1)
@@ -300,23 +305,34 @@
var/obj/item/weapon/reagent_containers/C = tool
var/datum/reagents/R = C.reagents
var/ethanol = 0 //how much alcohol is in the thing
+ var/spaceacillin = 0 //how much actual antibiotic is in the thing
if(R.reagent_list.len)
for(var/datum/reagent/consumable/ethanol/alcohol in R.reagent_list)
ethanol += alcohol.alcohol_perc * 300
ethanol /= R.reagent_list.len
+ spaceacillin = R.get_reagent_amount("spaceacillin")
+
+
for(var/obj/item/organ/internal/I in affected.internal_organs)
if(I)
if(R.total_volume < GHETTO_DISINFECT_AMOUNT)
- user.visible_message("[user] notices there is not enough of [tool].", \
- "You notice there is not enough of [tool].")
+ user.visible_message("[user] notices there is not enough in [tool].", \
+ "You notice there is not enough in [tool].")
return 0
if(I.germ_level < INFECTION_LEVEL_ONE / 2)
to_chat(user, "[I] does not appear to be infected.")
if(I.germ_level >= INFECTION_LEVEL_ONE / 2)
- I.germ_level = max(I.germ_level-ethanol, 0)
- user.visible_message(" [user] has poured some of [tool] over [target]'s [I.name].",
+ if(spaceacillin >= GHETTO_DISINFECT_AMOUNT)
+ I.germ_level = 0
+ else
+ I.germ_level = max(I.germ_level-ethanol, 0)
+ if(istype(C,/obj/item/weapon/reagent_containers/syringe))
+ user.visible_message(" [user] has injected [tool] into [target]'s [I.name].",
+ " You have injected [tool] into [target]'s [I.name].")
+ else
+ user.visible_message(" [user] has poured some of [tool] over [target]'s [I.name].",
" You have poured some of [tool] over [target]'s [I.name].")
R.trans_to(target, GHETTO_DISINFECT_AMOUNT)
R.reaction(target, INGEST)
@@ -352,11 +368,11 @@
else if(istype(tool, /obj/item/stack/medical/bruise_pack) || istype(tool, /obj/item/stack/nanopaste))
dam_amt = 5
target.adjustToxLoss(10)
- affected.take_damage(5)
+ affected.receive_damage(5)
for(var/obj/item/organ/internal/I in affected.internal_organs)
if(I && I.damage && !(I.tough))
- I.take_damage(dam_amt,0)
+ I.receive_damage(dam_amt,0)
return 0
@@ -365,7 +381,7 @@
" Your hand slips, damaging [tool]!")
var/obj/item/organ/internal/I = tool
if(istype(I) && !I.tough)
- I.take_damage(rand(3,5),0)
+ I.receive_damage(rand(3,5),0)
return 0
@@ -386,7 +402,7 @@
for(var/obj/item/organ/internal/I in affected.internal_organs)
I.germ_level = max(I.germ_level-ethanol, 0)
- I.take_damage(rand(4,8),0)
+ I.receive_damage(rand(4,8),0)
R.trans_to(target, GHETTO_DISINFECT_AMOUNT * 10)
R.reaction(target, INGEST)
@@ -400,7 +416,7 @@
if(affected)
user.visible_message(" [user]'s hand slips, damaging [target]'s [affected.name] with [tool]!", \
" Your hand slips, damaging [target]'s [affected.name] with [tool]!")
- affected.take_damage(20)
+ affected.receive_damage(20)
else
user.visible_message(" [user]'s hand slips, damaging [target]'s [parse_zone(target_zone)] with [tool]!", \
" Your hand slips, damaging [target]'s [parse_zone(target_zone)] with [tool]!")
@@ -420,7 +436,7 @@
var/self_msg = " Your hand slips, tearing skin!"
user.visible_message(msg, self_msg)
if(affected)
- affected.take_damage(20)
+ affected.receive_damage(20)
return 0
diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm
index 233b6f56a33..b7f2e9ba084 100644
--- a/code/modules/surgery/other.dm
+++ b/code/modules/surgery/other.dm
@@ -99,7 +99,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message(" [user]'s hand slips, smearing [tool] in the incision in [target]'s [affected.name]!" , \
" Your hand slips, smearing [tool] in the incision in [target]'s [affected.name]!")
- affected.take_damage(5, 0)
+ affected.receive_damage(5, 0)
return 0
@@ -148,7 +148,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message(" [user]'s hand slips, slicing an artery inside [target]'s [affected.name] with \the [tool]!", \
" Your hand slips, slicing an artery inside [target]'s [affected.name] with \the [tool]!")
- affected.take_damage(20)
+ affected.receive_damage(20)
return 0
diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm
index 27f722318d7..53219ed8a14 100644
--- a/code/modules/surgery/robotics.dm
+++ b/code/modules/surgery/robotics.dm
@@ -485,11 +485,11 @@
" Your hand slips, gumming up the mechanisms inside of [target]'s [affected.name] with \the [tool]!")
target.adjustToxLoss(5)
- affected.take_damage(5)
+ affected.receive_damage(5)
for(var/obj/item/organ/internal/I in affected.internal_organs)
if(I)
- I.take_damage(rand(3,5),0)
+ I.receive_damage(rand(3,5),0)
else if(current_type == "insert")
user.visible_message(" [user]'s hand slips, disconnecting \the [tool].", \
diff --git a/config/example/config.txt b/config/example/config.txt
index a8c660d167d..d575635baeb 100644
--- a/config/example/config.txt
+++ b/config/example/config.txt
@@ -137,14 +137,6 @@ DEFAULT_NO_VOTE
## allow AI job
ALLOW_AI
-## Secborg ###
-## Uncomment to prevent the security cyborg module from being chosen
-#DISABLE_SECBORG
-
-## Peacekeeper Borg ###
-## Uncomment to prevent the peacekeeper cyborg module from being chosen
-#DISABLE_PEACEBORG
-
## Allow ghosts to see antagonist through AntagHUD
ALLOW_ANTAG_HUD
diff --git a/goon/browserassets/css/browserOutput.css b/goon/browserassets/css/browserOutput.css
index bd6472f2315..ca7b9ac61fc 100644
--- a/goon/browserassets/css/browserOutput.css
+++ b/goon/browserassets/css/browserOutput.css
@@ -217,6 +217,21 @@ a.popt {text-decoration: none;}
/* ADD HERE FOR ITALIC */
.italic, .ghostdronesay.broadcast {font-style: italic;}
+/* BADGE */
+.repeatBadge {
+ display: inline-block;
+ min-width: 0.5em;
+ font-size: 0.7em;
+ padding: 0.2em 0.3em;
+ line-height: 1;
+ color: white;
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: middle;
+ background-color: crimson;
+ border-radius: 10px;
+}
+
/* OUTPUT COLORS */
.highlight {background: yellow;}
h1, h2, h3, h4, h5, h6 {color: #0000ff;font-family: Georgia, Verdana, sans-serif;}
diff --git a/goon/browserassets/html/browserOutput.html b/goon/browserassets/html/browserOutput.html
index 4bcd05f4cb0..496eac94a6c 100644
--- a/goon/browserassets/html/browserOutput.html
+++ b/goon/browserassets/html/browserOutput.html
@@ -49,6 +49,7 @@
Decrease font size -
Increase font size +
Change font
+ Condense chat Ø
Toggle ping display
Highlight string
Save chat log
@@ -66,4 +67,4 @@