[target.name] was shocked by the [src.name]!", \
@@ -735,7 +735,7 @@
Z.take_organ_damage(0,30)
user.visible_message("[user] slams the charged axe into [Z.name] with all their might!")
playsound(loc, 'sound/magic/lightningbolt.ogg', 5, 1)
- var/datum/effect/system/spark_spread/sparks = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread
sparks.set_up(1, 1, src)
sparks.start()
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 e989cea7e85..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)
@@ -212,7 +209,7 @@
if(!(E.rcell && E.rcell.use(E.chargecost)))
to_chat(user, "Unable to teleport, insufficient charge.")
return
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(5, 1, src)
s.start()
do_teleport(src, E.pad, 0)
@@ -239,7 +236,7 @@
if(!(E.rcell && E.rcell.use(E.chargecost)))
to_chat(user, "Unable to teleport, insufficient charge.")
return
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(5, 1, src)
s.start()
do_teleport(src, L)
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/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index 043fdf2f9c4..aa0f0bc5d00 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -38,7 +38,7 @@
if(isliving(usr))
var/mob/living/L = usr
if(L.electrocute_act(17, src))
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(5, 1, src)
s.start()
return 2
@@ -115,7 +115,7 @@
if(!(E.rcell && E.rcell.use(E.chargecost)))
to_chat(user, "Unable to teleport, insufficient charge.")
return
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(5, 1, src)
s.start()
do_teleport(src, E.pad, 0)
@@ -139,7 +139,7 @@
if(!(E.rcell && E.rcell.use(E.chargecost)))
to_chat(user, "Unable to teleport, insufficient charge.")
return
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(5, 1, src)
s.start()
do_teleport(src, L)
@@ -217,7 +217,7 @@
if(isliving(user))
var/mob/living/L = user
if(L.electrocute_act(17, src))
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(5, 1, src)
s.start()
return
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/door_assembly.dm b/code/game/objects/structures/door_assembly.dm
index b8ab485512a..7292cc0b68c 100644
--- a/code/game/objects/structures/door_assembly.dm
+++ b/code/game/objects/structures/door_assembly.dm
@@ -1,19 +1,20 @@
/obj/structure/door_assembly
icon = 'icons/obj/doors/door_assembly.dmi'
-
- name = "Airlock Assembly"
+ name = "airlock assembly"
icon_state = "door_as_0"
anchored = 0
density = 1
var/state = 0
var/base_icon_state = ""
- var/base_name = "Airlock"
+ var/base_name = "airlock"
var/obj/item/weapon/airlock_electronics/electronics = null
var/airlock_type = "" //the type path of the airlock once completed
var/glass_type = "/glass"
var/glass = 0 // 0 = glass can be installed. -1 = glass can't be installed. 1 = glass is already installed. Text = mineral plating is installed instead.
var/created_name = null
var/heat_proof_finished = 0 //whether to heat-proof the finished airlock
+ var/material_type = /obj/item/stack/sheet/metal
+ var/material_amt = 4
/obj/structure/door_assembly/New()
update_state()
@@ -23,92 +24,116 @@
return ..()
/obj/structure/door_assembly/door_assembly_com
+ name = "command airlock assembly"
base_icon_state = "com"
- base_name = "Command Airlock"
+ base_name = "command airlock"
glass_type = "/glass_command"
airlock_type = "/command"
/obj/structure/door_assembly/door_assembly_sec
+ name = "security airlock assembly"
base_icon_state = "sec"
- base_name = "Security Airlock"
+ base_name = "security airlock"
glass_type = "/glass_security"
airlock_type = "/security"
/obj/structure/door_assembly/door_assembly_eng
+ name = "engineering airlock assembly"
base_icon_state = "eng"
- base_name = "Engineering Airlock"
+ base_name = "engineering airlock"
glass_type = "/glass_engineering"
airlock_type = "/engineering"
/obj/structure/door_assembly/door_assembly_min
+ name = "mining airlock assembly"
base_icon_state = "min"
- base_name = "Mining Airlock"
+ base_name = "mining airlock"
glass_type = "/glass_mining"
airlock_type = "/mining"
/obj/structure/door_assembly/door_assembly_atmo
+ name = "atmospherics airlock assembly"
base_icon_state = "atmo"
- base_name = "Atmospherics Airlock"
+ base_name = "atmospherics airlock"
glass_type = "/glass_atmos"
airlock_type = "/atmos"
/obj/structure/door_assembly/door_assembly_research
+ name = "research airlock assembly"
base_icon_state = "res"
- base_name = "Research Airlock"
+ base_name = "research airlock"
glass_type = "/glass_research"
airlock_type = "/research"
/obj/structure/door_assembly/door_assembly_science
+ name = "science airlock assembly"
base_icon_state = "sci"
- base_name = "Science Airlock"
+ base_name = "science airlock"
glass_type = "/glass_science"
airlock_type = "/science"
/obj/structure/door_assembly/door_assembly_med
+ name = "medical airlock assembly"
base_icon_state = "med"
- base_name = "Medical Airlock"
+ base_name = "medical airlock"
glass_type = "/glass_medical"
airlock_type = "/medical"
/obj/structure/door_assembly/door_assembly_mai
+ name = "maintenance airlock assembly"
base_icon_state = "mai"
- base_name = "Maintenance Airlock"
+ base_name = "maintenance airlock"
airlock_type = "/maintenance"
glass = -1
/obj/structure/door_assembly/door_assembly_ext
+ name = "external airlock assembly"
base_icon_state = "ext"
- base_name = "External Airlock"
+ base_name = "external airlock"
airlock_type = "/external"
glass = -1
/obj/structure/door_assembly/door_assembly_fre
+ name = "freezer airlock assembly"
base_icon_state = "fre"
- base_name = "Freezer Airlock"
+ base_name = "freezer airlock"
airlock_type = "/freezer"
glass = -1
/obj/structure/door_assembly/door_assembly_hatch
+ name = "airtight hatch assembly"
base_icon_state = "hatch"
- base_name = "Airtight Hatch"
+ base_name = "airtight hatch"
airlock_type = "/hatch"
glass = -1
/obj/structure/door_assembly/door_assembly_mhatch
+ name = "maintenance hatch assembly"
base_icon_state = "mhatch"
- base_name = "Maintenance Hatch"
+ base_name = "maintenance hatch"
airlock_type = "/maintenance_hatch"
glass = -1
-/obj/structure/door_assembly/door_assembly_highsecurity // Borrowing this until WJohnston makes sprites for the assembly
+/obj/structure/door_assembly/door_assembly_highsecurity
+ name = "high security airlock assembly"
base_icon_state = "highsec"
- base_name = "High Security Airlock"
+ base_name = "high security airlock"
airlock_type = "/highsecurity"
glass = -1
+ material_type = /obj/item/stack/sheet/plasteel
+
+/obj/structure/door_assembly/door_assembly_vault
+ name = "vault door assembly"
+ base_icon_state = "vault"
+ base_name = "vault door"
+ airlock_type = "/vault"
+ glass = -1
+ material_type = /obj/item/stack/sheet/plasteel
/obj/structure/door_assembly/door_assembly_shuttle
+ name = "shuttle airlock assembly"
base_icon_state = "shuttle"
- base_name = "Shuttle Airlock"
+ base_name = "shuttle airlock"
airlock_type = "/shuttle"
glass = -1
@@ -152,31 +177,40 @@
airlock_type = "/cult/runed"
glass = -1
-/obj/structure/door_assembly/attackby(obj/item/W as obj, mob/user as mob, params)
+/obj/structure/door_assembly/door_assembly_centcom
+ base_icon_state = "ele"
+ airlock_type = "/centcom"
+ glass = -1
+
+/obj/structure/door_assembly/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/weapon/pen))
- var/t = copytext(stripped_input(user, "Enter the name for the door.", src.name, src.created_name),1,MAX_NAME_LEN)
- if(!t) return
- if(!in_range(src, usr) && src.loc != usr) return
+ var/t = copytext(stripped_input(user, "Enter the name for the door.", name, created_name),1,MAX_NAME_LEN)
+ if(!t)
+ return
+ if(!in_range(src, usr) && loc != usr)
+ return
created_name = t
return
- if(istype(W, /obj/item/weapon/weldingtool) && ( (istext(glass)) || (glass == 1) || (!anchored) ))
+ if(iswelder(W) && ((istext(glass)) || (glass == 1) || !anchored ))
var/obj/item/weapon/weldingtool/WT = W
if(WT.remove_fuel(0, user))
- playsound(src.loc, WT.usesound, 50, 1)
+ playsound(loc, WT.usesound, 50, 1)
if(istext(glass))
- user.visible_message("[user] welds the [glass] plating off the airlock assembly.", "You start to weld the [glass] plating off the airlock assembly.")
+ user.visible_message("[user] welds the [glass] plating off the airlock assembly.", "You start to weld the [glass] plating off the airlock assembly...")
if(do_after(user, 40 * WT.toolspeed, target = src))
- if(!src || !WT.isOn()) return
- to_chat(user, "You welded the [glass] plating off!")
+ if(!src || !WT.isOn())
+ return
+ to_chat(user, "You weld the [glass] plating off.")
var/M = text2path("/obj/item/stack/sheet/mineral/[glass]")
- new M(src.loc, 2)
+ new M(loc, 2)
glass = 0
else if(glass == 1)
- user.visible_message("[user] welds the glass panel out of the airlock assembly.", "You start to weld the glass panel out of the airlock assembly.")
+ user.visible_message("[user] welds the glass panel out of the airlock assembly.", "You start to weld the glass panel out of the airlock assembly...")
if(do_after(user, 40 * WT.toolspeed, target = src))
- if(!src || !WT.isOn()) return
- to_chat(user, "You welded the glass panel out!")
+ if(!src || !WT.isOn())
+ return
+ to_chat(user, "You weld the glass panel out.")
if(heat_proof_finished)
new /obj/item/stack/sheet/rglass(get_turf(src))
heat_proof_finished = 0
@@ -184,87 +218,91 @@
new /obj/item/stack/sheet/glass(get_turf(src))
glass = 0
else if(!anchored)
- user.visible_message("[user] disassembles the airlock assembly.", "You start to disassemble the airlock assembly.")
+ user.visible_message("[user] disassembles the airlock assembly.", "You start to disassemble the airlock assembly...")
if(do_after(user, 40 * WT.toolspeed, target = src))
- if(!src || !WT.isOn()) return
- to_chat(user, "You dissasembled the airlock assembly!")
- new /obj/item/stack/sheet/metal(src.loc, 4)
+ if(!src || !WT.isOn())
+ return
+ to_chat(user, "You disassemble the airlock assembly.")
+ new material_type(loc, material_amt)
qdel(src)
else
to_chat(user, "You need more welding fuel.")
return
- else if(istype(W, /obj/item/weapon/wrench) && state == 0)
- playsound(src.loc, W.usesound, 100, 1)
+ else if(iswrench(W) && state == 0)
+ playsound(loc, W.usesound, 100, 1)
if(anchored)
- user.visible_message("[user] unsecures the airlock assembly from the floor.", "You start to unsecure the airlock assembly from the floor.")
+ user.visible_message("[user] unsecures the airlock assembly from the floor.", "You start to unsecure the airlock assembly from the floor...")
else
- user.visible_message("[user] secures the airlock assembly to the floor.", "You start to secure the airlock assembly to the floor.")
+ user.visible_message("[user] secures the airlock assembly to the floor.", "You start to secure the airlock assembly to the floor...")
if(do_after(user, 40 * W.toolspeed, target = src))
- if(!src) return
- to_chat(user, "You [anchored ? "un" : ""]secured the airlock assembly!")
+ if(!src)
+ return
+ to_chat(user, "You [anchored ? "un" : ""]secure the airlock assembly.")
anchored = !anchored
- else if(istype(W, /obj/item/stack/cable_coil) && state == 0 && anchored )
+ else if(iscoil(W) && state == 0 && anchored)
var/obj/item/stack/cable_coil/coil = W
- user.visible_message("[user] wires the airlock assembly.", "You start to wire the airlock assembly.")
+ user.visible_message("[user] wires the airlock assembly.", "You start to wire the airlock assembly...")
if(do_after(user, 40 * coil.toolspeed, target = src))
- if(!src) return
+ if(!src)
+ return
coil.use(1)
- src.state = 1
- to_chat(user, "You wire the Airlock!")
+ state = 1
+ to_chat(user, "You wire the airlock assembly.")
- else if(istype(W, /obj/item/weapon/wirecutters) && state == 1 )
- playsound(src.loc, W.usesound, 100, 1)
- user.visible_message("[user] cuts the wires from the airlock assembly.", "You start to cut the wires from airlock assembly.")
+ else if(iswirecutter(W) && state == 1)
+ playsound(loc, W.usesound, 100, 1)
+ user.visible_message("[user] cuts the wires from the airlock assembly.", "You start to cut the wires from airlock assembly...")
if(do_after(user, 40 * W.toolspeed, target = src))
- if(!src) return
- to_chat(user, "You cut the airlock's wires!")
+ if(!src)
+ return
+ to_chat(user, "You cut the wires from the airlock assembly.")
if(state == 1)
- new/obj/item/stack/cable_coil(src.loc, 1)
- src.state = 0
+ new/obj/item/stack/cable_coil(loc, 1)
+ state = 0
- else if(istype(W, /obj/item/weapon/airlock_electronics) && state == 1 && W:icon_state != "door_electronics_smoked")
- playsound(src.loc, W.usesound, 100, 1)
- user.visible_message("[user] installs the electronics into the airlock assembly.", "You start to install electronics into the airlock assembly.")
- user.drop_item()
- W.loc = src
+ else if(istype(W, /obj/item/weapon/airlock_electronics) && state == 1 && W.icon_state != "door_electronics_smoked")
+ playsound(loc, W.usesound, 100, 1)
+ user.visible_message("[user] installs the electronics into the airlock assembly.", "You start to install electronics into the airlock assembly...")
if(do_after(user, 40 * W.toolspeed, target = src))
- if(!src) return
- to_chat(user, "You installed the airlock electronics!")
- src.state = 2
- src.name = "Near finished Airlock Assembly"
- src.electronics = W
- else
- W.loc = src.loc
+ if(!src)
+ return
+ user.drop_item()
+ W.loc = src
+ to_chat(user, "You install the airlock electronics.")
+ state = 2
+ name = "near finished airlock assembly"
+ electronics = W
- else if(istype(W, /obj/item/weapon/crowbar) && state == 2 )
- playsound(src.loc, W.usesound, 100, 1)
- user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to install electronics into the airlock assembly.")
+ else if(iscrowbar(W) && state == 2 )
+ playsound(loc, W.usesound, 100, 1)
+ user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to remove electronics from the airlock assembly...")
if(do_after(user, 40 * W.toolspeed, target = src))
- if(!src) return
- to_chat(user, "You removed the airlock electronics!")
- src.state = 1
- src.name = "Wired Airlock Assembly"
+ if(!src)
+ return
+ to_chat(user, "You remove the airlock electronics.")
+ state = 1
+ name = "wired airlock assembly"
var/obj/item/weapon/airlock_electronics/ae
if(!electronics)
- ae = new/obj/item/weapon/airlock_electronics( src.loc )
+ ae = new/obj/item/weapon/airlock_electronics(loc)
else
ae = electronics
electronics = null
- ae.loc = src.loc
+ ae.loc = loc
else if(istype(W, /obj/item/stack/sheet) && !glass)
var/obj/item/stack/sheet/S = W
if(S)
if(S.amount>=1)
if(istype(S, /obj/item/stack/sheet/rglass) || istype(S, /obj/item/stack/sheet/glass))
- playsound(src.loc, S.usesound, 100, 1)
- user.visible_message("[user] adds [S.name] to the airlock assembly.", "You start to install [S.name] into the airlock assembly.")
+ playsound(loc, S.usesound, 100, 1)
+ user.visible_message("[user] adds [S.name] to the airlock assembly.", "You start to install [S.name] into the airlock assembly...")
if(do_after(user, 40 * S.toolspeed, target = src))
if(S.type == /obj/item/stack/sheet/rglass)
to_chat(user, "You install reinforced glass windows into the airlock assembly.")
@@ -276,20 +314,22 @@
else if(istype(S, /obj/item/stack/sheet/mineral) && S.sheettype)
var/M = S.sheettype
if(S.amount>=2)
- playsound(src.loc, S.usesound, 100, 1)
- user.visible_message("[user] adds [S.name] to the airlock assembly.", "You start to install [S.name] into the airlock assembly.")
+ playsound(loc, S.usesound, 100, 1)
+ user.visible_message("[user] adds [S.name] to the airlock assembly.", "You start to install [S.name] into the airlock assembly...")
if(do_after(user, 40 * S.toolspeed, target = src))
- to_chat(user, "You installed [M] plating into the airlock assembly!")
+ to_chat(user, "You install [M] plating into the airlock assembly.")
S.use(2)
glass = "[M]"
- else if(istype(W, /obj/item/weapon/screwdriver) && state == 2 )
- playsound(src.loc, W.usesound, 100, 1)
- to_chat(user, "Now finishing the airlock.")
+ else if(isscrewdriver(W) && state == 2 )
+ playsound(loc, W.usesound, 100, 1)
+ user.visible_message("[user] finishes the airlock.", \
+ "You start finishing the airlock...")
if(do_after(user, 40 * W.toolspeed, target = src))
- if(!src) return
- to_chat(user, "You finish the airlock!")
+ if(!src)
+ return
+ to_chat(user, "You finish the airlock.")
var/path
if(istext(glass))
path = text2path("/obj/machinery/door/airlock/[glass]")
@@ -297,21 +337,21 @@
path = text2path("/obj/machinery/door/airlock[glass_type]")
else
path = text2path("/obj/machinery/door/airlock[airlock_type]")
- var/obj/machinery/door/airlock/door = new path(src.loc)
+ var/obj/machinery/door/airlock/door = new path(loc)
door.setDir(dir)
- door.assembly_type = type
- door.electronics = src.electronics
+ door.assemblytype = type
+ door.electronics = electronics
door.heat_proof = heat_proof_finished
- if(src.electronics.one_access)
+ if(electronics.one_access)
door.req_access = null
- door.req_one_access = src.electronics.conf_access
+ door.req_one_access = electronics.conf_access
else
- door.req_access = src.electronics.conf_access
+ door.req_access = electronics.conf_access
if(created_name)
door.name = created_name
else
door.name = "[istext(glass) ? "[glass] airlock" : base_name]"
- src.electronics.loc = door
+ electronics.loc = door
qdel(src)
else
..()
@@ -323,9 +363,9 @@
switch(state)
if(0)
if(anchored)
- name = "Secured "
+ name = "secured "
if(1)
- name = "Wired "
+ name = "wired "
if(2)
- name = "Near Finished "
- name += "[heat_proof_finished ? "Heat-Proofed " : ""][glass == 1 ? "Window " : ""][istext(glass) ? "[glass] Airlock" : base_name] Assembly"
+ name = "near finished "
+ name += "[heat_proof_finished ? "heat-proofed " : ""][glass == 1 ? "window " : ""][istext(glass) ? "[glass] airlock" : base_name] assembly"
diff --git a/code/game/objects/structures/electricchair.dm b/code/game/objects/structures/electricchair.dm
index 2995bda23c3..75b4d6fa5cd 100644
--- a/code/game/objects/structures/electricchair.dm
+++ b/code/game/objects/structures/electricchair.dm
@@ -72,7 +72,7 @@
A.updateicon()
flick("echair_shock", src)
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(12, 1, src)
s.start()
visible_message("The electric chair went off!", "You hear a deep sharp shock!")
diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm
index 0acab425d3d..aa661e57aa8 100644
--- a/code/game/objects/structures/false_walls.dm
+++ b/code/game/objects/structures/false_walls.dm
@@ -11,6 +11,7 @@
desc = "A huge chunk of metal used to seperate rooms."
anchored = 1
icon = 'icons/turf/walls/wall.dmi'
+ icon_state = "wall"
var/mineral = "metal"
var/walltype = "metal"
var/opening = 0
@@ -164,7 +165,7 @@
name = "uranium wall"
desc = "A wall with uranium plating. This is probably a bad idea."
icon = 'icons/turf/walls/uranium_wall.dmi'
- icon_state = ""
+ icon_state = "uranium"
mineral = "uranium"
walltype = "uranium"
var/active = null
@@ -199,7 +200,7 @@
name = "gold wall"
desc = "A wall with gold plating. Swag!"
icon = 'icons/turf/walls/gold_wall.dmi'
- icon_state = ""
+ icon_state = "gold"
mineral = "gold"
walltype = "gold"
canSmoothWith = list(/obj/structure/falsewall/gold, /turf/simulated/wall/mineral/gold)
@@ -208,7 +209,7 @@
name = "silver wall"
desc = "A wall with silver plating. Shiny."
icon = 'icons/turf/walls/silver_wall.dmi'
- icon_state = ""
+ icon_state = "silver"
mineral = "silver"
walltype = "silver"
canSmoothWith = list(/obj/structure/falsewall/silver, /turf/simulated/wall/mineral/silver)
@@ -217,7 +218,7 @@
name = "diamond wall"
desc = "A wall with diamond plating. You monster."
icon = 'icons/turf/walls/diamond_wall.dmi'
- icon_state = ""
+ icon_state = "diamond"
mineral = "diamond"
walltype = "diamond"
canSmoothWith = list(/obj/structure/falsewall/diamond, /turf/simulated/wall/mineral/diamond)
@@ -227,7 +228,7 @@
name = "plasma wall"
desc = "A wall with plasma plating. This is definately a bad idea."
icon = 'icons/turf/walls/plasma_wall.dmi'
- icon_state = ""
+ icon_state = "plasma"
mineral = "plasma"
walltype = "plasma"
canSmoothWith = list(/obj/structure/falsewall/plasma, /turf/simulated/wall/mineral/plasma, /turf/simulated/wall/mineral/alien)
@@ -236,6 +237,7 @@
if(is_hot(W) > 300)
message_admins("Plasma falsewall ignited by [key_name_admin(user)] in ([x],[y],[z] - JMP)",0,1)
log_game("Plasma falsewall ignited by [key_name(user)] in ([x],[y],[z])")
+ investigate_log("was ignited by [key_name(user)]","atmos")
burnbabyburn()
return
..()
@@ -254,7 +256,7 @@
name = "alien wall"
desc = "A strange-looking alien wall."
icon = 'icons/turf/walls/plasma_wall.dmi'
- icon_state = ""
+ icon_state = "plasma"
mineral = "alien"
walltype = "alien"
canSmoothWith = list(/obj/structure/falsewall/alien, /turf/simulated/wall/mineral/alien)
@@ -264,7 +266,7 @@
name = "bananium wall"
desc = "A wall with bananium plating. Honk!"
icon = 'icons/turf/walls/bananium_wall.dmi'
- icon_state = ""
+ icon_state = "bananium"
mineral = "clown"
walltype = "clown"
canSmoothWith = list(/obj/structure/falsewall/bananium, /turf/simulated/wall/mineral/bananium)
@@ -272,7 +274,7 @@
/obj/structure/falsewall/sandstone
name = "sandstone wall"
desc = "A wall with sandstone plating."
- icon_state = ""
+ icon_state = "sandstone"
mineral = "sandstone"
walltype = "sandstone"
canSmoothWith = list(/obj/structure/falsewall/sandstone, /turf/simulated/wall/mineral/sandstone)
@@ -281,7 +283,7 @@
name = "wooden wall"
desc = "A wall with wooden plating. Stiff."
icon = 'icons/turf/walls/wood_wall.dmi'
- icon_state = ""
+ icon_state = "wood"
mineral = "wood"
walltype = "wood"
canSmoothWith = list(/obj/structure/falsewall/wood, /turf/simulated/wall/mineral/wood)
@@ -290,7 +292,7 @@
name = "rough metal wall"
desc = "A wall with rough metal plating."
icon = 'icons/turf/walls/iron_wall.dmi'
- icon_state = ""
+ icon_state = "iron"
mineral = "metal"
walltype = "iron"
canSmoothWith = list(/obj/structure/falsewall/iron, /turf/simulated/wall/mineral/iron)
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 aab8d550040..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()
@@ -293,7 +292,7 @@
var/obj/structure/cable/C = T.get_cable_node()
if(C)
if(electrocute_mob(user, C, src))
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
return 1
diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm
index b53ca70f9da..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)
@@ -223,6 +223,7 @@
if(is_hot(W))
message_admins("Plasma mineral door ignited by [key_name_admin(user)] in ([x], [y], [z] - JMP)", 0, 1)
log_game("Plasma mineral door ignited by [key_name(user)] in ([x], [y], [z])")
+ investigate_log("was ignited by [key_name(user)]","atmos")
TemperatureAct(100)
else
return ..()
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/objects/structures/statues.dm b/code/game/objects/structures/statues.dm
index 6e1ba7eb742..91030316a58 100644
--- a/code/game/objects/structures/statues.dm
+++ b/code/game/objects/structures/statues.dm
@@ -184,6 +184,7 @@
if(Proj.firer)
message_admins("Plasma statue ignited by [key_name_admin(Proj.firer)](?) (FLW) in ([x],[y],[z] - JMP)",0,1)
log_game("Plasma statue ignited by [key_name(Proj.firer)] in ([x],[y],[z])")
+ investigate_log("was ignited by [key_name(Proj.firer)]","atmos")
else
message_admins("Plasma statue ignited by [Proj]. No known firer.(?) (FLW) in ([x],[y],[z] - JMP)",0,1)
log_game("Plasma statue ignited by [Proj] in ([x],[y],[z]). No known firer.")
@@ -193,6 +194,7 @@
if(is_hot(W) > 300)//If the temperature of the object is over 300, then ignite
message_admins("Plasma statue ignited by [key_name_admin(user)](?) (FLW) in ([x],[y],[z] - JMP)",0,1)
log_game("Plasma statue ignited by [key_name(user)] in ([x],[y],[z])")
+ investigate_log("was ignited by [key_name(user)]","atmos")
ignite(is_hot(W))
return
..()
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index d6bec1019b2..ab014582fe9 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -240,7 +240,7 @@
return
if(istype(W, /obj/item/weapon/melee/energy/blade))
- var/datum/effect/system/spark_spread/spark_system = new /datum/effect/system/spark_spread()
+ var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread()
spark_system.set_up(5, 0, src.loc)
spark_system.start()
playsound(src.loc, W.usesound, 50, 1)
diff --git a/code/game/response_team.dm b/code/game/response_team.dm
index a7e8c7cbae6..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
@@ -118,7 +118,9 @@ var/ert_request_answered = 0
var/mob/living/silicon/robot/ert/R = new()
R.forceMove(spawn_location)
var/rnum = rand(1,1000)
- R.name = "ERT [rnum]"
+ var/borgname = "ERT [rnum]"
+ R.name = borgname
+ R.custom_name = borgname
R.real_name = R.name
R.mind = new
R.mind.current = R
diff --git a/code/game/turfs/simulated/floor/mineral.dm b/code/game/turfs/simulated/floor/mineral.dm
index eb15d3f9e63..e66d4383407 100644
--- a/code/game/turfs/simulated/floor/mineral.dm
+++ b/code/game/turfs/simulated/floor/mineral.dm
@@ -38,7 +38,8 @@
/turf/simulated/floor/mineral/plasma/attackby(obj/item/weapon/W, mob/user, params)
if(is_hot(W) > 300)//If the temperature of the object is over 300, then ignite
message_admins("Plasma flooring was ignited by [key_name_admin(user)](?) (FLW) in ([x],[y],[z] - JMP)",0,1)
- log_game("Plasma flooring was ignited by [key_name(user)] in ([x],[y],[z])")
+ log_game("Plasma flooring was ignited by [key_name(user)] in ([x],[y],[z])")
+ investigate_log("was ignited by [key_name(user)]","atmos")
ignite(is_hot(W))
return
..()
@@ -177,11 +178,11 @@
floor_tile = /obj/item/stack/tile/mineral/abductor
icons = list("alienpod1", "alienpod2", "alienpod3", "alienpod4", "alienpod5", "alienpod6", "alienpod7", "alienpod8", "alienpod9")
-/turf/simulated/floor/mineral/New()
+/turf/simulated/floor/mineral/abductor/New()
..()
icon_state = "alienpod[rand(1,9)]"
-/turf/simulated/floor/mineral/break_tile()
+/turf/simulated/floor/mineral/abductor/break_tile()
return //unbreakable
/turf/simulated/floor/mineral/abductor/burn_tile()
diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm
index 1e9d019ac59..53a043bd5e3 100644
--- a/code/game/turfs/simulated/floor/plating.dm
+++ b/code/game/turfs/simulated/floor/plating.dm
@@ -227,7 +227,7 @@
/turf/simulated/floor/plating/airless/catwalk/update_icon(var/propogate=1)
underlays.Cut()
- underlays += new /icon('icons/turf/space.dmi',"[((x + y) ^ ~(x * y) + z) % 25]")
+ underlays += new /icon('icons/turf/space.dmi',SPACE_ICON_STATE)
var/dirs = 0
for(var/direction in cardinal)
diff --git a/code/game/turfs/simulated/walls_mineral.dm b/code/game/turfs/simulated/walls_mineral.dm
index 76323f3e2e1..d2db056e824 100644
--- a/code/game/turfs/simulated/walls_mineral.dm
+++ b/code/game/turfs/simulated/walls_mineral.dm
@@ -96,6 +96,7 @@
if(is_hot(W) > 300)//If the temperature of the object is over 300, then ignite
message_admins("Plasma wall ignited by [key_name_admin(user)] in ([x], [y], [z] - JMP)",0,1)
log_game("Plasma wall ignited by [key_name(user)] in ([x], [y], [z])")
+ investigate_log("was ignited by [key_name(user)]","atmos")
ignite(is_hot(W))
return
..()
@@ -125,7 +126,7 @@
desc = "A strange-looking alien wall."
icon = 'icons/turf/walls/plasma_wall.dmi'
icon_state = "plasma"
- sheet_type = null
+ sheet_type = /obj/item/stack/sheet/mineral/abductor
canSmoothWith = list(/turf/simulated/wall/mineral/alien, /obj/structure/falsewall/alien)
/turf/simulated/wall/mineral/wood
@@ -152,6 +153,7 @@
desc = "A wall with alien alloy plating."
icon = 'icons/turf/walls/abductor_wall.dmi'
icon_state = "abductor"
+ smooth = SMOOTH_TRUE|SMOOTH_DIAGONAL
sheet_type = /obj/item/stack/sheet/mineral/abductor
explosion_block = 3
canSmoothWith = list(/turf/simulated/wall/mineral/abductor, /obj/structure/falsewall/abductor)
\ No newline at end of file
diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm
index 90454f9952b..7f185bf0e64 100644
--- a/code/game/turfs/space/space.dm
+++ b/code/game/turfs/space/space.dm
@@ -17,7 +17,7 @@
. = ..()
if(!istype(src, /turf/space/transit))
- icon_state = "[((x + y) ^ ~(x * y) + z) % 25]"
+ icon_state = SPACE_ICON_STATE
update_starlight()
/turf/space/Destroy(force)
diff --git a/code/game/turfs/unsimulated/beach.dm b/code/game/turfs/unsimulated/beach.dm
index 104c0996f0d..e3fad855558 100644
--- a/code/game/turfs/unsimulated/beach.dm
+++ b/code/game/turfs/unsimulated/beach.dm
@@ -54,7 +54,7 @@
/turf/unsimulated/beach/water/drop, /turf/unsimulated/beach/water/drop/dense,
/turf/unsimulated/beach/water, /turf/unsimulated/beach/water/dense,
/turf/unsimulated/beach/water/edge_drop)
- var/obj/effect/effect/beach_drop_overlay/water_overlay
+ var/obj/effect/beach_drop_overlay/water_overlay
/turf/unsimulated/beach/water/drop/New()
..()
@@ -64,7 +64,7 @@
QDEL_NULL(water_overlay)
return ..()
-/obj/effect/effect/beach_drop_overlay
+/obj/effect/beach_drop_overlay
name = "Water"
icon = 'icons/turf/floors/seadrop-o.dmi'
layer = MOB_LAYER + 0.1
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/topic.dm b/code/modules/admin/topic.dm
index e3cb19fb6e9..597cc2b3ae2 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1785,7 +1785,7 @@
H.gene_stability = 100
logmsg = "permanent regeneration."
if("Super Powers")
- var/list/default_genes = list(REGENERATEBLOCK, NOBREATHBLOCK, COLDBLOCK)
+ var/list/default_genes = list(REGENERATEBLOCK, BREATHLESSBLOCK, COLDBLOCK)
for(var/gene in default_genes)
H.dna.SetSEState(gene, 1)
genemutcheck(H, gene, null, MUTCHK_FORCED)
diff --git a/code/modules/admin/verbs/honksquad.dm b/code/modules/admin/verbs/honksquad.dm
index b437476eb32..ebb4d799d39 100644
--- a/code/modules/admin/verbs/honksquad.dm
+++ b/code/modules/admin/verbs/honksquad.dm
@@ -59,7 +59,7 @@ var/global/sent_honksquad = 0
new_honksquad.key = pick(commandos)
commandos -= new_honksquad.key
new_honksquad.internal = new_honksquad.s_store
- new_honksquad.update_internals_hud_icon(1)
+ new_honksquad.update_action_buttons_icon()
//So they don't forget their code or mission.
new_honksquad.mind.store_memory("Mission: [input].")
diff --git a/code/modules/admin/verbs/infiltratorteam_syndicate.dm b/code/modules/admin/verbs/infiltratorteam_syndicate.dm
index 4c6d5248a6e..e3ff37dc0fa 100644
--- a/code/modules/admin/verbs/infiltratorteam_syndicate.dm
+++ b/code/modules/admin/verbs/infiltratorteam_syndicate.dm
@@ -88,7 +88,7 @@ var/global/sent_syndicate_infiltration_team = 0
if(!spawn_sit_mgmt || theguy.key != key)
new_syndicate_infiltrator.key = theguy.key
new_syndicate_infiltrator.internal = new_syndicate_infiltrator.s_store
- new_syndicate_infiltrator.update_internals_hud_icon(1)
+ new_syndicate_infiltrator.update_action_buttons_icon()
infiltrators -= theguy
to_chat(new_syndicate_infiltrator, "You are a [!syndicate_leader_selected?"Infiltrator":"Lead Infiltrator"] in the service of the Syndicate. \nYour current mission is: [input]")
to_chat(new_syndicate_infiltrator, "You are equipped with an uplink implant to help you achieve your objectives. ((activate it via button in top left of screen))")
@@ -119,7 +119,7 @@ var/global/sent_syndicate_infiltration_team = 0
var/mob/living/carbon/human/syndimgmtmob = create_syndicate_infiltrator(L, 1, 100, 1)
syndimgmtmob.key = key
syndimgmtmob.internal = syndimgmtmob.s_store
- syndimgmtmob.update_internals_hud_icon(1)
+ syndimgmtmob.update_action_buttons_icon()
syndimgmtmob.faction += "syndicate"
syndimgmtmob.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(src), slot_glasses)
syndimgmtmob.equip_to_slot_or_del(new /obj/item/clothing/suit/space/hardsuit/syndi/elite, slot_wear_suit)
diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm
index d4734e92b53..78b1b84a595 100644
--- a/code/modules/admin/verbs/one_click_antag.dm
+++ b/code/modules/admin/verbs/one_click_antag.dm
@@ -361,7 +361,7 @@ client/proc/one_click_antag()
new_syndicate_commando.key = theghost.key
new_syndicate_commando.internal = new_syndicate_commando.s_store
- new_syndicate_commando.update_internals_hud_icon(1)
+ new_syndicate_commando.update_action_buttons_icon()
//So they don't forget their code or mission.
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 84f95096078..27b6c38a469 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -410,7 +410,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
if("Death Commando")//Leaves them at late-join spawn.
new_character.equip_death_commando()
new_character.internal = new_character.s_store
- new_character.update_internals_hud_icon(1)
+ new_character.update_action_buttons_icon()
else//They may also be a cyborg or AI.
switch(new_character.mind.assigned_role)
if("Cyborg")//More rigging to make em' work and check if they're traitor.
@@ -578,7 +578,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
print_command_report(input, "[command_name()] Update")
else if("No")
//same thing as the blob stuff - it's not public, so it's classified, dammit
- command_announcement.Announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/AI/commandreport.ogg', from = "[command_name()] Update")
+ command_announcer.autosay("A classified message has been printed out at all communication consoles.");
print_command_report(input, "Classified [command_name()] Update")
else
return
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/admin/verbs/striketeam.dm b/code/modules/admin/verbs/striketeam.dm
index 83e8d617210..b2a803cfdb7 100644
--- a/code/modules/admin/verbs/striketeam.dm
+++ b/code/modules/admin/verbs/striketeam.dm
@@ -64,7 +64,7 @@ var/global/sent_strike_team = 0
new_commando.key = pick(commandos)
commandos -= new_commando.key
new_commando.internal = new_commando.s_store
- new_commando.update_internals_hud_icon(1)
+ new_commando.update_action_buttons_icon()
//So they don't forget their code or mission.
if(nuke_code)
diff --git a/code/modules/admin/verbs/striketeam_syndicate.dm b/code/modules/admin/verbs/striketeam_syndicate.dm
index da6d981a890..744db24ab85 100644
--- a/code/modules/admin/verbs/striketeam_syndicate.dm
+++ b/code/modules/admin/verbs/striketeam_syndicate.dm
@@ -71,7 +71,7 @@ var/global/sent_syndicate_strike_team = 0
new_syndicate_commando.key = pick(commandos)
commandos -= new_syndicate_commando.key
new_syndicate_commando.internal = new_syndicate_commando.s_store
- new_syndicate_commando.update_internals_hud_icon(1)
+ new_syndicate_commando.update_action_buttons_icon()
//So they don't forget their code or mission.
if(nuke_code)
diff --git a/code/modules/assembly/igniter.dm b/code/modules/assembly/igniter.dm
index b1c76236853..a00cc985483 100644
--- a/code/modules/assembly/igniter.dm
+++ b/code/modules/assembly/igniter.dm
@@ -4,7 +4,7 @@
icon_state = "igniter"
materials = list(MAT_METAL=500, MAT_GLASS=50)
origin_tech = "magnets=1"
- var/datum/effect/system/spark_spread/sparks = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread
/obj/item/device/assembly/igniter/New()
..()
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/beach.dm b/code/modules/awaymissions/mission_code/beach.dm
index 7ae37e759c1..f285d4434da 100644
--- a/code/modules/awaymissions/mission_code/beach.dm
+++ b/code/modules/awaymissions/mission_code/beach.dm
@@ -21,7 +21,7 @@
return ..()
/obj/effect/waterfall/proc/drip()
- var/obj/effect/effect/water/W = new(loc)
+ var/obj/effect/particle_effect/water/W = new(loc)
W.dir = dir
spawn(1)
W.loc = get_step(W, dir)
diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm
index 0a2eaeef1bf..94453e2c058 100644
--- a/code/modules/awaymissions/mission_code/wildwest.dm
+++ b/code/modules/awaymissions/mission_code/wildwest.dm
@@ -78,7 +78,7 @@
to_chat(user, "Your wish is granted, but at a terrible cost...")
to_chat(user, "The Wish Granter punishes you for your selfishness, claiming your soul and warping your body to match the darkness in your heart.")
user.mutations.Add(LASER)
- user.mutations.Add(RESIST_COLD)
+ user.mutations.Add(COLDRES)
user.mutations.Add(XRAY)
if(ishuman(user))
var/mob/living/carbon/human/human = user
@@ -177,7 +177,7 @@
call(src,triggerproc)(M)
/obj/effect/meatgrinder/proc/triggerrad1(mob)
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
for(var/mob/O in viewers(world.view, src.loc))
s.set_up(3, 1, src)
s.start()
@@ -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/awaymissions/trigger.dm b/code/modules/awaymissions/trigger.dm
index 2a41eee85c3..0ac6e656206 100644
--- a/code/modules/awaymissions/trigger.dm
+++ b/code/modules/awaymissions/trigger.dm
@@ -22,20 +22,20 @@
M.Move(dest)
if(entersparks)
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(4, 1, src)
s.start()
if(exitsparks)
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(4, 1, dest)
s.start()
if(entersmoke)
- var/datum/effect/system/harmless_smoke_spread/s = new /datum/effect/system/harmless_smoke_spread
+ var/datum/effect_system/smoke_spread/s = new
s.set_up(4, 1, src, 0)
s.start()
if(exitsmoke)
- var/datum/effect/system/harmless_smoke_spread/s = new /datum/effect/system/harmless_smoke_spread
+ var/datum/effect_system/smoke_spread/s = new
s.set_up(4, 1, dest, 0)
s.start()
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/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 94b9e50d37b..ec20cd0cdc5 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -333,9 +333,9 @@ BLIND // can't see anything
if(adjusted_flags)
slot_flags = adjusted_flags
if(ishuman(user) && H.internal && !H.get_organ_slot("breathing_tube") && user.wear_mask == src) /*If the user was wearing the mask providing internals on their face at the time it was adjusted, turn off internals.
- Otherwise, they adjusted it while it was in their hands or some such so we won't be needing to turn off internals.*/
- H.update_internals_hud_icon(0)
+ Otherwise, they adjusted it while it was in their hands or some such so we won't be needing to turn off internals.*/
H.internal = null
+ H.update_action_buttons_icon()
if(flags_inv & HIDEFACE) //Means that only things like bandanas and balaclavas will be affected since they obscure the identity of the wearer.
flags_inv &= ~HIDEFACE /*Done after the above to avoid having to do a check for initial(src.flags_inv == HIDEFACE).
This reveals the user's face since the bandana will now be going on their head.*/
diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm
index 69588148b9d..6bd080748cb 100644
--- a/code/modules/clothing/gloves/miscellaneous.dm
+++ b/code/modules/clothing/gloves/miscellaneous.dm
@@ -92,7 +92,7 @@
if(H.a_intent == INTENT_HARM)
var/mob/living/carbon/C = A
if(cell.use(stun_cost))
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(5, 0, loc)
s.start()
playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1)
diff --git a/code/modules/clothing/spacesuits/ert.dm b/code/modules/clothing/spacesuits/ert.dm
index 90d61fa0313..cdd0c844c44 100644
--- a/code/modules/clothing/spacesuits/ert.dm
+++ b/code/modules/clothing/spacesuits/ert.dm
@@ -41,6 +41,10 @@
/obj/item/device/radio, /obj/item/device/analyzer, /obj/item/weapon/gun/energy/laser, /obj/item/weapon/gun/energy/pulse, \
/obj/item/weapon/gun/energy/gun/advtaser, /obj/item/weapon/melee/baton, /obj/item/weapon/gun/energy/gun)
strip_delay = 130
+ species_fit = list("Drask")
+ sprite_sheets = list(
+ "Drask" = 'icons/mob/species/drask/suit.dmi'
+ )
//Commander
/obj/item/clothing/head/helmet/space/hardsuit/ert/commander
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index e7ec4eaffd8..77196ede0b1 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -590,7 +590,7 @@
/obj/item/clothing/suit/space/hardsuit/shielded/hit_reaction(mob/living/carbon/human/owner, attack_text)
if(current_charges > 0)
- var/datum/effect/system/spark_spread/s = new
+ var/datum/effect_system/spark_spread/s = new
s.set_up(2, 1, src)
s.start()
owner.visible_message("[owner]'s shields deflect [attack_text] in a shower of sparks!")
diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm
index 7d2d5bd4635..0c4f7f415c0 100644
--- a/code/modules/clothing/spacesuits/miscellaneous.dm
+++ b/code/modules/clothing/spacesuits/miscellaneous.dm
@@ -77,7 +77,7 @@
desc = "An armored beret commonly used by special operations officers."
icon_state = "beret_officer"
armor = list(melee = 65, bullet = 55, laser = 35, energy = 20, bomb = 30, bio = 30, rad = 30)
- flags = HEADCOVERSEYES | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | THICKMATERIAL //idfk
+ flags = STOPSPRESSUREDMAGE | THICKMATERIAL
/obj/item/clothing/suit/space/deathsquad/officer
name = "officer jacket"
diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm
index f1fb29ed645..7500af07af3 100644
--- a/code/modules/clothing/spacesuits/rig/rig.dm
+++ b/code/modules/clothing/spacesuits/rig/rig.dm
@@ -43,6 +43,7 @@
//Component/device holders.
var/obj/item/weapon/tank/air_supply // Air tank, if any.
var/obj/item/clothing/shoes/magboots/boots = null // Deployable boots, if any.
+ var/obj/item/clothing/shoes/under_boots = null //Boots that are between the feet and the rig boots, if any.
var/obj/item/clothing/suit/space/new_rig/chest // Deployable chestpiece, if any.
var/obj/item/clothing/head/helmet/space/new_rig/helmet = null // Deployable helmet, if any.
var/obj/item/clothing/gloves/rig/gloves = null // Deployable gauntlets, if any.
@@ -71,6 +72,7 @@
var/sealing // Keeps track of seal status independantly of NODROP.
var/offline = 1 // Should we be applying suit maluses?
var/offline_slowdown = 3 // If the suit is deployed and unpowered, it sets slowdown to this.
+ var/active_slowdown = 3 // How much the deployed suit slows down if powered.
var/vision_restriction
var/offline_vision_restriction = 1 // 0 - none, 1 - welder vision, 2 - blind. Maybe move this to helmets.
var/airtight = 1 //If set, will adjust AIRTIGHT and STOPSPRESSUREDMAGE flags on components. Otherwise it should leave them untouched.
@@ -80,7 +82,7 @@
// Wiring! How exciting.
var/datum/wires/rig/wires
- var/datum/effect/system/spark_spread/spark_system
+ var/datum/effect_system/spark_spread/spark_system
/obj/item/weapon/rig/examine()
to_chat(usr, "This is [bicon(src)][src.name].")
@@ -108,7 +110,7 @@
spark_system.set_up(5, 0, src)
spark_system.attach(src)
- processing_objects |= src
+ processing_objects.Add(src)
if(initial_modules && initial_modules.len)
for(var/path in initial_modules)
@@ -164,7 +166,7 @@
if(istype(M))
M.unEquip(piece)
qdel(piece)
- processing_objects -= src
+ processing_objects.Remove(src)
QDEL_NULL(wires)
QDEL_NULL(spark_system)
return ..()
@@ -438,6 +440,15 @@
M.unEquip(piece)
piece.forceMove(src)
+ if(cell && cell.charge > 0 && electrified > 0)
+ electrified--
+
+ if(malfunction_delay > 0)
+ malfunction_delay--
+ else if(malfunctioning)
+ malfunctioning--
+ malfunction()
+
if(!istype(wearer) || loc != wearer || wearer.back != src || !(flags & NODROP) || !cell || cell.charge <= 0)
if(!cell || cell.charge <= 0)
if(electrified > 0)
@@ -462,7 +473,7 @@
offline = 0
if(istype(wearer) && !wearer.wearing_rig)
wearer.wearing_rig = src
- chest.slowdown = initial(slowdown)
+ chest.slowdown = active_slowdown
if(offline)
if(offline == 1)
@@ -472,14 +483,6 @@
chest.slowdown = offline_slowdown
return
- if(cell && cell.charge > 0 && electrified > 0)
- electrified--
-
- if(malfunction_delay > 0)
- malfunction_delay--
- else if(malfunctioning)
- malfunctioning--
- malfunction()
for(var/obj/item/rig_module/module in installed_modules)
cell.use(module.process()*10)
@@ -721,6 +724,12 @@
if(isliving(uneq_piece.loc))
var/mob/living/L = uneq_piece.loc
L.unEquip(uneq_piece, 1)
+ if(uneq_piece == boots)
+ if(under_boots)
+ if(L.equip_to_slot_if_possible(under_boots, slot_shoes))
+ under_boots = null
+ else
+ to_chat(user, "Somehow, your [under_boots] got stuck to the [boots], and were retracted with them. ((This shouldn't happen, bug report this.))")
uneq_piece.forceMove(src)
return 0
@@ -767,7 +776,12 @@
if(to_strip)
to_strip.unEquip(use_obj, 1)
-
+ if(use_obj == boots)
+ if(under_boots)
+ if(to_strip.equip_to_slot_if_possible(under_boots, slot_shoes))
+ under_boots = null
+ else
+ to_chat(user, "Somehow, your [under_boots] got stuck to the [boots], and were retracted with them. ((This shouldn't happen, bug report this.))")
use_obj.forceMove(src)
if(wearer)
to_chat(wearer, "Your [use_obj] [use_obj.gender == PLURAL ? "retract" : "retracts"] swiftly.")
@@ -775,8 +789,13 @@
else if(deploy_mode != ONLY_RETRACT)
if(check_slot)
if(check_slot != use_obj) //If use_obj is already in check_slot, silently bail. Otherwise, tell the user why the part didn't deploy.
- to_chat(wearer, "You are unable to deploy \the [piece] as \the [check_slot] [check_slot.gender == PLURAL ? "are" : "is"] in the way.")
- return
+ if(use_obj == boots)
+ under_boots = check_slot
+ wearer.unEquip(under_boots)
+ under_boots.forceMove(src)
+ else
+ to_chat(wearer, "You are unable to deploy \the [piece] as \the [check_slot] [check_slot.gender == PLURAL ? "are" : "is"] in the way.")
+ return
use_obj.forceMove(wearer)
if(!wearer.equip_to_slot_if_possible(use_obj, equip_to, 0, 1))
use_obj.forceMove(src)
@@ -798,9 +817,9 @@
if(gloves && wearer.gloves && wearer.gloves != gloves)
to_chat(user, "\The [wearer.gloves] is preventing \the [src] from deploying!")
return 0
- if(boots && wearer.shoes && wearer.shoes != boots)
+ /*if(boots && wearer.shoes && wearer.shoes != boots)
to_chat(user, "\The [wearer.shoes] is preventing \the [src] from deploying!")
- return 0
+ return 0*/
if(chest && wearer.wear_suit && wearer.wear_suit != chest)
to_chat(user, "\The [wearer.wear_suit] is preventing \the [src] from deploying!")
return 0
@@ -836,10 +855,11 @@
take_hit((100/severity_class), "electrical pulse", 1)
/obj/item/weapon/rig/proc/shock(mob/user)
- if(electrocute_mob(user, cell, src)) //electrocute_mob() handles removing charge from the cell, no need to do that here.
- spark_system.start()
- if(user.stunned)
- return 1
+ if(get_dist(src, user) <= 1) //Needs to be adjecant to the rig to get shocked.
+ if(electrocute_mob(user, cell, src)) //electrocute_mob() handles removing charge from the cell, no need to do that here.
+ spark_system.start()
+ if(user.stunned)
+ return 1
return 0
/obj/item/weapon/rig/proc/take_hit(damage, source, is_emp=0)
diff --git a/code/modules/clothing/spacesuits/rig/rig_wiring.dm b/code/modules/clothing/spacesuits/rig/rig_wiring.dm
index 98f8a137028..11118699b13 100644
--- a/code/modules/clothing/spacesuits/rig/rig_wiring.dm
+++ b/code/modules/clothing/spacesuits/rig/rig_wiring.dm
@@ -50,8 +50,21 @@
rig.electrified = 30
rig.shock(usr,100)
+/datum/wires/rig/GetWireName(index)
+ switch(index)
+ if(RIG_SECURITY)
+ return "ID check"
+ if(RIG_AI_OVERRIDE)
+ return "AI control"
+ if(RIG_SYSTEM_CONTROL)
+ return "System control"
+ if(RIG_INTERFACE_LOCK)
+ return "Interface lock"
+ if(RIG_INTERFACE_SHOCK)
+ return "Electrification"
+
/datum/wires/rig/CanUse(var/mob/living/L)
var/obj/item/weapon/rig/rig = holder
if(rig.open)
return 1
- return 0
\ No newline at end of file
+ return 0
diff --git a/code/modules/clothing/spacesuits/rig/suits/alien.dm b/code/modules/clothing/spacesuits/rig/suits/alien.dm
index 27724fa0749..9d6bb86e8cd 100644
--- a/code/modules/clothing/spacesuits/rig/suits/alien.dm
+++ b/code/modules/clothing/spacesuits/rig/suits/alien.dm
@@ -5,7 +5,7 @@
icon_state = "breacher_rig_cheap"
armor = list(melee = 30, bullet = 30, laser = 30, energy = 30, bomb = 45, bio = 100, rad = 50)
emp_protection = -20
- slowdown = 6
+ active_slowdown = 6
offline_slowdown = 10
vision_restriction = 1
offline_vision_restriction = 2
@@ -43,4 +43,4 @@
species_restricted = list("Unathi")
sprite_sheets = list(
"Unathi" = 'icons/mob/species/unathi/feet.dmi'
- )
\ No newline at end of file
+ )
diff --git a/code/modules/clothing/spacesuits/rig/suits/combat.dm b/code/modules/clothing/spacesuits/rig/suits/combat.dm
index 98adb708ada..988d746d4ad 100644
--- a/code/modules/clothing/spacesuits/rig/suits/combat.dm
+++ b/code/modules/clothing/spacesuits/rig/suits/combat.dm
@@ -6,7 +6,7 @@
icon_state = "security_rig"
suit_type = "combat hardsuit"
armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100)
- slowdown = 1
+ active_slowdown = 1
offline_slowdown = 3
offline_vision_restriction = 1
@@ -25,4 +25,4 @@
// /obj/item/rig_module/power_sink,
/obj/item/rig_module/electrowarfare_suite,
/obj/item/rig_module/chem_dispenser/combat
- )
\ No newline at end of file
+ )
diff --git a/code/modules/clothing/spacesuits/rig/suits/light.dm b/code/modules/clothing/spacesuits/rig/suits/light.dm
index 2a38480dabc..8c8384b32fc 100644
--- a/code/modules/clothing/spacesuits/rig/suits/light.dm
+++ b/code/modules/clothing/spacesuits/rig/suits/light.dm
@@ -6,7 +6,7 @@
suit_type = "light suit"
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank,/obj/item/weapon/stock_parts/cell)
emp_protection = 10
- slowdown = 0
+ active_slowdown = 0
flags = STOPSPRESSUREDMAGE | THICKMATERIAL
offline_slowdown = 0
offline_vision_restriction = 0
@@ -77,7 +77,7 @@
icon_state = "ninja_rig"
armor = list(melee = 50, bullet = 15, laser = 30, energy = 10, bomb = 25, bio = 100, rad = 30)
emp_protection = 40 //change this to 30 if too high.
- slowdown = 0
+ active_slowdown = 0
chest_type = /obj/item/clothing/suit/space/new_rig/light/ninja
glove_type = /obj/item/clothing/gloves/rig/light/ninja
diff --git a/code/modules/clothing/spacesuits/rig/suits/merc.dm b/code/modules/clothing/spacesuits/rig/suits/merc.dm
index a7512231641..73e9638ac83 100644
--- a/code/modules/clothing/spacesuits/rig/suits/merc.dm
+++ b/code/modules/clothing/spacesuits/rig/suits/merc.dm
@@ -6,7 +6,7 @@
icon_state = "merc_rig"
suit_type = "crimson hardsuit"
armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
- slowdown = 1
+ active_slowdown = 1
offline_slowdown = 3
offline_vision_restriction = 1
@@ -29,4 +29,4 @@
initial_modules = list(
/obj/item/rig_module/ai_container,
/obj/item/rig_module/electrowarfare_suite, //might as well
- )
\ No newline at end of file
+ )
diff --git a/code/modules/clothing/spacesuits/rig/suits/station.dm b/code/modules/clothing/spacesuits/rig/suits/station.dm
index 966f54973bc..665eae30cf7 100644
--- a/code/modules/clothing/spacesuits/rig/suits/station.dm
+++ b/code/modules/clothing/spacesuits/rig/suits/station.dm
@@ -17,7 +17,7 @@
icon_state = "internalaffairs_rig"
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
siemens_coefficient = 0.9
- slowdown = 0
+ active_slowdown = 0
offline_slowdown = 0
offline_vision_restriction = 0
@@ -52,7 +52,7 @@
desc = "A heavy, powerful rig used by construction crews and mining corporations."
icon_state = "engineering_rig"
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
- slowdown = 3
+ active_slowdown = 3
offline_slowdown = 10
offline_vision_restriction = 2
emp_protection = -20
@@ -80,7 +80,7 @@
suit_type = "EVA hardsuit"
desc = "A light rig for repairs and maintenance to the outside of habitats and vessels."
icon_state = "eva_rig"
- slowdown = 0
+ active_slowdown = 0
offline_slowdown = 1
offline_vision_restriction = 1
@@ -108,7 +108,7 @@
desc = "An advanced voidsuit that protects against hazardous, low pressure environments. Shines with a high polish."
icon_state = "ce_rig"
armor = list(melee = 40, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 90)
- slowdown = 0
+ active_slowdown = 0
offline_slowdown = 0
offline_vision_restriction = 0
@@ -149,7 +149,7 @@
suit_type = "hazmat hardsuit"
desc = "An Anomalous Material Interaction hardsuit that protects against the strangest energies the universe can throw at it."
icon_state = "science_rig"
- slowdown = 1
+ active_slowdown = 1
offline_vision_restriction = 1
helm_type = /obj/item/clothing/head/helmet/space/new_rig/hazmat
@@ -176,7 +176,7 @@
desc = "A durable suit designed for medical rescue in high risk areas."
icon_state = "medical_rig"
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 50)
- slowdown = 1
+ active_slowdown = 1
offline_vision_restriction = 1
helm_type = /obj/item/clothing/head/helmet/space/new_rig/medical
@@ -201,7 +201,7 @@
desc = "A Security hardsuit designed for prolonged EVA in dangerous environments."
icon_state = "hazard_rig"
armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 10, bio = 100, rad = 50)
- slowdown = 1
+ active_slowdown = 1
offline_slowdown = 3
offline_vision_restriction = 1
@@ -220,4 +220,4 @@
/obj/item/rig_module/maneuvering_jets,
/obj/item/rig_module/grenade_launcher,
/obj/item/rig_module/mounted/taser
- )
\ No newline at end of file
+ )
diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm
index 65a47cc8338..2237ce8d7db 100644
--- a/code/modules/clothing/under/accessories/accessory.dm
+++ b/code/modules/clothing/under/accessories/accessory.dm
@@ -136,7 +136,7 @@
user.visible_message("[user] places \the [src] against [M]'s chest and listens attentively.", "You place \the [src] against [M]'s chest...")
var/obj/item/organ/internal/H = M.get_int_organ(/obj/item/organ/internal/heart)
var/obj/item/organ/internal/L = M.get_int_organ(/obj/item/organ/internal/lungs)
- if((H && M.pulse) || (L && !(NO_BREATH in M.mutations) && !(NO_BREATH in M.species.species_traits)))
+ if((H && M.pulse) || (L && !(BREATHLESS in M.mutations) && !(NO_BREATHE in M.species.species_traits)))
var/color = "notice"
if(H)
var/heart_sound
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index 34435e5d66c..95ae68dcd26 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -751,11 +751,12 @@
item_state = "noble_clothes"
/obj/item/clothing/under/contortionist
- name = "Contortionist's Jumpsuit"
+ name = "atmospheric technician's jumpsuit"
desc = "A light jumpsuit useful for squeezing through narrow vents."
icon_state = "atmos"
item_state = "atmos_suit"
item_color = "atmos"
+ burn_state = FIRE_PROOF
/obj/item/clothing/under/contortionist/equipped(mob/living/carbon/human/user, slot)
if(!user.ventcrawler)
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/events/rogue_drones.dm b/code/modules/events/rogue_drones.dm
index 3a770bf7864..6be28375305 100644
--- a/code/modules/events/rogue_drones.dm
+++ b/code/modules/events/rogue_drones.dm
@@ -38,7 +38,7 @@
/datum/event/rogue_drone/end()
var/num_recovered = 0
for(var/mob/living/simple_animal/hostile/retaliate/malf_drone/D in drones_list)
- var/datum/effect/system/spark_spread/sparks = new /datum/effect/system/spark_spread()
+ var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread()
sparks.set_up(3, 0, D.loc)
sparks.start()
D.z = level_name_to_num(CENTCOMM)
diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm
index ae6794d5e8d..564194f413b 100644
--- a/code/modules/events/vent_clog.dm
+++ b/code/modules/events/vent_clog.dm
@@ -28,7 +28,7 @@
R.my_atom = vent
R.add_reagent(pick(gunk), 50)
- var/datum/effect/system/chem_smoke_spread/smoke = new
+ var/datum/effect_system/smoke_spread/chem/smoke = new
smoke.set_up(R, rand(1, 2), 0, vent, 0, silent = 1)
playsound(vent.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
smoke.start(3)
diff --git a/code/modules/fish/fishtank.dm b/code/modules/fish/fishtank.dm
index 85ec9f292c4..1b5294867d4 100644
--- a/code/modules/fish/fishtank.dm
+++ b/code/modules/fish/fishtank.dm
@@ -523,7 +523,7 @@
if(water_level && prob(45)) //If there is water, there is a chance the cat will slip, Syndicat will spark like E-N when this happens
M.visible_message("[M.name] slipped and got soaked!", "You slipped and got soaked!")
if(istype(M, /mob/living/simple_animal/pet/cat/Syndi))
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
else //No water or didn't slip, get that fish!
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index 64bb91a9db4..d180bb9c2ac 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -149,7 +149,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
qdel(src)
Expand()
if((get_turf(target) in flood_turfs) && !target.internal)
- target.hallucinate("fake_alert", "tox_in_air")
+ target.hallucinate("fake_alert", "too_much_tox")
next_expand = world.time + FAKE_FLOOD_EXPAND_TIME
/obj/effect/hallucination/fake_flood/proc/Expand()
@@ -890,12 +890,12 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite
sleep(rand(100,250))
hal_screwyhud = SCREWYHUD_NONE
if("fake_alert")
- var/alert_type = pick("oxy","not_enough_tox","not_enough_co2","too_much_oxy","too_much_co2","tox_in_air","newlaw","nutrition","charge","weightless","fire","locked","hacked","temp","pressure")
+ var/alert_type = pick("not_enough_oxy","not_enough_tox","not_enough_co2","too_much_oxy","too_much_co2","too_much_tox","newlaw","nutrition","charge","weightless","fire","locked","hacked","temp","pressure")
if(specific)
alert_type = specific
switch(alert_type)
- if("oxy")
- throw_alert("oxy", /obj/screen/alert/oxy, override = TRUE)
+ if("not_enough_oxy")
+ throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy, override = TRUE)
if("not_enough_tox")
throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox, override = TRUE)
if("not_enough_co2")
@@ -904,8 +904,8 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite
throw_alert("too_much_oxy", /obj/screen/alert/too_much_oxy, override = TRUE)
if("too_much_co2")
throw_alert("too_much_co2", /obj/screen/alert/too_much_co2, override = TRUE)
- if("tox_in_air")
- throw_alert("tox_in_air", /obj/screen/alert/tox_in_air, override = TRUE)
+ if("too_much_tox")
+ throw_alert("too_much_tox", /obj/screen/alert/too_much_tox, override = TRUE)
if("nutrition")
if(prob(50))
throw_alert("nutrition", /obj/screen/alert/fat, override = TRUE)
diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
index e9dcf825aad..c25e5c5a5d3 100644
--- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
@@ -283,6 +283,14 @@
isGlass = 0
list_reagents = list("limejuice" = 100)
+/obj/item/weapon/reagent_containers/food/drinks/bottle/milk
+ name = "Milk"
+ desc = "Soothing milk."
+ icon_state = "milk"
+ item_state = "carton"
+ isGlass = 0
+ list_reagents = list("milk" = 100)
+
////////////////////////// MOLOTOV ///////////////////////
/obj/item/weapon/reagent_containers/food/drinks/bottle/molotov
name = "molotov cocktail"
diff --git a/code/modules/food_and_drinks/kitchen_machinery/cooker.dm b/code/modules/food_and_drinks/kitchen_machinery/cooker.dm
index 1c8db0d9b20..ac82fa9743d 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/cooker.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/cooker.dm
@@ -66,7 +66,7 @@
var/obj/item/weapon/reagent_containers/food/snacks/badrecipe/burnt = new(get_turf(src))
setRegents(props, burnt)
to_chat(user, "You smell burning coming from the [src]!")
- var/datum/effect/system/bad_smoke_spread/smoke = new /datum/effect/system/bad_smoke_spread() // burning things makes smoke!
+ var/datum/effect_system/smoke_spread/bad/smoke = new // burning things makes smoke!
smoke.set_up(5, 0, src)
smoke.start()
if(prob(firechance))
diff --git a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm
index e09198cb4e9..289a4c66d4c 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm
@@ -364,7 +364,7 @@
updateUsrDialog()
/obj/machinery/kitchen_machine/proc/broke()
- var/datum/effect/system/spark_spread/s = new
+ var/datum/effect_system/spark_spread/s = new
s.set_up(2, 1, src)
s.start()
icon_state = broken_icon // Make it look all busted up and shit
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 6c5b1b0adf1..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
@@ -750,10 +744,13 @@
var/target = myseed ? myseed.plantname : src
var/visi_msg = ""
var/irrigate = 0 //How am I supposed to irrigate pill contents?
+ var/transfer_amount
if(istype(reagent_source, /obj/item/weapon/reagent_containers/food/snacks) || istype(reagent_source, /obj/item/weapon/reagent_containers/food/pill))
visi_msg="[user] composts [reagent_source], spreading it through [target]"
+ transfer_amount = reagent_source.reagents.total_volume
else
+ transfer_amount = reagent_source.amount_per_transfer_from_this
if(istype(reagent_source, /obj/item/weapon/reagent_containers/syringe/))
var/obj/item/weapon/reagent_containers/syringe/syr = reagent_source
visi_msg="[user] injects [target] with [syr]"
@@ -763,14 +760,14 @@
visi_msg="[user] sprays [target] with [reagent_source]"
playsound(loc, 'sound/effects/spray3.ogg', 50, 1, -6)
irrigate = 1
- else if(reagent_source.amount_per_transfer_from_this) // Droppers, cans, beakers, what have you.
+ else if(transfer_amount) // Droppers, cans, beakers, what have you.
visi_msg="[user] uses [reagent_source] on [target]"
irrigate = 1
// Beakers, bottles, buckets, etc. Can't use is_open_container though.
if(istype(reagent_source, /obj/item/weapon/reagent_containers/glass/))
playsound(loc, 'sound/effects/slosh.ogg', 25, 1)
- if(irrigate && reagent_source.amount_per_transfer_from_this > 30 && reagent_source.reagents.total_volume >= 30 && using_irrigation)
+ if(irrigate && transfer_amount > 30 && reagent_source.reagents.total_volume >= 30 && using_irrigation)
trays = FindConnected()
if (trays.len > 1)
visi_msg += ", setting off the irrigation system"
@@ -778,7 +775,7 @@
if(visi_msg)
visible_message("[visi_msg].")
- var/split = round(reagent_source.amount_per_transfer_from_this/trays.len)
+ var/split = round(transfer_amount/trays.len)
for(var/obj/machinery/hydroponics/H in trays)
//cause I don't want to feel like im juggling 15 tamagotchis and I can get to my real work of ripping flooring apart in hopes of validating my life choices of becoming a space-gardener
@@ -1026,5 +1023,3 @@
qdel(src)
else
..()
-
-#undef HYDRO_CYCLES_PER_AGE
diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm
index efc3d0f594f..1d07a130369 100644
--- a/code/modules/hydroponics/plant_genes.dm
+++ b/code/modules/hydroponics/plant_genes.dm
@@ -402,7 +402,7 @@
name = "gaseous decomposition"
/datum/plant_gene/trait/smoke/on_squash(obj/item/weapon/reagent_containers/food/snacks/grown/G, atom/target)
- var/datum/effect/system/chem_smoke_spread/S = new
+ var/datum/effect_system/smoke_spread/chem/S = new
var/splat_location = get_turf(target)
var/smoke_amount = round(sqrt(G.seed.potency * 0.1), 1)
S.attach(splat_location)
diff --git a/code/modules/martial_arts/mimejutsu.dm b/code/modules/martial_arts/mimejutsu.dm
index ef0826d49a1..01acec88a88 100644
--- a/code/modules/martial_arts/mimejutsu.dm
+++ b/code/modules/martial_arts/mimejutsu.dm
@@ -47,7 +47,7 @@
D.visible_message("[A] throws an invisible smoke bomb!!")
- var/datum/effect/system/bad_smoke_spread/smoke = new /datum/effect/system/bad_smoke_spread()
+ var/datum/effect_system/smoke_spread/bad/smoke = new
smoke.set_up(5, 0, D.loc)
smoke.start()
diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm
index 541961e5297..f3e4adfa1e4 100644
--- a/code/modules/mining/equipment_locker.dm
+++ b/code/modules/mining/equipment_locker.dm
@@ -278,7 +278,7 @@
updateUsrDialog()
/obj/machinery/mineral/ore_redemption/ex_act(severity, target)
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(5, 1, src)
s.start()
if(severity == 1)
@@ -506,7 +506,7 @@
qdel(voucher)
/obj/machinery/mineral/equipment_vendor/ex_act(severity, target)
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(5, 1, src)
s.start()
if(prob(50 / severity) && severity < 3)
diff --git a/code/modules/mining/lavaland/loot/tendril_loot.dm b/code/modules/mining/lavaland/loot/tendril_loot.dm
index 1c2093ce8c2..37b266f15a6 100644
--- a/code/modules/mining/lavaland/loot/tendril_loot.dm
+++ b/code/modules/mining/lavaland/loot/tendril_loot.dm
@@ -259,14 +259,14 @@
to_chat(user, "[src] fizzles uselessly.")
return
- var/datum/effect/system/harmless_smoke_spread/smoke = new /datum/effect/system/harmless_smoke_spread()
+ var/datum/effect_system/smoke_spread/smoke = new
smoke.set_up(1, 0, user.loc)
smoke.start()
user.forceMove(get_turf(linked))
feedback_add_details("warp_cube","[src.type]")
- var/datum/effect/system/harmless_smoke_spread/smoke2 = new /datum/effect/system/harmless_smoke_spread()
+ var/datum/effect_system/smoke_spread/smoke2 = new
smoke2.set_up(1, 0, user.loc)
smoke2.start()
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index 11f16953017..80d575b9d1f 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -329,7 +329,7 @@
message_admins("[key_name_admin(usr)] (?) (FLW) activated a bluespace capsule away from the mining level! (JMP)")
log_admin("[key_name(usr)] activated a bluespace capsule away from the mining level at [T.x], [T.y], [T.z]")
template.load(deploy_location, centered = TRUE)
- new /obj/effect/effect/harmless_smoke(get_turf(src))
+ new /obj/effect/particle_effect/smoke(get_turf(src))
qdel(src)
/obj/item/weapon/survivalcapsule/luxury
@@ -368,14 +368,13 @@
desc = "An easily-compressable wall used for temporary shelter."
icon = 'icons/turf/walls/survival_pod_walls.dmi'
icon_state = "smooth"
- smooth = SMOOTH_MORE // To Do: Add in Diagnaol Smooth Support
+ smooth = SMOOTH_MORE|SMOOTH_DIAGONAL
canSmoothWith = list(/turf/simulated/wall/survival, /obj/machinery/door/airlock/survival_pod)
//Door
/obj/machinery/door/airlock/survival_pod
- name = "Airlock"
icon = 'icons/obj/doors/survival.dmi'
- assembly_type = /obj/structure/door_assembly/door_assembly_pod
+ assemblytype = /obj/structure/door_assembly/door_assembly_pod
opacity = 0
glass = 1
@@ -496,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/language.dm b/code/modules/mob/language.dm
index cc9ed1a27d6..83eecee3022 100644
--- a/code/modules/mob/language.dm
+++ b/code/modules/mob/language.dm
@@ -559,9 +559,10 @@
if(!message)
return
-
+
+ log_robot("[key_name(speaker)] : [message]")
var/message_start = "[name], [speaker.name]"
- var/message_body = "[speaker.say_quote(message)], \"[message]\""
+ var/message_body = "[speaker.say_quote(message)], \"[message]\""
for(var/mob/M in dead_mob_list)
if(!isnewplayer(M) && !isbrain(M))
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
index 5132ae9453c..b304c663929 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
@@ -13,6 +13,7 @@
var/leap_on_click = 0
var/custom_pixel_x_offset = 0 //for admin fuckery.
var/custom_pixel_y_offset = 0
+ pass_flags = PASSTABLE
pressure_resistance = 100 //100 kPa difference required to push
throw_pressure_limit = 120 //120 kPa difference required to throw
@@ -123,7 +124,7 @@
stuttering = power
Stun(power)
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(5, 1, src)
s.start()
diff --git a/code/modules/mob/living/carbon/alien/humanoid/life.dm b/code/modules/mob/living/carbon/alien/humanoid/life.dm
index 580ec3af3cf..a13fce956da 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/life.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/life.dm
@@ -1,10 +1,3 @@
-/mob/living/carbon/alien/humanoid
- oxygen_alert = 0
- toxins_alert = 0
- fire_alert = 0
- pass_flags = PASSTABLE
-
-
/mob/living/carbon/alien/humanoid/Life()
. = ..()
update_icons()
diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm
index 80585fad863..d3ecc9e3e1c 100644
--- a/code/modules/mob/living/carbon/alien/life.dm
+++ b/code/modules/mob/living/carbon/alien/life.dm
@@ -4,15 +4,16 @@
if(!breath || (breath.total_moles() == 0))
//Aliens breathe in vaccuum
- return 0
+ return FALSE
var/toxins_used = 0
+ var/tox_detect_threshold = 0.02
var/breath_pressure = (breath.total_moles() * R_IDEAL_GAS_EQUATION * breath.temperature) / BREATH_VOLUME
//Partial pressure of the toxins in our breath
var/Toxins_pp = (breath.toxins / breath.total_moles()) * breath_pressure
- if(Toxins_pp) // Detect toxins in air
+ if(Toxins_pp > tox_detect_threshold) // Detect toxins in air
adjustPlasma(breath.toxins*250)
throw_alert("alien_tox", /obj/screen/alert/alien_tox)
@@ -28,8 +29,6 @@
//BREATH TEMPERATURE
handle_breath_temperature(breath)
- return 1
-
/mob/living/carbon/alien/update_sight()
if(!client)
return
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 06110242eba..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)
@@ -668,7 +668,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
if(do_mob(usr, src, POCKET_STRIP_DELAY))
if(internal)
internal = null
- update_internals_hud_icon(0)
+ update_action_buttons_icon()
else
var/no_mask2
if(!get_organ_slot("breathing_tube"))
@@ -679,7 +679,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
to_chat(usr, "[src] is not wearing a suitable mask or helmet!")
return
internal = ITEM
- update_internals_hud_icon(1)
+ update_action_buttons_icon()
visible_message("[usr] [internal ? "opens" : "closes"] the valve on [src]'s [ITEM].", \
"[usr] [internal ? "opens" : "closes"] the valve on [src]'s [ITEM].")
@@ -1061,10 +1061,6 @@ so that different stomachs can handle things in different ways VB*/
return FALSE
-/mob/living/carbon/proc/update_internals_hud_icon(internal_state = 0)
- if(hud_used && hud_used.internals)
- hud_used.internals.icon_state = "internal[internal_state]"
-
//to recalculate and update the mob's total tint from tinted equipment it's wearing.
/mob/living/carbon/proc/update_tint()
if(!tinted_weldhelh)
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index 4de6b16a687..7ed39d78382 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -23,12 +23,8 @@
var/wetlevel = 0 //how wet the mob is
- var/oxygen_alert = 0
- var/toxins_alert = 0
- var/co2_alert = 0
- var/fire_alert = 0
+ var/failed_last_breath = FALSE //This is used to determine if the mob failed a breath. If they did fail a brath, they will attempt to breathe each tick, otherwise just once per 4 ticks.
var/list/active_effect = list()
-
- var/failed_last_breath = 0 //This is used to determine if the mob failed a breath. If they did fail a brath, they will attempt to breathe each tick, otherwise just once per 4 ticks.
var/co2overloadtime = null
+
blood_volume = BLOOD_VOLUME_NORMAL
diff --git a/code/modules/mob/living/carbon/human/body_accessories.dm b/code/modules/mob/living/carbon/human/body_accessories.dm
index cf49a328981..071ad99cd95 100644
--- a/code/modules/mob/living/carbon/human/body_accessories.dm
+++ b/code/modules/mob/living/carbon/human/body_accessories.dm
@@ -97,7 +97,7 @@ var/global/list/body_accessory_by_species = list("None" = null)
animated_icon_state = "null"
/datum/body_accessory/tail/try_restrictions(var/mob/living/carbon/human/H)
- if(!H.wear_suit || !(H.wear_suit.flags_inv & HIDETAIL) && !istype(H.wear_suit, /obj/item/clothing/suit/space))
+ if(!H.wear_suit || !(H.wear_suit.flags_inv & HIDETAIL))
return 1
return 0
@@ -140,4 +140,3 @@ var/global/list/body_accessory_by_species = list("None" = null)
icon_state = "vulptail6"
animated_icon_state = "vulptail6_a"
allowed_species = list("Vulpkanin")
-
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index d0468fb12b6..8ad380dbc9f 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -40,7 +40,7 @@
hgibs(loc, dna)
else
new /obj/effect/decal/cleanable/blood/gibs/robot(loc)
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index 97b9dcaa21f..a9fde120c44 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -34,24 +34,24 @@
else //Everyone else fails, skip the emote attempt
return
if("drone","drones","hum","hums","rumble","rumbles")
- if(species.name == "Drask") //Only Drask can make whale noises
+ if(get_species() == "Drask") //Only Drask can make whale noises
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm
else
return
if("howl", "howls")
- if (species.name == "Vulpkanin") //Only Vulpkanin can howl
+ if(get_species() == "Vulpkanin") //Only Vulpkanin can howl
on_CD = handle_emote_CD(100)
else
return
if("growl", "growls")
- if (species.name == "Vulpkanin") //Only Vulpkanin can growl
+ if(get_species() == "Vulpkanin") //Only Vulpkanin can growl
on_CD = handle_emote_CD()
else
return
if("squish", "squishes")
var/found_slime_bodypart = 0
- if(species.name == "Slime People") //Only Slime People can squish
+ if(get_species() == "Slime People") //Only Slime People can squish
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
found_slime_bodypart = 1
else
@@ -65,25 +65,31 @@
return
if("clack", "clacks")
- if(species.name == "Kidan") //Only Kidan can clack and rightfully so.
+ if(get_species() == "Kidan") //Only Kidan can clack and rightfully so.
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
else //Everyone else fails, skip the emote attempt
return
if("click", "clicks")
- if(species.name == "Kidan") //Only Kidan can click and rightfully so.
+ if(get_species() == "Kidan") //Only Kidan can click and rightfully so.
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
else //Everyone else fails, skip the emote attempt
return
if("creaks", "creak")
- if(species.name == "Diona") //Only Dionas can Creaks.
+ if(get_species() == "Diona") //Only Dionas can Creaks.
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
else //Everyone else fails, skip the emote attempt
return
if("hiss", "hisses")
- if(species.name == "Unathi") //Only Unathi can hiss.
+ if(get_species() == "Unathi") //Only Unathi can hiss.
+ on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
+ else //Everyone else fails, skip the emote attempt
+ return
+
+ if("quill", "quills")
+ if(get_species() == "Vox") //Only Vox can rustle their quills.
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
else //Everyone else fails, skip the emote attempt
return
@@ -190,6 +196,13 @@
playsound(loc, 'sound/effects/unathihiss.ogg', 50, 0) //Credit to Jamius (freesound.org) for the sound.
m_type = 2
+ if("quill", "quills")
+ var/M = handle_emote_param(param)
+
+ message = "[src] rustles their quills[M ? " at [M]" : ""]."
+ playsound(loc, 'sound/effects/voxrustle.ogg', 50, 0) //Credit to sound-ideas (freesfx.co.uk) for the sound.
+ m_type = 2
+
if("yes")
var/M = handle_emote_param(param)
@@ -858,7 +871,7 @@
+ " deathgasp(s), drool(s), eyebrow, fart(s), faint(s), flap(s), flip(s), frown(s), gasp(s), giggle(s), glare(s)-(none)/mob, grin(s), groan(s), grumble(s), grin(s)," \
+ " handshake-mob, hug(s)-(none)/mob, hem, highfive, johnny, jump, laugh(s), look(s)-(none)/mob, moan(s), mumble(s), nod(s), pale(s), point(s)-atom, quiver(s), raise(s), salute(s)-(none)/mob, scream(s), shake(s)," \
+ " shiver(s), shrug(s), sigh(s), signal(s)-#1-10,slap(s)-(none)/mob, smile(s),snap(s), sneeze(s), sniff(s), snore(s), stare(s)-(none)/mob, swag(s), tremble(s), twitch(es), twitch(es)_s," \
- + " wag(s), wave(s), whimper(s), wink(s), yawn(s)"
+ + " wag(s), wave(s), whimper(s), wink(s), yawn(s), quill(s)"
switch(species.name)
if("Machine")
@@ -871,6 +884,8 @@
emotelist += "\nUnathi specific emotes :- hiss(es)"
if("Vulpkanin")
emotelist += "\nVulpkanin specific emotes :- growl(s)-none/mob, howl(s)-none/mob"
+ if("Vox")
+ emotelist += "\nVox specific emotes :- quill(s)"
if("Diona")
emotelist += "\nDiona specific emotes :- creak(s)"
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 23061d2a285..dad8fae62f7 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -399,7 +399,7 @@
Stuttering(power)
Stun(power)
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(5, 1, src)
s.start()
@@ -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")
@@ -1306,36 +1306,6 @@
src.custom_pain("You feel a stabbing pain in your chest!", 1)
L.damage = L.min_bruised_damage
-/*
-/mob/living/carbon/human/verb/simulate()
- set name = "sim"
- //set background = 1
-
- var/damage = input("Wound damage","Wound damage") as num
-
- var/germs = 0
- var/tdamage = 0
- var/ticks = 0
- while(germs < 2501 && ticks < 100000 && round(damage/10)*20)
- diary << "VIRUS TESTING: [ticks] : germs [germs] tdamage [tdamage] prob [round(damage/10)*20]"
- ticks++
- if(prob(round(damage/10)*20))
- germs++
- if(germs == 100)
- to_chat(world, "Reached stage 1 in [ticks] ticks")
- if(germs > 100)
- if(prob(10))
- damage++
- germs++
- if(germs == 1000)
- to_chat(world, "Reached stage 2 in [ticks] ticks")
- if(germs > 1000)
- damage++
- germs++
- if(germs == 2500)
- to_chat(world, "Reached stage 3 in [ticks] ticks")
- to_chat(world, "Mob took [tdamage] tox damage")
-*/
//returns 1 if made bloody, returns 0 otherwise
/mob/living/carbon/human/clean_blood(var/clean_feet)
@@ -1441,10 +1411,6 @@
maxHealth = species.total_health
- toxins_alert = 0
- oxygen_alert = 0
- fire_alert = 0
-
if(species.language)
add_language(species.language)
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 157e95da32d..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()
@@ -107,7 +107,7 @@
custom_emote(1, "drops what they were holding, their [E.name] malfunctioning!")
- var/datum/effect/system/spark_spread/spark_system = new /datum/effect/system/spark_spread()
+ var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread()
spark_system.set_up(5, 0, src)
spark_system.attach(src)
spark_system.start()
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index c95bb0bd243..92afc310791 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -152,7 +152,7 @@
update_head_accessory()
if(internal && !get_organ_slot("breathing_tube"))
internal = null
- update_internals_hud_icon(0)
+ update_action_buttons_icon()
wear_mask_update(I, toggle_off = FALSE)
sec_hud_set_ID()
update_inv_wear_mask()
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 516f6b5aee8..ccddc56ca16 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -1,5 +1,4 @@
/mob/living/carbon/human/Life()
- fire_alert = 0 //Reset this here, because both breathe() and handle_environment() have a chance to set it.
life_tick++
voice = GetVoice()
@@ -239,61 +238,38 @@
chest.add_autopsy_data("Radiation Poisoning", autopsy_damage)
/mob/living/carbon/human/breathe()
+ if(!species.breathe(src))
+ ..()
- if((NO_BREATH in mutations) || (NO_BREATHE in species.species_traits) || reagents.has_reagent("lexorin"))
- adjustOxyLoss(-5)
- oxygen_alert = 0
- toxins_alert = 0
- return
- if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell))
- return
+/mob/living/carbon/human/check_breath(datum/gas_mixture/breath)
- var/datum/gas_mixture/environment
- if(loc)
- environment = loc.return_air()
+ var/obj/item/organ/internal/L = get_organ_slot("lungs")
- var/datum/gas_mixture/breath
+ if(!L || L && (L.status & ORGAN_DEAD))
+ if(health >= config.health_threshold_crit)
+ adjustOxyLoss(HUMAN_MAX_OXYLOSS + 1)
+ else
+ adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS)
- if(health <= config.health_threshold_crit)
- AdjustLoseBreath(1)
+ failed_last_breath = TRUE
- if(losebreath > 0)
- AdjustLoseBreath(-1)
- if(prob(10))
- emote("gasp")
- if(istype(loc, /obj/))
- var/obj/loc_as_obj = loc
- loc_as_obj.handle_internal_lifeform(src, 0)
+ if(species)
+ var/datum/species/S = species
+
+ if(S.breathid == "o2")
+ throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy)
+ else if(S.breathid == "tox")
+ throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox)
+ else if(S.breathid == "co2")
+ throw_alert("not_enough_co2", /obj/screen/alert/not_enough_co2)
+ else if(S.breathid == "n2")
+ throw_alert("not_enough_nitro", /obj/screen/alert/not_enough_nitro)
+
+ return FALSE
else
- breath = get_breath_from_internal(BREATH_VOLUME)
-
- if(!breath)
- if(isobj(loc)) //Breathe from loc as object
- var/obj/loc_as_obj = loc
- breath = loc_as_obj.handle_internal_lifeform(src, BREATH_MOLES)
-
- else if(isturf(loc)) //Breathe from loc as turf
- var/breath_moles = 0
- if(environment)
- breath_moles = environment.total_moles()*BREATH_PERCENTAGE
-
- breath = loc.remove_air(breath_moles)
-
- if(!is_lung_ruptured()) // THIS FUCKING EXCERPT, THIS LITTLE FUCKING EXCERPT, SNOWFLAKED
- if(!breath || breath.total_moles() < BREATH_MOLES / 5 || breath.total_moles() > BREATH_MOLES * 5) // RIGHT IN THE CENTER OF THE FUCKING BREATHE PROC
- if(prob(5)) // IT IS THE ONLY FUCKING REASONS HUMAN OVERRIDE breathe()
- rupture_lung() // GOD FUCKING DAMNIT
-
- else //Breathe from loc as obj again
- if(istype(loc, /obj/))
- var/obj/loc_as_obj = loc
- loc_as_obj.handle_internal_lifeform(src,0)
-
- check_breath(breath)
-
- if(breath)
- loc.assume_air(breath)
-
+ if(istype(L, /obj/item/organ/internal/lungs))
+ var/obj/item/organ/internal/lungs/lun = L
+ lun.check_breath(breath, src)
// USED IN DEATHWHISPERS
/mob/living/carbon/human/proc/isInCrit()
@@ -324,45 +300,13 @@
if(null_internals) //something wants internals gone
internal = null //so do it
-
+ update_action_buttons_icon()
if(internal) //check for hud updates every time this is called
- update_internals_hud_icon(1)
return internal.remove_air_volume(volume_needed) //returns the valid air
- else
- update_internals_hud_icon(0)
return null
-/mob/living/carbon/human/check_breath(var/datum/gas_mixture/breath)
- if(status_flags & GODMODE)
- return 0
-
- if(!breath || (breath.total_moles() == 0) || suiciding)
- var/oxyloss = 0
- if(suiciding)
- oxyloss = 2
- adjustOxyLoss(oxyloss)//If you are suiciding, you should die a little bit faster
- failed_last_breath = 1
- oxygen_alert = max(oxygen_alert, 1)
- return 0
- if(health > 0)
- oxyloss = HUMAN_MAX_OXYLOSS
- adjustOxyLoss(oxyloss)
- failed_last_breath = 1
- else
- oxyloss = HUMAN_CRIT_MAX_OXYLOSS
- adjustOxyLoss(oxyloss)
- failed_last_breath = 1
-
- var/obj/item/organ/external/affected = get_organ("chest")
- affected.add_autopsy_data("Suffocation", oxyloss)
- throw_alert("oxy", /obj/screen/alert/oxy)
-
- return 0
-
- return species.handle_breath(breath, src)
-
/mob/living/carbon/human/handle_environment(datum/gas_mixture/environment)
if(!environment)
return
@@ -391,7 +335,7 @@
if(bodytemperature > species.heat_level_1)
//Body temperature is too hot.
if(status_flags & GODMODE) return 1 //godmode
- var/mult = species.hot_env_multiplier
+ var/mult = species.heatmod
if(bodytemperature >= species.heat_level_1 && bodytemperature <= species.heat_level_2)
throw_alert("temp", /obj/screen/alert/hot, 1)
@@ -413,7 +357,7 @@
return 1
if(!istype(loc, /obj/machinery/atmospherics/unary/cryo_cell))
- var/mult = species.cold_env_multiplier
+ var/mult = species.coldmod
if(bodytemperature >= species.cold_level_2 && bodytemperature <= species.cold_level_1)
throw_alert("temp", /obj/screen/alert/cold, 1)
take_overall_damage(burn=mult*COLD_DAMAGE_LEVEL_1, used_weapon = "Low Body Temperature")
@@ -436,7 +380,7 @@
if(status_flags & GODMODE) return 1 //godmode
if(adjusted_pressure >= species.hazard_high_pressure)
- if(!(RESIST_HEAT in mutations))
+ if(!(HEATRES in mutations))
var/pressure_damage = min( ( (adjusted_pressure / species.hazard_high_pressure) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE)
take_overall_damage(brute=pressure_damage, used_weapon = "High Pressure")
throw_alert("pressure", /obj/screen/alert/highpressure, 2)
@@ -449,7 +393,7 @@
else if(adjusted_pressure >= species.hazard_low_pressure)
throw_alert("pressure", /obj/screen/alert/lowpressure, 1)
else
- if(RESIST_COLD in mutations)
+ if(COLDRES in mutations)
clear_alert("pressure")
else
take_overall_damage(brute=LOW_PRESSURE_DAMAGE, used_weapon = "Low Pressure")
@@ -460,7 +404,7 @@
/mob/living/carbon/human/handle_fire()
if(..())
return
- if(RESIST_HEAT in mutations)
+ if(HEATRES in mutations)
return
if(on_fire)
var/thermal_protection = get_thermal_protection()
@@ -524,7 +468,7 @@
/mob/living/carbon/human/proc/get_heat_protection(temperature) //Temperature is the temperature you're being exposed to.
- if(RESIST_HEAT in mutations)
+ if(HEATRES in mutations)
return 1
var/thermal_protection_flags = get_heat_protection_flags(temperature)
@@ -585,7 +529,7 @@
/mob/living/carbon/human/proc/get_cold_protection(temperature)
- if(RESIST_COLD in mutations)
+ if(COLDRES in mutations)
return 1 //Fully protected from the cold.
temperature = max(temperature, 2.7) //There is an occasional bug where the temperature is miscalculated in ares with a small amount of gas on them, so this is necessary to ensure that that bug does not affect this calculation. Space's temperature is 2.7K and most suits that are intended to protect against any cold, protect down to 2.0K.
@@ -763,16 +707,16 @@
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))
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
if(alcohol_strength >= collapse_start && prob(10))
emote("collapse")
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
if(alcohol_strength >= braindamage_start && prob(10))
@@ -935,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]!")
@@ -1033,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/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index 63982b86948..d9d1c9723d7 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -86,9 +86,14 @@
return real_name
/mob/living/carbon/human/IsVocal()
+ // how do species that don't breathe talk? magic, that's what.
+ var/breathes = (!(NO_BREATHE in species.species_traits))
+ var/obj/item/organ/internal/L = get_organ_slot("lungs")
+ if((breathes && !L) || breathes && L && (L.status & ORGAN_DEAD))
+ return FALSE
if(mind)
return !mind.miming
- return 1
+ return TRUE
/mob/living/carbon/human/proc/SetSpecialVoice(var/new_voice)
if(new_voice)
diff --git a/code/modules/mob/living/carbon/human/species/abductor.dm b/code/modules/mob/living/carbon/human/species/abductor.dm
index 75b19395dad..3e1bb968c81 100644
--- a/code/modules/mob/living/carbon/human/species/abductor.dm
+++ b/code/modules/mob/living/carbon/human/species/abductor.dm
@@ -10,7 +10,6 @@
eyes = "blank_eyes"
has_organ = list(
"heart" = /obj/item/organ/internal/heart,
- "lungs" = /obj/item/organ/internal/lungs,
"liver" = /obj/item/organ/internal/liver,
"kidneys" = /obj/item/organ/internal/kidneys,
"brain" = /obj/item/organ/internal/brain,
diff --git a/code/modules/mob/living/carbon/human/species/golem.dm b/code/modules/mob/living/carbon/human/species/golem.dm
index 3fbf0a4d8c1..c289ba3a19e 100644
--- a/code/modules/mob/living/carbon/human/species/golem.dm
+++ b/code/modules/mob/living/carbon/human/species/golem.dm
@@ -30,7 +30,6 @@
heat_level_1 = 999999999
heat_level_2 = 999999999
heat_level_3 = 999999999
- heat_level_3_breathe = 999999999
blood_color = "#515573"
flesh_color = "#137E8F"
diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm
index 9a5e05723a9..28f92654100 100644
--- a/code/modules/mob/living/carbon/human/species/plasmaman.dm
+++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm
@@ -14,8 +14,7 @@
butt_sprite = "plasma"
- breath_type = "plasma"
- poison_type = null //Certainly isn't plasma.
+ breathid = "tox"
heat_level_1 = 350 // Heat damage level 1 above this point.
heat_level_2 = 400 // Heat damage level 2 above this point.
@@ -29,6 +28,16 @@
"realizes the existential problem of being made out of plasma!",
"shows their true colors, which happens to be the color of plasma!")
+ has_organ = list(
+ "heart" = /obj/item/organ/internal/heart,
+ "lungs" = /obj/item/organ/internal/lungs/plasmaman,
+ "liver" = /obj/item/organ/internal/liver,
+ "kidneys" = /obj/item/organ/internal/kidneys,
+ "brain" = /obj/item/organ/internal/brain,
+ "appendix" = /obj/item/organ/internal/appendix,
+ "eyes" = /obj/item/organ/internal/eyes
+ )
+
/datum/species/plasmaman/say_filter(mob/M, message, datum/language/speaking)
if(copytext(message, 1, 2) != "*")
message = replacetext(message, "s", stutter("ss"))
@@ -146,109 +155,7 @@
H.equip_or_collect(new /obj/item/weapon/plasmensuit_cartridge(H), slot_in_backpack) //Two refill cartridges for their suit. Can fit in boxes.
to_chat(H, "You are now running on plasma internals from the [H.s_store] in your [tank_slot_name]. You must breathe plasma in order to survive, and are extremely flammable.")
H.internal = H.get_item_by_slot(tank_slot)
- H.update_internals_hud_icon(1)
-
-// Plasmamen are so fucking different that they need their own proc.
-/datum/species/plasmaman/handle_breath(var/datum/gas_mixture/breath, var/mob/living/carbon/human/H)
- var/safe_plasma_min = 16 // Minimum safe partial pressure of PLASMA, in kPa
- //var/safe_oxygen_max = 140 // Maximum safe partial pressure of PLASMA, in kPa (Not used for now)
- var/safe_co2_max = 10 // Yes it's an arbitrary value who cares?
- var/SA_para_min = 1
- var/SA_sleep_min = 5
- var/plasma_used = 0
- var/nitrogen_used = 0
- var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME
-
- // Partial pressure of plasma
- var/Toxins_pp = (breath.toxins/breath.total_moles())*breath_pressure
- // And CO2, lets say a PP of more than 10 will be bad (It's a little less really, but eh, being passed out all round aint no fun)
- var/CO2_pp = (breath.carbon_dioxide/breath.total_moles())*breath_pressure // Tweaking to fit the hacky bullshit I've done with atmo -- TLE
-
- if(Toxins_pp < safe_plasma_min)
- if(prob(20))
- H.emote("gasp")
- if(Toxins_pp > 0)
- var/ratio = safe_plasma_min/Toxins_pp
- H.adjustOxyLoss(min(5*ratio, HUMAN_MAX_OXYLOSS)) // Don't fuck them up too fast (space only does HUMAN_MAX_OXYLOSS after all!)
- H.failed_last_breath = 1
- plasma_used = breath.toxins*ratio/6
- else
- H.adjustOxyLoss(HUMAN_MAX_OXYLOSS)
- H.failed_last_breath = 1
- H.oxygen_alert = max(H.oxygen_alert, 1)
-
- else // We're in safe limits
- H.failed_last_breath = 0
- H.adjustOxyLoss(-5)
- plasma_used = breath.toxins/6
- H.oxygen_alert = 0
-
- breath.toxins -= plasma_used
- breath.nitrogen -= nitrogen_used
- breath.carbon_dioxide += plasma_used
-
- //CO2 does not affect failed_last_breath. So if there was enough oxygen in the air but too much co2, this will hurt you, but only once per 4 ticks, instead of once per tick.
- if(CO2_pp > safe_co2_max)
- if(!H.co2overloadtime) // If it's the first breath with too much CO2 in it, lets start a counter, then have them pass out after 12s or so.
- H.co2overloadtime = world.time
- else if(world.time - H.co2overloadtime > 120)
- H.Paralyse(3)
- H.adjustOxyLoss(3) // Lets hurt em a little, let them know we mean business
- if(world.time - H.co2overloadtime > 300) // They've been in here 30s now, lets start to kill them for their own good!
- H.adjustOxyLoss(8)
- if(prob(20)) // Lets give them some chance to know somethings not right though I guess.
- H.emote("cough")
-
- else
- H.co2overloadtime = 0
-
- if(breath.trace_gases.len) // If there's some other shit in the air lets deal with it here.
- for(var/datum/gas/sleeping_agent/SA in breath.trace_gases)
- var/SA_pp = (SA.moles/breath.total_moles())*breath_pressure
- if(SA_pp > SA_para_min) // Enough to make us paralysed for a bit
- H.Paralyse(3) // 3 gives them one second to wake up and run away a bit!
- if(SA_pp > SA_sleep_min) // Enough to make us sleep as well
- H.AdjustSleeping(8, bound_lower = 0, bound_upper = 10)
- else if(SA_pp > 0.15) // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning
- if(prob(20))
- H.emote(pick("giggle", "laugh"))
- SA.moles = 0
-
- if(abs(310.15 - breath.temperature) > 50) // Hot air hurts :(
- if(H.status_flags & GODMODE)
- return 1 //godmode
- if(breath.temperature < cold_level_1)
- if(prob(20))
- to_chat(src, "You feel your face freezing and an icicle forming in your lungs!")
- else if(breath.temperature > heat_level_1)
- if(prob(20))
- to_chat(src, "You feel your face burning and a searing heat in your lungs!")
-
- switch(breath.temperature)
- if(-INFINITY to cold_level_3)
- H.apply_damage(COLD_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Cold")
- H.fire_alert = max(H.fire_alert, 1)
-
- if(cold_level_3 to cold_level_2)
- H.apply_damage(COLD_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Cold")
- H.fire_alert = max(H.fire_alert, 1)
-
- if(cold_level_2 to cold_level_1)
- H.apply_damage(COLD_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Cold")
- H.fire_alert = max(H.fire_alert, 1)
-
- if(heat_level_1 to heat_level_2)
- H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Heat")
- H.fire_alert = max(H.fire_alert, 2)
-
- if(heat_level_2 to heat_level_3)
- H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Heat")
- H.fire_alert = max(H.fire_alert, 2)
-
- if(heat_level_3 to INFINITY)
- H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Heat")
- H.fire_alert = max(H.fire_alert, 2)
- return 1
+ H.update_action_buttons_icon()
/datum/species/plasmaman/handle_life(var/mob/living/carbon/human/H)
if(!istype(H.wear_suit, /obj/item/clothing/suit/space/eva/plasmaman) || !istype(H.head, /obj/item/clothing/head/helmet/space/eva/plasmaman))
@@ -264,6 +171,7 @@
if(istype(P))
P.Extinguish(H)
H.update_fire()
+ ..()
/datum/species/plasmaman/handle_reagents(var/mob/living/carbon/human/H, var/datum/reagent/R)
if(R.id == "plasma")
diff --git a/code/modules/mob/living/carbon/human/species/shadow.dm b/code/modules/mob/living/carbon/human/species/shadow.dm
index 6a48cda5811..7480d7e3a66 100644
--- a/code/modules/mob/living/carbon/human/species/shadow.dm
+++ b/code/modules/mob/living/carbon/human/species/shadow.dm
@@ -70,4 +70,5 @@
H.throw_alert("lightexposure", /obj/screen/alert/lightexposure)
else if(light_amount < 2) //heal in the dark
H.heal_overall_damage(1,1)
- H.clear_alert("lightexposure")
\ No newline at end of file
+ H.clear_alert("lightexposure")
+ ..()
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species/skeleton.dm b/code/modules/mob/living/carbon/human/species/skeleton.dm
index eef78948f7a..d207dc20703 100644
--- a/code/modules/mob/living/carbon/human/species/skeleton.dm
+++ b/code/modules/mob/living/carbon/human/species/skeleton.dm
@@ -32,7 +32,6 @@
heat_level_1 = 999999999
heat_level_2 = 999999999
heat_level_3 = 999999999
- heat_level_3_breathe = 999999999
suicide_messages = list(
"is snapping their own bones!",
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index 7a1c147a927..d59a2e15a39 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -26,20 +26,15 @@
var/slowdown = 0 // Passive movement speed malus (or boost, if negative)
var/silent_steps = 0 // Stops step noises
- var/breath_type = "oxygen" // Non-oxygen gas breathed, if any.
- var/poison_type = "plasma" // Poisonous air.
- var/exhale_type = "carbon_dioxide" // Exhaled gas type.
-
var/cold_level_1 = 260 // Cold damage level 1 below this point.
var/cold_level_2 = 200 // Cold damage level 2 below this point.
var/cold_level_3 = 120 // Cold damage level 3 below this point.
- var/cold_env_multiplier = 1 // Damage multiplier for being in a cold environment
+ var/coldmod = 1 // Damage multiplier for being in a cold environment
var/heat_level_1 = 360 // Heat damage level 1 above this point.
var/heat_level_2 = 400 // Heat damage level 2 above this point.
var/heat_level_3 = 460 // Heat damage level 3 above this point; used for body temperature
- var/hot_env_multiplier = 1 // Damage multiplier for being in a hot environment
- var/heat_level_3_breathe = 1000 // Heat damage level 3 above this point; used for breathed air temperature
+ var/heatmod = 1 // Damage multiplier for being in a hot environment
var/body_temperature = 310.15 //non-IS_SYNTHETIC species will try to stabilize at this temperature. (also affects temperature processing)
var/reagent_tag //Used for metabolizing reagents.
@@ -56,19 +51,6 @@
var/warning_low_pressure = WARNING_LOW_PRESSURE // Low pressure warning.
var/hazard_low_pressure = HAZARD_LOW_PRESSURE // Dangerously low pressure.
- var/list/atmos_requirements = list(
- "min_oxy" = 16,
- "max_oxy" = 0,
- "min_nitro" = 0,
- "max_nitro" = 0,
- "min_tox" = 0,
- "max_tox" = 0.005,
- "min_co2" = 0,
- "max_co2" = 10,
- "sa_para" = 1,
- "sa_sleep" = 5
- )
-
var/brute_mod = 1 // Physical damage reduction/amplification
var/burn_mod = 1 // Burn damage reduction/amplification
var/tox_mod = 1 // Toxin damage reduction/amplification
@@ -94,6 +76,8 @@
var/list/species_traits = list()
+ var/breathid = "o2"
+
var/clothing_flags = 0 // Underwear and socks.
var/exotic_blood
var/bodyflags = 0
@@ -211,171 +195,9 @@
for(var/obj/item/organ/external/O in H.bodyparts)
O.owner = H
-/datum/species/proc/handle_breath(var/datum/gas_mixture/breath, var/mob/living/carbon/human/H)
- var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME
-
- var/O2_used = 0
- var/N2_used = 0
- var/Tox_used = 0
- var/CO2_used = 0
-
- //Partial pressure of the O2 in our breath
- var/O2_pp = (breath.oxygen/breath.total_moles()) * breath_pressure
- // Partial pressure of Nitrogen
- var/N2_pp = (breath.nitrogen/breath.total_moles()) * breath_pressure
- // Partial pressure of plasma
- var/Tox_pp = (breath.toxins/breath.total_moles()) * breath_pressure
- // Partial pressure of CO2
- var/CO2_pp = (breath.carbon_dioxide/breath.total_moles()) * breath_pressure
-
- if(O2_pp < atmos_requirements["min_oxy"])
- if(prob(20))
- H.emote("gasp")
-
- H.failed_last_breath = 1
- if(O2_pp > 0)
- var/ratio = atmos_requirements["min_oxy"] / O2_pp
- H.adjustOxyLoss(min(5 * ratio, HUMAN_MAX_OXYLOSS))
- else
- H.adjustOxyLoss(HUMAN_MAX_OXYLOSS)
- H.throw_alert("oxy", /obj/screen/alert/oxy)
- else if(atmos_requirements["max_oxy"] && O2_pp > atmos_requirements["max_oxy"])
- var/ratio = (breath.oxygen / atmos_requirements["max_oxy"]) * 1000
- H.adjustToxLoss(Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE))
- H.throw_alert("oxy", /obj/screen/alert/too_much_oxy)
- else
- H.clear_alert("oxy")
- if(atmos_requirements["min_oxy"]) //species breathes this gas, so, they got their air
- H.failed_last_breath = 0
- H.adjustOxyLoss(-5)
- O2_used = breath.oxygen / 6
-
- if(N2_pp < atmos_requirements["min_nitro"])
- if(prob(20))
- H.emote("gasp")
-
- H.failed_last_breath = 1
- if(N2_pp > 0)
- var/ratio = atmos_requirements["min_nitro"] / N2_pp
- H.adjustOxyLoss(min(5 * ratio, HUMAN_MAX_OXYLOSS))
- else
- H.adjustOxyLoss(HUMAN_MAX_OXYLOSS)
- H.throw_alert("nitro", /obj/screen/alert/nitro)
- else if(atmos_requirements["max_nitro"] && N2_pp > atmos_requirements["max_nitro"])
- var/ratio = (breath.nitrogen / atmos_requirements["max_nitro"]) * 1000
- H.adjustToxLoss(Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE))
- H.throw_alert("nitro", /obj/screen/alert/too_much_nitro)
- else
- H.clear_alert("nitro")
- if(atmos_requirements["min_nitro"]) //species breathes this gas, so they got their air
- H.failed_last_breath = 0
- H.adjustOxyLoss(-5)
- N2_used = breath.nitrogen / 6
-
- if(Tox_pp < atmos_requirements["min_tox"])
- if(prob(20))
- H.emote("gasp")
-
- H.failed_last_breath = 1
- if(Tox_pp > 0)
- var/ratio = atmos_requirements["min_tox"] / Tox_pp
- H.adjustOxyLoss(min(5 * ratio, HUMAN_MAX_OXYLOSS))
- else
- H.adjustOxyLoss(HUMAN_MAX_OXYLOSS)
- H.throw_alert("tox_in_air", /obj/screen/alert/not_enough_tox)
- else if(atmos_requirements["max_tox"] && Tox_pp > atmos_requirements["max_tox"])
- var/ratio = (breath.toxins / atmos_requirements["max_tox"]) * 10
- if(H.reagents)
- H.reagents.add_reagent("plasma", Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE))
- H.throw_alert("tox_in_air", /obj/screen/alert/tox_in_air)
- else
- H.clear_alert("tox_in_air")
- if(atmos_requirements["min_tox"]) //species breathes this gas, so, they got their air
- H.failed_last_breath = 0
- H.adjustOxyLoss(-5)
- Tox_used = breath.toxins / 6
-
- if(CO2_pp < atmos_requirements["min_co2"])
- if(prob(20))
- H.emote("gasp")
-
- H.failed_last_breath = 1
- if(CO2_pp)
- var/ratio = atmos_requirements["min_co2"] / CO2_pp
- H.adjustOxyLoss(min(5 * ratio, HUMAN_MAX_OXYLOSS))
- else
- H.adjustOxyLoss(HUMAN_MAX_OXYLOSS)
- H.throw_alert("co2", /obj/screen/alert/not_enough_co2)
- else if(atmos_requirements["max_co2"] && CO2_pp > atmos_requirements["max_co2"])
- if(!H.co2overloadtime) // If it's the first breath with too much CO2 in it, lets start a counter, then have them pass out after 12s or so.
- H.co2overloadtime = world.time
- else if(world.time - H.co2overloadtime > 120)
- H.Paralyse(5)
- H.adjustOxyLoss(3) // Lets hurt em a little, let them know we mean business
- if(world.time - H.co2overloadtime > 300) // They've been in here 30s now, lets start to kill them for their own good!
- H.adjustOxyLoss(8)
- if(prob(20)) // Lets give them some chance to know somethings not right though I guess.
- H.emote("cough")
- else
- H.clear_alert("co2")
- H.co2overloadtime = 0
- if(atmos_requirements["min_co2"]) //species breathes this gas, so they got their air
- H.failed_last_breath = 0
- H.adjustOxyLoss(-5)
- CO2_used = breath.carbon_dioxide / 6
-
- breath.oxygen -= O2_used
- breath.nitrogen -= N2_used
- breath.toxins -= Tox_used
- breath.carbon_dioxide -= CO2_used
- breath.carbon_dioxide += O2_used
-
-
- if(breath.trace_gases.len) // If there's some other shit in the air lets deal with it here.
- for(var/datum/gas/sleeping_agent/SA in breath.trace_gases)
- var/SA_pp = (SA.moles / breath.total_moles()) * breath_pressure
- if(SA_pp > atmos_requirements["sa_para"]) // Enough to make us paralysed for a bit
- H.Paralyse(3) // 3 gives them one second to wake up and run away a bit!
- if(SA_pp > atmos_requirements["sa_sleep"]) // Enough to make us sleep as well
- // This value is large because breaths are taken only once every 4 life ticks.
- H.AdjustSleeping(8, bound_lower = 0, bound_upper = 10)
- else if(SA_pp > 0.01) // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning
- if(prob(20))
- H.emote(pick("giggle", "laugh"))
-
- handle_temperature(breath, H)
- return 1
-
-/datum/species/proc/handle_temperature(datum/gas_mixture/breath, var/mob/living/carbon/human/H) // called by human/life, handles temperatures
- if(abs(310.15 - breath.temperature) > 50) // Hot air hurts :(
- if(H.status_flags & GODMODE) return 1 //godmode
- if(breath.temperature < cold_level_1)
- if(prob(20))
- to_chat(H, "You feel your face freezing and an icicle forming in your lungs!")
- else if(breath.temperature > heat_level_1)
- if(prob(20))
- to_chat(H, "You feel your face burning and a searing heat in your lungs!")
-
-
-
- switch(breath.temperature)
- if(-INFINITY to cold_level_3)
- H.apply_damage(cold_env_multiplier*COLD_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Cold")
-
- if(cold_level_3 to cold_level_2)
- H.apply_damage(cold_env_multiplier*COLD_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Cold")
-
- if(cold_level_2 to cold_level_1)
- H.apply_damage(cold_env_multiplier*COLD_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Cold")
-
- if(heat_level_1 to heat_level_2)
- H.apply_damage(hot_env_multiplier*HEAT_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Heat")
-
- if(heat_level_2 to heat_level_3_breathe)
- H.apply_damage(hot_env_multiplier*HEAT_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Heat")
-
- if(heat_level_3_breathe to INFINITY)
- H.apply_damage(hot_env_multiplier*HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Heat")
+/datum/species/proc/breathe(mob/living/carbon/human/H)
+ if((NO_BREATHE in species_traits) || (BREATHLESS in H.mutations))
+ return TRUE
////////////////
// MOVE SPEED //
@@ -477,7 +299,9 @@
// For special snowflake species effects
// (Slime People changing color based on the reagents they consume)
/datum/species/proc/handle_life(var/mob/living/carbon/human/H)
- return 1
+ if((NO_BREATHE in species_traits) || (BREATHLESS in H.mutations))
+ H.setOxyLoss(0)
+ H.SetLoseBreath(0)
/datum/species/proc/handle_dna(var/mob/living/carbon/C, var/remove) //Handles DNA mutations, as that doesn't work at init. Make sure you call genemutcheck on any blocks changed here
return
diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm
index 0d5b14db6c2..b895ed0fdd4 100644
--- a/code/modules/mob/living/carbon/human/species/station.dm
+++ b/code/modules/mob/living/carbon/human/species/station.dm
@@ -50,7 +50,6 @@
heat_level_1 = 380 //Default 360 - Higher is better
heat_level_2 = 420 //Default 400
heat_level_3 = 480 //Default 460
- heat_level_3_breathe = 1100 //Default 1000
flesh_color = "#34AF10"
reagent_tag = PROCESS_ORG
@@ -106,7 +105,6 @@
heat_level_1 = 340
heat_level_2 = 380
heat_level_3 = 440
- heat_level_3_breathe = 900
primitive_form = "Farwa"
@@ -276,24 +274,10 @@
cold_level_2 = 50
cold_level_3 = 0
- atmos_requirements = list(
- "min_oxy" = 0,
- "max_oxy" = 1,
- "min_nitro" = 16,
- "max_nitro" = 0,
- "min_tox" = 0,
- "max_tox" = 0.005,
- "min_co2" = 0,
- "max_co2" = 10,
- "sa_para" = 1,
- "sa_sleep" = 5
- )
+ breathid = "n2"
eyes = "vox_eyes_s"
- breath_type = "nitrogen"
- poison_type = "oxygen"
-
species_traits = list(NO_SCAN, IS_WHITELISTED, NOTRANSSTING)
clothing_flags = HAS_SOCKS
dietflags = DIET_OMNI
@@ -326,7 +310,7 @@
has_organ = list(
"heart" = /obj/item/organ/internal/heart,
- "lungs" = /obj/item/organ/internal/lungs,
+ "lungs" = /obj/item/organ/internal/lungs/vox,
"liver" = /obj/item/organ/internal/liver/vox,
"kidneys" = /obj/item/organ/internal/kidneys,
"brain" = /obj/item/organ/internal/brain,
@@ -368,7 +352,7 @@
H.equip_or_collect(new /obj/item/weapon/tank/emergency_oxygen/vox(H), slot_l_hand)
to_chat(H, "You are now running on nitrogen internals from the [H.l_hand] in your hand. Your species finds oxygen toxic, so you must breathe nitrogen only.")
H.internal = H.l_hand
- H.update_internals_hud_icon(1)
+ H.update_action_buttons_icon()
/datum/species/vox/handle_post_spawn(var/mob/living/carbon/human/H)
updatespeciescolor(H)
@@ -438,14 +422,11 @@
heat_level_1 = 2000
heat_level_2 = 3000
heat_level_3 = 4000
- heat_level_3_breathe = 4000
brute_mod = 0.2
burn_mod = 0.2
eyes = "blank_eyes"
- breath_type = "nitrogen"
- poison_type = "oxygen"
species_traits = list(NO_SCAN, NO_BLOOD, NO_PAIN, IS_WHITELISTED)
bodyflags = HAS_TAIL
@@ -461,7 +442,7 @@
has_organ = list(
"heart" = /obj/item/organ/internal/heart,
- "lungs" = /obj/item/organ/internal/lungs,
+ "lungs" = /obj/item/organ/internal/lungs/vox,
"liver" = /obj/item/organ/internal/liver,
"kidneys" = /obj/item/organ/internal/kidneys,
"brain" = /obj/item/organ/internal/brain,
@@ -538,7 +519,7 @@
cold_level_1 = 280
cold_level_2 = 240
cold_level_3 = 200
- cold_env_multiplier = 3
+ coldmod = 3
oxy_mod = 0
brain_mod = 2.5
@@ -593,7 +574,7 @@
E.sync_colour_to_human(H)
H.update_hair(0)
H.update_body()
- return ..()
+ ..()
#undef SLIMEPERSON_COLOR_SHIFT_TRIGGER
#undef SLIMEPERSON_ICON_UPDATE_PERIOD
@@ -789,7 +770,6 @@
heat_level_1 = 300
heat_level_2 = 340
heat_level_3 = 400
- heat_level_3_breathe = 700
blurb = "Commonly referred to (erroneously) as 'plant people', the Dionaea are a strange space-dwelling collective \
species hailing from Epsilon Ursae Minoris. Each 'diona' is a cluster of numerous cat-sized organisms called nymphs; \
@@ -877,6 +857,7 @@
H.adjustFireLoss(-(light_amount/4))
if(H.nutrition < NUTRITION_LEVEL_STARVING+50)
H.take_overall_damage(10,0)
+ ..()
/datum/species/machine
name = "Machine"
@@ -1012,13 +993,12 @@
cold_level_1 = -1 //Default 260 - Lower is better
cold_level_2 = -1 //Default 200
cold_level_3 = -1 //Default 120
- cold_env_multiplier = -1
+ coldmod = -1
heat_level_1 = 300 //Default 360 - Higher is better
heat_level_2 = 340 //Default 400
heat_level_3 = 400 //Default 460
- heat_level_3_breathe = 600 //Default 1000
- hot_env_multiplier = 2
+ heatmod = 2
flesh_color = "#a3d4eb"
reagent_tag = PROCESS_ORG
@@ -1032,40 +1012,4 @@
"metabolic strainer" = /obj/item/organ/internal/liver/drask,
"eyes" = /obj/item/organ/internal/eyes/drask, //5 darksight.
"brain" = /obj/item/organ/internal/brain/drask
- )
-
-/datum/species/drask/handle_temperature(datum/gas_mixture/breath, var/mob/living/carbon/human/H)
- if( abs(310.15 - breath.temperature) > 50)
- if(H.status_flags & GODMODE) return 1 //godmode
- if(breath.temperature < 260)
- if(prob(20))
- to_chat(H, " You feel an invigorating coldness in your lungs!")
- if(breath.temperature > heat_level_1)
- if(prob(20))
- to_chat(H, "You feel your face burning and a searing heat in your lungs!")
-
- switch(breath.temperature)
-
- if(-INFINITY to 60)
- H.adjustFireLoss(cold_env_multiplier*COLD_GAS_DAMAGE_LEVEL_3*0.5) //3 points healed, applied every 4 ticks
- H.adjustBruteLoss(cold_env_multiplier*COLD_GAS_DAMAGE_LEVEL_3)
- H.throw_alert("temp", /obj/screen/alert/cold/drask, 3)
-
- if(61 to 200)
- H.adjustFireLoss(cold_env_multiplier*COLD_GAS_DAMAGE_LEVEL_2*0.5) //1.5 healed every 4 ticks
- H.adjustBruteLoss(cold_env_multiplier*COLD_GAS_DAMAGE_LEVEL_2)
- H.throw_alert("temp", /obj/screen/alert/cold/drask, 2)
-
- if(201 to 260)
- H.adjustFireLoss(cold_env_multiplier*COLD_GAS_DAMAGE_LEVEL_1*0.5) //0.5 healed every 4 ticks
- H.adjustBruteLoss(cold_env_multiplier*COLD_GAS_DAMAGE_LEVEL_1)
- H.throw_alert("temp", /obj/screen/alert/cold/drask, 1)
-
- if(heat_level_1 to heat_level_2)
- H.apply_damage(hot_env_multiplier*HEAT_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Heat")
-
- if(heat_level_2 to heat_level_3_breathe)
- H.apply_damage(hot_env_multiplier*HEAT_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Heat")
-
- if(heat_level_3_breathe to INFINITY)
- H.apply_damage(hot_env_multiplier*HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Heat")
+ )
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 90ee068486f..e06edd7fcaf 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -539,7 +539,7 @@ var/global/list/damage_icon_parts = list()
if(LASER)
standing.overlays += "lasereyes_s"
add_image = 1
- if((RESIST_COLD in mutations) && (RESIST_HEAT in mutations))
+ if((COLDRES in mutations) && (HEATRES in mutations))
standing.underlays -= "cold[fat]_s"
standing.underlays -= "fire[fat]_s"
standing.underlays += "coldfire[fat]_s"
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 5e09625a776..15938e39ef2 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -27,7 +27,7 @@
//Start of a breath chain, calls breathe()
/mob/living/carbon/handle_breathing()
- if(mob_master.current_cycle%4==2 || failed_last_breath)
+ if(mob_master.current_cycle % 4 == 2 || failed_last_breath)
breathe() //Breathe per 4 ticks, unless suffocating
else
if(istype(loc, /obj/))
@@ -40,8 +40,6 @@
return
if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell))
return
- if(NO_BREATH in mutations)
- return // No breath mutation means no breathing.
var/datum/gas_mixture/environment
if(loc)
@@ -52,6 +50,7 @@
if(health <= config.health_threshold_crit)
AdjustLoseBreath(1)
+ //Suffocate
if(losebreath > 0)
AdjustLoseBreath(-1)
if(prob(10))
@@ -75,7 +74,6 @@
breath_moles = environment.total_moles()*BREATH_PERCENTAGE
breath = loc.remove_air(breath_moles)
-
else //Breathe from loc as obj again
if(istype(loc, /obj/))
var/obj/loc_as_obj = loc
@@ -90,14 +88,18 @@
//Third link in a breath chain, calls handle_breath_temperature()
/mob/living/carbon/proc/check_breath(datum/gas_mixture/breath)
if(status_flags & GODMODE)
- return 0
+ return FALSE
+
+ var/lungs = get_organ_slot("lungs")
+ if(!lungs)
+ adjustOxyLoss(2)
//CRIT
- if(!breath || (breath.total_moles() == 0))
+ if(!breath || (breath.total_moles() == 0) || !lungs)
adjustOxyLoss(1)
- failed_last_breath = 1
- throw_alert("oxy", /obj/screen/alert/oxy)
- return 0
+ failed_last_breath = TRUE
+ throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy)
+ return FALSE
var/safe_oxy_min = 16
var/safe_co2_max = 10
@@ -117,20 +119,20 @@
if(prob(20))
emote("gasp")
if(O2_partialpressure > 0)
- var/ratio = safe_oxy_min/O2_partialpressure
+ var/ratio = 1 - O2_partialpressure/safe_oxy_min
adjustOxyLoss(min(5*ratio, 3))
- failed_last_breath = 1
- oxygen_used = breath.oxygen*ratio/6
+ failed_last_breath = TRUE
+ oxygen_used = breath.oxygen*ratio
else
adjustOxyLoss(3)
- failed_last_breath = 1
- throw_alert("oxy", /obj/screen/alert/oxy)
+ failed_last_breath = TRUE
+ throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy)
else //Enough oxygen
- failed_last_breath = 0
+ failed_last_breath = FALSE
adjustOxyLoss(-5)
- oxygen_used = breath.oxygen/6
- clear_alert("oxy")
+ oxygen_used = breath.oxygen
+ clear_alert("not_enough_oxy")
breath.oxygen -= oxygen_used
breath.carbon_dioxide += oxygen_used
@@ -146,17 +148,17 @@
adjustOxyLoss(8)
if(prob(20))
emote("cough")
+
else
co2overloadtime = 0
//TOXINS/PLASMA
if(Toxins_partialpressure > safe_tox_max)
var/ratio = (breath.toxins/safe_tox_max) * 10
- if(reagents)
- reagents.add_reagent("plasma", Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE))
- throw_alert("tox_in_air", /obj/screen/alert/tox_in_air)
+ adjustToxLoss(Clamp(ratio, MIN_TOXIC_GAS_DAMAGE, MAX_TOXIC_GAS_DAMAGE))
+ throw_alert("too_much_tox", /obj/screen/alert/too_much_tox)
else
- clear_alert("tox_in_air")
+ clear_alert("too_much_tox")
//TRACE GASES
if(breath.trace_gases.len)
@@ -173,7 +175,7 @@
//BREATH TEMPERATURE
handle_breath_temperature(breath)
- return 1
+ return TRUE
//Fourth and final link in a breath chain
/mob/living/carbon/proc/handle_breath_temperature(datum/gas_mixture/breath)
@@ -189,12 +191,9 @@
internal = null //turn off internals
if(internal)
- update_internals_hud_icon(1)
return internal.remove_air_volume(volume_needed)
else
- update_internals_hud_icon(0)
-
- return
+ update_action_buttons_icon()
/mob/living/carbon/handle_diseases()
for(var/thing in viruses)
diff --git a/code/modules/mob/living/carbon/slime/life.dm b/code/modules/mob/living/carbon/slime/life.dm
index 6e3221c19fa..e0afe00ada2 100644
--- a/code/modules/mob/living/carbon/slime/life.dm
+++ b/code/modules/mob/living/carbon/slime/life.dm
@@ -12,6 +12,9 @@
if(!ckey)
handle_speech_and_mood()
+/mob/living/carbon/slime/breathe()
+ return
+
/mob/living/carbon/slime/proc/AIprocess() // the master AI process
if(AIproc || stat == DEAD || client) return
diff --git a/code/modules/mob/living/carbon/slime/slime.dm b/code/modules/mob/living/carbon/slime/slime.dm
index 28e457fd128..d1bcb196c0e 100644
--- a/code/modules/mob/living/carbon/slime/slime.dm
+++ b/code/modules/mob/living/carbon/slime/slime.dm
@@ -66,6 +66,10 @@
coretype = text2path("/obj/item/slime_extract/[sanitizedcolour]")
..()
+/mob/living/carbon/slime/random/New()
+ colour = pick("grey","orange", "metal", "blue", "purple", "dark purple", "dark blue", "green", "silver", "yellow", "gold", "yellow", "red", "silver", "pink", "cerulean", "sepia", "bluespace", "pyrite", "light pink", "oil", "adamantine", "black")
+ ..()
+
/mob/living/carbon/slime/Destroy()
for(var/obj/machinery/computer/camera_advanced/xenobio/X in machines)
if(src in X.stored_slimes)
diff --git a/code/modules/mob/living/carbon/superheroes.dm b/code/modules/mob/living/carbon/superheroes.dm
index af4e6f75aa2..f98b2563f08 100644
--- a/code/modules/mob/living/carbon/superheroes.dm
+++ b/code/modules/mob/living/carbon/superheroes.dm
@@ -7,7 +7,7 @@
var/name
var/desc
var/class
- var/list/default_genes = list(REGEN, NO_BREATH, RESIST_COLD)
+ var/list/default_genes = list(REGEN, BREATHLESS, COLDRES)
var/list/default_spells = list()
/datum/superheroes/proc/create(var/mob/living/carbon/human/H)
@@ -188,7 +188,7 @@
switch(progress)
if(1)
to_chat(user, "You begin by introducing yourself and explaining what you're about.")
- user.visible_message("[user]'s introduces \himself and explains \his plans.")
+ user.visible_message("[user] introduces \himself and explains \his plans.")
if(2)
to_chat(user, "You begin the recruitment of [target].")
user.visible_message("[user] leans over towards [target], whispering excitedly as he gives a speech.")
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/living_defines.dm b/code/modules/mob/living/living_defines.dm
index c120742f7c0..5aaf02688d3 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -43,6 +43,8 @@
var/list/icon/pipes_shown = list()
var/last_played_vent
+ var/smoke_delay = 0 //used to prevent spam with smoke reagent reaction on mob.
+
var/step_count = 0
var/list/butcher_results = null
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 d70293ae10c..9524e3a9327 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -50,6 +50,12 @@ var/list/robot_verbs_default = list(
var/opened = 0
var/emagged = 0
+
+ var/list/force_modules = list()
+ var/allow_rename = TRUE
+ var/weapons_unlock = FALSE
+ var/static_radio_channels = FALSE
+
var/wiresexposed = 0
var/locked = 1
var/list/req_access = list(access_robotics)
@@ -59,7 +65,7 @@ var/list/robot_verbs_default = list(
var/viewalerts = 0
var/modtype = "Default"
var/lower_mod = 0
- var/datum/effect/system/spark_spread/spark_system//So they can initialize sparks whenever/N
+ var/datum/effect_system/spark_spread/spark_system//So they can initialize sparks whenever/N
var/jeton = 0
var/low_power_mode = 0 //whether the robot has no charge left.
var/weapon_lock = 0
@@ -85,13 +91,13 @@ var/list/robot_verbs_default = list(
var/magpulse = 0
var/ionpulse = 0 // Jetpack-like effect.
var/ionpulse_on = 0 // Jetpack-like effect.
- var/datum/effect/system/ion_trail_follow/ion_trail // Ionpulse effect.
+ var/datum/effect_system/trail_follow/ion/ion_trail // Ionpulse effect.
var/datum/action/item_action/toggle_research_scanner/scanner = null
var/list/module_actions = list()
/mob/living/silicon/robot/New(loc,var/syndie = 0,var/unfinished = 0, var/alien = 0)
- spark_system = new /datum/effect/system/spark_spread()
+ spark_system = new /datum/effect_system/spark_spread()
spark_system.set_up(5, 0, src)
spark_system.attach(src)
@@ -215,7 +221,9 @@ var/list/robot_verbs_default = list(
set category = "Robot Commands"
if(custom_name)
return 0
-
+ if(!allow_rename)
+ to_chat(src, "Rename functionality is not enabled on this unit.");
+ return 0
rename_self(braintype, 1)
/mob/living/silicon/robot/proc/sync()
@@ -266,11 +274,9 @@ 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)
to_chat(src, "Crisis mode active. Combat module available.")
modules += "Combat"
@@ -344,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)
@@ -401,11 +402,12 @@ 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)
- radio.config(module.channels)
+ if(!static_radio_channels)
+ radio.config(module.channels)
notify_ai(2)
//for borg hotkeys, here module refers to borg inv slot, not core module
@@ -1012,7 +1014,7 @@ var/list/robot_verbs_default = list(
dat += text("| [obj] | Activated |
")
else
dat += text("| [obj] | Activate |
")
- if(emagged)
+ if(emagged || weapons_unlock)
if(activated(module.emag))
dat += text("| [module.emag] | Activated |
")
else
@@ -1170,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()
@@ -1198,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
@@ -1461,6 +1469,12 @@ var/list/robot_verbs_default = list(
req_access = list(access_cent_specops)
ionpulse = 1
+ force_modules = list("Engineering", "Medical", "Security")
+ static_radio_channels = 1
+ allow_rename = FALSE
+ weapons_unlock = TRUE
+
+
/mob/living/silicon/robot/ert/init()
laws = new /datum/ai_laws/ert_override
radio = new /obj/item/device/radio/borg/ert(src)
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 83467748888..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"
@@ -270,10 +254,27 @@
/obj/item/weapon/robot_module/butler/New()
..()
modules += new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src)
+ modules += new /obj/item/weapon/reagent_containers/food/drinks/cans/cola(src)
+ modules += new /obj/item/weapon/reagent_containers/food/drinks/cans/sodawater(src)
modules += new /obj/item/weapon/reagent_containers/food/condiment/enzyme(src)
+ modules += new /obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice(src) // -0.3 oxy/sec
+ modules += new /obj/item/weapon/reagent_containers/food/drinks/bottle/tomatojuice(src) // -0.2 fire/sec
+ modules += new /obj/item/weapon/reagent_containers/food/drinks/bottle/limejuice(src) // -0.2 tox/sec
+ modules += new /obj/item/weapon/reagent_containers/food/drinks/coffee(src) // -1 paralysis stunned & weakened/sec
+ modules += new /obj/item/weapon/reagent_containers/food/drinks/tea(src)
+ modules += new /obj/item/weapon/reagent_containers/food/drinks/bottle/milk(src) // -0.2 brute/sec
+ modules += new /obj/item/weapon/reagent_containers/food/condiment/sugar(src)
+ modules += new /obj/item/weapon/reagent_containers/food/drinks/ice(src)
+ modules += new /obj/item/weapon/reagent_containers/food/drinks/bottle/cream(src)
+
+ modules += new /obj/item/weapon/reagent_containers/food/drinks/bottle/tequila(src)
+ modules += new /obj/item/weapon/reagent_containers/food/drinks/bottle/vodka(src)
+ modules += new /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey(src)
+
modules += new /obj/item/weapon/pen(src)
modules += new /obj/item/weapon/razor(src)
modules += new /obj/item/device/instrument/piano_synth(src)
+ modules += new /obj/item/device/healthanalyzer/advanced(src)
var/obj/item/weapon/rsf/M = new /obj/item/weapon/rsf(src)
M.matter = 30
diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm
index 899608d0f1a..09a7a124783 100644
--- a/code/modules/mob/living/simple_animal/bot/bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/bot.dm
@@ -345,7 +345,7 @@
to_chat(user, "The welder must be on for this task!")
else
if(W.force) //if force is non-zero
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(5, 1, src)
s.start()
..()
@@ -353,7 +353,7 @@
/mob/living/simple_animal/bot/bullet_act(obj/item/projectile/Proj)
if(Proj && (Proj.damage_type == BRUTE || Proj.damage_type == BURN))
if(prob(75) && Proj.damage > 0)
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(5, 1, src)
s.start()
return ..()
@@ -367,8 +367,7 @@
pulse2.name = "emp sparks"
pulse2.anchored = 1
pulse2.dir = pick(cardinal)
- spawn(10)
- pulse2.delete()
+ QDEL_IN(pulse2, 10)
if(paicard)
paicard.emp_act(severity)
diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
index a71fbe2ae03..58911c4316b 100644
--- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
@@ -98,7 +98,7 @@
if(prob(5)) //Spawns foam!
visible_message("[src] whirs and bubbles violently, before releasing a plume of froth!")
- new /obj/structure/foam(loc)
+ new /obj/effect/particle_effect/foam(loc)
else if(prob(5))
audible_message("[src] makes an excited beeping booping sound!")
@@ -184,7 +184,7 @@
if(prob(50))
new /obj/item/robot_parts/l_arm(Tsec)
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
..()
diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
index 37699e820f2..c577722fe43 100644
--- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
@@ -393,7 +393,7 @@ Auto Patrol[]"},
if(lasercolor == "r")
new /obj/item/clothing/suit/redtag(Tsec)
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm
index a02447cd4ea..40a2b1f1631 100644
--- a/code/modules/mob/living/simple_animal/bot/floorbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm
@@ -406,7 +406,7 @@
T.amount = amount
amount = 0
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
..()
diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm
index b3116d194b8..c4952b09a34 100644
--- a/code/modules/mob/living/simple_animal/bot/medbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/medbot.dm
@@ -569,7 +569,7 @@
if(prob(50))
new /obj/item/robot_parts/l_arm(Tsec)
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
..()
diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm
index 40b2dc832ba..6130213df27 100644
--- a/code/modules/mob/living/simple_animal/bot/mulebot.dm
+++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm
@@ -834,7 +834,7 @@
cell.update_icon()
cell = null
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm
index 46a8ec12f76..9c04e47521a 100644
--- a/code/modules/mob/living/simple_animal/bot/secbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/secbot.dm
@@ -437,7 +437,7 @@ Auto Patrol: []"},
if(prob(50))
new /obj/item/robot_parts/l_arm(Tsec)
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm
index 5f977bfd508..501bfd1e798 100644
--- a/code/modules/mob/living/simple_animal/friendly/cat.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cat.dm
@@ -169,7 +169,7 @@
icon_dead = "Syndicat_dead"
icon_resting = "Syndicat_rest"
gender = FEMALE
- flags = NO_BREATHE
+ mutations = list(BREATHLESS)
faction = list("syndicate")
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
eats_mice = 0
diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm
index 6ef96d07447..727318ac2c7 100644
--- a/code/modules/mob/living/simple_animal/friendly/corgi.dm
+++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm
@@ -123,7 +123,7 @@
emote_see = list("shakes its head", "shivers")
desc = "It's a corgi."
set_light(0)
- flags &= ~NO_BREATHE
+ mutations.Remove(BREATHLESS)
atmos_requirements = default_atmos_requirements
minbodytemp = initial(minbodytemp)
inventory_head.loc = src.loc
@@ -365,7 +365,7 @@
name = "Space Explorer [real_name]"
desc = "That's one small step for a corgi. One giant yap for corgikind."
valid = 1
- flags |= NO_BREATHE
+ mutations.Add(BREATHLESS)
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
@@ -621,12 +621,12 @@
//spark for no reason
if(prob(5))
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
/mob/living/simple_animal/pet/corgi/Ian/borgi/death(gibbed)
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
..()
diff --git a/code/modules/mob/living/simple_animal/friendly/fox.dm b/code/modules/mob/living/simple_animal/friendly/fox.dm
index a31c1cb099f..6edfc6f42c9 100644
--- a/code/modules/mob/living/simple_animal/friendly/fox.dm
+++ b/code/modules/mob/living/simple_animal/friendly/fox.dm
@@ -33,7 +33,7 @@
icon_living = "Syndifox"
icon_dead = "Syndifox_dead"
icon_resting = "Syndifox_rest"
- flags = NO_BREATHE
+ mutations = list(BREATHLESS)
faction = list("syndicate")
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
diff --git a/code/modules/mob/living/simple_animal/friendly/penguin.dm b/code/modules/mob/living/simple_animal/friendly/penguin.dm
new file mode 100644
index 00000000000..545866858ca
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/friendly/penguin.dm
@@ -0,0 +1,61 @@
+//Penguins
+
+/mob/living/simple_animal/pet/penguin
+ name = "penguin"
+ real_name = "penguin"
+ response_help = "pets"
+ response_disarm = "bops"
+ response_harm = "kicks"
+ speak = list("Gah Gah!", "NOOT NOOT!", "NOOT!", "Noot", "noot", "Prah!", "Grah!")
+ speak_emote = list("squawks", "gakkers")
+ emote_hear = list("squawk!", "gakkers!", "noots.","NOOTS!")
+ emote_see = list("shakes its beak.", "flaps it's wings.","preens itself.")
+ faction = list("penguin")
+ see_in_dark = 5
+ speak_chance = 1
+ turns_per_move = 10
+ icon = 'icons/mob/penguins.dmi'
+
+/mob/living/simple_animal/pet/penguin/emperor
+ name = "Emperor penguin"
+ real_name = "penguin"
+ desc = "Emperor of all he surveys."
+ icon_state = "penguin"
+ icon_living = "penguin"
+ icon_dead = "penguin_dead"
+ butcher_results = list()
+ gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
+
+/mob/living/simple_animal/pet/penguin/eldrich
+ name = "Albino penguin"
+ real_name = "penguin"
+ desc = "Found in the depths of mountains."
+ response_help = "taps"
+ response_disarm = "pokes"
+ response_harm = "flails at"
+ icon_state = "penguin_elder"
+ icon_living = "penguin_elder"
+ icon_dead = "penguin_dead"
+ speak = list("Gah Gah!", "Tekeli-li! Tekeli-li!", "Tekeli-li!", "Teke", "li")
+ speak_emote = list("gibbers", "gakkers")
+ emote_hear = list("whistles!", "gakkers!")
+ emote_see = list("shakes its beak.", "flaps it's wings.","preens itself.")
+ faction = list("penguin", "cult")
+
+/mob/living/simple_animal/pet/penguin/emperor/shamebrero
+ name = "Shamebrero penguin"
+ desc = "Shameful of all he surveys."
+ icon_state = "penguin_shamebrero"
+ icon_living = "penguin_shamebrero"
+
+/mob/living/simple_animal/pet/penguin/baby
+ speak = list("gah", "noot noot", "noot!", "noot", "squeee!", "noo!")
+ name = "Penguin chick"
+ real_name = "penguin"
+ desc = "Can't fly and can barely waddles, but the prince of all chicks."
+ icon_state = "penguin_baby"
+ icon_living = "penguin_baby"
+ icon_dead = "penguin_baby_dead"
+ density = FALSE
+ pass_flags = PASSMOB
+ mob_size = MOB_SIZE_SMALL
\ No newline at end of file
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/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm
index 3c521d56d04..c2284764050 100644
--- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm
@@ -48,7 +48,7 @@
ranged = 1
/mob/living/simple_animal/hostile/hivebot/death(gibbed)
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
..()
@@ -75,7 +75,7 @@
/mob/living/simple_animal/hostile/hivebot/tele/New()
..()
- var/datum/effect/system/harmless_smoke_spread/smoke = new /datum/effect/system/harmless_smoke_spread()
+ var/datum/effect_system/smoke_spread/smoke = new
smoke.set_up(5, 0, src.loc)
smoke.start()
visible_message("The [src] warps in!")
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm
index d4a88b49e60..60b2f88c428 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm
@@ -22,7 +22,7 @@
speed = 8
projectiletype = /obj/item/projectile/beam/drone
projectilesound = 'sound/weapons/laser3.ogg'
- var/datum/effect/system/ion_trail_follow/ion_trail
+ var/datum/effect_system/trail_follow/ion/ion_trail
//the drone randomly switches between these states because it's malfunctioning
var/hostile_drone = 0
@@ -80,14 +80,14 @@
//repair a bit of damage
if(prob(1))
src.visible_message("[bicon(src)] [src] shudders and shakes as some of it's damaged systems come back online.")
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
health += rand(25,100)
//spark for no reason
if(prob(5))
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
@@ -129,7 +129,7 @@
src.visible_message("[bicon(src)] [src] begins to spark and shake violenty!")
else
src.visible_message("[bicon(src)] [src] sparks and shakes like it's about to explode!")
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
@@ -154,7 +154,7 @@
/mob/living/simple_animal/hostile/retaliate/malf_drone/Destroy() //Seriously, what the actual hell.
//some random debris left behind
if(has_loot)
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
var/obj/O
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 fc331fb74b9..0b0c44868ab 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -11,9 +11,6 @@
var/icon_resting = ""
var/icon_gib = null //We only try to show a gibbing animation if this exists.
- var/oxygen_alert = 0
- var/toxins_alert = 0
- var/fire_alert = 0
var/healable = 1
var/list/speak = list()
@@ -70,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
@@ -201,7 +198,7 @@
var/areatemp = get_temperature(environment)
- if(abs(areatemp - bodytemperature) > 40 && !(flags & NO_BREATHE))
+ if(abs(areatemp - bodytemperature) > 40 && !(BREATHLESS in mutations))
var/diff = areatemp - bodytemperature
diff = diff / 5
bodytemperature += diff
@@ -213,21 +210,23 @@
if(atmos_requirements["min_oxy"] && oxy < atmos_requirements["min_oxy"])
atmos_suitable = 0
- throw_alert("oxy", /obj/screen/alert/oxy)
+ throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy)
else if(atmos_requirements["max_oxy"] && oxy > atmos_requirements["max_oxy"])
atmos_suitable = 0
- throw_alert("oxy", /obj/screen/alert/too_much_oxy)
+ throw_alert("too_much_oxy", /obj/screen/alert/too_much_oxy)
else
- clear_alert("oxy")
+ clear_alert("not_enough_oxy")
+ clear_alert("too_much_oxy")
if(atmos_requirements["min_tox"] && tox < atmos_requirements["min_tox"])
atmos_suitable = 0
- throw_alert("tox_in_air", /obj/screen/alert/not_enough_tox)
+ throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox)
else if(atmos_requirements["max_tox"] && tox > atmos_requirements["max_tox"])
atmos_suitable = 0
- throw_alert("tox_in_air", /obj/screen/alert/tox_in_air)
+ throw_alert("too_much_tox", /obj/screen/alert/too_much_tox)
else
- clear_alert("tox_in_air")
+ clear_alert("too_much_tox")
+ clear_alert("not_enough_tox")
if(atmos_requirements["min_n2"] && n2 < atmos_requirements["min_n2"])
atmos_suitable = 0
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index 5031ec9c061..f4d60c2604b 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -100,8 +100,6 @@
var/in_throw_mode = 0
- var/coughedtime = null
-
var/emote_cd = 0 // Used to supress emote spamming. 1 if on CD, 2 if disabled by admin (manually set), else 0
var/job = null//Living
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/file_system/programs/antagonist/revelation.dm b/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm
index 148766ef59d..38da8499756 100644
--- a/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm
+++ b/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm
@@ -27,14 +27,14 @@
if(battery_module && prob(25))
qdel(battery_module)
computer.visible_message("\The [computer]'s battery explodes in rain of sparks.")
- var/datum/effect/system/spark_spread/spark_system = new /datum/effect/system/spark_spread()
+ var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread()
spark_system.set_up(5, 0, computer.loc)
spark_system.start()
if(recharger && prob(50))
qdel(recharger)
computer.visible_message("\The [computer]'s recharger explodes in rain of sparks.")
- var/datum/effect/system/spark_spread/spark_system = new /datum/effect/system/spark_spread()
+ var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread()
spark_system.set_up(5, 0, computer.loc)
spark_system.start()
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/ninja/energy_katana.dm b/code/modules/ninja/energy_katana.dm
index 0865536bc36..47ad02f970d 100644
--- a/code/modules/ninja/energy_katana.dm
+++ b/code/modules/ninja/energy_katana.dm
@@ -7,7 +7,7 @@
throwforce = 20
armour_penetration = 50
var/cooldown = 0 // Because spam aint cool, yo.
- var/datum/effect/system/spark_spread/spark_system
+ var/datum/effect_system/spark_spread/spark_system
/obj/item/weapon/katana/energy/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
@@ -69,7 +69,7 @@
/obj/item/weapon/katana/energy/New()
..()
- spark_system = new /datum/effect/system/spark_spread()
+ spark_system = new /datum/effect_system/spark_spread()
spark_system.set_up(5, 0, src)
spark_system.attach(src)
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/apc.dm b/code/modules/power/apc.dm
index da56a496947..59ae659f227 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -530,7 +530,7 @@
var/turf/T = get_turf(src)
var/obj/structure/cable/N = T.get_cable_node()
if(prob(50) && electrocute_mob(usr, N, N))
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(5, 1, src)
s.start()
return
@@ -549,7 +549,7 @@
if(do_after(user, 50 * W.toolspeed, target = src))
if(terminal && opened && has_electronics!=2)
if(prob(50) && electrocute_mob(usr, terminal.powernet, terminal))
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(5, 1, src)
s.start()
return
@@ -1056,11 +1056,11 @@
cell.corrupt()
src.malfhack = 1
update_icon()
- var/datum/effect/system/harmless_smoke_spread/smoke = new /datum/effect/system/harmless_smoke_spread()
+ var/datum/effect_system/smoke_spread/smoke = new
smoke.set_up(3, 0, src.loc)
smoke.attach(src)
smoke.start()
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
for(var/mob/M in viewers(src))
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index e44a694ba06..62313ddbccb 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -195,7 +195,7 @@ By design, d1 is the smallest direction and d2 is the highest
if(!prob(prb))
return 0
if(electrocute_mob(user, powernet, src, siemens_coeff))
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(5, 1, src)
s.start()
return 1
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index 061cd62bc44..57a6e77b660 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -371,7 +371,7 @@
to_chat(user, "You stick \the [W] into the light socket!")
if(has_power() && (W.flags & CONDUCT))
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
if(prob(75))
@@ -448,7 +448,7 @@
else
prot = 1
- if(prot > 0 || (RESIST_HEAT in user.mutations))
+ if(prot > 0 || (HEATRES in user.mutations))
to_chat(user, "You remove the light [fitting]")
else if(TK in user.mutations)
to_chat(user, "You telekinetically remove the light [fitting].")
@@ -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
@@ -525,7 +525,7 @@
if(status == LIGHT_OK || status == LIGHT_BURNED)
playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
if(on || overloaded)
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
status = LIGHT_BROKEN
diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm
index 564a52e0acd..3a5a059d670 100644
--- a/code/modules/power/singularity/containment_field.dm
+++ b/code/modules/power/singularity/containment_field.dm
@@ -99,7 +99,7 @@
if(hasShocked)
return 0
hasShocked = 1
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(5, 1, AM.loc)
s.start()
var/atom/target = get_edge_target_turf(AM, get_dir(src, get_step_away(AM, src)))
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index 3ebcbb565dc..34dad709bd1 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -202,7 +202,7 @@
A.dir = src.dir
playsound(get_turf(src), 'sound/weapons/emitter.ogg', 25, 1)
if(prob(35))
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(5, 1, src)
s.start()
diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm
index 03b1d07b85b..0aeb944a510 100644
--- a/code/modules/power/singularity/narsie.dm
+++ b/code/modules/power/singularity/narsie.dm
@@ -41,7 +41,7 @@
/obj/singularity/narsie/large/attack_ghost(mob/dead/observer/user as mob)
makeNewConstruct(/mob/living/simple_animal/hostile/construct/harvester, user, null, 1)
- new /obj/effect/effect/sleep_smoke(user.loc)
+ new /obj/effect/particle_effect/smoke/sleeping(user.loc)
/obj/singularity/narsie/process()
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index f73d306d15b..6c8b02d5e23 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -184,7 +184,7 @@
if(do_after(user, 50 * I.toolspeed, target = src))
if(prob(50) && electrocute_mob(usr, terminal.powernet, terminal)) //animate the electrocution if uncautious and unlucky
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(5, 1, src)
s.start()
return
@@ -325,7 +325,7 @@
var/turf/T = get_turf(user)
var/obj/structure/cable/N = T.get_cable_node() //get the connecting node cable, if there's one
if(prob(50) && electrocute_mob(user, N, N)) //animate the electrocution if uncautious and unlucky
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(5, 1, src)
s.start()
return
@@ -440,7 +440,7 @@
for(var/mob/M in viewers(src))
M.show_message("The [src.name] is making strange noises!", 3, "You hear sizzling electronics.", 2)
sleep(10*pick(4,5,6,7,10,14))
- var/datum/effect/system/harmless_smoke_spread/smoke = new /datum/effect/system/harmless_smoke_spread()
+ var/datum/effect_system/smoke_spread/smoke = new
smoke.set_up(3, 0, src.loc)
smoke.attach(src)
smoke.start()
@@ -448,7 +448,7 @@
qdel(src)
return
if(prob(15)) //Power drain
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
if(prob(50))
@@ -456,7 +456,7 @@
else
emp_act(2)
if(prob(5)) //smoke only
- var/datum/effect/system/harmless_smoke_spread/smoke = new /datum/effect/system/harmless_smoke_spread()
+ var/datum/effect_system/smoke_spread/smoke = new
smoke.set_up(3, 0, src.loc)
smoke.attach(src)
smoke.start()
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/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm
index 076c2f9c39b..276d7689c5d 100644
--- a/code/modules/projectiles/ammunition/ammo_casings.dm
+++ b/code/modules/projectiles/ammunition/ammo_casings.dm
@@ -134,7 +134,7 @@
name = "rubber shot"
desc = "A shotgun casing filled with densely-packed rubber balls, used to incapacitate crowds from a distance."
icon_state = "cshell"
- projectile_type = /obj/item/projectile/bullet/rpellet
+ projectile_type = /obj/item/projectile/bullet/pellet/rubber
pellets = 6
variance = 25
materials = list(MAT_METAL=4000)
diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm
index ac804ab9192..1f567dd8997 100644
--- a/code/modules/projectiles/guns/magic/wand.dm
+++ b/code/modules/projectiles/guns/magic/wand.dm
@@ -122,7 +122,7 @@
/obj/item/weapon/gun/magic/wand/teleport/zap_self(mob/living/user)
do_teleport(user, user, 10)
- var/datum/effect/system/harmless_smoke_spread/smoke = new /datum/effect/system/harmless_smoke_spread()
+ var/datum/effect_system/smoke_spread/smoke = new
smoke.set_up(10, 0, user.loc)
smoke.start()
charges--
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/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index 701be48d7b1..8e697d1e86e 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -69,8 +69,26 @@
/obj/item/projectile/bullet/pellet
name = "pellet"
damage = 12.5
+ var/tile_dropoff = 0.75
+ var/tile_dropoff_s = 1.25
+
+/obj/item/projectile/bullet/pellet/Range()
+ ..()
+ if(damage > 0)
+ damage -= tile_dropoff
+ if(stamina > 0)
+ stamina -= tile_dropoff_s
+ if(damage < 0 && stamina < 0)
+ qdel(src)
+
+/obj/item/projectile/bullet/pellet/rubber
+ name = "rubber pellet"
+ damage = 3
+ stamina = 25
+ icon_state = "bullet-r"
/obj/item/projectile/bullet/pellet/weak
+ tile_dropoff = 0.55 //Come on it does 6 damage don't be like that.
damage = 6
/obj/item/projectile/bullet/pellet/weak/New()
@@ -78,7 +96,7 @@
..()
/obj/item/projectile/bullet/pellet/weak/on_range()
- var/datum/effect/system/spark_spread/sparks = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread
sparks.set_up(1, 1, src)
sparks.start()
..()
@@ -96,7 +114,7 @@
/obj/item/projectile/bullet/pellet/overload/on_range()
explosion(src, 0, 0, 2)
- var/datum/effect/system/spark_spread/sparks = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread
sparks.set_up(3, 3, src)
sparks.start()
..()
@@ -128,12 +146,6 @@
/obj/item/projectile/bullet/heavybullet
damage = 35
-/obj/item/projectile/bullet/rpellet
- name = "rubber pellet"
- damage = 3
- stamina = 25
- icon_state = "bullet-r"
-
/obj/item/projectile/bullet/stunshot//taser slugs for shotguns, nothing special
name = "stunshot"
damage = 5
diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm
index d9e8a0759bd..10786ec4b82 100644
--- a/code/modules/projectiles/projectile/energy.dm
+++ b/code/modules/projectiles/projectile/energy.dm
@@ -22,7 +22,7 @@
/obj/item/projectile/energy/electrode/on_hit(var/atom/target, var/blocked = 0)
. = ..()
if(!ismob(target) || blocked >= 100) //Fully blocked by mob or collided with dense object - burst into sparks!
- var/datum/effect/system/spark_spread/sparks = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread
sparks.set_up(1, 1, src)
sparks.start()
else if(iscarbon(target))
@@ -34,7 +34,7 @@
C.do_jitter_animation(jitter)
/obj/item/projectile/energy/electrode/on_range() //to ensure the bolt sparks when it reaches the end of its range if it didn't hit a target yet
- var/datum/effect/system/spark_spread/sparks = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread
sparks.set_up(1, 1, src)
sparks.start()
..()
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index ff274a48993..3d26268de51 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -17,7 +17,7 @@
damage = 10
damage_type = BRUTE
nodamage = 0
-
+
//explosion values
var/exp_heavy = 0
var/exp_light = 2
@@ -55,7 +55,7 @@
if(ismob(target)) //multiple flavors of pain
var/mob/living/M = target
M.take_overall_damage(0,10) //between this 10 burn, the 10 brute, the explosion brute, and the onfire burn, your at about 65 damage if you stop drop and roll immediately
-
+
/obj/item/projectile/magic/fireball/infernal
name = "infernal fireball"
@@ -100,7 +100,7 @@
if(!stuff.anchored && stuff.loc)
teleammount++
do_teleport(stuff, stuff, 10)
- var/datum/effect/system/harmless_smoke_spread/smoke = new /datum/effect/system/harmless_smoke_spread()
+ var/datum/effect_system/smoke_spread/smoke = new
smoke.set_up(max(round(10 - teleammount),1), 0, stuff.loc) //Smoke drops off if a lot of stuff is moved for the sake of sanity
smoke.start()
@@ -187,7 +187,7 @@ proc/wabbajack(mob/living/M)
if(ishuman(M))
Robot.mmi.transfer_identity(M) //Does not transfer key/client.
if("slime")
- new_mob = new /mob/living/carbon/slime(M.loc)
+ new_mob = new /mob/living/carbon/slime/random(M.loc)
new_mob.universal_speak = 1
if("xeno")
if(prob(50))
@@ -293,4 +293,4 @@ proc/wabbajack(mob/living/M)
damage_type = BURN
flag = "magic"
dismemberment = 50
- nodamage = 0
\ No newline at end of file
+ nodamage = 0
\ No newline at end of file
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
index 94fb6a71e18..fb42ce7cb57 100644
--- a/code/modules/projectiles/projectile/special.dm
+++ b/code/modules/projectiles/projectile/special.dm
@@ -191,7 +191,7 @@
icon_state = "snappop"
/obj/item/projectile/clown/Bump(atom/A as mob|obj|turf|area)
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, src)
s.start()
new /obj/effect/decal/cleanable/ash(loc)
diff --git a/code/modules/reagents/chem_splash.dm b/code/modules/reagents/chem_splash.dm
index 7c16bf1ab9a..e586e6f806b 100644
--- a/code/modules/reagents/chem_splash.dm
+++ b/code/modules/reagents/chem_splash.dm
@@ -29,7 +29,7 @@
splash_holder.handle_reactions() // React them now.
if(splash_holder.total_volume && affected_range >= 0) //The possible reactions didnt use up all reagents, so we spread it around.
- var/datum/effect/system/steam_spread/steam = new /datum/effect/system/steam_spread()
+ var/datum/effect_system/steam_spread/steam = new /datum/effect_system/steam_spread()
steam.set_up(10, 0, epicenter)
steam.attach(epicenter)
steam.start()
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/pyrotechnic.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic.dm
index e75b904d648..859f5b4a479 100644
--- a/code/modules/reagents/chemistry/reagents/pyrotechnic.dm
+++ b/code/modules/reagents/chemistry/reagents/pyrotechnic.dm
@@ -140,7 +140,7 @@
/*
/datum/reagent/blackpowder/on_ex_act()
var/location = get_turf(holder.my_atom)
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(2, 1, location)
s.start()
sleep(rand(10,15))
diff --git a/code/modules/reagents/chemistry/reagents/toxins.dm b/code/modules/reagents/chemistry/reagents/toxins.dm
index 5d6523f7913..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
@@ -323,12 +323,12 @@
M.EyeBlurry(3)
..()
-/datum/reagent/beer2 //disguised as normal beer for use by emagged brobots
+/datum/reagent/beer2 //disguised as normal beer for use by emagged service borgs
name = "Beer"
id = "beer2"
description = "An alcoholic beverage made from malted grains, hops, yeast, and water."
color = "#664300" // rgb: 102, 67, 0
- metabolization_rate = 1.5 * REAGENTS_METABOLISM
+ metabolization_rate = 0.1 * REAGENTS_METABOLISM
drink_icon ="beerglass"
drink_name = "Beer glass"
drink_desc = "A freezing pint of beer"
@@ -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/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm
index 3bdcfd5c029..8735dfa16c2 100644
--- a/code/modules/reagents/chemistry/recipes/others.dm
+++ b/code/modules/reagents/chemistry/recipes/others.dm
@@ -19,7 +19,7 @@
var/location = get_turf(holder.my_atom)
holder.my_atom.visible_message("The solution spews out foam!")
- var/datum/effect/system/foam_spread/s = new()
+ var/datum/effect_system/foam_spread/s = new()
s.set_up(created_volume, location, holder, 0)
s.start()
holder.clear_reagents()
@@ -37,7 +37,7 @@
holder.my_atom.visible_message("The solution spews out a metalic foam!")
- var/datum/effect/system/foam_spread/s = new()
+ var/datum/effect_system/foam_spread/s = new()
s.set_up(created_volume, location, holder, MFOAM_ALUMINUM)
s.start()
@@ -54,7 +54,7 @@
holder.my_atom.visible_message("Infused with plasma, the core begins to quiver and grow, and soon a new baby slime emerges from it!")
diff --git a/code/modules/reagents/chemistry/recipes/toxins.dm b/code/modules/reagents/chemistry/recipes/toxins.dm
index fb7672d6806..462402c4317 100644
--- a/code/modules/reagents/chemistry/recipes/toxins.dm
+++ b/code/modules/reagents/chemistry/recipes/toxins.dm
@@ -144,7 +144,7 @@
/datum/chemical_reaction/teslium/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(6, 1, location)
s.start()
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/experimentor.dm b/code/modules/research/experimentor.dm
index f0aed90bc91..46904d0f0df 100644
--- a/code/modules/research/experimentor.dm
+++ b/code/modules/research/experimentor.dm
@@ -226,7 +226,7 @@
loaded_item = null
/obj/machinery/r_n_d/experimentor/proc/throwSmoke(turf/where)
- var/datum/effect/system/harmless_smoke_spread/smoke = new
+ var/datum/effect_system/smoke_spread/smoke = new
smoke.set_up(1,0, where, 0)
smoke.start()
@@ -318,7 +318,7 @@
R.my_atom = src
R.add_reagent(chosenchem , 15)
investigate_log("Experimentor has released [chosenchem] smoke.", "experimentor")
- var/datum/effect/system/chem_smoke_spread/smoke = new
+ var/datum/effect_system/smoke_spread/chem/smoke = new
smoke.set_up(R, 1, 0, src, 0, silent = 1)
playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
smoke.start()
@@ -330,7 +330,7 @@
var/datum/reagents/R = new/datum/reagents(15)
R.my_atom = src
R.add_reagent(chosenchem , 15)
- var/datum/effect/system/chem_smoke_spread/smoke = new
+ var/datum/effect_system/smoke_spread/chem/smoke = new
smoke.set_up(R, 1, 0, src, 0, silent = 1)
playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
smoke.start()
@@ -417,7 +417,7 @@
R.my_atom = src
R.add_reagent("frostoil" , 15)
investigate_log("Experimentor has released frostoil gas.", "experimentor")
- var/datum/effect/system/chem_smoke_spread/smoke = new
+ var/datum/effect_system/smoke_spread/chem/smoke = new
smoke.set_up(R, 1, 0, src, 0, silent = 1)
playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
smoke.start()
@@ -439,7 +439,7 @@
ejectItem(TRUE)
if(prob(EFFECT_PROB_MEDIUM-badThingCoeff))
visible_message("[src] malfunctions, releasing a flurry of chilly air as [exp_on] pops out!")
- var/datum/effect/system/harmless_smoke_spread/smoke = new
+ var/datum/effect_system/smoke_spread/smoke = new
smoke.set_up(1,0, src.loc, 0)
smoke.start()
ejectItem()
@@ -648,7 +648,7 @@
//////////////// RELIC PROCS /////////////////////////////
/obj/item/weapon/relic/proc/throwSmoke(turf/where)
- var/datum/effect/system/harmless_smoke_spread/smoke = new
+ var/datum/effect_system/smoke_spread/smoke = new
smoke.set_up(1,0, where, 0)
smoke.start()
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 e2a21f507fa..47912c1c90f 100644
--- a/code/modules/spacepods/spacepod.dm
+++ b/code/modules/spacepods/spacepod.dm
@@ -40,7 +40,7 @@
var/datum/global_iterator/pr_int_temp_processor //normalizes internal air mixture temperature
var/datum/global_iterator/pr_give_air //moves air from tank to cabin
- var/datum/effect/system/ion_trail_follow/space_trail/ion_trail
+ var/datum/effect_system/trail_follow/ion/space_trail/ion_trail
var/hatch_open = 0
@@ -106,7 +106,7 @@
battery = new battery_type(src)
add_cabin()
add_airtank()
- src.ion_trail = new /datum/effect/system/ion_trail_follow/space_trail()
+ src.ion_trail = new /datum/effect_system/trail_follow/ion/space_trail()
src.ion_trail.set_up(src)
src.ion_trail.start()
src.use_internal_tank = 1
@@ -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/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm
index 38d04b527db..f9aa857c3e8 100644
--- a/code/modules/station_goals/bsa.dm
+++ b/code/modules/station_goals/bsa.dm
@@ -397,7 +397,7 @@
if(notice)
return null
//Totally nanite construction system not an immersion breaking spawning
- var/datum/effect/system/harmless_smoke_spread/s = new /datum/effect/system/harmless_smoke_spread()
+ var/datum/effect_system/smoke_spread/s = new
s.set_up(4, 0, get_turf(centerpiece))
s.start()
var/obj/machinery/bsa/full/cannon = new(get_turf(centerpiece),centerpiece.get_cannon_direction())
diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm
index 977899a3195..70a5d522678 100644
--- a/code/modules/station_goals/dna_vault.dm
+++ b/code/modules/station_goals/dna_vault.dm
@@ -278,8 +278,8 @@ var/list/non_simple_animals = typecacheof(list(/mob/living/carbon/human/monkey,/
switch(upgrade_type)
if(VAULT_SPACEIMMUNE)
to_chat(H, "You suddenly don't feel the need to breathe anymore. You also don't feel any cold anymore.")
- grant_power(H, NOBREATHBLOCK, NO_BREATH)
- grant_power(H, FIREBLOCK, RESIST_COLD)
+ grant_power(H, BREATHLESSBLOCK, BREATHLESS)
+ grant_power(H, FIREBLOCK, COLDRES)
if(VAULT_XRAY)
to_chat(H, "You can suddenly see through walls.")
grant_power(H, XRAYBLOCK, XRAY)
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 4b62e42cb8a..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
@@ -275,7 +281,7 @@
var/mob/living/carbon/human/H = user
if(H.get_int_organ(/obj/item/organ/internal/cell))
if(A.emagged || A.stat & BROKEN)
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(3, 1, A)
s.start()
to_chat(H, "The APC power currents surge erratically, damaging your chassis!")
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
new file mode 100644
index 00000000000..39c79865b62
--- /dev/null
+++ b/code/modules/surgery/organs/lungs.dm
@@ -0,0 +1,337 @@
+/obj/item/organ/internal/lungs
+ name = "lungs"
+ icon_state = "lungs"
+ parent_organ = "chest"
+ slot = "lungs"
+ organ_tag = "lungs"
+ gender = PLURAL
+ w_class = WEIGHT_CLASS_NORMAL
+
+ //Breath damage
+
+ var/safe_oxygen_min = 16 // Minimum safe partial pressure of O2, in kPa
+ var/safe_oxygen_max = 0
+ var/safe_nitro_min = 0
+ var/safe_nitro_max = 0
+ var/safe_co2_min = 0
+ var/safe_co2_max = 10 // Yes it's an arbitrary value who cares?
+ var/safe_toxins_min = 0
+ var/safe_toxins_max = 0.05
+ var/SA_para_min = 1 //Sleeping agent
+ var/SA_sleep_min = 5 //Sleeping agent
+
+ var/oxy_breath_dam_min = MIN_TOXIC_GAS_DAMAGE
+ var/oxy_breath_dam_max = MAX_TOXIC_GAS_DAMAGE
+ var/oxy_damage_type = OXY
+ var/nitro_breath_dam_min = MIN_TOXIC_GAS_DAMAGE
+ var/nitro_breath_dam_max = MAX_TOXIC_GAS_DAMAGE
+ var/nitro_damage_type = OXY
+ var/co2_breath_dam_min = MIN_TOXIC_GAS_DAMAGE
+ var/co2_breath_dam_max = MAX_TOXIC_GAS_DAMAGE
+ var/co2_damage_type = OXY
+ var/tox_breath_dam_min = MIN_TOXIC_GAS_DAMAGE
+ var/tox_breath_dam_max = MAX_TOXIC_GAS_DAMAGE
+ var/tox_damage_type = TOX
+
+ var/cold_message = "your face freezing and an icicle forming"
+ var/cold_level_1_threshold = 260
+ var/cold_level_2_threshold = 200
+ var/cold_level_3_threshold = 120
+ 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_types = list(BURN = 1)
+
+ var/hot_message = "your face burning and a searing heat"
+ var/heat_level_1_threshold = 360
+ var/heat_level_2_threshold = 400
+ var/heat_level_3_threshold = 1000
+ 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_types = list(BURN = 1)
+
+/obj/item/organ/internal/lungs/insert(mob/living/carbon/M, special = 0, dont_remove_slot = 0)
+ ..()
+ for(var/thing in list("oxy", "tox", "co2", "nitro"))
+ M.clear_alert("not_enough_[thing]")
+ M.clear_alert("too_much_[thing]")
+
+/obj/item/organ/internal/lungs/remove(mob/living/carbon/M, special = 0)
+ for(var/thing in list("oxy", "tox", "co2", "nitro"))
+ M.clear_alert("not_enough_[thing]")
+ M.clear_alert("too_much_[thing]")
+ return ..()
+
+/obj/item/organ/internal/lungs/on_life()
+ if(germ_level > INFECTION_LEVEL_ONE)
+ if(prob(5))
+ owner.emote("cough") //respitory tract infection
+
+ if(is_bruised())
+ if(prob(2))
+ owner.custom_emote(1, "coughs up blood!")
+ owner.bleed(1)
+ if(prob(4))
+ owner.custom_emote(1, "gasps for air!")
+ owner.AdjustLoseBreath(5)
+
+/obj/item/organ/internal/lungs/proc/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/H)
+ if((H.status_flags & GODMODE))
+ return
+
+ if(!breath || (breath.total_moles() == 0))
+ if(H.health >= config.health_threshold_crit)
+ H.adjustOxyLoss(HUMAN_MAX_OXYLOSS)
+ else
+ H.adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS)
+
+ H.failed_last_breath = TRUE
+ if(safe_oxygen_min)
+ H.throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy)
+ else if(safe_toxins_min)
+ H.throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox)
+ else if(safe_co2_min)
+ H.throw_alert("not_enough_co2", /obj/screen/alert/not_enough_co2)
+ else if(safe_nitro_min)
+ H.throw_alert("not_enough_nitro", /obj/screen/alert/not_enough_nitro)
+ return FALSE
+
+ var/gas_breathed = 0
+
+ //Partial pressures in our breath
+ var/O2_pp = breath.get_breath_partial_pressure(breath.oxygen)
+ var/N2_pp = breath.get_breath_partial_pressure(breath.nitrogen)
+ var/Toxins_pp = breath.get_breath_partial_pressure(breath.toxins)
+ var/CO2_pp = breath.get_breath_partial_pressure(breath.carbon_dioxide)
+
+
+ //-- OXY --//
+
+ //Too much oxygen! //Yes, some species may not like it.
+ if(safe_oxygen_max)
+ if(O2_pp > safe_oxygen_max)
+ var/ratio = (breath.oxygen/safe_oxygen_max) * 10
+ H.apply_damage_type(Clamp(ratio, oxy_breath_dam_min, oxy_breath_dam_max), oxy_damage_type)
+ H.throw_alert("too_much_oxy", /obj/screen/alert/too_much_oxy)
+ else
+ H.clear_alert("too_much_oxy")
+
+ //Too little oxygen!
+ if(safe_oxygen_min)
+ if(O2_pp < safe_oxygen_min)
+ gas_breathed = handle_too_little_breath(H, O2_pp, safe_oxygen_min, breath.oxygen)
+ H.throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy)
+ else
+ H.failed_last_breath = FALSE
+ H.adjustOxyLoss(-5)
+ gas_breathed = breath.oxygen
+ H.clear_alert("not_enough_oxy")
+
+ //Exhale
+ breath.oxygen -= gas_breathed
+ breath.carbon_dioxide += gas_breathed
+ gas_breathed = 0
+
+ //-- Nitrogen --//
+
+ //Too much nitrogen!
+ if(safe_nitro_max)
+ if(N2_pp > safe_nitro_max)
+ var/ratio = (breath.nitrogen/safe_nitro_max) * 10
+ H.apply_damage_type(Clamp(ratio, nitro_breath_dam_min, nitro_breath_dam_max), nitro_damage_type)
+ H.throw_alert("too_much_nitro", /obj/screen/alert/too_much_nitro)
+ else
+ H.clear_alert("too_much_nitro")
+
+ //Too little nitrogen!
+ if(safe_nitro_min)
+ if(N2_pp < safe_nitro_min)
+ gas_breathed = handle_too_little_breath(H, N2_pp, safe_nitro_min, breath.nitrogen)
+ H.throw_alert("nitro", /obj/screen/alert/not_enough_nitro)
+ else
+ H.failed_last_breath = FALSE
+ H.adjustOxyLoss(-5)
+ gas_breathed = breath.nitrogen
+ H.clear_alert("nitro")
+
+ //Exhale
+ breath.nitrogen -= gas_breathed
+ breath.carbon_dioxide += gas_breathed
+ gas_breathed = 0
+
+ //-- CO2 --//
+
+ //CO2 does not affect failed_last_breath. So if there was enough oxygen in the air but too much co2, this will hurt you, but only once per 4 ticks, instead of once per tick.
+ if(safe_co2_max)
+ if(CO2_pp > safe_co2_max)
+ if(!H.co2overloadtime) // If it's the first breath with too much CO2 in it, lets start a counter, then have them pass out after 12s or so.
+ H.co2overloadtime = world.time
+ else if(world.time - H.co2overloadtime > 120)
+ H.Paralyse(3)
+ H.apply_damage_type(3, co2_damage_type) // Lets hurt em a little, let them know we mean business
+ if(world.time - H.co2overloadtime > 300) // They've been in here 30s now, lets start to kill them for their own good!
+ H.apply_damage_type(8, co2_damage_type)
+ H.throw_alert("too_much_co2", /obj/screen/alert/too_much_co2)
+ if(prob(20)) // Lets give them some chance to know somethings not right though I guess.
+ H.emote("cough")
+
+ else
+ H.co2overloadtime = 0
+ H.clear_alert("too_much_co2")
+
+ //Too little CO2!
+ if(safe_co2_min)
+ if(CO2_pp < safe_co2_min)
+ gas_breathed = handle_too_little_breath(H, CO2_pp, safe_co2_min, breath.carbon_dioxide)
+ H.throw_alert("not_enough_co2", /obj/screen/alert/not_enough_co2)
+ else
+ H.failed_last_breath = FALSE
+ H.adjustOxyLoss(-5)
+ gas_breathed = breath.carbon_dioxide
+ H.clear_alert("not_enough_co2")
+
+ //Exhale
+ breath.carbon_dioxide -= gas_breathed
+ breath.oxygen += gas_breathed
+ gas_breathed = 0
+
+
+ //-- TOX --//
+
+ //Too much toxins!
+ if(safe_toxins_max)
+ if(Toxins_pp > safe_toxins_max)
+ var/ratio = (breath.toxins/safe_toxins_max) * 10
+ H.apply_damage_type(Clamp(ratio, tox_breath_dam_min, tox_breath_dam_max), tox_damage_type)
+ H.throw_alert("too_much_tox", /obj/screen/alert/too_much_tox)
+ else
+ H.clear_alert("too_much_tox")
+
+
+ //Too little toxins!
+ if(safe_toxins_min)
+ if(Toxins_pp < safe_toxins_min)
+ gas_breathed = handle_too_little_breath(H, Toxins_pp, safe_toxins_min, breath.toxins)
+ H.throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox)
+ else
+ H.failed_last_breath = FALSE
+ H.adjustOxyLoss(-5)
+ gas_breathed = breath.toxins
+ H.clear_alert("not_enough_tox")
+
+ //Exhale
+ breath.toxins -= gas_breathed
+ breath.carbon_dioxide += gas_breathed
+ gas_breathed = 0
+
+
+ //-- TRACES --//
+
+ if(breath.trace_gases.len) // If there's some other shit in the air lets deal with it here.
+ for(var/datum/gas/sleeping_agent/SA in breath.trace_gases)
+ var/SA_pp = breath.get_breath_partial_pressure(SA.moles)
+ if(SA_pp > SA_para_min)
+ H.Paralyse(3) // 3 gives them one second to wake up and run away a bit!
+ if(SA_pp > SA_sleep_min) // Enough to make us sleep as well
+ H.AdjustSleeping(8, bound_lower = 0, bound_upper = 10)
+ else if(SA_pp > 0.01) // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning
+ if(prob(20))
+ H.emote(pick("giggle", "laugh"))
+
+ handle_breath_temperature(breath, H)
+
+ return TRUE
+
+
+/obj/item/organ/internal/lungs/proc/handle_too_little_breath(mob/living/carbon/human/H = null, breath_pp = 0, safe_breath_min = 0, true_pp = 0)
+ . = 0
+ if(!H || !safe_breath_min) //the other args are either: Ok being 0 or Specifically handled.
+ return FALSE
+
+ if(prob(20))
+ H.emote("gasp")
+ if(breath_pp > 0)
+ var/ratio = safe_breath_min/breath_pp
+ H.adjustOxyLoss(min(5*ratio, HUMAN_MAX_OXYLOSS)) // Don't fuck them up too fast (space only does HUMAN_MAX_OXYLOSS after all!
+ H.failed_last_breath = TRUE
+ . = true_pp*ratio/6
+ else
+ H.adjustOxyLoss(HUMAN_MAX_OXYLOSS)
+ H.failed_last_breath = TRUE
+
+
+/obj/item/organ/internal/lungs/proc/handle_breath_temperature(datum/gas_mixture/breath, mob/living/carbon/human/H) // called by human/life, handles temperatures
+ var/breath_temperature = breath.temperature
+
+ var/species_traits = list()
+ if(H && H.species && H.species.species_traits)
+ species_traits = H.species.species_traits
+
+ if(!(COLDRES in H.mutations) && !(RESISTCOLD in species_traits)) // COLD DAMAGE
+ var/CM = abs(H.species.coldmod)
+ var/TC = 0
+ if(breath_temperature < cold_level_3_threshold)
+ TC = cold_level_3_damage
+ if(breath_temperature > cold_level_3_threshold && breath_temperature < cold_level_2_threshold)
+ TC = cold_level_2_damage
+ if(breath_temperature > cold_level_2_threshold && breath_temperature < cold_level_1_threshold)
+ 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/HM = abs(H.species.heatmod)
+ var/TH = 0
+ if(breath_temperature > heat_level_1_threshold && breath_temperature < heat_level_2_threshold)
+ TH = heat_level_1_damage
+ if(breath_temperature > heat_level_2_threshold && breath_temperature < heat_level_3_threshold)
+ TH = heat_level_2_damage
+ if(breath_temperature > heat_level_3_threshold)
+ 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]!")
+
+/obj/item/organ/internal/lungs/prepare_eat()
+ var/obj/S = ..()
+ S.reagents.add_reagent("salbutamol", 5)
+ return S
+
+/obj/item/organ/internal/lungs/plasmaman
+ name = "plasma filter"
+ desc = "A spongy rib-shaped mass for filtering plasma from the air."
+ icon_state = "lungs-plasma"
+ species = "Plasmaman"
+
+ safe_oxygen_min = 0 //We don't breath this
+ safe_toxins_min = 16 //We breathe THIS!
+ safe_toxins_max = 0
+
+/obj/item/organ/internal/lungs/vox
+ name = "Vox lungs"
+ desc = "They're filled with dust....wow."
+ species = "Vox"
+
+ safe_oxygen_min = 0 //We don't breathe this
+ safe_oxygen_max = 1 //This is toxic to us
+ safe_nitro_min = 16 //We breathe THIS!
+ oxy_damage_type = TOX //And it poisons us
+
+/obj/item/organ/internal/lungs/drask
+ icon = 'icons/obj/surgery_drask.dmi'
+ species = "Drask"
+
+ cold_message = "an invigorating coldness"
+ cold_level_3_threshold = 60
+ 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_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 a5ad0fabe91..ba89166e8b5 100644
--- a/code/modules/surgery/organs/organ.dm
+++ b/code/modules/surgery/organs/organ.dm
@@ -1,5 +1,3 @@
-var/list/organ_cache = list()
-
/obj/item/organ
name = "organ"
icon = 'icons/obj/surgery.dmi'
@@ -31,6 +29,7 @@ var/list/organ_cache = list()
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()
@@ -170,7 +169,7 @@ var/list/organ_cache = list()
..()
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
@@ -221,7 +220,7 @@ var/list/organ_cache = list()
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)
@@ -254,43 +253,45 @@ var/list/organ_cache = list()
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 a623c0a0d0f..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)
@@ -702,7 +702,7 @@ Note that amputating the affected organ does in fact remove the infection from t
"Your [src.name] explodes!",\
"You hear an explosion!")
explosion(get_turf(owner),-1,-1,2,3)
- var/datum/effect/system/spark_spread/spark_system = new /datum/effect/system/spark_spread()
+ var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread()
spark_system.set_up(5, 0, victim)
spark_system.attach(owner)
spark_system.start()
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index 2446db5a3f3..cefc03f5a1c 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -267,35 +267,6 @@
H.adjustFireLoss(-cursed_heart.heal_burn)
H.adjustOxyLoss(-cursed_heart.heal_oxy)
-/obj/item/organ/internal/lungs
- name = "lungs"
- icon_state = "lungs"
- gender = PLURAL
- organ_tag = "lungs"
- parent_organ = "chest"
- slot = "lungs"
- vital = 1
-
-//Insert something neat here.
-///obj/item/organ/internal/lungs/remove(mob/living/carbon/M, special = 0)
-// owner.losebreath += 10
- //insert oxy damage extream here.
-// . = ..()
-
-
-/obj/item/organ/internal/lungs/on_life()
- if(germ_level > INFECTION_LEVEL_ONE)
- if(prob(5))
- owner.emote("cough") //respitory tract infection
-
- if(is_bruised())
- if(prob(2))
- owner.custom_emote(1, "coughs up blood!")
- owner.bleed(1)
- if(prob(4))
- owner.custom_emote(1, "gasps for air!")
- owner.AdjustLoseBreath(5)
-
/obj/item/organ/internal/kidneys
name = "kidneys"
icon_state = "kidneys"
@@ -326,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.
@@ -341,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)
..()
@@ -430,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 6e1e6662d0a..8560d2408ec 100644
--- a/code/modules/surgery/organs/subtypes/drask.dm
+++ b/code/modules/surgery/organs/subtypes/drask.dm
@@ -12,13 +12,10 @@
parent_organ = "head"
species = "Drask"
-/obj/item/organ/internal/lungs/drask
- icon = 'icons/obj/surgery_drask.dmi'
- species = "Drask"
-
/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/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm
index f5d49f100d2..56da8f031e3 100644
--- a/code/modules/surgery/surgery.dm
+++ b/code/modules/surgery/surgery.dm
@@ -206,7 +206,7 @@
for(var/mob/living/carbon/human/H in view(2, E.loc))//germs from people
if(AStar(E.loc, H.loc, /turf/proc/Distance, 2, simulated_only = 0))
- if((!(NO_BREATH in H.mutations) || !(NO_BREATH in H.species.species_traits)) && !H.wear_mask) //wearing a mask helps preventing people from breathing cooties into open incisions
+ if((!(BREATHLESS in H.mutations) || !(NO_BREATHE in H.species.species_traits)) && !H.wear_mask) //wearing a mask helps preventing people from breathing cooties into open incisions
germs += H.germ_level * 0.25
for(var/obj/effect/decal/cleanable/M in view(2, E.loc))//germs from messes
diff --git a/code/modules/telesci/telepad.dm b/code/modules/telesci/telepad.dm
index f8a177e413d..3c3c9815836 100644
--- a/code/modules/telesci/telepad.dm
+++ b/code/modules/telesci/telepad.dm
@@ -157,7 +157,7 @@
/obj/item/weapon/rcs/emag_act(user as mob)
if(!emagged)
emagged = 1
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(5, 1, src)
s.start()
to_chat(user, " You emag the RCS. Activate it to toggle between modes.")
diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm
index 9caaee5187c..4034aab05df 100644
--- a/code/modules/telesci/telesci_computer.dm
+++ b/code/modules/telesci/telesci_computer.dm
@@ -148,7 +148,7 @@
/obj/machinery/computer/telescience/proc/sparks()
if(telepad)
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(5, 1, get_turf(telepad))
s.start()
else
@@ -206,7 +206,7 @@
// use a lot of power
use_power(power * 10)
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(5, 1, get_turf(telepad))
s.start()
@@ -217,7 +217,7 @@
temp_msg += "Data printed below."
var/sparks = get_turf(target)
- var/datum/effect/system/spark_spread/y = new /datum/effect/system/spark_spread
+ var/datum/effect_system/spark_spread/y = new /datum/effect_system/spark_spread
y.set_up(5, 1, sparks)
y.start()
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..fad9711bc42 100644
--- a/goon/browserassets/css/browserOutput.css
+++ b/goon/browserassets/css/browserOutput.css
@@ -32,6 +32,12 @@ a {color: #0000ff;}
a:visited {color: #ff00ff;}
a.popt {text-decoration: none;}
+/*****************************************
+*
+* CUSTOM FONTS
+*
+******************************************/
+@font-face { font-family: PxPlus IBM MDA; src: url('PxPlus_IBM_MDA.ttf'); }
/*****************************************
*
@@ -217,6 +223,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;}
@@ -301,6 +322,7 @@ h1.alert, h2.alert {color: #000000;}
.rose {color: #ff5050;}
.sans {font-family: 'Comic Sans MS', cursive, sans-serif;}
.wingdings {font-family: Wingdings, Webdings;}
+.ibm {font-family: 'PxPlus IBM MDA';}
.ancient {color: #008B8B; font-stye: italic;}
.newscaster {color: #800000;}
.mod {color: #735638; font-weight: bold;}
@@ -382,4 +404,4 @@ h1.alert, h2.alert {color: #000000;}
/* ADMIN TICKETS */
-.adminticket {color: #3daf21; font-weight: bold}
\ No newline at end of file
+.adminticket {color: #3daf21; font-weight: bold}
diff --git a/goon/browserassets/css/fonts/LICENSE b/goon/browserassets/css/fonts/LICENSE
new file mode 100644
index 00000000000..c44326a8232
--- /dev/null
+++ b/goon/browserassets/css/fonts/LICENSE
@@ -0,0 +1,11 @@
+PxPlus IBM MDA Font (c) by VileR
+
+email - viler/ΑΤ/int10h/DΟТ/org
+www - http://int10h.org
+blog - http://8088mph.blogspot.com
+
+PxPlus IBM MDA Font is licensed under a
+Creative Commons Attribution-ShareAlike 4.0 International License.
+
+You should have received a copy of the license along with this
+work. If not, see .
\ No newline at end of file
diff --git a/goon/browserassets/css/fonts/PxPlus_IBM_MDA.ttf b/goon/browserassets/css/fonts/PxPlus_IBM_MDA.ttf
new file mode 100644
index 00000000000..db3b7b20ab6
Binary files /dev/null and b/goon/browserassets/css/fonts/PxPlus_IBM_MDA.ttf differ
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 @@