Polaris sync

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

View File

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

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.

View File

@@ -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))

View File

@@ -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>", \

View File

@@ -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()

View File

@@ -227,9 +227,9 @@ Thus, the two variables affect pump operation are set in New():
user << "<span class='warning'>You cannot unwrench this [src], it too exerted due to internal pressure.</span>"
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>", \

View File

@@ -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>", \

View File

@@ -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>", \

View File

@@ -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>", \

View File

@@ -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>", \

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>", \

View File

@@ -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>", \

View File

@@ -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>", \

View File

@@ -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>", \

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>", \

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>", \

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.

View File

@@ -96,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

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

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

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)

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)

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

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

View File

@@ -137,33 +137,27 @@
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
/datum/category_item/autolathe/arms/machinegun_545
name = "machinegun box magazine (5.56)"
path =/obj/item/ammo_magazine/m556saw
path =/obj/item/ammo_magazine/m545saw
hidden = 1
/////// 7.62
/////// 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.
@@ -231,14 +245,14 @@
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
@@ -345,15 +359,15 @@
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

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>"

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++

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)

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

View File

@@ -159,14 +159,13 @@
/obj/item/device/kit/paint/gygax/recitence
)
name = "Random Gygax exosuit modkit"
/*
/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
*/

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"

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)"

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

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

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)

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

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>"

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"

View File

@@ -111,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.")

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)

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()
..()

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

View File

@@ -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

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

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)

View File

@@ -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."

View File

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

View File

@@ -33,6 +33,9 @@
if(C.suiciding)
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)

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]'")

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')

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,

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 \

View File

@@ -1,5 +1,5 @@
/datum/game_mode/infiltrator
name = "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, \

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)

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

View File

@@ -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>"

View File

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

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)

View File

@@ -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)

View File

@@ -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.

View File

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

View File

@@ -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

View File

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

View File

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

View File

@@ -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

View File

@@ -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()

View File

@@ -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

View File

@@ -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

View File

@@ -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))

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

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")

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

View File

@@ -68,7 +68,7 @@
/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))
@@ -96,9 +96,9 @@
/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>", \

View File

@@ -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

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

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

View File

@@ -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

View File

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

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)

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
..()

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>")

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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