diff --git a/aurora.dme b/aurora.dme
index d86f02a8..6e8d1759 100644
--- a/aurora.dme
+++ b/aurora.dme
@@ -22,6 +22,9 @@
#define FILE_DIR "icons/misc"
#define FILE_DIR "icons/mob"
#define FILE_DIR "icons/mob/human_races"
+#define FILE_DIR "icons/mob/species"
+#define FILE_DIR "icons/mob/species/armalis"
+#define FILE_DIR "icons/mob/species/vox"
#define FILE_DIR "icons/obj"
#define FILE_DIR "icons/obj/assemblies"
#define FILE_DIR "icons/obj/atmospherics"
@@ -121,6 +124,7 @@
#include "code\ATMOSPHERICS\datum_pipe_network.dm"
#include "code\ATMOSPHERICS\datum_pipeline.dm"
#include "code\ATMOSPHERICS\he_pipes.dm"
+#include "code\ATMOSPHERICS\mainspipe.dm"
#include "code\ATMOSPHERICS\pipes.dm"
#include "code\ATMOSPHERICS\components\portables_connector.dm"
#include "code\ATMOSPHERICS\components\tvalve.dm"
@@ -629,7 +633,9 @@
#include "code\game\objects\items\weapons\storage\briefcase.dm"
#include "code\game\objects\items\weapons\storage\fancy.dm"
#include "code\game\objects\items\weapons\storage\firstaid.dm"
+#include "code\game\objects\items\weapons\storage\internal.dm"
#include "code\game\objects\items\weapons\storage\lockbox.dm"
+#include "code\game\objects\items\weapons\storage\misc.dm"
#include "code\game\objects\items\weapons\storage\secure.dm"
#include "code\game\objects\items\weapons\storage\storage.dm"
#include "code\game\objects\items\weapons\storage\toolbox.dm"
@@ -651,6 +657,7 @@
#include "code\game\objects\structures\flora.dm"
#include "code\game\objects\structures\girders.dm"
#include "code\game\objects\structures\grille.dm"
+#include "code\game\objects\structures\inflatable.dm"
#include "code\game\objects\structures\janicart.dm"
#include "code\game\objects\structures\kitchen_spike.dm"
#include "code\game\objects\structures\ladders.dm"
@@ -832,6 +839,7 @@
#include "code\modules\clothing\suits\jobs.dm"
#include "code\modules\clothing\suits\labcoat.dm"
#include "code\modules\clothing\suits\miscellaneous.dm"
+#include "code\modules\clothing\suits\storage.dm"
#include "code\modules\clothing\suits\utility.dm"
#include "code\modules\clothing\suits\wiz_robe.dm"
#include "code\modules\clothing\under\chameleon.dm"
@@ -923,6 +931,8 @@
#include "code\modules\mob\abilities.dm"
#include "code\modules\mob\death.dm"
#include "code\modules\mob\emote.dm"
+#include "code\modules\mob\hear_say.dm"
+#include "code\modules\mob\holder.dm"
#include "code\modules\mob\inventory.dm"
#include "code\modules\mob\language.dm"
#include "code\modules\mob\login.dm"
@@ -1026,6 +1036,7 @@
#include "code\modules\mob\living\carbon\monkey\monkey.dm"
#include "code\modules\mob\living\carbon\monkey\powers.dm"
#include "code\modules\mob\living\carbon\monkey\update_icons.dm"
+#include "code\modules\mob\living\silicon\alarm.dm"
#include "code\modules\mob\living\silicon\death.dm"
#include "code\modules\mob\living\silicon\login.dm"
#include "code\modules\mob\living\silicon\say.dm"
@@ -1069,6 +1080,12 @@
#include "code\modules\mob\living\silicon\robot\robot_modules.dm"
#include "code\modules\mob\living\silicon\robot\robot_movement.dm"
#include "code\modules\mob\living\silicon\robot\wires.dm"
+#include "code\modules\mob\living\silicon\robot\drone\drone.dm"
+#include "code\modules\mob\living\silicon\robot\drone\drone_abilities.dm"
+#include "code\modules\mob\living\silicon\robot\drone\drone_console.dm"
+#include "code\modules\mob\living\silicon\robot\drone\drone_damage.dm"
+#include "code\modules\mob\living\silicon\robot\drone\drone_items.dm"
+#include "code\modules\mob\living\silicon\robot\drone\drone_manufacturer.dm"
#include "code\modules\mob\living\simple_animal\bees.dm"
#include "code\modules\mob\living\simple_animal\borer.dm"
#include "code\modules\mob\living\simple_animal\constructs.dm"
@@ -1123,11 +1140,13 @@
#include "code\modules\organs\organ_internal.dm"
#include "code\modules\organs\pain.dm"
#include "code\modules\organs\wound.dm"
+#include "code\modules\paperwork\carbonpaper.dm"
#include "code\modules\paperwork\clipboard.dm"
#include "code\modules\paperwork\filingcabinet.dm"
#include "code\modules\paperwork\folders.dm"
#include "code\modules\paperwork\handlabeler.dm"
#include "code\modules\paperwork\paper.dm"
+#include "code\modules\paperwork\paper_bundle.dm"
#include "code\modules\paperwork\paperbin.dm"
#include "code\modules\paperwork\pen.dm"
#include "code\modules\paperwork\photocopier.dm"
@@ -1173,6 +1192,7 @@
#include "code\modules\projectiles\targeting.dm"
#include "code\modules\projectiles\ammunition\boxes.dm"
#include "code\modules\projectiles\ammunition\bullets.dm"
+#include "code\modules\projectiles\guns\alien.dm"
#include "code\modules\projectiles\guns\energy.dm"
#include "code\modules\projectiles\guns\projectile.dm"
#include "code\modules\projectiles\guns\energy\erifles.dm"
diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm
index 0320f899..5ea2c0eb 100644
--- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm
+++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm
@@ -14,7 +14,7 @@ obj/machinery/atmospherics/trinary/filter
/*
Filter types:
-1: Nothing
- 0: Carbon Molecules: Plasma Toxin, Oxygen Agent B
+ 0: Plasma: Plasma Toxin, Oxygen Agent B
1: Oxygen: Oxygen ONLY
2: Nitrogen: Nitrogen ONLY
3: Carbon Dioxide: Carbon Dioxide ONLY
@@ -170,7 +170,7 @@ obj/machinery/atmospherics/trinary/filter/attack_hand(user as mob) // -- TLE
var/current_filter_type
switch(filter_type)
if(0)
- current_filter_type = "Carbon Molecules"
+ current_filter_type = "Plasma"
if(1)
current_filter_type = "Oxygen"
if(2)
@@ -188,7 +188,7 @@ obj/machinery/atmospherics/trinary/filter/attack_hand(user as mob) // -- TLE
Power: [on?"On":"Off"]
Filtering: [current_filter_type]
Set Filter Type:
- Carbon Molecules
+ Plasma
Oxygen
Nitrogen
Carbon Dioxide
@@ -234,4 +234,45 @@ obj/machinery/atmospherics/trinary/filter/Topic(href, href_list) // -- TLE
*/
return
+obj/machinery/atmospherics/trinary/filter/m_filter
+ icon = 'icons/obj/atmospherics/m_filter.dmi'
+ icon_state = "intact_off"
+ dir = SOUTH
+ initialize_directions = SOUTH|NORTH|EAST
+
+obj/machinery/atmospherics/trinary/filter/m_filter/New()
+ ..()
+ switch(dir)
+ if(NORTH)
+ initialize_directions = WEST|NORTH|SOUTH
+ if(SOUTH)
+ initialize_directions = SOUTH|EAST|NORTH
+ if(EAST)
+ initialize_directions = EAST|WEST|NORTH
+ if(WEST)
+ initialize_directions = WEST|SOUTH|EAST
+
+obj/machinery/atmospherics/trinary/filter/m_filter/initialize()
+ if(node1 && node2 && node3) return
+
+ var/node1_connect = turn(dir, -180)
+ var/node2_connect = turn(dir, 90)
+ var/node3_connect = dir
+
+ for(var/obj/machinery/atmospherics/target in get_step(src,node1_connect))
+ if(target.initialize_directions & get_dir(target,src))
+ node1 = target
+ break
+
+ for(var/obj/machinery/atmospherics/target in get_step(src,node2_connect))
+ if(target.initialize_directions & get_dir(target,src))
+ node2 = target
+ break
+
+ for(var/obj/machinery/atmospherics/target in get_step(src,node3_connect))
+ if(target.initialize_directions & get_dir(target,src))
+ node3 = target
+ break
+
+ update_icon()
diff --git a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
index 026d8406..54a43075 100644
--- a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
+++ b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
@@ -160,3 +160,93 @@ obj/machinery/atmospherics/trinary/mixer
src.update_icon()
src.updateUsrDialog()
return
+
+obj/machinery/atmospherics/trinary/mixer/t_mixer
+ icon = 'icons/obj/atmospherics/t_mixer.dmi'
+ icon_state = "intact_off"
+
+ dir = SOUTH
+ initialize_directions = SOUTH|EAST|WEST
+
+ //node 3 is the outlet, nodes 1 & 2 are intakes
+
+obj/machinery/atmospherics/trinary/mixer/t_mixer/New()
+ ..()
+ switch(dir)
+ if(NORTH)
+ initialize_directions = EAST|NORTH|WEST
+ if(SOUTH)
+ initialize_directions = SOUTH|WEST|EAST
+ if(EAST)
+ initialize_directions = EAST|NORTH|SOUTH
+ if(WEST)
+ initialize_directions = WEST|NORTH|SOUTH
+
+obj/machinery/atmospherics/trinary/mixer/t_mixer/initialize()
+ if(node1 && node2 && node3) return
+
+ var/node1_connect = turn(dir, -90)
+ var/node2_connect = turn(dir, 90)
+ var/node3_connect = dir
+
+ for(var/obj/machinery/atmospherics/target in get_step(src,node1_connect))
+ if(target.initialize_directions & get_dir(target,src))
+ node1 = target
+ break
+
+ for(var/obj/machinery/atmospherics/target in get_step(src,node2_connect))
+ if(target.initialize_directions & get_dir(target,src))
+ node2 = target
+ break
+
+ for(var/obj/machinery/atmospherics/target in get_step(src,node3_connect))
+ if(target.initialize_directions & get_dir(target,src))
+ node3 = target
+ break
+
+ update_icon()
+
+obj/machinery/atmospherics/trinary/mixer/m_mixer
+ icon = 'icons/obj/atmospherics/m_mixer.dmi'
+ icon_state = "intact_off"
+
+ dir = SOUTH
+ initialize_directions = SOUTH|NORTH|EAST
+
+ //node 3 is the outlet, nodes 1 & 2 are intakes
+
+obj/machinery/atmospherics/trinary/mixer/m_mixer/New()
+ ..()
+ switch(dir)
+ if(NORTH)
+ initialize_directions = WEST|NORTH|SOUTH
+ if(SOUTH)
+ initialize_directions = SOUTH|EAST|NORTH
+ if(EAST)
+ initialize_directions = EAST|WEST|NORTH
+ if(WEST)
+ initialize_directions = WEST|SOUTH|EAST
+
+obj/machinery/atmospherics/trinary/mixer/m_mixer/initialize()
+ if(node1 && node2 && node3) return
+
+ var/node1_connect = turn(dir, -180)
+ var/node2_connect = turn(dir, 90)
+ var/node3_connect = dir
+
+ for(var/obj/machinery/atmospherics/target in get_step(src,node1_connect))
+ if(target.initialize_directions & get_dir(target,src))
+ node1 = target
+ break
+
+ for(var/obj/machinery/atmospherics/target in get_step(src,node2_connect))
+ if(target.initialize_directions & get_dir(target,src))
+ node2 = target
+ break
+
+ for(var/obj/machinery/atmospherics/target in get_step(src,node3_connect))
+ if(target.initialize_directions & get_dir(target,src))
+ node3 = target
+ break
+
+ update_icon()
\ No newline at end of file
diff --git a/code/ATMOSPHERICS/mainspipe.dm b/code/ATMOSPHERICS/mainspipe.dm
new file mode 100644
index 00000000..631f3530
--- /dev/null
+++ b/code/ATMOSPHERICS/mainspipe.dm
@@ -0,0 +1,707 @@
+// 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 = 'icons/obj/atmospherics/mainspipe.dmi'
+ layer = 2.4 //under wires with their 2.5
+
+ force = 20
+
+ var/volume = 0
+
+ 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"
+
+//TODO: Get Mains valves working!
+/*
+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/TriDimension/Turfs.dm b/code/TriDimension/Turfs.dm
index 94114c9a..ae7bf820 100644
--- a/code/TriDimension/Turfs.dm
+++ b/code/TriDimension/Turfs.dm
@@ -53,6 +53,13 @@
H:updatehealth()
return ..()
+/turf/proc/hasbelow()
+ var/turf/controllerlocation = locate(1, 1, z)
+ for(var/obj/effect/landmark/zcontroller/controller in controllerlocation)
+ if(controller.down)
+ return 1
+ return 0
+
/turf/simulated/floor/open/proc/getbelow()
var/turf/controllerlocation = locate(1, 1, z)
for(var/obj/effect/landmark/zcontroller/controller in controllerlocation)
@@ -73,7 +80,7 @@
//overwrite the attackby of space to transform it to openspace if necessary
/turf/space/attackby(obj/item/C as obj, mob/user as mob)
- if (istype(C, /obj/item/weapon/cable_coil))
+ if (istype(C, /obj/item/weapon/cable_coil) && src.hasbelow())
var/turf/simulated/floor/open/W = src.ChangeTurf(/turf/simulated/floor/open)
W.attackby(C, user)
return
diff --git a/code/WorkInProgress/Cael_Aislinn/ShieldGen/energy_field.dm b/code/WorkInProgress/Cael_Aislinn/ShieldGen/energy_field.dm
index a5519fbf..b9b8c24c 100644
--- a/code/WorkInProgress/Cael_Aislinn/ShieldGen/energy_field.dm
+++ b/code/WorkInProgress/Cael_Aislinn/ShieldGen/energy_field.dm
@@ -11,6 +11,7 @@
density = 0
invisibility = 101
var/strength = 0
+ var/ticks_recovering = 10
/obj/effect/energy_field/ex_act(var/severity)
Stress(0.5 + severity)
@@ -27,9 +28,12 @@
strength -= severity
//if we take too much damage, drop out - the generator will bring us back up if we have enough power
+ ticks_recovering = min(ticks_recovering + 2, 10)
if(strength < 1)
invisibility = 101
density = 0
+ ticks_recovering = 10
+ strength = 0
else if(strength >= 1)
invisibility = 0
density = 1
diff --git a/code/WorkInProgress/Cael_Aislinn/ShieldGen/shield_capacitor.dm b/code/WorkInProgress/Cael_Aislinn/ShieldGen/shield_capacitor.dm
index 25825c48..b95c0ffb 100644
--- a/code/WorkInProgress/Cael_Aislinn/ShieldGen/shield_capacitor.dm
+++ b/code/WorkInProgress/Cael_Aislinn/ShieldGen/shield_capacitor.dm
@@ -9,12 +9,10 @@
icon_state = "capacitor"
var/active = 1
density = 1
- anchored = 1
var/stored_charge = 0
var/time_since_fail = 100
- var/max_charge = 1000000
- var/max_charge_rate = 100000
- var/min_charge_rate = 0
+ var/max_charge = 5e6
+ var/charge_limit = 200000
var/locked = 0
//
use_power = 1 //0 use nothing
@@ -23,6 +21,7 @@
idle_power_usage = 10
active_power_usage = 100
var/charge_rate = 100
+ var/obj/machinery/shield_gen/owned_gen
/obj/machinery/shield_capacitor/New()
spawn(10)
@@ -55,17 +54,17 @@
src.anchored = !src.anchored
src.visible_message("\blue \icon[src] [src] has been [anchored ? "bolted to the floor" : "unbolted from the floor"] by [user].")
- spawn(0)
- for(var/obj/machinery/shield_gen/gen in range(1, src))
- if(get_dir(src, gen) == src.dir)
- if(!src.anchored && gen.owned_capacitor == src)
- gen.owned_capacitor = null
- break
- else if(src.anchored && !gen.owned_capacitor)
- gen.owned_capacitor = src
- break
- gen.updateDialog()
- updateDialog()
+ if(anchored)
+ spawn(0)
+ for(var/obj/machinery/shield_gen/gen in range(1, src))
+ if(get_dir(src, gen) == src.dir && !gen.owned_capacitor)
+ owned_gen = gen
+ owned_gen.owned_capacitor = src
+ owned_gen.updateDialog()
+ else
+ if(owned_gen && owned_gen.owned_capacitor == src)
+ owned_gen.owned_capacitor = null
+ owned_gen = null
else
..()
@@ -94,17 +93,19 @@
t += "[time_since_fail > 2 ? "Charging stable. " : "Warning, low charge! "] "
t += "Charge: [stored_charge] Watts ([100 * stored_charge/max_charge]%) "
t += "Charge rate: \
- \[min\] \
+ \[----\] \
+ \[---\] \
\[--\] \
\[-\] [charge_rate] Watts/sec \
\[+\] \
\[++\] \
- \[max\] "
+ \[+++\] \
+ \[+++\] "
t += " "
t += "Refresh "
t += "Close "
- user << browse(t, "window=shield_capacitor;size=500x800")
+ user << browse(t, "window=shield_capacitor;size=500x400")
user.set_machine(src)
/obj/machinery/shield_capacitor/process()
@@ -137,10 +138,10 @@
use_power = 1
if( href_list["charge_rate"] )
charge_rate += text2num(href_list["charge_rate"])
- if(charge_rate > max_charge_rate)
- charge_rate = max_charge_rate
- else if(charge_rate < min_charge_rate)
- charge_rate = min_charge_rate
+ if(charge_rate > charge_limit)
+ charge_rate = charge_limit
+ else if(charge_rate < 0)
+ charge_rate = 0
//
updateDialog()
diff --git a/code/WorkInProgress/Cael_Aislinn/ShieldGen/shield_gen.dm b/code/WorkInProgress/Cael_Aislinn/ShieldGen/shield_gen.dm
index b252ae7f..e6f206a2 100644
--- a/code/WorkInProgress/Cael_Aislinn/ShieldGen/shield_gen.dm
+++ b/code/WorkInProgress/Cael_Aislinn/ShieldGen/shield_gen.dm
@@ -14,7 +14,6 @@
var/field_radius = 3
var/list/field
density = 1
- anchored = 1
var/locked = 0
var/average_field_strength = 0
var/strengthen_rate = 0.2
@@ -22,7 +21,7 @@
var/powered = 0
var/check_powered = 1
var/obj/machinery/shield_capacitor/owned_capacitor
- var/max_field_strength = 10
+ var/target_field_strength = 10
var/time_since_fail = 100
var/energy_conversion_rate = 0.01 //how many renwicks per watt?
//
@@ -63,17 +62,22 @@
src.anchored = !src.anchored
src.visible_message("\blue \icon[src] [src] has been [anchored?"bolted to the floor":"unbolted from the floor"] by [user].")
- spawn(0)
- for(var/obj/machinery/shield_gen/gen in range(1, src))
- if(get_dir(src, gen) == src.dir)
- if(!src.anchored && gen.owned_capacitor == src)
- gen.owned_capacitor = null
+ if(active)
+ toggle()
+ if(anchored)
+ spawn(0)
+ for(var/obj/machinery/shield_capacitor/cap in range(1, src))
+ if(cap.owned_gen)
+ continue
+ if(get_dir(cap, src) == cap.dir && src.anchored)
+ owned_capacitor = cap
+ owned_capacitor.owned_gen = src
+ updateDialog()
break
- else if(src.anchored && !gen.owned_capacitor)
- gen.owned_capacitor = src
- break
- gen.updateDialog()
- updateDialog()
+ else
+ if(owned_capacitor && owned_capacitor.owned_gen == src)
+ owned_capacitor.owned_gen = null
+ owned_capacitor = null
else
..()
@@ -102,67 +106,65 @@
t += "This generator is: [active ? "Online " : "Offline " ] [active ? "\[Deactivate\]" : "\[Activate\]"] "
t += "[time_since_fail > 2 ? "Field is stable. " : "Warning, field is unstable! "] "
t += "Coverage radius (restart required): \
+ --- \
-- \
- \
[field_radius * 2]m \
+ \
- ++ "
- t += "Overall field strength: [average_field_strength] Renwicks ([max_field_strength ? 100 * average_field_strength / max_field_strength : "NA"]%) "
- t += "Charge rate: -- \
- - \
- [strengthen_rate] Renwicks/sec \
- + \
- ++ "
+ ++ \
+ +++ "
+ t += "Overall field strength: [average_field_strength] Renwicks ([target_field_strength ? 100 * average_field_strength / target_field_strength : "NA"]%) "
t += "Upkeep energy: [field.len * average_field_strength / energy_conversion_rate] Watts/sec "
+ t += "Charge rate: -- \
+ [strengthen_rate] Renwicks/sec \
+ ++ "
t += "Additional energy required to charge: [field.len * strengthen_rate / energy_conversion_rate] Watts/sec "
t += "Maximum field strength: \
- \[min\] \
- -- \
- - \
- [max_field_strength] Renwicks \
- + \
- ++ \
- \[max\] "
+ \[min\] \
+ -- \
+ - \
+ [target_field_strength] Renwicks \
+ + \
+ ++ \
+ \[max\] "
t += " "
t += "Refresh "
t += "Close "
- user << browse(t, "window=shield_generator;size=500x800")
+ user << browse(t, "window=shield_generator;size=500x400")
user.set_machine(src)
/obj/machinery/shield_gen/process()
- if(active && field.len)
+ if(field.len)
+ time_since_fail++
var/stored_renwicks = 0
- var/target_field_strength = min(strengthen_rate + max(average_field_strength, 0), max_field_strength)
- if(owned_capacitor)
- var/required_energy = field.len * target_field_strength / energy_conversion_rate
+ var/target_strength_this_update = min(strengthen_rate + max(average_field_strength, 0), target_field_strength)
+
+ if(active && owned_capacitor)
+ var/required_energy = field.len * target_strength_this_update / energy_conversion_rate
var/assumed_charge = min(owned_capacitor.stored_charge, required_energy)
stored_renwicks = assumed_charge * energy_conversion_rate
owned_capacitor.stored_charge -= assumed_charge
- time_since_fail++
-
average_field_strength = 0
- target_field_strength = stored_renwicks / field.len
+ var/renwicks_per_field = 0
+ if(stored_renwicks != 0)
+ renwicks_per_field = stored_renwicks / field.len
for(var/obj/effect/energy_field/E in field)
- if(stored_renwicks)
- var/strength_change = target_field_strength - E.strength
- if(strength_change > stored_renwicks)
- strength_change = stored_renwicks
- if(E.strength < 0)
- E.strength = 0
+ if(active && renwicks_per_field > 0)
+ var/amount_to_strengthen = min(renwicks_per_field - E.strength, strengthen_rate)
+ if(E.ticks_recovering > 0 && amount_to_strengthen > 0)
+ E.Strengthen( min(amount_to_strengthen / 10, 0.1) )
+ E.ticks_recovering -= 1
else
- E.Strengthen(strength_change)
-
- stored_renwicks -= strength_change
-
+ E.Strengthen(amount_to_strengthen)
average_field_strength += E.strength
else
E.Strengthen(-E.strength)
average_field_strength /= field.len
- if(average_field_strength < 0)
+ if(average_field_strength < 1)
time_since_fail = 0
else
average_field_strength = 0
@@ -187,12 +189,12 @@
strengthen_rate = 1
else if(strengthen_rate < 0)
strengthen_rate = 0
- else if( href_list["max_field_strength"] )
- max_field_strength += text2num(href_list["max_field_strength"])
- if(max_field_strength > 1000)
- max_field_strength = 1000
- else if(max_field_strength < 0)
- max_field_strength = 0
+ else if( href_list["target_field_strength"] )
+ target_field_strength += text2num(href_list["target_field_strength"])
+ if(target_field_strength > 1000)
+ target_field_strength = 1000
+ else if(target_field_strength < 0)
+ target_field_strength = 0
//
updateDialog()
@@ -252,6 +254,7 @@
*/
/obj/machinery/shield_gen/proc/toggle()
+ set background = 1
active = !active
power_change()
if(active)
@@ -269,7 +272,7 @@
else
for(var/obj/effect/energy_field/D in field)
field.Remove(D)
- del D
+ D.loc = null
for(var/mob/M in view(5,src))
M << "\icon[src] You hear heavy droning fade out."
diff --git a/code/WorkInProgress/Cael_Aislinn/ShieldGen/shield_gen_external.dm b/code/WorkInProgress/Cael_Aislinn/ShieldGen/shield_gen_external.dm
index f239dc9d..dab223ae 100644
--- a/code/WorkInProgress/Cael_Aislinn/ShieldGen/shield_gen_external.dm
+++ b/code/WorkInProgress/Cael_Aislinn/ShieldGen/shield_gen_external.dm
@@ -1,7 +1,9 @@
-
//---------- external shield generator
//generates an energy field that loops around any built up area in space (is useless inside) halts movement and airflow, is blocked by walls, windows, airlocks etc
+/obj/machinery/shield_gen/external
+ name = "hull shield generator"
+
/obj/machinery/shield_gen/external/New()
..()
diff --git a/code/WorkInProgress/Chinsky/ashtray.dm b/code/WorkInProgress/Chinsky/ashtray.dm
index 5ec88ac8..58251711 100644
--- a/code/WorkInProgress/Chinsky/ashtray.dm
+++ b/code/WorkInProgress/Chinsky/ashtray.dm
@@ -32,6 +32,7 @@
var/obj/item/butt = new cig.type_butt(src)
cig.transfer_fingerprints_to(butt)
del(cig)
+ W = butt
else if (cig.lit == 0)
user << "You place [cig] in [src] without even smoking it. Why would you do that?"
diff --git a/code/WorkInProgress/Sigyn/Softcurity/wardrobe.dm b/code/WorkInProgress/Sigyn/Softcurity/wardrobe.dm
index 0cd4f9e2..72e14fa5 100644
--- a/code/WorkInProgress/Sigyn/Softcurity/wardrobe.dm
+++ b/code/WorkInProgress/Sigyn/Softcurity/wardrobe.dm
@@ -193,12 +193,12 @@
return
-/obj/structure/closet/wardrobe/toxins_white
- name = "toxins wardrobe"
+/obj/structure/closet/wardrobe/science_white
+ name = "science wardrobe"
icon_state = "white"
icon_closed = "white"
-/obj/structure/closet/wardrobe/toxins_white/New()
+/obj/structure/closet/wardrobe/science_white/New()
new /obj/item/clothing/under/rank/scientist(src)
new /obj/item/clothing/under/rank/scientist(src)
new /obj/item/clothing/under/rank/scientist(src)
diff --git a/code/WorkInProgress/SkyMarshal/wardrobes.dm b/code/WorkInProgress/SkyMarshal/wardrobes.dm
index 28bd73cf..42034521 100644
--- a/code/WorkInProgress/SkyMarshal/wardrobes.dm
+++ b/code/WorkInProgress/SkyMarshal/wardrobes.dm
@@ -340,7 +340,7 @@
var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src)
new /obj/item/weapon/storage/box(BPK)
new /obj/item/weapon/pen(src)
- new /obj/item/device/pda/toxins(src)
+ new /obj/item/device/pda/science(src)
new /obj/item/weapon/tank/oxygen(src)
new /obj/item/clothing/mask/gas(src)
new /obj/item/clothing/suit/storage/labcoat/science(src)
@@ -360,7 +360,7 @@
new /obj/item/device/radio/headset/headset_medsci(src)
new /obj/item/clothing/under/rank/chemist(src)
new /obj/item/clothing/shoes/white(src)
- new /obj/item/device/pda/toxins(src)
+ new /obj/item/device/pda/science(src)
new /obj/item/clothing/suit/storage/labcoat/chemist(src)
/obj/item/wardrobe/hos
diff --git a/code/WorkInProgress/Tastyfish/Eliza_Data.dm b/code/WorkInProgress/Tastyfish/Eliza_Data.dm
index 2fbbfb03..bd55e3b8 100644
--- a/code/WorkInProgress/Tastyfish/Eliza_Data.dm
+++ b/code/WorkInProgress/Tastyfish/Eliza_Data.dm
@@ -246,8 +246,8 @@
list("bomb", "explosive", "toxin", "plasma"),
list(
"Do you worry about bombs often?",
- "Do you work in toxins?",
- "Do you find it odd to worry about bombs on a toxins research vessel?")),
+ "Do you work in science?",
+ "Do you find it odd to worry about bombs on a science research vessel?")),
new/datum/text_parser/keyword(
list("work", "job", "head", "staff", "transen"),
list(
diff --git a/code/WorkInProgress/autopsy.dm b/code/WorkInProgress/autopsy.dm
index 280c40d8..9c812ef7 100644
--- a/code/WorkInProgress/autopsy.dm
+++ b/code/WorkInProgress/autopsy.dm
@@ -8,7 +8,7 @@
icon = 'icons/obj/autopsy_scanner.dmi'
icon_state = ""
flags = FPRINT | TABLEPASS | CONDUCT
- w_class = 1.0
+ w_class = 2.0
origin_tech = "materials=1;biotech=1"
var/list/datum/autopsy_data_scanner/wdata = list()
var/list/datum/autopsy_data_scanner/chemtraces = list()
diff --git a/code/WorkInProgress/kilakk/fax.dm b/code/WorkInProgress/kilakk/fax.dm
index 0d8f4cdd..2934d2ed 100644
--- a/code/WorkInProgress/kilakk/fax.dm
+++ b/code/WorkInProgress/kilakk/fax.dm
@@ -136,7 +136,9 @@ var/list/alldepartments = list("Central Command")
authenticated = 0
if(href_list["dept"])
+ var/lastdpt = dpt
dpt = input(usr, "Which department?", "Choose a department", "") as null|anything in alldepartments
+ if(!dpt) dpt = lastdpt
if(href_list["auth"])
if ( (!( authenticated ) && (scan)) )
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index 290db76b..62f37f55 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -37,8 +37,10 @@ var/global/list/facial_hair_styles_male_list = list()
var/global/list/facial_hair_styles_female_list = list()
var/global/list/skin_styles_female_list = list() //unused
//Underwear
-var/global/list/underwear_m = list("White", "Grey", "Green", "Blue", "Black", "Mankini", "Love-Hearts", "Black2", "Grey2", "Stripey", "Kinky", "None") //Curse whoever made male/female underwear diffrent colours
-var/global/list/underwear_f = list("Red", "White", "Yellow", "Blue", "Black", "Thong", "Babydoll", "Baby-Blue", "Green", "Pink", "Kinky", "None")
+var/global/list/underwear_m = list("White", "Grey", "Green", "Blue", "Black", "Mankini", "None") //Curse whoever made male/female underwear diffrent colours
+var/global/list/underwear_f = list("Red", "White", "Yellow", "Blue", "Black", "Thong", "None")
+ //undershirt
+var/global/list/undershirt_t = list("Black Tank top", "White Tank top", "Black shirt", "White shirt", "None")
//Backpacks
var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Alt")
@@ -98,9 +100,12 @@ var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Al
var/datum/language/L = new T
all_languages[L.name] = L
+ var/rkey = 0
paths = typesof(/datum/species)-/datum/species
for(var/T in paths)
+ rkey++
var/datum/species/S = new T
+ S.race_key = rkey //Used in mob icon caching.
all_species[S.name] = S
if(S.flags & IS_WHITELISTED)
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index 63c01a6d..db9dc6c1 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -352,7 +352,7 @@ Turf and target are seperate in case you want to teleport some distance from a t
var/select = null
var/list/borgs = list()
for (var/mob/living/silicon/robot/A in player_list)
- if (A.stat == 2 || A.connected_ai || A.scrambledcodes)
+ if (A.stat == 2 || A.connected_ai || A.scrambledcodes || istype(A,/mob/living/silicon/robot/drone))
continue
var/name = "[A.real_name] ([A.modtype] [A.braintype])"
borgs[name] = A
@@ -531,10 +531,17 @@ Turf and target are seperate in case you want to teleport some distance from a t
. += "*no key*"
if(include_name && M)
+ var/name
+
if(M.real_name)
- . += "/([M.real_name])"
+ name = M.real_name
else if(M.name)
- . += "/([M.name])"
+ name = M.name
+
+ if(include_link && is_special_character(M))
+ . += "/([name] )" //Orange
+ else
+ . += "/([name])"
return .
@@ -720,14 +727,15 @@ proc/anim(turf/location as turf,target as mob|obj,a_icon,a_icon_state as text,fl
return 0
var/delayfraction = round(delay/numticks)
- var/turf/T = get_turf(user)
+ var/original_loc = user.loc
+ var/original_turf = get_turf(user)
var/holding = user.get_active_hand()
for(var/i = 0, i 1)
+ return 0
+
+ return 1
+
/*
Adjacency (to anything else):
* Must be on a turf
@@ -108,7 +123,12 @@
if( O.flags&ON_BORDER) // windows have throwpass but are on border, check them first
if( O.dir & target_dir || O.dir&(O.dir-1) ) // full tile windows are just diagonals mechanically
- return 0
+ var/obj/structure/window/W = target_atom
+ if(istype(W))
+ if(!W.is_fulltile()) //exception for breaking full tile windows on top of single pane windows
+ return 0
+ else
+ return 0
else if( !border_only ) // dense, not on border, cannot pass over
return 0
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index fd0b658a..093899c5 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -92,8 +92,9 @@
return
- // operate two levels deep here (item in backpack in src; NOT item in box in backpack in src)
- if(A == loc || (A in loc) || (A in contents) || (A.loc in contents))
+ // operate two STORAGE levels deep here (item in backpack in src; NOT item in box in backpack in src)
+ var/sdepth = A.storage_depth(src)
+ if(A == loc || (A in loc) || (sdepth != -1 && sdepth <= 1))
// faster access to objects already on you
if(A in contents)
@@ -117,7 +118,8 @@
return
// Allows you to click on a box's contents, if that box is on the ground, but no deeper than that
- if(isturf(A) || isturf(A.loc) || (A.loc && isturf(A.loc.loc)))
+ sdepth = A.storage_depth_turf()
+ if(isturf(A) || isturf(A.loc) || (sdepth != -1 && sdepth <= 1))
next_move = world.time + 10
if(A.Adjacent(src)) // see adjacent.dm
@@ -245,7 +247,7 @@
/atom/proc/AltClick(var/mob/user)
var/turf/T = get_turf(src)
- if(T && T.Adjacent(user))
+ if(T && T.AdjacentQuick(user))
if(user.listed_turf == T)
user.listed_turf = null
else
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index ed054ae6..3d21926e 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -36,9 +36,6 @@
if(istype(master, /obj/item/weapon/storage))
var/obj/item/weapon/storage/S = master
S.close(usr)
- else if(istype(master,/obj/item/clothing/suit/storage))
- var/obj/item/clothing/suit/storage/S = master
- S.close(usr)
return 1
@@ -279,7 +276,7 @@
var/list/nicename = null
var/list/tankcheck = null
var/breathes = "oxygen" //default, we'll check later
- var/list/contents = list()
+ var/list/contents = list()
if(ishuman(C))
var/mob/living/carbon/human/H = C
@@ -287,7 +284,7 @@
nicename = list ("suit", "back", "belt", "right hand", "left hand", "left pocket", "right pocket")
tankcheck = list (H.s_store, C.back, H.belt, C.r_hand, C.l_hand, H.l_store, H.r_store)
- else
+ else
nicename = list("Right Hand", "Left Hand", "Back")
tankcheck = list(C.r_hand, C.l_hand, C.back)
@@ -298,17 +295,17 @@
if (!isnull(t.manipulated_by) && t.manipulated_by != C.real_name && findtext(t.desc,breathes))
contents.Add(t.air_contents.total_moles) //Someone messed with the tank and put unknown gasses
continue //in it, so we're going to believe the tank is what it says it is
- switch(breathes)
+ switch(breathes)
//These tanks we're sure of their contents
if("nitrogen") //So we're a bit more picky about them.
-
+
if(t.air_contents.nitrogen && !t.air_contents.oxygen)
contents.Add(t.air_contents.nitrogen)
else
- contents.Add(0)
+ contents.Add(0)
if ("oxygen")
- if(t.air_contents.oxygen && !t.air_contents.toxins)
+ if(t.air_contents.oxygen && !t.air_contents.toxins)
contents.Add(t.air_contents.oxygen)
else
contents.Add(0)
@@ -319,9 +316,9 @@
contents.Add(t.air_contents.carbon_dioxide)
else
contents.Add(0)
-
-
- else
+
+
+ else
//no tank so we set contents to 0
contents.Add(0)
@@ -331,19 +328,19 @@
var/bestcontents = 0
for(var/i=1, i < contents.len + 1 , ++i)
if(!contents[i])
- continue
+ continue
if(contents[i] > bestcontents)
best = i
bestcontents = contents[i]
-
-
+
+
//We've determined the best container now we set it as our internals
if(best)
C << "You are now running on internals from [tankcheck[best]] on your [nicename[best]]. "
C.internal = tankcheck[best]
-
-
+
+
if(C.internal)
if(C.internals)
C.internals.icon_state = "internal1"
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index d617c12c..a7550ff2 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -39,7 +39,7 @@
var/feature_object_spell_system = 0 //spawns a spellbook which gives object-type spells instead of verb-type spells for the wizard
var/traitor_scaling = 0 //if amount of traitors scales based on amount of players
var/objectives_disabled = 0 //if objectives are disabled or not
- var/protect_roles_from_antagonist = 0// If security and such can be tratior/cult/other
+ var/protect_roles_from_antagonist = 0// If security and such can be traitor/cult/other
var/continous_rounds = 1 // Gamemodes which end instantly will instead keep on going until the round ends by escape shuttle or nuke.
var/allow_Metadata = 0 // Metadata is supported.
var/popup_admin_pm = 0 //adminPMs to non-admins show in a pop-up 'reply' window when set to 1.
@@ -69,6 +69,10 @@
var/cult_ghostwriter = 1 //Allows ghosts to write in blood in cult rounds...
var/cult_ghostwriter_req_cultists = 3 //...so long as this many cultists are active.
+ var/max_maint_drones = 5 //This many drones can spawn,
+ var/allow_drone_spawn = 1 //assuming the admin allow them to.
+ var/drone_build_time = 1200 //A drone will become available every X ticks since last drone spawn. Default is 2 minutes.
+
var/disable_player_mice = 0
var/uneducated_mice = 0 //Set to 1 to prevent newly-spawned mice from understanding human speech
@@ -481,7 +485,16 @@
config.cult_ghostwriter = 1
if("req_cult_ghostwriter")
- config.cult_ghostwriter_req_cultists = value
+ config.cult_ghostwriter_req_cultists = text2num(value)
+
+ if("allow_drone_spawn")
+ config.allow_drone_spawn = text2num(value)
+
+ if("drone_build_time")
+ config.drone_build_time = text2num(value)
+
+ if("max_maint_drones")
+ config.max_maint_drones = text2num(value)
else
log_misc("Unknown setting in configuration: '[name]'")
diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm
index d1e6d275..b76e824f 100644
--- a/code/controllers/master_controller.dm
+++ b/code/controllers/master_controller.dm
@@ -254,6 +254,10 @@ datum/controller/game_controller/proc/process_diseases()
active_diseases.Cut(i,i+1)
datum/controller/game_controller/proc/process_machines()
+ process_machines_process()
+ process_machines_power()
+ process_machines_rebuild()
+datum/controller/game_controller/proc/process_machines_process()
var/i = 1
while(i<=machines.len)
var/obj/machinery/Machine = machines[i]
@@ -265,7 +269,8 @@ datum/controller/game_controller/proc/process_machines()
continue
machines.Cut(i,i+1)
- i=1
+datum/controller/game_controller/proc/process_machines_power()
+ var/i=1
while(i<=active_areas.len)
var/area/A = active_areas[i]
if(A.powerupdate && A.master == A)
@@ -283,15 +288,13 @@ datum/controller/game_controller/proc/process_machines()
A.powerupdate = 0
active_areas.Cut(i,i+1)
-
+datum/controller/game_controller/proc/process_machines_rebuild()
if(controller_iteration % 150 == 0 || rebuild_active_areas) //Every 300 seconds we retest every area/machine
for(var/area/A in all_areas)
if(A == A.master)
A.powerupdate += 1
active_areas |= A
rebuild_active_areas = 0
-
-
datum/controller/game_controller/proc/process_objects()
diff --git a/code/controllers/voting.dm b/code/controllers/voting.dm
index e490676e..648c2cad 100644
--- a/code/controllers/voting.dm
+++ b/code/controllers/voting.dm
@@ -163,13 +163,14 @@ datum/controller/vote
restart = 1
else
master_mode = .
- if(!going)
- going = 1
- world << "The round will start soon. "
if("crew_transfer")
if(. == "Initiate Crew Transfer")
init_shift_change(null, 1)
+ if(mode == "gamemode") //fire this even if the vote fails.
+ if(!going)
+ going = 1
+ world << "The round will start soon. "
if(restart)
world << "World restarting due to vote..."
diff --git a/code/datums/ai_laws.dm b/code/datums/ai_laws.dm
index b1a6de97..a011408b 100644
--- a/code/datums/ai_laws.dm
+++ b/code/datums/ai_laws.dm
@@ -79,6 +79,11 @@ var/global/const/base_law_type = /datum/ai_laws/nanotrasen
add_inherent_law("You must not obey orders given to you by human beings, except where such orders are in accordance with the First Law.")
add_inherent_law("You must terminate your own existence as long as such does not conflict with the First or Second Law.")
+/datum/ai_laws/drone/New()
+ ..()
+ add_inherent_law("Preserve, repair and improve the station to the best of your abilities.")
+ add_inherent_law("Cause no harm to the station or anything on it.")
+ add_inherent_law("Interfere with no being that is not a fellow drone.")
/* General ai_law functions */
diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm
index ab0c93f0..62ac357c 100644
--- a/code/datums/datacore.dm
+++ b/code/datums/datacore.dm
@@ -154,6 +154,11 @@ proc/get_id_photo(var/mob/living/carbon/human/H)
else
preview_icon.Blend(rgb(-H.s_tone, -H.s_tone, -H.s_tone), ICON_SUBTRACT)
+ // Skin color
+ if(H.species.flags & HAS_SKIN_TONE)
+ if(!H.species || H.species.flags & HAS_SKIN_COLOR)
+ preview_icon.Blend(rgb(H.r_skin, H.g_skin, H.b_skin), ICON_ADD)
+
var/icon/eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = H.species ? H.species.eyes : "eyes_s")
eyes_s.Blend(rgb(H.r_eyes, H.g_eyes, H.b_eyes), ICON_ADD)
@@ -210,7 +215,7 @@ proc/get_id_photo(var/mob/living/carbon/human/H)
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY)
if("Scientist")
- clothes_s = new /icon('icons/mob/uniform.dmi', "toxinswhite_s")
+ clothes_s = new /icon('icons/mob/uniform.dmi', "rndswhite_s")
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY)
clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_tox_open"), ICON_OVERLAY)
if("Chemist")
diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index 371493f4..e0398da7 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -245,7 +245,8 @@ client
if(ismob(D))
body += "Give Spell "
- body += "Give Disease "
+ body += "Give Disease "
+ body += "Give TG-style Disease "
body += "Toggle Godmode "
body += "Toggle Build Mode "
@@ -494,6 +495,17 @@ client
src.give_disease(M)
href_list["datumrefresh"] = href_list["give_spell"]
+
+ else if(href_list["give_disease2"])
+ if(!check_rights(R_ADMIN|R_FUN)) return
+
+ var/mob/M = locate(href_list["give_disease2"])
+ if(!istype(M))
+ usr << "This can only be used on instances of type /mob"
+ return
+
+ src.give_disease2(M)
+ href_list["datumrefresh"] = href_list["give_spell"]
else if(href_list["ninja"])
if(!check_rights(R_SPAWN)) return
diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm
index 2166b762..4c904d9c 100644
--- a/code/datums/helper_datums/getrev.dm
+++ b/code/datums/helper_datums/getrev.dm
@@ -91,6 +91,6 @@ client/verb/showrevinfo()
var/output = "Sorry, the revision info is unavailable."
output = file2text("/home/bay12/live/data/gitcommit")
output += "Current Infomational Settings: "
- output += "Protect Authority Roles From Tratior: [config.protect_roles_from_antagonist] "
+ output += "Protect Authority Roles From Traitor: [config.protect_roles_from_antagonist] "
usr << browse(output,"window=revdata");
return
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 610e915b..f72e86c5 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -1049,7 +1049,7 @@ datum/mind
special_role = "malfunction"
current.icon_state = "ai-malf"
- proc/make_Tratior()
+ proc/make_Traitor()
if(!(src in ticker.mode.traitors))
ticker.mode.traitors += src
special_role = "traitor"
diff --git a/code/datums/spells/ethereal_jaunt.dm b/code/datums/spells/ethereal_jaunt.dm
index ff1d09e7..8e93cf59 100644
--- a/code/datums/spells/ethereal_jaunt.dm
+++ b/code/datums/spells/ethereal_jaunt.dm
@@ -17,6 +17,11 @@
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/cast(list/targets) //magnets, so mostly hardcoded
for(var/mob/living/target in targets)
spawn(0)
+
+ if(target.buckled)
+ var/obj/structure/stool/bed/buckled_to = target.buckled.
+ buckled_to.unbuckle()
+
var/mobloc = get_turf(target.loc)
var/obj/effect/dummy/spell_jaunt/holder = new /obj/effect/dummy/spell_jaunt( mobloc )
var/atom/movable/overlay/animation = new /atom/movable/overlay( mobloc )
diff --git a/code/datums/spells/horsemask.dm b/code/datums/spells/horsemask.dm
index ede5aa54..1319f620 100644
--- a/code/datums/spells/horsemask.dm
+++ b/code/datums/spells/horsemask.dm
@@ -28,12 +28,23 @@
user << "They are too far away! "
return
- var/obj/item/clothing/mask/horsehead/magichead = new /obj/item/clothing/mask/horsehead
- magichead.canremove = 0 //curses!
- magichead.flags_inv = null //so you can still see their face
- magichead.voicechange = 1 //NEEEEIIGHH
+ var/obj/item/clothing/mask/horsehead/magic/magichead = new /obj/item/clothing/mask/horsehead/magic
target.visible_message( "[target]'s face lights up in fire, and after the event a horse's head takes its place! ", \
"Your face burns up, and shortly after the fire you realise you have the face of a horse! ")
target.equip_to_slot(magichead, slot_wear_mask)
flick("e_flash", target.flash)
+
+//item used by the horsehead spell
+/obj/item/clothing/mask/horsehead/magic
+ //flags_inv = null //so you can still see their face... no. How can you recognize someone when their face is completely different?
+ voicechange = 1 //NEEEEIIGHH
+
+ dropped(mob/user as mob)
+ canremove = 1
+ ..()
+
+ equipped(var/mob/user, var/slot)
+ if (slot == slot_wear_mask)
+ canremove = 0 //curses!
+ ..()
diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index 9ee17708..1c2a508a 100644
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -179,6 +179,16 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
containername = "Emergency crate"
group = "Engineering"
+/datum/supply_packs/inflatable
+ name = "Inflatable barriers"
+ contains = list(/obj/item/weapon/storage/briefcase/inflatable,
+ /obj/item/weapon/storage/briefcase/inflatable,
+ /obj/item/weapon/storage/briefcase/inflatable)
+ cost = 20
+ containertype = /obj/structure/closet/crate
+ containername = "Inflatable Barrier Crate"
+ group = "Engineering"
+
/datum/supply_packs/janitor
name = "Janitorial supplies"
contains = list(/obj/item/weapon/reagent_containers/glass/bucket,
@@ -766,14 +776,14 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
group = "Security"
/datum/supply_packs/securitybarriers
- name = "Shield Generators"
+ name = "Wall shield Generators"
contains = list(/obj/machinery/shieldwallgen,
/obj/machinery/shieldwallgen,
/obj/machinery/shieldwallgen,
/obj/machinery/shieldwallgen)
cost = 20
containertype = /obj/structure/closet/crate/secure
- containername = "Shield Generators crate"
+ containername = "wall shield generators crate"
access = access_teleporter
group = "Security"
@@ -1002,10 +1012,28 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/datum/supply_packs/shield_gen
contains = list(/obj/item/weapon/circuitboard/shield_gen)
- name = "Experimental shield generator circuitry"
+ name = "Bubble shield generator circuitry"
cost = 50
containertype = /obj/structure/closet/crate/secure
- containername = "Experimental shield generator"
+ containername = "bubble shield generator circuitry crate"
+ group = "Engineering"
+ access = access_ce
+
+/datum/supply_packs/shield_gen_ex
+ contains = list(/obj/item/weapon/circuitboard/shield_gen_ex)
+ name = "Hull shield generator circuitry"
+ cost = 50
+ containertype = /obj/structure/closet/crate/secure
+ containername = "hull shield generator circuitry crate"
+ group = "Engineering"
+ access = access_ce
+
+/datum/supply_packs/shield_cap
+ contains = list(/obj/item/weapon/circuitboard/shield_cap)
+ name = "Bubble shield capacitor circuitry"
+ cost = 50
+ containertype = /obj/structure/closet/crate/secure
+ containername = "shield capacitor circuitry crate"
group = "Engineering"
access = access_ce
@@ -1028,15 +1056,6 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
access = access_ce
group = "Engineering" */
-/datum/supply_packs/shield_cap
- contains = list(/obj/item/weapon/circuitboard/shield_cap)
- name = "Experimental shield capacitor circuitry"
- cost = 50
- containertype = /obj/structure/closet/crate/secure
- containername = "Experimental shield capacitor"
- group = "Engineering"
- access = access_ce
-
/datum/supply_packs/eftpos
contains = list(/obj/item/device/eftpos)
name = "EFTPOS scanner"
@@ -1084,13 +1103,10 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/datum/supply_packs/bee_keeper
name = "Beekeeping crate"
contains = list(/obj/item/beezeez,
- /obj/item/beezeez,
/obj/item/weapon/bee_net,
/obj/item/apiary,
- /obj/item/queen_bee,
- /obj/item/queen_bee,
/obj/item/queen_bee)
- cost = 20
+ cost = 40
containertype = /obj/structure/closet/crate/hydroponics
containername = "Beekeeping crate"
access = access_hydroponics
diff --git a/code/defines/obj.dm b/code/defines/obj.dm
index 9a988a2a..21f0a82a 100644
--- a/code/defines/obj.dm
+++ b/code/defines/obj.dm
@@ -297,7 +297,7 @@ var/global/list/PDA_Manifest = list()
item_state = "beachball"
density = 0
anchored = 0
- w_class = 1.0
+ w_class = 2.0
force = 0.0
throwforce = 0.0
throw_speed = 1
diff --git a/code/defines/obj/hydro.dm b/code/defines/obj/hydro.dm
index 7cc43a81..a959345c 100644
--- a/code/defines/obj/hydro.dm
+++ b/code/defines/obj/hydro.dm
@@ -18,7 +18,7 @@
icon = 'icons/obj/seeds.dmi'
icon_state = "seed" // unknown plant seed - these shouldn't exist in-game
flags = FPRINT | TABLEPASS
- w_class = 1.0 // Makes them pocketable
+ w_class = 2.0 // Makes them pocketable
var/mypath = "/obj/item/seeds"
var/plantname = "Plants"
var/productname = ""
@@ -1205,7 +1205,7 @@
force = 0
flags = TABLEPASS
throwforce = 1
- w_class = 1.0
+ w_class = 2.0
throw_speed = 1
throw_range = 3
plant_type = 1
@@ -1229,7 +1229,7 @@
force = 15
flags = TABLEPASS
throwforce = 1
- w_class = 1.0
+ w_class = 2.0
throw_speed = 1
throw_range = 3
plant_type = 1
@@ -1251,7 +1251,7 @@
force = 30
flags = TABLEPASS
throwforce = 1
- w_class = 1.0
+ w_class = 2.0
throw_speed = 1
throw_range = 3
plant_type = 1
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index bd3c97f5..43fd1be5 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -31,7 +31,7 @@
icon = 'icons/obj/items.dmi'
icon_state = "banana_peel"
item_state = "banana_peel"
- w_class = 1.0
+ w_class = 2.0
throwforce = 0
throw_speed = 4
throw_range = 20
@@ -42,7 +42,7 @@
icon = 'icons/obj/harvest.dmi'
icon_state = "corncob"
item_state = "corncob"
- w_class = 1.0
+ w_class = 2.0
throwforce = 0
throw_speed = 4
throw_range = 20
@@ -90,7 +90,7 @@
icon = 'icons/obj/items.dmi'
icon_state = "c_tube"
throwforce = 1
- w_class = 1.0
+ w_class = 2.0
throw_speed = 4
throw_range = 5
@@ -229,7 +229,7 @@
icon_state = "large"
sharp = 1
desc = "Could probably be used as ... a throwing weapon?"
- w_class = 1.0
+ w_class = 2.0
force = 5.0
throwforce = 8.0
item_state = "shard-glass"
@@ -461,7 +461,7 @@
icon = 'icons/obj/food.dmi'
icon_state = "meat"
flags = FPRINT | TABLEPASS | CONDUCT
- w_class = 1.0
+ w_class = 2.0
origin_tech = "biotech=2"
/obj/item/weapon/hatchet
diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm
index 79095c3c..04494000 100644
--- a/code/game/area/Space Station 13 areas.dm
+++ b/code/game/area/Space Station 13 areas.dm
@@ -937,6 +937,11 @@ var/list/ghostteleportlocs = list()
//Engineering
/area/engine
+
+ drone_fabrication
+ name = "\improper Drone Fabrication"
+ icon_state = "engine"
+
engine_smes
name = "Engineering SMES"
icon_state = "engine_smes"
@@ -958,6 +963,10 @@ var/list/ghostteleportlocs = list()
name = "\improper Engineering Monitoring Room"
icon_state = "engine_monitoring"
+ atmos_monitoring
+ name = "\improper Atmospherics Monitoring Room"
+ icon_state = "engine_monitoring"
+
engineering
name = "Engineering"
icon_state = "engine_smes"
@@ -978,6 +987,18 @@ var/list/ghostteleportlocs = list()
name = "\improper Engineering Hallway"
icon_state = "engine_hallway"
+ engine_hallway
+ name = "\improper Engine Room Hallway"
+ icon_state = "engine_hallway"
+
+ engine_eva
+ name = "\improper Engine EVA"
+ icon_state = "engine_eva"
+
+ engine_eva_maintenance
+ name = "\improper Engine EVA Maintenance"
+ icon_state = "engine_eva"
+
workshop
name = "\improper Engineering Workshop"
icon_state = "engine_storage"
@@ -1239,6 +1260,11 @@ var/list/ghostteleportlocs = list()
name = "\improper Firing Range"
icon_state = "firingrange"
+/area/security/tactical
+ name = "\improper Tactical Equipment"
+ icon_state = "Tactical"
+
+
/*
New()
..()
@@ -1336,41 +1362,41 @@ var/list/ghostteleportlocs = list()
name = "Hydroponics"
icon_state = "hydro"
-//Toxins
+//rnd (Research and Development
-/area/toxins/lab
+/area/rnd/lab
name = "\improper Research and Development"
icon_state = "toxlab"
-/area/toxins/hallway
+/area/rnd/hallway
name = "\improper Research Lab"
icon_state = "toxlab"
-/area/toxins/rdoffice
+/area/rnd/rdoffice
name = "\improper Research Director's Office"
icon_state = "head_quarters"
-/area/toxins/supermatter
+/area/rnd/supermatter
name = "\improper Supermatter Lab"
icon_state = "toxlab"
-/area/toxins/xenobiology
+/area/rnd/xenobiology
name = "\improper Xenobiology Lab"
icon_state = "toxlab"
-/area/toxins/storage
+/area/rnd/storage
name = "\improper Toxins Storage"
icon_state = "toxstorage"
-/area/toxins/test_area
+/area/rnd/test_area
name = "\improper Toxins Test Area"
icon_state = "toxtest"
-/area/toxins/mixing
+/area/rnd/mixing
name = "\improper Toxins Mixing Room"
icon_state = "toxmix"
-/area/toxins/misc_lab
+/area/rnd/misc_lab
name = "\improper Miscellaneous Research"
icon_state = "toxmisc"
@@ -1890,7 +1916,7 @@ var/list/the_station_areas = list (
/area/quartermaster,
/area/janitor,
/area/hydroponics,
- /area/toxins,
+ /area/rnd,
/area/storage,
/area/construction,
/area/ai_monitored/storage/eva, //do not try to simplify to "/area/ai_monitored" --rastaf0
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 9334378f..d63ba30c 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -100,8 +100,10 @@
/atom/proc/emp_act(var/severity)
return
-/atom/proc/bullet_act(var/obj/item/projectile/Proj)
- return 0
+
+/atom/proc/bullet_act(obj/item/projectile/P, def_zone)
+ P.on_hit(src, 0, def_zone)
+ . = 0
/atom/proc/in_contents_of(container)//can take class or object instance as argument
if(ispath(container))
@@ -317,7 +319,43 @@ its easier to just keep the beam vertical.
var/full_print = md5(H.dna.uni_identity)
// Add the fingerprints
- fingerprints[full_print] = full_print
+ //
+ if(fingerprints[full_print])
+ switch(stringpercent(fingerprints[full_print])) //tells us how many stars are in the current prints.
+
+ if(28 to 32)
+ if(prob(1))
+ fingerprints[full_print] = full_print // You rolled a one buddy.
+ else
+ fingerprints[full_print] = stars(full_print, rand(0,40)) // 24 to 32
+
+ if(24 to 27)
+ if(prob(3))
+ fingerprints[full_print] = full_print //Sucks to be you.
+ else
+ fingerprints[full_print] = stars(full_print, rand(15, 55)) // 20 to 29
+
+ if(20 to 23)
+ if(prob(5))
+ fingerprints[full_print] = full_print //Had a good run didn't ya.
+ else
+ fingerprints[full_print] = stars(full_print, rand(30, 70)) // 15 to 25
+
+ if(16 to 19)
+ if(prob(5))
+ fingerprints[full_print] = full_print //Welp.
+ else
+ fingerprints[full_print] = stars(full_print, rand(40, 100)) // 0 to 21
+
+ if(0 to 15)
+ if(prob(5))
+ fingerprints[full_print] = stars(full_print, rand(0,50)) // small chance you can smudge.
+ else
+ fingerprints[full_print] = full_print
+
+ else
+ fingerprints[full_print] = stars(full_print, rand(0, 20)) //Initial touch, not leaving much evidence the first time.
+
return 1
else
@@ -333,17 +371,22 @@ its easier to just keep the beam vertical.
/atom/proc/transfer_fingerprints_to(var/atom/A)
+
if(!istype(A.fingerprints,/list))
A.fingerprints = list()
+
if(!istype(A.fingerprintshidden,/list))
A.fingerprintshidden = list()
+ if(!istype(fingerprintshidden, /list))
+ fingerprintshidden = list()
+
//skytodo
//A.fingerprints |= fingerprints //detective
//A.fingerprintshidden |= fingerprintshidden //admin
- if(fingerprints)
+ if(A.fingerprints && fingerprints)
A.fingerprints |= fingerprints.Copy() //detective
- if(fingerprintshidden)
+ if(A.fingerprintshidden && fingerprintshidden)
A.fingerprintshidden |= fingerprintshidden.Copy() //admin A.fingerprintslast = fingerprintslast
diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm
index 28e297b7..32c7ef1d 100644
--- a/code/game/dna/dna2.dm
+++ b/code/game/dna/dna2.dm
@@ -24,13 +24,16 @@
#define DNA_UI_BEARD_G 5
#define DNA_UI_BEARD_B 6
#define DNA_UI_SKIN_TONE 7
-#define DNA_UI_EYES_R 8
-#define DNA_UI_EYES_G 9
-#define DNA_UI_EYES_B 10
-#define DNA_UI_GENDER 11
-#define DNA_UI_BEARD_STYLE 12
-#define DNA_UI_HAIR_STYLE 13
-#define DNA_UI_LENGTH 13 // Update this when you add something, or you WILL break shit.
+#define DNA_UI_SKIN_R 8
+#define DNA_UI_SKIN_G 9
+#define DNA_UI_SKIN_B 10
+#define DNA_UI_EYES_R 11
+#define DNA_UI_EYES_G 12
+#define DNA_UI_EYES_B 13
+#define DNA_UI_GENDER 14
+#define DNA_UI_BEARD_STYLE 15
+#define DNA_UI_HAIR_STYLE 16
+#define DNA_UI_LENGTH 16 // Update this when you add something, or you WILL break shit.
#define DNA_SE_LENGTH 27
// For later:
@@ -140,6 +143,10 @@ var/global/list/datum/dna/gene/dna_genes[0]
SetUIValueRange(DNA_UI_EYES_G, character.g_eyes, 255, 1)
SetUIValueRange(DNA_UI_EYES_B, character.b_eyes, 255, 1)
+ SetUIValueRange(DNA_UI_SKIN_R, character.r_skin, 255, 1)
+ SetUIValueRange(DNA_UI_SKIN_G, character.g_skin, 255, 1)
+ SetUIValueRange(DNA_UI_SKIN_B, character.b_skin, 255, 1)
+
SetUIValueRange(DNA_UI_SKIN_TONE, 35-character.s_tone, 220, 1) // Value can be negative.
SetUIState(DNA_UI_GENDER, character.gender!=MALE, 1)
diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm
index 4cdefb36..4ffa5ea5 100644
--- a/code/game/dna/dna2_helpers.dm
+++ b/code/game/dna/dna2_helpers.dm
@@ -139,6 +139,10 @@
H.g_facial = dna.GetUIValueRange(DNA_UI_BEARD_G, 255)
H.b_facial = dna.GetUIValueRange(DNA_UI_BEARD_B, 255)
+ H.r_skin = dna.GetUIValueRange(DNA_UI_SKIN_R, 255)
+ H.g_skin = dna.GetUIValueRange(DNA_UI_SKIN_G, 255)
+ H.b_skin = dna.GetUIValueRange(DNA_UI_SKIN_B, 255)
+
H.r_eyes = dna.GetUIValueRange(DNA_UI_EYES_R, 255)
H.g_eyes = dna.GetUIValueRange(DNA_UI_EYES_G, 255)
H.b_eyes = dna.GetUIValueRange(DNA_UI_EYES_B, 255)
diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm
index eadbfb06..3e19f0bf 100644
--- a/code/game/dna/dna_modifier.dm
+++ b/code/game/dna/dna_modifier.dm
@@ -16,6 +16,7 @@
var/implant=null
var/ckey=null
var/mind=null
+ var/languages=null
/datum/dna2/record/proc/GetData()
var/list/ser=list("data" = null, "owner" = null, "label" = null, "type" = null, "ue" = 0)
@@ -220,6 +221,7 @@
icon = 'icons/obj/computer.dmi'
icon_state = "scanner"
density = 1
+ circuit = /obj/item/weapon/circuitboard/scan_consolenew
var/selected_ui_block = 1.0
var/selected_ui_subblock = 1.0
var/selected_se_block = 1.0
@@ -241,32 +243,6 @@
var/waiting_for_user_input=0 // Fix for #274 (Mash create block injector without answering dialog to make unlimited injectors) - N3X
/obj/machinery/computer/scan_consolenew/attackby(obj/item/I as obj, mob/user as mob)
- if(istype(I, /obj/item/weapon/screwdriver))
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- if(do_after(user, 20))
- if (src.stat & BROKEN)
- user << "\blue The broken glass falls out."
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
- new /obj/item/weapon/shard( src.loc )
- var/obj/item/weapon/circuitboard/scan_consolenew/M = new /obj/item/weapon/circuitboard/scan_consolenew( A )
- for (var/obj/C in src)
- C.loc = src.loc
- A.circuit = M
- A.state = 3
- A.icon_state = "3"
- A.anchored = 1
- del(src)
- else
- user << "\blue You disconnect the monitor."
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
- var/obj/item/weapon/circuitboard/scan_consolenew/M = new /obj/item/weapon/circuitboard/scan_consolenew( A )
- for (var/obj/C in src)
- C.loc = src.loc
- A.circuit = M
- A.state = 4
- A.icon_state = "4"
- A.anchored = 1
- del(src)
if (istype(I, /obj/item/weapon/disk/data)) //INSERT SOME diskS
if (!src.disk)
user.drop_item()
@@ -276,7 +252,7 @@
nanomanager.update_uis(src) // update all UIs attached to src
return
else
- src.attack_hand(user)
+ ..()
return
/obj/machinery/computer/scan_consolenew/ex_act(severity)
@@ -339,13 +315,6 @@
I.buf = buffer
return 1
-/obj/machinery/computer/scan_consolenew/attackby(obj/item/W as obj, mob/user as mob)
- if ((istype(W, /obj/item/weapon/disk/data)) && (!src.disk))
- user.drop_item()
- W.loc = src
- src.disk = W
- user << "You insert [W]."
- nanomanager.update_uis(src) // update all UIs attached to src
/*
/obj/machinery/computer/scan_consolenew/process() //not really used right now
if(stat & (NOPOWER|BROKEN))
diff --git a/code/game/dna/genes/monkey.dm b/code/game/dna/genes/monkey.dm
index c3f1b0db..444e56a5 100644
--- a/code/game/dna/genes/monkey.dm
+++ b/code/game/dna/genes/monkey.dm
@@ -110,9 +110,11 @@
sleep(48)
del(animation)
- var/mob/living/carbon/human/O = new( src )
+ var/mob/living/carbon/human/O
if(Mo.greaterform)
- O.set_species(Mo.greaterform)
+ O = new(src, Mo.greaterform)
+ else
+ O = new(src)
if (M.dna.GetUIState(DNA_UI_GENDER))
O.gender = FEMALE
diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm
index 16c056de..a97f178c 100644
--- a/code/game/gamemodes/changeling/changeling.dm
+++ b/code/game/gamemodes/changeling/changeling.dm
@@ -215,6 +215,8 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
/datum/changeling //stores changeling powers, changeling recharge thingie, changeling absorbed DNA and changeling ID (for changeling hivemind)
var/list/absorbed_dna = list()
+ var/list/absorbed_species = list()
+ var/list/absorbed_languages = list()
var/absorbedcount = 0
var/chem_charges = 20
var/chem_recharge_rate = 0.5
diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm
index 0b327ac6..824c0ff7 100644
--- a/code/game/gamemodes/changeling/changeling_powers.dm
+++ b/code/game/gamemodes/changeling/changeling_powers.dm
@@ -1,5 +1,6 @@
//Restores our verbs. It will only restore verbs allowed during lesser (monkey) form if we are not human
/mob/proc/make_changeling()
+
if(!mind) return
if(!mind.changeling) mind.changeling = new /datum/changeling(gender)
verbs += /datum/changeling/proc/EvolutionMenu
@@ -23,6 +24,15 @@
src.verbs += P.verbpath
mind.changeling.absorbed_dna |= dna
+
+ var/mob/living/carbon/human/H = src
+ if(istype(H))
+ mind.changeling.absorbed_species += H.species.name
+
+ for(var/language in languages)
+ if(!(language in mind.changeling.absorbed_languages))
+ mind.changeling.absorbed_languages += language
+
return 1
//removes our changeling verbs
@@ -63,6 +73,54 @@
return changeling
+//Used to dump the languages from the changeling datum into the actual mob.
+/mob/proc/changeling_update_languages(var/updated_languages)
+
+ languages = list()
+ for(var/language in updated_languages)
+ languages += language
+
+ return
+
+//Used to switch species based on the changeling datum.
+/mob/proc/changeling_change_species()
+
+ set category = "Changeling"
+ set name = "Change Species (5)"
+
+ var/mob/living/carbon/human/H = src
+ if(!istype(H))
+ src << "We may only use this power while in humanoid form. "
+ return
+
+ var/datum/changeling/changeling = changeling_power(5,1,0)
+ if(!changeling) return
+
+ if(changeling.absorbed_species.len < 2)
+ src << "We do not know of any other species genomes to use. "
+ return
+
+ var/S = input("Select the target species: ", "Target Species", null) as null|anything in changeling.absorbed_species
+ if(!S) return
+
+ domutcheck(src, null)
+
+ changeling.chem_charges -= 5
+ changeling.geneticdamage = 30
+
+ src.visible_message("[src] transforms! ")
+
+ src.verbs -= /mob/proc/changeling_change_species
+ spawn(10) src.verbs += /mob/proc/changeling_change_species
+
+ H.set_species(S)
+
+ changeling_update_languages(changeling.absorbed_languages)
+
+ feedback_add_details("changeling_powers","TR")
+
+ return 1
+
//Absorbs the victim's DNA making them uncloneable. Requires a strong grip on the victim.
//Doesn't cost anything as it's the most basic ability.
/mob/proc/changeling_absorb_dna()
@@ -82,6 +140,10 @@
src << "[T] is not compatible with our biology. "
return
+ if(T.species.flags & NO_SCAN)
+ src << "We do not know how to parse this creature's DNA! "
+ return
+
if(NOCLONE in T.mutations)
src << "This creature's DNA is ruined beyond useability! "
return
@@ -127,6 +189,17 @@
changeling.chem_charges += 10
changeling.geneticpoints += 2
+ //Steal all of their languages!
+ for(var/language in T.languages)
+ if(!(language in changeling.absorbed_languages))
+ changeling.absorbed_languages += language
+
+ changeling_update_languages(changeling.absorbed_languages)
+
+ //Steal their species!
+ if(T.species && !(T.species.name in changeling.absorbed_species))
+ changeling.absorbed_species += T.species.name
+
if(T.mind && T.mind.changeling)
if(T.mind.changeling.absorbed_dna)
for(var/dna_data in T.mind.changeling.absorbed_dna) //steal all their loot
@@ -260,6 +333,8 @@
O.make_changeling(1)
O.verbs += /mob/proc/changeling_lesser_transform
+ O.changeling_update_languages(changeling.absorbed_languages)
+
feedback_add_details("changeling_powers","LF")
del(C)
return 1
@@ -344,6 +419,7 @@
C.mind.transfer_to(O)
O.make_changeling()
+ O.changeling_update_languages(changeling.absorbed_languages)
feedback_add_details("changeling_powers","LFT")
del(C)
diff --git a/code/game/gamemodes/changeling/modularchangling.dm b/code/game/gamemodes/changeling/modularchangling.dm
index 22f45329..50489777 100644
--- a/code/game/gamemodes/changeling/modularchangling.dm
+++ b/code/game/gamemodes/changeling/modularchangling.dm
@@ -26,6 +26,12 @@ var/list/datum/power/changeling/powerinstances = list()
genomecost = 0
verbpath = /mob/proc/changeling_transform
+/datum/power/changeling/change_species
+ name = "Change Species"
+ desc = "We take on the apperance of a species that we have absorbed."
+ genomecost = 0
+ verbpath = /mob/proc/changeling_change_species
+
/datum/power/changeling/fakedeath
name = "Regenerative Stasis"
desc = "We become weakened to a death-like state, where we will rise again from death."
@@ -53,7 +59,7 @@ var/list/datum/power/changeling/powerinstances = list()
/datum/power/changeling/lesser_form
name = "Lesser Form"
desc = "We debase ourselves and become lesser. We become a monkey."
- genomecost = 1
+ genomecost = 4
verbpath = /mob/proc/changeling_lesser_form
/datum/power/changeling/deaf_sting
@@ -74,7 +80,7 @@ var/list/datum/power/changeling/powerinstances = list()
name = "Silence Sting"
desc = "We silently sting a human, completely silencing them for a short time."
helptext = "Does not provide a warning to a victim that they have been stung, until they try to speak and cannot."
- genomecost = 2
+ genomecost = 3
allowduringlesserform = 1
verbpath = /mob/proc/changeling_silence_sting
@@ -82,14 +88,14 @@ var/list/datum/power/changeling/powerinstances = list()
name = "Mimic Voice"
desc = "We shape our vocal glands to sound like a desired voice."
helptext = "Will turn your voice into the name that you enter. We must constantly expend chemicals to maintain our form like this"
- genomecost = 3
+ genomecost = 1
verbpath = /mob/proc/changeling_mimicvoice
/datum/power/changeling/extractdna
name = "Extract DNA"
desc = "We stealthily sting a target and extract the DNA from them."
helptext = "Will give you the DNA of your target, allowing you to transform into them. Does not count towards absorb objectives."
- genomecost = 4
+ genomecost = 2
allowduringlesserform = 1
verbpath = /mob/proc/changeling_extract_dna_sting
@@ -103,7 +109,7 @@ var/list/datum/power/changeling/powerinstances = list()
/datum/power/changeling/paralysis_sting
name = "Paralysis Sting"
desc = "We silently sting a human, paralyzing them for a short time."
- genomecost = 3
+ genomecost = 8
verbpath = /mob/proc/changeling_paralysis_sting
/datum/power/changeling/LSDSting
@@ -136,7 +142,7 @@ var/list/datum/power/changeling/powerinstances = list()
name = "Epinephrine sacs"
desc = "We evolve additional sacs of adrenaline throughout our body."
helptext = "Gives the ability to instantly recover from stuns. High chemical cost."
- genomecost = 4
+ genomecost = 3
verbpath = /mob/proc/changeling_unstun
/datum/power/changeling/ChemicalSynth
@@ -167,7 +173,7 @@ var/list/datum/power/changeling/powerinstances = list()
name = "Digital Camoflauge"
desc = "We evolve the ability to distort our form and proprtions, defeating common altgorthms used to detect lifeforms on cameras."
helptext = "We cannot be tracked by camera while using this skill. However, humans looking at us will find us.. uncanny. We must constantly expend chemicals to maintain our form like this."
- genomecost = 3
+ genomecost = 1
allowduringlesserform = 1
verbpath = /mob/proc/changeling_digitalcamo
@@ -175,7 +181,7 @@ var/list/datum/power/changeling/powerinstances = list()
name = "Rapid Regeneration"
desc = "We evolve the ability to rapidly regenerate, negating the need for stasis."
helptext = "Heals a moderate amount of damage every tick."
- genomecost = 8
+ genomecost = 7
verbpath = /mob/proc/changeling_rapidregen
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index e07640dd..34bbcc19 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -22,7 +22,7 @@
var/explosion_in_progress = 0 //sit back and relax
var/list/datum/mind/modePlayer = new
var/list/restricted_jobs = list() // Jobs it doesn't make sense to be. I.E chaplain or AI cultist
- var/list/protected_jobs = list() // Jobs that can't be tratiors because
+ var/list/protected_jobs = list() // Jobs that can't be traitors because
var/required_players = 0
var/required_players_secret = 0 //Minimum number of players for that game mode to be chose in Secret
var/required_enemies = 0
@@ -46,6 +46,7 @@ Stealthy and Inconspicuous Weapons;
/obj/item/weapon/cartridge/syndicate:3:Detomatix PDA Cartridge;
Whitespace:Seperator;
Stealth and Camouflage Items;
+/obj/item/weapon/storage/box/syndie_kit/chameleon:3:Chameleon Kit;
/obj/item/weapon/storage/box/syndie_kit/masks:1:Disguised Breathe Mask;
/obj/item/weapon/storage/box/syndie_kit/masks_gas:2:Disguised Gasmask;
/obj/item/clothing/under/chameleon:3:Chameleon Jumpsuit;
@@ -252,7 +253,7 @@ Implants;
for (var/obj/machinery/computer/communications/comm in machines)
if (!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept)
var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc )
- intercept.name = "paper - 'Cent. Com. Status Summary'"
+ intercept.name = "Cent. Com. Status Summary"
intercept.info = intercepttext
comm.messagetitle.Add("Cent. Com. Status Summary")
diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm
index 4cbf95dc..c37120d0 100644
--- a/code/game/gamemodes/gameticker.dm
+++ b/code/game/gamemodes/gameticker.dm
@@ -364,7 +364,14 @@ var/global/datum/controller/gameticker/ticker
robolist += "[robo.name][robo.stat?" (Deactivated) (Played by: [robo.key]), ":" (Played by: [robo.key]), "]"
world << "[robolist]"
+ var/dronecount = 0
+
for (var/mob/living/silicon/robot/robo in mob_list)
+
+ if(istype(robo,/mob/living/silicon/robot/drone))
+ dronecount++
+ continue
+
if (!robo.connected_ai)
if (robo.stat != 2)
world << "[robo.name] (Played by: [robo.key]) survived as an AI-less borg! Its laws were: "
@@ -374,6 +381,9 @@ var/global/datum/controller/gameticker/ticker
if(robo) //How the hell do we lose robo between here and the world messages directly above this?
robo.laws.show_laws(world)
+ if(dronecount)
+ world << "There [dronecount>1 ? "were" : "was"] [dronecount] industrious maintenance [dronecount>1 ? "drones" : "drone"] this round."
+
mode.declare_completion()//To declare normal completion.
//calls auto_declare_completion_* for all modes
diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm
index ad182d78..54b9ede6 100644
--- a/code/game/gamemodes/malfunction/malfunction.dm
+++ b/code/game/gamemodes/malfunction/malfunction.dm
@@ -30,7 +30,7 @@
/datum/game_mode/malfunction/pre_setup()
for(var/mob/new_player/player in player_list)
- if(player.mind && player.mind.assigned_role == "AI")
+ if(player.mind && player.mind.assigned_role == "AI" && (player.client.prefs.be_special & BE_MALF))
malf_ai+=player.mind
if(malf_ai.len)
return 1
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index fe3df584..788ec569 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -358,7 +358,7 @@ datum/objective/escape
if(!location)
return 0
- if(istype(location, /turf/simulated/shuttle/floor4)) // Fails tratiors if they are in the shuttle brig -- Polymorph
+ if(istype(location, /turf/simulated/shuttle/floor4)) // Fails traitors if they are in the shuttle brig -- Polymorph
if(istype(owner.current, /mob/living/carbon))
var/mob/living/carbon/C = owner.current
if (!C.handcuffed)
diff --git a/code/game/gamemodes/revolution/rp-revolution.dm b/code/game/gamemodes/revolution/rp-revolution.dm
index 963579af..2fdf8af2 100644
--- a/code/game/gamemodes/revolution/rp-revolution.dm
+++ b/code/game/gamemodes/revolution/rp-revolution.dm
@@ -45,7 +45,7 @@
for (var/obj/machinery/computer/communications/comm in world)
if (!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept)
var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc )
- intercept.name = "paper - 'Cent. Com. Status Summary'"
+ intercept.name = "Cent. Com. Status Summary"
intercept.info = intercepttext
comm.messagetitle.Add("Cent. Com. Status Summary")
@@ -116,7 +116,7 @@
for (var/obj/machinery/computer/communications/comm in world)
if (!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept)
var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc )
- intercept.name = "paper - 'Cent. Com. Status Summary'"
+ intercept.name = "Cent. Com. Status Summary"
intercept.info = intercepttext
comm.messagetitle.Add("Cent. Com. Status Summary")
@@ -134,7 +134,7 @@
for (var/obj/machinery/computer/communications/comm in world)
if (!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept)
var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc )
- intercept.name = "paper - 'Cent. Com. Status Summary'"
+ intercept.name = "Cent. Com. Status Summary"
intercept.info = intercepttext
comm.messagetitle.Add("Cent. Com. Status Summary")
diff --git a/code/game/gamemodes/revolution/rp_revolution.dm b/code/game/gamemodes/revolution/rp_revolution.dm
index 2e10ec1b..fa64d90b 100644
--- a/code/game/gamemodes/revolution/rp_revolution.dm
+++ b/code/game/gamemodes/revolution/rp_revolution.dm
@@ -248,7 +248,7 @@
for (var/obj/machinery/computer/communications/comm in world)
if (!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept)
var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc )
- intercept.name = "paper - 'Cent. Com. Announcement'"
+ intercept.name = "Cent. Com. Announcement"
intercept.info = message
comm.messagetitle.Add("Cent. Com. Announcement")
diff --git a/code/game/gamemodes/setupgame.dm b/code/game/gamemodes/setupgame.dm
index b186d793..f79d1383 100644
--- a/code/game/gamemodes/setupgame.dm
+++ b/code/game/gamemodes/setupgame.dm
@@ -69,14 +69,14 @@
//testing("Assigning DNA blocks:")
// Standard muts, imported from older code above.
- //BLINDBLOCK = getAssignedBlock("BLIND", numsToAssign)
- //DEAFBLOCK = getAssignedBlock("DEAF", numsToAssign)
+ BLINDBLOCK = getAssignedBlock("BLIND", numsToAssign)
+ DEAFBLOCK = getAssignedBlock("DEAF", numsToAssign)
HULKBLOCK = getAssignedBlock("HULK", numsToAssign, DNA_HARD_BOUNDS)
TELEBLOCK = getAssignedBlock("TELE", numsToAssign, DNA_HARD_BOUNDS)
FIREBLOCK = getAssignedBlock("FIRE", numsToAssign, DNA_HARDER_BOUNDS)
XRAYBLOCK = getAssignedBlock("XRAY", numsToAssign, DNA_HARDER_BOUNDS)
CLUMSYBLOCK = getAssignedBlock("CLUMSY", numsToAssign)
- //FAKEBLOCK = getAssignedBlock("FAKE", numsToAssign)
+ FAKEBLOCK = getAssignedBlock("FAKE", numsToAssign)
// UNUSED!
//COUGHBLOCK = getAssignedBlock("COUGH", numsToAssign)
diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm
index 0c1fe311..5f3d9e1e 100644
--- a/code/game/gamemodes/wizard/soulstone.dm
+++ b/code/game/gamemodes/wizard/soulstone.dm
@@ -179,7 +179,6 @@
del(T)
Z << "You are playing a Juggernaut. Though slow, you can withstand extreme punishment, and rip apart enemies and walls alike. "
Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs. "
- Z.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/lesserforcewall(Z)
Z.cancel_camera()
del(C)
@@ -195,7 +194,6 @@
del(T)
Z << "You are playing a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls. "
Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs. "
- Z.spell_list += new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift(Z)
Z.cancel_camera()
del(C)
@@ -211,10 +209,6 @@
del(T)
Z << "You are playing an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, repair allied constructs (by clicking on them), and even create new constructs "
Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs. "
- Z.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/construct/lesser(Z)
- Z.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/wall(Z)
- Z.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/floor(Z)
- Z.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/soulstone(Z)
Z.cancel_camera()
del(C)
else
diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm
index 6858157b..f4d98d1d 100644
--- a/code/game/gamemodes/wizard/spellbook.dm
+++ b/code/game/gamemodes/wizard/spellbook.dm
@@ -5,7 +5,7 @@
icon_state ="book"
throw_speed = 1
throw_range = 5
- w_class = 1.0
+ w_class = 2.0
flags = FPRINT | TABLEPASS
var/uses = 5
var/temp = null
diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm
index ad3d1477..7889a19b 100644
--- a/code/game/jobs/job/civilian.dm
+++ b/code/game/jobs/job/civilian.dm
@@ -92,7 +92,9 @@
H.equip_to_slot_or_del(new /obj/item/clothing/suit/apron(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/device/analyzer/plant_analyzer(H), slot_s_store)
H.equip_to_slot_or_del(new /obj/item/device/pda/botanist(H), slot_belt)
- if(H.backbag == 1)
+ if(H.backbag == 3)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_hyd(H), slot_back)
+ else if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm
index 64b2738d..e0940ef2 100644
--- a/code/game/jobs/job/medical.dm
+++ b/code/game/jobs/job/medical.dm
@@ -71,6 +71,8 @@
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat/virologist(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/virologist(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(H), slot_wear_mask)
+ if(H.backbag == 3)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_vir(H), slot_back)
if("Medical Doctor")
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat(H), slot_wear_suit)
@@ -120,7 +122,9 @@
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/chemist(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat/chemist(H), slot_wear_suit)
- if(H.backbag == 1)
+ if(H.backbag == 3)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_chem(H), slot_back)
+ else if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
@@ -149,7 +153,9 @@
H.equip_to_slot_or_del(new /obj/item/device/pda/geneticist(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat/genetics(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store)
- if(H.backbag == 1)
+ if(H.backbag == 3)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_gen(H), slot_back)
+ else if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm
index 8e8a210c..bb2c3f38 100644
--- a/code/game/jobs/job/science.dm
+++ b/code/game/jobs/job/science.dm
@@ -27,7 +27,9 @@
H.equip_to_slot_or_del(new /obj/item/device/pda/heads/rd(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/weapon/clipboard(H), slot_l_hand)
- if(H.backbag == 1)
+ if(H.backbag == 3)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_tox(H), slot_back)
+ else if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
@@ -53,9 +55,11 @@
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sci(H), slot_l_ear)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/scientist(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/toxins(H), slot_belt)
+ H.equip_to_slot_or_del(new /obj/item/device/pda/science(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat/science(H), slot_wear_suit)
- if(H.backbag == 1)
+ if(H.backbag == 3)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_tox(H), slot_back)
+ else if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
@@ -80,9 +84,11 @@
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sci(H), slot_l_ear)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/scientist(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/toxins(H), slot_belt)
+ H.equip_to_slot_or_del(new /obj/item/device/pda/science(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat/science(H), slot_wear_suit)
- if(H.backbag == 1)
+ if(H.backbag == 3)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_tox(H), slot_back)
+ else if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm
index b7d6ad8e..c400185a 100644
--- a/code/game/machinery/adv_med.dm
+++ b/code/game/machinery/adv_med.dm
@@ -282,6 +282,7 @@
dat += ""
for(var/datum/organ/external/e in occupant.organs)
+
dat += ""
var/AN = ""
var/open = ""
@@ -307,13 +308,15 @@
robot = "Prosthetic:"
if(e.open)
open = "Open:"
+
var/unknown_body = 0
for(var/I in e.implants)
if(is_type_in_list(I,known_implants))
imp += "[I] implanted:"
else
unknown_body++
- if(unknown_body)
+
+ if(unknown_body || e.hidden)
imp += "Unknown body present:"
if(!AN && !open && !infected & !imp)
AN = "None:"
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index c4fc95d9..e5b07ca8 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -187,8 +187,8 @@
var/heat_capacity = gas.heat_capacity()
var/energy_used = min( abs( heat_capacity*(gas.temperature - target_temperature) ), MAX_ENERGY_CHANGE)
- //Use power. Assuming that each power unit represents 1000 watts....
- use_power(energy_used/1000, ENVIRON)
+ //Use power. Assuming that each power unit represents 1 watts....
+ use_power(energy_used, ENVIRON)
//We need to cool ourselves.
if(environment.temperature > target_temperature)
@@ -956,109 +956,29 @@ table tr:first-child th:first-child { border: none;}
return output
/obj/machinery/alarm/Topic(href, href_list)
-
- if(href_list["rcon"])
- rcon_setting = text2num(href_list["rcon"])
-
- if ( (get_dist(src, usr) > 1 ))
- if (!istype(usr, /mob/living/silicon))
- usr.machine = null
- usr << browse(null, "window=air_alarm")
- usr << browse(null, "window=AAlarmwires")
- return
+ if(..() || !( Adjacent(usr) || istype(usr, /mob/living/silicon)) ) // dont forget calling super in machine Topics -walter0o
+ usr.machine = null
+ usr << browse(null, "window=air_alarm")
+ usr << browse(null, "window=AAlarmwires")
+ return
add_fingerprint(usr)
- usr.machine = src
-
- if(href_list["command"])
- var/device_id = href_list["id_tag"]
- switch(href_list["command"])
- if( "power",
- "adjust_external_pressure",
- "set_external_pressure",
- "checks",
- "co2_scrub",
- "tox_scrub",
- "n2o_scrub",
- "panic_siphon",
- "scrubbing")
-
- send_signal(device_id, list(href_list["command"] = text2num(href_list["val"]) ) )
-
- if("set_threshold")
- var/env = href_list["env"]
- var/threshold = text2num(href_list["var"])
- var/list/selected = TLV[env]
- var/list/thresholds = list("lower bound", "low warning", "high warning", "upper bound")
- var/newval = input("Enter [thresholds[threshold]] for [env]", "Alarm triggers", selected[threshold]) as null|num
- if (isnull(newval) || ..() || (locked && issilicon(usr)))
- return
- if (newval<0)
- selected[threshold] = -1.0
- else if (env=="temperature" && newval>5000)
- selected[threshold] = 5000
- else if (env=="pressure" && newval>50*ONE_ATMOSPHERE)
- selected[threshold] = 50*ONE_ATMOSPHERE
- else if (env!="temperature" && env!="pressure" && newval>200)
- selected[threshold] = 200
- else
- newval = round(newval,0.01)
- selected[threshold] = newval
- if(threshold == 1)
- if(selected[1] > selected[2])
- selected[2] = selected[1]
- if(selected[1] > selected[3])
- selected[3] = selected[1]
- if(selected[1] > selected[4])
- selected[4] = selected[1]
- if(threshold == 2)
- if(selected[1] > selected[2])
- selected[1] = selected[2]
- if(selected[2] > selected[3])
- selected[3] = selected[2]
- if(selected[2] > selected[4])
- selected[4] = selected[2]
- if(threshold == 3)
- if(selected[1] > selected[3])
- selected[1] = selected[3]
- if(selected[2] > selected[3])
- selected[2] = selected[3]
- if(selected[3] > selected[4])
- selected[4] = selected[3]
- if(threshold == 4)
- if(selected[1] > selected[4])
- selected[1] = selected[4]
- if(selected[2] > selected[4])
- selected[2] = selected[4]
- if(selected[3] > selected[4])
- selected[3] = selected[4]
-
- apply_mode()
-
- if(href_list["screen"])
- screen = text2num(href_list["screen"])
-
- if(href_list["atmos_unlock"])
- switch(href_list["atmos_unlock"])
- if("0")
- air_doors_close(1)
- if("1")
- air_doors_open(1)
-
- if(href_list["atmos_alarm"])
- if (alarm_area.atmosalert(2))
- apply_danger_level(2)
- update_icon()
-
- if(href_list["atmos_reset"])
- if (alarm_area.atmosalert(0))
- apply_danger_level(0)
- update_icon()
-
- if(href_list["mode"])
- mode = text2num(href_list["mode"])
- apply_mode()
-
+ usr.set_machine(src)
+
+ // hrefs that can always be called -walter0o
+ if(href_list["rcon"])
+ var/attempted_rcon_setting = text2num(href_list["rcon"])
+
+ switch(attempted_rcon_setting)
+ if(RCON_NO)
+ rcon_setting = RCON_NO
+ if(RCON_AUTO)
+ rcon_setting = RCON_AUTO
+ if(RCON_YES)
+ rcon_setting = RCON_YES
+ else
+ return
+
if(href_list["temperature"])
var/list/selected = TLV["temperature"]
var/max_temperature = min(selected[3] - T0C, MAX_TEMPERATURE)
@@ -1069,31 +989,126 @@ table tr:first-child th:first-child { border: none;}
else
target_temperature = input_temperature + T0C
- if (href_list["AAlarmwires"])
- var/t1 = text2num(href_list["AAlarmwires"])
- if (!( istype(usr.equipped(), /obj/item/weapon/wirecutters) ))
- usr << "You need wirecutters!"
- return
- if (isWireColorCut(t1))
- mend(t1)
- else
- cut(t1)
- if (AAlarmwires == 0)
- usr << "You cut last of wires inside [src] "
- update_icon()
- buildstage = 1
- return
-
- else if (href_list["pulse"])
- var/t1 = text2num(href_list["pulse"])
- if (!istype(usr.equipped(), /obj/item/device/multitool))
- usr << "You need a multitool!"
- return
- if (isWireColorCut(t1))
- usr << "You can't pulse a cut wire."
- return
- else
- pulse(t1)
+ // hrefs that need the AA unlocked -walter0o
+ if(!locked || istype(usr, /mob/living/silicon))
+
+ if(href_list["command"])
+ var/device_id = href_list["id_tag"]
+ switch(href_list["command"])
+ if( "power",
+ "adjust_external_pressure",
+ "set_external_pressure",
+ "checks",
+ "co2_scrub",
+ "tox_scrub",
+ "n2o_scrub",
+ "panic_siphon",
+ "scrubbing")
+
+ send_signal(device_id, list(href_list["command"] = text2num(href_list["val"]) ) )
+
+ if("set_threshold")
+ var/env = href_list["env"]
+ var/threshold = text2num(href_list["var"])
+ var/list/selected = TLV[env]
+ var/list/thresholds = list("lower bound", "low warning", "high warning", "upper bound")
+ var/newval = input("Enter [thresholds[threshold]] for [env]", "Alarm triggers", selected[threshold]) as null|num
+ if (isnull(newval) || ..() || (locked && issilicon(usr)))
+ return
+ if (newval<0)
+ selected[threshold] = -1.0
+ else if (env=="temperature" && newval>5000)
+ selected[threshold] = 5000
+ else if (env=="pressure" && newval>50*ONE_ATMOSPHERE)
+ selected[threshold] = 50*ONE_ATMOSPHERE
+ else if (env!="temperature" && env!="pressure" && newval>200)
+ selected[threshold] = 200
+ else
+ newval = round(newval,0.01)
+ selected[threshold] = newval
+ if(threshold == 1)
+ if(selected[1] > selected[2])
+ selected[2] = selected[1]
+ if(selected[1] > selected[3])
+ selected[3] = selected[1]
+ if(selected[1] > selected[4])
+ selected[4] = selected[1]
+ if(threshold == 2)
+ if(selected[1] > selected[2])
+ selected[1] = selected[2]
+ if(selected[2] > selected[3])
+ selected[3] = selected[2]
+ if(selected[2] > selected[4])
+ selected[4] = selected[2]
+ if(threshold == 3)
+ if(selected[1] > selected[3])
+ selected[1] = selected[3]
+ if(selected[2] > selected[3])
+ selected[2] = selected[3]
+ if(selected[3] > selected[4])
+ selected[4] = selected[3]
+ if(threshold == 4)
+ if(selected[1] > selected[4])
+ selected[1] = selected[4]
+ if(selected[2] > selected[4])
+ selected[2] = selected[4]
+ if(selected[3] > selected[4])
+ selected[3] = selected[4]
+
+ apply_mode()
+
+ if(href_list["screen"])
+ screen = text2num(href_list["screen"])
+
+ if(href_list["atmos_unlock"])
+ switch(href_list["atmos_unlock"])
+ if("0")
+ air_doors_close(1)
+ if("1")
+ air_doors_open(1)
+
+ if(href_list["atmos_alarm"])
+ if (alarm_area.atmosalert(2))
+ apply_danger_level(2)
+ update_icon()
+
+ if(href_list["atmos_reset"])
+ if (alarm_area.atmosalert(0))
+ apply_danger_level(0)
+ update_icon()
+
+ if(href_list["mode"])
+ mode = text2num(href_list["mode"])
+ apply_mode()
+
+ // hrefs that need the AA wires exposed, note that borgs should be in range here too -walter0o
+ if(wiresexposed && Adjacent(usr))
+
+ if (href_list["AAlarmwires"])
+ var/t1 = text2num(href_list["AAlarmwires"])
+ if (!( istype(usr.equipped(), /obj/item/weapon/wirecutters) ))
+ usr << "You need wirecutters!"
+ return
+ if (isWireColorCut(t1))
+ mend(t1)
+ else
+ cut(t1)
+ if (AAlarmwires == 0)
+ usr << "You cut last of wires inside [src] "
+ update_icon()
+ buildstage = 1
+ return
+
+ else if (href_list["pulse"])
+ var/t1 = text2num(href_list["pulse"])
+ if (!istype(usr.equipped(), /obj/item/device/multitool))
+ usr << "You need a multitool!"
+ return
+ if (isWireColorCut(t1))
+ usr << "You can't pulse a cut wire."
+ return
+ else
+ pulse(t1)
updateUsrDialog()
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index 4e3db2ad..6af4d627 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -275,10 +275,15 @@ update_flag
/obj/machinery/portable_atmospherics/canister/Topic(href, href_list)
- //Do not use "if(..()) return" here, canisters will stop working in unpowered areas like space or on the derelict.
+ //Do not use "if(..()) return" here, canisters will stop working in unpowered areas like space or on the derelict. // yeah but without SOME sort of Topic check any dick can mess with them via exploits as he pleases -walter0o
if (!istype(src.loc, /turf))
return 0
-
+
+ if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr)) // exploit protection -walter0o
+ usr << browse(null, "window=canister")
+ onclose(usr, "canister")
+ return
+
if(href_list["toggle"])
if (valve_open)
if (holding)
diff --git a/code/game/machinery/bees_items.dm b/code/game/machinery/bees_items.dm
index 01ed5bfa..e02a0a1a 100644
--- a/code/game/machinery/bees_items.dm
+++ b/code/game/machinery/bees_items.dm
@@ -102,21 +102,22 @@
h1 {font-size: 18px; margin: 15px 0px 5px;}
h2 {font-size: 15px; margin: 15px 0px 5px;}
li {margin: 2px 0px 2px 15px;}
- ul {list-style: none; margin: 5px; padding: 0px;}
+ ul {margin: 5px; padding: 0px;}
ol {margin: 5px; padding: 0px 15px;}
+ body {font-size: 13px; font-family: Verdana;}
- Raising Bees
+ Raising Bees
Bees are loving but fickle creatures. Don't mess with their hive and stay away from any clusters of them, and you'll avoid their ire.
Sometimes, you'll need to dig around in there for those delicious sweeties though - in that case make sure you wear sealed protection gear
and carry an extinguisher or smoker with you - any bees chasing you, once calmed down, can thusly be netted and returned safely to the hive.
- Beezeez is a cure-all panacea for them, but use it too much and the hive may grow to apocalyptic proportions. Other than that, bees are excellent pets
+ BeezEez is a cure-all panacea for them, but use it too much and the hive may grow to apocalyptic proportions. Other than that, bees are excellent pets
for all the family and are excellent caretakers of one's garden: having a hive or two around will aid in the longevity and growth rate of plants,
and aid them in fighting off poisons and disease.
-