Polaris sync

This commit is contained in:
killer653
2017-08-06 19:07:17 -04:00
652 changed files with 44410 additions and 18080 deletions

View File

@@ -5,7 +5,7 @@ sudo: false
env: env:
BYOND_MAJOR="511" BYOND_MAJOR="511"
BYOND_MINOR="1381" BYOND_MINOR="1381"
MACRO_COUNT=875 MACRO_COUNT=4
cache: cache:
directories: directories:

View File

@@ -7,16 +7,22 @@ VOREStation is a fork of the Polaris code branch, itself a fork of the Baystatio
--- ---
### LICENSE ### LICENSE
<<<<<<< HEAD
VOREStation is licensed under the GNU Affero General Public License version 3, which can be found in full in LICENSE-AGPL3.txt. VOREStation is licensed under the GNU Affero General Public License version 3, which can be found in full in LICENSE-AGPL3.txt.
=======
The code for Polaris is licensed under the [GNU Affero General Public License](http://www.gnu.org/licenses/agpl.html) version 3, which can be found in full in LICENSE-AGPL3.txt.
>>>>>>> PolarisSS13/master
Commits with a git authorship date prior to `1420675200 +0000` (2015/01/08 00:00) are licensed under the GNU General Public License version 3, which can be found in full in LICENSE-GPL3.txt. Code with a git authorship date prior to `1420675200 +0000` (2015/01/08 00:00) are licensed under the GNU General Public License version 3, which can be found in full in LICENSE-GPL3.txt.
All commits whose authorship dates are not prior to `1420675200 +0000` are assumed to be licensed under AGPL v3, if you wish to license under GPL v3 please make this clear in the commit message and any added files. All code whose authorship dates are not prior to `1420675200 +0000` are assumed to be licensed under AGPL v3, if you wish to license under GPL v3 please make this clear in the commit message and any added files.
If you wish to develop and host this codebase in a closed source manner you may use all commits prior to `1420675200 +0000`, which are licensed under GPL v3. The major change here is that if you host a server using any code licensed under AGPLv3 you are required to provide full source code for your servers users as well including addons and modifications you have made. If you wish to develop and host this codebase in a closed source manner you may use all code prior to `1420675200 +0000`, which are licensed under GPL v3. The major change here is that if you host a server using any code licensed under AGPLv3 you are required to provide full source code for your servers users as well including addons and modifications you have made.
See [here](https://www.gnu.org/licenses/why-affero-gpl.html) for more information. See [here](https://www.gnu.org/licenses/why-affero-gpl.html) for more information.
All assets including icons and sound are under a [CC BY-SA 3.0](http://creativecommons.org/licenses/by-sa/3.0/) license unless otherwise indicated.
### GETTING THE CODE ### GETTING THE CODE
The simplest way to obtain the code is using the github .zip feature. The simplest way to obtain the code is using the github .zip feature.

View File

@@ -89,11 +89,11 @@
/obj/machinery/atmospherics/binary/circulator/attackby(obj/item/weapon/W as obj, mob/user as mob) /obj/machinery/atmospherics/binary/circulator/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/wrench)) if(istype(W, /obj/item/weapon/wrench))
playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) playsound(src, W.usesound, 75, 1)
anchored = !anchored anchored = !anchored
user.visible_message("[user.name] [anchored ? "secures" : "unsecures"] the bolts holding [src.name] to the floor.", \ user.visible_message("[user.name] [anchored ? "secures" : "unsecures"] the bolts holding [src.name] to the floor.", \
"You [anchored ? "secure" : "unsecure"] the bolts holding [src] to the floor.", \ "You [anchored ? "secure" : "unsecure"] the bolts holding [src] to the floor.", \
"You hear a ratchet") "You hear a ratchet.")
if(anchored) if(anchored)
if(dir & (NORTH|SOUTH)) if(dir & (NORTH|SOUTH))

View File

@@ -11,15 +11,15 @@
desc = "A one-way air valve that can be used to regulate input or output pressure, and flow rate. Does not require power." desc = "A one-way air valve that can be used to regulate input or output pressure, and flow rate. Does not require power."
use_power = 0 use_power = 0
var/unlocked = 0 //If 0, then the valve is locked closed, otherwise it is open(-able, it's a one-way valve so it closes if gas would flow backwards). var/unlocked = 0 //If 0, then the valve is locked closed, otherwise it is open(-able, it's a one-way valve so it closes if gas would flow backwards).
var/target_pressure = ONE_ATMOSPHERE var/target_pressure = ONE_ATMOSPHERE
var/max_pressure_setting = 15000 //kPa var/max_pressure_setting = 15000 //kPa
var/set_flow_rate = ATMOS_DEFAULT_VOLUME_PUMP * 2.5 var/set_flow_rate = ATMOS_DEFAULT_VOLUME_PUMP * 2.5
var/regulate_mode = REGULATE_OUTPUT var/regulate_mode = REGULATE_OUTPUT
var/flowing = 0 //for icons - becomes zero if the valve closes itself due to regulation mode var/flowing = 0 //for icons - becomes zero if the valve closes itself due to regulation mode
var/frequency = 0 var/frequency = 0
var/id = null var/id = null
var/datum/radio_frequency/radio_connection var/datum/radio_frequency/radio_connection
@@ -46,9 +46,9 @@
/obj/machinery/atmospherics/binary/passive_gate/process() /obj/machinery/atmospherics/binary/passive_gate/process()
..() ..()
last_flow_rate = 0 last_flow_rate = 0
if(!unlocked) if(!unlocked)
return 0 return 0
@@ -61,35 +61,35 @@
pressure_delta = input_starting_pressure - target_pressure pressure_delta = input_starting_pressure - target_pressure
if (REGULATE_OUTPUT) if (REGULATE_OUTPUT)
pressure_delta = target_pressure - output_starting_pressure pressure_delta = target_pressure - output_starting_pressure
//-1 if pump_gas() did not move any gas, >= 0 otherwise //-1 if pump_gas() did not move any gas, >= 0 otherwise
var/returnval = -1 var/returnval = -1
if((regulate_mode == REGULATE_NONE || pressure_delta > 0.01) && (air1.temperature > 0 || air2.temperature > 0)) //since it's basically a valve, it makes sense to check both temperatures if((regulate_mode == REGULATE_NONE || pressure_delta > 0.01) && (air1.temperature > 0 || air2.temperature > 0)) //since it's basically a valve, it makes sense to check both temperatures
flowing = 1 flowing = 1
//flow rate limit //flow rate limit
var/transfer_moles = (set_flow_rate/air1.volume)*air1.total_moles var/transfer_moles = (set_flow_rate/air1.volume)*air1.total_moles
//Figure out how much gas to transfer to meet the target pressure. //Figure out how much gas to transfer to meet the target pressure.
switch (regulate_mode) switch (regulate_mode)
if (REGULATE_INPUT) if (REGULATE_INPUT)
transfer_moles = min(transfer_moles, calculate_transfer_moles(air2, air1, pressure_delta, (network1)? network1.volume : 0)) transfer_moles = min(transfer_moles, calculate_transfer_moles(air2, air1, pressure_delta, (network1)? network1.volume : 0))
if (REGULATE_OUTPUT) if (REGULATE_OUTPUT)
transfer_moles = min(transfer_moles, calculate_transfer_moles(air1, air2, pressure_delta, (network2)? network2.volume : 0)) transfer_moles = min(transfer_moles, calculate_transfer_moles(air1, air2, pressure_delta, (network2)? network2.volume : 0))
//pump_gas() will return a negative number if no flow occurred //pump_gas() will return a negative number if no flow occurred
returnval = pump_gas_passive(src, air1, air2, transfer_moles) returnval = pump_gas_passive(src, air1, air2, transfer_moles)
if (returnval >= 0) if (returnval >= 0)
if(network1) if(network1)
network1.update = 1 network1.update = 1
if(network2) if(network2)
network2.update = 1 network2.update = 1
if (last_flow_rate) if (last_flow_rate)
flowing = 1 flowing = 1
update_icon() update_icon()
@@ -178,7 +178,7 @@
// this is the data which will be sent to the ui // this is the data which will be sent to the ui
var/data[0] var/data[0]
data = list( data = list(
"on" = unlocked, "on" = unlocked,
"pressure_set" = round(target_pressure*100), //Nano UI can't handle rounded non-integers, apparently. "pressure_set" = round(target_pressure*100), //Nano UI can't handle rounded non-integers, apparently.
@@ -203,16 +203,16 @@
/obj/machinery/atmospherics/binary/passive_gate/Topic(href,href_list) /obj/machinery/atmospherics/binary/passive_gate/Topic(href,href_list)
if(..()) return 1 if(..()) return 1
if(href_list["toggle_valve"]) if(href_list["toggle_valve"])
unlocked = !unlocked unlocked = !unlocked
if(href_list["regulate_mode"]) if(href_list["regulate_mode"])
switch(href_list["regulate_mode"]) switch(href_list["regulate_mode"])
if ("off") regulate_mode = REGULATE_NONE if ("off") regulate_mode = REGULATE_NONE
if ("input") regulate_mode = REGULATE_INPUT if ("input") regulate_mode = REGULATE_INPUT
if ("output") regulate_mode = REGULATE_OUTPUT if ("output") regulate_mode = REGULATE_OUTPUT
switch(href_list["set_press"]) switch(href_list["set_press"])
if ("min") if ("min")
target_pressure = 0 target_pressure = 0
@@ -221,7 +221,7 @@
if ("set") if ("set")
var/new_pressure = input(usr,"Enter new output pressure (0-[max_pressure_setting]kPa)","Pressure Control",src.target_pressure) as num var/new_pressure = input(usr,"Enter new output pressure (0-[max_pressure_setting]kPa)","Pressure Control",src.target_pressure) as num
src.target_pressure = between(0, new_pressure, max_pressure_setting) src.target_pressure = between(0, new_pressure, max_pressure_setting)
switch(href_list["set_flow_rate"]) switch(href_list["set_flow_rate"])
if ("min") if ("min")
set_flow_rate = 0 set_flow_rate = 0
@@ -230,7 +230,7 @@
if ("set") if ("set")
var/new_flow_rate = input(usr,"Enter new flow rate limit (0-[air1.volume]kPa)","Flow Rate Control",src.set_flow_rate) as num var/new_flow_rate = input(usr,"Enter new flow rate limit (0-[air1.volume]kPa)","Flow Rate Control",src.set_flow_rate) as num
src.set_flow_rate = between(0, new_flow_rate, air1.volume) src.set_flow_rate = between(0, new_flow_rate, air1.volume)
usr.set_machine(src) //Is this even needed with NanoUI? usr.set_machine(src) //Is this even needed with NanoUI?
src.update_icon() src.update_icon()
src.add_fingerprint(usr) src.add_fingerprint(usr)
@@ -248,9 +248,9 @@
user << "<span class='warning'>You cannot unwrench \the [src], it too exerted due to internal pressure.</span>" user << "<span class='warning'>You cannot unwrench \the [src], it too exerted due to internal pressure.</span>"
add_fingerprint(user) add_fingerprint(user)
return 1 return 1
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) playsound(src, W.usesound, 50, 1)
user << "<span class='notice'>You begin to unfasten \the [src]...</span>" user << "<span class='notice'>You begin to unfasten \the [src]...</span>"
if (do_after(user, 40)) if (do_after(user, 40 * W.toolspeed))
user.visible_message( \ user.visible_message( \
"<span class='notice'>\The [user] unfastens \the [src].</span>", \ "<span class='notice'>\The [user] unfastens \the [src].</span>", \
"<span class='notice'>You have unfastened \the [src].</span>", \ "<span class='notice'>You have unfastened \the [src].</span>", \

View File

@@ -86,6 +86,7 @@
attackby(obj/item/weapon/W as obj, mob/user as mob) attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/wrench)) if(istype(W, /obj/item/weapon/wrench))
anchored = !anchored anchored = !anchored
playsound(src, W.usesound, 50, 1)
user << "<span class='notice'>You [anchored ? "secure" : "unsecure"] the bolts holding \the [src] to the floor.</span>" user << "<span class='notice'>You [anchored ? "secure" : "unsecure"] the bolts holding \the [src] to the floor.</span>"
if(anchored) if(anchored)
@@ -257,6 +258,7 @@
attackby(obj/item/weapon/W as obj, mob/user as mob) attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/wrench)) if(istype(W, /obj/item/weapon/wrench))
anchored = !anchored anchored = !anchored
playsound(src, W.usesound, 50, 1)
turbine = null turbine = null
user << "<span class='notice'>You [anchored ? "secure" : "unsecure"] the bolts holding \the [src] to the floor.</span>" user << "<span class='notice'>You [anchored ? "secure" : "unsecure"] the bolts holding \the [src] to the floor.</span>"
updateConnection() updateConnection()

View File

