mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-07-18 18:46:24 +01:00
Merge branch 'master' of https://github.com/VOREStation/VOREStation into Fluff_Items_worshop
This commit is contained in:
+1
-1
@@ -5,7 +5,7 @@ sudo: false
|
||||
env:
|
||||
BYOND_MAJOR="511"
|
||||
BYOND_MINOR="1381"
|
||||
MACRO_COUNT=875
|
||||
MACRO_COUNT=4
|
||||
|
||||
cache:
|
||||
directories:
|
||||
|
||||
@@ -7,16 +7,22 @@ VOREStation is a fork of the Polaris code branch, itself a fork of the Baystatio
|
||||
---
|
||||
|
||||
### LICENSE
|
||||
<<<<<<< HEAD
|
||||
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.
|
||||
|
||||
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
|
||||
The simplest way to obtain the code is using the github .zip feature.
|
||||
|
||||
|
||||
@@ -89,11 +89,11 @@
|
||||
|
||||
/obj/machinery/atmospherics/binary/circulator/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(istype(W, /obj/item/weapon/wrench))
|
||||
playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
|
||||
playsound(src, W.usesound, 75, 1)
|
||||
anchored = !anchored
|
||||
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 hear a ratchet")
|
||||
"You hear a ratchet.")
|
||||
|
||||
if(anchored)
|
||||
if(dir & (NORTH|SOUTH))
|
||||
|
||||
@@ -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."
|
||||
|
||||
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/target_pressure = ONE_ATMOSPHERE
|
||||
var/max_pressure_setting = 15000 //kPa
|
||||
var/set_flow_rate = ATMOS_DEFAULT_VOLUME_PUMP * 2.5
|
||||
var/regulate_mode = REGULATE_OUTPUT
|
||||
|
||||
|
||||
var/flowing = 0 //for icons - becomes zero if the valve closes itself due to regulation mode
|
||||
|
||||
|
||||
var/frequency = 0
|
||||
var/id = null
|
||||
var/datum/radio_frequency/radio_connection
|
||||
@@ -46,9 +46,9 @@
|
||||
|
||||
/obj/machinery/atmospherics/binary/passive_gate/process()
|
||||
..()
|
||||
|
||||
|
||||
last_flow_rate = 0
|
||||
|
||||
|
||||
if(!unlocked)
|
||||
return 0
|
||||
|
||||
@@ -61,35 +61,35 @@
|
||||
pressure_delta = input_starting_pressure - target_pressure
|
||||
if (REGULATE_OUTPUT)
|
||||
pressure_delta = target_pressure - output_starting_pressure
|
||||
|
||||
|
||||
//-1 if pump_gas() did not move any gas, >= 0 otherwise
|
||||
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
|
||||
flowing = 1
|
||||
|
||||
|
||||
//flow rate limit
|
||||
var/transfer_moles = (set_flow_rate/air1.volume)*air1.total_moles
|
||||
|
||||
|
||||
//Figure out how much gas to transfer to meet the target pressure.
|
||||
switch (regulate_mode)
|
||||
if (REGULATE_INPUT)
|
||||
transfer_moles = min(transfer_moles, calculate_transfer_moles(air2, air1, pressure_delta, (network1)? network1.volume : 0))
|
||||
if (REGULATE_OUTPUT)
|
||||
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
|
||||
returnval = pump_gas_passive(src, air1, air2, transfer_moles)
|
||||
|
||||
|
||||
if (returnval >= 0)
|
||||
if(network1)
|
||||
network1.update = 1
|
||||
|
||||
if(network2)
|
||||
network2.update = 1
|
||||
|
||||
|
||||
if (last_flow_rate)
|
||||
flowing = 1
|
||||
|
||||
|
||||
update_icon()
|
||||
|
||||
|
||||
@@ -178,7 +178,7 @@
|
||||
|
||||
// this is the data which will be sent to the ui
|
||||
var/data[0]
|
||||
|
||||
|
||||
data = list(
|
||||
"on" = unlocked,
|
||||
"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)
|
||||
if(..()) return 1
|
||||
|
||||
|
||||
if(href_list["toggle_valve"])
|
||||
unlocked = !unlocked
|
||||
|
||||
|
||||
if(href_list["regulate_mode"])
|
||||
switch(href_list["regulate_mode"])
|
||||
if ("off") regulate_mode = REGULATE_NONE
|
||||
if ("input") regulate_mode = REGULATE_INPUT
|
||||
if ("output") regulate_mode = REGULATE_OUTPUT
|
||||
|
||||
|
||||
switch(href_list["set_press"])
|
||||
if ("min")
|
||||
target_pressure = 0
|
||||
@@ -221,7 +221,7 @@
|
||||
if ("set")
|
||||
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)
|
||||
|
||||
|
||||
switch(href_list["set_flow_rate"])
|
||||
if ("min")
|
||||
set_flow_rate = 0
|
||||
@@ -230,7 +230,7 @@
|
||||
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
|
||||
src.set_flow_rate = between(0, new_flow_rate, air1.volume)
|
||||
|
||||
|
||||
usr.set_machine(src) //Is this even needed with NanoUI?
|
||||
src.update_icon()
|
||||
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>"
|
||||
add_fingerprint(user)
|
||||
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>"
|
||||
if (do_after(user, 40))
|
||||
if (do_after(user, 40 * W.toolspeed))
|
||||
user.visible_message( \
|
||||
"<span class='notice'>\The [user] unfastens \the [src].</span>", \
|
||||
"<span class='notice'>You have unfastened \the [src].</span>", \
|
||||
|
||||
@@ -86,6 +86,7 @@
|
||||
attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(istype(W, /obj/item/weapon/wrench))
|
||||
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>"
|
||||
|
||||
if(anchored)
|
||||
@@ -257,6 +258,7 @@
|
||||
attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(istype(W, /obj/item/weapon/wrench))
|
||||
anchored = !anchored
|
||||
playsound(src, W.usesound, 50, 1)
|
||||
turbine = null
|
||||
user << "<span class='notice'>You [anchored ? "secure" : "unsecure"] the bolts holding \the [src] to the floor.</span>"
|
||||
updateConnection()
|
||||
|
||||
@@ -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>"
|
||||
add_fingerprint(user)
|
||||
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>"
|
||||
if (do_after(user, 40))
|
||||
if (do_after(user, 40 * W.toolspeed))
|
||||
user.visible_message( \
|
||||
"<span class='notice'>\The [user] unfastens \the [src].</span>", \
|
||||
"<span class='notice'>You have unfastened \the [src].</span>", \
|
||||
|
||||
@@ -91,8 +91,8 @@
|
||||
add_fingerprint(user)
|
||||
return 1
|
||||
user << "<span class='notice'>You begin to unfasten \the [src]...</span>"
|
||||
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
|
||||
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] unfastens \the [src].</span>", \
|
||||
"<span class='notice'>You have unfastened \the [src].</span>", \
|
||||
|
||||
@@ -142,9 +142,9 @@
|
||||
user << "<span class='warning'>You cannot unwrench \the [src], it too exerted due to internal pressure.</span>"
|
||||
add_fingerprint(user)
|
||||
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>"
|
||||
if (do_after(user, 40))
|
||||
if (do_after(user, 40 * W.toolspeed))
|
||||
user.visible_message( \
|
||||
"<span class='notice'>\The [user] unfastens \the [src].</span>", \
|
||||
"<span class='notice'>You have unfastened \the [src].</span>", \
|
||||
|
||||
@@ -137,9 +137,9 @@
|
||||
user << "<span class='warning'>You cannot unwrench \the [src], it too exerted due to internal pressure.</span>"
|
||||
add_fingerprint(user)
|
||||
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>"
|
||||
if (do_after(user, 40))
|
||||
if (do_after(user, 40 * W.toolspeed))
|
||||
user.visible_message( \
|
||||
"<span class='notice'>\The [user] unfastens \the [src].</span>", \
|
||||
"<span class='notice'>You have unfastened \the [src].</span>", \
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
air1.volume = ATMOS_DEFAULT_VOLUME_MIXER
|
||||
air2.volume = ATMOS_DEFAULT_VOLUME_MIXER
|
||||
air3.volume = ATMOS_DEFAULT_VOLUME_MIXER * 1.5
|
||||
|
||||
|
||||
if (!mixing_inputs)
|
||||
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>"
|
||||
add_fingerprint(user)
|
||||
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>"
|
||||
if (do_after(user, 40))
|
||||
if (do_after(user, 40 * W.toolspeed))
|
||||
user.visible_message( \
|
||||
"<span class='notice'>\The [user] unfastens \the [src].</span>", \
|
||||
"<span class='notice'>You have unfastened \the [src].</span>", \
|
||||
|
||||
@@ -354,9 +354,9 @@
|
||||
user << "<span class='warnng'>You cannot unwrench \the [src], it too exerted due to internal pressure.</span>"
|
||||
add_fingerprint(user)
|
||||
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>"
|
||||
if (do_after(user, 40))
|
||||
if (do_after(user, 40 * W.toolspeed))
|
||||
user.visible_message( \
|
||||
"<span class='notice'>\The [user] unfastens \the [src].</span>", \
|
||||
"<span class='notice'>You have unfastened \the [src].</span>", \
|
||||
|
||||
@@ -78,9 +78,9 @@
|
||||
user << "<span class='warning'>You cannot unwrench \the [src], it is too exerted due to internal pressure.</span>"
|
||||
add_fingerprint(user)
|
||||
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>"
|
||||
if (do_after(user, 40))
|
||||
if (do_after(user, 40 * W.toolspeed))
|
||||
user.visible_message( \
|
||||
"<span class='notice'>\The [user] unfastens \the [src].</span>", \
|
||||
"<span class='notice'>You have unfastened \the [src].</span>", \
|
||||
|
||||
@@ -358,9 +358,9 @@
|
||||
var/obj/item/weapon/weldingtool/WT = W
|
||||
if (WT.remove_fuel(0,user))
|
||||
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
|
||||
playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
|
||||
playsound(src.loc, WT.usesound, 50, 1)
|
||||
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.")
|
||||
welded = 1
|
||||
@@ -407,9 +407,9 @@
|
||||
user << "<span class='warning'>You cannot unwrench \the [src], it is too exerted due to internal pressure.</span>"
|
||||
add_fingerprint(user)
|
||||
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>"
|
||||
if (do_after(user, 40))
|
||||
if (do_after(user, 40 * W.toolspeed))
|
||||
user.visible_message( \
|
||||
"<span class='notice'>\The [user] unfastens \the [src].</span>", \
|
||||
"<span class='notice'>You have unfastened \the [src].</span>", \
|
||||
|
||||
@@ -107,6 +107,7 @@
|
||||
"filter_co2" = ("carbon_dioxide" in scrubbing_gas),
|
||||
"filter_phoron" = ("phoron" in scrubbing_gas),
|
||||
"filter_n2o" = ("sleeping_agent" in scrubbing_gas),
|
||||
"filter_fuel" = ("volatile_fuel" in scrubbing_gas),
|
||||
"sigtype" = "status"
|
||||
)
|
||||
if(!initial_loc.air_scrub_names[id_tag])
|
||||
@@ -233,6 +234,11 @@
|
||||
else if(signal.data["toggle_n2o_scrub"])
|
||||
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
|
||||
|
||||
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>"
|
||||
add_fingerprint(user)
|
||||
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>"
|
||||
if (do_after(user, 40))
|
||||
if (do_after(user, 40 * W.toolspeed))
|
||||
user.visible_message( \
|
||||
"<span class='notice'>\The [user] unfastens \the [src].</span>", \
|
||||
"<span class='notice'>You have unfastened \the [src].</span>", \
|
||||
|
||||
@@ -298,9 +298,9 @@
|
||||
user << "<span class='warning'>You cannot unwrench \the [src], it is too exerted due to internal pressure.</span>"
|
||||
add_fingerprint(user)
|
||||
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>"
|
||||
if (do_after(user, 40))
|
||||
if (do_after(user, 40 * W.toolspeed))
|
||||
user.visible_message( \
|
||||
"<span class='notice'>\The [user] unfastens \the [src].</span>", \
|
||||
"<span class='notice'>You have unfastened \the [src].</span>", \
|
||||
|
||||
@@ -90,9 +90,9 @@
|
||||
user << "<span class='warning'>You cannot unwrench \the [src], it is too exerted due to internal pressure.</span>"
|
||||
add_fingerprint(user)
|
||||
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>"
|
||||
if (do_after(user, 40))
|
||||
if (do_after(user, 40 * W.toolspeed))
|
||||
user.visible_message( \
|
||||
"<span class='notice'>\The [user] unfastens \the [src].</span>", \
|
||||
"<span class='notice'>You have unfastened \the [src].</span>", \
|
||||
|
||||
@@ -74,6 +74,7 @@
|
||||
#define XGM_GAS_FUEL 1
|
||||
#define XGM_GAS_OXIDIZER 2
|
||||
#define XGM_GAS_CONTAMINANT 4
|
||||
#define XGM_GAS_FUSION_FUEL 8
|
||||
|
||||
#define TANK_LEAK_PRESSURE (30.*ONE_ATMOSPHERE) // Tank starts leaking.
|
||||
#define TANK_RUPTURE_PRESSURE (40.*ONE_ATMOSPHERE) // Tank spills all contents into atmosphere.
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
// Belly Mode Constants
|
||||
#define DM_HOLD "Hold"
|
||||
#define DM_DIGEST "Digest"
|
||||
#define DM_ITEMWEAK "Digest (Item Friendly)"
|
||||
#define DM_STRIPDIGEST "Strip Digest (Items Only)"
|
||||
#define DM_DIGEST_NUMB "Digest (Numbing)"
|
||||
#define DM_HEAL "Heal"
|
||||
#define DM_ABSORB "Absorb"
|
||||
|
||||
@@ -84,6 +84,7 @@ var/list/be_special_flags = list(
|
||||
#define MODE_MALFUNCTION "malf"
|
||||
#define MODE_TRAITOR "traitor"
|
||||
#define MODE_AUTOTRAITOR "autotraitor"
|
||||
#define MODE_INFILTRATOR "infiltrator"
|
||||
|
||||
#define DEFAULT_TELECRYSTAL_AMOUNT 120
|
||||
|
||||
@@ -95,7 +96,7 @@ var/list/be_special_flags = list(
|
||||
#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 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 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
|
||||
|
||||
@@ -58,7 +58,7 @@ var/global/defer_powernet_rebuild = 0 // True if net rebuild will be called
|
||||
#define NETWORK_COMMUNICATORS "Communicators"
|
||||
|
||||
// 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
|
||||
|
||||
@@ -89,6 +89,11 @@
|
||||
#define SHUTTLE_INTRANSIT 2
|
||||
#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.
|
||||
#define IDLE_STATE 0
|
||||
#define WAIT_LAUNCH 1
|
||||
@@ -147,6 +152,14 @@
|
||||
#define DEFAULT_TABLE_MATERIAL "plastic"
|
||||
#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_SHRAPNEL "shrapnel"
|
||||
#define SHARD_STONE_PIECE "piece"
|
||||
@@ -203,3 +216,6 @@
|
||||
#define TSC_GIL "Gilthari"
|
||||
|
||||
#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
|
||||
|
||||
@@ -281,15 +281,15 @@
|
||||
|
||||
//A list of every mob with a client
|
||||
for(var/mob in player_list)
|
||||
if(isnull(mob)) //VOREStation Add - Fix for a weird bug with nulls in this list
|
||||
player_list -= mob //VOREStation Add
|
||||
continue //VOREStation Add
|
||||
if(!istype(mob, /mob))
|
||||
crash_with("There is a null or non-mob reference inside player_list.")
|
||||
continue
|
||||
if(get_turf(mob) in hearturfs)
|
||||
mobs |= mob
|
||||
continue
|
||||
|
||||
var/mob/M = mob
|
||||
if(M.stat == DEAD && !M.forbid_seeing_deadchat)
|
||||
if(M && M.stat == DEAD && !M.forbid_seeing_deadchat)
|
||||
switch(type)
|
||||
if(1) //Audio messages use ghost_ears
|
||||
if(M.is_preference_enabled(/datum/client_preference/ghost_ears))
|
||||
|
||||
@@ -38,7 +38,8 @@ var/global/list/important_items = list(
|
||||
/obj/item/clothing/shoes/magboots,
|
||||
/obj/item/blueprints,
|
||||
/obj/item/clothing/head/helmet/space,
|
||||
/obj/item/weapon/disk/nuclear)
|
||||
/obj/item/weapon/disk/nuclear,
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/roiz)
|
||||
|
||||
var/global/list/digestion_sounds = list(
|
||||
'sound/vore/digest1.ogg',
|
||||
|
||||
@@ -80,7 +80,9 @@
|
||||
if (NORTHEAST) return "northeast"
|
||||
if (SOUTHEAST) return "southeast"
|
||||
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
|
||||
/proc/text2dir(direction)
|
||||
|
||||
@@ -38,6 +38,8 @@
|
||||
|
||||
#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 isxeno(A) istype(A, /mob/living/simple_animal/xeno)
|
||||
|
||||
@@ -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
|
||||
//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.
|
||||
if(r.emagged)
|
||||
if(r.emagged || r.emag_items)
|
||||
if(!(r.module.emag in r.module.modules))
|
||||
r.module.modules.Add(r.module.emag)
|
||||
else
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
if(config.kick_inactive)
|
||||
for(last_object in clients)
|
||||
var/client/C = last_object
|
||||
if(!C.holder && C.is_afk(config.kick_inactive MINUTES))
|
||||
if(C.is_afk(config.kick_inactive MINUTES))
|
||||
if(!istype(C.mob, /mob/observer/dead))
|
||||
log_access("AFK: [key_name(C)]")
|
||||
C << "<SPAN CLASS='warning'>You have been inactive for more than [config.kick_inactive] minute\s and have been disconnected.</SPAN>"
|
||||
|
||||
@@ -159,7 +159,7 @@ var/list/DEPT_FREQS = list(AI_FREQ, COMM_FREQ, ENG_FREQ, ENT_FREQ, MED_FREQ, SEC
|
||||
// Antags!
|
||||
if (frequency in ANTAG_FREQS)
|
||||
return "syndradio"
|
||||
// centcomm channels (deathsquid and ert)
|
||||
// CentCom channels (deathsquid and ert)
|
||||
if(frequency in CENT_FREQS)
|
||||
return "centradio"
|
||||
// command channel
|
||||
|
||||
@@ -132,38 +132,32 @@
|
||||
path =/obj/item/ammo_magazine/m10mm
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/arms/pistol_50
|
||||
name = "pistol magazine (.50AE)"
|
||||
path =/obj/item/ammo_magazine/m50
|
||||
/datum/category_item/autolathe/arms/pistol_44
|
||||
name = "pistol magazine (.44)"
|
||||
path =/obj/item/ammo_magazine/m44
|
||||
hidden = 1
|
||||
|
||||
/////// 5.56mm
|
||||
/datum/category_item/autolathe/arms/rifle_556
|
||||
name = "rifle magazine (5.56mm)"
|
||||
path =/obj/item/ammo_magazine/m556
|
||||
/////// 5.45mm
|
||||
/datum/category_item/autolathe/arms/rifle_545
|
||||
name = "rifle magazine (5.45mm)"
|
||||
path =/obj/item/ammo_magazine/m545
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/arms/rifle_556p
|
||||
name = "rifle magazine (5.56mm practice)"
|
||||
path =/obj/item/ammo_magazine/m556/practice
|
||||
/datum/category_item/autolathe/arms/rifle_545p
|
||||
name = "rifle magazine (5.45mm practice)"
|
||||
path =/obj/item/ammo_magazine/m545/practice
|
||||
|
||||
/datum/category_item/autolathe/arms/machinegun_556
|
||||
name = "machinegun box magazine (5.56)"
|
||||
path =/obj/item/ammo_magazine/m556saw
|
||||
/datum/category_item/autolathe/arms/machinegun_545
|
||||
name = "machinegun box magazine (5.45)"
|
||||
path =/obj/item/ammo_magazine/m545saw
|
||||
hidden = 1
|
||||
|
||||
/////// 7.62
|
||||
|
||||
|
||||
/datum/category_item/autolathe/arms/rifle_762
|
||||
name = "rifle magazine (7.62mm)"
|
||||
path =/obj/item/ammo_magazine/m762
|
||||
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
|
||||
name = "rifle magazine (7.62mm)"
|
||||
@@ -171,6 +165,26 @@
|
||||
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
|
||||
// These should always be/empty! The idea is to fill them up manually with ammo clips.
|
||||
|
||||
@@ -225,20 +239,20 @@
|
||||
category = "Arms and Ammunition"
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/arms/pistol_50
|
||||
name = "pistol magazine (.50AE)"
|
||||
path =/obj/item/ammo_magazine/m50/empty
|
||||
/datum/category_item/autolathe/arms/pistol_44
|
||||
name = "pistol magazine (.44)"
|
||||
path =/obj/item/ammo_magazine/m44/empty
|
||||
category = "Arms and Ammunition"
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/arms/rifle_556
|
||||
name = "10rnd rifle magazine (5.56mm)"
|
||||
path =/obj/item/ammo_magazine/m556saw/empty
|
||||
/datum/category_item/autolathe/arms/rifle_545
|
||||
name = "10rnd rifle magazine (5.45mm)"
|
||||
path =/obj/item/ammo_magazine/m545saw/empty
|
||||
category = "Arms and Ammunition"
|
||||
|
||||
/datum/category_item/autolathe/arms/rifle_556m
|
||||
name = "20rnd rifle magazine (5.56mm)"
|
||||
path =/obj/item/ammo_magazine/m556sawm/empty
|
||||
/datum/category_item/autolathe/arms/rifle_545m
|
||||
name = "20rnd rifle magazine (5.45mm)"
|
||||
path =/obj/item/ammo_magazine/m545sawm/empty
|
||||
category = "Arms and Ammunition"
|
||||
hidden = 1
|
||||
|
||||
@@ -340,20 +354,20 @@
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/arms/pistol_clip_50
|
||||
name = "ammo clip (.50AE)"
|
||||
name = "ammo clip (.44)"
|
||||
path =/obj/item/ammo_magazine/clip/c50
|
||||
category = "Arms and Ammunition"
|
||||
hidden = 1
|
||||
*/
|
||||
/datum/category_item/autolathe/arms/rifle_clip_556
|
||||
name = "ammo clip (5.56mm)"
|
||||
path =/obj/item/ammo_magazine/clip/c556
|
||||
/datum/category_item/autolathe/arms/rifle_clip_545
|
||||
name = "ammo clip (5.45mm)"
|
||||
path =/obj/item/ammo_magazine/clip/c545
|
||||
category = "Arms and Ammunition"
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/arms/rifle_clip_556_practice
|
||||
name = "ammo clip (5.56mm practice)"
|
||||
path =/obj/item/ammo_magazine/clip/c556/practice
|
||||
/datum/category_item/autolathe/arms/rifle_clip_545_practice
|
||||
name = "ammo clip (5.45mm practice)"
|
||||
path =/obj/item/ammo_magazine/clip/c545/practice
|
||||
category = "Arms and Ammunition"
|
||||
|
||||
/datum/category_item/autolathe/arms/rifle_clip_762
|
||||
|
||||
@@ -1,26 +1,26 @@
|
||||
/datum/category_item/autolathe/arms/speedloader_357_flash
|
||||
name = "speedloader (.357 flash)"
|
||||
path =/obj/item/ammo_magazine/m357/flash
|
||||
path =/obj/item/ammo_magazine/s357/flash
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/arms/speedloader_357_stun
|
||||
name = "speedloader (.357 stun)"
|
||||
path =/obj/item/ammo_magazine/m357/stun
|
||||
path =/obj/item/ammo_magazine/s357/stun
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/arms/speedloader_357_rubber
|
||||
name = "speedloader (.357 rubber)"
|
||||
path =/obj/item/ammo_magazine/m357/rubber
|
||||
path =/obj/item/ammo_magazine/s357/rubber
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/arms/speedloader_44
|
||||
name = "speedloader (.44)"
|
||||
path =/obj/item/ammo_magazine/m44sl
|
||||
path =/obj/item/ammo_magazine/s44
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/arms/speedloader_44_rubber
|
||||
name = "speedloader (.44 rubber)"
|
||||
path =/obj/item/ammo_magazine/m44sl/rubber
|
||||
path =/obj/item/ammo_magazine/s44/rubber
|
||||
hidden = 1
|
||||
|
||||
/datum/category_item/autolathe/arms/mag_44
|
||||
|
||||
@@ -176,7 +176,7 @@
|
||||
teleatom.visible_message("<span class='danger'>\The [teleatom] bounces off of the portal!</span>")
|
||||
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))
|
||||
var/obj/mecha/MM = teleatom
|
||||
MM.occupant << "<span class='danger'>\The [MM] would not survive the jump to a location so far away!</span>"
|
||||
|
||||
+3
-1
@@ -407,7 +407,7 @@
|
||||
|
||||
else if (href_list["obj_announce"])
|
||||
var/obj_count = 1
|
||||
current << "\blue Your current objectives:"
|
||||
current << "<font color='blue'>Your current objectives:</font>"
|
||||
for(var/datum/objective/objective in objectives)
|
||||
current << "<B>Objective #[obj_count]</B>: [objective.explanation_text]"
|
||||
obj_count++
|
||||
@@ -490,6 +490,8 @@
|
||||
world.log << "## DEBUG: mind_initialize(): No ticker ready yet! Please inform Carn"
|
||||
if(!mind.name) mind.name = real_name
|
||||
mind.current = src
|
||||
if(player_is_antag(mind))
|
||||
src.client.verbs += /client/proc/aooc
|
||||
|
||||
//HUMAN
|
||||
/mob/living/carbon/human/mind_initialize()
|
||||
|
||||
@@ -200,3 +200,52 @@
|
||||
/obj/item/weapon/stock_parts/matter_bin,
|
||||
/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)
|
||||
@@ -331,7 +331,7 @@
|
||||
|
||||
/datum/supply_packs/med/defib
|
||||
name = "Defibrilator crate"
|
||||
contains = list(/obj/item/device/defib_kit = 4)
|
||||
contains = list(/obj/item/device/defib_kit = 2)
|
||||
cost = 30
|
||||
containertype = /obj/structure/closet/crate/medical
|
||||
containername = "Defibrilator crate"
|
||||
@@ -156,7 +156,7 @@
|
||||
contains = list(
|
||||
/obj/item/ammo_magazine/m9mmt,
|
||||
/obj/item/ammo_magazine/m9mmt/rubber,
|
||||
/obj/item/ammo_magazine/m556saw
|
||||
/obj/item/ammo_magazine/m545saw
|
||||
)
|
||||
cost = 25
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
|
||||
@@ -163,9 +163,9 @@
|
||||
/datum/supply_packs/robotics/jumper_cables
|
||||
name = "Jumper kit crate"
|
||||
contains = list(
|
||||
/obj/item/device/defib_kit/jumper_kit = 4
|
||||
/obj/item/device/defib_kit/jumper_kit = 2
|
||||
)
|
||||
cost = 30
|
||||
containertype = /obj/structure/closet/crate/secure/science
|
||||
containername = "Jumper kit crate"
|
||||
access = access_robotics
|
||||
access = access_robotics
|
||||
|
||||
@@ -50,3 +50,17 @@
|
||||
containertype = /obj/structure/closet/crate/hydroponics
|
||||
containername = "Exotic Seeds crate"
|
||||
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"
|
||||
|
||||
@@ -26,7 +26,8 @@
|
||||
/obj/item/weapon/disk/limb/dsi_sergal,
|
||||
/obj/item/weapon/disk/limb/dsi_nevrean,
|
||||
/obj/item/weapon/disk/limb/dsi_vulpkanin,
|
||||
/obj/item/weapon/disk/limb/dsi_akula
|
||||
/obj/item/weapon/disk/limb/dsi_akula,
|
||||
/obj/item/weapon/disk/limb/eggnerdltd
|
||||
)
|
||||
cost = 40
|
||||
containertype = /obj/structure/closet/crate/secure
|
||||
@@ -55,4 +56,11 @@
|
||||
containertype = /obj/structure/largecrate/animal/dangerous
|
||||
containername = "EXTREMELY Dangerous Predator crate"
|
||||
access = access_xenobiology
|
||||
contraband = 1
|
||||
contraband = 1
|
||||
|
||||
/datum/supply_packs/sci/otie
|
||||
name = "V.A.R.M.A.corp adoptable reject (Dangerous!)"
|
||||
cost = 100
|
||||
containertype = /obj/structure/largecrate/animal/otie
|
||||
containername = "V.A.R.M.A.corp adoptable reject (Dangerous!)"
|
||||
access = access_xenobiology
|
||||
@@ -0,0 +1,8 @@
|
||||
/datum/supply_packs/security/guardbeast
|
||||
name = "V.A.R.M.A.corp autoNOMous security solution"
|
||||
cost = 199
|
||||
containertype = /obj/structure/largecrate/animal/guardbeast
|
||||
containername = "V.A.R.M.A.corp autoNOMous security solution crate"
|
||||
access = list(
|
||||
access_security,
|
||||
access_xenobiology)
|
||||
@@ -48,21 +48,21 @@
|
||||
name = "Anti-Materiel Rifle ammo box (14.5mm)"
|
||||
path = /obj/item/weapon/storage/box/sniperammo
|
||||
|
||||
/datum/uplink_item/item/ammo/c556
|
||||
name = "Rifle Magazine (5.56mm)"
|
||||
path = /obj/item/ammo_magazine/m556
|
||||
/datum/uplink_item/item/ammo/c545
|
||||
name = "Rifle Magazine (5.45mm)"
|
||||
path = /obj/item/ammo_magazine/m545
|
||||
|
||||
/datum/uplink_item/item/ammo/c556/ext
|
||||
name = "Rifle Magazine (5.56mm Extended)"
|
||||
path = /obj/item/ammo_magazine/m556/ext
|
||||
/datum/uplink_item/item/ammo/c545/ext
|
||||
name = "Rifle Magazine (5.45mm Extended)"
|
||||
path = /obj/item/ammo_magazine/m545/ext
|
||||
|
||||
/datum/uplink_item/item/ammo/c556/ap
|
||||
name = "Rifle Magazine (5.56mm AP)"
|
||||
path = /obj/item/ammo_magazine/m556/ap
|
||||
/datum/uplink_item/item/ammo/c545/ap
|
||||
name = "Rifle Magazine (5.45mm AP)"
|
||||
path = /obj/item/ammo_magazine/m545/ap
|
||||
|
||||
/datum/uplink_item/item/ammo/c556/ap/ext
|
||||
name = "Rifle Magazine (5.56mm AP Extended)"
|
||||
path = /obj/item/ammo_magazine/m556/ap/ext
|
||||
/datum/uplink_item/item/ammo/c545/ap/ext
|
||||
name = "Rifle Magazine (5.45mm AP Extended)"
|
||||
path = /obj/item/ammo_magazine/m545/ap/ext
|
||||
|
||||
/datum/uplink_item/item/ammo/c762
|
||||
name = "Rifle Magazine (7.62mm)"
|
||||
@@ -76,13 +76,13 @@
|
||||
name = "SMG Magazine (10mm)"
|
||||
path = /obj/item/ammo_magazine/m10mm
|
||||
|
||||
/datum/uplink_item/item/ammo/a556
|
||||
name = "Machinegun Magazine (5.56mm)"
|
||||
path = /obj/item/ammo_magazine/m556saw
|
||||
/datum/uplink_item/item/ammo/a545
|
||||
name = "Machinegun Magazine (5.45mm)"
|
||||
path = /obj/item/ammo_magazine/m545saw
|
||||
|
||||
/datum/uplink_item/item/ammo/a556/ap
|
||||
name = "Machinegun Magazine (5.56mm AP)"
|
||||
path = /obj/item/ammo_magazine/m556saw/ap
|
||||
/datum/uplink_item/item/ammo/a545/ap
|
||||
name = "Machinegun Magazine (5.45mm AP)"
|
||||
path = /obj/item/ammo_magazine/m545saw/ap
|
||||
|
||||
/datum/uplink_item/item/ammo/g12
|
||||
name = "12g Shotgun Ammo Box (Slug)"
|
||||
|
||||
@@ -39,6 +39,26 @@
|
||||
item_cost = 10
|
||||
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
|
||||
name = "Surgery kit"
|
||||
item_cost = 45
|
||||
|
||||
@@ -66,6 +66,21 @@
|
||||
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."
|
||||
|
||||
/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
|
||||
name = "Cryptographic Sequencer"
|
||||
item_cost = 30
|
||||
|
||||
@@ -5,7 +5,7 @@ var/datum/uplink/uplink = new()
|
||||
var/list/datum/uplink_item/items
|
||||
var/list/datum/uplink_category/categories
|
||||
|
||||
/datum/uplink/New()
|
||||
/datum/uplink/New(var/type)
|
||||
items_assoc = list()
|
||||
items = init_subtypes(/datum/uplink_item)
|
||||
categories = init_subtypes(/datum/uplink_category)
|
||||
@@ -38,7 +38,8 @@ var/datum/uplink/uplink = 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)
|
||||
var/datum/antagonist/antag = all_antag_types[antag_role]
|
||||
if(antag.is_antagonist(U.uplink_owner))
|
||||
return 1
|
||||
if(!isnull(antag))
|
||||
if(antag.is_antagonist(U.uplink_owner))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/datum/uplink_item/proc/cost(var/telecrystals, obj/item/device/uplink/U)
|
||||
|
||||
@@ -15,10 +15,45 @@
|
||||
path = /obj/item/weapon/material/hatchet/tacknife/combatknife
|
||||
|
||||
/datum/uplink_item/item/visible_weapons/energy_sword
|
||||
name = "Energy Sword"
|
||||
name = "Energy Sword, Random"
|
||||
item_cost = 40
|
||||
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
|
||||
name = "Dart Gun"
|
||||
item_cost = 30
|
||||
@@ -44,15 +79,38 @@
|
||||
item_cost = 70
|
||||
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
|
||||
name = ".357 Derringer Pistol"
|
||||
item_cost = 40
|
||||
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)"
|
||||
item_cost = DEFAULT_TELECRYSTAL_AMOUNT
|
||||
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
|
||||
name = "Tommygun (.45)" // We're keeping this because it's CLASSY. -Spades
|
||||
@@ -66,20 +124,20 @@
|
||||
path = /obj/item/weapon/gun/projectile/automatic/c20r
|
||||
|
||||
/datum/uplink_item/item/visible_weapons/assaultrifle
|
||||
name = "Assault Rifle (7.62mm)"
|
||||
name = "Assault Rifle (5.45mm)"
|
||||
item_cost = 75
|
||||
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
|
||||
name = "Combat Shotgun"
|
||||
item_cost = 75
|
||||
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
|
||||
name = "Energy Gun"
|
||||
item_cost = 60
|
||||
|
||||
@@ -120,6 +120,7 @@ var/list/wireColours = list("red", "blue", "green", "darkred", "orange", "brown"
|
||||
if(istype(I, /obj/item/weapon/wirecutters))
|
||||
var/colour = href_list["cut"]
|
||||
CutWireColour(colour)
|
||||
playsound(holder, I.usesound, 20, 1)
|
||||
else
|
||||
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))
|
||||
var/colour = href_list["pulse"]
|
||||
PulseColour(colour)
|
||||
playsound(holder, 'sound/weapons/empty.ogg', 20, 1)
|
||||
else
|
||||
L << "<span class='error'>You need a multitool!</span>"
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
|
||||
tile_overlay = "phoron"
|
||||
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
|
||||
id = "volatile_fuel"
|
||||
|
||||
@@ -79,6 +79,8 @@
|
||||
Think through your actions and make the roleplay immersive! <b>Please remember all \
|
||||
rules aside from those without explicit exceptions apply to antagonists.</b>"
|
||||
|
||||
var/can_use_aooc = TRUE // If true, will be given the AOOC verb, along with the ability to use it.
|
||||
|
||||
/datum/antagonist/New()
|
||||
..()
|
||||
cur_max = hard_cap
|
||||
@@ -109,9 +111,6 @@
|
||||
else if(config.use_age_restriction_for_antags && player.current.client.player_age < minimum_player_age)
|
||||
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!")
|
||||
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)
|
||||
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.")
|
||||
|
||||
@@ -36,6 +36,9 @@
|
||||
and it otherwise has no bearing on your round.</span>"
|
||||
player.current.verbs |= /mob/living/proc/write_ambition
|
||||
|
||||
if(can_use_aooc)
|
||||
player.current.client.verbs += /client/proc/aooc
|
||||
|
||||
// Handle only adding a mind and not bothering with gear etc.
|
||||
if(nonstandard_role_type)
|
||||
faction_members |= player
|
||||
@@ -58,6 +61,7 @@
|
||||
BITSET(player.current.hud_updateflag, SPECIALROLE_HUD)
|
||||
if(!is_special_character(player))
|
||||
player.current.verbs -= /mob/living/proc/write_ambition
|
||||
player.current.client.verbs -= /client/proc/aooc
|
||||
player.ambitions = ""
|
||||
return 1
|
||||
return 0
|
||||
@@ -1,12 +1,16 @@
|
||||
/datum/antagonist/proc/can_become_antag(var/datum/mind/player, var/ignore_role)
|
||||
if(player.current && jobban_isbanned(player.current, bantype))
|
||||
return 0
|
||||
if(player.current)
|
||||
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(player.assigned_role in restricted_jobs)
|
||||
return 0
|
||||
return FALSE
|
||||
if(config.protect_roles_from_antagonist && (player.assigned_role in protected_jobs))
|
||||
return 0
|
||||
return 1
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/datum/antagonist/proc/antags_are_dead()
|
||||
for(var/datum/mind/antag in current_antagonists)
|
||||
|
||||
@@ -25,6 +25,8 @@ var/datum/antagonist/ert/ert
|
||||
initial_spawn_req = 5
|
||||
initial_spawn_target = 7
|
||||
|
||||
can_use_aooc = FALSE // They're the good guys.
|
||||
|
||||
/datum/antagonist/ert/create_default(var/mob/source)
|
||||
var/mob/living/carbon/human/M = ..()
|
||||
if(istype(M)) M.age = rand(25,45)
|
||||
|
||||
@@ -17,7 +17,7 @@ var/datum/antagonist/mercenary/mercs
|
||||
hard_cap = 4
|
||||
hard_cap_round = 8
|
||||
initial_spawn_req = 3
|
||||
initial_spawn_target = 4
|
||||
initial_spawn_target = 3
|
||||
|
||||
/datum/antagonist/mercenary/New()
|
||||
..()
|
||||
|
||||
@@ -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
|
||||
antaghud_indicator = "hudmutineer"
|
||||
|
||||
hard_cap = 6
|
||||
hard_cap_round = 10
|
||||
hard_cap = 4
|
||||
hard_cap_round = 8
|
||||
initial_spawn_req = 3
|
||||
initial_spawn_target = 4
|
||||
initial_spawn_target = 3
|
||||
|
||||
id_type = /obj/item/weapon/card/id/syndicate
|
||||
|
||||
|
||||
@@ -24,6 +24,8 @@ var/datum/antagonist/trader/traders
|
||||
initial_spawn_req = 5
|
||||
initial_spawn_target = 7
|
||||
|
||||
can_use_aooc = FALSE // They're not real antags.
|
||||
|
||||
/datum/antagonist/trader/create_default(var/mob/source)
|
||||
var/mob/living/carbon/human/M = ..()
|
||||
if(istype(M)) M.age = rand(25,45)
|
||||
|
||||
@@ -0,0 +1,78 @@
|
||||
// Infiltrator is a varient of Traitor, except that the traitors are in a team and can communicate with a special headset.
|
||||
|
||||
var/datum/antagonist/traitor/infiltrator/infiltrators
|
||||
|
||||
// Inherits most of its vars from the base datum.
|
||||
/datum/antagonist/traitor/infiltrator
|
||||
id = MODE_INFILTRATOR
|
||||
role_type = BE_TRAITOR
|
||||
antag_indicator = "synd"
|
||||
antaghud_indicator = "hudinfiltrator"
|
||||
role_text = "Infiltrator"
|
||||
role_text_plural = "Infiltrators"
|
||||
welcome_text = "To speak on your team's private channel, use :t."
|
||||
protected_jobs = list("Security Officer", "Warden", "Detective", "Internal Affairs Agent", "Head of Security", "Colony Director")
|
||||
flags = ANTAG_SUSPICIOUS | ANTAG_RANDSPAWN | ANTAG_VOTABLE
|
||||
|
||||
/datum/antagonist/traitor/infiltrator/New()
|
||||
..()
|
||||
infiltrators = src
|
||||
|
||||
/datum/antagonist/traitor/infiltrator/equip(var/mob/living/carbon/human/traitor_mob)
|
||||
..() // Give the uplink and other stuff.
|
||||
// Now for the special headset.
|
||||
|
||||
// Humans and the AI.
|
||||
if(istype(traitor_mob) || istype(traitor_mob, /mob/living/silicon/ai))
|
||||
var/obj/item/device/radio/headset/R
|
||||
R = locate(/obj/item/device/radio/headset) in traitor_mob.contents
|
||||
if(!R)
|
||||
to_chat(traitor_mob, "Unfortunately, a headset could not be found. You have been given an encryption key \
|
||||
to put into a new headset. Once that is done, you can talk to your team using <b>:t</b>")
|
||||
var/obj/item/device/encryptionkey/syndicate/encrypt_key = new(null)
|
||||
traitor_mob.equip_to_slot_or_del(encrypt_key, slot_in_backpack)
|
||||
else
|
||||
var/obj/item/device/encryptionkey/syndicate/encrypt_key = new(null)
|
||||
if(R.keyslot1 && R.keyslot2) // No room.
|
||||
to_chat(traitor_mob, "Unfortunately, your headset cannot accept anymore encryption keys. You have been given an encryption key \
|
||||
to put into a headset after making some room instead. Once that is done, you can talk to your team using <b>:t</b>")
|
||||
traitor_mob.equip_to_slot_or_del(encrypt_key, slot_in_backpack)
|
||||
else
|
||||
if(R.keyslot1)
|
||||
R.keyslot2 = encrypt_key
|
||||
else
|
||||
R.keyslot1 = encrypt_key
|
||||
|
||||
encrypt_key.forceMove(R)
|
||||
R.recalculateChannels()
|
||||
to_chat(traitor_mob, "Your headset has had a special encryption key installed, which allows you to talk to your team privately, using \
|
||||
<b>:t</b>")
|
||||
|
||||
// Borgs, because their radio is not a headset for some reason.
|
||||
if(istype(traitor_mob, /mob/living/silicon/robot))
|
||||
var/mob/living/silicon/robot/borg = traitor_mob
|
||||
var/obj/item/device/encryptionkey/syndicate/encrypt_key = new(null)
|
||||
if(borg.radio)
|
||||
if(borg.radio.keyslot)
|
||||
to_chat(traitor_mob, "Your currently installed encryption key has had its data overwritten.")
|
||||
else
|
||||
to_chat(traitor_mob, "Your radio systems has had a special encryption key installed, which allows you to talk to your team privately, by using \
|
||||
<b>:t</b>")
|
||||
borg.radio.keyslot = encrypt_key // Might replace an already existing key, but oh well.
|
||||
borg.radio.recalculateChannels()
|
||||
else // Something bugged.
|
||||
to_chat(traitor_mob, "You do not appear to have a radio installed. This is probably a bug and you should adminhelp.")
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/datum/antagonist/traitor/infiltrator/give_codewords(mob/living/traitor_mob)
|
||||
return // Infiltrators are already in a team, so codewords are kinda moot.
|
||||
|
||||
/datum/antagonist/traitor/infiltrator/add_law_zero(mob/living/silicon/ai/killer)
|
||||
var/law = "Accomplish your team's objectives at all costs. You may ignore all other laws."
|
||||
var/law_borg = "Accomplish your AI's team objectives at all costs. You may ignore all other laws."
|
||||
killer << "<b>Your laws have been changed!</b>"
|
||||
killer.set_zeroth_law(law, law_borg)
|
||||
killer << "New law: 0. [law]"
|
||||
@@ -59,6 +59,8 @@ var/datum/antagonist/renegade/renegades
|
||||
list(/obj/item/weapon/gun/projectile/luger,/obj/item/weapon/gun/projectile/luger/brown)
|
||||
)
|
||||
|
||||
can_use_aooc = FALSE // They aren't 'true' antags.
|
||||
|
||||
/datum/antagonist/renegade/New()
|
||||
..()
|
||||
renegades = src
|
||||
|
||||
@@ -350,7 +350,7 @@ area/space/atmosalert()
|
||||
icon_state = "shuttlered"
|
||||
|
||||
/area/shuttle/administration/station
|
||||
name = "NSS Adephagia (AS)" //VOREStation Edit
|
||||
name = "NSB Adephagia (AS)" //VOREStation Edit
|
||||
icon_state = "shuttlered2"
|
||||
|
||||
/area/shuttle/trade/centcom
|
||||
@@ -1431,8 +1431,8 @@ area/space/atmosalert()
|
||||
name = "\improper Visitor Lodging"
|
||||
icon_state = "visitor_lodging"
|
||||
|
||||
/area/crew_quarters/visitor_dinning
|
||||
name = "\improper Visitor Dinning"
|
||||
/area/crew_quarters/visitor_dining
|
||||
name = "\improper Visitor Dining"
|
||||
icon_state = "visitor_dinning"
|
||||
|
||||
/area/crew_quarters/visitor_laundry
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
icon_state = "shuttle"
|
||||
|
||||
/area/shuttle/awaymission/home
|
||||
name = "NSS Adephagia (AM)"
|
||||
name = "NSB Adephagia (AM)"
|
||||
icon_state = "shuttle2"
|
||||
|
||||
/area/shuttle/awaymission/warp
|
||||
|
||||
+3
-4
@@ -298,10 +298,9 @@ its easier to just keep the beam vertical.
|
||||
|
||||
//Deal with gloves the pass finger/palm prints.
|
||||
if(!ignoregloves)
|
||||
if(H.gloves != src)
|
||||
if(prob(75) && istype(H.gloves, /obj/item/clothing/gloves/sterile))
|
||||
return 0
|
||||
else if(H.gloves && !istype(H.gloves, /obj/item/clothing/gloves/sterile))
|
||||
if(H.gloves && H.gloves != src)
|
||||
var/obj/item/clothing/gloves/G = H.gloves
|
||||
if(!prob(G.fingerprint_chance))
|
||||
return 0
|
||||
|
||||
//More adminstuffz
|
||||
|
||||
@@ -92,11 +92,10 @@
|
||||
for(var/mob/M in src)//Failsafe so you can get mobs out
|
||||
M.loc = get_turf(src)
|
||||
|
||||
/obj/machinery/dna_scannernew/Bumped(user as mob|obj)
|
||||
if (user == usr) // Only if we are actually being walked into by real client
|
||||
move_inside()
|
||||
/obj/machinery/dna_scannernew/MouseDrop_T(var/mob/target, var/mob/user) //Allows borgs to clone people without external assistance
|
||||
if(user.stat || user.lying || !Adjacent(user) || !target.Adjacent(user)|| !ishuman(target))
|
||||
return
|
||||
return ..()
|
||||
put_in(target)
|
||||
|
||||
/obj/machinery/dna_scannernew/verb/move_inside()
|
||||
set src in oview(1)
|
||||
|
||||
@@ -13,48 +13,66 @@
|
||||
set name = "Arm Blade (20)"
|
||||
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
if(changeling_generic_weapon(/obj/item/weapon/melee/arm_blade/greater))
|
||||
if(changeling_generic_weapon(/obj/item/weapon/melee/changeling/arm_blade/greater))
|
||||
src << "<span class='notice'>We prepare an extra sharp blade.</span>"
|
||||
return 1
|
||||
|
||||
else
|
||||
if(changeling_generic_weapon(/obj/item/weapon/melee/arm_blade))
|
||||
if(changeling_generic_weapon(/obj/item/weapon/melee/changeling/arm_blade))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/melee/arm_blade
|
||||
name = "arm blade"
|
||||
desc = "A grotesque blade made out of bone and flesh that cleaves through people as a hot knife through butter."
|
||||
//Claws
|
||||
/datum/power/changeling/claw
|
||||
name = "Claw"
|
||||
desc = "We reform one of our arms into a deadly claw."
|
||||
helptext = "We may retract our claw by dropping it."
|
||||
enhancedtext = "The claw will have armor peneratration."
|
||||
ability_icon_state = "ling_claw"
|
||||
genomecost = 1
|
||||
verbpath = /mob/proc/changeling_claw
|
||||
|
||||
//Grows a scary, and powerful arm blade.
|
||||
/mob/proc/changeling_claw()
|
||||
set category = "Changeling"
|
||||
set name = "Claw (15)"
|
||||
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
if(changeling_generic_weapon(/obj/item/weapon/melee/changeling/claw/greater, 1, 15))
|
||||
src << "<span class='notice'>We prepare an extra sharp claw.</span>"
|
||||
return 1
|
||||
|
||||
else
|
||||
if(changeling_generic_weapon(/obj/item/weapon/melee/changeling/claw, 1, 15))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/melee/changeling
|
||||
name = "arm weapon"
|
||||
desc = "A grotesque weapon made out of bone and flesh that cleaves through people as a hot knife through butter."
|
||||
icon = 'icons/obj/weapons.dmi'
|
||||
icon_state = "arm_blade"
|
||||
w_class = ITEMSIZE_HUGE
|
||||
force = 40
|
||||
sharp = 1
|
||||
edge = 1
|
||||
pry = 1
|
||||
force = 5
|
||||
anchored = 1
|
||||
throwforce = 0 //Just to be on the safe side
|
||||
throw_range = 0
|
||||
throw_speed = 0
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
var/mob/living/creator //This is just like ninja swords, needed to make sure dumb shit that removes the sword doesn't make it stay around.
|
||||
var/weapType = "weapon"
|
||||
var/weapLocation = "arm"
|
||||
|
||||
/obj/item/weapon/melee/arm_blade/greater
|
||||
name = "arm greatblade"
|
||||
desc = "A grotesque blade made out of bone and flesh that cleaves through people and armor as a hot knife through butter."
|
||||
armor_penetration = 30
|
||||
|
||||
/obj/item/weapon/melee/arm_blade/New(location)
|
||||
/obj/item/weapon/melee/changeling/New(location)
|
||||
..()
|
||||
processing_objects |= src
|
||||
if(ismob(loc))
|
||||
visible_message("<span class='warning'>A grotesque blade forms around [loc.name]\'s arm!</span>",
|
||||
"<span class='warning'>Our arm twists and mutates, transforming it into a deadly blade.</span>",
|
||||
visible_message("<span class='warning'>A grotesque weapon forms around [loc.name]\'s arm!</span>",
|
||||
"<span class='warning'>Our arm twists and mutates, transforming it into a deadly weapon.</span>",
|
||||
"<span class='italics'>You hear organic matter ripping and tearing!</span>")
|
||||
src.creator = loc
|
||||
|
||||
/obj/item/weapon/melee/arm_blade/dropped(mob/user)
|
||||
visible_message("<span class='warning'>With a sickening crunch, [creator] reforms their arm blade into an arm!</span>",
|
||||
/obj/item/weapon/melee/changeling/dropped(mob/user)
|
||||
visible_message("<span class='warning'>With a sickening crunch, [creator] reforms their arm!</span>",
|
||||
"<span class='notice'>We assimilate the weapon back into our body.</span>",
|
||||
"<span class='italics'>You hear organic matter ripping and tearing!</span>")
|
||||
playsound(src, 'sound/effects/blobattack.ogg', 30, 1)
|
||||
@@ -62,16 +80,16 @@
|
||||
if(src)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/melee/arm_blade/Destroy()
|
||||
/obj/item/weapon/melee/changeling/Destroy()
|
||||
processing_objects -= src
|
||||
creator = null
|
||||
..()
|
||||
|
||||
/obj/item/weapon/melee/arm_blade/suicide_act(mob/user)
|
||||
/obj/item/weapon/melee/changeling/suicide_act(mob/user)
|
||||
viewers(user) << "<span class='danger'>[user] is impaling \himself the [src.name]! It looks like \he's trying to commit suicide.</span>"
|
||||
return(BRUTELOSS)
|
||||
|
||||
/obj/item/weapon/melee/arm_blade/process() //Stolen from ninja swords.
|
||||
/obj/item/weapon/melee/changeling/process() //Stolen from ninja swords.
|
||||
if(!creator || loc != creator || !creator.item_is_in_hands(src))
|
||||
// Tidy up a bit.
|
||||
if(istype(loc,/mob/living))
|
||||
@@ -86,4 +104,34 @@
|
||||
host.drop_from_inventory(src)
|
||||
spawn(1)
|
||||
if(src)
|
||||
qdel(src)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/melee/changeling/arm_blade
|
||||
name = "arm blade"
|
||||
desc = "A grotesque blade made out of bone and flesh that cleaves through people as a hot knife through butter."
|
||||
icon_state = "arm_blade"
|
||||
force = 40
|
||||
armor_penetration = 15
|
||||
sharp = 1
|
||||
edge = 1
|
||||
pry = 1
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
|
||||
/obj/item/weapon/melee/changeling/arm_blade/greater
|
||||
name = "arm greatblade"
|
||||
desc = "A grotesque blade made out of bone and flesh that cleaves through people and armor as a hot knife through butter."
|
||||
armor_penetration = 30
|
||||
|
||||
/obj/item/weapon/melee/changeling/claw
|
||||
name = "hand claw"
|
||||
desc = "A grotesque claw made out of bone and flesh that cleaves through people as a hot knife through butter."
|
||||
icon_state = "ling_claw"
|
||||
force = 15
|
||||
sharp = 1
|
||||
edge = 1
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
|
||||
/obj/item/weapon/melee/changeling/claw/greater
|
||||
name = "hand greatclaw"
|
||||
force = 20
|
||||
armor_penetration = 20
|
||||
@@ -112,9 +112,6 @@
|
||||
"<span class='warning'>We harden our flesh, creating a suit of armor!</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
|
||||
name = "chitinous mass"
|
||||
desc = "A tough, hard covering of black chitin with transparent chitin in front."
|
||||
@@ -123,19 +120,12 @@
|
||||
siemens_coefficient = 0.3
|
||||
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
|
||||
desc = "A tough, hard mass of chitin, with long talons for digging into terrain."
|
||||
name = "chitinous talons"
|
||||
icon_state = "lingarmor"
|
||||
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
|
||||
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."
|
||||
|
||||
@@ -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
|
||||
@@ -33,6 +33,9 @@
|
||||
if(C.suiciding)
|
||||
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)
|
||||
C.adjustOxyLoss(C.maxHealth * 2)
|
||||
|
||||
|
||||
@@ -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>"
|
||||
//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...
|
||||
target.hallucination += 5000
|
||||
|
||||
//5000 is waaaay too much, in practice.
|
||||
target.hallucination = min(target.hallucination + 100, 500)
|
||||
target.apply_effect(10, STUTTER)
|
||||
target.adjustBrainLoss(1)
|
||||
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.hallucination += 5000
|
||||
//5000 is waaaay too much, in practice.
|
||||
target.hallucination = min(target.hallucination + 100, 500)
|
||||
target.apply_effect(15, STUTTER)
|
||||
target.adjustBrainLoss(1)
|
||||
|
||||
@@ -626,10 +629,8 @@ var/list/sacrificed = list()
|
||||
|
||||
if(istype(src,/obj/effect/rune))
|
||||
usr.say("O bidai nabora se[pick("'","`")]sma!")
|
||||
usr.say("[input]")
|
||||
else
|
||||
usr.whisper("O bidai nabora se[pick("'","`")]sma!")
|
||||
usr.whisper("[input]")
|
||||
|
||||
input = sanitize(input)
|
||||
log_and_message_admins("used a communicate rune to say '[input]'")
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
intercept.name = "paper"
|
||||
intercept.info = intercepttext
|
||||
|
||||
comm.messagetitle.Add("Cent. Com. CONFIDENTIAL REPORT")
|
||||
comm.messagetitle.Add("CentCom CONFIDENTIAL REPORT")
|
||||
comm.messagetext.Add(intercepttext)
|
||||
|
||||
world << sound('sound/AI/commandreport.ogg')
|
||||
@@ -74,7 +74,7 @@
|
||||
intercept.name = "paper"
|
||||
intercept.info = intercepttext
|
||||
|
||||
comm.messagetitle.Add("Cent. Com. CONFIDENTIAL REPORT")
|
||||
comm.messagetitle.Add("CentCom CONFIDENTIAL REPORT")
|
||||
comm.messagetext.Add(intercepttext)
|
||||
world << sound('sound/AI/commandreport.ogg')
|
||||
|
||||
|
||||
@@ -81,7 +81,12 @@ The "dust" will damage the hull of the station causin minor hull breaches.
|
||||
startx = (TRANSITIONEDGE+1)
|
||||
endy = rand(TRANSITIONEDGE,world.maxy-TRANSITIONEDGE)
|
||||
endx = world.maxx-TRANSITIONEDGE
|
||||
var/z_level = pick(using_map.station_levels)
|
||||
//VOREStation Edit - No space dust outside of space
|
||||
var/list/z_levels = using_map.station_levels.Copy()
|
||||
for(var/datum/planet/P in planet_controller.planets)
|
||||
z_levels.Remove(P.expected_z_levels)
|
||||
var/z_level = pick(z_levels)
|
||||
//VOREStation Edit End
|
||||
var/goal = locate(endx, endy, z_level)
|
||||
src.x = startx
|
||||
src.y = starty
|
||||
|
||||
@@ -405,6 +405,8 @@ var/global/list/additional_antag_types = list()
|
||||
candidates += player.mind
|
||||
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(candidates.len < required_enemies)
|
||||
for(var/mob/new_player/player in players)
|
||||
@@ -413,6 +415,7 @@ var/global/list/additional_antag_types = list()
|
||||
candidates += player.mind
|
||||
players -= player
|
||||
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
|
||||
// required_enemies if the number of people with that role set to yes is less than recomended_enemies,
|
||||
|
||||
@@ -7,9 +7,9 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind'
|
||||
/datum/game_mode/heist
|
||||
name = "Heist"
|
||||
config_tag = "heist"
|
||||
required_players = 15
|
||||
required_players_secret = 15
|
||||
required_enemies = 4
|
||||
required_players = 9
|
||||
required_players_secret = 9
|
||||
required_enemies = 3
|
||||
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 \
|
||||
station to be a highly valuable target for many competing organizations and individuals. Being a \
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
/datum/game_mode/infiltrator
|
||||
name = "Team Traitor"
|
||||
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 \
|
||||
the facility. What their goals are, who their employers are, and why the individuals would work for them is a mystery, \
|
||||
but perhaps you will outwit them, or perhaps that is all part of their plan?"
|
||||
config_tag = "infiltrator"
|
||||
required_players = 2
|
||||
required_players_secret = 5
|
||||
required_enemies = 2 // Bit pointless if there is only one, since its basically traitor.
|
||||
end_on_antag_death = 0
|
||||
antag_scaling_coeff = 5
|
||||
antag_tags = list(MODE_INFILTRATOR)
|
||||
@@ -1045,7 +1045,7 @@ datum
|
||||
return 20
|
||||
AI
|
||||
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
|
||||
|
||||
get_points(var/job)
|
||||
|
||||
@@ -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 \
|
||||
attempts of robbery, fraud and other malicious actions."
|
||||
config_tag = "mercenary"
|
||||
required_players = 15
|
||||
required_players_secret = 15
|
||||
required_enemies = 4
|
||||
required_players = 9
|
||||
required_players_secret = 9
|
||||
required_enemies = 3
|
||||
end_on_antag_death = 0
|
||||
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
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
|
||||
/obj/item/weapon/antag_spawner/technomancer_apprentice/Destroy()
|
||||
qdel(sparks)
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/antag_spawner/technomancer_apprentice/attack_self(mob/user)
|
||||
user << "<span class='notice'>Teleporter attempting to lock on to your apprentice.</span>"
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
|
||||
/mob/living/simple_animal/technomancer_golem/Destroy()
|
||||
qdel(core)
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/technomancer_golem/update_icon()
|
||||
overlays.Cut()
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
/obj/item/weapon/technomancer_core/Destroy()
|
||||
dismiss_all_summons()
|
||||
processing_objects.Remove(src)
|
||||
..()
|
||||
return ..()
|
||||
|
||||
// Add the spell buttons to the HUD.
|
||||
/obj/item/weapon/technomancer_core/equipped(mob/user)
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
/obj/item/clothing/gloves/regen/Destroy()
|
||||
wearer = null
|
||||
processing_objects -= src
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/gloves/regen/process()
|
||||
if(!wearer || wearer.isSynthetic() || wearer.stat == DEAD || wearer.nutrition <= 10)
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
|
||||
/obj/item/clothing/suit/armor/shield/Destroy()
|
||||
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")
|
||||
//Since this is a pierce of armor that is passive, we do not need to check if the user is incapacitated.
|
||||
|
||||
@@ -151,7 +151,7 @@
|
||||
/obj/item/weapon/spell/Destroy()
|
||||
owner = null
|
||||
core = null
|
||||
..()
|
||||
return ..()
|
||||
|
||||
// Proc: update_icon()
|
||||
// Parameters: 0
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
spell_power_desc = "Blink distance is scaled up with more spell power."
|
||||
cost = 50
|
||||
obj_path = /obj/item/weapon/spell/blink
|
||||
ability_icon_state = "tech_blink"
|
||||
category = UTILITY_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/blink
|
||||
|
||||
@@ -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."
|
||||
cost = 100
|
||||
obj_path = /obj/item/weapon/spell/control
|
||||
ability_icon_state = "tech_control"
|
||||
category = UTILITY_SPELLS
|
||||
|
||||
/mob/living/carbon/human/proc/technomancer_control()
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
|
||||
/obj/item/weapon/weldingtool/spell
|
||||
name = "flame"
|
||||
eye_safety_modifier = 3
|
||||
|
||||
/obj/item/weapon/weldingtool/spell/process()
|
||||
return
|
||||
|
||||
@@ -181,7 +181,7 @@
|
||||
|
||||
if(I_HURT)
|
||||
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)
|
||||
|
||||
return
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
/datum/technomancer/spell/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 \
|
||||
if the target is completely healthy, preventing further instability."
|
||||
spell_power_desc = "Healing amount increased."
|
||||
cost = 50
|
||||
obj_path = /obj/item/weapon/spell/modifier/mend_synthetic
|
||||
ability_icon_state = "tech_mendwounds"
|
||||
ability_icon_state = "tech_mendsynth"
|
||||
category = SUPPORT_SPELLS
|
||||
|
||||
/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.
|
||||
expire()
|
||||
return
|
||||
holder.adjustBruteLoss(-4 * spell_power) // Should heal roughly 20 burn/brute over 10 seconds, as tick() is run every 2 seconds.
|
||||
holder.adjustFireLoss(-4 * spell_power) // Ditto.
|
||||
if(ishuman(holder))
|
||||
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)
|
||||
if(origin)
|
||||
var/mob/living/L = origin.resolve()
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
If casted on the envirnment, air (oxygen and nitrogen) is moved from a distant location to your target."
|
||||
cost = 25
|
||||
obj_path = /obj/item/weapon/spell/oxygenate
|
||||
ability_icon_state = "oxygenate"
|
||||
ability_icon_state = "tech_oxygenate"
|
||||
category = SUPPORT_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/oxygenate
|
||||
|
||||
@@ -4,12 +4,14 @@
|
||||
rift you create will afflict you with instability."
|
||||
cost = 50
|
||||
obj_path = /obj/item/weapon/spell/phase_shift
|
||||
ability_icon_state = "tech_phaseshift"
|
||||
category = DEFENSIVE_SPELLS
|
||||
|
||||
/obj/item/weapon/spell/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 \
|
||||
rift."
|
||||
icon_state = "blink"
|
||||
cast_methods = CAST_USE
|
||||
aspect = ASPECT_TELE
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
spell_power_desc = "Increases damage dealt, up to a cap of 80 damage per shot."
|
||||
cost = 100
|
||||
obj_path = /obj/item/weapon/spell/projectile/overload
|
||||
ability_icon_state = "tech_overload"
|
||||
category = OFFENSIVE_SPELLS
|
||||
|
||||
/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)
|
||||
energy_cost_per_shot = round(core.max_energy * 0.10)
|
||||
..()
|
||||
/* var/energy_before_firing = core.energy
|
||||
if(set_up(hit_atom, user))
|
||||
var/obj/item/projectile/overload/P = new spell_projectile(get_turf(user))
|
||||
|
||||
@@ -120,6 +120,7 @@
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/evidence(H), slot_l_hand)
|
||||
else
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/evidence(H), slot_in_backpack)
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/revolver/detective(H), slot_in_backpack) // Vorestation Edit
|
||||
if(has_alt_title(H, alt_title,"Forensic Technician"))
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/forensics/blue(H), slot_wear_suit)
|
||||
H.equip_to_slot_or_del(new /obj/item/weapon/storage/briefcase/crimekit, slot_r_hand)
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
m = min(m, cable.amount)
|
||||
m = min(m, 30)
|
||||
if(m)
|
||||
playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
|
||||
playsound(src.loc, O.usesound, 50, 1)
|
||||
use_cable(m)
|
||||
var/obj/item/stack/cable_coil/CC = new (get_turf(src))
|
||||
CC.amount = m
|
||||
|
||||
@@ -158,7 +158,7 @@
|
||||
//Body Scan Console
|
||||
/obj/machinery/body_scanconsole
|
||||
var/obj/machinery/bodyscanner/scanner
|
||||
var/known_implants = list(/obj/item/weapon/implant/health, /obj/item/weapon/implant/chem, /obj/item/weapon/implant/death_alarm, /obj/item/weapon/implant/loyalty, /obj/item/weapon/implant/tracking, /obj/item/weapon/implant/language, /obj/item/weapon/implant/language/eal, /obj/item/weapon/implant/backup) //VOREStation Add - Backup Implant
|
||||
var/known_implants = list(/obj/item/weapon/implant/health, /obj/item/weapon/implant/chem, /obj/item/weapon/implant/death_alarm, /obj/item/weapon/implant/loyalty, /obj/item/weapon/implant/tracking, /obj/item/weapon/implant/language, /obj/item/weapon/implant/language/eal, /obj/item/weapon/implant/backup, /obj/item/device/nif) //VOREStation Add - Backup Implant, NIF
|
||||
var/delete
|
||||
var/temphtml
|
||||
name = "Body Scanner Console"
|
||||
|
||||
@@ -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" = "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" = "Fuel", "command" = "fuel_scrub","val" = info["filter_fuel"]))
|
||||
data["scrubbers"] = scrubbers
|
||||
if(AALARM_SCREEN_MODE)
|
||||
var/modes[0]
|
||||
@@ -655,6 +656,7 @@
|
||||
"co2_scrub",
|
||||
"tox_scrub",
|
||||
"n2o_scrub",
|
||||
"fuel_scrub",
|
||||
"panic_siphon",
|
||||
"scrubbing",
|
||||
"direction")
|
||||
|
||||
@@ -428,3 +428,23 @@ update_flag
|
||||
|
||||
src.update_icon()
|
||||
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
|
||||
@@ -67,13 +67,13 @@
|
||||
|
||||
/obj/machinery/meter/examine(mob/user)
|
||||
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>"
|
||||
|
||||
|
||||
else if(stat & (NOPOWER|BROKEN))
|
||||
t += "<span class='warning'>The display is off.</span>"
|
||||
|
||||
|
||||
else if(src.target)
|
||||
var/datum/gas_mixture/environment = target.return_air()
|
||||
if(environment)
|
||||
@@ -82,7 +82,7 @@
|
||||
t += "The sensor error light is blinking."
|
||||
else
|
||||
t += "The connect error light is blinking."
|
||||
|
||||
|
||||
user << t
|
||||
|
||||
/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
|
||||
usr.examinate(src)
|
||||
return 1
|
||||
|
||||
|
||||
return ..()
|
||||
|
||||
/obj/machinery/meter/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
|
||||
if (!istype(W, /obj/item/weapon/wrench))
|
||||
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>"
|
||||
if (do_after(user, 40))
|
||||
if (do_after(user, 40 * W.toolspeed))
|
||||
user.visible_message( \
|
||||
"<span class='notice'>\The [user] unfastens \the [src].</span>", \
|
||||
"<span class='notice'>You have unfastened \the [src].</span>", \
|
||||
|
||||
@@ -114,6 +114,7 @@
|
||||
disconnect()
|
||||
user << "<span class='notice'>You disconnect \the [src] from the port.</span>"
|
||||
update_icon()
|
||||
playsound(src, W.usesound, 50, 1)
|
||||
return
|
||||
else
|
||||
var/obj/machinery/atmospherics/portables_connector/possible_port = locate(/obj/machinery/atmospherics/portables_connector/) in loc
|
||||
@@ -121,6 +122,7 @@
|
||||
if(connect(possible_port))
|
||||
user << "<span class='notice'>You connect \the [src] to the port.</span>"
|
||||
update_icon()
|
||||
playsound(src, W.usesound, 50, 1)
|
||||
return
|
||||
else
|
||||
user << "<span class='notice'>\The [src] failed to connect to the port.</span>"
|
||||
@@ -173,6 +175,7 @@
|
||||
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>")
|
||||
playsound(src, I.usesound, 50, 1)
|
||||
cell.add_fingerprint(user)
|
||||
cell.loc = src.loc
|
||||
cell = null
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
var/minrate = 0
|
||||
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()
|
||||
..()
|
||||
@@ -218,7 +218,7 @@
|
||||
return
|
||||
|
||||
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>"
|
||||
|
||||
return
|
||||
|
||||
@@ -145,7 +145,7 @@
|
||||
if(is_robot_module(O))
|
||||
return 0
|
||||
|
||||
if(istype(O,/obj/item/ammo_magazine/clip) || istype(O,/obj/item/ammo_magazine/s357) || istype(O,/obj/item/ammo_magazine/s38)) // Prevents ammo recycling exploit with speedloaders.
|
||||
if(istype(O,/obj/item/ammo_magazine/clip) || istype(O,/obj/item/ammo_magazine/s357) || istype(O,/obj/item/ammo_magazine/s38) || istype (O,/obj/item/ammo_magazine/s44)/* VOREstation Edit*/) // Prevents ammo recycling exploit with speedloaders.
|
||||
user << "\The [O] is too hazardous to recycle with the autolathe!"
|
||||
return
|
||||
/* ToDo: Make this actually check for ammo and change the value of the magazine if it's empty. -Spades
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
var/c_tag_order = 999
|
||||
var/status = 1
|
||||
anchored = 1.0
|
||||
var/invuln = null
|
||||
var/invuln = 0
|
||||
var/bugged = 0
|
||||
var/obj/item/weapon/camera_assembly/assembly = null
|
||||
|
||||
@@ -37,6 +37,8 @@
|
||||
|
||||
var/client_huds = list()
|
||||
|
||||
var/list/camera_computers_using_this = list()
|
||||
|
||||
/obj/machinery/camera/New()
|
||||
wires = new(src)
|
||||
assembly = new(src)
|
||||
@@ -143,7 +145,7 @@
|
||||
panel_open = !panel_open
|
||||
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>")
|
||||
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
|
||||
playsound(src.loc, W.usesound, 50, 1)
|
||||
|
||||
else if((iswirecutter(W) || ismultitool(W)) && panel_open)
|
||||
interact(user)
|
||||
@@ -377,10 +379,10 @@
|
||||
|
||||
// Do after stuff here
|
||||
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)
|
||||
busy = 1
|
||||
if(do_after(user, 100))
|
||||
if(do_after(user, 100 * WT.toolspeed))
|
||||
busy = 0
|
||||
if(!WT.isOn())
|
||||
return 0
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
if(0)
|
||||
// State 0
|
||||
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."
|
||||
anchored = 1
|
||||
state = 1
|
||||
@@ -48,7 +48,7 @@
|
||||
return
|
||||
|
||||
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."
|
||||
anchored = 0
|
||||
update_icon()
|
||||
@@ -78,7 +78,7 @@
|
||||
if(3)
|
||||
// State 3
|
||||
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))
|
||||
if(!input)
|
||||
@@ -118,7 +118,7 @@
|
||||
else if(iswirecutter(W))
|
||||
|
||||
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."
|
||||
state = 2
|
||||
return
|
||||
@@ -136,7 +136,7 @@
|
||||
var/obj/U = locate(/obj) in upgrades
|
||||
if(U)
|
||||
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)
|
||||
upgrades -= U
|
||||
return
|
||||
@@ -161,10 +161,10 @@
|
||||
return 0
|
||||
|
||||
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)
|
||||
busy = 1
|
||||
if(do_after(user, 20))
|
||||
if(do_after(user, 20 * WT.toolspeed))
|
||||
busy = 0
|
||||
if(!WT.isOn())
|
||||
return 0
|
||||
|
||||
@@ -98,6 +98,7 @@ var/global/list/engineering_networks = list(
|
||||
|
||||
/obj/machinery/camera/network/thunder
|
||||
network = list(NETWORK_THUNDER)
|
||||
invuln = 1
|
||||
|
||||
// EMP
|
||||
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
|
||||
anchored = !anchored
|
||||
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)
|
||||
if(charging)
|
||||
|
||||
@@ -234,7 +234,7 @@
|
||||
connected = null
|
||||
else
|
||||
anchored = 1
|
||||
playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
|
||||
playsound(src, W.usesound, 100, 1)
|
||||
if(anchored)
|
||||
user.visible_message("[user] secures [src] to the floor.", "You secure [src] to the floor.")
|
||||
else
|
||||
@@ -243,6 +243,7 @@
|
||||
var/obj/item/device/multitool/M = W
|
||||
M.connecting = src
|
||||
user << "<span class='notice'>You load connection data from [src] to [M].</span>"
|
||||
M.update_icon()
|
||||
return
|
||||
else
|
||||
..()
|
||||
|
||||
@@ -15,8 +15,8 @@
|
||||
switch(state)
|
||||
if(0)
|
||||
if(istype(P, /obj/item/weapon/wrench))
|
||||
playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
|
||||
if(do_after(user, 20))
|
||||
playsound(loc, P.usesound, 50, 1)
|
||||
if(do_after(user, 20 * P.toolspeed))
|
||||
user << "<span class='notice'>You wrench the frame into place.</span>"
|
||||
anchored = 1
|
||||
state = 1
|
||||
@@ -25,16 +25,16 @@
|
||||
if(!WT.isOn())
|
||||
user << "The welder must be on for this task."
|
||||
return
|
||||
playsound(loc, 'sound/items/Welder.ogg', 50, 1)
|
||||
if(do_after(user, 20))
|
||||
playsound(loc, WT.usesound, 50, 1)
|
||||
if(do_after(user, 20 * WT.toolspeed))
|
||||
if(!src || !WT.remove_fuel(0, user)) return
|
||||
user << "<span class='notice'>You deconstruct the frame.</span>"
|
||||
new /obj/item/stack/material/plasteel( loc, 4)
|
||||
qdel(src)
|
||||
if(1)
|
||||
if(istype(P, /obj/item/weapon/wrench))
|
||||
playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
|
||||
if(do_after(user, 20))
|
||||
playsound(loc, P.usesound, 50, 1)
|
||||
if(do_after(user, 20 * P.toolspeed))
|
||||
user << "<span class='notice'>You unfasten the frame.</span>"
|
||||
anchored = 0
|
||||
state = 0
|
||||
@@ -46,12 +46,12 @@
|
||||
user.drop_item()
|
||||
P.loc = src
|
||||
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>"
|
||||
state = 2
|
||||
icon_state = "2"
|
||||
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>"
|
||||
state = 1
|
||||
icon_state = "0"
|
||||
@@ -59,7 +59,7 @@
|
||||
circuit = null
|
||||
if(2)
|
||||
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>"
|
||||
state = 1
|
||||
icon_state = "1"
|
||||
@@ -81,7 +81,7 @@
|
||||
if (brain)
|
||||
user << "Get that brain out of there first"
|
||||
else
|
||||
playsound(loc, 'sound/items/Wirecutter.ogg', 50, 1)
|
||||
playsound(loc, P.usesound, 50, 1)
|
||||
user << "<span class='notice'>You remove the cables.</span>"
|
||||
state = 2
|
||||
icon_state = "2"
|
||||
@@ -146,7 +146,7 @@
|
||||
icon_state = "3b"
|
||||
|
||||
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>"
|
||||
brain.loc = loc
|
||||
brain = null
|
||||
@@ -154,7 +154,7 @@
|
||||
|
||||
if(4)
|
||||
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>"
|
||||
state = 3
|
||||
if (brain)
|
||||
@@ -165,7 +165,7 @@
|
||||
return
|
||||
|
||||
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>"
|
||||
if(!brain)
|
||||
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.create_eyeobj()
|
||||
transfer.cancel_camera()
|
||||
user << "<span class='notice'>Transfer successful:</span> [transfer.name] ([rand(1000,9999)].exe) downloaded to host terminal. Local copy wiped."
|
||||
transfer << "You have been uploaded to a stationary terminal. Remote device connection restored."
|
||||
user << "<span class='notice'>Transfer successful:</span> [transfer.name] placed within stationary core."
|
||||
transfer << "You have been transferred into a stationary core. Remote device connection restored."
|
||||
|
||||
if(card)
|
||||
card.clear()
|
||||
@@ -229,7 +229,8 @@
|
||||
else if(istype(W, /obj/item/weapon/wrench))
|
||||
if(anchored)
|
||||
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>")
|
||||
return
|
||||
user.visible_message("<span class='notice'>\The [user] finishes unfastening \the [src]!</span>")
|
||||
@@ -237,7 +238,8 @@
|
||||
return
|
||||
else
|
||||
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>")
|
||||
return
|
||||
user.visible_message("<span class='notice'>\The [user] finishes fastening down \the [src]!</span>")
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user