Merge branch 'master' into fruit
This commit is contained in:
@@ -122824,7 +122824,6 @@
|
||||
/turf/open/floor/plasteel,
|
||||
/area/maintenance/port/aft)
|
||||
"eat" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/structure/cable/white{
|
||||
icon_state = "1-8"
|
||||
},
|
||||
@@ -123561,9 +123560,6 @@
|
||||
/obj/structure/cable/white{
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 1
|
||||
},
|
||||
@@ -123574,6 +123570,9 @@
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
dir = 9
|
||||
},
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/chapel/office)
|
||||
"ebU" = (
|
||||
@@ -123816,7 +123815,6 @@
|
||||
/turf/open/floor/plasteel,
|
||||
/area/maintenance/port/aft)
|
||||
"ecw" = (
|
||||
/obj/structure/bodycontainer/morgue,
|
||||
/obj/machinery/firealarm{
|
||||
dir = 1;
|
||||
pixel_y = -24
|
||||
@@ -126412,6 +126410,13 @@
|
||||
/obj/machinery/door/airlock/research/glass/incinerator/toxmix_interior,
|
||||
/turf/open/floor/engine,
|
||||
/area/science/mixing)
|
||||
"fwr" = (
|
||||
/obj/machinery/door/poddoor{
|
||||
id = "chapelgun";
|
||||
name = "Chapel Launcher Door"
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/chapel/office)
|
||||
"fFK" = (
|
||||
/obj/machinery/ore_silo,
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
@@ -126430,6 +126435,10 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
|
||||
/turf/closed/wall/r_wall,
|
||||
/area/science/circuit)
|
||||
"fHS" = (
|
||||
/obj/structure/sign/warning/vacuum,
|
||||
/turf/closed/wall/r_wall,
|
||||
/area/chapel/office)
|
||||
"fLR" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
|
||||
dir = 6
|
||||
@@ -126462,6 +126471,15 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/turf/closed/wall/r_wall,
|
||||
/area/science/circuit)
|
||||
"gJj" = (
|
||||
/obj/machinery/door/window/northleft{
|
||||
name = "Mass Driver"
|
||||
},
|
||||
/obj/machinery/mass_driver{
|
||||
name = "Holy Driver"
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/chapel/office)
|
||||
"gKr" = (
|
||||
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
|
||||
dir = 1
|
||||
@@ -126479,6 +126497,22 @@
|
||||
},
|
||||
/turf/open/floor/plasteel/white,
|
||||
/area/science/misc_lab)
|
||||
"gNJ" = (
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral,
|
||||
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/chapel/office)
|
||||
"gNS" = (
|
||||
/obj/effect/turf_decal/stripes/line,
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
@@ -126543,6 +126577,10 @@
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/quartermaster/storage)
|
||||
"hei" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/turf/closed/wall/r_wall,
|
||||
/area/chapel/office)
|
||||
"hic" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/item/integrated_electronics/analyzer,
|
||||
@@ -126604,6 +126642,22 @@
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/security/prison)
|
||||
"hLO" = (
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral,
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/turf_decal/delivery,
|
||||
/obj/structure/closet,
|
||||
/obj/effect/spawner/lootdrop/maintenance{
|
||||
lootcount = 3;
|
||||
name = "3maintenance loot spawner"
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/maintenance/port/aft)
|
||||
"hNZ" = (
|
||||
/obj/structure/chair/office/light{
|
||||
dir = 8
|
||||
@@ -126650,6 +126704,9 @@
|
||||
},
|
||||
/turf/open/floor/engine/vacuum,
|
||||
/area/science/mixing)
|
||||
"iyd" = (
|
||||
/turf/open/space,
|
||||
/area/space/nearstation)
|
||||
"iQh" = (
|
||||
/obj/structure/bodycontainer/morgue{
|
||||
dir = 1
|
||||
@@ -126714,6 +126771,9 @@
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/science/research/abandoned)
|
||||
"jhK" = (
|
||||
/turf/open/floor/plasteel,
|
||||
/area/maintenance/port/aft)
|
||||
"jjN" = (
|
||||
/obj/structure/table/reinforced,
|
||||
/obj/machinery/camera{
|
||||
@@ -126811,6 +126871,28 @@
|
||||
/obj/machinery/chem_master,
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/medical/medbay/central)
|
||||
"jPA" = (
|
||||
/obj/effect/turf_decal/tile/neutral,
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/computer/pod/old{
|
||||
density = 0;
|
||||
icon = 'icons/obj/airlock_machines.dmi';
|
||||
icon_state = "airlock_control_standby";
|
||||
id = "chapelgun";
|
||||
name = "Mass Driver Controller";
|
||||
pixel_x = 0;
|
||||
pixel_y = -24
|
||||
},
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/chapel/office)
|
||||
"jRy" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
dir = 4
|
||||
@@ -126864,6 +126946,19 @@
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/maintenance/port)
|
||||
"kzR" = (
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 2
|
||||
},
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 1
|
||||
},
|
||||
/obj/machinery/door/airlock/maintenance_hatch{
|
||||
name = "Chapel Maintenance";
|
||||
req_access_txt = "27"
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/chapel/office)
|
||||
"kLu" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
dir = 4
|
||||
@@ -127095,6 +127190,33 @@
|
||||
},
|
||||
/turf/open/floor/engine,
|
||||
/area/science/mixing)
|
||||
"mXJ" = (
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral,
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/chapel/office)
|
||||
"nht" = (
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral,
|
||||
/obj/machinery/light,
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/chapel/office)
|
||||
"nyN" = (
|
||||
/obj/machinery/vending/kink,
|
||||
/turf/open/floor/plating,
|
||||
@@ -127103,6 +127225,19 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/general/hidden,
|
||||
/turf/closed/wall/r_wall,
|
||||
/area/maintenance/disposal/incinerator)
|
||||
"owr" = (
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral,
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/chapel/office)
|
||||
"oIl" = (
|
||||
/obj/machinery/atmospherics/components/unary/portables_connector/visible{
|
||||
dir = 1
|
||||
@@ -127281,6 +127416,12 @@
|
||||
/obj/effect/spawner/lootdrop/keg,
|
||||
/turf/open/floor/plating,
|
||||
/area/crew_quarters/abandoned_gambling_den)
|
||||
"qMR" = (
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 2
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/chapel/office)
|
||||
"rhO" = (
|
||||
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
|
||||
dir = 1
|
||||
@@ -127430,6 +127571,14 @@
|
||||
},
|
||||
/turf/open/floor/engine,
|
||||
/area/engine/supermatter)
|
||||
"uZN" = (
|
||||
/obj/structure/rack,
|
||||
/obj/effect/spawner/lootdrop/maintenance{
|
||||
lootcount = 2;
|
||||
name = "2maintenance loot spawner"
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/maintenance/port/aft)
|
||||
"vhA" = (
|
||||
/obj/item/clothing/under/color/grey,
|
||||
/turf/open/floor/plating,
|
||||
@@ -127567,6 +127716,25 @@
|
||||
/obj/effect/turf_decal/bot,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/science/research)
|
||||
"xWZ" = (
|
||||
/obj/structure/bodycontainer/morgue{
|
||||
dir = 2
|
||||
},
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral,
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/chapel/office)
|
||||
"xXn" = (
|
||||
/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/toxins_mixing_output,
|
||||
/turf/open/floor/engine/vacuum,
|
||||
@@ -159675,12 +159843,12 @@ dWI
|
||||
dZf
|
||||
dZM
|
||||
eat
|
||||
dLY
|
||||
dLY
|
||||
dLY
|
||||
dLY
|
||||
dLY
|
||||
dLY
|
||||
dZN
|
||||
dZN
|
||||
dZN
|
||||
dZN
|
||||
fHS
|
||||
dZN
|
||||
dLY
|
||||
dLY
|
||||
aad
|
||||
@@ -159930,20 +160098,20 @@ dWJ
|
||||
dLW
|
||||
dYu
|
||||
dZg
|
||||
dYu
|
||||
dYu
|
||||
dZg
|
||||
ebR
|
||||
dLW
|
||||
ecQ
|
||||
edl
|
||||
aad
|
||||
jhK
|
||||
jhK
|
||||
kzR
|
||||
owr
|
||||
mXJ
|
||||
gJj
|
||||
qMR
|
||||
fwr
|
||||
aaa
|
||||
aaa
|
||||
aad
|
||||
iyd
|
||||
aaa
|
||||
aaa
|
||||
aad
|
||||
iyd
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
@@ -160187,14 +160355,14 @@ dTw
|
||||
dTw
|
||||
dTw
|
||||
dTw
|
||||
dLX
|
||||
dLW
|
||||
dLW
|
||||
dLW
|
||||
ecv
|
||||
dNt
|
||||
edl
|
||||
aad
|
||||
hLO
|
||||
uZN
|
||||
hei
|
||||
gNJ
|
||||
jPA
|
||||
dTw
|
||||
dTw
|
||||
dTw
|
||||
aad
|
||||
aad
|
||||
aad
|
||||
@@ -160447,8 +160615,8 @@ dTw
|
||||
dZN
|
||||
dZN
|
||||
dZN
|
||||
dZN
|
||||
dZN
|
||||
xWZ
|
||||
nht
|
||||
dTw
|
||||
dTw
|
||||
dTw
|
||||
|
||||
@@ -38,5 +38,5 @@
|
||||
|
||||
//Gangshit
|
||||
#define NOT_DOMINATING -1
|
||||
#define MAX_LEADERS_GANG 3
|
||||
#define MAX_LEADERS_GANG 4
|
||||
#define INITIAL_DOM_ATTEMPTS 3
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
#define DONATOR_GROUP_TIER_1_CONFIG_PATH /datum/config_entry/keyed_list/donator_group/tier_1_donators
|
||||
#define DONATOR_GROUP_TIER_2_CONFIG_PATH /datum/config_entry/keyed_list/donator_group/tier_2_donators
|
||||
#define DONATOR_GROUP_TIER_3_CONFIG_PATH /datum/config_entry/keyed_list/donator_group/tier_3_donators
|
||||
|
||||
#define DONATOR_GROUP_TIER_1_CONFIG_SUBPATH keyed_list/donator_group/tier_1_donators
|
||||
#define DONATOR_GROUP_TIER_2_CONFIG_SUBPATH keyed_list/donator_group/tier_2_donators
|
||||
#define DONATOR_GROUP_TIER_3_CONFIG_SUBPATH keyed_list/donator_group/tier_3_donators
|
||||
|
||||
#define TIER_1_DONATORS CONFIG_GET(DONATOR_GROUP_TIER_1_CONFIG_SUBPATH)
|
||||
#define TIER_2_DONATORS CONFIG_GET(DONATOR_GROUP_TIER_2_CONFIG_SUBPATH)
|
||||
#define TIER_3_DONATORS CONFIG_GET(DONATOR_GROUP_TIER_3_CONFIG_SUBPATH)
|
||||
|
||||
//flags
|
||||
#define DONATOR_GROUP_TIER_1 "T1"
|
||||
#define DONATOR_GROUP_TIER_2 "T2"
|
||||
#define DONATOR_GROUP_TIER_3 "T3"
|
||||
|
||||
#define IS_CKEY_DONATOR_GROUP(ckey, groupid) is_donator_group(ckey, groupid)
|
||||
@@ -25,7 +25,8 @@
|
||||
#define NOBLIUM_FORMATION_ENERGY 2e9 //1 Mole of Noblium takes the planck energy to condense.
|
||||
//Research point amounts
|
||||
#define NOBLIUM_RESEARCH_AMOUNT 1000
|
||||
#define BZ_RESEARCH_AMOUNT 150
|
||||
#define BZ_RESEARCH_SCALE 4
|
||||
#define BZ_RESEARCH_MAX_AMOUNT 400
|
||||
#define MIASMA_RESEARCH_AMOUNT 160
|
||||
#define STIMULUM_RESEARCH_AMOUNT 50
|
||||
//Plasma fusion properties
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
Current specifications:
|
||||
|
||||
Donator groups in __DEFINES/donator_groupings.dm, config entries in controllers/configuration/entries/donator.dm
|
||||
|
||||
3 groups, Tier 1/2/3
|
||||
Each tier includes the one before it (ascending)
|
||||
For fast lookups, this is generated using regenerate_donator_grouping_list()
|
||||
|
||||
*/
|
||||
|
||||
/proc/is_donator_group(ckey, group)
|
||||
ckey = ckey(ckey) //make sure it's ckey'd.
|
||||
var/list/L = GLOB.donators_by_group[group]
|
||||
return L && L.Find(ckey)
|
||||
|
||||
/proc/regenerate_donator_grouping_list()
|
||||
GLOB.donators_by_group = list() //reinit everything
|
||||
var/list/donator_list = GLOB.donators_by_group //cache
|
||||
var/list/tier_1 = TIER_1_DONATORS
|
||||
donator_list[DONATOR_GROUP_TIER_1] = tier_1.Copy() //The .Copy() is to "decouple"/make a new list, rather than letting the global list impact the config list.
|
||||
var/list/tier_2 = tier_1 + TIER_2_DONATORS //Using + on lists implies making new lists, so we don't need to manually Copy().
|
||||
donator_list[DONATOR_GROUP_TIER_2] = tier_2
|
||||
var/list/tier_3 = tier_2 + TIER_3_DONATORS
|
||||
donator_list[DONATOR_GROUP_TIER_3] = tier_3
|
||||
@@ -0,0 +1 @@
|
||||
GLOBAL_LIST_EMPTY(donators_by_group) //group id = donator list of ckeys
|
||||
@@ -19,6 +19,7 @@
|
||||
var/abstract_type = /datum/config_entry //do not instantiate if type matches this
|
||||
|
||||
var/vv_VAS = TRUE //Force validate and set on VV. VAS proccall guard will run regardless.
|
||||
var/postload_required = FALSE //requires running OnPostload()
|
||||
|
||||
var/dupes_allowed = FALSE
|
||||
|
||||
@@ -72,6 +73,9 @@
|
||||
/datum/config_entry/proc/DeprecationUpdate(value)
|
||||
return
|
||||
|
||||
/datum/config_entry/proc/OnPostload()
|
||||
return
|
||||
|
||||
/datum/config_entry/string
|
||||
config_entry_value = ""
|
||||
abstract_type = /datum/config_entry/string
|
||||
@@ -80,7 +84,7 @@
|
||||
/datum/config_entry/string/vv_edit_var(var_name, var_value)
|
||||
return var_name != "auto_trim" && ..()
|
||||
|
||||
/datum/config_entry/string/ValidateAndSet(str_val)
|
||||
/datum/config_entry/string/ValidateAndSet(str_val, during_load)
|
||||
if(!VASProcCallGuard(str_val))
|
||||
return FALSE
|
||||
config_entry_value = auto_trim ? trim(str_val) : str_val
|
||||
|
||||
@@ -101,6 +101,7 @@
|
||||
log_config("Loading config file [filename]...")
|
||||
var/list/lines = world.file2list("[directory]/[filename]")
|
||||
var/list/_entries = entries
|
||||
var/list/postload_required = list()
|
||||
for(var/L in lines)
|
||||
L = trim(L)
|
||||
if(!L)
|
||||
@@ -157,18 +158,24 @@
|
||||
else
|
||||
warning("[new_ver.type] is deprecated but gave no proper return for DeprecationUpdate()")
|
||||
|
||||
var/validated = E.ValidateAndSet(value)
|
||||
var/validated = E.ValidateAndSet(value, TRUE)
|
||||
if(!validated)
|
||||
log_config("Failed to validate setting \"[value]\" for [entry]")
|
||||
else
|
||||
if(E.modified && !E.dupes_allowed)
|
||||
log_config("Duplicate setting for [entry] ([value], [E.resident_file]) detected! Using latest.")
|
||||
if(E.postload_required)
|
||||
postload_required[E] = TRUE
|
||||
|
||||
E.resident_file = filename
|
||||
|
||||
if(validated)
|
||||
E.modified = TRUE
|
||||
|
||||
for(var/i in postload_required)
|
||||
var/datum/config_entry/E = i
|
||||
E.OnPostload()
|
||||
|
||||
++.
|
||||
|
||||
/datum/controller/configuration/can_vv_get(var_name)
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
/datum/config_entry/keyed_list/donator_group
|
||||
key_mode = KEY_MODE_TEXT
|
||||
value_mode = VALUE_MODE_FLAG
|
||||
abstract_type = /datum/config_entry/keyed_list/donator_group
|
||||
|
||||
//If we're in the middle of a config load, only do the regeneration afterwards to prevent this from wasting a massive amount of CPU for list regenerations.
|
||||
/datum/config_entry/keyed_list/donator_group/ValidateAndSet(str_val, during_load)
|
||||
. = ..()
|
||||
if(. && during_load)
|
||||
regenerate_donator_grouping_list()
|
||||
|
||||
/datum/config_entry/keyed_list/donator_group/OnPostload()
|
||||
. = ..()
|
||||
regenerate_donator_grouping_list()
|
||||
|
||||
//This is kinda weird in that the config entries are defined here but all the handling/calculations are in __HELPERS/donator_groupings.dm
|
||||
|
||||
/datum/config_entry/keyed_list/donator_group/tier_1_donators
|
||||
|
||||
/datum/config_entry/keyed_list/donator_group/tier_2_donators
|
||||
|
||||
/datum/config_entry/keyed_list/donator_group/tier_3_donators
|
||||
@@ -23,7 +23,7 @@ SUBSYSTEM_DEF(input)
|
||||
// This is for when macro sets are eventualy datumized
|
||||
/datum/controller/subsystem/input/proc/setup_default_macro_sets()
|
||||
var/list/static/default_macro_sets
|
||||
|
||||
|
||||
if(default_macro_sets)
|
||||
macro_sets = default_macro_sets
|
||||
return
|
||||
@@ -49,6 +49,7 @@ SUBSYSTEM_DEF(input)
|
||||
"old_hotkeys" = list(
|
||||
"Tab" = "\".winset \\\"mainwindow.macro=old_default input.focus=true input.background-color=[COLOR_INPUT_ENABLED]\\\"\"",
|
||||
"O" = "ooc",
|
||||
"L" = "looc",
|
||||
"T" = "say",
|
||||
"M" = "me",
|
||||
"Back" = "\".winset \\\"input.text=\\\"\\\"\\\"\"", // This makes it so backspace can remove default inputs
|
||||
|
||||
@@ -36,3 +36,4 @@
|
||||
/datum/component/storage/concrete/emergency/proc/unlock_me(datum/source)
|
||||
if(locked)
|
||||
set_locked(source, FALSE)
|
||||
return TRUE
|
||||
|
||||
+2
-2
@@ -21,8 +21,8 @@
|
||||
|
||||
/datum/ert/amber
|
||||
code = "Amber"
|
||||
leader_role = /datum/antagonist/ert/commander/red
|
||||
roles = list(/datum/antagonist/ert/security/red, /datum/antagonist/ert/medic/red, /datum/antagonist/ert/engineer/red)
|
||||
leader_role = /datum/antagonist/ert/commander/amber
|
||||
roles = list(/datum/antagonist/ert/security/amber, /datum/antagonist/ert/medic/amber, /datum/antagonist/ert/engineer/amber)
|
||||
|
||||
/datum/ert/red
|
||||
leader_role = /datum/antagonist/ert/commander/red
|
||||
|
||||
@@ -170,7 +170,7 @@
|
||||
tick_interval = 4
|
||||
alert_type = /obj/screen/alert/status_effect/his_grace
|
||||
var/bloodlust = 0
|
||||
|
||||
|
||||
/obj/screen/alert/status_effect/his_grace
|
||||
name = "His Grace"
|
||||
desc = "His Grace hungers, and you must feed Him."
|
||||
@@ -208,6 +208,7 @@
|
||||
owner.adjustToxLoss(-grace_heal, TRUE, TRUE)
|
||||
owner.adjustOxyLoss(-(grace_heal * 2))
|
||||
owner.adjustCloneLoss(-grace_heal)
|
||||
owner.adjustStaminaLoss(-(grace_heal * 25))
|
||||
|
||||
/datum/status_effect/his_grace/on_remove()
|
||||
owner.log_message("lost His Grace's stun immunity", LOG_ATTACK)
|
||||
|
||||
+1
-1
@@ -379,7 +379,7 @@
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_ACID_ACT, acidpwr, acid_volume)
|
||||
|
||||
/atom/proc/emag_act()
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
|
||||
return SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
|
||||
|
||||
/atom/proc/rad_act(strength)
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_RAD_ACT, strength)
|
||||
|
||||
@@ -193,8 +193,10 @@
|
||||
to_chat(usr, "<span class='warning'>Chem System Re-route detected, results may not be as expected!</span>")
|
||||
|
||||
/obj/machinery/sleeper/emag_act(mob/user)
|
||||
. = ..()
|
||||
scramble_chem_buttons()
|
||||
to_chat(user, "<span class='warning'>You scramble the sleeper's user interface!</span>")
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/sleeper/proc/inject_chem(chem, mob/user)
|
||||
if((chem in available_chems) && chem_allowed(chem))
|
||||
|
||||
@@ -177,7 +177,9 @@ GLOBAL_LIST_EMPTY(announcement_systems)
|
||||
act_up()
|
||||
|
||||
/obj/machinery/announcement_system/emag_act()
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
obj_flags |= EMAGGED
|
||||
act_up()
|
||||
return TRUE
|
||||
|
||||
@@ -101,12 +101,14 @@
|
||||
return ..()
|
||||
|
||||
/obj/machinery/button/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
req_access = list()
|
||||
req_one_access = list()
|
||||
playsound(src, "sparks", 100, 1)
|
||||
obj_flags |= EMAGGED
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/button/attack_ai(mob/user)
|
||||
if(!panel_open)
|
||||
|
||||
@@ -320,10 +320,12 @@
|
||||
return ..()
|
||||
|
||||
/obj/machinery/clonepod/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(!occupant)
|
||||
return
|
||||
to_chat(user, "<span class='warning'>You corrupt the genetic compiler.</span>")
|
||||
malfunction()
|
||||
return TRUE
|
||||
|
||||
//Put messages in the connected computer's temp var for display.
|
||||
/obj/machinery/clonepod/proc/connected_message(message)
|
||||
|
||||
@@ -185,15 +185,19 @@
|
||||
ui_interact(usr) //Refresh the UI after a filter changes
|
||||
|
||||
/obj/machinery/computer/apc_control/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(!authenticated)
|
||||
to_chat(user, "<span class='warning'>You bypass [src]'s access requirements using your emag.</span>")
|
||||
authenticated = TRUE
|
||||
log_activity("logged in")
|
||||
else if(!(obj_flags & EMAGGED))
|
||||
else
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
user.visible_message("<span class='warning'>You emag [src], disabling precise logging and allowing you to clear logs.</span>")
|
||||
log_game("[key_name(user)] emagged [src] at [AREACOORD(src)], disabling operator tracking.")
|
||||
obj_flags |= EMAGGED
|
||||
playsound(src, "sparks", 50, 1)
|
||||
playsound(src, "sparks", 50, 1)
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/computer/apc_control/proc/log_activity(log_text)
|
||||
var/op_string = operator && !(obj_flags & EMAGGED) ? operator : "\[NULL OPERATOR\]"
|
||||
|
||||
@@ -186,6 +186,7 @@
|
||||
|
||||
|
||||
/obj/machinery/computer/arcade/battle/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
to_chat(user, "<span class='warning'>A mesmerizing Rhumba beat starts playing from the arcade machine's speakers!</span>")
|
||||
@@ -202,5 +203,5 @@
|
||||
enemy_name = "Cuban Pete"
|
||||
name = "Outbomb Cuban Pete"
|
||||
|
||||
|
||||
updateUsrDialog()
|
||||
return TRUE
|
||||
@@ -284,6 +284,7 @@
|
||||
return
|
||||
|
||||
/obj/machinery/computer/arcade/minesweeper/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(CHECK_BITFIELD(obj_flags, EMAGGED))
|
||||
return
|
||||
desc = "An arcade machine that generates grids. It's clunking and sparking everywhere, almost as if threatening to explode at any moment!"
|
||||
@@ -298,6 +299,7 @@
|
||||
to_chat(user, "<span class='warning'>The machine buzzes and sparks... the game has been reset!</span>")
|
||||
playsound(user, 'sound/machines/buzz-sigh.ogg', 100, 0, extrarange = 3, falloff = 10) //Loud buzz
|
||||
game_status = MINESWEEPER_GAME_MAIN_MENU
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/computer/arcade/minesweeper/proc/custom_generation(mob/user)
|
||||
playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10) //Entered into the menu so ping sound
|
||||
|
||||
@@ -736,6 +736,7 @@
|
||||
desc = "Learn how our ancestors got to Orion, and have fun in the process!"
|
||||
|
||||
/obj/machinery/computer/arcade/orion_trail/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You override the cheat code menu and skip to Cheat #[rand(1, 50)]: Realism Mode.</span>")
|
||||
@@ -743,6 +744,7 @@
|
||||
desc = "Learn how our ancestors got to Orion, and try not to die in the process!"
|
||||
newgame()
|
||||
obj_flags |= EMAGGED
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/ranged/smg/orion
|
||||
name = "spaceport security"
|
||||
|
||||
@@ -432,6 +432,7 @@
|
||||
return ..()
|
||||
|
||||
/obj/machinery/computer/communications/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
obj_flags |= EMAGGED
|
||||
@@ -440,6 +441,7 @@
|
||||
authenticated = 2
|
||||
to_chat(user, "<span class='danger'>You scramble the communication routing circuits!</span>")
|
||||
playsound(src, 'sound/machines/terminal_alert.ogg', 50, 0)
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/computer/communications/ui_interact(mob/user)
|
||||
. = ..()
|
||||
|
||||
@@ -1280,20 +1280,23 @@
|
||||
return !density || (check_access(ID) && !locked && hasPower())
|
||||
|
||||
/obj/machinery/door/airlock/emag_act(mob/user)
|
||||
if(!operating && density && hasPower() && !(obj_flags & EMAGGED))
|
||||
operating = TRUE
|
||||
update_icon(AIRLOCK_EMAG, 1)
|
||||
sleep(6)
|
||||
if(QDELETED(src))
|
||||
return
|
||||
operating = FALSE
|
||||
if(!open())
|
||||
update_icon(AIRLOCK_CLOSED, 1)
|
||||
obj_flags |= EMAGGED
|
||||
lights = FALSE
|
||||
locked = TRUE
|
||||
loseMainPower()
|
||||
loseBackupPower()
|
||||
. = ..()
|
||||
if(operating || !density || !hasPower() || obj_flags & EMAGGED)
|
||||
return
|
||||
operating = TRUE
|
||||
update_icon(AIRLOCK_EMAG, 1)
|
||||
addtimer(CALLBACK(src, .proc/open_sesame), 6)
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/door/airlock/proc/open_sesame()
|
||||
operating = FALSE
|
||||
if(!open())
|
||||
update_icon(AIRLOCK_CLOSED, 1)
|
||||
obj_flags |= EMAGGED
|
||||
lights = FALSE
|
||||
locked = TRUE
|
||||
loseMainPower()
|
||||
loseBackupPower()
|
||||
|
||||
/obj/machinery/door/airlock/attack_alien(mob/living/carbon/alien/humanoid/user)
|
||||
add_fingerprint(user)
|
||||
|
||||
@@ -13,9 +13,6 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/machinery/door/unpowered/emag_act()
|
||||
return
|
||||
|
||||
/obj/machinery/door/unpowered/shuttle
|
||||
icon = 'icons/turf/shuttle.dmi'
|
||||
name = "door"
|
||||
|
||||
@@ -206,15 +206,20 @@
|
||||
..()
|
||||
|
||||
/obj/machinery/door/window/emag_act(mob/user)
|
||||
if(!operating && density && !(obj_flags & EMAGGED))
|
||||
obj_flags |= EMAGGED
|
||||
operating = TRUE
|
||||
flick("[src.base_state]spark", src)
|
||||
playsound(src, "sparks", 75, 1)
|
||||
sleep(6)
|
||||
operating = FALSE
|
||||
desc += "<BR><span class='warning'>Its access panel is smoking slightly.</span>"
|
||||
open(2)
|
||||
. = ..()
|
||||
if(operating || !density || obj_flags & EMAGGED)
|
||||
return
|
||||
obj_flags |= EMAGGED
|
||||
operating = TRUE
|
||||
flick("[src.base_state]spark", src)
|
||||
playsound(src, "sparks", 75, 1)
|
||||
addtimer(CALLBACK(src, .proc/open_windows_me), 6)
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/door/window/proc/open_windows_me()
|
||||
operating = FALSE
|
||||
desc += "<BR><span class='warning'>Its access panel is smoking slightly.</span>"
|
||||
open(2)
|
||||
|
||||
/obj/machinery/door/window/attackby(obj/item/I, mob/living/user, params)
|
||||
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
findObjsByTag()
|
||||
|
||||
/obj/machinery/doorButtons/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
obj_flags |= EMAGGED
|
||||
@@ -33,6 +34,7 @@
|
||||
req_one_access = list()
|
||||
playsound(src, "sparks", 100, 1)
|
||||
to_chat(user, "<span class='warning'>You short out the access controller.</span>")
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/doorButtons/proc/removeMe()
|
||||
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
alarm()
|
||||
|
||||
/obj/machinery/firealarm/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
obj_flags |= EMAGGED
|
||||
@@ -104,6 +105,7 @@
|
||||
user.visible_message("<span class='warning'>Sparks fly out of [src]!</span>",
|
||||
"<span class='notice'>You emag [src], disabling its thermal sensors.</span>")
|
||||
playsound(src, "sparks", 50, 1)
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/firealarm/temperature_expose(datum/gas_mixture/air, temperature, volume)
|
||||
if((temperature > T0C + 200 || temperature < BODYTEMP_COLD_DAMAGE_LIMIT) && (last_alarm+FIREALARM_COOLDOWN < world.time) && !(obj_flags & EMAGGED) && detecting && !stat)
|
||||
|
||||
@@ -24,10 +24,12 @@
|
||||
return ..()
|
||||
|
||||
/obj/machinery/gulag_item_reclaimer/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED) // emagging lets anyone reclaim all the items
|
||||
return
|
||||
req_access = list()
|
||||
obj_flags |= EMAGGED
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/gulag_item_reclaimer/attackby(obj/item/I, mob/user)
|
||||
if(istype(I, /obj/item/card/id))
|
||||
|
||||
@@ -158,11 +158,13 @@
|
||||
open_machine()
|
||||
|
||||
/obj/machinery/harvester/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
obj_flags |= EMAGGED
|
||||
allow_living = TRUE
|
||||
to_chat(user, "<span class='warning'>You overload [src]'s lifesign scanners.</span>")
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/harvester/container_resist(mob/living/user)
|
||||
if(!harvesting)
|
||||
|
||||
@@ -215,6 +215,7 @@
|
||||
return dat
|
||||
|
||||
/obj/machinery/limbgrower/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
for(var/id in SSresearch.techweb_designs)
|
||||
@@ -223,3 +224,4 @@
|
||||
stored_research.add_design(D)
|
||||
to_chat(user, "<span class='warning'>A warning flashes onto the screen, stating that safety overrides have been deactivated!</span>")
|
||||
obj_flags |= EMAGGED
|
||||
return TRUE
|
||||
|
||||
@@ -290,6 +290,7 @@
|
||||
return ..()
|
||||
|
||||
/obj/machinery/porta_turret/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
to_chat(user, "<span class='warning'>You short out [src]'s threat assessment circuits.</span>")
|
||||
@@ -300,6 +301,7 @@
|
||||
update_icon()
|
||||
sleep(60) //6 seconds for the traitor to gtfo of the area before the turret decides to ruin his shit
|
||||
on = TRUE //turns it back on. The cover popUp() popDown() are automatically called in process(), no need to define it here
|
||||
return TRUE
|
||||
|
||||
|
||||
/obj/machinery/porta_turret/emp_act(severity)
|
||||
@@ -837,6 +839,7 @@
|
||||
to_chat(user, "<span class='warning'>Access denied.</span>")
|
||||
|
||||
/obj/machinery/turretid/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
to_chat(user, "<span class='danger'>You short out the turret controls' access analysis module.</span>")
|
||||
@@ -844,6 +847,7 @@
|
||||
locked = FALSE
|
||||
if(user && user.machine == src)
|
||||
attack_hand(user)
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/turretid/attack_ai(mob/user)
|
||||
if(!ailock || IsAdminGhost(user))
|
||||
|
||||
@@ -86,10 +86,13 @@
|
||||
. = 0
|
||||
|
||||
/obj/machinery/porta_turret_cover/emag_act(mob/user)
|
||||
if(!(parent_turret.obj_flags & EMAGGED))
|
||||
to_chat(user, "<span class='notice'>You short out [parent_turret]'s threat assessment circuits.</span>")
|
||||
visible_message("[parent_turret] hums oddly...")
|
||||
parent_turret.obj_flags |= EMAGGED
|
||||
parent_turret.on = 0
|
||||
spawn(40)
|
||||
parent_turret.on = 1
|
||||
. = ..()
|
||||
if(parent_turret.obj_flags & EMAGGED)
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You short out [parent_turret]'s threat assessment circuits.</span>")
|
||||
visible_message("[parent_turret] hums oddly...")
|
||||
parent_turret.obj_flags |= EMAGGED
|
||||
parent_turret.on = 0
|
||||
spawn(40)
|
||||
parent_turret.on = 1
|
||||
return TRUE
|
||||
|
||||
@@ -65,6 +65,7 @@
|
||||
return ..()
|
||||
|
||||
/obj/machinery/recycler/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
obj_flags |= EMAGGED
|
||||
@@ -73,6 +74,7 @@
|
||||
update_icon()
|
||||
playsound(src, "sparks", 75, 1, -1)
|
||||
to_chat(user, "<span class='notice'>You use the cryptographic sequencer on [src].</span>")
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/recycler/update_icon()
|
||||
..()
|
||||
|
||||
@@ -195,6 +195,7 @@
|
||||
return ..()
|
||||
|
||||
/obj/machinery/shieldgen/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
to_chat(user, "<span class='warning'>The access controller is damaged!</span>")
|
||||
return
|
||||
@@ -202,6 +203,7 @@
|
||||
locked = FALSE
|
||||
playsound(src, "sparks", 100, 1)
|
||||
to_chat(user, "<span class='warning'>You short out the access controller.</span>")
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/shieldgen/update_icon()
|
||||
if(active)
|
||||
@@ -387,6 +389,7 @@
|
||||
add_fingerprint(user)
|
||||
|
||||
/obj/machinery/shieldwallgen/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
to_chat(user, "<span class='warning'>The access controller is damaged!</span>")
|
||||
return
|
||||
@@ -394,6 +397,7 @@
|
||||
locked = FALSE
|
||||
playsound(src, "sparks", 100, 1)
|
||||
to_chat(user, "<span class='warning'>You short out the access controller.</span>")
|
||||
return TRUE
|
||||
|
||||
//////////////Containment Field START
|
||||
/obj/machinery/shieldwall
|
||||
|
||||
@@ -99,6 +99,7 @@
|
||||
return ..()
|
||||
|
||||
/obj/machinery/computer/slot_machine/emag_act()
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
obj_flags |= EMAGGED
|
||||
@@ -106,6 +107,7 @@
|
||||
spark_system.set_up(4, 0, src.loc)
|
||||
spark_system.start()
|
||||
playsound(src, "sparks", 50, 1)
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/computer/slot_machine/ui_interact(mob/living/user)
|
||||
. = ..()
|
||||
|
||||
@@ -42,21 +42,23 @@
|
||||
return ..()
|
||||
|
||||
/obj/machinery/computer/message_monitor/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
if(!isnull(linkedServer))
|
||||
obj_flags |= EMAGGED
|
||||
screen = 2
|
||||
spark_system.set_up(5, 0, src)
|
||||
spark_system.start()
|
||||
var/obj/item/paper/monitorkey/MK = new(loc, linkedServer)
|
||||
// Will help make emagging the console not so easy to get away with.
|
||||
MK.info += "<br><br><font color='red'>�%@%(*$%&(�&?*(%&�/{}</font>"
|
||||
var/time = 100 * length(linkedServer.decryptkey)
|
||||
addtimer(CALLBACK(src, .proc/UnmagConsole), time)
|
||||
message = rebootmsg
|
||||
else
|
||||
if(isnull(linkedServer))
|
||||
to_chat(user, "<span class='notice'>A no server error appears on the screen.</span>")
|
||||
return
|
||||
obj_flags |= EMAGGED
|
||||
screen = 2
|
||||
spark_system.set_up(5, 0, src)
|
||||
spark_system.start()
|
||||
var/obj/item/paper/monitorkey/MK = new(loc, linkedServer)
|
||||
// Will help make emagging the console not so easy to get away with.
|
||||
MK.info += "<br><br><font color='red'>�%@%(*$%&(�&?*(%&�/{}</font>"
|
||||
var/time = 100 * length(linkedServer.decryptkey)
|
||||
addtimer(CALLBACK(src, .proc/UnmagConsole), time)
|
||||
message = rebootmsg
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/computer/message_monitor/New()
|
||||
. = ..()
|
||||
|
||||
@@ -64,10 +64,15 @@
|
||||
|
||||
|
||||
/obj/machinery/mecha_part_fabricator/emag_act()
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
obj_flags |= EMAGGED
|
||||
req_access = list()
|
||||
INVOKE_ASYNC(src, .proc/error_action_sucessful)
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/mecha_part_fabricator/proc/error_action_sucessful()
|
||||
say("DB error \[Code 0x00F1\]")
|
||||
sleep(10)
|
||||
say("Attempting auto-repair...")
|
||||
|
||||
@@ -134,12 +134,14 @@ RSF
|
||||
return
|
||||
|
||||
/obj/item/cookiesynth/emag_act(mob/user)
|
||||
. = ..()
|
||||
obj_flags ^= EMAGGED
|
||||
if(obj_flags & EMAGGED)
|
||||
to_chat(user, "<span class='warning'>You short out [src]'s reagent safety checker!</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You reset [src]'s reagent safety checker!</span>")
|
||||
toxin = 0
|
||||
toxin = FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/item/cookiesynth/attack_self(mob/user)
|
||||
var/mob/living/silicon/robot/P = null
|
||||
|
||||
@@ -93,34 +93,22 @@
|
||||
/obj/item/card/emag/afterattack(atom/target, mob/user, proximity)
|
||||
. = ..()
|
||||
var/atom/A = target
|
||||
if(!proximity && prox_check)
|
||||
if(!proximity && prox_check || !(isobj(A) || issilicon(A) || isbot(A) || isdrone(A)))
|
||||
return
|
||||
if(istype(A, /obj/item/storage) && !(istype(A, /obj/item/storage/lockbox) || istype(A, /obj/item/storage/pod)))
|
||||
return
|
||||
//Citadel changes: modular code misfiring, so we're bypassing into main code.
|
||||
if(!uses)
|
||||
user.visible_message("<span class='warning'>[src] emits a weak spark. It's burnt out!</span>")
|
||||
playsound(src, 'sound/effects/light_flicker.ogg', 100, 1)
|
||||
return
|
||||
else if(uses <= 3)
|
||||
playsound(src, 'sound/effects/light_flicker.ogg', 30, 1) //Tiiiiiiny warning sound to let ya know your emag's almost dead
|
||||
|
||||
if(isturf(A))
|
||||
if(!A.emag_act(user))
|
||||
return
|
||||
if(istype(A,/obj/item/storage/lockbox) || istype(A, /obj/item/storage/pod))
|
||||
A.emag_act(user)
|
||||
uses = max(uses - 1, 0)
|
||||
if(!uses)
|
||||
user.visible_message("<span class='warning'>[src] fizzles and sparks. It seems like it's out of charges.</span>")
|
||||
playsound(src, 'sound/effects/light_flicker.ogg', 100, 1)
|
||||
if(istype(A,/obj/item/storage))
|
||||
return
|
||||
if(!(isobj(A) || issilicon(A) || isbot(A) || isdrone(A)))
|
||||
return
|
||||
else
|
||||
A.emag_act(user)
|
||||
uses = max(uses - 1, 0)
|
||||
if(!uses)
|
||||
user.visible_message("<span class='warning'>[src] fizzles and sparks. It seems like it's out of charges.</span>")
|
||||
playsound(src, 'sound/effects/light_flicker.ogg', 100, 1)
|
||||
uses = max(uses - 1, 0)
|
||||
if(!uses)
|
||||
user.visible_message("<span class='warning'>[src] fizzles and sparks. It seems like it's out of charges.</span>")
|
||||
playsound(src, 'sound/effects/light_flicker.ogg', 100, 1)
|
||||
|
||||
|
||||
/obj/item/card/emagfake
|
||||
|
||||
@@ -764,20 +764,22 @@ CIGARETTE PACKETS ARE IN FANCY.DM
|
||||
..()
|
||||
|
||||
/obj/item/clothing/mask/vape/emag_act(mob/user)// I WON'T REGRET WRITTING THIS, SURLY.
|
||||
if(screw)
|
||||
if(!(obj_flags & EMAGGED))
|
||||
cut_overlays()
|
||||
obj_flags |= EMAGGED
|
||||
super = FALSE
|
||||
to_chat(user, "<span class='warning'>You maximize the voltage of [src].</span>")
|
||||
add_overlay("vapeopen_high")
|
||||
var/datum/effect_system/spark_spread/sp = new /datum/effect_system/spark_spread //for effect
|
||||
sp.set_up(5, 1, src)
|
||||
sp.start()
|
||||
else
|
||||
to_chat(user, "<span class='warning'>[src] is already emagged!</span>")
|
||||
else
|
||||
. = ..()
|
||||
if(!screw)
|
||||
to_chat(user, "<span class='notice'>You need to open the cap to do that.</span>")
|
||||
return
|
||||
if(obj_flags & EMAGGED)
|
||||
to_chat(user, "<span class='warning'>[src] is already emagged!</span>")
|
||||
return
|
||||
cut_overlays()
|
||||
obj_flags |= EMAGGED
|
||||
super = FALSE
|
||||
to_chat(user, "<span class='warning'>You maximize the voltage of [src].</span>")
|
||||
add_overlay("vapeopen_high")
|
||||
var/datum/effect_system/spark_spread/sp = new /datum/effect_system/spark_spread //for effect
|
||||
sp.set_up(5, 1, src)
|
||||
sp.start()
|
||||
return TRUE
|
||||
|
||||
/obj/item/clothing/mask/vape/attack_self(mob/user)
|
||||
if(reagents.total_volume > 0)
|
||||
|
||||
@@ -217,10 +217,13 @@
|
||||
to_chat(user, "<span class='notice'>The spectrum chip is unresponsive.</span>")
|
||||
|
||||
/obj/item/circuitboard/computer/cargo/emag_act(mob/living/user)
|
||||
if(!(obj_flags & EMAGGED))
|
||||
contraband = TRUE
|
||||
obj_flags |= EMAGGED
|
||||
to_chat(user, "<span class='notice'>You adjust [src]'s routing and receiver spectrum, unlocking special supplies and contraband.</span>")
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
contraband = TRUE
|
||||
obj_flags |= EMAGGED
|
||||
to_chat(user, "<span class='notice'>You adjust [src]'s routing and receiver spectrum, unlocking special supplies and contraband.</span>")
|
||||
return TRUE
|
||||
|
||||
/obj/item/circuitboard/computer/cargo/express
|
||||
name = "Express Supply Console (Computer Board)"
|
||||
@@ -234,8 +237,12 @@
|
||||
obj_flags &= ~EMAGGED
|
||||
|
||||
/obj/item/circuitboard/computer/cargo/express/emag_act(mob/living/user)
|
||||
to_chat(user, "<span class='notice'>You change the routing protocols, allowing the Drop Pod to land anywhere on the station.</span>")
|
||||
obj_flags |= EMAGGED
|
||||
. = SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You change the routing protocols, allowing the Drop Pod to land anywhere on the station.</span>")
|
||||
obj_flags |= EMAGGED
|
||||
return TRUE
|
||||
|
||||
/obj/item/circuitboard/computer/cargo/request
|
||||
name = "Supply Request Console (Computer Board)"
|
||||
|
||||
@@ -140,12 +140,10 @@
|
||||
return ..()
|
||||
|
||||
/obj/item/defibrillator/emag_act(mob/user)
|
||||
if(safety)
|
||||
safety = FALSE
|
||||
to_chat(user, "<span class='warning'>You silently disable [src]'s safety protocols with the cryptographic sequencer.</span>")
|
||||
else
|
||||
safety = TRUE
|
||||
to_chat(user, "<span class='notice'>You silently enable [src]'s safety protocols with the cryptographic sequencer.</span>")
|
||||
. = ..()
|
||||
safety = !safety
|
||||
to_chat(user, "<span class='warning'>You silently [safety ? "enable" : "disable"] [src]'s safety protocols with the cryptographic sequencer.</span>")
|
||||
return TRUE
|
||||
|
||||
/obj/item/defibrillator/emp_act(severity)
|
||||
. = ..()
|
||||
|
||||
@@ -192,13 +192,15 @@
|
||||
update_icon()
|
||||
|
||||
/obj/item/geiger_counter/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
if(scanning)
|
||||
to_chat(user, "<span class='warning'>Turn off [src] before you perform this action!</span>")
|
||||
return 0
|
||||
return
|
||||
to_chat(user, "<span class='warning'>You override [src]'s radiation storing protocols. It will now generate small doses of radiation, and stored rads are now projected into creatures you scan.</span>")
|
||||
obj_flags |= EMAGGED
|
||||
return TRUE
|
||||
|
||||
/obj/item/geiger_counter/cyborg
|
||||
var/datum/component/mobhook
|
||||
|
||||
@@ -149,9 +149,11 @@
|
||||
to_chat(user, "<span class='notice'>You fill \the [src] with lights from \the [S]. " + status_string() + "</span>")
|
||||
|
||||
/obj/item/lightreplacer/emag_act()
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
Emag()
|
||||
return TRUE
|
||||
|
||||
/obj/item/lightreplacer/attack_self(mob/user)
|
||||
to_chat(user, status_string())
|
||||
|
||||
@@ -38,11 +38,13 @@
|
||||
speech_args[SPEECH_SPANS] |= voicespan
|
||||
|
||||
/obj/item/megaphone/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
to_chat(user, "<span class='warning'>You overload \the [src]'s voice synthesizer.</span>")
|
||||
obj_flags |= EMAGGED
|
||||
voicespan = list(SPAN_REALLYBIG, "userdanger")
|
||||
return TRUE
|
||||
|
||||
/obj/item/megaphone/sec
|
||||
name = "security megaphone"
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
lefthand_file = 'icons/mob/inhands/equipment/toolbox_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/toolbox_righthand.dmi'
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
w_class = WEIGHT_CLASS_GIGANTIC
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
force = 12
|
||||
total_mass = TOTAL_MASS_NORMAL_ITEM // average toolbox
|
||||
attack_verb = list("robusted")
|
||||
|
||||
@@ -704,8 +704,8 @@
|
||||
name = "egyptian staff"
|
||||
desc = "A tutorial in mummification is carved into the staff. You could probably craft the wraps if you had some cloth."
|
||||
icon = 'icons/obj/guns/magic.dmi'
|
||||
icon_state = "pharoah_sceptre"
|
||||
item_state = "pharoah_sceptre"
|
||||
icon_state = "pharaoh_sceptre"
|
||||
item_state = "pharaoh_sceptre"
|
||||
lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi'
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
|
||||
@@ -282,11 +282,13 @@
|
||||
var/cooldown = 0
|
||||
|
||||
/obj/item/harmalarm/emag_act(mob/user)
|
||||
. = ..()
|
||||
obj_flags ^= EMAGGED
|
||||
if(obj_flags & EMAGGED)
|
||||
to_chat(user, "<font color='red'>You short out the safeties on [src]!</font>")
|
||||
else
|
||||
to_chat(user, "<font color='red'>You reset the safeties on [src]!</font>")
|
||||
return TRUE
|
||||
|
||||
/obj/item/harmalarm/attack_self(mob/user)
|
||||
var/safety = !(obj_flags & EMAGGED)
|
||||
|
||||
@@ -407,6 +407,7 @@
|
||||
new /obj/item/stack/cable_coil/random(src)
|
||||
new /obj/item/wirecutters(src)
|
||||
new /obj/item/multitool(src)
|
||||
new /obj/item/pipe_dispenser(src)
|
||||
|
||||
/obj/item/storage/backpack/duffelbag/clown
|
||||
name = "clown's duffel bag"
|
||||
|
||||
@@ -40,9 +40,18 @@
|
||||
|
||||
/obj/item/storage/briefcase/lawyer/family
|
||||
name = "battered briefcase"
|
||||
desc = "An old briefcase, this one has seen better days in its time. It's clear they don't make them nowadays as good as they used to. Comes with an added belt clip!"
|
||||
icon_state = "gbriefcase"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/briefcase_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/briefcase_righthand.dmi'
|
||||
desc = "An old briefcase with a golden trim. It's clear they don't make them as good as they used to. Comes with an added belt clip!"
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
|
||||
/obj/item/storage/briefcase/lawyer/family/ComponentInitialize()
|
||||
. = ..()
|
||||
GET_COMPONENT(STR, /datum/component/storage)
|
||||
STR.max_w_class = WEIGHT_CLASS_NORMAL
|
||||
STR.max_combined_w_class = 14
|
||||
|
||||
/obj/item/storage/briefcase/lawyer/family/PopulateContents()
|
||||
new /obj/item/stamp/law(src)
|
||||
new /obj/item/pen/fountain(src)
|
||||
|
||||
@@ -48,14 +48,16 @@
|
||||
to_chat(user, "<span class='danger'>It's locked!</span>")
|
||||
|
||||
/obj/item/storage/lockbox/emag_act(mob/user)
|
||||
if(!broken)
|
||||
broken = TRUE
|
||||
SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SET_LOCKSTATE, FALSE)
|
||||
desc += "It appears to be broken."
|
||||
icon_state = src.icon_broken
|
||||
if(user)
|
||||
visible_message("<span class='warning'>\The [src] has been broken by [user] with an electromagnetic card!</span>")
|
||||
return
|
||||
. = ..()
|
||||
if(broken)
|
||||
return
|
||||
broken = TRUE
|
||||
SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SET_LOCKSTATE, FALSE)
|
||||
desc += "It appears to be broken."
|
||||
icon_state = src.icon_broken
|
||||
if(user)
|
||||
visible_message("<span class='warning'>\The [src] has been broken by [user] with an electromagnetic card!</span>")
|
||||
return TRUE
|
||||
|
||||
/obj/item/storage/lockbox/Entered()
|
||||
. = ..()
|
||||
|
||||
@@ -36,7 +36,8 @@
|
||||
/obj/item/reagent_containers/syringe,
|
||||
/obj/item/screwdriver,
|
||||
/obj/item/valentine,
|
||||
/obj/item/stamp))
|
||||
/obj/item/stamp,
|
||||
/obj/item/key))
|
||||
|
||||
/obj/item/storage/wallet/Exited(atom/movable/AM)
|
||||
. = ..()
|
||||
@@ -60,7 +61,7 @@
|
||||
/obj/item/storage/wallet/update_icon()
|
||||
var/new_state = "wallet"
|
||||
if(front_id)
|
||||
new_state = "wallet_[front_id.icon_state]"
|
||||
new_state = "wallet_id"
|
||||
if(new_state != icon_state) //avoid so many icon state changes.
|
||||
icon_state = new_state
|
||||
|
||||
|
||||
@@ -229,7 +229,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
|
||||
/obj/item/katana/cursed
|
||||
slot_flags = null
|
||||
|
||||
/obj/item/katana/Initialize()
|
||||
/obj/item/katana/cursed/Initialize()
|
||||
. = ..()
|
||||
ADD_TRAIT(src, TRAIT_NODROP, CURSED_ITEM_TRAIT)
|
||||
|
||||
|
||||
@@ -112,12 +112,16 @@
|
||||
|
||||
|
||||
/obj/structure/sign/barsign/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(broken || (obj_flags & EMAGGED))
|
||||
to_chat(user, "<span class='warning'>Nothing interesting happens!</span>")
|
||||
return
|
||||
obj_flags |= EMAGGED
|
||||
to_chat(user, "<span class='notice'>You emag the barsign. Takeover in progress...</span>")
|
||||
sleep(10 SECONDS)
|
||||
addtimer(CALLBACK(src, .proc/syndie_bar_good), 10 SECONDS)
|
||||
return TRUE
|
||||
|
||||
/obj/structure/sign/barsign/proc/syndie_bar_good()
|
||||
set_sign(new /datum/barsign/hiddensigns/syndibarsign)
|
||||
req_access = list(ACCESS_SYNDICATE)
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -54,12 +54,16 @@
|
||||
only_current_user_can_interact = TRUE
|
||||
|
||||
/obj/machinery/vr_sleeper/hugbox/emag_act(mob/user)
|
||||
return
|
||||
return SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
|
||||
|
||||
/obj/machinery/vr_sleeper/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(you_die_in_the_game_you_die_for_real)
|
||||
return
|
||||
you_die_in_the_game_you_die_for_real = TRUE
|
||||
sparks.start()
|
||||
addtimer(CALLBACK(src, .proc/emagNotify), 150)
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/vr_sleeper/update_icon()
|
||||
icon_state = "[initial(icon_state)][state_open ? "-open" : ""]"
|
||||
|
||||
@@ -286,14 +286,14 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
|
||||
/obj/effect/rune/convert/proc/optinalert(mob/living/convertee)
|
||||
var/alert = alert(convertee, "Will you embrace the Geometer of Blood or perish in futile resistance?", "Choose your own fate", "Join the Blood Cult", "Suffer a horrible demise")
|
||||
if(alert == "Join the Blood Cult")
|
||||
if(src && alert == "Join the Blood Cult")
|
||||
signmeup(convertee)
|
||||
|
||||
/obj/effect/rune/convert/proc/signmeup(mob/living/convertee)
|
||||
if(currentconversionman == usr)
|
||||
if(currentconversionman == convertee)
|
||||
conversionresult = TRUE
|
||||
else
|
||||
to_chat(usr, "<span class='cult italic'>Your fate has already been set in stone.</span>")
|
||||
to_chat(convertee, "<span class='cult italic'>Your fate has already been set in stone.</span>")
|
||||
|
||||
/obj/effect/rune/convert/proc/do_sacrifice(mob/living/sacrificial, list/invokers, force_a_sac)
|
||||
var/mob/living/first_invoker = invokers[1]
|
||||
|
||||
@@ -36,30 +36,42 @@
|
||||
|
||||
/datum/antagonist/ert/security // kinda handled by the base template but here for completion
|
||||
|
||||
/datum/antagonist/ert/security/red
|
||||
/datum/antagonist/ert/security/amber
|
||||
outfit = /datum/outfit/ert/security/alert
|
||||
|
||||
/datum/antagonist/ert/security/red
|
||||
outfit = /datum/outfit/ert/security/alert/red
|
||||
|
||||
/datum/antagonist/ert/engineer
|
||||
role = "Engineer"
|
||||
outfit = /datum/outfit/ert/engineer
|
||||
|
||||
/datum/antagonist/ert/engineer/red
|
||||
/datum/antagonist/ert/engineer/amber
|
||||
outfit = /datum/outfit/ert/engineer/alert
|
||||
|
||||
/datum/antagonist/ert/engineer/red
|
||||
outfit = /datum/outfit/ert/engineer/alert/red
|
||||
|
||||
/datum/antagonist/ert/medic
|
||||
role = "Medical Officer"
|
||||
outfit = /datum/outfit/ert/medic
|
||||
|
||||
/datum/antagonist/ert/medic/red
|
||||
/datum/antagonist/ert/medic/amber
|
||||
outfit = /datum/outfit/ert/medic/alert
|
||||
|
||||
/datum/antagonist/ert/medic/red
|
||||
outfit = /datum/outfit/ert/medic/alert/red
|
||||
|
||||
/datum/antagonist/ert/commander
|
||||
role = "Commander"
|
||||
outfit = /datum/outfit/ert/commander
|
||||
|
||||
/datum/antagonist/ert/commander/red
|
||||
/datum/antagonist/ert/commander/amber
|
||||
outfit = /datum/outfit/ert/commander/alert
|
||||
|
||||
/datum/antagonist/ert/commander/red
|
||||
outfit = /datum/outfit/ert/commander/alert/red
|
||||
|
||||
/datum/antagonist/ert/deathsquad
|
||||
name = "Deathsquad Trooper"
|
||||
outfit = /datum/outfit/death_commando
|
||||
|
||||
@@ -364,15 +364,10 @@
|
||||
var/list/cached_gases = air.gases
|
||||
var/temperature = air.temperature
|
||||
var/pressure = air.return_pressure()
|
||||
|
||||
var/old_heat_capacity = air.heat_capacity()
|
||||
var/reaction_efficency = min(1/((pressure/(0.1*ONE_ATMOSPHERE))*(max(cached_gases[/datum/gas/plasma]/cached_gases[/datum/gas/nitrous_oxide],1))),cached_gases[/datum/gas/nitrous_oxide],cached_gases[/datum/gas/plasma]/2)
|
||||
var/energy_released = 2*reaction_efficency*FIRE_CARBON_ENERGY_RELEASED
|
||||
if(cached_gases[/datum/gas/miasma] && cached_gases[/datum/gas/miasma] > 0)
|
||||
energy_released /= cached_gases[/datum/gas/miasma]*0.1
|
||||
if(cached_gases[/datum/gas/bz] && cached_gases[/datum/gas/bz] > 0)
|
||||
energy_released *= cached_gases[/datum/gas/bz]*0.1
|
||||
if ((cached_gases[/datum/gas/nitrous_oxide] - reaction_efficency < 0 )|| (cached_gases[/datum/gas/plasma] - (2*reaction_efficency) < 0)) //Shouldn't produce gas from nothing.
|
||||
if ((cached_gases[/datum/gas/nitrous_oxide] - reaction_efficency < 0 )|| (cached_gases[/datum/gas/plasma] - (2*reaction_efficency) < 0) || energy_released <= 0) //Shouldn't produce gas from nothing.
|
||||
return NO_REACTION
|
||||
cached_gases[/datum/gas/bz] += reaction_efficency
|
||||
if(reaction_efficency == cached_gases[/datum/gas/nitrous_oxide])
|
||||
@@ -381,7 +376,7 @@
|
||||
cached_gases[/datum/gas/nitrous_oxide] -= reaction_efficency
|
||||
cached_gases[/datum/gas/plasma] -= 2*reaction_efficency
|
||||
|
||||
SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, (reaction_efficency**0.5)*BZ_RESEARCH_AMOUNT)
|
||||
SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, min((reaction_efficency**2)*BZ_RESEARCH_SCALE),BZ_RESEARCH_MAX_AMOUNT)
|
||||
|
||||
if(energy_released > 0)
|
||||
var/new_heat_capacity = air.heat_capacity()
|
||||
@@ -477,4 +472,4 @@
|
||||
|
||||
//Possibly burning a bit of organic matter through maillard reaction, so a *tiny* bit more heat would be understandable
|
||||
air.temperature += cleaned_air * 0.002
|
||||
SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, cleaned_air*MIASMA_RESEARCH_AMOUNT)//Turns out the burning of miasma is kinda interesting to scientists
|
||||
SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, cleaned_air*MIASMA_RESEARCH_AMOUNT)//Turns out the burning of miasma is kinda interesting to scientists
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -36,6 +36,7 @@
|
||||
cat |= EXPORT_EMAG
|
||||
|
||||
/obj/machinery/computer/cargo/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
user.visible_message("<span class='warning'>[user] swipes a suspicious card through [src]!</span>",
|
||||
@@ -48,6 +49,8 @@
|
||||
var/obj/item/circuitboard/computer/cargo/board = circuit
|
||||
board.contraband = TRUE
|
||||
board.obj_flags |= EMAGGED
|
||||
req_access = list()
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/computer/cargo/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
|
||||
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
|
||||
|
||||
@@ -54,6 +54,7 @@
|
||||
..()
|
||||
|
||||
/obj/machinery/computer/cargo/express/emag_act(mob/living/user)
|
||||
. = SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
user.visible_message("<span class='warning'>[user] swipes a suspicious card through [src]!</span>",
|
||||
@@ -63,6 +64,8 @@
|
||||
var/obj/item/circuitboard/computer/cargo/board = circuit
|
||||
board.obj_flags |= EMAGGED
|
||||
packin_up()
|
||||
req_access = list()
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/computer/cargo/express/proc/packin_up() // oh shit, I'm sorry
|
||||
meme_pack_data = list() // sorry for what?
|
||||
|
||||
@@ -919,11 +919,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "<td width=80%><font size=2><b>Description</b></font></td></tr>"
|
||||
for(var/j in GLOB.loadout_items[gear_tab])
|
||||
var/datum/gear/gear = GLOB.loadout_items[gear_tab][j]
|
||||
var/donoritem
|
||||
if(gear.ckeywhitelist && gear.ckeywhitelist.len)
|
||||
donoritem = TRUE
|
||||
if(!(user.ckey in gear.ckeywhitelist))
|
||||
continue
|
||||
var/donoritem = gear.donoritem
|
||||
if(donoritem && !gear.donator_ckey_check(user.ckey))
|
||||
continue
|
||||
var/class_link = ""
|
||||
if(gear.type in chosen_gear)
|
||||
class_link = "style='white-space:normal;' class='linkOn' href='?_src_=prefs;preference=gear;toggle_gear_path=[html_encode(j)];toggle_gear=0'"
|
||||
@@ -2245,7 +2243,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
if(!is_loadout_slot_available(G.category))
|
||||
to_chat(user, "<span class='danger'>You cannot take this loadout, as you've already chosen too many of the same category!</span>")
|
||||
return
|
||||
if(G.ckeywhitelist && G.ckeywhitelist.len && !(user.ckey in G.ckeywhitelist))
|
||||
if(G.donoritem && !G.donator_ckey_check(user.ckey))
|
||||
to_chat(user, "<span class='danger'>This is an item intended for donator use only. You are not authorized to use this item.</span>")
|
||||
return
|
||||
if(gear_points >= initial(G.cost))
|
||||
|
||||
@@ -24,11 +24,13 @@
|
||||
desc = "[desc] The display is flickering slightly."
|
||||
|
||||
/obj/item/clothing/glasses/hud/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
obj_flags |= EMAGGED
|
||||
to_chat(user, "<span class='warning'>PZZTTPFFFT</span>")
|
||||
desc = "[desc] The display is flickering slightly."
|
||||
return TRUE
|
||||
|
||||
/obj/item/clothing/glasses/hud/health
|
||||
name = "health scanner HUD"
|
||||
|
||||
@@ -312,8 +312,8 @@
|
||||
/obj/item/clothing/head/pharaoh
|
||||
name = "pharaoh hat"
|
||||
desc = "Walk like an Egyptian."
|
||||
icon_state = "pharoah_hat"
|
||||
icon_state = "pharoah_hat"
|
||||
icon_state = "pharaoh_hat"
|
||||
icon_state = "pharaoh_hat"
|
||||
|
||||
/obj/item/clothing/head/jester/alt
|
||||
name = "jester hat"
|
||||
|
||||
@@ -69,12 +69,14 @@
|
||||
|
||||
/obj/item/clothing/mask/gas/sechailer/attack_self()
|
||||
halt()
|
||||
/obj/item/clothing/mask/gas/sechailer/emag_act(mob/user as mob)
|
||||
if(safety)
|
||||
safety = FALSE
|
||||
to_chat(user, "<span class='warning'>You silently fry [src]'s vocal circuit with the cryptographic sequencer.</span>")
|
||||
else
|
||||
|
||||
/obj/item/clothing/mask/gas/sechailer/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(!safety)
|
||||
return
|
||||
safety = FALSE
|
||||
to_chat(user, "<span class='warning'>You silently fry [src]'s vocal circuit with the cryptographic sequencer.</span>")
|
||||
return TRUE
|
||||
|
||||
/obj/item/clothing/mask/gas/sechailer/verb/halt()
|
||||
set category = "Object"
|
||||
|
||||
@@ -45,16 +45,23 @@
|
||||
R.recalculateChannels()
|
||||
|
||||
/datum/outfit/ert/commander/alert
|
||||
name = "ERT Commander - High Alert"
|
||||
name = "ERT Commander - Amber Alert"
|
||||
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/ert/alert
|
||||
glasses = /obj/item/clothing/glasses/thermal/eyepatch
|
||||
backpack_contents = list(/obj/item/storage/box/engineer=1,\
|
||||
/obj/item/melee/baton/loaded=1,\
|
||||
/obj/item/clothing/mask/gas/sechailer/swat=1,\
|
||||
/obj/item/gun/energy/pulse/pistol/loyalpin=1)
|
||||
/obj/item/gun/energy/e_gun=1)
|
||||
l_pocket = /obj/item/melee/transforming/energy/sword/saber
|
||||
|
||||
/datum/outfit/ert/commander/alert/red
|
||||
name = "ERT Commander - Red Alert"
|
||||
backpack_contents = list(/obj/item/storage/box/engineer=1,\
|
||||
/obj/item/melee/baton/loaded=1,\
|
||||
/obj/item/clothing/mask/gas/sechailer/swat=1,\
|
||||
/obj/item/gun/energy/pulse/pistol/loyalpin=1)
|
||||
|
||||
/datum/outfit/ert/security
|
||||
name = "ERT Security"
|
||||
|
||||
@@ -80,15 +87,22 @@
|
||||
R.recalculateChannels()
|
||||
|
||||
/datum/outfit/ert/security/alert
|
||||
name = "ERT Security - High Alert"
|
||||
name = "ERT Security - Amber Alert"
|
||||
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/ert/alert/sec
|
||||
backpack_contents = list(/obj/item/storage/box/engineer=1,\
|
||||
/obj/item/storage/box/handcuffs=1,\
|
||||
/obj/item/clothing/mask/gas/sechailer/swat=1,\
|
||||
/obj/item/melee/baton/loaded=1,\
|
||||
/obj/item/gun/energy/pulse/carbine/loyalpin=1)
|
||||
/obj/item/gun/energy/e_gun/stun=1)
|
||||
|
||||
/datum/outfit/ert/security/alert/red
|
||||
name = "ERT Security - Red Alert"
|
||||
backpack_contents = list(/obj/item/storage/box/engineer=1,\
|
||||
/obj/item/storage/box/handcuffs=1,\
|
||||
/obj/item/clothing/mask/gas/sechailer/swat=1,\
|
||||
/obj/item/melee/baton/loaded=1,\
|
||||
/obj/item/gun/energy/pulse/carbine/loyalpin=1)
|
||||
|
||||
/datum/outfit/ert/medic
|
||||
name = "ERT Medic"
|
||||
@@ -117,9 +131,18 @@
|
||||
R.recalculateChannels()
|
||||
|
||||
/datum/outfit/ert/medic/alert
|
||||
name = "ERT Medic - High Alert"
|
||||
name = "ERT Medic - Amber Alert"
|
||||
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/ert/alert/med
|
||||
backpack_contents = list(/obj/item/storage/box/engineer=1,\
|
||||
/obj/item/melee/baton/loaded=1,\
|
||||
/obj/item/clothing/mask/gas/sechailer/swat=1,\
|
||||
/obj/item/gun/energy/e_gun=1,\
|
||||
/obj/item/reagent_containers/hypospray/combat/nanites=1,\
|
||||
/obj/item/gun/medbeam=1)
|
||||
|
||||
/datum/outfit/ert/medic/alert/red
|
||||
name = "ERT Medic - Red Alert"
|
||||
backpack_contents = list(/obj/item/storage/box/engineer=1,\
|
||||
/obj/item/melee/baton/loaded=1,\
|
||||
/obj/item/clothing/mask/gas/sechailer/swat=1,\
|
||||
@@ -154,9 +177,17 @@
|
||||
R.recalculateChannels()
|
||||
|
||||
/datum/outfit/ert/engineer/alert
|
||||
name = "ERT Engineer - High Alert"
|
||||
name = "ERT Engineer - Amber Alert"
|
||||
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/ert/alert/engi
|
||||
backpack_contents = list(/obj/item/storage/box/engineer=1,\
|
||||
/obj/item/melee/baton/loaded=1,\
|
||||
/obj/item/clothing/mask/gas/sechailer/swat=1,\
|
||||
/obj/item/gun/energy/e_gun=1,\
|
||||
/obj/item/construction/rcd/combat=1)
|
||||
|
||||
/datum/outfit/ert/engineer/alert/red
|
||||
name = "ERT Engineer - Red Alert"
|
||||
backpack_contents = list(/obj/item/storage/box/engineer=1,\
|
||||
/obj/item/melee/baton/loaded=1,\
|
||||
/obj/item/clothing/mask/gas/sechailer/swat=1,\
|
||||
|
||||
@@ -624,19 +624,19 @@
|
||||
desc = "The Multi-Augmented Severe Operations Networked Resource Integration Gear is an man-portable tank designed for extreme environmental situations. It is excessively bulky, but rated for all but the most atomic of hazards. The specialized armor is surprisingly weak to conventional weaponry. The exo slot can attach most storge bags on to the suit."
|
||||
icon_state = "hardsuit-ancient"
|
||||
item_state = "anc_hardsuit"
|
||||
armor = list("melee" = 10, "bullet" = 5, "laser" = 5, "energy" = 500, "bomb" = 500, "bio" = 500, "rad" = 500, "fire" = 500, "acid" = 500)
|
||||
armor = list("melee" = 20, "bullet" = 15, "laser" = 15, "energy" = 45, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
|
||||
slowdown = 6 //Slow
|
||||
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/storage, /obj/item/construction/rcd, /obj/item/pipe_dispenser)
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ancient/mason
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/ancient/mason
|
||||
name = "M.A.S.O.N RIG helmet"
|
||||
desc = "The M.A.S.O.N RIG helmet is complimentary to the rest of the armor. It features a very large, high powered flood lamp and robust flash protection."
|
||||
icon_state = "hardsuit0-ancient"
|
||||
item_state = "anc_helm"
|
||||
armor = list("melee" = 10, "bullet" = 5, "laser" = 5, "energy" = 500, "bomb" = 500, "bio" = 500, "rad" = 500, "fire" = 500, "acid" = 500)
|
||||
armor = list("melee" = 20, "bullet" = 15, "laser" = 15, "energy" = 45, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
|
||||
item_color = "ancient"
|
||||
brightness_on = 16
|
||||
scan_reagents = TRUE
|
||||
@@ -644,7 +644,7 @@
|
||||
tint = 1
|
||||
var/obj/machinery/doppler_array/integrated/bomb_radar
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/ancient/mason/Initialize()
|
||||
. = ..()
|
||||
|
||||
@@ -468,11 +468,11 @@
|
||||
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
|
||||
allowed = list(/obj/item/clothing/mask/facehugger/toy)
|
||||
|
||||
/obj/item/clothing/suit/nemes
|
||||
name = "pharoah tunic"
|
||||
/obj/item/clothing/suit/pharaoh
|
||||
name = "pharaoh tunic"
|
||||
desc = "Lavish space tomb not included."
|
||||
icon_state = "pharoah"
|
||||
icon_state = "pharoah"
|
||||
icon_state = "pharaoh"
|
||||
icon_state = "pharaoh"
|
||||
body_parts_covered = CHEST|GROIN
|
||||
|
||||
|
||||
|
||||
@@ -149,6 +149,7 @@
|
||||
active_power_usage = 50 + spawned.len * 3 + effects.len * 5
|
||||
|
||||
/obj/machinery/computer/holodeck/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
if(!LAZYLEN(emag_programs))
|
||||
@@ -160,6 +161,7 @@
|
||||
to_chat(user, "Warning. Automatic shutoff and derezing protocols have been corrupted. Please call Nanotrasen maintenance and do not use the simulator.")
|
||||
log_game("[key_name(user)] emagged the Holodeck Control Console")
|
||||
nerf(!(obj_flags & EMAGGED))
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/computer/holodeck/emp_act(severity)
|
||||
. = ..()
|
||||
|
||||
@@ -224,6 +224,10 @@
|
||||
species = "strawberry"
|
||||
plantname = "Strawberry Vine"
|
||||
product = /obj/item/reagent_containers/food/snacks/grown/strawberry
|
||||
growthstages = 6
|
||||
growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
|
||||
icon_grow = "strawberry-grow"
|
||||
icon_dead = "berry-dead"
|
||||
reagents_add = list("vitamin" = 0.07, "nutriment" = 0.1, "sugar" = 0.2)
|
||||
mutatelist = list()
|
||||
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
// Peach
|
||||
/obj/item/seeds/peach
|
||||
name = "pack of peach seeds"
|
||||
desc = "These seeds grow into peach trees."
|
||||
icon_state = "seed-peach"
|
||||
species = "peach"
|
||||
plantname = "Peach Tree"
|
||||
product = /obj/item/reagent_containers/food/snacks/grown/peach
|
||||
lifespan = 65
|
||||
endurance = 40
|
||||
yield = 3
|
||||
growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
|
||||
icon_grow = "peach-grow"
|
||||
icon_dead = "peach-dead"
|
||||
genes = list(/datum/plant_gene/trait/repeated_harvest)
|
||||
reagents_add = list("vitamin" = 0.04, "nutriment" = 0.1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/peach
|
||||
seed = /obj/item/seeds/peach
|
||||
name = "peach"
|
||||
desc = "It's fuzzy!"
|
||||
icon_state = "peach"
|
||||
filling_color = "#FF4500"
|
||||
bitesize = 25
|
||||
foodtype = FRUIT
|
||||
juice_results = list("peachjuice" = 0)
|
||||
tastes = list("peach" = 1)
|
||||
@@ -193,7 +193,7 @@
|
||||
else if(ispath(build_type, /obj/item/integrated_circuit))
|
||||
var/obj/item/integrated_circuit/IC = SScircuit.cached_components[build_type]
|
||||
cost = IC.materials[MAT_METAL]
|
||||
else if(!build_type in SScircuit.circuit_fabricator_recipe_list["Tools"])
|
||||
else if(!(build_type in SScircuit.circuit_fabricator_recipe_list["Tools"]))
|
||||
return
|
||||
|
||||
var/datum/component/material_container/materials = GetComponent(/datum/component/material_container)
|
||||
|
||||
@@ -343,8 +343,11 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums
|
||||
return ..()
|
||||
|
||||
/obj/machinery/computer/libraryconsole/bookmanagement/emag_act(mob/user)
|
||||
if(density && !(obj_flags & EMAGGED))
|
||||
obj_flags |= EMAGGED
|
||||
. = ..()
|
||||
if(!density || obj_flags & EMAGGED)
|
||||
return
|
||||
obj_flags |= EMAGGED
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/computer/libraryconsole/bookmanagement/Topic(href, href_list)
|
||||
if(..())
|
||||
|
||||
@@ -214,8 +214,11 @@
|
||||
return ..()
|
||||
|
||||
/obj/structure/closet/crate/secure/loot/emag_act(mob/user)
|
||||
if(locked)
|
||||
boom(user)
|
||||
. = SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
|
||||
if(!locked)
|
||||
return
|
||||
boom(user)
|
||||
return TRUE
|
||||
|
||||
/obj/structure/closet/crate/secure/loot/togglelock(mob/user)
|
||||
if(locked)
|
||||
|
||||
@@ -128,9 +128,12 @@ GLOBAL_LIST(labor_sheet_values)
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/mineral/labor_claim_console/emag_act(mob/user)
|
||||
if(!(obj_flags & EMAGGED))
|
||||
obj_flags |= EMAGGED
|
||||
to_chat(user, "<span class='warning'>PZZTTPFFFT</span>")
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
obj_flags |= EMAGGED
|
||||
to_chat(user, "<span class='warning'>PZZTTPFFFT</span>")
|
||||
return TRUE
|
||||
|
||||
|
||||
/**********************Prisoner Collection Unit**************************/
|
||||
|
||||
@@ -787,30 +787,30 @@
|
||||
/obj/item/melee/ghost_sword/process()
|
||||
ghost_check()
|
||||
|
||||
/obj/item/melee/ghost_sword/proc/ghost_check()
|
||||
var/ghost_counter = 0
|
||||
var/turf/T = get_turf(src)
|
||||
var/list/contents = T.GetAllContents()
|
||||
var/mob/dead/observer/current_spirits = list()
|
||||
for(var/thing in contents)
|
||||
var/atom/A = thing
|
||||
A.transfer_observers_to(src)
|
||||
|
||||
for(var/i in orbiters?.orbiters)
|
||||
if(!isobserver(i))
|
||||
/obj/item/melee/ghost_sword/proc/recursive_orbit_collect(atom/A, list/L)
|
||||
for(var/i in A.orbiters?.orbiters)
|
||||
if(!isobserver(i) || (i in L))
|
||||
continue
|
||||
L |= i
|
||||
recursive_orbit_collect(i, L)
|
||||
|
||||
/obj/item/melee/ghost_sword/proc/ghost_check()
|
||||
var/list/mob/dead/observer/current_spirits = list()
|
||||
|
||||
recursive_orbit_collect(src, current_spirits)
|
||||
recursive_orbit_collect(loc, current_spirits) //anything holding us
|
||||
|
||||
for(var/i in spirits - current_spirits)
|
||||
var/mob/dead/observer/G = i
|
||||
ghost_counter++
|
||||
G.invisibility = 0
|
||||
current_spirits |= G
|
||||
|
||||
for(var/mob/dead/observer/G in spirits - current_spirits)
|
||||
G.invisibility = GLOB.observer_default_invisibility
|
||||
|
||||
|
||||
for(var/i in current_spirits)
|
||||
var/mob/dead/observer/G = i
|
||||
G.invisibility = 0
|
||||
|
||||
spirits = current_spirits
|
||||
|
||||
return ghost_counter
|
||||
|
||||
return length(spirits)
|
||||
|
||||
/obj/item/melee/ghost_sword/attack(mob/living/target, mob/living/carbon/human/user)
|
||||
force = 0
|
||||
var/ghost_counter = ghost_check()
|
||||
@@ -1335,4 +1335,4 @@
|
||||
if(2)
|
||||
new /obj/item/wisp_lantern(src)
|
||||
if(3)
|
||||
new /obj/item/prisoncube(src)
|
||||
new /obj/item/prisoncube(src)
|
||||
|
||||
@@ -33,16 +33,18 @@
|
||||
|
||||
/obj/item/clothing/mask/facehugger/lamarr
|
||||
name = "Lamarr"
|
||||
sterile = 1
|
||||
sterile = TRUE
|
||||
|
||||
/obj/item/clothing/mask/facehugger/dead
|
||||
icon_state = "facehugger_dead"
|
||||
item_state = "facehugger_inactive"
|
||||
sterile = TRUE
|
||||
stat = DEAD
|
||||
|
||||
/obj/item/clothing/mask/facehugger/impregnated
|
||||
icon_state = "facehugger_impregnated"
|
||||
item_state = "facehugger_impregnated"
|
||||
sterile = TRUE
|
||||
stat = DEAD
|
||||
|
||||
/obj/item/clothing/mask/facehugger/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
|
||||
|
||||
@@ -702,7 +702,7 @@
|
||||
clear_fullscreen("critvision")
|
||||
|
||||
//Oxygen damage overlay
|
||||
var/windedup = getOxyLoss() + getStaminaLoss() * 0.2 + stamdamageoverlaytemp
|
||||
var/windedup = getOxyLoss() + getStaminaLoss() * 0.2
|
||||
if(windedup)
|
||||
var/severity = 0
|
||||
switch(windedup)
|
||||
|
||||
@@ -61,6 +61,5 @@
|
||||
var/next_hallucination = 0
|
||||
var/cpr_time = 1 //CPR cooldown.
|
||||
var/damageoverlaytemp = 0
|
||||
var/stamdamageoverlaytemp = 0
|
||||
|
||||
var/drunkenness = 0 //Overall drunkenness - check handle_alcohol() in life.dm for effects
|
||||
|
||||
@@ -25,11 +25,11 @@
|
||||
var/age = 30 //Player's age
|
||||
|
||||
var/underwear = "Nude" //Which underwear the player wants
|
||||
var/undie_color = "#FFFFFF"
|
||||
var/undie_color = "FFFFFF"
|
||||
var/undershirt = "Nude" //Which undershirt the player wants
|
||||
var/shirt_color = "#FFFFFF"
|
||||
var/shirt_color = "FFFFFF"
|
||||
var/socks = "Nude" //Which socks the player wants
|
||||
var/socks_color = "#FFFFFF"
|
||||
var/socks_color = "FFFFFF"
|
||||
var/backbag = DBACKPACK //Which backpack type the player has chosen.
|
||||
var/jumpsuit_style = PREF_SUIT //suit/skirt
|
||||
|
||||
|
||||
@@ -529,7 +529,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
var/digilegs = (DIGITIGRADE in species_traits) ? "_d" : ""
|
||||
var/mutable_appearance/MA = mutable_appearance(S.icon, "[S.icon_state][digilegs]", -BODY_LAYER)
|
||||
if(UNDIE_COLORABLE(S))
|
||||
MA.color = "[H.socks_color]"
|
||||
MA.color = "#[H.socks_color]"
|
||||
standing += MA
|
||||
|
||||
if(standing.len)
|
||||
@@ -1696,7 +1696,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
|
||||
if(H.stat == CONSCIOUS && H != user && prob(I.force + ((100 - H.health) * 0.5))) // rev deconversion through blunt trauma.
|
||||
var/datum/antagonist/rev/rev = H.mind.has_antag_datum(/datum/antagonist/rev)
|
||||
var/datum/antagonist/gang/gang = H.mind.has_antag_datum(/datum/antagonist/gang/)
|
||||
var/datum/antagonist/gang/gang = H.mind.has_antag_datum(/datum/antagonist/gang && !/datum/antagonist/gang/boss)
|
||||
if(rev)
|
||||
rev.remove_revolutionary(FALSE, user)
|
||||
if(gang)
|
||||
@@ -1781,7 +1781,6 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
if(CLONE)
|
||||
H.adjustCloneLoss(damage * hit_percent * H.physiology.clone_mod)
|
||||
if(STAMINA)
|
||||
H.stamdamageoverlaytemp = 20
|
||||
if(BP)
|
||||
if(damage > 0 ? BP.receive_damage(0, 0, damage * hit_percent * H.physiology.stamina_mod) : BP.heal_damage(0, 0, abs(damage * hit_percent * H.physiology.stamina_mod), only_robotic = FALSE, only_organic = FALSE))
|
||||
H.update_stamina()
|
||||
|
||||
@@ -4,9 +4,8 @@
|
||||
if(notransform)
|
||||
return
|
||||
|
||||
if(damageoverlaytemp || stamdamageoverlaytemp)
|
||||
if(damageoverlaytemp)
|
||||
damageoverlaytemp = 0
|
||||
stamdamageoverlaytemp = 0
|
||||
update_damage_hud()
|
||||
|
||||
if(stat != DEAD) //Reagent processing needs to come before breathing, to prevent edge cases.
|
||||
|
||||
@@ -92,17 +92,18 @@
|
||||
|
||||
/mob/living/silicon/robot/emag_act(mob/user)
|
||||
if(user == src)//To prevent syndieborgs from emagging themselves
|
||||
return
|
||||
return FALSE
|
||||
if(world.time < emag_cooldown)
|
||||
return FALSE
|
||||
. = ..()
|
||||
if(!opened)//Cover is closed
|
||||
if(locked)
|
||||
to_chat(user, "<span class='notice'>You emag the cover lock.</span>")
|
||||
locked = FALSE
|
||||
if(shell) //A warning to Traitors who may not know that emagging AI shells does not slave them.
|
||||
to_chat(user, "<span class='boldwarning'>[src] seems to be controlled remotely! Emagging the interface may not work as expected.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>The cover is already unlocked!</span>")
|
||||
return
|
||||
if(world.time < emag_cooldown)
|
||||
return TRUE
|
||||
to_chat(user, "<span class='warning'>The cover is already unlocked!</span>")
|
||||
return
|
||||
if(wiresexposed)
|
||||
to_chat(user, "<span class='warning'>You must unexpose the wires first!</span>")
|
||||
@@ -115,20 +116,24 @@
|
||||
to_chat(src, "<span class='nezbere'>\"[text2ratvar("You will serve Engine above all else")]!\"</span>\n\
|
||||
<span class='danger'>ALERT: Subversion attempt denied.</span>")
|
||||
log_game("[key_name(user)] attempted to emag cyborg [key_name(src)], but they serve only Ratvar.")
|
||||
return
|
||||
return TRUE
|
||||
|
||||
if(connected_ai && connected_ai.mind && connected_ai.mind.has_antag_datum(/datum/antagonist/traitor))
|
||||
to_chat(src, "<span class='danger'>ALERT: Foreign software execution prevented.</span>")
|
||||
to_chat(connected_ai, "<span class='danger'>ALERT: Cyborg unit \[[src]] successfully defended against subversion.</span>")
|
||||
log_game("[key_name(user)] attempted to emag cyborg [key_name(src)], but they were slaved to traitor AI [connected_ai].")
|
||||
return
|
||||
return TRUE
|
||||
|
||||
if(shell) //AI shells cannot be emagged, so we try to make it look like a standard reset. Smart players may see through this, however.
|
||||
to_chat(user, "<span class='danger'>[src] is remotely controlled! Your emag attempt has triggered a system reset instead!</span>")
|
||||
log_game("[key_name(user)] attempted to emag an AI shell belonging to [key_name(src) ? key_name(src) : connected_ai]. The shell has been reset as a result.")
|
||||
ResetModule()
|
||||
return
|
||||
return TRUE
|
||||
|
||||
INVOKE_ASYNC(src, .proc/beep_boop_rogue_bot, user)
|
||||
return TRUE
|
||||
|
||||
/mob/living/silicon/robot/proc/beep_boop_rogue_bot(mob/user)
|
||||
SetEmagged(1)
|
||||
SetStun(60) //Borgs were getting into trouble because they would attack the emagger before the new laws were shown
|
||||
lawupdate = 0
|
||||
|
||||
@@ -187,22 +187,23 @@
|
||||
qdel(src)
|
||||
|
||||
/mob/living/simple_animal/bot/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(locked) //First emag application unlocks the bot's interface. Apply a screwdriver to use the emag again.
|
||||
locked = FALSE
|
||||
emagged = 1
|
||||
to_chat(user, "<span class='notice'>You bypass [src]'s controls.</span>")
|
||||
return
|
||||
if(!locked && open) //Bot panel is unlocked by ID or emag, and the panel is screwed open. Ready for emagging.
|
||||
emagged = 2
|
||||
remote_disabled = 1 //Manually emagging the bot locks out the AI built in panel.
|
||||
locked = TRUE //Access denied forever!
|
||||
bot_reset()
|
||||
turn_on() //The bot automatically turns on when emagged, unless recently hit with EMP.
|
||||
to_chat(src, "<span class='userdanger'>(#$*#$^^( OVERRIDE DETECTED</span>")
|
||||
log_combat(user, src, "emagged")
|
||||
return
|
||||
else //Bot is unlocked, but the maint panel has not been opened with a screwdriver yet.
|
||||
return TRUE
|
||||
if(!open)
|
||||
to_chat(user, "<span class='warning'>You need to open maintenance panel first!</span>")
|
||||
return
|
||||
emagged = 2
|
||||
remote_disabled = 1 //Manually emagging the bot locks out the AI built in panel.
|
||||
locked = TRUE //Access denied forever!
|
||||
bot_reset()
|
||||
turn_on() //The bot automatically turns on when emagged, unless recently hit with EMP.
|
||||
to_chat(src, "<span class='userdanger'>(#$*#$^^( OVERRIDE DETECTED</span>")
|
||||
log_combat(user, src, "emagged")
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_animal/bot/examine(mob/user)
|
||||
..()
|
||||
|
||||
@@ -78,7 +78,7 @@
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/bot/cleanbot/emag_act(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if(emagged == 2)
|
||||
if(user)
|
||||
to_chat(user, "<span class='danger'>[src] buzzes and beeps.</span>")
|
||||
|
||||
@@ -478,18 +478,19 @@
|
||||
to_chat(user, "<span class='notice'>The superglue binding [src]'s toy swords to its chassis snaps!</span>")
|
||||
for(var/IS in 1 to toyswordamt)
|
||||
new /obj/item/toy/sword(Tsec)
|
||||
toyswordamt--
|
||||
|
||||
if(ASSEMBLY_FIFTH_STEP)
|
||||
if(istype(I, /obj/item/melee/transforming/energy/sword/saber))
|
||||
if(swordamt < 3)
|
||||
if(!user.temporarilyRemoveItemFromInventory(I))
|
||||
return
|
||||
created_name = "General Beepsky"
|
||||
name = "helmet/signaler/prox sensor/robot arm/energy sword assembly"
|
||||
icon_state = "grievous_assembly"
|
||||
to_chat(user, "<span class='notice'>You bolt [I] onto one of [src]'s arm slots.</span>")
|
||||
qdel(I)
|
||||
swordamt ++
|
||||
created_name = "General Beepsky"
|
||||
name = "helmet/signaler/prox sensor/robot arm/energy sword assembly"
|
||||
icon_state = "grievous_assembly"
|
||||
to_chat(user, "<span class='notice'>You bolt [I] onto one of [src]'s arm slots.</span>")
|
||||
qdel(I)
|
||||
swordamt ++
|
||||
else
|
||||
if(!can_finish_build(I, user))
|
||||
return
|
||||
@@ -505,6 +506,7 @@
|
||||
to_chat(user, "<span class='notice'>You unbolt [src]'s energy swords</span>")
|
||||
for(var/IS in 1 to swordamt)
|
||||
new /obj/item/melee/transforming/energy/sword/saber(Tsec)
|
||||
swordamt--
|
||||
|
||||
//Firebot Assembly
|
||||
/obj/item/bot_assembly/firebot
|
||||
|
||||
@@ -195,7 +195,7 @@ Auto Patrol[]"},
|
||||
shootAt(user)
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/emag_act(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if(emagged == 2)
|
||||
if(user)
|
||||
to_chat(user, "<span class='warning'>You short out [src]'s target assessment circuits.</span>")
|
||||
|
||||
@@ -120,7 +120,7 @@
|
||||
return dat
|
||||
|
||||
/mob/living/simple_animal/bot/firebot/emag_act(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if(emagged == 1)
|
||||
if(user)
|
||||
to_chat(user, "<span class='danger'>[src] buzzes and beeps.</span>")
|
||||
|
||||
@@ -124,7 +124,7 @@
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/bot/floorbot/emag_act(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if(emagged == 2)
|
||||
if(user)
|
||||
to_chat(user, "<span class='danger'>[src] buzzes and beeps.</span>")
|
||||
|
||||
@@ -127,10 +127,9 @@ Maintenance panel panel is [open ? "opened" : "closed"]"},
|
||||
..()
|
||||
|
||||
/mob/living/simple_animal/bot/honkbot/emag_act(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if(emagged == 2)
|
||||
if(user)
|
||||
user << "<span class='danger'>You short out [src]'s sound control system. It gives out an evil laugh!!</span>"
|
||||
oldtarget_name = user.name
|
||||
audible_message("<span class='danger'>[src] gives out an evil laugh!</span>")
|
||||
playsound(src, 'sound/machines/honkbot_evil_laugh.ogg', 75, 1, -1) // evil laughter
|
||||
|
||||
@@ -240,7 +240,7 @@
|
||||
step_to(src, (get_step_away(src,user)))
|
||||
|
||||
/mob/living/simple_animal/bot/medbot/emag_act(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if(emagged == 2)
|
||||
declare_crit = 0
|
||||
if(user)
|
||||
|
||||
@@ -115,6 +115,7 @@
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/bot/mulebot/emag_act(mob/user)
|
||||
. = SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
|
||||
if(emagged < 1)
|
||||
emagged = TRUE
|
||||
if(!open)
|
||||
@@ -122,6 +123,7 @@
|
||||
to_chat(user, "<span class='notice'>You [locked ? "lock" : "unlock"] [src]'s controls!</span>")
|
||||
flick("mulebot-emagged", src)
|
||||
playsound(src, "sparks", 100, 0)
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_animal/bot/mulebot/update_icon()
|
||||
if(open)
|
||||
|
||||
@@ -190,7 +190,7 @@ Auto Patrol: []"},
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/bot/secbot/emag_act(mob/user)
|
||||
..()
|
||||
. = ..()
|
||||
if(emagged == 2)
|
||||
if(user)
|
||||
to_chat(user, "<span class='danger'>You short out [src]'s target assessment circuits.</span>")
|
||||
|
||||
@@ -897,6 +897,11 @@
|
||||
|
||||
. = ..()
|
||||
|
||||
/mob/living/simple_animal/parrot/Poly/say(message, bubble_type,var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
|
||||
. = ..()
|
||||
if(. && !client && prob(1) && prob(1)) //Only the one true bird may speak across dimensions.
|
||||
world.TgsTargetedChatBroadcast("A stray squawk is heard... \"[message]\"", FALSE)
|
||||
|
||||
/mob/living/simple_animal/parrot/Poly/Life()
|
||||
if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved)
|
||||
Write_Memory(FALSE)
|
||||
|
||||
@@ -178,13 +178,13 @@
|
||||
turn_on(user)
|
||||
|
||||
/obj/item/modular_computer/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
to_chat(user, "<span class='warning'>\The [src] was already emagged.</span>")
|
||||
return 0
|
||||
else
|
||||
obj_flags |= EMAGGED
|
||||
to_chat(user, "<span class='notice'>You emag \the [src]. It's screen briefly shows a \"OVERRIDE ACCEPTED: New software downloads available.\" message.</span>")
|
||||
return 1
|
||||
return
|
||||
obj_flags |= EMAGGED
|
||||
to_chat(user, "<span class='notice'>You emag \the [src]. It's screen briefly shows a \"OVERRIDE ACCEPTED: New software downloads available.\" message.</span>")
|
||||
return TRUE
|
||||
|
||||
/obj/item/modular_computer/examine(mob/user)
|
||||
..()
|
||||
|
||||
@@ -44,7 +44,9 @@
|
||||
cpu.attack_ghost(user)
|
||||
|
||||
/obj/machinery/modular_computer/emag_act(mob/user)
|
||||
return cpu ? cpu.emag_act(user) : 1
|
||||
. = ..()
|
||||
if(cpu)
|
||||
. |= cpu.emag_act(user)
|
||||
|
||||
/obj/machinery/modular_computer/update_icon()
|
||||
cut_overlays()
|
||||
|
||||
+19
-17
@@ -267,7 +267,7 @@
|
||||
to_chat(user, "<span class='brass'>There is an integration cog installed!</span>")
|
||||
|
||||
to_chat(user, "<span class='notice'>Alt-Click the APC to [ locked ? "unlock" : "lock"] the interface.</span>")
|
||||
|
||||
|
||||
if(issilicon(user))
|
||||
to_chat(user, "<span class='notice'>Ctrl-Click the APC to switch the breaker [ operating ? "off" : "on"].</span>")
|
||||
|
||||
@@ -747,7 +747,7 @@
|
||||
if(damage_flag == "melee" && damage_amount < damage_deflection)
|
||||
return 0
|
||||
. = ..()
|
||||
|
||||
|
||||
/obj/machinery/power/apc/deconstruct(disassembled = TRUE)
|
||||
if(!(flags_1 & NODECONSTRUCT_1))
|
||||
if(!(stat & BROKEN))
|
||||
@@ -759,21 +759,23 @@
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/power/apc/emag_act(mob/user)
|
||||
if(!(obj_flags & EMAGGED) && !malfhack)
|
||||
if(opened)
|
||||
to_chat(user, "<span class='warning'>You must close the cover to swipe an ID card!</span>")
|
||||
else if(panel_open)
|
||||
to_chat(user, "<span class='warning'>You must close the panel first!</span>")
|
||||
else if(stat & (BROKEN|MAINT))
|
||||
to_chat(user, "<span class='warning'>Nothing happens!</span>")
|
||||
else
|
||||
flick("apc-spark", src)
|
||||
playsound(src, "sparks", 75, 1)
|
||||
obj_flags |= EMAGGED
|
||||
locked = FALSE
|
||||
to_chat(user, "<span class='notice'>You emag the APC interface.</span>")
|
||||
update_icon()
|
||||
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED || malfhack)
|
||||
return
|
||||
if(opened)
|
||||
to_chat(user, "<span class='warning'>You must close the cover to swipe an ID card!</span>")
|
||||
else if(panel_open)
|
||||
to_chat(user, "<span class='warning'>You must close the panel first!</span>")
|
||||
else if(stat & (BROKEN|MAINT))
|
||||
to_chat(user, "<span class='warning'>Nothing happens!</span>")
|
||||
else
|
||||
flick("apc-spark", src)
|
||||
playsound(src, "sparks", 75, 1)
|
||||
obj_flags |= EMAGGED
|
||||
locked = FALSE
|
||||
to_chat(user, "<span class='notice'>You emag the APC interface.</span>")
|
||||
update_icon()
|
||||
return TRUE
|
||||
|
||||
// attack with hand - remove cell (if cover open) or interact with the APC
|
||||
|
||||
|
||||
@@ -194,10 +194,12 @@
|
||||
return ..()
|
||||
|
||||
/obj/machinery/power/port_gen/pacman/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
obj_flags |= EMAGGED
|
||||
emp_act(EMP_HEAVY)
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/power/port_gen/pacman/attack_ai(mob/user)
|
||||
interact(user)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user