mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-14 08:34:16 +01:00
conflicts
This commit is contained in:
@@ -88,7 +88,7 @@ var/global/list/image/splatter_cache = list()
|
||||
return TRUE
|
||||
|
||||
//Add "bloodiness" of this blood's type, to the human's shoes
|
||||
/obj/effect/decal/cleanable/blood/Crossed(atom/movable/O)
|
||||
/obj/effect/decal/cleanable/blood/Crossed(atom/movable/O, oldloc)
|
||||
if(!off_floor && ishuman(O))
|
||||
var/mob/living/carbon/human/H = O
|
||||
var/obj/item/organ/external/l_foot = H.get_organ("l_foot")
|
||||
|
||||
@@ -29,7 +29,7 @@ var/global/list/image/fluidtrack_cache = list()
|
||||
blood_state = BLOOD_STATE_HUMAN //the icon state to load images from
|
||||
|
||||
|
||||
/obj/effect/decal/cleanable/blood/footprints/Crossed(atom/movable/O)
|
||||
/obj/effect/decal/cleanable/blood/footprints/Crossed(atom/movable/O, oldloc)
|
||||
if(ishuman(O))
|
||||
var/mob/living/carbon/human/H = O
|
||||
var/obj/item/clothing/shoes/S = H.shoes
|
||||
|
||||
@@ -345,7 +345,7 @@ steam.start() -- spawns the effect
|
||||
return 1
|
||||
|
||||
|
||||
/obj/effect/effect/bad_smoke/Crossed(mob/living/carbon/M as mob )
|
||||
/obj/effect/effect/bad_smoke/Crossed(mob/living/carbon/M as mob, oldloc)
|
||||
..()
|
||||
if(istype(M, /mob/living/carbon))
|
||||
if(M.internal != null && M.wear_mask && (M.wear_mask.flags & AIRTIGHT))
|
||||
@@ -569,7 +569,7 @@ steam.start() -- spawns the effect
|
||||
M.coughedtime = 0
|
||||
return
|
||||
|
||||
/obj/effect/effect/sleep_smoke/Crossed(mob/living/carbon/M as mob )
|
||||
/obj/effect/effect/sleep_smoke/Crossed(mob/living/carbon/M as mob, oldloc)
|
||||
..()
|
||||
if(istype(M, /mob/living/carbon))
|
||||
if(M.internal != null && M.wear_mask && (M.wear_mask.flags & AIRTIGHT))
|
||||
@@ -672,7 +672,7 @@ steam.start() -- spawns the effect
|
||||
R.updatehealth()
|
||||
return
|
||||
|
||||
/obj/effect/effect/mustard_gas/Crossed(mob/living/carbon/human/R as mob )
|
||||
/obj/effect/effect/mustard_gas/Crossed(mob/living/carbon/human/R as mob, oldloc)
|
||||
..()
|
||||
if(istype(R, /mob/living/carbon/human))
|
||||
if(R.internal != null && usr.wear_mask && (R.wear_mask.flags & AIRTIGHT) && R.wear_suit != null && !istype(R.wear_suit, /obj/item/clothing/suit/storage/labcoat) && !istype(R.wear_suit, /obj/item/clothing/suit/straight_jacket) && !istype(R.wear_suit, /obj/item/clothing/suit/straight_jacket && !istype(R.wear_suit, /obj/item/clothing/suit/armor)))
|
||||
@@ -984,7 +984,7 @@ steam.start() -- spawns the effect
|
||||
qdel(src)
|
||||
|
||||
|
||||
/obj/structure/foam/Crossed(var/atom/movable/AM)
|
||||
/obj/structure/foam/Crossed(var/atom/movable/AM, oldloc)
|
||||
if(metal)
|
||||
return
|
||||
|
||||
|
||||
@@ -94,7 +94,7 @@
|
||||
spawn(5)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/particle_effect/foam/Crossed(atom/movable/AM)
|
||||
/obj/effect/particle_effect/foam/Crossed(atom/movable/AM, oldloc)
|
||||
if(metal)
|
||||
return
|
||||
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
steps--
|
||||
return 1
|
||||
|
||||
/obj/effect/particle_effect/smoke/Crossed(mob/living/M)
|
||||
/obj/effect/particle_effect/smoke/Crossed(mob/living/M, oldloc)
|
||||
if(!istype(M))
|
||||
return
|
||||
smoke_mob(M)
|
||||
@@ -207,4 +207,4 @@
|
||||
return 1
|
||||
|
||||
/datum/effect_system/smoke_spread/sleeping
|
||||
effect_type = /obj/effect/particle_effect/smoke/sleeping
|
||||
effect_type = /obj/effect/particle_effect/smoke/sleeping
|
||||
|
||||
@@ -67,6 +67,23 @@
|
||||
/obj/effect/mapping_helpers/no_lava
|
||||
icon_state = "no_lava"
|
||||
|
||||
/obj/effect/mapping_helpers/airlock
|
||||
layer = DOOR_HELPER_LAYER
|
||||
|
||||
/obj/effect/mapping_helpers/airlock/unres
|
||||
name = "airlock unresctricted side helper"
|
||||
icon_state = "airlock_unres_helper"
|
||||
|
||||
/obj/effect/mapping_helpers/airlock/unres/Initialize(mapload)
|
||||
if(!mapload)
|
||||
log_world("### MAP WARNING, [src] spawned outside of mapload!")
|
||||
return
|
||||
var/obj/machinery/door/airlock/airlock = locate(/obj/machinery/door/airlock) in src.loc
|
||||
if(airlock)
|
||||
airlock.unres_sides ^= dir
|
||||
else
|
||||
log_world("### MAP WARNING, [src] failed to find an airlock at [AREACOORD(src)]")
|
||||
..()
|
||||
/obj/effect/mapping_helpers/no_lava/New()
|
||||
var/turf/T = get_turf(src)
|
||||
T.flags |= NO_LAVA_GEN
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
/obj/effect/mine/proc/mineEffect(mob/living/victim)
|
||||
to_chat(victim, "<span class='danger'>*click*</span>")
|
||||
|
||||
/obj/effect/mine/Crossed(AM as mob|obj)
|
||||
/obj/effect/mine/Crossed(AM as mob|obj, oldloc)
|
||||
if(!isliving(AM))
|
||||
return
|
||||
var/mob/living/M = AM
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
desc = "Looks unstable. Best to test it with the clown."
|
||||
icon = 'icons/obj/stationobjs.dmi'
|
||||
icon_state = "portal"
|
||||
density = TRUE
|
||||
unacidable = TRUE
|
||||
anchored = TRUE
|
||||
|
||||
@@ -17,9 +16,6 @@
|
||||
var/can_multitool_to_remove = FALSE
|
||||
var/ignore_tele_proof_area_setting = FALSE
|
||||
|
||||
/obj/effect/portal/Bumped(mob/M as mob|obj)
|
||||
teleport(M)
|
||||
|
||||
/obj/effect/portal/New(loc, turf/target, creator = null, lifespan = 300)
|
||||
..()
|
||||
|
||||
@@ -49,10 +45,13 @@
|
||||
/obj/effect/portal/singularity_act()
|
||||
return
|
||||
|
||||
/obj/effect/portal/Crossed(atom/movable/AM)
|
||||
/obj/effect/portal/Crossed(atom/movable/AM, oldloc)
|
||||
if(isobserver(AM))
|
||||
return ..()
|
||||
|
||||
if(target && (get_turf(oldloc) == get_turf(target)))
|
||||
return ..()
|
||||
|
||||
if(!teleport(AM))
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -0,0 +1,345 @@
|
||||
/*
|
||||
Spawners for mappers. Just plonk one down of the desired size and it will place the machinery for you. The red arrow things indicate where the chamber is.
|
||||
This spawner places pipe leading up to the interior door, you will need to finish it off yourself with a connector, canister, and pipe connecting the two. It also assumes you already put in wall and floor.
|
||||
*/
|
||||
|
||||
#define HALF_X round((tiles_in_x_direction - 1) * 0.5) //These are required so that the airlock can be in the middle of the chamber wall
|
||||
#define HALF_Y round((tiles_in_y_direction - 1) * 0.5)
|
||||
#define CHAMBER_LONG 1
|
||||
#define CHAMBER_SQUARE 2
|
||||
#define CHAMBER_BIGGER 3
|
||||
#define DOOR_NORMAL_PLACEMENT 1
|
||||
#define DOOR_FLIPPED_PLACEMENT 2
|
||||
|
||||
#define AIRPUMP_TAG "[id_to_link]_pump"
|
||||
#define SENSOR_TAG "[id_to_link]_sensor"
|
||||
#define OUTER_DOOR_TAG "[id_to_link]_outer"
|
||||
#define INNER_DOOR_TAG "[id_to_link]_inner"
|
||||
|
||||
/obj/effect/spawner/airlock
|
||||
name = "1 by 1 airlock spawner (interior north, exterior south)"
|
||||
desc = "If you can see this, there's probably a missing airlock here. Better tell an admin and report this on the github."
|
||||
icon = 'icons/obj/airlock_spawner.dmi'
|
||||
icon_state = "1x1_N_to_S"
|
||||
layer = SPLASHSCREEN_PLANE //So we absolutely always appear above everything else. We delete ourself after spawning so this is fine
|
||||
var/interior_direction = NORTH //This is also the direction the spawner will send the pipe
|
||||
var/exterior_direction = SOUTH
|
||||
var/opposite_interior_direction //We're checking these often enough for them to merit their own vars
|
||||
var/interior_direction_cw
|
||||
var/interior_direction_ccw
|
||||
var/north_or_south_interior //Used a bit everywhere for locational stuff
|
||||
var/north_or_south_exterior //Likewise
|
||||
var/tiles_in_x_direction = 1
|
||||
var/tiles_in_y_direction = 1
|
||||
var/id_to_link
|
||||
var/radio_frequency = 1379
|
||||
var/required_access = list(access_external_airlocks)
|
||||
var/door_name = "external access"
|
||||
var/door_type = /obj/machinery/door/airlock/external/glass
|
||||
var/one_door_interior //For square airlocks, if you set this then a) only one door will spawn, and b) you can choose if the door should go opposite to how it normally goes. Please use the define
|
||||
var/one_door_exterior //See above
|
||||
|
||||
/obj/effect/spawner/airlock/Initialize()
|
||||
..()
|
||||
forceMove(locate(x + 1, y + 1, z)) //Needs to move because our icon_state implies we are one turf to the northeast, when we're not
|
||||
opposite_interior_direction = turn(interior_direction, 180) //Do it this way (instead of setting it directly) to avoid code mishaps
|
||||
interior_direction_cw = turn(interior_direction, 90)
|
||||
interior_direction_ccw = turn(interior_direction, 270)
|
||||
if(interior_direction == NORTH || interior_direction == SOUTH)
|
||||
north_or_south_interior = TRUE
|
||||
if(exterior_direction == NORTH || exterior_direction == SOUTH)
|
||||
north_or_south_exterior = TRUE
|
||||
id_to_link = "[UID()]" //We want unique IDs, this will give us a unique ID
|
||||
var/turf/turf_interior = get_airlock_location(interior_direction)
|
||||
var/turf/turf_exterior = get_airlock_location(exterior_direction)
|
||||
handle_door_creation(turf_interior, TRUE, one_door_interior)
|
||||
handle_door_creation(turf_exterior, FALSE, one_door_exterior)
|
||||
handle_pipes_creation(turf_interior)
|
||||
handle_control_placement()
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/spawner/airlock/proc/get_airlock_location(desired_direction) //Finds a turf to place an airlock and returns it, this turf will be in the middle of the relevant wall
|
||||
var/turf/T
|
||||
switch(desired_direction)
|
||||
if(NORTH)
|
||||
T = locate(x + HALF_X, y + tiles_in_y_direction, z)
|
||||
if(SOUTH)
|
||||
T = locate(x + HALF_X, y - 1, z)
|
||||
if(EAST)
|
||||
T = locate(x + tiles_in_x_direction, y + HALF_Y, z)
|
||||
if(WEST)
|
||||
T = locate(x - 1, y + HALF_Y, z)
|
||||
return T
|
||||
|
||||
/obj/effect/spawner/airlock/proc/handle_door_creation(turf/T, is_this_an_interior_airlock, one_door_only) //Creates a door (or two) and also creates a button
|
||||
var/obj/machinery/door/airlock/A
|
||||
if(one_door_only != DOOR_FLIPPED_PLACEMENT)
|
||||
A = new door_type(T)
|
||||
handle_door_stuff(A, is_this_an_interior_airlock)
|
||||
var/obj/machinery/access_button/the_button = spawn_button(T, is_this_an_interior_airlock ? interior_direction : exterior_direction)
|
||||
if(one_door_only == DOOR_NORMAL_PLACEMENT) //We only need one door, we are done
|
||||
return
|
||||
if(!(tiles_in_x_direction % 2) && (is_this_an_interior_airlock && north_or_south_interior || !is_this_an_interior_airlock && north_or_south_exterior)) //Handle extra airlock for aesthetics
|
||||
A = new door_type(get_step(T, EAST))
|
||||
handle_door_stuff(A, is_this_an_interior_airlock)
|
||||
if(one_door_only == DOOR_FLIPPED_PLACEMENT)
|
||||
the_button.forceMove(get_step(the_button, EAST))
|
||||
else if(!(tiles_in_y_direction % 2) && (is_this_an_interior_airlock && !north_or_south_interior || !is_this_an_interior_airlock && !north_or_south_exterior)) //Handle extra airlock for aesthetics
|
||||
A = new door_type(get_step(T, NORTH))
|
||||
handle_door_stuff(A, is_this_an_interior_airlock)
|
||||
if(one_door_only == DOOR_FLIPPED_PLACEMENT)
|
||||
the_button.forceMove(get_step(the_button, NORTH))
|
||||
|
||||
/obj/effect/spawner/airlock/proc/handle_door_stuff(obj/machinery/door/airlock/A, is_this_an_interior_airlock) //This sets up the door vars correctly and then locks it before first use
|
||||
A.set_frequency(radio_frequency)
|
||||
A.id_tag = is_this_an_interior_airlock ? INNER_DOOR_TAG : OUTER_DOOR_TAG
|
||||
A.req_access = required_access
|
||||
A.name = door_name
|
||||
A.lock()
|
||||
|
||||
/obj/effect/spawner/airlock/proc/spawn_button(turf/T, some_direction)
|
||||
var/obj/machinery/access_button/the_button = new(T)
|
||||
the_button.master_tag = id_to_link
|
||||
the_button.set_frequency(radio_frequency)
|
||||
switch(some_direction)
|
||||
if(NORTH)
|
||||
the_button.pixel_x -= 25
|
||||
the_button.pixel_y = 7
|
||||
if(EAST)
|
||||
the_button.pixel_x = 7
|
||||
the_button.pixel_y = -25
|
||||
if(SOUTH)
|
||||
the_button.pixel_x -= 25
|
||||
the_button.pixel_y -= 7
|
||||
if(WEST)
|
||||
the_button.pixel_x -= 7
|
||||
the_button.pixel_y -= 25
|
||||
the_button.req_access = required_access
|
||||
return the_button
|
||||
|
||||
/obj/effect/spawner/airlock/proc/handle_control_placement() //Stick the sensor and controller on the same bit of wall, this will ONLY be unsuitable if airlocks are on both the south and west turfs
|
||||
var/turf/T = get_turf(src)
|
||||
var/obj/machinery/airlock_sensor/AS = new(T)
|
||||
var/obj/machinery/embedded_controller/radio/airlock/airlock_controller/AC = new(T, id_to_link, radio_frequency, OUTER_DOOR_TAG, INNER_DOOR_TAG, AIRPUMP_TAG, SENSOR_TAG)
|
||||
AC.req_access = required_access
|
||||
AS.id_tag = SENSOR_TAG
|
||||
AS.set_frequency(radio_frequency)
|
||||
if(interior_direction != WEST && exterior_direction != WEST) //If west wall is free, place stuff there
|
||||
AC.pixel_x -= 25
|
||||
AC.pixel_y += 9
|
||||
AS.pixel_x -= 25
|
||||
AS.pixel_y -= 9
|
||||
else if(interior_direction != SOUTH && exterior_direction != SOUTH) //If south wall is free, place stuff there
|
||||
AC.pixel_x += 9
|
||||
AC.pixel_y -= 25
|
||||
AS.pixel_x -= 9
|
||||
AS.pixel_y -= 25
|
||||
else //Send them over to the other side of the chamber
|
||||
T = locate(x + tiles_in_x_direction - 1, y + tiles_in_y_direction - 1, z)
|
||||
AC.forceMove(T)
|
||||
AS.forceMove(T)
|
||||
AC.pixel_x += 25
|
||||
AC.pixel_y += 9
|
||||
AS.pixel_x += 25
|
||||
AS.pixel_y -= 9
|
||||
|
||||
/obj/effect/spawner/airlock/proc/handle_pipes_creation(turf/T) //This places all required piping down, then properly initializes it. T is the turf that the interior airlock occupies
|
||||
var/turf/below_T = get_step(T, opposite_interior_direction)
|
||||
|
||||
var/two_way_pipe = interior_direction | opposite_interior_direction
|
||||
var/chamber_shape //This determines the layout of the chamber and therefore how many vents should be present
|
||||
if(tiles_in_x_direction == 2 && tiles_in_y_direction == 2)
|
||||
chamber_shape = CHAMBER_SQUARE
|
||||
else if(tiles_in_x_direction > 1 && tiles_in_y_direction > 1)
|
||||
chamber_shape = CHAMBER_BIGGER
|
||||
else
|
||||
chamber_shape = CHAMBER_LONG
|
||||
pipe_creation_helper(/obj/machinery/atmospherics/pipe/simple/visible, T, interior_direction, two_way_pipe)
|
||||
switch(chamber_shape)
|
||||
if(CHAMBER_LONG) //Easy enough, place a single vent
|
||||
pipe_creation_helper(/obj/machinery/atmospherics/unary/vent_pump/high_volume,
|
||||
below_T,
|
||||
interior_direction)
|
||||
if(CHAMBER_SQUARE) //We need a T-manifold and two vents for this
|
||||
pipe_creation_helper(/obj/machinery/atmospherics/pipe/manifold/visible,
|
||||
below_T,
|
||||
north_or_south_interior ? WEST : SOUTH,
|
||||
NORTH | EAST | (north_or_south_interior ? SOUTH : WEST))
|
||||
pipe_creation_helper(/obj/machinery/atmospherics/unary/vent_pump/high_volume,
|
||||
get_step(below_T, opposite_interior_direction),
|
||||
interior_direction)
|
||||
pipe_creation_helper(/obj/machinery/atmospherics/unary/vent_pump/high_volume,
|
||||
north_or_south_interior ? EAST_OF_TURF(below_T) : NORTH_OF_TURF(below_T),
|
||||
turn(interior_direction, interior_direction == SOUTH || interior_direction == EAST ? -90 : 90))
|
||||
if(CHAMBER_BIGGER) //We need a central column of manifolds and a vent either side of each manifold
|
||||
var/depth = north_or_south_interior ? tiles_in_y_direction : tiles_in_x_direction
|
||||
var/turf/put_thing_here = below_T
|
||||
for(var/i in 1 to depth)
|
||||
if(i != depth)//We're placing more pipe later, so we need a 4-way manifold
|
||||
pipe_creation_helper(/obj/machinery/atmospherics/pipe/manifold4w/visible, put_thing_here, interior_direction, NORTH | EAST | SOUTH | WEST)
|
||||
else //We stop here, so place a T-manifold down
|
||||
pipe_creation_helper(/obj/machinery/atmospherics/pipe/manifold/visible,
|
||||
put_thing_here,
|
||||
opposite_interior_direction,
|
||||
interior_direction_cw | interior_direction | interior_direction_ccw)
|
||||
pipe_creation_helper(/obj/machinery/atmospherics/unary/vent_pump/high_volume,
|
||||
get_step(put_thing_here, interior_direction_cw),
|
||||
interior_direction_ccw)
|
||||
pipe_creation_helper(/obj/machinery/atmospherics/unary/vent_pump/high_volume,
|
||||
get_step(put_thing_here, interior_direction_ccw),
|
||||
interior_direction_cw)
|
||||
put_thing_here = get_step(put_thing_here, opposite_interior_direction) //Now move the turf we're generating stuff from 1 forward
|
||||
|
||||
/obj/effect/spawner/airlock/proc/pipe_creation_helper(path, location, direction, initialization_directions) //Create some kind of atmospherics machinery and initialize it properly
|
||||
var/obj/machinery/atmospherics/A = new path(location)
|
||||
A.dir = direction
|
||||
A.on_construction(A.dir, initialization_directions ? initialization_directions : A.dir)
|
||||
if(istype(A, /obj/machinery/atmospherics/unary/vent_pump/high_volume))
|
||||
var/obj/machinery/atmospherics/unary/vent_pump/high_volume/created_pump = A
|
||||
created_pump.id_tag = AIRPUMP_TAG
|
||||
created_pump.set_frequency(radio_frequency)
|
||||
|
||||
|
||||
//Premade airlocks for mappers, probably won't need all of these but whatever
|
||||
/obj/effect/spawner/airlock/s_to_n
|
||||
name = "1 by 1 airlock spawner (interior south, exterior north)"
|
||||
icon_state = "1x1_S_to_N"
|
||||
interior_direction = SOUTH
|
||||
exterior_direction = NORTH
|
||||
/obj/effect/spawner/airlock/e_to_w
|
||||
name = "1 by 1 airlock spawner (interior east, exterior west)"
|
||||
icon_state = "1x1_E_to_W"
|
||||
interior_direction = EAST
|
||||
exterior_direction = WEST
|
||||
/obj/effect/spawner/airlock/w_to_e
|
||||
name = "1 by 1 airlock spawner (interior west, exterior east)"
|
||||
icon_state = "1x1_W_to_E"
|
||||
interior_direction = WEST
|
||||
exterior_direction = EAST
|
||||
|
||||
/obj/effect/spawner/airlock/long //Long and thin
|
||||
name = "long airlock spawner (interior north, exterior south)"
|
||||
icon_state = "1x2_N_to_S"
|
||||
tiles_in_y_direction = 2
|
||||
/obj/effect/spawner/airlock/s_to_n/long
|
||||
name = "long airlock spawner (interior south, exterior north)"
|
||||
icon_state = "1x2_S_to_N"
|
||||
tiles_in_y_direction = 2
|
||||
/obj/effect/spawner/airlock/e_to_w/long
|
||||
name = "long airlock spawner (interior east, exterior west)"
|
||||
icon_state = "1x2_E_to_W"
|
||||
tiles_in_x_direction = 2
|
||||
/obj/effect/spawner/airlock/w_to_e/long
|
||||
name = "long airlock spawner (interior west, exterior east)"
|
||||
icon_state = "1x2_W_to_E"
|
||||
tiles_in_x_direction = 2
|
||||
|
||||
/obj/effect/spawner/airlock/long/square //Square
|
||||
name = "square airlock spawner (interior north, exterior south)"
|
||||
icon_state = "2x2_N_to_S"
|
||||
tiles_in_x_direction = 2
|
||||
/obj/effect/spawner/airlock/s_to_n/long/square
|
||||
name = "square airlock spawner (interior south, exterior north)"
|
||||
icon_state = "2x2_S_to_N"
|
||||
tiles_in_x_direction = 2
|
||||
/obj/effect/spawner/airlock/e_to_w/long/square
|
||||
name = "square airlock spawner (interior east, exterior west)"
|
||||
icon_state = "2x2_E_to_W"
|
||||
tiles_in_y_direction = 2
|
||||
/obj/effect/spawner/airlock/w_to_e/long/square
|
||||
name = "square airlock spawner (interior west, exterior east)"
|
||||
icon_state = "2x2_W_to_E"
|
||||
tiles_in_y_direction = 2
|
||||
/obj/effect/spawner/airlock/long/square/e_to_s
|
||||
name = "square airlock spawner (interior east, exterior south)"
|
||||
icon_state = "2x2_E_to_S"
|
||||
interior_direction = EAST
|
||||
exterior_direction = SOUTH
|
||||
|
||||
/obj/effect/spawner/airlock/long/square/wide
|
||||
name = "rectangular airlock spawner (interior north, exterior south)"
|
||||
icon_state = "3x2_N_to_S"
|
||||
tiles_in_x_direction = 3
|
||||
/obj/effect/spawner/airlock/s_to_n/long/square/wide
|
||||
name = "rectangular airlock spawner (interior south, exterior north)"
|
||||
icon_state = "3x2_S_to_N"
|
||||
tiles_in_x_direction = 3
|
||||
/obj/effect/spawner/airlock/e_to_w/long/square/wide
|
||||
name = "rectangular airlock spawner (interior east, exterior west)"
|
||||
icon_state = "3x2_E_to_W"
|
||||
tiles_in_y_direction = 3
|
||||
/obj/effect/spawner/airlock/w_to_e/long/square/wide
|
||||
name = "rectangular airlock spawner (interior west, exterior east)"
|
||||
icon_state = "3x2_W_to_E"
|
||||
tiles_in_y_direction = 3
|
||||
|
||||
/obj/effect/spawner/airlock/long/square/three
|
||||
name = "3 by 3 square airlock spawner (interior north, exterior south)"
|
||||
icon_state = "3x3_N_to_S"
|
||||
interior_direction = NORTH
|
||||
exterior_direction = SOUTH
|
||||
tiles_in_x_direction = 3
|
||||
tiles_in_y_direction = 3
|
||||
|
||||
/obj/effect/spawner/airlock/e_to_w/arrivals
|
||||
required_access = null
|
||||
|
||||
/obj/effect/spawner/airlock/engineer
|
||||
required_access = list(access_engine)
|
||||
door_name = "engineering external access"
|
||||
/obj/effect/spawner/airlock/e_to_w/engineer
|
||||
required_access = list(access_engine)
|
||||
door_name = "engineering external access"
|
||||
/obj/effect/spawner/airlock/s_to_n/engineer
|
||||
required_access = list(access_engine)
|
||||
door_name = "engineering external access"
|
||||
/obj/effect/spawner/airlock/long/engineer
|
||||
required_access = list(access_engine)
|
||||
door_name = "engineering external access"
|
||||
/obj/effect/spawner/airlock/long/square/engine
|
||||
required_access = list(access_engine)
|
||||
door_name = "engine external access"
|
||||
icon_state = "2x2_N_to_S_leftdoors"
|
||||
door_type = /obj/machinery/door/airlock/external
|
||||
one_door_interior = DOOR_NORMAL_PLACEMENT
|
||||
one_door_exterior = DOOR_NORMAL_PLACEMENT
|
||||
/obj/effect/spawner/airlock/long/square/engine/reversed
|
||||
icon_state = "2x2_N_to_S_rightdoors"
|
||||
one_door_interior = DOOR_FLIPPED_PLACEMENT
|
||||
one_door_exterior = DOOR_FLIPPED_PLACEMENT
|
||||
|
||||
/obj/effect/spawner/airlock/w_to_e/long/square/wide/mining
|
||||
door_name = "mining external access"
|
||||
required_access = list(access_mining)
|
||||
/obj/effect/spawner/airlock/long/square/wide/mining
|
||||
door_name = "mining external access"
|
||||
required_access = list(access_mining)
|
||||
|
||||
/obj/effect/spawner/airlock/e_to_w/minisat
|
||||
door_name = "minisat external access"
|
||||
required_access = list(access_minisat)
|
||||
/obj/effect/spawner/airlock/long/square/e_to_s/telecoms
|
||||
door_name = "telecoms external access"
|
||||
required_access = list(access_tcomsat, access_external_airlocks)
|
||||
door_type = /obj/machinery/door/airlock/external
|
||||
|
||||
/obj/effect/spawner/airlock/long/square/three/syndicate
|
||||
name = "3 by 3 square airlock spawner (interior west, exterior north)"
|
||||
icon_state = "3x3_W_to_N"
|
||||
interior_direction = WEST
|
||||
exterior_direction = NORTH
|
||||
door_name = "ship external access"
|
||||
req_access = list(access_syndicate)
|
||||
door_type = /obj/machinery/door/airlock/external
|
||||
|
||||
#undef HALF_X
|
||||
#undef HALF_Y
|
||||
#undef CHAMBER_LONG
|
||||
#undef CHAMBER_SQUARE
|
||||
#undef CHAMBER_BIGGER
|
||||
#undef DOOR_NORMAL_PLACEMENT
|
||||
#undef DOOR_FLIPPED_PLACEMENT
|
||||
#undef AIRPUMP_TAG
|
||||
#undef SENSOR_TAG
|
||||
#undef OUTER_DOOR_TAG
|
||||
#undef INNER_DOOR_TAG
|
||||
@@ -1,23 +1,43 @@
|
||||
/* Simple object type, calls a proc when "stepped" on by something */
|
||||
|
||||
/obj/effect/step_trigger
|
||||
var/affect_ghosts = 0
|
||||
var/stopper = 1 // stops throwers
|
||||
invisibility = 101 // nope cant see this shit
|
||||
anchored = 1
|
||||
var/affect_ghosts = FALSE
|
||||
var/stopper = TRUE // stops throwers
|
||||
var/mobs_only = FALSE
|
||||
invisibility = INVISIBILITY_ABSTRACT // nope cant see this shit
|
||||
anchored = TRUE
|
||||
|
||||
/obj/effect/step_trigger/proc/Trigger(var/atom/movable/A)
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
/obj/effect/step_trigger/Crossed(H as mob|obj)
|
||||
..()
|
||||
/obj/effect/step_trigger/Crossed(var/H, oldloc)
|
||||
. = ..()
|
||||
if(!H)
|
||||
return
|
||||
if(istype(H, /mob/dead/observer) && !affect_ghosts)
|
||||
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 */
|
||||
|
||||
@@ -30,57 +50,57 @@
|
||||
var/nostop = 0 // if 1: will only be stopped by teleporters
|
||||
var/list/affecting = list()
|
||||
|
||||
Trigger(var/atom/A)
|
||||
if(!A || !istype(A, /atom/movable))
|
||||
/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
|
||||
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
|
||||
if(isliving(AM))
|
||||
var/mob/living/M = AM
|
||||
if(immobilize)
|
||||
M.canmove = FALSE
|
||||
|
||||
affecting.Add(AM)
|
||||
while(AM && !stopthrow)
|
||||
if(tiles)
|
||||
if(curtiles >= tiles)
|
||||
break
|
||||
if(AM.z != src.z)
|
||||
affecting.Add(AM)
|
||||
while(AM && !stopthrow)
|
||||
if(tiles)
|
||||
if(curtiles >= tiles)
|
||||
break
|
||||
if(AM.z != src.z)
|
||||
break
|
||||
|
||||
curtiles++
|
||||
curtiles++
|
||||
|
||||
sleep(speed)
|
||||
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
|
||||
// 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.dir = predir
|
||||
if(AM)
|
||||
var/predir = AM.dir
|
||||
step(AM, direction)
|
||||
if(!facedir)
|
||||
AM.setDir(predir)
|
||||
|
||||
|
||||
|
||||
affecting.Remove(AM)
|
||||
affecting.Remove(AM)
|
||||
|
||||
if(ismob(AM))
|
||||
var/mob/M = AM
|
||||
if(immobilize)
|
||||
M.canmove = 1
|
||||
if(isliving(AM))
|
||||
var/mob/living/M = AM
|
||||
if(immobilize)
|
||||
M.canmove = TRUE
|
||||
|
||||
/* Stops things thrown by a thrower, doesn't do anything */
|
||||
|
||||
@@ -93,12 +113,11 @@
|
||||
var/teleport_y = 0
|
||||
var/teleport_z = 0
|
||||
|
||||
Trigger(var/atom/movable/A)
|
||||
if(teleport_x && teleport_y && teleport_z)
|
||||
/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
|
||||
var/turf/T = locate(teleport_x, teleport_y, teleport_z)
|
||||
A.forceMove(T)
|
||||
|
||||
/* Random teleporter, teleports atoms to locations ranging from teleport_x - teleport_x_offset, etc */
|
||||
|
||||
@@ -107,11 +126,73 @@
|
||||
var/teleport_y_offset = 0
|
||||
var/teleport_z_offset = 0
|
||||
|
||||
Trigger(var/atom/movable/A)
|
||||
if(teleport_x && teleport_y && teleport_z)
|
||||
if(teleport_x_offset && teleport_y_offset && teleport_z_offset)
|
||||
/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)
|
||||
var/turf/T = locate(rand(teleport_x, teleport_x_offset), rand(teleport_y, teleport_y_offset), rand(teleport_z, teleport_z_offset))
|
||||
if (T)
|
||||
A.forceMove(T)
|
||||
|
||||
/* 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)
|
||||
@@ -6,6 +6,10 @@
|
||||
randomdir = 0
|
||||
layer = ABOVE_NORMAL_TURF_LAYER
|
||||
|
||||
/obj/effect/temp_visual/ratvar/door
|
||||
icon_state = "ratvardoorglow"
|
||||
layer = CLOSED_DOOR_LAYER //above closed doors
|
||||
|
||||
/obj/effect/temp_visual/ratvar/door/window
|
||||
icon_state = "ratvarwindoorglow"
|
||||
layer = ABOVE_WINDOW_LAYER
|
||||
@@ -16,9 +20,27 @@
|
||||
/obj/effect/temp_visual/ratvar/beam/grille
|
||||
layer = BELOW_OBJ_LAYER
|
||||
|
||||
/obj/effect/temp_visual/ratvar/beam/itemconsume
|
||||
layer = HIGH_OBJ_LAYER
|
||||
|
||||
/obj/effect/temp_visual/ratvar/beam/falsewall
|
||||
layer = OBJ_LAYER
|
||||
|
||||
/obj/effect/temp_visual/ratvar/beam/catwalk
|
||||
layer = LATTICE_LAYER
|
||||
|
||||
/obj/effect/temp_visual/ratvar/wall
|
||||
icon_state = "ratvarwallglow"
|
||||
|
||||
/obj/effect/temp_visual/ratvar/wall/false
|
||||
layer = OBJ_LAYER
|
||||
|
||||
/obj/effect/temp_visual/ratvar/floor
|
||||
icon_state = "ratvarfloorglow"
|
||||
|
||||
/obj/effect/temp_visual/ratvar/floor/catwalk
|
||||
layer = LATTICE_LAYER
|
||||
|
||||
/obj/effect/temp_visual/ratvar/window
|
||||
icon_state = "ratvarwindowglow"
|
||||
layer = ABOVE_OBJ_LAYER
|
||||
@@ -26,6 +48,10 @@
|
||||
/obj/effect/temp_visual/ratvar/window/single
|
||||
icon_state = "ratvarwindowglow_s"
|
||||
|
||||
/obj/effect/temp_visual/ratvar/gear
|
||||
icon_state = "ratvargearglow"
|
||||
layer = BELOW_OBJ_LAYER
|
||||
|
||||
/obj/effect/temp_visual/ratvar/grille
|
||||
icon_state = "ratvargrilleglow"
|
||||
layer = BELOW_OBJ_LAYER
|
||||
|
||||
@@ -578,7 +578,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
|
||||
/obj/item/proc/is_equivalent(obj/item/I)
|
||||
return I == src
|
||||
|
||||
/obj/item/Crossed(atom/movable/AM)
|
||||
/obj/item/Crossed(atom/movable/AM, oldloc)
|
||||
. = ..()
|
||||
if(prob(trip_chance) && ishuman(AM))
|
||||
var/mob/living/carbon/human/H = AM
|
||||
|
||||
@@ -50,6 +50,7 @@
|
||||
to_chat(user, "<span class='danger'>[D]'s ID scan is disabled!</span>")
|
||||
return
|
||||
if(D.check_access(src.ID))
|
||||
D.add_hiddenprint(user)
|
||||
switch(mode)
|
||||
if(WAND_OPEN)
|
||||
if(D.density)
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
A.UpdateButtonIcon()
|
||||
|
||||
/obj/item/voice_changer/proc/set_voice(mob/user)
|
||||
var/chosen_voice = input(user, "What voice would you like to mimic? Leave this empty to use the voice on your ID card.", "Set Voice Changer", voice) as text
|
||||
var/chosen_voice = clean_input("What voice would you like to mimic? Leave this empty to use the voice on your ID card.", "Set Voice Changer", voice, user)
|
||||
if(!chosen_voice)
|
||||
voice = null
|
||||
to_chat(user, "<span class='notice'>You are now mimicking the voice on your ID card.</span>")
|
||||
|
||||
@@ -195,8 +195,6 @@
|
||||
heal_burn = 25
|
||||
|
||||
//Medical Herbs//
|
||||
|
||||
|
||||
/obj/item/stack/medical/bruise_pack/comfrey
|
||||
name = "\improper Comfrey leaf"
|
||||
singular_name = "Comfrey leaf"
|
||||
@@ -217,48 +215,55 @@
|
||||
color = "#4CC5C7"
|
||||
heal_burn = 12
|
||||
|
||||
|
||||
//Splints//
|
||||
|
||||
|
||||
// Splints
|
||||
/obj/item/stack/medical/splint
|
||||
name = "medical splints"
|
||||
singular_name = "medical splint"
|
||||
icon_state = "splint"
|
||||
unique_handling = 1
|
||||
unique_handling = TRUE
|
||||
self_delay = 100
|
||||
var/other_delay = 0
|
||||
|
||||
/obj/item/stack/medical/splint/attack(mob/living/M, mob/user)
|
||||
if(..())
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
|
||||
var/limb = affecting.name
|
||||
|
||||
if(!(affecting.limb_name in list("l_arm", "r_arm", "l_hand", "r_hand", "l_leg", "r_leg", "l_foot", "r_foot")))
|
||||
to_chat(user, "<span class='danger'>You can't apply a splint there!</span>")
|
||||
return
|
||||
return TRUE
|
||||
|
||||
if(affecting.status & ORGAN_SPLINTED)
|
||||
to_chat(user, "<span class='danger'>[H]'s [limb] is already splinted!</span>")
|
||||
if(alert(user, "Would you like to remove the splint from [H]'s [limb]?", "Removing.", "Yes", "No") == "Yes")
|
||||
if(alert(user, "Would you like to remove the splint from [H]'s [limb]?", "Splint removal.", "Yes", "No") == "Yes")
|
||||
affecting.status &= ~ORGAN_SPLINTED
|
||||
H.handle_splints()
|
||||
to_chat(user, "<span class='notice'>You remove the splint from [H]'s [limb].</span>")
|
||||
return
|
||||
if(M == user)
|
||||
user.visible_message("<span class='notice'>[user] starts to apply [src] to [user.p_their()] [limb].</span>", \
|
||||
"<span class='notice'>You start to apply [src] to your [limb].</span>", \
|
||||
"<span class='notice'>You hear something being wrapped.</span>")
|
||||
if(!do_mob(user, H, self_delay))
|
||||
return
|
||||
else
|
||||
user.visible_message("<span class='green'>[user] applies [src] to [H]'s [limb].</span>", \
|
||||
"<span class='green'>You apply [src] to [H]'s [limb].</span>", \
|
||||
"<span class='green'>You hear something being wrapped.</span>")
|
||||
return TRUE
|
||||
|
||||
if((M == user && self_delay > 0) || (M != user && other_delay > 0))
|
||||
user.visible_message("<span class='notice'>[user] starts to apply [src] to [H]'s [limb].</span>", \
|
||||
"<span class='notice'>You start to apply [src] to [H]'s [limb].</span>", \
|
||||
"<span class='notice'>You hear something being wrapped.</span>")
|
||||
|
||||
if(M == user && !do_mob(user, H, self_delay))
|
||||
return TRUE
|
||||
else if(!do_mob(user, H, other_delay))
|
||||
return TRUE
|
||||
|
||||
user.visible_message("<span class='notice'>[user] applies [src] to [H]'s [limb].</span>", \
|
||||
"<span class='notice'>You apply [src] to [H]'s [limb].</span>")
|
||||
|
||||
affecting.status |= ORGAN_SPLINTED
|
||||
affecting.splinted_count = H.step_count
|
||||
H.handle_splints()
|
||||
|
||||
use(1)
|
||||
|
||||
/obj/item/stack/medical/splint/tribal
|
||||
name = "tribal splints"
|
||||
icon_state = "tribal_splint"
|
||||
other_delay = 50
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
var/global/list/datum/stack_recipe/metal_recipes = list(
|
||||
new /datum/stack_recipe("stool", /obj/structure/chair/stool, one_per_turf = 1, on_floor = 1),
|
||||
new /datum/stack_recipe("chair", /obj/structure/chair, one_per_turf = 1, on_floor = 1),
|
||||
new /datum/stack_recipe("shuttle seat", /obj/structure/chair/comfy/shuttle, 2, one_per_turf = 1, on_floor = 1),
|
||||
new /datum/stack_recipe("sofa (middle)", /obj/structure/chair/sofa, one_per_turf = 1, on_floor = 1),
|
||||
new /datum/stack_recipe("sofa (left)", /obj/structure/chair/sofa/left, one_per_turf = 1, on_floor = 1),
|
||||
new /datum/stack_recipe("sofa (right)", /obj/structure/chair/sofa/right, one_per_turf = 1, on_floor = 1),
|
||||
@@ -216,6 +217,8 @@ var/global/list/datum/stack_recipe/cloth_recipes = list ( \
|
||||
null, \
|
||||
new/datum/stack_recipe("fingerless gloves", /obj/item/clothing/gloves/fingerless, 1), \
|
||||
new/datum/stack_recipe("black gloves", /obj/item/clothing/gloves/color/black, 3), \
|
||||
null, \
|
||||
new/datum/stack_recipe("blindfold", /obj/item/clothing/glasses/sunglasses/blindfold, 3), \
|
||||
)
|
||||
|
||||
/obj/item/stack/sheet/cloth
|
||||
@@ -335,10 +338,13 @@ var/global/list/datum/stack_recipe/cult = list ( \
|
||||
* Brass
|
||||
*/
|
||||
var/global/list/datum/stack_recipe/brass_recipes = list (\
|
||||
new/datum/stack_recipe("wall gear", /obj/structure/clockwork/wall_gear, 3, time = 10, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
null,
|
||||
new/datum/stack_recipe/window("brass windoor", /obj/machinery/door/window/clockwork, 2, time = 30, on_floor = TRUE, window_checks = TRUE), \
|
||||
null,
|
||||
new/datum/stack_recipe/window("directional brass window", /obj/structure/window/reinforced/clockwork, time = 0, on_floor = TRUE, window_checks = TRUE), \
|
||||
new/datum/stack_recipe/window("fulltile brass window", /obj/structure/window/reinforced/clockwork/fulltile, 2, time = 0, on_floor = TRUE, window_checks = TRUE), \
|
||||
new/datum/stack_recipe("brass chair", /obj/structure/chair/brass, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
new/datum/stack_recipe("brass table frame", /obj/structure/table_frame/brass, 1, time = 5, one_per_turf = TRUE, on_floor = TRUE), \
|
||||
)
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
if(S.merge_type == merge_type)
|
||||
merge(S)
|
||||
|
||||
/obj/item/stack/Crossed(obj/O)
|
||||
/obj/item/stack/Crossed(obj/O, oldloc)
|
||||
if(amount >= max_amount || ismob(loc)) // Prevents unnecessary call. Also prevents merging stack automatically in a mob's inventory
|
||||
return
|
||||
if(istype(O, merge_type) && !O.throwing)
|
||||
|
||||
@@ -208,6 +208,7 @@
|
||||
origin_tech = null
|
||||
attack_verb = list("attacked", "struck", "hit")
|
||||
brightness_on = 0
|
||||
sharp_when_wielded = FALSE // It's a toy
|
||||
|
||||
/obj/item/twohanded/dualsaber/toy/hit_reaction()
|
||||
return 0
|
||||
@@ -283,7 +284,7 @@
|
||||
..()
|
||||
pop_burst()
|
||||
|
||||
/obj/item/toy/snappop/Crossed(H as mob|obj)
|
||||
/obj/item/toy/snappop/Crossed(H as mob|obj, oldloc)
|
||||
if(ishuman(H) || issilicon(H)) //i guess carp and shit shouldn't set them off
|
||||
var/mob/living/carbon/M = H
|
||||
if(issilicon(H) || M.m_intent == MOVE_INTENT_RUN)
|
||||
|
||||
@@ -25,20 +25,34 @@
|
||||
if(special_die == "100")
|
||||
new /obj/item/dice/d100(src)
|
||||
|
||||
/obj/item/storage/pill_bottle/dice/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is gambling with death! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
return (OXYLOSS)
|
||||
|
||||
/obj/item/dice //depreciated d6, use /obj/item/dice/d6 if you actually want a d6
|
||||
name = "die"
|
||||
desc = "A die with six sides. Basic and servicable."
|
||||
icon = 'icons/obj/dice.dmi'
|
||||
icon_state = "d6"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
|
||||
var/sides = 6
|
||||
var/result = null
|
||||
var/list/special_faces = list() //entries should match up to sides var if used
|
||||
|
||||
/obj/item/dice/New()
|
||||
result = rand(1, sides)
|
||||
var/rigged = DICE_NOT_RIGGED
|
||||
var/rigged_value
|
||||
|
||||
/obj/item/dice/Initialize(mapload)
|
||||
. = ..()
|
||||
if(!result)
|
||||
result = roll(sides)
|
||||
update_icon()
|
||||
|
||||
/obj/item/dice/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is gambling with death! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
return (OXYLOSS)
|
||||
|
||||
/obj/item/dice/d1
|
||||
name = "d1"
|
||||
desc = "A die with one side. Deterministic!"
|
||||
@@ -117,11 +131,19 @@
|
||||
. = ..()
|
||||
|
||||
/obj/item/dice/proc/diceroll(mob/user)
|
||||
result = rand(1, sides)
|
||||
var/fake_result = rand(1, sides)//Daredevil isn't as good as he used to be
|
||||
result = roll(sides)
|
||||
if(rigged != DICE_NOT_RIGGED && result != rigged_value)
|
||||
if(rigged == DICE_BASICALLY_RIGGED && prob(Clamp(1/(sides - 1) * 100, 25, 80)))
|
||||
result = rigged_value
|
||||
else if(rigged == DICE_TOTALLY_RIGGED)
|
||||
result = rigged_value
|
||||
|
||||
. = result
|
||||
|
||||
var/fake_result = roll(sides)//Daredevil isn't as good as he used to be
|
||||
var/comment = ""
|
||||
if(sides == 20 && result == 20)
|
||||
comment = "Nat 20!"
|
||||
comment = "NAT 20!"
|
||||
else if(sides == 20 && result == 1)
|
||||
comment = "Ouch, bad luck."
|
||||
update_icon()
|
||||
@@ -130,16 +152,18 @@
|
||||
if(special_faces.len == sides)
|
||||
result = special_faces[result]
|
||||
if(user != null) //Dice was rolled in someone's hand
|
||||
user.visible_message("<span class='notice'>[user] has thrown [src]. It lands on [result]. [comment]</span>", \
|
||||
user.visible_message("[user] has thrown [src]. It lands on [result]. [comment]", \
|
||||
"<span class='notice'>You throw [src]. It lands on [result]. [comment]</span>", \
|
||||
"<span class='italics'>You hear [src] rolling, it sounds like a [fake_result].</span>")
|
||||
else if(!throwing) //Dice was thrown and is coming to rest
|
||||
else if(!src.throwing) //Dice was thrown and is coming to rest
|
||||
visible_message("<span class='notice'>[src] rolls to a stop, landing on [result]. [comment]</span>")
|
||||
|
||||
/obj/item/dice/d20/e20/diceroll(mob/user as mob, thrown)
|
||||
if(triggered)
|
||||
return
|
||||
..()
|
||||
|
||||
. = ..()
|
||||
|
||||
if(result == 1)
|
||||
to_chat(user, "<span class='danger'>Rocks fall, you die.</span>")
|
||||
user.gib()
|
||||
@@ -166,7 +190,7 @@
|
||||
|
||||
/obj/item/dice/update_icon()
|
||||
overlays.Cut()
|
||||
overlays += "[src.icon_state][src.result]"
|
||||
overlays += "[icon_state][result]"
|
||||
|
||||
/obj/item/storage/box/dice
|
||||
name = "Box of dice"
|
||||
|
||||
@@ -48,9 +48,9 @@
|
||||
/obj/item/grenade/plastic/receive_signal()
|
||||
prime()
|
||||
|
||||
/obj/item/grenade/plastic/Crossed(atom/movable/AM)
|
||||
/obj/item/grenade/plastic/Crossed(atom/movable/AM, oldloc)
|
||||
if(nadeassembly)
|
||||
nadeassembly.Crossed(AM)
|
||||
nadeassembly.Crossed(AM, oldloc)
|
||||
|
||||
/obj/item/grenade/plastic/on_found(mob/finder)
|
||||
if(nadeassembly)
|
||||
|
||||
@@ -239,9 +239,9 @@
|
||||
if(nadeassembly)
|
||||
nadeassembly.process_movement()
|
||||
|
||||
/obj/item/grenade/chem_grenade/Crossed(atom/movable/AM)
|
||||
/obj/item/grenade/chem_grenade/Crossed(atom/movable/AM, oldloc)
|
||||
if(nadeassembly)
|
||||
nadeassembly.Crossed(AM)
|
||||
nadeassembly.Crossed(AM, oldloc)
|
||||
|
||||
/obj/item/grenade/chem_grenade/on_found(mob/finder)
|
||||
if(nadeassembly)
|
||||
@@ -289,7 +289,7 @@
|
||||
var/mob/last = get_mob_by_ckey(nadeassembly.fingerprintslast)
|
||||
var/turf/T = get_turf(src)
|
||||
var/area/A = get_area(T)
|
||||
message_admins("grenade primed by an assembly, attached by [key_name_admin(M)][ADMIN_QUE(M,"(?)")] ([admin_jump_link(M)]) and last touched by [key_name_admin(last)][ADMIN_QUE(last,"(?)")] ([admin_jump_link(last)]) ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>[A.name] (JMP)</a>. [contained]")
|
||||
message_admins("grenade primed by an assembly, attached by [key_name_admin(M)] and last touched by [key_name_admin(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>[A.name] (JMP)</a>. [contained]")
|
||||
log_game("grenade primed by an assembly, attached by [key_name(M)] and last touched by [key_name(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] ([T.x], [T.y], [T.z]) [contained]")
|
||||
|
||||
update_mob()
|
||||
@@ -419,7 +419,7 @@
|
||||
var/mob/last = get_mob_by_ckey(nadeassembly.fingerprintslast)
|
||||
var/turf/T = get_turf(src)
|
||||
var/area/A = get_area(T)
|
||||
message_admins("grenade primed by an assembly, attached by [key_name_admin(M)][ADMIN_QUE(M,"(?)")] ([ADMIN_FLW(M,"FLW")]) and last touched by [key_name_admin(last)][ADMIN_QUE(last,"(?)")] ([ADMIN_FLW(last,"FLW")]) ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>[A.name] (JMP)</a>.")
|
||||
message_admins("grenade primed by an assembly, attached by [key_name_admin(M)] and last touched by [key_name_admin(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>[A.name] (JMP)</a>.")
|
||||
log_game("grenade primed by an assembly, attached by [key_name(M)] and last touched by [key_name(last)] ([nadeassembly.a_left.name] and [nadeassembly.a_right.name]) at [A.name] ([T.x], [T.y], [T.z])")
|
||||
else
|
||||
addtimer(CALLBACK(src, .proc/prime), det_time)
|
||||
|
||||
@@ -87,7 +87,7 @@
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/restraints/legcuffs/beartrap/Crossed(AM as mob|obj)
|
||||
/obj/item/restraints/legcuffs/beartrap/Crossed(AM as mob|obj, oldloc)
|
||||
if(armed && isturf(src.loc))
|
||||
if( (iscarbon(AM) || isanimal(AM)) && !istype(AM, /mob/living/simple_animal/parrot) && !istype(AM, /mob/living/simple_animal/hostile/construct) && !istype(AM, /mob/living/simple_animal/shade) && !istype(AM, /mob/living/simple_animal/hostile/viscerator))
|
||||
var/mob/living/L = AM
|
||||
@@ -193,6 +193,6 @@
|
||||
/obj/item/restraints/legcuffs/bola/energy/throw_impact(atom/hit_atom)
|
||||
if(iscarbon(hit_atom))
|
||||
var/obj/item/restraints/legcuffs/beartrap/B = new /obj/item/restraints/legcuffs/beartrap/energy/cyborg(get_turf(hit_atom))
|
||||
B.Crossed(hit_atom)
|
||||
B.Crossed(hit_atom, null)
|
||||
qdel(src)
|
||||
..()
|
||||
|
||||
@@ -67,7 +67,7 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/shard/Crossed(AM as mob|obj)
|
||||
/obj/item/shard/Crossed(AM as mob|obj, oldloc)
|
||||
if(isliving(AM))
|
||||
var/mob/living/M = AM
|
||||
if(M.incorporeal_move || M.flying || M.throwing)//you are incorporal or flying or being thrown ..no shard stepping!
|
||||
|
||||
@@ -398,7 +398,7 @@
|
||||
new /obj/item/gun/projectile/automatic/shotgun/bulldog(src)
|
||||
new /obj/item/ammo_box/magazine/m12g(src)
|
||||
new /obj/item/ammo_box/magazine/m12g(src)
|
||||
new /obj/item/clothing/glasses/thermal/syndi(src)
|
||||
new /obj/item/clothing/glasses/chameleon/thermal(src)
|
||||
|
||||
/obj/item/storage/backpack/duffel/syndie/med/medicalbundle
|
||||
desc = "A large duffel bag containing a tactical medkit, a Donksoft machine gun and a big jumbo box of riot darts."
|
||||
|
||||
@@ -116,15 +116,10 @@
|
||||
|
||||
/obj/item/storage/lockbox/medal/New()
|
||||
..()
|
||||
new /obj/item/clothing/accessory/medal/gold/heroism(src)
|
||||
new /obj/item/clothing/accessory/medal/silver/security(src)
|
||||
new /obj/item/clothing/accessory/medal/silver/valor(src)
|
||||
new /obj/item/clothing/accessory/medal/nobel_science(src)
|
||||
new /obj/item/clothing/accessory/medal/bronze_heart(src)
|
||||
new /obj/item/clothing/accessory/medal/conduct(src)
|
||||
new /obj/item/clothing/accessory/medal/conduct(src)
|
||||
new /obj/item/clothing/accessory/medal/conduct(src)
|
||||
new /obj/item/clothing/accessory/medal/gold/captain(src)
|
||||
new /obj/item/clothing/accessory/medal/silver/leadership(src)
|
||||
new /obj/item/clothing/accessory/medal/silver/valor(src)
|
||||
new /obj/item/clothing/accessory/medal/heart(src)
|
||||
|
||||
/obj/item/storage/lockbox/t4
|
||||
name = "lockbox (T4)"
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
if("thief") // 40TC
|
||||
new /obj/item/gun/energy/kinetic_accelerator/crossbow(src) // 12TC
|
||||
new /obj/item/chameleon(src) // 8TC
|
||||
new /obj/item/clothing/glasses/thermal/syndi(src) // 6TC
|
||||
new /obj/item/clothing/glasses/chameleon/thermal(src) // 6TC
|
||||
new /obj/item/clothing/gloves/color/black/thief(src) // 6TC
|
||||
new /obj/item/card/id/syndicate(src) // 2TC
|
||||
new /obj/item/clothing/shoes/chameleon/noslip(src) // 2TC
|
||||
@@ -108,7 +108,7 @@
|
||||
new /obj/item/gun/projectile/automatic/sniper_rifle/syndicate/penetrator(src) // 16TC
|
||||
new /obj/item/ammo_box/magazine/sniper_rounds/penetrator(src) // 5TC
|
||||
new /obj/item/ammo_box/magazine/sniper_rounds/soporific(src) // 3TC
|
||||
new /obj/item/clothing/glasses/thermal/syndi/sunglasses(src) // 6TC
|
||||
new /obj/item/clothing/glasses/chameleon/thermal(src) // 6TC
|
||||
new /obj/item/clothing/gloves/combat(src) // 0 TC
|
||||
new /obj/item/clothing/under/suit_jacket/really_black(src) // 0 TC
|
||||
new /obj/item/clothing/suit/storage/lawyer/blackjacket/armored(src) // 0TC
|
||||
|
||||
@@ -28,12 +28,15 @@
|
||||
var/force_wielded = 0
|
||||
var/wieldsound = null
|
||||
var/unwieldsound = null
|
||||
var/sharp_when_wielded = FALSE
|
||||
|
||||
/obj/item/twohanded/proc/unwield(mob/living/carbon/user)
|
||||
if(!wielded || !user)
|
||||
return
|
||||
wielded = FALSE
|
||||
force = force_unwielded
|
||||
if(sharp_when_wielded)
|
||||
sharp = FALSE
|
||||
var/sf = findtext(name," (Wielded)")
|
||||
if(sf)
|
||||
name = copytext(name, 1, sf)
|
||||
@@ -66,6 +69,8 @@
|
||||
return
|
||||
wielded = TRUE
|
||||
force = force_wielded
|
||||
if(sharp_when_wielded)
|
||||
sharp = TRUE
|
||||
name = "[name] (Wielded)"
|
||||
update_icon()
|
||||
if(user)
|
||||
@@ -224,7 +229,7 @@
|
||||
origin_tech = "magnets=4;syndicate=5"
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
|
||||
block_chance = 75
|
||||
sharp = TRUE
|
||||
sharp_when_wielded = TRUE // only sharp when wielded
|
||||
light_power = 2
|
||||
var/brightness_on = 2
|
||||
var/colormap = list(red=LIGHT_COLOR_RED, blue=LIGHT_COLOR_LIGHTBLUE, green=LIGHT_COLOR_GREEN, purple=LIGHT_COLOR_PURPLE, rainbow=LIGHT_COLOR_WHITE)
|
||||
|
||||
@@ -235,14 +235,22 @@
|
||||
var/status = GROWING //can be GROWING, GROWN or BURST; all mutually exclusive
|
||||
layer = MOB_LAYER
|
||||
|
||||
/obj/structure/alien/egg/grown
|
||||
status = GROWN
|
||||
icon_state = "egg"
|
||||
|
||||
/obj/structure/alien/egg/burst
|
||||
status = BURST
|
||||
icon_state = "egg_hatched"
|
||||
|
||||
/obj/structure/alien/egg/New()
|
||||
new /obj/item/clothing/mask/facehugger(src)
|
||||
..()
|
||||
spawn(rand(MIN_GROWTH_TIME, MAX_GROWTH_TIME))
|
||||
Grow()
|
||||
if(status == BURST)
|
||||
obj_integrity = integrity_failure
|
||||
else if(status != GROWN)
|
||||
spawn(rand(MIN_GROWTH_TIME, MAX_GROWTH_TIME))
|
||||
Grow()
|
||||
|
||||
/obj/structure/alien/egg/attack_alien(mob/living/carbon/alien/user)
|
||||
return attack_hand(user)
|
||||
|
||||
@@ -452,7 +452,7 @@
|
||||
icon_closed = transparent ? "bluespacetrans" : "bluespace"
|
||||
icon_state = opened ? icon_opened : icon_closed
|
||||
|
||||
/obj/structure/closet/bluespace/Crossed(atom/movable/AM)
|
||||
/obj/structure/closet/bluespace/Crossed(atom/movable/AM, oldloc)
|
||||
if(AM.density)
|
||||
icon_state = opened ? "bluespaceopentrans" : "bluespacetrans"
|
||||
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
new /obj/item/rpd(src)
|
||||
new /obj/item/reagent_containers/food/drinks/mug/ce(src)
|
||||
new /obj/item/organ/internal/cyberimp/eyes/meson(src)
|
||||
new /obj/item/clothing/accessory/medal/engineering(src)
|
||||
|
||||
|
||||
/obj/structure/closet/secure_closet/engineering_electrical
|
||||
|
||||
@@ -193,6 +193,7 @@
|
||||
new /obj/item/organ/internal/cyberimp/eyes/hud/medical(src)
|
||||
new /obj/item/door_remote/chief_medical_officer(src)
|
||||
new /obj/item/reagent_containers/food/drinks/mug/cmo(src)
|
||||
new /obj/item/clothing/accessory/medal/medical(src)
|
||||
|
||||
|
||||
/obj/structure/closet/secure_closet/animal
|
||||
|
||||
@@ -77,7 +77,7 @@
|
||||
new /obj/item/door_remote/research_director(src)
|
||||
new /obj/item/reagent_containers/food/drinks/mug/rd(src)
|
||||
new /obj/item/organ/internal/cyberimp/eyes/hud/diagnostic(src)
|
||||
|
||||
new /obj/item/clothing/accessory/medal/science(src)
|
||||
|
||||
/obj/structure/closet/secure_closet/research_reagents
|
||||
name = "research chemical storage closet"
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
new /obj/item/clothing/accessory/petcollar(src)
|
||||
new /obj/item/door_remote/civillian(src)
|
||||
new /obj/item/reagent_containers/food/drinks/mug/hop(src)
|
||||
|
||||
new /obj/item/clothing/accessory/medal/service(src)
|
||||
|
||||
/obj/structure/closet/secure_closet/hop2
|
||||
name = "head of personnel's attire"
|
||||
@@ -128,7 +128,7 @@
|
||||
new /obj/item/door_remote/head_of_security(src)
|
||||
new /obj/item/reagent_containers/food/drinks/mug/hos(src)
|
||||
new /obj/item/organ/internal/cyberimp/eyes/hud/security(src)
|
||||
|
||||
new /obj/item/clothing/accessory/medal/security(src)
|
||||
|
||||
/obj/structure/closet/secure_closet/warden
|
||||
name = "warden's locker"
|
||||
@@ -464,4 +464,5 @@
|
||||
new /obj/item/clothing/head/powdered_wig(src)
|
||||
new /obj/item/gavelblock(src)
|
||||
new /obj/item/gavelhammer(src)
|
||||
new /obj/item/clothing/head/justice_wig(src)
|
||||
new /obj/item/clothing/head/justice_wig(src)
|
||||
new /obj/item/clothing/accessory/medal/legal(src)
|
||||
@@ -226,6 +226,7 @@
|
||||
door = new airlock_type(loc)
|
||||
door.setDir(dir)
|
||||
door.electronics = electronics
|
||||
door.unres_sides = electronics.unres_sides
|
||||
door.heat_proof = heat_proof_finished
|
||||
if(electronics.one_access)
|
||||
door.req_access = null
|
||||
|
||||
@@ -9,19 +9,26 @@
|
||||
/obj/structure/falsewall
|
||||
name = "wall"
|
||||
desc = "A huge chunk of metal used to seperate rooms."
|
||||
anchored = 1
|
||||
anchored = TRUE
|
||||
icon = 'icons/turf/walls/wall.dmi'
|
||||
icon_state = "wall"
|
||||
var/mineral = "metal"
|
||||
var/walltype = "metal"
|
||||
var/opening = 0
|
||||
density = 1
|
||||
opacity = 1
|
||||
|
||||
var/mineral = /obj/item/stack/sheet/metal
|
||||
var/mineral_amount = 2
|
||||
var/walltype = /turf/simulated/wall
|
||||
var/girder_type = /obj/structure/girder/displaced
|
||||
var/opening = FALSE
|
||||
|
||||
density = TRUE
|
||||
opacity = TRUE
|
||||
|
||||
can_deconstruct = TRUE
|
||||
|
||||
canSmoothWith = list(
|
||||
/turf/simulated/wall,
|
||||
/turf/simulated/wall/r_wall,
|
||||
/obj/structure/falsewall,
|
||||
/obj/structure/falsewall/brass,
|
||||
/obj/structure/falsewall/reinforced, // WHY DO WE SMOOTH WITH FALSE R-WALLS WHEN WE DON'T SMOOTH WITH REAL R-WALLS. //because we do smooth with real r-walls now
|
||||
/turf/simulated/wall/rust,
|
||||
/turf/simulated/wall/r_wall/rust)
|
||||
@@ -31,6 +38,10 @@
|
||||
..()
|
||||
air_update_turf(1)
|
||||
|
||||
/obj/structure/falsewall/ratvar_act()
|
||||
new /obj/structure/falsewall/brass(loc)
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/falsewall/Destroy()
|
||||
density = 0
|
||||
air_update_turf(1)
|
||||
@@ -124,18 +135,11 @@
|
||||
|
||||
/obj/structure/falsewall/proc/dismantle(mob/user)
|
||||
user.visible_message("<span class='notice'>[user] dismantles the false wall.</span>", "<span class='warning'>You dismantle the false wall.</span>")
|
||||
new /obj/structure/girder/displaced(loc)
|
||||
if(mineral == "metal")
|
||||
if(istype(src, /obj/structure/falsewall/reinforced))
|
||||
new /obj/item/stack/sheet/plasteel(loc, 2)
|
||||
else
|
||||
new /obj/item/stack/sheet/metal(loc, 2)
|
||||
else if(mineral == "wood")
|
||||
new/obj/item/stack/sheet/wood(loc, 2)
|
||||
else
|
||||
var/P = text2path("/obj/item/stack/sheet/mineral/[mineral]")
|
||||
new P(loc)
|
||||
new P(loc)
|
||||
if(can_deconstruct)
|
||||
new girder_type(loc)
|
||||
if(mineral_amount)
|
||||
for(var/i in 1 to mineral_amount)
|
||||
new mineral(loc)
|
||||
playsound(src, 'sound/items/welder.ogg', 100, 1)
|
||||
qdel(src)
|
||||
|
||||
@@ -148,7 +152,8 @@
|
||||
desc = "A huge chunk of reinforced metal used to seperate rooms."
|
||||
icon = 'icons/turf/walls/reinforced_wall.dmi'
|
||||
icon_state = "r_wall"
|
||||
walltype = "rwall"
|
||||
walltype = /turf/simulated/wall/r_wall
|
||||
mineral = /obj/item/stack/sheet/plasteel
|
||||
|
||||
/obj/structure/falsewall/reinforced/ChangeToWall(delete = 1)
|
||||
var/turf/T = get_turf(src)
|
||||
@@ -166,8 +171,8 @@
|
||||
desc = "A wall with uranium plating. This is probably a bad idea."
|
||||
icon = 'icons/turf/walls/uranium_wall.dmi'
|
||||
icon_state = "uranium"
|
||||
mineral = "uranium"
|
||||
walltype = "uranium"
|
||||
mineral = /obj/item/stack/sheet/mineral/uranium
|
||||
walltype = /turf/simulated/wall/mineral/uranium
|
||||
var/active = null
|
||||
var/last_event = 0
|
||||
canSmoothWith = list(/obj/structure/falsewall/uranium, /turf/simulated/wall/mineral/uranium)
|
||||
@@ -201,8 +206,8 @@
|
||||
desc = "A wall with gold plating. Swag!"
|
||||
icon = 'icons/turf/walls/gold_wall.dmi'
|
||||
icon_state = "gold"
|
||||
mineral = "gold"
|
||||
walltype = "gold"
|
||||
mineral = /obj/item/stack/sheet/mineral/gold
|
||||
walltype = /turf/simulated/wall/mineral/gold
|
||||
canSmoothWith = list(/obj/structure/falsewall/gold, /turf/simulated/wall/mineral/gold)
|
||||
|
||||
/obj/structure/falsewall/silver
|
||||
@@ -210,8 +215,8 @@
|
||||
desc = "A wall with silver plating. Shiny."
|
||||
icon = 'icons/turf/walls/silver_wall.dmi'
|
||||
icon_state = "silver"
|
||||
mineral = "silver"
|
||||
walltype = "silver"
|
||||
mineral = /obj/item/stack/sheet/mineral/silver
|
||||
walltype = /turf/simulated/wall/mineral/silver
|
||||
canSmoothWith = list(/obj/structure/falsewall/silver, /turf/simulated/wall/mineral/silver)
|
||||
|
||||
/obj/structure/falsewall/diamond
|
||||
@@ -219,8 +224,8 @@
|
||||
desc = "A wall with diamond plating. You monster."
|
||||
icon = 'icons/turf/walls/diamond_wall.dmi'
|
||||
icon_state = "diamond"
|
||||
mineral = "diamond"
|
||||
walltype = "diamond"
|
||||
mineral = /obj/item/stack/sheet/mineral/diamond
|
||||
walltype = /turf/simulated/wall/mineral/diamond
|
||||
canSmoothWith = list(/obj/structure/falsewall/diamond, /turf/simulated/wall/mineral/diamond)
|
||||
|
||||
|
||||
@@ -229,18 +234,18 @@
|
||||
desc = "A wall with plasma plating. This is definately a bad idea."
|
||||
icon = 'icons/turf/walls/plasma_wall.dmi'
|
||||
icon_state = "plasma"
|
||||
mineral = "plasma"
|
||||
walltype = "plasma"
|
||||
mineral = /obj/item/stack/sheet/mineral/plasma
|
||||
walltype = /turf/simulated/wall/mineral/plasma
|
||||
canSmoothWith = list(/obj/structure/falsewall/plasma, /turf/simulated/wall/mineral/plasma, /turf/simulated/wall/mineral/alien)
|
||||
|
||||
/obj/structure/falsewall/plasma/attackby(obj/item/W, mob/user, params)
|
||||
if(is_hot(W) > 300)
|
||||
message_admins("Plasma falsewall ignited by [key_name_admin(user)] in ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
|
||||
log_game("Plasma falsewall ignited by [key_name(user)] in ([x],[y],[z])")
|
||||
message_admins("Plasma falsewall ignited by [key_name_admin(user)] in [ADMIN_VERBOSEJMP(T)]")
|
||||
log_game("Plasma falsewall ignited by [key_name(user)] in [AREACOORD(T)]")
|
||||
investigate_log("was <font color='red'><b>ignited</b></font> by [key_name(user)]","atmos")
|
||||
burnbabyburn()
|
||||
return
|
||||
..()
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/structure/falsewall/plasma/proc/burnbabyburn(user)
|
||||
playsound(src, 'sound/items/welder.ogg', 100, 1)
|
||||
@@ -258,8 +263,8 @@
|
||||
desc = "A strange-looking alien wall."
|
||||
icon = 'icons/turf/walls/plasma_wall.dmi'
|
||||
icon_state = "plasma"
|
||||
mineral = "alien"
|
||||
walltype = "alien"
|
||||
mineral = /obj/item/stack/sheet/mineral/abductor
|
||||
walltype = /turf/simulated/wall/mineral/abductor
|
||||
canSmoothWith = list(/obj/structure/falsewall/alien, /turf/simulated/wall/mineral/alien)
|
||||
|
||||
|
||||
@@ -268,16 +273,16 @@
|
||||
desc = "A wall with bananium plating. Honk!"
|
||||
icon = 'icons/turf/walls/bananium_wall.dmi'
|
||||
icon_state = "bananium"
|
||||
mineral = "clown"
|
||||
walltype = "clown"
|
||||
mineral = /obj/item/stack/sheet/mineral/bananium
|
||||
walltype = /turf/simulated/wall/mineral/bananium
|
||||
canSmoothWith = list(/obj/structure/falsewall/bananium, /turf/simulated/wall/mineral/bananium)
|
||||
|
||||
/obj/structure/falsewall/sandstone
|
||||
name = "sandstone wall"
|
||||
desc = "A wall with sandstone plating."
|
||||
icon_state = "sandstone"
|
||||
mineral = "sandstone"
|
||||
walltype = "sandstone"
|
||||
mineral = /obj/item/stack/sheet/mineral/sandstone
|
||||
walltype = /turf/simulated/wall/mineral/sandstone
|
||||
canSmoothWith = list(/obj/structure/falsewall/sandstone, /turf/simulated/wall/mineral/sandstone)
|
||||
|
||||
/obj/structure/falsewall/wood
|
||||
@@ -285,8 +290,8 @@
|
||||
desc = "A wall with wooden plating. Stiff."
|
||||
icon = 'icons/turf/walls/wood_wall.dmi'
|
||||
icon_state = "wood"
|
||||
mineral = "wood"
|
||||
walltype = "wood"
|
||||
mineral = /obj/item/stack/sheet/wood
|
||||
walltype = /turf/simulated/wall/mineral/wood
|
||||
canSmoothWith = list(/obj/structure/falsewall/wood, /turf/simulated/wall/mineral/wood)
|
||||
|
||||
/obj/structure/falsewall/iron
|
||||
@@ -294,8 +299,9 @@
|
||||
desc = "A wall with rough metal plating."
|
||||
icon = 'icons/turf/walls/iron_wall.dmi'
|
||||
icon_state = "iron"
|
||||
mineral = "metal"
|
||||
walltype = "iron"
|
||||
mineral = /obj/item/stack/rods
|
||||
mineral_amount = 5
|
||||
walltype = /turf/simulated/wall/mineral/iron
|
||||
canSmoothWith = list(/obj/structure/falsewall/iron, /turf/simulated/wall/mineral/iron)
|
||||
|
||||
/obj/structure/falsewall/abductor
|
||||
@@ -303,8 +309,8 @@
|
||||
desc = "A wall with alien alloy plating."
|
||||
icon = 'icons/turf/walls/abductor_wall.dmi'
|
||||
icon_state = "abductor"
|
||||
mineral = "abductor"
|
||||
walltype = "abductor"
|
||||
mineral = /obj/item/stack/sheet/mineral/abductor
|
||||
walltype = /turf/simulated/wall/mineral/abductor
|
||||
canSmoothWith = list(/obj/structure/falsewall/abductor, /turf/simulated/wall/mineral/abductor)
|
||||
|
||||
/obj/structure/falsewall/titanium
|
||||
@@ -324,3 +330,23 @@
|
||||
walltype = /turf/simulated/wall/mineral/plastitanium
|
||||
smooth = SMOOTH_MORE
|
||||
canSmoothWith = list(/turf/simulated/wall/mineral/plastitanium, /obj/machinery/door/airlock/shuttle, /obj/machinery/door/airlock, /obj/structure/window/full/shuttle, /obj/structure/shuttle/engine/heater)
|
||||
|
||||
/obj/structure/falsewall/brass
|
||||
name = "clockwork wall"
|
||||
desc = "A huge chunk of warm metal. The clanging of machinery emanates from within."
|
||||
icon = 'icons/turf/walls/clockwork_wall.dmi'
|
||||
icon_state = "clockwork_wall"
|
||||
resistance_flags = FIRE_PROOF
|
||||
unacidable = TRUE
|
||||
mineral_amount = 1
|
||||
canSmoothWith = list(/obj/effect/clockwork/overlay/wall, /obj/structure/falsewall/brass)
|
||||
girder_type = /obj/structure/clockwork/wall_gear/displaced
|
||||
walltype = /turf/simulated/wall/clockwork
|
||||
mineral = /obj/item/stack/tile/brass
|
||||
|
||||
/obj/structure/falsewall/brass/New(loc)
|
||||
..()
|
||||
var/turf/T = get_turf(src)
|
||||
new /obj/effect/temp_visual/ratvar/wall/false(T)
|
||||
new /obj/effect/temp_visual/ratvar/beam/falsewall(T)
|
||||
|
||||
|
||||
@@ -63,3 +63,19 @@
|
||||
/obj/structure/fluff/drake_statue/falling //A variety of statue in disrepair; parts are broken off and a gemstone is missing
|
||||
desc = "A towering basalt sculpture of a drake. Cracks run down its surface and parts of it have fallen off."
|
||||
icon_state = "drake_statue_falling"
|
||||
|
||||
/obj/structure/fluff/divine
|
||||
name = "Miracle"
|
||||
icon = 'icons/obj/hand_of_god_structures.dmi'
|
||||
anchored = TRUE
|
||||
density = TRUE
|
||||
|
||||
/obj/structure/fluff/divine/nexus
|
||||
name = "nexus"
|
||||
desc = "It anchors a deity to this world. It radiates an unusual aura. It looks well protected from explosive shock."
|
||||
icon_state = "nexus"
|
||||
|
||||
/obj/structure/fluff/divine/conduit
|
||||
name = "conduit"
|
||||
desc = "It allows a deity to extend their reach. Their powers are just as potent near a conduit as a nexus."
|
||||
icon_state = "conduit"
|
||||
@@ -32,6 +32,8 @@
|
||||
if(resistance_flags & INDESTRUCTIBLE)
|
||||
return
|
||||
if(istype(C, /obj/item/wirecutters))
|
||||
var/obj/item/wirecutters/W = C
|
||||
playsound(loc, W.usesound, 50, 1)
|
||||
to_chat(user, "<span class='notice'>Slicing [name] joints...</span>")
|
||||
deconstruct()
|
||||
else
|
||||
@@ -58,6 +60,26 @@
|
||||
if(current_size >= STAGE_FOUR)
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/lattice/clockwork
|
||||
name = "cog lattice"
|
||||
desc = "A lightweight support lattice. These hold the Justicar's station together."
|
||||
icon = 'icons/obj/smooth_structures/lattice_clockwork.dmi'
|
||||
|
||||
/obj/structure/lattice/clockwork/Initialize(mapload)
|
||||
. = ..()
|
||||
ratvar_act()
|
||||
|
||||
/obj/structure/lattice/clockwork/ratvar_act()
|
||||
if((x + y) % 2 != 0)
|
||||
icon = 'icons/obj/smooth_structures/lattice_clockwork_large.dmi'
|
||||
pixel_x = -9
|
||||
pixel_y = -9
|
||||
else
|
||||
icon = 'icons/obj/smooth_structures/lattice_clockwork.dmi'
|
||||
pixel_x = 0
|
||||
pixel_y = 0
|
||||
return TRUE
|
||||
|
||||
/obj/structure/lattice/catwalk
|
||||
name = "catwalk"
|
||||
desc = "A catwalk for easier EVA maneuvering and cable placement."
|
||||
@@ -81,3 +103,30 @@
|
||||
for(var/obj/structure/cable/C in T)
|
||||
C.deconstruct()
|
||||
..()
|
||||
|
||||
/obj/structure/lattice/catwalk/clockwork
|
||||
name = "clockwork catwalk"
|
||||
icon = 'icons/obj/smooth_structures/catwalk_clockwork.dmi'
|
||||
canSmoothWith = list(/obj/structure/lattice,
|
||||
/turf/simulated/floor,
|
||||
/turf/simulated/wall,
|
||||
/obj/structure/falsewall)
|
||||
smooth = SMOOTH_MORE
|
||||
|
||||
/obj/structure/lattice/catwalk/clockwork/Initialize(mapload)
|
||||
. = ..()
|
||||
ratvar_act()
|
||||
if(!mapload)
|
||||
new /obj/effect/temp_visual/ratvar/floor/catwalk(loc)
|
||||
new /obj/effect/temp_visual/ratvar/beam/catwalk(loc)
|
||||
|
||||
/obj/structure/lattice/catwalk/clockwork/ratvar_act()
|
||||
if((x + y) % 2 != 0)
|
||||
icon = 'icons/obj/smooth_structures/catwalk_clockwork_large.dmi'
|
||||
pixel_x = -9
|
||||
pixel_y = -9
|
||||
else
|
||||
icon = 'icons/obj/smooth_structures/catwalk_clockwork.dmi'
|
||||
pixel_x = 0
|
||||
pixel_y = 0
|
||||
return TRUE
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
icon_state = "mirror"
|
||||
density = 0
|
||||
anchored = 1
|
||||
var/shattered = 0
|
||||
var/list/ui_users = list()
|
||||
|
||||
/obj/structure/mirror/New(turf/T, newdir = SOUTH, building = FALSE)
|
||||
@@ -23,7 +22,7 @@
|
||||
pixel_x = 32
|
||||
|
||||
/obj/structure/mirror/attack_hand(mob/user)
|
||||
if(shattered)
|
||||
if(broken)
|
||||
return
|
||||
|
||||
if(ishuman(user))
|
||||
@@ -36,9 +35,9 @@
|
||||
AC.ui_interact(user)
|
||||
|
||||
/obj/structure/mirror/proc/shatter()
|
||||
if(shattered)
|
||||
if(broken)
|
||||
return
|
||||
shattered = 1
|
||||
broken = TRUE
|
||||
icon_state = "mirror_broke"
|
||||
playsound(src, "shatter", 70, 1)
|
||||
desc = "Oh no, seven years of bad luck!"
|
||||
@@ -46,7 +45,7 @@
|
||||
|
||||
/obj/structure/mirror/bullet_act(obj/item/projectile/Proj)
|
||||
if(prob(Proj.damage * 2))
|
||||
if(!shattered)
|
||||
if(!broken)
|
||||
shatter()
|
||||
else
|
||||
playsound(src, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
|
||||
@@ -58,7 +57,7 @@
|
||||
if(isscrewdriver(I))
|
||||
user.visible_message("<span class='notice'>[user] begins to unfasten [src].</span>", "<span class='notice'>You begin to unfasten [src].</span>")
|
||||
if(do_after(user, 30 * I.toolspeed, target = src))
|
||||
if(shattered)
|
||||
if(broken)
|
||||
user.visible_message("<span class='notice'>[user] drops the broken shards to the floor.</span>", "<span class='notice'>You drop the broken shards on the floor.</span>")
|
||||
new /obj/item/shard(get_turf(user))
|
||||
else
|
||||
@@ -68,7 +67,7 @@
|
||||
return
|
||||
|
||||
user.do_attack_animation(src)
|
||||
if(shattered)
|
||||
if(broken)
|
||||
playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
|
||||
return
|
||||
|
||||
@@ -85,7 +84,7 @@
|
||||
if(islarva(user))
|
||||
return
|
||||
user.do_attack_animation(src)
|
||||
if(shattered)
|
||||
if(broken)
|
||||
playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
|
||||
return
|
||||
user.visible_message("<span class='danger'>[user] smashes [src]!</span>")
|
||||
@@ -100,7 +99,7 @@
|
||||
if(M.melee_damage_upper <= 0)
|
||||
return
|
||||
M.do_attack_animation(src)
|
||||
if(shattered)
|
||||
if(broken)
|
||||
playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
|
||||
return
|
||||
user.visible_message("<span class='danger'>[user] smashes [src]!</span>")
|
||||
@@ -113,7 +112,7 @@
|
||||
if(!S.is_adult)
|
||||
return
|
||||
user.do_attack_animation(src)
|
||||
if(shattered)
|
||||
if(broken)
|
||||
playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
|
||||
return
|
||||
user.visible_message("<span class='danger'>[user] smashes [src]!</span>")
|
||||
@@ -136,7 +135,7 @@
|
||||
icon_state = "magic_mirror"
|
||||
|
||||
/obj/structure/mirror/magic/attack_hand(mob/user)
|
||||
if(!ishuman(user))
|
||||
if(!ishuman(user) || broken)
|
||||
return
|
||||
|
||||
var/mob/living/carbon/human/H = user
|
||||
@@ -154,6 +153,9 @@
|
||||
H.dna.real_name = newname
|
||||
if(H.mind)
|
||||
H.mind.name = newname
|
||||
|
||||
if(newname)
|
||||
curse(user)
|
||||
|
||||
if("Body")
|
||||
var/list/race_list = list("Human", "Tajaran", "Skrell", "Unathi", "Diona", "Vulpkanin")
|
||||
@@ -172,6 +174,7 @@
|
||||
AC.whitelist = race_list
|
||||
ui_users[user] = AC
|
||||
AC.ui_interact(user)
|
||||
|
||||
if("Voice")
|
||||
var/voice_choice = input(user, "Perhaps...", "Voice effects") as null|anything in list("Comic Sans", "Wingdings", "Swedish", "Chav")
|
||||
var/voice_mutation
|
||||
@@ -192,8 +195,17 @@
|
||||
H.dna.SetSEState(voice_mutation, TRUE)
|
||||
genemutcheck(H, voice_mutation, null, MUTCHK_FORCED)
|
||||
|
||||
if(voice_choice)
|
||||
curse(user)
|
||||
|
||||
/obj/structure/mirror/magic/on_ui_close(mob/user)
|
||||
curse(user)
|
||||
|
||||
/obj/structure/mirror/magic/attackby(obj/item/I, mob/living/user, params)
|
||||
return
|
||||
|
||||
/obj/structure/mirror/magic/shatter()
|
||||
return //can't be broken. it's magic, i ain't gotta explain shit
|
||||
return //can't be broken. it's magic, i ain't gotta explain shit
|
||||
|
||||
/obj/structure/mirror/magic/proc/curse(mob/living/user)
|
||||
return
|
||||
@@ -28,6 +28,11 @@
|
||||
W.setDir(dir)
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/chair/ratvar_act()
|
||||
var/obj/structure/chair/brass/B = new(get_turf(src))
|
||||
B.setDir(dir)
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/chair/Move(atom/newloc, direct)
|
||||
..()
|
||||
handle_rotation()
|
||||
@@ -146,35 +151,38 @@
|
||||
name = "comfy chair"
|
||||
desc = "It looks comfy."
|
||||
icon_state = "comfychair"
|
||||
color = rgb(255,255,255)
|
||||
color = rgb(255, 255, 255)
|
||||
burn_state = FLAMMABLE
|
||||
burntime = 30
|
||||
buildstackamount = 2
|
||||
item_chair = null
|
||||
var/image/armrest = null
|
||||
|
||||
/obj/structure/chair/comfy/New()
|
||||
armrest = image("icons/obj/chairs.dmi", "comfychair_armrest")
|
||||
/obj/structure/chair/comfy/Initialize(mapload)
|
||||
armrest = GetArmrest()
|
||||
armrest.layer = ABOVE_MOB_LAYER
|
||||
return ..()
|
||||
|
||||
/obj/structure/chair/comfy/proc/GetArmrest()
|
||||
return mutable_appearance('icons/obj/chairs.dmi', "comfychair_armrest")
|
||||
|
||||
/obj/structure/chair/comfy/Destroy()
|
||||
QDEL_NULL(armrest)
|
||||
return ..()
|
||||
|
||||
/obj/structure/chair/comfy/post_buckle_mob(mob/living/M)
|
||||
..()
|
||||
if(buckled_mob)
|
||||
overlays += armrest
|
||||
else
|
||||
overlays -= armrest
|
||||
. = ..()
|
||||
update_armrest()
|
||||
|
||||
/obj/structure/chair/comfy/post_unbuckle_mob(mob/living/M)
|
||||
..()
|
||||
if(buckled_mob)
|
||||
overlays -= armrest
|
||||
. = ..()
|
||||
update_armrest()
|
||||
|
||||
/obj/structure/chair/comfy/proc/update_armrest()
|
||||
if(has_buckled_mobs())
|
||||
add_overlay(armrest)
|
||||
else
|
||||
overlays += armrest
|
||||
cut_overlay(armrest)
|
||||
|
||||
/obj/structure/chair/comfy/brown
|
||||
color = rgb(141,70,0)
|
||||
@@ -209,6 +217,14 @@
|
||||
item_chair = null
|
||||
buildstackamount = 5
|
||||
|
||||
/obj/structure/chair/comfy/shuttle
|
||||
name = "shuttle seat"
|
||||
desc = "A comfortable, secure seat. It has a more sturdy looking buckling system, for smoother flights."
|
||||
icon_state = "shuttle_chair"
|
||||
|
||||
/obj/structure/chair/comfy/shuttle/GetArmrest()
|
||||
return mutable_appearance('icons/obj/chairs.dmi', "shuttle_chair_armrest")
|
||||
|
||||
/obj/structure/chair/office/Bump(atom/A)
|
||||
..()
|
||||
if(!buckled_mob)
|
||||
@@ -416,3 +432,41 @@
|
||||
desc = "You sit in this. Either by will or force. Looks REALLY uncomfortable."
|
||||
icon_state = "chairold"
|
||||
item_chair = null
|
||||
|
||||
// Brass chair
|
||||
/obj/structure/chair/brass
|
||||
name = "brass chair"
|
||||
desc = "A spinny chair made of brass. It looks uncomfortable."
|
||||
icon_state = "brass_chair"
|
||||
max_integrity = 150
|
||||
buildstacktype = /obj/item/stack/tile/brass
|
||||
buildstackamount = 1
|
||||
item_chair = null
|
||||
var/turns = 0
|
||||
|
||||
/obj/structure/chair/brass/Destroy()
|
||||
STOP_PROCESSING(SSfastprocess, src)
|
||||
. = ..()
|
||||
|
||||
/obj/structure/chair/brass/process()
|
||||
setDir(turn(dir,-90))
|
||||
playsound(src, 'sound/effects/servostep.ogg', 50, FALSE)
|
||||
turns++
|
||||
if(turns >= 8)
|
||||
STOP_PROCESSING(SSfastprocess, src)
|
||||
|
||||
/obj/structure/chair/brass/ratvar_act()
|
||||
return
|
||||
|
||||
/obj/structure/chair/brass/AltClick(mob/living/user)
|
||||
turns = 0
|
||||
if(!istype(user) || user.incapacitated() || !in_range(src, user))
|
||||
return
|
||||
if(!isprocessing)
|
||||
user.visible_message("<span class='notice'>[user] spins [src] around, and Ratvarian technology keeps it spinning FOREVER.</span>", \
|
||||
"<span class='notice'>Automated spinny chairs. The pinnacle of Ratvarian technology.</span>")
|
||||
START_PROCESSING(SSfastprocess, src)
|
||||
else
|
||||
user.visible_message("<span class='notice'>[user] stops [src]'s uncontrollable spinning.</span>", \
|
||||
"<span class='notice'>You grab [src] and stop its wild spinning.</span>")
|
||||
STOP_PROCESSING(SSfastprocess, src)
|
||||
@@ -377,7 +377,7 @@
|
||||
qdel(i)
|
||||
. = ..()
|
||||
|
||||
/obj/structure/table/glass/Crossed(atom/movable/AM)
|
||||
/obj/structure/table/glass/Crossed(atom/movable/AM, oldloc)
|
||||
. = ..()
|
||||
if(!can_deconstruct)
|
||||
return
|
||||
|
||||
@@ -363,7 +363,7 @@
|
||||
qdel(mymist)
|
||||
ismist = 0
|
||||
|
||||
/obj/machinery/shower/Crossed(atom/movable/O)
|
||||
/obj/machinery/shower/Crossed(atom/movable/O, oldloc)
|
||||
..()
|
||||
wash(O)
|
||||
if(ismob(O))
|
||||
|
||||
Reference in New Issue
Block a user