@@ -227,9 +227,9 @@ Thus, the two variables affect pump operation are set in New():
user << "<span class='warning'>You cannot unwrench this [src], it too exerted due to internal pressure.</span>" user << "<span class='warning'>You cannot unwrench this [src], it too exerted due to internal pressure.</span>"
add_fingerprint(user) add_fingerprint(user)
return 1 return 1
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) playsound(src, W.usesound, 50, 1)
user << "<span class='notice'>You begin to unfasten \the [src]...</span>" user << "<span class='notice'>You begin to unfasten \the [src]...</span>"
if (do_after(user, 40)) if (do_after(user, 40 * W.toolspeed))
user.visible_message( \ user.visible_message( \
"<span class='notice'>\The [user] unfastens \the [src].</span>", \ "<span class='notice'>\The [user] unfastens \the [src].</span>", \
"<span class='notice'>You have unfastened \the [src].</span>", \ "<span class='notice'>You have unfastened \the [src].</span>", \

View File

@@ -91,8 +91,8 @@
add_fingerprint(user) add_fingerprint(user)
return 1 return 1
user << "<span class='notice'>You begin to unfasten \the [src]...</span>" user << "<span class='notice'>You begin to unfasten \the [src]...</span>"
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) playsound(src, W.usesound, 50, 1)
if(do_after(user, 40)) if(do_after(user, 40 * W.toolspeed))
user.visible_message( \ user.visible_message( \
"<span class='notice'>\The [user] unfastens \the [src].</span>", \ "<span class='notice'>\The [user] unfastens \the [src].</span>", \
"<span class='notice'>You have unfastened \the [src].</span>", \ "<span class='notice'>You have unfastened \the [src].</span>", \

View File

@@ -142,9 +142,9 @@
user << "<span class='warning'>You cannot unwrench \the [src], it too exerted due to internal pressure.</span>" user << "<span class='warning'>You cannot unwrench \the [src], it too exerted due to internal pressure.</span>"
add_fingerprint(user) add_fingerprint(user)
return 1 return 1
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) playsound(src, W.usesound, 50, 1)
user << "<span class='notice'>You begin to unfasten \the [src]...</span>" user << "<span class='notice'>You begin to unfasten \the [src]...</span>"
if (do_after(user, 40)) if (do_after(user, 40 * W.toolspeed))
user.visible_message( \ user.visible_message( \
"<span class='notice'>\The [user] unfastens \the [src].</span>", \ "<span class='notice'>\The [user] unfastens \the [src].</span>", \
"<span class='notice'>You have unfastened \the [src].</span>", \ "<span class='notice'>You have unfastened \the [src].</span>", \

View File

@@ -137,9 +137,9 @@
user << "<span class='warning'>You cannot unwrench \the [src], it too exerted due to internal pressure.</span>" user << "<span class='warning'>You cannot unwrench \the [src], it too exerted due to internal pressure.</span>"
add_fingerprint(user) add_fingerprint(user)
return 1 return 1
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) playsound(src, W.usesound, 50, 1)
user << "<span class='notice'>You begin to unfasten \the [src]...</span>" user << "<span class='notice'>You begin to unfasten \the [src]...</span>"
if (do_after(user, 40)) if (do_after(user, 40 * W.toolspeed))
user.visible_message( \ user.visible_message( \
"<span class='notice'>\The [user] unfastens \the [src].</span>", \ "<span class='notice'>\The [user] unfastens \the [src].</span>", \
"<span class='notice'>You have unfastened \the [src].</span>", \ "<span class='notice'>You have unfastened \the [src].</span>", \

View File

@@ -68,7 +68,7 @@
air1.volume = ATMOS_DEFAULT_VOLUME_MIXER air1.volume = ATMOS_DEFAULT_VOLUME_MIXER
air2.volume = ATMOS_DEFAULT_VOLUME_MIXER air2.volume = ATMOS_DEFAULT_VOLUME_MIXER
air3.volume = ATMOS_DEFAULT_VOLUME_MIXER * 1.5 air3.volume = ATMOS_DEFAULT_VOLUME_MIXER * 1.5
if (!mixing_inputs) if (!mixing_inputs)
mixing_inputs = list(src.air1 = node1_concentration, src.air2 = node2_concentration) mixing_inputs = list(src.air1 = node1_concentration, src.air2 = node2_concentration)
@@ -112,9 +112,9 @@
user << "<span class='warning'>You cannot unwrench \the [src], it too exerted due to internal pressure.</span>" user << "<span class='warning'>You cannot unwrench \the [src], it too exerted due to internal pressure.</span>"
add_fingerprint(user) add_fingerprint(user)
return 1 return 1
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) playsound(src, W.usesound, 50, 1)
user << "<span class='notice'>You begin to unfasten \the [src]...</span>" user << "<span class='notice'>You begin to unfasten \the [src]...</span>"
if (do_after(user, 40)) if (do_after(user, 40 * W.toolspeed))
user.visible_message( \ user.visible_message( \
"<span class='notice'>\The [user] unfastens \the [src].</span>", \ "<span class='notice'>\The [user] unfastens \the [src].</span>", \
"<span class='notice'>You have unfastened \the [src].</span>", \ "<span class='notice'>You have unfastened \the [src].</span>", \

View File

@@ -354,9 +354,9 @@
user << "<span class='warnng'>You cannot unwrench \the [src], it too exerted due to internal pressure.</span>" user << "<span class='warnng'>You cannot unwrench \the [src], it too exerted due to internal pressure.</span>"
add_fingerprint(user) add_fingerprint(user)
return 1 return 1
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) playsound(src, W.usesound, 50, 1)
user << "<span class='notice'>You begin to unfasten \the [src]...</span>" user << "<span class='notice'>You begin to unfasten \the [src]...</span>"
if (do_after(user, 40)) if (do_after(user, 40 * W.toolspeed))
user.visible_message( \ user.visible_message( \
"<span class='notice'>\The [user] unfastens \the [src].</span>", \ "<span class='notice'>\The [user] unfastens \the [src].</span>", \
"<span class='notice'>You have unfastened \the [src].</span>", \ "<span class='notice'>You have unfastened \the [src].</span>", \

View File

@@ -78,9 +78,9 @@
user << "<span class='warning'>You cannot unwrench \the [src], it is too exerted due to internal pressure.</span>" user << "<span class='warning'>You cannot unwrench \the [src], it is too exerted due to internal pressure.</span>"
add_fingerprint(user) add_fingerprint(user)
return 1 return 1
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) playsound(src, W.usesound, 50, 1)
user << "<span class='notice'>You begin to unfasten \the [src]...</span>" user << "<span class='notice'>You begin to unfasten \the [src]...</span>"
if (do_after(user, 40)) if (do_after(user, 40 * W.toolspeed))
user.visible_message( \ user.visible_message( \
"<span class='notice'>\The [user] unfastens \the [src].</span>", \ "<span class='notice'>\The [user] unfastens \the [src].</span>", \
"<span class='notice'>You have unfastened \the [src].</span>", \ "<span class='notice'>You have unfastened \the [src].</span>", \

View File

@@ -358,9 +358,9 @@
var/obj/item/weapon/weldingtool/WT = W var/obj/item/weapon/weldingtool/WT = W
if (WT.remove_fuel(0,user)) if (WT.remove_fuel(0,user))
user << "<span class='notice'>Now welding the vent.</span>" user << "<span class='notice'>Now welding the vent.</span>"
if(do_after(user, 20)) if(do_after(user, 20 * WT.toolspeed))
if(!src || !WT.isOn()) return if(!src || !WT.isOn()) return
playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) playsound(src.loc, WT.usesound, 50, 1)
if(!welded) if(!welded)
user.visible_message("<span class='notice'>\The [user] welds the vent shut.</span>", "<span class='notice'>You weld the vent shut.</span>", "You hear welding.") user.visible_message("<span class='notice'>\The [user] welds the vent shut.</span>", "<span class='notice'>You weld the vent shut.</span>", "You hear welding.")
welded = 1 welded = 1
@@ -407,9 +407,9 @@
user << "<span class='warning'>You cannot unwrench \the [src], it is too exerted due to internal pressure.</span>" user << "<span class='warning'>You cannot unwrench \the [src], it is too exerted due to internal pressure.</span>"
add_fingerprint(user) add_fingerprint(user)
return 1 return 1
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) playsound(src, W.usesound, 50, 1)
user << "<span class='notice'>You begin to unfasten \the [src]...</span>" user << "<span class='notice'>You begin to unfasten \the [src]...</span>"
if (do_after(user, 40)) if (do_after(user, 40 * W.toolspeed))
user.visible_message( \ user.visible_message( \
"<span class='notice'>\The [user] unfastens \the [src].</span>", \ "<span class='notice'>\The [user] unfastens \the [src].</span>", \
"<span class='notice'>You have unfastened \the [src].</span>", \ "<span class='notice'>You have unfastened \the [src].</span>", \

View File

@@ -107,6 +107,7 @@
"filter_co2" = ("carbon_dioxide" in scrubbing_gas), "filter_co2" = ("carbon_dioxide" in scrubbing_gas),
"filter_phoron" = ("phoron" in scrubbing_gas), "filter_phoron" = ("phoron" in scrubbing_gas),
"filter_n2o" = ("sleeping_agent" in scrubbing_gas), "filter_n2o" = ("sleeping_agent" in scrubbing_gas),
"filter_fuel" = ("volatile_fuel" in scrubbing_gas),
"sigtype" = "status" "sigtype" = "status"
) )
if(!initial_loc.air_scrub_names[id_tag]) if(!initial_loc.air_scrub_names[id_tag])
@@ -233,6 +234,11 @@
else if(signal.data["toggle_n2o_scrub"]) else if(signal.data["toggle_n2o_scrub"])
toggle += "sleeping_agent" toggle += "sleeping_agent"
if(!isnull(signal.data["fuel_scrub"]) && text2num(signal.data["fuel_scrub"]) != ("volatile_fuel" in scrubbing_gas))
toggle += "volatile_fuel"
else if(signal.data["toggle_fuel_scrub"])
toggle += "volatile_fuel"
scrubbing_gas ^= toggle scrubbing_gas ^= toggle
if(signal.data["init"] != null) if(signal.data["init"] != null)
@@ -272,9 +278,9 @@
user << "<span class='warning'>You cannot unwrench \the [src], it is too exerted due to internal pressure.</span>" user << "<span class='warning'>You cannot unwrench \the [src], it is too exerted due to internal pressure.</span>"
add_fingerprint(user) add_fingerprint(user)
return 1 return 1
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) playsound(src, W.usesound, 50, 1)
user << "<span class='notice'>You begin to unfasten \the [src]...</span>" user << "<span class='notice'>You begin to unfasten \the [src]...</span>"
if (do_after(user, 40)) if (do_after(user, 40 * W.toolspeed))
user.visible_message( \ user.visible_message( \
"<span class='notice'>\The [user] unfastens \the [src].</span>", \ "<span class='notice'>\The [user] unfastens \the [src].</span>", \
"<span class='notice'>You have unfastened \the [src].</span>", \ "<span class='notice'>You have unfastened \the [src].</span>", \

View File

@@ -298,9 +298,9 @@
user << "<span class='warning'>You cannot unwrench \the [src], it is too exerted due to internal pressure.</span>" user << "<span class='warning'>You cannot unwrench \the [src], it is too exerted due to internal pressure.</span>"
add_fingerprint(user) add_fingerprint(user)
return 1 return 1
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) playsound(src, W.usesound, 50, 1)
user << "<span class='notice'>You begin to unfasten \the [src]...</span>" user << "<span class='notice'>You begin to unfasten \the [src]...</span>"
if (do_after(user, 40)) if (do_after(user, 40 * W.toolspeed))
user.visible_message( \ user.visible_message( \
"<span class='notice'>\The [user] unfastens \the [src].</span>", \ "<span class='notice'>\The [user] unfastens \the [src].</span>", \
"<span class='notice'>You have unfastened \the [src].</span>", \ "<span class='notice'>You have unfastened \the [src].</span>", \

View File

@@ -90,9 +90,9 @@
user << "<span class='warning'>You cannot unwrench \the [src], it is too exerted due to internal pressure.</span>" user << "<span class='warning'>You cannot unwrench \the [src], it is too exerted due to internal pressure.</span>"
add_fingerprint(user) add_fingerprint(user)
return 1 return 1
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) playsound(src, W.usesound, 50, 1)
user << "<span class='notice'>You begin to unfasten \the [src]...</span>" user << "<span class='notice'>You begin to unfasten \the [src]...</span>"
if (do_after(user, 40)) if (do_after(user, 40 * W.toolspeed))
user.visible_message( \ user.visible_message( \
"<span class='notice'>\The [user] unfastens \the [src].</span>", \ "<span class='notice'>\The [user] unfastens \the [src].</span>", \
"<span class='notice'>You have unfastened \the [src].</span>", \ "<span class='notice'>You have unfastened \the [src].</span>", \

View File

@@ -74,6 +74,7 @@
#define XGM_GAS_FUEL 1 #define XGM_GAS_FUEL 1
#define XGM_GAS_OXIDIZER 2 #define XGM_GAS_OXIDIZER 2
#define XGM_GAS_CONTAMINANT 4 #define XGM_GAS_CONTAMINANT 4
#define XGM_GAS_FUSION_FUEL 8
#define TANK_LEAK_PRESSURE (30.*ONE_ATMOSPHERE) // Tank starts leaking. #define TANK_LEAK_PRESSURE (30.*ONE_ATMOSPHERE) // Tank starts leaking.
#define TANK_RUPTURE_PRESSURE (40.*ONE_ATMOSPHERE) // Tank spills all contents into atmosphere. #define TANK_RUPTURE_PRESSURE (40.*ONE_ATMOSPHERE) // Tank spills all contents into atmosphere.

View File

@@ -96,7 +96,7 @@ var/list/be_special_flags = list(
#define GHOSTCAST 0x1 //can a ghost cast it? #define GHOSTCAST 0x1 //can a ghost cast it?
#define NEEDSCLOTHES 0x2 //does it need the wizard garb to cast? Nonwizard spells should not have this #define NEEDSCLOTHES 0x2 //does it need the wizard garb to cast? Nonwizard spells should not have this
#define NEEDSHUMAN 0x4 //does it require the caster to be human? #define NEEDSHUMAN 0x4 //does it require the caster to be human?
#define Z2NOCAST 0x8 //if this is added, the spell can't be cast at centcomm #define Z2NOCAST 0x8 //if this is added, the spell can't be cast at CentCom
#define STATALLOWED 0x10 //if set, the user doesn't have to be conscious to cast. Required for ghost spells #define STATALLOWED 0x10 //if set, the user doesn't have to be conscious to cast. Required for ghost spells
#define IGNOREPREV 0x20 //if set, each new target does not overlap with the previous one #define IGNOREPREV 0x20 //if set, each new target does not overlap with the previous one
//The following flags only affect different types of spell, and therefore overlap //The following flags only affect different types of spell, and therefore overlap

View File

@@ -58,7 +58,7 @@ var/global/defer_powernet_rebuild = 0 // True if net rebuild will be called
#define NETWORK_COMMUNICATORS "Communicators" #define NETWORK_COMMUNICATORS "Communicators"
// Those networks can only be accessed by pre-existing terminals. AIs and new terminals can't use them. // Those networks can only be accessed by pre-existing terminals. AIs and new terminals can't use them.
var/list/restricted_camera_networks = list(NETWORK_ERT,NETWORK_MERCENARY,"Secret") var/list/restricted_camera_networks = list(NETWORK_ERT,NETWORK_MERCENARY,"Secret", NETWORK_COMMUNICATORS)
//singularity defines //singularity defines

View File

@@ -89,6 +89,11 @@
#define SHUTTLE_INTRANSIT 2 #define SHUTTLE_INTRANSIT 2
#define SHUTTLE_CRASHED 3 // VOREStation Edit - Yup that can happen now #define SHUTTLE_CRASHED 3 // VOREStation Edit - Yup that can happen now
// Sound defines for shuttles.
#define HYPERSPACE_WARMUP 0
#define HYPERSPACE_PROGRESS 1
#define HYPERSPACE_END 2
// Ferry shuttle processing status. // Ferry shuttle processing status.
#define IDLE_STATE 0 #define IDLE_STATE 0
#define WAIT_LAUNCH 1 #define WAIT_LAUNCH 1
@@ -147,6 +152,14 @@
#define DEFAULT_TABLE_MATERIAL "plastic" #define DEFAULT_TABLE_MATERIAL "plastic"
#define DEFAULT_WALL_MATERIAL "steel" #define DEFAULT_WALL_MATERIAL "steel"
#define MAT_STEEL "steel"
#define MAT_GLASS "glass"
#define MAT_SILVER "silver"
#define MAT_GOLD "gold"
#define MAT_TITANIUM "titanium"
#define MAT_PHORON "phoron"
#define MAT_DIAMOND "diamond"
#define SHARD_SHARD "shard" #define SHARD_SHARD "shard"
#define SHARD_SHRAPNEL "shrapnel" #define SHARD_SHRAPNEL "shrapnel"
#define SHARD_STONE_PIECE "piece" #define SHARD_STONE_PIECE "piece"
@@ -203,3 +216,6 @@
#define TSC_GIL "Gilthari" #define TSC_GIL "Gilthari"
#define MIDNIGHT_ROLLOVER 864000 //number of deciseconds in a day #define MIDNIGHT_ROLLOVER 864000 //number of deciseconds in a day
#define WORLD_ICON_SIZE 32 //Needed for the R-UST port
#define PIXEL_MULTIPLIER WORLD_ICON_SIZE/32 //Needed for the R-UST port

View File

@@ -80,7 +80,9 @@
if (NORTHEAST) return "northeast" if (NORTHEAST) return "northeast"
if (SOUTHEAST) return "southeast" if (SOUTHEAST) return "southeast"
if (NORTHWEST) return "northwest" if (NORTHWEST) return "northwest"
if (SOUTHWEST) return "southwest" if (SOUTHWEST) return "southwest"
if (UP) return "up"
if (DOWN) return "down"
// Turns text into proper directions // Turns text into proper directions
/proc/text2dir(direction) /proc/text2dir(direction)

View File

@@ -38,6 +38,8 @@
#define issilicon(A) istype(A, /mob/living/silicon) #define issilicon(A) istype(A, /mob/living/silicon)
#define isvoice(A) istype(A, /mob/living/voice)
#define isslime(A) istype(A, /mob/living/carbon/slime) #define isslime(A) istype(A, /mob/living/carbon/slime)
#define isxeno(A) istype(A, /mob/living/simple_animal/xeno) #define isxeno(A) istype(A, /mob/living/simple_animal/xeno)

View File

@@ -243,7 +243,7 @@ var/obj/screen/robot_inventory
//Unfortunately adding the emag module to the list of modules has to be here. This is because a borg can //Unfortunately adding the emag module to the list of modules has to be here. This is because a borg can
//be emagged before they actually select a module. - or some situation can cause them to get a new module //be emagged before they actually select a module. - or some situation can cause them to get a new module
// - or some situation might cause them to get de-emagged or something. // - or some situation might cause them to get de-emagged or something.
if(r.emagged) if(r.emagged || r.emag_items)
if(!(r.module.emag in r.module.modules)) if(!(r.module.emag in r.module.modules))
r.module.modules.Add(r.module.emag) r.module.modules.Add(r.module.emag)
else else

View File

@@ -159,7 +159,7 @@ var/list/DEPT_FREQS = list(AI_FREQ, COMM_FREQ, ENG_FREQ, ENT_FREQ, MED_FREQ, SEC
// Antags! // Antags!
if (frequency in ANTAG_FREQS) if (frequency in ANTAG_FREQS)
return "syndradio" return "syndradio"
// centcomm channels (deathsquid and ert) // CentCom channels (deathsquid and ert)
if(frequency in CENT_FREQS) if(frequency in CENT_FREQS)
return "centradio" return "centradio"
// command channel // command channel

View File

@@ -137,33 +137,27 @@
path =/obj/item/ammo_magazine/m44 path =/obj/item/ammo_magazine/m44
hidden = 1 hidden = 1
/////// 5.56mm /////// 5.45mm
/datum/category_item/autolathe/arms/rifle_556 /datum/category_item/autolathe/arms/rifle_545
name = "rifle magazine (5.56mm)" name = "rifle magazine (5.45mm)"
path =/obj/item/ammo_magazine/m556 path =/obj/item/ammo_magazine/m545
hidden = 1 hidden = 1
/datum/category_item/autolathe/arms/rifle_556p /datum/category_item/autolathe/arms/rifle_545p
name = "rifle magazine (5.56mm practice)" name = "rifle magazine (5.45mm practice)"
path =/obj/item/ammo_magazine/m556/practice path =/obj/item/ammo_magazine/m545/practice
/datum/category_item/autolathe/arms/machinegun_556 /datum/category_item/autolathe/arms/machinegun_545
name = "machinegun box magazine (5.56)" name = "machinegun box magazine (5.56)"
path =/obj/item/ammo_magazine/m556saw path =/obj/item/ammo_magazine/m545saw
hidden = 1 hidden = 1
/////// 7.62
/////// 7.62
/datum/category_item/autolathe/arms/rifle_762 /datum/category_item/autolathe/arms/rifle_762
name = "rifle magazine (7.62mm)" name = "rifle magazine (7.62mm)"
path =/obj/item/ammo_magazine/m762 path =/obj/item/ammo_magazine/m762
hidden = 1 hidden = 1
/datum/category_item/autolathe/arms/shotgun_magazine
name = "24rnd shotgun magazine (12g)"
path =/obj/item/ammo_magazine/m12gdrum
hidden = 1
/* /*
/datum/category_item/autolathe/arms/rifle_small_762 /datum/category_item/autolathe/arms/rifle_small_762
name = "rifle magazine (7.62mm)" name = "rifle magazine (7.62mm)"
@@ -171,6 +165,26 @@
hidden = 1 hidden = 1
*/ */
/////// Shotgun
/datum/category_item/autolathe/arms/shotgun_clip_beanbag
name = "4-round 12g shell clip (beanbag)"
path =/obj/item/ammo_magazine/clip/c12g/beanbag
/datum/category_item/autolathe/arms/shotgun_clip_slug
name = "4-round 12g shell clip (slug)"
path =/obj/item/ammo_magazine/clip/c12g
hidden = 1
/datum/category_item/autolathe/arms/shotgun_clip_pellet
name = "4-round 12g shell clip (buckshot)"
path =/obj/item/ammo_magazine/clip/c12g/pellet
hidden = 1
/datum/category_item/autolathe/arms/shotgun_clip_beanbag
name = "4-round 12g shell clip (beanbag)"
path =/obj/item/ammo_magazine/clip/c12g/beanbag
/* Commented out until autolathe stuff is decided/fixed. Will probably remove these entirely. -Spades /* Commented out until autolathe stuff is decided/fixed. Will probably remove these entirely. -Spades
// These should always be/empty! The idea is to fill them up manually with ammo clips. // These should always be/empty! The idea is to fill them up manually with ammo clips.
@@ -231,14 +245,14 @@
category = "Arms and Ammunition" category = "Arms and Ammunition"
hidden = 1 hidden = 1
/datum/category_item/autolathe/arms/rifle_556 /datum/category_item/autolathe/arms/rifle_545
name = "10rnd rifle magazine (5.56mm)" name = "10rnd rifle magazine (5.45mm)"
path =/obj/item/ammo_magazine/m556saw/empty path =/obj/item/ammo_magazine/m545saw/empty
category = "Arms and Ammunition" category = "Arms and Ammunition"
/datum/category_item/autolathe/arms/rifle_556m /datum/category_item/autolathe/arms/rifle_545m
name = "20rnd rifle magazine (5.56mm)" name = "20rnd rifle magazine (5.45mm)"
path =/obj/item/ammo_magazine/m556sawm/empty path =/obj/item/ammo_magazine/m545sawm/empty
category = "Arms and Ammunition" category = "Arms and Ammunition"
hidden = 1 hidden = 1
@@ -345,15 +359,15 @@
category = "Arms and Ammunition" category = "Arms and Ammunition"
hidden = 1 hidden = 1
*/ */
/datum/category_item/autolathe/arms/rifle_clip_556 /datum/category_item/autolathe/arms/rifle_clip_545
name = "ammo clip (5.56mm)" name = "ammo clip (5.45mm)"
path =/obj/item/ammo_magazine/clip/c556 path =/obj/item/ammo_magazine/clip/c545
category = "Arms and Ammunition" category = "Arms and Ammunition"
hidden = 1 hidden = 1
/datum/category_item/autolathe/arms/rifle_clip_556_practice /datum/category_item/autolathe/arms/rifle_clip_545_practice
name = "ammo clip (5.56mm practice)" name = "ammo clip (5.45mm practice)"
path =/obj/item/ammo_magazine/clip/c556/practice path =/obj/item/ammo_magazine/clip/c545/practice
category = "Arms and Ammunition" category = "Arms and Ammunition"
/datum/category_item/autolathe/arms/rifle_clip_762 /datum/category_item/autolathe/arms/rifle_clip_762

View File

@@ -176,7 +176,7 @@
teleatom.visible_message("<span class='danger'>\The [teleatom] bounces off of the portal!</span>") teleatom.visible_message("<span class='danger'>\The [teleatom] bounces off of the portal!</span>")
return 0 return 0
if(destination.z in using_map.admin_levels) //centcomm z-level if(destination.z in using_map.admin_levels) //CentCom z-level
if(istype(teleatom, /obj/mecha)) if(istype(teleatom, /obj/mecha))
var/obj/mecha/MM = teleatom var/obj/mecha/MM = teleatom
MM.occupant << "<span class='danger'>\The [MM] would not survive the jump to a location so far away!</span>" MM.occupant << "<span class='danger'>\The [MM] would not survive the jump to a location so far away!</span>"

View File

@@ -407,7 +407,7 @@
else if (href_list["obj_announce"]) else if (href_list["obj_announce"])
var/obj_count = 1 var/obj_count = 1
current << "\blue Your current objectives:" current << "<font color='blue'>Your current objectives:</font>"
for(var/datum/objective/objective in objectives) for(var/datum/objective/objective in objectives)
current << "<B>Objective #[obj_count]</B>: [objective.explanation_text]" current << "<B>Objective #[obj_count]</B>: [objective.explanation_text]"
obj_count++ obj_count++

View File

@@ -200,3 +200,52 @@
/obj/item/weapon/stock_parts/matter_bin, /obj/item/weapon/stock_parts/matter_bin,
/obj/item/weapon/circuitboard/pacman/super /obj/item/weapon/circuitboard/pacman/super
) )
/datum/supply_packs/eng/fusion_core
name = "R-UST Mk. 8 Tokamak fusion core crate"
cost = 50
containername = "R-UST Mk. 8 Tokamak Fusion Core crate"
containertype = /obj/structure/closet/crate/secure/engineering
access = access_engine
contains = list(
/obj/item/weapon/book/manual/rust_engine,
/obj/machinery/power/fusion_core,
/obj/item/weapon/circuitboard/fusion_core
)
/datum/supply_packs/eng/fusion_fuel_injector
name = "R-UST Mk. 8 fuel injector crate"
cost = 30
containername = "R-UST Mk. 8 fuel injector crate"
containertype = /obj/structure/closet/crate/secure/engineering
access = access_engine
contains = list(
/obj/machinery/fusion_fuel_injector,
/obj/machinery/fusion_fuel_injector,
/obj/item/weapon/circuitboard/fusion_injector
)
/datum/supply_packs/eng/gyrotron
name = "Gyrotron crate"
cost = 15
containername = "Gyrotron Crate"
containertype = /obj/structure/closet/crate/secure/engineering
access = access_engine
contains = list(
/obj/machinery/power/emitter/gyrotron,
/obj/item/weapon/circuitboard/gyrotron
)
/datum/supply_packs/eng/fusion_fuel_compressor
name = "Fusion Fuel Compressor circuitry crate"
cost = 10
containername = "Fusion Fuel Compressor circuitry crate"
containertype = /obj/structure/closet/crate/engineering
contains = list(/obj/item/weapon/circuitboard/fusion_fuel_compressor)
/datum/supply_packs/eng/tritium
name = "Tritium crate"
cost = 75
containername = "Tritium crate"
containertype = /obj/structure/closet/crate/engineering
contains = list(/obj/fiftyspawner/tritium)

View File

@@ -156,7 +156,7 @@
contains = list( contains = list(
/obj/item/ammo_magazine/m9mmt, /obj/item/ammo_magazine/m9mmt,
/obj/item/ammo_magazine/m9mmt/rubber, /obj/item/ammo_magazine/m9mmt/rubber,
/obj/item/ammo_magazine/m556saw /obj/item/ammo_magazine/m545saw
) )
cost = 25 cost = 25
containertype = /obj/structure/closet/crate/secure containertype = /obj/structure/closet/crate/secure

View File

@@ -159,14 +159,13 @@
/obj/item/device/kit/paint/gygax/recitence /obj/item/device/kit/paint/gygax/recitence
) )
name = "Random Gygax exosuit modkit" name = "Random Gygax exosuit modkit"
/*
/datum/supply_packs/robotics/jumper_cables /datum/supply_packs/robotics/jumper_cables
name = "Jumper kit crate" name = "Jumper kit crate"
contains = list( contains = list(
/obj/item/device/defib_kit/jumper_kit = 4 /obj/item/device/defib_kit/jumper_kit = 2
) )
cost = 30 cost = 30
containertype = /obj/structure/closet/crate/secure/science containertype = /obj/structure/closet/crate/secure/science
containername = "Jumper kit crate" containername = "Jumper kit crate"
access = access_robotics access = access_robotics
*/

View File

@@ -50,3 +50,17 @@
containertype = /obj/structure/closet/crate/hydroponics containertype = /obj/structure/closet/crate/hydroponics
containername = "Exotic Seeds crate" containername = "Exotic Seeds crate"
access = access_hydroponics access = access_hydroponics
/datum/supply_packs/sci/integrated_circuit_printer
name = "Integrated circuit printer"
contains = list(/obj/item/device/integrated_circuit_printer = 2)
cost = 15
containertype = /obj/structure/closet/crate
containername = "Integrated circuit crate"
/datum/supply_packs/sci/integrated_circuit_printer_upgrade
name = "Integrated circuit printer upgrade - advanced designs"
contains = list(/obj/item/weapon/disk/integrated_circuit/upgrade/advanced)
cost = 30
containertype = /obj/structure/closet/crate
containername = "Integrated circuit crate"

View File

@@ -48,21 +48,21 @@
name = "Anti-Materiel Rifle ammo box (14.5mm)" name = "Anti-Materiel Rifle ammo box (14.5mm)"
path = /obj/item/weapon/storage/box/sniperammo path = /obj/item/weapon/storage/box/sniperammo
/datum/uplink_item/item/ammo/c556 /datum/uplink_item/item/ammo/c545
name = "Rifle Magazine (5.56mm)" name = "Rifle Magazine (5.45mm)"
path = /obj/item/ammo_magazine/m556 path = /obj/item/ammo_magazine/m545
/datum/uplink_item/item/ammo/c556/ext /datum/uplink_item/item/ammo/c545/ext
name = "Rifle Magazine (5.56mm Extended)" name = "Rifle Magazine (5.45mm Extended)"
path = /obj/item/ammo_magazine/m556/ext path = /obj/item/ammo_magazine/m545/ext
/datum/uplink_item/item/ammo/c556/ap /datum/uplink_item/item/ammo/c545/ap
name = "Rifle Magazine (5.56mm AP)" name = "Rifle Magazine (5.45mm AP)"
path = /obj/item/ammo_magazine/m556/ap path = /obj/item/ammo_magazine/m545/ap
/datum/uplink_item/item/ammo/c556/ap/ext /datum/uplink_item/item/ammo/c545/ap/ext
name = "Rifle Magazine (5.56mm AP Extended)" name = "Rifle Magazine (5.45mm AP Extended)"
path = /obj/item/ammo_magazine/m556/ap/ext path = /obj/item/ammo_magazine/m545/ap/ext
/datum/uplink_item/item/ammo/c762 /datum/uplink_item/item/ammo/c762
name = "Rifle Magazine (7.62mm)" name = "Rifle Magazine (7.62mm)"
@@ -76,13 +76,13 @@
name = "SMG Magazine (10mm)" name = "SMG Magazine (10mm)"
path = /obj/item/ammo_magazine/m10mm path = /obj/item/ammo_magazine/m10mm
/datum/uplink_item/item/ammo/a556 /datum/uplink_item/item/ammo/a545
name = "Machinegun Magazine (5.56mm)" name = "Machinegun Magazine (5.45mm)"
path = /obj/item/ammo_magazine/m556saw path = /obj/item/ammo_magazine/m545saw
/datum/uplink_item/item/ammo/a556/ap /datum/uplink_item/item/ammo/a545/ap
name = "Machinegun Magazine (5.56mm AP)" name = "Machinegun Magazine (5.45mm AP)"
path = /obj/item/ammo_magazine/m556saw/ap path = /obj/item/ammo_magazine/m545saw/ap
/datum/uplink_item/item/ammo/g12 /datum/uplink_item/item/ammo/g12
name = "12g Shotgun Ammo Box (Slug)" name = "12g Shotgun Ammo Box (Slug)"

View File

@@ -39,6 +39,26 @@
item_cost = 10 item_cost = 10
path = /obj/item/weapon/storage/box/freezer path = /obj/item/weapon/storage/box/freezer
/datum/uplink_item/item/medical/monkeycubes
name = "Box, Monkey Cubes"
item_cost = 10
path = /obj/item/weapon/storage/box/monkeycubes
/datum/uplink_item/item/medical/farwacubes
name = "Box, Farwa Cubes"
item_cost = 10
path = /obj/item/weapon/storage/box/monkeycubes
/datum/uplink_item/item/medical/neaeracubes
name = "Box, Neaera Cubes"
item_cost = 10
path = /obj/item/weapon/storage/box/monkeycubes/neaeracubes
/datum/uplink_item/item/medical/stokcubes
name = "Box, Stok Cubes"
item_cost = 10
path = /obj/item/weapon/storage/box/monkeycubes/stokcubes
/datum/uplink_item/item/medical/surgery /datum/uplink_item/item/medical/surgery
name = "Surgery kit" name = "Surgery kit"
item_cost = 45 item_cost = 45

View File

@@ -66,6 +66,21 @@
When in hacking mode this device will grant full access to any standard airlock within 20 to 40 seconds. \ When in hacking mode this device will grant full access to any standard airlock within 20 to 40 seconds. \
This device will also be able to immediately access the last 6 to 8 hacked airlocks." This device will also be able to immediately access the last 6 to 8 hacked airlocks."
/datum/uplink_item/item/tools/ai_detector
name = "Anti-Surveillance Tool"
item_cost = 20
path = /obj/item/device/multitool/ai_detector
desc = "This functions like a normal multitool, but includes an integrated camera network sensor that will warn the holder if they are being \
watched, by changing color and beeping. It is able to detect both AI visual surveillance and security camera utilization from terminals, and \
will give different warnings by beeping and changing colors based on what it detects. Only the holder can hear the warnings."
/datum/uplink_item/item/tools/radio_jammer
name = "Subspace Jammer"
item_cost = 25
path = /obj/item/device/radio_jammer
desc = "A device which is capable of disrupting subspace communications, preventing the use of headsets, PDAs, and communicators within \
a radius of seven meters. It runs off weapon cells, which can be replaced as needed. One cell will last for approximately a minute."
/datum/uplink_item/item/tools/emag /datum/uplink_item/item/tools/emag
name = "Cryptographic Sequencer" name = "Cryptographic Sequencer"
item_cost = 30 item_cost = 30

View File

@@ -5,7 +5,7 @@ var/datum/uplink/uplink = new()
var/list/datum/uplink_item/items var/list/datum/uplink_item/items
var/list/datum/uplink_category/categories var/list/datum/uplink_category/categories
/datum/uplink/New() /datum/uplink/New(var/type)
items_assoc = list() items_assoc = list()
items = init_subtypes(/datum/uplink_item) items = init_subtypes(/datum/uplink_item)
categories = init_subtypes(/datum/uplink_category) categories = init_subtypes(/datum/uplink_category)
@@ -38,7 +38,8 @@ var/datum/uplink/uplink = new()
/datum/uplink_item/New() /datum/uplink_item/New()
..() ..()
antag_roles = list() if(!antag_roles)
antag_roles = list()
@@ -85,8 +86,9 @@ var/datum/uplink/uplink = new()
for(var/antag_role in antag_roles) for(var/antag_role in antag_roles)
var/datum/antagonist/antag = all_antag_types[antag_role] var/datum/antagonist/antag = all_antag_types[antag_role]
if(antag.is_antagonist(U.uplink_owner)) if(!isnull(antag))
return 1 if(antag.is_antagonist(U.uplink_owner))
return 1
return 0 return 0
/datum/uplink_item/proc/cost(var/telecrystals, obj/item/device/uplink/U) /datum/uplink_item/proc/cost(var/telecrystals, obj/item/device/uplink/U)

View File

@@ -15,10 +15,45 @@
path = /obj/item/weapon/material/hatchet/tacknife/combatknife path = /obj/item/weapon/material/hatchet/tacknife/combatknife
/datum/uplink_item/item/visible_weapons/energy_sword /datum/uplink_item/item/visible_weapons/energy_sword
name = "Energy Sword" name = "Energy Sword, Random"
item_cost = 40 item_cost = 40
path = /obj/item/weapon/melee/energy/sword path = /obj/item/weapon/melee/energy/sword
/datum/uplink_item/item/visible_weapons/energy_sword_blue
name = "Energy Sword, Blue"
item_cost = 40
path = /obj/item/weapon/melee/energy/sword/blue
/datum/uplink_item/item/visible_weapons/energy_sword_green
name = "Energy Sword, Green"
item_cost = 40
path = /obj/item/weapon/melee/energy/sword/green
/datum/uplink_item/item/visible_weapons/energy_sword_red
name = "Energy Sword, Red"
item_cost = 40
path = /obj/item/weapon/melee/energy/sword/red
/datum/uplink_item/item/visible_weapons/energy_sword_purple
name = "Energy Sword, Purple"
item_cost = 40
path = /obj/item/weapon/melee/energy/sword/purple
/datum/uplink_item/item/visible_weapons/energy_sword_pirate
name = "Energy Cutlass"
item_cost = 40
path = /obj/item/weapon/melee/energy/sword/pirate
/datum/uplink_item/item/visible_weapons/claymore
name = "Claymore"
item_cost = 40
path = /obj/item/weapon/material/sword
/datum/uplink_item/item/visible_weapons/katana
name = "Katana"
item_cost = 40
path = /obj/item/weapon/material/sword/katana
/datum/uplink_item/item/visible_weapons/dartgun /datum/uplink_item/item/visible_weapons/dartgun
name = "Dart Gun" name = "Dart Gun"
item_cost = 30 item_cost = 30
@@ -44,15 +79,38 @@
item_cost = 70 item_cost = 70
path = /obj/item/weapon/gun/projectile/revolver path = /obj/item/weapon/gun/projectile/revolver
/datum/uplink_item/item/visible_weapons/mateba
name = "Mateba"
item_cost = 70
path = /obj/item/weapon/gun/projectile/revolver/mateba
/datum/uplink_item/item/visible_weapons/judge
name = "Judge"
item_cost = 70
path = /obj/item/weapon/gun/projectile/revolver/judge
/datum/uplink_item/item/visible_weapons/lemat
name = "LeMat"
item_cost = 60
path = /obj/item/weapon/gun/projectile/revolver/lemat
/datum/uplink_item/item/visible_weapons/Derringer /datum/uplink_item/item/visible_weapons/Derringer
name = ".357 Derringer Pistol" name = ".357 Derringer Pistol"
item_cost = 40 item_cost = 40
path = /obj/item/weapon/gun/projectile/derringer path = /obj/item/weapon/gun/projectile/derringer
/datum/uplink_item/item/visible_weapons/heavysniper /datum/uplink_item/item/visible_weapons/heavysnipermerc
name = "Anti-Materiel Rifle (14.5mm)" name = "Anti-Materiel Rifle (14.5mm)"
item_cost = DEFAULT_TELECRYSTAL_AMOUNT item_cost = DEFAULT_TELECRYSTAL_AMOUNT
path = /obj/item/weapon/gun/projectile/heavysniper path = /obj/item/weapon/gun/projectile/heavysniper
antag_roles = list("mercenary")
/datum/uplink_item/item/visible_weapons/heavysnipertraitor
name = "Anti-Materiel Rifle (14.5mm)"
desc = "A convenient collapsible rifle for covert assassination. Comes with 4 shots and its own secure carrying case."
item_cost = DEFAULT_TELECRYSTAL_AMOUNT
path = /obj/item/weapon/storage/secure/briefcase/rifle
antag_roles = list("traitor", "autotraitor", "infiltrator")
/datum/uplink_item/item/visible_weapons/tommygun /datum/uplink_item/item/visible_weapons/tommygun
name = "Tommygun (.45)" // We're keeping this because it's CLASSY. -Spades name = "Tommygun (.45)" // We're keeping this because it's CLASSY. -Spades
@@ -66,20 +124,20 @@
path = /obj/item/weapon/gun/projectile/automatic/c20r path = /obj/item/weapon/gun/projectile/automatic/c20r
/datum/uplink_item/item/visible_weapons/assaultrifle /datum/uplink_item/item/visible_weapons/assaultrifle
name = "Assault Rifle (7.62mm)" name = "Assault Rifle (5.45mm)"
item_cost = 75 item_cost = 75
path = /obj/item/weapon/gun/projectile/automatic/sts35 path = /obj/item/weapon/gun/projectile/automatic/sts35
/*/datum/uplink_item/item/visible_weapons/bullpuprifle
name = "Assault Rifle (5.56mm)"
item_cost = 7
path = /obj/item/weapon/gun/projectile/automatic/carbine
*/
/datum/uplink_item/item/visible_weapons/combatshotgun /datum/uplink_item/item/visible_weapons/combatshotgun
name = "Combat Shotgun" name = "Combat Shotgun"
item_cost = 75 item_cost = 75
path = /obj/item/weapon/gun/projectile/shotgun/pump/combat path = /obj/item/weapon/gun/projectile/shotgun/pump/combat
/datum/uplink_item/item/visible_weapons/leveraction
name = "Lever Action Rifle"
item_cost = 50
path = /obj/item/weapon/gun/projectile/shotgun/pump/rifle/lever
/datum/uplink_item/item/visible_weapons/egun /datum/uplink_item/item/visible_weapons/egun
name = "Energy Gun" name = "Energy Gun"
item_cost = 60 item_cost = 60

View File

@@ -120,6 +120,7 @@ var/list/wireColours = list("red", "blue", "green", "darkred", "orange", "brown"
if(istype(I, /obj/item/weapon/wirecutters)) if(istype(I, /obj/item/weapon/wirecutters))
var/colour = href_list["cut"] var/colour = href_list["cut"]
CutWireColour(colour) CutWireColour(colour)
playsound(holder, I.usesound, 20, 1)
else else
L << "<span class='error'>You need wirecutters!</span>" L << "<span class='error'>You need wirecutters!</span>"
@@ -127,6 +128,7 @@ var/list/wireColours = list("red", "blue", "green", "darkred", "orange", "brown"
if(istype(I, /obj/item/device/multitool)) if(istype(I, /obj/item/device/multitool))
var/colour = href_list["pulse"] var/colour = href_list["pulse"]
PulseColour(colour) PulseColour(colour)
playsound(holder, 'sound/weapons/empty.ogg', 20, 1)
else else
L << "<span class='error'>You need a multitool!</span>" L << "<span class='error'>You need a multitool!</span>"

View File

@@ -33,7 +33,7 @@
tile_overlay = "phoron" tile_overlay = "phoron"
overlay_limit = 0.7 overlay_limit = 0.7
flags = XGM_GAS_FUEL | XGM_GAS_CONTAMINANT flags = XGM_GAS_FUEL | XGM_GAS_CONTAMINANT | XGM_GAS_FUSION_FUEL //R-UST port, adding XGM_GAS_FUSION_FUEL flag.
/decl/xgm_gas/volatile_fuel /decl/xgm_gas/volatile_fuel
id = "volatile_fuel" id = "volatile_fuel"

View File

@@ -111,9 +111,6 @@
else if(config.use_age_restriction_for_antags && player.current.client.player_age < minimum_player_age) else if(config.use_age_restriction_for_antags && player.current.client.player_age < minimum_player_age)
candidates -= player candidates -= player
log_debug("[key_name(player)] is not eligible to become a [role_text]: Is only [player.current.client.player_age] day\s old, has to be [minimum_player_age] day\s!") log_debug("[key_name(player)] is not eligible to become a [role_text]: Is only [player.current.client.player_age] day\s old, has to be [minimum_player_age] day\s!")
else if(istype(player.current, /mob/living/voice))
candidates -= player
log_debug("[key_name(player)] is not eligible to become a [role_text]: They are only a communicator voice. They have been removed from the draft.")
else if(player.special_role) else if(player.special_role)
candidates -= player candidates -= player
log_debug("[key_name(player)] is not eligible to become a [role_text]: They already have a special role ([player.special_role])! They have been removed from the draft.") log_debug("[key_name(player)] is not eligible to become a [role_text]: They already have a special role ([player.special_role])! They have been removed from the draft.")

View File

@@ -1,12 +1,16 @@
/datum/antagonist/proc/can_become_antag(var/datum/mind/player, var/ignore_role) /datum/antagonist/proc/can_become_antag(var/datum/mind/player, var/ignore_role)
if(player.current && jobban_isbanned(player.current, bantype)) if(player.current)
return 0 if(jobban_isbanned(player.current, bantype))
return FALSE
if(!isnewplayer(player.current) && !isobserver(player.current))
if(!player.current.can_be_antagged) // Stop autotraitoring pAIs!
return FALSE
if(!ignore_role) if(!ignore_role)
if(player.assigned_role in restricted_jobs) if(player.assigned_role in restricted_jobs)
return 0 return FALSE
if(config.protect_roles_from_antagonist && (player.assigned_role in protected_jobs)) if(config.protect_roles_from_antagonist && (player.assigned_role in protected_jobs))
return 0 return FALSE
return 1 return TRUE
/datum/antagonist/proc/antags_are_dead() /datum/antagonist/proc/antags_are_dead()
for(var/datum/mind/antag in current_antagonists) for(var/datum/mind/antag in current_antagonists)

View File

@@ -17,7 +17,7 @@ var/datum/antagonist/mercenary/mercs
hard_cap = 4 hard_cap = 4
hard_cap_round = 8 hard_cap_round = 8
initial_spawn_req = 3 initial_spawn_req = 3
initial_spawn_target = 4 initial_spawn_target = 3
/datum/antagonist/mercenary/New() /datum/antagonist/mercenary/New()
..() ..()

View File

@@ -12,10 +12,10 @@ var/datum/antagonist/raider/raiders
flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_VOTABLE | ANTAG_SET_APPEARANCE | ANTAG_HAS_LEADER flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_VOTABLE | ANTAG_SET_APPEARANCE | ANTAG_HAS_LEADER
antaghud_indicator = "hudmutineer" antaghud_indicator = "hudmutineer"
hard_cap = 6 hard_cap = 4
hard_cap_round = 10 hard_cap_round = 8
initial_spawn_req = 3 initial_spawn_req = 3
initial_spawn_target = 4 initial_spawn_target = 3
id_type = /obj/item/weapon/card/id/syndicate id_type = /obj/item/weapon/card/id/syndicate

View File

@@ -1431,8 +1431,8 @@ area/space/atmosalert()
name = "\improper Visitor Lodging" name = "\improper Visitor Lodging"
icon_state = "visitor_lodging" icon_state = "visitor_lodging"
/area/crew_quarters/visitor_dinning /area/crew_quarters/visitor_dining
name = "\improper Visitor Dinning" name = "\improper Visitor Dining"
icon_state = "visitor_dinning" icon_state = "visitor_dinning"
/area/crew_quarters/visitor_laundry /area/crew_quarters/visitor_laundry

View File

@@ -298,10 +298,9 @@ its easier to just keep the beam vertical.
//Deal with gloves the pass finger/palm prints. //Deal with gloves the pass finger/palm prints.
if(!ignoregloves) if(!ignoregloves)
if(H.gloves != src) if(H.gloves && H.gloves != src)
if(prob(75) && istype(H.gloves, /obj/item/clothing/gloves/sterile)) var/obj/item/clothing/gloves/G = H.gloves
return 0 if(!prob(G.fingerprint_chance))
else if(H.gloves && !istype(H.gloves, /obj/item/clothing/gloves/sterile))
return 0 return 0
//More adminstuffz //More adminstuffz

View File

@@ -92,11 +92,10 @@
for(var/mob/M in src)//Failsafe so you can get mobs out for(var/mob/M in src)//Failsafe so you can get mobs out
M.loc = get_turf(src) M.loc = get_turf(src)
/obj/machinery/dna_scannernew/Bumped(user as mob|obj) /obj/machinery/dna_scannernew/MouseDrop_T(var/mob/target, var/mob/user) //Allows borgs to clone people without external assistance
if (user == usr) // Only if we are actually being walked into by real client if(user.stat || user.lying || !Adjacent(user) || !target.Adjacent(user)|| !ishuman(target))
move_inside()
return return
return ..() put_in(target)
/obj/machinery/dna_scannernew/verb/move_inside() /obj/machinery/dna_scannernew/verb/move_inside()
set src in oview(1) set src in oview(1)

View File

@@ -112,9 +112,6 @@
"<span class='warning'>We harden our flesh, creating a suit of armor!</span>", "<span class='warning'>We harden our flesh, creating a suit of armor!</span>",
"<span class='italics'>You hear organic matter ripping and tearing!</span>") "<span class='italics'>You hear organic matter ripping and tearing!</span>")
/obj/item/clothing/suit/space/changeling/armored/dropped()
qdel(src)
/obj/item/clothing/head/helmet/space/changeling/armored /obj/item/clothing/head/helmet/space/changeling/armored
name = "chitinous mass" name = "chitinous mass"
desc = "A tough, hard covering of black chitin with transparent chitin in front." desc = "A tough, hard covering of black chitin with transparent chitin in front."
@@ -123,19 +120,12 @@
siemens_coefficient = 0.3 siemens_coefficient = 0.3
max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE
/obj/item/clothing/head/helmet/space/changeling/armored/dropped()
qdel(src)
/obj/item/clothing/shoes/magboots/changeling/armored /obj/item/clothing/shoes/magboots/changeling/armored
desc = "A tough, hard mass of chitin, with long talons for digging into terrain." desc = "A tough, hard mass of chitin, with long talons for digging into terrain."
name = "chitinous talons" name = "chitinous talons"
icon_state = "lingarmor" icon_state = "lingarmor"
action_button_name = "Toggle Talons" action_button_name = "Toggle Talons"
/obj/item/clothing/shoes/magboots/changeling/armored/dropped()
..()
qdel(src)
/obj/item/clothing/gloves/combat/changeling //Combined insulated/fireproof gloves /obj/item/clothing/gloves/combat/changeling //Combined insulated/fireproof gloves
name = "chitinous gauntlets" name = "chitinous gauntlets"
desc = "Very resilient gauntlets made out of black chitin. It looks very durable, and can probably resist electrical shock in addition to the elements." desc = "Very resilient gauntlets made out of black chitin. It looks very durable, and can probably resist electrical shock in addition to the elements."

View File

@@ -0,0 +1,26 @@
/datum/power/changeling/darksight
name = "Dark Sight"
desc = "We change the composition of our eyes, banishing the shadows from our vision."
helptext = "We will be able to see in the dark."
ability_icon_state = "ling_augmented_eyesight"
genomecost = 0
verbpath = /mob/proc/changeling_darksight
/mob/proc/changeling_darksight()
set category = "Changeling"
set name = "Toggle Darkvision"
set desc = "We are able see in the dark."
var/datum/changeling/changeling = changeling_power(0,0,100,UNCONSCIOUS)
if(!changeling)
return 0
if(istype(src,/mob/living/carbon))
var/mob/living/carbon/C = src
C.seedarkness = !C.seedarkness
if(C.seedarkness)
to_chat(C, "<span class='notice'>We allow the shadows to return.</span>")
else
to_chat(C, "<span class='notice'>We no longer need light to see.</span>")
return 0

View File

@@ -33,6 +33,9 @@
if(C.suiciding) if(C.suiciding)
C.suiciding = 0 C.suiciding = 0
if(C.does_not_breathe)
C.does_not_breathe = 0 //This means they don't autoheal the oxy damage from the next step
if(C.stat != DEAD) if(C.stat != DEAD)
C.adjustOxyLoss(C.maxHealth * 2) C.adjustOxyLoss(C.maxHealth * 2)

View File

@@ -152,12 +152,15 @@ var/list/sacrificed = list()
target << "<span class='cult'>Your mind turns to ash as the burning flames engulf your very soul and images of an unspeakable horror begin to bombard the last remnants of mental resistance.</span>" target << "<span class='cult'>Your mind turns to ash as the burning flames engulf your very soul and images of an unspeakable horror begin to bombard the last remnants of mental resistance.</span>"
//broken mind - 5000 may seem like a lot I wanted the effect to really stand out for maxiumum losing-your-mind-spooky //broken mind - 5000 may seem like a lot I wanted the effect to really stand out for maxiumum losing-your-mind-spooky
//hallucination is reduced when the step off as well, provided they haven't hit the last stage... //hallucination is reduced when the step off as well, provided they haven't hit the last stage...
target.hallucination += 5000
//5000 is waaaay too much, in practice.
target.hallucination = min(target.hallucination + 100, 500)
target.apply_effect(10, STUTTER) target.apply_effect(10, STUTTER)
target.adjustBrainLoss(1) target.adjustBrainLoss(1)
if(100 to INFINITY) if(100 to INFINITY)
target << "<span class='cult'>Your entire broken soul and being is engulfed in corruption and flames as your mind shatters away into nothing.</span>" target << "<span class='cult'>Your entire broken soul and being is engulfed in corruption and flames as your mind shatters away into nothing.</span>"
target.hallucination += 5000 //5000 is waaaay too much, in practice.
target.hallucination = min(target.hallucination + 100, 500)
target.apply_effect(15, STUTTER) target.apply_effect(15, STUTTER)
target.adjustBrainLoss(1) target.adjustBrainLoss(1)
@@ -626,10 +629,8 @@ var/list/sacrificed = list()
if(istype(src,/obj/effect/rune)) if(istype(src,/obj/effect/rune))
usr.say("O bidai nabora se[pick("'","`")]sma!") usr.say("O bidai nabora se[pick("'","`")]sma!")
usr.say("[input]")
else else
usr.whisper("O bidai nabora se[pick("'","`")]sma!") usr.whisper("O bidai nabora se[pick("'","`")]sma!")
usr.whisper("[input]")
input = sanitize(input) input = sanitize(input)
log_and_message_admins("used a communicate rune to say '[input]'") log_and_message_admins("used a communicate rune to say '[input]'")

View File

@@ -52,7 +52,7 @@
intercept.name = "paper" intercept.name = "paper"
intercept.info = intercepttext intercept.info = intercepttext
comm.messagetitle.Add("Cent. Com. CONFIDENTIAL REPORT") comm.messagetitle.Add("CentCom CONFIDENTIAL REPORT")
comm.messagetext.Add(intercepttext) comm.messagetext.Add(intercepttext)
world << sound('sound/AI/commandreport.ogg') world << sound('sound/AI/commandreport.ogg')
@@ -74,7 +74,7 @@
intercept.name = "paper" intercept.name = "paper"
intercept.info = intercepttext intercept.info = intercepttext
comm.messagetitle.Add("Cent. Com. CONFIDENTIAL REPORT") comm.messagetitle.Add("CentCom CONFIDENTIAL REPORT")
comm.messagetext.Add(intercepttext) comm.messagetext.Add(intercepttext)
world << sound('sound/AI/commandreport.ogg') world << sound('sound/AI/commandreport.ogg')

View File

@@ -405,6 +405,8 @@ var/global/list/additional_antag_types = list()
candidates += player.mind candidates += player.mind
players -= player players -= player
// Below is commented out as an attempt to solve an issue of too little people wanting to join the round due to wanting to have cake and eat it too.
/*
// If we don't have enough antags, draft people who voted for the round. // If we don't have enough antags, draft people who voted for the round.
if(candidates.len < required_enemies) if(candidates.len < required_enemies)
for(var/mob/new_player/player in players) for(var/mob/new_player/player in players)
@@ -413,6 +415,7 @@ var/global/list/additional_antag_types = list()
candidates += player.mind candidates += player.mind
players -= player players -= player
break break
*/
return candidates // Returns: The number of people who had the antagonist role set to yes, regardless of recomended_enemies, if that number is greater than required_enemies return candidates // Returns: The number of people who had the antagonist role set to yes, regardless of recomended_enemies, if that number is greater than required_enemies
// required_enemies if the number of people with that role set to yes is less than recomended_enemies, // required_enemies if the number of people with that role set to yes is less than recomended_enemies,

View File

@@ -7,9 +7,9 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind'
/datum/game_mode/heist /datum/game_mode/heist
name = "Heist" name = "Heist"
config_tag = "heist" config_tag = "heist"
required_players = 15 required_players = 9
required_players_secret = 15 required_players_secret = 9
required_enemies = 4 required_enemies = 3
round_description = "An unidentified bluespace signature is approaching the station!" round_description = "An unidentified bluespace signature is approaching the station!"
extended_round_description = "The Company's majority control of phoron in the system has marked the \ extended_round_description = "The Company's majority control of phoron in the system has marked the \
station to be a highly valuable target for many competing organizations and individuals. Being a \ station to be a highly valuable target for many competing organizations and individuals. Being a \

View File

@@ -1,5 +1,5 @@
/datum/game_mode/infiltrator /datum/game_mode/infiltrator
name = "Infiltrator" name = "Team Traitor"
round_description = "There are a group of shadowy infiltrators onboard! Be careful!" round_description = "There are a group of shadowy infiltrators onboard! Be careful!"
extended_round_description = "A team of secretative people have played the long con, and managed to obtain entry to \ extended_round_description = "A team of secretative people have played the long con, and managed to obtain entry to \
the facility. What their goals are, who their employers are, and why the individuals would work for them is a mystery, \ the facility. What their goals are, who their employers are, and why the individuals would work for them is a mystery, \

View File

@@ -1045,7 +1045,7 @@ datum
return 20 return 20
AI AI
steal_target = /obj/structure/AIcore steal_target = /obj/structure/AIcore
explanation_text = "Steal a finished AI, either by intellicard or stealing the whole construct." explanation_text = "Steal a finished AI, either by intelliCore or stealing the whole construct."
weight = 50 weight = 50
get_points(var/job) get_points(var/job)

View File

@@ -12,9 +12,9 @@ var/list/nuke_disks = list()
colony of sizable population and considerable wealth causes it to often be the target of various \ colony of sizable population and considerable wealth causes it to often be the target of various \
attempts of robbery, fraud and other malicious actions." attempts of robbery, fraud and other malicious actions."
config_tag = "mercenary" config_tag = "mercenary"
required_players = 15 required_players = 9
required_players_secret = 15 required_players_secret = 9
required_enemies = 4 required_enemies = 3
end_on_antag_death = 0 end_on_antag_death = 0
var/nuke_off_station = 0 //Used for tracking if the syndies actually haul the nuke to the station var/nuke_off_station = 0 //Used for tracking if the syndies actually haul the nuke to the station
var/syndies_didnt_escape = 0 //Used for tracking if the syndies got the shuttle off of the z-level var/syndies_didnt_escape = 0 //Used for tracking if the syndies got the shuttle off of the z-level

View File

@@ -36,7 +36,7 @@
/obj/item/weapon/antag_spawner/technomancer_apprentice/Destroy() /obj/item/weapon/antag_spawner/technomancer_apprentice/Destroy()
qdel(sparks) qdel(sparks)
..() return ..()
/obj/item/weapon/antag_spawner/technomancer_apprentice/attack_self(mob/user) /obj/item/weapon/antag_spawner/technomancer_apprentice/attack_self(mob/user)
user << "<span class='notice'>Teleporter attempting to lock on to your apprentice.</span>" user << "<span class='notice'>Teleporter attempting to lock on to your apprentice.</span>"

View File

@@ -60,7 +60,7 @@
/mob/living/simple_animal/technomancer_golem/Destroy() /mob/living/simple_animal/technomancer_golem/Destroy()
qdel(core) qdel(core)
..() return ..()
/mob/living/simple_animal/technomancer_golem/update_icon() /mob/living/simple_animal/technomancer_golem/update_icon()
overlays.Cut() overlays.Cut()

View File

@@ -43,7 +43,7 @@
/obj/item/weapon/technomancer_core/Destroy() /obj/item/weapon/technomancer_core/Destroy()
dismiss_all_summons() dismiss_all_summons()
processing_objects.Remove(src) processing_objects.Remove(src)
..() return ..()
// Add the spell buttons to the HUD. // Add the spell buttons to the HUD.
/obj/item/weapon/technomancer_core/equipped(mob/user) /obj/item/weapon/technomancer_core/equipped(mob/user)

View File

@@ -44,7 +44,7 @@
/obj/item/clothing/gloves/regen/Destroy() /obj/item/clothing/gloves/regen/Destroy()
wearer = null wearer = null
processing_objects -= src processing_objects -= src
..() return ..()
/obj/item/clothing/gloves/regen/process() /obj/item/clothing/gloves/regen/process()
if(!wearer || wearer.isSynthetic() || wearer.stat == DEAD || wearer.nutrition <= 10) if(!wearer || wearer.isSynthetic() || wearer.stat == DEAD || wearer.nutrition <= 10)

View File

@@ -31,7 +31,7 @@
/obj/item/clothing/suit/armor/shield/Destroy() /obj/item/clothing/suit/armor/shield/Destroy()
qdel(spark_system) qdel(spark_system)
..() return ..()
/obj/item/clothing/suit/armor/shield/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") /obj/item/clothing/suit/armor/shield/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
//Since this is a pierce of armor that is passive, we do not need to check if the user is incapacitated. //Since this is a pierce of armor that is passive, we do not need to check if the user is incapacitated.

View File

@@ -151,7 +151,7 @@
/obj/item/weapon/spell/Destroy() /obj/item/weapon/spell/Destroy()
owner = null owner = null
core = null core = null
..() return ..()
// Proc: update_icon() // Proc: update_icon()
// Parameters: 0 // Parameters: 0

View File

@@ -7,6 +7,7 @@
spell_power_desc = "Blink distance is scaled up with more spell power." spell_power_desc = "Blink distance is scaled up with more spell power."
cost = 50 cost = 50
obj_path = /obj/item/weapon/spell/blink obj_path = /obj/item/weapon/spell/blink
ability_icon_state = "tech_blink"
category = UTILITY_SPELLS category = UTILITY_SPELLS
/obj/item/weapon/spell/blink /obj/item/weapon/spell/blink

View File

@@ -7,6 +7,7 @@
around the entity is merely a hologram used to allow the user to know if the creature is safe or not." around the entity is merely a hologram used to allow the user to know if the creature is safe or not."
cost = 100 cost = 100
obj_path = /obj/item/weapon/spell/control obj_path = /obj/item/weapon/spell/control
ability_icon_state = "tech_control"
category = UTILITY_SPELLS category = UTILITY_SPELLS
/mob/living/carbon/human/proc/technomancer_control() /mob/living/carbon/human/proc/technomancer_control()

View File

@@ -28,6 +28,7 @@
/obj/item/weapon/weldingtool/spell /obj/item/weapon/weldingtool/spell
name = "flame" name = "flame"
eye_safety_modifier = 3
/obj/item/weapon/weldingtool/spell/process() /obj/item/weapon/weldingtool/spell/process()
return return

View File

@@ -181,7 +181,7 @@
if(I_HURT) if(I_HURT)
adjustBruteLoss(harm_intent_damage) adjustBruteLoss(harm_intent_damage)
M.visible_message("\red [M] [response_harm] \the [src]") M.visible_message("<font color='red'>[M] [response_harm] \the [src]</font>")
M.do_attack_animation(src) M.do_attack_animation(src)
return return

View File

@@ -1,12 +1,12 @@
/datum/technomancer/spell/mend_synthetic /datum/technomancer/spell/mend_synthetic
name = "Mend Synthetic" name = "Mend Synthetic"
desc = "Repairs minor damages to robotic entities. \ desc = "Repairs minor damage to prosthetics. \
Instability is split between the target and technomancer, if seperate. The function will end prematurely \ Instability is split between the target and technomancer, if seperate. The function will end prematurely \
if the target is completely healthy, preventing further instability." if the target is completely healthy, preventing further instability."
spell_power_desc = "Healing amount increased." spell_power_desc = "Healing amount increased."
cost = 50 cost = 50
obj_path = /obj/item/weapon/spell/modifier/mend_synthetic obj_path = /obj/item/weapon/spell/modifier/mend_synthetic
ability_icon_state = "tech_mendwounds" ability_icon_state = "tech_mendsynth"
category = SUPPORT_SPELLS category = SUPPORT_SPELLS
/obj/item/weapon/spell/modifier/mend_synthetic /obj/item/weapon/spell/modifier/mend_synthetic
@@ -35,8 +35,11 @@
if(!holder.getBruteLoss() && !holder.getFireLoss()) // No point existing if the spell can't heal. if(!holder.getBruteLoss() && !holder.getFireLoss()) // No point existing if the spell can't heal.
expire() expire()
return return
holder.adjustBruteLoss(-4 * spell_power) // Should heal roughly 20 burn/brute over 10 seconds, as tick() is run every 2 seconds. if(ishuman(holder))
holder.adjustFireLoss(-4 * spell_power) // Ditto. var/mob/living/carbon/human/H = holder
for(var/obj/item/organ/external/E in H.organs)
var/obj/item/organ/external/O = E
O.heal_damage(4 * spell_power, 4 * spell_power, 0, 1)
holder.adjust_instability(1) holder.adjust_instability(1)
if(origin) if(origin)
var/mob/living/L = origin.resolve() var/mob/living/L = origin.resolve()

View File

@@ -4,7 +4,7 @@
If casted on the envirnment, air (oxygen and nitrogen) is moved from a distant location to your target." If casted on the envirnment, air (oxygen and nitrogen) is moved from a distant location to your target."
cost = 25 cost = 25
obj_path = /obj/item/weapon/spell/oxygenate obj_path = /obj/item/weapon/spell/oxygenate
ability_icon_state = "oxygenate" ability_icon_state = "tech_oxygenate"
category = SUPPORT_SPELLS category = SUPPORT_SPELLS
/obj/item/weapon/spell/oxygenate /obj/item/weapon/spell/oxygenate

View File

@@ -4,12 +4,14 @@
rift you create will afflict you with instability." rift you create will afflict you with instability."
cost = 50 cost = 50
obj_path = /obj/item/weapon/spell/phase_shift obj_path = /obj/item/weapon/spell/phase_shift
ability_icon_state = "tech_phaseshift"
category = DEFENSIVE_SPELLS category = DEFENSIVE_SPELLS
/obj/item/weapon/spell/phase_shift /obj/item/weapon/spell/phase_shift
name = "phase shift" name = "phase shift"
desc = "Allows you to dodge your untimely fate by shifting your location somewhere else, so long as you can survive inside the \ desc = "Allows you to dodge your untimely fate by shifting your location somewhere else, so long as you can survive inside the \
rift." rift."
icon_state = "blink"
cast_methods = CAST_USE cast_methods = CAST_USE
aspect = ASPECT_TELE aspect = ASPECT_TELE

View File

@@ -6,6 +6,7 @@
spell_power_desc = "Increases damage dealt, up to a cap of 80 damage per shot." spell_power_desc = "Increases damage dealt, up to a cap of 80 damage per shot."
cost = 100 cost = 100
obj_path = /obj/item/weapon/spell/projectile/overload obj_path = /obj/item/weapon/spell/projectile/overload
ability_icon_state = "tech_overload"
category = OFFENSIVE_SPELLS category = OFFENSIVE_SPELLS
/obj/item/weapon/spell/projectile/overload /obj/item/weapon/spell/projectile/overload
@@ -39,6 +40,7 @@
/obj/item/weapon/spell/projectile/overload/on_ranged_cast(atom/hit_atom, mob/living/user) /obj/item/weapon/spell/projectile/overload/on_ranged_cast(atom/hit_atom, mob/living/user)
energy_cost_per_shot = round(core.max_energy * 0.10) energy_cost_per_shot = round(core.max_energy * 0.10)
..()
/* var/energy_before_firing = core.energy /* var/energy_before_firing = core.energy
if(set_up(hit_atom, user)) if(set_up(hit_atom, user))
var/obj/item/projectile/overload/P = new spell_projectile(get_turf(user)) var/obj/item/projectile/overload/P = new spell_projectile(get_turf(user))

View File

@@ -41,7 +41,7 @@
m = min(m, cable.amount) m = min(m, cable.amount)
m = min(m, 30) m = min(m, 30)
if(m) if(m)
playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) playsound(src.loc, O.usesound, 50, 1)
use_cable(m) use_cable(m)
var/obj/item/stack/cable_coil/CC = new (get_turf(src)) var/obj/item/stack/cable_coil/CC = new (get_turf(src))
CC.amount = m CC.amount = m

View File

@@ -549,6 +549,7 @@
scrubbers[scrubbers.len]["filters"] += list(list("name" = "Carbon Dioxide", "command" = "co2_scrub","val" = info["filter_co2"])) scrubbers[scrubbers.len]["filters"] += list(list("name" = "Carbon Dioxide", "command" = "co2_scrub","val" = info["filter_co2"]))
scrubbers[scrubbers.len]["filters"] += list(list("name" = "Toxin" , "command" = "tox_scrub","val" = info["filter_phoron"])) scrubbers[scrubbers.len]["filters"] += list(list("name" = "Toxin" , "command" = "tox_scrub","val" = info["filter_phoron"]))
scrubbers[scrubbers.len]["filters"] += list(list("name" = "Nitrous Oxide", "command" = "n2o_scrub","val" = info["filter_n2o"])) scrubbers[scrubbers.len]["filters"] += list(list("name" = "Nitrous Oxide", "command" = "n2o_scrub","val" = info["filter_n2o"]))
scrubbers[scrubbers.len]["filters"] += list(list("name" = "Fuel", "command" = "fuel_scrub","val" = info["filter_fuel"]))
data["scrubbers"] = scrubbers data["scrubbers"] = scrubbers
if(AALARM_SCREEN_MODE) if(AALARM_SCREEN_MODE)
var/modes[0] var/modes[0]
@@ -655,6 +656,7 @@
"co2_scrub", "co2_scrub",
"tox_scrub", "tox_scrub",
"n2o_scrub", "n2o_scrub",
"fuel_scrub",
"panic_siphon", "panic_siphon",
"scrubbing", "scrubbing",
"direction") "direction")

View File

@@ -428,3 +428,23 @@ update_flag
src.update_icon() src.update_icon()
return 1 return 1
//R-UST port
// Special types used for engine setup admin verb, they contain double amount of that of normal canister.
/obj/machinery/portable_atmospherics/canister/nitrogen/engine_setup/New()
..()
src.air_contents.adjust_gas("nitrogen", MolesForPressure())
src.update_icon()
return 1
/obj/machinery/portable_atmospherics/canister/carbon_dioxide/engine_setup/New()
..()
src.air_contents.adjust_gas("carbon_dioxide", MolesForPressure())
src.update_icon()
return 1
/obj/machinery/portable_atmospherics/canister/phoron/engine_setup/New()
..()
src.air_contents.adjust_gas("phoron", MolesForPressure())
src.update_icon()
return 1

View File

@@ -67,13 +67,13 @@
/obj/machinery/meter/examine(mob/user) /obj/machinery/meter/examine(mob/user)
var/t = "A gas flow meter. " var/t = "A gas flow meter. "
if(get_dist(user, src) > 5 && !(istype(user, /mob/living/silicon/ai) || istype(user, /mob/observer/dead))) if(get_dist(user, src) > 3 && !(istype(user, /mob/living/silicon/ai) || istype(user, /mob/observer/dead)))
t += "<span class='warning'>You are too far away to read it.</span>" t += "<span class='warning'>You are too far away to read it.</span>"
else if(stat & (NOPOWER|BROKEN)) else if(stat & (NOPOWER|BROKEN))
t += "<span class='warning'>The display is off.</span>" t += "<span class='warning'>The display is off.</span>"
else if(src.target) else if(src.target)
var/datum/gas_mixture/environment = target.return_air() var/datum/gas_mixture/environment = target.return_air()
if(environment) if(environment)
@@ -82,7 +82,7 @@
t += "The sensor error light is blinking." t += "The sensor error light is blinking."
else else
t += "The connect error light is blinking." t += "The connect error light is blinking."
user << t user << t
/obj/machinery/meter/Click() /obj/machinery/meter/Click()
@@ -90,15 +90,15 @@
if(istype(usr, /mob/living/carbon/human) || istype(usr, /mob/living/silicon/ai)) // ghosts can call ..() for examine if(istype(usr, /mob/living/carbon/human) || istype(usr, /mob/living/silicon/ai)) // ghosts can call ..() for examine
usr.examinate(src) usr.examinate(src)
return 1 return 1
return ..() return ..()
/obj/machinery/meter/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) /obj/machinery/meter/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
if (!istype(W, /obj/item/weapon/wrench)) if (!istype(W, /obj/item/weapon/wrench))
return ..() return ..()
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) playsound(src, W.usesound, 50, 1)
user << "<span class='notice'>You begin to unfasten \the [src]...</span>" user << "<span class='notice'>You begin to unfasten \the [src]...</span>"
if (do_after(user, 40)) if (do_after(user, 40 * W.toolspeed))
user.visible_message( \ user.visible_message( \
"<span class='notice'>\The [user] unfastens \the [src].</span>", \ "<span class='notice'>\The [user] unfastens \the [src].</span>", \
"<span class='notice'>You have unfastened \the [src].</span>", \ "<span class='notice'>You have unfastened \the [src].</span>", \

View File

@@ -114,6 +114,7 @@
disconnect() disconnect()
user << "<span class='notice'>You disconnect \the [src] from the port.</span>" user << "<span class='notice'>You disconnect \the [src] from the port.</span>"
update_icon() update_icon()
playsound(src, W.usesound, 50, 1)
return return
else else
var/obj/machinery/atmospherics/portables_connector/possible_port = locate(/obj/machinery/atmospherics/portables_connector/) in loc var/obj/machinery/atmospherics/portables_connector/possible_port = locate(/obj/machinery/atmospherics/portables_connector/) in loc
@@ -121,6 +122,7 @@
if(connect(possible_port)) if(connect(possible_port))
user << "<span class='notice'>You connect \the [src] to the port.</span>" user << "<span class='notice'>You connect \the [src] to the port.</span>"
update_icon() update_icon()
playsound(src, W.usesound, 50, 1)
return return
else else
user << "<span class='notice'>\The [src] failed to connect to the port.</span>" user << "<span class='notice'>\The [src] failed to connect to the port.</span>"
@@ -173,6 +175,7 @@
return return
user.visible_message("<span class='notice'>[user] opens the panel on [src] and removes [cell].</span>", "<span class='notice'>You open the panel on [src] and remove [cell].</span>") user.visible_message("<span class='notice'>[user] opens the panel on [src] and removes [cell].</span>", "<span class='notice'>You open the panel on [src] and remove [cell].</span>")
playsound(src, I.usesound, 50, 1)
cell.add_fingerprint(user) cell.add_fingerprint(user)
cell.loc = src.loc cell.loc = src.loc
cell = null cell = null

View File

@@ -17,7 +17,7 @@
var/minrate = 0 var/minrate = 0
var/maxrate = 10 * ONE_ATMOSPHERE var/maxrate = 10 * ONE_ATMOSPHERE
var/list/scrubbing_gas = list("phoron", "carbon_dioxide", "sleeping_agent") var/list/scrubbing_gas = list("phoron", "carbon_dioxide", "sleeping_agent", "volatile_fuel")
/obj/machinery/portable_atmospherics/powered/scrubber/New() /obj/machinery/portable_atmospherics/powered/scrubber/New()
..() ..()
@@ -218,7 +218,7 @@
return return
anchored = !anchored anchored = !anchored
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) playsound(src.loc, I.usesound, 50, 1)
user << "<span class='notice'>You [anchored ? "wrench" : "unwrench"] \the [src].</span>" user << "<span class='notice'>You [anchored ? "wrench" : "unwrench"] \the [src].</span>"
return return

View File

@@ -13,7 +13,7 @@
var/c_tag_order = 999 var/c_tag_order = 999
var/status = 1 var/status = 1
anchored = 1.0 anchored = 1.0
var/invuln = null var/invuln = 0
var/bugged = 0 var/bugged = 0
var/obj/item/weapon/camera_assembly/assembly = null var/obj/item/weapon/camera_assembly/assembly = null
@@ -37,6 +37,8 @@
var/client_huds = list() var/client_huds = list()
var/list/camera_computers_using_this = list()
/obj/machinery/camera/New() /obj/machinery/camera/New()
wires = new(src) wires = new(src)
assembly = new(src) assembly = new(src)
@@ -143,7 +145,7 @@
panel_open = !panel_open panel_open = !panel_open
user.visible_message("<span class='warning'>[user] screws the camera's panel [panel_open ? "open" : "closed"]!</span>", user.visible_message("<span class='warning'>[user] screws the camera's panel [panel_open ? "open" : "closed"]!</span>",
"<span class='notice'>You screw the camera's panel [panel_open ? "open" : "closed"].</span>") "<span class='notice'>You screw the camera's panel [panel_open ? "open" : "closed"].</span>")
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) playsound(src.loc, W.usesound, 50, 1)
else if((iswirecutter(W) || ismultitool(W)) && panel_open) else if((iswirecutter(W) || ismultitool(W)) && panel_open)
interact(user) interact(user)
@@ -377,10 +379,10 @@
// Do after stuff here // Do after stuff here
user << "<span class='notice'>You start to weld the [src]..</span>" user << "<span class='notice'>You start to weld the [src]..</span>"
playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) playsound(src.loc, WT.usesound, 50, 1)
WT.eyecheck(user) WT.eyecheck(user)
busy = 1 busy = 1
if(do_after(user, 100)) if(do_after(user, 100 * WT.toolspeed))
busy = 0 busy = 0
if(!WT.isOn()) if(!WT.isOn())
return 0 return 0

View File

@@ -30,7 +30,7 @@
if(0) if(0)
// State 0 // State 0
if(iswrench(W) && isturf(src.loc)) if(iswrench(W) && isturf(src.loc))
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) playsound(src, W.usesound, 50, 1)
user << "You wrench the assembly into place." user << "You wrench the assembly into place."
anchored = 1 anchored = 1
state = 1 state = 1
@@ -48,7 +48,7 @@
return return
else if(iswrench(W)) else if(iswrench(W))
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) playsound(src, W.usesound, 50, 1)
user << "You unattach the assembly from its place." user << "You unattach the assembly from its place."
anchored = 0 anchored = 0
update_icon() update_icon()
@@ -78,7 +78,7 @@
if(3) if(3)
// State 3 // State 3
if(isscrewdriver(W)) if(isscrewdriver(W))
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) playsound(src.loc, W.usesound, 50, 1)
var/input = sanitize(input(usr, "Which networks would you like to connect this camera to? Separate networks with a comma. No Spaces!\nFor example: "+using_map.station_short+",Security,Secret ", "Set Network", camera_network ? camera_network : NETWORK_DEFAULT)) var/input = sanitize(input(usr, "Which networks would you like to connect this camera to? Separate networks with a comma. No Spaces!\nFor example: "+using_map.station_short+",Security,Secret ", "Set Network", camera_network ? camera_network : NETWORK_DEFAULT))
if(!input) if(!input)
@@ -118,7 +118,7 @@
else if(iswirecutter(W)) else if(iswirecutter(W))
new/obj/item/stack/cable_coil(get_turf(src), 2) new/obj/item/stack/cable_coil(get_turf(src), 2)
playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) playsound(src.loc, W.usesound, 50, 1)
user << "You cut the wires from the circuits." user << "You cut the wires from the circuits."
state = 2 state = 2
return return
@@ -136,7 +136,7 @@
var/obj/U = locate(/obj) in upgrades var/obj/U = locate(/obj) in upgrades
if(U) if(U)
user << "You unattach an upgrade from the assembly." user << "You unattach an upgrade from the assembly."
playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) playsound(src, W.usesound, 50, 1)
U.loc = get_turf(src) U.loc = get_turf(src)
upgrades -= U upgrades -= U
return return
@@ -161,10 +161,10 @@
return 0 return 0
user << "<span class='notice'>You start to weld the [src]..</span>" user << "<span class='notice'>You start to weld the [src]..</span>"
playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) playsound(src.loc, WT.usesound, 50, 1)
WT.eyecheck(user) WT.eyecheck(user)
busy = 1 busy = 1
if(do_after(user, 20)) if(do_after(user, 20 * WT.toolspeed))
busy = 0 busy = 0
if(!WT.isOn()) if(!WT.isOn())
return 0 return 0

View File

@@ -98,6 +98,7 @@ var/global/list/engineering_networks = list(
/obj/machinery/camera/network/thunder /obj/machinery/camera/network/thunder
network = list(NETWORK_THUNDER) network = list(NETWORK_THUNDER)
invuln = 1
// EMP // EMP

View File

@@ -68,7 +68,7 @@
anchored = !anchored anchored = !anchored
user << "You [anchored ? "attach" : "detach"] the cell charger [anchored ? "to" : "from"] the ground" user << "You [anchored ? "attach" : "detach"] the cell charger [anchored ? "to" : "from"] the ground"
playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) playsound(src, W.usesound, 75, 1)
/obj/machinery/cell_charger/attack_hand(mob/user) /obj/machinery/cell_charger/attack_hand(mob/user)
if(charging) if(charging)

View File

@@ -234,7 +234,7 @@
connected = null connected = null
else else
anchored = 1 anchored = 1
playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) playsound(src, W.usesound, 100, 1)
if(anchored) if(anchored)
user.visible_message("[user] secures [src] to the floor.", "You secure [src] to the floor.") user.visible_message("[user] secures [src] to the floor.", "You secure [src] to the floor.")
else else
@@ -243,6 +243,7 @@
var/obj/item/device/multitool/M = W var/obj/item/device/multitool/M = W
M.connecting = src M.connecting = src
user << "<span class='notice'>You load connection data from [src] to [M].</span>" user << "<span class='notice'>You load connection data from [src] to [M].</span>"
M.update_icon()
return return
else else
..() ..()

View File

@@ -15,8 +15,8 @@
switch(state) switch(state)
if(0) if(0)
if(istype(P, /obj/item/weapon/wrench)) if(istype(P, /obj/item/weapon/wrench))
playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) playsound(loc, P.usesound, 50, 1)
if(do_after(user, 20)) if(do_after(user, 20 * P.toolspeed))
user << "<span class='notice'>You wrench the frame into place.</span>" user << "<span class='notice'>You wrench the frame into place.</span>"
anchored = 1 anchored = 1
state = 1 state = 1
@@ -25,16 +25,16 @@
if(!WT.isOn()) if(!WT.isOn())
user << "The welder must be on for this task." user << "The welder must be on for this task."
return return
playsound(loc, 'sound/items/Welder.ogg', 50, 1) playsound(loc, WT.usesound, 50, 1)
if(do_after(user, 20)) if(do_after(user, 20 * WT.toolspeed))
if(!src || !WT.remove_fuel(0, user)) return if(!src || !WT.remove_fuel(0, user)) return
user << "<span class='notice'>You deconstruct the frame.</span>" user << "<span class='notice'>You deconstruct the frame.</span>"
new /obj/item/stack/material/plasteel( loc, 4) new /obj/item/stack/material/plasteel( loc, 4)
qdel(src) qdel(src)
if(1) if(1)
if(istype(P, /obj/item/weapon/wrench)) if(istype(P, /obj/item/weapon/wrench))
playsound(loc, 'sound/items/Ratchet.ogg', 50, 1) playsound(loc, P.usesound, 50, 1)
if(do_after(user, 20)) if(do_after(user, 20 * P.toolspeed))
user << "<span class='notice'>You unfasten the frame.</span>" user << "<span class='notice'>You unfasten the frame.</span>"
anchored = 0 anchored = 0
state = 0 state = 0
@@ -46,12 +46,12 @@
user.drop_item() user.drop_item()
P.loc = src P.loc = src
if(istype(P, /obj/item/weapon/screwdriver) && circuit) if(istype(P, /obj/item/weapon/screwdriver) && circuit)
playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1) playsound(loc, P.usesound, 50, 1)
user << "<span class='notice'>You screw the circuit board into place.</span>" user << "<span class='notice'>You screw the circuit board into place.</span>"
state = 2 state = 2
icon_state = "2" icon_state = "2"
if(istype(P, /obj/item/weapon/crowbar) && circuit) if(istype(P, /obj/item/weapon/crowbar) && circuit)
playsound(loc, 'sound/items/Crowbar.ogg', 50, 1) playsound(loc, P.usesound, 50, 1)
user << "<span class='notice'>You remove the circuit board.</span>" user << "<span class='notice'>You remove the circuit board.</span>"
state = 1 state = 1
icon_state = "0" icon_state = "0"
@@ -59,7 +59,7 @@
circuit = null circuit = null
if(2) if(2)
if(istype(P, /obj/item/weapon/screwdriver) && circuit) if(istype(P, /obj/item/weapon/screwdriver) && circuit)
playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1) playsound(loc, P.usesound, 50, 1)
user << "<span class='notice'>You unfasten the circuit board.</span>" user << "<span class='notice'>You unfasten the circuit board.</span>"
state = 1 state = 1
icon_state = "1" icon_state = "1"
@@ -81,7 +81,7 @@
if (brain) if (brain)
user << "Get that brain out of there first" user << "Get that brain out of there first"
else else
playsound(loc, 'sound/items/Wirecutter.ogg', 50, 1) playsound(loc, P.usesound, 50, 1)
user << "<span class='notice'>You remove the cables.</span>" user << "<span class='notice'>You remove the cables.</span>"
state = 2 state = 2
icon_state = "2" icon_state = "2"
@@ -146,7 +146,7 @@
icon_state = "3b" icon_state = "3b"
if(istype(P, /obj/item/weapon/crowbar) && brain) if(istype(P, /obj/item/weapon/crowbar) && brain)
playsound(loc, 'sound/items/Crowbar.ogg', 50, 1) playsound(loc, P.usesound, 50, 1)
user << "<span class='notice'>You remove the brain.</span>" user << "<span class='notice'>You remove the brain.</span>"
brain.loc = loc brain.loc = loc
brain = null brain = null
@@ -154,7 +154,7 @@
if(4) if(4)
if(istype(P, /obj/item/weapon/crowbar)) if(istype(P, /obj/item/weapon/crowbar))
playsound(loc, 'sound/items/Crowbar.ogg', 50, 1) playsound(loc, P.usesound, 50, 1)
user << "<span class='notice'>You remove the glass panel.</span>" user << "<span class='notice'>You remove the glass panel.</span>"
state = 3 state = 3
if (brain) if (brain)
@@ -165,7 +165,7 @@
return return
if(istype(P, /obj/item/weapon/screwdriver)) if(istype(P, /obj/item/weapon/screwdriver))
playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1) playsound(loc, P.usesound, 50, 1)
user << "<span class='notice'>You connect the monitor.</span>" user << "<span class='notice'>You connect the monitor.</span>"
if(!brain) if(!brain)
var/open_for_latejoin = alert(user, "Would you like this core to be open for latejoining AIs?", "Latejoin", "Yes", "Yes", "No") == "Yes" var/open_for_latejoin = alert(user, "Would you like this core to be open for latejoining AIs?", "Latejoin", "Yes", "Yes", "No") == "Yes"
@@ -202,8 +202,8 @@
transfer.loc = get_turf(src) transfer.loc = get_turf(src)
transfer.create_eyeobj() transfer.create_eyeobj()
transfer.cancel_camera() transfer.cancel_camera()
user << "<span class='notice'>Transfer successful:</span> [transfer.name] ([rand(1000,9999)].exe) downloaded to host terminal. Local copy wiped." user << "<span class='notice'>Transfer successful:</span> [transfer.name] placed within stationary core."
transfer << "You have been uploaded to a stationary terminal. Remote device connection restored." transfer << "You have been transferred into a stationary core. Remote device connection restored."
if(card) if(card)
card.clear() card.clear()
@@ -229,7 +229,8 @@
else if(istype(W, /obj/item/weapon/wrench)) else if(istype(W, /obj/item/weapon/wrench))
if(anchored) if(anchored)
user.visible_message("<span class='notice'>\The [user] starts to unbolt \the [src] from the plating...</span>") user.visible_message("<span class='notice'>\The [user] starts to unbolt \the [src] from the plating...</span>")
if(!do_after(user,40)) playsound(src, W.usesound, 50, 1)
if(!do_after(user,40 * W.toolspeed))
user.visible_message("<span class='notice'>\The [user] decides not to unbolt \the [src].</span>") user.visible_message("<span class='notice'>\The [user] decides not to unbolt \the [src].</span>")
return return
user.visible_message("<span class='notice'>\The [user] finishes unfastening \the [src]!</span>") user.visible_message("<span class='notice'>\The [user] finishes unfastening \the [src]!</span>")
@@ -237,7 +238,8 @@
return return
else else
user.visible_message("<span class='notice'>\The [user] starts to bolt \the [src] to the plating...</span>") user.visible_message("<span class='notice'>\The [user] starts to bolt \the [src] to the plating...</span>")
if(!do_after(user,40)) playsound(src, W.usesound, 50, 1)
if(!do_after(user,40 * W.toolspeed))
user.visible_message("<span class='notice'>\The [user] decides not to bolt \the [src].</span>") user.visible_message("<span class='notice'>\The [user] decides not to bolt \the [src].</span>")
return return
user.visible_message("<span class='notice'>\The [user] finishes fastening down \the [src]!</span>") user.visible_message("<span class='notice'>\The [user] finishes fastening down \the [src]!</span>")

View File

@@ -18,8 +18,8 @@
return return
// Transfer over the AI. // Transfer over the AI.
transfer << "You have been uploaded to a stationary terminal. Sadly, there is no remote access from here." transfer << "You have been transferred into a stationary terminal. Sadly, there is no remote access from here."
user << "<span class='notice'>Transfer successful:</span> [transfer.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed." user << "<span class='notice'>Transfer successful:</span> [transfer.name] placed within stationary terminal."
transfer.loc = src transfer.loc = src
transfer.cancel_camera() transfer.cancel_camera()
@@ -102,7 +102,7 @@
if (href_list["fix"]) if (href_list["fix"])
src.active = 1 src.active = 1
src.overlays += image(icon, "ai-fixer-on") src.overlays += image(icon, "ai-fixer-on")
while (src.occupant.health < 100) while (src.occupant.getOxyLoss() > 0 || src.occupant.getFireLoss() > 0 || src.occupant.getToxLoss() > 0 || src.occupant.getBruteLoss() > 0)
src.occupant.adjustOxyLoss(-1) src.occupant.adjustOxyLoss(-1)
src.occupant.adjustFireLoss(-1) src.occupant.adjustFireLoss(-1)
src.occupant.adjustToxLoss(-1) src.occupant.adjustToxLoss(-1)

View File

@@ -14,8 +14,8 @@
switch(state) switch(state)
if(0) if(0)
if(istype(P, /obj/item/weapon/wrench)) if(istype(P, /obj/item/weapon/wrench))
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) playsound(src.loc, P.usesound, 50, 1)
if(do_after(user, 20)) if(do_after(user, 20 * P.toolspeed))
user << "<span class='notice'>You wrench the frame into place.</span>" user << "<span class='notice'>You wrench the frame into place.</span>"
src.anchored = 1 src.anchored = 1
src.state = 1 src.state = 1
@@ -24,16 +24,16 @@
if(!WT.remove_fuel(0, user)) if(!WT.remove_fuel(0, user))
user << "The welding tool must be on to complete this task." user << "The welding tool must be on to complete this task."
return return
playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) playsound(src.loc, WT.usesound, 50, 1)
if(do_after(user, 20)) if(do_after(user, 20 * WT.toolspeed))
if(!src || !WT.isOn()) return if(!src || !WT.isOn()) return
user << "<span class='notice'>You deconstruct the frame.</span>" user << "<span class='notice'>You deconstruct the frame.</span>"
new /obj/item/stack/material/steel( src.loc, 5 ) new /obj/item/stack/material/steel( src.loc, 5 )
qdel(src) qdel(src)
if(1) if(1)
if(istype(P, /obj/item/weapon/wrench)) if(istype(P, /obj/item/weapon/wrench))
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) playsound(src.loc, P.usesound, 50, 1)
if(do_after(user, 20)) if(do_after(user, 20 * P.toolspeed))
user << "<span class='notice'>You unfasten the frame.</span>" user << "<span class='notice'>You unfasten the frame.</span>"
src.anchored = 0 src.anchored = 0
src.state = 0 src.state = 0
@@ -49,12 +49,12 @@
else else
user << "<span class='warning'>This frame does not accept circuit boards of this type!</span>" user << "<span class='warning'>This frame does not accept circuit boards of this type!</span>"
if(istype(P, /obj/item/weapon/screwdriver) && circuit) if(istype(P, /obj/item/weapon/screwdriver) && circuit)
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) playsound(src.loc, P.usesound, 50, 1)
user << "<span class='notice'>You screw the circuit board into place.</span>" user << "<span class='notice'>You screw the circuit board into place.</span>"
src.state = 2 src.state = 2
src.icon_state = "2" src.icon_state = "2"
if(istype(P, /obj/item/weapon/crowbar) && circuit) if(istype(P, /obj/item/weapon/crowbar) && circuit)
playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) playsound(src.loc, P.usesound, 50, 1)
user << "<span class='notice'>You remove the circuit board.</span>" user << "<span class='notice'>You remove the circuit board.</span>"
src.state = 1 src.state = 1
src.icon_state = "0" src.icon_state = "0"
@@ -62,7 +62,7 @@
src.circuit = null src.circuit = null
if(2) if(2)
if(istype(P, /obj/item/weapon/screwdriver) && circuit) if(istype(P, /obj/item/weapon/screwdriver) && circuit)
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) playsound(src.loc, P.usesound, 50, 1)
user << "<span class='notice'>You unfasten the circuit board.</span>" user << "<span class='notice'>You unfasten the circuit board.</span>"
src.state = 1 src.state = 1
src.icon_state = "1" src.icon_state = "1"
@@ -80,7 +80,7 @@
icon_state = "3" icon_state = "3"
if(3) if(3)
if(istype(P, /obj/item/weapon/wirecutters)) if(istype(P, /obj/item/weapon/wirecutters))
playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) playsound(src.loc, P.usesound, 50, 1)
user << "<span class='notice'>You remove the cables.</span>" user << "<span class='notice'>You remove the cables.</span>"
src.state = 2 src.state = 2
src.icon_state = "2" src.icon_state = "2"
@@ -101,13 +101,13 @@
src.icon_state = "4" src.icon_state = "4"
if(4) if(4)
if(istype(P, /obj/item/weapon/crowbar)) if(istype(P, /obj/item/weapon/crowbar))
playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) playsound(src.loc, P.usesound, 50, 1)
user << "<span class='notice'>You remove the glass panel.</span>" user << "<span class='notice'>You remove the glass panel.</span>"
src.state = 3 src.state = 3
src.icon_state = "3" src.icon_state = "3"
new /obj/item/stack/material/glass( src.loc, 2 ) new /obj/item/stack/material/glass( src.loc, 2 )
if(istype(P, /obj/item/weapon/screwdriver)) if(istype(P, /obj/item/weapon/screwdriver))
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) playsound(src.loc, P.usesound, 50, 1)
user << "<span class='notice'>You connect the monitor.</span>" user << "<span class='notice'>You connect the monitor.</span>"
var/B = new src.circuit.build_path ( src.loc ) var/B = new src.circuit.build_path ( src.loc )
src.circuit.construct(B) src.circuit.construct(B)

View File

@@ -169,6 +169,7 @@
src.current_camera = C src.current_camera = C
if(current_camera) if(current_camera)
current_camera.camera_computers_using_this.Add(src)
use_power = 2 use_power = 2
var/mob/living/L = current_camera.loc var/mob/living/L = current_camera.loc
if(istype(L)) if(istype(L))
@@ -176,6 +177,7 @@
/obj/machinery/computer/security/proc/reset_current() /obj/machinery/computer/security/proc/reset_current()
if(current_camera) if(current_camera)
current_camera.camera_computers_using_this.Remove(src)
var/mob/living/L = current_camera.loc var/mob/living/L = current_camera.loc
if(istype(L)) if(istype(L))
L.tracking_cancelled() L.tracking_cancelled()

View File

@@ -41,6 +41,7 @@
else if(istype(I,/obj/item/weapon/screwdriver)) else if(istype(I,/obj/item/weapon/screwdriver))
secured = !secured secured = !secured
user.visible_message("<span class='notice'>The [src] can [secured ? "no longer" : "now"] be modified.</span>") user.visible_message("<span class='notice'>The [src] can [secured ? "no longer" : "now"] be modified.</span>")
playsound(src, I.usesound, 50, 1)
updateBuildPath() updateBuildPath()
return return

View File

@@ -103,6 +103,7 @@
data["medical_jobs"] = format_jobs(medical_positions) data["medical_jobs"] = format_jobs(medical_positions)
data["science_jobs"] = format_jobs(science_positions) data["science_jobs"] = format_jobs(science_positions)
data["security_jobs"] = format_jobs(security_positions) data["security_jobs"] = format_jobs(security_positions)
data["cargo_jobs"] = format_jobs(cargo_positions)
data["civilian_jobs"] = format_jobs(civilian_positions) data["civilian_jobs"] = format_jobs(civilian_positions)
data["centcom_jobs"] = format_jobs(get_all_centcom_jobs()) data["centcom_jobs"] = format_jobs(get_all_centcom_jobs())

View File

@@ -53,7 +53,7 @@
if(..()) if(..())
return 1 return 1
if (using_map && !(src.z in using_map.contact_levels)) if (using_map && !(src.z in using_map.contact_levels))
usr << "\red <b>Unable to establish a connection</b>: \black You're too far away from the station!" usr << "<font color='red'><b>Unable to establish a connection:</b></font> <font color='black'>You're too far away from the station!</font>"
return return
usr.set_machine(src) usr.set_machine(src)
@@ -180,13 +180,13 @@
if("MessageCentCom") if("MessageCentCom")
if(src.authenticated==2) if(src.authenticated==2)
if(centcomm_message_cooldown) if(centcomm_message_cooldown)
usr << "\red Arrays recycling. Please stand by." usr << "<font color='red'>Arrays recycling. Please stand by.</font>"
return return
var/input = sanitize(input("Please choose a message to transmit to [using_map.boss_short] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", "")) var/input = sanitize(input("Please choose a message to transmit to [using_map.boss_short] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", ""))
if(!input || !(usr in view(1,src))) if(!input || !(usr in view(1,src)))
return return
CentCom_announce(input, usr) CentCom_announce(input, usr)
usr << "\blue Message transmitted." usr << "<font color='blue'>Message transmitted.</font>"
log_say("[key_name(usr)] has made an IA [using_map.boss_short] announcement: [input]") log_say("[key_name(usr)] has made an IA [using_map.boss_short] announcement: [input]")
centcomm_message_cooldown = 1 centcomm_message_cooldown = 1
spawn(300)//10 minute cooldown spawn(300)//10 minute cooldown
@@ -197,13 +197,13 @@
if("MessageSyndicate") if("MessageSyndicate")
if((src.authenticated==2) && (src.emagged)) if((src.authenticated==2) && (src.emagged))
if(centcomm_message_cooldown) if(centcomm_message_cooldown)
usr << "\red Arrays recycling. Please stand by." usr << "<font color='red'>Arrays recycling. Please stand by.</font>"
return return
var/input = sanitize(input(usr, "Please choose a message to transmit to \[ABNORMAL ROUTING CORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", "")) var/input = sanitize(input(usr, "Please choose a message to transmit to \[ABNORMAL ROUTING CORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", ""))
if(!input || !(usr in view(1,src))) if(!input || !(usr in view(1,src)))
return return
Syndicate_announce(input, usr) Syndicate_announce(input, usr)
usr << "\blue Message transmitted." usr << "<font color='blue'>Message transmitted.</font>"
log_say("[key_name(usr)] has made an illegal announcement: [input]") log_say("[key_name(usr)] has made an illegal announcement: [input]")
centcomm_message_cooldown = 1 centcomm_message_cooldown = 1
spawn(300)//10 minute cooldown spawn(300)//10 minute cooldown
@@ -275,7 +275,7 @@
if(..()) if(..())
return return
if (using_map && !(src.z in using_map.contact_levels)) if (using_map && !(src.z in using_map.contact_levels))
user << "\red <b>Unable to establish a connection</b>: \black You're too far away from the station!" user << "<font color='red'><b>Unable to establish a connection:</b></font> <font color='black'>You're too far away from the station!</font>"
return return
user.set_machine(src) user.set_machine(src)
@@ -514,7 +514,7 @@
if((ticker.mode.name == "blob")||(ticker.mode.name == "Meteor")) if((ticker.mode.name == "blob")||(ticker.mode.name == "Meteor"))
return return
if(!emergency_shuttle.going_to_centcom()) //check that shuttle isn't already heading to centcomm if(!emergency_shuttle.going_to_centcom()) //check that shuttle isn't already heading to CentCom
emergency_shuttle.recall() emergency_shuttle.recall()
log_game("[key_name(user)] has recalled the shuttle.") log_game("[key_name(user)] has recalled the shuttle.")
message_admins("[key_name_admin(user)] has recalled the shuttle.", 1) message_admins("[key_name_admin(user)] has recalled the shuttle.", 1)

View File

@@ -53,7 +53,7 @@
/* /*
/obj/machinery/computer/pod/attackby(I as obj, user as mob) /obj/machinery/computer/pod/attackby(I as obj, user as mob)
if(istype(I, /obj/item/weapon/screwdriver)) if(istype(I, /obj/item/weapon/screwdriver))
playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1) playsound(src.loc, W.usesound, 50, 1)
if(do_after(user, 20)) if(do_after(user, 20))
if(stat & BROKEN) if(stat & BROKEN)
user << "<span class='notice'>The broken glass falls out.</span>" user << "<span class='notice'>The broken glass falls out.</span>"

View File

@@ -79,8 +79,8 @@
switch(state) switch(state)
if(0) if(0)
if(istype(P, /obj/item/weapon/wrench)) if(istype(P, /obj/item/weapon/wrench))
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) playsound(src.loc, P.usesound, 50, 1)
if(do_after(user, 20)) if(do_after(user, 20 * P.toolspeed))
user << "<span class='notice'>You wrench the frame into place.</span>" user << "<span class='notice'>You wrench the frame into place.</span>"
src.anchored = 1 src.anchored = 1
src.state = 1 src.state = 1
@@ -89,16 +89,16 @@
if(!WT.remove_fuel(0, user)) if(!WT.remove_fuel(0, user))
user << "The welding tool must be on to complete this task." user << "The welding tool must be on to complete this task."
return return
playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) playsound(src.loc, WT.usesound, 50, 1)
if(do_after(user, 20)) if(do_after(user, 20 * WT.toolspeed))
if(!src || !WT.isOn()) return if(!src || !WT.isOn()) return
user << "<span class='notice'>You deconstruct the frame.</span>" user << "<span class='notice'>You deconstruct the frame.</span>"
new /obj/item/stack/material/steel( src.loc, 5 ) new /obj/item/stack/material/steel( src.loc, 5 )
qdel(src) qdel(src)
if(1) if(1)
if(istype(P, /obj/item/weapon/wrench)) if(istype(P, /obj/item/weapon/wrench))
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) playsound(src.loc, P.usesound, 50, 1)
if(do_after(user, 20)) if(do_after(user, 20 * P.toolspeed))
user << "<span class='notice'>You unfasten the frame.</span>" user << "<span class='notice'>You unfasten the frame.</span>"
src.anchored = 0 src.anchored = 0
src.state = 0 src.state = 0
@@ -114,12 +114,12 @@
else else
user << "<span class='warning'>This frame does not accept circuit boards of this type!</span>" user << "<span class='warning'>This frame does not accept circuit boards of this type!</span>"
if(istype(P, /obj/item/weapon/screwdriver) && circuit) if(istype(P, /obj/item/weapon/screwdriver) && circuit)
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) playsound(src.loc, P.usesound, 50, 1)
user << "<span class='notice'>You screw the circuit board into place.</span>" user << "<span class='notice'>You screw the circuit board into place.</span>"
src.state = 2 src.state = 2
src.icon_state = "2" src.icon_state = "2"
if(istype(P, /obj/item/weapon/crowbar) && circuit) if(istype(P, /obj/item/weapon/crowbar) && circuit)
playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) playsound(src.loc, P.usesound, 50, 1)
user << "<span class='notice'>You remove the circuit board.</span>" user << "<span class='notice'>You remove the circuit board.</span>"
src.state = 1 src.state = 1
src.icon_state = "0" src.icon_state = "0"
@@ -127,15 +127,15 @@
src.circuit = null src.circuit = null
if(2) if(2)
if(istype(P, /obj/item/weapon/screwdriver) && circuit) if(istype(P, /obj/item/weapon/screwdriver) && circuit)
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) playsound(src.loc, P.usesound, 50, 1)
user << "<span class='notice'>You unfasten the circuit board.</span>" user << "<span class='notice'>You unfasten the circuit board.</span>"
src.state = 1 src.state = 1
src.icon_state = "1" src.icon_state = "1"
if(istype(P, /obj/item/weapon/crowbar)) if(istype(P, /obj/item/weapon/crowbar))
if(battery) if(battery)
playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) playsound(src.loc, P.usesound, 50, 1)
if(do_after(10)) if(do_after(10 * P.toolspeed))
battery.loc = loc battery.loc = loc
user << "<span class='notice'>You remove [battery].</span>" user << "<span class='notice'>You remove [battery].</span>"
battery = null battery = null
@@ -168,7 +168,7 @@
if(components.len) if(components.len)
user << "There are parts in the way!" user << "There are parts in the way!"
return return
playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) playsound(src.loc, P.usesound, 50, 1)
user << "<span class='notice'>You remove the cables.</span>" user << "<span class='notice'>You remove the cables.</span>"
src.state = 2 src.state = 2
src.icon_state = "2" src.icon_state = "2"
@@ -190,13 +190,13 @@
src.icon_state = "4" src.icon_state = "4"
if(4) if(4)
if(istype(P, /obj/item/weapon/crowbar)) if(istype(P, /obj/item/weapon/crowbar))
playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) playsound(src.loc, P.usesound, 50, 1)
user << "<span class='notice'>You remove the glass panel.</span>" user << "<span class='notice'>You remove the glass panel.</span>"
src.state = 3 src.state = 3
src.icon_state = "3" src.icon_state = "3"
new /obj/item/stack/material/glass( src.loc, 2 ) new /obj/item/stack/material/glass( src.loc, 2 )
if(istype(P, /obj/item/weapon/screwdriver)) if(istype(P, /obj/item/weapon/screwdriver))
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) playsound(src.loc, P.usesound, 50, 1)
user << "<span class='notice'>You connect the monitor.</span>" user << "<span class='notice'>You connect the monitor.</span>"
var/obj/machinery/computer3/B = new src.circuit.build_path ( src.loc, built=1 ) var/obj/machinery/computer3/B = new src.circuit.build_path ( src.loc, built=1 )
/*if(circuit.powernet) B:powernet = circuit.powernet /*if(circuit.powernet) B:powernet = circuit.powernet

View File

@@ -41,7 +41,7 @@
*/ */
/obj/item/part/computer/ai_holder /obj/item/part/computer/ai_holder
name = "intelliCard computer module" name = "intelliCore computer module"
desc = "Contains a specialized nacelle for dealing with highly sensitive equipment without interference." desc = "Contains a specialized nacelle for dealing with highly sensitive equipment without interference."
attackby_types = list(/obj/item/device/aicard) attackby_types = list(/obj/item/device/aicard)
@@ -81,8 +81,8 @@
return return
// Transfer over the AI. // Transfer over the AI.
transfer << "You have been uploaded to a stationary terminal. Sadly, there is no remote access from here." transfer << "You have been transferred into a mobile terminal. Sadly, there is no remote access from here."
user << "<span class='notice'>Transfer successful:</span> [transfer.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed." user << "<span class='notice'>Transfer successful:</span> [transfer.name] placed within mobile terminal."
transfer.loc = src transfer.loc = src
transfer.cancel_camera() transfer.cancel_camera()

View File

@@ -184,7 +184,7 @@
stat_msg2 = reject_bad_text(sanitize(input("Line 2", "Enter Message Text", stat_msg2) as text|null, 40), 40) stat_msg2 = reject_bad_text(sanitize(input("Line 2", "Enter Message Text", stat_msg2) as text|null, 40), 40)
computer.updateDialog() computer.updateDialog()
// OMG CENTCOMM LETTERHEAD // OMG CENTCOM LETTERHEAD
if("MessageCentCom" in href_list) if("MessageCentCom" in href_list)
if(!computer.radio.subspace) if(!computer.radio.subspace)
return return

View File

@@ -42,7 +42,7 @@
icon_state = "box_1" icon_state = "box_1"
else else
if(istype(P, /obj/item/weapon/wrench)) if(istype(P, /obj/item/weapon/wrench))
playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) playsound(src, W.usesound, 75, 1)
user << "<span class='notice'>You dismantle the frame</span>" user << "<span class='notice'>You dismantle the frame</span>"
new /obj/item/stack/material/steel(src.loc, 5) new /obj/item/stack/material/steel(src.loc, 5)
qdel(src) qdel(src)
@@ -72,7 +72,7 @@
user << "<span class='warning'>This frame does not accept circuit boards of this type!</span>" user << "<span class='warning'>This frame does not accept circuit boards of this type!</span>"
else else
if(istype(P, /obj/item/weapon/wirecutters)) if(istype(P, /obj/item/weapon/wirecutters))
playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) playsound(src.loc, P.usesound, 50, 1)
user << "<span class='notice'>You remove the cables.</span>" user << "<span class='notice'>You remove the cables.</span>"
state = 1 state = 1
icon_state = "box_0" icon_state = "box_0"
@@ -81,7 +81,7 @@
if(3) if(3)
if(istype(P, /obj/item/weapon/crowbar)) if(istype(P, /obj/item/weapon/crowbar))
playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) playsound(src, P.usesound, 50, 1)
state = 2 state = 2
circuit.loc = src.loc circuit.loc = src.loc
circuit = null circuit = null
@@ -103,28 +103,28 @@
component_check = 0 component_check = 0
break break
if(component_check) if(component_check)
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) playsound(src.loc, P.usesound, 50, 1)
var/obj/machinery/new_machine = new src.circuit.build_path(src.loc, src.dir) var/obj/machinery/new_machine = new src.circuit.build_path(src.loc, src.dir)
if(new_machine.component_parts) if(new_machine.component_parts)
new_machine.component_parts.Cut() new_machine.component_parts.Cut()
else else
new_machine.component_parts = list() new_machine.component_parts = list()
src.circuit.construct(new_machine) src.circuit.construct(new_machine)
for(var/obj/O in src) for(var/obj/O in src)
if(circuit.contain_parts) // things like disposal don't want their parts in them if(circuit.contain_parts) // things like disposal don't want their parts in them
O.loc = new_machine O.loc = new_machine
else else
O.loc = null O.loc = null
new_machine.component_parts += O new_machine.component_parts += O
if(circuit.contain_parts) if(circuit.contain_parts)
circuit.loc = new_machine circuit.loc = new_machine
else else
circuit.loc = null circuit.loc = null
new_machine.RefreshParts() new_machine.RefreshParts()
qdel(src) qdel(src)
else else

View File

@@ -191,6 +191,11 @@
qdel(G) qdel(G)
return return
/obj/machinery/atmospherics/unary/cryo_cell/MouseDrop_T(var/mob/target, var/mob/user) //Allows borgs to put people into cryo without external assistance
if(user.stat || user.lying || !Adjacent(user) || !target.Adjacent(user)|| !ishuman(target))
return
put_mob(target)
/obj/machinery/atmospherics/unary/cryo_cell/update_icon() /obj/machinery/atmospherics/unary/cryo_cell/update_icon()
overlays.Cut() overlays.Cut()
icon_state = "pod[on]" icon_state = "pod[on]"

View File

@@ -515,50 +515,10 @@
if(!ismob(grab.affecting)) if(!ismob(grab.affecting))
return return
if(!check_occupant_allowed(grab.affecting))
return
var/willing = null //We don't want to allow people to be forced into despawning.
var/mob/M = grab.affecting
if(M.client)
if(alert(M,"Would you like to enter long-term storage?",,"Yes","No") == "Yes")
if(!M || !grab || !grab.affecting) return
willing = 1
else else
willing = 1 go_in(grab.affecting,user)
if(willing)
visible_message("\The [user] starts putting [grab:affecting:name] into \the [src].", 3)
if(do_after(user, 20))
if(!M || !grab || !grab:affecting) return
M.forceMove(src)
if(M.client)
M.client.perspective = EYE_PERSPECTIVE
M.client.eye = src
icon_state = occupied_icon_state
M << "<span class='notice'>[on_enter_occupant_message]</span>"
M << "<span class='notice'><b>If you ghost, log out or close your client now, your character will shortly be permanently removed from the round.</b></span>"
set_occupant(M)
time_entered = world.time
if(ishuman(M) && applies_stasis)
var/mob/living/carbon/human/H = M
H.Stasis(1000)
// Book keeping!
var/turf/location = get_turf(src)
log_admin("[key_name_admin(M)] has entered a stasis pod. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[location.x];Y=[location.y];Z=[location.z]'>JMP</a>)")
message_admins("<span class='notice'>[key_name_admin(M)] has entered a stasis pod.</span>")
//Despawning occurs when process() is called with an occupant without a client.
add_fingerprint(M)
/obj/machinery/cryopod/verb/eject() /obj/machinery/cryopod/verb/eject()
set name = "Eject Pod" set name = "Eject Pod"
@@ -666,3 +626,61 @@
name = initial(name) name = initial(name)
if(occupant) if(occupant)
name = "[name] ([occupant])" name = "[name] ([occupant])"
/obj/machinery/cryopod/MouseDrop_T(var/mob/target, var/mob/user)
if(user.stat || user.lying || !Adjacent(user) || !target.Adjacent(user))
return
go_in(target, user)
/obj/machinery/cryopod/proc/go_in(var/mob/M, var/mob/user)
if(!check_occupant_allowed(M))
return
if(!M)
return
if(occupant)
to_chat(user,"<span class='warning'>\The [src] is already occupied.</span>")
return
var/willing = null //We don't want to allow people to be forced into despawning.
if(M.client)
if(alert(M,"Would you like to enter long-term storage?",,"Yes","No") == "Yes")
if(!M) return
willing = 1
else
willing = 1
if(willing)
if(M == user)
visible_message("[usr] [on_enter_visible_message] [src].", 3)
else
visible_message("\The [user] starts putting [M] into \the [src].", 3)
if(do_after(user, 20))
if(occupant)
to_chat(user,"<span class='warning'>\The [src] is already occupied.</span>")
return
M.forceMove(src)
if(M.client)
M.client.perspective = EYE_PERSPECTIVE
M.client.eye = src
else return
icon_state = occupied_icon_state
M << "<span class='notice'>[on_enter_occupant_message]</span>"
M << "<span class='notice'><b>If you ghost, log out or close your client now, your character will shortly be permanently removed from the round.</b></span>"
set_occupant(M)
time_entered = world.time
if(ishuman(M) && applies_stasis)
var/mob/living/carbon/human/H = M
H.Stasis(1000)
// Book keeping!
var/turf/location = get_turf(src)
log_admin("[key_name_admin(M)] has entered a stasis pod. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[location.x];Y=[location.y];Z=[location.z]'>JMP</a>)")
message_admins("<span class='notice'>[key_name_admin(M)] has entered a stasis pod.</span>")
//Despawning occurs when process() is called with an occupant without a client.
add_fingerprint(M)

View File

@@ -40,7 +40,11 @@
var/datum/wires/airlock/wires = null var/datum/wires/airlock/wires = null
var/open_sound_powered = 'sound/machines/airlock.ogg' var/open_sound_powered = 'sound/machines/airlock.ogg'
var/open_sound_unpowered = 'sound/machines/airlock_creaking.ogg' var/open_sound_unpowered = 'sound/machines/airlockforced.ogg'
var/close_sound_powered = 'sound/machines/airlockclose.ogg'
var/denied_sound = 'sound/machines/deniedbeep.ogg'
var/bolt_up_sound = 'sound/machines/boltsup.ogg'
var/bolt_down_sound = 'sound/machines/boltsdown.ogg'
/obj/machinery/door/airlock/attack_generic(var/mob/user, var/damage) /obj/machinery/door/airlock/attack_generic(var/mob/user, var/damage)
if(stat & (BROKEN|NOPOWER)) if(stat & (BROKEN|NOPOWER))
@@ -140,6 +144,11 @@
name = "External Airlock" name = "External Airlock"
icon = 'icons/obj/doors/Doorext.dmi' icon = 'icons/obj/doors/Doorext.dmi'
assembly_type = /obj/structure/door_assembly/door_assembly_ext assembly_type = /obj/structure/door_assembly/door_assembly_ext
/obj/machinery/door/airlock/glass_external
name = "External Airlock"
icon = 'icons/obj/doors/Doorextglass.dmi'
assembly_type = /obj/structure/door_assembly/door_assembly_ext
opacity = 0 opacity = 0
glass = 1 glass = 1
req_one_access = list(access_external_airlocks) req_one_access = list(access_external_airlocks)
@@ -637,8 +646,7 @@ About the new airlock wires panel:
if("deny") if("deny")
if(density && src.arePowerSystemsOn()) if(density && src.arePowerSystemsOn())
flick("door_deny", src) flick("door_deny", src)
if(secured_wires) playsound(src, denied_sound, 50, 0, 3)
playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 0)
return return
/obj/machinery/door/airlock/attack_ai(mob/user as mob) /obj/machinery/door/airlock/attack_ai(mob/user as mob)
@@ -817,7 +825,7 @@ About the new airlock wires panel:
/obj/machinery/door/airlock/proc/can_remove_electronics() /obj/machinery/door/airlock/proc/can_remove_electronics()
return src.p_open && (operating < 0 || (!operating && welded && !src.arePowerSystemsOn() && density && (!src.locked || (stat & BROKEN)))) return src.p_open && (operating < 0 || (!operating && welded && !src.arePowerSystemsOn() && density && (!src.locked || (stat & BROKEN))))
/obj/machinery/door/airlock/attackby(C as obj, mob/user as mob) /obj/machinery/door/airlock/attackby(obj/item/C, mob/user as mob)
//world << text("airlock attackby src [] obj [] mob []", src, C, user) //world << text("airlock attackby src [] obj [] mob []", src, C, user)
if(!istype(usr, /mob/living/silicon)) if(!istype(usr, /mob/living/silicon))
if(src.isElectrified()) if(src.isElectrified())
@@ -838,7 +846,7 @@ About the new airlock wires panel:
src.welded = 1 src.welded = 1
else else
src.welded = null src.welded = null
playsound(src, 'sound/items/Welder.ogg', 75, 1) playsound(src.loc, C.usesound, 75, 1)
src.update_icon() src.update_icon()
return return
else else
@@ -849,8 +857,10 @@ About the new airlock wires panel:
to_chat(usr,"<span class='warning'>The panel is broken and cannot be closed.</span>") to_chat(usr,"<span class='warning'>The panel is broken and cannot be closed.</span>")
else else
src.p_open = 0 src.p_open = 0
playsound(src, C.usesound, 50, 1)
else else
src.p_open = 1 src.p_open = 1
playsound(src, C.usesound, 50, 1)
src.update_icon() src.update_icon()
else if(istype(C, /obj/item/weapon/wirecutters)) else if(istype(C, /obj/item/weapon/wirecutters))
return src.attack_hand(user) return src.attack_hand(user)
@@ -863,9 +873,9 @@ About the new airlock wires panel:
cable.plugin(src, user) cable.plugin(src, user)
else if(!repairing && istype(C, /obj/item/weapon/crowbar)) else if(!repairing && istype(C, /obj/item/weapon/crowbar))
if(can_remove_electronics()) if(can_remove_electronics())
playsound(src.loc, 'sound/items/Crowbar.ogg', 75, 1) playsound(src, C.usesound, 75, 1)
user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to remove electronics from the airlock assembly.") user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to remove electronics from the airlock assembly.")
if(do_after(user,40)) if(do_after(user,40 * C.toolspeed))
to_chat(user,"<span class='notice'>You removed the airlock electronics!</span>") to_chat(user,"<span class='notice'>You removed the airlock electronics!</span>")
var/obj/structure/door_assembly/da = new assembly_type(src.loc) var/obj/structure/door_assembly/da = new assembly_type(src.loc)
@@ -956,7 +966,7 @@ About the new airlock wires panel:
//if the door is unpowered then it doesn't make sense to hear the woosh of a pneumatic actuator //if the door is unpowered then it doesn't make sense to hear the woosh of a pneumatic actuator
if(arePowerSystemsOn()) if(arePowerSystemsOn())
playsound(src.loc, open_sound_powered, 75, 1) playsound(src.loc, open_sound_powered, 50, 1)
else else
playsound(src.loc, open_sound_unpowered, 75, 1) playsound(src.loc, open_sound_unpowered, 75, 1)
@@ -1053,7 +1063,7 @@ About the new airlock wires panel:
use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people
has_beeped = 0 has_beeped = 0
if(arePowerSystemsOn()) if(arePowerSystemsOn())
playsound(src.loc, open_sound_powered, 75, 1) playsound(src.loc, close_sound_powered, 50, 1)
else else
playsound(src.loc, open_sound_unpowered, 75, 1) playsound(src.loc, open_sound_unpowered, 75, 1)
for(var/turf/turf in locs) for(var/turf/turf in locs)
@@ -1070,6 +1080,7 @@ About the new airlock wires panel:
if (operating && !forced) return 0 if (operating && !forced) return 0
src.locked = 1 src.locked = 1
playsound(src, bolt_down_sound, 30, 0, 3)
for(var/mob/M in range(1,src)) for(var/mob/M in range(1,src))
M.show_message("You hear a click from the bottom of the door.", 2) M.show_message("You hear a click from the bottom of the door.", 2)
update_icon() update_icon()
@@ -1083,6 +1094,7 @@ About the new airlock wires panel:
if(operating || !src.arePowerSystemsOn() || isWireCut(AIRLOCK_WIRE_DOOR_BOLTS)) return if(operating || !src.arePowerSystemsOn() || isWireCut(AIRLOCK_WIRE_DOOR_BOLTS)) return
src.locked = 0 src.locked = 0
playsound(src, bolt_up_sound, 30, 0, 3)
for(var/mob/M in range(1,src)) for(var/mob/M in range(1,src))
M.show_message("You hear a click from the bottom of the door.", 2) M.show_message("You hear a click from the bottom of the door.", 2)
update_icon() update_icon()

View File

@@ -243,8 +243,8 @@
var/obj/item/weapon/weldingtool/welder = I var/obj/item/weapon/weldingtool/welder = I
if(welder.remove_fuel(0,user)) if(welder.remove_fuel(0,user))
user << "<span class='notice'>You start to fix dents and weld \the [repairing] into place.</span>" user << "<span class='notice'>You start to fix dents and weld \the [repairing] into place.</span>"
playsound(src, 'sound/items/Welder.ogg', 100, 1) playsound(src, welder.usesound, 50, 1)
if(do_after(user, 5 * repairing.amount) && welder && welder.isOn()) if(do_after(user, (5 * repairing.amount) * welder.toolspeed) && welder && welder.isOn())
user << "<span class='notice'>You finish repairing the damage to \the [src].</span>" user << "<span class='notice'>You finish repairing the damage to \the [src].</span>"
health = between(health, health + repairing.amount*DOOR_REPAIR_AMOUNT, maxhealth) health = between(health, health + repairing.amount*DOOR_REPAIR_AMOUNT, maxhealth)
update_icon() update_icon()
@@ -254,7 +254,7 @@
if(repairing && istype(I, /obj/item/weapon/crowbar)) if(repairing && istype(I, /obj/item/weapon/crowbar))
user << "<span class='notice'>You remove \the [repairing].</span>" user << "<span class='notice'>You remove \the [repairing].</span>"
playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) playsound(src, I.usesound, 100, 1)
repairing.loc = user.loc repairing.loc = user.loc
repairing = null repairing = null
return return

View File

@@ -198,12 +198,13 @@
user.visible_message("<span class='danger'>\The [user] [blocked ? "welds" : "unwelds"] \the [src] with \a [W].</span>",\ user.visible_message("<span class='danger'>\The [user] [blocked ? "welds" : "unwelds"] \the [src] with \a [W].</span>",\
"You [blocked ? "weld" : "unweld"] \the [src] with \the [W].",\ "You [blocked ? "weld" : "unweld"] \the [src] with \the [W].",\
"You hear something being welded.") "You hear something being welded.")
playsound(src, 'sound/items/Welder.ogg', 100, 1) playsound(src, W.usesound, 100, 1)
update_icon() update_icon()
return return
if(density && istype(C, /obj/item/weapon/screwdriver)) if(density && istype(C, /obj/item/weapon/screwdriver))
hatch_open = !hatch_open hatch_open = !hatch_open
playsound(src, C.usesound, 50, 1)
user.visible_message("<span class='danger'>[user] has [hatch_open ? "opened" : "closed"] \the [src] maintenance hatch.</span>", user.visible_message("<span class='danger'>[user] has [hatch_open ? "opened" : "closed"] \the [src] maintenance hatch.</span>",
"You have [hatch_open ? "opened" : "closed"] the [src] maintenance hatch.") "You have [hatch_open ? "opened" : "closed"] the [src] maintenance hatch.")
update_icon() update_icon()
@@ -217,7 +218,7 @@
"You start to remove the electronics from [src].") "You start to remove the electronics from [src].")
if(do_after(user,30)) if(do_after(user,30))
if(blocked && density && hatch_open) if(blocked && density && hatch_open)
playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) playsound(src, C.usesound, 50, 1)
user.visible_message("<span class='danger'>[user] has removed the electronics from \the [src].</span>", user.visible_message("<span class='danger'>[user] has removed the electronics from \the [src].</span>",
"You have removed the electronics from [src].") "You have removed the electronics from [src].")
@@ -262,8 +263,8 @@
"You hear metal strain.") "You hear metal strain.")
prying = 1 prying = 1
update_icon() update_icon()
playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) playsound(src, C.usesound, 100, 1)
if(do_after(user,30)) if(do_after(user,30 * C.toolspeed))
if(istype(C, /obj/item/weapon/crowbar)) if(istype(C, /obj/item/weapon/crowbar))
if(stat & (BROKEN|NOPOWER) || !density) if(stat & (BROKEN|NOPOWER) || !density)
user.visible_message("<span class='danger'>\The [user] forces \the [src] [density ? "open" : "closed"] with \a [C]!</span>",\ user.visible_message("<span class='danger'>\The [user] forces \the [src] [density ? "open" : "closed"] with \a [C]!</span>",\

View File

@@ -14,7 +14,7 @@ obj/structure/firedoor_assembly/update_icon()
else else
icon_state = "door_construction" icon_state = "door_construction"
obj/structure/firedoor_assembly/attackby(C as obj, mob/user as mob) obj/structure/firedoor_assembly/attackby(obj/item/C, mob/user as mob)
if(istype(C, /obj/item/stack/cable_coil) && !wired && anchored) if(istype(C, /obj/item/stack/cable_coil) && !wired && anchored)
var/obj/item/stack/cable_coil/cable = C var/obj/item/stack/cable_coil/cable = C
if (cable.get_amount() < 1) if (cable.get_amount() < 1)
@@ -27,7 +27,7 @@ obj/structure/firedoor_assembly/attackby(C as obj, mob/user as mob)
user << "<span class='notice'>You wire \the [src].</span>" user << "<span class='notice'>You wire \the [src].</span>"
else if(istype(C, /obj/item/weapon/wirecutters) && wired ) else if(istype(C, /obj/item/weapon/wirecutters) && wired )
playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) playsound(src.loc, C.usesound, 100, 1)
user.visible_message("[user] cuts the wires from \the [src].", "You start to cut the wires from \the [src].") user.visible_message("[user] cuts the wires from \the [src].", "You start to cut the wires from \the [src].")
if(do_after(user, 40)) if(do_after(user, 40))
@@ -48,7 +48,7 @@ obj/structure/firedoor_assembly/attackby(C as obj, mob/user as mob)
user << "<span class='warning'>You must secure \the [src] first!</span>" user << "<span class='warning'>You must secure \the [src] first!</span>"
else if(istype(C, /obj/item/weapon/wrench)) else if(istype(C, /obj/item/weapon/wrench))
anchored = !anchored anchored = !anchored
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) playsound(src.loc, C.usesound, 50, 1)
user.visible_message("<span class='warning'>[user] has [anchored ? "" : "un" ]secured \the [src]!</span>", user.visible_message("<span class='warning'>[user] has [anchored ? "" : "un" ]secured \the [src]!</span>",
"You have [anchored ? "" : "un" ]secured \the [src]!") "You have [anchored ? "" : "un" ]secured \the [src]!")
update_icon() update_icon()

