diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm
index fc074184d8..acb1da7b02 100644
--- a/code/ATMOSPHERICS/atmospherics.dm
+++ b/code/ATMOSPHERICS/atmospherics.dm
@@ -17,7 +17,8 @@ Pipelines + Other Objects -> Pipe network
var/nodealert = 0
var/power_rating //the maximum amount of power the machine can use to do work, affects how powerful the machine is, in Watts
- layer = 2.4 //under wires with their 2.44
+ layer = ATMOS_LAYER
+ plane = PLATING_PLANE
var/pipe_flags = PIPING_DEFAULT_LAYER_ONLY // Allow other layers by exception basis.
var/connect_types = CONNECT_TYPE_REGULAR
@@ -201,12 +202,12 @@ Pipelines + Other Objects -> Pipe network
if(PIPING_LAYER_SCRUBBER)
icon_state = "[icon_state]-scrubbers"
connect_types = CONNECT_TYPE_SCRUBBER
- layer = 2.38
+ layer = PIPES_SCRUBBER_LAYER
icon_connect_type = "-scrubbers"
if(PIPING_LAYER_SUPPLY)
icon_state = "[icon_state]-supply"
connect_types = CONNECT_TYPE_SUPPLY
- layer = 2.39
+ layer = PIPES_SUPPLY_LAYER
icon_connect_type = "-supply"
if(pipe_flags & PIPING_ALL_LAYER)
connect_types = CONNECT_TYPE_REGULAR|CONNECT_TYPE_SUPPLY|CONNECT_TYPE_SCRUBBER
diff --git a/code/ATMOSPHERICS/components/unary/outlet_injector.dm b/code/ATMOSPHERICS/components/unary/outlet_injector.dm
index 9d980647a8..4a9403a64b 100644
--- a/code/ATMOSPHERICS/components/unary/outlet_injector.dm
+++ b/code/ATMOSPHERICS/components/unary/outlet_injector.dm
@@ -6,7 +6,6 @@
icon = 'icons/atmos/injector.dmi'
icon_state = "map_injector"
pipe_state = "injector"
- layer = 3
name = "air injector"
desc = "Passively injects air into its surroundings. Has a valve attached to it that can control flow rate."
diff --git a/code/ATMOSPHERICS/mainspipe.dm b/code/ATMOSPHERICS/mainspipe.dm
index a38587baf5..baba515fae 100644
--- a/code/ATMOSPHERICS/mainspipe.dm
+++ b/code/ATMOSPHERICS/mainspipe.dm
@@ -34,7 +34,8 @@ obj/machinery/atmospherics/pipe/mains_component
obj/machinery/atmospherics/mains_pipe
icon = 'icons/obj/atmospherics/mainspipe.dmi'
- layer = 2.4 //under wires with their 2.5
+ layer = PIPES_LAYER
+ plane = PLATING_PLANE
var/volume = 0
diff --git a/code/ATMOSPHERICS/pipes/cap.dm b/code/ATMOSPHERICS/pipes/cap.dm
index 4bcf200140..a03ce16af5 100644
--- a/code/ATMOSPHERICS/pipes/cap.dm
+++ b/code/ATMOSPHERICS/pipes/cap.dm
@@ -7,7 +7,6 @@
icon = 'icons/atmos/pipes.dmi'
icon_state = ""
level = 2
- layer = 2.4 //under wires with their 2.44
volume = 35
@@ -80,7 +79,7 @@
icon_state = "cap-scrubbers"
connect_types = CONNECT_TYPE_SCRUBBER
piping_layer = PIPING_LAYER_SCRUBBER
- layer = 2.38
+ layer = PIPES_SCRUBBER_LAYER
icon_connect_type = "-scrubbers"
color = PIPE_COLOR_RED
@@ -90,7 +89,7 @@
icon_state = "cap-supply"
connect_types = CONNECT_TYPE_SUPPLY
piping_layer = PIPING_LAYER_SUPPLY
- layer = 2.39
+ layer = PIPES_SUPPLY_LAYER
icon_connect_type = "-supply"
color = PIPE_COLOR_BLUE
@@ -105,7 +104,7 @@
icon_state = "cap-f-scrubbers"
connect_types = CONNECT_TYPE_SCRUBBER
piping_layer = PIPING_LAYER_SCRUBBER
- layer = 2.38
+ layer = PIPES_SCRUBBER_LAYER
icon_connect_type = "-scrubbers"
color = PIPE_COLOR_RED
@@ -115,6 +114,6 @@
icon_state = "cap-f-supply"
connect_types = CONNECT_TYPE_SUPPLY
piping_layer = PIPING_LAYER_SUPPLY
- layer = 2.39
+ layer = PIPES_SUPPLY_LAYER
icon_connect_type = "-supply"
color = PIPE_COLOR_BLUE
diff --git a/code/ATMOSPHERICS/pipes/he_pipes.dm b/code/ATMOSPHERICS/pipes/he_pipes.dm
index fe6580b1ce..2d77e3a4ca 100644
--- a/code/ATMOSPHERICS/pipes/he_pipes.dm
+++ b/code/ATMOSPHERICS/pipes/he_pipes.dm
@@ -12,7 +12,7 @@
construction_type = /obj/item/pipe/binary/bendable
pipe_state = "he"
- layer = 2.41
+ layer = PIPES_HE_LAYER
var/initialize_directions_he
var/surface = 2 //surface area in m^2
var/icon_temperature = T20C //stop small changes in temperature causing an icon refresh
diff --git a/code/ATMOSPHERICS/pipes/manifold.dm b/code/ATMOSPHERICS/pipes/manifold.dm
index bca6dd3379..524d420d39 100644
--- a/code/ATMOSPHERICS/pipes/manifold.dm
+++ b/code/ATMOSPHERICS/pipes/manifold.dm
@@ -18,7 +18,6 @@
var/obj/machinery/atmospherics/node3
level = 1
- layer = 2.4 //under wires with their 2.44
/obj/machinery/atmospherics/pipe/manifold/New()
..()
@@ -166,7 +165,7 @@
icon_state = "map-scrubbers"
connect_types = CONNECT_TYPE_SCRUBBER
piping_layer = PIPING_LAYER_SCRUBBER
- layer = 2.38
+ layer = PIPES_SCRUBBER_LAYER
icon_connect_type = "-scrubbers"
color = PIPE_COLOR_RED
@@ -176,7 +175,7 @@
icon_state = "map-supply"
connect_types = CONNECT_TYPE_SUPPLY
piping_layer = PIPING_LAYER_SUPPLY
- layer = 2.39
+ layer = PIPES_SUPPLY_LAYER
icon_connect_type = "-supply"
color = PIPE_COLOR_BLUE
@@ -212,7 +211,7 @@
icon_state = "map-scrubbers"
connect_types = CONNECT_TYPE_SCRUBBER
piping_layer = PIPING_LAYER_SCRUBBER
- layer = 2.38
+ layer = PIPES_SCRUBBER_LAYER
icon_connect_type = "-scrubbers"
color = PIPE_COLOR_RED
@@ -222,7 +221,7 @@
icon_state = "map-supply"
connect_types = CONNECT_TYPE_SUPPLY
piping_layer = PIPING_LAYER_SUPPLY
- layer = 2.39
+ layer = PIPES_SUPPLY_LAYER
icon_connect_type = "-supply"
color = PIPE_COLOR_BLUE
diff --git a/code/ATMOSPHERICS/pipes/manifold4w.dm b/code/ATMOSPHERICS/pipes/manifold4w.dm
index 88adc47d62..0cc022423b 100644
--- a/code/ATMOSPHERICS/pipes/manifold4w.dm
+++ b/code/ATMOSPHERICS/pipes/manifold4w.dm
@@ -19,7 +19,6 @@
var/obj/machinery/atmospherics/node4
level = 1
- layer = 2.4 //under wires with their 2.44
/obj/machinery/atmospherics/pipe/manifold4w/New()
..()
@@ -168,7 +167,7 @@
icon_state = "map_4way-scrubbers"
connect_types = CONNECT_TYPE_SCRUBBER
piping_layer = PIPING_LAYER_SCRUBBER
- layer = 2.38
+ layer = PIPES_SCRUBBER_LAYER
icon_connect_type = "-scrubbers"
color = PIPE_COLOR_RED
@@ -178,7 +177,7 @@
icon_state = "map_4way-supply"
connect_types = CONNECT_TYPE_SUPPLY
piping_layer = PIPING_LAYER_SUPPLY
- layer = 2.39
+ layer = PIPES_SUPPLY_LAYER
icon_connect_type = "-supply"
color = PIPE_COLOR_BLUE
@@ -214,7 +213,7 @@
icon_state = "map_4way-scrubbers"
connect_types = CONNECT_TYPE_SCRUBBER
piping_layer = PIPING_LAYER_SCRUBBER
- layer = 2.38
+ layer = PIPES_SCRUBBER_LAYER
icon_connect_type = "-scrubbers"
color = PIPE_COLOR_RED
@@ -224,7 +223,7 @@
icon_state = "map_4way-supply"
connect_types = CONNECT_TYPE_SUPPLY
piping_layer = PIPING_LAYER_SUPPLY
- layer = 2.39
+ layer = PIPES_SUPPLY_LAYER
icon_connect_type = "-supply"
color = PIPE_COLOR_BLUE
diff --git a/code/ATMOSPHERICS/pipes/pipe_base.dm b/code/ATMOSPHERICS/pipes/pipe_base.dm
index 4e852ed0c8..19b05e8b71 100644
--- a/code/ATMOSPHERICS/pipes/pipe_base.dm
+++ b/code/ATMOSPHERICS/pipes/pipe_base.dm
@@ -7,7 +7,7 @@
var/datum/pipeline/parent
var/volume = 0
- layer = 2.4 //under wires with their 2.44
+ layer = PIPES_LAYER
use_power = 0
pipe_flags = 0 // Does not have PIPING_DEFAULT_LAYER_ONLY flag.
diff --git a/code/ATMOSPHERICS/pipes/simple.dm b/code/ATMOSPHERICS/pipes/simple.dm
index 77290e5d8a..6aee81807e 100644
--- a/code/ATMOSPHERICS/pipes/simple.dm
+++ b/code/ATMOSPHERICS/pipes/simple.dm
@@ -173,7 +173,7 @@
icon_state = "intact-scrubbers"
connect_types = CONNECT_TYPE_SCRUBBER
piping_layer = PIPING_LAYER_SCRUBBER
- layer = 2.38
+ layer = PIPES_SCRUBBER_LAYER
icon_connect_type = "-scrubbers"
color = PIPE_COLOR_RED
@@ -183,7 +183,7 @@
icon_state = "intact-supply"
connect_types = CONNECT_TYPE_SUPPLY
piping_layer = PIPING_LAYER_SUPPLY
- layer = 2.39
+ layer = PIPES_SUPPLY_LAYER
icon_connect_type = "-supply"
color = PIPE_COLOR_BLUE
@@ -219,7 +219,7 @@
icon_state = "intact-scrubbers"
connect_types = CONNECT_TYPE_SCRUBBER
piping_layer = PIPING_LAYER_SCRUBBER
- layer = 2.38
+ layer = PIPES_SCRUBBER_LAYER
icon_connect_type = "-scrubbers"
color = PIPE_COLOR_RED
@@ -229,7 +229,7 @@
icon_state = "intact-supply"
connect_types = CONNECT_TYPE_SUPPLY
piping_layer = PIPING_LAYER_SUPPLY
- layer = 2.39
+ layer = PIPES_SUPPLY_LAYER
icon_connect_type = "-supply"
color = PIPE_COLOR_BLUE
diff --git a/code/ATMOSPHERICS/pipes/tank.dm b/code/ATMOSPHERICS/pipes/tank.dm
index c96f4ddf1d..751c9ed607 100644
--- a/code/ATMOSPHERICS/pipes/tank.dm
+++ b/code/ATMOSPHERICS/pipes/tank.dm
@@ -11,6 +11,7 @@
volume = 10000 //in liters, 1 meters by 1 meters by 2 meters ~tweaked it a little to simulate a pressure tank without needing to recode them yet
var/start_pressure = 75*ONE_ATMOSPHERE //Vorestation edit
+ layer = ATMOS_LAYER
level = 1
dir = SOUTH
initialize_directions = SOUTH
diff --git a/code/__defines/_planes+layers.dm b/code/__defines/_planes+layers.dm
index f0c4d4cbc6..ad2962547c 100644
--- a/code/__defines/_planes+layers.dm
+++ b/code/__defines/_planes+layers.dm
@@ -40,39 +40,71 @@ What is the naming convention for planes or layers?
*/
-#define SPACE_PLANE -32 // Reserved for use in space/parallax
-#define PARALLAX_PLANE -30 // Reserved for use in space/parallax
+#define SPACE_PLANE -82 // Reserved for use in space/parallax
+#define PARALLAX_PLANE -80 // Reserved for use in space/parallax
// OPENSPACE_PLANE reserves all planes between OPENSPACE_PLANE_START and OPENSPACE_PLANE_END inclusive
-#define OPENSPACE_PLANE -55 // /turf/simulated/open will use OPENSPACE_PLANE + z (Valid z's being 2 thru 17)
-#define OPENSPACE_PLANE_START -53
-#define OPENSPACE_PLANE_END -38
-#define OVER_OPENSPACE_PLANE -37
+#define OPENSPACE_PLANE -75 // /turf/simulated/open will use OPENSPACE_PLANE + z (Valid z's being 2 thru 17)
+#define OPENSPACE_PLANE_START -73
+#define OPENSPACE_PLANE_END -58
+#define OVER_OPENSPACE_PLANE -57
+
+// Turf Planes
+#define SPACE_PLANE -43 // Space turfs themselves
+#define PLATING_PLANE -44 // Plating
+ #define DISPOSAL_LAYER 2.1 // Under objects, even when planeswapped
+ #define PIPES_LAYER 2.2 // Under objects, even when planeswapped
+ #define WIRES_LAYER 2.3 // Under objects, even when planeswapped
+ #define ATMOS_LAYER 2.4 // Pipe-like atmos machinery that goes on the floor, like filters.
+ #define ABOVE_UTILITY 2.5 // Above stuff like pipes and wires
+#define TURF_PLANE -45 // Turfs themselves, most flooring
+ #define ABOVE_TURF_LAYER 2.1 // Snow and such
+#define DECAL_PLANE -44 // Permanent decals
+#define DIRTY_PLANE -43 // Nonpermanent decals
+#define BLOOD_PLANE -42 // Blood is really dirty, but we can do special stuff if we separate it
+
+// Obj planes
+#define OBJ_PLANE -35
+ #define HIDING_LAYER 2.6 // Layer at which mobs hide to be under things like tables
+ #define DOOR_OPEN_LAYER 2.7 // Under all objects if opened. 2.7 due to tables being at 2.6
+ #define TABLE_LAYER 2.8 // Just under stuff that wants to be slightly below common objects.
+ #define UNDER_JUNK_LAYER 2.9 // Things that want to be slightly below common objects
+ // Turf/Obj layer boundary
+ #define ABOVE_JUNK_LAYER 3.1 // Things that want to be slightly above common objects
+ #define DOOR_CLOSED_LAYER 3.1 // Doors when closed
+ #define WINDOW_LAYER 3.2 // Windows
+ #define ON_WINDOW_LAYER 3.3 // Ontop of a window
+ #define SHOWER_OPEN_LAYER 3.4 // Showers when open
+ // Obj/Mob layer boundary
+ #define SHOWER_CLOSED_LAYER 4.2 // Should be converted to plane swaps
+
+// Mob planes
+#define MOB_PLANE -25
+ #define BELOW_MOB_LAYER 3.9 // Should be converted to plane swaps
+ #define ABOVE_MOB_LAYER 4.1 // Should be converted to plane swaps
+
+// Top plane (in the sense that it's the highest in 'the world' and not a UI element)
+#define ABOVE_PLANE -10
////////////////////////////////////////////////////////////////////////////////////////
#define PLANE_WORLD 0 // BYOND's default value for plane, the "base plane"
////////////////////////////////////////////////////////////////////////////////////////
- //#define TURF_LAYER 2 //For easy recordkeeping; this is a byond define
- #define DECALS_LAYER 2.01
- #define OVERTURF_LAYER 2.1
- #define HIDING_LAYER 2.45 //Layer at which mobs hide to be under things like tables
- #define DOOR_OPEN_LAYER 2.7 //Under all objects if opened. 2.7 due to tables being at 2.6
- //#define OBJ_LAYER 3 //For easy recordkeeping; this is a byond define
- #define DOOR_CLOSED_LAYER 3.1 //Above most items if closed
- #define SHOWER_OPEN_LAYER 3.4
- #define BELOW_MOB_LAYER 3.9
- //#define MOB_LAYER 4 //For easy recordkeeping; this is a byond define
- #define ABOVE_MOB_LAYER 4.1
- #define SHOWER_CLOSED_LAYER 4.2
+ //#define AREA_LAYER 1 //For easy recordkeeping; this is a byond define
+ //#define TURF_LAYER 2 //For easy recordkeeping; this is a byond define
+
+ //#define OBJ_LAYER 3 //For easy recordkeeping; this is a byond define
+
+ //#define MOB_LAYER 4 //For easy recordkeeping; this is a byond define
+
//#define FLY_LAYER 5 //For easy recordkeeping; this is a byond define
- #define LIGHTING_LAYER 11 //Layer that lighting used to be on (now it's on a plane)
- #define HUD_LAYER 20 //Above lighting, but below obfuscation. For in-game HUD effects (whereas SCREEN_LAYER is for abstract/OOC things like inventory slots)
- #define SCREEN_LAYER 22 //Mob HUD/effects layer
+
+ #define HUD_LAYER 20 // Above lighting, but below obfuscation. For in-game HUD effects (whereas SCREEN_LAYER is for abstract/OOC things like inventory slots)
+ #define SCREEN_LAYER 22 // Mob HUD/effects layer
#define PLANE_ADMIN1 3 //Purely for shenanigans (below lighting)
-
+#define PLANE_PLANETLIGHTING 4 //Lighting on planets
#define PLANE_LIGHTING 5 //Where the lighting (and darkness) lives
#define PLANE_LIGHTING_ABOVE 6 //For glowy eyes etc. that shouldn't be affected by darkness
@@ -125,4 +157,4 @@ What is the naming convention for planes or layers?
// Check if a mob can "logically" see an atom plane
-#define MOB_CAN_SEE_PLANE(M, P) (P == PLANE_WORLD || (P >= OPENSPACE_PLANE_START && P <= OPENSPACE_PLANE_END) || (P in M.planes_visible))
+#define MOB_CAN_SEE_PLANE(M, P) (P <= PLANE_WORLD || (P in M.planes_visible))
diff --git a/code/__defines/belly_modes_vr.dm b/code/__defines/belly_modes_vr.dm
index aa0d9d616d..e6f072ca0c 100644
--- a/code/__defines/belly_modes_vr.dm
+++ b/code/__defines/belly_modes_vr.dm
@@ -1,28 +1,38 @@
-// Belly Mode Constants
+// Normal digestion modes
#define DM_HOLD "Hold"
-#define DM_DIGEST "Digest"
-#define DM_ITEMWEAK "Digest (Item Friendly)"
-#define DM_STRIPDIGEST "Strip Digest (Items Only)"
-#define DM_DIGEST_NUMB "Digest (Numbing)"
+#define DM_DIGEST "Digest"
+#define DM_ABSORB "Absorb"
+#define DM_UNABSORB "Unabsorb"
+#define DM_DRAIN "Drain"
+#define DM_SHRINK "Shrink"
+#define DM_GROW "Grow"
+#define DM_SIZE_STEAL "Size Steal"
#define DM_HEAL "Heal"
-#define DM_ABSORB "Absorb"
+#define DM_EGG "Encase In Egg"
+#define DM_TRANSFORM "Transform"
+
+//#define DM_ITEMWEAK "Digest (Item Friendly)"
+//#define DM_STRIPDIGEST "Strip Digest (Items Only)"
+//#define DM_DIGEST_NUMB "Digest (Numbing)"
+
+//TF modes
#define DM_TRANSFORM_HAIR_AND_EYES "Transform (Hair and eyes)"
#define DM_TRANSFORM_MALE "Transform (Male)"
-#define DM_TRANSFORM_FEMALE "Transform (Female)"
+#define DM_TRANSFORM_FEMALE "Transform (Female)"
#define DM_TRANSFORM_KEEP_GENDER "Transform (Keep Gender)"
#define DM_TRANSFORM_REPLICA "Transform (Replica Of Self)"
#define DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR "Transform (Change Species and Taur)"
-#define DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG "Transform (Change Species and Taur) (EGG)"
+#define DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG "Transform (Change Species and Taur) (EGG)"
#define DM_TRANSFORM_REPLICA_EGG "Transform (Replica Of Self) (EGG)"
#define DM_TRANSFORM_KEEP_GENDER_EGG "Transform (Keep Gender) (EGG)"
#define DM_TRANSFORM_MALE_EGG "Transform (Male) (EGG)"
-#define DM_TRANSFORM_FEMALE_EGG "Transform (Female) (EGG)"
-#define DM_EGG "Encase In Egg"
-#define DM_DRAIN "Drain"
-#define DM_UNABSORB "Unabsorb"
-#define DM_SHRINK "Shrink"
-#define DM_GROW "Grow"
-#define DM_SIZE_STEAL "Size Steal"
+#define DM_TRANSFORM_FEMALE_EGG "Transform (Female) (EGG)"
+
+//Addon mode flags
+#define DM_FLAG_NUMBING 0x1
+#define DM_FLAG_ITEMWEAK 0x2
+#define DM_FLAG_STRIPPING 0x4
+
// Stance for hostile mobs to be in while devouring someone.
#define HOSTILE_STANCE_EATING 99
diff --git a/code/__defines/chemistry.dm b/code/__defines/chemistry.dm
index 3ae84811b5..c9b34fc2b6 100644
--- a/code/__defines/chemistry.dm
+++ b/code/__defines/chemistry.dm
@@ -27,7 +27,7 @@
#define IS_SLIME 8
#define CE_STABLE "stable" // Inaprovaline
-#define CE_ANTIBIOTIC "antibiotic" // Spaceacilin
+#define CE_ANTIBIOTIC "antibiotic" // Antibiotics
#define CE_BLOODRESTORE "bloodrestore" // Iron/nutriment
#define CE_PAINKILLER "painkiller"
#define CE_ALCOHOL "alcohol" // Liver filtering
@@ -36,6 +36,7 @@
#define REAGENTS_PER_SHEET 20
+// Attached to CE_ANTIBIOTIC
#define ANTIBIO_NORM 1
#define ANTIBIO_OD 2
#define ANTIBIO_SUPER 3
diff --git a/code/__defines/construction.dm b/code/__defines/construction.dm
index 837ad7ed38..2bae550a22 100644
--- a/code/__defines/construction.dm
+++ b/code/__defines/construction.dm
@@ -28,7 +28,7 @@
#define PIPE_BENDABLE 1 //6 directions: N/S, E/W, N/E, N/W, S/E, S/W
#define PIPE_TRINARY 2 //4 directions: N/E/S, E/S/W, S/W/N, W/N/E
#define PIPE_TRIN_M 3 //8 directions: N->S+E, S->N+E, N->S+W, S->N+W, E->W+S, W->E+S, E->W+N, W->E+N
-#define PIPE_DIRECTIONAL 4 //4 directions: N, S, E, W
+#define PIPE_DIRECTIONAL 4 //4 directions: N, S, E, W
#define PIPE_ONEDIR 5 //1 direction: N/S/E/W
#define PIPE_UNARY_FLIPPABLE 6 //8 directions: N, S, E, W, N-flipped, S-flipped, E-flipped, W-flipped
#define PIPE_TRIN_T 7 //8 directions: N->S+E, S->N+E, N->S+W, S->N+W, E->W+S, W->E+S, E->W+N, W->E+N
@@ -45,6 +45,11 @@
#define PIPING_LAYER_SCRUBBER 3
#define PIPING_LAYER_DEFAULT PIPING_LAYER_REGULAR
+// We offset the layer values of the different pipe types to ensure they look nice
+#define PIPES_SCRUBBER_LAYER (PIPES_LAYER - 0.02)
+#define PIPES_SUPPLY_LAYER (PIPES_LAYER - 0.01)
+#define PIPES_HE_LAYER (PIPES_LAYER + 0.01)
+
// Pipe flags
#define PIPING_ALL_LAYER 1 //intended to connect with all layers, check for all instead of just one.
#define PIPING_ONE_PER_TURF 2 //can only be built if nothing else with this flag is on the tile already.
diff --git a/code/__defines/items_clothing.dm b/code/__defines/items_clothing.dm
index 8f67815583..637b450df6 100644
--- a/code/__defines/items_clothing.dm
+++ b/code/__defines/items_clothing.dm
@@ -88,17 +88,17 @@
#define slot_back 3
#define slot_belt 4
#define slot_wear_id 5
-#define slot_l_store 6
-#define slot_r_store 7 //Some things may reference this, try to keep it here
+#define slot_s_store 6
+#define slot_l_store 7
+#define slot_r_store 8 //Some things may reference this, try to keep it here
//Shown when inventory unhidden
-#define slot_glasses 8
-#define slot_wear_mask 9
-#define slot_gloves 10
-#define slot_head 11
-#define slot_shoes 12
-#define slot_wear_suit 13
-#define slot_w_uniform 14
-#define slot_s_store 15
+#define slot_glasses 9
+#define slot_wear_mask 10
+#define slot_gloves 11
+#define slot_head 12
+#define slot_shoes 13
+#define slot_wear_suit 14
+#define slot_w_uniform 15
#define slot_l_ear 16
#define slot_r_ear 17
//Secret slots
diff --git a/code/__defines/lighting.dm b/code/__defines/lighting.dm
index 6b05896b8d..00e473fc2a 100644
--- a/code/__defines/lighting.dm
+++ b/code/__defines/lighting.dm
@@ -9,7 +9,6 @@
#define LIGHTING_LAMBERTIAN 0 // use lambertian shading for light sources
#define LIGHTING_HEIGHT 1 // height off the ground of light sources on the pseudo-z-axis, you should probably leave this alone
-//#define LIGHTING_LAYER 10 // drawing layer for lighting overlays
#define LIGHTING_ICON 'icons/effects/lighting_overlay.dmi' // icon used for lighting shading effects
#define LIGHTING_ICON_STATE_DARK "soft_dark" // Change between "soft_dark" and "dark" to swap soft darkvision
diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm
index bb17deacf4..18c8cb1ca7 100644
--- a/code/__defines/mobs.dm
+++ b/code/__defines/mobs.dm
@@ -9,7 +9,7 @@
#define CANPARALYSE 0x4
#define CANPUSH 0x8
#define LEAPING 0x10
-#define HIDING 0x20
+#define HIDING 0x20
#define PASSEMOTES 0x40 // Mob has a cortical borer or holders inside of it that need to see emotes.
#define GODMODE 0x1000
#define FAKEDEATH 0x2000 // Replaces stuff like changeling.changeling_fakedeath.
diff --git a/code/__defines/mobs_vr.dm b/code/__defines/mobs_vr.dm
index 7938981454..eee6220f8b 100644
--- a/code/__defines/mobs_vr.dm
+++ b/code/__defines/mobs_vr.dm
@@ -24,5 +24,6 @@
#define SPECIES_VULPKANIN "Vulpkanin"
#define SPECIES_XENOCHIMERA "Xenochimera"
#define SPECIES_XENOHYBRID "Xenomorph Hybrid"
-#define SPECIES_ZORREN_FLAT "Flatlander Zorren"
+#define SPECIES_ZORREN_FLAT "Flatland Zorren"
#define SPECIES_ZORREN_HIGH "Highlander Zorren"
+#define SPECIES_CUSTOM "Custom Species"
diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm
index b0d1667fc4..903c7d3d68 100644
--- a/code/_helpers/global_lists.dm
+++ b/code/_helpers/global_lists.dm
@@ -32,7 +32,7 @@ var/global/list/all_species[0]
var/global/list/all_languages[0]
var/global/list/language_keys[0] // Table of say codes for all languages
var/global/list/whitelisted_species = list(SPECIES_HUMAN) // Species that require a whitelist check.
-var/global/list/playable_species = list("Custom Species", SPECIES_HUMAN) // A list of ALL playable species, whitelisted, latejoin or otherwise. //VOREStation Edit - Making sure custom species is obvious.
+var/global/list/playable_species = list(SPECIES_CUSTOM, SPECIES_HUMAN) // A list of ALL playable species, whitelisted, latejoin or otherwise. //VOREStation Edit - Making sure custom species is obvious.
var/list/mannequins_
diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm
index f54d8d6b18..64393508af 100644
--- a/code/_helpers/global_lists_vr.dm
+++ b/code/_helpers/global_lists_vr.dm
@@ -11,6 +11,8 @@ var/global/list/positive_traits = list() // Positive custom species traits, inde
var/global/list/traits_costs = list() // Just path = cost list, saves time in char setup
var/global/list/all_traits = list() // All of 'em at once (same instances)
+var/global/list/custom_species_bases = list() // Species that can be used for a Custom Species icon base
+
//stores numeric player size options indexed by name
var/global/list/player_sizes_list = list(
"Macro" = RESIZE_HUGE,
@@ -195,4 +197,14 @@ var/global/list/edible_trash = list(/obj/item/trash,
if(0.1 to INFINITY)
positive_traits[path] = instance
- return 1 // Hooks must return 1
\ No newline at end of file
+ // Custom species icon bases
+ var/list/blacklisted_icons = list(SPECIES_CUSTOM,SPECIES_PROMETHEAN) //Just ones that won't work well.
+ for(var/species_name in playable_species)
+ if(species_name in blacklisted_icons)
+ continue
+ var/datum/species/S = all_species[species_name]
+ if(S.spawn_flags & SPECIES_IS_WHITELISTED)
+ continue
+ custom_species_bases += species_name
+
+ return 1 // Hooks must return 1
diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm
index 11a22d5938..aa2186ab94 100644
--- a/code/_helpers/unsorted.dm
+++ b/code/_helpers/unsorted.dm
@@ -1226,20 +1226,21 @@ proc/is_hot(obj/item/W as obj)
/*
Checks if that loc and dir has a item on the wall
+TODO - Fix this ancient list of wall items. Preferably make it dynamically populated. ~Leshana
*/
var/list/WALLITEMS = list(
- "/obj/machinery/power/apc", "/obj/machinery/alarm", "/obj/item/device/radio/intercom",
- "/obj/structure/extinguisher_cabinet", "/obj/structure/reagent_dispensers/peppertank",
- "/obj/machinery/status_display", "/obj/machinery/requests_console", "/obj/machinery/light_switch", "/obj/effect/sign",
- "/obj/machinery/newscaster", "/obj/machinery/firealarm", "/obj/structure/noticeboard", "/obj/machinery/door_control",
- "/obj/machinery/computer/security/telescreen", "/obj/machinery/embedded_controller/radio/simple_vent_controller",
- "/obj/item/weapon/storage/secure/safe", "/obj/machinery/door_timer", "/obj/machinery/flasher", "/obj/machinery/keycard_auth",
- "/obj/structure/mirror", "/obj/structure/closet/fireaxecabinet", "/obj/machinery/computer/security/telescreen/entertainment"
+ /obj/machinery/power/apc, /obj/machinery/alarm, /obj/item/device/radio/intercom, /obj/structure/frame,
+ /obj/structure/extinguisher_cabinet, /obj/structure/reagent_dispensers/peppertank,
+ /obj/machinery/status_display, /obj/machinery/requests_console, /obj/machinery/light_switch, /obj/structure/sign,
+ /obj/machinery/newscaster, /obj/machinery/firealarm, /obj/structure/noticeboard, /obj/machinery/button/remote,
+ /obj/machinery/computer/security/telescreen, /obj/machinery/embedded_controller/radio,
+ /obj/item/weapon/storage/secure/safe, /obj/machinery/door_timer, /obj/machinery/flasher, /obj/machinery/keycard_auth,
+ /obj/structure/mirror, /obj/structure/closet/fireaxecabinet, /obj/machinery/computer/security/telescreen/entertainment
)
/proc/gotwallitem(loc, dir)
for(var/obj/O in loc)
for(var/item in WALLITEMS)
- if(istype(O, text2path(item)))
+ if(istype(O, item))
//Direction works sometimes
if(O.dir == dir)
return 1
@@ -1263,7 +1264,7 @@ var/list/WALLITEMS = list(
//Some stuff is placed directly on the wallturf (signs)
for(var/obj/O in get_step(loc, dir))
for(var/item in WALLITEMS)
- if(istype(O, text2path(item)))
+ if(istype(O, item))
if(O.pixel_x == 0 && O.pixel_y == 0)
return 1
return 0
diff --git a/code/_macros_vr.dm b/code/_macros_vr.dm
index daa1123574..284b6623fc 100644
--- a/code/_macros_vr.dm
+++ b/code/_macros_vr.dm
@@ -1,2 +1,4 @@
-#define isbelly(A) istype(A, /obj/belly)
-#define isstorage(A) istype(A, /obj/item/weapon/storage)
\ No newline at end of file
+#define isbelly(A) istype(A, /obj/belly)
+#define isstorage(A) istype(A, /obj/item/weapon/storage)
+#define isitem(A) istype(A, /obj/item)
+#define isTaurTail(A) istype(A, /datum/sprite_accessory/tail/taur)
diff --git a/code/_onclick/hud/alien_larva.dm b/code/_onclick/hud/alien_larva.dm
index 1f0df80141..2ec9da3b27 100644
--- a/code/_onclick/hud/alien_larva.dm
+++ b/code/_onclick/hud/alien_larva.dm
@@ -11,7 +11,7 @@
using.icon = 'icons/mob/screen1_alien.dmi'
using.icon_state = (mymob.m_intent == "run" ? "running" : "walking")
using.screen_loc = ui_acti
- using.layer = 20
+ using.layer = HUD_LAYER
src.adding += using
move_intent = using
diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm
index c05426d95d..3a8d8696ce 100644
--- a/code/_onclick/hud/hud.dm
+++ b/code/_onclick/hud/hud.dm
@@ -51,7 +51,6 @@ var/list/global_huds = list(
/obj/screen/global_screen
screen_loc = ui_entire_screen
- layer = 17
plane = PLANE_FULLSCREEN
mouse_opacity = 0
@@ -74,7 +73,12 @@ var/list/global_huds = list(
darksight.icon = null
darksight.screen_loc = "1,1"
darksight.plane = PLANE_LIGHTING
- darksight.plane = LIGHTING_LAYER + 0.1
+
+ //Marks the center of the screen, for things like ventcrawl
+ centermarker = new /obj/screen()
+ centermarker.icon = 'icons/mob/screen1.dmi'
+ centermarker.icon_state = "centermarker"
+ centermarker.screen_loc = "CENTER,CENTER"
//Marks the center of the screen, for things like ventcrawl
centermarker = new /obj/screen()
@@ -141,20 +145,17 @@ var/list/global_huds = list(
for(i = 1, i <= 4, i++)
O = vimpaired[i]
O.icon_state = "dither50"
- O.layer = 17
O.plane = PLANE_FULLSCREEN
O.mouse_opacity = 0
O = darkMask[i]
O.icon_state = "dither50"
- O.layer = 17
O.plane = PLANE_FULLSCREEN
O.mouse_opacity = 0
for(i = 5, i <= 8, i++)
O = darkMask[i]
O.icon_state = "black"
- O.layer = 17
O.plane = PLANE_FULLSCREEN
O.mouse_opacity = 2
diff --git a/code/_onclick/hud/other_mobs.dm b/code/_onclick/hud/other_mobs.dm
index cab3e3bfca..f1b9165a26 100644
--- a/code/_onclick/hud/other_mobs.dm
+++ b/code/_onclick/hud/other_mobs.dm
@@ -11,13 +11,13 @@
blobpwrdisplay.name = "blob power"
blobpwrdisplay.icon_state = "block"
blobpwrdisplay.screen_loc = ui_health
- blobpwrdisplay.layer = 20
+ blobpwrdisplay.layer = HUD_LAYER
blobhealthdisplay = new /obj/screen()
blobhealthdisplay.name = "blob health"
blobhealthdisplay.icon_state = "block"
blobhealthdisplay.screen_loc = ui_internal
- blobhealthdisplay.layer = 20
+ blobhealthdisplay.layer = HUD_LAYER
mymob.client.screen = list()
@@ -36,7 +36,7 @@
using.icon = ui_style
using.icon_state = "intent_"+mymob.a_intent
using.screen_loc = ui_zonesel
- using.layer = 20
+ using.layer = HUD_LAYER
src.adding += using
action_intent = using
@@ -50,7 +50,7 @@
using.name = "help"
using.icon = ico
using.screen_loc = ui_zonesel
- using.layer = 21
+ using.layer = HUD_LAYER+0.01
src.adding += using
help_intent = using
@@ -61,7 +61,7 @@
using.name = "disarm"
using.icon = ico
using.screen_loc = ui_zonesel
- using.layer = 21
+ using.layer = HUD_LAYER+0.01
src.adding += using
disarm_intent = using
@@ -72,7 +72,7 @@
using.name = "grab"
using.icon = ico
using.screen_loc = ui_zonesel
- using.layer = 21
+ using.layer = HUD_LAYER+0.01
src.adding += using
grab_intent = using
@@ -83,7 +83,7 @@
using.name = I_HURT
using.icon = ico
using.screen_loc = ui_zonesel
- using.layer = 21
+ using.layer = HUD_LAYER+0.01
src.adding += using
hurt_intent = using
@@ -93,9 +93,12 @@
return
-/mob/living/simple_animal/construct/instantiate_hud(var/datum/hud/HUD)
- HUD.construct_hud()
+/mob/living/simple_animal/construct/instantiate_hud(var/datum/hud/HUD)
+ ..(HUD)
+
+// HUD.construct_hud() //Archaic.
+/*
/datum/hud/proc/construct_hud()
var/constructtype
@@ -109,30 +112,28 @@
constructtype = "harvester"
if(constructtype)
- mymob.fire = new /obj/screen()
+
mymob.fire.icon = 'icons/mob/screen1_construct.dmi'
mymob.fire.icon_state = "fire0"
mymob.fire.name = "fire"
mymob.fire.screen_loc = ui_construct_fire
- mymob.healths = new /obj/screen()
mymob.healths.icon = 'icons/mob/screen1_construct.dmi'
mymob.healths.icon_state = "[constructtype]_health0"
mymob.healths.name = "health"
mymob.healths.screen_loc = ui_construct_health
- mymob.pullin = new /obj/screen()
mymob.pullin.icon = 'icons/mob/screen1_construct.dmi'
mymob.pullin.icon_state = "pull0"
mymob.pullin.name = "pull"
mymob.pullin.screen_loc = ui_construct_pull
- mymob.zone_sel = new /obj/screen/zone_sel()
+
mymob.zone_sel.icon = 'icons/mob/screen1_construct.dmi'
mymob.zone_sel.overlays.len = 0
mymob.zone_sel.overlays += image('icons/mob/zone_sel.dmi', "[mymob.zone_sel.selecting]")
- mymob.purged = new /obj/screen()
+
mymob.purged.icon = 'icons/mob/screen1_construct.dmi'
mymob.purged.icon_state = "purge0"
mymob.purged.name = "purged"
@@ -142,3 +143,4 @@
mymob.client.screen += list(mymob.fire, mymob.healths, mymob.pullin, mymob.zone_sel, mymob.purged)
mymob.client.screen += mymob.client.void
+*/
diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm
index ae726ec481..dc414df11f 100644
--- a/code/_onclick/hud/robot.dm
+++ b/code/_onclick/hud/robot.dm
@@ -30,7 +30,7 @@ var/obj/screen/robot_inventory
using.alpha = ui_alpha
using.icon_state = "radio"
using.screen_loc = ui_movi
- using.layer = 20
+ using.layer = HUD_LAYER
src.adding += using
//Module select
@@ -43,7 +43,7 @@ var/obj/screen/robot_inventory
using.alpha = ui_alpha
using.icon_state = "inv1"
using.screen_loc = ui_inv1
- using.layer = 20
+ using.layer = HUD_LAYER
src.adding += using
mymob:inv1 = using
@@ -55,7 +55,7 @@ var/obj/screen/robot_inventory
using.alpha = ui_alpha
using.icon_state = "inv2"
using.screen_loc = ui_inv2
- using.layer = 20
+ using.layer = HUD_LAYER
src.adding += using
mymob:inv2 = using
@@ -67,7 +67,7 @@ var/obj/screen/robot_inventory
using.alpha = ui_alpha
using.icon_state = "inv3"
using.screen_loc = ui_inv3
- using.layer = 20
+ using.layer = HUD_LAYER
src.adding += using
mymob:inv3 = using
@@ -81,7 +81,7 @@ var/obj/screen/robot_inventory
using.alpha = ui_alpha
using.icon_state = mymob.a_intent
using.screen_loc = ui_acti
- using.layer = 20
+ using.layer = HUD_LAYER
src.adding += using
action_intent = using
@@ -119,7 +119,7 @@ var/obj/screen/robot_inventory
using.icon_state = "panel"
using.alpha = ui_alpha
using.screen_loc = ui_borg_panel
- using.layer = 19
+ using.layer = HUD_LAYER-0.01
src.adding += using
//Store
@@ -276,6 +276,6 @@ var/obj/screen/robot_inventory
r.client.screen -= r.robot_modules_background
/mob/living/silicon/robot/update_hud()
- ..()
if(modtype)
- hands.icon_state = lowertext(modtype)
\ No newline at end of file
+ hands.icon_state = lowertext(modtype)
+ ..()
\ No newline at end of file
diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm
index e2a4c28c6b..729330ddaa 100644
--- a/code/_onclick/other_mobs.dm
+++ b/code/_onclick/other_mobs.dm
@@ -92,9 +92,11 @@
if(spattack_min_range <= 1)
SpecialAtkTarget()
+
else if(melee_damage_upper == 0 && istype(A,/mob/living))
custom_emote(1,"[pick(friendly)] [A]!")
+
else
DoPunch(A)
diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm
index f08727abf3..26c1680421 100644
--- a/code/_onclick/telekinesis.dm
+++ b/code/_onclick/telekinesis.dm
@@ -68,7 +68,7 @@ var/const/tk_maxrange = 15
flags = NOBLUDGEON
//item_state = null
w_class = ITEMSIZE_NO_CONTAINER
- layer = 20
+ layer = HUD_LAYER
var/last_throw = 0
var/atom/movable/focus = null
diff --git a/code/controllers/Processes/inactivity.dm b/code/controllers/Processes/inactivity.dm
index 2a6cd44d2c..9435a18bf0 100644
--- a/code/controllers/Processes/inactivity.dm
+++ b/code/controllers/Processes/inactivity.dm
@@ -6,11 +6,11 @@
if(config.kick_inactive)
for(last_object in clients)
var/client/C = last_object
- if(C.is_afk(config.kick_inactive MINUTES))
- if(!istype(C.mob, /mob/observer/dead) && !istype(C.mob, /mob/new_player))
- to_chat(C,"You have been inactive for more than [config.kick_inactive] minute\s and have been disconnected.")
- var/information
+ if(C.is_afk(config.kick_inactive MINUTES) && !C.holder) // VOREStation Edit - Allow admins to idle
+ to_chat(C,"You have been inactive for more than [config.kick_inactive] minute\s and have been disconnected.")
+ var/information
+ if(C.mob)
if(ishuman(C.mob))
var/job
var/mob/living/carbon/human/H = C.mob
@@ -27,10 +27,10 @@
else if(issilicon(C.mob))
information = " while a silicon."
- var/adminlinks
- adminlinks = " (JMP|CRYO)"
+ var/adminlinks
+ adminlinks = " (JMP|CRYO)"
- log_and_message_admins("being kicked for AFK[information][adminlinks]", C.mob)
+ log_and_message_admins("being kicked for AFK[information][adminlinks]", C.mob)
- qdel(C)
+ qdel(C)
SCHECK
diff --git a/code/controllers/Processes/planet.dm b/code/controllers/Processes/planet.dm
index f9fd57f788..e39b5e81b8 100644
--- a/code/controllers/Processes/planet.dm
+++ b/code/controllers/Processes/planet.dm
@@ -47,7 +47,8 @@ var/datum/controller/process/planet/planet_controller = null
//Weather style needs redrawing
if(P.needs_work & PLANET_PROCESS_WEATHER)
P.needs_work &= ~PLANET_PROCESS_WEATHER
- var/image/new_overlay = image(icon = P.weather_holder.current_weather.icon, icon_state = P.weather_holder.current_weather.icon_state, layer = LIGHTING_LAYER - 1)
+ var/image/new_overlay = image(icon = P.weather_holder.current_weather.icon, icon_state = P.weather_holder.current_weather.icon_state)
+ new_overlay.plane = PLANE_PLANETLIGHTING
//Redraw weather icons
for(var/T in P.planet_floors)
var/turf/simulated/turf = T
diff --git a/code/controllers/emergency_shuttle_controller.dm b/code/controllers/emergency_shuttle_controller.dm
index 7fb3a56c61..d7a91c9b4f 100644
--- a/code/controllers/emergency_shuttle_controller.dm
+++ b/code/controllers/emergency_shuttle_controller.dm
@@ -234,7 +234,8 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle
name = "star"
var/speed = 10
var/direction = SOUTH
- layer = 2 // TURF_LAYER
+ layer = TURF_LAYER
+ plane = TURF_PLANE
/obj/effect/bgstar/New()
..()
diff --git a/code/controllers/subsystems/air.dm b/code/controllers/subsystems/air.dm
index ed4602f048..ef0173c33a 100644
--- a/code/controllers/subsystems/air.dm
+++ b/code/controllers/subsystems/air.dm
@@ -9,7 +9,7 @@
SUBSYSTEM_DEF(air)
name = "Air"
init_order = INIT_ORDER_AIR
- priority = 20
+ priority = 35
wait = 2 SECONDS // seconds (We probably can speed this up actually)
flags = SS_BACKGROUND // TODO - Should this really be background? It might be important.
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
diff --git a/code/controllers/subsystems/airflow.dm b/code/controllers/subsystems/airflow.dm
index 9db8138826..c98a02a5ce 100644
--- a/code/controllers/subsystems/airflow.dm
+++ b/code/controllers/subsystems/airflow.dm
@@ -14,7 +14,7 @@ SUBSYSTEM_DEF(airflow)
wait = 2
flags = SS_NO_INIT
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
- priority = 15
+ priority = 30
var/list/processing = list()
var/list/currentrun = list()
@@ -47,7 +47,7 @@ SUBSYSTEM_DEF(airflow)
continue
else if (target.airflow_process_delay)
target.airflow_process_delay = 0
-
+
target.airflow_speed = min(target.airflow_speed, 15)
target.airflow_speed -= vsc.airflow_speed_decay
if (!target.airflow_skip_speedcheck)
@@ -89,7 +89,7 @@ SUBSYSTEM_DEF(airflow)
if (MC_TICK_CHECK)
return
continue
-
+
step_towards(target, target.airflow_dest)
var/mob/M = target
if (ismob(target) && M.client)
@@ -98,7 +98,7 @@ SUBSYSTEM_DEF(airflow)
if (MC_TICK_CHECK)
return
-#undef CLEAR_OBJECT
+#undef CLEAR_OBJECT
/atom/movable
var/tmp/airflow_xo
@@ -129,9 +129,9 @@ SUBSYSTEM_DEF(airflow)
if (airflow_falloff < 1)
airflow_dest = null
return FALSE
-
- airflow_speed = min(max(n * (9 / airflow_falloff), 1), 9)
-
+
+ airflow_speed = min(max(n * (9 / airflow_falloff), 1), 9)
+
airflow_od = 0
if (!density)
@@ -154,7 +154,7 @@ SUBSYSTEM_DEF(airflow)
/atom/movable/proc/RepelAirflowDest(n)
if (!prepare_airflow(n))
return
-
+
airflow_xo = -(airflow_dest.x - src.x)
airflow_yo = -(airflow_dest.y - src.y)
diff --git a/code/datums/ghost_query.dm b/code/datums/ghost_query.dm
index 2857476027..d041558a0c 100644
--- a/code/datums/ghost_query.dm
+++ b/code/datums/ghost_query.dm
@@ -132,3 +132,9 @@
question = "A curious explorer has touched a mysterious rune. \
Would you like to play as the creature it summons?"
cutoff_number = 1
+
+/datum/ghost_query/cursedblade
+ role_name = "Cursed Sword"
+ question = "A cursed blade has been discovered by a curious explorer. \
+ Would you like to play as the soul imprisoned within?"
+ cutoff_number = 1
diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm
index 3576c66dfe..d2f99a347b 100644
--- a/code/datums/helper_datums/teleport.dm
+++ b/code/datums/helper_datums/teleport.dm
@@ -1,5 +1,5 @@
//wrapper
-/proc/do_teleport(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null)
+/proc/do_teleport(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null, local=TRUE) //VOREStation Edit
new /datum/teleport/instant/science(arglist(args))
return
@@ -12,15 +12,16 @@
var/soundin //soundfile to play before teleportation
var/soundout //soundfile to play after teleportation
var/force_teleport = 1 //if false, teleport will use Move() proc (dense objects will prevent teleportation)
+ var/local = TRUE //VOREStation Add - If false, can teleport from/to any z-level
-/datum/teleport/New(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null)
+/datum/teleport/New(ateleatom, adestination, aprecision=0, afteleport=1, aeffectin=null, aeffectout=null, asoundin=null, asoundout=null, local=TRUE) //VOREStation Edit
..()
if(!initTeleport(arglist(args)))
return 0
return 1
-/datum/teleport/proc/initTeleport(ateleatom,adestination,aprecision,afteleport,aeffectin,aeffectout,asoundin,asoundout)
+/datum/teleport/proc/initTeleport(ateleatom,adestination,aprecision,afteleport,aeffectin,aeffectout,asoundin,asoundout,local) //VOREStation Edit
if(!setTeleatom(ateleatom))
return 0
if(!setDestination(adestination))
@@ -30,6 +31,7 @@
setEffects(aeffectin,aeffectout)
setForceTeleport(afteleport)
setSounds(asoundin,asoundout)
+ src.local = local // VOREStation Add
return 1
//must succeed
@@ -186,7 +188,7 @@
return 0
*/ //VOREStation Removal End
//VOREStation Edit Start
- if(destination.z in using_map.player_levels)
+ if(!local || (destination.z in using_map.player_levels)) //VOREStation Edit
return 1
if(istype(teleatom, /mob/living))
to_chat(teleatom, "The portal refuses to carry you that far away!")
diff --git a/code/datums/helper_datums/teleport_vr.dm b/code/datums/helper_datums/teleport_vr.dm
index 1cb73d6ad9..eba2570c18 100644
--- a/code/datums/helper_datums/teleport_vr.dm
+++ b/code/datums/helper_datums/teleport_vr.dm
@@ -1,13 +1,17 @@
/datum/teleport/proc/try_televore()
//Destination is in a belly
- if(isbelly(destination.loc))
+ if(isbelly(destination.loc) && isliving(teleatom))
+ var/mob/living/L = teleatom
var/obj/belly/B = destination.loc
-
+
+ if(!L.can_be_drop_prey) //Overloading this as a pref for 'want to be unexpectedly eaten'
+ return FALSE
+
teleatom.forceMove(get_turf(B)) //So we can splash the sound and sparks and everything.
playSpecials(destination,effectout,soundout)
teleatom.forceMove(B)
- return 1
+ return TRUE
//No fun!
- return 0
+ return FALSE
\ No newline at end of file
diff --git a/code/datums/outfits/jobs/medical.dm b/code/datums/outfits/jobs/medical.dm
index 3b227a2612..1fdd020fcf 100644
--- a/code/datums/outfits/jobs/medical.dm
+++ b/code/datums/outfits/jobs/medical.dm
@@ -23,8 +23,8 @@
name = OUTFIT_JOB_NAME("Medical Doctor")
uniform = /obj/item/clothing/under/rank/medical
suit = /obj/item/clothing/suit/storage/toggle/labcoat
- l_hand = /obj/item/weapon/storage/firstaid/adv
- r_pocket = /obj/item/device/healthanalyzer
+ l_hand = /obj/item/weapon/storage/firstaid/regular
+ r_pocket = /obj/item/device/flashlight/pen
id_type = /obj/item/weapon/card/id/medical/doctor
/decl/hierarchy/outfit/job/medical/doctor/emergency_physician
@@ -94,7 +94,7 @@
uniform = /obj/item/clothing/under/rank/medical/scrubs/black
suit = /obj/item/clothing/suit/storage/toggle/fr_jacket
shoes = /obj/item/clothing/shoes/boots/jackboots
- l_hand = /obj/item/weapon/storage/firstaid/adv
+ l_hand = /obj/item/weapon/storage/firstaid/regular
belt = /obj/item/weapon/storage/belt/medical/emt
pda_slot = slot_l_store
id_type = /obj/item/weapon/card/id/medical/paramedic
diff --git a/code/datums/supplypacks/costumes_vr.dm b/code/datums/supplypacks/costumes_vr.dm
new file mode 100644
index 0000000000..fd8921ba77
--- /dev/null
+++ b/code/datums/supplypacks/costumes_vr.dm
@@ -0,0 +1,264 @@
+/datum/supply_packs/costumes/xenowear_vr
+ name = "Xenowear crate"
+ contains = list(
+ /obj/item/clothing/shoes/footwraps,
+ /obj/item/clothing/shoes/boots/jackboots/toeless,
+ /obj/item/clothing/shoes/boots/workboots/toeless,
+ /obj/item/clothing/suit/tajaran/furs,
+ /obj/item/clothing/head/tajaran/scarf,
+ /obj/item/clothing/suit/unathi/robe,
+ /obj/item/clothing/suit/unathi/mantle,
+ /obj/item/clothing/under/permit,
+ /obj/item/clothing/under/vox/vox_casual,
+ /obj/item/clothing/under/vox/vox_robes,
+ /obj/item/clothing/under/harness,
+ /obj/item/clothing/under/skirt/loincloth,
+ /obj/item/clothing/gloves/vox
+ )
+ cost = 100
+ containertype = /obj/structure/closet/crate
+ containername = "Xenowear crate"
+
+/datum/supply_packs/costumes/tesh_smocks_vr
+ name = "Teshari smocks"
+ contains = list(
+ /obj/item/clothing/under/seromi/smock,
+ /obj/item/clothing/under/seromi/smock/rainbow,
+ /obj/item/clothing/under/seromi/smock/red,
+ /obj/item/clothing/under/seromi/smock/white,
+ /obj/item/clothing/under/seromi/smock/yellow
+ )
+ cost = 25
+ containertype = /obj/structure/closet/crate
+ containername = "Teshari smocks crate"
+
+/datum/supply_packs/randomised/costumes/tesh_coats_vr
+ name = "Teshari undercoats"
+ num_contained = 4
+ contains = list(
+ /obj/item/clothing/under/seromi/undercoat/blue_grey,
+ /obj/item/clothing/under/seromi/undercoat/brown_grey,
+ /obj/item/clothing/under/seromi/undercoat/green_grey,
+ /obj/item/clothing/under/seromi/undercoat/lightgrey_grey,
+ /obj/item/clothing/under/seromi/undercoat/orange,
+ /obj/item/clothing/under/seromi/undercoat/orange_grey,
+ /obj/item/clothing/under/seromi/undercoat/pink_grey,
+ /obj/item/clothing/under/seromi/undercoat/purple_grey,
+ /obj/item/clothing/under/seromi/undercoat/rainbow,
+ /obj/item/clothing/under/seromi/undercoat/red_grey,
+ /obj/item/clothing/under/seromi/undercoat/white_grey,
+ /obj/item/clothing/under/seromi/undercoat/yellow_grey
+ )
+ cost = 20
+ containertype = /obj/structure/closet/crate
+ containername = "Teshari undercoats crate"
+
+/datum/supply_packs/randomised/costumes/tesh_coats_b_vr
+ name = "Teshari undercoats (black)"
+ num_contained = 4
+ contains = list(
+ /obj/item/clothing/under/seromi/undercoat/black,
+ /obj/item/clothing/under/seromi/undercoat/black_blue,
+ /obj/item/clothing/under/seromi/undercoat/black_brown,
+ /obj/item/clothing/under/seromi/undercoat/black_green,
+ /obj/item/clothing/under/seromi/undercoat/black_grey,
+ /obj/item/clothing/under/seromi/undercoat/black_lightgrey,
+ /obj/item/clothing/under/seromi/undercoat/black_midgrey,
+ /obj/item/clothing/under/seromi/undercoat/black_orange,
+ /obj/item/clothing/under/seromi/undercoat/black_pink,
+ /obj/item/clothing/under/seromi/undercoat/black_purple,
+ /obj/item/clothing/under/seromi/undercoat/black_red,
+ /obj/item/clothing/under/seromi/undercoat/black_white,
+ /obj/item/clothing/under/seromi/undercoat/black_yellow
+ )
+ cost = 20
+ containertype = /obj/structure/closet/crate
+ containername = "Teshari undercoats crate"
+
+/datum/supply_packs/randomised/costumes/tesh_cloaks_vr
+ name = "Teshari cloaks"
+ num_contained = 4
+ contains = list(
+ /obj/item/clothing/suit/storage/seromi/cloak/blue_grey,
+ /obj/item/clothing/suit/storage/seromi/cloak/brown_grey,
+ /obj/item/clothing/suit/storage/seromi/cloak/green_grey,
+ /obj/item/clothing/suit/storage/seromi/cloak/lightgrey_grey,
+ /obj/item/clothing/suit/storage/seromi/cloak/orange,
+ /obj/item/clothing/suit/storage/seromi/cloak/orange_grey,
+ /obj/item/clothing/suit/storage/seromi/cloak/pink_grey,
+ /obj/item/clothing/suit/storage/seromi/cloak/purple_grey,
+ /obj/item/clothing/suit/storage/seromi/cloak/rainbow,
+ /obj/item/clothing/suit/storage/seromi/cloak/red_grey,
+ /obj/item/clothing/suit/storage/seromi/cloak/white_grey,
+ /obj/item/clothing/suit/storage/seromi/cloak/yellow_grey
+ )
+ cost = 40
+ containertype = /obj/structure/closet/crate
+ containername = "Teshari cloaks crate"
+
+/datum/supply_packs/randomised/costumes/tesh_cloaks_b_vr
+ name = "Teshari cloaks (black)"
+ num_contained = 4
+ contains = list(
+ /obj/item/clothing/suit/storage/seromi/cloak/black,
+ /obj/item/clothing/suit/storage/seromi/cloak/black_blue,
+ /obj/item/clothing/suit/storage/seromi/cloak/black_brown,
+ /obj/item/clothing/suit/storage/seromi/cloak/black_green,
+ /obj/item/clothing/suit/storage/seromi/cloak/black_grey,
+ /obj/item/clothing/suit/storage/seromi/cloak/black_lightgrey,
+ /obj/item/clothing/suit/storage/seromi/cloak/black_midgrey,
+ /obj/item/clothing/suit/storage/seromi/cloak/black_orange,
+ /obj/item/clothing/suit/storage/seromi/cloak/black_pink,
+ /obj/item/clothing/suit/storage/seromi/cloak/black_purple,
+ /obj/item/clothing/suit/storage/seromi/cloak/black_red,
+ /obj/item/clothing/suit/storage/seromi/cloak/black_white,
+ /obj/item/clothing/suit/storage/seromi/cloak/black_yellow
+ )
+ cost = 40
+ containertype = /obj/structure/closet/crate
+ containername = "Teshari cloaks crate"
+
+/datum/supply_packs/costumes/utility_vr
+ name = "Utility uniforms"
+ contains = list(
+ /obj/item/clothing/under/utility,
+ /obj/item/clothing/under/utility/blue,
+ /obj/item/clothing/under/utility/grey
+ )
+ cost = 30
+ containertype = /obj/structure/closet/crate
+ containername = "Utility uniforms crate"
+
+/datum/supply_packs/costumes/skirts_vr
+ name = "Skirts crate"
+ contains = list(
+ /obj/item/clothing/under/skirt,
+ /obj/item/clothing/under/skirt/blue,
+ /obj/item/clothing/under/skirt/denim,
+ /obj/item/clothing/under/skirt/khaki,
+ /obj/item/clothing/under/skirt/outfit,
+ /obj/item/clothing/under/skirt/red,
+ /obj/item/clothing/under/skirt/swept,
+ /obj/item/clothing/under/skirt/outfit/plaid_blue,
+ /obj/item/clothing/under/skirt/outfit/plaid_purple,
+ /obj/item/clothing/under/skirt/outfit/plaid_red
+ )
+ cost = 40
+ containertype = /obj/structure/closet/crate
+ containername = "Skirts crate"
+
+/datum/supply_packs/costumes/varsity_vr
+ name = "Varsity jackets"
+ contains = list(
+ /obj/item/clothing/suit/varsity,
+ /obj/item/clothing/suit/varsity/blue,
+ /obj/item/clothing/suit/varsity/brown,
+ /obj/item/clothing/suit/varsity/green,
+ /obj/item/clothing/suit/varsity/purple,
+ /obj/item/clothing/suit/varsity/red
+ )
+ cost = 60
+ containertype = /obj/structure/closet/crate
+ containername = "Varsity jackets crate"
+
+/datum/supply_packs/randomised/costumes/leathergear_vr
+ name = "Leather gear"
+ num_contained = 5
+ contains = list(
+ /obj/item/clothing/suit/leathercoat,
+ /obj/item/clothing/suit/storage/leather_jacket_alt,
+ /obj/item/clothing/suit/storage/toggle/leather_jacket,
+ /obj/item/clothing/suit/storage/toggle/leather_jacket/sleeveless,
+ /obj/item/clothing/suit/storage/toggle/leather_jacket/nanotrasen,
+ /obj/item/clothing/suit/storage/toggle/leather_jacket/nanotrasen/sleeveless,
+ /obj/item/clothing/under/pants/chaps,
+ /obj/item/clothing/under/pants/chaps/black,
+ /obj/item/clothing/under/harness,
+ /obj/item/clothing/shoes/leather,
+ /obj/item/clothing/shoes/boots/jungle,
+ /obj/item/clothing/shoes/boots/jackboots,
+ /obj/item/clothing/shoes/boots/cowboy,
+ /obj/item/clothing/shoes/boots/cowboy/classic,
+ /obj/item/clothing/shoes/boots/cowboy/snakeskin,
+ /obj/item/clothing/accessory/chaps,
+ /obj/item/clothing/accessory/chaps/black,
+ /obj/item/clothing/accessory/collar/spike,
+ /obj/item/clothing/gloves/fingerless,
+ /obj/item/clothing/gloves/botanic_leather,
+ /obj/item/clothing/head/cowboy_hat,
+ /obj/item/clothing/head/cowboy_hat/black
+ )
+ cost = 50
+ containertype = /obj/structure/closet/crate
+ containername = "Leather gear crate"
+
+/datum/supply_packs/costumes/eyewear_vr
+ name = "Eyewear crate"
+ contains = list(
+ /obj/item/clothing/glasses/eyepatch,
+ /obj/item/clothing/glasses/fakesunglasses,
+ /obj/item/clothing/glasses/fakesunglasses/aviator,
+ /obj/item/clothing/glasses/fluff/science_proper,
+ /obj/item/clothing/glasses/fluff/spiffygogs,
+ /obj/item/clothing/glasses/gglasses,
+ /obj/item/clothing/glasses/monocle,
+ /obj/item/clothing/glasses/regular,
+ /obj/item/clothing/glasses/regular/hipster,
+ /obj/item/clothing/glasses/regular/scanners,
+ /obj/item/clothing/glasses/threedglasses
+ )
+ cost = 50
+ containertype = /obj/structure/closet/crate
+ containername = "Eyewear crate"
+
+/datum/supply_packs/randomised/costumes/gloves_vr
+ name = "Gloves crate"
+ num_contained = 4
+ contains = list(
+ /obj/item/clothing/gloves/black,
+ /obj/item/clothing/gloves/blue,
+ /obj/item/clothing/gloves/botanic_leather,
+ /obj/item/clothing/gloves/brown,
+ /obj/item/clothing/gloves/evening,
+ /obj/item/clothing/gloves/fingerless,
+ /obj/item/clothing/gloves/fyellow,
+ /obj/item/clothing/gloves/green,
+ /obj/item/clothing/gloves/grey,
+ /obj/item/clothing/gloves/light_brown,
+ /obj/item/clothing/gloves/orange,
+ /obj/item/clothing/gloves/purple,
+ /obj/item/clothing/gloves/rainbow,
+ /obj/item/clothing/gloves/red,
+ /obj/item/clothing/gloves/white
+ )
+ cost = 40
+ containertype = /obj/structure/closet/crate
+ containername = "Gloves crate"
+
+/datum/supply_packs/randomised/costumes/boots_vr
+ name = "Boots crate"
+ num_contained = 3
+ contains = list(
+ /obj/item/clothing/shoes/boots/workboots,
+ /obj/item/clothing/shoes/boots/cowboy,
+ /obj/item/clothing/shoes/boots/cowboy/classic,
+ /obj/item/clothing/shoes/boots/cowboy/snakeskin,
+ /obj/item/clothing/shoes/boots/duty,
+ /obj/item/clothing/shoes/boots/jackboots,
+ /obj/item/clothing/shoes/boots/jungle,
+ /obj/item/clothing/shoes/boots/winter
+ )
+ cost = 60
+ containertype = /obj/structure/closet/crate
+ containername = "Boots crate"
+
+/datum/supply_packs/costumes/taurbags
+ name = "Saddlebags crate"
+ contains = list(
+ /obj/item/weapon/storage/backpack/saddlebag_common,
+ /obj/item/weapon/storage/backpack/saddlebag_common/robust,
+ /obj/item/weapon/storage/backpack/saddlebag_common/vest
+ )
+ cost = 60
+ containertype = /obj/structure/closet/crate
+ containername = "Saddlebags crate"
\ No newline at end of file
diff --git a/code/datums/supplypacks/hospitality_vr.dm b/code/datums/supplypacks/hospitality_vr.dm
new file mode 100644
index 0000000000..1f69ef1151
--- /dev/null
+++ b/code/datums/supplypacks/hospitality_vr.dm
@@ -0,0 +1,84 @@
+/datum/supply_packs/randomised/hospitality/burgers_vr
+ num_contained = 5
+ contains = list(
+ /obj/item/weapon/reagent_containers/food/snacks/bigbiteburger,
+ /obj/item/weapon/reagent_containers/food/snacks/cheeseburger,
+ /obj/item/weapon/reagent_containers/food/snacks/jellyburger,
+ /obj/item/weapon/reagent_containers/food/snacks/tofuburger,
+ /obj/item/weapon/reagent_containers/food/snacks/fishburger
+ )
+ name = "Burger crate"
+ cost = 25
+ containertype = /obj/structure/closet/crate/freezer
+ containername = "Burger crate"
+/*
+/datum/supply_packs/randomised/hospitality/bakery_vr
+ num_contained = 5
+ contains = list(
+ /obj/item/weapon/reagent_containers/food/snacks/baguette,
+ /obj/item/weapon/reagent_containers/food/snacks/appletart,
+ /obj/item/weapon/reagent_containers/food/snacks/berrymuffin,
+ /obj/item/weapon/reagent_containers/food/snacks/bunbun,
+ /obj/item/weapon/reagent_containers/food/snacks/cherrypie,
+ /obj/item/weapon/reagent_containers/food/snacks/cookie,
+ /obj/item/weapon/reagent_containers/food/snacks/croissant,
+ /obj/item/weapon/reagent_containers/food/snacks/donut/normal,
+ /obj/item/weapon/reagent_containers/food/snacks/donut/jelly,
+ /obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly,
+ /obj/item/weapon/reagent_containers/food/snacks/muffin,
+ /obj/item/weapon/reagent_containers/food/snacks/pie,
+ /obj/item/weapon/reagent_containers/food/snacks/plump_pie,
+ /obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit,
+ /obj/item/weapon/reagent_containers/food/snacks/poppypretzel,
+ /obj/item/weapon/reagent_containers/food/snacks/sugarcookie,
+ /obj/item/weapon/reagent_containers/food/snacks/waffles
+ )
+ name = "Bakery products crate"
+ cost = 25
+ containertype = /obj/structure/closet/crate/freezer
+ containername = "Bakery products crate"
+
+/datum/supply_packs/randomised/hospitality/cakes_vr
+ num_contained = 2
+ contains = list(
+ /obj/item/weapon/reagent_containers/food/snacks/sliceable/applecake,
+ /obj/item/weapon/reagent_containers/food/snacks/sliceable/birthdaycake,
+ /obj/item/weapon/reagent_containers/food/snacks/sliceable/carrotcake,
+ /obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesecake,
+ /obj/item/weapon/reagent_containers/food/snacks/sliceable/chocolatecake,
+ /obj/item/weapon/reagent_containers/food/snacks/sliceable/lemoncake,
+ /obj/item/weapon/reagent_containers/food/snacks/sliceable/limecake,
+ /obj/item/weapon/reagent_containers/food/snacks/sliceable/orangecake,
+ /obj/item/weapon/reagent_containers/food/snacks/sliceable/plaincake
+ )
+ name = "Cake crate"
+ cost = 100
+ containertype = /obj/structure/closet/crate/freezer
+ containername = "Cake crate"
+
+/datum/supply_packs/randomised/hospitality/mexican_vr
+ num_contained = 5
+ contains = list(
+ /obj/item/weapon/reagent_containers/food/snacks/cheeseburrito,
+ /obj/item/weapon/reagent_containers/food/snacks/enchiladas,
+ /obj/item/weapon/reagent_containers/food/snacks/meatburrito,
+ /obj/item/weapon/reagent_containers/food/snacks/taco
+ )
+ name = "Mexican takeout crate"
+ cost = 50
+ containertype = /obj/structure/closet/crate/freezer
+ containername = "Mexican takeout crate"
+*/
+/datum/supply_packs/randomised/hospitality/asian_vr
+ num_contained = 5
+ contains = list(
+ /obj/item/weapon/reagent_containers/food/snacks/generalschicken,
+ /obj/item/weapon/reagent_containers/food/snacks/hotandsoursoup
+ )
+ name = "Chinese takeout crate"
+ cost = 50
+ containertype = /obj/structure/closet/crate/freezer
+ containername = "Chinese takeout crate"
+
+/datum/supply_packs/randomised/hospitality/pizza
+ cost = 50
\ No newline at end of file
diff --git a/code/datums/supplypacks/recreation.dm b/code/datums/supplypacks/recreation.dm
index 7bfdaaeeb6..7f801ea1b3 100644
--- a/code/datums/supplypacks/recreation.dm
+++ b/code/datums/supplypacks/recreation.dm
@@ -39,6 +39,7 @@
name = "Arts and Crafts supplies"
contains = list(
/obj/item/weapon/storage/fancy/crayons,
+ /obj/item/weapon/storage/fancy/markers,
/obj/item/device/camera,
/obj/item/device/camera_film = 2,
/obj/item/weapon/storage/photo_album,
diff --git a/code/datums/supplypacks/recreation_vr.dm b/code/datums/supplypacks/recreation_vr.dm
index e95094428e..cf12b4815b 100644
--- a/code/datums/supplypacks/recreation_vr.dm
+++ b/code/datums/supplypacks/recreation_vr.dm
@@ -18,7 +18,7 @@
/obj/item/stack/cable_coil/random,
/obj/item/clothing/accessory/collar/shock,
/obj/item/clothing/suit/straight_jacket,
- /obj/item/weapon/handcuffs/legcuffs,
+ /obj/item/weapon/handcuffs/legcuffs/fuzzy,
/obj/item/weapon/melee/fluff/holochain/mass,
/obj/item/weapon/material/twohanded/fluff/riding_crop,
/obj/item/clothing/under/fluff/latexmaid
@@ -38,4 +38,33 @@
)
cost = 50
containertype = /obj/structure/closet/crate
- containername = "wolfgirl cosplay crate"
\ No newline at end of file
+ containername = "wolfgirl cosplay crate"
+
+/datum/supply_packs/randomised/recreation/figures_vr
+ name = "Action figures crate"
+ num_contained = 5
+ contains = list(
+ /obj/random/action_figure
+ )
+ cost = 200
+ containertype = /obj/structure/closet/crate
+ containername = "Action figures crate"
+
+/datum/supply_packs/recreation/characters_vr
+ name = "Tabletop miniatures"
+ contains = list(
+ /obj/item/weapon/storage/box/characters
+ )
+ containertype = /obj/structure/closet/crate
+ containername = "Tabletop miniatures crate"
+ cost = 50
+
+/datum/supply_packs/randomised/recreation/plushies_vr
+ name = "Plushies crate"
+ num_contained = 3
+ contains = list(
+ /obj/random/plushie
+ )
+ cost = 60
+ containertype = /obj/structure/closet/crate
+ containername = "Plushies crate"
\ No newline at end of file
diff --git a/code/game/antagonist/antagonist_update.dm b/code/game/antagonist/antagonist_update.dm
index 7cf17b5640..16c27f82c7 100644
--- a/code/game/antagonist/antagonist_update.dm
+++ b/code/game/antagonist/antagonist_update.dm
@@ -33,7 +33,9 @@
if(!antag_indicator || !other.current || !recipient.current)
return
var/indicator = (faction_indicator && (other in faction_members)) ? faction_indicator : antag_indicator
- return image('icons/mob/mob.dmi', loc = other.current, icon_state = indicator, layer = LIGHTING_LAYER+0.1)
+ var/image/returnimage = image('icons/mob/mob.dmi', loc = other.current, icon_state = indicator)
+ returnimage.plane = PLANE_LIGHTING_ABOVE
+ return returnimage
/datum/antagonist/proc/update_all_icons()
if(!antag_indicator)
diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm
index 6281bd9e42..70c4b010b4 100755
--- a/code/game/area/Space Station 13 areas.dm
+++ b/code/game/area/Space Station 13 areas.dm
@@ -13,82 +13,6 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
*/
-
-
-/area
- var/fire = null
- var/atmos = 1
- var/atmosalm = 0
- var/poweralm = 1
- var/party = null
- level = null
- name = "Unknown"
- icon = 'icons/turf/areas.dmi'
- icon_state = "unknown"
- layer = 10
- luminosity = 0
- mouse_opacity = 0
- var/lightswitch = 1
-
- var/eject = null
-
- var/debug = 0
- var/requires_power = 1
- var/always_unpowered = 0 //this gets overriden to 1 for space in area/New()
-
- var/power_equip = 1
- var/power_light = 1
- var/power_environ = 1
- var/music = null
- var/used_equip = 0
- var/used_light = 0
- var/used_environ = 0
-
- var/has_gravity = 1
- var/obj/machinery/power/apc/apc = null
- var/no_air = null
-// var/list/lights // list of all lights on this area
- var/list/all_doors = null //Added by Strumpetplaya - Alarm Change - Contains a list of doors adjacent to this area
- var/firedoors_closed = 0
- var/list/ambience = list('sound/ambience/ambigen1.ogg','sound/ambience/ambigen3.ogg','sound/ambience/ambigen4.ogg','sound/ambience/ambigen5.ogg','sound/ambience/ambigen6.ogg','sound/ambience/ambigen7.ogg','sound/ambience/ambigen8.ogg','sound/ambience/ambigen9.ogg','sound/ambience/ambigen10.ogg','sound/ambience/ambigen11.ogg','sound/ambience/ambigen12.ogg','sound/ambience/ambigen14.ogg')
- var/list/forced_ambience = null
- var/sound_env = STANDARD_STATION
- var/turf/base_turf //The base turf type of the area, which can be used to override the z-level's base turf
-
-/*Adding a wizard area teleport list because motherfucking lag -- Urist*/
-/*I am far too lazy to make it a proper list of areas so I'll just make it run the usual telepot routine at the start of the game*/
-var/list/teleportlocs = list()
-
-/hook/startup/proc/setupTeleportLocs()
- for(var/area/AR in world)
- if(istype(AR, /area/shuttle) || istype(AR, /area/syndicate_station) || istype(AR, /area/wizard_station)) continue
- if(teleportlocs.Find(AR.name)) continue
- var/turf/picked = pick(get_area_turfs(AR.type))
- if (picked.z in using_map.station_levels)
- teleportlocs += AR.name
- teleportlocs[AR.name] = AR
-
- teleportlocs = sortAssoc(teleportlocs)
-
- return 1
-
-var/list/ghostteleportlocs = list()
-
-/hook/startup/proc/setupGhostTeleportLocs()
- for(var/area/AR in world)
- if(ghostteleportlocs.Find(AR.name)) continue
- if(istype(AR, /area/aisat) || istype(AR, /area/derelict) || istype(AR, /area/tdome) || istype(AR, /area/shuttle/specops/centcom))
- ghostteleportlocs += AR.name
- ghostteleportlocs[AR.name] = AR
- var/turf/picked = pick(get_area_turfs(AR.type))
- if (picked.z in using_map.player_levels)
- ghostteleportlocs += AR.name
- ghostteleportlocs[AR.name] = AR
-
- ghostteleportlocs = sortAssoc(ghostteleportlocs)
-
- return 1
-
/*-----------------------------------------------------------------------------*/
/////////
@@ -358,6 +282,7 @@ area/space/atmosalert()
/area/shuttle/trade
name = "\improper Trade Station"
icon_state = "red"
+ dynamic_lighting = 0
/area/shuttle/trade/centcom
name = "\improper Trade Shuttle CentCom"
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index 4673d0ef26..ba929f61ee 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -1,15 +1,49 @@
// Areas.dm
-
-
-// ===
/area
+ var/fire = null
+ var/atmos = 1
+ var/atmosalm = 0
+ var/poweralm = 1
+ var/party = null
+ level = null
+ name = "Unknown"
+ icon = 'icons/turf/areas.dmi'
+ icon_state = "unknown"
+ plane = PLANE_LIGHTING_ABOVE //In case we color them
+ luminosity = 0
+ mouse_opacity = 0
+ var/lightswitch = 1
+
+ var/eject = null
+
+ var/debug = 0
+ var/requires_power = 1
+ var/always_unpowered = 0 //this gets overriden to 1 for space in area/New()
+
+ var/power_equip = 1
+ var/power_light = 1
+ var/power_environ = 1
+ var/music = null
+ var/used_equip = 0
+ var/used_light = 0
+ var/used_environ = 0
+
+ var/has_gravity = 1
+ var/obj/machinery/power/apc/apc = null
+ var/no_air = null
+// var/list/lights // list of all lights on this area
+ var/list/all_doors = null //Added by Strumpetplaya - Alarm Change - Contains a list of doors adjacent to this area
+ var/firedoors_closed = 0
+ var/list/ambience = list('sound/ambience/ambigen1.ogg','sound/ambience/ambigen3.ogg','sound/ambience/ambigen4.ogg','sound/ambience/ambigen5.ogg','sound/ambience/ambigen6.ogg','sound/ambience/ambigen7.ogg','sound/ambience/ambigen8.ogg','sound/ambience/ambigen9.ogg','sound/ambience/ambigen10.ogg','sound/ambience/ambigen11.ogg','sound/ambience/ambigen12.ogg','sound/ambience/ambigen14.ogg')
+ var/list/forced_ambience = null
+ var/sound_env = STANDARD_STATION
+ var/turf/base_turf //The base turf type of the area, which can be used to override the z-level's base turf
var/global/global_uid = 0
var/uid
/area/New()
icon_state = ""
- layer = 10
uid = ++global_uid
all_areas += src
@@ -275,7 +309,7 @@ var/list/mob/living/forced_ambiance_list = new
chosen_ambiance = sound(chosen_ambiance, repeat = 1, wait = 0, volume = 25, channel = CHANNEL_AMBIENCE_FORCED)
L << chosen_ambiance
else
- L << sound(null, channel = 1)
+ L << sound(null, channel = CHANNEL_AMBIENCE_FORCED)
else if(src.ambience.len && prob(35))
if((world.time >= L.client.played + 600))
var/sound = pick(ambience)
@@ -345,3 +379,37 @@ var/list/mob/living/forced_ambiance_list = new
/area/drop_location()
CRASH("Bad op: area/drop_location() called")
+
+/*Adding a wizard area teleport list because motherfucking lag -- Urist*/
+/*I am far too lazy to make it a proper list of areas so I'll just make it run the usual telepot routine at the start of the game*/
+var/list/teleportlocs = list()
+
+/hook/startup/proc/setupTeleportLocs()
+ for(var/area/AR in world)
+ if(istype(AR, /area/shuttle) || istype(AR, /area/syndicate_station) || istype(AR, /area/wizard_station)) continue
+ if(teleportlocs.Find(AR.name)) continue
+ var/turf/picked = pick(get_area_turfs(AR.type))
+ if (picked.z in using_map.station_levels)
+ teleportlocs += AR.name
+ teleportlocs[AR.name] = AR
+
+ teleportlocs = sortAssoc(teleportlocs)
+
+ return 1
+
+var/list/ghostteleportlocs = list()
+
+/hook/startup/proc/setupGhostTeleportLocs()
+ for(var/area/AR in world)
+ if(ghostteleportlocs.Find(AR.name)) continue
+ if(istype(AR, /area/aisat) || istype(AR, /area/derelict) || istype(AR, /area/tdome) || istype(AR, /area/shuttle/specops/centcom))
+ ghostteleportlocs += AR.name
+ ghostteleportlocs[AR.name] = AR
+ var/turf/picked = pick(get_area_turfs(AR.type))
+ if (picked.z in using_map.player_levels)
+ ghostteleportlocs += AR.name
+ ghostteleportlocs[AR.name] = AR
+
+ ghostteleportlocs = sortAssoc(ghostteleportlocs)
+
+ return 1
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 9741abe957..983c92cdf5 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -1,5 +1,5 @@
/atom
- layer = 2
+ layer = TURF_LAYER //This was here when I got here. Why though?
var/level = 2
var/flags = 0
var/list/fingerprints
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index 0cd09b8a57..48ffacb335 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -1,5 +1,5 @@
/atom/movable
- layer = 3
+ layer = OBJ_LAYER
appearance_flags = TILE_BOUND|PIXEL_SCALE
var/last_move = null
var/anchored = 0
@@ -18,6 +18,7 @@
var/icon_scale = 1 // Used to scale icons up or down in update_transform().
var/old_x = 0
var/old_y = 0
+ var/datum/riding/riding_datum //VOREStation Add - Moved from /obj/vehicle
/atom/movable/Destroy()
. = ..()
@@ -37,6 +38,7 @@
if (pulledby.pulling == src)
pulledby.pulling = null
pulledby = null
+ qdel_null(riding_datum) //VOREStation Add
/atom/movable/Bump(var/atom/A, yes)
if(src.throwing)
diff --git a/code/game/atoms_movable_vr.dm b/code/game/atoms_movable_vr.dm
new file mode 100644
index 0000000000..0cc6d144be
--- /dev/null
+++ b/code/game/atoms_movable_vr.dm
@@ -0,0 +1,12 @@
+/atom/movable/proc/Bump_vr(var/atom/A, yes)
+ return
+
+/atom/movable/set_dir(newdir)
+ . = ..(newdir)
+ if(riding_datum)
+ riding_datum.handle_vehicle_offsets()
+
+/atom/movable/relaymove(mob/user, direction)
+ . = ..()
+ if(riding_datum)
+ riding_datum.handle_ride(user, direction)
diff --git a/code/game/gamemodes/cult/construct_spells.dm b/code/game/gamemodes/cult/construct_spells.dm
new file mode 100644
index 0000000000..f8ff57fc35
--- /dev/null
+++ b/code/game/gamemodes/cult/construct_spells.dm
@@ -0,0 +1,698 @@
+//cast_method flags, needs to be up to date with Technomancer's. They were, for some reason, not working outside it.
+#define CAST_USE 1 // Clicking the spell in your hand.
+#define CAST_MELEE 2 // Clicking an atom in melee range.
+#define CAST_RANGED 4 // Clicking an atom beyond melee range.
+#define CAST_THROW 8 // Throwing the spell and hitting an atom.
+#define CAST_COMBINE 16 // Clicking another spell with this spell.
+#define CAST_INNATE 32 // Activates upon verb usage, used for mobs without hands.
+
+//Aspects
+#define ASPECT_FIRE "fire" //Damage over time and raising body-temp. Firesuits protect from this.
+#define ASPECT_FROST "frost" //Slows down the affected, also involves imbedding with icicles. Winter coats protect from this.
+#define ASPECT_SHOCK "shock" //Energy-expensive, usually stuns. Insulated armor protects from this.
+#define ASPECT_AIR "air" //Mostly involves manipulation of atmos, useless in a vacuum. Magboots protect from this.
+#define ASPECT_FORCE "force" //Manipulates gravity to push things away or towards a location.
+#define ASPECT_TELE "tele" //Teleportation of self, other objects, or other people.
+#define ASPECT_DARK "dark" //Makes all those photons vanish using magic-- WITH SCIENCE. Used for sneaky stuff.
+#define ASPECT_LIGHT "light" //The opposite of dark, usually blinds, makes holo-illusions, or makes laser lightshows.
+#define ASPECT_BIOMED "biomed" //Mainly concerned with healing and restoration.
+#define ASPECT_EMP "emp" //Unused now.
+#define ASPECT_UNSTABLE "unstable" //Heavily RNG-based, causes instability to the victim.
+#define ASPECT_CHROMATIC "chromatic" //Used to combine with other spells.
+#define ASPECT_UNHOLY "unholy" //Involves the dead, blood, and most things against divine beings.
+
+//////////////////////////////Construct Spells/////////////////////////
+
+proc/findNullRod(var/atom/target)
+ if(istype(target,/obj/item/weapon/nullrod))
+ return 1
+ else if(target.contents)
+ for(var/atom/A in target.contents)
+ if(findNullRod(A))
+ return 1
+ return 0
+
+/spell/aoe_turf/conjure/construct
+ name = "Artificer"
+ desc = "This spell conjures a construct which may be controlled by Shades"
+
+ school = "conjuration"
+ charge_max = 600
+ spell_flags = 0
+ invocation = "none"
+ invocation_type = SpI_NONE
+ range = 0
+
+ summon_type = list(/obj/structure/constructshell)
+
+ hud_state = "artificer"
+
+/spell/aoe_turf/conjure/construct/lesser
+ charge_max = 1800
+ summon_type = list(/obj/structure/constructshell/cult)
+ hud_state = "const_shell"
+ override_base = "const"
+
+/spell/aoe_turf/conjure/floor
+ name = "Floor Construction"
+ desc = "This spell constructs a cult floor"
+
+ charge_max = 20
+ spell_flags = Z2NOCAST | CONSTRUCT_CHECK
+ invocation = "none"
+ invocation_type = SpI_NONE
+ range = 0
+ summon_type = list(/turf/simulated/floor/cult)
+
+ hud_state = "const_floor"
+
+/spell/aoe_turf/conjure/floor/conjure_animation(var/atom/movable/overlay/animation, var/turf/target)
+ animation.icon_state = "cultfloor"
+ flick("cultfloor",animation)
+ spawn(10)
+ qdel(animation)
+
+/spell/aoe_turf/conjure/wall
+ name = "Lesser Construction"
+ desc = "This spell constructs a cult wall"
+
+ charge_max = 100
+ spell_flags = Z2NOCAST | CONSTRUCT_CHECK
+ invocation = "none"
+ invocation_type = SpI_NONE
+ range = 0
+ summon_type = list(/turf/simulated/wall/cult)
+
+ hud_state = "const_wall"
+
+/spell/aoe_turf/conjure/wall/conjure_animation(var/atom/movable/overlay/animation, var/turf/target)
+ animation.icon_state = "cultwall"
+ flick("cultwall",animation)
+ spawn(10)
+ qdel(animation)
+
+/spell/aoe_turf/conjure/wall/reinforced
+ name = "Greater Construction"
+ desc = "This spell constructs a reinforced metal wall"
+
+ charge_max = 300
+ spell_flags = Z2NOCAST
+ invocation = "none"
+ invocation_type = SpI_NONE
+ range = 0
+ cast_delay = 50
+
+ summon_type = list(/turf/simulated/wall/r_wall)
+
+/spell/aoe_turf/conjure/soulstone
+ name = "Summon Soulstone"
+ desc = "This spell reaches into Nar-Sie's realm, summoning one of the legendary fragments across time and space"
+
+ charge_max = 3000
+ spell_flags = 0
+ invocation = "none"
+ invocation_type = SpI_NONE
+ range = 0
+
+ summon_type = list(/obj/item/device/soulstone)
+
+ hud_state = "const_stone"
+ override_base = "const"
+
+/spell/aoe_turf/conjure/pylon
+ name = "Red Pylon"
+ desc = "This spell conjures a fragile crystal from Nar-Sie's realm. Makes for a convenient light source."
+
+ charge_max = 200
+ spell_flags = CONSTRUCT_CHECK
+ invocation = "none"
+ invocation_type = SpI_NONE
+ range = 0
+
+ summon_type = list(/obj/structure/cult/pylon)
+
+ hud_state = "const_pylon"
+
+/spell/aoe_turf/conjure/pylon/cast(list/targets)
+ ..()
+ var/turf/spawn_place = pick(targets)
+ for(var/obj/structure/cult/pylon/P in spawn_place.contents)
+ if(P.isbroken)
+ P.repair(usr)
+ continue
+ return
+
+/spell/aoe_turf/conjure/door
+ name = "Stone Door"
+ desc = "This spell conjures a massive stone door."
+
+ charge_max = 100
+ spell_flags = CONSTRUCT_CHECK
+ invocation = "none"
+ invocation_type = SpI_NONE
+ range = 0
+
+ summon_type = list(/obj/structure/simple_door/cult)
+
+ hud_state = "const_door"
+
+/spell/aoe_turf/conjure/grille
+ name = "Arcane Grille"
+ desc = "This spell conjures an airtight grille."
+
+ charge_max = 100
+ spell_flags = CONSTRUCT_CHECK
+ invocation = "none"
+ invocation_type = SpI_NONE
+ range = 0
+
+ summon_type = list(/obj/structure/grille/cult)
+
+ hud_state = "const_grille"
+
+/spell/aoe_turf/conjure/forcewall/lesser
+ name = "Shield"
+ desc = "Allows you to pull up a shield to protect yourself and allies from incoming threats"
+
+ charge_max = 300
+ spell_flags = 0
+ invocation = "none"
+ invocation_type = SpI_NONE
+ range = 0
+ summon_type = list(/obj/effect/forcefield/cult)
+ duration = 200
+
+ hud_state = "const_juggwall"
+
+//Code for the Juggernaut construct's forcefield, that seemed like a good place to put it.
+/obj/effect/forcefield/cult
+ desc = "That eerie looking obstacle seems to have been pulled from another dimension through sheer force"
+ name = "Juggerwall"
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "m_shield_cult"
+ light_color = "#B40000"
+ light_range = 2
+
+/obj/effect/forcefield/cult/cultify()
+ return
+
+/spell/aoe_turf/knock/harvester
+ name = "Force Doors"
+ desc = "Mortal portals are no match for your occult might."
+
+ spell_flags = CONSTRUCT_CHECK
+
+ charge_max = 100
+ invocation = ""
+ invocation_type = "silent"
+ range = 4
+
+ hud_state = "const_knock"
+
+/spell/aoe_turf/knock/harvester/cast(list/targets)
+/* for(var/turf/T in targets) //Disintigrating doors is bad, okay.
+ for(var/obj/machinery/door/door in T.contents)
+ spawn door.cultify()
+ return */
+ for(var/turf/T in targets)
+ for(var/obj/machinery/door/door in T.contents)
+ spawn(1)
+ if(istype(door,/obj/machinery/door/airlock))
+ var/obj/machinery/door/airlock/AL = door
+ AL.locked = 0 //The spirits of the damned care not for your locks.
+ AL.welded = 0 //Or your welding tools.
+ else if(istype(door, /obj/machinery/door/firedoor))
+ var/obj/machinery/door/firedoor/FD = door
+ FD.blocked = 0
+ door.open(1)
+ return
+
+/*
+ *
+ * Self-targeting spells. Modifiers, auras, instants, etc.
+ *
+ */
+
+/spell/targeted/ethereal_jaunt/shift
+ name = "Phase Shift"
+ desc = "This spell allows you to pass through walls"
+
+ charge_max = 200
+ spell_flags = Z2NOCAST | INCLUDEUSER | CONSTRUCT_CHECK
+ invocation_type = SpI_NONE
+ range = -1
+ duration = 50 //in deciseconds
+
+ hud_state = "const_shift"
+
+/spell/targeted/ethereal_jaunt/shift/jaunt_disappear(var/atom/movable/overlay/animation, var/mob/living/target)
+ animation.icon_state = "phase_shift"
+ animation.dir = target.dir
+ flick("phase_shift",animation)
+
+/spell/targeted/ethereal_jaunt/shift/jaunt_reappear(var/atom/movable/overlay/animation, var/mob/living/target)
+ animation.icon_state = "phase_shift2"
+ animation.dir = target.dir
+ flick("phase_shift2",animation)
+
+/spell/targeted/ethereal_jaunt/shift/jaunt_steam(var/mobloc)
+ return
+
+/*
+ * Harvest has been disabled due to the lack of Nar'Sie. Here for posterity / future rework.
+ */
+
+/*
+/spell/targeted/harvest
+ name = "Harvest"
+ desc = "Back to where I come from, and you're coming with me."
+
+ school = "transmutation"
+ charge_max = 200
+ spell_flags = Z2NOCAST | CONSTRUCT_CHECK | INCLUDEUSER
+ invocation = ""
+ invocation_type = SpI_NONE
+ range = 0
+ max_targets = 0
+
+ overlay = 1
+ overlay_icon = 'icons/effects/effects.dmi'
+ overlay_icon_state = "rune_teleport"
+ overlay_lifespan = 0
+
+ hud_state = "const_harvest"
+
+/spell/targeted/harvest/cast(list/targets, mob/user)//because harvest is already a proc
+ ..()
+
+ var/destination = null
+ for(var/obj/singularity/narsie/large/N in narsie_list)
+ destination = N.loc
+ break
+ if(destination)
+ var/prey = 0
+ for(var/mob/living/M in targets)
+ if(!findNullRod(M))
+ M.forceMove(destination)
+ if(M != user)
+ prey = 1
+ user << "You warp back to Nar-Sie[prey ? " along with your prey":""]."
+ else
+ user << "...something's wrong!"//There shouldn't be an instance of Harvesters when Nar-Sie isn't in the world.
+*/
+
+/spell/targeted/fortify
+ name = "Fortify Shell"
+ desc = "Emit a field of energy around your shell to reduce incoming damage incredibly, while decreasing your mobility."
+
+ range = -1
+ school = "evocation"
+ charge_type = Sp_RECHARGE
+ invocation_type = SpI_NONE
+
+ spell_flags = CONSTRUCT_CHECK | INCLUDEUSER
+
+ hud_state = "const_fortify"
+ smoke_amt = 0
+
+ charge_max = 600
+
+/spell/targeted/fortify/cast(list/targets, mob/living/user)
+ if(findNullRod(user) || user.has_modifier_of_type(/datum/modifier/fortify))
+ charge_counter = 400
+ return
+ user.add_modifier(/datum/modifier/fortify, 1 MINUTES)
+
+/spell/targeted/occult_repair_aura
+ name = "Repair Aura"
+ desc = "Emit a field of energy around your shell to repair nearby constructs at range."
+
+ range = -1
+ school = "evocation"
+ charge_type = Sp_RECHARGE
+ invocation_type = SpI_NONE
+
+ spell_flags = CONSTRUCT_CHECK | INCLUDEUSER
+
+ hud_state = "const_repairaura"
+ smoke_amt = 0
+
+ charge_max = 600
+
+/spell/targeted/occult_repair_aura/cast(list/targets, mob/living/user)
+ if(findNullRod(user) || user.has_modifier_of_type(/datum/modifier/repair_aura))
+ charge_counter = 300
+ return
+ user.add_modifier(/datum/modifier/repair_aura, 30 SECONDS)
+
+/spell/targeted/ambush_mode
+ name = "Toggle Ambush"
+ desc = "Phase yourself mostly out of this reality, minimizing your combat ability, but allowing for employance of ambush tactics."
+
+ range = -1
+ school = "evocation"
+ charge_type = Sp_RECHARGE
+ invocation_type = SpI_NONE
+
+ spell_flags = CONSTRUCT_CHECK | INCLUDEUSER
+
+ hud_state = "const_ambush"
+ smoke_amt = 0
+
+ charge_max = 100
+
+/spell/targeted/ambush_mode/cast(list/targets, mob/living/user)
+ if(findNullRod(user))
+ charge_counter = 50
+ return
+ if(user.has_modifier_of_type(/datum/modifier/ambush))
+ user.remove_modifiers_of_type(/datum/modifier/ambush)
+ return
+ user.add_modifier(/datum/modifier/ambush, 0)
+
+/*
+ *
+ * These are the spells that place spell-objects into the construct's hands akin to technomancers.
+ *
+ */
+
+/spell/targeted/construct_advanced
+ name = "Base Construct Spell"
+ desc = "If you see this, please tell a developer!"
+
+ range = -1
+ school = "evocation"
+ charge_type = Sp_RECHARGE
+ invocation_type = SpI_NONE
+
+ spell_flags = CONSTRUCT_CHECK | INCLUDEUSER
+
+ hud_state = "const_rune"
+ smoke_amt = 0
+
+ charge_max = 10
+
+ var/obj/item/weapon/spell/construct/spell_obj = null //This is the var that determines what Technomancer-style spell is put into their hands.
+
+/spell/targeted/construct_advanced/cast(list/targets, mob/living/user)
+ if(!findNullRod(user))
+ user.place_spell_in_hand(spell_obj)
+
+/spell/targeted/construct_advanced/inversion_beam
+ name = "Inversion Beam"
+ desc = "Fire a searing beam of darkness at your foes."
+
+ hud_state = "const_beam"
+ spell_obj = /obj/item/weapon/spell/construct/projectile/inverted_beam
+
+/spell/targeted/construct_advanced/mend_acolyte
+ name = "Mend Acolyte"
+ desc = "Mend a target acolyte or construct over time."
+
+ charge_max = 100
+
+ hud_state = "const_mend"
+ spell_obj = /obj/item/weapon/spell/construct/mend_occult
+
+/spell/targeted/construct_advanced/agonizing_sphere
+ name = "Sphere of Agony"
+ desc = "Rend a portal into a plane of naught but pain at the target location."
+
+ charge_max = 100
+
+ hud_state = "const_harvest"
+ spell_obj = /obj/item/weapon/spell/construct/spawner/agonizing_sphere
+
+/spell/targeted/construct_advanced/slam
+ name = "Slam"
+ desc = "Empower your FIST."
+
+ charge_max = 300
+
+ hud_state = "const_fist"
+ spell_obj = /obj/item/weapon/spell/construct/slam
+
+/*
+ *
+ * These are the spell objects that go into the construct's hands.
+ *
+ */
+
+/*
+ * Base advanced construct spell types.
+ */
+
+/obj/item/weapon/spell/construct //Energy costs are in units of blood, in the event a cultist gets one of these.
+ name = "unholy energy"
+ desc = "Your hands appear to be screaming. This is a debug text, you should probably tell a developer!"
+ icon = 'icons/obj/spells.dmi'
+ icon_state = "generic"
+ item_icons = list(
+ slot_l_hand_str = 'icons/mob/items/lefthand_spells.dmi',
+ slot_r_hand_str = 'icons/mob/items/righthand_spells.dmi',
+ )
+ throwforce = 0
+ force = 0
+ show_examine = FALSE
+ owner = null
+ core = null
+ cast_methods = null // Controls how the spell is casted.
+ aspect = ASPECT_UNHOLY // Used for combining spells. Pretty much any cult spell is unholy.
+ toggled = 0 // Mainly used for overlays.
+ cooldown = 0 // If set, will add a cooldown overlay and adjust click delay. Must be a multiple of 5 for overlays.
+ cast_sound = null // Sound file played when this is used.
+ var/last_castcheck = null // The last time this spell was cast.
+
+/obj/item/weapon/spell/construct/New()
+ //..() //This kills the spell, because super on this calls the default spell's New, which checks for a core. Can't have that.
+ if(isliving(loc))
+ owner = loc
+ if(!owner)
+ qdel(src)
+ update_icon()
+
+/obj/item/weapon/spell/construct/adjust_instability(var/amount) //The only drawback to the boons of the geometer is the use of a mortal's blood as fuel. Constructs have already paid that price long ago.
+ return
+
+/obj/item/weapon/spell/construct/run_checks()
+ if(owner)
+ if((iscultist(owner) || istype(owner, /mob/living/simple_animal/construct)) && (world.time >= (last_castcheck + cooldown))) //Are they a cultist or a construct, and has the cooldown time passed?
+ last_castcheck = world.time
+ return 1
+ return 0
+
+/obj/item/weapon/spell/construct/pay_energy(var/amount)
+ if(owner)
+ if(istype(owner, /mob/living/simple_animal/construct))
+ return 1
+ if(iscultist(owner) && pay_blood(amount))
+ return 1
+ return 0
+
+/obj/item/weapon/spell/construct/proc/pay_blood(var/amount) //If, for some reason, this is put into the hands of a cultist, by a talisnam or whatever.
+ if(ishuman(owner))
+ var/mob/living/carbon/human/H = owner
+ if(!H.should_have_organ(O_HEART))
+ return 1
+ if(H.vessel.remove_reagent("blood", amount))
+ return 1
+ return 0
+
+/obj/item/weapon/spell/construct/afterattack(atom/target, mob/user, proximity_flag, click_parameters) //Not overriding it caused runtimes, because cooldown checked for core.
+ if(!run_checks())
+ return
+ if(!proximity_flag)
+ if(cast_methods & CAST_RANGED)
+ on_ranged_cast(target, user)
+ else
+ if(istype(target, /obj/item/weapon/spell))
+ var/obj/item/weapon/spell/spell = target
+ if(spell.cast_methods & CAST_COMBINE)
+ spell.on_combine_cast(src, user)
+ return
+ if(cast_methods & CAST_MELEE)
+ on_melee_cast(target, user)
+ else if(cast_methods & CAST_RANGED) //Try to use a ranged method if a melee one doesn't exist.
+ on_ranged_cast(target, user)
+ if(cooldown)
+ var/effective_cooldown = round(cooldown, 5)
+ user.setClickCooldown(effective_cooldown)
+ flick("cooldown_[effective_cooldown]",src)
+
+/obj/item/weapon/spell/construct/projectile //This makes me angry, but we need the template, and we can't use it because special check overrides on the base.
+ name = "construct projectile template"
+ icon_state = "generic"
+ desc = "This is a generic template that shoots projectiles. If you can read this, the game broke!"
+ cast_methods = CAST_RANGED
+ var/obj/item/projectile/spell_projectile = null
+ var/pre_shot_delay = 0
+ var/fire_sound = null
+ var/energy_cost_per_shot = 5
+
+/obj/item/weapon/spell/construct/projectile/on_ranged_cast(atom/hit_atom, mob/living/user)
+ if(set_up(hit_atom, user))
+ var/obj/item/projectile/new_projectile = make_projectile(spell_projectile, user)
+ new_projectile.launch(hit_atom)
+ log_and_message_admins("has casted [src] at \the [hit_atom].")
+ if(fire_sound)
+ playsound(get_turf(src), fire_sound, 75, 1)
+ return 1
+ return 0
+
+/obj/item/weapon/spell/construct/projectile/proc/make_projectile(obj/item/projectile/projectile_type, mob/living/user)
+ var/obj/item/projectile/P = new projectile_type(get_turf(user))
+ return P
+
+/obj/item/weapon/spell/construct/projectile/proc/set_up(atom/hit_atom, mob/living/user)
+ if(spell_projectile)
+ if(pay_energy(energy_cost_per_shot))
+ if(pre_shot_delay)
+ var/image/target_image = image(icon = 'icons/obj/spells.dmi', loc = get_turf(hit_atom), icon_state = "target")
+ user << target_image
+ user.Stun(pre_shot_delay / 10)
+ sleep(pre_shot_delay)
+ qdel(target_image)
+ if(owner)
+ return TRUE
+ return FALSE // We got dropped before the firing occured.
+ return TRUE // No delay, no need to check.
+ return FALSE
+
+/obj/item/weapon/spell/construct/spawner
+ name = "spawner template"
+ desc = "If you see me, someone messed up."
+ icon_state = "darkness"
+ cast_methods = CAST_RANGED
+ var/obj/effect/spawner_type = null
+
+/obj/item/weapon/spell/construct/spawner/on_ranged_cast(atom/hit_atom, mob/user)
+ var/turf/T = get_turf(hit_atom)
+ if(T)
+ new spawner_type(T)
+ to_chat(user, "You shift \the [src] onto \the [T].")
+ log_and_message_admins("has casted [src] at [T.x],[T.y],[T.z].")
+ qdel(src)
+
+//Harvester Laser.
+
+/obj/item/weapon/spell/construct/projectile/inverted_beam
+ name = "inversion beam"
+ icon_state = "generic"
+ desc = "Your manipulators fire searing beams of inverted light."
+ cast_methods = CAST_RANGED
+ spell_projectile = /obj/item/projectile/beam/inversion
+ pre_shot_delay = 0
+ cooldown = 5
+ fire_sound = 'sound/weapons/spiderlunge.ogg'
+
+/obj/item/projectile/beam/inversion
+ name = "inversion beam"
+ icon_state = "invert"
+ fire_sound = 'sound/weapons/spiderlunge.ogg'
+ damage = 15
+ damage_type = BURN
+ check_armour = "laser"
+ armor_penetration = 60
+ light_range = 2
+ light_power = -2
+ light_color = "#FFFFFF"
+
+ muzzle_type = /obj/effect/projectile/inversion/muzzle
+ tracer_type = /obj/effect/projectile/inversion/tracer
+ impact_type = /obj/effect/projectile/inversion/impact
+
+//Harvester Pain Orb
+
+/obj/item/weapon/spell/construct/spawner/agonizing_sphere
+ name = "sphere of agony"
+ desc = "Call forth a portal to a dimension of naught but pain at your target."
+
+ spawner_type = /obj/effect/temporary_effect/pulsar/agonizing_sphere
+
+/obj/item/weapon/spell/construct/spawner/agonizing_sphere/on_ranged_cast(atom/hit_atom, mob/user)
+ if(within_range(hit_atom) && pay_energy(10))
+ ..()
+
+/obj/item/weapon/spell/construct/spawner/agonizing_sphere/on_throw_cast(atom/hit_atom, mob/user)
+ pay_energy(5)
+ if(isliving(hit_atom))
+ var/mob/living/L = hit_atom
+ L.add_modifier(/datum/modifier/agonize, 10 SECONDS)
+
+/obj/effect/temporary_effect/pulsar/agonizing_sphere
+ name = "agonizing sphere"
+ desc = "A portal to some hellish place. Its screams wrack your body with pain.."
+ icon_state = "red_static_sphere"
+ time_to_die = null
+ light_range = 4
+ light_power = 5
+ light_color = "#FF0000"
+ pulses_remaining = 10
+
+/obj/effect/temporary_effect/pulsar/agonizing_sphere/pulse_loop()
+ while(pulses_remaining)
+ sleep(1 SECONDS)
+ spawn()
+ for(var/mob/living/L in view(4,src))
+ if(!iscultist(L) && !istype(L, /mob/living/simple_animal/construct))
+ L.add_modifier(/datum/modifier/agonize, 2 SECONDS)
+ if(L.isSynthetic())
+ to_chat(L, "Your chassis warps as the [src] pulses!")
+ L.adjustFireLoss(4)
+ pulses_remaining--
+ qdel(src)
+
+//Artificer Heal
+
+/obj/item/weapon/spell/construct/mend_occult
+ name = "mend acolyte"
+ desc = "Mend the wounds of a cultist, or construct, over time."
+ icon_state = "mend_wounds"
+ cast_methods = CAST_MELEE
+ aspect = ASPECT_UNHOLY
+ light_color = "#FF5C5C"
+ light_power = -2
+
+/obj/item/weapon/spell/construct/mend_occult/on_melee_cast(atom/hit_atom, mob/living/user, def_zone)
+ if(isliving(hit_atom))
+ var/mob/living/L = hit_atom
+ L.add_modifier(/datum/modifier/mend_occult, 150)
+ qdel(src)
+
+//Juggernaut + Behemoth Slam
+/obj/item/weapon/spell/construct/slam
+ name = "slam"
+ desc = "Empower your FIST, to send an opponent flying."
+ icon_state = "toggled_old"
+ cast_methods = CAST_MELEE
+ aspect = ASPECT_UNHOLY
+ light_color = "#FF5C5C"
+ light_power = -2
+ cooldown = 15
+
+/obj/item/weapon/spell/construct/slam/on_melee_cast(atom/hit_atom, mob/living/user, def_zone)
+ var/attack_message = "slams"
+ if(istype(user, /mob/living/simple_animal))
+ var/mob/living/simple_animal/S = user
+ attack_message = pick(S.attacktext)
+ if(isliving(hit_atom))
+ var/mob/living/L = hit_atom
+ L.visible_message("\The [user] [attack_message] \the [L], sending them flying!")
+ playsound(src, "punch", 50, 1)
+ L.Weaken(2)
+ L.adjustBruteLoss(rand(30, 50))
+ var/throwdir = get_dir(src, L)
+ L.throw_at(get_edge_target_turf(L, throwdir), 3, 1, src)
+ if(istype(hit_atom, /turf/simulated/wall))
+ var/turf/simulated/wall/W = hit_atom
+ user.visible_message("\The [user] rears its fist, preparing to hit \the [W]!")
+ var/windup = cooldown
+ if(W.reinf_material)
+ windup = cooldown * 2
+ if(do_after(user, windup))
+ W.visible_message("\The [user] [attack_message] \the [W], obliterating it!")
+ W.dismantle_wall(1)
+ else
+ user.visible_message("\The [user] lowers its fist.")
+ return
+ qdel(src)
\ No newline at end of file
diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm
index cecb7b87c7..9d8eb8dc91 100644
--- a/code/game/gamemodes/cult/cult_items.dm
+++ b/code/game/gamemodes/cult/cult_items.dm
@@ -14,20 +14,21 @@
return
/obj/item/weapon/melee/cultblade/attack(mob/living/M, mob/living/user, var/target_zone)
- if(iscultist(user))
+ if(iscultist(user) && !istype(user, /mob/living/simple_animal/construct))
return ..()
var/zone = (user.hand ? "l_arm":"r_arm")
if(ishuman(user))
var/mob/living/carbon/human/H = user
var/obj/item/organ/external/affecting = H.get_organ(zone)
- user << "An unexplicable force rips through your [affecting.name], tearing the sword from your grasp!"
+ to_chat(user, "An inexplicable force rips through your [affecting.name], tearing the sword from your grasp!")
+ //random amount of damage between half of the blade's force and the full force of the blade.
+ user.apply_damage(rand(force/2, force), BRUTE, zone, 0, sharp=1, edge=1)
+ user.Weaken(5)
+ else if(!istype(user, /mob/living/simple_animal/construct))
+ to_chat(user, "An inexplicable force rips through you, tearing the sword from your grasp!")
else
- user << "An unexplicable force rips through you, tearing the sword from your grasp!"
-
- //random amount of damage between half of the blade's force and the full force of the blade.
- user.apply_damage(rand(force/2, force), BRUTE, zone, 0, sharp=1, edge=1)
- user.Weaken(5)
+ to_chat(user, "The blade hisses, forcing itself from your manipulators. \The [src] will only allow mortals to wield it against foes, not kin.")
user.drop_from_inventory(src, src.loc)
throw_at(get_edge_target_turf(src, pick(alldirs)), rand(1,3), throw_speed)
@@ -38,10 +39,11 @@
return 1
/obj/item/weapon/melee/cultblade/pickup(mob/living/user as mob)
- if(!iscultist(user))
- user << "An overwhelming feeling of dread comes over you as you pick up the cultist's sword. It would be wise to be rid of this blade quickly."
+ if(!iscultist(user) && !istype(user, /mob/living/simple_animal/construct))
+ to_chat(user, "An overwhelming feeling of dread comes over you as you pick up the cultist's sword. It would be wise to be rid of this blade quickly.")
user.make_dizzy(120)
-
+ if(istype(user, /mob/living/simple_animal/construct))
+ to_chat(user, "\The [src] hisses, as it is discontent with your acquisition of it. It would be wise to return it to a worthy mortal quickly.")
/obj/item/clothing/head/culthood
name = "cult hood"
diff --git a/code/game/gamemodes/endgame/supermatter_cascade/portal.dm b/code/game/gamemodes/endgame/supermatter_cascade/portal.dm
index fb4888ee20..7f7310f996 100644
--- a/code/game/gamemodes/endgame/supermatter_cascade/portal.dm
+++ b/code/game/gamemodes/endgame/supermatter_cascade/portal.dm
@@ -10,7 +10,7 @@
announce=0
cause_hell=0
- layer=LIGHTING_LAYER+2 // ITS SO BRIGHT
+ plane = PLANE_LIGHTING_ABOVE // ITS SO BRIGHT
consume_range = 6
@@ -38,13 +38,13 @@
var/mob/living/L = A
if(L.buckled && istype(L.buckled,/obj/structure/bed/))
var/turf/O = L.buckled
- do_teleport(O, pick(endgame_safespawns))
+ do_teleport(O, pick(endgame_safespawns), local = FALSE) //VOREStation Edit
L.loc = O.loc
else
- do_teleport(L, pick(endgame_safespawns)) //dead-on precision
+ do_teleport(L, pick(endgame_safespawns), local = FALSE) //dead-on precision //VOREStation Edit
else if (istype(A, /obj/mecha/))
- do_teleport(A, pick(endgame_safespawns)) //dead-on precision
+ do_teleport(A, pick(endgame_safespawns), local = FALSE) //dead-on precision //VOREStation Edit
else if (isturf(A))
var/turf/T = A
@@ -79,7 +79,8 @@
var/turf/T_mob = get_turf(src)
if((R.z == T_mob.z) && (get_dist(R,T_mob) <= (R.consume_range+10)) && !(R in view(T_mob)))
if(!riftimage)
- riftimage = image('icons/obj/rift.dmi',T_mob,"rift",LIGHTING_LAYER+2,1)
+ riftimage = image('icons/obj/rift.dmi',T_mob,"rift",1,1)
+ riftimage.plane = PLANE_LIGHTING_ABOVE
riftimage.mouse_opacity = 0
var/new_x = 32 * (R.x - T_mob.x) + R.pixel_x
diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm
index 77ee16063e..84cbb4d904 100644
--- a/code/game/gamemodes/meteor/meteors.dm
+++ b/code/game/gamemodes/meteor/meteors.dm
@@ -140,6 +140,7 @@
SpinAnimation()
/obj/effect/meteor/Bump(atom/A)
+ if(attempt_vr(src,"Bump_vr",list(A))) return //VOREStation Edit - allows meteors to be deflected by baseball bats
if(A)
if(A.handle_meteor_impact(src)) // Used for special behaviour when getting hit specifically by a meteor, like a shield.
ram_turf(get_turf(A))
diff --git a/code/game/gamemodes/meteor/meteors_vr.dm b/code/game/gamemodes/meteor/meteors_vr.dm
new file mode 100644
index 0000000000..6c24416b39
--- /dev/null
+++ b/code/game/gamemodes/meteor/meteors_vr.dm
@@ -0,0 +1,10 @@
+/obj/effect/meteor/Bump_vr(atom/A)//BATTER UP
+ if(istype(A, /mob/living/carbon))
+ var/mob/living/carbon/batter = A
+ var/obj/item/I = batter.get_active_hand()
+ if(!batter.stat && istype(I, /obj/item/weapon/material/twohanded/baseballbat))
+ batter.do_attack_animation(src)
+ batter.visible_message("[batter] deflects [src] with [I]]! Home run!", "You deflect [src] with [I]! Home run!")
+ walk_away(src, batter, 100, 1)
+ return TRUE
+ return
diff --git a/code/game/gamemodes/technomancer/spell_objs.dm b/code/game/gamemodes/technomancer/spell_objs.dm
index 2a917b4fd8..681d29da50 100644
--- a/code/game/gamemodes/technomancer/spell_objs.dm
+++ b/code/game/gamemodes/technomancer/spell_objs.dm
@@ -19,6 +19,7 @@
#define ASPECT_EMP "emp" //Unused now.
#define ASPECT_UNSTABLE "unstable" //Heavily RNG-based, causes instability to the victim.
#define ASPECT_CHROMATIC "chromatic" //Used to combine with other spells.
+#define ASPECT_UNHOLY "unholy" //Involves the dead, blood, and most things against divine beings.
/obj/item/weapon/spell
name = "glowing particles"
diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm
index bde825fcf3..aa9f131b50 100644
--- a/code/game/jobs/job_controller.dm
+++ b/code/game/jobs/job_controller.dm
@@ -413,7 +413,8 @@ var/global/datum/controller/occupations/job_master
job.equip_backpack(H)
// job.equip_survival(H)
job.apply_fingerprints(H)
- H.equip_post_job()
+ if(job.title != "Cyborg" && job.title != "AI")
+ H.equip_post_job()
//If some custom items could not be equipped before, try again now.
for(var/thing in custom_equip_leftovers)
diff --git a/code/game/machinery/Beacon.dm b/code/game/machinery/Beacon.dm
index c59c67c300..b34d1565a0 100644
--- a/code/game/machinery/Beacon.dm
+++ b/code/game/machinery/Beacon.dm
@@ -4,7 +4,7 @@
name = "Bluespace Gigabeacon"
desc = "A device that draws power from bluespace and creates a permanent tracking beacon."
level = 1 // underfloor
- layer = 2.5
+ layer = UNDER_JUNK_LAYER
anchored = 1
use_power = 1
idle_power_usage = 0
diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm
index 0ea5527df2..dd79d5acc1 100644
--- a/code/game/machinery/ai_slipper.dm
+++ b/code/game/machinery/ai_slipper.dm
@@ -2,7 +2,6 @@
name = "\improper AI Liquid Dispenser"
icon = 'icons/obj/device.dmi'
icon_state = "motion0"
- layer = 3
anchored = 1.0
use_power = 1
idle_power_usage = 10
diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm
index 92004f9afe..84d00eff04 100644
--- a/code/game/machinery/atmoalter/portable_atmospherics.dm
+++ b/code/game/machinery/atmoalter/portable_atmospherics.dm
@@ -1,6 +1,7 @@
/obj/machinery/portable_atmospherics
name = "atmoalter"
use_power = 0
+ layer = OBJ_LAYER // These are mobile, best not be under everything.
var/datum/gas_mixture/air_contents = new
var/obj/machinery/atmospherics/portables_connector/connected_port
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index c25b3448bd..1496ca1a1f 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -6,7 +6,8 @@
use_power = 2
idle_power_usage = 5
active_power_usage = 10
- layer = 5
+ plane = MOB_PLANE
+ layer = ABOVE_MOB_LAYER
var/list/network = list(NETWORK_DEFAULT)
var/c_tag = null
@@ -141,6 +142,18 @@
add_hiddenprint(user)
destroy()
+/obj/machinery/camera/attack_generic(mob/user as mob)
+ if(isanimal(user))
+ var/mob/living/simple_animal/S = user
+ set_status(0)
+ S.do_attack_animation(src)
+ S.setClickCooldown(user.get_attack_speed())
+ visible_message("\The [user] [pick(S.attacktext)] \the [src]!")
+ playsound(src.loc, S.attack_sound, 100, 1)
+ add_hiddenprint(user)
+ destroy()
+ ..()
+
/obj/machinery/camera/attackby(obj/item/W as obj, mob/living/user as mob)
update_coverage()
// DECONSTRUCTION
diff --git a/code/game/machinery/camera/camera_vr.dm b/code/game/machinery/camera/camera_vr.dm
index fcef1edeb9..1111b2773c 100644
--- a/code/game/machinery/camera/camera_vr.dm
+++ b/code/game/machinery/camera/camera_vr.dm
@@ -1,7 +1,7 @@
/obj/machinery/camera
- layer = 4
+ layer = BELOW_MOB_LAYER
/obj/machinery/camera/New()
..()
- if (dir == 1) // idk why the fuck dir is not 2
- layer = 5
\ No newline at end of file
+ if (dir == NORTH)
+ layer = ABOVE_MOB_LAYER
\ No newline at end of file
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index 2f0fce2bd3..bdf4e95fe0 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -271,6 +271,8 @@
/obj/machinery/computer/arcade/battle/emag_act(var/charges, var/mob/user)
if(!emagged)
+ to_chat(user, span("notice","You override the cheat code menu and skip to Cheat #[rand(1, 50)]: Hyper-Lethal Mode."))
+
temp = "If you die in the game, you die for real!"
player_hp = 30
player_mp = 10
@@ -399,18 +401,18 @@
dat += "
You ran out of food and starved."
if(emagged)
user.nutrition = 0 //yeah you pretty hongry
- user << "Your body instantly contracts to that of one who has not eaten in months. Agonizing cramps seize you as you fall to the floor."
+ to_chat(user, span("danger", "Your body instantly contracts to that of one who has not eaten in months. Agonizing cramps seize you as you fall to the floor."))
if(fuel <= 0)
dat += "
You ran out of fuel, and drift, slowly, into a star."
if(emagged)
var/mob/living/M = user
M.adjust_fire_stacks(5)
- M.IgniteMob() //flew into a star, so you're on fire
- user << "You feel an immense wave of heat emanate from \the [src]. Your skin bursts into flames."
+ M.IgniteMob() //flew into a star, so you're on fire
+ to_chat(user,span("danger", "You feel an immense wave of heat emanate from \the [src]. Your skin bursts into flames."))
dat += "