Merge branch 'theprthatbulliesjanitormains' of https://github.com/deathride58/Citadel-Station-13 into theprthatbulliesjanitormains
This commit is contained in:
@@ -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>.
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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,
|
||||
))
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -175,7 +175,7 @@
|
||||
return
|
||||
|
||||
if(beaker)
|
||||
beaker.forceMove(get_turf(src))
|
||||
beaker.forceMove(drop_location())
|
||||
beaker = null
|
||||
update_icon()
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -56,3 +56,9 @@
|
||||
|
||||
/obj/effect/abstract/singularity_act()
|
||||
return
|
||||
|
||||
/obj/effect/dummy/singularity_pull()
|
||||
return
|
||||
|
||||
/obj/effect/dummy/singularity_act()
|
||||
return
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
..()
|
||||
..()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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()]")
|
||||
..()
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user