View File

@@ -193,9 +193,9 @@
//If it's opened/emagged, crowbar can pry it out of its frame. //If it's opened/emagged, crowbar can pry it out of its frame.
if (!density && istype(I, /obj/item/weapon/crowbar)) if (!density && istype(I, /obj/item/weapon/crowbar))
playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) playsound(src, I.usesound, 50, 1)
user.visible_message("[user] begins prying the windoor out of the frame.", "You start to pry the windoor out of the frame.") user.visible_message("[user] begins prying the windoor out of the frame.", "You start to pry the windoor out of the frame.")
if (do_after(user,40)) if (do_after(user,40 * I.toolspeed))
to_chat(user,"<span class='notice'>You pried the windoor out of the frame!</span>") to_chat(user,"<span class='notice'>You pried the windoor out of the frame!</span>")
var/obj/structure/windoor_assembly/wa = new/obj/structure/windoor_assembly(src.loc) var/obj/structure/windoor_assembly/wa = new/obj/structure/windoor_assembly(src.loc)

View File

@@ -31,8 +31,8 @@ var/list/floor_light_cache = list()
if(!WT.remove_fuel(0, user)) if(!WT.remove_fuel(0, user))
user << "<span class='warning'>\The [src] must be on to complete this task.</span>" user << "<span class='warning'>\The [src] must be on to complete this task.</span>"
return return
playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) playsound(src.loc, WT.usesound, 50, 1)
if(!do_after(user, 20)) if(!do_after(user, 20 * WT.toolspeed))
return return
if(!src || !WT.isOn()) if(!src || !WT.isOn())
return return

Some files were not shown because too many files have changed in this diff Show More