diff --git a/baystation12.dme b/baystation12.dme
index 821d43b85ec..0d083ef85af 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -1101,6 +1101,7 @@
#include "code\WorkInProgress\Tastyfish\Eliza.dm"
#include "code\WorkInProgress\Tastyfish\Eliza_Data.dm"
#include "code\WorkInProgress\Tastyfish\livestock.dm"
+#include "code\WorkInProgress\Tastyfish\mainspipe.dm"
#include "code\WorkInProgress\Tastyfish\paiLiza.dm"
#include "code\WorkInProgress\Tastyfish\Parser.dm"
#include "code\WorkInProgress\Tastyfish\wallmount_frame.dm"
diff --git a/code/ATMOSPHERICS/pipes.dm b/code/ATMOSPHERICS/pipes.dm
index 3202630eb2e..da136715a58 100644
--- a/code/ATMOSPHERICS/pipes.dm
+++ b/code/ATMOSPHERICS/pipes.dm
@@ -1004,6 +1004,93 @@ obj/machinery/atmospherics/pipe
level = 1
icon_state = "manifold4w-f"
+ cap
+ name = "pipe endcap"
+ desc = "An endcap for pipes"
+ icon = 'pipes.dmi'
+ icon_state = "cap"
+ level = 2
+
+ volume = 35
+
+ dir = SOUTH
+ initialize_directions = SOUTH
+
+ var/obj/machinery/atmospherics/node
+
+ hide(var/i)
+ if(level == 1 && istype(loc, /turf/simulated))
+ invisibility = i ? 101 : 0
+ update_icon()
+
+ pipeline_expansion()
+ return list(node)
+
+ process()
+ if(!parent)
+ ..()
+ else
+ machines.Remove(src)
+/*
+ if(!node1)
+ parent.mingle_with_turf(loc, 70)
+ if(!nodealert)
+ //world << "Missing node from [src] at [src.x],[src.y],[src.z]"
+ nodealert = 1
+ else if(!node2)
+ parent.mingle_with_turf(loc, 70)
+ if(!nodealert)
+ //world << "Missing node from [src] at [src.x],[src.y],[src.z]"
+ nodealert = 1
+ else if(!node3)
+ parent.mingle_with_turf(loc, 70)
+ if(!nodealert)
+ //world << "Missing node from [src] at [src.x],[src.y],[src.z]"
+ nodealert = 1
+ else if (nodealert)
+ nodealert = 0
+*/
+ Del()
+ if(node)
+ node.disconnect(src)
+
+ ..()
+
+ disconnect(obj/machinery/atmospherics/reference)
+ if(reference == node)
+ if(istype(node, /obj/machinery/atmospherics/pipe))
+ del(parent)
+ node = null
+
+ update_icon()
+
+ ..()
+
+ update_icon()
+ overlays = new()
+
+ icon_state = "cap[invisibility ? "-f" : ""]"
+ return
+
+ initialize()
+ for(var/obj/machinery/atmospherics/target in get_step(src, dir))
+ if(target.initialize_directions & get_dir(target,src))
+ node = target
+ break
+
+ var/turf/T = src.loc // hide if turf is not intact
+ hide(T.intact)
+ //update_icon()
+ update_icon()
+
+ visible
+ level = 2
+ icon_state = "cap"
+
+ hidden
+ level = 1
+ icon_state = "cap-f"
+
obj/machinery/atmospherics/pipe/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
if (istype(src, /obj/machinery/atmospherics/pipe/tank))
return ..()
diff --git a/code/WorkInProgress/Tastyfish/mainspipe.dm b/code/WorkInProgress/Tastyfish/mainspipe.dm
new file mode 100644
index 00000000000..4ef8edbe38a
--- /dev/null
+++ b/code/WorkInProgress/Tastyfish/mainspipe.dm
@@ -0,0 +1,703 @@
+// internal pipe, don't actually place or use these
+obj/machinery/atmospherics/pipe/mains_component
+ var/obj/machinery/atmospherics/mains_pipe/parent_pipe
+ var/list/obj/machinery/atmospherics/pipe/mains_component/nodes = new()
+
+ New(loc)
+ ..(loc)
+ parent_pipe = loc
+
+ check_pressure(pressure)
+ var/datum/gas_mixture/environment = loc.loc.return_air()
+
+ var/pressure_difference = pressure - environment.return_pressure()
+
+ if(pressure_difference > parent_pipe.maximum_pressure)
+ mains_burst()
+
+ else if(pressure_difference > parent_pipe.fatigue_pressure)
+ //TODO: leak to turf, doing pfshhhhh
+ if(prob(5))
+ mains_burst()
+
+ else return 1
+
+ pipeline_expansion()
+ return nodes
+
+ disconnect(obj/machinery/atmospherics/reference)
+ if(nodes.Find(reference))
+ nodes.Remove(reference)
+
+ proc/mains_burst()
+ parent_pipe.burst()
+
+obj/machinery/atmospherics/mains_pipe
+ icon = 'mainspipe.dmi'
+ layer = 2.4 //under wires with their 2.5
+
+ var/volume = 0
+ var/force = 20
+
+ var/alert_pressure = 80*ONE_ATMOSPHERE
+
+ var/initialize_mains_directions = 0
+
+ var/list/obj/machinery/atmospherics/mains_pipe/nodes = new()
+ var/obj/machinery/atmospherics/pipe/mains_component/supply
+ var/obj/machinery/atmospherics/pipe/mains_component/scrubbers
+ var/obj/machinery/atmospherics/pipe/mains_component/aux
+
+ var/minimum_temperature_difference = 300
+ var/thermal_conductivity = 0 //WALL_HEAT_TRANSFER_COEFFICIENT No
+
+ var/maximum_pressure = 70*ONE_ATMOSPHERE
+ var/fatigue_pressure = 55*ONE_ATMOSPHERE
+ alert_pressure = 55*ONE_ATMOSPHERE
+
+ New()
+ ..()
+
+ supply = new(src)
+ supply.volume = volume
+ supply.nodes.len = nodes.len
+ scrubbers = new(src)
+ scrubbers.volume = volume
+ scrubbers.nodes.len = nodes.len
+ aux = new(src)
+ aux.volume = volume
+ aux.nodes.len = nodes.len
+
+ hide(var/i)
+ if(level == 1 && istype(loc, /turf/simulated))
+ invisibility = i ? 101 : 0
+ update_icon()
+
+ proc/burst()
+ ..()
+ for(var/obj/machinery/atmospherics/pipe/mains_component/pipe in contents)
+ burst()
+
+ proc/check_pressure(pressure)
+ var/datum/gas_mixture/environment = loc.return_air()
+
+ var/pressure_difference = pressure - environment.return_pressure()
+
+ if(pressure_difference > maximum_pressure)
+ burst()
+
+ else if(pressure_difference > fatigue_pressure)
+ //TODO: leak to turf, doing pfshhhhh
+ if(prob(5))
+ burst()
+
+ else return 1
+
+ disconnect()
+ ..()
+ for(var/obj/machinery/atmospherics/pipe/mains_component/node in nodes)
+ node.disconnect()
+
+ Del()
+ disconnect()
+ ..()
+
+ initialize()
+ for(var/i = 1 to nodes.len)
+ var/obj/machinery/atmospherics/mains_pipe/node = nodes[i]
+ if(node)
+ supply.nodes[i] = node.supply
+ scrubbers.nodes[i] = node.scrubbers
+ aux.nodes[i] = node.aux
+
+obj/machinery/atmospherics/mains_pipe/simple
+ name = "mains pipe"
+ desc = "A one meter section of 3-line mains pipe"
+
+ dir = SOUTH
+ initialize_mains_directions = SOUTH|NORTH
+
+ New()
+ nodes.len = 2
+ ..()
+ switch(dir)
+ if(SOUTH || NORTH)
+ initialize_mains_directions = SOUTH|NORTH
+ if(EAST || WEST)
+ initialize_mains_directions = EAST|WEST
+ if(NORTHEAST)
+ initialize_mains_directions = NORTH|EAST
+ if(NORTHWEST)
+ initialize_mains_directions = NORTH|WEST
+ if(SOUTHEAST)
+ initialize_mains_directions = SOUTH|EAST
+ if(SOUTHWEST)
+ initialize_mains_directions = SOUTH|WEST
+
+ proc/normalize_dir()
+ if(dir==3)
+ dir = 1
+ else if(dir==12)
+ dir = 4
+
+ update_icon()
+ if(nodes[1] && nodes[2])
+ icon_state = "intact[invisibility ? "-f" : "" ]"
+
+ //var/node1_direction = get_dir(src, node1)
+ //var/node2_direction = get_dir(src, node2)
+
+ //dir = node1_direction|node2_direction
+
+ else
+ if(!nodes[1]&&!nodes[2])
+ del(src) //TODO: silent deleting looks weird
+ var/have_node1 = nodes[1]?1:0
+ var/have_node2 = nodes[2]?1:0
+ icon_state = "exposed[have_node1][have_node2][invisibility ? "-f" : "" ]"
+
+ initialize()
+ normalize_dir()
+ var/node1_dir
+ var/node2_dir
+
+ for(var/direction in cardinal)
+ if(direction&initialize_mains_directions)
+ if (!node1_dir)
+ node1_dir = direction
+ else if (!node2_dir)
+ node2_dir = direction
+
+ for(var/obj/machinery/atmospherics/mains_pipe/target in get_step(src,node1_dir))
+ if(target.initialize_mains_directions & get_dir(target,src))
+ nodes[1] = target
+ break
+ for(var/obj/machinery/atmospherics/mains_pipe/target in get_step(src,node2_dir))
+ if(target.initialize_mains_directions & get_dir(target,src))
+ nodes[2] = target
+ break
+
+ ..() // initialize internal pipes
+
+ var/turf/T = src.loc // hide if turf is not intact
+ hide(T.intact)
+ update_icon()
+
+ hidden
+ level = 1
+ icon_state = "intact-f"
+
+ visible
+ level = 2
+ icon_state = "intact"
+
+obj/machinery/atmospherics/mains_pipe/manifold
+ name = "manifold pipe"
+ desc = "A manifold composed of mains pipes"
+
+ dir = SOUTH
+ initialize_mains_directions = EAST|NORTH|WEST
+ volume = 105
+
+ New()
+ nodes.len = 3
+ ..()
+ initialize_mains_directions = (NORTH|SOUTH|EAST|WEST) & ~dir
+
+ initialize()
+ var/connect_directions = initialize_mains_directions
+
+ for(var/direction in cardinal)
+ if(direction&connect_directions)
+ for(var/obj/machinery/atmospherics/mains_pipe/target in get_step(src,direction))
+ if(target.initialize_mains_directions & get_dir(target,src))
+ nodes[1] = target
+ connect_directions &= ~direction
+ break
+ if (nodes[1])
+ break
+
+
+ for(var/direction in cardinal)
+ if(direction&connect_directions)
+ for(var/obj/machinery/atmospherics/mains_pipe/target in get_step(src,direction))
+ if(target.initialize_mains_directions & get_dir(target,src))
+ nodes[2] = target
+ connect_directions &= ~direction
+ break
+ if (nodes[2])
+ break
+
+
+ for(var/direction in cardinal)
+ if(direction&connect_directions)
+ for(var/obj/machinery/atmospherics/mains_pipe/target in get_step(src,direction))
+ if(target.initialize_mains_directions & get_dir(target,src))
+ nodes[3] = target
+ connect_directions &= ~direction
+ break
+ if (nodes[3])
+ break
+
+ ..() // initialize internal pipes
+
+ var/turf/T = src.loc // hide if turf is not intact
+ hide(T.intact)
+ update_icon()
+
+ update_icon()
+ icon_state = "manifold[invisibility ? "-f" : "" ]"
+
+ hidden
+ level = 1
+ icon_state = "manifold-f"
+
+ visible
+ level = 2
+ icon_state = "manifold"
+
+obj/machinery/atmospherics/mains_pipe/manifold4w
+ name = "manifold pipe"
+ desc = "A manifold composed of mains pipes"
+
+ dir = SOUTH
+ initialize_mains_directions = EAST|NORTH|WEST|SOUTH
+ volume = 105
+
+ New()
+ nodes.len = 4
+ ..()
+
+ initialize()
+ for(var/obj/machinery/atmospherics/mains_pipe/target in get_step(src,NORTH))
+ if(target.initialize_mains_directions & get_dir(target,src))
+ nodes[1] = target
+ break
+
+ for(var/obj/machinery/atmospherics/mains_pipe/target in get_step(src,SOUTH))
+ if(target.initialize_mains_directions & get_dir(target,src))
+ nodes[2] = target
+ break
+
+ for(var/obj/machinery/atmospherics/mains_pipe/target in get_step(src,EAST))
+ if(target.initialize_mains_directions & get_dir(target,src))
+ nodes[3] = target
+ break
+
+ for(var/obj/machinery/atmospherics/mains_pipe/target in get_step(src,WEST))
+ if(target.initialize_mains_directions & get_dir(target,src))
+ nodes[3] = target
+ break
+
+ ..() // initialize internal pipes
+
+ var/turf/T = src.loc // hide if turf is not intact
+ hide(T.intact)
+ update_icon()
+
+ update_icon()
+ icon_state = "manifold4w[invisibility ? "-f" : "" ]"
+
+ hidden
+ level = 1
+ icon_state = "manifold4w-f"
+
+ visible
+ level = 2
+ icon_state = "manifold4w"
+
+obj/machinery/atmospherics/mains_pipe/split
+ name = "mains splitter"
+ desc = "A splitter for connecting to a single pipe off a mains."
+
+ var/obj/machinery/atmospherics/pipe/mains_component/split_node
+ var/obj/machinery/atmospherics/node3
+ var/icon_type
+
+ New()
+ nodes.len = 2
+ ..()
+ initialize_mains_directions = turn(dir, 90) | turn(dir, -90)
+ initialize_directions = dir // actually have a normal connection too
+
+ initialize()
+ var/node1_dir
+ var/node2_dir
+ var/node3_dir
+
+ node1_dir = turn(dir, 90)
+ node2_dir = turn(dir, -90)
+ node3_dir = dir
+
+ for(var/obj/machinery/atmospherics/mains_pipe/target in get_step(src,node1_dir))
+ if(target.initialize_mains_directions & get_dir(target,src))
+ nodes[1] = target
+ break
+ for(var/obj/machinery/atmospherics/mains_pipe/target in get_step(src,node2_dir))
+ if(target.initialize_mains_directions & get_dir(target,src))
+ nodes[2] = target
+ break
+ for(var/obj/machinery/atmospherics/target in get_step(src,node3_dir))
+ if(target.initialize_directions & get_dir(target,src))
+ node3 = target
+ break
+
+ ..() // initialize internal pipes
+
+ // bind them
+ spawn(5)
+ if(node3 && split_node)
+ var/datum/pipe_network/N1 = node3.return_network(src)
+ var/datum/pipe_network/N2 = split_node.return_network(split_node)
+ if(N1 && N2)
+ N1.merge(N2)
+
+ var/turf/T = src.loc // hide if turf is not intact
+ hide(T.intact)
+ update_icon()
+
+ update_icon()
+ icon_state = "split-[icon_type][invisibility ? "-f" : "" ]"
+
+ return_network(A)
+ return split_node.return_network(A)
+
+ supply
+ icon_type = "supply"
+
+ New()
+ ..()
+ split_node = supply
+
+ hidden
+ level = 1
+ icon_state = "split-supply-f"
+
+ visible
+ level = 2
+ icon_state = "split-supply"
+
+ scrubbers
+ icon_type = "scrubbers"
+
+ New()
+ ..()
+ split_node = scrubbers
+
+ hidden
+ level = 1
+ icon_state = "split-scrubbers-f"
+
+ visible
+ level = 2
+ icon_state = "split-scrubbers"
+
+ aux
+ icon_type = "aux"
+
+ New()
+ ..()
+ split_node = aux
+
+ hidden
+ level = 1
+ icon_state = "split-aux-f"
+
+ visible
+ level = 2
+ icon_state = "split-aux"
+
+obj/machinery/atmospherics/mains_pipe/split3
+ name = "triple mains splitter"
+ desc = "A splitter for connecting to the 3 pipes on a mainline."
+
+ var/obj/machinery/atmospherics/supply_node
+ var/obj/machinery/atmospherics/scrubbers_node
+ var/obj/machinery/atmospherics/aux_node
+
+ New()
+ nodes.len = 1
+ ..()
+ initialize_mains_directions = dir
+ initialize_directions = cardinal & ~dir // actually have a normal connection too
+
+ initialize()
+ var/node1_dir
+ var/supply_node_dir
+ var/scrubbers_node_dir
+ var/aux_node_dir
+
+ node1_dir = dir
+ aux_node_dir = turn(dir, 180)
+ if(dir & (NORTH|SOUTH))
+ supply_node_dir = EAST
+ scrubbers_node_dir = WEST
+ else
+ supply_node_dir = SOUTH
+ scrubbers_node_dir = NORTH
+
+ for(var/obj/machinery/atmospherics/mains_pipe/target in get_step(src, node1_dir))
+ if(target.initialize_mains_directions & get_dir(target,src))
+ nodes[1] = target
+ break
+ for(var/obj/machinery/atmospherics/target in get_step(src,supply_node_dir))
+ if(target.initialize_directions & get_dir(target,src))
+ supply_node = target
+ break
+ for(var/obj/machinery/atmospherics/target in get_step(src,scrubbers_node_dir))
+ if(target.initialize_directions & get_dir(target,src))
+ scrubbers_node = target
+ break
+ for(var/obj/machinery/atmospherics/target in get_step(src,aux_node_dir))
+ if(target.initialize_directions & get_dir(target,src))
+ aux_node = target
+ break
+
+ ..() // initialize internal pipes
+
+ // bind them
+ spawn(5)
+ if(supply_node)
+ var/datum/pipe_network/N1 = supply_node.return_network(src)
+ var/datum/pipe_network/N2 = supply.return_network(supply)
+ if(N1 && N2)
+ N1.merge(N2)
+ if(scrubbers_node)
+ var/datum/pipe_network/N1 = scrubbers_node.return_network(src)
+ var/datum/pipe_network/N2 = scrubbers.return_network(scrubbers)
+ if(N1 && N2)
+ N1.merge(N2)
+ if(aux_node)
+ var/datum/pipe_network/N1 = aux_node.return_network(src)
+ var/datum/pipe_network/N2 = aux.return_network(aux)
+ if(N1 && N2)
+ N1.merge(N2)
+
+ var/turf/T = src.loc // hide if turf is not intact
+ hide(T.intact)
+ update_icon()
+
+ update_icon()
+ icon_state = "split-t[invisibility ? "-f" : "" ]"
+
+ return_network(obj/machinery/atmospherics/reference)
+ var/obj/machinery/atmospherics/A
+
+ A = supply_node.return_network(reference)
+ if(!A)
+ A = scrubbers_node.return_network(reference)
+ if(!A)
+ A = aux_node.return_network(reference)
+
+ return A
+
+ hidden
+ level = 1
+ icon_state = "split-t-f"
+
+ visible
+ level = 2
+ icon_state = "split-t"
+
+obj/machinery/atmospherics/mains_pipe/cap
+ name = "pipe cap"
+ desc = "A cap for the end of a mains pipe"
+
+ dir = SOUTH
+ initialize_directions = SOUTH
+ volume = 35
+
+ New()
+ nodes.len = 1
+ ..()
+ initialize_mains_directions = dir
+
+ update_icon()
+ icon_state = "cap[invisibility ? "-f" : ""]"
+
+ initialize()
+ for(var/obj/machinery/atmospherics/mains_pipe/target in get_step(src,dir))
+ if(target.initialize_mains_directions & get_dir(target,src))
+ nodes[1] = target
+ break
+
+ ..()
+
+ var/turf/T = src.loc // hide if turf is not intact
+ hide(T.intact)
+ update_icon()
+
+ hidden
+ level = 1
+ icon_state = "cap-f"
+
+ visible
+ level = 2
+ icon_state = "cap"
+
+obj/machinery/atmospherics/mains_pipe/valve
+ icon_state = "mvalve0"
+
+ name = "mains shutoff valve"
+ desc = "A mains pipe valve"
+
+ var/open = 1
+
+ dir = SOUTH
+ initialize_mains_directions = SOUTH|NORTH
+
+ New()
+ nodes.len = 2
+ ..()
+ initialize_mains_directions = dir | turn(dir, 180)
+
+ update_icon(animation)
+ var/turf/simulated/floor = loc
+ var/hide = istype(floor) ? floor.intact : 0
+ level = 1
+ for(var/obj/machinery/atmospherics/mains_pipe/node in nodes)
+ if(node.level == 2)
+ hide = 0
+ level = 2
+ break
+
+ if(animation)
+ flick("[hide?"h":""]mvalve[src.open][!src.open]",src)
+ else
+ icon_state = "[hide?"h":""]mvalve[open]"
+
+ initialize()
+ normalize_dir()
+ var/node1_dir
+ var/node2_dir
+
+ for(var/direction in cardinal)
+ if(direction&initialize_mains_directions)
+ if (!node1_dir)
+ node1_dir = direction
+ else if (!node2_dir)
+ node2_dir = direction
+
+ for(var/obj/machinery/atmospherics/mains_pipe/target in get_step(src,node1_dir))
+ if(target.initialize_mains_directions & get_dir(target,src))
+ nodes[1] = target
+ break
+ for(var/obj/machinery/atmospherics/mains_pipe/target in get_step(src,node2_dir))
+ if(target.initialize_mains_directions & get_dir(target,src))
+ nodes[2] = target
+ break
+
+ if(open)
+ ..() // initialize internal pipes
+
+ update_icon()
+
+ proc/normalize_dir()
+ if(dir==3)
+ dir = 1
+ else if(dir==12)
+ dir = 4
+
+ proc/open()
+ if(open) return 0
+
+ open = 1
+ update_icon()
+
+ initialize()
+
+ return 1
+
+ proc/close()
+ if(!open) return 0
+
+ open = 0
+ update_icon()
+
+ for(var/obj/machinery/atmospherics/pipe/mains_component/node in src)
+ for(var/obj/machinery/atmospherics/pipe/mains_component/o in node.nodes)
+ o.disconnect(node)
+ o.build_network()
+
+ return 1
+
+ attack_ai(mob/user as mob)
+ return
+
+ attack_paw(mob/user as mob)
+ return attack_hand(user)
+
+ attack_hand(mob/user as mob)
+ src.add_fingerprint(usr)
+ update_icon(1)
+ sleep(10)
+ if (open)
+ close()
+ else
+ open()
+
+ digital // can be controlled by AI
+ name = "digital mains valve"
+ desc = "A digitally controlled valve."
+ icon_state = "dvalve0"
+
+ attack_ai(mob/user as mob)
+ return src.attack_hand(user)
+
+ attack_hand(mob/user as mob)
+ if(!src.allowed(user))
+ user << "\red Access denied."
+ return
+ ..()
+
+ //Radio remote control
+
+ proc
+ set_frequency(new_frequency)
+ radio_controller.remove_object(src, frequency)
+ frequency = new_frequency
+ if(frequency)
+ radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA)
+
+ var/frequency = 0
+ var/id = null
+ var/datum/radio_frequency/radio_connection
+
+ initialize()
+ ..()
+ if(frequency)
+ set_frequency(frequency)
+
+ update_icon(animation)
+ var/turf/simulated/floor = loc
+ var/hide = istype(floor) ? floor.intact : 0
+ level = 1
+ for(var/obj/machinery/atmospherics/mains_pipe/node in nodes)
+ if(node.level == 2)
+ hide = 0
+ level = 2
+ break
+
+ if(animation)
+ flick("[hide?"h":""]dvalve[src.open][!src.open]",src)
+ else
+ icon_state = "[hide?"h":""]dvalve[open]"
+
+ receive_signal(datum/signal/signal)
+ if(!signal.data["tag"] || (signal.data["tag"] != id))
+ return 0
+
+ switch(signal.data["command"])
+ if("valve_open")
+ if(!open)
+ open()
+
+ if("valve_close")
+ if(open)
+ close()
+
+ if("valve_toggle")
+ if(open)
+ close()
+ else
+ open()
\ No newline at end of file
diff --git a/code/defines/obj/storage.dm b/code/defines/obj/storage.dm
index 64f29f8f8c9..0b704541a82 100644
--- a/code/defines/obj/storage.dm
+++ b/code/defines/obj/storage.dm
@@ -327,14 +327,15 @@
var/selfdamage = 0
- afterattack(atom/target as mob|obj|turf|area, mob/user as mob)
- if(contents.len && prob(10))
- // have a chance to swing open
- user.visible_message("\red \The [src] swings wide open and its contents are scattered on the floor!")
- for(var/obj/O in contents)
- O.loc = user.loc
- if(prob(50)) step_rand(O)
- ..()
+/obj/item/weapon/storage/toolbox/afterattack(atom/target as mob|obj|turf|area, mob/user as mob)
+ if(contents.len && istype(user.loc, /turf) && prob(10))
+ // have a chance to swing open
+ user.visible_message("\red \The [src] swings wide open and its contents are scattered on the floor!")
+ for(var/obj/O in contents)
+ O.loc = user.loc
+ O.layer = OBJ_LAYER
+ if(prob(50)) step_rand(O)
+ ..()
/obj/item/weapon/storage/toolbox/emergency
name = "emergency toolbox"
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index 80bf54dd913..e85363a5cbc 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -243,7 +243,7 @@
name = "energy blade"
desc = "A concentrated beam of energy in the shape of a blade. Very stylish... and lethal."
icon_state = "blade"
- force = 70.0//Normal attacks deal very high damage.
+ force = 40.0//Normal attacks deal very high damage.
throwforce = 1//Throwing or dropping the item deletes it.
throw_speed = 1
throw_range = 1
diff --git a/code/game/objects/items/item.dm b/code/game/objects/items/item.dm
index 6abd5f12319..621352351c4 100755
--- a/code/game/objects/items/item.dm
+++ b/code/game/objects/items/item.dm
@@ -269,6 +269,12 @@ mob/proc/flash_weak_pain()
/////////////////////////
var/power = src.force
+
+ // EXPERIMENTAL: scale power and time to the weight class
+ if(w_class >= 4.0)
+ power = power * 2
+ user.next_move = max(user.next_move, world.time + 20)
+
if(!istype(M, /mob/living/carbon/human))
if(istype(M, /mob/living/carbon/metroid))
var/mob/living/carbon/metroid/Metroid = M
diff --git a/code/modules/chemical/Chemistry-Reagents.dm b/code/modules/chemical/Chemistry-Reagents.dm
index 71816dd4903..4e4d505766a 100644
--- a/code/modules/chemical/Chemistry-Reagents.dm
+++ b/code/modules/chemical/Chemistry-Reagents.dm
@@ -2657,23 +2657,30 @@ datum
pass_out = 290 //amount absorbed after which mob starts passing out
on_mob_life(var/mob/living/M as mob)
- if(!data) data = 1
- data++
+ if(!src.data) data = 1
+ src.data++
+
+ var/d = data
+
+ // make all the beverages work together
+ for(var/datum/reagent/alcohol/A in holder.reagent_list)
+ if(A.data) d += A.data
+
M.dizziness +=dizzy_adj.
- if(data >= slur_start && data < confused_start)
+ if(d >= slur_start && d < confused_start)
if (!M:slurring) M:slurring = 1
M:slurring += slurr_adj
- if(data >= confused_start && prob(33))
+ if(d >= confused_start && prob(33))
if (!M:confused) M:confused = 1
M.confused = max(M:confused+confused_adj,0)
- if(data >= blur_start)
+ if(d >= blur_start)
M.eye_blurry = max(M.eye_blurry, 10)
M:drowsyness = max(M:drowsyness, 0)
- if(data >= pass_out)
+ if(d >= pass_out)
M:paralysis = max(M:paralysis, 20)
M:drowsyness = max(M:drowsyness, 30)
- holder.remove_reagent(src.id, 0.2)
+ holder.remove_reagent(src.id, 0.4)
..()
return
@@ -2768,6 +2775,303 @@ datum
id = "ale"
description = "A dark alchoholic beverage made by malted barley and yeast."
color = "#664300" // rgb: 102, 67, 0
+
+
+/////////////////////////////////////////////////////////////////cocktail entities//////////////////////////////////////////////
+
+ bilk
+ name = "Bilk"
+ id = "bilk"
+ description = "This appears to be beer mixed with milk. Disgusting."
+ reagent_state = LIQUID
+ color = "#895C4C" // rgb: 137, 92, 76
+
+ atomicbomb
+ name = "Atomic Bomb"
+ id = "atomicbomb"
+ description = "Nuclear proliferation never tasted so good."
+ reagent_state = LIQUID
+ color = "#666300" // rgb: 102, 99, 0
+
+ threemileisland
+ name = "THree Mile Island Iced Tea"
+ id = "threemileisland"
+ description = "Made for a woman, strong enough for a man."
+ reagent_state = LIQUID
+ color = "#666340" // rgb: 102, 99, 64
+
+ goldschlager
+ name = "Goldschlager"
+ id = "goldschlager"
+ description = "100 proof cinnamon schnapps, made for alcoholic teen girls on spring break."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+ patron
+ name = "Patron"
+ id = "patron"
+ description = "Tequila with silver in it, a favorite of alcoholic women in the club scene."
+ reagent_state = LIQUID
+ color = "#585840" // rgb: 88, 88, 64
+
+ gintonic
+ name = "Gin and Tonic"
+ id = "gintonic"
+ description = "An all time classic, mild cocktail."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+ cuba_libre
+ name = "Cuba Libre"
+ id = "cubalibre"
+ description = "Rum, mixed with cola. Viva la revolution."
+ reagent_state = LIQUID
+ color = "#3E1B00" // rgb: 62, 27, 0
+
+ whiskey_cola
+ name = "Whiskey Cola"
+ id = "whiskeycola"
+ description = "Whiskey, mixed with cola. Surprisingly refreshing."
+ reagent_state = LIQUID
+ color = "#3E1B00" // rgb: 62, 27, 0
+
+ martini
+ name = "Classic Martini"
+ id = "martini"
+ description = "Vermouth with Gin. Not quite how 007 enjoyed it, but still delicious."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+ vodkamartini
+ name = "Vodka Martini"
+ id = "vodkamartini"
+ description = "Vodka with Gin. Not quite how 007 enjoyed it, but still delicious."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+ white_russian
+ name = "White Russian"
+ id = "whiterussian"
+ description = "That's just, like, your opinion, man..."
+ reagent_state = LIQUID
+ color = "#A68340" // rgb: 166, 131, 64
+
+ screwdrivercocktail
+ name = "Screwdriver"
+ id = "screwdrivercocktail"
+ description = "Vodka, mixed with plain ol' orange juice. The result is surprisingly delicious."
+ reagent_state = LIQUID
+ color = "#A68310" // rgb: 166, 131, 16
+
+ booger
+ name = "Booger"
+ id = "booger"
+ description = "Ewww..."
+ reagent_state = LIQUID
+ color = "#A68310" // rgb: 166, 131, 16
+
+ bloody_mary
+ name = "Bloody Mary"
+ id = "bloodymary"
+ description = "A strange yet pleasurable mixture made of vodka, tomato and lime juice. Or at least you THINK the red stuff is tomato juice."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+ gargle_blaster
+ name = "Pan-Galactic Gargle Blaster"
+ id = "gargleblaster"
+ description = "Whoah, this stuff looks volatile!"
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+ brave_bull
+ name = "Brave Bull"
+ id = "bravebull"
+ description = "A strange yet pleasurable mixture made of vodka, tomato and lime juice. Or at least you THINK the red stuff is tomato juice."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+ tequilla_sunrise
+ name = "Tequilla Sunrise"
+ id = "tequillasunrise"
+ description = "Tequilla and orange juice. Much like a Screwdriver, only Mexican~"
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+ toxins_special
+ name = "Toxins Special"
+ id = "toxinsspecial"
+ description = "This thing is FLAMING!. CALL THE DAMN SHUTTLE!"
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+ beepsky_smash
+ name = "Beepsky Smash"
+ id = "beepskysmash"
+ description = "Deny drinking this and prepare for THE LAW."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+ doctor_delight
+ name = "The Doctor's Delight"
+ id = "doctorsdelight"
+ description = "A gulp a day keeps the MediBot away. That's probably for the best."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+ on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ if(M:getOxyLoss() && prob(50)) M:adjustOxyLoss(-2)
+ if(M:getBruteLoss() && prob(60)) M:heal_organ_damage(2,0)
+ if(M:getFireLoss() && prob(50)) M:heal_organ_damage(0,2)
+ if(M:getToxLoss() && prob(50)) M:adjustToxLoss(-2)
+ if(M.dizziness !=0) M.dizziness = max(0,M.dizziness-15)
+ if(M.confused !=0) M.confused = max(0,M.confused - 5)
+ ..()
+ return
+
+ irish_cream
+ name = "Irish Cream"
+ id = "irishcream"
+ description = "Whiskey-imbued cream, what else would you expect from the Irish."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+ manly_dorf
+ name = "The Manly Dorf"
+ id = "manlydorf"
+ description = "Beer and Ale, brought together in a delicious mix. Intended for true men only."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+ longislandicedtea
+ name = "Long Island Iced Tea"
+ id = "longislandicedtea"
+ description = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+ moonshine
+ name = "Moonshine"
+ id = "moonshine"
+ description = "You've really hit rock bottom now... your liver packed its bags and left last night."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+ b52
+ name = "B-52"
+ id = "b52"
+ description = "Coffee, Irish Cream, and congac. You will get bombed."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+ irishcoffee
+ name = "Irish Coffee"
+ id = "irishcoffee"
+ description = "Coffee, and alcohol. More fun than a Mimosa to drink in the morning."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+ margarita
+ name = "Margarita"
+ id = "margarita"
+ description = "On the rocks with salt on the rim. Arriba~!"
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+ black_russian
+ name = "Black Russian"
+ id = "blackrussian"
+ description = "For the lactose-intolerant. Still as classy as a White Russian."
+ reagent_state = LIQUID
+ color = "#360000" // rgb: 54, 0, 0
+
+ manhattan
+ name = "Manhattan"
+ id = "manhattan"
+ description = "The Detective's undercover drink of choice. He never could stomach gin..."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+ manhattan_proj
+ name = "Manhattan Project"
+ id = "manhattan_proj"
+ description = "A scienitst drink of choice, for thinking how to blow up the station."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+ whiskeysoda
+ name = "Whiskey Soda"
+ id = "whiskeysoda"
+ description = "Ultimate refreshment."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+ antifreeze
+ name = "Anti-freeze"
+ id = "antifreeze"
+ description = "Ultimate refreshment."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+ barefoot
+ name = "Barefoot"
+ id = "barefoot"
+ description = "Barefoot and pregnant"
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+ snowwhite
+ name = "Snow White"
+ id = "snowwhite"
+ description = "A cold refreshment"
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+ demonsblood
+ name = "Demons Blood"
+ id = "demonsblood"
+ description = "AHHHH!!!!"
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ dizzy_adj = 10
+ slurr_adj = 10
+
+ vodkatonic
+ name = "Vodka and Tonic"
+ id = "vodkatonic"
+ description = "For when a gin and tonic isn't russian enough."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ dizzy_adj = 4
+ slurr_adj = 3
+
+
+ ginfizz
+ name = "Gin Fizz"
+ id = "ginfizz"
+ description = "Refreshingly lemony, deliciously dry."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+ dizzy_adj = 4
+ slurr_adj = 3
+
+ bahama_mama
+ name = "Bahama mama"
+ id = "bahama_mama"
+ description = "Tropic cocktail."
+ reagent_state = LIQUID
+ color = "#664300" // rgb: 102, 67, 0
+
+ singulo
+ name = "Singulo"
+ id = "singulo"
+ description = "A blue-space beverage!"
+ reagent_state = LIQUID
+ color = "#2E6671" // rgb: 46, 102, 113
+ dizzy_adj = 15
+ slurr_adj = 15
+
//ALCHOHOL end
tonic
@@ -2833,800 +3137,6 @@ datum
..()
return
-/////////////////////////////////////////////////////////////////cocktail entities//////////////////////////////////////////////
-
- bilk
- name = "Bilk"
- id = "bilk"
- description = "This appears to be beer mixed with milk. Disgusting."
- reagent_state = LIQUID
- color = "#895C4C" // rgb: 137, 92, 76
-
- on_mob_life(var/mob/living/M as mob)
- if(M:getBruteLoss() && prob(10)) M:heal_organ_damage(1,0)
- M:nutrition += 2
- if(!data) data = 1
- data++
- M.make_dizzy(3)
- M:jitteriness = max(M:jitteriness-3,0)
- if(data >= 25)
- if (!M:slurring) M:slurring = 1
- M:slurring += 3
- if(data >= 40 && prob(33))
- if (!M:confused) M:confused = 1
- M:confused += 2
- holder.remove_reagent(src.id, 0.2)
- ..()
- return
-
- atomicbomb
- name = "Atomic Bomb"
- id = "atomicbomb"
- description = "Nuclear proliferation never tasted so good."
- reagent_state = LIQUID
- color = "#666300" // rgb: 102, 99, 0
-
- on_mob_life(var/mob/living/M as mob)
- M.druggy = max(M.druggy, 50)
- M.confused = max(M:confused+2,0)
- M.make_dizzy(10)
- if (!M.slurring) M.slurring = 1
- M.slurring += 3
- if(!data) data = 1
- data++
- switch(data)
- if(51 to INFINITY)
- M:sleeping += 1
- holder.remove_reagent(src.id, 0.2)
- ..()
- return
-
- threemileisland
- name = "THree Mile Island Iced Tea"
- id = "threemileisland"
- description = "Made for a woman, strong enough for a man."
- reagent_state = LIQUID
- color = "#666340" // rgb: 102, 99, 64
-
- on_mob_life(var/mob/living/M as mob)
- if(!data) data = 1
- data++
- M.dizziness +=3
- M.druggy = max(M.druggy, 50)
- if(data >= 35 && data <90)
- if (!M.slurring) M.slurring = 1
- M.slurring += 3
- else if(data >= 90)
- M.confused = max(M:confused+2,0)
- holder.remove_reagent(src.id, 0.2)
- ..()
- return
-
- goldschlager
- name = "Goldschlager"
- id = "goldschlager"
- description = "100 proof cinnamon schnapps, made for alcoholic teen girls on spring break."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- on_mob_life(var/mob/living/M as mob)
- if(!data) data = 1
- data++
- M.dizziness +=3
- if(data >= 45 && data <125)
- if (!M.slurring) M.slurring = 1
- M.slurring += 3
- else if(data >= 125 && prob(33))
- M.confused = max(M:confused+2,0)
- holder.remove_reagent(src.id, 0.2)
- ..()
- return
-
- patron
- name = "Patron"
- id = "patron"
- description = "Tequila with silver in it, a favorite of alcoholic women in the club scene."
- reagent_state = LIQUID
- color = "#585840" // rgb: 88, 88, 64
-
- on_mob_life(var/mob/living/M as mob)
- if(!data) data = 1
- data++
- M.dizziness +=3
- if(data >= 45 && data <125)
- if (!M.slurring) M.slurring = 1
- M.slurring += 3
- else if(data >= 125 && prob(33))
- M.confused = max(M:confused+2,0)
- holder.remove_reagent(src.id, 0.2)
- ..()
- return
-
- gintonic
- name = "Gin and Tonic"
- id = "gintonic"
- description = "An all time classic, mild cocktail."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- on_mob_life(var/mob/living/M as mob)
- if(!data) data = 1
- data++
- M.dizziness +=3
- if(data >= 45 && data <135)
- if (!M.slurring) M.slurring = 1
- M.slurring += 3
- else if(data >= 135 && prob(33))
- M.confused = max(M:confused+2,0)
- holder.remove_reagent(src.id, 0.2)
- ..()
- return
-
- cuba_libre
- name = "Cuba Libre"
- id = "cubalibre"
- description = "Rum, mixed with cola. Viva la revolution."
- reagent_state = LIQUID
- color = "#3E1B00" // rgb: 62, 27, 0
-
- on_mob_life(var/mob/living/M as mob)
- if(!data) data = 1
- data++
- M.dizziness +=3
- if(data >= 45 && data <135)
- if (!M.slurring) M.slurring = 1
- M.slurring += 3
- else if(data >= 135 && prob(33))
- M.confused = max(M:confused+2,0)
- holder.remove_reagent(src.id, 0.2)
- ..()
- return
-
- whiskey_cola
- name = "Whiskey Cola"
- id = "whiskeycola"
- description = "Whiskey, mixed with cola. Surprisingly refreshing."
- reagent_state = LIQUID
- color = "#3E1B00" // rgb: 62, 27, 0
-
- on_mob_life(var/mob/living/M as mob)
- if(!data) data = 1
- data++
- M.dizziness +=3
- if(data >= 55 && data <125)
- if (!M.slurring) M.slurring = 1
- M.slurring += 3
- else if(data >= 125 && prob(33))
- M.confused = max(M:confused+2,0)
- holder.remove_reagent(src.id, 0.2)
- ..()
- return
-
- martini
- name = "Classic Martini"
- id = "martini"
- description = "Vermouth with Gin. Not quite how 007 enjoyed it, but still delicious."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- on_mob_life(var/mob/living/M as mob)
- if(!data) data = 1
- data++
- M.dizziness +=3
- if(data >= 45 && data <165)
- if (!M.slurring) M.slurring = 1
- M.slurring += 3
- else if(data >= 135 && prob(33))
- M.confused = max(M:confused+2,0)
- holder.remove_reagent(src.id, 0.2)
- ..()
- return
-
- vodkamartini
- name = "Vodka Martini"
- id = "vodkamartini"
- description = "Vodka with Gin. Not quite how 007 enjoyed it, but still delicious."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- on_mob_life(var/mob/living/M as mob)
- if(!data) data = 1
- data++
- M.dizziness +=3
- if(data >= 45 && data <165)
- if (!M.slurring) M.slurring = 1
- M.slurring += 3
- else if(data >= 135 && prob(33))
- M.confused = max(M:confused+2,0)
- holder.remove_reagent(src.id, 0.2)
- ..()
- return
-
- white_russian
- name = "White Russian"
- id = "whiterussian"
- description = "That's just, like, your opinion, man..."
- reagent_state = LIQUID
- color = "#A68340" // rgb: 166, 131, 64
-
- on_mob_life(var/mob/living/M as mob)
- if(!data) data = 1
- data++
- M.dizziness +=3
- if(data >= 55 && data <165)
- if (!M.slurring) M.slurring = 1
- M.slurring += 3
- else if(data >= 165 && prob(33))
- M.confused = max(M:confused+2,0)
- holder.remove_reagent(src.id, 0.2)
- ..()
- return
-
- screwdrivercocktail
- name = "Screwdriver"
- id = "screwdrivercocktail"
- description = "Vodka, mixed with plain ol' orange juice. The result is surprisingly delicious."
- reagent_state = LIQUID
- color = "#A68310" // rgb: 166, 131, 16
-
- on_mob_life(var/mob/living/M as mob)
- if(!data) data = 1
- data++
- M.dizziness +=3
- if(data >= 55 && data <165)
- if (!M.slurring) M.slurring = 1
- M.slurring += 3
- else if(data >= 165 && prob(33))
- M.confused = max(M:confused+2,0)
- holder.remove_reagent(src.id, 0.2)
- ..()
- return
-
- booger
- name = "Booger"
- id = "booger"
- description = "Ewww..."
- reagent_state = LIQUID
- color = "#A68310" // rgb: 166, 131, 16
-
- on_mob_life(var/mob/living/M as mob)
- if(!data) data = 1
- data++
- M.dizziness +=4
- if(data >= 55 && data <165)
- if (!M.slurring) M.slurring = 1
- M.slurring += 4
- else if(data >= 165 && prob(33))
- M.confused = max(M:confused+4,0)
- holder.remove_reagent(src.id, 0.2)
- ..()
- return
-
- bloody_mary
- name = "Bloody Mary"
- id = "bloodymary"
- description = "A strange yet pleasurable mixture made of vodka, tomato and lime juice. Or at least you THINK the red stuff is tomato juice."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- on_mob_life(var/mob/living/M as mob)
- if(!data) data = 1
- data++
- M.dizziness +=3
- if(data >= 55 && data <165)
- if (!M.slurring) M.slurring = 1
- M.slurring += 3
- else if(data >= 165 && prob(33))
- M.confused = max(M:confused+2,0)
- holder.remove_reagent(src.id, 0.2)
- ..()
- return
-
- gargle_blaster
- name = "Pan-Galactic Gargle Blaster"
- id = "gargleblaster"
- description = "Whoah, this stuff looks volatile!"
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- on_mob_life(var/mob/living/M as mob)
- if(!data) data = 1
- data++
- M.dizziness +=6
- if(data >= 15 && data <45)
- if (!M.slurring) M.slurring = 1
- M.slurring += 3
- else if(data >= 45 && prob(50) && data <55)
- M.confused = max(M:confused+3,0)
- else if(data >=55)
- M.druggy = max(M.druggy, 55)
- holder.remove_reagent(src.id, 0.2)
- ..()
- return
-
- brave_bull
- name = "Brave Bull"
- id = "bravebull"
- description = "A strange yet pleasurable mixture made of vodka, tomato and lime juice. Or at least you THINK the red stuff is tomato juice."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- on_mob_life(var/mob/living/M as mob)
- if(!data) data = 1
- data++
- M.dizziness +=3
- if(data >= 45 && data <145)
- if (!M.slurring) M.slurring = 1
- M.slurring += 3
- else if(data >= 145 && prob(33))
- M.confused = max(M:confused+2,0)
- holder.remove_reagent(src.id, 0.2)
- ..()
- return
-
- tequilla_sunrise
- name = "Tequilla Sunrise"
- id = "tequillasunrise"
- description = "Tequilla and orange juice. Much like a Screwdriver, only Mexican~"
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- on_mob_life(var/mob/living/M as mob)
- if(!data) data = 1
- data++
- M.dizziness +=3
- if(data >= 55 && data <165)
- if (!M.slurring) M.slurring = 1
- M.slurring += 3
- else if(data >= 165 && prob(33))
- M.confused = max(M:confused+2,0)
- holder.remove_reagent(src.id, 0.2)
- ..()
- return
-
- toxins_special
- name = "Toxins Special"
- id = "toxinsspecial"
- description = "This thing is FLAMING!. CALL THE DAMN SHUTTLE!"
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- on_mob_life(var/mob/living/M as mob)
- if (M.bodytemperature < 330)
- M.bodytemperature = min(330, M.bodytemperature+15) //310 is the normal bodytemp. 310.055
- if(!data) data = 1
- data++
- M.dizziness +=3
- if(data >= 55 && data <165)
- if (!M.slurring) M.slurring = 1
- M.slurring += 3
- else if(data >= 165 && prob(33))
- M.confused = max(M:confused+2,0)
- holder.remove_reagent(src.id, 0.2)
- ..()
- return
-
- beepsky_smash
- name = "Beepsky Smash"
- id = "beepskysmash"
- description = "Deny drinking this and prepare for THE LAW."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- on_mob_life(var/mob/living/M as mob)
- M.Stun(2)
- if(!data) data = 1
- data++
- M.dizziness +=3
- if(data >= 55 && data <165)
- if (!M.slurring) M.slurring = 1
- M.slurring += 3
- else if(data >= 165 && prob(33))
- M.confused = max(M:confused+2,0)
- holder.remove_reagent(src.id, 0.2)
- ..()
- return
-
- doctor_delight
- name = "The Doctor's Delight"
- id = "doctorsdelight"
- description = "A gulp a day keeps the MediBot away. That's probably for the best."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- if(M:getOxyLoss() && prob(50)) M:adjustOxyLoss(-2)
- if(M:getBruteLoss() && prob(60)) M:heal_organ_damage(2,0)
- if(M:getFireLoss() && prob(50)) M:heal_organ_damage(0,2)
- if(M:getToxLoss() && prob(50)) M:adjustToxLoss(-2)
- if(M.dizziness !=0) M.dizziness = max(0,M.dizziness-15)
- if(M.confused !=0) M.confused = max(0,M.confused - 5)
- ..()
- return
-
- irish_cream
- name = "Irish Cream"
- id = "irishcream"
- description = "Whiskey-imbued cream, what else would you expect from the Irish."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- on_mob_life(var/mob/living/M as mob)
- if(!data) data = 1
- data++
- M.dizziness +=3
- if(data >= 45 && data <145)
- if (!M.slurring) M.slurring = 1
- M.slurring += 3
- else if(data >= 145 && prob(33))
- M.confused = max(M:confused+2,0)
- holder.remove_reagent(src.id, 0.2)
- ..()
- return
-
- manly_dorf
- name = "The Manly Dorf"
- id = "manlydorf"
- description = "Beer and Ale, brought together in a delicious mix. Intended for true men only."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- on_mob_life(var/mob/living/M as mob)
- if(!data) data = 1
- data++
- M.dizziness +=5
- if(data >= 35 && data <115)
- if (!M.slurring) M.slurring = 1
- M.slurring += 3
- else if(data >= 115 && prob(33))
- M.confused = max(M:confused+2,0)
- holder.remove_reagent(src.id, 0.2)
- ..()
- return
-
- longislandicedtea
- name = "Long Island Iced Tea"
- id = "longislandicedtea"
- description = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- on_mob_life(var/mob/living/M as mob)
- if(!data) data = 1
- data++
- M.dizziness +=3
- if(data >= 55 && data <165)
- if (!M.slurring) M.slurring = 1
- M.slurring += 3
- else if(data >= 165 && prob(33))
- M.confused = max(M:confused+2,0)
- holder.remove_reagent(src.id, 0.2)
- ..()
- return
-
- moonshine
- name = "Moonshine"
- id = "moonshine"
- description = "You've really hit rock bottom now... your liver packed its bags and left last night."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- on_mob_life(var/mob/living/M as mob)
- if(!data) data = 1
- data++
- M.dizziness +=5
- if(data >= 30 && data <60)
- if (!M.slurring) M:slurring = 1
- M.slurring += 4
- else if(data >= 60 && prob(40))
- M.confused = max(M:confused+5,0)
- holder.remove_reagent(src.id, 0.2)
- ..()
- return
-
- b52
- name = "B-52"
- id = "b52"
- description = "Coffee, Irish Cream, and congac. You will get bombed."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- on_mob_life(var/mob/living/M as mob)
- if(!data) data = 1
- data++
- M.dizziness +=3
- if(data >= 25 && data <90)
- if (!M.slurring) M.slurring = 1
- M.slurring += 4
- else if(data >= 90 && prob(33))
- M.confused = max(M:confused+2,0)
- holder.remove_reagent(src.id, 0.2)
- ..()
- return
-
- irishcoffee
- name = "Irish Coffee"
- id = "irishcoffee"
- description = "Coffee, and alcohol. More fun than a Mimosa to drink in the morning."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- on_mob_life(var/mob/living/M as mob)
- if(!data) data = 1
- data++
- M.dizziness +=3
- if(data >= 55 && data <150)
- if (!M.slurring) M.slurring = 1
- M.slurring += 3
- else if(data >= 150 && prob(33))
- M.confused = max(M:confused+2,0)
- holder.remove_reagent(src.id, 0.2)
- ..()
- return
-
- margarita
- name = "Margarita"
- id = "margarita"
- description = "On the rocks with salt on the rim. Arriba~!"
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- on_mob_life(var/mob/living/M as mob)
- if(!data) data = 1
- data++
- M.dizziness +=4
- if(data >= 55 && data <150)
- if (!M.slurring) M.slurring = 1
- M.slurring += 3
- else if(data >= 150 && prob(33))
- M.confused = max(M:confused+2,0)
- holder.remove_reagent(src.id, 0.2)
- ..()
- return
-
- black_russian
- name = "Black Russian"
- id = "blackrussian"
- description = "For the lactose-intolerant. Still as classy as a White Russian."
- reagent_state = LIQUID
- color = "#360000" // rgb: 54, 0, 0
-
- on_mob_life(var/mob/living/M as mob)
- if(!data) data = 1
- data++
- M.dizziness +=4
- if(data >= 55 && data <115)
- if (!M.slurring) M.slurring = 1
- M.slurring += 3
- else if(data >= 115 && prob(33))
- M.confused = max(M:confused+2,0)
- holder.remove_reagent(src.id, 0.2)
- ..()
- return
-
- manhattan
- name = "Manhattan"
- id = "manhattan"
- description = "The Detective's undercover drink of choice. He never could stomach gin..."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- on_mob_life(var/mob/living/M as mob)
- if(!data) data = 1
- data++
- M.dizziness +=4
- if(data >= 55 && data <115)
- if (!M.slurring) M.slurring = 1
- M.slurring += 3
- else if(data >= 115 && prob(33))
- M.confused = max(M:confused+2,0)
- holder.remove_reagent(src.id, 0.2)
- ..()
- return
-
- manhattan_proj
- name = "Manhattan Project"
- id = "manhattan_proj"
- description = "A scienitst drink of choice, for thinking how to blow up the station."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- on_mob_life(var/mob/living/M as mob)
- if(!data) data = 1
- data++
- M.dizziness +=4
- M.druggy = max(M.druggy, 30)
- if(data >= 55 && data <115)
- if (!M.slurring) M.slurring = 1
- M.slurring += 3
- else if(data >= 115 && prob(33))
- M.confused = max(M:confused+2,0)
- holder.remove_reagent(src.id, 0.2)
- ..()
- return
-
- whiskeysoda
- name = "Whiskey Soda"
- id = "whiskeysoda"
- description = "Ultimate refreshment."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- on_mob_life(var/mob/living/M as mob)
- if(!data) data = 1
- data++
- M.dizziness +=4
- if(data >= 55 && data <115)
- if (!M.slurring) M.slurring = 1
- M.slurring += 3
- else if(data >= 115 && prob(33))
- M.confused = max(M:confused+2,0)
- holder.remove_reagent(src.id, 0.2)
- ..()
- return
-
- antifreeze
- name = "Anti-freeze"
- id = "antifreeze"
- description = "Ultimate refreshment."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- on_mob_life(var/mob/living/M as mob)
- if(!data) data = 1
- data++
- M.dizziness +=5
- if(data >= 55 && data <115)
- if (!M.slurring) M.slurring = 1
- M.slurring += 5
- else if(data >= 115 && prob(33))
- M.confused = max(M:confused+5,0)
- holder.remove_reagent(src.id, 0.2)
- ..()
- return
-
- barefoot
- name = "Barefoot"
- id = "barefoot"
- description = "Barefoot and pregnant"
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- on_mob_life(var/mob/living/M as mob)
- if(!data) data = 1
- data++
- M.dizziness +=5
- if(data >= 55 && data <115)
- if (!M.slurring) M.slurring = 1
- M.slurring += 5
- else if(data >= 115 && prob(33))
- M.confused = max(M:confused+5,0)
- holder.remove_reagent(src.id, 0.2)
- ..()
- return
-
- snowwhite
- name = "Snow White"
- id = "snowwhite"
- description = "A cold refreshment"
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- on_mob_life(var/mob/living/M as mob)
- if(!data) data = 1
- data++
- M.dizziness +=4
- if(data >= 55 && data <115)
- if (!M.slurring) M.slurring = 1
- M.slurring += 4
- else if(data >= 115 && prob(30))
- M.confused = max(M:confused+4,0)
- holder.remove_reagent(src.id, 0.2)
- ..()
- return
-
- demonsblood
- name = "Demons Blood"
- id = "demonsblood"
- description = "AHHHH!!!!"
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- on_mob_life(var/mob/living/M as mob)
- if(!data) data = 1
- data++
- M.dizziness +=10
- if(data >= 55 && data <115)
- if (!M.slurring) M.slurring = 1
- M.slurring += 10
- else if(data >= 115 && prob(90))
- M.confused = max(M:confused+10,10)
- holder.remove_reagent(src.id, 0.2)
- ..()
- return
-
- vodkatonic
- name = "Vodka and Tonic"
- id = "vodkatonic"
- description = "For when a gin and tonic isn't russian enough."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- on_mob_life(var/mob/living/M as mob)
- if(!data) data = 1
- data++
- M.dizziness +=4
- if(data >= 55 && data <115)
- if (!M.slurring) M.slurring = 1
- M.slurring += 3
- else if(data >= 115 && prob(33))
- M.confused = max(M:confused+2,0)
- holder.remove_reagent(src.id, 0.2)
- ..()
- return
-
- ginfizz
- name = "Gin Fizz"
- id = "ginfizz"
- description = "Refreshingly lemony, deliciously dry."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- on_mob_life(var/mob/living/M as mob)
- if(!data) data = 1
- data++
- M.dizziness +=4
- if(data >= 45 && data <125)
- if (!M.slurring) M.slurring = 1
- M.slurring += 3
- else if(data >= 125 && prob(33))
- M.confused = max(M:confused+2,0)
- holder.remove_reagent(src.id, 0.2)
- ..()
- return
-
- bahama_mama
- name = "Bahama mama"
- id = "bahama_mama"
- description = "Tropic cocktail."
- reagent_state = LIQUID
- color = "#664300" // rgb: 102, 67, 0
-
- on_mob_life(var/mob/living/M as mob)
- if(!data) data = 1
- data++
- M.dizziness +=3
- if(data >= 55 && data <165)
- if (!M.slurring) M.slurring = 1
- M.slurring += 3
- else if(data >= 165 && prob(33))
- M.confused = max(M:confused+2,0)
- if (M.bodytemperature > 310)
- M.bodytemperature = max(310, M.bodytemperature-5)
- holder.remove_reagent(src.id, 0.2)
- ..()
- return
-
- singulo
- name = "Singulo"
- id = "singulo"
- description = "A blue-space beverage!"
- reagent_state = LIQUID
- color = "#2E6671" // rgb: 46, 102, 113
-
- on_mob_life(var/mob/living/M as mob)
- if(!data) data = 1
- data++
- M.dizziness +=15
- if(data >= 55 && data <115)
- if (!M.slurring) M.slurring = 1
- M.slurring += 15
- else if(data >= 115 && prob(33))
- M.confused = max(M:confused+15,15)
- holder.remove_reagent(src.id, 0.2)
- ..()
- return
////////////////////////// REMOVED COCKTAIL REAGENTS BELOW:: RE-ENABLE THEM IF THEY EVER GET SPRITES THAT DON'T LOOK FUCKING STUPID --Agouri ///////////////////////////
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 537ce19aff8..3f43ffc3548 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -99,50 +99,68 @@ emp_act
var/armor = run_armor_check(affecting, "melee", "Your armor has protected you from a hit to the [hit_area].", "Your armor has softened hit to your [hit_area].")
if(armor >= 2) return 0
if(!I.force) return 0
- apply_damage(I.force, I.damtype, affecting, armor, is_cut(I), I.name)
+
+ // make heavy weapons do more damage
+ var/power = I.force
+ if(I.w_class >= 4)
+ power *= 2
+ apply_damage(, I.damtype, affecting, armor, is_cut(I), I.name)
var/bloody = 0
if((I.damtype == BRUTE) && prob(25 + (I.force * 2)))
I.add_blood(src)
- if(prob(33))
- bloody = 1
- var/turf/location = loc
- if(istype(location, /turf/simulated))
- location.add_blood(src)
- if(ishuman(user))
- var/mob/living/carbon/human/H = user
- if(H.wear_suit) H.wear_suit.add_blood(src)
- else if(H.w_uniform) H.w_uniform.add_blood(src)
- if(H.shoes) H.shoes.add_blood(src)
- if (H.gloves)
- H.gloves.add_blood(H)
- H.gloves.transfer_blood = 2
- H.gloves.bloody_hands_mob = H
- else
- H.add_blood(H)
- H.bloody_hands = 2
- H.bloody_hands_mob = H
+ bloody = 1
+ var/turf/location = loc
+ if(istype(location, /turf/simulated))
+ location.add_blood(src)
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ if(H.wear_suit) H.wear_suit.add_blood(src)
+ else if(H.w_uniform) H.w_uniform.add_blood(src)
+ if(H.shoes) H.shoes.add_blood(src)
+ if (H.gloves)
+ H.gloves.add_blood(H)
+ H.gloves.transfer_blood = 2
+ H.gloves.bloody_hands_mob = H
+ else
+ H.add_blood(H)
+ H.bloody_hands = 2
+ H.bloody_hands_mob = H
- switch(hit_area)
- if("head")//Harder to score a stun but if you do it lasts a bit longer
- if(prob(I.force))
- apply_effect(20, PARALYZE, armor)
- visible_message("\red [src] has been knocked unconscious!")
- if(src != user)
- ticker.mode.remove_revolutionary(mind)
+ switch(hit_area)
+ if("head")//Harder to score a stun but if you do it lasts a bit longer
+ var/knockout_chance = 0
+ if(power >= 4)
+ knockout_chance += 5
+ if(power >= 10)
+ knockout_chance += 20
+ knockout_chance += power
+ if(health <= 40) knockout_chance += 40
+ if(prob(knockout_chance))
+ apply_effect(20, PARALYZE, armor)
+ visible_message("\red [src] has been knocked unconscious!")
+ if(src != user)
+ ticker.mode.remove_revolutionary(mind)
- if(bloody)//Apply blood
- if(wear_mask) wear_mask.add_blood(src)
- if(head) head.add_blood(src)
- if(glasses && prob(33)) glasses.add_blood(src)
+ if(bloody)//Apply blood
+ if(wear_mask) wear_mask.add_blood(src)
+ if(head) head.add_blood(src)
+ if(glasses && prob(33)) glasses.add_blood(src)
- if("chest")//Easier to score a stun but lasts less time
- if(prob((I.force + 10)))
- apply_effect(5, WEAKEN, armor)
- visible_message("\red [src] has been knocked down!")
+ if("chest")//Easier to score a stun but lasts less time
+ var/knockdown_chance = 0
+ if(power >= 10)
+ knockdown_chance += 10
+ if(I.w_class >= 4)
+ knockdown_chance *= 4
+ knockdown_chance = min(knockdown_chance, 50)
+ if(prob(knockdown_chance))
+ apply_effect(5, WEAKEN, armor)
+ visible_message("\red [src] has been knocked down!")
+
+ if(bloody)
+ if(src.wear_suit) src.wear_suit.add_blood(src)
+ if(src.w_uniform) src.w_uniform.add_blood(src)
- if(bloody)
- if(src.wear_suit) src.wear_suit.add_blood(src)
- if(src.w_uniform) src.w_uniform.add_blood(src)
UpdateDamageIcon()
update_clothing()
\ No newline at end of file
diff --git a/icons/obj/atmospherics/mainspipe.dmi b/icons/obj/atmospherics/mainspipe.dmi
new file mode 100644
index 00000000000..e6b2dae0d0e
Binary files /dev/null and b/icons/obj/atmospherics/mainspipe.dmi differ
diff --git a/icons/obj/pipes.dmi b/icons/obj/pipes.dmi
index 59909fb6f54..eace98cda47 100644
Binary files a/icons/obj/pipes.dmi and b/icons/obj/pipes.dmi differ