Merge branch 'theprthatbulliesjanitormains' of https://github.com/deathride58/Citadel-Station-13 into theprthatbulliesjanitormains

This commit is contained in:
deathride58
2017-12-04 18:02:18 -05:00
180 changed files with 1423 additions and 805 deletions
+1 -1
View File
@@ -671,4 +671,4 @@ into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+1 -1
View File
@@ -140,7 +140,7 @@ All code after [commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at
All code before [commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST](https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under [GNU GPL v3](https://www.gnu.org/licenses/gpl-3.0.html).
(Including tools unless their readme specifies otherwise.)
See LICENSE and LICENSE-GPLv3.txt for more details.
See LICENSE and OLD_LICENSE-GPLv3.txt for more details.
tgui clientside is licensed as a subproject under the MIT license.
Font Awesome font files, used by tgui, are licensed under the SIL Open Font License v1.1
+30 -30
View File
@@ -1979,7 +1979,7 @@
"fI" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/door/airlock/maintenance_hatch,
/obj/machinery/atmospherics/pipe/simple/supply/visible,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plating,
/area/ruin/space/has_grav/ancientstation/hydroponics)
"fJ" = (
@@ -2111,12 +2111,12 @@
/turf/open/floor/plasteel/airless/floorgrime,
/area/ruin/space/has_grav/ancientstation/betanorth)
"ga" = (
/obj/machinery/atmospherics/pipe/simple/supply/visible{
dir = 4
},
/obj/structure/cable{
icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/open/floor/plating/airless,
/area/ruin/space/has_grav/ancientstation/betanorth)
"gb" = (
@@ -2124,7 +2124,7 @@
/obj/item/stack/cable_coil{
amount = 2
},
/obj/machinery/atmospherics/pipe/simple/supply/visible{
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/template_noop,
@@ -2134,12 +2134,12 @@
/obj/structure/cable{
icon_state = "2-4"
},
/obj/machinery/atmospherics/pipe/simple/supply/visible{
dir = 4
},
/obj/structure/cable{
icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/template_noop,
/area/template_noop)
"gd" = (
@@ -2147,7 +2147,7 @@
/obj/structure/cable{
icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/simple/supply/visible{
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/template_noop,
@@ -2163,7 +2163,7 @@
/obj/structure/cable{
icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/simple/supply/visible{
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/template_noop,
@@ -2176,7 +2176,7 @@
/obj/structure/cable{
icon_state = "2-4"
},
/obj/machinery/atmospherics/pipe/simple/supply/visible{
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/template_noop,
@@ -2192,7 +2192,7 @@
/obj/structure/cable{
icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/simple/supply/visible{
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/open/floor/plating,
@@ -2202,7 +2202,7 @@
/obj/structure/cable{
icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/simple/supply/visible{
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/open/floor/plating,
@@ -2216,7 +2216,7 @@
/obj/structure/cable{
icon_state = "2-8"
},
/obj/machinery/atmospherics/pipe/simple/supply/visible{
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/open/floor/plating,
@@ -2230,7 +2230,7 @@
icon_state = "1-8"
},
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/simple/supply/visible{
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/open/floor/plating,
@@ -2253,7 +2253,7 @@
/obj/item/stack/cable_coil{
amount = 2
},
/obj/machinery/atmospherics/pipe/simple/supply/visible{
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/open/floor/plating,
@@ -2318,7 +2318,7 @@
},
/obj/machinery/door/airlock/maintenance_hatch,
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/simple/supply/visible{
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/open/floor/plating,
@@ -2328,7 +2328,7 @@
icon_state = "4-8"
},
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/simple/supply/visible{
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/open/floor/plating,
@@ -2347,7 +2347,7 @@
/obj/structure/cable{
icon_state = "0-8"
},
/obj/machinery/atmospherics/pipe/simple/supply/visible{
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/open/floor/plating,
@@ -2358,7 +2358,7 @@
},
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/manifold/supply/visible{
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 4
},
/turf/open/floor/plating,
@@ -2485,7 +2485,7 @@
/obj/structure/cable{
icon_state = "0-4"
},
/obj/machinery/atmospherics/pipe/simple/supply/visible{
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/open/floor/plating,
@@ -2494,7 +2494,7 @@
/obj/structure/cable{
icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/simple/supply/visible{
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/open/floor/plating/airless,
@@ -2504,7 +2504,7 @@
/obj/structure/cable{
icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/simple/supply/visible{
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/open/floor/plating,
@@ -2514,7 +2514,7 @@
/obj/structure/cable{
icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/simple/supply/visible{
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/open/floor/plating,
@@ -2527,7 +2527,7 @@
/obj/structure/cable{
icon_state = "1-8"
},
/obj/machinery/atmospherics/pipe/simple/supply/visible{
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/open/floor/plating,
@@ -2538,7 +2538,7 @@
icon_state = "4-8"
},
/obj/machinery/door/airlock/maintenance_hatch,
/obj/machinery/atmospherics/pipe/simple/supply/visible{
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/turf/open/floor/plating,
@@ -2670,7 +2670,7 @@
"gZ" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/door/airlock/maintenance_hatch,
/obj/machinery/atmospherics/pipe/simple/supply/visible,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plating,
/area/ruin/space/has_grav/ancientstation/kitchen)
"ha" = (
@@ -2687,7 +2687,7 @@
/area/ruin/space/has_grav/ancientstation/sec)
"hc" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/simple/supply/visible,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/red/side{
dir = 4
},
@@ -2854,7 +2854,7 @@
/obj/machinery/light/small{
dir = 4
},
/obj/machinery/atmospherics/pipe/simple/supply/visible,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/red/side{
dir = 4
},
@@ -4288,7 +4288,7 @@
/turf/open/floor/plasteel/white,
/area/ruin/space/has_grav/ancientstation/proto)
"kV" = (
/obj/machinery/atmospherics/pipe/manifold/supply/visible{
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 8
},
/turf/open/floor/plating/airless,
+1 -13
View File
@@ -3301,18 +3301,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plating,
/area/ruin/space/has_grav/hotel)
"iX" = (
/obj/structure/cable{
icon_state = "4-8"
},
/obj/structure/cable{
icon_state = "2-8"
},
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 1
},
/turf/open/floor/plating,
/area/ruin/space/has_grav/hotel)
"iY" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -3944,7 +3932,7 @@
/area/ruin/space/has_grav/hotel/security)
"kP" = (
/obj/effect/turf_decal/stripes/corner{
dir = 2
dir = 1
},
/turf/open/floor/plasteel/darkyellow,
/area/ruin/space/has_grav/hotel/security)
+3
View File
@@ -59,6 +59,9 @@
#define iszombie(A) (is_species(A, /datum/species/zombie))
#define ishumanbasic(A) (is_species(A, /datum/species/human))
//why arent catpeople a subspecies
#define iscatperson(A) (ishumanbasic(A) && ( A.dna.features["ears"] == "Cat" || A.dna.features["human_tail"] == "Cat") )
//more carbon mobs
#define ismonkey(A) (istype(A, /mob/living/carbon/monkey))
+5
View File
@@ -478,3 +478,8 @@ GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE
#define SYRINGE_DRAW 0
#define SYRINGE_INJECT 1
//gold slime core spawning
#define NO_SPAWN 0
#define HOSTILE_SPAWN 1
#define FRIENDLY_SPAWN 2
+6 -1
View File
@@ -11,4 +11,9 @@
#define INGEST 2 //ingestion
#define VAPOR 3 //foam, spray, blob attack
#define PATCH 4 //patches
#define INJECT 5 //injection
#define INJECT 5 //injection
//defines passed through to the on_reagent_change proc
#define DEL_REAGENT 1 //reagent deleted (fully cleared)
#define ADD_REAGENT 2 // reagent added
#define REM_REAGENT 3 // reagent removed (may still exist)
+2 -1
View File
@@ -225,7 +225,8 @@
else // A variation of get_hear inlined here to take advantage of the compiler's fastpath for obj/mob in view
var/lum = T.luminosity
T.luminosity = 6 // This is the maximum luminosity
processing_list = viewers(R, T)
for(var/mob/M in view(R, T))
processing_list += M
for(var/obj/O in view(R, T))
processing_list += O
T.luminosity = lum
+1 -1
View File
@@ -949,7 +949,7 @@ GLOBAL_LIST_EMPTY(friendly_animal_types)
if(!GLOB.friendly_animal_types.len)
for(var/T in typesof(/mob/living/simple_animal))
var/mob/living/simple_animal/SA = T
if(initial(SA.gold_core_spawnable) == 2)
if(initial(SA.gold_core_spawnable) == FRIENDLY_SPAWN)
GLOB.friendly_animal_types += SA
+21
View File
@@ -232,3 +232,24 @@ GLOBAL_LIST_INIT(sqrtTable, list(1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4,
if(round(num) != num)
return round(num--)
else return num
//proc/get_overlap()
// Returns a list where [1] is all x values and [2] is all y values that overlap between the given pair of rectangles
/proc/get_overlap(x1, y1, x2, y2, x3, y3, x4, y4)
var/list/region_x1 = list()
var/list/region_y1 = list()
var/list/region_x2 = list()
var/list/region_y2 = list()
// These loops create loops filled with x/y values that the boundaries inhabit
// ex: list(5, 6, 7, 8, 9)
for(var/i in min(x1, x2) to max(x1, x2))
region_x1["[i]"] = TRUE
for(var/i in min(y1, y2) to max(y1, y2))
region_y1["[i]"] = TRUE
for(var/i in min(x3, x4) to max(x3, x4))
region_x2["[i]"] = TRUE
for(var/i in min(y3, y4) to max(y3, y4))
region_y2["[i]"] = TRUE
return list(region_x1 & region_x2, region_y1 & region_y2)
+1
View File
@@ -24,6 +24,7 @@ GLOBAL_LIST_EMPTY(landmarks_list) //list of all landmarks created
GLOBAL_LIST_EMPTY(start_landmarks_list) //list of all spawn points created
GLOBAL_LIST_EMPTY(department_security_spawns) //list of all department security spawns
GLOBAL_LIST_EMPTY(generic_event_spawns) //list of all spawns for events
GLOBAL_LIST_EMPTY(jobspawn_overrides) //These will take precedence over normal spawnpoints if created.
GLOBAL_LIST_EMPTY(wizardstart)
GLOBAL_LIST_EMPTY(nukeop_start)
+11 -10
View File
@@ -215,7 +215,7 @@
damage = 15
armour_penetration = 10
light_range = 2
speed = 1.2
speed = 0.6
range = 25
light_color = LIGHT_COLOR_RED
@@ -224,10 +224,10 @@
icon_state = "magjectile-nl"
damage = 1
knockdown = 0
stamina = 30
stamina = 25
armour_penetration = -10
light_range = 2
speed = 1.2
speed = 0.7
range = 25
light_color = LIGHT_COLOR_BLUE
@@ -257,7 +257,7 @@
origin_tech = "magnets=5"
ammo_type = /obj/item/ammo_casing/caseless/anlmags
caliber = "mags"
max_ammo = 7
max_ammo = 15
multiple_sprites = 2
/obj/item/ammo_box/magazine/mmag/small/lethal
@@ -279,7 +279,7 @@
mag_type = /obj/item/ammo_box/magazine/mmag/small
can_suppress = 0
casing_ejector = 0
fire_delay = 5
fire_delay = 2
origin_tech = "combat=4;magnets=4"
/obj/item/gun/ballistic/automatic/pistol/mag/update_icon()
@@ -389,7 +389,7 @@
damage = 20
armour_penetration = 25
light_range = 3
speed = 1.2
speed = 0.7
range = 35
light_color = LIGHT_COLOR_RED
@@ -398,10 +398,10 @@
icon_state = "magjectile-large-nl"
damage = 0
knockdown = 0
stamina = 35
stamina = 20
armour_penetration = -10
light_range = 3
speed = 1.0
speed = 0.65
range = 35
light_color = LIGHT_COLOR_BLUE
@@ -430,7 +430,7 @@
origin_tech = "magnets=6"
ammo_type = /obj/item/ammo_casing/caseless/anlmagm
caliber = "magm"
max_ammo = 15
max_ammo = 27
multiple_sprites = 2
/obj/item/ammo_box/magazine/mmag/lethal
@@ -439,6 +439,7 @@
icon_state = "mediummagmag"
origin_tech = "combat=6"
ammo_type = /obj/item/ammo_casing/caseless/amagm
max_ammo = 21
///the gun itself///
@@ -455,7 +456,7 @@
can_suppress = 0
burst_size = 3
fire_delay = 2
spread = 30
spread = 20
recoil = 1
casing_ejector = 0
@@ -381,3 +381,7 @@ CONFIG_TWEAK(flag/ValidateAndSet(str_val))
. = ..()
if(. && Master.current_runlevel)
world.sleep_offline = !value
CONFIG_DEF(number/rounds_until_hard_restart)
value = -1
min_val = 0
+6
View File
@@ -393,6 +393,8 @@ SUBSYSTEM_DEF(job)
continue
S = sloc
break
if(length(GLOB.jobspawn_overrides[rank]))
S = pick(GLOB.jobspawn_overrides[rank])
if(S)
SendToAtom(H, S, buckle = FALSE)
if(!S) //if there isn't a spawnpoint send them to latejoin, if there's no latejoin go yell at your mapper
@@ -536,6 +538,10 @@ SUBSYSTEM_DEF(job)
M.forceMove(get_turf(A))
/datum/controller/subsystem/job/proc/SendToLateJoin(mob/M, buckle = TRUE)
if(M.mind && M.mind.assigned_role && length(GLOB.jobspawn_overrides[M.mind.assigned_role])) //We're doing something special today.
SendToAtom(M,pick(GLOB.jobspawn_overrides[M.mind.assigned_role]),FALSE)
return
if(latejoin_trackers.len)
SendToAtom(M, pick(latejoin_trackers), buckle)
else
+14
View File
@@ -62,6 +62,7 @@ SUBSYSTEM_DEF(mapping)
repopulate_sorted_areas()
// Set up Z-level transistions.
setup_map_transitions()
generate_station_area_list()
..()
/* Nuke threats, for making the blue tiles on the station go RED
@@ -139,6 +140,19 @@ SUBSYSTEM_DEF(mapping)
INIT_ANNOUNCE(msg)
#undef INIT_ANNOUNCE
GLOBAL_LIST_EMPTY(the_station_areas)
/datum/controller/subsystem/mapping/proc/generate_station_area_list()
var/list/station_areas_blacklist = typecacheof(list(/area/space, /area/mine, /area/ruin))
for(var/area/A in world)
var/turf/picked = safepick(get_area_turfs(A.type))
if(picked && (picked.z in GLOB.station_z_levels))
if(!(A.type in GLOB.the_station_areas) && !is_type_in_typecache(A, station_areas_blacklist))
GLOB.the_station_areas.Add(A.type)
if(!GLOB.the_station_areas.len)
log_world("ERROR: Station areas list failed to generate!")
/datum/controller/subsystem/mapping/proc/maprotate()
var/players = GLOB.clients.len
var/list/mapvotes = list()
+27 -3
View File
@@ -622,6 +622,30 @@ SUBSYSTEM_DEF(shuttle)
return TRUE
/datum/controller/subsystem/shuttle/proc/get_containing_shuttle(atom/A)
for(var/obj/docking_port/mobile/M in mobile)
if(M.is_in_shuttle_bounds(A))
return M
var/list/mobile_cache = mobile
for(var/i in 1 to mobile_cache.len)
var/obj/docking_port/port = mobile_cache[i]
if(port.is_in_shuttle_bounds(A))
return port
/datum/controller/subsystem/shuttle/proc/get_containing_dock(atom/A)
. = list()
var/list/stationary_cache = stationary
for(var/i in 1 to stationary_cache.len)
var/obj/docking_port/port = stationary_cache[i]
if(port.is_in_shuttle_bounds(A))
. += port
/datum/controller/subsystem/shuttle/proc/get_dock_overlap(x0, y0, x1, y1, z)
. = list()
var/list/stationary_cache = stationary
for(var/i in 1 to stationary_cache.len)
var/obj/docking_port/port = stationary_cache[i]
if(!port || port.z != z)
continue
var/list/bounds = port.return_coords()
var/list/overlap = get_overlap(x0, y0, x1, y1, bounds[1], bounds[2], bounds[3], bounds[4])
var/list/xs = overlap[1]
var/list/ys = overlap[2]
if(xs.len && ys.len)
.[port] = overlap
+1 -1
View File
@@ -319,7 +319,7 @@ SUBSYSTEM_DEF(ticker)
//Cleanup some stuff
for(var/obj/effect/landmark/start/S in GLOB.landmarks_list)
//Deleting Startpoints but we need the ai point to AI-ize people later
if(S.name != "AI")
if(S.delete_after_roundstart)
qdel(S)
//assign crew objectives and generate miscreants
+3 -1
View File
@@ -5,6 +5,7 @@
var/datum/action/innate/cult/comm/communion = new
var/datum/action/innate/cult/mastervote/vote = new
job_rank = ROLE_CULTIST
var/ignore_implant = FALSE
/datum/antagonist/cult/Destroy()
QDEL_NULL(communion)
@@ -65,7 +66,7 @@
/datum/antagonist/cult/can_be_owned(datum/mind/new_owner)
. = ..()
if(.)
if(. && !ignore_implant)
. = is_convertable_to_cult(new_owner.current)
/datum/antagonist/cult/on_gain()
@@ -121,6 +122,7 @@
var/datum/action/innate/cult/master/finalreck/reckoning = new
var/datum/action/innate/cult/master/cultmark/bloodmark = new
var/datum/action/innate/cult/master/pulse/throwing = new
ignore_implant = TRUE
/datum/antagonist/cult/master/Destroy()
QDEL_NULL(reckoning)
+5
View File
@@ -149,6 +149,11 @@
owner = null
return ..()
/obj/effect/ebeam/singularity_pull()
return
/obj/effect/ebeam/singularity_act()
return
/atom/proc/Beam(atom/BeamTarget,icon_state="b_beam",icon='icons/effects/beam.dmi',time=50, maxdistance=10,beam_type=/obj/effect/ebeam,beam_sleep_time = 3)
var/datum/beam/newbeam = new(src,BeamTarget,icon,icon_state,time,maxdistance,beam_type,beam_sleep_time)
INVOKE_ASYNC(newbeam, /datum/beam/.proc/Start)
+20 -3
View File
@@ -3,13 +3,30 @@
var/amount
var/overlay
var/static/list/blacklist = typecacheof(/turf/closed/wall/mineral/diamond)
var/static/list/resistlist = typecacheof(/turf/closed/wall/r_wall)
var/static/list/blacklist = typecacheof(
/turf/open/lava,
/turf/open/space,
/turf/open/water,
/turf/open/chasm,
)
var/static/list/immunelist = typecacheof(
/turf/closed/wall/mineral/diamond,
/turf/closed/indestructible,
/turf/open/indestructible,
)
var/static/list/resistlist = typecacheof(
/turf/closed/wall/r_wall,
)
/datum/component/thermite/Initialize(_amount)
if(!istype(parent, /turf))
return COMPONENT_INCOMPATIBLE
. = COMPONENT_INCOMPATIBLE
CRASH("A thermite component has been applied to an incorrect object. parent: [parent]")
if(blacklist[parent.type])
return COMPONENT_INCOMPATIBLE
if(immunelist[parent.type])
_amount*=0 //Yeah the overlay can still go on it and be cleaned but you arent burning down a diamond wall
if(resistlist[parent.type])
_amount*=0.25
+1 -1
View File
@@ -31,7 +31,7 @@
.["Show VV To Player"] = "?_src_=vars;[HrefToken(TRUE)];expose=[REF(src)]"
/datum/proc/on_reagent_change()
/datum/proc/on_reagent_change(changetype)
return
-33
View File
@@ -1486,36 +1486,3 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/tcommsat/lounge
name = "Telecommunications Satellite Lounge"
icon_state = "tcomsatlounge"
/////////////////////////////////////////////////////////////////////
/*
Lists of areas to be used with is_type_in_list.
Used in gamemodes code at the moment. --rastaf0
*/
//SPACE STATION 13
GLOBAL_LIST_INIT(the_station_areas, list (
/area/bridge,
/area/chapel,
/area/construction,
/area/crew_quarters,
/area/engine,
/area/hallway,
/area/holodeck,
/area/hydroponics,
/area/janitor,
/area/lawoffice,
/area/library,
/area/maintenance,
/area/medical,
/area/quartermaster,
/area/science,
/area/security,
/area/solar,
/area/storage,
/area/teleporter,
/area/ai_monitored/storage/eva, //do not try to simplify to "/area/ai_monitored" --rastaf0
/area/ai_monitored/turret_protected/ai_upload, //do not try to simplify to "/area/ai_monitored/turret_protected" --rastaf0
/area/ai_monitored/turret_protected/ai_upload_foyer,
/area/ai_monitored/turret_protected/ai,
))
+2 -2
View File
@@ -100,7 +100,7 @@
var/death_cloud_size = 1 //size of cloud produced from a dying spore
var/mob/living/carbon/human/oldguy
var/is_zombie = 0
gold_core_spawnable = 1
gold_core_spawnable = HOSTILE_SPAWN
/mob/living/simple_animal/hostile/blob/blobspore/Initialize(mapload, var/obj/structure/blob/factory/linked_node)
if(istype(linked_node))
@@ -299,4 +299,4 @@
/mob/living/simple_animal/hostile/blob/blobbernaut/independent
independent = TRUE
gold_core_spawnable = 1
gold_core_spawnable = HOSTILE_SPAWN
+1 -1
View File
@@ -19,7 +19,7 @@
GLOB.poi_list |= src
update_icon() //so it atleast appears
if(!placed && !overmind)
qdel(src)
return INITIALIZE_HINT_QDEL
if(overmind)
update_icon()
point_rate = new_rate
@@ -10,6 +10,13 @@
light_power = 3
light_color = "#6A4D2F"
/obj/effect/clockwork/city_of_cogs_rift/singularity_act()
return
/obj/effect/clockwork/city_of_cogs_rift/singularity_pull()
return
/obj/effect/clockwork/city_of_cogs_rift/Initialize()
. = ..()
visible_message("<span class='warning'>The air above [loc] shimmers and pops as a [name] forms there!</span>")
@@ -10,6 +10,11 @@
/obj/effect/clockwork/overlay/ex_act()
return FALSE
/obj/effect/clockwork/overlay/singularity_act()
return
/obj/effect/clockwork/overlay/singularity_pull()
return
/obj/effect/clockwork/overlay/singularity_pull(S, current_size)
return
@@ -11,6 +11,12 @@
animate(src, alpha = 0, time = 10)
QDEL_IN(src, 10)
/obj/effect/clockwork/general_marker/singularity_act()
return
/obj/effect/clockwork/general_marker/singularity_pull()
return
/obj/effect/clockwork/general_marker/inathneq
name = "Inath-neq, the Resonant Cogwheel"
desc = "A humanoid form blazing with blue fire. It radiates an aura of kindness and caring."
@@ -18,3 +18,9 @@
to_chat(L, "<span class='danger'>The space beyond here can't be accessed by you or other servants.</span>")
return
return TRUE
/obj/effect/clockwork/servant_blocker/singularity_act()
return
/obj/effect/clockwork/servant_blocker/singularity_pull()
return
@@ -109,6 +109,14 @@
return TRUE
return FALSE
/obj/effect/clockwork/spatial_gateway/singularity_act()
return
/obj/effect/clockwork/spatial_gateway/singularity_pull()
return
/obj/effect/clockwork/spatial_gateway/CollidedWith(atom/movable/AM)
..()
if(!QDELETED(AM))
@@ -162,6 +162,12 @@
user = caster
INVOKE_ASYNC(src, .proc/judicialblast)
/obj/effect/clockwork/judicial_marker/singularity_act()
return
/obj/effect/clockwork/judicial_marker/singularity_pull()
return
/obj/effect/clockwork/judicial_marker/proc/judicialblast()
playsound(src, 'sound/magic/magic_missile.ogg', 50, 1, 1, 1)
flick("judicial_marker", src)
@@ -240,3 +240,9 @@
icon_state = "hole"
density = TRUE
anchored = TRUE
/obj/effect/gateway/singularity_act()
return
/obj/effect/gateway/singularity_pull()
return
@@ -32,7 +32,7 @@
return MAP_ERROR
var/obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter((pick(spawn_locs)))
var/mob/living/simple_animal/slaughter/S = new /mob/living/simple_animal/slaughter/(holder)
var/mob/living/simple_animal/slaughter/S = new (holder)
S.holder = holder
player_mind.transfer_to(S)
player_mind.assigned_role = "Slaughter Demon"
+6
View File
@@ -66,6 +66,12 @@
else
return ..()
/obj/effect/rend/singularity_pull()
return
/obj/effect/rend/singularity_pull()
return
/obj/item/veilrender/vealrender
name = "veal render"
desc = "A wicked curved blade of alien origin, recovered from the ruins of a vast farm."
+1 -1
View File
@@ -902,7 +902,7 @@
var/static/banned_spells = list(/obj/item/spellbook/oneuse/mimery_blockade, /obj/item/spellbook/oneuse/mimery_guns)
var/real_type = pick(subtypesof(/obj/item/spellbook/oneuse) - banned_spells)
new real_type(loc)
qdel(src)
return INITIALIZE_HINT_QDEL
/obj/item/spellbook/oneuse/sacredflame
spell = /obj/effect/proc_holder/spell/targeted/sacred_flame
+1 -1
View File
@@ -99,7 +99,7 @@
wizardwin = 0
count++
if(wizard.current && wizard.current.stat!=2 && wizardwin)
if(wizard.current && wizardwin)
text += "<br><font color='green'><B>The wizard was successful!</B></font>"
SSblackbox.record_feedback("tally", "wizard_success", 1, "SUCCESS")
else
+1 -1
View File
@@ -3,7 +3,7 @@
/obj/machinery/computer/robotics
name = "robotics control console"
desc = "Used to remotely lockdown or detonate linked Cyborgs."
desc = "Used to remotely lockdown or detonate linked Cyborgs and Drones."
icon_screen = "robot"
icon_keyboard = "rd_key"
req_access = list(ACCESS_ROBOTICS)
+1
View File
@@ -49,6 +49,7 @@
var/normal_integrity = AIRLOCK_INTEGRITY_N
integrity_failure = 70
damage_deflection = AIRLOCK_DAMAGE_DEFLECTION_N
interact_open = TRUE
var/security_level = 0 //How much are wires secured
var/aiControlDisabled = 0 //If 1, AI control is disabled until the AI hacks back in and disables the lock. If 2, the AI has bypassed the lock. If -1, the control is enabled but the AI had bypassed it earlier, so if it is disabled again the AI would have no trouble getting back in.
+1 -1
View File
@@ -175,7 +175,7 @@
return
if(beaker)
beaker.forceMove(get_turf(src))
beaker.forceMove(drop_location())
beaker = null
update_icon()
+1 -1
View File
@@ -155,7 +155,7 @@
briefcase = loc
else
log_game("[src] has been spawned without a briefcase.")
qdel(src)
return INITIALIZE_HINT_QDEL
/obj/machinery/launchpad/briefcase/Destroy()
QDEL_NULL(briefcase)
@@ -504,7 +504,7 @@
return 1
return
/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/on_reagent_change()
/obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/on_reagent_change(changetype)
..()
update_equip_info()
return
@@ -179,9 +179,6 @@
/obj/item/mecha_parts/mecha_equipment/extinguisher/get_equip_info()
return "[..()] \[[src.reagents.total_volume]\]"
/obj/item/mecha_parts/mecha_equipment/extinguisher/on_reagent_change()
return
/obj/item/mecha_parts/mecha_equipment/extinguisher/can_attach(obj/mecha/working/M as obj)
if(..())
if(istype(M))
+1 -1
View File
@@ -99,7 +99,7 @@
//Wrapper procs that handle sanity and user feedback
/atom/movable/proc/user_buckle_mob(mob/living/M, mob/user, check_loc = TRUE)
if(!in_range(user, src) || user.stat || user.restrained())
if(!in_range(user, src) || !isturf(user.loc) || user.incapacitated())
return FALSE
add_fingerprint(user)
+31 -25
View File
@@ -1,30 +1,36 @@
/obj/effect/bump_teleporter
name = "bump-teleporter"
icon = 'icons/mob/screen_gen.dmi'
icon_state = "x2"
var/id = null //id of this bump_teleporter.
var/id_target = null //id of bump_teleporter which this moves you to.
invisibility = INVISIBILITY_ABSTRACT //nope, can't see this
/obj/effect/bump_teleporter
name = "bump-teleporter"
icon = 'icons/mob/screen_gen.dmi'
icon_state = "x2"
var/id = null //id of this bump_teleporter.
var/id_target = null //id of bump_teleporter which this moves you to.
invisibility = INVISIBILITY_ABSTRACT //nope, can't see this
anchored = TRUE
density = TRUE
opacity = 0
var/static/list/AllTeleporters
/obj/effect/bump_teleporter/New()
..()
LAZYADD(AllTeleporters, src)
/obj/effect/bump_teleporter/Destroy()
LAZYREMOVE(AllTeleporters, src)
return ..()
opacity = 0
var/static/list/AllTeleporters
/obj/effect/bump_teleporter/New()
..()
LAZYADD(AllTeleporters, src)
/obj/effect/bump_teleporter/Destroy()
LAZYREMOVE(AllTeleporters, src)
return ..()
/obj/effect/bump_teleporter/singularity_act()
return
/obj/effect/bump_teleporter/singularity_pull()
return
/obj/effect/bump_teleporter/CollidedWith(atom/movable/AM)
if(!ismob(AM))
return
if(!id_target)
return
for(var/obj/effect/bump_teleporter/BT in AllTeleporters)
if(BT.id == src.id_target)
return
if(!id_target)
return
for(var/obj/effect/bump_teleporter/BT in AllTeleporters)
if(BT.id == src.id_target)
AM.forceMove(BT.loc) //Teleport to location with correct id.
+6
View File
@@ -154,3 +154,9 @@
else
var/time_left = max(0, (A.death_time - world.time) / 10)
return round(time_left)
/obj/effect/countdown/singularity_pull()
return
/obj/effect/countdown/singularity_act()
return
+6
View File
@@ -56,3 +56,9 @@
/obj/effect/abstract/singularity_act()
return
/obj/effect/dummy/singularity_pull()
return
/obj/effect/dummy/singularity_act()
return
+3
View File
@@ -7,6 +7,9 @@
density = TRUE
CanAtmosPass = ATMOS_PASS_DENSITY
/obj/effect/forcefield/singularity_pull()
return
/obj/effect/forcefield/cult
desc = "An unholy shield that blocks all attacks."
name = "glowing wall"
+13
View File
@@ -19,15 +19,23 @@
icon = 'icons/mob/screen_gen.dmi'
icon_state = "x"
anchored = TRUE
var/jobspawn_override = FALSE
var/delete_after_roundstart = TRUE
/obj/effect/landmark/start/New()
GLOB.start_landmarks_list += src
if(jobspawn_override)
if(!GLOB.jobspawn_overrides[name])
GLOB.jobspawn_overrides[name] = list()
GLOB.jobspawn_overrides[name] += src
..()
if(name != "start")
tag = "start*[name]"
/obj/effect/landmark/start/Destroy()
GLOB.start_landmarks_list -= src
if(jobspawn_override)
GLOB.jobspawn_overrides[name] -= src
return ..()
// START LANDMARKS FOLLOW. Don't change the names unless
@@ -36,6 +44,10 @@
/obj/effect/landmark/start/assistant
name = "Assistant"
/obj/effect/landmark/start/assistant/override
jobspawn_override = TRUE
delete_after_roundstart = FALSE
/obj/effect/landmark/start/janitor
name = "Janitor"
@@ -74,6 +86,7 @@
/obj/effect/landmark/start/ai
name = "AI"
delete_after_roundstart = FALSE
/obj/effect/landmark/start/captain
name = "Captain"
+6
View File
@@ -12,6 +12,12 @@
var/def_zone
pass_flags = PASSTABLE
/obj/effect/beam/singularity_act()
return
/obj/effect/beam/singularity_pull()
return
/obj/effect/spawner
name = "object spawner"
+6
View File
@@ -75,6 +75,12 @@
if(isturf(hard_target_override))
hard_target = hard_target_override
/obj/effect/portal/singularity_pull()
return
/obj/effect/portal/singularity_act()
return
/obj/effect/portal/proc/link_portal(obj/effect/portal/newlink)
linked = newlink
if(atmos_link)
@@ -1,46 +1,46 @@
/obj/effect/spawner/newbomb
name = "bomb"
icon = 'icons/mob/screen_gen.dmi'
icon_state = "x"
var/btemp1 = 1500
var/btemp2 = 1000 // tank temperatures
var/assembly_type
/obj/effect/spawner/newbomb/Initialize()
/obj/effect/spawner/newbomb
name = "bomb"
icon = 'icons/mob/screen_gen.dmi'
icon_state = "x"
var/btemp1 = 1500
var/btemp2 = 1000 // tank temperatures
var/assembly_type
/obj/effect/spawner/newbomb/Initialize()
. = ..()
var/obj/item/device/transfer_valve/V = new(src.loc)
var/obj/item/tank/internals/plasma/full/PT = new(V)
var/obj/item/tank/internals/oxygen/OT = new(V)
PT.air_contents.temperature = btemp1 + T0C
OT.air_contents.temperature = btemp2 + T0C
V.tank_one = PT
V.tank_two = OT
PT.master = V
OT.master = V
if(assembly_type)
var/obj/item/device/assembly/A = new assembly_type(V)
V.attached_device = A
A.holder = V
A.toggle_secure()
V.update_icon()
qdel(src)
/obj/effect/spawner/newbomb/timer
assembly_type = /obj/item/device/assembly/timer
/obj/effect/spawner/newbomb/timer/syndicate
btemp1 = 150
btemp2 = 20
/obj/effect/spawner/newbomb/proximity
assembly_type = /obj/item/device/assembly/prox_sensor
/obj/effect/spawner/newbomb/radio
assembly_type = /obj/item/device/assembly/signaler
var/obj/item/device/transfer_valve/V = new(src.loc)
var/obj/item/tank/internals/plasma/full/PT = new(V)
var/obj/item/tank/internals/oxygen/OT = new(V)
PT.air_contents.temperature = btemp1 + T0C
OT.air_contents.temperature = btemp2 + T0C
V.tank_one = PT
V.tank_two = OT
PT.master = V
OT.master = V
if(assembly_type)
var/obj/item/device/assembly/A = new assembly_type(V)
V.attached_device = A
A.holder = V
A.toggle_secure()
V.update_icon()
return INITIALIZE_HINT_QDEL
/obj/effect/spawner/newbomb/timer
assembly_type = /obj/item/device/assembly/timer
/obj/effect/spawner/newbomb/timer/syndicate
btemp1 = 150
btemp2 = 20
/obj/effect/spawner/newbomb/proximity
assembly_type = /obj/item/device/assembly/prox_sensor
/obj/effect/spawner/newbomb/radio
assembly_type = /obj/item/device/assembly/signaler
@@ -38,7 +38,7 @@
if(directions.len)
gib.streak(directions)
qdel(src)
return INITIALIZE_HINT_QDEL
@@ -13,7 +13,7 @@ again.
if(spawn_list && spawn_list.len)
for(var/I in spawn_list)
new I(get_turf(src))
qdel(src)
return INITIALIZE_HINT_QDEL
//normal windows
+200 -193
View File
@@ -1,194 +1,201 @@
/* Simple object type, calls a proc when "stepped" on by something */
/obj/effect/step_trigger
var/affect_ghosts = 0
var/stopper = 1 // stops throwers
var/mobs_only = FALSE
invisibility = INVISIBILITY_ABSTRACT // nope cant see this shit
/* Simple object type, calls a proc when "stepped" on by something */
/obj/effect/step_trigger
var/affect_ghosts = 0
var/stopper = 1 // stops throwers
var/mobs_only = FALSE
invisibility = INVISIBILITY_ABSTRACT // nope cant see this shit
anchored = TRUE
/obj/effect/step_trigger/proc/Trigger(atom/movable/A)
return 0
/obj/effect/step_trigger/Crossed(H as mob|obj)
..()
if(!H)
return
if(isobserver(H) && !affect_ghosts)
return
if(!ismob(H) && mobs_only)
return
Trigger(H)
/* Sends a message to mob when triggered*/
/obj/effect/step_trigger/message
var/message //the message to give to the mob
var/once = 1
mobs_only = TRUE
/obj/effect/step_trigger/message/Trigger(mob/M)
if(M.client)
to_chat(M, "<span class='info'>[message]</span>")
if(once)
qdel(src)
/* Tosses things in a certain direction */
/obj/effect/step_trigger/thrower
var/direction = SOUTH // the direction of throw
var/tiles = 3 // if 0: forever until atom hits a stopper
var/immobilize = 1 // if nonzero: prevents mobs from moving while they're being flung
var/speed = 1 // delay of movement
var/facedir = 0 // if 1: atom faces the direction of movement
var/nostop = 0 // if 1: will only be stopped by teleporters
var/list/affecting = list()
/obj/effect/step_trigger/thrower/Trigger(atom/A)
if(!A || !ismovableatom(A))
return
var/atom/movable/AM = A
var/curtiles = 0
var/stopthrow = 0
for(var/obj/effect/step_trigger/thrower/T in orange(2, src))
if(AM in T.affecting)
return
if(ismob(AM))
var/mob/M = AM
if(immobilize)
M.canmove = 0
affecting.Add(AM)
while(AM && !stopthrow)
if(tiles)
if(curtiles >= tiles)
break
if(AM.z != src.z)
break
curtiles++
sleep(speed)
// Calculate if we should stop the process
if(!nostop)
for(var/obj/effect/step_trigger/T in get_step(AM, direction))
if(T.stopper && T != src)
stopthrow = 1
else
for(var/obj/effect/step_trigger/teleporter/T in get_step(AM, direction))
if(T.stopper)
stopthrow = 1
if(AM)
var/predir = AM.dir
step(AM, direction)
if(!facedir)
AM.setDir(predir)
affecting.Remove(AM)
if(ismob(AM))
var/mob/M = AM
if(immobilize)
M.canmove = 1
/* Stops things thrown by a thrower, doesn't do anything */
/obj/effect/step_trigger/stopper
/* Instant teleporter */
/obj/effect/step_trigger/teleporter
var/teleport_x = 0 // teleportation coordinates (if one is null, then no teleport!)
var/teleport_y = 0
var/teleport_z = 0
/obj/effect/step_trigger/teleporter/Trigger(atom/movable/A)
if(teleport_x && teleport_y && teleport_z)
A.x = teleport_x
A.y = teleport_y
A.z = teleport_z
/* Random teleporter, teleports atoms to locations ranging from teleport_x - teleport_x_offset, etc */
/obj/effect/step_trigger/teleporter/random
var/teleport_x_offset = 0
var/teleport_y_offset = 0
var/teleport_z_offset = 0
/obj/effect/step_trigger/teleporter/random/Trigger(atom/movable/A)
if(teleport_x && teleport_y && teleport_z)
if(teleport_x_offset && teleport_y_offset && teleport_z_offset)
A.x = rand(teleport_x, teleport_x_offset)
A.y = rand(teleport_y, teleport_y_offset)
A.z = rand(teleport_z, teleport_z_offset)
/* Fancy teleporter, creates sparks and smokes when used */
/obj/effect/step_trigger/teleport_fancy
var/locationx
var/locationy
var/uses = 1 //0 for infinite uses
var/entersparks = 0
var/exitsparks = 0
var/entersmoke = 0
var/exitsmoke = 0
/obj/effect/step_trigger/teleport_fancy/Trigger(mob/M)
var/dest = locate(locationx, locationy, z)
M.Move(dest)
if(entersparks)
var/datum/effect_system/spark_spread/s = new
s.set_up(4, 1, src)
s.start()
if(exitsparks)
var/datum/effect_system/spark_spread/s = new
s.set_up(4, 1, dest)
s.start()
if(entersmoke)
var/datum/effect_system/smoke_spread/s = new
s.set_up(4, 1, src, 0)
s.start()
if(exitsmoke)
var/datum/effect_system/smoke_spread/s = new
s.set_up(4, 1, dest, 0)
s.start()
uses--
if(uses == 0)
qdel(src)
/* Simple sound player, Mapper friendly! */
/obj/effect/step_trigger/sound_effect
var/sound //eg. path to the sound, inside '' eg: 'growl.ogg'
var/volume = 100
var/freq_vary = 1 //Should the frequency of the sound vary?
var/extra_range = 0 // eg World.view = 7, extra_range = 1, 7+1 = 8, 8 turfs radius
var/happens_once = 0
var/triggerer_only = 0 //Whether the triggerer is the only person who hears this
/obj/effect/step_trigger/sound_effect/Trigger(atom/movable/A)
var/turf/T = get_turf(A)
if(!T)
return
if(triggerer_only && ismob(A))
var/mob/B = A
B.playsound_local(T, sound, volume, freq_vary)
else
playsound(T, sound, volume, freq_vary, extra_range)
if(happens_once)
qdel(src)
/obj/effect/step_trigger/proc/Trigger(atom/movable/A)
return 0
/obj/effect/step_trigger/Crossed(H as mob|obj)
..()
if(!H)
return
if(isobserver(H) && !affect_ghosts)
return
if(!ismob(H) && mobs_only)
return
Trigger(H)
/obj/effect/step_trigger/singularity_act()
return
/obj/effect/step_trigger/singularity_pull()
return
/* Sends a message to mob when triggered*/
/obj/effect/step_trigger/message
var/message //the message to give to the mob
var/once = 1
mobs_only = TRUE
/obj/effect/step_trigger/message/Trigger(mob/M)
if(M.client)
to_chat(M, "<span class='info'>[message]</span>")
if(once)
qdel(src)
/* Tosses things in a certain direction */
/obj/effect/step_trigger/thrower
var/direction = SOUTH // the direction of throw
var/tiles = 3 // if 0: forever until atom hits a stopper
var/immobilize = 1 // if nonzero: prevents mobs from moving while they're being flung
var/speed = 1 // delay of movement
var/facedir = 0 // if 1: atom faces the direction of movement
var/nostop = 0 // if 1: will only be stopped by teleporters
var/list/affecting = list()
/obj/effect/step_trigger/thrower/Trigger(atom/A)
if(!A || !ismovableatom(A))
return
var/atom/movable/AM = A
var/curtiles = 0
var/stopthrow = 0
for(var/obj/effect/step_trigger/thrower/T in orange(2, src))
if(AM in T.affecting)
return
if(ismob(AM))
var/mob/M = AM
if(immobilize)
M.canmove = 0
affecting.Add(AM)
while(AM && !stopthrow)
if(tiles)
if(curtiles >= tiles)
break
if(AM.z != src.z)
break
curtiles++
sleep(speed)
// Calculate if we should stop the process
if(!nostop)
for(var/obj/effect/step_trigger/T in get_step(AM, direction))
if(T.stopper && T != src)
stopthrow = 1
else
for(var/obj/effect/step_trigger/teleporter/T in get_step(AM, direction))
if(T.stopper)
stopthrow = 1
if(AM)
var/predir = AM.dir
step(AM, direction)
if(!facedir)
AM.setDir(predir)
affecting.Remove(AM)
if(ismob(AM))
var/mob/M = AM
if(immobilize)
M.canmove = 1
/* Stops things thrown by a thrower, doesn't do anything */
/obj/effect/step_trigger/stopper
/* Instant teleporter */
/obj/effect/step_trigger/teleporter
var/teleport_x = 0 // teleportation coordinates (if one is null, then no teleport!)
var/teleport_y = 0
var/teleport_z = 0
/obj/effect/step_trigger/teleporter/Trigger(atom/movable/A)
if(teleport_x && teleport_y && teleport_z)
A.x = teleport_x
A.y = teleport_y
A.z = teleport_z
/* Random teleporter, teleports atoms to locations ranging from teleport_x - teleport_x_offset, etc */
/obj/effect/step_trigger/teleporter/random
var/teleport_x_offset = 0
var/teleport_y_offset = 0
var/teleport_z_offset = 0
/obj/effect/step_trigger/teleporter/random/Trigger(atom/movable/A)
if(teleport_x && teleport_y && teleport_z)
if(teleport_x_offset && teleport_y_offset && teleport_z_offset)
A.x = rand(teleport_x, teleport_x_offset)
A.y = rand(teleport_y, teleport_y_offset)
A.z = rand(teleport_z, teleport_z_offset)
/* Fancy teleporter, creates sparks and smokes when used */
/obj/effect/step_trigger/teleport_fancy
var/locationx
var/locationy
var/uses = 1 //0 for infinite uses
var/entersparks = 0
var/exitsparks = 0
var/entersmoke = 0
var/exitsmoke = 0
/obj/effect/step_trigger/teleport_fancy/Trigger(mob/M)
var/dest = locate(locationx, locationy, z)
M.Move(dest)
if(entersparks)
var/datum/effect_system/spark_spread/s = new
s.set_up(4, 1, src)
s.start()
if(exitsparks)
var/datum/effect_system/spark_spread/s = new
s.set_up(4, 1, dest)
s.start()
if(entersmoke)
var/datum/effect_system/smoke_spread/s = new
s.set_up(4, 1, src, 0)
s.start()
if(exitsmoke)
var/datum/effect_system/smoke_spread/s = new
s.set_up(4, 1, dest, 0)
s.start()
uses--
if(uses == 0)
qdel(src)
/* Simple sound player, Mapper friendly! */
/obj/effect/step_trigger/sound_effect
var/sound //eg. path to the sound, inside '' eg: 'growl.ogg'
var/volume = 100
var/freq_vary = 1 //Should the frequency of the sound vary?
var/extra_range = 0 // eg World.view = 7, extra_range = 1, 7+1 = 8, 8 turfs radius
var/happens_once = 0
var/triggerer_only = 0 //Whether the triggerer is the only person who hears this
/obj/effect/step_trigger/sound_effect/Trigger(atom/movable/A)
var/turf/T = get_turf(A)
if(!T)
return
if(triggerer_only && ismob(A))
var/mob/B = A
B.playsound_local(T, sound, volume, freq_vary)
else
playsound(T, sound, volume, freq_vary, extra_range)
if(happens_once)
qdel(src)
+4 -1
View File
@@ -62,7 +62,7 @@
TED = loc
else //admin must have spawned it
TED = new(src.loc)
qdel(src)
return INITIALIZE_HINT_QDEL
/obj/item/gun/energy/chrono_gun/update_icon()
return
@@ -252,6 +252,9 @@
/obj/effect/chrono_field/singularity_act()
return
/obj/effect/chrono_field/singularity_pull()
return
/obj/effect/chrono_field/ex_act()
return
+185 -160
View File
@@ -1,165 +1,190 @@
/obj/item/device/laser_pointer
name = "laser pointer"
desc = "Don't shine it in your eyes!"
icon = 'icons/obj/device.dmi'
icon_state = "pointer"
item_state = "pen"
var/pointer_icon_state
/obj/item/device/laser_pointer
name = "laser pointer"
desc = "Don't shine it in your eyes!"
icon = 'icons/obj/device.dmi'
icon_state = "pointer"
item_state = "pen"
var/pointer_icon_state
flags_1 = CONDUCT_1 | NOBLUDGEON_1
slot_flags = SLOT_BELT
materials = list(MAT_METAL=500, MAT_GLASS=500)
w_class = WEIGHT_CLASS_SMALL
origin_tech = "combat=1;magnets=2"
var/turf/pointer_loc
var/energy = 5
var/max_energy = 5
var/effectchance = 33
var/recharging = 0
slot_flags = SLOT_BELT
materials = list(MAT_METAL=500, MAT_GLASS=500)
w_class = WEIGHT_CLASS_SMALL
origin_tech = "combat=1;magnets=2"
var/turf/pointer_loc
var/energy = 5
var/max_energy = 5
var/effectchance = 33
var/recharging = 0
var/recharge_locked = FALSE
var/obj/item/stock_parts/micro_laser/diode //used for upgrading!
/obj/item/device/laser_pointer/red
pointer_icon_state = "red_laser"
/obj/item/device/laser_pointer/green
pointer_icon_state = "green_laser"
/obj/item/device/laser_pointer/blue
pointer_icon_state = "blue_laser"
/obj/item/device/laser_pointer/purple
pointer_icon_state = "purple_laser"
/obj/item/device/laser_pointer/New()
..()
diode = new(src)
if(!pointer_icon_state)
pointer_icon_state = pick("red_laser","green_laser","blue_laser","purple_laser")
/obj/item/device/laser_pointer/upgraded/New()
..()
diode = new /obj/item/stock_parts/micro_laser/ultra
/obj/item/device/laser_pointer/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/stock_parts/micro_laser))
if(!diode)
if(!user.transferItemToLoc(W, src))
return
diode = W
to_chat(user, "<span class='notice'>You install a [diode.name] in [src].</span>")
else
to_chat(user, "<span class='notice'>[src] already has a diode installed.</span>")
else if(istype(W, /obj/item/screwdriver))
if(diode)
to_chat(user, "<span class='notice'>You remove the [diode.name] from \the [src].</span>")
diode.loc = get_turf(src.loc)
diode = null
else
return ..()
/obj/item/device/laser_pointer/afterattack(atom/target, mob/living/user, flag, params)
laser_act(target, user, params)
/obj/item/device/laser_pointer/proc/laser_act(atom/target, mob/living/user, params)
if( !(user in (viewers(7,target))) )
return
if (!diode)
to_chat(user, "<span class='notice'>You point [src] at [target], but nothing happens!</span>")
return
if (!user.IsAdvancedToolUser())
to_chat(user, "<span class='warning'>You don't have the dexterity to do this!</span>")
return
if(ishuman(user))
var/mob/living/carbon/human/H = user
if(H.dna.check_mutation(HULK) || (NOGUNS in H.dna.species.species_traits))
to_chat(user, "<span class='warning'>Your fingers can't press the button!</span>")
return
add_fingerprint(user)
//nothing happens if the battery is drained
if(recharge_locked)
to_chat(user, "<span class='notice'>You point [src] at [target], but it's still charging.</span>")
return
var/outmsg
var/turf/targloc = get_turf(target)
//human/alien mobs
if(iscarbon(target))
var/mob/living/carbon/C = target
if(user.zone_selected == "eyes")
add_logs(user, C, "shone in the eyes", src)
var/severity = 1
if(prob(33))
severity = 2
else if(prob(50))
severity = 0
//20% chance to actually hit the eyes
if(prob(effectchance * diode.rating) && C.flash_act(severity))
outmsg = "<span class='notice'>You blind [C] by shining [src] in their eyes.</span>"
else
outmsg = "<span class='warning'>You fail to blind [C] by shining [src] at their eyes!</span>"
//robots
else if(iscyborg(target))
var/mob/living/silicon/S = target
//20% chance to actually hit the sensors
if(prob(effectchance * diode.rating))
S.flash_act(affect_silicon = 1)
S.Knockdown(rand(100,200))
to_chat(S, "<span class='danger'>Your sensors were overloaded by a laser!</span>")
outmsg = "<span class='notice'>You overload [S] by shining [src] at their sensors.</span>"
add_logs(user, S, "shone in the sensors", src)
else
outmsg = "<span class='warning'>You fail to overload [S] by shining [src] at their sensors!</span>"
//cameras
else if(istype(target, /obj/machinery/camera))
var/obj/machinery/camera/C = target
if(prob(effectchance * diode.rating))
var/obj/item/stock_parts/micro_laser/diode //used for upgrading!
/obj/item/device/laser_pointer/red
pointer_icon_state = "red_laser"
/obj/item/device/laser_pointer/green
pointer_icon_state = "green_laser"
/obj/item/device/laser_pointer/blue
pointer_icon_state = "blue_laser"
/obj/item/device/laser_pointer/purple
pointer_icon_state = "purple_laser"
/obj/item/device/laser_pointer/New()
..()
diode = new(src)
if(!pointer_icon_state)
pointer_icon_state = pick("red_laser","green_laser","blue_laser","purple_laser")
/obj/item/device/laser_pointer/upgraded/New()
..()
diode = new /obj/item/stock_parts/micro_laser/ultra
/obj/item/device/laser_pointer/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/stock_parts/micro_laser))
if(!diode)
if(!user.transferItemToLoc(W, src))
return
diode = W
to_chat(user, "<span class='notice'>You install a [diode.name] in [src].</span>")
else
to_chat(user, "<span class='notice'>[src] already has a diode installed.</span>")
else if(istype(W, /obj/item/screwdriver))
if(diode)
to_chat(user, "<span class='notice'>You remove the [diode.name] from \the [src].</span>")
diode.loc = get_turf(src.loc)
diode = null
else
return ..()
/obj/item/device/laser_pointer/afterattack(atom/target, mob/living/user, flag, params)
laser_act(target, user, params)
/obj/item/device/laser_pointer/proc/laser_act(atom/target, mob/living/user, params)
if( !(user in (viewers(7,target))) )
return
if (!diode)
to_chat(user, "<span class='notice'>You point [src] at [target], but nothing happens!</span>")
return
if (!user.IsAdvancedToolUser())
to_chat(user, "<span class='warning'>You don't have the dexterity to do this!</span>")
return
if(ishuman(user))
var/mob/living/carbon/human/H = user
if(H.dna.check_mutation(HULK) || (NOGUNS in H.dna.species.species_traits))
to_chat(user, "<span class='warning'>Your fingers can't press the button!</span>")
return
add_fingerprint(user)
//nothing happens if the battery is drained
if(recharge_locked)
to_chat(user, "<span class='notice'>You point [src] at [target], but it's still charging.</span>")
return
var/outmsg
var/turf/targloc = get_turf(target)
//human/alien mobs
if(iscarbon(target))
var/mob/living/carbon/C = target
if(user.zone_selected == "eyes")
add_logs(user, C, "shone in the eyes", src)
var/severity = 1
if(prob(33))
severity = 2
else if(prob(50))
severity = 0
//chance to actually hit the eyes depends on internal component
if(prob(effectchance * diode.rating) && C.flash_act(severity))
outmsg = "<span class='notice'>You blind [C] by shining [src] in their eyes.</span>"
else
outmsg = "<span class='warning'>You fail to blind [C] by shining [src] at their eyes!</span>"
//robots
else if(iscyborg(target))
var/mob/living/silicon/S = target
add_logs(user, S, "shone in the sensors", src)
//chance to actually hit the eyes depends on internal component
if(prob(effectchance * diode.rating))
S.flash_act(affect_silicon = 1)
S.Knockdown(rand(100,200))
to_chat(S, "<span class='danger'>Your sensors were overloaded by a laser!</span>")
outmsg = "<span class='notice'>You overload [S] by shining [src] at their sensors.</span>"
else
outmsg = "<span class='warning'>You fail to overload [S] by shining [src] at their sensors!</span>"
//cameras
else if(istype(target, /obj/machinery/camera))
var/obj/machinery/camera/C = target
if(prob(effectchance * diode.rating))
C.emp_act(EMP_HEAVY)
outmsg = "<span class='notice'>You hit the lens of [C] with [src], temporarily disabling the camera!</span>"
add_logs(user, C, "EMPed", src)
else
outmsg = "<span class='warning'>You miss the lens of [C] with [src]!</span>"
//laser pointer image
icon_state = "pointer_[pointer_icon_state]"
var/image/I = image('icons/obj/projectiles.dmi',targloc,pointer_icon_state,10)
var/list/click_params = params2list(params)
if(click_params)
if(click_params["icon-x"])
I.pixel_x = (text2num(click_params["icon-x"]) - 16)
if(click_params["icon-y"])
I.pixel_y = (text2num(click_params["icon-y"]) - 16)
else
I.pixel_x = target.pixel_x + rand(-5,5)
I.pixel_y = target.pixel_y + rand(-5,5)
if(outmsg)
to_chat(user, outmsg)
else
to_chat(user, "<span class='info'>You point [src] at [target].</span>")
energy -= 1
if(energy <= max_energy)
if(!recharging)
recharging = 1
START_PROCESSING(SSobj, src)
if(energy <= 0)
to_chat(user, "<span class='warning'>[src]'s battery is overused, it needs time to recharge!</span>")
outmsg = "<span class='notice'>You hit the lens of [C] with [src], temporarily disabling the camera!</span>"
add_logs(user, C, "EMPed", src)
else
outmsg = "<span class='warning'>You miss the lens of [C] with [src]!</span>"
//catpeople
for(var/mob/living/carbon/human/H in view(1,targloc))
if(!iscatperson(H) || H.incapacitated() || H.eye_blind )
continue
if(!H.lying)
H.setDir(get_dir(H,targloc)) // kitty always looks at the light
if(prob(effectchance))
H.visible_message("<span class='warning'>[H] makes a grab for the light!</span>","<span class='userdanger'>LIGHT!</span>")
H.Move(targloc)
add_logs(user, H, "moved with a laser pointer",src)
else
H.visible_message("<span class='notice'>[H] looks briefly distracted by the light.</span>","<span class = 'warning'> You're briefly tempted by the shiny light... </span>")
else
H.visible_message("<span class='notice'>[H] stares at the light</span>","<span class = 'warning'> You stare at the light... </span>")
//cats!
for(var/mob/living/simple_animal/pet/cat/C in view(1,targloc))
if(prob(50))
C.visible_message("<span class='notice'>[C] pounces on the light!</span>","<span class='warning'>LIGHT!</span>")
C.Move(targloc)
C.resting = TRUE
C.update_canmove()
else
C.visible_message("<span class='notice'>[C] looks uninterested in your games.</span>","<span class='warning'>You spot [user] shining [src] at you. How insulting!</span>")
//laser pointer image
icon_state = "pointer_[pointer_icon_state]"
var/image/I = image('icons/obj/projectiles.dmi',targloc,pointer_icon_state,10)
var/list/click_params = params2list(params)
if(click_params)
if(click_params["icon-x"])
I.pixel_x = (text2num(click_params["icon-x"]) - 16)
if(click_params["icon-y"])
I.pixel_y = (text2num(click_params["icon-y"]) - 16)
else
I.pixel_x = target.pixel_x + rand(-5,5)
I.pixel_y = target.pixel_y + rand(-5,5)
if(outmsg)
to_chat(user, outmsg)
else
to_chat(user, "<span class='info'>You point [src] at [target].</span>")
energy -= 1
if(energy <= max_energy)
if(!recharging)
recharging = 1
START_PROCESSING(SSobj, src)
if(energy <= 0)
to_chat(user, "<span class='warning'>[src]'s battery is overused, it needs time to recharge!</span>")
recharge_locked = TRUE
flick_overlay_view(I, targloc, 10)
icon_state = "pointer"
/obj/item/device/laser_pointer/process()
if(prob(20 - recharge_locked*5))
energy += 1
if(energy >= max_energy)
energy = max_energy
recharging = 0
flick_overlay_view(I, targloc, 10)
icon_state = "pointer"
/obj/item/device/laser_pointer/process()
if(prob(20 - recharge_locked*5))
energy += 1
if(energy >= max_energy)
energy = max_energy
recharging = 0
recharge_locked = FALSE
..()
..()
+1 -1
View File
@@ -417,7 +417,7 @@ MASS SPECTROMETER
..()
create_reagents(5)
/obj/item/device/mass_spectrometer/on_reagent_change()
/obj/item/device/mass_spectrometer/on_reagent_change(changetype)
if(reagents.total_volume)
icon_state = initial(icon_state) + "_s"
else
+5 -2
View File
@@ -93,6 +93,10 @@
else
return ..()
/obj/item/watertank/dropped(mob/user)
..()
remove_noz()
// This mister item is intended as an extension of the watertank and always attached to it.
// Therefore, it's designed to be "locked" to the player's hands or extended back onto
// the watertank backpack. Allowing it to be placed elsewhere or created without a parent
@@ -109,7 +113,7 @@
amount_per_transfer_from_this = 50
possible_transfer_amounts = list(25,50,100)
volume = 500
flags_1 = NODROP_1 | NOBLUDGEON_1
flags_1 = NOBLUDGEON_1
container_type = OPENCONTAINER_1
slot_flags = 0
@@ -221,7 +225,6 @@
precision = 1
cooling_power = 5
w_class = WEIGHT_CLASS_HUGE
flags_1 = NODROP_1 //Necessary to ensure that the nozzle and tank never separate
var/obj/item/watertank/tank
var/nozzle_mode = 0
var/metal_synthesis_cooldown = 0
@@ -6,7 +6,7 @@
/obj/structure/closet/secure_closet/quartermaster/PopulateContents()
..()
new /obj/item/clothing/neck/cloak/qm(src)
new /obj/item/storage/lockbox/medal/cargo/(src)
new /obj/item/storage/lockbox/medal/cargo(src)
new /obj/item/clothing/under/rank/cargo(src)
new /obj/item/clothing/shoes/sneakers/brown(src)
new /obj/item/device/radio/headset/headset_cargo(src)
+1 -1
View File
@@ -408,7 +408,7 @@
/obj/structure/girder/cult/deconstruct(disassembled = TRUE)
if(!(flags_1 & NODECONSTRUCT_1))
new/obj/item/stack/sheet/runed_metal/(get_turf(src), 1)
new /obj/item/stack/sheet/runed_metal(drop_location(), 1)
qdel(src)
/obj/structure/girder/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd)
@@ -411,6 +411,7 @@
desc = "Different from the Middle Ages version."
icon = 'icons/obj/objects.dmi'
icon_state = "rack"
layer = TABLE_LAYER
density = TRUE
anchored = TRUE
pass_flags = LETPASSTHROW //You can throw objects over this, despite it's density.
+1 -1
View File
@@ -451,7 +451,7 @@
stage = GIBTONITE_DETONATE
explosion(bombturf,1,2,5, adminlog = 0)
if(stage == GIBTONITE_STABLE) //Gibtonite deposit is now benign and extractable. Depending on how close you were to it blowing up before defusing, you get better quality ore.
var/obj/item/twohanded/required/gibtonite/G = new /obj/item/twohanded/required/gibtonite/(src)
var/obj/item/twohanded/required/gibtonite/G = new (src)
if(det_time <= 0)
G.quality = 3
G.icon_state = "Gibtonite ore 3"
+28
View File
@@ -1,4 +1,7 @@
#define RESTART_COUNTER_PATH "data/round_counter.txt"
GLOBAL_VAR(security_mode)
GLOBAL_VAR(restart_counter)
GLOBAL_PROTECT(security_mode)
/world/New()
@@ -31,6 +34,10 @@ GLOBAL_PROTECT(security_mode)
GLOB.timezoneOffset = text2num(time2text(0,"hh")) * 36000
if(fexists(RESTART_COUNTER_PATH))
GLOB.restart_counter = text2num(trim(file2text(RESTART_COUNTER_PATH)))
fdel(RESTART_COUNTER_PATH)
Master.Initialize(10, FALSE)
@@ -161,6 +168,27 @@ GLOBAL_PROTECT(security_mode)
else
to_chat(world, "<span class='boldannounce'>Rebooting world...</span>")
Master.Shutdown() //run SS shutdowns
if(SERVER_TOOLS_PRESENT)
var/do_hard_reboot
// check the hard reboot counter
var/ruhr = CONFIG_GET(number/rounds_until_hard_restart)
switch(ruhr)
if(-1)
do_hard_reboot = FALSE
if(0)
do_hard_reboot = TRUE
else
if(GLOB.restart_counter >= ruhr)
do_hard_reboot = TRUE
else
text2file("[++GLOB.restart_counter]", RESTART_COUNTER_PATH)
do_hard_reboot = FALSE
if(do_hard_reboot)
log_world("World hard rebooted at [time_stamp()]")
SERVER_TOOLS_REBOOT_BYOND
log_world("World rebooted at [time_stamp()]")
..()
+3
View File
@@ -30,6 +30,9 @@
/obj/effect/sound_emitter/singularity_act()
return
/obj/effect/sound_emitter/singularity_pull()
return
/obj/effect/sound_emitter/examine(mob/user)
..()
if(!isobserver(user))
+3 -8
View File
@@ -1091,9 +1091,6 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
log_admin("[key_name(usr)] sent \"[input]\" as the Tip of the Round.")
SSblackbox.record_feedback("tally", "admin_verb", 1, "Show Tip")
#define ON_PURRBATION(H) (\H.getorgan(/obj/item/organ/tail/cat) || H.getorgan(/obj/item/organ/ears/cat) || \
H.dna.features["ears"] == "Cat" || H.dna.features["human_tail"] == "Cat")
/proc/mass_purrbation()
for(var/M in GLOB.mob_list)
if(ishumanbasic(M))
@@ -1109,7 +1106,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
/proc/purrbation_toggle(mob/living/carbon/human/H, silent = FALSE)
if(!ishumanbasic(H))
return
if(!ON_PURRBATION(H))
if(!iscatperson(H))
purrbation_apply(H, silent)
. = TRUE
else
@@ -1119,7 +1116,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
/proc/purrbation_apply(mob/living/carbon/human/H, silent = FALSE)
if(!ishuman(H))
return
if(ON_PURRBATION(H))
if(iscatperson(H))
return
var/obj/item/organ/ears/cat/ears = new
@@ -1134,7 +1131,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
/proc/purrbation_remove(mob/living/carbon/human/H, silent = FALSE)
if(!ishuman(H))
return
if(!ON_PURRBATION(H))
if(!iscatperson(H))
return
var/obj/item/organ/ears/cat/ears = H.getorgan(/obj/item/organ/ears/cat)
@@ -1173,8 +1170,6 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
if(!silent)
to_chat(H, "You are no longer a cat.")
#undef ON_PURRBATION
/client/proc/modify_goals()
set category = "Debug"
set name = "Modify goals"
@@ -179,6 +179,9 @@
var/mob/living/L = AM
L.fire_act(temperature, volume)
/obj/effect/hotspot/singularity_pull()
return
/obj/effect/dummy/fire
name = "fire"
desc = "OWWWWWW. IT BURNS. Tell a coder if you're seeing this."
@@ -78,7 +78,7 @@
/obj/machinery/atmospherics/components/unary/cryo_cell/on_deconstruction()
if(beaker)
beaker.forceMove(loc)
beaker.forceMove(drop_location())
beaker = null
/obj/machinery/atmospherics/components/unary/cryo_cell/update_icon()
@@ -381,7 +381,7 @@
. = TRUE
if("ejectbeaker")
if(beaker)
beaker.forceMove(loc)
beaker.forceMove(drop_location())
if(Adjacent(usr) && !issilicon(usr))
usr.put_in_hands(beaker)
beaker = null
@@ -407,4 +407,20 @@
return G.temperature
return ..()
/obj/machinery/atmospherics/components/unary/cryo_cell/default_change_direction_wrench(mob/user, obj/item/wrench/W)
. = ..()
if(.)
SetInitDirections()
var/obj/machinery/atmospherics/node = NODE1
if(node)
node.disconnect(src)
NODE1 = null
nullifyPipenet(PARENT1)
atmosinit()
node = NODE1
if(node)
node.atmosinit()
node.addMember(src)
build_network()
#undef CRYOMOBS
@@ -230,7 +230,7 @@
user.throw_at(throw_target, 200, 4)
if(8)
//Fueltank Explosion
explosion(src.loc,-1,0,2, flame_range = 2)
explosion(loc,-1,0,2, flame_range = 2)
if(9)
//Cold
var/datum/disease/D = new /datum/disease/cold
@@ -240,7 +240,7 @@
visible_message("<span class='notice'>[src] roll perfectly.</span>")
if(11)
//Cookie
var/obj/item/reagent_containers/food/snacks/cookie/C = new(get_turf(src))
var/obj/item/reagent_containers/food/snacks/cookie/C = new(drop_location())
C.name = "Cookie of Fate"
if(12)
//Healing
@@ -258,13 +258,13 @@
new /obj/item/coin/gold(M)
if(14)
//Free Gun
new /obj/item/gun/ballistic/revolver/mateba(get_turf(src))
new /obj/item/gun/ballistic/revolver/mateba(drop_location())
if(15)
//Random One-use spellbook
new /obj/item/spellbook/oneuse/random(get_turf(src))
new /obj/item/spellbook/oneuse/random(drop_location())
if(16)
//Servant & Servant Summon
var/mob/living/carbon/human/H = new(get_turf(src))
var/mob/living/carbon/human/H = new(drop_location())
H.equipOutfit(/datum/outfit/butler)
var/datum/mind/servant_mind = new /datum/mind()
var/datum/objective/O = new("Serve [user.real_name].")
@@ -285,10 +285,10 @@
if(17)
//Tator Kit
new /obj/item/storage/box/syndicate/(get_turf(src))
new /obj/item/storage/box/syndicate(drop_location())
if(18)
//Captain ID
new /obj/item/card/id/captains_spare(get_turf(src))
new /obj/item/card/id/captains_spare(drop_location())
if(19)
//Instrinct Resistance
to_chat(user, "<span class='notice'>You feel robust.</span>")
@@ -252,6 +252,12 @@
var/obj/screen/chronos_target/target_ui = null
var/obj/item/clothing/suit/space/chronos/chronosuit
/obj/effect/chronos_cam/singularity_act()
return
/obj/effect/chronos_cam/singularity_pull()
return
/obj/effect/chronos_cam/proc/create_target_ui()
if(holder && holder.client && chronosuit)
if(target_ui)
+1 -1
View File
@@ -91,7 +91,7 @@
reqs = list(/obj/item/restraints/handcuffs/cable = 1,
/obj/item/stack/sheet/metal = 6)
time = 20//15 faster than crafting them by hand!
category= CAT_WEAPON
category= CAT_WEAPONRY
subcategory = CAT_WEAPON
/datum/crafting_recipe/tailclub
+6
View File
@@ -68,6 +68,12 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
/obj/effect/immovablerod/ex_act(severity, target)
return 0
/obj/effect/immovablerod/singularity_act()
return
/obj/effect/immovablerod/singularity_pull()
return
/obj/effect/immovablerod/Collide(atom/clong)
if(prob(10))
playsound(src, 'sound/effects/bang.ogg', 50, 1)
+1 -1
View File
@@ -37,7 +37,7 @@
var/mutable_appearance/storm
/datum/round_event/portal_storm/setup()
storm = storm = mutable_appearance('icons/obj/tesla_engine/energy_ball.dmi', "energy_ball_fast", FLY_LAYER)
storm = mutable_appearance('icons/obj/tesla_engine/energy_ball.dmi', "energy_ball_fast", FLY_LAYER)
storm.color = "#00FF00"
station_areas = get_areas_in_z(ZLEVEL_STATION_PRIMARY)
+6
View File
@@ -98,6 +98,12 @@ GLOBAL_LIST_INIT(hallucinations_major, list(
var/image_layer = MOB_LAYER
var/active = TRUE //qdelery
/obj/effect/hallucination/singularity_pull()
return
/obj/effect/hallucination/singularity_act()
return
/obj/effect/hallucination/simple/Initialize(mapload, var/mob/living/carbon/T)
. = ..()
target = T
@@ -15,7 +15,7 @@
resistance_flags = NONE
var/isGlass = TRUE //Whether the 'bottle' is made of glass or not so that milk cartons dont shatter when someone gets hit by it
/obj/item/reagent_containers/food/drinks/on_reagent_change()
/obj/item/reagent_containers/food/drinks/on_reagent_change(changetype)
if (gulp_size < 5)
gulp_size = 5
else
@@ -209,7 +209,7 @@
item_state = "coffee"
spillable = TRUE
/obj/item/reagent_containers/food/drinks/mug/on_reagent_change()
/obj/item/reagent_containers/food/drinks/mug/on_reagent_change(changetype)
if(reagents.total_volume)
icon_state = "tea"
else
@@ -261,7 +261,7 @@
spillable = TRUE
isGlass = FALSE
/obj/item/reagent_containers/food/drinks/sillycup/on_reagent_change()
/obj/item/reagent_containers/food/drinks/sillycup/on_reagent_change(changetype)
if(reagents.total_volume)
icon_state = "water_cup"
else
@@ -289,7 +289,7 @@
transfer_fingerprints_to(B)
qdel(src)
/obj/item/reagent_containers/food/drinks/sillycup/smallcarton/on_reagent_change()
/obj/item/reagent_containers/food/drinks/sillycup/smallcarton/on_reagent_change(changetype)
if (reagents.reagent_list.len)
switch(reagents.get_master_reagent_id())
if("orangejuice")
@@ -12,7 +12,7 @@
resistance_flags = ACID_PROOF
unique_rename = 1
/obj/item/reagent_containers/food/drinks/drinkingglass/on_reagent_change()
/obj/item/reagent_containers/food/drinks/drinkingglass/on_reagent_change(changetype)
cut_overlays()
if(reagents.reagent_list.len)
var/datum/reagent/R = reagents.get_master_reagent()
@@ -46,7 +46,7 @@
volume = 15
materials = list(MAT_GLASS=100)
/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass/on_reagent_change()
/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass/on_reagent_change(changetype)
cut_overlays()
if (gulp_size < 15)
@@ -74,9 +74,9 @@
desc = "A shot glass - the universal symbol for bad decisions."
return
/obj/item/reagent_containers/food/drinks/drinkingglass/filled/New()
..()
on_reagent_change()
/obj/item/reagent_containers/food/drinks/drinkingglass/filled/Initialize()
. = ..()
on_reagent_change(ADD_REAGENT)
/obj/item/reagent_containers/food/drinks/drinkingglass/filled/soda
name = "Soda Water"
@@ -13,7 +13,7 @@
container_type = OPENCONTAINER_1
possible_transfer_amounts = list(1, 5, 10, 15, 20, 25, 30, 50)
volume = 50
//Possible_states has the reagent id as key and a list of, in order, the icon_state, the name and the desc as values. Used in the on_reagent_change() to change names, descs and sprites.
//Possible_states has the reagent id as key and a list of, in order, the icon_state, the name and the desc as values. Used in the on_reagent_change(changetype) to change names, descs and sprites.
var/list/possible_states = list(
"ketchup" = list("ketchup", "ketchup bottle", "You feel more American already."),
"capsaicin" = list("hotsauce", "hotsauce bottle", "You can almost TASTE the stomach ulcers now!"),
@@ -80,7 +80,7 @@
var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this)
to_chat(user, "<span class='notice'>You transfer [trans] units of the condiment to [target].</span>")
/obj/item/reagent_containers/food/condiment/on_reagent_change()
/obj/item/reagent_containers/food/condiment/on_reagent_change(changetype)
if(!possible_states.len)
return
if(reagents.reagent_list.len > 0)
@@ -126,7 +126,7 @@
list_reagents = list("sodiumchloride" = 20)
possible_states = list()
/obj/item/reagent_containers/food/condiment/saltshaker/on_reagent_change()
/obj/item/reagent_containers/food/condiment/saltshaker/on_reagent_change(changetype)
if(reagents.reagent_list.len == 0)
icon_state = "emptyshaker"
else
@@ -164,7 +164,7 @@
list_reagents = list("blackpepper" = 20)
possible_states = list()
/obj/item/reagent_containers/food/condiment/peppermill/on_reagent_change()
/obj/item/reagent_containers/food/condiment/peppermill/on_reagent_change(changetype)
if(reagents.reagent_list.len == 0)
icon_state = "emptyshaker"
else
@@ -255,7 +255,7 @@
src.reagents.trans_to(target, amount_per_transfer_from_this)
qdel(src)
/obj/item/reagent_containers/food/condiment/pack/on_reagent_change()
/obj/item/reagent_containers/food/condiment/pack/on_reagent_change(changetype)
if(reagents.reagent_list.len > 0)
var/main_reagent = reagents.get_master_reagent_id()
if(main_reagent in possible_states)
@@ -313,7 +313,7 @@
. = ..()
return
/obj/item/reagent_containers/glass/bowl/on_reagent_change()
/obj/item/reagent_containers/glass/bowl/on_reagent_change(changetype)
..()
update_icon()
@@ -212,7 +212,7 @@
/obj/item/reagent_containers/food/snacks/meat/slab/goliath/burn()
visible_message("[src] finishes cooking!")
new /obj/item/reagent_containers/food/snacks/meat/steak/goliath/(loc)
new /obj/item/reagent_containers/food/snacks/meat/steak/goliath(loc)
qdel(src)
/obj/item/reagent_containers/food/snacks/meat/slab/meatwheat
@@ -238,4 +238,19 @@
filling_color = "#F0E68C"
list_reagents = list("nutriment" = 5)
bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
tastes = list("butter" = 1, "biscuit" = 1)
tastes = list("butter" = 1, "biscuit" = 1)
/obj/item/reagent_containers/food/snacks/butterdog
name = "butterdog"
desc = "Made from exotic butters."
icon = 'icons/obj/food/food.dmi'
icon_state = "butterdog"
bitesize = 1
filling_color = "#F1F49A"
list_reagents = list("nutriment" = 5)
bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
tastes = list("butter", "exotic butter")
/obj/item/reagent_containers/food/snacks/butterdog/ComponentInitialize()
. = ..()
AddComponent(/datum/component/slippery, 80)
@@ -135,7 +135,7 @@
if (!beaker)
return
src.verbs -= /obj/machinery/juicer/verb/detach
beaker.loc = src.loc
beaker.forceMove(drop_location())
beaker = null
update_icon()
@@ -93,3 +93,11 @@
result = /obj/item/reagent_containers/food/snacks/butterbiscuit
subcategory = CAT_BREAD
/datum/crafting_recipe/food/butterdog
name = "Butterdog"
reqs = list(
/obj/item/reagent_containers/food/snacks/bun = 1,
/obj/item/reagent_containers/food/snacks/butter = 3,
)
result = /obj/item/reagent_containers/food/snacks/butterdog
subcategory = CAT_BREAD
+2 -2
View File
@@ -53,7 +53,7 @@
productivity = P
max_items = max_storage
/obj/machinery/biogenerator/on_reagent_change() //When the reagents change, change the icon as well.
/obj/machinery/biogenerator/on_reagent_change(changetype) //When the reagents change, change the icon as well.
update_icon()
/obj/machinery/biogenerator/update_icon()
@@ -294,7 +294,7 @@
/obj/machinery/biogenerator/proc/detach()
if(beaker)
beaker.loc = src.loc
beaker.forceMove(drop_location())
beaker = null
update_icon()
@@ -113,7 +113,7 @@
push_data()
..()
/obj/item/integrated_circuit/passive/power/chemical_cell/on_reagent_change()
/obj/item/integrated_circuit/passive/power/chemical_cell/on_reagent_change(changetype)
set_pin_data(IC_OUTPUT, 1, reagents.total_volume)
push_data()
@@ -28,9 +28,10 @@
var/smoke_radius = 5
var/notified = FALSE
/obj/item/integrated_circuit/reagent/smoke/on_reagent_change()
//reset warning
notified = FALSE
/obj/item/integrated_circuit/reagent/smoke/on_reagent_change(changetype)
//reset warning only if we have reagents now
if(changetype == ADD_REAGENT)
notified = FALSE
set_pin_data(IC_OUTPUT, 1, reagents.total_volume)
push_data()
@@ -48,7 +49,6 @@
if(S)
S.set_up(reagents, smoke_radius, location, notified)
if(!notified)
//we have now notified
notified = TRUE
S.start()
@@ -83,7 +83,7 @@
..()
/obj/item/integrated_circuit/reagent/injector/on_reagent_change()
/obj/item/integrated_circuit/reagent/injector/on_reagent_change(changetype)
set_pin_data(IC_OUTPUT, 1, reagents.total_volume)
push_data()
@@ -263,7 +263,7 @@
push_data()
..()
/obj/item/integrated_circuit/reagent/storage/on_reagent_change()
/obj/item/integrated_circuit/reagent/storage/on_reagent_change(changetype)
set_pin_data(IC_OUTPUT, 1, reagents.total_volume)
push_data()
+1 -1
View File
@@ -136,7 +136,7 @@
if(!good_chisel_message_location(T))
persists = FALSE
qdel(src)
return INITIALIZE_HINT_QDEL
/obj/structure/chisel_message/proc/register(mob/user, newmessage)
hidden_message = newmessage
+2 -2
View File
@@ -15,7 +15,7 @@
for(var/turf/T in get_area_turfs(thearea, z))
if(T.baseturf != T.type) //Don't break indestructible walls and the like
T.baseturf = baseturf
qdel(src)
return INITIALIZE_HINT_QDEL
/obj/effect/baseturf_helper/asteroid
@@ -65,5 +65,5 @@ GLOBAL_LIST_EMPTY(z_is_planet)
var/turf/T = get_turf(src)
if(!turf_z_is_planet(T))
GLOB.z_is_planet["[T.z]"] = list()
qdel(src)
return INITIALIZE_HINT_QDEL
+6
View File
@@ -183,3 +183,9 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons)
if(L.stat != DEAD)
return 1
return 0
/obj/effect/extraction_holder/singularity_pull()
return
/obj/effect/extraction_holder/singularity_pull()
return
@@ -366,7 +366,7 @@
return
/obj/effect/immortality_talisman/singularity_pull()
return 0
return
/obj/effect/immortality_talisman/Destroy(force)
if(!can_destroy && !force)
+1 -1
View File
@@ -18,7 +18,7 @@
if (machine)
machine.CONSOLE = src
else
qdel(src)
return INITIALIZE_HINT_QDEL
/obj/machinery/mineral/processing_unit_console/attack_hand(mob/user)
+6
View File
@@ -12,6 +12,12 @@
..()
set_light(set_luminosity, set_cap)
/obj/effect/light_emitter/singularity_pull()
return
/obj/effect/light_emitter/singularity_act()
return
/**********************Miner Lockers**************************/
/obj/structure/closet/wardrobe/miner
@@ -710,7 +710,7 @@
to_chat(cloth_golem, "<span class='notice'>You start gathering your life energy, preparing to rise again...</span>")
addtimer(CALLBACK(src, .proc/revive), revive_time)
else
qdel(src)
return INITIALIZE_HINT_QDEL
/obj/structure/cloth_pile/Destroy()
if(cloth_golem)
+4 -2
View File
@@ -13,9 +13,11 @@
if(!loc)
if(client)
for(var/obj/effect/landmark/error/E in GLOB.landmarks_list)
loc = E.loc
forceMove(E.loc)
break
message_admins("[key_name_admin(src)] was found to have no .loc with an attached client, if the cause is unknown it would be wise to ask how this was accomplished.")
var/msg = "[key_name_admin(src)] was found to have no .loc with an attached client, if the cause is unknown it would be wise to ask how this was accomplished."
message_admins(msg)
send2irc_adminless_only("Mob", msg, R_ADMIN)
log_game("[key_name(src)] was found to have no .loc with an attached client.")
else
return
+1 -2
View File
@@ -88,8 +88,7 @@
. = ..()
if(!target_ai) //If there is no player/brain inside.
new/obj/structure/AIcore/deactivated(loc) //New empty terminal.
qdel(src)//Delete AI.
return
return INITIALIZE_HINT_QDEL //Delete AI.
if(L && istype(L, /datum/ai_laws))
laws = L
@@ -79,6 +79,12 @@
. = ..()
. += slowdown
/mob/living/silicon/pai/can_unbuckle()
return FALSE
/mob/living/silicon/pai/can_buckle()
return FALSE
/mob/living/silicon/pai/Destroy()
GLOB.pai_list -= src
return ..()
@@ -800,7 +800,7 @@ Pass a positive integer as an argument to override a bot's default speed.
. = ..()
owner = loc
if(!istype(owner))
qdel(src)
return INITIALIZE_HINT_QDEL
/mob/living/simple_animal/bot/proc/topic_denied(mob/user) //Access check proc for bot topics! Remember to place in a bot's individual Topic if desired.
if(!user.canUseTopic(src))
@@ -257,7 +257,7 @@
/mob/living/simple_animal/bot/cleanbot/explode()
on = FALSE
visible_message("<span class='boldannounce'>[src] blows apart!</span>")
var/turf/Tsec = get_turf(src)
var/atom/Tsec = drop_location()
new /obj/item/reagent_containers/glass/bucket(Tsec)
@@ -371,24 +371,24 @@ Auto Patrol[]"},
/mob/living/simple_animal/bot/ed209/explode()
walk_to(src,0)
visible_message("<span class='boldannounce'>[src] blows apart!</span>")
var/turf/Tsec = get_turf(src)
var/atom/Tsec = drop_location()
var/obj/item/ed209_assembly/Sa = new /obj/item/ed209_assembly(Tsec)
var/obj/item/ed209_assembly/Sa = new (Tsec)
Sa.build_step = 1
Sa.add_overlay("hs_hole")
Sa.created_name = name
new /obj/item/device/assembly/prox_sensor(Tsec)
if(!lasercolor)
var/obj/item/gun/energy/e_gun/advtaser/G = new /obj/item/gun/energy/e_gun/advtaser(Tsec)
var/obj/item/gun/energy/e_gun/advtaser/G = new (Tsec)
G.cell.charge = 0
G.update_icon()
else if(lasercolor == "b")
var/obj/item/gun/energy/laser/bluetag/G = new /obj/item/gun/energy/laser/bluetag(Tsec)
var/obj/item/gun/energy/laser/bluetag/G = new (Tsec)
G.cell.charge = 0
G.update_icon()
else if(lasercolor == "r")
var/obj/item/gun/energy/laser/redtag/G = new /obj/item/gun/energy/laser/redtag(Tsec)
var/obj/item/gun/energy/laser/redtag/G = new (Tsec)
G.cell.charge = 0
G.update_icon()
@@ -162,7 +162,7 @@
update_controls()
/mob/living/simple_animal/bot/floorbot/proc/empty_tiles()
var/turf/Tsec = get_turf(src)
var/atom/Tsec = drop_location()
while(specialtiles > initial(tiletype.max_amount))
new tiletype(Tsec,initial(tiletype.max_amount))
@@ -363,9 +363,9 @@
/mob/living/simple_animal/bot/floorbot/explode()
on = FALSE
visible_message("<span class='boldannounce'>[src] blows apart!</span>")
var/turf/Tsec = get_turf(src)
var/atom/Tsec = drop_location()
var/obj/item/storage/toolbox/mechanical/N = new /obj/item/storage/toolbox/mechanical(Tsec)
var/obj/item/storage/toolbox/mechanical/N = new (Tsec)
N.contents = list()
new /obj/item/device/assembly/prox_sensor(Tsec)
@@ -327,14 +327,14 @@ Maintenance panel panel is [open ? "opened" : "closed"]"},
walk_to(src,0)
visible_message("<span class='boldannounce'>[src] blows apart!</span>")
var/turf/Tsec = get_turf(src)
var/atom/Tsec = drop_location()
//doesn't drop cardboard nor its assembly, since its a very frail material.
if(prob(50))
new /obj/item/bodypart/l_arm/robot/(Tsec)
new /obj/item/bodypart/l_arm/robot(Tsec)
new /obj/item/bikehorn(Tsec)
new /obj/item/device/assembly/prox_sensor(Tsec)
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
var/datum/effect_system/spark_spread/s = new
s.set_up(3, 1, src)
s.start()
@@ -194,7 +194,7 @@
use_beaker = !use_beaker
else if(href_list["eject"] && (!isnull(reagent_glass)))
reagent_glass.loc = get_turf(src)
reagent_glass.forceMove(drop_location())
reagent_glass = null
else if(href_list["togglevoice"])
@@ -516,7 +516,7 @@
/mob/living/simple_animal/bot/medbot/explode()
on = FALSE
visible_message("<span class='boldannounce'>[src] blows apart!</span>")
var/turf/Tsec = get_turf(src)
var/atom/Tsec = drop_location()
new /obj/item/storage/firstaid(Tsec)
@@ -525,7 +525,7 @@
new /obj/item/device/healthanalyzer(Tsec)
if(reagent_glass)
reagent_glass.loc = Tsec
reagent_glass.forceMove(Tsec)
reagent_glass = null
if(prob(50))
@@ -697,14 +697,14 @@
/mob/living/simple_animal/bot/mulebot/explode()
visible_message("<span class='boldannounce'>[src] blows apart!</span>")
var/turf/Tsec = get_turf(src)
var/atom/Tsec = drop_location()
new /obj/item/device/assembly/prox_sensor(Tsec)
new /obj/item/stack/rods(Tsec)
new /obj/item/stack/rods(Tsec)
new /obj/item/stack/cable_coil/cut(Tsec)
if(cell)
cell.loc = Tsec
cell.forceMove(Tsec)
cell.update_icon()
cell = null

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