Hard upstream sync (#6951)

* maps - none of our changes included yet i'll get them in after i finish up the rest of the sync

* sync part 1 - underscore folders in code

* controllers folder

* datums folder

* game folder

* cmon, work

* modules - admin to awaymissions

* cargo to events

* fields to lighting

* mapping > ruins

* rest of the code folder

* rest of the folders in the root directory

* DME

* fixes compiling errors. it compiles so it works

* readds map changes

* fixes dogborg module select

* fixes typo in moduleselect_alternate_icon filepath
This commit is contained in:
deathride58
2018-05-31 23:03:18 +00:00
committed by kevinz000
parent b6e608cb4c
commit 2f9e3e403d
395 changed files with 134016 additions and 26287 deletions
+13 -13
View File
@@ -217,16 +217,16 @@
#define ASSERT_GAS(gas_id, gas_mixture) if (!gas_mixture.gases[gas_id]) { ADD_GAS(gas_id, gas_mixture.gases) };
GLOBAL_LIST_INIT(pipe_paint_colors, list(
"Amethyst" = rgb(130,43,255), //supplymain
"Blue" = rgb(0,0,255),
"Brown" = rgb(178,100,56),
"Cyan" = rgb(0,255,249),
"Dark" = rgb(69,69,69),
"Green" = rgb(30,255,0),
"Grey" = rgb(255,255,255),
"Orange" = rgb(255,129,25),
"Purple" = rgb(128,0,182),
"Red" = rgb(255,0,0),
"Violet" = rgb(64,0,128),
"Yellow" = rgb(255,198,0)
))
"amethyst" = rgb(130,43,255), //supplymain
"blue" = rgb(0,0,255),
"brown" = rgb(178,100,56),
"cyan" = rgb(0,255,249),
"dark" = rgb(69,69,69),
"green" = rgb(30,255,0),
"grey" = rgb(255,255,255),
"orange" = rgb(255,129,25),
"purple" = rgb(128,0,182),
"red" = rgb(255,0,0),
"violet" = rgb(64,0,128),
"yellow" = rgb(255,198,0)
))
+1 -1
View File
@@ -156,4 +156,4 @@
//Ouch my toes!
#define CALTROP_BYPASS_SHOES 1
#define CALTROP_IGNORE_WALKERS 2
#define CALTROP_IGNORE_WALKERS 2
+19 -4
View File
@@ -23,10 +23,10 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
#define ON_BORDER_1 (1<<9) // item has priority to check when entering or leaving
#define DROPDEL_1 (1<<10) // When dropped, it calls qdel on itself
#define PREVENT_CLICK_UNDER_1 (1<<11) //Prevent clicking things below it on the same turf eg. doors/ fulltile windows
#define NO_EMP_WIRES_1 (1<<12)
#define HOLOGRAM_1 (1<<13)
#define TESLA_IGNORE_1 (1<<14) // TESLA_IGNORE grants immunity from being targeted by tesla-style electricity
#define HOLOGRAM_1 (1<<12)
#define TESLA_IGNORE_1 (1<<13) // TESLA_IGNORE grants immunity from being targeted by tesla-style electricity
#define INITIALIZED_1 (1<<14) //Whether /atom/Initialize() has already run for the object
#define ADMIN_SPAWNED_1 (1<<15) //was this spawned by an admin? used for stat tracking stuff.
//turf-only flags
#define NOJAUNT_1 (1<<0)
@@ -66,3 +66,18 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
#define ACID_PROOF (1<<5) //acid stuck on it doesn't melt it.
#define INDESTRUCTIBLE (1<<6) //doesn't take damage
#define FREEZE_PROOF (1<<7) //can't be frozen
//tesla_zap
#define TESLA_MACHINE_EXPLOSIVE (1<<0)
#define TESLA_ALLOW_DUPLICATES (1<<1)
#define TESLA_OBJ_DAMAGE (1<<2)
#define TESLA_MOB_DAMAGE (1<<3)
#define TESLA_MOB_STUN (1<<4)
#define TESLA_DEFAULT_FLAGS ALL
//EMP protection
#define EMP_PROTECT_SELF (1<<0)
#define EMP_PROTECT_CONTENTS (1<<1)
#define EMP_PROTECT_WIRES (1<<2)
+1 -1
View File
@@ -181,7 +181,7 @@ GLOBAL_LIST_INIT(glass_sheet_types, typecacheof(list(
#define is_glass_sheet(O) (is_type_in_typecache(O, GLOB.glass_sheet_types))
#define iseffect(O) (is_type_in_typecache(O, GLOB.typecache_effect))
#define iseffect(O) (istype(O, /obj/effect))
#define isblobmonster(O) (istype(O, /mob/living/simple_animal/hostile/blob))
+1 -1
View File
@@ -55,7 +55,7 @@ require only minor tweaks.
#define CROSSLINKED "Cross"
// default trait definitions, used by SSmapping
#define ZTRAITS_CENTCOM list(ZTRAIT_LINKAGE = SELFLOOPING, ZTRAIT_CENTCOM = TRUE)
#define ZTRAITS_CENTCOM list(ZTRAIT_CENTCOM = TRUE)
#define ZTRAITS_STATION list(ZTRAIT_LINKAGE = CROSSLINKED, ZTRAIT_STATION = TRUE)
#define ZTRAITS_SPACE list(ZTRAIT_LINKAGE = CROSSLINKED, ZTRAIT_SPACE_RUINS = TRUE)
#define ZTRAITS_LAVALAND list(ZTRAIT_MINING = TRUE, ZTRAIT_LAVA_RUINS = TRUE, ZTRAIT_BOMBCAP_MULTIPLIER = 2)
-2
View File
@@ -403,8 +403,6 @@ GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE
#define MAX_PROC_DEPTH 195 // 200 proc calls deep and shit breaks, this is a bit lower to give some safety room
#define DUMMY_HUMAN_SLOT_MANIFEST "dummy_manifest_generation"
#define SYRINGE_DRAW 0
#define SYRINGE_INJECT 1
+1 -1
View File
@@ -29,7 +29,7 @@
#define RDSCREEN_TEXT_NO_PROTOLATHE "<div><h3>No Protolathe Linked!</h3></div><br>"
#define RDSCREEN_TEXT_NO_IMPRINTER "<div><h3>No Circuit Imprinter Linked!</h3></div><br>"
#define RDSCREEN_TEXT_NO_DECONSTRUCT "<div><h3>No Deconstructive Analyzer Linked!</h3></div><br>"
#define RDSCREEN_TEXT_NO_DECONSTRUCT "<div><h3>No Destructive Analyzer Linked!</h3></div><br>"
#define RDSCREEN_TEXT_NO_TDISK "<div><h3>No Technology Disk Inserted!</h3></div><br>"
#define RDSCREEN_TEXT_NO_DDISK "<div><h3>No Design Disk Inserted!</h3></div><br>"
#define RDSCREEN_TEXT_NO_SNODE "<div><h3>No Technology Node Selected!</h3></div><br>"
+1 -1
View File
@@ -85,4 +85,4 @@
/////////////
#define STATUS_EFFECT_RAINBOWPROTECTION /datum/status_effect/rainbow_protection //Invulnerable and pacifistic
#define STATUS_EFFECT_SLIMESKIN /datum/status_effect/slimeskin //Increased armor
#define STATUS_EFFECT_SLIMESKIN /datum/status_effect/slimeskin //Increased armor
+1 -1
View File
@@ -38,7 +38,7 @@
//type and all subtypes should always call Initialize in New()
#define INITIALIZE_IMMEDIATE(X) ##X/New(loc, ...){\
..();\
if(!initialized) {\
if(!(flags_1 & INITIALIZED_1)) {\
args[1] = TRUE;\
SSatoms.InitAtom(src, args);\
}\
+4 -1
View File
@@ -40,11 +40,14 @@
#define TRAIT_NOBREATH "no_breath"
#define TRAIT_ANTIMAGIC "anti_magic"
#define TRAIT_HOLY "holy"
#define TRAIT_DEPRESSION "depression"
#define TRAIT_DEPRESSION "depression"
#define TRAIT_JOLLY "jolly"
#define TRAIT_NOCRITDAMAGE "no_crit"
#define TRAIT_NOSLIPWATER "noslip_water"
#define TRAIT_NOSLIPALL "noslip_all"
#define TRAIT_NODEATH "nodeath"
#define TRAIT_NOHARDCRIT "nohardcrit"
#define TRAIT_NOSOFTCRIT "nosoftcrit"
#define TRAIT_ALCOHOL_TOLERANCE "alcohol_tolerance"
+1 -8
View File
@@ -73,14 +73,7 @@
return FALSE
//Checks for specific types in specifically structured (Assoc "type" = TRUE) lists ('typecaches')
/proc/is_type_in_typecache(atom/A, list/L)
if(!LAZYLEN(L) || !A)
return FALSE
if(ispath(A))
. = L[A]
else
. = L[A.type]
#define is_type_in_typecache(A, L) (A && length(L) && L[(ispath(A) ? A : A:type)])
//Checks for a string in a list
/proc/is_string_in_list(string, list/L)
+2 -2
View File
@@ -15,7 +15,7 @@
var/turf/sourceT = found_turfs[1]
if(break_if_found[sourceT.type])
return FALSE
if (is_type_in_typecache(sourceT.loc, GLOB.typecache_shuttle_area))
if (istype(sourceT.loc, /area/shuttle))
return FALSE
found_turfs.Cut(1, 2)
var/dir_flags = checked_turfs[sourceT]
@@ -50,7 +50,7 @@
var/list/areas = list("New Area" = /area)
for(var/i in 1 to turfs.len)
var/area/place = get_area(turfs[i])
if(blacklisted_areas[place.type] || GLOB.typecache_shuttle_area[place.type])
if(blacklisted_areas[place.type] || istype(place, /area/shuttle))
continue
if(!place.requires_power || place.noteleport || place.hidden)
continue // No expanding powerless rooms etc
+2 -2
View File
@@ -117,7 +117,7 @@
return
if(QDELETED(A))
return
if((A.smooth & SMOOTH_TRUE) || (A.smooth & SMOOTH_MORE))
if(A.smooth & (SMOOTH_TRUE | SMOOTH_MORE))
var/adjacencies = calculate_adjacencies(A)
if(A.smooth & SMOOTH_DIAGONAL)
@@ -156,7 +156,7 @@
/turf/closed/wall/diagonal_smooth(adjacencies)
adjacencies = reverse_ndir(..())
if(adjacencies)
var/mutable_appearance/underlay_appearance = mutable_appearance(layer = TURF_LAYER)
var/mutable_appearance/underlay_appearance = mutable_appearance(layer = TURF_LAYER, plane = FLOOR_PLANE)
var/list/U = list(underlay_appearance)
if(fixed_underlay)
if(fixed_underlay["space"])
+6 -4
View File
@@ -278,8 +278,8 @@ Proc for attack log creation, because really why not
/proc/add_logs(mob/user, mob/target, what_done, object=null, addition=null)
var/turf/attack_location = get_turf(target)
var/is_mob_user = user && GLOB.typecache_mob[user.type]
var/is_mob_target = target && GLOB.typecache_mob[target.type]
var/is_mob_user = user && ismob(user)
var/is_mob_target = target && ismob(target)
var/mob/living/living_target
@@ -505,7 +505,8 @@ Proc for attack log creation, because really why not
for(var/j in 1 to amount)
var/atom/X = new spawn_type(arglist(new_args))
X.admin_spawned = admin_spawn
if (admin_spawn)
X.flags_1 |= ADMIN_SPAWNED_1
/proc/spawn_and_random_walk(spawn_type, target, amount, walk_chance=100, max_walk=3, always_max_walk=FALSE, admin_spawn=FALSE)
var/turf/T = get_turf(target)
@@ -515,7 +516,8 @@ Proc for attack log creation, because really why not
for(var/j in 1 to amount)
var/atom/movable/X = new spawn_type(T)
X.admin_spawned = admin_spawn
if (admin_spawn)
X.flags_1 |= ADMIN_SPAWNED_1
if(always_max_walk || prob(walk_chance))
if(always_max_walk)
+26 -2
View File
@@ -119,7 +119,9 @@ GLOBAL_LIST_INIT(bitfields, list(
"NODECONSTRUCT_1" = NODECONSTRUCT_1,
"OVERLAY_QUEUED_1" = OVERLAY_QUEUED_1,
"HOLOGRAM_1" = HOLOGRAM_1,
"TESLA_IGNORE_1" = TESLA_IGNORE_1
"TESLA_IGNORE_1" = TESLA_IGNORE_1,
"INITIALIZED_1" = INITIALIZED_1,
"ADMIN_SPAWNED_1" = ADMIN_SPAWNED_1,
),
"clothing_flags" = list(
"LAVAPROTECT" = LAVAPROTECT,
@@ -128,5 +130,27 @@ GLOBAL_LIST_INIT(bitfields, list(
"MASKINTERNALS" = MASKINTERNALS,
"NOSLIP" = NOSLIP,
"THICKMATERIAL" = THICKMATERIAL,
)
),
"tesla_flags" = list(
"TESLA_MOB_DAMAGE" = TESLA_MOB_DAMAGE,
"TESLA_OBJ_DAMAGE" = TESLA_OBJ_DAMAGE,
"TESLA_MOB_STUN" = TESLA_MOB_STUN,
"TESLA_ALLOW_DUPLICATES" = TESLA_ALLOW_DUPLICATES,
"TESLA_MACHINE_EXPLOSIVE" = TESLA_MACHINE_EXPLOSIVE,
),
"smooth" = list(
"SMOOTH_TRUE" = SMOOTH_TRUE,
"SMOOTH_MORE" = SMOOTH_MORE,
"SMOOTH_DIAGONAL" = SMOOTH_DIAGONAL,
"SMOOTH_BORDER" = SMOOTH_BORDER,
"SMOOTH_QUEUED" = SMOOTH_QUEUED,
),
"container_type" = list(
"INJECTABLE" = INJECTABLE,
"DRAWABLE" = DRAWABLE,
"REFILLABLE" = REFILLABLE,
"DRAINABLE" = DRAINABLE,
"TRANSPARENT" = TRANSPARENT,
"AMOUNT_VISIBLE" = AMOUNT_VISIBLE,
),
))
+1
View File
@@ -30,6 +30,7 @@ GLOBAL_LIST_EMPTY(ruin_landmarks)
//away missions
GLOBAL_LIST_EMPTY(awaydestinations) //a list of landmarks that the warpgate can take you to
GLOBAL_LIST_EMPTY(vr_spawnpoints)
//used by jump-to-area etc. Updated by area/updateName()
GLOBAL_LIST_EMPTY(sortedAreas)
-8
View File
@@ -5,12 +5,4 @@
GLOBAL_LIST_INIT(typecache_mob, typecacheof(/mob))
GLOBAL_LIST_INIT(typecache_living, typecacheof(/mob/living))
GLOBAL_LIST_INIT(typecache_machine_or_structure, typecacheof(list(/obj/machinery, /obj/structure)))
GLOBAL_LIST_INIT(typecache_shuttle_area, typecacheof(/area/shuttle))
GLOBAL_LIST_INIT(typecache_clothing, typecacheof(/obj/item/clothing))
GLOBAL_LIST_INIT(typecache_effect, typecacheof(/obj/effect))
+3 -3
View File
@@ -39,16 +39,16 @@
Note that this proc can be overridden, and is in the case of screen objects.
*/
/atom/Click(location,control,params)
if(initialized)
if(flags_1 & INITIALIZED_1)
SendSignal(COMSIG_CLICK, location, control, params)
usr.ClickOn(src, params)
/atom/DblClick(location,control,params)
if(initialized)
if(flags_1 & INITIALIZED_1)
usr.DblClickOn(src,params)
/atom/MouseWheel(delta_x,delta_y,location,control,params)
if(initialized)
if(flags_1 & INITIALIZED_1)
usr.MouseWheelOn(src, delta_x, delta_y, params)
/*
+20
View File
@@ -11,7 +11,24 @@
var/id
var/ordered = TRUE //If the button gets placed into the default bar
/obj/screen/movable/action_button/proc/can_use(mob/user)
if (linked_action)
return linked_action.owner == user
else if (isobserver(user))
var/mob/dead/observer/O = user
return !O.observetarget
else
return TRUE
/obj/screen/movable/action_button/MouseDrop()
if (!can_use(usr))
return
return ..()
/obj/screen/movable/action_button/Click(location,control,params)
if (!can_use(usr))
return
var/list/modifiers = params2list(params)
if(modifiers["shift"])
if(locked)
@@ -44,6 +61,9 @@
var/show_state = "show"
/obj/screen/movable/action_button/hide_toggle/Click(location,control,params)
if (!can_use(usr))
return
var/list/modifiers = params2list(params)
if(modifiers["shift"])
if(locked)
+6
View File
@@ -73,6 +73,12 @@
static_inventory += using
/datum/hud/ghost/show_hud(version = 0, mob/viewmob)
// don't show this HUD if observing; show the HUD of the observee
var/mob/dead/observer/O = mymob
if (istype(O) && O.observetarget)
plane_masters_update()
return FALSE
. = ..()
if(!.)
return
+20 -8
View File
@@ -131,7 +131,7 @@
update_sight()
//Version denotes which style should be displayed. blank or 0 means "next version"
/datum/hud/proc/show_hud(version = 0,mob/viewmob)
/datum/hud/proc/show_hud(version = 0, mob/viewmob)
if(!ismob(mymob))
return FALSE
var/mob/screenmob = viewmob || mymob
@@ -195,19 +195,30 @@
if(infodisplay.len)
screenmob.client.screen -= infodisplay
for(var/thing in plane_masters)
var/obj/screen/plane_master/PM = plane_masters[thing]
PM.backdrop(screenmob)
screenmob.client.screen += PM
hud_version = display_hud_version
persistent_inventory_update(screenmob)
screenmob.update_action_buttons(1)
reorganize_alerts()
screenmob.reload_fullscreen()
update_parallax_pref(screenmob)
// ensure observers get an accurate and up-to-date view
if (!viewmob)
plane_masters_update()
for(var/M in mymob.observers)
show_hud(hud_version, M)
else if (viewmob.hud_used)
viewmob.hud_used.plane_masters_update()
return TRUE
/datum/hud/proc/plane_masters_update()
// Plane masters are always shown to OUR mob, never to observers
for(var/thing in plane_masters)
var/obj/screen/plane_master/PM = plane_masters[thing]
PM.backdrop(mymob)
mymob.client.screen += PM
/datum/hud/human/show_hud(version = 0,mob/viewmob)
. = ..()
if(!.)
@@ -268,8 +279,9 @@
i++
for(var/obj/screen/human/equip/E in static_inventory)
E.screen_loc = ui_equip_position(mymob)
if(mymob.hud_used)
show_hud(HUD_STYLE_STANDARD,mymob)
if(ismob(mymob) && mymob.hud_used == src)
show_hud(hud_version)
/datum/hud/proc/update_locked_slots()
return
@@ -177,6 +177,10 @@
/datum/config_entry/string/githuburl
config_entry_value = "https://www.github.com/tgstation/-tg-station"
/datum/config_entry/string/roundstatsurl
/datum/config_entry/string/gamelogurl
/datum/config_entry/number/githubrepoid
config_entry_value = null
min_val = 0
+1 -1
View File
@@ -263,7 +263,7 @@ SUBSYSTEM_DEF(air)
currentrun |= T
if(blockchanges && T.excited_group)
T.excited_group.garbage_collect()
else if(T.initialized)
else if(T.flags_1 & INITIALIZED_1)
for(var/turf/S in T.atmos_adjacent_turfs)
add_to_active(S)
else if(map_loading)
+3 -3
View File
@@ -37,14 +37,14 @@ SUBSYSTEM_DEF(atoms)
count = atoms.len
for(var/I in atoms)
var/atom/A = I
if(!A.initialized)
if(!(A.flags_1 & INITIALIZED_1))
if(InitAtom(I, mapload_arg))
atoms -= I
CHECK_TICK
else
count = 0
for(var/atom/A in world)
if(!A.initialized)
if(!(A.flags_1 & INITIALIZED_1))
InitAtom(A, mapload_arg)
++count
CHECK_TICK
@@ -95,7 +95,7 @@ SUBSYSTEM_DEF(atoms)
if(!A) //possible harddel
qdeleted = TRUE
else if(!A.initialized)
else if(!(A.flags_1 & INITIALIZED_1))
BadInitializeCalls[the_type] |= BAD_INIT_DIDNT_INIT
return qdeleted || QDELING(A)
+1 -1
View File
@@ -212,7 +212,7 @@ SUBSYSTEM_DEF(persistence)
continue
var/list/savable_obj = list()
for(var/obj/O in F)
if(is_type_in_typecache(O, satchel_blacklist) || O.admin_spawned)
if(is_type_in_typecache(O, satchel_blacklist) || (O.flags_1 & ADMIN_SPAWNED_1))
continue
if(O.persistence_replacement)
savable_obj += O.persistence_replacement
+1
View File
@@ -8,3 +8,4 @@ SUBSYSTEM_DEF(religion)
var/bible_icon_state
var/bible_item_state
var/holy_weapon_type
var/holy_armor_type
+7
View File
@@ -647,6 +647,13 @@ SUBSYSTEM_DEF(ticker)
if(end_string)
end_state = end_string
var/statspage = CONFIG_GET(string/roundstatsurl)
var/gamelogloc = CONFIG_GET(string/gamelogurl)
if(statspage)
to_chat(world, "<span class='info'>Round statistics and logs can be viewed <a href=\"[statspage][GLOB.round_id]\">at this website!</a></span>")
else if(gamelogloc)
to_chat(world, "<span class='info'>Round logs can be located <a href=\"[gamelogloc]\">at this website!</a></span>")
log_game("<span class='boldannounce'>Rebooting World. [reason]</span>")
world.Reboot()
+2 -2
View File
@@ -337,9 +337,9 @@ SUBSYSTEM_DEF(vote)
return 1
/datum/action/vote/proc/remove_from_client()
if(owner && owner.client)
if(owner.client)
owner.client.player_details.player_actions -= src
else if(owner.ckey)
var/datum/player_details/P = GLOB.player_details[owner.ckey]
if(P)
P.player_actions -= src
P.player_actions -= src
+11
View File
@@ -0,0 +1,11 @@
/datum/component/empprotection
var/flags = NONE
/datum/component/empprotection/Initialize(_flags)
if(!istype(parent, /atom))
return COMPONENT_INCOMPATIBLE
flags = _flags
RegisterSignal(list(COMSIG_ATOM_EMP_ACT), .proc/getEmpFlags)
/datum/component/empprotection/proc/getEmpFlags(severity)
return flags
+3 -1
View File
@@ -51,10 +51,12 @@
var/turf/T = get_turf(parent)
if (!T)
return FALSE
var/area/A = T.loc
if(istype(A, /area/fabric_of_reality)) // Obviously terrible, just for test merging
return FALSE
if (is_station_level(T.z) || is_centcom_level(T.z))
return TRUE
if (is_transit_level(T.z))
var/area/A = T.loc
if (is_type_in_typecache(A, allowed_shuttles))
return TRUE
@@ -6,17 +6,20 @@
user.visible_message("<span class='warning'>An unseen force knocks [user] to the ground!</span>", "<span class='big_brass'>\"I think not!\"</span>")
user.Knockdown(60)
return
if(istype(loccheck.loc, /area/fabric_of_reality))
to_chat(user, "<span class='danger'>You can't do that here!</span>")
var/safety = alert(user, "Doing this will have extremely dire consequences for the station and its crew. Be sure you know what you're doing.", "Put in [A.name]?", "Abort", "Proceed")
if(safety == "Abort" || !in_range(A, user) || !A || !W || user.incapacitated())
return
A.investigate_log("has become a singularity. Caused by [user.key]", INVESTIGATE_SINGULO)
to_chat(user, "<span class='danger'>The Bluespace interfaces of the two devices catastrophically malfunction!</span>")
qdel(W)
var/obj/singularity/singulo = new /obj/singularity (get_turf(A))
singulo.energy = 300 //should make it a bit bigger~
message_admins("[key_name_admin(user)] detonated a bag of holding")
log_game("[key_name(user)] detonated a bag of holding")
playsound(loccheck,'sound/effects/supermatter.ogg', 200, 1)
for(var/turf/T in range(6,loccheck))
if(istype(T, /turf/open/space/transit))
continue
T.TerraformTurf(/turf/open/chasm/magic, /turf/open/chasm/magic)
message_admins("[ADMIN_LOOKUPFLW(user)] detonated a bag of holding at [get_area_name(loccheck, TRUE)] [ADMIN_COORDJMP(loccheck)].")
log_game("[key_name(user)] detonated a bag of holding at [get_area_name(loccheck, TRUE)] [COORD(loccheck)].")
qdel(A)
singulo.process()
return
. = ..()
+1 -1
View File
@@ -737,4 +737,4 @@
if(COLLECT_EVERYTHING)
to_chat(user, "[parent] now picks up all items in a tile at once.")
if(COLLECT_ONE)
to_chat(user, "[parent] now picks up one item at a time.")
to_chat(user, "[parent] now picks up one item at a time.")
+3 -2
View File
@@ -1,10 +1,11 @@
/////////////////////////// DNA DATUM
/datum/dna
var/unique_enzymes
var/struc_enzymes
var/uni_identity
var/blood_type
var/datum/species/species = new /datum/species/human() //The type of mutant race the player is if applicable (i.e. potato-man)
var/datum/species/species = new /datum/species/human //The type of mutant race the player is if applicable (i.e. potato-man)
var/list/features = list("FFF") //first value is mutant color
var/real_name //Stores the real name of the person who originally got this dna datum. Used primarely for changelings,
var/list/mutations = list() //All mutations are from now on here
@@ -29,7 +30,7 @@
previous.Cut() //^
return ..()
/datum/dna/proc/transfer_identity(mob/living/carbon/destination, transfer_SE = 0)
if(!istype(destination))
return
+2 -2
View File
@@ -23,8 +23,8 @@
if(line)
var/datum/tgs_revision_information/test_merge/tm = line
var/tmcommit = tm.commit
log_world("Test merge active of PR #[line] commit [tmcommit]")
SSblackbox.record_feedback("nested tally", "testmerged_prs", 1, list("[line]", "[tmcommit]"))
log_world("Test merge active of PR #[tm.number] commit [tmcommit]")
SSblackbox.record_feedback("nested tally", "testmerged_prs", 1, list("[tm.number]", "[tmcommit]"))
if(originmastercommit)
log_world("Based off origin/master commit [originmastercommit]")
else if(originmastercommit)
+2 -1
View File
@@ -21,7 +21,8 @@
restraining = FALSE
/datum/martial_art/cqc/can_use(mob/living/carbon/human/H)
if(just_a_cook && !(is_type_in_typecache(get_area(H), areas_under_siege)))
var/area/A = get_area(H)
if(just_a_cook && !(is_type_in_typecache(A, areas_under_siege)))
return FALSE
return ..()
+7
View File
@@ -25,6 +25,7 @@
var/accessory = null
var/can_be_admin_equipped = TRUE // Set to FALSE if your outfit requires runtime parameters
var/list/chameleon_extras //extra types for chameleon outfit changes, mostly guns
/datum/outfit/proc/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
//to be overriden for customization depending on client prefs,species etc
@@ -149,3 +150,9 @@
for(var/obj/item/I in H.held_items)
I.add_fingerprint(H,1)
return 1
/datum/outfit/proc/get_chameleon_disguise_info()
var/list/types = list(uniform, suit, back, belt, gloves, shoes, head, mask, neck, ears, glasses, id, l_pocket, r_pocket, suit_store, r_hand, l_hand)
types += chameleon_extras
listclearnulls(types)
return types
+6 -2
View File
@@ -391,11 +391,15 @@
/datum/map_template/shuttle/arrival/omega
suffix = "omega"
name = "arrival shuttle (Omega)"
/datum/map_template/shuttle/aux_base/default
suffix = "default"
name = "auxilliary base (Default)"
/datum/map_template/shuttle/aux_base/small
suffix = "small"
name = "auxilliary base (Small)"
/datum/map_template/shuttle/escape_pod/default
suffix = "default"
name = "escape pod (Default)"
@@ -426,4 +430,4 @@
/datum/map_template/shuttle/ruin/syndicate_fighter
suffix = "syndicate_fighter"
name = "Syndicate Fighter"
name = "Syndicate Fighter"
-2
View File
@@ -130,5 +130,3 @@ Use this as a guideline
//If you don't need any special effects like spawning glasses, then you don't need an add()
*/
+16 -13
View File
@@ -9,7 +9,11 @@
medical_record_text = "Patient requires regular treatment for blood loss due to low production of blood."
/datum/quirk/blooddeficiency/on_process()
quirk_holder.blood_volume -= 0.275
var/mob/living/carbon/human/H = quirk_holder
if(NOBLOOD in H.dna.species.species_traits) //can't lose blood if your species doesn't have any
return
else
quirk_holder.blood_volume -= 0.275
@@ -27,11 +31,11 @@
/datum/quirk/family_heirloom
name = "Family Heirloom"
desc = "You are the current owner of an heirloom. passed down for generations. You have to keep it safe!"
desc = "You are the current owner of an heirloom, passed down for generations. You have to keep it safe!"
value = -1
mood_quirk = TRUE
var/obj/item/heirloom
var/where_text
var/where
/datum/quirk/family_heirloom/on_spawn()
var/mob/living/carbon/human/H = quirk_holder
@@ -58,19 +62,18 @@
/obj/item/dice/d20)
heirloom = new heirloom_type(get_turf(quirk_holder))
var/list/slots = list(
"in your backpack" = SLOT_IN_BACKPACK,
"in your left pocket" = SLOT_L_STORE,
"in your right pocket" = SLOT_R_STORE
"in your right pocket" = SLOT_R_STORE,
"in your backpack" = SLOT_IN_BACKPACK
)
var/where = H.equip_in_one_of_slots(heirloom, slots)
if(!where)
where = "at your feet"
else if(where == "in your backpack")
H.back.SendSignal(COMSIG_TRY_STORAGE_SHOW, H)
where_text = "<span class='boldnotice'>There is a precious family [heirloom.name] [where], passed down from generation to generation. Keep it safe!</span>"
where = H.equip_in_one_of_slots(heirloom, slots, FALSE) || "at your feet"
/datum/quirk/family_heirloom/post_add()
to_chat(quirk_holder, where_text)
if(where == "in your backpack")
var/mob/living/carbon/human/H = quirk_holder
H.back.SendSignal(COMSIG_TRY_STORAGE_SHOW, H)
to_chat(quirk_holder, "<span class='boldnotice'>There is a precious family [heirloom.name] [where], passed down from generation to generation. Keep it safe!</span>")
var/list/family_name = splittext(quirk_holder.real_name, " ")
heirloom.name = "\improper [family_name[family_name.len]] family [heirloom.name]"
@@ -230,7 +233,7 @@
return
if(prob(2)) //we'll all be mad soon enough
madness()
/datum/quirk/insanity/proc/madness()
quirk_holder.hallucination += rand(10, 25)
+4
View File
@@ -22,3 +22,7 @@ Unused icons for new areas are "awaycontent1" ~ "awaycontent30"
name = "Super Secret Room"
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
has_gravity = TRUE
/area/awaymission/vr
name = "Virtual Reality"
icon_state = "awaycontent1"
+6 -1
View File
@@ -107,7 +107,12 @@
name = "Syndicate Elite Squad"
icon_state = "syndie-elite"
/area/fabric_of_reality
name = "Tear in the Fabric of Reality"
requires_power = FALSE
has_gravity = TRUE
noteleport = TRUE
blob_allowed = FALSE
//CAPTURE THE FLAG
+3
View File
@@ -70,6 +70,9 @@
/area/ruin/unpowered/syndicate_lava_base/telecomms
name = "Syndicate Lavaland Telecommunications"
/area/ruin/unpowered/syndicate_lava_base/circuits
name = "Syndicate Lavaland Circuit Lab"
//Xeno Nest
+6 -7
View File
@@ -6,7 +6,6 @@
var/flags_1 = NONE
var/interaction_flags_atom = NONE
var/container_type = NONE
var/admin_spawned = 0 //was this spawned by an admin? used for stat tracking stuff.
var/datum/reagents/reagents = null
//This atom's HUD (med/sec, etc) images. Associative list.
@@ -19,7 +18,6 @@
var/list/atom_colours //used to store the different colors on an atom
//its inherent color, the colored paint applied on it, special color effect etc...
var/initialized = FALSE
var/list/our_overlays //our local copy of (non-priority) overlays without byond magic. Use procs in SSoverlays to manipulate
var/list/priority_overlays //overlays that should remain on top and not normally removed when using cut_overlay functions, like c4.
@@ -59,9 +57,9 @@
// /turf/open/space/Initialize
/atom/proc/Initialize(mapload, ...)
if(initialized)
if(flags_1 & INITIALIZED_1)
stack_trace("Warning: [src]([type]) initialized multiple times!")
initialized = TRUE
flags_1 |= INITIALIZED_1
//atom color stuff
if(color)
@@ -221,9 +219,10 @@
return
/atom/proc/emp_act(severity)
SendSignal(COMSIG_ATOM_EMP_ACT, severity)
if(istype(wires) && !(flags_1 & NO_EMP_WIRES_1))
var/protection = SendSignal(COMSIG_ATOM_EMP_ACT, severity)
if(!(protection & EMP_PROTECT_WIRES) && istype(wires))
wires.emp_pulse()
return protection // Pass the protection value collected here upwards
/atom/proc/bullet_act(obj/item/projectile/P, def_zone)
SendSignal(COMSIG_ATOM_BULLET_ACT, P, def_zone)
@@ -517,7 +516,7 @@
/atom/vv_edit_var(var_name, var_value)
if(!GLOB.Debug2)
admin_spawned = TRUE
flags_1 |= ADMIN_SPAWNED_1
. = ..()
switch(var_name)
if("color")
-4
View File
@@ -248,10 +248,6 @@
if (orbiting)
orbiting.Check()
var/datum/proximity_monitor/proximity_monitor = src.proximity_monitor
if(proximity_monitor)
proximity_monitor.HandleMove()
return 1
/atom/movable/Destroy(force)
+1 -1
View File
@@ -165,7 +165,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
return
/obj/effect/meteor/examine(mob/user)
if(!admin_spawned && isliving(user))
if(!(flags_1 & ADMIN_SPAWNED_1) && isliving(user))
SSmedals.UnlockMedal(MEDAL_METEOR, user.client)
..()
+3 -1
View File
@@ -78,9 +78,11 @@
to_chat(occupant, "[enter_message]")
/obj/machinery/sleeper/emp_act(severity)
. = ..()
if (. & EMP_PROTECT_SELF)
return
if(is_operational() && occupant)
open_machine()
..(severity)
/obj/machinery/sleeper/MouseDrop_T(mob/target, mob/user)
if(user.stat || user.lying || !Adjacent(user) || !user.Adjacent(target) || !iscarbon(target) || !user.IsAdvancedToolUser())
+10 -11
View File
@@ -153,10 +153,10 @@ Class Procs:
return PROCESS_KILL
/obj/machinery/emp_act(severity)
if(use_power && !stat)
. = ..()
if(use_power && !stat && !(. & EMP_PROTECT_SELF))
use_power(7500/severity)
new /obj/effect/temp_visual/emp(loc)
..()
/obj/machinery/proc/open_machine(drop = TRUE)
state_open = TRUE
@@ -180,7 +180,7 @@ Class Procs:
density = TRUE
if(!target)
for(var/am in loc)
if(!is_type_in_typecache(am, (occupant_typecache || GLOB.typecache_living)))
if (!(occupant_typecache ? is_type_in_typecache(am, occupant_typecache) : isliving(am)))
continue
var/atom/movable/AM = am
if(AM.has_buckled_mobs())
@@ -463,15 +463,14 @@ Class Procs:
/obj/machinery/proc/can_be_overridden()
. = 1
/obj/machinery/tesla_act(power, explosive = FALSE)
/obj/machinery/tesla_act(power, tesla_flags, shocked_objects)
..()
if(prob(85) && explosive)
explosion(src.loc, 1, 2, 4, flame_range = 2, adminlog = FALSE, smoke = FALSE)
else if(prob(50))
emp_act(EMP_LIGHT)
else
ex_act(EXPLODE_HEAVY)
if(prob(85) && (tesla_flags & TESLA_MACHINE_EXPLOSIVE))
explosion(src, 1, 2, 4, flame_range = 2, adminlog = FALSE, smoke = FALSE)
if(tesla_flags & TESLA_OBJ_DAMAGE)
take_damage(power/2000, BURN, "energy")
if(prob(40))
emp_act(EMP_LIGHT)
/obj/machinery/Exited(atom/movable/AM, atom/newloc)
. = ..()
+2 -2
View File
@@ -173,9 +173,9 @@ GLOBAL_LIST_EMPTY(announcement_systems)
newhead = pick("OV#RL()D: \[UNKNOWN??\] DET*#CT)D!", "ER)#R - B*@ TEXT F*O(ND!", "AAS.exe is not responding. NanoOS is searching for a solution to the problem.")
/obj/machinery/announcement_system/emp_act(severity)
if(!(stat & (NOPOWER|BROKEN)))
. = ..()
if(!(stat & (NOPOWER|BROKEN)) && !(. & EMP_PROTECT_SELF))
act_up()
..(severity)
/obj/machinery/announcement_system/emag_act()
if(obj_flags & EMAGGED)
+2 -8
View File
@@ -77,9 +77,10 @@
return ..()
/obj/machinery/camera/emp_act(severity)
. = ..()
if(!status)
return
if(!isEmpProof())
if(!(. & EMP_PROTECT_SELF))
if(prob(150/severity))
update_icon()
var/list/previous_network = network
@@ -107,13 +108,6 @@
M.unset_machine()
M.reset_perspective(null)
to_chat(M, "The screen bursts into static.")
..()
/obj/machinery/camera/tesla_act(var/power)//EMP proof upgrade also makes it tesla immune
if(isEmpProof())
return
..()
qdel(src)//to prevent bomb testing camera from exploding over and over forever
/obj/machinery/camera/ex_act(severity, target)
if(invuln)
+1
View File
@@ -75,6 +75,7 @@
// UPGRADE PROCS
/obj/machinery/camera/proc/upgradeEmpProof()
AddComponent(/datum/component/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES | EMP_PROTECT_CONTENTS)
assembly.upgrades.Add(new /obj/item/stack/sheet/mineral/plasma(assembly))
upgrades |= CAMERA_UPGRADE_EMP_PROOF
+4 -5
View File
@@ -54,7 +54,7 @@
user.visible_message("[user] inserts a cell into [src].", "<span class='notice'>You insert a cell into [src].</span>")
chargelevel = -1
updateicon()
else
else
if(!charging && default_deconstruction_screwdriver(user, icon_state, icon_state, W))
return
if(default_deconstruction_crowbar(W))
@@ -105,14 +105,14 @@
return
/obj/machinery/cell_charger/emp_act(severity)
if(stat & (BROKEN|NOPOWER))
. = ..()
if(stat & (BROKEN|NOPOWER) || . & EMP_PROTECT_CONTENTS)
return
if(charging)
charging.emp_act(severity)
..(severity)
/obj/machinery/cell_charger/RefreshParts()
charge_rate = 500
for(var/obj/item/stock_parts/capacitor/C in component_parts)
@@ -128,4 +128,3 @@
charging.give(charge_rate) //this is 2558, efficient batteries exist
updateicon()
+8 -7
View File
@@ -406,13 +406,14 @@
go_out()
/obj/machinery/clonepod/emp_act(severity)
var/mob/living/mob_occupant = occupant
if(mob_occupant && prob(100/(severity*efficiency)))
connected_message(Gibberish("EMP-caused Accidental Ejection", 0))
SPEAK(Gibberish("Exposure to electromagnetic fields has caused the ejection of [mob_occupant.real_name] prematurely." ,0))
go_out()
mob_occupant.apply_vore_prefs()
..()
. = ..()
if (!(. & EMP_PROTECT_SELF))
var/mob/living/mob_occupant = occupant
if(mob_occupant && prob(100/(severity*efficiency)))
connected_message(Gibberish("EMP-caused Accidental Ejection", 0))
SPEAK(Gibberish("Exposure to electromagnetic fields has caused the ejection of [mob_occupant.real_name] prematurely." ,0))
mob_occupant.apply_vore_prefs()
go_out()
/obj/machinery/clonepod/ex_act(severity, target)
..()
+9 -8
View File
@@ -95,14 +95,15 @@
set_light(0)
/obj/machinery/computer/emp_act(severity)
switch(severity)
if(1)
if(prob(50))
obj_break("energy")
if(2)
if(prob(10))
obj_break("energy")
..()
. = ..()
if (!(. & EMP_PROTECT_SELF))
switch(severity)
if(1)
if(prob(50))
obj_break("energy")
if(2)
if(prob(10))
obj_break("energy")
/obj/machinery/computer/deconstruct(disassembled = TRUE, mob/user)
on_deconstruction()
+2 -2
View File
@@ -85,9 +85,9 @@
prize.forceMove(get_turf(src))
/obj/machinery/computer/arcade/emp_act(severity)
..(severity)
. = ..()
if(stat & (NOPOWER|BROKEN))
if(stat & (NOPOWER|BROKEN) || . & EMP_PROTECT_SELF)
return
var/empprize = null
+2 -2
View File
@@ -553,7 +553,8 @@
return
/obj/machinery/computer/med_data/emp_act(severity)
if(!(stat & (BROKEN|NOPOWER)))
. = ..()
if(!(stat & (BROKEN|NOPOWER)) && !(. & EMP_PROTECT_SELF))
for(var/datum/data/record/R in GLOB.data_core.medical)
if(prob(10/severity))
switch(rand(1,6))
@@ -577,7 +578,6 @@
else if(prob(1))
qdel(R)
continue
..()
/obj/machinery/computer/med_data/proc/canUseMedicalRecordsConsole(mob/user, message = 1, record1, record2)
if(user)
+3 -4
View File
@@ -783,8 +783,9 @@ What a mess.*/
printing = FALSE
/obj/machinery/computer/secure_data/emp_act(severity)
if(stat & (BROKEN|NOPOWER))
..(severity)
. = ..()
if(stat & (BROKEN|NOPOWER) || . & EMP_PROTECT_SELF)
return
for(var/datum/data/record/R in GLOB.data_core.security)
@@ -817,8 +818,6 @@ What a mess.*/
qdel(R)
continue
..(severity)
/obj/machinery/computer/secure_data/proc/canUseSecurityRecordsConsole(mob/user, message1 = 0, record1, record2)
if(user)
if(authenticated)
+3 -1
View File
@@ -208,6 +208,9 @@
playsound(src.loc, 'sound/items/welder.ogg', 100, 1)
/obj/machinery/door/emp_act(severity)
. = ..()
if (. & EMP_PROTECT_SELF)
return
if(prob(20/severity) && (istype(src, /obj/machinery/door/airlock) || istype(src, /obj/machinery/door/window)) )
INVOKE_ASYNC(src, .proc/open)
if(prob(severity*10 - 20))
@@ -215,7 +218,6 @@
secondsElectrified = -1
LAZYADD(shockedby, "\[[time_stamp()]\]EM Pulse")
addtimer(CALLBACK(src, .proc/unelectrify), 300)
..()
/obj/machinery/door/proc/unelectrify()
secondsElectrified = 0
+1 -1
View File
@@ -174,7 +174,7 @@
use_power(power_used)
var/atom/A = new dispense_type(loc)
A.admin_spawned = admin_spawned
A.flags_1 |= (flags_1 & ADMIN_SPAWNED_1)
if(create_sound)
playsound(src, create_sound, 50, 1)
+5 -1
View File
@@ -81,9 +81,13 @@
add_overlay("overlay_fire")
/obj/machinery/firealarm/emp_act(severity)
. = ..()
if (. & EMP_PROTECT_SELF)
return
if(prob(50 / severity))
alarm()
..()
/obj/machinery/firealarm/emag_act(mob/user)
if(obj_flags & EMAGGED)
+2 -2
View File
@@ -119,12 +119,12 @@
/obj/machinery/flasher/emp_act(severity)
if(!(stat & (BROKEN|NOPOWER)))
. = ..()
if(!(stat & (BROKEN|NOPOWER)) && !(. & EMP_PROTECT_SELF))
if(bulb && prob(75/severity))
flash()
bulb.burn_out()
power_change()
..()
/obj/machinery/flasher/obj_break(damage_flag)
if(!(flags_1 & NODECONSTRUCT_1))
+3 -1
View File
@@ -120,6 +120,8 @@
return 1
/obj/machinery/sparker/emp_act(severity)
. = ..()
if (. & EMP_PROTECT_SELF)
return
if(!(stat & (BROKEN|NOPOWER)))
ignite()
..()
+3 -1
View File
@@ -61,6 +61,8 @@
updateicon()
/obj/machinery/light_switch/emp_act(severity)
. = ..()
if (. & EMP_PROTECT_SELF)
return
if(!(stat & (BROKEN|NOPOWER)))
power_change()
..()
+3 -1
View File
@@ -31,7 +31,9 @@
/obj/machinery/mass_driver/emp_act(severity)
. = ..()
if (. & EMP_PROTECT_SELF)
return
if(stat & (BROKEN|NOPOWER))
return
drive()
..(severity)
+5
View File
@@ -165,6 +165,11 @@ Buildable meters
if(pipename)
A.name = pipename
if(A.on)
// Certain pre-mapped subtypes are on by default, we want to preserve
// every other aspect of these subtypes (name, pre-set filters, etc.)
// but they shouldn't turn on automatically when wrenched.
A.on = FALSE
/obj/item/pipe/trinary/flippable/build_pipe(obj/machinery/atmospherics/components/trinary/T)
..()
@@ -20,9 +20,6 @@
power_channel = EQUIP //drains power from the EQUIPMENT channel
var/base_icon_state = "standard"
var/emp_vunerable = TRUE // Can be empd
var/scan_range = 7
var/atom/base = null //for turrets inside other objects
@@ -307,7 +304,10 @@
/obj/machinery/porta_turret/emp_act(severity)
if(on && emp_vunerable)
. = ..()
if (. & EMP_PROTECT_SELF)
return
if(on)
//if the turret is on, the EMP no matter how severe disables the turret for a while
//and scrambles its settings, with a slight chance of having an emag effect
check_records = pick(0, 1)
@@ -322,8 +322,6 @@
if(!on)
on = TRUE
..()
/obj/machinery/porta_turret/take_damage(damage, damage_type = BRUTE, damage_flag = 0, sound_effect = 1)
. = ..()
if(.) //damage received
@@ -646,9 +644,12 @@
icon_state = "syndie_off"
base_icon_state = "syndie"
faction = list(ROLE_SYNDICATE)
emp_vunerable = 0
desc = "A ballistic machine gun auto-turret."
/obj/machinery/porta_turret/syndicate/ComponentInitialize()
. = ..()
AddComponent(/datum/component/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES)
/obj/machinery/porta_turret/syndicate/energy
icon_state = "standard_stun"
base_icon_state = "standard"
@@ -723,9 +724,12 @@
icon_state = "syndie_off"
base_icon_state = "syndie"
faction = list("neutral","silicon","turret")
emp_vunerable = 0
mode = TURRET_LETHAL
/obj/machinery/porta_turret/centcom_shuttle/ComponentInitialize()
. = ..()
AddComponent(/datum/component/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES)
/obj/machinery/porta_turret/centcom_shuttle/assess_perp(mob/living/carbon/human/perp)
return 0
@@ -1036,4 +1040,4 @@
if(istype(P, /obj/item/projectile/beam/lasertag/bluetag))
on = FALSE
spawn(100)
on = TRUE
on = TRUE
+3 -1
View File
@@ -120,6 +120,9 @@
update_icon()
/obj/machinery/recharger/emp_act(severity)
. = ..()
if (. & EMP_PROTECT_CONTENTS)
return
if(!(stat & (NOPOWER|BROKEN)) && anchored)
if(istype(charging, /obj/item/gun/energy))
var/obj/item/gun/energy/E = charging
@@ -130,7 +133,6 @@
var/obj/item/melee/baton/B = charging
if(B.cell)
B.cell.charge = 0
..()
/obj/machinery/recharger/update_icon(using_power = 0, scan) //we have an update_icon() in addition to the stuff in process to make it feel a tiny bit snappier.
+4 -3
View File
@@ -43,11 +43,12 @@
open_machine()
/obj/machinery/recharge_station/emp_act(severity)
. = ..()
if(!(stat & (BROKEN|NOPOWER)))
if(occupant)
if(occupant && !(. & EMP_PROTECT_CONTENTS))
occupant.emp_act(severity)
open_machine()
..()
if (!(. & EMP_PROTECT_SELF))
open_machine()
/obj/machinery/recharge_station/attackby(obj/item/P, mob/user, params)
if(state_open)
+3
View File
@@ -26,6 +26,9 @@
move_update_air(T)
/obj/structure/emergency_shield/emp_act(severity)
. = ..()
if (. & EMP_PROTECT_SELF)
return
switch(severity)
if(1)
qdel(src)
+2 -1
View File
@@ -152,7 +152,8 @@
balance = 0
/obj/machinery/computer/slot_machine/emp_act(severity)
if(stat & (NOPOWER|BROKEN))
. = ..()
if(stat & (NOPOWER|BROKEN) || . & EMP_PROTECT_SELF)
return
if(prob(15 * severity))
return
+2 -3
View File
@@ -126,12 +126,11 @@
settableTemperatureMedian + settableTemperatureRange)
/obj/machinery/space_heater/emp_act(severity)
if(stat & (BROKEN|NOPOWER))
..(severity)
. = ..()
if(stat & (NOPOWER|BROKEN) || . & EMP_PROTECT_CONTENTS)
return
if(cell)
cell.emp_act(severity)
..(severity)
/obj/machinery/space_heater/attackby(obj/item/I, mob/user, params)
add_fingerprint(user)
+4 -6
View File
@@ -63,11 +63,10 @@
update()
/obj/machinery/status_display/emp_act(severity)
if(stat & (BROKEN|NOPOWER))
..(severity)
. = ..()
if(stat & (NOPOWER|BROKEN) || . & EMP_PROTECT_SELF)
return
set_picture("ai_bsod")
..(severity)
// set what is displayed
@@ -259,11 +258,10 @@
update()
/obj/machinery/ai_status_display/emp_act(severity)
if(stat & (BROKEN|NOPOWER))
..(severity)
. = ..()
if(stat & (NOPOWER|BROKEN) || . & EMP_PROTECT_SELF)
return
set_picture("ai_bsod")
..(severity)
/obj/machinery/ai_status_display/proc/update()
@@ -13,6 +13,10 @@
idle_power_usage = 0
var/intercept = FALSE // If true, only works on the Syndicate frequency.
/obj/machinery/telecomms/allinone/indestructable
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
flags_1 = NODECONSTRUCT_1
/obj/machinery/telecomms/allinone/Initialize()
..()
if (intercept)
@@ -140,10 +140,12 @@ GLOBAL_LIST_EMPTY(telecomms_list)
traffic -= netspeed
/obj/machinery/telecomms/emp_act(severity)
. = ..()
if(. & EMP_PROTECT_SELF)
return
if(prob(100/severity))
if(!(stat & EMPED))
stat |= EMPED
var/duration = (300 * 10)/severity
spawn(rand(duration - 20, duration + 20)) // Takes a long time for the machines to reboot.
stat &= ~EMPED
..()
+3 -1
View File
@@ -85,7 +85,9 @@
return answer
/obj/item/mecha_parts/mecha_tracking/emp_act()
qdel(src)
. = ..()
if(!(. & EMP_PROTECT_SELF))
qdel(src)
/obj/item/mecha_parts/mecha_tracking/Destroy()
if(ismecha(loc))
+3 -1
View File
@@ -142,6 +142,9 @@
setDir(dir_in)
/obj/mecha/emp_act(severity)
. = ..()
if (. & EMP_PROTECT_SELF)
return
if(get_charge())
use_power((cell.charge/3)/(severity*2))
take_damage(30 / severity, BURN, "energy", 1)
@@ -333,4 +336,3 @@
else if(damtype == TOX)
visual_effect_icon = ATTACK_EFFECT_MECHTOXIN
..()
@@ -9,7 +9,7 @@
/obj/effect/decal/cleanable/Initialize(mapload, list/datum/disease/diseases)
. = ..()
if (random_icon_states && length(random_icon_states) > 0)
if (random_icon_states && (icon_state == initial(icon_state)) && length(random_icon_states) > 0)
icon_state = pick(random_icon_states)
create_reagents(300)
if(loc && isturf(loc))
+21 -5
View File
@@ -1,21 +1,37 @@
/datum/proximity_monitor
var/atom/host //the atom we are tracking
var/atom/hasprox_reciever //the atom that will recieve HasProximity calls.
var/atom/last_host_loc
var/list/checkers //list of /obj/effect/abstract/proximity_checkers
var/current_range
var/ignore_if_not_on_turf //don't check turfs in range if the host's loc isn't a turf
var/datum/component/movement_tracker
/datum/proximity_monitor/New(atom/_host, range, _ignore_if_not_on_turf = TRUE)
host = _host
checkers = list()
last_host_loc = _host.loc
ignore_if_not_on_turf = _ignore_if_not_on_turf
checkers = list()
SetRange(range)
current_range = range
SetHost(_host)
/datum/proximity_monitor/proc/SetHost(atom/H,atom/R)
if(R)
hasprox_reciever = R
else if(hasprox_reciever == host) //Default case
hasprox_reciever = H
host = H
last_host_loc = host.loc
if(movement_tracker)
QDEL_NULL(movement_tracker)
movement_tracker = host.AddComponent(/datum/component/redirect, COMSIG_MOVABLE_MOVED, CALLBACK(src, .proc/HandleMove))
SetRange(current_range,TRUE)
/datum/proximity_monitor/Destroy()
host = null
last_host_loc = null
hasprox_reciever = null
QDEL_LIST(checkers)
QDEL_NULL(movement_tracker)
return ..()
/datum/proximity_monitor/proc/HandleMove()
@@ -27,7 +43,7 @@
SetRange(curr_range, TRUE)
if(curr_range)
testing("HasProx: [host] -> [host]")
_host.HasProximity(host) //if we are processing, we're guaranteed to be a movable
hasprox_reciever.HasProximity(host) //if we are processing, we're guaranteed to be a movable
/datum/proximity_monitor/proc/SetRange(range, force_rebuild = FALSE)
if(!force_rebuild && range == current_range)
@@ -93,4 +109,4 @@
/obj/effect/abstract/proximity_checker/Crossed(atom/movable/AM)
set waitfor = FALSE
monitor.host.HasProximity(AM)
monitor.hasprox_reciever.HasProximity(AM)
+153 -136
View File
@@ -3,11 +3,14 @@ CONTAINS:
RPD
*/
#define PAINT_MODE -2
#define EATING_MODE -1
#define ATMOS_MODE 0
#define DISPOSALS_MODE 1
#define TRANSIT_MODE 2
#define ATMOS_CATEGORY 0
#define DISPOSALS_CATEGORY 1
#define TRANSIT_CATEGORY 2
#define BUILD_MODE 1
#define WRENCH_MODE 2
#define DESTROY_MODE 4
#define PAINT_MODE 8
GLOBAL_LIST_INIT(atmos_pipe_recipes, list(
@@ -69,7 +72,6 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
)
))
/datum/pipe_info
var/name
var/icon_state
@@ -186,17 +188,21 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
resistance_flags = FIRE_PROOF
var/datum/effect_system/spark_spread/spark_system
var/working = 0
var/mode = ATMOS_MODE
var/p_dir = NORTH
var/p_flipped = FALSE
var/paint_color="Grey"
var/screen = ATMOS_MODE //Starts on the atmos tab.
var/paint_color = "grey"
var/atmos_build_speed = 5 //deciseconds (500ms)
var/disposal_build_speed = 5
var/transit_build_speed = 5
var/destroy_speed = 5
var/paint_speed = 5
var/category = ATMOS_CATEGORY
var/piping_layer = PIPING_LAYER_DEFAULT
var/datum/pipe_info/recipe
var/static/datum/pipe_info/first_atmos
var/static/datum/pipe_info/first_disposal
var/static/datum/pipe_info/first_transit
var/autowrench = FALSE
var/mode = BUILD_MODE | PAINT_MODE | DESTROY_MODE | WRENCH_MODE
/obj/item/pipe_dispenser/New()
. = ..()
@@ -238,21 +244,22 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
/obj/item/pipe_dispenser/ui_data(mob/user)
var/list/data = list(
"mode" = mode,
"screen" = screen,
"category" = category,
"piping_layer" = piping_layer,
"preview_rows" = recipe.get_preview(p_dir),
"categories" = list(),
"paint_colors" = list()
"selected_color" = paint_color,
"paint_colors" = GLOB.pipe_paint_colors,
"mode" = mode
)
var/list/recipes
switch(screen)
if(ATMOS_MODE)
switch(category)
if(ATMOS_CATEGORY)
recipes = GLOB.atmos_pipe_recipes
if(DISPOSALS_MODE)
if(DISPOSALS_CATEGORY)
recipes = GLOB.disposal_pipe_recipes
if(TRANSIT_MODE)
if(TRANSIT_CATEGORY)
recipes = GLOB.transit_tube_recipes
for(var/c in recipes)
var/list/cat = recipes[c]
@@ -262,10 +269,6 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
r += list(list("pipe_name" = info.name, "pipe_index" = i, "selected" = (info == recipe)))
data["categories"] += list(list("cat_name" = c, "recipes" = r))
data["paint_colors"] = list()
for(var/c in GLOB.pipe_paint_colors)
data["paint_colors"] += list(list("color_name" = c, "color_hex" = GLOB.pipe_paint_colors[c], "selected" = (c == paint_color)))
return data
/obj/item/pipe_dispenser/ui_act(action, params)
@@ -277,18 +280,14 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
switch(action)
if("color")
paint_color = params["paint_color"]
if("mode")
mode = text2num(params["mode"])
if("screen")
if(mode == screen)
mode = text2num(params["screen"])
screen = text2num(params["screen"])
switch(screen)
if(DISPOSALS_MODE)
if("category")
category = text2num(params["category"])
switch(category)
if(DISPOSALS_CATEGORY)
recipe = first_disposal
if(ATMOS_MODE)
if(ATMOS_CATEGORY)
recipe = first_atmos
if(TRANSIT_MODE)
if(TRANSIT_CATEGORY)
recipe = first_transit
p_dir = NORTH
playeffect = FALSE
@@ -305,6 +304,15 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
p_dir = text2dir(params["dir"])
p_flipped = text2num(params["flipped"])
playeffect = FALSE
if("mode")
var/n = text2num(params["mode"])
if(n == 2 && !(mode&1) && !(mode&2))
mode |= 3
else if(mode&n)
mode &= ~n
else
mode |= n
if(playeffect)
spark_system.start()
playsound(get_turf(src), 'sound/effects/pop.ogg', 50, 0)
@@ -314,135 +322,144 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
return ..()
//So that changing the menu settings doesn't affect the pipes already being built.
var/temp_piping_layer = piping_layer
var/queued_p_type = recipe.id
var/queued_p_dir = p_dir
var/queued_p_flipped = p_flipped
// clicking on an existing component puts the new one on the same layer
if (mode == ATMOS_MODE && istype(A, /obj/machinery/atmospherics))
var/obj/machinery/atmospherics/AM = A
temp_piping_layer = AM.piping_layer
A = get_turf(user)
//make sure what we're clicking is valid for the current mode
//make sure what we're clicking is valid for the current category
var/static/list/make_pipe_whitelist
if(!make_pipe_whitelist)
make_pipe_whitelist = typecacheof(list(/obj/structure/lattice, /obj/structure/girder, /obj/item/pipe))
var/can_make_pipe = (isturf(A) || is_type_in_typecache(A, make_pipe_whitelist))
. = FALSE
switch(mode) //if we've gotten this var, the target is valid
if(PAINT_MODE) //Paint pipes
if(!istype(A, /obj/machinery/atmospherics/pipe))
return ..()
if((mode&DESTROY_MODE) && istype(A, /obj/item/pipe) || istype(A, /obj/structure/disposalconstruct) || istype(A, /obj/structure/c_transit_tube) || istype(A, /obj/structure/c_transit_tube_pod) || istype(A, /obj/item/pipe_meter))
to_chat(user, "<span class='notice'>You start destroying a pipe...</span>")
playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1)
if(do_after(user, destroy_speed, target = A))
activate()
qdel(A)
return
if((mode&PAINT_MODE))
if(istype(A, /obj/machinery/atmospherics/pipe) && !istype(A, /obj/machinery/atmospherics/pipe/layer_manifold))
var/obj/machinery/atmospherics/pipe/P = A
to_chat(user, "<span class='notice'>You start painting \the [P] [paint_color]...</span>")
playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1)
P.paint(GLOB.pipe_paint_colors[paint_color])
user.visible_message("<span class='notice'>[user] paints \the [P] [paint_color].</span>","<span class='notice'>You paint \the [P] [paint_color].</span>")
if(do_after(user, paint_speed, target = A))
P.paint(GLOB.pipe_paint_colors[paint_color]) //paint the pipe
user.visible_message("<span class='notice'>[user] paints \the [P] [paint_color].</span>","<span class='notice'>You paint \the [P] [paint_color].</span>")
return
var/obj/item/pipe/P = A
if(istype(P) && findtext("[P.pipe_type]", "/obj/machinery/atmospherics/pipe") && !findtext("[P.pipe_type]", "layer_manifold"))
to_chat(user, "<span class='notice'>You start painting \the [A] [paint_color]...</span>")
playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1)
if(do_after(user, paint_speed, target = A))
A.add_atom_colour(GLOB.pipe_paint_colors[paint_color], FIXED_COLOUR_PRIORITY) //paint the pipe
user.visible_message("<span class='notice'>[user] paints \the [A] [paint_color].</span>","<span class='notice'>You paint \the [A] [paint_color].</span>")
return
if(EATING_MODE) //Eating pipes
if(!(istype(A, /obj/item/pipe) || istype(A, /obj/item/pipe_meter) || istype(A, /obj/structure/disposalconstruct) || istype(A, /obj/structure/c_transit_tube) || istype(A, /obj/structure/c_transit_tube_pod)))
return ..()
to_chat(user, "<span class='notice'>You start destroying a pipe...</span>")
playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1)
if(do_after(user, 2, target = A))
activate()
qdel(A)
if(mode&BUILD_MODE)
switch(category) //if we've gotten this var, the target is valid
if(ATMOS_CATEGORY) //Making pipes
if(!can_make_pipe)
return ..()
playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1)
if (recipe.type == /datum/pipe_info/meter)
to_chat(user, "<span class='notice'>You start building a meter...</span>")
if(do_after(user, atmos_build_speed, target = A))
activate()
var/obj/item/pipe_meter/PM = new /obj/item/pipe_meter(get_turf(A))
PM.setAttachLayer(piping_layer)
if(mode&WRENCH_MODE)
PM.wrench_act(user, src)
else
to_chat(user, "<span class='notice'>You start building a pipe...</span>")
if(do_after(user, atmos_build_speed, target = A))
activate()
var/obj/machinery/atmospherics/path = queued_p_type
var/pipe_item_type = initial(path.construction_type) || /obj/item/pipe
var/obj/item/pipe/P = new pipe_item_type(get_turf(A), queued_p_type, queued_p_dir)
if(queued_p_flipped && istype(P, /obj/item/pipe/trinary/flippable))
var/obj/item/pipe/trinary/flippable/F = P
F.flipped = queued_p_flipped
P.update()
P.add_fingerprint(usr)
P.setPipingLayer(piping_layer)
if(findtext("[queued_p_type]", "/obj/machinery/atmospherics/pipe") && !findtext("[queued_p_type]", "layer_manifold"))
P.add_atom_colour(GLOB.pipe_paint_colors[paint_color], FIXED_COLOUR_PRIORITY)
if(mode&WRENCH_MODE)
P.wrench_act(user, src)
if(DISPOSALS_CATEGORY) //Making disposals pipes
if(!can_make_pipe)
return ..()
A = get_turf(A)
if(isclosedturf(A))
to_chat(user, "<span class='warning'>[src]'s error light flickers; there's something in the way!</span>")
return
to_chat(user, "<span class='notice'>You start building a disposals pipe...</span>")
playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1)
if(do_after(user, disposal_build_speed, target = A))
var/obj/structure/disposalconstruct/C = new (A, queued_p_type, queued_p_dir, queued_p_flipped)
if(!C.can_place())
to_chat(user, "<span class='warning'>There's not enough room to build that here!</span>")
qdel(C)
return
if(ATMOS_MODE) //Making pipes
if(!can_make_pipe)
return ..()
playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1)
if (recipe.type == /datum/pipe_info/meter)
to_chat(user, "<span class='notice'>You start building a meter...</span>")
if(do_after(user, 2, target = A))
activate()
var/obj/item/pipe_meter/PM = new /obj/item/pipe_meter(get_turf(A))
PM.setAttachLayer(temp_piping_layer)
if(autowrench)
PM.wrench_act(user, src)
else
to_chat(user, "<span class='notice'>You start building a pipe...</span>")
if(do_after(user, 2, target = A))
activate()
var/obj/machinery/atmospherics/path = queued_p_type
var/pipe_item_type = initial(path.construction_type) || /obj/item/pipe
var/obj/item/pipe/P = new pipe_item_type(get_turf(A), queued_p_type, queued_p_dir)
if(queued_p_flipped && istype(P, /obj/item/pipe/trinary/flippable))
var/obj/item/pipe/trinary/flippable/F = P
F.flipped = queued_p_flipped
P.update()
P.add_fingerprint(usr)
P.setPipingLayer(temp_piping_layer)
P.add_atom_colour(GLOB.pipe_paint_colors[paint_color], FIXED_COLOUR_PRIORITY)
if(autowrench)
P.wrench_act(user, src)
if(DISPOSALS_MODE) //Making disposals pipes
if(!can_make_pipe)
return ..()
A = get_turf(A)
if(isclosedturf(A))
to_chat(user, "<span class='warning'>[src]'s error light flickers; there's something in the way!</span>")
return
to_chat(user, "<span class='notice'>You start building a disposals pipe...</span>")
playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1)
if(do_after(user, 4, target = A))
var/obj/structure/disposalconstruct/C = new (A, queued_p_type, queued_p_dir, queued_p_flipped)
if(!C.can_place())
to_chat(user, "<span class='warning'>There's not enough room to build that here!</span>")
qdel(C)
C.add_fingerprint(usr)
C.update_icon()
if(mode&WRENCH_MODE)
C.wrench_act(user, src)
return
activate()
if(TRANSIT_CATEGORY) //Making transit tubes
if(!can_make_pipe)
return ..()
A = get_turf(A)
if(isclosedturf(A))
to_chat(user, "<span class='warning'>[src]'s error light flickers; there's something in the way!</span>")
return
to_chat(user, "<span class='notice'>You start building a transit tube...</span>")
playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1)
if(do_after(user, transit_build_speed, target = A))
activate()
if(queued_p_type == /obj/structure/c_transit_tube_pod)
var/obj/structure/c_transit_tube_pod/pod = new /obj/structure/c_transit_tube_pod(A)
pod.add_fingerprint(usr)
if(mode&WRENCH_MODE)
pod.wrench_act(user, src)
C.add_fingerprint(usr)
C.update_icon()
return
else
var/obj/structure/c_transit_tube/tube = new queued_p_type(A)
tube.dir = queued_p_dir
if(TRANSIT_MODE) //Making transit tubes
if(!can_make_pipe)
if(queued_p_flipped)
tube.dir = turn(queued_p_dir, 45)
tube.simple_rotate_flip()
tube.add_fingerprint(usr)
if(mode&WRENCH_MODE)
tube.wrench_act(user, src)
return
else
return ..()
A = get_turf(A)
if(isclosedturf(A))
to_chat(user, "<span class='warning'>[src]'s error light flickers; there's something in the way!</span>")
return
to_chat(user, "<span class='notice'>You start building a transit tube...</span>")
playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1)
if(do_after(user, 4, target = A))
activate()
if(queued_p_type == /obj/structure/c_transit_tube_pod)
var/obj/structure/c_transit_tube_pod/pod = new /obj/structure/c_transit_tube_pod(A)
pod.add_fingerprint(usr)
else
var/obj/structure/c_transit_tube/tube = new queued_p_type(A)
tube.dir = queued_p_dir
if(queued_p_flipped)
tube.dir = turn(queued_p_dir, 45)
tube.simple_rotate_flip()
tube.add_fingerprint(usr)
return
else
return ..()
/obj/item/pipe_dispenser/AltClick(mob/living/user)
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
return
autowrench = !autowrench
to_chat(user, "<span class='notice'>You [autowrench ? "enable" : "disable"] auto wrenching.</span>")
/obj/item/pipe_dispenser/proc/activate()
playsound(get_turf(src), 'sound/items/deconstruct.ogg', 50, 1)
#undef ATMOS_CATEGORY
#undef DISPOSALS_CATEGORY
#undef TRANSIT_CATEGORY
#undef BUILD_MODE
#undef DESTROY_MODE
#undef PAINT_MODE
#undef EATING_MODE
#undef ATMOS_MODE
#undef DISPOSALS_MODE
#undef WRENCH_MODE
+2 -2
View File
@@ -159,7 +159,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/clothing/mask/cigarette/proc/light(flavor_text = null)
if(lit)
return
if(!initialized)
if(!(flags_1 & INITIALIZED_1))
icon_state = icon_on
item_state = icon_on
return
@@ -315,7 +315,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
src.pixel_y = rand(-5, 5)
/obj/item/clothing/mask/cigarette/rollie/nicotine
list_reagents = list("nicotine" = 15)
list_reagents = list("nicotine" = 15)
/obj/item/clothing/mask/cigarette/rollie/trippy
list_reagents = list("nicotine" = 15, "mushroomhallucinogen" = 35)
@@ -135,6 +135,10 @@
name = "Power Monitor (Computer Board)" //name fixed 250810
build_path = /obj/machinery/computer/monitor
/obj/item/circuitboard/computer/powermonitor/secret
name = "Outdated Power Monitor (Computer Board)" //Variant used on ruins to prevent them from showing up on PDA's.
build_path = /obj/machinery/computer/monitor/secret
/obj/item/circuitboard/computer/olddoor
name = "DoorMex (Computer Board)"
build_path = /obj/machinery/computer/pod/old
@@ -228,6 +232,10 @@
name = "Supply Request Console (Computer Board)"
build_path = /obj/machinery/computer/cargo/request
/obj/item/circuitboard/computer/bounty
name = "Nanotrasen Bounty Console (Computer Board)"
build_path = /obj/machinery/computer/cargo/request
/obj/item/circuitboard/computer/operating
name = "Operating Computer (Computer Board)"
build_path = /obj/machinery/computer/operating
@@ -7,6 +7,15 @@
/obj/item/stack/cable_coil = 1,
/obj/item/stack/sheet/glass = 2)
/obj/item/circuitboard/machine/vr_sleeper
name = "VR Sleeper (Machine Board)"
build_path = /obj/machinery/vr_sleeper
req_components = list(
/obj/item/stock_parts/manipulator = 1,
/obj/item/stack/cable_coil = 1,
/obj/item/stock_parts/scanning_module = 2,
/obj/item/stack/sheet/glass = 2)
/obj/item/circuitboard/machine/announcement_system
name = "Announcement System (Machine Board)"
build_path = /obj/machinery/announcement_system
@@ -216,6 +225,23 @@
/obj/machinery/vending/cigarette = "ShadyCigs Deluxe",
/obj/machinery/vending/games = "\improper Good Clean Fun",
/obj/machinery/vending/autodrobe = "AutoDrobe",
/obj/machinery/vending/wardrobe/sec_wardrobe = "SecDrobe",
/obj/machinery/vending/wardrobe/medi_wardrobe = "MediDrobe",
/obj/machinery/vending/wardrobe/engi_wardrobe = "EngiDrobe",
/obj/machinery/vending/wardrobe/atmos_wardrobe = "AtmosDrobe",
/obj/machinery/vending/wardrobe/cargo_wardrobe = "CargoDrobe",
/obj/machinery/vending/wardrobe/robo_wardrobe = "RoboDrobe",
/obj/machinery/vending/wardrobe/science_wardrobe = "SciDrobe",
/obj/machinery/vending/wardrobe/hydro_wardrobe = "HyDrobe",
/obj/machinery/vending/wardrobe/curator_wardrobe = "CuraDrobe",
/obj/machinery/vending/wardrobe/bar_wardrobe = "BarDrobe",
/obj/machinery/vending/wardrobe/chef_wardrobe = "ChefDrobe",
/obj/machinery/vending/wardrobe/jani_wardrobe = "JaniDrobe",
/obj/machinery/vending/wardrobe/law_wardrobe = "LawDrobe",
/obj/machinery/vending/wardrobe/chap_wardrobe = "ChapDrobe",
/obj/machinery/vending/wardrobe/chem_wardrobe = "ChemDrobe",
/obj/machinery/vending/wardrobe/gene_wardrobe = "GeneDrobe",
/obj/machinery/vending/wardrobe/viro_wardrobe = "ViroDrobe",
/obj/machinery/vending/clothing = "ClothesMate",
/obj/machinery/vending/medical = "NanoMed Plus",
/obj/machinery/vending/wallmed = "NanoMed")
+4 -2
View File
@@ -144,8 +144,11 @@
to_chat(user, "<span class='notice'>You silently enable [src]'s safety protocols with the cryptographic sequencer.</span>")
/obj/item/defibrillator/emp_act(severity)
if(cell)
. = ..()
if(cell && !(. & EMP_PROTECT_CONTENTS))
deductcharge(1000 / severity)
if (. & EMP_PROTECT_SELF)
return
if(safety)
safety = FALSE
visible_message("<span class='notice'>[src] beeps: Safety protocols disabled!</span>")
@@ -155,7 +158,6 @@
visible_message("<span class='notice'>[src] beeps: Safety protocols enabled!</span>")
playsound(src, 'sound/machines/defib_saftyOn.ogg', 50, 0)
update_icon()
..()
/obj/item/defibrillator/proc/toggle_paddles()
set name = "Toggle Paddles"
+9 -6
View File
@@ -661,7 +661,7 @@ GLOBAL_LIST_EMPTY(PDAs)
to_chat(user, "<span class='info'>Message sent to [target_text]: \"[message]\"</span>")
// Reset the photo
photo = null
last_text = world.time
last_text = world.time
if (everyone)
last_everyone = world.time
@@ -979,11 +979,14 @@ GLOBAL_LIST_EMPTY(PDAs)
// Pass along the pulse to atoms in contents, largely added so pAIs are vulnerable to EMP
/obj/item/pda/emp_act(severity)
for(var/atom/A in src)
A.emp_act(severity)
emped += 1
spawn(200 * severity)
emped -= 1
. = ..()
if (!(. & EMP_PROTECT_CONTENTS))
for(var/atom/A in src)
A.emp_act(severity)
if (!(. & EMP_PROTECT_SELF))
emped += 1
spawn(200 * severity)
emped -= 1
/proc/get_viewable_pdas()
. = list()
+14 -7
View File
@@ -260,10 +260,16 @@ Code:
var/turf/pda_turf = get_turf(src)
for(var/obj/machinery/computer/monitor/pMon in GLOB.machines)
if(!(pMon.stat & (NOPOWER | BROKEN)) )
powercount++
powermonitors += pMon
if(pMon.stat & (NOPOWER | BROKEN)) //check to make sure the computer is functional
continue
if(pda_turf.z != pMon.z) //and that we're on the same zlevel as the computer (lore: limited signal strength)
continue
if(pMon.is_secret_monitor) //make sure it isn't a secret one (ie located on a ruin), allowing people to metagame that the location exists
continue
powercount++
powermonitors += pMon
if(!powercount)
@@ -274,22 +280,23 @@ Code:
var/count = 0
for(var/obj/machinery/computer/monitor/pMon in powermonitors)
count++
menu += "<a href='byond://?src=[REF(src)];choice=Power Select;target=[count]'>[pMon] </a><BR>"
menu += "<a href='byond://?src=[REF(src)];choice=Power Select;target=[count]'>[pMon] - [get_area_name(pMon, TRUE)] </a><BR>"
menu += "</FONT>"
if (433)
menu = "<h4>[PDAIMG(power)] Power Monitor </h4><BR>"
if(!powmonitor)
if(!powmonitor || !powmonitor.get_powernet())
menu += "<span class='danger'>No connection<BR></span>"
else
var/list/L = list()
for(var/obj/machinery/power/terminal/term in powmonitor.attached.powernet.nodes)
var/datum/powernet/connected_powernet = powmonitor.get_powernet()
for(var/obj/machinery/power/terminal/term in connected_powernet.nodes)
if(istype(term.master, /obj/machinery/power/apc))
var/obj/machinery/power/apc/A = term.master
L += A
menu += "<PRE>Total power: [DisplayPower(powmonitor.attached.powernet.viewavail)]<BR>Total load: [DisplayPower(powmonitor.attached.powernet.viewload)]<BR>"
menu += "<PRE>Location: [get_area_name(powmonitor, TRUE)]<BR>Total power: [DisplayPower(connected_powernet.viewavail)]<BR>Total load: [DisplayPower(connected_powernet.viewload)]<BR>"
menu += "<FONT SIZE=-1>"
+12 -4
View File
@@ -202,6 +202,8 @@
var/list/cameras = flatten_list(bugged_cameras)
var/obj/machinery/camera/C = locate(href_list["monitor"]) in cameras
if(C && istype(C))
if(!same_z_level(C))
return
track_mode = BUGMODE_MONITOR
current = C
usr.reset_perspective(null)
@@ -221,6 +223,8 @@
var/list/cameras = flatten_list(bugged_cameras)
var/obj/machinery/camera/C = locate(href_list["emp"]) in cameras
if(C && istype(C) && C.bug == src)
if(!same_z_level(C))
return
C.emp_act(EMP_HEAVY)
C.bug = null
bugged_cameras -= C.c_tag
@@ -235,13 +239,11 @@
var/list/cameras = flatten_list(bugged_cameras)
var/obj/machinery/camera/C = locate(href_list["view"]) in cameras
if(C && istype(C))
if(!same_z_level(C))
return
if(!C.can_use())
to_chat(usr, "<span class='warning'>Something's wrong with that camera! You can't get a feed.</span>")
return
var/turf/T = get_turf(loc)
if(!T || C.z != T.z)
to_chat(usr, "<span class='warning'>You can't get a signal!</span>")
return
current = C
spawn(6)
if(src.check_eye(usr))
@@ -293,6 +295,12 @@
break
src.updateSelfDialog()
/obj/item/camera_bug/proc/same_z_level(var/obj/machinery/camera/C)
var/turf/T = get_turf(loc)
if(!T || C.z != T.z)
to_chat(usr, "<span class='warning'>You can't get a signal!</span>")
return FALSE
return TRUE
#undef BUGMODE_LIST
#undef BUGMODE_MONITOR
+3
View File
@@ -29,6 +29,9 @@ GLOBAL_LIST_EMPTY(GPS_list)
return ..()
/obj/item/gps/emp_act(severity)
. = ..()
if (. & EMP_PROTECT_SELF)
return
emped = TRUE
cut_overlay("working")
add_overlay("emp")
+3 -2
View File
@@ -156,7 +156,8 @@
visible_message("<span class ='info'>[src] flashes a message across its screen, \"Additional personalities available for download.\"", "<span class='notice'>[src] bleeps electronically.</span>")
/obj/item/paicard/emp_act(severity)
. = ..()
if (. & EMP_PROTECT_SELF)
return
if(pai)
pai.emp_act(severity)
..()
@@ -6,7 +6,7 @@
desc = "A basic handheld radio that communicates with local telecommunication networks."
dog_fashion = /datum/dog_fashion/back
flags_1 = CONDUCT_1 | HEAR_1 | NO_EMP_WIRES_1
flags_1 = CONDUCT_1 | HEAR_1
slot_flags = ITEM_SLOT_BELT
throw_speed = 3
throw_range = 7
@@ -95,6 +95,10 @@
for(var/ch_name in channels)
secure_radio_connections[ch_name] = add_radio(src, GLOB.radiochannels[ch_name])
/obj/item/radio/ComponentInitialize()
. = ..()
AddComponent(/datum/component/empprotection, EMP_PROTECT_WIRES)
/obj/item/radio/interact(mob/user)
if (..())
return
@@ -339,6 +343,9 @@
return ..()
/obj/item/radio/emp_act(severity)
. = ..()
if (. & EMP_PROTECT_SELF)
return
emped++ //There's been an EMP; better count it
var/curremp = emped //Remember which EMP this was
if (listening && ismob(loc)) // if the radio is turned on and on someone's person they notice
@@ -353,7 +360,6 @@
emped = 0
if (!istype(src, /obj/item/radio/intercom)) // intercoms will turn back on on their own
on = TRUE
..()
///////////////////////////////
//////////Borg Radios//////////
@@ -1,7 +1,6 @@
/obj/item/transfer_valve
icon = 'icons/obj/assemblies.dmi'
name = "tank transfer valve"
icon = 'icons/obj/device.dmi'
icon_state = "valve_1"
item_state = "ttv"
lefthand_file = 'icons/mob/inhands/weapons/bombs_lefthand.dmi'
+1 -1
View File
@@ -235,7 +235,7 @@
spellname = "knock"
icon_state ="bookknock"
desc = "This book is hard to hold closed properly."
remarks = list("Open Sesame!", "So THAT'S the magic password!", "Slow down, book. I still haven't finished this page...", "The book won't stop moving!", "I think this is hurting the spine of the book...", "I can't get to the next page, it's stuck t I'm good, it just turned to the next page on it's own.", "Yeah, staff of doors does the same thing. Go figure...")
remarks = list("Open Sesame!", "So THAT'S the magic password!", "Slow down, book. I still haven't finished this page...", "The book won't stop moving!", "I think this is hurting the spine of the book...", "I can't get to the next page, it's stuck t- I'm good, it just turned to the next page on it's own.", "Yeah, staff of doors does the same thing. Go figure...")
/obj/item/book/granter/spell/knock/recoil(mob/living/user)
..()
+7 -3
View File
@@ -5,7 +5,7 @@
item_state = "plastic-explosive"
lefthand_file = 'icons/mob/inhands/weapons/bombs_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/bombs_righthand.dmi'
flags_1 = NOBLUDGEON_1 | NO_EMP_WIRES_1
flags_1 = NOBLUDGEON_1
det_time = 10
display_timer = 0
w_class = WEIGHT_CLASS_SMALL
@@ -19,9 +19,13 @@
var/can_attach_mob = FALSE
var/full_damage_on_mobs = FALSE
/obj/item/grenade/plastic/New()
/obj/item/grenade/plastic/Initialize()
. = ..()
plastic_overlay = mutable_appearance(icon, "[item_state]2", HIGH_OBJ_LAYER)
..()
/obj/item/grenade/plastic/ComponentInitialize()
. = ..()
AddComponent(/datum/component/empprotection, EMP_PROTECT_WIRES)
/obj/item/grenade/plastic/Destroy()
qdel(nadeassembly)
@@ -17,7 +17,7 @@
C.flash_act()
// Spawn some hostile syndicate critters and spread them out
spawn_and_random_walk(spawner_type, T, deliveryamt, walk_chance=50, admin_spawn=admin_spawned)
spawn_and_random_walk(spawner_type, T, deliveryamt, walk_chance=50, admin_spawn=((flags_1 & ADMIN_SPAWNED_1) ? TRUE : FALSE))
qdel(src)
+169
View File
@@ -1,3 +1,172 @@
// CHAPLAIN CUSTOM ARMORS //
/obj/item/clothing/head/helmet/chaplain
name = "crusader helmet"
desc = "Deus Vult."
icon_state = "knight_templar"
item_state = "knight_templar"
armor = list("melee" = 41, "bullet" = 15, "laser" = 5,"energy" = 5, "bomb" = 5, "bio" = 2, "rad" = 0, "fire" = 0, "acid" = 50)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
strip_delay = 80
dog_fashion = null
/obj/item/clothing/suit/armor/riot/chaplain
name = "crusader armour"
desc = "God wills it!"
icon_state = "knight_templar"
item_state = "knight_templar"
/obj/item/holybeacon
name = "armaments beacon"
desc = "Contains a set of armaments for the chaplain."
icon = 'icons/obj/device.dmi'
icon_state = "gangtool-red"
item_state = "radio"
/obj/item/holybeacon/attack_self(mob/user)
if(user.mind && (user.mind.isholy) && !SSreligion.holy_armor_type)
beacon_armor(user)
else
playsound(src, 'sound/machines/buzz-sigh.ogg', 40, 1)
/obj/item/holybeacon/proc/beacon_armor(mob/M)
var/list/holy_armor_list = typesof(/obj/item/storage/box/holy)
var/list/display_names = list()
for(var/V in holy_armor_list)
var/atom/A = V
display_names += list(initial(A.name) = A)
var/choice = input(M,"What holy armor kit would you like to order?","Holy Armor Theme") as null|anything in display_names
if(QDELETED(src) || !choice || M.stat || !in_range(M, src) || M.restrained() || !M.canmove || SSreligion.holy_armor_type)
return
var/index = display_names.Find(choice)
var/A = holy_armor_list[index]
SSreligion.holy_armor_type = A
var/holy_armor_box = new A
SSblackbox.record_feedback("tally", "chaplain_armor", 1, "[choice]")
if(holy_armor_box)
qdel(src)
M.put_in_active_hand(holy_armor_box)///YOU COMPILED
/obj/item/storage/box/holy
name = "Templar Kit"
/obj/item/storage/box/holy/PopulateContents()
new /obj/item/clothing/head/helmet/chaplain(src)
new /obj/item/clothing/suit/armor/riot/chaplain(src)
/obj/item/storage/box/holy/student
name = "Profane Scholar Kit"
/obj/item/storage/box/holy/student/PopulateContents()
new /obj/item/clothing/suit/armor/riot/chaplain/studentuni(src)
new /obj/item/clothing/head/helmet/chaplain/cage(src)
/obj/item/clothing/suit/armor/riot/chaplain/studentuni
name = "student robe"
desc = "The uniform of a bygone institute of learning."
icon_state = "studentuni"
item_state = "studentuni"
body_parts_covered = ARMS|CHEST
allowed = list(/obj/item/storage/book/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
/obj/item/clothing/head/helmet/chaplain/cage
name = "cage"
desc = "A cage that restrains the will of the self, allowing one to see the profane world for what it is."
alternate_worn_icon = 'icons/mob/large-worn-icons/64x64/head.dmi'
icon_state = "cage"
item_state = "cage"
worn_x_dimension = 64
worn_y_dimension = 64
dynamic_hair_suffix = ""
/obj/item/storage/box/holy/sentinel
name = "Stone Sentinel Kit"
/obj/item/storage/box/holy/sentinel/PopulateContents()
new /obj/item/clothing/suit/armor/riot/chaplain/ancient(src)
new /obj/item/clothing/head/helmet/chaplain/ancient(src)
/obj/item/clothing/head/helmet/chaplain/ancient
name = "ancient helmet"
desc = "None may pass!"
icon_state = "knight_ancient"
item_state = "knight_ancient"
/obj/item/clothing/suit/armor/riot/chaplain/ancient
name = "ancient armour"
desc = "Defend the treasure..."
icon_state = "knight_ancient"
item_state = "knight_ancient"
/obj/item/storage/box/holy/witchhunter
name = "Witchhunter Kit"
/obj/item/storage/box/holy/witchhunter/PopulateContents()
new /obj/item/clothing/suit/armor/riot/chaplain/witchhunter(src)
new /obj/item/clothing/head/helmet/chaplain/witchunter_hat(src)
/obj/item/clothing/suit/armor/riot/chaplain/witchhunter
name = "witchunter garb"
desc = "This worn outfit saw much use back in the day."
icon_state = "witchhunter"
item_state = "witchhunter"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
allowed = list(/obj/item/storage/book/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
/obj/item/clothing/head/helmet/chaplain/witchunter_hat
name = "witchunter hat"
desc = "This hat saw much use back in the day."
icon_state = "witchhunterhat"
item_state = "witchhunterhat"
flags_cover = HEADCOVERSEYES
/obj/item/storage/box/holy/follower
name = "Followers of the Chaplain Kit"
/obj/item/storage/box/holy/follower/PopulateContents()
new /obj/item/clothing/suit/hooded/chaplain_hoodie/leader(src)
new /obj/item/clothing/suit/hooded/chaplain_hoodie(src)
new /obj/item/clothing/suit/hooded/chaplain_hoodie(src)
new /obj/item/clothing/suit/hooded/chaplain_hoodie(src)
new /obj/item/clothing/suit/hooded/chaplain_hoodie(src)
/obj/item/clothing/suit/hooded/chaplain_hoodie
name = "follower hoodie"
desc = "Hoodie made for acolytes of the chaplain."
icon_state = "chaplain_hoodie"
item_state = "chaplain_hoodie"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
allowed = list(/obj/item/storage/book/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
hoodtype = /obj/item/clothing/head/hooded/chaplain_hood
/obj/item/clothing/head/hooded/chaplain_hood
name = "follower hood"
desc = "Hood made for acolytes of the chaplain."
icon_state = "chaplain_hood"
body_parts_covered = HEAD
flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
/obj/item/clothing/suit/hooded/chaplain_hoodie/leader
name = "leader hoodie"
desc = "Now you're ready for some 50 dollar bling water."
icon_state = "chaplain_hoodie_leader"
item_state = "chaplain_hoodie_leader"
hoodtype = /obj/item/clothing/head/hooded/chaplain_hood/leader
/obj/item/clothing/head/hooded/chaplain_hood/leader
name = "leader hood"
desc = "I mean, you don't /have/ to seek bling water. I just think you should."
icon_state = "chaplain_hood_leader"
// CHAPLAIN NULLROD AND CUSTOM WEAPONS //
/obj/item/nullrod
name = "null rod"
desc = "A rod of pure obsidian; its very presence disrupts and dampens the powers of Nar-Sie and Ratvar's followers."
+2 -4
View File
@@ -29,8 +29,8 @@
return cell
/obj/item/inducer/emp_act(severity)
..()
if(cell)
. = ..()
if(cell && !(. & EMP_PROTECT_CONTENTS))
cell.emp_act(severity)
/obj/item/inducer/attack_obj(obj/O, mob/living/carbon/user)
@@ -181,5 +181,3 @@
/obj/item/inducer/sci/Initialize()
. = ..()
update_icon()
+21 -7
View File
@@ -276,6 +276,7 @@
/obj/item/harmalarm
name = "\improper Sonic Harm Prevention Tool"
desc = "Releases a harmless blast that confuses most organics. For when the harm is JUST TOO MUCH."
icon = 'icons/obj/device.dmi'
icon_state = "megaphone"
var/cooldown = 0
@@ -339,10 +340,11 @@
#define DISPENSE_LOLLIPOP_MODE 1
#define THROW_LOLLIPOP_MODE 2
#define THROW_GUMBALL_MODE 3
#define DISPENSE_ICECREAM_MODE 4
/obj/item/borg/lollipop
name = "lollipop fabricator"
desc = "Reward good humans with this. Toggle in-module to switch between dispensing and high velocity ejection modes."
name = "treat fabricator"
desc = "Reward humans with various treats. Toggle in-module to switch between dispensing and high velocity ejection modes."
icon_state = "lollipop"
var/candy = 30
var/candymax = 30
@@ -378,7 +380,7 @@
/obj/item/borg/lollipop/proc/dispense(atom/A, mob/user)
if(candy <= 0)
to_chat(user, "<span class='warning'>No lollipops left in storage!</span>")
to_chat(user, "<span class='warning'>No treats left in storage!</span>")
return FALSE
var/turf/T = get_turf(A)
if(!T || !istype(T) || !isopenturf(T))
@@ -388,7 +390,15 @@
if(O.density)
return FALSE
var/obj/item/reagent_containers/food/snacks/lollipop/L = new(T)
var/obj/item/reagent_containers/food/snacks/L
switch(mode)
if(DISPENSE_LOLLIPOP_MODE)
L = new /obj/item/reagent_containers/food/snacks/lollipop(T)
if(DISPENSE_ICECREAM_MODE)
L = new /obj/item/reagent_containers/food/snacks/icecream(T)
var/obj/item/reagent_containers/food/snacks/icecream/I = L
I.add_ice_cream("vanilla")
I.desc = "Eat the ice cream."
var/into_hands = FALSE
if(ismob(A))
@@ -399,9 +409,9 @@
check_amount()
if(into_hands)
user.visible_message("<span class='notice'>[user] dispenses a lollipop into the hands of [A].</span>", "<span class='notice'>You dispense a lollipop into the hands of [A].</span>", "<span class='italics'>You hear a click.</span>")
user.visible_message("<span class='notice'>[user] dispenses a treat into the hands of [A].</span>", "<span class='notice'>You dispense a treat into the hands of [A].</span>", "<span class='italics'>You hear a click.</span>")
else
user.visible_message("<span class='notice'>[user] dispenses a lollipop.</span>", "<span class='notice'>You dispense a lollipop.</span>", "<span class='italics'>You hear a click.</span>")
user.visible_message("<span class='notice'>[user] dispenses a treat.</span>", "<span class='notice'>You dispense a treat.</span>", "<span class='italics'>You hear a click.</span>")
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
return TRUE
@@ -447,7 +457,7 @@
if(R.emagged)
hitdamage = emaggedhitdamage
switch(mode)
if(DISPENSE_LOLLIPOP_MODE)
if(DISPENSE_LOLLIPOP_MODE, DISPENSE_ICECREAM_MODE)
if(!proximity)
return FALSE
dispense(target, user)
@@ -466,6 +476,9 @@
mode = THROW_GUMBALL_MODE
to_chat(user, "<span class='notice'>Module is now blasting gumballs.</span>")
if(THROW_GUMBALL_MODE)
mode = DISPENSE_ICECREAM_MODE
to_chat(user, "<span class='notice'>Module is now dispensing ice cream.</span>")
if(DISPENSE_ICECREAM_MODE)
mode = DISPENSE_LOLLIPOP_MODE
to_chat(user, "<span class='notice'>Module is now dispensing lollipops.</span>")
..()
@@ -473,6 +486,7 @@
#undef DISPENSE_LOLLIPOP_MODE
#undef THROW_LOLLIPOP_MODE
#undef THROW_GUMBALL_MODE
#undef DISPENSE_ICECREAM_MODE
/obj/item/ammo_casing/caseless/gumball
name = "Gumball"
@@ -190,7 +190,7 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \
new/datum/stack_recipe("winged wooden chair", /obj/structure/chair/wood/wings, 3, time = 10, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("wooden barricade", /obj/structure/barricade/wooden, 5, time = 50, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("wooden door", /obj/structure/mineral_door/wood, 10, time = 20, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("coffin", /obj/structure/closet/crate/coffin, 5, time = 15, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("book case", /obj/structure/bookcase, 4, time = 15, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("drying rack", /obj/machinery/smartfridge/drying_rack, 10, time = 15, one_per_turf = TRUE, on_floor = TRUE), \
new/datum/stack_recipe("dog bed", /obj/structure/bed/dogbed, 10, time = 10, one_per_turf = TRUE, on_floor = TRUE), \
+1 -1
View File
@@ -607,4 +607,4 @@
/obj/item/storage/belt/sabre/PopulateContents()
new /obj/item/melee/sabre(src)
update_icon()
update_icon()
+3 -2
View File
@@ -178,8 +178,9 @@
return 1
/obj/item/melee/baton/emp_act(severity)
deductcharge(1000 / severity)
..()
. = ..()
if (!(. & EMP_PROTECT_SELF))
deductcharge(1000 / severity)
//Makeshift stun baton. Replacement for stun gloves.
/obj/item/melee/baton/cattleprod
+1 -1
View File
@@ -103,7 +103,7 @@
H.bleedsuppress = TRUE //AND WE WON'T BLEED OUT LIKE COWARDS
H.adjustStaminaLoss(-5) //CIT CHANGE - AND MAY HE NEVER SUCCUMB TO EXHAUSTION
else
if(!admin_spawned)
if(!(flags_1 & ADMIN_SPAWNED_1))
qdel(src)
+2 -4
View File
@@ -222,12 +222,10 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e
cut_overlay(GLOB.fire_overlay, TRUE)
SSfire_burning.processing -= src
/obj/proc/tesla_act(var/power)
/obj/proc/tesla_act(power, tesla_flags, shocked_targets)
obj_flags |= BEING_SHOCKED
var/power_bounced = power / 2
tesla_zap(src, 3, power_bounced)
tesla_zap(src, 3, power_bounced, tesla_flags, shocked_targets)
addtimer(CALLBACK(src, .proc/reset_shocked), 10)
//The surgeon general warns that being buckled to certain objects recieving powerful shocks is greatly hazardous to your health

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