Merge branch 'master' of https://github.com/VOREStation/VOREStation into Fluff_Items_worshop

This commit is contained in:
JOAN-RIG\Joan Risu
2017-08-08 14:56:29 -07:00
833 changed files with 76095 additions and 33675 deletions
+1 -1
View File
@@ -5,7 +5,7 @@ sudo: false
env:
BYOND_MAJOR="511"
BYOND_MINOR="1381"
MACRO_COUNT=875
MACRO_COUNT=4
cache:
directories:
+9 -3
View File
@@ -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>", \
+2 -2
View File
@@ -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>", \
+2 -2
View File
@@ -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>", \
+2 -2
View File
@@ -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>", \
+1
View File
@@ -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.
+2
View File
@@ -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"
+2 -1
View File
@@ -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
+1 -1
View File
@@ -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
+16
View File
@@ -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
+4 -4
View File
@@ -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))
+2 -1
View File
@@ -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',
+3 -1
View File
@@ -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)
+2
View File
@@ -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)
+1 -1
View File
@@ -243,7 +243,7 @@ var/obj/screen/robot_inventory
//Unfortunately adding the emag module to the list of modules has to be here. This is because a borg can
//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
+1 -1
View File
@@ -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>"
+1 -1
View File
@@ -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
+50 -36
View File
@@ -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
+5 -5
View File
@@ -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
+1 -1
View File
@@ -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
View File
@@ -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()
+49
View File
@@ -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)
+1 -1
View File
@@ -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"
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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
+14
View File
@@ -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"
+10 -2
View File
@@ -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
+8
View File
@@ -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)
+18 -18
View File
@@ -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)"
+20
View File
@@ -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
+15
View File
@@ -66,6 +66,21 @@
When in hacking mode this device will grant full access to any standard airlock within 20 to 40 seconds. \
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
+6 -4
View File
@@ -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)
+66 -8
View File
@@ -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
+2
View File
@@ -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>"
+1 -1
View File
@@ -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"
+2 -3
View File
@@ -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.")
+4
View File
@@ -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
+9 -5
View File
@@ -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)
+2
View File
@@ -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)
+1 -1
View File
@@ -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()
..()
+3 -3
View File
@@ -12,10 +12,10 @@ var/datum/antagonist/raider/raiders
flags = ANTAG_OVERRIDE_JOB | ANTAG_CLEAR_EQUIPMENT | ANTAG_CHOOSE_NAME | ANTAG_VOTABLE | ANTAG_SET_APPEARANCE | ANTAG_HAS_LEADER
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
+2
View File
@@ -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]"
+2
View File
@@ -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
+3 -3
View File
@@ -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
+1 -1
View File
@@ -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
View File
@@ -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
+3 -4
View File
@@ -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)
+5 -4
View File
@@ -152,12 +152,15 @@ var/list/sacrificed = list()
target << "<span class='cult'>Your mind turns to ash as the burning flames engulf your very soul and images of an unspeakable horror begin to bombard the last remnants of mental resistance.</span>"
//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]'")
+2 -2
View File
@@ -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')
+6 -1
View File
@@ -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
+3
View File
@@ -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,
+3 -3
View File
@@ -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)
+1 -1
View File
@@ -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)
+3 -3
View File
@@ -12,9 +12,9 @@ var/list/nuke_disks = list()
colony of sizable population and considerable wealth causes it to often be the target of various \
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()
+1 -1
View File
@@ -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))
+1
View File
@@ -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)
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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"
+2
View File
@@ -549,6 +549,7 @@
scrubbers[scrubbers.len]["filters"] += list(list("name" = "Carbon Dioxide", "command" = "co2_scrub","val" = info["filter_co2"]))
scrubbers[scrubbers.len]["filters"] += list(list("name" = "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")
+20
View File
@@ -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
+8 -8
View File
@@ -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
+2 -2
View File
@@ -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
+1 -1
View File
@@ -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
+6 -4
View File
@@ -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
+1
View File
@@ -98,6 +98,7 @@ var/global/list/engineering_networks = list(
/obj/machinery/camera/network/thunder
network = list(NETWORK_THUNDER)
invuln = 1
// EMP
+1 -1
View File
@@ -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)
+2 -1
View File
@@ -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
..()
+19 -17
View File
@@ -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