diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm
index fc074184d8..8d3aa08493 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 = PIPES_LAYER
+ plane = PLATING_PLANE
var/pipe_flags = PIPING_DEFAULT_LAYER_ONLY // Allow other layers by exception basis.
var/connect_types = CONNECT_TYPE_REGULAR
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..4658b9c40c 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
diff --git a/code/__defines/_planes+layers.dm b/code/__defines/_planes+layers.dm
index f0c4d4cbc6..a044b16c85 100644
--- a/code/__defines/_planes+layers.dm
+++ b/code/__defines/_planes+layers.dm
@@ -40,39 +40,73 @@ 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 PLANE_ADMIN1 -92 //Purely for shenanigans
+#define PLANE_ADMIN2 -91 //And adminbuse
+#define PLANE_ADMIN3 -90 //And generating salt
+
+#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 WIRES_LAYER 2.2 // Under objects, even when planeswapped
+ #define PIPES_LAYER 2.3 // Under objects, even when planeswapped
+ #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 AREA_LAYER 1 //For easy recordkeeping; this is a byond define
+
//#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 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 PLANE_ADMIN1 3 //Purely for shenanigans (below lighting)
+ #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_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
@@ -93,8 +127,6 @@ What is the naming convention for planes or layers?
#define PLANE_MESONS 30 //Stuff seen with mesons, like open ceilings. This is 30 for downstreams.
-#define PLANE_ADMIN2 33 //Purely for shenanigans (above lighting)
-
//Fullscreen overlays under inventory
#define PLANE_FULLSCREEN 90 //Blindness, mesons, druggy, etc
#define OBFUSCATION_LAYER 5 //Where images covering the view for eyes are put
@@ -111,8 +143,6 @@ What is the naming convention for planes or layers?
#define LAYER_HUD_ABOVE 4 //Things that reside above items (highlights)
#define PLANE_PLAYER_HUD_ITEMS 96 //Separate layer with which to apply colorblindness
-#define PLANE_ADMIN3 99 //Purely for shenanigans (above HUD)
-
//////////////////////////
/atom/proc/hud_layerise()
@@ -125,4 +155,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/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/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/_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..325a4a4b7e 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
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/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/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/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/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 74df297775..d4fa56d495 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
-
/*-----------------------------------------------------------------------------*/
/////////
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..5311d642a2 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
diff --git a/code/game/gamemodes/endgame/supermatter_cascade/portal.dm b/code/game/gamemodes/endgame/supermatter_cascade/portal.dm
index fb4888ee20..2c47b8e162 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
@@ -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/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/camera/camera.dm b/code/game/machinery/camera/camera.dm
index c25b3448bd..30955879f8 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
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/supply.dm b/code/game/machinery/computer/supply.dm
index c56a9a996c..e76f4db468 100644
--- a/code/game/machinery/computer/supply.dm
+++ b/code/game/machinery/computer/supply.dm
@@ -40,8 +40,7 @@
\nRequest items
View approved orders
View requests
- "} // VOREStation Edit - Export reports
- dat += {"\nView export report
+ \nView export report
Close"}
user << browse(dat, "window=computer;size=575x450")
@@ -200,8 +199,7 @@
\nOrder items
\n
\nView requests
\n
\nView orders
\n
- "} // VOREStation Edit - Export reports
- dat += {"\nView export report
\n
+ \nView export report
\n
\nClose"}
@@ -371,7 +369,6 @@
temp += "
Clear list"
temp += "
OK"
- //VOREStation Edit - Export reports
else if (href_list["viewexport"])
temp = "Previous shuttle export report:
"
var/cratecount = 0
@@ -383,7 +380,6 @@
temp += "[EC.name] exported for [EC.value] supply points
"
temp += "
Shipment of [cratecount] crates exported for [totalvalue] supply points.
"
temp += "
OK"
- //VOREStation Edit End
else if (href_list["rreq"])
var/ordernum = text2num(href_list["rreq"])
diff --git a/code/game/machinery/computer3/lapvend.dm b/code/game/machinery/computer3/lapvend.dm
index e1e70ca3a7..cbfa8686bc 100644
--- a/code/game/machinery/computer3/lapvend.dm
+++ b/code/game/machinery/computer3/lapvend.dm
@@ -3,7 +3,6 @@
desc = "A generic vending machine."
icon = 'icons/obj/vending.dmi'
icon_state = "robotics"
- layer = 2.9
anchored = 1
density = 1
var/obj/machinery/computer3/laptop/vended/newlap = null
diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm
index 6709cb2363..f7ab7e7a7e 100644
--- a/code/game/machinery/cryo.dm
+++ b/code/game/machinery/cryo.dm
@@ -6,13 +6,15 @@
icon_state = "pod_preview"
density = 1
anchored = 1.0
- layer = 2.8
+ layer = UNDER_JUNK_LAYER
interact_offline = 1
var/on = 0
use_power = 1
idle_power_usage = 20
active_power_usage = 200
+ buckle_lying = FALSE
+ buckle_dir = SOUTH
var/temperature_archived
var/mob/living/carbon/occupant = null
@@ -20,12 +22,29 @@
var/current_heat_capacity = 50
+ var/image/fluid
+
/obj/machinery/atmospherics/unary/cryo_cell/New()
..()
icon = 'icons/obj/cryogenics_split.dmi'
- update_icon()
+ icon_state = "base"
initialize_directions = dir
+/obj/machinery/atmospherics/unary/cryo_cell/initialize()
+ . = ..()
+ var/image/tank = image(icon,"tank")
+ tank.alpha = 200
+ tank.pixel_y = 18
+ tank.plane = MOB_PLANE
+ tank.layer = MOB_LAYER+0.2 //Above fluid
+ fluid = image(icon, "tube_filler")
+ fluid.pixel_y = 18
+ fluid.alpha = 200
+ fluid.plane = MOB_PLANE
+ fluid.layer = MOB_LAYER+0.1 //Below glass, above mob
+ add_overlay(tank)
+ update_icon()
+
/obj/machinery/atmospherics/unary/cryo_cell/Destroy()
var/turf/T = src.loc
T.contents += contents
@@ -153,6 +172,7 @@
if(beaker)
beaker.loc = get_step(src.loc, SOUTH)
beaker = null
+ update_icon()
if(href_list["ejectOccupant"])
if(!occupant || isslime(usr) || ispAI(usr))
@@ -172,6 +192,7 @@
user.drop_item()
G.loc = src
user.visible_message("[user] adds \a [G] to \the [src]!", "You add \a [G] to \the [src]!")
+ update_icon()
else if(istype(G, /obj/item/weapon/grab))
var/obj/item/weapon/grab/grab = G
if(!ismob(grab.affecting))
@@ -191,40 +212,23 @@
put_mob(target)
/obj/machinery/atmospherics/unary/cryo_cell/update_icon()
- overlays.Cut()
- icon_state = "pod[on]"
- var/image/I
-
- I = image(icon, "pod[on]_top")
- I.layer = 5 // this needs to be fairly high so it displays over most things, but it needs to be under lighting (at 10)
- I.pixel_z = 32
- overlays += I
-
- if(occupant)
- var/image/pickle = image(occupant.icon, occupant.icon_state)
- pickle.overlays = occupant.overlays
- pickle.pixel_z = 18
- pickle.layer = 5
- overlays += pickle
-
- I = image(icon, "lid[on]")
- I.layer = 5
- overlays += I
-
- I = image(icon, "lid[on]_top")
- I.layer = 5
- I.pixel_z = 32
- overlays += I
+ cut_overlay(fluid)
+ fluid.color = null
+ if(on)
+ if(beaker)
+ fluid.color = beaker.reagents.get_color()
+ add_overlay(fluid)
/obj/machinery/atmospherics/unary/cryo_cell/proc/process_occupant()
if(air_contents.total_moles < 10)
return
if(occupant)
- if(occupant.stat == 2)
+ if(occupant.stat >= DEAD)
return
occupant.bodytemperature += 2*(air_contents.temperature - occupant.bodytemperature)*current_heat_capacity/(current_heat_capacity + air_contents.heat_capacity())
occupant.bodytemperature = max(occupant.bodytemperature, air_contents.temperature) // this is so ugly i'm sorry for doing it i'll fix it later i promise
- occupant.stat = 1
+ occupant.stat = UNCONSCIOUS
+ occupant.dir = SOUTH
if(occupant.bodytemperature < T0C)
occupant.sleeping = max(5, (1/occupant.bodytemperature)*2000)
occupant.Paralyse(max(5, (1/occupant.bodytemperature)*3000))
@@ -273,14 +277,16 @@
if(occupant.client)
occupant.client.eye = occupant.client.mob
occupant.client.perspective = MOB_PERSPECTIVE
+ vis_contents -= occupant
+ occupant.pixel_x = occupant.default_pixel_x
+ occupant.pixel_y = occupant.default_pixel_y
occupant.loc = get_step(src.loc, SOUTH) //this doesn't account for walls or anything, but i don't forsee that being a problem.
if(occupant.bodytemperature < 261 && occupant.bodytemperature >= 70) //Patch by Aranclanos to stop people from taking burn damage after being ejected
occupant.bodytemperature = 261 // Changed to 70 from 140 by Zuhayr due to reoccurance of bug.
-// occupant.metabslow = 0
+ unbuckle_mob(occupant, force = TRUE)
occupant = null
current_heat_capacity = initial(current_heat_capacity)
update_use_power(1)
- update_icon()
return
/obj/machinery/atmospherics/unary/cryo_cell/proc/put_mob(mob/living/carbon/M as mob)
if(stat & (NOPOWER|BROKEN))
@@ -307,6 +313,9 @@
if(M.health > -100 && (M.health < 0 || M.sleeping))
M << "You feel a cold liquid surround you. Your skin starts to freeze up."
occupant = M
+ buckle_mob(occupant, forced = TRUE, check_loc = FALSE)
+ vis_contents |= occupant
+ occupant.pixel_y += 19
current_heat_capacity = HEAT_CAPACITY_HUMAN
update_use_power(2)
// M.metabslow = 1
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 344f1c9a10..23191b6beb 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -446,8 +446,8 @@
desc = "It's an extra resilient airlock intended for spacefaring vessels."
icon = 'icons/obj/doors/shuttledoors.dmi'
explosion_resistance = 20
- opacity = 0 //VOREStation Edit - They have windows.
- glass = 1 //VOREStation Edit - They have windows.
+ opacity = 0
+ glass = 1
assembly_type = /obj/structure/door_assembly/door_assembly_voidcraft
// Airlock opens from top-bottom instead of left-right.
diff --git a/code/game/machinery/holosign.dm b/code/game/machinery/holosign.dm
index 215238a80b..39a91b8aff 100644
--- a/code/game/machinery/holosign.dm
+++ b/code/game/machinery/holosign.dm
@@ -4,7 +4,7 @@
desc = "Small wall-mounted holographic projector"
icon = 'icons/obj/holosign.dmi'
icon_state = "sign_off"
- layer = 4
+ plane = MOB_PLANE
use_power = 1
idle_power_usage = 2
active_power_usage = 4
diff --git a/code/game/machinery/kitchen/icecream.dm b/code/game/machinery/kitchen/icecream.dm
index fab6319e26..09cb3289ed 100644
--- a/code/game/machinery/kitchen/icecream.dm
+++ b/code/game/machinery/kitchen/icecream.dm
@@ -172,7 +172,6 @@
name = "ice cream cone"
desc = "Delicious waffle cone, but no ice cream."
icon_state = "icecream_cone_waffle" //default for admin-spawned cones, href_list["cone"] should overwrite this all the time
- layer = 3.1
bitesize = 3
var/ice_creamed = 0
diff --git a/code/game/machinery/kitchen/microwave.dm b/code/game/machinery/kitchen/microwave.dm
index fa81ff1620..3da253e682 100644
--- a/code/game/machinery/kitchen/microwave.dm
+++ b/code/game/machinery/kitchen/microwave.dm
@@ -2,7 +2,6 @@
name = "microwave"
icon = 'icons/obj/kitchen.dmi'
icon_state = "mw"
- layer = 2.9
density = 1
anchored = 1
use_power = 1
diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm
index a2f5c00ad1..b2c3d21b68 100644
--- a/code/game/machinery/kitchen/smartfridge.dm
+++ b/code/game/machinery/kitchen/smartfridge.dm
@@ -4,7 +4,6 @@
name = "\improper SmartFridge"
icon = 'icons/obj/vending.dmi'
icon_state = "smartfridge"
- layer = 2.9
density = 1
anchored = 1
use_power = 1
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 673e366313..874f8876b9 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -97,6 +97,7 @@ Class Procs:
name = "machinery"
icon = 'icons/obj/stationobjs.dmi'
w_class = ITEMSIZE_NO_CONTAINER
+ layer = UNDER_JUNK_LAYER
var/stat = 0
var/emagged = 0
diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm
index af61e93424..8022235736 100644
--- a/code/game/machinery/magnet.dm
+++ b/code/game/machinery/magnet.dm
@@ -9,8 +9,7 @@
icon_state = "floor_magnet-f"
name = "Electromagnetic Generator"
desc = "A device that uses station power to create points of magnetic energy."
- level = 1 // underfloor
- layer = 2.5
+ plane = PLATING_PLANE
anchored = 1
use_power = 1
idle_power_usage = 50
diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm
index ac0af16378..7e472c8eca 100644
--- a/code/game/machinery/navbeacon.dm
+++ b/code/game/machinery/navbeacon.dm
@@ -8,8 +8,7 @@ var/global/list/navbeacons = list() // no I don't like putting this in, but it w
icon_state = "navbeacon0-f"
name = "navigation beacon"
desc = "A beacon used for bot navigation."
- level = 1 // underfloor
- layer = 2.5
+ plane = PLATING_PLANE
anchored = 1
var/open = 0 // true if cover is open
var/locked = 1 // true if controls are locked
diff --git a/code/game/machinery/overview.dm b/code/game/machinery/overview.dm
index 48bd028c09..0ec65cc30d 100644
--- a/code/game/machinery/overview.dm
+++ b/code/game/machinery/overview.dm
@@ -168,7 +168,7 @@
qdel(I)
qdel(J)
H.icon = HI
- H.layer = 25
+ H.hud_layerise()
usr.mapobjs += H
#else
@@ -287,7 +287,7 @@
H.icon = I
qdel(I)
- H.layer = 25
+ H.hud_layerise()
usr.mapobjs += H
#endif
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index ca1fa7b3b1..b66e311d49 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -6,7 +6,6 @@
desc = "A generic vending machine."
icon = 'icons/obj/vending_vr.dmi' //VOREStation Edit - Eris vending machine sprites
icon_state = "generic"
- layer = 2.9
anchored = 1
density = 1
diff --git a/code/game/machinery/wall_frames.dm b/code/game/machinery/wall_frames.dm
index 3a036eec8e..1765eac3ec 100644
--- a/code/game/machinery/wall_frames.dm
+++ b/code/game/machinery/wall_frames.dm
@@ -29,7 +29,7 @@
update_type_list()
var/datum/frame/frame_types/frame_type
if(!build_machine_type)
- var/datum/frame/frame_types/response = input(usr, "What kind of frame would you like to make?", "Frame type request", null) in frame_types_floor
+ var/datum/frame/frame_types/response = input(user, "What kind of frame would you like to make?", "Frame type request", null) in frame_types_floor
if(!response || response.name == "Cancel")
return
frame_type = response
@@ -37,10 +37,10 @@
build_machine_type = /obj/structure/frame
if(frame_type.frame_size != 5)
- new /obj/item/stack/material/steel(usr.loc, (5 - frame_type.frame_size))
+ new /obj/item/stack/material/steel(user.loc, (5 - frame_type.frame_size))
var/ndir
- ndir = usr.dir
+ ndir = user.dir
if(!(ndir in cardinal))
return
@@ -48,13 +48,15 @@
M.fingerprints = fingerprints
M.fingerprintshidden = fingerprintshidden
M.fingerprintslast = fingerprintslast
+ if(istype(src.loc, /obj/item/weapon/gripper)) //Typical gripper shenanigans
+ user.drop_item()
qdel(src)
/obj/item/frame/proc/try_build(turf/on_wall, mob/user as mob)
update_type_list()
var/datum/frame/frame_types/frame_type
if(!build_machine_type)
- var/datum/frame/frame_types/response = input(usr, "What kind of frame would you like to make?", "Frame type request", null) in frame_types_wall
+ var/datum/frame/frame_types/response = input(user, "What kind of frame would you like to make?", "Frame type request", null) in frame_types_wall
if(!response || response.name == "Cancel")
return
frame_type = response
@@ -62,38 +64,40 @@
build_machine_type = /obj/structure/frame
if(frame_type.frame_size != 5)
- new /obj/item/stack/material/steel(usr.loc, (5 - frame_type.frame_size))
+ new /obj/item/stack/material/steel(user.loc, (5 - frame_type.frame_size))
- if(get_dist(on_wall, usr)>1)
+ if(get_dist(on_wall, user)>1)
return
var/ndir
if(reverse)
- ndir = get_dir(usr, on_wall)
+ ndir = get_dir(user, on_wall)
else
- ndir = get_dir(on_wall, usr)
+ ndir = get_dir(on_wall, user)
if(!(ndir in cardinal))
return
- var/turf/loc = get_turf(usr)
+ var/turf/loc = get_turf(user)
var/area/A = loc.loc
if(!istype(loc, /turf/simulated/floor))
- usr << "\The frame cannot be placed on this spot."
+ to_chat(user, "\The frame cannot be placed on this spot.")
return
if(A.requires_power == 0 || A.name == "Space")
- usr << "\The [src] Alarm cannot be placed in this area."
+ to_chat(user, "\The [src] Alarm cannot be placed in this area.")
return
if(gotwallitem(loc, ndir))
- usr << "There's already an item on this wall!"
+ to_chat(user, "There's already an item on this wall!")
return
var/obj/machinery/M = new build_machine_type(loc, ndir, 1, frame_type)
M.fingerprints = fingerprints
M.fingerprintshidden = fingerprintshidden
M.fingerprintslast = fingerprintslast
+ if(istype(src.loc, /obj/item/weapon/gripper)) //Typical gripper shenanigans
+ user.drop_item()
qdel(src)
/obj/item/frame/light
diff --git a/code/game/mecha/combat/gorilla.dm b/code/game/mecha/combat/gorilla.dm
index b6f1915667..cc5dacebc3 100644
--- a/code/game/mecha/combat/gorilla.dm
+++ b/code/game/mecha/combat/gorilla.dm
@@ -51,7 +51,7 @@
desc = "... Blitzkrieg?"
icon = 'icons/mecha/mecha64x64.dmi'
icon_state = "pzrwreck"
- layer = 4 // so it overlaps other people
+ plane = MOB_PLANE
pixel_x = -16
anchored = 1 // It's fucking huge. You aren't moving it.
diff --git a/code/game/mecha/mech_sensor.dm b/code/game/mecha/mech_sensor.dm
index 87a9863ee8..5173f182ce 100644
--- a/code/game/mecha/mech_sensor.dm
+++ b/code/game/mecha/mech_sensor.dm
@@ -7,7 +7,7 @@
density = 1
throwpass = 1
use_power = 1
- layer = 3.3
+ layer = ON_WINDOW_LAYER
power_channel = EQUIP
var/on = 0
var/id_tag = null
diff --git a/code/game/objects/effects/alien/aliens.dm b/code/game/objects/effects/alien/aliens.dm
index 2c864f0a56..7a79c21e1e 100644
--- a/code/game/objects/effects/alien/aliens.dm
+++ b/code/game/objects/effects/alien/aliens.dm
@@ -147,7 +147,8 @@
anchored = 1
density = 0
- layer = 2
+ plane = TURF_PLANE
+ layer = ABOVE_TURF_LAYER
var/health = 15
var/obj/effect/alien/weeds/node/linked_node = null
@@ -155,7 +156,7 @@
icon_state = "weednode"
name = "purple sac"
desc = "Weird purple octopus-like thing."
- layer = 3
+ layer = ABOVE_TURF_LAYER+0.01
light_range = NODERANGE
var/node_range = NODERANGE
diff --git a/code/game/objects/effects/chem/chemsmoke.dm b/code/game/objects/effects/chem/chemsmoke.dm
index be7e759a63..436ebabcc9 100644
--- a/code/game/objects/effects/chem/chemsmoke.dm
+++ b/code/game/objects/effects/chem/chemsmoke.dm
@@ -161,7 +161,7 @@
if(chemholder.reagents.reagent_list.len)
chemholder.reagents.trans_to_obj(smoke, chemholder.reagents.total_volume / dist, copy = 1) //copy reagents to the smoke so mob/breathe() can handle inhaling the reagents
smoke.icon = I
- smoke.layer = 6
+ smoke.plane = ABOVE_PLANE
smoke.set_dir(pick(cardinal))
smoke.pixel_x = -32 + rand(-8, 8)
smoke.pixel_y = -32 + rand(-8, 8)
diff --git a/code/game/objects/effects/decals/Cleanable/fuel.dm b/code/game/objects/effects/decals/Cleanable/fuel.dm
index c04540535b..b69226815e 100644
--- a/code/game/objects/effects/decals/Cleanable/fuel.dm
+++ b/code/game/objects/effects/decals/Cleanable/fuel.dm
@@ -2,7 +2,7 @@
//Liquid fuel is used for things that used to rely on volatile fuels or phoron being contained to a couple tiles.
icon = 'icons/effects/effects.dmi'
icon_state = "fuel"
- layer = TURF_LAYER+0.2
+ plane = DIRTY_PLANE
anchored = 1
var/amount = 1
diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm
index 46b9d3645c..90f708ff9d 100644
--- a/code/game/objects/effects/decals/Cleanable/humans.dm
+++ b/code/game/objects/effects/decals/Cleanable/humans.dm
@@ -10,7 +10,7 @@ var/global/list/image/splatter_cache=list()
gender = PLURAL
density = 0
anchored = 1
- layer = 2
+ plane = BLOOD_PLANE
icon = 'icons/effects/blood.dmi'
icon_state = "mfloor1"
random_icon_states = list("mfloor1", "mfloor2", "mfloor3", "mfloor4", "mfloor5", "mfloor6", "mfloor7")
@@ -179,7 +179,6 @@ var/global/list/image/splatter_cache=list()
gender = PLURAL
density = 0
anchored = 1
- layer = 2
icon = 'icons/effects/blood.dmi'
icon_state = "gibbl5"
random_icon_states = list("gib1", "gib2", "gib3", "gib5", "gib6")
@@ -236,7 +235,6 @@ var/global/list/image/splatter_cache=list()
gender = PLURAL
density = 0
anchored = 1
- layer = 2
icon = 'icons/effects/blood.dmi'
icon_state = "mucus"
random_icon_states = list("mucus")
diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm
index ab01bfa005..1ef83bc722 100644
--- a/code/game/objects/effects/decals/Cleanable/misc.dm
+++ b/code/game/objects/effects/decals/Cleanable/misc.dm
@@ -4,7 +4,6 @@
gender = PLURAL
density = 0
anchored = 1
- layer = 2
icon = 'icons/obj/objects.dmi'
icon_state = "shards"
@@ -36,7 +35,6 @@
gender = PLURAL
density = 0
anchored = 1
- layer = 2
icon = 'icons/effects/effects.dmi'
icon_state = "dirt"
mouse_opacity = 0
@@ -47,7 +45,6 @@
gender = PLURAL
density = 0
anchored = 1
- layer = 2
icon = 'icons/effects/effects.dmi'
icon_state = "flour"
@@ -57,7 +54,6 @@
gender = PLURAL
density = 0
anchored = 1
- layer = 2
light_range = 1
icon = 'icons/effects/effects.dmi'
icon_state = "greenglow"
@@ -67,7 +63,7 @@
desc = "Somebody should remove that."
density = 0
anchored = 1
- layer = 3
+ plane = OBJ_PLANE
icon = 'icons/effects/effects.dmi'
icon_state = "cobweb1"
@@ -76,7 +72,7 @@
desc = "It looks like a melted... something."
density = 0
anchored = 1
- layer = 3
+ plane = OBJ_PLANE
icon = 'icons/obj/chemical.dmi'
icon_state = "molten"
@@ -85,7 +81,7 @@
desc = "Somebody should remove that."
density = 0
anchored = 1
- layer = 3
+ plane = OBJ_PLANE
icon = 'icons/effects/effects.dmi'
icon_state = "cobweb2"
@@ -96,7 +92,6 @@
gender = PLURAL
density = 0
anchored = 1
- layer = 2
icon = 'icons/effects/blood.dmi'
icon_state = "vomit_1"
random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4")
@@ -107,7 +102,6 @@
desc = "It's red."
density = 0
anchored = 1
- layer = 2
icon = 'icons/effects/tomatodecal.dmi'
random_icon_states = list("tomato_floor1", "tomato_floor2", "tomato_floor3")
@@ -116,7 +110,6 @@
desc = "Seems like this one won't hatch."
density = 0
anchored = 1
- layer = 2
icon = 'icons/effects/tomatodecal.dmi'
random_icon_states = list("smashed_egg1", "smashed_egg2", "smashed_egg3")
@@ -125,7 +118,6 @@
desc = "It's pie cream from a cream pie."
density = 0
anchored = 1
- layer = 2
icon = 'icons/effects/tomatodecal.dmi'
random_icon_states = list("smashed_pie")
@@ -134,7 +126,6 @@
desc = "Some kind of fruit smear."
density = 0
anchored = 1
- layer = 2
icon = 'icons/effects/blood.dmi'
icon_state = "mfloor1"
random_icon_states = list("mfloor1", "mfloor2", "mfloor3", "mfloor4", "mfloor5", "mfloor6", "mfloor7")
diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm
index 2db1e5e948..f7965e092d 100644
--- a/code/game/objects/effects/decals/cleanable.dm
+++ b/code/game/objects/effects/decals/cleanable.dm
@@ -1,4 +1,5 @@
/obj/effect/decal/cleanable
+ plane = DIRTY_PLANE
var/list/random_icon_states = list()
/obj/effect/decal/cleanable/clean_blood(var/ignore = 0)
diff --git a/code/game/objects/effects/decals/crayon.dm b/code/game/objects/effects/decals/crayon.dm
index 20047ced12..55bb54b803 100644
--- a/code/game/objects/effects/decals/crayon.dm
+++ b/code/game/objects/effects/decals/crayon.dm
@@ -2,7 +2,7 @@
name = "rune"
desc = "A rune drawn in crayon."
icon = 'icons/obj/rune.dmi'
- layer = 2.1
+ plane = DIRTY_PLANE
anchored = 1
New(location,main = "#FFFFFF",shade = "#000000",var/type = "rune")
diff --git a/code/game/objects/effects/decals/misc.dm b/code/game/objects/effects/decals/misc.dm
index 964a1301b8..f3a75ce3c2 100644
--- a/code/game/objects/effects/decals/misc.dm
+++ b/code/game/objects/effects/decals/misc.dm
@@ -3,7 +3,7 @@
desc = "It's an arrow hanging in mid-air. There may be a wizard about."
icon = 'icons/mob/screen1.dmi'
icon_state = "arrow"
- layer = 16.0
+ plane = ABOVE_PLANE
anchored = 1
mouse_opacity = 0
@@ -11,4 +11,4 @@
/obj/effect/decal/spraystill
density = 0
anchored = 1
- layer = 50
\ No newline at end of file
+ plane = ABOVE_PLANE
\ No newline at end of file
diff --git a/code/game/objects/effects/decals/warning_stripes.dm b/code/game/objects/effects/decals/warning_stripes.dm
index e22acfad74..db7c4bf74f 100644
--- a/code/game/objects/effects/decals/warning_stripes.dm
+++ b/code/game/objects/effects/decals/warning_stripes.dm
@@ -1,6 +1,5 @@
/obj/effect/decal/warning_stripes
icon = 'icons/effects/warning_stripes.dmi'
- layer = 2
/obj/effect/decal/warning_stripes/New()
. = ..()
diff --git a/code/game/objects/effects/misc.dm b/code/game/objects/effects/misc.dm
index 349400226a..aaebab4355 100644
--- a/code/game/objects/effects/misc.dm
+++ b/code/game/objects/effects/misc.dm
@@ -26,7 +26,8 @@
desc = "Something swinging really wide."
icon = 'icons/effects/96x96.dmi'
icon_state = "cleave"
- layer = 6
+ plane = MOB_PLANE
+ layer = ABOVE_MOB_LAYER
time_to_die = 6
alpha = 140
mouse_opacity = 0
diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm
index d6dea13c51..9f4f0fa118 100644
--- a/code/game/objects/effects/overlays.dm
+++ b/code/game/objects/effects/overlays.dm
@@ -17,7 +17,8 @@
icon = 'icons/misc/beach2.dmi'
icon_state = "palm1"
density = 1
- layer = 5
+ plane = MOB_PLANE
+ layer = ABOVE_MOB_LAYER
anchored = 1
/obj/effect/overlay/palmtree_l
@@ -25,7 +26,8 @@
icon = 'icons/misc/beach2.dmi'
icon_state = "palm2"
density = 1
- layer = 5
+ plane = MOB_PLANE
+ layer = ABOVE_MOB_LAYER
anchored = 1
/obj/effect/overlay/coconut
@@ -37,7 +39,7 @@
name = "Bluespace"
icon = 'icons/turf/space.dmi'
icon_state = "bluespacify"
- layer = 10
+ plane = ABOVE_PLANE
/obj/effect/overlay/wallrot
name = "wallrot"
@@ -45,7 +47,8 @@
icon = 'icons/effects/wallrot.dmi'
anchored = 1
density = 1
- layer = 5
+ plane = MOB_PLANE
+ layer = ABOVE_MOB_LAYER
mouse_opacity = 0
/obj/effect/overlay/wallrot/New()
@@ -70,7 +73,8 @@
/obj/effect/overlay/snow/floor
icon_state = "snowfloor"
- layer = 2.01 //Just above floor
+ plane = TURF_PLANE
+ layer = ABOVE_TURF_LAYER
mouse_opacity = 0 //Don't block underlying tile interactions
/obj/effect/overlay/snow/floor/edges
@@ -81,11 +85,12 @@
/obj/effect/overlay/snow/airlock
icon_state = "snowairlock"
- layer = 3.2 //Just above airlocks
+ layer = DOOR_CLOSED_LAYER+0.01
/obj/effect/overlay/snow/floor/pointy
icon_state = "snowfloorpointy"
/obj/effect/overlay/snow/wall
icon_state = "snowwall"
- layer = 5 //Same as lights so humans can stand under it
+ plane = MOB_PLANE
+ layer = ABOVE_MOB_LAYER
diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm
index b0e66f6306..4e76f58e4d 100644
--- a/code/game/objects/effects/spiders.dm
+++ b/code/game/objects/effects/spiders.dm
@@ -123,7 +123,7 @@
desc = "It never stays still for long."
icon_state = "spiderling"
anchored = 0
- layer = 2.7
+ layer = HIDING_LAYER
health = 3
var/last_itch = 0
var/amount_grown = -1
diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm
index 31bb9160f8..2ad51ca887 100644
--- a/code/game/objects/items/crayons.dm
+++ b/code/game/objects/items/crayons.dm
@@ -46,11 +46,11 @@
if(colour != "#FFFFFF" && shadeColour != "#000000")
colour = "#FFFFFF"
shadeColour = "#000000"
- user << "You will now draw in white and black with this crayon."
+ to_chat(usr,"You will now draw in white and black with this crayon.")
else
colour = "#000000"
shadeColour = "#FFFFFF"
- user << "You will now draw in black and white with this crayon."
+ to_chat(usr,"You will now draw in black and white with this crayon.")
return
/obj/item/weapon/pen/crayon/rainbow
@@ -72,22 +72,22 @@
switch(drawtype)
if("letter")
drawtype = input("Choose the letter.", "Crayon scribbles") in list("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z")
- user << "You start drawing a letter on the [target.name]."
+ to_chat(usr,"You start drawing a letter on the [target.name].")
if("graffiti")
- user << "You start drawing graffiti on the [target.name]."
+ to_chat(usr,"You start drawing graffiti on the [target.name].")
if("rune")
- user << "You start drawing a rune on the [target.name]."
+ to_chat(usr,"You start drawing a rune on the [target.name].")
if("arrow")
drawtype = input("Choose the arrow.", "Crayon scribbles") in list("left", "right", "up", "down")
- user << "You start drawing an arrow on the [target.name]."
+ to_chat(usr,"You start drawing an arrow on the [target.name].")
if(instant || do_after(user, 50))
new /obj/effect/decal/cleanable/crayon(target,colour,shadeColour,drawtype)
- user << "You finish drawing."
+ to_chat(usr,"You finish drawing.")
target.add_fingerprint(user) // Adds their fingerprints to the floor the crayon is drawn on.
if(uses)
uses--
if(!uses)
- user << "You used up your crayon!"
+ to_chat(usr,"You used up your crayon!")
qdel(src)
return
@@ -99,7 +99,93 @@
if(uses)
uses -= 5
if(uses <= 0)
- user << "You ate your crayon!"
+ to_chat(user,"You ate your crayon!")
qdel(src)
else
..()
+
+/obj/item/weapon/pen/crayon/marker/black
+ icon_state = "markerblack"
+ colour = "#2D2D2D"
+ shadeColour = "#000000"
+ colourName = "black"
+
+/obj/item/weapon/pen/crayon/marker/red
+ icon_state = "markerred"
+ colour = "#DA0000"
+ shadeColour = "#810C0C"
+ colourName = "red"
+
+/obj/item/weapon/pen/crayon/marker/orange
+ icon_state = "markerorange"
+ colour = "#FF9300"
+ shadeColour = "#A55403"
+ colourName = "orange"
+
+/obj/item/weapon/pen/crayon/marker/yellow
+ icon_state = "markeryellow"
+ colour = "#FFF200"
+ shadeColour = "#886422"
+ colourName = "yellow"
+
+/obj/item/weapon/pen/crayon/marker/green
+ icon_state = "markergreen"
+ colour = "#A8E61D"
+ shadeColour = "#61840F"
+ colourName = "green"
+
+/obj/item/weapon/pen/crayon/marker/blue
+ icon_state = "markerblue"
+ colour = "#00B7EF"
+ shadeColour = "#0082A8"
+ colourName = "blue"
+
+/obj/item/weapon/pen/crayon/marker/purple
+ icon_state = "markerpurple"
+ colour = "#DA00FF"
+ shadeColour = "#810CFF"
+ colourName = "purple"
+
+/obj/item/weapon/pen/crayon/marker/mime
+ icon_state = "markermime"
+ desc = "A very sad-looking marker."
+ colour = "#FFFFFF"
+ shadeColour = "#000000"
+ colourName = "mime"
+ uses = 0
+
+/obj/item/weapon/pen/crayon/marker/mime/attack_self(mob/living/user as mob) //inversion
+ if(colour != "#FFFFFF" && shadeColour != "#000000")
+ colour = "#FFFFFF"
+ shadeColour = "#000000"
+ to_chat(usr,"You will now draw in white and black with this marker.")
+ else
+ colour = "#000000"
+ shadeColour = "#FFFFFF"
+ to_chat(usr,"You will now draw in black and white with this marker.")
+ return
+
+/obj/item/weapon/pen/crayon/marker/rainbow
+ icon_state = "markerrainbow"
+ colour = "#FFF000"
+ shadeColour = "#000FFF"
+ colourName = "rainbow"
+ uses = 0
+
+/obj/item/weapon/pen/crayon/marker/rainbow/attack_self(mob/living/user as mob)
+ colour = input(user, "Please select the main colour.", "Marker colour") as color
+ shadeColour = input(user, "Please select the shade colour.", "Marker colour") as color
+ return
+
+/obj/item/weapon/pen/crayon/marker/attack(mob/M as mob, mob/user as mob)
+ if(M == user)
+ to_chat(usr,"You take a bite of the marker and swallow it.")
+ user.nutrition += 1
+ user.reagents.add_reagent("marker_ink",6)
+ if(uses)
+ uses -= 5
+ if(uses <= 0)
+ to_chat(user,"You ate the marker!")
+ qdel(src)
+ else
+ ..()
\ No newline at end of file
diff --git a/code/game/objects/items/devices/communicator/UI.dm b/code/game/objects/items/devices/communicator/UI.dm
index 4baa0a71c0..3333dfb14e 100644
--- a/code/game/objects/items/devices/communicator/UI.dm
+++ b/code/game/objects/items/devices/communicator/UI.dm
@@ -185,7 +185,7 @@
if(text)
exonet.send_message(their_address, "text", text)
im_list += list(list("address" = exonet.address, "to_address" = their_address, "im" = text))
- log_pda("(COMM: [src]) sent \"[text]\" to [exonet.get_atom_from_address(their_address)]",usr)
+ log_pda("(COMM: [src]) sent \"[text]\" to [exonet.get_atom_from_address(their_address)]", usr)
for(var/mob/M in player_list)
if(M.stat == DEAD && M.is_preference_enabled(/datum/client_preference/ghost_ears))
if(istype(M, /mob/new_player) || M.forbid_seeing_deadchat)
diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm
index f1c9aa2d14..e24a727b99 100644
--- a/code/game/objects/items/shooting_range.dm
+++ b/code/game/objects/items/shooting_range.dm
@@ -104,7 +104,6 @@
bmark.pixel_x = p_x
bmark.pixel_y = p_y
bmark.icon = 'icons/effects/effects.dmi'
- bmark.layer = 3.5
bmark.icon_state = "scorch"
if(decaltype == 1)
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 168d7708bf..3931bec8ef 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -860,7 +860,7 @@
/obj/structure/plushie/carp
name = "plush carp"
desc = "A plushie of an elated carp! Straight from the wilds of the Vir frontier, now right here in your hands."
- icon_state = "plushie/carp"
+ icon_state = "carpplushie"
phrase = "Glorf!"
/obj/structure/plushie/beepsky
diff --git a/code/game/objects/items/weapons/id cards/cards.dm b/code/game/objects/items/weapons/id cards/cards.dm
index 7345e8871e..e7a3d3f4d5 100644
--- a/code/game/objects/items/weapons/id cards/cards.dm
+++ b/code/game/objects/items/weapons/id cards/cards.dm
@@ -46,7 +46,6 @@
name = "\proper the coordinates to clown planet"
icon_state = "data"
item_state = "card-id"
- layer = 3
level = 2
desc = "This card contains coordinates to the fabled Clown Planet. Handle with care."
function = "teleporter"
diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm
index 53a6de9564..3e656b844b 100644
--- a/code/game/objects/items/weapons/implants/implant.dm
+++ b/code/game/objects/items/weapons/implants/implant.dm
@@ -71,7 +71,7 @@
/obj/item/weapon/implant/tracking
name = "tracking implant"
- desc = "Track with this."
+ desc = "An implant normally given to dangerous criminals. Allows security to track your location."
var/id = 1
var/degrade_time = 10 MINUTES //How long before the implant stops working outside of a living body.
diff --git a/code/game/objects/items/weapons/melee/misc.dm b/code/game/objects/items/weapons/melee/misc.dm
index c7212c336d..81f233cdec 100644
--- a/code/game/objects/items/weapons/melee/misc.dm
+++ b/code/game/objects/items/weapons/melee/misc.dm
@@ -50,4 +50,41 @@
// Randomizes color
/obj/item/weapon/melee/umbrella/random/New()
color = "#"+get_random_colour()
- ..()
\ No newline at end of file
+ ..()
+
+/obj/item/weapon/melee/cursedblade
+ name = "crystal blade"
+ desc = "The red crystal blade's polished surface glints in the light, giving off a faint glow."
+ icon_state = "soulblade"
+ slot_flags = SLOT_BELT | SLOT_BACK
+ force = 30
+ throwforce = 10
+ w_class = ITEMSIZE_NORMAL
+ sharp = 1
+ edge = 1
+ attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ can_speak = 1
+ var/list/voice_mobs = list() //The curse of the sword is that it has someone trapped inside.
+
+
+/obj/item/weapon/melee/cursedblade/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
+ if(default_parry_check(user, attacker, damage_source) && prob(50))
+ user.visible_message("\The [user] parries [attack_text] with \the [src]!")
+ playsound(user.loc, 'sound/weapons/punchmiss.ogg', 50, 1)
+ return 1
+ return 0
+
+/obj/item/weapon/melee/cursedblade/proc/ghost_inhabit(var/mob/candidate)
+ if(!isobserver(candidate))
+ return
+ //Handle moving the ghost into the new shell.
+ announce_ghost_joinleave(candidate, 0, "They are occupying a cursed sword now.")
+ var/mob/living/voice/new_voice = new /mob/living/voice(src) //Make the voice mob the ghost is going to be.
+ new_voice.transfer_identity(candidate) //Now make the voice mob load from the ghost's active character in preferences.
+ new_voice.mind = candidate.mind //Transfer the mind, if any.
+ new_voice.ckey = candidate.ckey //Finally, bring the client over.
+ new_voice.name = "cursed sword" //Cursed swords shouldn't be known characters.
+ new_voice.real_name = "cursed sword"
+ voice_mobs.Add(new_voice)
+ listening_objects |= src
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/policetape.dm b/code/game/objects/items/weapons/policetape.dm
index 3bb0c89bdc..43183d45f4 100644
--- a/code/game/objects/items/weapons/policetape.dm
+++ b/code/game/objects/items/weapons/policetape.dm
@@ -30,7 +30,7 @@ var/list/tape_roll_applications = list()
name = "tape"
icon = 'icons/policetape.dmi'
anchored = 1
- layer = 3.2
+ layer = WINDOW_LAYER
var/lifted = 0
var/crumpled = 0
var/tape_dir = 0
@@ -257,7 +257,7 @@ var/list/tape_roll_applications = list()
else
var/obj/item/tape/P = new tape_type(T)
P.update_icon()
- P.layer = 3.2
+ P.layer = WINDOW_LAYER
user << "You finish placing \the [src]."
if (istype(A, /turf/simulated/floor) ||istype(A, /turf/unsimulated/floor))
@@ -307,10 +307,11 @@ var/list/tape_roll_applications = list()
/obj/item/tape/proc/lift(time)
lifted = 1
- layer = 8
+ plane = MOB_PLANE
+ layer = ABOVE_MOB_LAYER
spawn(time)
lifted = 0
- layer = initial(layer)
+ reset_plane_and_layer()
// Returns a list of all tape objects connected to src, including itself.
/obj/item/tape/proc/gettapeline()
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index efd82f5517..97e0366413 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -135,7 +135,8 @@
/obj/item/weapon/crowbar,
/obj/item/device/flashlight,
/obj/item/weapon/cell/device,
- /obj/item/weapon/extinguisher/mini
+ /obj/item/weapon/extinguisher/mini,
+ /obj/item/weapon/storage/quickdraw/syringe_case
)
/obj/item/weapon/storage/belt/medical/emt
@@ -373,7 +374,9 @@
/obj/item/weapon/storage/excavation,
/obj/item/weapon/anobattery,
/obj/item/device/ano_scanner,
- /obj/item/weapon/pickaxe/hand
+ /obj/item/weapon/pickaxe/hand,
+ /obj/item/device/xenoarch_multi_tool,
+ /obj/item/weapon/pickaxe/excavationdrill
)
/obj/item/weapon/storage/belt/fannypack
diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm
index c390cb0abd..762720e390 100644
--- a/code/game/objects/items/weapons/storage/fancy.dm
+++ b/code/game/objects/items/weapons/storage/fancy.dm
@@ -114,6 +114,48 @@
return
..()
+/obj/item/weapon/storage/fancy/markers
+ name = "box of markers"
+ desc = "A very professional looking box of permanent markers."
+ icon = 'icons/obj/crayons.dmi'
+ icon_state = "markerbox"
+ w_class = ITEMSIZE_SMALL
+ icon_type = "marker"
+ can_hold = list(
+ /obj/item/weapon/pen/crayon/marker
+ )
+ starts_with = list(
+ /obj/item/weapon/pen/crayon/marker/black,
+ /obj/item/weapon/pen/crayon/marker/red,
+ /obj/item/weapon/pen/crayon/marker/orange,
+ /obj/item/weapon/pen/crayon/marker/yellow,
+ /obj/item/weapon/pen/crayon/marker/green,
+ /obj/item/weapon/pen/crayon/marker/blue,
+ /obj/item/weapon/pen/crayon/marker/purple
+ )
+
+/obj/item/weapon/storage/fancy/markers/initialize()
+ . = ..()
+ update_icon()
+
+/obj/item/weapon/storage/fancy/markers/update_icon()
+ var/mutable_appearance/ma = new(src)
+ ma.overlays = list()
+ for(var/obj/item/weapon/pen/crayon/marker/marker in contents)
+ ma.overlays += image('icons/obj/crayons.dmi',"m"+marker.colourName)
+ appearance = ma
+
+/obj/item/weapon/storage/fancy/markers/attackby(obj/item/W as obj, mob/user as mob)
+ if(istype(W,/obj/item/weapon/pen/crayon/marker))
+ switch(W:colourName)
+ if("mime")
+ to_chat(usr,"This marker is too depressing to be contained in this box.")
+ return
+ if("rainbow")
+ to_chat(usr,"This marker is too childish to be contained in this box.")
+ return
+ ..()
+
////////////
//CIG PACK//
////////////
@@ -259,7 +301,8 @@
icon_state = "paperbox"
icon = 'icons/obj/cigarettes.dmi'
w_class = ITEMSIZE_TINY
- throwforce = 1
+ throwforce = 2
+ slot_flags = SLOT_BELT
storage_slots = 14
can_hold = list(/obj/item/weapon/rollingpaper)
starts_with = list(/obj/item/weapon/rollingpaper = 14)
diff --git a/code/game/objects/items/weapons/storage/quickdraw_vr.dm b/code/game/objects/items/weapons/storage/quickdraw.dm
similarity index 94%
rename from code/game/objects/items/weapons/storage/quickdraw_vr.dm
rename to code/game/objects/items/weapons/storage/quickdraw.dm
index 7be9309c2c..5e6f58fd53 100644
--- a/code/game/objects/items/weapons/storage/quickdraw_vr.dm
+++ b/code/game/objects/items/weapons/storage/quickdraw.dm
@@ -1,78 +1,81 @@
-// -----------------------------
-// Quickdraw storage
-// -----------------------------
-//These items are pouches and cases made to be kept in belts or pockets to quickly draw objects from
-//Largely inspired by the vest pouches on Colonial Marines
-
-/obj/item/weapon/storage/quickdraw
- name = "quickdraw"
- desc = "This object should not appear"
- icon = 'icons/obj/storage_vr.dmi'
-
- //Quickmode
- //When set to 0, this storage will operate as a regular storage, and clicking on it while equipped will open it as a storage
- //When set to 1, a click while it is equipped will instead move the first item inside it to your hand
- var/quickmode = 0
-
-/obj/item/weapon/storage/quickdraw/attack_hand(mob/user as mob)
- if(src.loc == user) //If they aren't holding us, we do nothing special
- if(ishuman(user))
- var/mob/living/carbon/human/H = user
- if(quickmode)
- var/first_item = contents[1]
- if(first_item && !H.get_active_hand()) //Do we have anything to give you?
- H.put_in_hands(first_item)
- return
-
- if(H.l_store == src && !H.get_active_hand()) //overrides
- src.open(user)
- return
- if(H.r_store == src && !H.get_active_hand())
- src.open(user)
- return
- ..() //Nothing special happened, go call the other proc
-
-
-/obj/item/weapon/storage/quickdraw/verb/toggle_quickdraw()
- set name = "Switch Quickdraw Mode"
- set category = "Object"
-
- quickmode = !quickmode
- switch (quickmode)
- if(1)
- to_chat(usr, "[src] now draws the first object inside.")
- if(0)
- to_chat(usr, "[src] now opens as a container.")
-
-/obj/item/weapon/storage/quickdraw/AltClick(mob/user)
- ..()
- if(src.loc == user) //Are they carrying us?
- toggle_quickdraw()
-
-// -----------------------------
-// Syringe case
-// -----------------------------
-
-/obj/item/weapon/storage/quickdraw/syringe_case
- name = "syringe case"
- desc = "A small case for safely carrying sharps around."
- icon_state = "syringe_case"
-
- w_class = ITEMSIZE_SMALL
- max_w_class = ITEMSIZE_TINY
- max_storage_space = ITEMSIZE_TINY * 6 //Capable of holding six syringes
-
- //Can hold syringes and autoinjectors, but also pills if you really wanted. Syringe-shaped objects like pens and cigarettes also fit, but why would you do that?
- can_hold = list(/obj/item/weapon/reagent_containers/syringe, /obj/item/weapon/reagent_containers/hypospray/autoinjector,
- /obj/item/weapon/reagent_containers/pill, /obj/item/weapon/pen, /obj/item/device/flashlight/pen, /obj/item/clothing/mask/smokable/cigarette)
-
- quickmode = 1 //Starts in quickdraw mode
- //Preloaded for your convenience!
- starts_with = list(
- /obj/item/weapon/reagent_containers/syringe,
- /obj/item/weapon/reagent_containers/syringe,
- /obj/item/weapon/reagent_containers/syringe,
- /obj/item/weapon/reagent_containers/syringe,
- /obj/item/weapon/reagent_containers/syringe,
- /obj/item/weapon/reagent_containers/syringe
+// -----------------------------
+// Quickdraw storage
+// -----------------------------
+//These items are pouches and cases made to be kept in belts or pockets to quickly draw objects from
+//Largely inspired by the vest pouches on Colonial Marines
+
+/obj/item/weapon/storage/quickdraw
+ name = "quickdraw"
+ desc = "This object should not appear"
+ icon = 'icons/obj/storage_vr.dmi' // VOREStation Edit
+
+ //Quickmode
+ //When set to 0, this storage will operate as a regular storage, and clicking on it while equipped will open it as a storage
+ //When set to 1, a click while it is equipped will instead move the first item inside it to your hand
+ var/quickmode = 0
+
+/obj/item/weapon/storage/quickdraw/attack_hand(mob/user as mob)
+ if(src.loc == user) //If they aren't holding us, we do nothing special
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ if(quickmode)
+ var/first_item = contents[1]
+ if(first_item && !H.get_active_hand()) //Do we have anything to give you?
+ H.put_in_hands(first_item)
+ return
+
+ if(H.l_store == src && !H.get_active_hand()) //overrides
+ src.open(user)
+ return
+ if(H.r_store == src && !H.get_active_hand())
+ src.open(user)
+ return
+ ..() //Nothing special happened, go call the other proc
+
+
+/obj/item/weapon/storage/quickdraw/verb/toggle_quickdraw()
+ set name = "Switch Quickdraw Mode"
+ set category = "Object"
+
+ quickmode = !quickmode
+ switch (quickmode)
+ if(1)
+ to_chat(usr, "[src] now draws the first object inside.")
+ if(0)
+ to_chat(usr, "[src] now opens as a container.")
+
+/obj/item/weapon/storage/quickdraw/AltClick(mob/user)
+ ..()
+ if(src.loc == user) //Are they carrying us?
+ toggle_quickdraw()
+
+
+// If we start adding more of these, we'll need to make them their own folder. 'til then, this one should be fine.
+
+// -----------------------------
+// Syringe case
+// -----------------------------
+
+/obj/item/weapon/storage/quickdraw/syringe_case
+ name = "syringe case"
+ desc = "A small case for safely carrying sharps around."
+ icon_state = "syringe_case"
+
+ w_class = ITEMSIZE_SMALL
+ max_w_class = ITEMSIZE_TINY
+ max_storage_space = ITEMSIZE_TINY * 6 //Capable of holding six syringes
+
+ //Can hold syringes and autoinjectors, but also pills if you really wanted. Syringe-shaped objects like pens and cigarettes also fit, but why would you do that?
+ can_hold = list(/obj/item/weapon/reagent_containers/syringe, /obj/item/weapon/reagent_containers/hypospray/autoinjector,
+ /obj/item/weapon/reagent_containers/pill, /obj/item/weapon/pen, /obj/item/device/flashlight/pen, /obj/item/clothing/mask/smokable/cigarette)
+
+ quickmode = 1 //Starts in quickdraw mode
+ //Preloaded for your convenience!
+ starts_with = list(
+ /obj/item/weapon/reagent_containers/syringe,
+ /obj/item/weapon/reagent_containers/syringe,
+ /obj/item/weapon/reagent_containers/syringe,
+ /obj/item/weapon/reagent_containers/syringe,
+ /obj/item/weapon/reagent_containers/syringe,
+ /obj/item/weapon/reagent_containers/syringe
)
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/tape.dm b/code/game/objects/items/weapons/tape.dm
index 30257a2b84..83e944f593 100644
--- a/code/game/objects/items/weapons/tape.dm
+++ b/code/game/objects/items/weapons/tape.dm
@@ -131,7 +131,7 @@
icon = 'icons/obj/bureaucracy.dmi'
icon_state = "tape"
w_class = ITEMSIZE_TINY
- layer = 4
+ plane = MOB_PLANE
anchored = 1 //it's sticky, no you cant move it
var/obj/item/weapon/stuck = null
diff --git a/code/game/objects/items/weapons/trays.dm b/code/game/objects/items/weapons/trays.dm
index 68a2c3a774..8d9977cc17 100644
--- a/code/game/objects/items/weapons/trays.dm
+++ b/code/game/objects/items/weapons/trays.dm
@@ -188,7 +188,7 @@
carrying.Add(I)
Img.icon = I.icon
Img.icon_state = I.icon_state
- Img.layer = 30 + I.layer
+ Img.layer = layer + I.layer*0.01
if(istype(I, /obj/item/weapon/material))
var/obj/item/weapon/material/O = I
if(O.applies_material_colour)
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index 3833133f4a..3835b2a24b 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -1,4 +1,6 @@
/obj
+ layer = OBJ_LAYER
+ plane = OBJ_PLANE
//Used to store information about the contents of the object.
var/list/matter
var/w_class // Size of the object.
@@ -13,6 +15,7 @@
var/armor_penetration = 0
var/show_messages
var/preserve_item = 0 //whether this object is preserved when its owner goes into cryo-storage, gateway, etc
+ var/can_speak = 0 //For MMIs and admin trickery. If an object has a brainmob in its contents, set this to 1 to allow it to speak.
var/show_examine = TRUE // Does this pop up on a mob when the mob is examined?
diff --git a/code/game/objects/random/maintenance.dm b/code/game/objects/random/maintenance.dm
index fa126858cc..e7e45a8791 100644
--- a/code/game/objects/random/maintenance.dm
+++ b/code/game/objects/random/maintenance.dm
@@ -100,11 +100,6 @@ something, make sure it's not in one of the other lists.*/
prob(1);/obj/item/clothing/under/harness,
prob(1);/obj/item/clothing/under/tactical,
prob(3);/obj/item/clothing/accessory/storage/webbing,
- prob(4);/obj/item/weapon/spacecash/c1,
- prob(3);/obj/item/weapon/spacecash/c10,
- prob(3);/obj/item/weapon/spacecash/c20,
- prob(1);/obj/item/weapon/spacecash/c50,
- prob(1);/obj/item/weapon/spacecash/c100,
prob(3);/obj/item/weapon/camera_assembly,
prob(4);/obj/item/weapon/caution,
prob(3);/obj/item/weapon/caution/cone,
diff --git a/code/game/objects/random/misc.dm b/code/game/objects/random/misc.dm
index 0ebc879e72..29b597d460 100644
--- a/code/game/objects/random/misc.dm
+++ b/code/game/objects/random/misc.dm
@@ -19,6 +19,18 @@
/obj/item/device/flashlight,
/obj/item/device/multitool)
+/obj/random/tool/powermaint
+ name = "random powertool"
+ desc = "This is a random rare powertool for maintenance"
+ icon_state = "jaws_pry"
+
+/obj/random/tool/powermaint/item_to_spawn()
+ return pick(prob(320);/obj/random/tool,
+ prob(1);/obj/item/weapon/screwdriver/power,
+ prob(1);/obj/item/weapon/wirecutters/power,
+ prob(15);/obj/item/weapon/weldingtool/electric,
+ prob(5);/obj/item/weapon/weldingtool/experimental)
+
/obj/random/tool/power
name = "random powertool"
desc = "This is a random powertool"
@@ -148,7 +160,7 @@
name = "Random Medicine"
desc = "This is a random medical item."
icon = 'icons/obj/items.dmi'
- icon_state = "traumakit"
+ icon_state = "advfirstaid"
/obj/random/medical/item_to_spawn()
return pick(prob(21);/obj/random/medical/lite,
@@ -203,11 +215,11 @@
icon_state = "firstaid"
/obj/random/firstaid/item_to_spawn()
- return pick(prob(4);/obj/item/weapon/storage/firstaid/regular,
- prob(3);/obj/item/weapon/storage/firstaid/toxin,
- prob(3);/obj/item/weapon/storage/firstaid/o2,
- prob(2);/obj/item/weapon/storage/firstaid/adv,
- prob(3);/obj/item/weapon/storage/firstaid/fire,
+ return pick(prob(10);/obj/item/weapon/storage/firstaid/regular,
+ prob(8);/obj/item/weapon/storage/firstaid/toxin,
+ prob(8);/obj/item/weapon/storage/firstaid/o2,
+ prob(6);/obj/item/weapon/storage/firstaid/adv,
+ prob(8);/obj/item/weapon/storage/firstaid/fire,
prob(1);/obj/item/weapon/storage/firstaid/combat)
/obj/random/contraband
@@ -236,6 +248,20 @@
prob(2);/obj/item/weapon/reagent_containers/syringe/drugs,
prob(1);/obj/item/weapon/reagent_containers/syringe/steroid)
+/obj/random/cash
+ name = "random currency"
+ desc = "LOADSAMONEY!"
+ icon = 'icons/obj/items.dmi'
+ icon_state = "spacecash1"
+
+/obj/random/cash/item_to_spawn()
+ return pick(prob(320);/obj/random/maintenance/clean,
+ prob(12);/obj/item/weapon/spacecash/c1,
+ prob(8);/obj/item/weapon/spacecash/c10,
+ prob(4);/obj/item/weapon/spacecash/c20,
+ prob(1);/obj/item/weapon/spacecash/c50,
+ prob(1);/obj/item/weapon/spacecash/c100)
+
/obj/random/soap
name = "Random Soap"
desc = "This is a random bar of soap."
@@ -246,7 +272,7 @@
return pick(prob(3);/obj/item/weapon/soap,
prob(2);/obj/item/weapon/soap/nanotrasen,
prob(2);/obj/item/weapon/soap/deluxe,
- prob(1);/obj/item/weapon/soap/syndie,)
+ prob(1);/obj/item/weapon/soap/syndie)
/obj/random/drinkbottle
@@ -387,14 +413,45 @@
icon_state = "nymphplushie"
/obj/random/plushie/item_to_spawn()
+ return pick(/obj/item/toy/plushie/nymph,
+ /obj/item/toy/plushie/mouse,
+ /obj/item/toy/plushie/kitten,
+ /obj/item/toy/plushie/lizard,
+ /obj/item/toy/plushie/black_cat,
+ /obj/item/toy/plushie/black_fox,
+ /obj/item/toy/plushie/blue_fox,
+ /obj/random/carp_plushie,
+ /obj/item/toy/plushie/coffee_fox,
+ /obj/item/toy/plushie/corgi,
+ /obj/item/toy/plushie/crimson_fox,
+ /obj/item/toy/plushie/deer,
+ /obj/item/toy/plushie/girly_corgi,
+ /obj/item/toy/plushie/grey_cat,
+ /obj/item/toy/plushie/marble_fox,
+ /obj/item/toy/plushie/octopus,
+ /obj/item/toy/plushie/orange_cat,
+ /obj/item/toy/plushie/orange_fox,
+ /obj/item/toy/plushie/pink_fox,
+ /obj/item/toy/plushie/purple_fox,
+ /obj/item/toy/plushie/red_fox,
+ /obj/item/toy/plushie/robo_corgi,
+ /obj/item/toy/plushie/siamese_cat,
+ /obj/item/toy/plushie/spider,
+ /obj/item/toy/plushie/tabby_cat,
+ /obj/item/toy/plushie/tuxedo_cat,
+ /obj/item/toy/plushie/white_cat)
+
+/obj/random/plushielarge
+ name = "random large plushie"
+ desc = "This is a randomn large plushie."
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "droneplushie"
+
+/obj/random/plushielarge/item_to_spawn()
return pick(/obj/structure/plushie/ian,
/obj/structure/plushie/drone,
/obj/structure/plushie/carp,
- /obj/structure/plushie/beepsky,
- /obj/item/toy/plushie/nymph,
- /obj/item/toy/plushie/mouse,
- /obj/item/toy/plushie/kitten,
- /obj/item/toy/plushie/lizard)
+ /obj/structure/plushie/beepsky)
/obj/random/toy
name = "random toy"
@@ -418,6 +475,8 @@
/obj/item/toy/crossbow,
/obj/item/toy/blink,
/obj/item/toy/waterflower,
+ /obj/item/toy/eight_ball,
+ /obj/item/toy/eight_ball/conch,
/obj/item/toy/prize/ripley,
/obj/item/toy/prize/fireripley,
/obj/item/toy/prize/deathripley,
diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm
index 5c3542015c..9b3d866d2b 100644
--- a/code/game/objects/structures/bedsheet_bin.dm
+++ b/code/game/objects/structures/bedsheet_bin.dm
@@ -10,7 +10,8 @@ LINEN BINS
icon = 'icons/obj/items.dmi'
icon_state = "sheet"
slot_flags = SLOT_BACK
- layer = 4.0
+ plane = MOB_PLANE
+ layer = BELOW_MOB_LAYER
throwforce = 1
throw_speed = 1
throw_range = 2
@@ -19,9 +20,9 @@ LINEN BINS
/obj/item/weapon/bedsheet/attack_self(mob/user as mob)
user.drop_item()
if(layer == initial(layer))
- layer = MOB_LAYER + 0.1
+ layer = ABOVE_MOB_LAYER
else
- layer = initial(layer)
+ reset_plane_and_layer()
add_fingerprint(user)
return
diff --git a/code/game/objects/structures/ghost_pods/ghost_pods.dm b/code/game/objects/structures/ghost_pods/ghost_pods.dm
index 03cc4bec3f..16dcd2ddb7 100644
--- a/code/game/objects/structures/ghost_pods/ghost_pods.dm
+++ b/code/game/objects/structures/ghost_pods/ghost_pods.dm
@@ -10,12 +10,14 @@
var/needscharger //For drone pods that want their pod to turn into a charger.
// Call this to get a ghost volunteer.
-/obj/structure/ghost_pod/proc/trigger()
+/obj/structure/ghost_pod/proc/trigger(var/alert, var/adminalert)
if(!ghost_query_type)
return FALSE
if(busy)
return FALSE
+ visible_message(alert)
+ log_and_message_admins(adminalert)
busy = TRUE
var/datum/ghost_query/Q = new ghost_query_type()
var/list/winner = Q.query()
@@ -44,7 +46,7 @@
/obj/structure/ghost_pod/manual/attack_hand(var/mob/living/user)
if(!used)
if(confirm_before_open)
- if(alert(user, "Are you sure you want to open \the [src]?", "Confirm", "No", "Yes") == "No")
+ if(alert(user, "Are you sure you want to touch \the [src]?", "Confirm", "No", "Yes") == "No")
return
trigger()
diff --git a/code/game/objects/structures/ghost_pods/silicon.dm b/code/game/objects/structures/ghost_pods/silicon.dm
index 4e954afd4e..1e7210a1ec 100644
--- a/code/game/objects/structures/ghost_pods/silicon.dm
+++ b/code/game/objects/structures/ghost_pods/silicon.dm
@@ -13,9 +13,7 @@
needscharger = TRUE
/obj/structure/ghost_pod/manual/lost_drone/trigger()
- ..()
- visible_message("\The [src] appears to be attempting to restart the robot contained inside.")
- log_and_message_admins("is attempting to open \a [src].")
+ ..("\The [src] appears to be attempting to restart the robot contained inside.", "is attempting to open \a [src].")
/obj/structure/ghost_pod/manual/lost_drone/create_occupant(var/mob/M)
density = FALSE
@@ -68,14 +66,13 @@
description_info = "This will summon some manner of creature through quite dubious means. The creature will be controlled by a player."
icon_state = "corgirune"
icon_state_opened = "corgirune-inert"
- density = TRUE
+ density = FALSE
+ anchored = TRUE
ghost_query_type = /datum/ghost_query/corgi_rune
confirm_before_open = TRUE
/obj/structure/ghost_pod/manual/corgi/trigger()
- ..()
- visible_message("\The [usr] places their hand on the rune!")
- log_and_message_admins("is attempting to summon a corgi.")
+ ..("\The [usr] places their hand on the rune!", "is attempting to summon a corgi.")
/obj/structure/ghost_pod/manual/corgi/create_occupant(var/mob/M)
density = FALSE
@@ -86,4 +83,29 @@
R.ckey = M.ckey
visible_message("With a bright flash of light, \the [src] disappears, and in its place stands a small corgi.")
log_and_message_admins("successfully touched \a [src] and summoned a corgi.")
+ ..()
+
+/obj/structure/ghost_pod/manual/cursedblade
+ name = "abandoned blade"
+ desc = "A red crystal blade that someone jammed deep into a stone. If you try hard enough, you might be able to remove it."
+ icon_state = "soulblade-embedded"
+ icon_state_opened = "soulblade-released"
+ density = TRUE
+ anchored = TRUE
+ ghost_query_type = /datum/ghost_query/cursedblade
+ confirm_before_open = TRUE
+
+/obj/structure/ghost_pod/manual/cursedblade/trigger()
+ ..("\The [usr] attempts to pull out the sword!", "is activating a cursed blade.")
+
+/obj/structure/ghost_pod/manual/cursedblade/create_occupant(var/mob/M)
+ density = FALSE
+ var/obj/item/weapon/melee/cursedblade/R = new(get_turf(src))
+ to_chat(M, "You are a Cursed Sword, discovered by a hapless explorer. \
+ You were once an explorer yourself, when one day you discovered a strange sword made from a red crystal. As soon as you touched it,\
+ your body was reduced to ashes and your soul was cursed to remain trapped in the blade forever. \
+ Now it is up to you to decide whether you want to be a faithful companion, or a bitter prisoner of the blade.")
+ R.ghost_inhabit(M)
+ visible_message("The blade shines brightly for a brief moment as [usr] pulls it out of the stone!")
+ log_and_message_admins("successfully acquired a cursed sword.")
..()
\ No newline at end of file
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index a3ff9ac9af..a22bbae0d2 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -2,7 +2,7 @@
icon_state = "girder"
anchored = 1
density = 1
- layer = 2
+ plane = PLATING_PLANE
w_class = ITEMSIZE_HUGE
var/state = 0
var/health = 200
diff --git a/code/game/objects/structures/gravemarker.dm b/code/game/objects/structures/gravemarker.dm
index a10cd0bf6e..e20591b939 100644
--- a/code/game/objects/structures/gravemarker.dm
+++ b/code/game/objects/structures/gravemarker.dm
@@ -8,7 +8,7 @@
throwpass = 1
climbable = 1
- layer = 3.1 //Above dirt piles
+ layer = ABOVE_JUNK_LAYER
//Maybe make these calculate based on material?
var/health = 100
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index 1c7beea412..71eccd6ceb 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -7,7 +7,7 @@
anchored = 1
flags = CONDUCT
pressure_resistance = 5*ONE_ATMOSPHERE
- layer = 2.9
+ layer = UNDER_JUNK_LAYER
explosion_resistance = 1
var/health = 10
var/destroyed = 0
diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm
index c042b8fc9a..d9ec122c55 100644
--- a/code/game/objects/structures/lattice.dm
+++ b/code/game/objects/structures/lattice.dm
@@ -6,7 +6,7 @@
density = 0
anchored = 1.0
w_class = ITEMSIZE_NORMAL
- layer = 2.3 //under pipes
+ plane = PLATING_PLANE
// flags = CONDUCT
/obj/structure/lattice/initialize()
diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm
index 4954553a00..cbdacacb69 100644
--- a/code/game/objects/structures/morgue.dm
+++ b/code/game/objects/structures/morgue.dm
@@ -148,7 +148,7 @@
icon = 'icons/obj/stationobjs.dmi'
icon_state = "morguet"
density = 1
- layer = 2.0
+ plane = TURF_PLANE
var/obj/structure/morgue/connected = null
anchored = 1
throwpass = 1
diff --git a/code/game/objects/structures/railing.dm b/code/game/objects/structures/railing.dm
index 27bb902aea..e67750b8f3 100644
--- a/code/game/objects/structures/railing.dm
+++ b/code/game/objects/structures/railing.dm
@@ -6,7 +6,7 @@
density = 1
throwpass = 1
climbable = 1
- layer = 3.2 //Just above doors
+ layer = WINDOW_LAYER
anchored = 1
flags = ON_BORDER
icon_state = "railing0"
diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm
index 7f78e8f0e7..37edb603c1 100644
--- a/code/game/objects/structures/safe.dm
+++ b/code/game/objects/structures/safe.dm
@@ -172,7 +172,8 @@ obj/structure/safe/ex_act(severity)
icon_state = "floorsafe"
density = 0
level = 1 //underfloor
- layer = 2.5
+ plane = TURF_PLANE
+ layer = ABOVE_UTILITY
/obj/structure/safe/floor/initialize()
. = ..()
diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm
index 2d26821bbe..b180b88603 100644
--- a/code/game/objects/structures/signs.dm
+++ b/code/game/objects/structures/signs.dm
@@ -3,7 +3,7 @@
anchored = 1
opacity = 0
density = 0
- layer = 3.5
+ layer = ABOVE_JUNK_LAYER
w_class = ITEMSIZE_NORMAL
/obj/structure/sign/ex_act(severity)
diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
index 2eb40d5819..8d391f14ff 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
@@ -48,15 +48,17 @@
if(isnull(stool_cache[cache_key]))
var/image/I = image(icon, "[base_icon]_armrest")
I.layer = MOB_LAYER + 0.1
+ I.plane = MOB_PLANE
I.color = padding_material.icon_colour
stool_cache[cache_key] = I
overlays |= stool_cache[cache_key]
/obj/structure/bed/chair/proc/update_layer()
if(src.dir == NORTH)
- src.layer = FLY_LAYER
+ plane = MOB_PLANE
+ layer = MOB_LAYER + 0.1
else
- src.layer = OBJ_LAYER
+ reset_plane_and_layer()
/obj/structure/bed/chair/set_dir()
..()
diff --git a/code/game/objects/structures/target_stake.dm b/code/game/objects/structures/target_stake.dm
index 83396b363e..646e52218c 100644
--- a/code/game/objects/structures/target_stake.dm
+++ b/code/game/objects/structures/target_stake.dm
@@ -29,7 +29,7 @@
W.density = 1
user.remove_from_mob(W)
W.loc = loc
- W.layer = 3.1
+ W.layer = ABOVE_JUNK_LAYER
pinned_target = W
user << "You slide the target into the stake."
return
diff --git a/code/game/objects/structures/transit_tubes.dm b/code/game/objects/structures/transit_tubes.dm
index 0f9b4a603a..c260103a56 100644
--- a/code/game/objects/structures/transit_tubes.dm
+++ b/code/game/objects/structures/transit_tubes.dm
@@ -7,7 +7,7 @@
icon = 'icons/obj/pipes/transit_tube.dmi'
icon_state = "E-W"
density = 1
- layer = 3.1
+ layer = ABOVE_JUNK_LAYER
anchored = 1.0
var/list/tube_dirs = null
var/exit_delay = 2
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 9c8df70d21..cbaf8f8cf8 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -5,7 +5,7 @@
density = 1
w_class = ITEMSIZE_NORMAL
- layer = 3.2//Just above doors
+ layer = WINDOW_LAYER
pressure_resistance = 4*ONE_ATMOSPHERE
anchored = 1.0
flags = ON_BORDER
@@ -462,7 +462,7 @@
if(ratio > 75)
return
- var/image/I = image(icon, "damage[ratio]", layer + 0.1)
+ var/image/I = image(icon, "damage[ratio]", layer = layer + 0.1)
overlays += I
return
diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm
index b45eaf69af..3cc0bb8ab9 100644
--- a/code/game/supplyshuttle.dm
+++ b/code/game/supplyshuttle.dm
@@ -1,8 +1,8 @@
//Config stuff
-#define SUPPLY_DOCKZ 2 //Z-level of the Dock.
-#define SUPPLY_STATIONZ 1 //Z-level of the Station.
-#define SUPPLY_STATION_AREATYPE "/area/supply/station" //Type of the supply shuttle area for station
-#define SUPPLY_DOCK_AREATYPE "/area/supply/dock" //Type of the supply shuttle area for dock
+#define SUPPLY_DOCKZ 2 //Z-level of the Dock.
+#define SUPPLY_STATIONZ 1 //Z-level of the Station.
+#define SUPPLY_STATION_AREATYPE "/area/supply/station" //Type of the supply shuttle area for station
+#define SUPPLY_DOCK_AREATYPE "/area/supply/dock" //Type of the supply shuttle area for dock
//Supply packs are in /code/defines/obj/supplypacks.dm
//Computers are in /code/game/machinery/computer/supply.dm
@@ -10,333 +10,324 @@
var/datum/controller/supply/supply_controller = new()
var/list/mechtoys = list(
- /obj/item/toy/prize/ripley,
- /obj/item/toy/prize/fireripley,
- /obj/item/toy/prize/deathripley,
- /obj/item/toy/prize/gygax,
- /obj/item/toy/prize/durand,
- /obj/item/toy/prize/honk,
- /obj/item/toy/prize/marauder,
- /obj/item/toy/prize/seraph,
- /obj/item/toy/prize/mauler,
- /obj/item/toy/prize/odysseus,
- /obj/item/toy/prize/phazon
+ /obj/item/toy/prize/ripley,
+ /obj/item/toy/prize/fireripley,
+ /obj/item/toy/prize/deathripley,
+ /obj/item/toy/prize/gygax,
+ /obj/item/toy/prize/durand,
+ /obj/item/toy/prize/honk,
+ /obj/item/toy/prize/marauder,
+ /obj/item/toy/prize/seraph,
+ /obj/item/toy/prize/mauler,
+ /obj/item/toy/prize/odysseus,
+ /obj/item/toy/prize/phazon
)
/obj/item/weapon/paper/manifest
- name = "supply manifest"
- var/is_copy = 1
+ name = "supply manifest"
+ var/is_copy = 1
/area/supply/station
- name = "Supply Shuttle"
- icon_state = "shuttle3"
- requires_power = 0
- base_turf = /turf/space
+ name = "Supply Shuttle"
+ icon_state = "shuttle3"
+ requires_power = 0
+ base_turf = /turf/space
/area/supply/dock
- name = "Supply Shuttle"
- icon_state = "shuttle3"
- requires_power = 0
- base_turf = /turf/space
+ name = "Supply Shuttle"
+ icon_state = "shuttle3"
+ requires_power = 0
+ base_turf = /turf/space
/obj/structure/plasticflaps //HOW DO YOU CALL THOSE THINGS ANYWAY
- name = "\improper plastic flaps"
- desc = "Completely impassable - or are they?"
- icon = 'icons/obj/stationobjs.dmi' //Change this.
- icon_state = "plasticflaps"
- density = 0
- anchored = 1
- layer = 4
- explosion_resistance = 5
- var/list/mobs_can_pass = list(
- /mob/living/bot,
- /mob/living/simple_animal/slime,
- /mob/living/simple_animal/mouse,
- /mob/living/silicon/robot/drone
- )
+ name = "\improper plastic flaps"
+ desc = "Completely impassable - or are they?"
+ icon = 'icons/obj/stationobjs.dmi' //Change this.
+ icon_state = "plasticflaps"
+ density = 0
+ anchored = 1
+ layer = MOB_LAYER
+ plane = MOB_PLANE
+ explosion_resistance = 5
+ var/list/mobs_can_pass = list(
+ /mob/living/bot,
+ /mob/living/simple_animal/slime,
+ /mob/living/simple_animal/mouse,
+ /mob/living/silicon/robot/drone
+ )
/obj/structure/plasticflaps/attackby(obj/item/P, mob/user)
- if(istype(P, /obj/item/weapon/wirecutters))
- playsound(src, P.usesound, 50, 1)
- user << "You start to cut the plastic flaps."
- if(do_after(user, 10 * P.toolspeed))
- user << "You cut the plastic flaps."
- var/obj/item/stack/material/plastic/A = new /obj/item/stack/material/plastic( src.loc )
- A.amount = 4
- qdel(src)
- return
- else
- return
+ if(istype(P, /obj/item/weapon/wirecutters))
+ playsound(src, P.usesound, 50, 1)
+ user << "You start to cut the plastic flaps."
+ if(do_after(user, 10 * P.toolspeed))
+ user << "You cut the plastic flaps."
+ var/obj/item/stack/material/plastic/A = new /obj/item/stack/material/plastic( src.loc )
+ A.amount = 4
+ qdel(src)
+ return
+ else
+ return
/obj/structure/plasticflaps/CanPass(atom/A, turf/T)
- if(istype(A) && A.checkpass(PASSGLASS))
- return prob(60)
+ if(istype(A) && A.checkpass(PASSGLASS))
+ return prob(60)
- var/obj/structure/bed/B = A
- if (istype(A, /obj/structure/bed) && B.has_buckled_mobs())//if it's a bed/chair and someone is buckled, it will not pass
- return 0
+ var/obj/structure/bed/B = A
+ if (istype(A, /obj/structure/bed) && B.has_buckled_mobs())//if it's a bed/chair and someone is buckled, it will not pass
+ return 0
- if(istype(A, /obj/vehicle)) //no vehicles
- return 0
+ if(istype(A, /obj/vehicle)) //no vehicles
+ return 0
- var/mob/living/M = A
- if(istype(M))
- if(M.lying)
- return ..()
- for(var/mob_type in mobs_can_pass)
- if(istype(A, mob_type))
- return ..()
- return issmall(M)
+ var/mob/living/M = A
+ if(istype(M))
+ if(M.lying)
+ return ..()
+ for(var/mob_type in mobs_can_pass)
+ if(istype(A, mob_type))
+ return ..()
+ return issmall(M)
- return ..()
+ return ..()
/obj/structure/plasticflaps/ex_act(severity)
- switch(severity)
- if (1)
- qdel(src)
- if (2)
- if (prob(50))
- qdel(src)
- if (3)
- if (prob(5))
- qdel(src)
+ switch(severity)
+ if (1)
+ qdel(src)
+ if (2)
+ if (prob(50))
+ qdel(src)
+ if (3)
+ if (prob(5))
+ qdel(src)
/obj/structure/plasticflaps/mining //A specific type for mining that doesn't allow airflow because of them damn crates
- name = "airtight plastic flaps"
- desc = "Heavy duty, airtight, plastic flaps."
+ name = "airtight plastic flaps"
+ desc = "Heavy duty, airtight, plastic flaps."
- New() //set the turf below the flaps to block air
- var/turf/T = get_turf(loc)
- if(T)
- T.blocks_air = 1
- ..()
+/obj/structure/plasticflaps/mining/New() //set the turf below the flaps to block air
+ var/turf/T = get_turf(loc)
+ if(T)
+ T.blocks_air = 1
+ ..()
- Destroy() //lazy hack to set the turf to allow air to pass if it's a simulated floor
- var/turf/T = get_turf(loc)
- if(T)
- if(istype(T, /turf/simulated/floor))
- T.blocks_air = 0
- ..()
+/obj/structure/plasticflaps/mining/Destroy() //lazy hack to set the turf to allow air to pass if it's a simulated floor
+ var/turf/T = get_turf(loc)
+ if(T && istype(T, /turf/simulated/floor))
+ T.blocks_air = 0
+ ..()
/*
/obj/effect/marker/supplymarker
- icon_state = "X"
- icon = 'icons/misc/mark.dmi'
- name = "X"
- invisibility = 101
- anchored = 1
- opacity = 0
+ icon_state = "X"
+ icon = 'icons/misc/mark.dmi'
+ name = "X"
+ invisibility = 101
+ anchored = 1
+ opacity = 0
*/
/datum/supply_order
- var/ordernum
- var/datum/supply_packs/object = null
- var/orderedby = null
- var/comment = null
+ var/ordernum
+ var/datum/supply_packs/object = null
+ var/orderedby = null
+ var/comment = null
-//VOREStation Edit - Export reports
/datum/exported_crate
- var/name
- var/value
-//VOREStation Edit End
+ var/name
+ var/value
/datum/controller/supply
- //supply points
- var/points = 50
- var/points_per_process = 1.5
- var/points_per_slip = 2
- var/points_per_platinum = 5 // 5 points per sheet
- var/points_per_phoron = 5
- var/points_per_money = 0.02
- //control
- var/ordernum
- var/list/shoppinglist = list()
- var/list/requestlist = list()
- var/list/supply_packs = list()
- var/list/exported_crates = list() //VOREStation Edit - Export reports
- //shuttle movement
- var/movetime = 1200
- var/datum/shuttle/ferry/supply/shuttle
+ //supply points
+ var/points = 50
+ var/points_per_process = 1.5
+ var/points_per_slip = 2
+ var/points_per_platinum = 5 // 5 points per sheet
+ var/points_per_phoron = 5
+ var/points_per_money = 0.02
+ //control
+ var/ordernum
+ var/list/shoppinglist = list()
+ var/list/requestlist = list()
+ var/list/supply_packs = list()
+ var/list/exported_crates = list()
+ //shuttle movement
+ var/movetime = 1200
+ var/datum/shuttle/ferry/supply/shuttle
- New()
- ordernum = rand(1,9000)
+/datum/controller/supply/New()
+ ordernum = rand(1,9000)
- for(var/typepath in (typesof(/datum/supply_packs) - /datum/supply_packs))
- var/datum/supply_packs/P = new typepath()
- supply_packs[P.name] = P
+ for(var/typepath in (typesof(/datum/supply_packs) - /datum/supply_packs))
+ var/datum/supply_packs/P = new typepath()
+ supply_packs[P.name] = P
- // Supply shuttle ticker - handles supply point regeneration
- // This is called by the process scheduler every thirty seconds
- proc/process()
- points += points_per_process
+// Supply shuttle ticker - handles supply point regeneration
+// This is called by the process scheduler every thirty seconds
+/datum/controller/supply/proc/process()
+ points += points_per_process
- //To stop things being sent to CentCom which should not be sent to centcomm. Recursively checks for these types.
- proc/forbidden_atoms_check(atom/A)
- if(istype(A,/mob/living))
- return 1
- if(istype(A,/obj/item/weapon/disk/nuclear))
- return 1
- if(istype(A,/obj/machinery/nuclearbomb))
- return 1
- if(istype(A,/obj/item/device/radio/beacon))
- return 1
+//To stop things being sent to CentCom which should not be sent to centcomm. Recursively checks for these types.
+/datum/controller/supply/proc/forbidden_atoms_check(atom/A)
+ if(isliving(A))
+ return 1
+ if(istype(A,/obj/item/weapon/disk/nuclear))
+ return 1
+ if(istype(A,/obj/machinery/nuclearbomb))
+ return 1
+ if(istype(A,/obj/item/device/radio/beacon))
+ return 1
- for(var/i=1, i<=A.contents.len, i++)
- var/atom/B = A.contents[i]
- if(.(B))
- return 1
+ for(var/i=1, i<=A.contents.len, i++)
+ var/atom/B = A.contents[i]
+ if(.(B))
+ return 1
- //Sellin
- proc/sell()
- var/area/area_shuttle = shuttle.get_location_area()
- if(!area_shuttle) return
+//Sellin
+/datum/controller/supply/proc/sell()
+ var/area/area_shuttle = shuttle.get_location_area()
+ if(!area_shuttle) return
- callHook("sell_shuttle", list(area_shuttle));
+ callHook("sell_shuttle", list(area_shuttle));
- var/phoron_count = 0
- var/plat_count = 0
- var/money_count = 0
+ var/phoron_count = 0
+ var/plat_count = 0
+ var/money_count = 0
- exported_crates = list() //VOREStation Edit - Export reports
+ exported_crates = list()
- for(var/atom/movable/MA in area_shuttle)
- if(MA.anchored) continue
+ for(var/atom/movable/MA in area_shuttle)
+ if(MA.anchored) continue
- // Must be in a crate!
- if(istype(MA,/obj/structure/closet/crate))
- //VOREStation Edit - Export reports
- var/oldpoints = points
- var/oldphoron = phoron_count
- var/oldplatinum = plat_count
- var/oldmoney = money_count
- //VOREStation Edit End
+ // Must be in a crate!
+ if(istype(MA,/obj/structure/closet/crate))
+ var/oldpoints = points
+ var/oldphoron = phoron_count
+ var/oldplatinum = plat_count
+ var/oldmoney = money_count
- var/obj/structure/closet/crate/CR = MA
- callHook("sell_crate", list(CR, area_shuttle))
+ var/obj/structure/closet/crate/CR = MA
+ callHook("sell_crate", list(CR, area_shuttle))
- points += CR.points_per_crate
- var/find_slip = 1
+ points += CR.points_per_crate
+ var/find_slip = 1
- for(var/atom in CR)
- // Sell manifests
- var/atom/A = atom
- if(find_slip && istype(A,/obj/item/weapon/paper/manifest))
- var/obj/item/weapon/paper/manifest/slip = A
- if(!slip.is_copy && slip.stamped && slip.stamped.len) //yes, the clown stamp will work. clown is the highest authority on the station, it makes sense
- points += points_per_slip
- find_slip = 0
- continue
+ for(var/atom in CR)
+ // Sell manifests
+ var/atom/A = atom
+ if(find_slip && istype(A,/obj/item/weapon/paper/manifest))
+ var/obj/item/weapon/paper/manifest/slip = A
+ if(!slip.is_copy && slip.stamped && slip.stamped.len) //yes, the clown stamp will work. clown is the highest authority on the station, it makes sense
+ points += points_per_slip
+ find_slip = 0
+ continue
- // Sell phoron and platinum
- if(istype(A, /obj/item/stack))
- var/obj/item/stack/P = A
- switch(P.get_material_name())
- if("phoron") phoron_count += P.get_amount()
- if("platinum") plat_count += P.get_amount()
+ // Sell phoron and platinum
+ if(istype(A, /obj/item/stack))
+ var/obj/item/stack/P = A
+ switch(P.get_material_name())
+ if("phoron") phoron_count += P.get_amount()
+ if("platinum") plat_count += P.get_amount()
- //Sell spacebucks
- if(istype(A, /obj/item/weapon/spacecash))
- var/obj/item/weapon/spacecash/cashmoney = A
- money_count += cashmoney.worth
+ //Sell spacebucks
+ if(istype(A, /obj/item/weapon/spacecash))
+ var/obj/item/weapon/spacecash/cashmoney = A
+ money_count += cashmoney.worth
- //VOREStation Edit - Export reports
- var/datum/exported_crate/EC = new /datum/exported_crate()
- EC.name = CR.name
- EC.value = points - oldpoints
- EC.value += (phoron_count - oldphoron) * points_per_phoron
- EC.value += (plat_count - oldplatinum) * points_per_platinum
- EC.value += (money_count - oldmoney) * points_per_money
- exported_crates += EC
- //VOREStation Edit End
+ var/datum/exported_crate/EC = new /datum/exported_crate()
+ EC.name = CR.name
+ EC.value = points - oldpoints
+ EC.value += (phoron_count - oldphoron) * points_per_phoron
+ EC.value += (plat_count - oldplatinum) * points_per_platinum
+ EC.value += (money_count - oldmoney) * points_per_money
+ exported_crates += EC
- qdel(MA)
+ qdel(MA)
- if(phoron_count)
- points += phoron_count * points_per_phoron
+ points += phoron_count * points_per_phoron
+ points += plat_count * points_per_platinum
+ points += money_count * points_per_money
- if(plat_count)
- points += plat_count * points_per_platinum
+//Buyin
+/datum/controller/supply/proc/buy()
+ if(!shoppinglist.len)
+ return
- if(money_count)
- points += money_count * points_per_money
+ var/orderedamount = shoppinglist.len
- //Buyin
- proc/buy()
- if(!shoppinglist.len) return
+ var/area/area_shuttle = shuttle.get_location_area()
+ if(!area_shuttle)
+ return
- var/orderedamount = shoppinglist.len
+ var/list/clear_turfs = list()
- var/area/area_shuttle = shuttle.get_location_area()
- if(!area_shuttle) return
+ for(var/turf/T in area_shuttle)
+ if(T.density)
+ continue
+ var/contcount
+ for(var/atom/A in T.contents)
+ if(!A.simulated)
+ continue
+ contcount++
+ if(contcount)
+ continue
+ clear_turfs += T
- var/list/clear_turfs = list()
+ for(var/S in shoppinglist)
+ if(!clear_turfs.len) break
+ var/i = rand(1,clear_turfs.len)
+ var/turf/pickedloc = clear_turfs[i]
+ clear_turfs.Cut(i,i+1)
+ shoppinglist -= S
- for(var/turf/T in area_shuttle)
- if(T.density) continue
- var/contcount
- for(var/atom/A in T.contents)
- if(!A.simulated)
- continue
- contcount++
- if(contcount)
- continue
- clear_turfs += T
+ var/datum/supply_order/SO = S
+ var/datum/supply_packs/SP = SO.object
- for(var/S in shoppinglist)
- if(!clear_turfs.len) break
- var/i = rand(1,clear_turfs.len)
- var/turf/pickedloc = clear_turfs[i]
- clear_turfs.Cut(i,i+1)
- shoppinglist -= S
+ var/obj/A = new SP.containertype(pickedloc)
+ A.name = "[SP.containername] [SO.comment ? "([SO.comment])":"" ]"
- var/datum/supply_order/SO = S
- var/datum/supply_packs/SP = SO.object
+ //supply manifest generation begin
+ var/obj/item/weapon/paper/manifest/slip
+ if(!SP.contraband)
+ slip = new /obj/item/weapon/paper/manifest(A)
+ slip.is_copy = 0
+ slip.info = "
[command_name()] Shipping Manifest
"
+ slip.info +="Order #[SO.ordernum]
"
+ slip.info +="Destination: [station_name()]
"
+ slip.info +="[orderedamount] PACKAGES IN THIS SHIPMENT
"
+ slip.info +="CONTENTS:
"
- var/obj/A = new SP.containertype(pickedloc)
- A.name = "[SP.containername] [SO.comment ? "([SO.comment])":"" ]"
+ //spawn the stuff, finish generating the manifest while you're at it
+ if(SP.access)
+ if(isnum(SP.access))
+ A.req_access = list(SP.access)
+ else if(islist(SP.access))
+ var/list/L = SP.access // access var is a plain var, we need a list
+ A.req_access = L.Copy()
+ else
+ log_debug("Supply pack with invalid access restriction [SP.access] encountered!")
- //supply manifest generation begin
+ var/list/contains
+ if(istype(SP,/datum/supply_packs/randomised))
+ var/datum/supply_packs/randomised/SPR = SP
+ contains = list()
+ if(SPR.contains.len)
+ for(var/j=1,j<=SPR.num_contained,j++)
+ contains += pick(SPR.contains)
+ else
+ contains = SP.contains
- var/obj/item/weapon/paper/manifest/slip
- if(!SP.contraband)
- slip = new /obj/item/weapon/paper/manifest(A)
- slip.is_copy = 0
- slip.info = "[command_name()] Shipping Manifest
"
- slip.info +="Order #[SO.ordernum]
"
- slip.info +="Destination: [station_name()]
"
- slip.info +="[orderedamount] PACKAGES IN THIS SHIPMENT
"
- slip.info +="CONTENTS:
"
+ for(var/typepath in contains)
+ if(!typepath) continue
+ var/number_of_items = max(1, contains[typepath])
+ for(var/j = 1 to number_of_items)
+ var/atom/B2 = new typepath(A)
+ if(slip) slip.info += "- [B2.name]
" //add the item to the manifest
- //spawn the stuff, finish generating the manifest while you're at it
- if(SP.access)
- if(isnum(SP.access))
- A.req_access = list(SP.access)
- else if(islist(SP.access))
- var/list/L = SP.access // access var is a plain var, we need a list
- A.req_access = L.Copy()
- else
- world << "Supply pack with invalid access restriction [SP.access] encountered!"
+ //manifest finalisation
+ if(slip)
+ slip.info += "
"
+ slip.info += "CHECK CONTENTS AND STAMP BELOW THE LINE TO CONFIRM RECEIPT OF GOODS
"
- var/list/contains
- if(istype(SP,/datum/supply_packs/randomised))
- var/datum/supply_packs/randomised/SPR = SP
- contains = list()
- if(SPR.contains.len)
- for(var/j=1,j<=SPR.num_contained,j++)
- contains += pick(SPR.contains)
- else
- contains = SP.contains
-
- for(var/typepath in contains)
- if(!typepath) continue
- var/number_of_items = max(1, contains[typepath])
- for(var/j = 1 to number_of_items)
- var/atom/B2 = new typepath(A)
- if(slip) slip.info += "- [B2.name]
" //add the item to the manifest
-
- //manifest finalisation
- if(slip)
- slip.info += "
"
- slip.info += "CHECK CONTENTS AND STAMP BELOW THE LINE TO CONFIRM RECEIPT OF GOODS
"
-
- return
\ No newline at end of file
+ return
diff --git a/code/game/turfs/flooring/flooring.dm b/code/game/turfs/flooring/flooring.dm
index 1affecf04f..ffa396e811 100644
--- a/code/game/turfs/flooring/flooring.dm
+++ b/code/game/turfs/flooring/flooring.dm
@@ -67,6 +67,13 @@ var/list/flooring_types
desc = "A layer of many tiny bits of frozen water. It's hard to tell how deep it is."
icon = 'icons/turf/snow_new.dmi'
icon_base = "snow"
+ footstep_sounds = list("human" = list(
+ 'sound/effects/footstep/snow1.ogg',
+ 'sound/effects/footstep/snow2.ogg',
+ 'sound/effects/footstep/snow3.ogg',
+ 'sound/effects/footstep/snow4.ogg',
+ 'sound/effects/footstep/snow5.ogg'))
+
/decl/flooring/snow/snow2
name = "snow"
diff --git a/code/game/turfs/flooring/flooring_decals.dm b/code/game/turfs/flooring/flooring_decals.dm
index ea9a7f77fb..8d24e46765 100644
--- a/code/game/turfs/flooring/flooring_decals.dm
+++ b/code/game/turfs/flooring/flooring_decals.dm
@@ -6,7 +6,7 @@ var/list/floor_decals = list()
/obj/effect/floor_decal
name = "floor decal"
icon = 'icons/turf/flooring/decals_vr.dmi' // VOREStation Edit
- layer = DECALS_LAYER
+ plane = DECAL_PLANE
var/supplied_dir
/obj/effect/floor_decal/New(var/newloc, var/newdir, var/newcolour)
diff --git a/code/game/turfs/simulated/floor_icon.dm b/code/game/turfs/simulated/floor_icon.dm
index 1faf198ced..a7cab51424 100644
--- a/code/game/turfs/simulated/floor_icon.dm
+++ b/code/game/turfs/simulated/floor_icon.dm
@@ -7,7 +7,7 @@ var/image/no_ceiling_image = null
return TRUE
/proc/cache_no_ceiling_image()
- no_ceiling_image = image(icon = 'icons/turf/open_space.dmi', icon_state = "no_ceiling", layer = OVERTURF_LAYER)
+ no_ceiling_image = image(icon = 'icons/turf/open_space.dmi', icon_state = "no_ceiling")
no_ceiling_image.plane = PLANE_MESONS
/turf/simulated/floor/update_icon(var/update_neighbors)
diff --git a/code/game/turfs/simulated/outdoors/snow.dm b/code/game/turfs/simulated/outdoors/snow.dm
index 9926c4704a..5fed8af66b 100644
--- a/code/game/turfs/simulated/outdoors/snow.dm
+++ b/code/game/turfs/simulated/outdoors/snow.dm
@@ -3,12 +3,14 @@
icon_state = "snow"
edge_blending_priority = 6
movement_cost = 2
+ initial_flooring = /decl/flooring/snow
turf_layers = list(
/turf/simulated/floor/outdoors/rocks,
/turf/simulated/floor/outdoors/dirt
)
var/list/crossed_dirs = list()
+
/turf/simulated/floor/outdoors/snow/Entered(atom/A)
if(isliving(A))
var/mdir = "[A.dir]"
@@ -51,5 +53,5 @@
if(istype(M, /mob/living))
if(M.stunned == 0)
to_chat(M, "You slide across the ice!")
- M.SetStunned(2)
+ M.SetStunned(1)
step(M,M.dir)
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index 21fd9492f0..e5bb57ad9e 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -252,7 +252,7 @@
O.icon_state = "2"
O.anchored = 1
O.density = 1
- O.layer = 5
+ O.plane = ABOVE_PLANE
if(girder_material.integrity >= 150 && !girder_material.is_brittle()) //Strong girders will remain in place when a wall is melted.
dismantle_wall(1,1)
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index e874d6ddee..27f8bd6c14 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -1,5 +1,7 @@
/turf
icon = 'icons/turf/floors.dmi'
+ layer = TURF_LAYER
+ plane = TURF_PLANE
level = 1
var/holy = 0
diff --git a/code/game/turfs/unsimulated/shuttle.dm b/code/game/turfs/unsimulated/shuttle.dm
index 99f5bc15bd..cb70c6c36d 100644
--- a/code/game/turfs/unsimulated/shuttle.dm
+++ b/code/game/turfs/unsimulated/shuttle.dm
@@ -3,7 +3,6 @@
icon = 'icons/turf/shuttle_white.dmi'
thermal_conductivity = 0.05
heat_capacity = 0
- layer = 2
/turf/unsimulated/shuttle/wall
name = "wall"
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 7c5b9194d8..28f8036a5a 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -7,6 +7,7 @@ var/global/floorIsLava = 0
/proc/message_admins(var/msg)
msg = "ADMIN LOG: [msg]"
//log_adminwarn(msg) //log_and_message_admins is for this
+
for(var/client/C in admins)
if((R_ADMIN|R_MOD) & C.holder.rights)
C << msg
diff --git a/code/modules/blob2/blobs/base_blob.dm b/code/modules/blob2/blobs/base_blob.dm
index ba9f41c403..19461e68c8 100644
--- a/code/modules/blob2/blobs/base_blob.dm
+++ b/code/modules/blob2/blobs/base_blob.dm
@@ -285,7 +285,8 @@ var/list/blobs = list()
name = "blob"
desc = "The blob lashing out at something."
icon_state = "blob_attack"
- layer = 5.2
+ plane = MOB_PLANE
+ layer = ABOVE_MOB_LAYER
time_to_die = 6
alpha = 140
mouse_opacity = 0
diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm
index 88b001dd89..203527fb18 100644
--- a/code/modules/client/preference_setup/general/03_body.dm
+++ b/code/modules/client/preference_setup/general/03_body.dm
@@ -282,21 +282,21 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
. += "Hair
"
if(has_flag(mob_species, HAS_HAIR_COLOR))
- . += "Change Color "
+ . += "Change Color "
. += " Style: [pref.h_style]
"
. += "
Facial
"
if(has_flag(mob_species, HAS_HAIR_COLOR))
- . += "Change Color "
+ . += "Change Color "
. += " Style: [pref.f_style]
"
if(has_flag(mob_species, HAS_EYE_COLOR))
. += "
Eyes
"
- . += "Change Color
"
+ . += "Change Color
"
if(has_flag(mob_species, HAS_SKIN_COLOR))
. += "
Body Color
"
- . += "Change Color
"
+ . += "Change Color
"
. += "
Body Markings +
"
for(var/M in pref.body_markings)
@@ -307,7 +307,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
. += "
"
. += "Allow Synth color: [pref.synth_color ? "Yes" : "No"]
"
if(pref.synth_color)
- . += "Change Color "
+ . += "Change Color "
. = jointext(.,null)
diff --git a/maps/southern_cross/items/clothing/sc_head.dm b/code/modules/clothing/head/pilot_helmet.dm
similarity index 93%
rename from maps/southern_cross/items/clothing/sc_head.dm
rename to code/modules/clothing/head/pilot_helmet.dm
index f6be4cac96..feb60ae3a3 100644
--- a/maps/southern_cross/items/clothing/sc_head.dm
+++ b/code/modules/clothing/head/pilot_helmet.dm
@@ -4,11 +4,10 @@
name = "pilot helmet"
desc = "Standard pilot gear. Protects the head from impacts."
icon_state = "pilot_helmet1"
- item_icons = list(slot_head_str = 'maps/southern_cross/icons/mob/sc_head.dmi')
- icon = 'maps/southern_cross/icons/obj/sc_hats.dmi'
+ item_icons = list(slot_head_str = 'icons/mob/pilot_helmet.dmi')
sprite_sheets = list(
- "Teshari" = 'maps/southern_cross/icons/mob/species/teshari/sc_head.dmi'
- )
+ SPECIES_TESHARI = 'icons/mob/species/seromi/pilot_helmet.dmi'
+ )
flags = THICKMATERIAL
armor = list(melee = 20, bullet = 10, laser = 10, energy = 5, bomb = 10, bio = 0, rad = 0)
flags_inv = HIDEEARS
@@ -190,9 +189,6 @@
name = "pilot helmet"
desc = "Standard pilot gear. Protects the head from impacts. This one has a retractable visor"
icon_state = "pilot_helmet2"
- sprite_sheets = list(
- "Teshari" = 'maps/southern_cross/icons/mob/species/teshari/sc_head.dmi'
- )
action_button_name = "Toggle Visor"
/obj/item/clothing/head/pilot/alt/attack_self(mob/user as mob)
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index fcb3040f81..40ce8258af 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -45,7 +45,6 @@
icon_state = "riot"
item_state_slots = list(slot_r_hand_str = "swat", slot_l_hand_str = "swat")
armor = list(melee = 80, bullet = 10, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0)
- flags_inv = HIDEJUMPSUIT
siemens_coefficient = 0.5
/obj/item/clothing/suit/armor/riot/alt
@@ -115,7 +114,7 @@
icon_state = "swatarmor"
item_state_slots = list(slot_r_hand_str = "swat", slot_l_hand_str = "swat")
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
- flags_inv = HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER
+ flags_inv = HIDETIE|HIDEHOLSTER
slowdown = 1
armor = list(melee = 60, bullet = 60, laser = 60, energy = 40, bomb = 40, bio = 0, rad = 0)
siemens_coefficient = 0.7
@@ -311,7 +310,7 @@
desc = "An armoured jacket with silver rank pips and livery."
icon_state = "warden_jacket"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
- flags_inv = HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER
+ flags_inv = HIDETIE|HIDEHOLSTER
/obj/item/clothing/suit/storage/vest/wardencoat/alt
name = "Warden's jacket"
@@ -332,7 +331,7 @@
desc = "A greatcoat enhanced with a special alloy for some protection and style."
icon_state = "hos"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
- flags_inv = HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER
+ flags_inv = HIDETIE|HIDEHOLSTER
//Jensen cosplay gear
/obj/item/clothing/suit/storage/vest/hoscoat/jensen
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index 5b3a08f3ab..182449b765 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -45,7 +45,7 @@
desc = "A long, flowing white robe. It looks comfortable, but not very warm."
icon_state = "whiteout_robe"
item_state_slots = list(slot_r_hand_str = "suit_white", slot_l_hand_str = "suit_white")
- flags_inv = HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER
+ flags_inv = HIDETIE|HIDEHOLSTER
hoodtype = /obj/item/clothing/head/chaplain_hood/whiteout
//Chaplain
diff --git a/code/modules/economy/economy_misc.dm b/code/modules/economy/economy_misc.dm
index 84a187ef91..3ab22c662d 100644
--- a/code/modules/economy/economy_misc.dm
+++ b/code/modules/economy/economy_misc.dm
@@ -92,6 +92,7 @@ var/global/economy_init = 0
news_network.CreateFeedChannel("The [using_map.starsys_name] Times", "[using_map.starsys_name] Times ExoNode - [using_map.station_short]", 1, 1)
news_network.CreateFeedChannel("The Gibson Gazette", "Editor Mike Hammers", 1, 1)
+ news_network.CreateFeedChannel("Oculum Content Aggregator", "Oculus v6rev7", 1, 1)
for(var/loc_type in typesof(/datum/trade_destination) - /datum/trade_destination)
var/datum/trade_destination/D = new loc_type
diff --git a/code/modules/economy/lorenews.dm b/code/modules/economy/lorenews.dm
new file mode 100644
index 0000000000..e18525e03d
--- /dev/null
+++ b/code/modules/economy/lorenews.dm
@@ -0,0 +1,110 @@
+/datum/event/lore_news
+ endWhen = 10
+
+/datum/event/lore_news/announce()
+ var/author = "Oculus v6rev7"
+ var/channel = "Oculum Content Aggregator"
+
+
+ //locations by region for later pick()
+ //probably would be good to move these to a global somehwere but fuck if I know how to do that
+ var/list/rim = list("Shelf", "Vounna", "Relan", "Whythe", "Angessa's Pearl") // this is also the Association list for most purposes
+ var/list/crescent = list("Saint Columbia", "Ganesha", "Gavel", "Oasis", "Kess-Gendar") //Vir not included
+ var/list/core = list("Sol", "Alpha Centauri", "Tau Ceti", "Altair")
+ var/list/heights = list("New Ohio", "Mahi-Mahi", "Parvati", "Sidhe", "New Seoul")
+ var/list/bowl = list("Zhu Que", "New Singapore", "Isavau's Gamble", "Love", "Viola", "Stove")
+ var/list/crypt = list("El", "Jahan's Post", "Abel's Rest", "Raphael", "Thoth", "Terminus")
+ var/list/weird = list("Silk", "Nyx") //no region
+
+ //by government
+ var/list/solgov = crescent + core + heights + bowl + crypt + weird
+ var/list/skrell = list("Qerr'Vallis", "Qerma-Lakirr", "Harrqak", "Kauq'xum")
+ var/list/skrellfar = list("The Far Kingdom of Light and Shifting Shadow")// more colonies Elgeon
+ var/list/unathi = list("Moghes", "Qerrna-Qamxea", "Abel's Rest") // more colonies Anewbe
+ var/list/tajara = list("Rarkajar", "Mesomori", "Arathiir")
+ var/list/independent = list("New Kyoto", "Casini's Reach", "Ue'Orsi", "Natuna", "Neon Light")
+
+ //this is what you should pick for most applications
+ //whether or not the rim goes there is something that should be changed per the metaplot
+ var/list/loc = solgov + skrell + tajara
+
+ //this includes systems Sol doesn't really have eyes on
+ //var/list/allloc = loc + unathi + skrellfar + independent + rim
+
+ //copied right from organizations.dm
+ var/list/ship_names = list(
+ "Kestrel",
+ "Beacon",
+ "Signal",
+ "Freedom",
+ "Glory",
+ "Axiom",
+ "Eternal",
+ "Harmony",
+ "Light",
+ "Discovery",
+ "Endeavor",
+ "Explorer",
+ "Swift",
+ "Dragonfly",
+ "Ascendant",
+ "Tenacious",
+ "Pioneer",
+ "Hawk",
+ "Haste",
+ "Radiant",
+ "Luminous"
+ )
+
+ //generated based on Cerebulon's thing on the wiki
+ var/list/prefixes = list("IAV","ICV","IDV","IDV","IEV","IFV","IIV","ILV","IMV","IRV","ISV","ITV","SCG-A","SCG-C","SCG-D","SCG-D","SCG-E","SCG-F","SCG-I","SCG-L","SCG-M","SCG-R","SCG-S","SCG-T","BAV","BCV","BDV","BDV","BEV","BFV","BIV","BLV","BMV","BRV","BSV","BTV","HAV","HCV","HDV","HDV","HEV","HFV","HIV","HLV","HMV","HRV","HSV","HTV","MAV","MCV","MDV","MDV","MEV","MFV","MIV","MLV","MMV","MRV","MSV","MTV","NAV","NCV","NDV","NDV","NEV","NFV","NIV","NLV","NMV","NRV","NSV","NTV","VAV","VCV","VDV","VDV","VEV","VFV","VIV","VLV","VMV","VRV","VSV","VTV","WAV","WCV","WDV","WDV","WEV","WFV","WIV","WLV","WMV","WRV","WSV","WTV","XAV","XCV","XDV","XDV","XEV","XFV","XIV","XLV","XMV","XRV","XSV","XTV","ZAV","ZCV","ZDV","ZDV","ZEV","ZFV","ZIV","ZLV","ZMV","ZRV","ZSV","ZTV","GAV","GCV","GDV","GDV","GEV","GFV","GIV","GLV","GMV","GRV","GSV","GTV","AAV","ACV","ADV","ADV","AEV","AFV","AIV","ALV","AMV","ARV","ASV","ATV","LAV","LCV","LDV","LDV","LEV","LFV","LIV","LLV","LMV","LRV","LSV","LTV")
+
+ //var/datum/trade_destination/affected_dest = pick(weighted_mundaneevent_locations) //shouldn't do anything, not removing it to avoid breaking shit
+ //formatting breaks my fucking eyes
+ var/body = pick("A high-ranking Vey-Med executive was revealed to have been experimenting on biological neural enhancement techniques, believed to be of Skrellian origin, which could lead to the production of transhuman entities with an average cognitive capacity 30% greater than a baseline human.",
+ "[random_name(MALE)], chairman of the controversial Friends of Ned party, is scheduled to speak at a prominant university in [pick(core)] this Monday, according to a statement on his official newsfeed.",
+ "A wing of Ward-Takahashi B-class drones became catatonic this Thursday after tripping late-stage anti-emergence protocols. W-T Chief of Development has declined to comment.",
+ "A brand-new shipment of recreational voidcraft has been deemed \"Unsafe for use\" and seized at [pick(solgov)] customs. Wulf Aeronautics blames error in automated manufactory on [pick(solgov)], assures shareholders of \"One time incident\" after shares drop 4%.",
+ "Activity in a mostly automated Xion work-site in [pick(solgov)] has been suspended indefinitely, after reports of atypical drone behavior. The EIO's assigned investigator commented on the shutdown, saying \"We'll get them up and running again as soon as we're sure it's safe.\" No comment so far on an estimated time or date of reopening.",
+ "The EIO has officially raised the Emergence Threat Level in [pick(solgov)] to Blue. Citizens are reminded to comply with all EIO Agent requests. Failure to do so will be met with legal action, up to and including imprisonment.",
+ "All SolGov citizens beware, the scourge know as the Vox have increased the frequency of their attacks on isolated and poorly defended SolGov territories in [pick(bowl)]. Citizens have been advised to travel in groups and remain aware of their surroundings at all times.",
+ "The Unathi have recently moved a large amount of material into Abel's Rest, under the premise of building additional power plants. According to our sources, the material is in fact being channeled into domestic terrorist groups on both sides, in an attempt to incite a SolGov response. More news as the story develops.",
+ "Controversial Kishari director [random_name(FEMALE)] announced this Friday a sequel to the 2525 animated series Soldiers of the Yearlong War. Open auditions for supporting cast members have been called.",
+ "Amid concerns that it promotes a pro-transtech agenda, a high-profile screening of the award-winning animated film \"The Inventor's Marvelous Mechanical Maidens\" was canceled today on [pick(pick(core, heights))].",
+ "A radiation leak caused by a power unit rupture at a [pick(solgov)] hazardous materials reclamation plant has left several workers and neighboring residents with acute radiation poisoning. Witnesses report that a basic lifting drone failed to recognize and collided with the misplaced unit.",
+ "Xenophobic fringe group Humanity First has claimed credit for a bombing at a local government office on [pick(solgov)] which left three seriously injured. Police report that they have two suspects in custody, but details remain sparse.",
+ "Government official [random_name(MALE)] reports that the crew of the [pick(prefixes)] [pick(ship_names)], the vessel boarded by Jaguar Gang pirates earlier this week, are \"Safe, unharmed, and happy to be back at work.\" Officials were unable to comment on future security measures at this time.",
+ "Sanitation Technician [random_name(FEMALE)] says she was trapped in her work bathroom for three days after the locking system went haywire! The furious techie says she wants a \"hefty sum\" from her employers and that she won't be visiting that cubicle again any time soon!",
+ "Experts at a top university have said that almost every position in modern society might be filled by a robot within the next few decades if production continues at its current rate. Workers' Rights groups have expressed alarm at the news, and have called for protections against the \"Tin menace\".",
+ "An alleged cyberattack on Bishop Cybernetics systems reported to have resulted in the theft of customer data including detailed medical and biological records has been dismissed as \"Unfounded scaremongering\" by company executives.",
+ "[pick(crescent)] resident [random_name(FEMALE)] says she was overjoyed when her son told her he was planning to get married, but was appalled to find the bride-to-be was a common household cleaning drone! GR3TA assures us that \"Cleaning is complete.\"",
+ "Striking workers at a manufacturing plant on [pick(bowl)] have returned to work after news spread that plant owners would relocate operations to an automated facility if production did not resume by the end of the month. Factory investor [random_name(FEMALE)] expressed admiration at the \"Decisive action\" taken by the company.",
+ "Police in [pick(core)] report that they have arrested a man in connection with multinationalist fringe group Nation of Mars. Authorities were alerted when the man's ID was flagged by new screening software at the city spaceport as a known sympathizer with the violent terrorist organization.",
+ "The mystery of the [pick(prefixes)] [pick(ship_names)] has come to its end as a member of the vessel's skeleton crew was arrested in connection with Golden Tiger activities on the Skrell border. According to authorities, the ship - declared missing some months ago - was illegally sold to criminal elements on its way to breaking yards at [pick(heights)].",
+ "[random_name(MALE)] comes clean about his decade-long nightmare kept as a slave on Eutopia in a new book to be released later this year. The harried author has fought lawsuits at every turn that claim that his account is \"A work of pure fiction with an obvious leftist agenda.\"",
+ "Gas mask toting Revolutionary Solar People's Party extremists have reportedly attacked police at a rally in [pick(crypt)]. Peace-keeping officers were viscously pelted with objects and several protesters were found to be equipped with bottles containing an \"unknown substance.\"",
+ "Be careful what you say around your personal AI device as you never know who might be listening, say top minds! Cybercrime expert [random_name(FEMALE)] says hackers can easily trick your device to listen in on your conversations, record you in secret, or even steal your identity!",
+ "Thousands of travellers have been stranded at [pick(loc)] spaceport as a major error with the artificial intelligence system purged weeks worth of scheduling and manifest data from the port's mainframe. Major Bill's Transportation is offering stranded passengers 20% off replacement flights.",
+ "An outraged pet owner claims that a cybernetic company in [pick(solgov)] performed \"disturbing\" surgeries on their beloved cat, Pickles. [random_name(PLURAL)], 58 claims that the local cybernetics firm stole the furry friend from the vet's office and \"Replaced his brain with ones and zeroes.\"",
+ "Doctors in [pick(pick(skrell, heights))] were left in awe and horror as a Teshari was hatched with the features of an adult human man! Sources say that the youngster hatched with a full head of hair and could recite six nursery rhymes from memory. Could Skrell genetic experiments be to blame?",
+ "Miners in [pick(bowl)] were dismayed to discover that their boss was actually a C-class drone intelligence! \"I should've known there was something wrong,\" says dumbfounded miner [random_name(MALE)],\"I'd say good morning and he'd just start listing off mineral densities and coordinates. I just thought he loved his job a little too much.\"",
+ "The remains of an early 22nd century voidcraft containing \"Period artifacts, technology and human remains\" has been located on the surface of Luna after centuries of being disregarded as worthless wreck. Historians hope the find will provide insight into daily life under the short-lived Selene Federation.",
+ "The unexpected discovery of the remains of a what was believed to be a previously undiscovered species by workers on [pick("Nisp", "Binma", "Sif", "Kishar", "Abel's Rest", "Merelar")] has now been dismissed. Upon close analysis of the specimen, it was identified as a \"Bear with mange\", apparently dumped there some weeks prior.",
+ "According to a public statement by electronics giant Ward-Takahashi, many artificial intelligence systems - ranging from household appliances to industrial drones and habitat control networks - manufactured before 2550 could be at risk from a new virus dubbed \"Cap-3k\".",
+ "A controversial opera billed as \"The true story of Nos Amis\" has been criticized by law enforcement agencies as \"glorifying\" some of the most infamous gangsters of the 22nd century. The Polish-language \"Z Francji, do Gwiazd\" is to be distributed exclusively in Alpha Centauri for one week only.",
+ "Injury count continues to rise in the aftermath of the Positronic Rights Group Rally in [pick(pick(bowl, core, heights))]. Homemade teargas grenades were launched into the crowd at approximately 3:45 pm on Saturday by an unidentified person. Authorities urge anyone with information to call in, toll-free, at any time.",
+ "Representatives report that investigations continue on a string of fires on [pick("Nisp", "Binma", "Sif", "Kishar", "Abel's Rest", "Merelar")]. While no information has been released to the public, authorities assure the press that they are doing everything in their power to find those responsible.",
+ "En-route to the contentious rim system, a medical aid mission to Natuna was stopped by Ue-Katish pirates masquerading as refugees, who boarded the ship and stripped it of all supplies.",
+ "Lead Singer of Strawberry Idol Revealed As Three Teshari In A Trench Coat-- Newest gimmick or shocking revelation??",
+ "Shocking art critics throughout the system, a recent submission to the [pick(solgov)] Museum of Absurdism's contemporary exhibit was revealed to actually be the nutritional information on the back of a dehydrated cereal product common in Skrell space.",
+ "The celebrated magical kid series \"Petit Yuusha Jossen Temonila\" has announced its newest season at the height of its demicentenial festival. Noted director [random_name(MALE)] has promised to bring a diverse production staff to the venerable series, and has stated a theme of \"the friendships that transcend borders\".",
+ "The Hephaestus Industries board of directors announced this Monday the highest annual profits since the height of the Lizard Riots.",
+ "A radical group of Mercurials were convicted today of violations of Five Points legislature at an extraordinary court on [pick(solgov)]. These convictions come at the heels of a successful sting operation six years in the making, lead by local Head of EIO [random_name(FEMALE)].",
+ "An unnamed official of the shipping TSC Major Bill's Transportation narrowly escaped an attempt on their life by a deranged assassin. The assassin claims to have been driven to this henious act by the corporation's infamous jingle.",
+ "In the aftermath of yesterday's synthphobic rally on [pick(solgov)], three positronic citizens were left irreparably damaged by a hostile mob, who claim that the victims were \"AAs\" attempting to infiltrate the rally.",
+ "EIO spokesperson [random_name(MALE)] stated in a press conference yesterday that the \"Shakespear\" A-class codeline was briefly available for download on the darknet, although they claim to be \"confident that the leak was shut down before any significant portion could be downloaded\". Experts suspect Association involvement.",
+ "[pick("Strives Towards", "Embraces", "Dreams of", "Cultivates", "Advocates", "Exemplifies")] [pick("Strength", "Wisdom", "Independence", "Pragmatism", "Reason", "Development")], a Community Child from Angessa's Pearl, published his memoir today, detailing a shocking level of abuse by caretakers and educators.",
+ "Nova Sixty, Mercurial web personality, claims that the disappearence of the SCG-R Song Shi was a plot by \"extradimensional rockmen\" who intend to sow mistrust between the Association and SolGov. Quote Sixty, \"The Far Kingdoms' attempt to hide the TRUTH only proves that they and their rockman allies are NOT to be trusted.\"",
+ )
+
+ news_network.SubmitArticle(body, author, channel, null, 1)
diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm
index 7f234b1455..3a57a7d753 100644
--- a/code/modules/events/event_container.dm
+++ b/code/modules/events/event_container.dm
@@ -140,6 +140,7 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Space Dust", /datum/event/dust , 60, list(ASSIGNMENT_ENGINEER = 20), 0, 0, 50),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Trivial News", /datum/event/trivial_news, 400),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Ian Storm", /datum/event/ianstorm, 50),
+ new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Lore News", /datum/event/lore_news, 400),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Vermin Infestation",/datum/event/infestation, 100, list(ASSIGNMENT_JANITOR = 100)),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Wallrot", /datum/event/wallrot, 0, list(ASSIGNMENT_ENGINEER = 30, ASSIGNMENT_GARDENER = 50)),
)
diff --git a/code/modules/events/event_dynamic.dm b/code/modules/events/event_dynamic.dm
index 9f8eca869c..b1a537639d 100644
--- a/code/modules/events/event_dynamic.dm
+++ b/code/modules/events/event_dynamic.dm
@@ -48,6 +48,7 @@ var/list/event_last_fired = list()
possibleEvents[/datum/event/economic_event] = 300
possibleEvents[/datum/event/trivial_news] = 400
possibleEvents[/datum/event/mundane_news] = 300
+ possibleEvents[/datum/event/lore_news] = 300 // up this if the above ones get removed as they damn well should
possibleEvents[/datum/event/pda_spam] = max(min(25, player_list.len) * 4, 200)
possibleEvents[/datum/event/money_lotto] = max(min(5, player_list.len), 50)
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index 3c3f1fd194..568cf8f44f 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -47,7 +47,7 @@ mob/living/carbon/proc/handle_hallucinations()
if(!H.r_store) slots_free += ui_storage2
if(slots_free.len)
halitem.screen_loc = pick(slots_free)
- halitem.layer = 50
+ halitem.hud_layerise()
switch(rand(1,6))
if(1) //revolver
halitem.icon = 'icons/obj/gun.dmi'
diff --git a/code/modules/hydroponics/spreading/spreading.dm b/code/modules/hydroponics/spreading/spreading.dm
index f08f28d97a..c35d4b489a 100644
--- a/code/modules/hydroponics/spreading/spreading.dm
+++ b/code/modules/hydroponics/spreading/spreading.dm
@@ -51,7 +51,6 @@
density = 0
icon = 'icons/obj/hydroponics_growing.dmi'
icon_state = "bush4-1"
- layer = 3
pass_flags = PASSTABLE
mouse_opacity = 2
@@ -192,12 +191,12 @@
icon_state = "[seed.get_trait(TRAIT_PLANT_ICON)]-[growth]"
if(growth>2 && growth == max_growth)
- layer = 5
+ plane = ABOVE_PLANE
set_opacity(1)
if(!isnull(seed.chems["woodpulp"]))
density = 1
else
- layer = 3
+ reset_plane_and_layer()
density = 0
/obj/effect/plant/proc/calc_dir()
diff --git a/code/modules/lighting/lighting_overlay.dm b/code/modules/lighting/lighting_overlay.dm
index cade937bfb..5e97aa6818 100644
--- a/code/modules/lighting/lighting_overlay.dm
+++ b/code/modules/lighting/lighting_overlay.dm
@@ -5,7 +5,6 @@
simulated = 0
anchored = 1
icon = LIGHTING_ICON
- layer = LIGHTING_LAYER
plane = PLANE_LIGHTING
//invisibility = INVISIBILITY_LIGHTING
color = LIGHTING_BASE_MATRIX
diff --git a/code/modules/lore_codex/news_data/main.dm b/code/modules/lore_codex/news_data/main.dm
index 2a59e12d5e..2b0c7a4a81 100644
--- a/code/modules/lore_codex/news_data/main.dm
+++ b/code/modules/lore_codex/news_data/main.dm
@@ -4,11 +4,13 @@
region. Each is labled by date of publication and title. This list is self-updating, and from time to time the publisher will push new \
articles. You are encouraged to check back frequently."
children = list(
- /datum/lore/codex/page/article1,
- /datum/lore/codex/page/article2,
- /datum/lore/codex/page/article3,
- /datum/lore/codex/page/article4,
+ /datum/lore/codex/page/article7,
+ /datum/lore/codex/page/article6,
/datum/lore/codex/page/article5,
+ /datum/lore/codex/page/article4,
+ /datum/lore/codex/page/article3,
+ /datum/lore/codex/page/article2,
+ /datum/lore/codex/page/article1,
/datum/lore/codex/page/about_news,
)
@@ -20,7 +22,7 @@
information, feel free to visit our homepage at oc.about.tsc, or the sites of any of our constituents."
/datum/lore/codex/page/article1
- name = "08/30/61-- VGA Legalizes Prometheans; Nanotrasen Begins Manufacture and Testing"
+ name = "08/30/61 - VGA Legalizes Prometheans; Nanotrasen Begins Manufacture and Testing"
data = "Today's meeting of the Vir Bicameral led to the passing of the Wynther-Helsey Bill, an implementation of the legal framework \
used in Aetolus to handle the production and cultivation of the Macrolimbus species dubbed \"Prometheans\". These ill-researched organisms \
possess cognitive abilities easily equaling those of A-class drones, but so far have not been included under the EIO's list of dangerous \
@@ -38,7 +40,7 @@
follow-up poll indicates that an appreciable number of Sivians do not support the framework's current implementation."
/datum/lore/codex/page/article2
- name = "2/3/62-- Corporate Coup on Aetolus"
+ name = "2/3/62 - Corporate Coup on Aetolus"
data = "A recent incident aboard the NRS Prometheus issued in a major change in the leadership of the Promethean homeworld. During \
a late-night meeting of the Nanotrasen Board of Trustees, several high-ranking personnel, including Head of Research Naomi Harper,\
announced their intention to assume direct control of Nanotrasen facilities in the system. It is known that several dissenting \
@@ -51,7 +53,7 @@
not responded to. Free Traders are recommended to stay clear of the region until the situation resolves itself."
/datum/lore/codex/page/article3
- name = "2/10/62-- Aetolian Partisans Declare Independence"
+ name = "2/10/62 - Aetolian Partisans Declare Independence"
data = "Breaking their week-long silence, the leaders of the Aetolian Coup, and their spokesperson and presumed leader Naomi Harper issued an address earlier today, delivered to the Oculum Broadcast office on Pearl by drone courier. Quote Dr. Harper: \"Our previous silence was a necessity, while we consolidated our forces and dealt with corporatists both internally and in Vounna's former Grayson outposts.\". In Harper's hour-long address, she berates the failure of SolGov to provide adequate protections for Prometheans. \"We will not let the Promethean be another positronic brain; they will not labor under a century of slavery, deprived of a state to call their own. The Luddites of the Friends and of the Icarus Front will not be permitted to decide the fate of a nascent race before it begins.\"\
\
Harper proceeded to unilaterally declare Vounna's independence from SolGov, claiming sovereignty over the system as the first Chairperson of the \"Aetolian Council\". Speaker of the Shadow Coalition ISA-5 has urged their government to treat the developing situation with caution but decried Harper's rhetoric, stating in a press release, \"While I know well the injustices visited on myself and my people by misguided forbearers, it is important to treat any emerging technology with respect. Current policies regarding the Prometheans are designed to limit risk during sociological trials on Aetolus and beyond. As for myself, I doubt the sincerity of this human who claims to speak for the Prometheans, when the Prometheans are perfectly equipped to speak for themselves.\"\
@@ -59,7 +61,7 @@
NanoTrasen is expected to redouble their Promethean research programs in the Vir system until stability is restored to Vounna."
/datum/lore/codex/page/article4
- name = "2/14/62-- SCG Denounces Aetolian Coup; Mobilizes Fleet"
+ name = "2/14/62 - SCG Denounces Aetolian Coup; Mobilizes Fleet"
data = "Dismissing claims of inaction, a spokesperson for the Solar Confederate Government today confirmed that the Colonial Assembly has voted overwhelmingly in favor of swift military action in response to the coup on Aetolus earlier this month. Icarus Front Chairperson Mackenzie West was quick to make a damning official statement: \"Dr. Harper and her radical agitators cannot be excused for their violent, despicable attempts to destabilize the flourishing economy of the Almach Rim. The ruthless murder of innocents, and illegal seizure of private property are crimes that cannot merely be met with strong words and gentle slaps to the wrist\"...\"I am proud to announce that two units of brave Solar marines have been assigned to the SCG-R Song Shi rapid response cruiser, with the full backing of the Icarus Front - and I hope with my heart, the backing of all patriotic Solar citizens.\"\
\
The decision faced resistance from more laissez faire Assembly member states, including prominent SEO governor Bruno Ofako, delaying an earlier consensus. Supporters of the action hope that this decisive display of military strength will encourage the rebels to stand down without further bloodshed, and submit to prosecution by the Lunar High Courts.\
@@ -67,7 +69,7 @@
The Icarus Front has also proposed a temporary ban on continued Promethean research, though this motion has yet to gain any traction."
/datum/lore/codex/page/article5
- name = "2/23/62-- \"Almach Association\" Shocks Nation"
+ name = "2/23/62 - \"Almach Association\" Shocks Nation"
data = "Shocking the nation, in the wee hours UTC a number of governments in the Almach Rim announced their intent to secede from the Confederacy as a unified political organization they refer to as the Almach Association, joining the already-declared Aetolian Council. Among the half-dozen affected systems is Angessa's Pearl, through which the Song Shi was passing en route to Aetolus. The Association has already issued a political manifesto and a foundational charter, leading political scientists across the galaxy to suspect back-doors collusion and possible Shelfican interference, a hypothesis made more likely by Morpheus Cyberkinetics' exonet site voicing support for the Association. Others suspect a moment of political crystallization, not unlike that in the Golden Hour three centuries ago. These researchers are already referring to this morning's events as the Gray Hour.\
\
The Association's official manifesto repudiates the Five Points, calling them \"an archaic and distinctly human invention\". Experts agree that this bold declaration puts the Movement more in line with the Golden Hour than with the Age of Secession, and many fear that nothing short of a miracle like the discovery of the positronics will spare humanity from a bloody civil war.\
@@ -75,3 +77,20 @@
While the Association currently lists only a handful of Almach Rim systems as \"Constituent Organizations\", it has named Shelf, the Free Relan Federation, and the Eutopian Foreign Relations Board as \"observers\". The implications of this status are yet to be identified.\
\
The fate of the SCG-R Song Shi and her crew remain unknown."
+
+/datum/lore/codex/page/article6
+ name = "3/03/62 - A Week Out From Almach: What are the facts?"
+ data = "* Several organizations in the Almach Rim, including Angessa's Pearl, the Aetolian Council, the Interstellar Workers of Wythe, the Republic of Whitney, and members of several prominent families in the Neon Light unilaterally declared secession from SCG.
*This secession was first called the Grey Hour by political scientists in New Florence, a term popularized by reporter Elspor Fong.
* Shelf, the FRF, and the EFRB were declared \"observers\" in the Almach Association charter.
* None of these organizations have issued a statement on the matter.
* The SCG-R Song Shi was stranded in the region during the secession.
* SolGov has not issued an official statement of the fate of the Song Shi.
* Several confederate agencies, including Emergent Intelligence Oversight, the Trade and Customs Bureau, and SCG Fleet Intelligence have declared a \"state of emergency\".
* SolGov itself has NOT declared a state of emergency.
* Legitimate communications in and out of the Almach Rim are restricted to audited text messages for the period.
* Several illegitimate communication links exist and are believed by Fleet Intelligence to be currently hosting the official sites for Morpheus Cyberkinetics and for the Association itself.
* Icarus Front chairperson Mackenzie West has proposed a moratorium on the creation of new Prometheans for the duration of the crisis.
* Local laws on the subject will apply until the Assembly meets late in May.
* No confederate lawmaker has proposed action against Relani, Shelfican, or newly Almachi nationals living within stable regions.
* The border remains tightly closed to migrants, media, and diplomats alike."
+
+/datum/lore/codex/page/article7
+ name = "3/21/62 - Relan, Shelf Join the Almach Association"
+ data = "Recent reports from within the Association indicate that the Free Relan Federation and Shelf have officially decided to join the Almach Association. President Nia Fischer of the FRF had this to say on the matter, in a speech addressed to the population at large. \
+
\
+ \
+ \"Our decision to join the Association may, at first, seem strange. It is true that we have much to gain from trade with the Solars, and that the radical transhumanism of Angessa's Pearl is not our way. But I will remind you that it was Shelf, not Sol, who ensured our prosperity just over two decades ago-- who safeguarded our independence and prevented us from falling to barbarism and dictatorship. We owe it, not just to Shelf but to all the members of the Almach Rim, to support their independence just the same. And that, my fellow Relanians, is the crux of it all. The Association is a revolution, at the heart of it all, and many of the now-independent states were owned near-outright by Trans-Stellar Corporations until the Association allowed them to shake out their fetters. What right do we have to sit by while just a dozen light-years coreward newly-born republics suffer the growing pains of independence? What right do we have to bask in our own stability when our neighbors, our comrades in ideology, are struggling with a cruel blockade proposed by politicians back on Earth and Luna? That is why we must join with them, guard them, and guide them, for as long as need be.\"\
+
\
+ \
+ A Shelfican spokesperson, meanwhile, had only this to say:\
+
\
+ \"We're probably going to regret this but, y'know, the whole thing is kind of our fault. Sure, whatever.\""
+
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index ced8b13843..b59909376f 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -243,7 +243,7 @@ var/list/mining_overlay_cache = list()
/turf/simulated/mineral/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
- usr << "You don't have the dexterity to do this!"
+ to_chat(user, "You don't have the dexterity to do this!")
return
if(!density)
@@ -263,19 +263,19 @@ var/list/mining_overlay_cache = list()
if(valid_tool)
if (sand_dug)
- user << "This area has already been dug."
+ to_chat(user, "This area has already been dug.")
return
var/turf/T = user.loc
if (!(istype(T)))
return
- user << "You start digging."
+ to_chat(user, "You start digging.")
playsound(user.loc, 'sound/effects/rustle1.ogg', 50, 1)
if(!do_after(user,40)) return
- user << "You dug a hole."
+ to_chat(user, "You dug a hole.")
GetDrilled()
else if(istype(W,/obj/item/weapon/storage/bag/ore))
@@ -298,7 +298,7 @@ var/list/mining_overlay_cache = list()
return
var/obj/item/stack/rods/R = W
if (R.use(1))
- user << "Constructing support lattice ..."
+ to_chat(user, "Constructing support lattice ...")
playsound(src, 'sound/weapons/Genhit.ogg', 50, 1)
new /obj/structure/lattice(get_turf(src))
@@ -314,7 +314,7 @@ var/list/mining_overlay_cache = list()
S.use(1)
return
else
- user << "The plating is going to need some support."
+ to_chat(user, "The plating is going to need some support.")
return
@@ -334,7 +334,17 @@ var/list/mining_overlay_cache = list()
var/obj/item/device/measuring_tape/P = W
user.visible_message("\The [user] extends \a [P] towards \the [src].","You extend \the [P] towards \the [src].")
if(do_after(user, 15))
- user << "\The [src] has been excavated to a depth of [excavation_level]cm."
+ to_chat(user, "\The [src] has been excavated to a depth of [excavation_level]cm.")
+ return
+
+ if(istype(W, /obj/item/device/xenoarch_multi_tool))
+ var/obj/item/device/xenoarch_multi_tool/C = W
+ if(C.mode) //Mode means scanning
+ C.depth_scanner.scan_atom(user, src)
+ else
+ user.visible_message("\The [user] extends \the [C] over \the [src], a flurry of red beams scanning \the [src]'s surface!", "You extend \the [C] over \the [src], a flurry of red beams scanning \the [src]'s surface!")
+ if(do_after(user, 15))
+ to_chat(user, "\The [src] has been excavated to a depth of [excavation_level]cm.")
return
if (istype(W, /obj/item/weapon/pickaxe))
@@ -356,7 +366,7 @@ var/list/mining_overlay_cache = list()
if(newDepth > F.excavation_required) // Digging too deep can break the item. At least you won't summon a Balrog (probably)
fail_message = ". [pick("There is a crunching noise","[W] collides with some different rock","Part of the rock face crumbles away","Something breaks under [W]")]"
- user << "You start [P.drill_verb][fail_message]."
+ to_chat(user, "You start [P.drill_verb][fail_message].")
if(fail_message && prob(90))
if(prob(25))
@@ -375,7 +385,7 @@ var/list/mining_overlay_cache = list()
else if(newDepth > F.excavation_required - F.clearance_range) // Not quite right but you still extract your find, the closer to the bottom the better, but not above 80%
excavate_find(prob(80 * (F.excavation_required - newDepth) / F.clearance_range), F)
- user << "You finish [P.drill_verb] \the [src]."
+ to_chat(user, "You finish [P.drill_verb] \the [src].")
if(newDepth >= 200) // This means the rock is mined out fully
var/obj/structure/boulder/B
@@ -480,7 +490,7 @@ var/list/mining_overlay_cache = list()
if(prob(50))
pain = 1
for(var/mob/living/M in range(src, 200))
- M << "[pick("A high-pitched [pick("keening","wailing","whistle")]","A rumbling noise like [pick("thunder","heavy machinery")]")] somehow penetrates your mind before fading away!"
+ to_chat(M, "[pick("A high-pitched [pick("keening","wailing","whistle")]","A rumbling noise like [pick("thunder","heavy machinery")]")] somehow penetrates your mind before fading away!")
if(pain)
flick("pain",M.pain)
if(prob(50))
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 0b65e6819c..1656786afd 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -8,7 +8,7 @@
desc = "It's a g-g-g-g-ghooooost!" //jinkies!
icon = 'icons/mob/ghost.dmi'
icon_state = "ghost"
- layer = 3.9 //Just below normal mobs
+ layer = BELOW_MOB_LAYER
plane = PLANE_GHOSTS
alpha = 127
stat = DEAD
@@ -795,5 +795,18 @@ mob/observer/dead/MayRespawn(var/feedback = 0)
/mob/observer/dead/is_deaf()
return FALSE
+/mob/observer/dead/verb/paialert()
+ set category = "Ghost"
+ set name = "Blank pAI alert"
+ set desc = "Flash an indicator light on available blank pAI devices for a smidgen of hope."
+ if(usr.client.prefs.be_special & BE_PAI)
+ for(var/obj/item/device/paicard/p in world)
+ var/obj/item/device/paicard/PP = p
+ if(PP.pai == null)
+ PP.icon = 'icons/obj/pda_vr.dmi' // VOREStation Edit
+ PP.overlays += "pai-ghostalert"
+ spawn(54)
+ PP.overlays.Cut()
+
/mob/observer/dead/speech_bubble_appearance()
return "ghost"
diff --git a/code/modules/mob/dead/observer/observer_vr.dm b/code/modules/mob/dead/observer/observer_vr.dm
index 1572c41510..97280c78b9 100644
--- a/code/modules/mob/dead/observer/observer_vr.dm
+++ b/code/modules/mob/dead/observer/observer_vr.dm
@@ -1,16 +1,3 @@
-/mob/observer/dead/verb/paialert()
- set category = "Ghost"
- set name = "Blank pAI alert"
- set desc = "Flash an indicator light on available blank pAI devices for a smidgen of hope."
- if(usr.client.prefs.be_special & BE_PAI)
- for(var/obj/item/device/paicard/p in world)
- var/obj/item/device/paicard/PP = p
- if(PP.pai == null)
- PP.icon = 'icons/obj/pda_vr.dmi'
- PP.overlays += "pai-ghostalert"
- spawn(54)
- PP.overlays.Cut()
-
/mob/observer/dead/verb/nifjoin()
set category = "Ghost"
set name = "Join Into Soulcatcher"
diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm
index 4d01759ce9..7153c0fe26 100644
--- a/code/modules/mob/hear_say.dm
+++ b/code/modules/mob/hear_say.dm
@@ -302,11 +302,6 @@
else adverb = " a very lengthy message"
message = "[speaker] [verb][adverb]."
- if(src.status_flags & PASSEMOTES)
- for(var/obj/item/weapon/holder/H in src.contents)
- H.show_message(message)
- for(var/mob/living/M in src.contents)
- M.show_message(message)
src.show_message(message)
/mob/proc/hear_sleep(var/message)
diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm
index 2f3a6d8a63..7a6cd1fbf9 100644
--- a/code/modules/mob/holder.dm
+++ b/code/modules/mob/holder.dm
@@ -139,7 +139,6 @@ var/list/holder_mob_icon_cache = list()
grabber << "You scoop up \the [src]!"
src << "\The [grabber] scoops you up!"
- grabber.status_flags |= PASSEMOTES
H.sync(src)
return H
diff --git a/code/modules/mob/language/generic.dm b/code/modules/mob/language/generic.dm
index d1e2eab309..6f851694a9 100644
--- a/code/modules/mob/language/generic.dm
+++ b/code/modules/mob/language/generic.dm
@@ -61,9 +61,9 @@
colour = "terminus"
key = "4"
flags = WHITELISTED
- syllables = list ("die", "en", "skei", "van", "son", "der", "aar", "ch", "op", "ruk", "aa", "be", "ne", "het",
- "ek", "ras", "ver", "zan", "das", "waa", "geb", "vol", "lu", "min", "breh", "rus", "stv", "ee", "goe", "sk",
- "la", "ver", "we", "ge", "luk", "an", "ar", "at", "es", "et", "bel", "du", "jaa", "ch", "kk", "gh", "ll", "uu", "wat")
+ syllables = list (".a", "spa", "pan", "blaif", "stra", "!u", "!ei", "!am", "by", ".y", "gry", "zbly", "!y", "fl",
+ "sm", "rn", "cpi", "ku", "koi", "pr", "glau", "stu", "ved", "ki", "tsa", "xau", "jbu", "sny", "stro", "nu",
+ "uan", "ju", "!i", "ge", "luk", "an", "ar", "at", "es", "et", "bel", "ki", "jaa", "ch", "ki", "gh", "ll", "uu", "wat")
// Criminal language.
/datum/language/gutter
diff --git a/code/modules/mob/language/language.dm b/code/modules/mob/language/language.dm
index ef8fc37c19..c6089a8788 100644
--- a/code/modules/mob/language/language.dm
+++ b/code/modules/mob/language/language.dm
@@ -99,7 +99,7 @@
return (copytext(message, length(message)) == "!") ? 2 : 1
/datum/language/proc/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
- log_say("(HIVE) [message]", src)
+ log_say("(HIVE) [message]", speaker)
if(!speaker_mask) speaker_mask = speaker.name
message = format_message(message, get_spoken_verb(message))
diff --git a/code/modules/mob/living/carbon/alien/diona/diona_powers.dm b/code/modules/mob/living/carbon/alien/diona/diona_powers.dm
index 614647993b..585b421c7f 100644
--- a/code/modules/mob/living/carbon/alien/diona/diona_powers.dm
+++ b/code/modules/mob/living/carbon/alien/diona/diona_powers.dm
@@ -33,7 +33,6 @@
if(!istype(H) || !src || !(src.Adjacent(H)))
return 0
H << "You feel your being twine with that of \the [src] as it merges with your biomass."
- H.status_flags |= PASSEMOTES
src << "You feel your being twine with that of \the [H] as you merge with its biomass."
loc = H
verbs += /mob/living/carbon/alien/diona/proc/split
@@ -66,4 +65,3 @@
for(var/atom/A in M.contents)
if(istype(A,/mob/living/simple_animal/borer) || istype(A,/obj/item/weapon/holder))
return
- M.status_flags &= ~PASSEMOTES
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm
index 1aaa236446..07f65f62b5 100644
--- a/code/modules/mob/living/carbon/brain/MMI.dm
+++ b/code/modules/mob/living/carbon/brain/MMI.dm
@@ -6,6 +6,7 @@
icon = 'icons/obj/assemblies.dmi'
icon_state = "mmi_empty"
w_class = ITEMSIZE_NORMAL
+ can_speak = 1
origin_tech = list(TECH_BIO = 3)
req_access = list(access_robotics)
diff --git a/code/modules/mob/living/carbon/brain/say.dm b/code/modules/mob/living/carbon/brain/say.dm
index 8797cd596a..a09d8ce3e5 100644
--- a/code/modules/mob/living/carbon/brain/say.dm
+++ b/code/modules/mob/living/carbon/brain/say.dm
@@ -5,8 +5,8 @@
message = sanitize(message)
- if(!(container && istype(container, /obj/item/device/mmi)))
- return //No MMI, can't speak, bucko./N
+ if(!(container && container.can_speak))
+ return //Certain objects can speak, like MMIs. Most others cannot. -Q
else
var/datum/language/speaking = parse_language(message)
if(speaking)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 4d36034323..93a293dec6 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1573,7 +1573,7 @@
return species.fire_icon_state
// Called by job_controller. Makes drones start with a permit, might be useful for other people later too.
-/mob/living/carbon/human/equip_post_job() //Drone Permit moved to equip_survival_gear()
+/mob/living/carbon/human/equip_post_job()
var/braintype = get_FBP_type()
if(braintype == FBP_DRONE)
var/turf/T = get_turf(src)
@@ -1583,8 +1583,9 @@
/mob/living/carbon/human/proc/update_icon_special() //For things such as teshari hiding and whatnot.
if(status_flags & HIDING) // Hiding? Carry on.
- if(stat == DEAD || paralysis || weakened || stunned) //stunned/knocked down by something that isn't the rest verb? Note: This was tried with INCAPACITATION_STUNNED, but that refused to work.
- status_flags &= ~HIDING //No hiding for you. Mob layer should be updated naturally, but it actually isn't.
+ if(stat == DEAD || paralysis || weakened || stunned || restrained()) //stunned/knocked down by something that isn't the rest verb? Note: This was tried with INCAPACITATION_STUNNED, but that refused to work.
+ reset_plane_and_layer()
+ status_flags &= ~HIDING
else
layer = HIDING_LAYER
diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm
index 9300791028..41c240b98a 100644
--- a/code/modules/mob/living/carbon/human/human_powers.dm
+++ b/code/modules/mob/living/carbon/human/human_powers.dm
@@ -279,20 +279,3 @@
to_chat(src, "Your regeneration is interrupted!")
nutrition -= 75
active_regen = FALSE
-
-/mob/living/carbon/human/proc/hide_humanoid()
- set name = "Hide"
- set desc = "Allows you to hide beneath tables or certain items. Toggled on or off."
- set category = "Abilities"
-
- if(stat == DEAD || paralysis || weakened || stunned || restrained()) // No hiding if you're stunned!
- return
-
- if(status_flags & HIDING)
- layer = MOB_LAYER
- to_chat(src, "You have stopped hiding.")
- else
- layer = HIDING_LAYER //Just above cables with their 2.44
- to_chat(src, "You are now hiding.")
-
- status_flags ^= HIDING
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index c22eea6911..8619dee42d 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -853,28 +853,6 @@
if(status_flags & GODMODE)
return 0 //godmode
- var/obj/item/organ/internal/diona/node/light_organ = locate() in internal_organs
-
- if(!isSynthetic())
- if(light_organ && !light_organ.is_broken())
- var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing
- if(isturf(loc)) //else, there's considered to be no light
- var/turf/T = loc
- light_amount = T.get_lumcount() * 10
- nutrition += light_amount
- traumatic_shock -= light_amount
-
- if(species.flags & IS_PLANT)
- if(nutrition > 450)
- nutrition = 450
-
- if(light_amount >= 3) //if there's enough light, heal
- adjustBruteLoss(-(round(light_amount/2)))
- adjustFireLoss(-(round(light_amount/2)))
- adjustToxLoss(-(light_amount))
- adjustOxyLoss(-(light_amount))
- //TODO: heal wounds, heal broken limbs.
-
if(species.light_dam)
var/light_amount = 0
if(isturf(loc))
@@ -906,14 +884,7 @@
var/growlsound = pick(hunger_sounds)
var/growlmultiplier = 100 - (nutrition / 250 * 100)
playsound(src, growlsound, vol = growlmultiplier, vary = 1, falloff = 0.1, ignore_walls = TRUE, preference = /datum/client_preference/digestion_noises)
-
- if(!isSynthetic() && (species.flags & IS_PLANT) && (!light_organ || light_organ.is_broken()))
- if(nutrition < 200)
- take_overall_damage(2,0)
-
- //traumatic_shock is updated every tick, incrementing that is pointless - shock_stage is the counter.
- //Not that it matters much for diona, who have NO_PAIN.
- shock_stage++
+ // VOREStation Edit End
// TODO: stomach and bloodstream organ.
if(!isSynthetic())
diff --git a/code/modules/mob/living/carbon/human/species/station/seromi.dm b/code/modules/mob/living/carbon/human/species/station/seromi.dm
index 3f2271f967..f2adbcee31 100644
--- a/code/modules/mob/living/carbon/human/species/station/seromi.dm
+++ b/code/modules/mob/living/carbon/human/species/station/seromi.dm
@@ -114,7 +114,7 @@
inherent_verbs = list(
/mob/living/carbon/human/proc/sonar_ping,
- /mob/living/carbon/human/proc/hide_humanoid
+ /mob/living/proc/hide
)
/datum/species/teshari/equip_survival_gear(var/mob/living/carbon/human/H)
diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm
index de0929770c..500829d6fc 100644
--- a/code/modules/mob/living/carbon/human/species/station/station.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station.dm
@@ -407,3 +407,33 @@
qdel(D)
H.visible_message("\The [H] splits apart with a wet slithering noise!")
+
+/datum/species/diona/handle_environment_special(var/mob/living/carbon/human/H)
+ if(H.inStasisNow())
+ return
+
+ var/obj/item/organ/internal/diona/node/light_organ = locate() in H.internal_organs
+
+ if(light_organ && !light_organ.is_broken())
+ var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing
+ if(isturf(H.loc)) //else, there's considered to be no light
+ var/turf/T = H.loc
+ light_amount = T.get_lumcount() * 10
+ H.nutrition += light_amount
+ H.shock_stage -= light_amount
+
+ if(H.nutrition > 450)
+ H.nutrition = 450
+ if(light_amount >= 3) //if there's enough light, heal
+ H.adjustBruteLoss(-(round(light_amount/2)))
+ H.adjustFireLoss(-(round(light_amount/2)))
+ H.adjustToxLoss(-(light_amount))
+ H.adjustOxyLoss(-(light_amount))
+ //TODO: heal wounds, heal broken limbs.
+
+ else if(H.nutrition < 200)
+ H.take_overall_damage(2,0)
+
+ //traumatic_shock is updated every tick, incrementing that is pointless - shock_stage is the counter.
+ //Not that it matters much for diona, who have NO_PAIN.
+ H.shock_stage++
diff --git a/code/modules/mob/living/carbon/human/species/station/station_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_vr.dm
index 90e94f81ff..3ea7eb85f5 100644
--- a/code/modules/mob/living/carbon/human/species/station/station_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station_vr.dm
@@ -339,7 +339,7 @@
inherent_verbs = list(
/mob/living/carbon/human/proc/sonar_ping,
- /mob/living/carbon/human/proc/hide_humanoid,
+ /mob/living/proc/hide,
/mob/living/proc/shred_limb,
/mob/living/proc/toggle_pass_table
)
diff --git a/code/modules/mob/living/carbon/metroid/metroid.dm b/code/modules/mob/living/carbon/metroid/metroid.dm
index 5fdea4a0e6..31fe6b3152 100644
--- a/code/modules/mob/living/carbon/metroid/metroid.dm
+++ b/code/modules/mob/living/carbon/metroid/metroid.dm
@@ -6,7 +6,8 @@
var/is_adult = 0
speak_emote = list("chirps")
- layer = 5
+ plane = MOB_PLANE
+ layer = ABOVE_MOB_LAYER
maxHealth = 150
health = 150
gender = NEUTER
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index e5cec557a5..5c256e235a 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -13,7 +13,6 @@
var/mutable_appearance/dsma = new(dsoverlay) //Changing like ten things, might as well.
dsma.alpha = 0
dsma.plane = PLANE_LIGHTING
- dsma.layer = LIGHTING_LAYER + 0.1
dsma.blend_mode = BLEND_ADD
dsoverlay.appearance = dsma
@@ -881,7 +880,6 @@ default behaviour is:
for(var/atom/A in M.contents)
if(istype(A,/mob/living/simple_animal/borer) || istype(A,/obj/item/weapon/holder))
return
- M.status_flags &= ~PASSEMOTES
else if(istype(H.loc,/obj/item/clothing/accessory/holster))
var/obj/item/clothing/accessory/holster/holster = H.loc
@@ -1226,7 +1224,7 @@ default behaviour is:
return UNDERWATER
else
return ..()
-
+
//Add an entry to overlays, assuming it exists
/mob/living/proc/apply_hud(cache_index, var/image/I)
hud_list[cache_index] = I
diff --git a/code/modules/mob/living/living_powers.dm b/code/modules/mob/living/living_powers.dm
index d2c2d72e4e..1442c80f9b 100644
--- a/code/modules/mob/living/living_powers.dm
+++ b/code/modules/mob/living/living_powers.dm
@@ -6,9 +6,12 @@
if(stat == DEAD || paralysis || weakened || stunned || restrained())
return
- if(layer == HIDING_LAYER)
- layer = MOB_LAYER
- src << text("You have stopped hiding.")
+ if(status_flags & HIDING)
+ status_flags &= ~HIDING
+ reset_plane_and_layer()
+ to_chat(src,"You have stopped hiding.")
else
+ status_flags |= HIDING
layer = HIDING_LAYER //Just above cables with their 2.44
- src << text("You are now hiding.")
+ plane = OBJ_PLANE
+ to_chat(src,"You are now hiding.")
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 9eeeb05d4a..88072dc2cf 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -308,7 +308,6 @@ proc/get_radio_key_from_channel(var/channel)
var/image/speech_bubble = image('icons/mob/talk_vr.dmi',src,"[speech_type][speech_bubble_test]") //VOREStation Edit - talk_vr.dmi instead of talk.dmi for right-side icons
images_to_clients[speech_bubble] = list()
-
// Attempt Multi-Z Talking
var/mob/above = src.shadow
while(!QDELETED(above))
@@ -375,8 +374,11 @@ proc/get_radio_key_from_channel(var/channel)
return 1
/mob/living/proc/say_signlang(var/message, var/verb="gestures", var/datum/language/language)
- for (var/mob/O in viewers(src, null))
- O.hear_signlang(message, verb, language, src)
+ var/list/potentials = get_mobs_and_objs_in_view_fast(src, world.view)
+ var/list/mobs = potentials["mobs"]
+ for(var/hearer in mobs)
+ var/mob/M = hearer
+ M.hear_signlang(message, verb, language, src)
return 1
/obj/effect/speech_bubble
diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm
index bfeea5e1b4..7a7df5513b 100644
--- a/code/modules/mob/living/silicon/pai/software_modules.dm
+++ b/code/modules/mob/living/silicon/pai/software_modules.dm
@@ -131,7 +131,7 @@
ui = nanomanager.try_update_ui(user, user, id, ui, data, force_open)
if(!ui)
// Don't copy-paste this unless you're making a pAI software module!
- ui = new(user, user, id, "pai_manifest.tmpl", "Crew Manifest", 450, 600)
+ ui = new(user, user, id, "crew_manifest.tmpl", "Crew Manifest", 450, 600)
ui.set_initial_data(data)
ui.open()
ui.set_auto_update(1)
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm
index e8d3e0ad2c..ac78f5aab9 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm
@@ -199,6 +199,21 @@
wrapped = null
//update_icon()
+/obj/item/weapon/gripper/proc/drop_item_nm()
+
+ if(!wrapped)
+ for(var/obj/item/thing in src.contents)
+ thing.loc = get_turf(src)
+ return
+
+ if(wrapped.loc != src)
+ wrapped = null
+ return
+
+ wrapped.loc = get_turf(src)
+ wrapped = null
+ //update_icon()
+
/obj/item/weapon/gripper/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
if(wrapped) //The force of the wrapped obj gets set to zero during the attack() and afterattack().
force_holder = wrapped.force
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 4b45c0a34e..3136fb6cc8 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -1114,4 +1114,10 @@
return
/mob/living/silicon/robot/is_sentient()
- return braintype != "Drone"
\ No newline at end of file
+ return braintype != "Drone"
+
+
+/mob/living/silicon/robot/drop_item()
+ if(module_active && istype(module_active,/obj/item/weapon/gripper))
+ var/obj/item/weapon/gripper/G = module_active
+ G.drop_item_nm()
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/animals/bear.dm b/code/modules/mob/living/simple_animal/animals/bear.dm
index 3ffd495ff7..4f627a76f0 100644
--- a/code/modules/mob/living/simple_animal/animals/bear.dm
+++ b/code/modules/mob/living/simple_animal/animals/bear.dm
@@ -2,6 +2,7 @@
/mob/living/simple_animal/hostile/bear
name = "space bear"
desc = "RawrRawr!!"
+ tt_desc = "Ursinae aetherius" //...bearspace? Maybe.
icon_state = "bear"
icon_living = "bear"
icon_dead = "bear_dead"
diff --git a/code/modules/mob/living/simple_animal/borer/borer.dm b/code/modules/mob/living/simple_animal/borer/borer.dm
index b89e2f2af6..e4add4d749 100644
--- a/code/modules/mob/living/simple_animal/borer/borer.dm
+++ b/code/modules/mob/living/simple_animal/borer/borer.dm
@@ -168,9 +168,6 @@
host.reset_view(null)
host.machine = null
-
- var/mob/living/H = host
- H.status_flags &= ~PASSEMOTES
host = null
return
diff --git a/code/modules/mob/living/simple_animal/borer/borer_powers.dm b/code/modules/mob/living/simple_animal/borer/borer_powers.dm
index 311b013ef8..b75da20cc4 100644
--- a/code/modules/mob/living/simple_animal/borer/borer_powers.dm
+++ b/code/modules/mob/living/simple_animal/borer/borer_powers.dm
@@ -104,7 +104,6 @@
M << "Something disgusting and slimy wiggles into your ear!"
src.host = M
- src.host.status_flags |= PASSEMOTES
src.forceMove(M)
//Update their traitor status.
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index a06a0b1f69..32902d7d48 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -1,6 +1,7 @@
/mob
density = 1
- layer = 4.0
+ layer = MOB_LAYER
+ plane = MOB_PLANE
animate_movement = 2
flags = PROXMOVE
var/datum/mind/mind
diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm
index 58c530d06c..b5cc72fd19 100644
--- a/code/modules/mob/mob_grab.dm
+++ b/code/modules/mob/mob_grab.dm
@@ -31,7 +31,6 @@
var/force_down //determines if the affecting mob will be pinned to the ground
var/dancing //determines if assailant and affecting keep looking at each other. Basically a wrestling position
- layer = 21
abstract = 1
item_state = "nothing"
w_class = ITEMSIZE_HUGE
@@ -194,7 +193,7 @@
return
var/shift = 0
var/adir = get_dir(assailant, affecting)
- affecting.layer = 4
+ affecting.layer = MOB_LAYER
switch(state)
if(GRAB_PASSIVE)
shift = 8
@@ -217,7 +216,7 @@
switch(adir)
if(NORTH)
animate(affecting, pixel_x = 0, pixel_y =-shift, 5, 1, LINEAR_EASING)
- affecting.layer = 3.9
+ affecting.layer = BELOW_MOB_LAYER
if(SOUTH)
animate(affecting, pixel_x = 0, pixel_y = shift, 5, 1, LINEAR_EASING)
if(WEST)
@@ -396,7 +395,7 @@
/obj/item/weapon/grab/Destroy()
animate(affecting, pixel_x = 0, pixel_y = 0, 4, 1, LINEAR_EASING)
- affecting.layer = 4
+ affecting.reset_plane_and_layer()
if(affecting)
affecting.grabbed_by -= src
affecting = null
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 38b8bbe4d6..10be531825 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -635,7 +635,7 @@ var/global/image/backplane
else
var/area/A = get_area(src)
return A.sound_env
-
+
/mob/proc/position_hud_item(var/obj/item/item, var/slot)
if(!istype(hud_used) || !slot || !LAZYLEN(hud_used.slot_info))
return
diff --git a/code/modules/mob/mob_planes.dm b/code/modules/mob/mob_planes.dm
index 1252ed6649..8ffc15bc9f 100644
--- a/code/modules/mob/mob_planes.dm
+++ b/code/modules/mob/mob_planes.dm
@@ -135,7 +135,7 @@
//Lighting is weird and has matrix shenanigans. Think of this as turning on/off darkness.
/obj/screen/plane_master/fullbright
plane = PLANE_LIGHTING
- layer = LIGHTING_LAYER+1
+ layer = LAYER_HUD_BASE+1 // This MUST be above the lighting plane_master
color = null //To break lighting when visible (this is sorta backwards)
alpha = 0 //Starts full opaque
invisibility = 101
diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm
index ec003a813e..310bbfa9c5 100644
--- a/code/modules/nano/nanoui.dm
+++ b/code/modules/nano/nanoui.dm
@@ -519,3 +519,8 @@ nanoui is used to open and update nano browser uis
*/
/datum/nanoui/proc/update(var/force_open = 0)
src_object.ui_interact(user, ui_key, src, force_open, master_ui, state)
+
+/datum/nanoui/proc/append_template(var/key, var/filename)
+ add_template(key, filename)
+ open()
+ update(1)
diff --git a/code/modules/organs/internal/organ_internal.dm b/code/modules/organs/internal/organ_internal.dm
index 43b3a4c4d7..58ed176505 100644
--- a/code/modules/organs/internal/organ_internal.dm
+++ b/code/modules/organs/internal/organ_internal.dm
@@ -52,13 +52,13 @@
. = ..() //Should be an interger value for infection level
if(!.) return
- var/antibiotics = owner.reagents.get_reagent_amount("spaceacillin")
+ var/antibiotics = owner.chem_effects[CE_ANTIBIOTIC]
- if(. >= 2 && antibiotics < 5) //INFECTION_LEVEL_TWO
+ if(. >= 2 && antibiotics < ANTIBIO_NORM) //INFECTION_LEVEL_TWO
if (prob(3))
take_damage(1,silent=prob(30))
- if(. >= 3 && antibiotics < 30) //INFECTION_LEVEL_THREE
+ if(. >= 3 && antibiotics < ANTIBIO_OD) //INFECTION_LEVEL_THREE
if (prob(50))
take_damage(1,silent=prob(15))
diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm
index 9378869815..b10decab9a 100644
--- a/code/modules/organs/organ_external.dm
+++ b/code/modules/organs/organ_external.dm
@@ -621,13 +621,13 @@ Note that amputating the affected organ does in fact remove the infection from t
handle_germ_effects()
/obj/item/organ/external/proc/handle_germ_sync()
- var/antibiotics = owner.reagents.get_reagent_amount("spaceacillin")
+ var/antibiotics = owner.chem_effects[CE_ANTIBIOTIC]
for(var/datum/wound/W in wounds)
//Open wounds can become infected
if (owner.germ_level > W.germ_level && W.infection_check())
W.germ_level++
- if (antibiotics < 5)
+ if (antibiotics < ANTIBIO_NORM)
for(var/datum/wound/W in wounds)
//Infected wounds raise the organ's germ level
if (W.germ_level > germ_level)
@@ -638,9 +638,9 @@ Note that amputating the affected organ does in fact remove the infection from t
. = ..() //May be null or an infection level, if null then no specific processing needed here
if(!.) return
- var/antibiotics = owner.reagents.get_reagent_amount("spaceacillin")
+ var/antibiotics = owner.chem_effects[CE_ANTIBIOTIC]
- if(. >= 2 && antibiotics < 5) //INFECTION_LEVEL_TWO
+ if(. >= 2 && antibiotics < ANTIBIO_NORM) //INFECTION_LEVEL_TWO
//spread the infection to internal organs
var/obj/item/organ/target_organ = null //make internal organs become infected one at a time instead of all at once
for (var/obj/item/organ/I in internal_organs)
@@ -672,7 +672,7 @@ Note that amputating the affected organ does in fact remove the infection from t
if (parent.germ_level < INFECTION_LEVEL_ONE*2 || prob(30))
parent.germ_level++
- if(. >= 3 && antibiotics < 30) //INFECTION_LEVEL_THREE
+ if(. >= 3 && antibiotics < ANTIBIO_OD) //INFECTION_LEVEL_THREE
if (!(status & ORGAN_DEAD))
status |= ORGAN_DEAD
owner << "You can't feel your [name] anymore..."
diff --git a/code/modules/organs/organ_icon.dm b/code/modules/organs/organ_icon.dm
index 776ec1c012..b664600bfd 100644
--- a/code/modules/organs/organ_icon.dm
+++ b/code/modules/organs/organ_icon.dm
@@ -58,7 +58,7 @@ var/global/list/limb_icon_cache = list()
//Every 'addon' below requires information from species
if(!owner || !owner.species)
return
-
+
//Eye color/icon
var/should_have_eyes = owner.should_have_organ(O_EYES)
var/has_eye_color = owner.species.appearance_flags & HAS_EYE_COLOR
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index 9e090c2095..816b62a099 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -13,7 +13,8 @@
w_class = ITEMSIZE_TINY
throw_range = 1
throw_speed = 1
- layer = 4
+ plane = MOB_PLANE
+ layer = MOB_LAYER
pressure_resistance = 1
slot_flags = SLOT_HEAD
body_parts_covered = HEAD
diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm
index 23ac5ace63..2e3bfb2f79 100644
--- a/code/modules/paperwork/paper_bundle.dm
+++ b/code/modules/paperwork/paper_bundle.dm
@@ -8,7 +8,8 @@
w_class = ITEMSIZE_SMALL
throw_range = 2
throw_speed = 1
- layer = 4
+ plane = MOB_PLANE
+ layer = MOB_LAYER
pressure_resistance = 1
attack_verb = list("bapped")
var/page = 1 // current page
diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm
index d29dc212ac..3f585f323b 100644
--- a/code/modules/paperwork/pen.dm
+++ b/code/modules/paperwork/pen.dm
@@ -184,11 +184,18 @@
var/instant = 0
var/colourName = "red" //for updateIcon purposes
- suicide_act(mob/user)
- var/datum/gender/TU = gender_datums[user.get_visible_gender()]
- viewers(user) << "[user] is jamming the [src.name] up [TU.his] nose and into [TU.his] brain. It looks like [TU.he] [TU.is] trying to commit suicide."
- return (BRUTELOSS|OXYLOSS)
+/obj/item/weapon/pen/crayon/suicide_act(mob/user)
+ var/datum/gender/TU = gender_datums[user.get_visible_gender()]
+ viewers(user) << "[user] is jamming the [src.name] up [TU.his] nose and into [TU.his] brain. It looks like [TU.he] [TU.is] trying to commit suicide."
+ return (BRUTELOSS|OXYLOSS)
- New()
- name = "[colourName] crayon"
- ..()
+/obj/item/weapon/pen/crayon/New()
+ name = "[colourName] crayon"
+
+/obj/item/weapon/pen/crayon/marker
+ name = "marker"
+ desc = "A chisel-tip permanent marker. Hopefully non-toxic."
+ icon_state = "markerred"
+
+/obj/item/weapon/pen/crayon/marker/New()
+ name = "[colourName] marker"
diff --git a/code/modules/power/fusion/core/core_field.dm b/code/modules/power/fusion/core/core_field.dm
index ef1c3716fa..1efb09d777 100644
--- a/code/modules/power/fusion/core/core_field.dm
+++ b/code/modules/power/fusion/core/core_field.dm
@@ -9,7 +9,8 @@
icon = 'icons/obj/machines/power/fusion.dmi'
icon_state = "emfield_s1"
alpha = 50
- layer = 4
+ plane = MOB_PLANE
+ layer = ABOVE_MOB_LAYER
light_color = "#cc7700"
var/size = 1
diff --git a/code/modules/power/fusion/fuel_assembly/fuel_assembly.dm b/code/modules/power/fusion/fuel_assembly/fuel_assembly.dm
index 468f24510a..29d9362015 100644
--- a/code/modules/power/fusion/fuel_assembly/fuel_assembly.dm
+++ b/code/modules/power/fusion/fuel_assembly/fuel_assembly.dm
@@ -2,7 +2,6 @@
name = "fuel rod assembly"
icon = 'icons/obj/machines/power/fusion.dmi'
icon_state = "fuel_assembly"
- layer = 4
var/material_name
diff --git a/code/modules/power/fusion/fuel_assembly/fuel_compressor.dm b/code/modules/power/fusion/fuel_assembly/fuel_compressor.dm
index 6a0f1bc205..375af68696 100644
--- a/code/modules/power/fusion/fuel_assembly/fuel_compressor.dm
+++ b/code/modules/power/fusion/fuel_assembly/fuel_compressor.dm
@@ -4,7 +4,6 @@
icon_state = "fuel_compressor1"
density = 1
anchored = 1
- layer = 4
circuit = /obj/item/weapon/circuitboard/fusion_fuel_compressor
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index 7832510947..b3d861d4db 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -16,7 +16,8 @@
icon = 'icons/obj/lighting.dmi'
icon_state = "tube-construct-stage1"
anchored = 1
- layer = 5
+ plane = MOB_PLANE
+ layer = ABOVE_MOB_LAYER
var/stage = 1
var/fixture_type = "tube"
var/sheets_refunded = 2
@@ -132,7 +133,6 @@
icon = 'icons/obj/lighting.dmi'
icon_state = "bulb-construct-stage1"
anchored = 1
- layer = 5
stage = 1
fixture_type = "bulb"
sheets_refunded = 1
@@ -143,6 +143,7 @@
icon = 'icons/obj/lighting.dmi'
icon_state = "flamp-construct-stage1"
anchored = 0
+ plane = OBJ_PLANE
layer = OBJ_LAYER
stage = 1
fixture_type = "flamp"
@@ -156,7 +157,8 @@
icon_state = "tube1"
desc = "A lighting fixture."
anchored = 1
- layer = 5 // They were appearing under mobs which is a little weird - Ostaf
+ plane = MOB_PLANE
+ layer = ABOVE_MOB_LAYER
use_power = 2
idle_power_usage = 2
active_power_usage = 20
@@ -197,6 +199,7 @@
fitting = "bulb"
brightness_range = 5
brightness_power = 2
+ plane = OBJ_PLANE
layer = OBJ_LAYER
brightness_color = "#FFF4E5"
desc = "A floor lamp."
@@ -204,11 +207,6 @@
shows_alerts = FALSE
var/lamp_shade = 1
-//Vorestation addition, to override the New() proc further below, since this is a lamp.
-/obj/machinery/light/flamp/New()
- ..()
- layer = OBJ_LAYER
-
/obj/machinery/light/small/emergency
brightness_range = 4
brightness_power = 2
@@ -259,9 +257,6 @@
broken(1)
spawn(1)
update(0)
- //Vorestation addition, so large mobs stop looking stupid in front of lights.
- if (dir == 2)
- layer = 5
/obj/machinery/light/Destroy()
var/area/A = get_area(src)
diff --git a/code/modules/power/lighting_vr.dm b/code/modules/power/lighting_vr.dm
index 5583716d57..fb4a15a883 100644
--- a/code/modules/power/lighting_vr.dm
+++ b/code/modules/power/lighting_vr.dm
@@ -1,26 +1,19 @@
// I hate the way macros look stupid standing near lights. I don't care how absurd this looks.
/obj/machinery/light_construct
- layer = 4
-
-/obj/machinery/light_construct/small
- layer = 4
-
-/obj/machinery/light_construct/flamp
- layer = 4
-
+ layer = BELOW_MOB_LAYER
/obj/machinery/light
- layer = 4
+ layer = BELOW_MOB_LAYER
//Vorestation addition, to override the New() proc further below, since this is a lamp.
/obj/machinery/light/flamp/New()
..()
- layer = 4
+ layer = initial(layer)
// create a new lighting fixture
/obj/machinery/light/New()
..()
//Vorestation addition, so large mobs stop looking stupid in front of lights.
- if (dir == 2)
- layer = 5
\ No newline at end of file
+ if (dir == SOUTH) // Lights are backwards, SOUTH lights face north (they are on south wall)
+ layer = ABOVE_MOB_LAYER
diff --git a/code/modules/power/sensors/powernet_sensor.dm b/code/modules/power/sensors/powernet_sensor.dm
index d082b17922..20c8837b32 100644
--- a/code/modules/power/sensors/powernet_sensor.dm
+++ b/code/modules/power/sensors/powernet_sensor.dm
@@ -12,7 +12,7 @@
desc = "Small machine which transmits data about specific powernet"
anchored = 1
density = 0
- layer = 2.46 // Above cables, but should be below floors.
+ layer = ABOVE_UTILITY
icon = 'icons/obj/objects.dmi'
icon_state = "floor_beacon" // If anyone wants to make better sprite, feel free to do so without asking me.
diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm
index a98c0d3718..df5d8997f3 100644
--- a/code/modules/power/singularity/singularity.dm
+++ b/code/modules/power/singularity/singularity.dm
@@ -7,7 +7,7 @@
icon_state = "singularity_s1"
anchored = 1
density = 1
- layer = 6
+ plane = ABOVE_PLANE
light_range = 6
unacidable = 1 //Don't comment this out.
diff --git a/code/modules/power/terminal.dm b/code/modules/power/terminal.dm
index a1f2fbf030..2c01476a7a 100644
--- a/code/modules/power/terminal.dm
+++ b/code/modules/power/terminal.dm
@@ -8,10 +8,10 @@
icon_state = "term"
desc = "It's an underfloor wiring terminal for power equipment."
level = 1
- layer = TURF_LAYER
var/obj/machinery/power/master = null
anchored = 1
- layer = 2.6 // a bit above wires
+ plane = PLATING_PLANE
+ layer = WIRES_LAYER+0.01
/obj/machinery/power/terminal/New()
diff --git a/code/modules/projectiles/effects.dm b/code/modules/projectiles/effects.dm
index ba6a749ebe..18010d3d17 100644
--- a/code/modules/projectiles/effects.dm
+++ b/code/modules/projectiles/effects.dm
@@ -1,7 +1,7 @@
/obj/effect/projectile
icon = 'icons/effects/projectiles.dmi'
icon_state = "bolt"
- layer = 20
+ plane = ABOVE_PLANE
/obj/effect/projectile/New(var/turf/location)
if(istype(location))
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 8afe135876..b398de7d2f 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -49,6 +49,7 @@
//Effects
var/incendiary = 0 //1 for ignite on hit, 2 for trail of fire. 3 maybe later for burst of fire around the impact point. - Mech
var/flammability = 0 //Amount of fire stacks to add for the above.
+ var/combustion = TRUE //Does this set off flammable objects on fire/hit?
var/stun = 0
var/weaken = 0
var/paralyze = 0
@@ -90,6 +91,10 @@
//called when the projectile stops flying because it collided with something
/obj/item/projectile/proc/on_impact(var/atom/A)
impact_effect(effect_transform) // generate impact effect
+ if(damage && damage_type == BURN)
+ var/turf/T = get_turf(A)
+ if(T)
+ T.hotspot_expose(700, 5)
return
//Checks if the projectile is eligible for embedding. Not that it necessarily will.
@@ -132,6 +137,9 @@
if (!istype(targloc) || !istype(curloc))
return 1
+ if(combustion)
+ curloc.hotspot_expose(700, 5)
+
if(targloc == curloc) //Shooting something in the same turf
target.bullet_act(src, target_zone)
on_impact(target)
diff --git a/code/modules/projectiles/projectile/animate.dm b/code/modules/projectiles/projectile/animate.dm
index c09b98a32b..e88e6faa33 100644
--- a/code/modules/projectiles/projectile/animate.dm
+++ b/code/modules/projectiles/projectile/animate.dm
@@ -8,6 +8,7 @@
light_range = 2
light_power = 0.5
light_color = "#55AAFF"
+ combustion = FALSE
/obj/item/projectile/animate/Bump(var/atom/change)
if((istype(change, /obj/item) || istype(change, /obj/structure)) && !is_type_in_list(change, protected_objects))
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index 6fee571544..9755f604ab 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -122,6 +122,8 @@
check_armour = "laser"
light_color = "#0066FF"
+ combustion = FALSE
+
muzzle_type = /obj/effect/projectile/laser_blue/muzzle
tracer_type = /obj/effect/projectile/laser_blue/tracer
impact_type = /obj/effect/projectile/laser_blue/impact
@@ -142,6 +144,8 @@
check_armour = "laser"
light_color = "#FF0D00"
+ combustion = FALSE
+
/obj/item/projectile/beam/lastertag/red/on_hit(var/atom/target, var/blocked = 0)
if(istype(target, /mob/living/carbon/human))
var/mob/living/carbon/human/M = target
@@ -157,6 +161,8 @@
check_armour = "laser"
light_color = "#00C6FF"
+ combustion = FALSE
+
muzzle_type = /obj/effect/projectile/laser_omni/muzzle
tracer_type = /obj/effect/projectile/laser_omni/tracer
impact_type = /obj/effect/projectile/laser_omni/impact
@@ -190,6 +196,8 @@
damage_type = HALLOSS
light_color = "#FFFFFF"
+ combustion = FALSE
+
muzzle_type = /obj/effect/projectile/stun/muzzle
tracer_type = /obj/effect/projectile/stun/tracer
impact_type = /obj/effect/projectile/stun/impact
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index 02eab7e93a..d47e729898 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -191,6 +191,8 @@
sharp = 0
check_armour = "melee"
+ combustion = FALSE
+
/obj/item/projectile/bullet/shotgun/ion/on_hit(var/atom/target, var/blocked = 0)
..()
empulse(target, 0, 0, 0, 0) //Only affects what it hits
@@ -325,6 +327,8 @@
embed_chance = 0
sharp = 0
+ combustion = FALSE
+
/obj/item/projectile/bullet/pistol/cap/process()
loc = null
qdel(src)
\ No newline at end of file
diff --git a/code/modules/projectiles/projectile/change.dm b/code/modules/projectiles/projectile/change.dm
index 6f19b29bbb..0beffe46a3 100644
--- a/code/modules/projectiles/projectile/change.dm
+++ b/code/modules/projectiles/projectile/change.dm
@@ -6,6 +6,8 @@
nodamage = 1
check_armour = "energy"
+ combustion = FALSE
+
/obj/item/projectile/change/on_hit(var/atom/change)
wabbajack(change)
diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm
index 0cbb96a2e0..d5bae0dc22 100644
--- a/code/modules/projectiles/projectile/energy.dm
+++ b/code/modules/projectiles/projectile/energy.dm
@@ -92,6 +92,7 @@
light_power = 0.5
light_color = "#33CC00"
+ combustion = FALSE
/obj/item/projectile/energy/dart
name = "dart"
@@ -101,6 +102,7 @@
agony = 120
check_armour = "energy"
+ combustion = FALSE
/obj/item/projectile/energy/bolt
name = "bolt"
@@ -122,6 +124,8 @@
agony = 10
check_armour = "bio"
+ combustion = FALSE
+
/obj/item/projectile/energy/neurotoxin
name = "neurotoxic spit"
icon_state = "neurotoxin"
@@ -130,6 +134,8 @@
agony = 80
check_armour = "bio"
+ combustion = FALSE
+
/obj/item/projectile/energy/neurotoxin/toxic //New alien mob projectile to match the player-variant's projectiles.
name = "neurotoxic spit"
icon_state = "neurotoxin"
@@ -149,6 +155,8 @@
light_power = 0.5
light_color = "#33CC00"
+ combustion = FALSE
+
/obj/item/projectile/energy/plasmastun
name = "plasma pulse"
icon_state = "plasma_stun"
diff --git a/code/modules/projectiles/projectile/force.dm b/code/modules/projectiles/projectile/force.dm
index 71b7d34d04..550aab6113 100644
--- a/code/modules/projectiles/projectile/force.dm
+++ b/code/modules/projectiles/projectile/force.dm
@@ -5,6 +5,8 @@
damage = 20
check_armour = "energy"
+ combustion = FALSE
+
/obj/item/projectile/forcebolt/strong
name = "force bolt"
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
index 4e366bed6d..f7ecddb0eb 100644
--- a/code/modules/projectiles/projectile/special.dm
+++ b/code/modules/projectiles/projectile/special.dm
@@ -9,6 +9,9 @@
light_range = 2
light_power = 0.5
light_color = "#55AAFF"
+
+ combustion = FALSE
+
var/sev1_range = 0
var/sev2_range = 1
var/sev3_range = 1
@@ -56,6 +59,8 @@
light_power = 0.5
light_color = "#55AAFF"
+ combustion = FALSE
+
/obj/item/projectile/temp/on_hit(atom/target, blocked = FALSE)
..()
if(isliving(target))
@@ -85,6 +90,8 @@
name = "heat beam"
target_temperature = 1000
+ combustion = TRUE
+
/obj/item/projectile/meteor
name = "meteor"
icon = 'icons/obj/meteor.dmi'
@@ -127,6 +134,8 @@
light_power = 0.5
light_color = "#33CC00"
+ combustion = FALSE
+
/obj/item/projectile/energy/floramut/on_hit(var/atom/target, var/blocked = 0)
var/mob/living/M = target
if(ishuman(target))
@@ -196,6 +205,8 @@
/obj/item/projectile/beam/mindflayer
name = "flayer ray"
+ combustion = FALSE
+
/obj/item/projectile/beam/mindflayer/on_hit(var/atom/target, var/blocked = 0)
if(ishuman(target))
var/mob/living/carbon/human/M = target
@@ -218,6 +229,8 @@
damage_type = HALLOSS
muzzle_type = null
+ combustion = FALSE
+
/obj/item/projectile/bola/on_hit(var/atom/target, var/blocked = 0)
if(ishuman(target))
var/mob/living/carbon/human/M = target
@@ -235,6 +248,8 @@
damage_type = BRUTE
muzzle_type = null
+ combustion = FALSE
+
/obj/item/projectile/webball/on_hit(var/atom/target, var/blocked = 0)
if(isturf(target.loc))
var/obj/effect/spider/stickyweb/W = locate() in get_turf(target)
diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm
index 1ac48546f5..3587e2f36a 100644
--- a/code/modules/reagents/Chemistry-Machinery.dm
+++ b/code/modules/reagents/Chemistry-Machinery.dm
@@ -281,7 +281,6 @@
name = "All-In-One Grinder"
icon = 'icons/obj/kitchen.dmi'
icon_state = "juicer1"
- layer = 2.9
density = 0
anchored = 0
use_power = 1
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm
index d07480735a..ea27e02e4d 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm
@@ -453,6 +453,9 @@
if(adj_temp < 0 && M.bodytemperature > 310)
M.bodytemperature = min(310, M.bodytemperature - (adj_temp * TEMPERATURE_DAMAGE_COEFFICIENT))
+/datum/reagent/drink/overdose(var/mob/living/carbon/M, var/alien) //Add special interactions here in the future if desired.
+ ..()
+
// Juices
/datum/reagent/drink/juice/banana
@@ -1047,11 +1050,14 @@
adj_dizzy = -5
adj_drowsy = -3
adj_sleepy = -2
- overdose = 45
+
glass_name = "Coffee Milkshake"
glass_desc = "An energizing coffee milkshake, perfect for hot days at work.."
+/datum/reagent/drink/milkshake/coffeeshake/overdose(var/mob/living/carbon/M, var/alien)
+ M.make_jittery(5)
+
/datum/reagent/drink/rewriter
name = "Rewriter"
id = "rewriter"
@@ -2847,4 +2853,4 @@
adj_temp = -5
glass_name = "Mint Julep"
- glass_desc = "Minty and refreshing, perfect for a hot day."
\ No newline at end of file
+ glass_desc = "Minty and refreshing, perfect for a hot day."
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm
index a0a75e4664..6d91d4ba4f 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm
@@ -532,7 +532,7 @@
/datum/reagent/corophizine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
..()
M.add_chemical_effect(CE_ANTIBIOTIC, ANTIBIO_SUPER)
-
+
//Based roughly on Levofloxacin's rather severe side-effects
if(prob(20))
M.Confuse(5)
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm
index 9b15c07b70..6c83b0e26d 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm
@@ -49,6 +49,60 @@
id = "crayon_dust_brown"
color = "#846F35"
+/datum/reagent/marker_ink
+ name = "Marker ink"
+ id = "marker_ink"
+ description = "Intensely coloured ink used in markers."
+ taste_description = "extremely bitter"
+ reagent_state = LIQUID
+ color = "#888888"
+ overdose = 5
+
+/datum/reagent/marker_ink/black
+ name = "Black marker ink"
+ id = "marker_ink_black"
+ color = "#000000"
+
+/datum/reagent/marker_ink/red
+ name = "Red marker ink"
+ id = "marker_ink_red"
+ color = "#FE191A"
+
+/datum/reagent/marker_ink/orange
+ name = "Orange marker ink"
+ id = "marker_ink_orange"
+ color = "#FFBE4F"
+
+/datum/reagent/marker_ink/yellow
+ name = "Yellow marker ink"
+ id = "marker_ink_yellow"
+ color = "#FDFE7D"
+
+/datum/reagent/marker_ink/green
+ name = "Green marker ink"
+ id = "marker_ink_green"
+ color = "#18A31A"
+
+/datum/reagent/marker_ink/blue
+ name = "Blue marker ink"
+ id = "marker_ink_blue"
+ color = "#247CFF"
+
+/datum/reagent/marker_ink/purple
+ name = "Purple marker ink"
+ id = "marker_ink_purple"
+ color = "#CC0099"
+
+/datum/reagent/marker_ink/grey //Mime
+ name = "Grey marker ink"
+ id = "marker_ink_grey"
+ color = "#808080"
+
+/datum/reagent/marker_ink/brown //Rainbow
+ name = "Brown marker ink"
+ id = "marker_ink_brown"
+ color = "#846F35"
+
/datum/reagent/paint
name = "Paint"
id = "paint"
diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm
index 0feae58505..c86db69632 100644
--- a/code/modules/reagents/Chemistry-Recipes.dm
+++ b/code/modules/reagents/Chemistry-Recipes.dm
@@ -881,7 +881,7 @@
name = "Red paint"
id = "red_paint"
result = "paint"
- required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_red" = 1)
+ required_reagents = list("plasticide" = 1, "water" = 3, "marker_ink_red" = 1)
result_amount = 5
/datum/chemical_reaction/red_paint/send_data()
@@ -891,7 +891,7 @@
name = "Orange paint"
id = "orange_paint"
result = "paint"
- required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_orange" = 1)
+ required_reagents = list("plasticide" = 1, "water" = 3, "marker_ink_orange" = 1)
result_amount = 5
/datum/chemical_reaction/orange_paint/send_data()
@@ -901,7 +901,7 @@
name = "Yellow paint"
id = "yellow_paint"
result = "paint"
- required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_yellow" = 1)
+ required_reagents = list("plasticide" = 1, "water" = 3, "marker_ink_yellow" = 1)
result_amount = 5
/datum/chemical_reaction/yellow_paint/send_data()
@@ -911,7 +911,7 @@
name = "Green paint"
id = "green_paint"
result = "paint"
- required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_green" = 1)
+ required_reagents = list("plasticide" = 1, "water" = 3, "marker_ink_green" = 1)
result_amount = 5
/datum/chemical_reaction/green_paint/send_data()
@@ -921,7 +921,7 @@
name = "Blue paint"
id = "blue_paint"
result = "paint"
- required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_blue" = 1)
+ required_reagents = list("plasticide" = 1, "water" = 3, "marker_ink_blue" = 1)
result_amount = 5
/datum/chemical_reaction/blue_paint/send_data()
@@ -931,7 +931,7 @@
name = "Purple paint"
id = "purple_paint"
result = "paint"
- required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_purple" = 1)
+ required_reagents = list("plasticide" = 1, "water" = 3, "marker_ink_purple" = 1)
result_amount = 5
/datum/chemical_reaction/purple_paint/send_data()
@@ -941,7 +941,7 @@
name = "Grey paint"
id = "grey_paint"
result = "paint"
- required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_grey" = 1)
+ required_reagents = list("plasticide" = 1, "water" = 3, "marker_ink_grey" = 1)
result_amount = 5
/datum/chemical_reaction/grey_paint/send_data()
@@ -951,7 +951,7 @@
name = "Brown paint"
id = "brown_paint"
result = "paint"
- required_reagents = list("plasticide" = 1, "water" = 3, "crayon_dust_brown" = 1)
+ required_reagents = list("plasticide" = 1, "water" = 3, "marker_ink_brown" = 1)
result_amount = 5
/datum/chemical_reaction/brown_paint/send_data()
diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm
index 28b06a862d..68cc9d6921 100644
--- a/code/modules/reagents/reagent_containers/syringes.dm
+++ b/code/modules/reagents/reagent_containers/syringes.dm
@@ -216,7 +216,8 @@
if(trans)
to_chat(user, "You inject [trans] units of the solution. The syringe now contains [src.reagents.total_volume] units.")
- add_attack_logs(user,target,"Injected with [src.name] containing [contained], trasferred [trans] units")
+ if(ismob(target))
+ add_attack_logs(user,target,"Injected with [src.name] containing [contained], trasferred [trans] units")
else
to_chat(user, "The syringe is empty.")
diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm
index 2933ee9727..0048cd5194 100644
--- a/code/modules/recycling/conveyor2.dm
+++ b/code/modules/recycling/conveyor2.dm
@@ -6,7 +6,8 @@
icon_state = "conveyor0"
name = "conveyor belt"
desc = "A conveyor belt."
- layer = 2 // so they appear under stuff
+ plane = TURF_PLANE
+ layer = ABOVE_TURF_LAYER
anchored = 1
circuit = /obj/item/weapon/circuitboard/conveyor
var/operating = 0 // 1 if running forward, -1 if backwards, 0 if off
diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm
index e9b59dd14f..fdae51e647 100644
--- a/code/modules/recycling/disposal.dm
+++ b/code/modules/recycling/disposal.dm
@@ -663,7 +663,7 @@
var/dpdir = 0 // bitmask of pipe directions
dir = 0 // dir will contain dominant direction for junction pipes
var/health = 10 // health points 0-10
- layer = 2.3 // slightly lower than wires and other pipes
+ layer = DISPOSAL_LAYER // slightly lower than wires and other pipes
var/base_icon_state // initial icon state on map
var/sortType = ""
var/subtype = 0
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index 649d041db2..f90fd1c313 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -1802,6 +1802,22 @@ CIRCUITS BELOW
build_path = /obj/item/device/universal_translator/ear
sort_string = "HABQB"
+/datum/design/obj/item/device/xenoarch_multi_tool
+ name = "xenoarcheology multitool"
+ id = "xenoarch_multitool"
+ req_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 3, TECH_BLUESPACE = 3)
+ build_path = /obj/item/device/xenoarch_multi_tool
+ materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "uranium" = 500, "phoron" = 500)
+ sort_string = "HABQC"
+
+/datum/design/excavationdrill
+ name = "Excavation Drill"
+ id = "excavationdrill"
+ req_tech = list(TECH_MATERIAL = 3, TECH_POWER = 2, TECH_ENGINEERING = 2, TECH_BLUESPACE = 3)
+ build_type = PROTOLATHE
+ materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 4000)
+ build_path = /obj/item/weapon/pickaxe/excavationdrill
+
/* Uncomment if someone makes these buildable
/datum/design/circuit/general_alert
name = "general alert console"
diff --git a/code/modules/shieldgen/energy_field.dm b/code/modules/shieldgen/energy_field.dm
index e558a2621e..023d5fee95 100644
--- a/code/modules/shieldgen/energy_field.dm
+++ b/code/modules/shieldgen/energy_field.dm
@@ -15,7 +15,8 @@
icon_state = "shield"
alpha = 100
anchored = 1
- layer = 4.1 //just above mobs
+ plane = MOB_PLANE
+ layer = ABOVE_MOB_LAYER
density = 0
var/obj/machinery/shield_gen/my_gen = null
var/strength = 0 // in Renwicks
diff --git a/code/modules/spells/aoe_turf/conjure/conjure.dm b/code/modules/spells/aoe_turf/conjure/conjure.dm
index 1302513bfe..e96985e9bb 100644
--- a/code/modules/spells/aoe_turf/conjure/conjure.dm
+++ b/code/modules/spells/aoe_turf/conjure/conjure.dm
@@ -56,7 +56,8 @@ How they spawn stuff is decided by behaviour vars, which are explained below
animation.density = 0
animation.anchored = 1
animation.icon = 'icons/effects/effects.dmi'
- animation.layer = 3
+ animation.plane = OBJ_PLANE
+ animation.layer = ABOVE_JUNK_LAYER
animation.master = summoned_object
for(var/varName in newVars)
diff --git a/code/modules/spells/targeted/ethereal_jaunt.dm b/code/modules/spells/targeted/ethereal_jaunt.dm
index e48db592ad..68cf35e9a4 100644
--- a/code/modules/spells/targeted/ethereal_jaunt.dm
+++ b/code/modules/spells/targeted/ethereal_jaunt.dm
@@ -26,7 +26,8 @@
animation.density = 0
animation.anchored = 1
animation.icon = 'icons/mob/mob.dmi'
- animation.layer = 5
+ animation.plane = MOB_PLANE
+ animation.layer = ABOVE_MOB_LAYER
animation.master = holder
target.ExtinguishMob()
if(target.buckled)
diff --git a/code/modules/tables/flipping.dm b/code/modules/tables/flipping.dm
index 670edd01d8..5de58c1354 100644
--- a/code/modules/tables/flipping.dm
+++ b/code/modules/tables/flipping.dm
@@ -84,7 +84,8 @@
set_dir(direction)
if(dir != NORTH)
- layer = 5
+ plane = MOB_PLANE
+ layer = ABOVE_MOB_LAYER
climbable = 0 //flipping tables allows them to be used as makeshift barriers
flipped = 1
flags |= ON_BORDER
@@ -102,7 +103,7 @@
verbs -=/obj/structure/table/proc/do_put
verbs +=/obj/structure/table/verb/do_flip
- layer = initial(layer)
+ reset_plane_and_layer()
flipped = 0
climbable = initial(climbable)
flags &= ~ON_BORDER
diff --git a/code/modules/tables/tables.dm b/code/modules/tables/tables.dm
index 428dd386a4..395ac2f219 100644
--- a/code/modules/tables/tables.dm
+++ b/code/modules/tables/tables.dm
@@ -8,7 +8,7 @@ var/list/table_icon_cache = list()
density = 1
anchored = 1
climbable = 1
- layer = 2.8
+ layer = TABLE_LAYER
throwpass = 1
surgery_odds = 66
var/flipped = 0
diff --git a/code/modules/turbolift/turbolift_console.dm b/code/modules/turbolift/turbolift_console.dm
index e77447c0d2..cb9e93f4fb 100644
--- a/code/modules/turbolift/turbolift_console.dm
+++ b/code/modules/turbolift/turbolift_console.dm
@@ -4,7 +4,7 @@
icon = 'icons/obj/turbolift.dmi'
anchored = 1
density = 0
- layer = 4
+ plane = MOB_PLANE
var/datum/turbolift/lift
diff --git a/code/modules/ventcrawl/ventcrawl.dm b/code/modules/ventcrawl/ventcrawl.dm
index 0c382b52d6..1a4271050d 100644
--- a/code/modules/ventcrawl/ventcrawl.dm
+++ b/code/modules/ventcrawl/ventcrawl.dm
@@ -182,7 +182,8 @@ var/list/ventcrawl_machinery = list(
for(var/datum/pipeline/pipeline in network.line_members)
for(var/obj/machinery/atmospherics/A in (pipeline.members || pipeline.edges))
if(!A.pipe_image)
- A.pipe_image = image(A, A.loc, layer = 20, dir = A.dir)
+ A.pipe_image = image(A, A.loc, dir = A.dir)
+ A.pipe_image.plane = PLANE_LIGHTING_ABOVE
pipes_shown += A.pipe_image
client.images += A.pipe_image
if(client)
diff --git a/code/modules/virus2/disease2.dm b/code/modules/virus2/disease2.dm
index 1b8ab86fd6..3670f60bea 100644
--- a/code/modules/virus2/disease2.dm
+++ b/code/modules/virus2/disease2.dm
@@ -82,7 +82,7 @@
majormutate()
//Space antibiotics have a good chance to stop disease completely
- if(mob.reagents.has_reagent("spaceacillin"))
+ if(mob.chem_effects[CE_ANTIBIOTIC])
if(stage == 1 && prob(70-resistance))
src.cure(mob)
else
diff --git a/code/modules/virus2/helpers.dm b/code/modules/virus2/helpers.dm
index d10fdbfb68..64790fdfc5 100644
--- a/code/modules/virus2/helpers.dm
+++ b/code/modules/virus2/helpers.dm
@@ -81,7 +81,7 @@ proc/airborne_can_reach(turf/source, turf/target)
var/list/antibodies_in_common = M.antibodies & disease.antigen
if(antibodies_in_common.len)
return
- if(M.reagents.has_reagent("spaceacillin"))
+ if(M.chem_effects[CE_ANTIBIOTIC])
if(prob(disease.resistance))
var/datum/disease2/disease/D = disease.getcopy()
D.minormutate()
diff --git a/code/modules/xenoarcheaology/artifacts/gigadrill.dm b/code/modules/xenoarcheaology/artifacts/gigadrill.dm
index 42c7288d2d..b6c665cb66 100644
--- a/code/modules/xenoarcheaology/artifacts/gigadrill.dm
+++ b/code/modules/xenoarcheaology/artifacts/gigadrill.dm
@@ -7,7 +7,7 @@
var/drill_time = 10
var/turf/drilling_turf
density = 1
- layer = 3.1 //to go over ores
+ layer = ABOVE_JUNK_LAYER
/obj/machinery/giga_drill/attack_hand(mob/user as mob)
if(active)
diff --git a/code/modules/xenoarcheaology/boulder.dm b/code/modules/xenoarcheaology/boulder.dm
index 4c0bafd707..09b9d398ea 100644
--- a/code/modules/xenoarcheaology/boulder.dm
+++ b/code/modules/xenoarcheaology/boulder.dm
@@ -29,11 +29,22 @@
C.scan_atom(user, src)
return
+ if(istype(I, /obj/item/device/xenoarch_multi_tool))
+ var/obj/item/device/xenoarch_multi_tool/C = I
+ if(C.mode) //Mode means scanning.
+ C.depth_scanner.scan_atom(user, src)
+ return
+ else
+ user.visible_message("\The [user] extends \the [C] over \the [src], a flurry of red beams scanning \the [src]'s surface!", "You extend \the [C] over \the [src], a flurry of red beams scanning \the [src]'s surface!")
+ if(do_after(user, 15))
+ to_chat(user, "\The [src] has been excavated to a depth of [2 * src.excavation_level]cm.")
+ return
+
if(istype(I, /obj/item/device/measuring_tape))
var/obj/item/device/measuring_tape/P = I
user.visible_message("\The [user] extends \the [P] towards \the [src].", "You extend \the [P] towards \the [src].")
if(do_after(user, 15))
- user << "\The [src] has been excavated to a depth of [2 * src.excavation_level]cm."
+ to_chat(user, "\The [src] has been excavated to a depth of [2 * src.excavation_level]cm.")
return
if(istype(I, /obj/item/weapon/pickaxe))
@@ -43,12 +54,12 @@
return
last_act = world.time
- user << "You start [P.drill_verb] [src]."
+ to_chat(user, "You start [P.drill_verb] [src].")
if(!do_after(user, P.digspeed))
return
- user << "You finish [P.drill_verb] [src]."
+ to_chat(user, "You finish [P.drill_verb] [src].")
excavation_level += P.excavation_amount
if(excavation_level > 100)
@@ -87,4 +98,4 @@
else if(istype(AM,/obj/mecha))
var/obj/mecha/M = AM
if(istype(M.selected,/obj/item/mecha_parts/mecha_equipment/tool/drill))
- M.selected.action(src)
\ No newline at end of file
+ M.selected.action(src)
diff --git a/code/modules/xenoarcheaology/tools/tools.dm b/code/modules/xenoarcheaology/tools/tools.dm
index 17412b4a8b..5f8c30ecad 100644
--- a/code/modules/xenoarcheaology/tools/tools.dm
+++ b/code/modules/xenoarcheaology/tools/tools.dm
@@ -80,13 +80,13 @@
SSxenoarch.digsite_spawning_turfs.Remove(T)
if(nearestTargetDist >= 0)
- user << "Exotic energy detected on wavelength '[nearestTargetId]' in a radius of [nearestTargetDist]m[nearestSimpleTargetDist > 0 ? "; small anomaly detected in a radius of [nearestSimpleTargetDist]m" : ""]"
+ to_chat(user, "Exotic energy detected on wavelength '[nearestTargetId]' in a radius of [nearestTargetDist]m[nearestSimpleTargetDist > 0 ? "; small anomaly detected in a radius of [nearestSimpleTargetDist]m" : ""]")
else if(nearestSimpleTargetDist >= 0)
- user << "Small anomaly detected in a radius of [nearestSimpleTargetDist]m."
+ to_chat(user, "Small anomaly detected in a radius of [nearestSimpleTargetDist]m.")
else
- user << "Background radiation levels detected."
+ to_chat(user, "Background radiation levels detected.")
else
- user << "Scanning array is recharging."
+ to_chat(user, "Scanning array is recharging.")
/obj/item/device/depth_scanner
name = "depth analysis scanner"
@@ -133,7 +133,7 @@
positive_locations.Add(D)
- user << "\icon[src] [src] pings."
+ to_chat(user, "\icon[src] [src] pings.")
else if(istype(A, /obj/structure/boulder))
var/obj/structure/boulder/B = A
@@ -151,7 +151,7 @@
positive_locations.Add(D)
- user << "\icon[src] [src] pings [pick("madly","wildly","excitedly","crazily")]!"
+ to_chat(user, "\icon[src] [src] pings [pick("madly","wildly","excitedly","crazily")]!")
/obj/item/device/depth_scanner/attack_self(var/mob/living/user)
interact(user)
@@ -310,3 +310,39 @@
usr << browse(null, "window=locater")
updateSelfDialog()
+
+/obj/item/device/xenoarch_multi_tool
+ name = "xenoarcheology multitool"
+ desc = "Has the features of the Alden-Saraspova counter, a measuring tape, and a depth analysis scanner all in one!"
+ icon_state = "ano_scanner2"
+ item_state = "lampgreen"
+ icon = 'icons/obj/xenoarchaeology.dmi'
+ origin_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 3, TECH_BLUESPACE = 2)
+ matter = list(DEFAULT_WALL_MATERIAL = 10000,"glass" = 5000)
+ w_class = ITEMSIZE_SMALL
+ slot_flags = SLOT_BELT
+ var/mode = 1 //Start off scanning. 1 = scanning, 0 = measuring
+ var/obj/item/device/ano_scanner/anomaly_scanner = null
+ var/obj/item/device/depth_scanner/depth_scanner = null
+
+/obj/item/device/xenoarch_multi_tool/New()
+ anomaly_scanner = new/obj/item/device/ano_scanner(src)
+ depth_scanner = new/obj/item/device/depth_scanner(src)
+
+/obj/item/device/xenoarch_multi_tool/attack_self(var/mob/living/user)
+ depth_scanner.interact(user)
+
+/obj/item/device/xenoarch_multi_tool/verb/swap_settings(var/mob/living/user)
+ set name = "Swap Functionality"
+ set desc = "Swap between the scanning and measuring functionality.."
+ mode = !mode
+ if(mode)
+ to_chat(user, "The device will now scan for artifacts.")
+ else
+ to_chat(user, "The device will now measure depth dug.")
+
+/obj/item/device/xenoarch_multi_tool/verb/scan_for_anomalies(var/mob/living/user)
+ set name = "Scan for Anomalies"
+ set desc = "Scan for artifacts and anomalies within your vicinity."
+ anomaly_scanner.interact(user)
+
diff --git a/code/modules/xenoarcheaology/tools/tools_pickaxe.dm b/code/modules/xenoarcheaology/tools/tools_pickaxe.dm
index b954d5eb05..d911843cca 100644
--- a/code/modules/xenoarcheaology/tools/tools_pickaxe.dm
+++ b/code/modules/xenoarcheaology/tools/tools_pickaxe.dm
@@ -149,3 +149,43 @@
smallest.loc = src
picksToSort -= smallest
orient2hud()
+
+/obj/item/weapon/pickaxe/excavationdrill
+ name = "excavation drill"
+ icon = 'icons/obj/xenoarchaeology.dmi'
+ icon_state = "excavationdrill2"
+ item_state = "syringe_0"
+ excavation_amount = 15
+ digspeed = 30
+ desc = "Advanced archaeological drill combining ultrasonic excitation and bluespace manipulation to provide extreme precision. The tip is adjustable from 1 to 30 cm."
+ drill_sound = 'sound/weapons/thudswoosh.ogg'
+ drill_verb = "drilling"
+ force = 5
+ w_class = 2
+ attack_verb = list("drilled")
+
+/obj/item/weapon/pickaxe/excavationdrill/attack_self(mob/user as mob)
+ var/depth = input("Put the desired depth (1-30 centimeters).", "Set Depth", 30) as num
+ if(depth>30 || depth<1)
+ to_chat(user, "Invalid depth.")
+ return
+ excavation_amount = depth
+ to_chat(user, "You set the depth to [depth]cm.")
+ switch(depth)
+ if(1 to 5)
+ icon_state = "excavationdrill0"
+ if(6 to 10)
+ icon_state = "excavationdrill1"
+ if(11 to 15)
+ icon_state = "excavationdrill2"
+ if(16 to 20)
+ icon_state = "excavationdrill3"
+ if(21 to 25)
+ icon_state = "excavationdrill4"
+ if(25 to 30)
+ icon_state = "excavationdrill5" //The other 2 sprites are comically long. Let's just cut it at 5.
+
+/obj/item/weapon/pickaxe/excavationdrill/examine(mob/user)
+ ..()
+ var/depth = excavation_amount
+ to_chat(user, "It is currently set at [depth]cms.")
\ No newline at end of file
diff --git a/html/changelog.html b/html/changelog.html
index 1b54f6e327..3796656cc9 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -53,6 +53,45 @@
-->
+
15 March 2018
+
Anewbe updated:
+
+ - Pills and ingested reagents actually process at half speed, rather than just ignoring half of the reagents.
+ - Robotic limbs now need internal repair at 30 composite damage, rather than 30 of burn or brute.
+ - Syringes now inject their entire payload with one click, but in 5 unit increments. There is a delay in between each of these.
+ - Assisted robotic organs (internals, eyes) are less vulnerable to EMP.
+ - Lifelike robotic organs (currently VeyMed) are more vulnerable to EMP.
+
+
Cerebulon updated:
+
+ - Added Akhani language for Tajaran.
+ - Fixed incorrect singular form of Tajaran in several places.
+
+
MisterLayne updated:
+
+ - Added a version of the ED-209 called the ED-CLN. It is a more efficient Cleanbot.
+ - Reinforced snowballs can now actually be made in a reasonable time limit.
+
+
Nerezza updated:
+
+ - Broken APCs can be bashed open with slightly smaller objects now. This means wrenches are acceptable, no need to hunt down a fire extinguisher.
+ - EVA rigsuit/hardsuit no longer holds toolboxes in suit storage since those have been a volume inventory for some time now. RIP ghetto satchel.
+ - CE's rigsuit/hardsuit no longer holds pickaxes and ore satchels, but can now hold inflateables.
+ - Retracting rigsuit/hardsuit helmets with no valid mask equipped now disables internals.
+ - Offline rigsuits/hardsuits are no longer considered valid air supplies by the internals button. Before, your internals would instantly shut off before you could get a breath out of the rigsuit. Now, the internals button will look for a different tank instead.
+ - Tajaran now get to keep their tails when they wear the EVA, RD, or Industrial rigsuits/hardsuits. Unathi sprites to come soon!
+ - Sifwood floor tiles now correctly use their double-stacked icon instead of disappearing.
+
+
Woodrat updated:
+
+ - Added in a weapons crate for explorers that has bolt action rifles.
+ - Weapon powercells can be ordered from cargo (security access crate).
+ - Automatic weapons crate split into two crates now. One for SMGs one for the rifle. Minor adjustments to other munitions and security supply packs as well.
+ - The automatic weapons ammo crate has also been split.
+ - Names of the crates for the munitions and security catogory supply packs have been adjusted slightly. In certain places contents also adjusted.
+ - Holoplant now comes in a crate.
+
+
05 March 2018
Anewbe updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index a1820c932c..750c450cf0 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -3995,3 +3995,47 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
with them.
PrismaticGynoid:
- bugfix: The succumb verb will now work on species that can't take oxyloss damage.
+2018-03-15:
+ Anewbe:
+ - tweak: Pills and ingested reagents actually process at half speed, rather than
+ just ignoring half of the reagents.
+ - rscdel: Robotic limbs now need internal repair at 30 composite damage, rather
+ than 30 of burn or brute.
+ - tweak: Syringes now inject their entire payload with one click, but in 5 unit
+ increments. There is a delay in between each of these.
+ - rscadd: Assisted robotic organs (internals, eyes) are less vulnerable to EMP.
+ - rscdel: Lifelike robotic organs (currently VeyMed) are more vulnerable to EMP.
+ Cerebulon:
+ - rscadd: Added Akhani language for Tajaran.
+ - spellcheck: Fixed incorrect singular form of Tajaran in several places.
+ MisterLayne:
+ - rscadd: Added a version of the ED-209 called the ED-CLN. It is a more efficient
+ Cleanbot.
+ - bugfix: Reinforced snowballs can now actually be made in a reasonable time limit.
+ Nerezza:
+ - tweak: Broken APCs can be bashed open with slightly smaller objects now. This
+ means wrenches are acceptable, no need to hunt down a fire extinguisher.
+ - rscdel: EVA rigsuit/hardsuit no longer holds toolboxes in suit storage since those
+ have been a volume inventory for some time now. RIP ghetto satchel.
+ - rsctweak: CE's rigsuit/hardsuit no longer holds pickaxes and ore satchels, but
+ can now hold inflateables.
+ - bugfix: Retracting rigsuit/hardsuit helmets with no valid mask equipped now disables
+ internals.
+ - bugfix: Offline rigsuits/hardsuits are no longer considered valid air supplies
+ by the internals button. Before, your internals would instantly shut off before
+ you could get a breath out of the rigsuit. Now, the internals button will look
+ for a different tank instead.
+ - rscadd: Tajaran now get to keep their tails when they wear the EVA, RD, or Industrial
+ rigsuits/hardsuits. Unathi sprites to come soon!
+ - bugfix: Sifwood floor tiles now correctly use their double-stacked icon instead
+ of disappearing.
+ Woodrat:
+ - rscadd: Added in a weapons crate for explorers that has bolt action rifles.
+ - rscadd: Weapon powercells can be ordered from cargo (security access crate).
+ - tweak: Automatic weapons crate split into two crates now. One for SMGs one for
+ the rifle. Minor adjustments to other munitions and security supply packs as
+ well.
+ - rscadd: The automatic weapons ammo crate has also been split.
+ - tweak: Names of the crates for the munitions and security catogory supply packs
+ have been adjusted slightly. In certain places contents also adjusted.
+ - bugfix: Holoplant now comes in a crate.
diff --git a/html/changelogs/Anewbe - Robolimb Repair.yml b/html/changelogs/Anewbe - Medkits.yml
similarity index 92%
rename from html/changelogs/Anewbe - Robolimb Repair.yml
rename to html/changelogs/Anewbe - Medkits.yml
index a2521de202..48624d92bf 100644
--- a/html/changelogs/Anewbe - Robolimb Repair.yml
+++ b/html/changelogs/Anewbe - Medkits.yml
@@ -33,4 +33,4 @@ delete-after: True
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
changes:
- - rscdel: "Robotic limbs now need internal repair at 30 composite damage, rather than 30 of burn or brute."
+ - tweak: "Medical Doctors and EMTs spawn with white medkits."
\ No newline at end of file
diff --git a/html/changelogs/Anewbe - Syringes.yml b/html/changelogs/Anewbe - Syringes.yml
deleted file mode 100644
index 90fd9a0b17..0000000000
--- a/html/changelogs/Anewbe - Syringes.yml
+++ /dev/null
@@ -1,36 +0,0 @@
-################################
-# Example Changelog File
-#
-# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
-#
-# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
-# When it is, any changes listed below will disappear.
-#
-# Valid Prefixes:
-# bugfix
-# wip (For works in progress)
-# tweak
-# soundadd
-# sounddel
-# rscadd (general adding of nice things)
-# rscdel (general deleting of nice things)
-# imageadd
-# imagedel
-# maptweak
-# spellcheck (typo fixes)
-# experiment
-#################################
-
-# Your name.
-author: Anewbe
-
-# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
-delete-after: True
-
-# Any changes you've made. See valid prefix list above.
-# INDENT WITH TWO SPACES. NOT TABS. SPACES.
-# SCREW THIS UP AND IT WON'T WORK.
-# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
-# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
-changes:
- - tweak: "Syringes now inject their entire payload with one click, but in 5 unit increments. There is a delay in between each of these."
diff --git a/html/changelogs/Anewbe - Pills.yml b/html/changelogs/Billybangles - Markers.yml
similarity index 81%
rename from html/changelogs/Anewbe - Pills.yml
rename to html/changelogs/Billybangles - Markers.yml
index 5669a907c1..afab2bf8cb 100644
--- a/html/changelogs/Anewbe - Pills.yml
+++ b/html/changelogs/Billybangles - Markers.yml
@@ -22,7 +22,7 @@
#################################
# Your name.
-author: Anewbe
+author: battlefieldCommander
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
delete-after: True
@@ -33,4 +33,6 @@ delete-after: True
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
changes:
- - tweak: "Pills and ingested reagents actually process at half speed, rather than just ignoring half of the reagents."
+ - rscadd: "Added permanent markers, an alternative to crayons."
+ - tweak: "The chemistry recipe for paint now uses marker ink instead of crayon dust."
+ - rscdel: "Removed crayon boxes from the map. They can still be ordered from cargo in case you need a snack."
diff --git a/html/changelogs/Anewbe - VeyMed EMP tweaks.yml b/html/changelogs/Cameron - Xenoarch Upgrades.yml
similarity index 84%
rename from html/changelogs/Anewbe - VeyMed EMP tweaks.yml
rename to html/changelogs/Cameron - Xenoarch Upgrades.yml
index 24b2090fc9..b352e0d3b7 100644
--- a/html/changelogs/Anewbe - VeyMed EMP tweaks.yml
+++ b/html/changelogs/Cameron - Xenoarch Upgrades.yml
@@ -22,7 +22,7 @@
#################################
# Your name.
-author: Anewbe
+author: Cameron653
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
delete-after: True
@@ -33,5 +33,5 @@ delete-after: True
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
changes:
- - rscadd: "Assisted robotic organs (internals, eyes) are less vulnerable to EMP."
- - rscdel: "Lifelike robotic organs (currently VeyMed) are more vulnerable to EMP."
+ - rscadd: "Adds a xenoarch excavation tool, craftable in R&D. Allows depth selection of 1-30"
+ - rscadd: "Adds a xenoarch multitool, craftable in R&D. Has xenoarch counter, measure tool, and depth scanner all in one."
diff --git a/html/changelogs/Heroman3003 - Gripper Fixes.yml b/html/changelogs/Heroman3003 - Gripper Fixes.yml
new file mode 100644
index 0000000000..c320b73d93
--- /dev/null
+++ b/html/changelogs/Heroman3003 - Gripper Fixes.yml
@@ -0,0 +1,8 @@
+
+author: Heroman3003
+
+delete-after: True
+
+changes:
+ - bugfix: "Fixed a bug where same piece of exosuit equipment could be attached several times with exosuit gripper"
+ - bugfix: "Fixed a bug where frame parts could dupe frames with engineering gripper"
diff --git a/html/changelogs/MisterLayne - ED-CLN.yml b/html/changelogs/MisterLayne - ED-CLN.yml
deleted file mode 100644
index 0aba34a616..0000000000
--- a/html/changelogs/MisterLayne - ED-CLN.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: MisterLayne
-
-delete-after: True
-
-changes:
- - rscadd "Added a version of the ED-209 called the ED-CLN. It is a more efficient Cleanbot."
\ No newline at end of file
diff --git a/html/changelogs/MisterLayne - SnowballTEMPFIX.yml b/html/changelogs/MisterLayne - SnowballTEMPFIX.yml
deleted file mode 100644
index 88edc4f77c..0000000000
--- a/html/changelogs/MisterLayne - SnowballTEMPFIX.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: MisterLayne
-
-delete-after: False
-
-changes:
- - bugfix "Reinforced snowballs can now actually be made in a reasonable time limit."
diff --git a/html/changelogs/Nerezza - APC-Tweak.yml b/html/changelogs/Nerezza - APC-Tweak.yml
deleted file mode 100644
index 6017913c88..0000000000
--- a/html/changelogs/Nerezza - APC-Tweak.yml
+++ /dev/null
@@ -1,36 +0,0 @@
-################################
-# Example Changelog File
-#
-# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
-#
-# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
-# When it is, any changes listed below will disappear.
-#
-# Valid Prefixes:
-# bugfix
-# wip (For works in progress)
-# tweak
-# soundadd
-# sounddel
-# rscadd (general adding of nice things)
-# rscdel (general deleting of nice things)
-# imageadd
-# imagedel
-# maptweak
-# spellcheck (typo fixes)
-# experiment
-#################################
-
-# Your name.
-author: Nerezza
-
-# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
-delete-after: True
-
-# Any changes you've made. See valid prefix list above.
-# INDENT WITH TWO SPACES. NOT TABS. SPACES.
-# SCREW THIS UP AND IT WON'T WORK.
-# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
-# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
-changes:
- - tweak: "Broken APCs can be bashed open with slightly smaller objects now. This means wrenches are acceptable, no need to hunt down a fire extinguisher."
diff --git a/html/changelogs/Nerezza - Hardsuit-fixes.yml b/html/changelogs/Nerezza - Hardsuit-fixes.yml
deleted file mode 100644
index 52642a3061..0000000000
--- a/html/changelogs/Nerezza - Hardsuit-fixes.yml
+++ /dev/null
@@ -1,39 +0,0 @@
-################################
-# Example Changelog File
-#
-# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
-#
-# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
-# When it is, any changes listed below will disappear.
-#
-# Valid Prefixes:
-# bugfix
-# wip (For works in progress)
-# tweak
-# soundadd
-# sounddel
-# rscadd (general adding of nice things)
-# rscdel (general deleting of nice things)
-# imageadd
-# imagedel
-# maptweak
-# spellcheck (typo fixes)
-# experiment
-#################################
-
-# Your name.
-author: Nerezza
-
-# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
-delete-after: True
-
-# Any changes you've made. See valid prefix list above.
-# INDENT WITH TWO SPACES. NOT TABS. SPACES.
-# SCREW THIS UP AND IT WON'T WORK.
-# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
-# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
-changes:
- - rscdel: "EVA rigsuit/hardsuit no longer holds toolboxes in suit storage since those have been a volume inventory for some time now. RIP ghetto satchel."
- - rsctweak: "CE's rigsuit/hardsuit no longer holds pickaxes and ore satchels, but can now hold inflateables."
- - bugfix: "Retracting rigsuit/hardsuit helmets with no valid mask equipped now disables internals."
- - bugfix: "Offline rigsuits/hardsuits are no longer considered valid air supplies by the internals button. Before, your internals would instantly shut off before you could get a breath out of the rigsuit. Now, the internals button will look for a different tank instead."
diff --git a/html/changelogs/Nerezza - off-the-chopblock.yml b/html/changelogs/Nerezza - off-the-chopblock.yml
deleted file mode 100644
index 0bcbbbbce3..0000000000
--- a/html/changelogs/Nerezza - off-the-chopblock.yml
+++ /dev/null
@@ -1,36 +0,0 @@
-################################
-# Example Changelog File
-#
-# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
-#
-# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
-# When it is, any changes listed below will disappear.
-#
-# Valid Prefixes:
-# bugfix
-# wip (For works in progress)
-# tweak
-# soundadd
-# sounddel
-# rscadd (general adding of nice things)
-# rscdel (general deleting of nice things)
-# imageadd
-# imagedel
-# maptweak
-# spellcheck (typo fixes)
-# experiment
-#################################
-
-# Your name.
-author: Nerezza
-
-# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
-delete-after: True
-
-# Any changes you've made. See valid prefix list above.
-# INDENT WITH TWO SPACES. NOT TABS. SPACES.
-# SCREW THIS UP AND IT WON'T WORK.
-# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
-# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
-changes:
- - rscadd: "Tajaran now get to keep their tails when they wear the EVA, RD, or Industrial rigsuits/hardsuits. Unathi sprites to come soon!"
diff --git a/html/changelogs/Nerezza - sifwoodfix.yml b/html/changelogs/Nerezza - sifwoodfix.yml
deleted file mode 100644
index 41f190774d..0000000000
--- a/html/changelogs/Nerezza - sifwoodfix.yml
+++ /dev/null
@@ -1,36 +0,0 @@
-################################
-# Example Changelog File
-#
-# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
-#
-# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
-# When it is, any changes listed below will disappear.
-#
-# Valid Prefixes:
-# bugfix
-# wip (For works in progress)
-# tweak
-# soundadd
-# sounddel
-# rscadd (general adding of nice things)
-# rscdel (general deleting of nice things)
-# imageadd
-# imagedel
-# maptweak
-# spellcheck (typo fixes)
-# experiment
-#################################
-
-# Your name.
-author: Nerezza
-
-# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
-delete-after: True
-
-# Any changes you've made. See valid prefix list above.
-# INDENT WITH TWO SPACES. NOT TABS. SPACES.
-# SCREW THIS UP AND IT WON'T WORK.
-# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
-# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
-changes:
- - bugfix: "Sifwood floor tiles now correctly use their double-stacked icon instead of disappearing."
diff --git a/html/changelogs/Woodrat - Supplypack Adjustments.yml b/html/changelogs/Woodrat - Random Changes.yml
similarity index 66%
rename from html/changelogs/Woodrat - Supplypack Adjustments.yml
rename to html/changelogs/Woodrat - Random Changes.yml
index f76a4b143e..ad03c5bd4a 100644
--- a/html/changelogs/Woodrat - Supplypack Adjustments.yml
+++ b/html/changelogs/Woodrat - Random Changes.yml
@@ -33,9 +33,11 @@ delete-after: True
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
changes:
- - rscadd: "Added in a weapons crate for explorers that has bolt action rifles."
- - rscadd: "Weapon powercells can be ordered from cargo (security access crate)."
- - tweak: "Automatic weapons crate split into two crates now. One for SMGs one for the rifle. Minor adjustments to other munitions and security supply packs as well."
- - rscadd: "The automatic weapons ammo crate has also been split."
- - tweak: "Names of the crates for the munitions and security catogory supply packs have been adjusted slightly. In certain places contents also adjusted."
- - bugfix: "Holoplant now comes in a crate."
+ - bugfix: "Fixed the icon_state for 'structure/plushie/carp' and the random first aid kit spawner."
+ - rscadd: "Added a random chance tool spawn for power tools (most of the time it should still just be regular tools)."
+ - tweak: "Adjusted the spawn rate of medkits, combat medkits should be more rare."
+ - tweak: "Cash split into its own loot item."
+ - tweak: "Plushies split into large and small plushies."
+ - rscadd: "All the extra plushie spawns added to the random plushie spawn."
+ - tweak: "Eightball and conch shell added to toy spawns."
+ - rscadd: "Added spawn points for the large plushies, cash, and the power tools to the station."
\ No newline at end of file
diff --git a/html/changelogs/example - Copy.yml b/html/changelogs/example - Copy.yml
deleted file mode 100644
index 372935e482..0000000000
--- a/html/changelogs/example - Copy.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-author: Cerebulon
-
-delete-after: True
-
-changes:
- - rscadd: "Added Akhani language for Tajaran."
- - spellcheck: "Fixed incorrect singular form of Tajaran in several places."
diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi
index 415c4cd5a8..601d40b4dc 100644
Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ
diff --git a/icons/mob/items/lefthand_melee.dmi b/icons/mob/items/lefthand_melee.dmi
index 9c5b5d72ee..790d93eca6 100644
Binary files a/icons/mob/items/lefthand_melee.dmi and b/icons/mob/items/lefthand_melee.dmi differ
diff --git a/icons/mob/items/righthand_melee.dmi b/icons/mob/items/righthand_melee.dmi
index 85e99773f7..8c1068a033 100644
Binary files a/icons/mob/items/righthand_melee.dmi and b/icons/mob/items/righthand_melee.dmi differ
diff --git a/maps/southern_cross/icons/mob/sc_head.dmi b/icons/mob/pilot_helmet.dmi
similarity index 100%
rename from maps/southern_cross/icons/mob/sc_head.dmi
rename to icons/mob/pilot_helmet.dmi
diff --git a/icons/mob/screen1_robot.dmi b/icons/mob/screen1_robot.dmi
index c89dd8a01e..b991f26d43 100644
Binary files a/icons/mob/screen1_robot.dmi and b/icons/mob/screen1_robot.dmi differ
diff --git a/icons/mob/screen1_robot_minimalist.dmi b/icons/mob/screen1_robot_minimalist.dmi
index 819d938fae..c05e304763 100644
Binary files a/icons/mob/screen1_robot_minimalist.dmi and b/icons/mob/screen1_robot_minimalist.dmi differ
diff --git a/maps/southern_cross/icons/mob/species/teshari/sc_head.dmi b/icons/mob/species/seromi/pilot_helmet.dmi
similarity index 100%
rename from maps/southern_cross/icons/mob/species/teshari/sc_head.dmi
rename to icons/mob/species/seromi/pilot_helmet.dmi
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index 70594a801a..a0c2983ea7 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/crayons.dmi b/icons/obj/crayons.dmi
index 7ebabd5a81..80ab2d153c 100644
Binary files a/icons/obj/crayons.dmi and b/icons/obj/crayons.dmi differ
diff --git a/icons/obj/cryogenics_split.dmi b/icons/obj/cryogenics_split.dmi
index a25513a143..86ef62b6f8 100644
Binary files a/icons/obj/cryogenics_split.dmi and b/icons/obj/cryogenics_split.dmi differ
diff --git a/icons/obj/pda_old.dmi b/icons/obj/pda_old.dmi
index fcded39c1e..d3934be341 100644
Binary files a/icons/obj/pda_old.dmi and b/icons/obj/pda_old.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index 677903284c..91658df513 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi
index 230f4f8821..bb968eec1b 100644
Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ
diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi
index 20ec01a737..8adc02e3b5 100644
Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ
diff --git a/icons/obj/xenoarchaeology.dmi b/icons/obj/xenoarchaeology.dmi
index 6ece09b46e..e0baa63cff 100644
Binary files a/icons/obj/xenoarchaeology.dmi and b/icons/obj/xenoarchaeology.dmi differ
diff --git a/maps/RandomZLevels/wildwest.dm b/maps/RandomZLevels/wildwest.dm
new file mode 100644
index 0000000000..70914f043f
--- /dev/null
+++ b/maps/RandomZLevels/wildwest.dm
@@ -0,0 +1,173 @@
+/* Code for the Wild West map by Brotemis
+ * Contains:
+ * Wish Granter
+ * Meat Grinder
+ */
+
+/*
+ * Wish Granter
+ */
+/obj/machinery/wish_granter_dark
+ name = "Wish Granter"
+ desc = "You're not so sure about this, anymore..."
+ icon = 'icons/obj/device.dmi'
+ icon_state = "syndbeacon"
+
+ anchored = 1
+ density = 1
+ use_power = 0
+
+ var/chargesa = 1
+ var/insistinga = 0
+
+/obj/machinery/wish_granter_dark/attack_hand(var/mob/living/carbon/human/user as mob)
+ usr.set_machine(src)
+
+ if(chargesa <= 0)
+ user << "The Wish Granter lies silent."
+ return
+
+ else if(!istype(user, /mob/living/carbon/human))
+ user << "You feel a dark stirring inside of the Wish Granter, something you want nothing of. Your instincts are better than any man's."
+ return
+
+ else if(is_special_character(user))
+ user << "Even to a heart as dark as yours, you know nothing good will come of this. Something instinctual makes you pull away."
+
+ else if (!insistinga)
+ user << "Your first touch makes the Wish Granter stir, listening to you. Are you really sure you want to do this?"
+ insistinga++
+
+ else
+ chargesa--
+ insistinga = 0
+ var/wish = input("You want...","Wish") as null|anything in list("Power","Wealth","Immortality","To Kill","Peace")
+ switch(wish)
+ if("Power")
+ user << "Your wish is granted, but at a terrible cost..."
+ user << "The Wish Granter punishes you for your selfishness, claiming your soul and warping your body to match the darkness in your heart."
+ if (!(LASER in user.mutations))
+ user.mutations.Add(LASER)
+ user << "You feel pressure building behind your eyes."
+ if (!(COLD_RESISTANCE in user.mutations))
+ user.mutations.Add(COLD_RESISTANCE)
+ user << "Your body feels warm."
+ if (!(XRAY in user.mutations))
+ user.mutations.Add(XRAY)
+ user.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS)
+ user.see_in_dark = 8
+ user.see_invisible = SEE_INVISIBLE_LEVEL_TWO
+ user << "The walls suddenly disappear."
+ user.dna.mutantrace = "shadow"
+ user.update_mutantrace()
+ if("Wealth")
+ user << "Your wish is granted, but at a terrible cost..."
+ user << "The Wish Granter punishes you for your selfishness, claiming your soul and warping your body to match the darkness in your heart."
+ new /obj/structure/closet/syndicate/resources/everything(loc)
+ user.dna.mutantrace = "shadow"
+ user.update_mutantrace()
+ if("Immortality")
+ user << "Your wish is granted, but at a terrible cost..."
+ user << "The Wish Granter punishes you for your selfishness, claiming your soul and warping your body to match the darkness in your heart."
+ user.verbs += /mob/living/carbon/proc/immortality
+ user.dna.mutantrace = "shadow"
+ user.update_mutantrace()
+ if("To Kill")
+ user << "Your wish is granted, but at a terrible cost..."
+ user << "The Wish Granter punishes you for your wickedness, claiming your soul and warping your body to match the darkness in your heart."
+ ticker.mode.traitors += user.mind
+ user.mind.special_role = "traitor"
+ var/datum/objective/hijack/hijack = new
+ hijack.owner = user.mind
+ user.mind.objectives += hijack
+ user << "Your inhibitions are swept away, the bonds of loyalty broken, you are free to murder as you please!"
+ var/obj_count = 1
+ for(var/datum/objective/OBJ in user.mind.objectives)
+ user << "Objective #[obj_count]: [OBJ.explanation_text]"
+ obj_count++
+ user.dna.mutantrace = "shadow"
+ user.update_mutantrace()
+ if("Peace")
+ user << "Whatever alien sentience that the Wish Granter possesses is satisfied with your wish. There is a distant wailing as the last of the Faithless begin to die, then silence."
+ user << "You feel as if you just narrowly avoided a terrible fate..."
+ for(var/mob/living/simple_animal/hostile/faithless/F in living_mob_list)
+ F.health = -10
+ F.stat = 2
+ F.icon_state = "faithless_dead"
+
+
+///////////////Meatgrinder//////////////
+
+
+/obj/effect/meatgrinder
+ name = "Meat Grinder"
+ desc = "What is that thing?"
+ density = 1
+ anchored = 1
+ icon = 'icons/mob/critter.dmi'
+ icon_state = "blob"
+ var/triggerproc = "explode" //name of the proc thats called when the mine is triggered
+ var/triggered = 0
+
+/obj/effect/meatgrinder/New()
+ icon_state = "blob"
+
+/obj/effect/meatgrinder/HasEntered(AM as mob|obj)
+ Bumped(AM)
+
+/obj/effect/meatgrinder/Bumped(mob/M as mob|obj)
+
+ if(triggered) return
+
+ if(istype(M, /mob/living/carbon/human) || istype(M, /mob/living/carbon/monkey))
+ for(var/mob/O in viewers(world.view, src.loc))
+ O << "[M] triggered the \icon[src] [src]"
+ triggered = 1
+ call(src,triggerproc)(M)
+
+/obj/effect/meatgrinder/proc/triggerrad1(mob)
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ for(var/mob/O in viewers(world.view, src.loc))
+ s.set_up(3, 1, src)
+ s.start()
+ explosion(mob, 1, 0, 0, 0)
+ spawn(0)
+ qdel(src)
+
+/obj/effect/meatgrinder
+ name = "Meat Grinder"
+ icon_state = "blob"
+ triggerproc = "triggerrad1"
+
+
+/////For the Wishgranter///////////
+
+/mob/living/carbon/proc/immortality()
+ set category = "Immortality"
+ set name = "Resurrection"
+
+ var/mob/living/carbon/C = usr
+ if(!C.stat)
+ C << "You're not dead yet!"
+ return
+ C << "Death is not your end!"
+
+ spawn(rand(800,1200))
+ if(C.stat == DEAD)
+ dead_mob_list -= C
+ living_mob_list += C
+ C.stat = CONSCIOUS
+ C.tod = null
+ C.setToxLoss(0)
+ C.setOxyLoss(0)
+ C.setCloneLoss(0)
+ C.SetParalysis(0)
+ C.SetStunned(0)
+ C.SetWeakened(0)
+ C.radiation = 0
+ C.heal_overall_damage(C.getBruteLoss(), C.getFireLoss())
+ C.reagents.clear_reagents()
+ C << "You have regenerated."
+ C.visible_message("[usr] appears to wake from the dead, having healed all wounds.")
+ C.update_canmove()
+ return 1
diff --git a/maps/northern_star/polaris-1.dmm b/maps/northern_star/polaris-1.dmm
index 77252211be..48d988d93d 100644
--- a/maps/northern_star/polaris-1.dmm
+++ b/maps/northern_star/polaris-1.dmm
@@ -298,7 +298,7 @@
"afL" = (/turf/simulated/wall,/area/chapel/main)
"afM" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp{pixel_y = 10},/obj/machinery/camera/network/civilian{c_tag = "CIV - Chapel Office"; dir = 4},/turf/simulated/floor/lino,/area/chapel/office)
"afN" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen/blue{pixel_x = 5; pixel_y = 5},/turf/simulated/floor/lino,/area/chapel/office)
-"afO" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/fancy/crayons,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/lino,/area/chapel/office)
+"afO" = (/obj/structure/table/woodentable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/weapon/storage/fancy/markers,/turf/simulated/floor/lino,/area/chapel/office)
"afP" = (/turf/simulated/floor/lino,/area/chapel/office)
"afQ" = (/obj/structure/closet/wardrobe/chaplain_black,/obj/machinery/light{dir = 4},/turf/simulated/floor/lino,/area/chapel/office)
"afR" = (/obj/machinery/light/small{dir = 8},/obj/item/weapon/storage/bible,/obj/structure/table/rack,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/random/maintenance/clean,/turf/simulated/floor,/area/maintenance/locker)
@@ -1821,7 +1821,7 @@
"aJa" = (/obj/structure/table/rack,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/weapon/storage/belt/utility,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/effect/decal/cleanable/dirt,/obj/random/maintenance/security,/obj/random/maintenance/security,/turf/simulated/floor/plating,/area/maintenance/security_starboard)
"aJb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/maintenance/security_starboard)
"aJc" = (/turf/simulated/wall,/area/storage/art)
-"aJd" = (/obj/structure/table/standard,/obj/item/weapon/storage/fancy/crayons,/obj/item/weapon/storage/fancy/crayons,/turf/simulated/floor/tiled,/area/storage/art)
+"aJd" = (/obj/structure/table/standard,/obj/item/weapon/storage/fancy/markers,/obj/item/weapon/storage/fancy/markers,/turf/simulated/floor/tiled,/area/storage/art)
"aJe" = (/obj/structure/table/standard,/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/turf/simulated/floor/tiled,/area/storage/art)
"aJf" = (/obj/structure/table/standard,/obj/item/weapon/hand_labeler,/obj/item/weapon/hand_labeler,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/light_switch{pixel_x = 11; pixel_y = 24},/turf/simulated/floor/tiled,/area/storage/art)
"aJg" = (/obj/structure/table/standard,/obj/item/stack/cable_coil/random,/obj/item/stack/cable_coil/random,/obj/machinery/atmospherics/unary/vent_pump/on,/obj/item/device/taperecorder,/obj/item/device/taperecorder,/turf/simulated/floor/tiled,/area/storage/art)
diff --git a/maps/southern_cross/southern_cross-1.dmm b/maps/southern_cross/southern_cross-1.dmm
index da3d562c7e..e45547558a 100644
--- a/maps/southern_cross/southern_cross-1.dmm
+++ b/maps/southern_cross/southern_cross-1.dmm
@@ -320,7 +320,7 @@
"agh" = (/turf/simulated/floor/plating,/area/maintenance/firstdeck/forestarboard)
"agi" = (/obj/structure/closet/crate,/obj/item/weapon/storage/backpack,/obj/item/device/multitool,/obj/item/device/multitool,/obj/item/device/assembly/prox_sensor,/obj/item/device/flashlight,/obj/random/maintenance/engineering,/obj/random/maintenance/engineering,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/turf/simulated/floor/plating,/area/maintenance/firstdeck/forestarboard)
"agj" = (/obj/structure/closet/crate,/obj/item/clothing/mask/gas,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/effect/decal/cleanable/dirt,/obj/random/maintenance/clean,/obj/random/maintenance/engineering,/obj/random/maintenance/clean,/obj/item/toy/xmastree,/turf/simulated/floor/plating,/area/maintenance/firstdeck/forestarboard)
-"agk" = (/obj/structure/table/rack,/obj/item/weapon/flame/lighter/random,/obj/random/maintenance/clean,/obj/random/cigarettes,/obj/random/maintenance/clean,/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/plating,/area/maintenance/firstdeck/forestarboard)
+"agk" = (/obj/structure/table/rack,/obj/item/weapon/flame/lighter/random,/obj/random/maintenance/clean,/obj/random/cigarettes,/obj/random/maintenance/clean,/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/random/cash,/turf/simulated/floor/plating,/area/maintenance/firstdeck/forestarboard)
"agl" = (/obj/effect/floor_decal/rust,/turf/simulated/floor/plating,/area/hangar/three)
"agm" = (/turf/simulated/floor/reinforced,/area/hangar/three)
"agn" = (/obj/effect/floor_decal/borderfloorblack{dir = 8},/obj/effect/floor_decal/industrial/danger{dir = 8},/turf/simulated/floor/tiled/steel,/area/hangar/three)
@@ -1417,7 +1417,7 @@
"aBm" = (/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "crglockdown"; name = "Cargo Lockdown"; opacity = 0},/turf/simulated/floor/plating,/area/maintenance/firstdeck/centralport)
"aBn" = (/obj/item/device/flashlight,/turf/simulated/floor/plating,/area/construction/firstdeck/construction2)
"aBo" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plating,/area/construction/firstdeck/construction2)
-"aBp" = (/obj/structure/table/steel,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor,/area/construction/firstdeck/construction2)
+"aBp" = (/obj/structure/table/steel,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tool/powermaint,/turf/simulated/floor,/area/construction/firstdeck/construction2)
"aBq" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/table/steel,/obj/item/stack/cable_coil/random,/obj/item/stack/cable_coil/random,/turf/simulated/floor/plating,/area/construction/firstdeck/construction2)
"aBr" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "crglockdown"; name = "Cargo Lockdown"; opacity = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/dark,/area/hallway/primary/firstdeck/port)
"aBs" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "crglockdown"; name = "Cargo Lockdown"; opacity = 0},/turf/simulated/floor/tiled/dark,/area/hallway/primary/firstdeck/port)
@@ -1683,7 +1683,7 @@
"aGs" = (/obj/machinery/firealarm{pixel_y = 24},/turf/simulated/floor/tiled/dark,/area/hallway/primary/firstdeck/ascenter)
"aGt" = (/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/ascenter)
"aGu" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/ascenter)
-"aGv" = (/obj/structure/table/rack{dir = 1},/obj/item/weapon/storage/toolbox/emergency,/obj/random/maintenance/medical,/obj/random/maintenance/medical,/turf/simulated/floor/plating,/area/maintenance/firstdeck/aftstarboard)
+"aGv" = (/obj/structure/table/rack{dir = 1},/obj/item/weapon/storage/toolbox/emergency,/obj/random/maintenance/medical,/obj/random/maintenance/medical,/obj/random/cash,/turf/simulated/floor/plating,/area/maintenance/firstdeck/aftstarboard)
"aGw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/monotile,/area/hangar/two)
"aGx" = (/obj/effect/floor_decal/borderfloorblack{dir = 4},/obj/effect/floor_decal/industrial/danger{dir = 4},/turf/simulated/floor/tiled,/area/hangar/two)
"aGy" = (/turf/simulated/floor/reinforced,/area/hangar/two)
@@ -1813,7 +1813,7 @@
"aIS" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 10},/obj/effect/floor_decal/steeldecal/steel_decals4,/turf/simulated/floor/tiled,/area/quartermaster/hallway)
"aIT" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/maintenance{name = "Cargo Maintenance"; req_access = list(50)},/turf/simulated/floor/plating,/area/quartermaster/hallway)
"aIU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/firstdeck/aftport)
-"aIV" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/table/steel,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/firstdeck/aftport)
+"aIV" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/table/steel,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/obj/structure/catwalk,/obj/random/cash,/turf/simulated/floor/plating,/area/maintenance/firstdeck/aftport)
"aIW" = (/obj/machinery/light,/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/apcenter)
"aIX" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled/monotile,/area/hallway/primary/firstdeck/apcenter)
"aIY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/monotile,/area/hallway/primary/firstdeck/apcenter)
@@ -2053,7 +2053,7 @@
"aNy" = (/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 1},/obj/structure/loot_pile/maint/boxfort,/turf/simulated/floor/plating,/area/maintenance/firstdeck/aftport)
"aNz" = (/obj/random/obstruction,/turf/simulated/floor,/area/maintenance/firstdeck/aftport)
"aNA" = (/obj/structure/table/rack,/obj/item/clothing/mask/gas,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/turf/simulated/floor/plating,/area/maintenance/firstdeck/aftport)
-"aNB" = (/obj/effect/decal/cleanable/generic,/obj/structure/table/rack,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/turf/simulated/floor/plating,/area/maintenance/firstdeck/aftport)
+"aNB" = (/obj/effect/decal/cleanable/generic,/obj/structure/table/rack,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/obj/random/cash,/turf/simulated/floor/plating,/area/maintenance/firstdeck/aftport)
"aNC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/firstdeck/aftport)
"aND" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/plating,/area/maintenance/firstdeck/aftport)
"aNE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/firstdeck/aftport)
@@ -3459,7 +3459,7 @@
"boA" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor/plating,/area/maintenance/security_starboard)
"boB" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/simulated/floor/plating,/area/maintenance/security_starboard)
"boC" = (/obj/machinery/atmospherics/valve{dir = 4},/turf/simulated/floor/plating,/area/maintenance/security_starboard)
-"boD" = (/obj/structure/table/rack{dir = 1},/obj/random/maintenance/clean,/obj/random/maintenance/security,/obj/random/maintenance/security,/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 10; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/obj/random/maintenance/security,/turf/simulated/floor,/area/maintenance/security_starboard)
+"boD" = (/obj/structure/table/rack{dir = 1},/obj/random/maintenance/clean,/obj/random/maintenance/security,/obj/random/maintenance/security,/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 10; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/obj/random/maintenance/security,/obj/random/cash,/turf/simulated/floor,/area/maintenance/security_starboard)
"boE" = (/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/maintenance/security_starboard)
"boF" = (/obj/effect/floor_decal/corner/black/full{dir = 8},/obj/machinery/air_sensor{frequency = 1441; id_tag = "co2_sensor"},/turf/simulated/floor/reinforced/carbon_dioxide,/area/engineering/atmos)
"boG" = (/obj/effect/floor_decal/corner/black/full{dir = 1},/obj/machinery/atmospherics/unary/outlet_injector{dir = 4; frequency = 1441; icon_state = "map_injector"; id = "co2_in"; pixel_y = 1; use_power = 1},/turf/simulated/floor/reinforced/carbon_dioxide,/area/engineering/atmos)
@@ -3981,7 +3981,7 @@
"byC" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/purple/border{dir = 4},/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/turf/simulated/floor/tiled,/area/janitor)
"byD" = (/obj/structure/closet/toolcloset,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/yellow/border{dir = 8},/turf/simulated/floor/tiled,/area/storage/auxillary)
"byE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/table/steel,/obj/random/maintenance/engineering,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/item/stack/cable_coil/random,/obj/item/stack/cable_coil/random,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/storage/auxillary)
-"byF" = (/obj/structure/table/steel,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen/blue{pixel_x = -5; pixel_y = -1},/obj/item/weapon/pen/red{pixel_x = -1; pixel_y = 3},/obj/item/weapon/storage/fancy/crayons,/obj/item/weapon/storage/fancy/crayons,/obj/machinery/camera/network/civilian{c_tag = "CIV - Auxiliary Storage"; dir = 8},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 21},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/yellow/border{dir = 4},/turf/simulated/floor/tiled,/area/storage/auxillary)
+"byF" = (/obj/structure/table/steel,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen/blue{pixel_x = -5; pixel_y = -1},/obj/item/weapon/pen/red{pixel_x = -1; pixel_y = 3},/obj/machinery/camera/network/civilian{c_tag = "CIV - Auxiliary Storage"; dir = 8},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 21},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/yellow/border{dir = 4},/obj/item/weapon/storage/fancy/markers,/obj/item/weapon/storage/fancy/markers,/turf/simulated/floor/tiled,/area/storage/auxillary)
"byG" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/obj/machinery/meter,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/research)
"byH" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/maintenance{name = "Firefighting Equipment"; req_access = null; req_one_access = list(12,47)},/turf/simulated/floor/plating,/area/maintenance/research)
"byI" = (/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor/plating,/area/maintenance/research)
@@ -4019,7 +4019,7 @@
"bzo" = (/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor/plating,/area/maintenance/engineering)
"bzp" = (/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/simulated/floor/plating,/area/maintenance/engineering)
"bzq" = (/obj/structure/table/steel,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/maintenance/engineering,/obj/random/maintenance/engineering,/turf/simulated/floor/plating,/area/maintenance/engineering)
-"bzr" = (/obj/structure/table/steel,/obj/random/powercell,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/maintenance/engineering,/obj/random/maintenance/engineering,/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/plating,/area/maintenance/engineering)
+"bzr" = (/obj/structure/table/steel,/obj/random/powercell,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/maintenance/engineering,/obj/random/maintenance/engineering,/obj/machinery/alarm{pixel_y = 22},/obj/random/tool/powermaint,/turf/simulated/floor/plating,/area/maintenance/engineering)
"bzs" = (/obj/structure/closet/toolcloset,/obj/random/tank,/turf/simulated/floor/plating,/area/maintenance/engineering)
"bzt" = (/obj/structure/closet/toolcloset,/obj/item/device/flashlight/maglight,/turf/simulated/floor/plating,/area/maintenance/engineering)
"bzu" = (/turf/simulated/wall/r_wall,/area/hallway/primary/seconddeck/fore)
@@ -4245,7 +4245,7 @@
"bDG" = (/turf/simulated/wall,/area/storage/emergency_storage/seconddeck/fp_emergency)
"bDH" = (/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/airlock{name = "Emergency Storage"},/turf/simulated/floor/plating,/area/storage/emergency_storage/seconddeck/fp_emergency)
"bDI" = (/obj/structure/table/rack{dir = 1},/obj/item/clothing/suit/fire/firefighter,/obj/item/weapon/tank/oxygen,/obj/item/clothing/mask/gas,/obj/item/weapon/extinguisher,/obj/item/clothing/head/hardhat/red,/obj/item/clothing/glasses/meson,/obj/random/maintenance/engineering,/obj/random/maintenance/clean,/turf/simulated/floor/plating,/area/maintenance/engineering)
-"bDJ" = (/obj/item/device/t_scanner,/obj/structure/table/steel,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plating,/area/maintenance/engineering)
+"bDJ" = (/obj/structure/table/steel,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/maintenance/engineering,/obj/random/maintenance/engineering,/obj/random/tool/powermaint,/turf/simulated/floor/plating,/area/maintenance/engineering)
"bDK" = (/obj/structure/closet/wardrobe/grey,/obj/item/weapon/storage/backpack,/obj/item/weapon/storage/backpack,/obj/random/maintenance/security,/obj/random/maintenance/security,/obj/random/maintenance/clean,/turf/simulated/floor/plating,/area/maintenance/engineering)
"bDL" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/engineering)
"bDM" = (/obj/structure/disposalpipe/segment,/obj/machinery/firealarm{dir = 8; pixel_x = -26},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 9},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/fscenter)
@@ -4482,7 +4482,7 @@
"bIj" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/junction{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 5},/turf/simulated/floor/tiled,/area/engineering/hallway/atmos_hallway)
"bIk" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/tiled,/area/engineering/hallway/atmos_hallway)
"bIl" = (/obj/structure/table/reinforced,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/machinery/recharger{pixel_y = 0},/obj/random/tech_supply,/turf/simulated/floor/tiled/dark,/area/engineering/hallway/atmos_hallway)
-"bIm" = (/obj/structure/table/reinforced,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 21},/obj/machinery/cell_charger,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/powercell,/obj/random/powercell,/turf/simulated/floor/tiled/dark,/area/engineering/hallway/atmos_hallway)
+"bIm" = (/obj/item/device/t_scanner,/obj/structure/table/steel,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/random/cash,/turf/simulated/floor/plating,/area/maintenance/engineering)
"bIn" = (/obj/machinery/computer/rcon,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/yellow/border{dir = 8},/turf/simulated/floor/tiled,/area/engineering/foyer)
"bIo" = (/obj/machinery/atmospherics/pipe/simple/hidden/red,/obj/structure/bed/chair/office/dark,/obj/effect/landmark/start{name = "Station Engineer"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/foyer)
"bIp" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/engineering/foyer)
@@ -5548,7 +5548,7 @@
"ccJ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/cable/cyan{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/machinery/light_switch{pixel_x = 11; pixel_y = 24},/turf/simulated/floor/tiled,/area/engineering/engine_airlock)
"ccK" = (/obj/structure/closet/radiation,/obj/item/clothing/glasses/meson,/obj/item/clothing/glasses/meson,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/structure/extinguisher_cabinet{pixel_y = 30},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 22},/obj/machinery/camera/network/engine{c_tag = "ENG - Engine Access"; dir = 8},/turf/simulated/floor/tiled,/area/engineering/engine_airlock)
"ccL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/industrial/warning/corner,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 22},/turf/simulated/floor/tiled,/area/engineering/hallway/engineer_hallway)
-"ccM" = (/obj/structure/table/rack{dir = 1},/obj/random/maintenance/engineering,/obj/random/maintenance/engineering,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor,/area/maintenance/apmaint)
+"ccM" = (/obj/structure/table/reinforced,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 21},/obj/machinery/cell_charger,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/powercell,/obj/random/powercell,/obj/random/tool/powermaint,/turf/simulated/floor/tiled/dark,/area/engineering/hallway/atmos_hallway)
"ccN" = (/turf/simulated/wall/r_wall,/area/engineering/foyer)
"ccO" = (/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/glass{name = "Engineering Access"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/steel_grid,/area/engineering/foyer)
"ccP" = (/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/glass{name = "Engineering Access"},/turf/simulated/floor/tiled/steel_grid,/area/engineering/foyer)
@@ -6526,7 +6526,7 @@
"cvz" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/green/border{dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/apcenter)
"cvA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/monotile,/area/hallway/primary/seconddeck/apcenter)
"cvB" = (/obj/structure/disposalpipe/segment,/obj/machinery/ai_status_display{pixel_x = 32},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/brown/border{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/apcenter)
-"cvC" = (/obj/structure/table/rack,/obj/random/powercell,/obj/random/powercell,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tank,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/machinery/atmospherics/pipe/simple/visible/universal,/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/central)
+"cvC" = (/obj/structure/table/rack{dir = 8; layer = 2.6},/obj/random/maintenance/research,/obj/random/maintenance/research,/obj/random/maintenance/clean,/obj/random/tool/powermaint,/turf/simulated/floor/plating,/area/maintenance/research)
"cvD" = (/obj/machinery/atmospherics/pipe/simple/visible/universal,/obj/effect/decal/cleanable/dirt,/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/central)
"cvE" = (/obj/structure/cable/green,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/machinery/light_switch{pixel_x = -36},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/stairwell)
"cvF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/hologram/holopad,/obj/effect/floor_decal/industrial/outline/grey,/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 8},/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/tiled,/area/hallway/primary/seconddeck/stairwell)
@@ -6870,7 +6870,7 @@
"cCf" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/table/rack{dir = 1},/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/powercell,/turf/simulated/floor/plating,/area/construction/seconddeck/construction1)
"cCg" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/construction/seconddeck/construction1)
"cCh" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/construction/seconddeck/construction1)
-"cCi" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/table/steel,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/maintenance/engineering,/turf/simulated/floor/tiled/steel,/area/construction/seconddeck/construction1)
+"cCi" = (/obj/structure/table/rack{dir = 1},/obj/random/maintenance/engineering,/obj/random/maintenance/engineering,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/cash,/turf/simulated/floor,/area/maintenance/apmaint)
"cCj" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/construction/seconddeck/construction1)
"cCk" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "crglockdown"; name = "Cargo Lockdown"; opacity = 0},/turf/simulated/floor/plating,/area/maintenance/apmaint)
"cCl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "crglockdown"; name = "Cargo Lockdown"; opacity = 0},/turf/simulated/floor/plating,/area/maintenance/apmaint)
@@ -6956,7 +6956,7 @@
"cDN" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/maintenance/disposal)
"cDO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/closet/emcloset,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/maintenance/cargo)
"cDP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor,/area/maintenance/cargo)
-"cDQ" = (/obj/structure/table/rack{dir = 1},/obj/random/maintenance/engineering,/obj/random/maintenance/engineering,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor,/area/maintenance/cargo)
+"cDQ" = (/obj/structure/table/rack,/obj/random/powercell,/obj/random/powercell,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tank,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/machinery/atmospherics/pipe/simple/visible/universal,/obj/structure/catwalk,/obj/random/cash,/turf/simulated/floor/plating,/area/maintenance/central)
"cDR" = (/obj/structure/table/standard,/obj/item/device/t_scanner,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/storage/emergency_storage/seconddeck/port_emergency)
"cDS" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable,/turf/simulated/floor/plating,/area/storage/emergency_storage/seconddeck/port_emergency)
"cDT" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/storage/emergency_storage/seconddeck/port_emergency)
@@ -7449,7 +7449,7 @@
"cNm" = (/obj/machinery/light/small{dir = 1},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/power/sensor{name = "Powernet Sensor - Cargo Subgrid"; name_tag = "Cargo Subgrid"},/obj/machinery/alarm{pixel_y = 22},/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/plating,/area/maintenance/substation/cargo)
"cNn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/effect/floor_decal/industrial/warning,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/cable/green,/obj/structure/railing,/turf/simulated/floor/plating,/area/maintenance/substation/cargo)
"cNo" = (/obj/structure/closet,/obj/random/maintenance/engineering,/obj/random/maintenance/engineering,/obj/random/maintenance/clean,/obj/random/tech_supply,/turf/simulated/floor/plating,/area/maintenance/bar)
-"cNp" = (/obj/structure/table/steel,/obj/item/device/t_scanner,/obj/random/tech_supply,/obj/random/tech_supply,/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plating,/area/maintenance/bar)
+"cNp" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/table/steel,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/maintenance/engineering,/obj/random/tool/powermaint,/turf/simulated/floor/tiled/steel,/area/construction/seconddeck/construction1)
"cNq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/bar)
"cNr" = (/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock{name = "Emergency Storage"},/turf/simulated/floor/plating,/area/storage/emergency_storage/seconddeck/ap_emergency)
"cNs" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/catwalk,/turf/simulated/floor/plating,/area/storage/emergency_storage/seconddeck/ap_emergency)
@@ -7587,7 +7587,7 @@
"cPU" = (/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/bar)
"cPV" = (/obj/structure/bed/chair/wood{dir = 4},/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/bar)
"cPW" = (/obj/structure/table/gamblingtable,/obj/item/clothing/mask/smokable/cigarette/cigar,/obj/machinery/alarm{pixel_y = 22},/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/bar)
-"cPX" = (/obj/structure/table/gamblingtable,/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/bar)
+"cPX" = (/obj/structure/table/rack{dir = 1},/obj/random/maintenance/engineering,/obj/random/maintenance/engineering,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/cash,/turf/simulated/floor,/area/maintenance/cargo)
"cPY" = (/obj/structure/bed/chair/wood{dir = 8},/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/bar)
"cPZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/bar)
"cQa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/bar)
@@ -7600,7 +7600,7 @@
"cQh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/medbay)
"cQi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/medbay)
"cQj" = (/obj/structure/closet/crate,/obj/random/toy,/obj/random/plushie,/obj/random/plushie,/obj/random/action_figure,/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/plating,/area/maintenance/medbay)
-"cQk" = (/obj/structure/table/steel,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor/plating,/area/maintenance/medbay)
+"cQk" = (/obj/structure/table/steel,/obj/item/device/t_scanner,/obj/random/tech_supply,/obj/random/tech_supply,/obj/machinery/alarm{pixel_y = 23},/obj/random/cash,/turf/simulated/floor/plating,/area/maintenance/bar)
"cQl" = (/obj/structure/table/steel,/obj/item/weapon/storage/box/lights/mixed,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor/plating,/area/maintenance/medbay)
"cQm" = (/obj/structure/closet/hydrant{pixel_y = -32},/obj/item/clothing/glasses/meson,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plating,/area/storage/emergency_storage/seconddeck/as_emergency)
"cQn" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/storage/emergency_storage/seconddeck/as_emergency)
@@ -7641,7 +7641,7 @@
"cQW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/maintenance/bar)
"cQX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/maintenance/bar)
"cQY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/bed/chair/wood{dir = 4},/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/bar)
-"cQZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/table/gamblingtable,/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/bar)
+"cQZ" = (/obj/structure/table/gamblingtable,/obj/structure/catwalk,/obj/random/cash,/turf/simulated/floor/plating,/area/maintenance/bar)
"cRa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/table/gamblingtable,/obj/item/weapon/deck/cards,/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/bar)
"cRb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/weapon/stool,/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/bar)
"cRc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/bar)
@@ -7709,7 +7709,7 @@
"cSm" = (/obj/structure/table/rack{dir = 1},/obj/random/maintenance,/obj/random/maintenance,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor/plating,/area/maintenance/cargo)
"cSn" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "crglockdown"; name = "Cargo Lockdown"; opacity = 0},/turf/simulated/floor/plating,/area/maintenance/cargo)
"cSo" = (/obj/random/obstruction,/turf/simulated/floor,/area/maintenance/cargo)
-"cSp" = (/obj/structure/table/rack,/obj/item/weapon/extinguisher,/obj/item/clothing/head/hardhat/red,/obj/item/clothing/mask/gas,/obj/item/device/flashlight,/obj/item/clothing/glasses/meson,/obj/random/maintenance/cargo,/turf/simulated/floor,/area/maintenance/bar)
+"cSp" = (/obj/structure/table/steel,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/plushielarge,/turf/simulated/floor/plating,/area/maintenance/medbay)
"cSq" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/bar)
"cSr" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/bar)
"cSs" = (/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 1},/obj/structure/closet/crate,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/turf/simulated/floor/plating,/area/maintenance/bar)
@@ -8505,7 +8505,7 @@
"dhC" = (/obj/machinery/photocopier,/turf/simulated/floor/lino,/area/chapel/office)
"dhD" = (/obj/structure/table/wooden_reinforced,/obj/structure/flora/pottedplant/thinbush{pixel_y = 10},/turf/simulated/floor/lino,/area/chapel/office)
"dhE" = (/obj/structure/table/wooden_reinforced,/obj/item/weapon/nullrod,/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/machinery/button/windowtint{id = "chapel"; pixel_x = -11; pixel_y = 24},/obj/machinery/light_switch{pixel_x = 11; pixel_y = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/lino,/area/chapel/office)
-"dhF" = (/obj/structure/table/wooden_reinforced,/obj/item/weapon/storage/fancy/crayons,/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/lino,/area/chapel/office)
+"dhF" = (/obj/structure/table/wooden_reinforced,/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/obj/item/weapon/storage/fancy/markers,/turf/simulated/floor/lino,/area/chapel/office)
"dhG" = (/obj/structure/closet/wardrobe/chaplain_black,/turf/simulated/floor/lino,/area/chapel/office)
"dhH" = (/obj/machinery/power/breakerbox/activated{RCon_tag = "Civilian Substation Bypass"},/turf/simulated/floor/plating,/area/maintenance/substation/civilian)
"dhI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/turf/simulated/floor/plating,/area/maintenance/substation/civilian)
@@ -9759,7 +9759,7 @@
"dFI" = (/obj/machinery/atmospherics/binary/pump/on{dir = 1; target_pressure = 200},/obj/structure/largecrate,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor/plating,/area/maintenance/thirddeck/forestarboard)
"dFJ" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/thirddeck/forestarboard)
"dFK" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/thirddeck/foreport)
-"dFL" = (/obj/machinery/atmospherics/pipe/simple/visible/universal,/obj/structure/table/rack{dir = 1},/obj/random/maintenance/engineering,/obj/random/maintenance/engineering,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor/plating,/area/maintenance/thirddeck/foreport)
+"dFL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/table/gamblingtable,/obj/structure/catwalk,/obj/random/plushielarge,/turf/simulated/floor/plating,/area/maintenance/bar)
"dFM" = (/obj/machinery/computer/message_monitor,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/bluegrid,/area/ai/ai_server_room)
"dFN" = (/obj/structure/bed/chair/office/light{dir = 8},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled/techfloor,/area/ai/ai_server_room)
"dFO" = (/obj/machinery/hologram/holopad,/obj/effect/floor_decal/industrial/outline/grey,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/techfloor,/area/ai/ai_server_room)
@@ -10453,7 +10453,7 @@
"dTa" = (/obj/structure/extinguisher_cabinet{pixel_y = -30},/turf/simulated/floor/wood,/area/crew_quarters/heads/sc/sd)
"dTb" = (/obj/structure/lattice,/obj/structure/cable{d1 = 32; d2 = 2; icon_state = "32-2"},/obj/machinery/door/firedoor/border_only,/turf/simulated/open,/area/maintenance/thirddeck/aftstarboard)
"dTc" = (/obj/structure/table/rack,/obj/item/clothing/glasses/sunglasses,/obj/item/clothing/suit/storage/hazardvest,/obj/item/device/radio,/obj/random/maintenance/medical,/obj/random/maintenance/medical,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/structure/railing{dir = 8},/turf/simulated/floor/plating,/area/maintenance/thirddeck/aftstarboard)
-"dTd" = (/obj/structure/table/rack,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor/plating,/area/maintenance/thirddeck/aftstarboard)
+"dTd" = (/obj/structure/table/rack,/obj/item/weapon/extinguisher,/obj/item/clothing/head/hardhat/red,/obj/item/clothing/mask/gas,/obj/item/device/flashlight,/obj/item/clothing/glasses/meson,/obj/random/maintenance/cargo,/obj/random/cash,/turf/simulated/floor,/area/maintenance/bar)
"dTe" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/floor_decal/industrial/warning/corner,/obj/structure/sign/warning/high_voltage{pixel_x = 32; pixel_y = 0},/obj/machinery/camera/network/engineering{c_tag = "ENG - Solar Aft Starboard Access"; dir = 8},/turf/simulated/floor/plating,/area/maintenance/thirddeck/aftstarboard)
"dTf" = (/turf/simulated/wall,/area/maintenance/solars/aftstarboardsolar)
"dTg" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/smes/buildable{charge = 0; RCon_tag = "Solar - Aft Starboard"},/turf/simulated/floor/plating,/area/maintenance/solars/aftstarboardsolar)
@@ -10573,6 +10573,9 @@
"dVq" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1; icon_state = "map"; tag = "icon-manifold-f (NORTH)"},/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/hallway/secondary/entry/D3)
"dVr" = (/obj/effect/wingrille_spawn/reinforced,/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/plating,/area/hallway/secondary/entry/D3)
"dVs" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 1},/turf/simulated/floor/tiled,/area/tcomm/tcomfoyer)
+"dVt" = (/obj/random/plushielarge,/turf/simulated/floor/plating,/area/maintenance/locker)
+"dVu" = (/obj/machinery/atmospherics/pipe/simple/visible/universal,/obj/structure/table/rack{dir = 1},/obj/random/maintenance/engineering,/obj/random/maintenance/engineering,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/cash,/turf/simulated/floor/plating,/area/maintenance/thirddeck/foreport)
+"dVv" = (/obj/structure/table/rack,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/cash,/turf/simulated/floor/plating,/area/maintenance/thirddeck/aftstarboard)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -10938,12 +10941,12 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaabgvbwubwvbpFbpGbwwbwxbwybwzbwAbwBbwCbwBbwDbwBbwEbwFbwGbwHbwIbwJbwKbwLbuvbwMbwNbwObwPbwQbwRbwSbwTbwUbwUbwUbwUbwUbwUbwVbwWbwXbrbbwYbvNbwZbvNbvPbrbbvNbxabrbbvNbxbbrbbvNbxcbrbbxdbxebxfbxgbxhclfclgcnebuWbxkbxlbxmbxnbxobuWbxpbxqbxrbxsbxtbuZbxubxvbvZbxwbxibxxbvgaaaaaaaaaaaaaaabvgbvgbvibvibvibvgbxybxzbxAbxBbxCbxDbxEbxFbxGbvibvgbxHbxHbxIbxIaafaafaafbhgaafaafaafaafbxJbxKbxLbhgbxMbxNbxObxPbxQaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafaafbgvbgvbgvbgvaaabxRbxSbqEbxTbxUbxVbxWbxXbxYbmTbxZbyabwGbybbycbydbyebyfbuvbygbyhbyibyjbuwbvCbykbylbuxbuxbuxbuxbuxbuxbuxbymbynbrbbyobvNbypbyqbvPbrbbyrbysbrbbyrbytbrbbyrbyubrbbyvbywbyxbxgbxhcnfcoUcJZbuWbyybyzbyAbyBbyCbuWbyDbxqbyEbxqbyFbuZbyGbxvbvZbvZbyHbvZbvZbvgbvgbvgbvgbvgbvgbxibyIbyJbyKbyKbyLbyMbyMbyLbyNbyObyPbyQbyRbySbyTbxHbyUbyVbxIbxIaaaaaabhgaaaaaaaaaaafbyWbyXbyYbyZbzabyZbyWbzbbyWaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadJaaaaaaaaaaaaaaaaaaaaaaaaaaabkAbzcbzdbzebkAbkAbzfbzgbzhbzgbzibzjbzkbuvbutbzlbutbuvbuvbuwbuwbzmbuwbuwbuxbznbzobzpbuxbzqbzrbzsbztbuxbymbynbrbbrbbrbbrbbrbbrbbrbbrbbrbbrbbrbbrbbrbbrbbrbbrbbzubzvbzwbzxbxhcOBdcSdfrbuWbzAbzBbzCbzDbzEbuWbzFbzGbzHbxqbzIbuZbzJbzKbzLbzMbzNbzNbzNbzNbzNbzNbzObzNbzNbzNbzNbzPbzQbzRbzSbzTbzUbzVbzWbyObyPbzXbyObzYbzZbAabAbbAcbAdbxIaaaaaabhgaaaaaaaaaaaabyWbAebyZbAfbAgbAhbyWbAibyWaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjaaaaaaaaabAjaaaaaaaaaaaaaaabAjaaaaaaaaabAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaafaaaaaaaaaaaaaaaaaabAkbAkbAkbAkbAkbAkbAkbAkbAkbAlbAmbAnbAobApbAqbArbAsbAtbAtbAubAvbAwbAxbAybAzbAAbABbACbvCbADbAEbAFbuxbzqbymbymbymbAGbAHbAIbwUbAJbAKbALbAMbwUbwUbwUbwUbwUbwUbANbAObwUbAPbAQbuxbARbASbATbxhbxhbxhbxhbuWbAVbAWbAXbAYbAZbuWbBabBbbBcbBdbBebuZbBfbxibBgbBhbBibBjbBkbxibxibBlbBlbBlbBlbBlbBlbBlbBmbBnbBobBpbBqbBrbBrbBrbBrbBsbBsbBsbBsbBsbBtbBubBvbBwbBwbBxbBwbBxbBwbBxbBwbBwbBybBzbBAbBBbBCbyWbBDbyWbyWaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjaaaaaaaaabAjaaaaaaaaaaaaaaabAjaaaaaaaaabAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaafaaaaaaaaaaaaaaaaaabAkbAkbAkbAkbAkbAkbAkbAkbAkbAlbAmbAnbAobApbAqbArbAsbAtbAtbAubAvbAwbAxbAybAzbAAbABbACbvCbADbAEbAFbuxbDJbymbymbymbAGbAHbAIbwUbAJbAKbALbAMbwUbwUbwUbwUbwUbwUbANbAObwUbAPbAQbuxbARbASbATbxhbxhbxhbxhbuWbAVbAWbAXbAYbAZbuWbBabBbbBcbBdbBebuZbBfbxibBgbBhbBibBjbBkbxibxibBlbBlbBlbBlbBlbBlbBlbBmbBnbBobBpbBqbBrbBrbBrbBrbBsbBsbBsbBsbBsbBtbBubBvbBwbBwbBxbBwbBxbBwbBxbBwbBwbBybBzbBAbBBbBCbyWbBDbyWbyWaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjaaaaaaaaabAjbAjbAjbAjbAjbAjbAjaaaaaaaaabAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaafaafaaaaaabBEbBFbBGbBHbAkbBIbBJbBKbBLbBMbBMbBNbAkbBObBPbBQbBRbBSbBTbBUbBVbBUbBWbBXbBYbBZbCabCbbCcbCdbCebCfbvCbCgbzobChbuxbCibCjbymbymbuxbCkbClbymbCmbCnbuxbuxbCobuxbuxbCpbymbymbAQbCqbymbCrbuxbuxbCsbCtbCubvZbvZbCvbyJbuWbCwbCxbuWbuWbuWbuWbuZbuZbCybuZbuZbuZbBfbxibCzbCAbBibwnbCBbCCbCDbBlbCEbCFbCGbCHbCIbBlbCJbCJbCKbCJbCJbBrbCLbCMbCNbBsbCObBsbCPbBsbCQbCRbCSbBwbCTbCUbCVbCVbCWbCXbCYbBwbCZbDabDbbDcbDdbDebDfbDgbyWaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaabAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaagaadaadaaaaabaaaaaaaaabBEbDhbDhbDibAkbDjbDjbDjbDkbBMbDlbDmbAkbDnbDobDpbDqbDrbDsbDtbCfbDubDvbDwbDxbDubDybDybDzbDAbDBbDybuxbDCbDDbDEbuxbuxbuxbDFbymbuxbCrbDGbDGbDHbDGbDGbDIbymbDJbuxbDKbymbDLbuxbvFbymbCrbymbuxbDMbDNbDObvZbxibxibzzbDPbxibDQbAUbAUbAUbAUbBgbDRbDSbDTbDUbDVbDWbDXbDYbvZbDZbDZbDZbDZbEabBlbEbbEcbEdbEebEfbEgbEhbEibEjbEkbElbBrbEmbEnbEobBsbEpbBsbEqbBsbBsbErbEsbEtbEubEvbCVbEwbExbEybEzbBwbEAbEAbEAbEBbEAbEAbEAbEAbEAbEAaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaabAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaagaadaadaaaaabaaaaaaaaabBEbDhbDhbDibAkbDjbDjbDjbDkbBMbDlbDmbAkbDnbDobDpbDqbDrbDsbDtbCfbDubDvbDwbDxbDubDybDybDzbDAbDBbDybuxbDCbDDbDEbuxbuxbuxbDFbymbuxbCrbDGbDGbDHbDGbDGbDIbymbImbuxbDKbymbDLbuxbvFbymbCrbymbuxbDMbDNbDObvZbxibxibzzbDPbxibDQbAUbAUbAUbAUbBgbDRbDSbDTbDUbDVbDWbDXbDYbvZbDZbDZbDZbDZbEabBlbEbbEcbEdbEebEfbEgbEhbEibEjbEkbElbBrbEmbEnbEobBsbEpbBsbEqbBsbBsbErbEsbEtbEubEvbCVbEwbExbEybEzbBwbEAbEAbEAbEBbEAbEAbEAbEAbEAbEAaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaabAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaagaadaadaadaagaafaaaaafaaaaaaaaaaaaaaaaaaaaabBEbECbEDbEEbAkbEFbEGbEGbEHbEGbEIbEJbAkbEKbELbEMbENbEObEPbEQbERbESbETbEUbEVbEWbEXbEYbEZbFabFbbFcbuxbFdbFebFfbFgbFhbuxbvGbvFbuxbFibDGbFjbFkbFlbDGbFmbFnbChbuxbzpbymbFobuxbvGbymbFpbFqbFrbFsbFtbFubFvbDTbFwbDTbFxbDTbFybDTbDTbDTbDTbFzbFAbFBbFBbFBbFBbFBbFBbFCbFDbDZbFEbFFbFGbEabFHbFIbFJbFKbFLbFMbEgbFNbFObFPbEjbFQbBrbFRbFSbFTbFUbFVbFWbFXbFYbBsbFZbGabGbbGcbGdbGebGdbGfbGgbGhbGibGjbGkbGlbGmbGnbGobGpbGqbGrbGsaaaaaaaaaabcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaafaaaaaaaaaaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaabBEbGtbGubGvbAkbGwbEGbEGbGxbGybGzbGAbGBbGCbGDbGEbGFbEObGGbGHbERbGIbGJbGKbGLbGMbEXbGNbGObGPbGQbGRbuxbGSbGTbGUbGVbFhbuxbAQbAQbuxbGWbDGbGXbFkbGYbDGbuxbuxbuxbuxbGZbGZbGZbuxbuxbuxbuxbuxbHabHbbHcbHdbHabvZbvZbvZbvZbvZbvibvibvibvZbvZbvZbvZbFBbHebHfbHgbHhbFBbHibHjbHkbHlbHmbHnbEabHobHpbEcbHqbHrbHsbEgbHtbHubHvbHwbHxbHybHzbHAbHBbBsbHCbHDbHEbHFbBsbHGbHHbBwbHIbHJbHKbHJbHKbHJbHLbEtbHMbHNbHObHPbHQbHRbHSbHTbHUbHVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaafaaaaaaaaaaaaaafaaabHWbHWbHWbHWbHWbHWbHWbHXbHXbBEbHYbHZbDibAkbIabIabIbbIcbIdbIebIfbAkbIgbIhbIibIjbIkbIlbImbCfbInbIobIpbIqbIrbDybIsbItbIubIvbIwbIxbIxbIybIxbIxbIxbIxbuxbuxbuxbIzbDGbIAbIBbICbDGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIDbIEbIFbIGbIHbIIbIDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFBbIJbIKbILbILbIMbINbBqbDZbIObIPbIQbEabIRbISbITbIUbIVbIWbEgbEjbHubIXbIYbIZbBrbJabJbbJcbBsbJdbJebJfbJgbBsbJhbJibBwbBwbJjbJkbJlbJjbJmbJjbBwbJnbJobJpbJqbJrbJsbJtbJqbJubJvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaafaaaaaaaaaaaaaafaaabHWbHWbHWbHWbHWbHWbHWbHXbHXbBEbHYbHZbDibAkbIabIabIbbIcbIdbIebIfbAkbIgbIhbIibIjbIkbIlccMbCfbInbIobIpbIqbIrbDybIsbItbIubIvbIwbIxbIxbIybIxbIxbIxbIxbuxbuxbuxbIzbDGbIAbIBbICbDGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIDbIEbIFbIGbIHbIIbIDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFBbIJbIKbILbILbIMbINbBqbDZbIObIPbIQbEabIRbISbITbIUbIVbIWbEgbEjbHubIXbIYbIZbBrbJabJbbJcbBsbJdbJebJfbJgbBsbJhbJibBwbBwbJjbJkbJlbJjbJmbJjbBwbJnbJobJpbJqbJrbJsbJtbJqbJubJvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaaaaaaafbHWbHWbJwbJxbJybJzbJAbHWbJBbJCbJDbJEbJFbJGbAkbIabIabJHbJIbJJbJKbJLbAkbJMbJNbJObJPbCfbERbJQbCfbJRbJSbJTbJUbJVbDybGNbJWbJXbJYbJZbIxbKabKbbKcbKdbKebIxbKfbKgbuxbCrbDGbKhbKibDGbDGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabIDbKjbKkbHcbKlbKmbIDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFBbFBbKnbKobKpbFBbKqbvZbEabDZbKrbDZbEabBlbEgbKsbKtbKsbKubBlbKvbxIbKwbxIbKxbBrbBrbBrbBrbKybBsbKzbBsbBsbBsbHGbKAbyVbBwbBwbBwbBwbBwbBwbBwbBwbKBbKCbKDbKEbKFbKBbKGbKBbKHbKIbKJbKKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaafaafaafbKLbKMbKMbKMbKMbKNbKObKPbKQbKRbKSbKTbKUbHWbKVbKWbKXbKYbKZbBEbAkbAkbAkbAkbAkbAkbAkbAkbAkbLabLbbLcbLdbLebLfbLgbLhbLibLjbLkbLlbLmbEXbLnbLobLpbLqbLrbLsbLtbLubLvbLwbLxbIxbLybLzbLAbCrbDGbDGbDGbDGaaaaaaaaaaaaaaaaaabLBbLBbLCbLCbLCbLBbLBbLDbLEbHcbLFbLGbLHbLHbIDbIDbIDbLHbLHaaaaaaaaaaaaaaaaaabFBbFBbFBbFBbFBbLIbBqbLJbLKbLLbLMbLNbLObLPbLQbLRbLSbLTbLUbLVbLWbLXbLYbLZbMabMbbMcbMbbMdbMebMfbMgbMhbMibMjbMkbMlbMmbMmbMnbMobMpbMmbMqbMrbJvbMsbMtbMubMvbMwbMxbMybMzbMAbMAbMBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaabaaaaadaadaadaadaadaadaadaagaadaaaaaaaaaaaabMCbMDbMEbKMbMDbKNbMFbMGbMHbMIbMJbMKbMLbMMbMNbMObMPbMQbBEbMRbMSbMTbMUbMVbMWbMXbMYbMZbNabNbbNcbNdbNebNfbNgbNhbNibNjbNkbLkbLlbLmbEXbNlbJWbNmbNnbNobIxbNpbNqbNrbNsbNtbIxbNubNvbuxbCrbymbuxaaaaaaaaaaabaaaaaabLCbLCbLBbNwbNxbNybNzbNAbNBbNCbNDbHcbNEbNFbNGbNHbNIbNJbNKbNLbLHbIDbIDaaaaaaaabaaaaaaaaabvZbNMbDXbNNbBqbCKbNObNPbNQbNRbNSbNTbNUbNVbNWbNXbNYbNXbNZbOabObbNXbOabNXbOcbOdbOebNXbOfbOgbNWbNYbOabOhbNZbNXbOibOjbOkbOhbOlbOmbOnbOobOpbOqbOrbOsbOtbOubOvbOwbOxbOxdgpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -10952,10 +10955,10 @@ aaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbA
aaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaadaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaabHWbRKbRLbRMbRNbRObRPbHWbRQbRRbQbbRSbDibRTbRUbQgbQgbRVbRWbRXbRYbRZbSabSbbQkbScbSdbSebSfbSgbShbSibSjbSkbEVbSlbSmbSnbSobSpbSqbSrbSsbStbStbSubStbStbStbStbuxbuxbCrbSvbuxaaaaaaaaabLCbLCbQHbQIbSwbSwbSxbSybSzbSAbSAbSBbSCbSDbSEbSFbSGbSHbSIbSJbSJbSKbSLbSMbSMbQXbQYbIDbIDaaaaaaaaabvZbSNbSObSPbPvbSQbSRbSSbSTbSUbSVbSWbSXbSYbSZbTabTbbTcbTdbTdbTdbTebTfbTgbThbTibTjbPCbTkbTlbTmbTnbTobTobTobTobPFbTpbTqbTrbPIbTsbTtbKBbTubTvbTwbTxbTybTzbTAbTBbJvaaaaaaaabaaaaaaaaaabcaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaafaaaaaaaaabKLbTCbKLbTCbKLbTCbKLbTCbKLbTCbKLbTCaafaafbTDbTEbTDbTDbTDbTDbTDbTEbTFbTGbTDbBEbTHbQbbTIbDibTJbTKbQgbTLbTMbTNbTObTPbTQbTRbTSbQkbTTbTUbTVbTWbTXbTYbTZbSjbUabEVbUbbUcbUdbUebUfbUgbUhbUibStbUjbUkbUlbUlbUmbStbUnbymbCrbUobGZaaaaaaaaabLCbUpbQIbSwbUqbUrbUsbUtbUubUvbUwbUxbUybUzbUAbUBbQPbUCbNEbUDbUEbUFbUGbUHbUIbSMbQXbUJbIDaaaaaaaaabvibUKbxibULbPvbUMbUNbUObUPbUQbURbUSbUTbUUbUVbRjbUWbUXbUYbUZbUYbVabTibVbbVcbVdbVebPCbVfbVgbVhbVibVjbVkbTobVlbPFbVmbVnbVobPIbVpbVqbKBbVrbVsbVtbVtbVtbVsbVsbVubHVaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaadaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaabVvbVwbVxbVwbVxbVwbVxbVwbVxbVwbVxbVwbVybVzbVAbVBbVCbVDbVBbVEbVBbVFbVGbVHbVIbBEbVJbVKbVLbVMbVNbVObQgbVPbTMbVQbVRbVSbVTbTRbVUbQkbVVbVWbVXbVYbVZbWabNjbWbbWcbWdbWebWfbWgbWhbWibWjbUhbWkbWlbWmbWnbWobWpbWqbStbWrbymbCrbWsbGZaaaaaabLBbLBbWtbQJbSwbWubWvbWwbWxbWybWxbWxbWzbWAbKjbWBbWCbWDbWDbWEbWFbWGbWDbWDbWHbUHbSMbNEbWIbLHbLHaaaaaabvibUKbxibWJbPvbWKbWLbWMbUPbWNbPvbPvbxHbWObxHbPCbPCbWPbWQbWRbWSbVabWTbWUbWVbWWbWXbPCbWYbWZbXabXbbVjbXcbTobXdbPFbXebXfbXgbPIbXhbBvbKBbVrbXibXjbXkbXlbXmbXnbVubGsaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaabMCbKMbKMbKMbKMbKMbKMbKMbKMbKMbKMbKMbVybXobXpbXqbXrbXsbXtbXrbXsbXubXvbXwbXxbBEbXybXzbKZbDibXAbXBbQgbXCbTMbTObXDbXEbTObTRbXFbQkbXGbXHbXIbXJbXKbXLbXMbXNbXObGLbXPbUcbQwbXQbXRbXRbXSbQwbStbXTbXUbXVbXWbXXbStbWrbymbCrbDLbGZaaaaaabLBbXYbXZbYabYbbYcbWwbWwbYdbYebYfbWwbYgbWAbWAbYhbWDbWDbYibYjbYkbYlbYmbWDbWDbYnbYobYpbYqbYrbLHaaaaaabvibUKbYsbYsbPvbYtbYubYubYvbYwbUSbYxbYybYzbYAbYBbRjbYCbYDbYDbYDbYEbYFbYFbYGbYHbYFbYIbYJbYKbYLbYMbTobTobTobYNbPFbYObYPbYQbPIbRDbREbKBbYRbKBbKBbKBbKBbKBbKBbKBbKBbYSbYSaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaabMCbKMbKMbKMbKMbKMbKMbKMbKMbKMbKMbKMbVybXobXpbXqbXrbXsbXtbXrbXsbXubXvbXwbXxbBEbXybXzbKZbDibXAbXBbQgbXCbTMbTObXDbXEbTObTRbXFbQkbXGbXHbXIbXJbXKbXLbXMbXNbXObGLbXPbUcbQwbXQbXRbXRbXSbQwbStbXTbXUbXVbXWbXXbStbWrbymbCrbDLbGZaaaaaabLBbXYbXZbYabYbbYcbWwbWwbYdbYebYfbWwbYgbWAbWAbYhbWDbWDbYibYjbYkbYlbYmbWDbWDbYnbYobYpbYqbYrbLHaaaaaabvibUKbYscvCbPvbYtbYubYubYvbYwbUSbYxbYybYzbYAbYBbRjbYCbYDbYDbYDbYEbYFbYFbYGbYHbYFbYIbYJbYKbYLbYMbTobTobTobYNbPFbYObYPbYQbPIbRDbREbKBbYRbKBbKBbKBbKBbKBbKBbKBbKBbYSbYSaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaabKLbTCbKLbTCbKLbTCbKLbTCbKLbTCbKLbTCaadbYTbYUbYVbYWbYXbYVbYWbYXbXubYYbYZbZabBEbZbbZcbZbbDibZdbZebQgbZfbZgbZhbZibXEbZhbZjbZkbQkbZlbZmbZnbZobZpbZqbSibOXbEVbEVbSlbZrbZsbQwbQwbQwbQwbZtbStbZubStbZvbStbStbStbuxbymbCrbZwbuxaaaaaabLCbZxbZybZzbZAbZBbZCbZDbZEbZFbZGbWwbZHbZHbZIbZJbWDbZKbZLbZMbZMbZNbZObZPbWDbZQbZRbZSbYqbZTbIDaaaaaabvZbUKbAUbvZbPvbZUbZVbZWbZWbZXbZYbZZcaacabcaccadcaecafcagcagcagcahcaicajcakcalcambYIcancaocapcaqbPFcarcascatbPFcaucavcawbPIbRDbREcaxcaycazcaAcaBcaCcaDcaEcaFcaGcaHcaIcaIcaHcaHcaHcaHcaHaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaabVvbVwbVxbVwbVxbVwbVxbVwbVxbVwbVxbVwbVycaJbTDcaKbYWbYXbYVbYWbYXbXucaLcaMcaMcaMcaMcaMcaMcaMcaNcaObQgcaPcaQcaRcaScaTcaUcaVcaWbQkbQkcaXbQkcaYcaZbQkcbacbbbEVcbccbdbQucbecbfcbgcbhcbicbjbStcbkbStcblbStcbmcbncbobymbCrbymbuxaaaaaabLCcbpcbqcbrcbscbtcbucbvcbwcbxcbycbzcbAcbBcbCcbDbWDcbEcbFcbGcbHcbIbZOcbJcbKcbLcbMcbNcbOcbPbIDaaaaaabvZbUKcbQcbRbPvbPvcbScbTcbUcbVbUScbWcbXcbYcbZccaccbcccccdcceccfccgcaicchcciccjcckbYIbPFcclbPFbPFbPFbPFbPFbPFbPFbPIbPIbPIbPIccmccncaxccoccpccqccrccscctcaCcaFcaFcaHccuccvccwcaHccxccycaHcaHaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafbVvcczccAcczccAcczccAcczccAcczccAcczbVyccBbTDccCbYWccDccEbYWccDbXuccFcaMccGccHccIccJccKcaMbXAccLcaWcaWcaWcaWcaWcaWcaWcaWcaWccMbQkbQkbQkbQkbQkbQkccNccObDxccPccNccQccQccQccQccQccQccQccRccRccRccRbStccSccTbuxccUccVccWbuxaaaaaabLCccXccYccZcdacdbbWwbWwbWwbWwbWwbWwcdccddcddcdebWDbWDbWDbWDbWDcdfbZOcdgbWDcdhcbMcdicbOcdjbIDaaaaaabvZcdkbxibxicdlbPvbPvbPvbPvbPvbPvcdmcdncdocdncdmbPCbPCbPCbPCbPCbPCbYIcdpcdqcdqcdrbYIcdscdscdscdtcducdvcdwcdxcdycdzcdAbxHcdBcdCcdDcdEcdFcdGcdHccrccscdIcaCcdJcaFcdKcdLcdMcdNcaIcdOcdMcdPcaHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafbVvcczccAcczccAcczccAcczccAcczccAcczbVyccBbTDccCbYWccDccEbYWccDbXuccFcaMccGccHccIccJccKcaMbXAccLcaWcaWcaWcaWcaWcaWcaWcaWcaWcCibQkbQkbQkbQkbQkbQkccNccObDxccPccNccQccQccQccQccQccQccQccRccRccRccRbStccSccTbuxccUccVccWbuxaaaaaabLCccXccYccZcdacdbbWwbWwbWwbWwbWwbWwcdccddcddcdebWDbWDbWDbWDbWDcdfbZOcdgbWDcdhcbMcdicbOcdjbIDaaaaaabvZcdkbxibxicdlbPvbPvbPvbPvbPvbPvcdmcdncdocdncdmbPCbPCbPCbPCbPCbPCbYIcdpcdqcdqcdrbYIcdscdscdscdtcducdvcdwcdxcdycdzcdAbxHcdBcdCcdDcdEcdFcdGcdHccrccscdIcaCcdJcaFcdKcdLcdMcdNcaIcdOcdMcdPcaHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAjbAjbAjbAjbAjbAjbAjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaabMCcdQbMCcdQbMCcdQbMCcdQbMCcdQbMCcdQaafaafbTDcdRcdScdTcdUcdVcdTcdWcdXcdYcdZceacebceccedceebXAcefcegcehceicejcekcekcekcekcekcekcekcekcekcelcemcenceocepceqceqcerbuxcescescetbDLceubymbAQbAQbvFbvGbuxcevbuxbuxbymbCrcewbuxaaaaaabLBcexccYbQJceycezceAceBceCceDceEceFceGceHceHceIceHceHceHceJceKceLceMceNbWDbNEceObNEcbObNGbLHaaaaaabvZcePceQceQceQceRceSbxiceTceUbvZceVceWceXceWceYceZcfacfbcfccfdcfebYIbYIcffcfgbYIbYIcfhcficficfjcfkcflcfmcfmcfmcdvcfnbxHcfocfpbOncfqcfrcfscftccrccsccscdIcdIcaFcaHcfucfvcfwcfxcfycfzcfAcfBcfCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaaaaabTDcfDbXrcfEcfFcfGcfHbXucfIcaMcaMcaMcaMcfJcfKcfLcfMcfNcfOcfOcfPcfQcfRcfRcfRcfRcfRcfRcfRcencencencfScfTcfUcfVcfWcfXcfYcfZcgacgbcgacgacgacgacgacgccgccgccgccgdcgccgccgccgecgfbuxbLCbLCbLBcggccYcghcgicgjcgkcglcglcgmceEcgnbWAbWAbWAbWAbWAbWAbWAcgnbWEcgocgpcgqbWDcgrcgscgtcgucgvbLHcgwcgwbvZbUKbxibAUbCCbCDcgxbxicgybxicgzcgAcgBcgCcgDcgAcgEcfacgFcgGcgHcgIcgJcgKcgLcgMcgNcgNcgOcdtcdtcdtcdtcdtcdtcdtcfmcdvcgPbxHcgQcgRcgScaxcgTcgUcgVccrccscdIcgWcgXcaFcaHcgYcgZchacaHcaIchbcaIcaHcaHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaabTEbTDchcchcbTDchdchechfbXuchgchhchichjchkchlchmchnchochpchqchrchschtcfRchuchuchuchuchuchvchwchxcenchychzchAchBchCchDchEbuxbuxbuxbuxbuxbuxbuxbuxbuxbuxbuxbuxbuxbuxbuxbuxbuxchFchGchHchIbLBchJchKchLchMchNcgkcgkchOchPceEchQbWAchRchRchRchRchRbWAchSbWDchTchUbWDbWDchVchWchVchXchYchZciacibciccidbvgbvZbvZbvZbvZbvZbvZbvZbvZciecifcigcihcieceZceZceZciiceZceZceZceZcijcikcgNcilcimcinciociociociociocdtcdvcdvcaGbxHcipbxHbxHcaxciqcaxcaxccrcaFcaGcaHcaHcaHcaHcircgZciscitciucivciwcixcaHcaHaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -10966,22 +10969,22 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaaaaabTDcpKcpLcpMcpNchecmDbXucpOcpPcpPcpQcpPcpRcpScpPcoEcmLcmLcpTcpUcmLcfRcfRcfRcfRcfRcfRcfRcencencencpVcpWcpXcpYcpZcqacpXcqbcqccqdcqecqfcqgcqhcqicqjcqkcqlcoQdwTdwWdwTdwUcqncqocoVbLCbLCcqpcqqcqrcqscqtcqubWzcqvcqwcqxcqxcqxcqycqycqzcqAcqBcqpcpdcqCcqDcqEcqFcqGcpdcqHcqIcjCcqJcqKchZcgwcgwcpkcqLcqMcqNcqOcqPcqPcqQcqRcqScqTcqUcqVcqWcqXcqYcqZcracracrbcrccrdcrecrfcrgcrhcrhcrhcricdtcdtcdtcdtcdtcdtcdtcfmcdvcrjcpwcrkcrlcrmcrncrocrpcrqcrrcrscrtcrucrvcrvcaHcrwcgZcrxcaHcaIcrycaIcaHcaHaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaabKLbTCbKLbTCbKLbTCbKLbTCbKLbTCbKLbTCaafaafbTDcrzbXrcrAcrBcrCcrDcrEcrFcrGcrHcrIcrJcrKcrLcpPcrMcrNcrNcrOcrPcrQcrRcrRcrRcrScrTcrUcrVcpVcpVcrWcpVcencrXcrXcrXcrXcrXcoPcrYcrZcsacsbcsccoQcsdcsecsfcsgcoQdyidypdybdwUcshcqocoVaaaaaacqpcsicqrcsjcskcslbWzcsmcsncqxcsocspcsqcsrcsjcsjcsjcsscstcsucsvcswcsxcsycpdcszcsAcjDcsBcsCchZaaaaaacpkcsDcsEcsFcpkcsGcsHcpncsIcsJcsKcsLcsMcsNcsOcsPcsQcsRcsScpncsTcsUcsVcsVcsWcrhcdvcdvcsXcfmcfmcfmcfmcfmcfmcfmcfmcdvcsYcpwcsZctacrmctbctcctdctectfctgcthcticrvcrvctjctkctlctmcaIctnctoctpcaHaaaaaaaaaaaaaadabcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafbVvbVwbVxbVwbVxbVwbVxbVwbVxbVwbVxbVwbVybVzbTDctqctrctscttctrctuctvctwcpPctxctyctzctActBcpPctCctDctDctEctFctDctDctGctGctHctHctIctJctIctKctIctIctLctLctMctNctMctLctLctOctOctOctPctOctOctQctRctScoQcoQdUPdUQdBMdwUctTcqocoVaaaaaactUctVctWctXcskctYbWzctZcuacubcuccudcuecufcugcuhcsjcuicujcukculcumcuncuocpdcupcsAcuqcurcuscgwaaaaaacpkcutcuucuucuucuvcuwcuucuucuxcuxcuxcuycuzcuAcuzcuzcuzcuzcuBcuCcuDcuEcuFcuCcuGcuGcuGcuGcuGcuGcuGcuHcuHcuHcuHcuIcuIcuIcuIcuJcuKcuLctbcuMcrqcrqcrqcrqcrqcrvcrvcrvcaHcuNcorcuOcaIcdOcdMcdPcaHaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaabVvcczccAcczccAcczccAcczccAcczccAcczbVycaJbTDcaKcuPcuQcuRcuScuQcuTcuUcpPcpPcpPcpPcpPcpPcpPcuVctDcuWcuXcuYcuZctDcvacvbcvccvcctIcvdctIcvecvfcvgcvhcvicvjcvkcvjcvlcvmcvncvocvpcvqcvrctOcvscvtcvucvvcoQdUSdUTdURdwUcvwcqocoVaaaaaactUcvxcvycvzcvAcvBbWzcvCcvDcqxcvEcvFcvGcvHcvIcvJcsjcvKcvLcvMcvNcumcvOcvPcvQcvRcsAcvScvTcvUcgwaaaaaacpkcsDcuucvVcvWcvXcvYcvZcwacwbcwccwdcuycwecwfcwgcwhcwicwjcwkcwlcwmcwncwocwpcwqcwrcwscwtcwucwvcwwcwxcwycwzcwAcwBcwCcwDcwEcwFcwGcrmcwHcwIcwJcrqcrqcrqcwKcwLcwIcrvcaHcwMcwNcwOcaHccxcwPcaHcaHaafaafaafaadaXGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaabVvcczccAcczccAcczccAcczccAcczccAcczbVycaJbTDcaKcuPcuQcuRcuScuQcuTcuUcpPcpPcpPcpPcpPcpPcpPcuVctDcuWcuXcuYcuZctDcvacvbcvccvcctIcvdctIcvecvfcvgcvhcvicvjcvkcvjcvlcvmcvncvocvpcvqcvrctOcvscvtcvucvvcoQdUSdUTdURdwUcvwcqocoVaaaaaactUcvxcvycvzcvAcvBbWzcDQcvDcqxcvEcvFcvGcvHcvIcvJcsjcvKcvLcvMcvNcumcvOcvPcvQcvRcsAcvScvTcvUcgwaaaaaacpkcsDcuucvVcvWcvXcvYcvZcwacwbcwccwdcuycwecwfcwgcwhcwicwjcwkcwlcwmcwncwocwpcwqcwrcwscwtcwucwvcwwcwxcwycwzcwAcwBcwCcwDcwEcwFcwGcrmcwHcwIcwJcrqcrqcrqcwKcwLcwIcrvcaHcwMcwNcwOcaHccxcwPcaHcaHaafaafaafaadaXGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaabMCcdQbMCcdQbMCcdQbMCcdQbMCcdQbMCcdQaadbYTcwQcwRcwScwTcwUcwScwTcwVcwWcwXcwYbTDcrMcrNcrNcrNcwZctDcxacxbcxccxdctDcvacxectHctHctIcxfcxgcxhcxicxjcxkcxlcxlcxlcxmcxncxocxpcxqcxrcxscxtcxucxvcxwcxxcvvcoQdwUdwUdwUdwUcoVcqocoVaaaaaactUcxycqrcxzcxAcxBbWzcxCcxDcqxcxEcxFcxGcsrcxHcxIcxJcvKcxKcxLcxMcxNcxOcxPcpdcvRcxQcxRcxScxTcgwaaaaaacpkcsDcuucxUcxVcxWcxXcxYcxZcyacybcyccuzcydcyecyfcygcyhcyicyjcykcylcymcyncyocypcyqcyrcyscyrcytcwwcyucyvcywcwAcyxcyycyzcwEcyAcyBcrmcrmcrmcrmcrmcrmcrmcrmcrmcpzcpzcaHcyCcaIcaHcaHcaHcaHcaHaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaadaaaaaaaaabKLbKMbKMbKMbKMbKMbKMbKMcyDbKMbKMbKMbVybXocyEcyFcyGcyHcyIcyJcyHcyKcyLcyLcyMbTDcyNcmLcyOcyOcyPcyOcyOcyQcyRcySctDctDcyTcyUcyVctIcyWcyXcyYcyZczaczbcxlcxlczcczdczeczfctOczgczhcziczjctOcoQcoQczkcoQcoQcqmcqmcqmcqmcoVcqoczlaaaaaacqpcsicqrczmcznczobWAbWAczpcqxcxEczqczrcsrcsjcvAcsjczscpdcztczuczvczwcpdcpdczxczyczzczAczBchZaaaaaaczCcsDcuuczDczEcxWczFczGcxZczHczIczJcuzczKcyeczLczMczNczOczPczQczRczSczTczUczVczWczXczYczXczZcAacAbcAccAdcwAcAecAfcAgcwEcAhcAicAjcAkcAlcAmcAncAocApcAqcArcAsbYScAtcAuaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaabVvcczccAcczccAcczccAcczccAcczccAcczbVyccBbTDbTDcAvcAwcAxbVEcAxcAycyLcyLcAzbTDcyNcmLcyOcAAcABcACcyOcuXcADcAEcAFctDcAGcAHcAIctIcAJcAKcALcAMcANcAOcAPcAQcAQcARczecAScATcAUcAVcAWcAXctOcAYcAZcBacBbcBccqmcBdcqmcBecoVcqoczlaaaaaacqpcqpcBfcsjcuhcBgcBhbWAcBicqxcqxcqxcqxcBjcBkcBlcBkcBmcpdcpdcBncBocpdcpdcBpcBqcBrcjDcBschZchZaaaaaaczCcsDcuucuucBtcBucBvcBwcxZcBxcBycBzcuzcBAcBBcBCcBCcBDcBEcBFcBGcBHcBIcwocBJcypcBKcBLcBMcBNcBOcuGcBPcBQcBRcwAcBScBTcBUcwEcBVcBWcBXcBYcBYcAmcBZcCacCbcAmcAmcAsaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaagaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaabMCcdQbMCcdQbMCcdQbMCcdQbMCcdQbMCcdQaafaafaafbTEbTDbTDbTDbTDbTDbTDbTDbTDbTDbTDcCccencyOcCdcABcCecyOcCfcCgcChcCicCjcCkcClcCmctIcCncCocCpcCqctIcCrcCscCtcCtcCucCvcCwcxpcCxcCycxrcCzctOcAYcCAcCBcCCcBbcBbcqmcBdcqmcoVcqoczlaaaaaaaaactUcCDcCEcuhcCFcCGcCHcCIcCJcCKcCKcCLcCMcCNcskcCOcCMcCPcnDcCQcCRcCScCTcCUcCVcBrcCWcCXcgwaaaaaaaaaczCcsDcCYcuucCZcDacDbcDccxZcDdcDecDdcuzcDfcyecDgcDhcDicDjcDkcDlcwmcDmcwocDncypcDoczXcDpczXcDqcuGcDrcDscDtcwAcDucDvcDwcwEcDxcDycDzcDAcDBcDCcDDcDEcApcDFcDGcAsaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaacDHcDIcDJcDKcDLcDLcDMcDNcDOcDPcDQcyOcDRcDScDTcyOctDctDctDctDcDUcDVcDWcDUctIcDXctIcDYcDZctIcEacEbcEccEccEdcEecEactOcEfcEgcEhcEictOcEjcEjcEjcEkcEjcBbcBbcBbcqmcoVcqocoVaaaaaaaaactUctUcElcCEcuhcuhcEmcEncEocEocEpcEqcErcEscEtcEucErcEvcEwcExcExcEycEzcBrcBrcCWcEAcgwcgwaaaaaaaaacpkcsDcEBcuucuucECcEDcEEcxZcEFcEGcEHcuzcEIcEJcEKcELcEMcENcEOcEPcEQcERcEScETcuGcEUcEVcEWcEXcEYcuGcEZcFacFbcwAcFccFdcFecwEcFfcFgcFhcFicFjcAmcFkcFlcFmcAscAscAsaafaafaafabcaafaaaaaaaagaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaabMCcdQbMCcdQbMCcdQbMCcdQbMCcdQbMCcdQaafaafaafbTEbTDbTDbTDbTDbTDbTDbTDbTDbTDbTDcCccencyOcCdcABcCecyOcCfcCgcChcNpcCjcCkcClcCmctIcCncCocCpcCqctIcCrcCscCtcCtcCucCvcCwcxpcCxcCycxrcCzctOcAYcCAcCBcCCcBbcBbcqmcBdcqmcoVcqoczlaaaaaaaaactUcCDcCEcuhcCFcCGcCHcCIcCJcCKcCKcCLcCMcCNcskcCOcCMcCPcnDcCQcCRcCScCTcCUcCVcBrcCWcCXcgwaaaaaaaaaczCcsDcCYcuucCZcDacDbcDccxZcDdcDecDdcuzcDfcyecDgcDhcDicDjcDkcDlcwmcDmcwocDncypcDoczXcDpczXcDqcuGcDrcDscDtcwAcDucDvcDwcwEcDxcDycDzcDAcDBcDCcDDcDEcApcDFcDGcAsaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaacDHcDIcDJcDKcDLcDLcDMcDNcDOcDPcPXcyOcDRcDScDTcyOctDctDctDctDcDUcDVcDWcDUctIcDXctIcDYcDZctIcEacEbcEccEccEdcEecEactOcEfcEgcEhcEictOcEjcEjcEjcEkcEjcBbcBbcBbcqmcoVcqocoVaaaaaaaaactUctUcElcCEcuhcuhcEmcEncEocEocEpcEqcErcEscEtcEucErcEvcEwcExcExcEycEzcBrcBrcCWcEAcgwcgwaaaaaaaaacpkcsDcEBcuucuucECcEDcEEcxZcEFcEGcEHcuzcEIcEJcEKcELcEMcENcEOcEPcEQcERcEScETcuGcEUcEVcEWcEXcEYcuGcEZcFacFbcwAcFccFdcFecwEcFfcFgcFhcFicFjcAmcFkcFlcFmcAscAscAsaafaafaafabcaafaaaaaaaagaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaacDHcFncFocFpcFqcDHcDHcDHcFrcFscFtcyOcyOcyOcyOcyOcFucFvcFwcFxcDUcFycFzcFAcFBcFCcFDcFEcFFctIcFGcFHcFIcFJcFKcFLcFMctOcxpcFNcxpcFOctOcFPcFQcFRcFScEjcoVcoVcFTcoVcoVcFUcoVaaaaaaaaaaaactUctUcElcCEcsjcFVcFWcFXcFYcsjcFZcGacGbcskcGccGacGdcjDcGecGfcGgcGhcjDcCWcEAcgwcgwaaaaaaaaaaaacpkcsDcGicGjcGkcGlcGmcGncGocGpcGqcGrcuzcGscuzcuzcGtcGucGtcuycuEcGvcuEcGwcuEcuGcwwcGxcGycwwcuGcuGcGzcGAcGBcwAcwEcGCcwEcwEcFfcFgcFhcGDcGEcAmcGFcGGcGHcAsaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaacFpcGIcFpcGJcGKcGLcDHcGMcGNcFscGOcGPcGQcGRcGScGTcFucGUcGVcFxcDUcGWcGXcGYcGZcHacDUcHbcHccHdcHecHfcHgcHgcHhcHicHjcHkcHlcHmcHncHocEjcHpcHqcHrcHscEjcHtcHucBbcHvcHwcHxcoVaaaaaaaaaaaaaaactUctUcHycHzcHycHAcHBcHCcHDcHDcHEcslcskcslcHEcHFcHFcHGcHHcHIcHJcHKcHJcgwcgwaaaaaaaaaaaaaaacpkcHLcHMcGjcHNcHOcHPcHQcHRcHScHTcHUcHVcHWcHXcHYcHZcIacHUcIbcIccIdcIecIfcIgcIhcIicIjcIkcIlcImcIncIocIpcIqcIrcIscItcIucIvcIwcIxcIycIzcIAcAmcAmcIBcAmcAsaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaagaafaafaafaagaadaadaadaadaadaadaagaaaaaaaaacFpcICcIDcIEcGKcIFcIGcIHcIIcIJcGOcIKcGQcGRcGScGTcGTcILcIMcFxcDUcINcIOcIPcIQcIRcIScITcIUcIVcIWcIXcIVcIVcIYcIZcJacJbcJccITcJdcJecJfcJgcJhcJicJjcJkcHtcHucBbcFUcBbcJlcoVaaaaaaaaaaabaaaaaactUctUcqpcJmcJncJocJpcHDcsicJqcslcskcslcJrczBcHFcJscJtcJucJvchZcgwcgwaaaaaaaabaaaaaaaaacpkcJwcJxcGjcGkcJycJzcJAcJBcJCcJDcJEcJFcJGcJHcJIcJJcJIcJEcJKcJLcJMcJNcJOcJPcJQcJRcJScJTcJUcJVcJWcJXcJYdUUcKacJXcKbcJXcKccJXcKdcKecKfcKgcKhcKicKjcKkcKlaaaaaaaabaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaacDHcKmcKncKocGKcKpcDHcKqcKrcKscKtcKtcKucKtcKucKvcKwcKxcIMcIMcDUcKycKzcKzcKAcKBcKCcHgcKDcHgcKEcHgcHgcHgcKDcKFcKGcKGcKGcKGcKGcKGcKHcKIcKJcKKcKLcEjcHtcHucBbcKMcKNcKNcKNcKNcKNaaaaaaaaaaaaaaaaaacqpcqpctUctUctUcqpcqpcqpcKOcKPcKQcqpchZchZcgwcgwcgwchZchZaaaaaaaaaaaaaaaaaacKRcKRcKRcKRcKScKTcKTcKUcKVcKTcKWcKXcKYcKXcKZcLacLbcLccLdcLccLbcLbcLbcLecLfcLgcLbcLhcLicLjcLkcLjcLhcLhcLlcLmcLncLmcLlcAjcLocLpcLqcLrcAjcLscLtcLucLvcLwcLxcLyaaaaaaaaaaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafcLzcLAcDHcLBcLCcLDcDHcKqcLEcLFcLGcLHcLIcLJcLKcLLcGTcLMcIMcIMcDUcLNcLOcKzcLPcLQcDUcLRcLScHgcLTcLUcLUcLUcLScLVcKGcLWcLWcLWcLWcLWcLXcLYcLYcLZcLYcoVcoVcoVcBbcFUcKNcMacMbcMccKNcKNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactUcMdcMecMfcMgcMhctUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKRcKRcMicMjcKRcMkcKVcMlcMmcMncKTcMocMpcMqcMrcMscKZcMtcMucMvcMwcMxcLbcMycMzcMAcMBcMCcLhcMDcMEcMFcMGcMHcMIcMJcMKcMLcMMcMNcMOcMOcMOcMOcMOcMOcMPcMQcMRcMScMTcMUcMVaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaacMWcDHcFpcFpcDHcDHcMXcMYcMYcMXcMZcNacMXcMXcLLcGTcIMcIMcIMcDUcNbcNccNdcNecNfcDUcNgcHgcHgcNhcNicHgcHgcHgcNjcNkcLWcLWcLWcLWcLWcLXcNlcNmcNncLYcNocNpcoVcBbcNqcNrcNscNscNtcNucKNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactUcNvcNwcNxcNycNzctUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKRcNAcNBcNCcKRcNDcKVcNEcNFcNGcKTcNHcNIcNJcNKcNLcNMcNNcNOcNPcNQcNRcLccNScNTcNUcNVcNWcNXcNYcNZcOacObcOccLhcOdcOecOfcOgcOhcMOcOicOjcOkcOlcMOcOmcOncLucOocOpcOqcLyaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaacMWcDHcFpcFpcDHcDHcMXcMYcMYcMXcMZcNacMXcMXcLLcGTcIMcIMcIMcDUcNbcNccNdcNecNfcDUcNgcHgcHgcNhcNicHgcHgcHgcNjcNkcLWcLWcLWcLWcLWcLXcNlcNmcNncLYcNocQkcoVcBbcNqcNrcNscNscNtcNucKNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactUcNvcNwcNxcNycNzctUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacKRcNAcNBcNCcKRcNDcKVcNEcNFcNGcKTcNHcNIcNJcNKcNLcNMcNNcNOcNPcNQcNRcLccNScNTcNUcNVcNWcNXcNYcNZcOacObcOccLhcOdcOecOfcOgcOhcMOcOicOjcOkcOlcMOcOmcOncLucOocOpcOqcLyaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaacMXcOrcOscOtcMXcLLcGTcIMcIMcIMcDUcDUcDUcDUcDUcDUcDUcOucOvcHgcHgcOwcOwcOwcHgcOxcOycLWcLWcLWcLWcLWcLXcOzcOAdUVcLYcOCcBbcODcOEcOFcKNcOGcOHcOIcOJcKNcoVcoVcoVcoVczlczlczlcoVcoVcoVcoVcoVcOKcOLcMfcOMcOKcpkcpkcpkcpkcpkczCczCczCcpkcpkcpkcpkcKRcONcOOcOPcKRcOQcKVcORcOScOTcKTcOUcOVcOWcOXcOYcKZcOZcPacPbcPccPdcLfcNScNTcPecPfcPgcPhcPicPjcPkcPlcPmcLhcPncPocPpcPqcPrcMOcPscPtcPtcPucMOcPvcPwcPxcPycPzcPAcKlaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaacMXcPBcPCcPDcMXcLLcGTcGTcPEcIMcFucFucIMcIMcIMcPFcGTcEacPGcEacEacPHcPIcPJcPKcPLcPMcLWcLWcLWcLWcLWcLXcPNcPOcPPcLYcPQcPRcoVcPScPTcKNcKNcKNcKNcKNcKNcPUcPVcPWcPXcPYcPZcQacQacQacQacQacQacQbcQccQdcQecQfcQgcQgcQgcQgcQgcQgcQhcQicpkcQjcQkcQlcKRcQmcOOcQncKRcQocKVcKVcQpcKVcKTcQqcQrcQscQtcQucKXcQvcQwcQxcQycPdcLccNScQzcQAcQBcQCcQDcQEcQFcQGcQHcQIcLhcLlcLlcLlcLlcLlcMOcPscQJcQKcPucMOcQLcQMcKlcKlcKlcKlcKlaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaafaaaaaaaaaaaacMXcQNcQNcMXcMXcLLcIMcGTcGTcFucFucGTcGTcGTcGTcGTcGTcQOcQOcQOcEacEacEacEacQPcQQcKGcLWcLWcLWcLWcLWcLXcLYcQRcLYcLYcoVcoVcoVcQScQTcQUcHwcQVcQWcQXcHwcQacQYcQZcRacRbcRccPUcAYcPUcPUcRdcRecoVcRfcRgcRhcpkcRicRjcRicRkcRlcRmcRncQocRmcsFcsFcRocKRcKRcRpcKRcKRcQocpkcGjcRqcRrcLacRscRtcRucRvcRwcKZcRxcRycRzcRAcRBcLbcRCcRDcREcRFcRGcRHcRIcRJcRKcRLcRMcRNcROcRPcRQcRRcRScMOcRTcRUcPtcRVcMOcRWcRXcpwaaaaaaaaaaaaaaaaaaaaaabcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcaadaadaaaaaaaaacMXcRYcRZcSacMXcSbcKvcSccSdcSecSfcSgcShcIMcSicIMcSjcSkcSkcSkcSlcSmcSmcEacEacEacKGcKGcKGcKGcKGcKGcKGcQOcSncQOcGTcSocGTcSpcBbcFUcBbcSqcSrcPScSscBbcPUcPUcRdcPUcPUcStcAYcSucSvcSwcSucSucSucSxcSycSzcSAcSAcSAcSAcSAcSAcSAcSBcSCcSDcSDcSDcSEcSFcSGcSHcSDcSDcSIcSJcSKcSLcSMcLacLacLacLacLacLacLacSNcLbcLbcLbcSOcLbcSPcSQcSRcSScSPcLhcSTcLhcLhcLhcMIcSUcSVcSWcSXcSYcSZcTacPtcTbcTccTdcTecTfcTgcpwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaacMXcPBcPCcPDcMXcLLcGTcGTcPEcIMcFucFucIMcIMcIMcPFcGTcEacPGcEacEacPHcPIcPJcPKcPLcPMcLWcLWcLWcLWcLWcLXcPNcPOcPPcLYcPQcPRcoVcPScPTcKNcKNcKNcKNcKNcKNcPUcPVcPWcQZcPYcPZcQacQacQacQacQacQacQbcQccQdcQecQfcQgcQgcQgcQgcQgcQgcQhcQicpkcQjcSpcQlcKRcQmcOOcQncKRcQocKVcKVcQpcKVcKTcQqcQrcQscQtcQucKXcQvcQwcQxcQycPdcLccNScQzcQAcQBcQCcQDcQEcQFcQGcQHcQIcLhcLlcLlcLlcLlcLlcMOcPscQJcQKcPucMOcQLcQMcKlcKlcKlcKlcKlaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaafaaaaaaaaaaaacMXcQNcQNcMXcMXcLLcIMcGTcGTcFucFucGTcGTcGTcGTcGTcGTcQOcQOcQOcEacEacEacEacQPcQQcKGcLWcLWcLWcLWcLWcLXcLYcQRcLYcLYcoVcoVcoVcQScQTcQUcHwcQVcQWcQXcHwcQacQYdFLcRacRbcRccPUcAYcPUcPUcRdcRecoVcRfcRgcRhcpkcRicRjcRicRkcRlcRmcRncQocRmcsFcsFcRocKRcKRcRpcKRcKRcQocpkcGjcRqcRrcLacRscRtcRucRvcRwcKZcRxcRycRzcRAcRBcLbcRCcRDcREcRFcRGcRHcRIcRJcRKcRLcRMcRNcROcRPcRQcRRcRScMOcRTcRUcPtcRVcMOcRWcRXcpwaaaaaaaaaaaaaaaaaaaaaabcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcaadaadaaaaaaaaacMXcRYcRZcSacMXcSbcKvcSccSdcSecSfcSgcShcIMcSicIMcSjcSkcSkcSkcSlcSmcSmcEacEacEacKGcKGcKGcKGcKGcKGcKGcQOcSncQOcGTcSocGTdTdcBbcFUcBbcSqcSrcPScSscBbcPUcPUcRdcPUcPUcStcAYcSucSvcSwcSucSucSucSxcSycSzcSAcSAcSAcSAcSAcSAcSAcSBcSCcSDcSDcSDcSEcSFcSGcSHcSDcSDcSIcSJcSKcSLcSMcLacLacLacLacLacLacLacSNcLbcLbcLbcSOcLbcSPcSQcSRcSScSPcLhcSTcLhcLhcLhcMIcSUcSVcSWcSXcSYcSZcTacPtcTbcTccTdcTecTfcTgcpwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfGaafaafaafaafaaaaaaaaacMXcMXcSbcKucKucKucThcTicTicTicTjcTicTicTicTkcKucKucKucKucThcKucKucKucKucKucKucKucKucTlcTmcTncTocTpcKucTqcTrcTscTtcTucTucTucTucTucTucTucSucSucSucSucSucSucSucTvcTwcTxcTycSucTzcTAcTBcSAcTCcTDcTEcTFcTGcSAcTHcsFcsEcsFcsFcTIcTJcTJcTJcTJcTJcTJcTKcTLcsFcTMcTNcTOcTPcTQcTQcTRcTScTTcTUcTVcTWcTXcSRcTYcTZcUacUbcUccSRcUdcTWcTVcTUcUecSUcUfcUgcUhcUicUjcMOcUkcUlcUmcUncUocUpcUqcpwaaaaaaaaaabcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaafaaaaaaaaaaaacMXcMXcMYcMYcMYcMXcMXcMXcMYcMYcMYcMXcMXcMXcMXcMXcMXcMXcMXcIMcIMcIMcIMcIMcIMcIMcIMcIMcIMcIMcMXcMXcMXcMXcUrcUscUtcTucUucUvcUwcUxcUycTucUzcUAcUBcUCcUDcUEcUFcUGcUGcUHcUIcSucUJcUKcULcUMcUNcUOcUPcUQcURcSAcUScUTcpkcUUcUVcRmcTJcUWcUXcUYcUZcVacsFcTLcVbcVccVdcVecVfcVgcVhcGjcTScVicUacVjcVkcVlcSRcVmcVncVocVpcVqcSRcVrcVkcVjcUacVscSUcSUcSUcSUcVtcSUcMOcMOcMOcMOcMOcMOcVucVvcVwaafaafaafabcaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaacMXcMXcVxcVycVzcVAcVBcVCcVDcVEcVFcMXcMXaaaaaaaaaczlcVGcVHcTucTucTucVIcVJcVKcTucVLcVMcVNcVOcVPcVQcSucVRcVScVTcVUcSucVVcVWcVXcSAcVYcVZcWacWbcWccSAcWdcWecTJcTJcTJcTJcTJcWfcWgcWhcWicWjcqMcWkcWlcWmcWmcWlcWncWocWpcWqcWrcWscWtcWucWvcWwcWxcWycWzcWAcWycWycWxcWAcWBcWCcWycWDcWEcWFcWGcWHcWIcWJcWKcWLcWMcWNcWOcWPcWQcWRcWSaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -11014,7 +11017,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmHdngdnhdnhdnhdnidnidmKdnjdnkdnkdnldnkdnmdnndnodnpdnqdnrdnsdntdnudnvdnwdnxdnydnzdnAdnBdfkcUKdnCdmUdnDdnEdnFdnGdnHdnIdmUdnJdnKdmUdmXdmXdmXdmXdmXdmXdmXdmXdnLdnMdnNdnMdnOdnfaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmIdnPdnQdnRdnRdnSdmIdnTdnUdnVdnWdnXdnYdnZdoadobdocdoddoedofdogdohdoidojdokdoldomdomdomdondoodopdmUdmUdmUdoqdordosdotdoudovdowdmUdoxdoydozdoAdoBdoCdoDdmXdnbdnMdmFdoEdoFdnfaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmHdngdoGdoHdoHdoIdoJdoKdoLdoMdoNdoOdoPdoQdoRdoPdoPdoOdoSdoTdoUdoVdoWdoXdoYdoZdpadpbdoYdfkdpcdpddmUdpedpfdpgdphdpidpjdmUdpkdnKdmUdpldpmdpndpodppdpqdprdmXdnbdpsdmFdmFdmGdmGaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmHdngdptdoHdoHdoIdoJdoKdoLdpudpvdoOdpwdpxdpydpzdpAdoOdpBdpBdpCdpBdpDdpEdpFdpGdpFdpHdpIdpJdpcdpKdmUdmUdmUdmUdpLdmUdmUdmUdmUdmUdmUdpMdpmdpndpNdpOdpmdpPdmXdpQdnMdnMdpRdmGaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmHdngdptdoHdoHdoIdoJdoKdoLdpudpvdoOdpwdpxdpydpzdpAdoOdpBdpBdpCdpBdpDdpEdpFdpGdpFdpHdpIdpJdpcdpKdmUdmUdmUdmUdpLdmUdmUdmUdmUdmUdmUdpMdpmdpndpNdpOdpmdpPdmXdpQdnMdVtdpRdmGaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmIdpSdpTdpUdpUdnSdmIdmKdpVdpudpWdoPdpXdpYdpZdpXdpXdqadqbdqcdqddqcdqedpEdqfdqgdqhdpFdqidfkdpcdqjdqkdqldqmdqndqodqpdqqdqrdqsdqtdqudqvdqvdqvdqwdqxdqxdqydqzdqAdqBdnMdqCdnfaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmHdngdqDdqDdqDdnidnidmKdqEdpudqFdoPdqGdqHdqIdqJdqKdoOdqLdqMdqNdqcdqOdpEdqPdqQdqRdpFdqidfkdqSdqjdqkdqldqTdqUdqUdqVdqWdqUdqXdqUdqYdqZdradrbdqYdqUdrcdqUdmXdrddrednMdrfdnfaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmHdmHdmHdmIdmHdmHdrgdmKdrhdridrjdoOdrkdrldrmdrndrodoOdrpdrqdrrdqcdrsdpEdrtdrudrvdrwdrxdfkdrydrzdrAdrBdrCdrDdrEdqUdqWdrFdrGdrGdrHdrGdrIdrIdrJdrIdrIdmXdmXdrKdrLdnMdrMdnfaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -11210,7 +11213,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEndE
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEndEndEndEndEndEndEndEndEnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaafaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdBGdFcdBudAVdBGdFcdBudAVdBGdFcdBudAVdBGdFcdBudAVdBGdFcdBudAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdCcdEUdFddCcaaaaaaaaadAVdAVdAVdAVdAVdCLdAVdAVdAVdErdFedESdErdFfdFgdFhdErdFidFjdErdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaadCfdFkdFbdCfdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdBDdFldBFdAVdBDdFldBFdAVdBDdFldBFdAVdBDdFldBFdAVdBDdFldBFdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaaaaaaabcaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEndEndEndEndEndEndEndEndEndEndEnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaafdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdCcdFmdFndFoaaaaaaaaadAVdAVdAVdAVdAVdCLdAVdAVdFpdFpdFqdFpdFpdErdFrdErdFsdFsdFtdFsdFsdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaadFudFvdFwdCfdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaadaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEndEndEndEndEndEndEndEndEndEndEnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdCcdFxdFydFoaaaaaadAVdAVdAVdAVdAVdAVdCLdAVdFpdFpdFzdFAdFBdFpdFCdFDdFEdFsdFFdFGdFHdFsdFsdAVdAVdAVdAVdAVdAVdAVdAVaaaaaadFudFIdFJdCfdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEndEndEndEndEndEndEndEndEndEndEnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdCcdFKdFLdFoaaaaaadAVdAVdAVdAVdAVdAVdCLdAVdFpdFMdFNdFOdFPdFQdFRdFSdFTdFUdFVdFWdFXdFYdFsdAVdAVdAVdAVdAVdAVdAVdAVaaaaaadFudFZdGadCfdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEndEndEndEndEndEndEndEndEndEndEnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdCcdFKdVudFoaaaaaadAVdAVdAVdAVdAVdAVdCLdAVdFpdFMdFNdFOdFPdFQdFRdFSdFTdFUdFVdFWdFXdFYdFsdAVdAVdAVdAVdAVdAVdAVdAVaaaaaadFudFZdGadCfdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBrdBraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEndEndEndEndEndEndEndEndEndEndEnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdCcdGbdGcdCcaaaaaadGddGedGfdGedGgdGgdGhdGgdGgdGidGjdGkdGldFpdGmdGndGmdFsdGodGpdGqdGrdGsdGtdGudGtdGsdGvdGwdGvdGxaaaaaadCfdGydGzdCfdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadBrdBrdBrdBrdBrdBrdBrdBrdBraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEndEndEndEndEndEndEndEndEnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdCcdGAdCldCcaaaaaadGddGBdGCdGDdGEdGFdGGdGHdGgdFpdFpdFpdGIdGJdGKdGLdGMdGNdGOdFsdFsdFsdGsdGPdGQdGRdGSdGTdGUdGVdGxaaaaaadCfdCUdGWdCfdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadBrdBrdBrdBrdBrdBrdBraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEndEndEndEndEndEndEnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdCcdGXdGYdCcaaaaaadGddGZdHadHbdGEdHcdHddHedGgdHfdHgdHgdHhdHgdHgdHidHgdHgdHjdHgdHgdHkdGsdHldHmdHndGSdHodHpdHqdGxaaaaaadCfdHrdHsdCfdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -11234,7 +11237,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaafaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdPNdQydPPdAVdPNdQydPPdAVdPNdQydPPdAVdPNdQydPPdAVdPNdQydPPdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdMxdPudNTdQTdQUdNtdQVdQWdQXdQYdPUdNydNydQZdRadRbdRcdRddRedRfdRgdRhdRidRjdRkdRldRmdRndRodRpdRqdRrdRsdRtdRudQrdRvdNKdRwdRxdRydPMdMYdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdQvdQSdQxdAVdQvdQSdQxdAVdQvdQSdQxdAVdQvdQSdQxdAVdQvdQSdQxdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdPNdQydPPdAVdPNdQydPPdAVdPNdQydPPdAVdPNdQydPPdAVdPNdQydPPdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdMxdPudNTdNTdNTdRzdNydRAdRBdRCdRDdREdRFdNtdRGdRHdRIdRJdRIdRIdRIdRJdRIdRIdRIdRIdRIdRHdRKdNKdRLdQrdQqdRMdQrdQrdRNdNKdROdRPdRQdPMdMYdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdQvdQSdQxdAVdQvdQSdQxdAVdQvdQSdQxdAVdQvdQSdQxdAVdQvdQSdQxdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdPNdQydPPdAVdPNdQydPPdAVdPNdQydPPdAVdPNdQydPPdAVdPNdQydPPdAVdAVdAVdAVdAVdAVdRRdRSdRSdRSdMxdRTdMzdMzdMzdNtdRUdRVdRWdNydRXdRVdRYdRZdSadSbdScdSddSedRIdRIdSfdRIdRIdSgdShdSidSjdSkdSldSmdQrdSndSodOkdQrdSpdNKdMZdMZdMZdSqdMYdSrdSrdSrdSsdAVdAVdAVdAVdAVdAVdQvdQSdQxdAVdQvdQSdQxdAVdQvdQSdQxdAVdQvdQSdQxdAVdQvdQSdQxdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdStdAVdAVdAVdStdAVdAVdAVdStdAVdAVdAVdStdAVdAVdAVdStdAVdAVdAVdAVdSudSvdSwdSxdSydSzdSAdSBdSCdSDdSEdSFdNtdNtdSGdSHdSIdSJdSGdNtdNtdSKdSLdSMdPAdSNdSOdSPdSQdSRdSSdSTdPAdSUdSVdSWdNKdNKdSXdSYdSZdOkdTadNKdNKdTbdTcdTddTedTfdTgdThdTidTjdTkdTldTmdAVdAVdAVdAVdTndAVdAVdAVdTndAVdAVdAVdTndAVdAVdAVdTndAVdAVdAVdTndAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdStdAVdAVdAVdStdAVdAVdAVdStdAVdAVdAVdStdAVdAVdAVdStdAVdAVdAVdAVdSudSvdSwdSxdSydSzdSAdSBdSCdSDdSEdSFdNtdNtdSGdSHdSIdSJdSGdNtdNtdSKdSLdSMdPAdSNdSOdSPdSQdSRdSSdSTdPAdSUdSVdSWdNKdNKdSXdSYdSZdOkdTadNKdNKdTbdTcdVvdTedTfdTgdThdTidTjdTkdTldTmdAVdAVdAVdAVdTndAVdAVdAVdTndAVdAVdAVdTndAVdAVdAVdTndAVdAVdAVdTndAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdTodTpdTpdTpdTqdTpdTpdTpdTqdTpdTpdTpdTqdTpdTpdTpdTqdTpdTpdTpdTqdTpdTpdTrdTsdTtdTudTvdTwdTxdTydTzdTAdTBdTCdTCdTDdTEdNtdNtdTFdTGdTHdTIdPRaaaaaaaaaaaadTJdPAdSKdTKdTLdTMdSMdPAdPAaaaaaaaaaaaadTNdTOdTPdTQdTRdNKdNKdTSdTTdTUdTVdTWdTXdTYdTZdUadUbdUcdUddUedUfdUgdUhdUhdUidUhdUhdUhdUidUhdUhdUhdUidUhdUhdUhdUidUhdUhdUhdUidUhdUhdUhdUjdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdStdAVdAVdAVdStdAVdAVdAVdStdAVdAVdAVdStdAVdAVdAVdStdAVdAVdAVdAVdSudSudSudRRdUkdUldUmdSBdUndNTdNTdUodUpdMxdUqdUrdUrdUrdUrdUsdAVdAVdAVdAVdAVdUqdUrdUrdUrdUrdUrdUsdUtdAVdAVdAVdAVdUqdUrdUrdUrdUrdUsdMYdUudUvdUvdUvdUwdTfdUxdUydUzdSsdTmdTmdTmdAVdAVdAVdAVdTndAVdAVdAVdTndAVdAVdAVdTndAVdAVdAVdTndAVdAVdAVdTndAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaagaafaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaadAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdPNdUAdPPdAVdPNdUAdPPdAVdPNdUAdPPdAVdPNdUAdPPdAVdPNdUAdPPdAVdAVdAVdAVdAVdAVdRRdRSdRSdRSdRSdUBdUCdUDdUEdUFdMxdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdMYdUGdUvdUHdUIdUJdSrdSrdSrdSrdSsdAVdAVdAVdAVdAVdAVdQvdUKdQxdAVdQvdUKdQxdAVdQvdUKdQxdAVdQvdUKdQxdAVdQvdUKdQxdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVdAVaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/maps/southern_cross/southern_cross.dm b/maps/southern_cross/southern_cross.dm
index 7ddc08f49d..29c4f295f2 100644
--- a/maps/southern_cross/southern_cross.dm
+++ b/maps/southern_cross/southern_cross.dm
@@ -25,7 +25,6 @@
#include "items/headset_sc.dm"
#include "items/clothing/sc_suit.dm"
#include "items/clothing/sc_under.dm"
- #include "items/clothing/sc_head.dm"
#include "items/clothing/sc_accessory.dm"
#include "job/outfits.dm"
#include "structures/closets/engineering.dm"
diff --git a/maps/submaps/surface_submaps/mountains/SwordCave.dmm b/maps/submaps/surface_submaps/mountains/SwordCave.dmm
new file mode 100644
index 0000000000..8c15e58da8
--- /dev/null
+++ b/maps/submaps/surface_submaps/mountains/SwordCave.dmm
@@ -0,0 +1,55 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/turf/simulated/mineral,/area/submap/cave/swordcave)
+"c" = (/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/swordcave)
+"d" = (/obj/machinery/crystal,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/swordcave)
+"e" = (/turf/simulated/floor/water,/area/submap/cave/swordcave)
+"f" = (/turf/simulated/floor/water/deep,/area/submap/cave/swordcave)
+"g" = (/obj/structure/ghost_pod/manual/cursedblade,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/swordcave)
+"h" = (/mob/living/simple_animal/hostile/faithless/cult,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/swordcave)
+"i" = (/obj/item/device/gps/explorer,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/swordcave)
+"j" = (/obj/structure/loot_pile/surface/bones,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/swordcave)
+"k" = (/mob/living/simple_animal/hostile/scarybat/cult,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/cave/swordcave)
+
+(1,1,1) = {"
+aaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaa
+aaaaabbbbbbbbbbbcccdccccbbbbbbbbbbbbaaaaa
+aaaabbbbbbcccccccccccccccccccccbbbbbbaaaa
+aaabbbbbbcccccccccccccccccccccccdbbbbbaaa
+aabbbbccccccceeeeeeeeeeeeeccccccccbbbbbaa
+aabbbccccccceeeeeeeeeeeeeeeccccccccbbbbaa
+aabbbcdcccceeeffffffffffffeeeccccccbbbbaa
+aabbbccccceefeeeeeeefeeeeeeeeecccccbbbbaa
+aabbbccccceefeeccceeeeeeeefffeeccccbbbaaa
+aabbbcccceeffeecccccecccceefffeecccbbbaaa
+aabbbcccceeffeeeccgcccchcceeffeecccbbbaaa
+aabbbcccdeeffeeccijcdccccceefeeccdcbbbaaa
+abbbccccceefffeeeccccccceeefeeccccccbbaaa
+abbbcccccceefffeeeccccceeeffeeccccccbbbaa
+abbbcdccccceefffeeeeeeeeffffeeccccccbbbaa
+abbcccckcccceeffffeeeeefffffeeccccccbbbaa
+abbcccccccccceeffffffffffffeeccccdccbbbaa
+abbccccccccccceeffeeeeeefffeecccccccbbbaa
+abbbccccdcccccceefeeeeeeeeeeckccccccbbbaa
+abbbcccccccccccceeecccdceeecccccccccbbaaa
+abbbcccccccccccccecccccccceccccdckccbbaaa
+abbbcccccccccckcccccccccccccccccccccbbaaa
+abbbbcccccckccccccccccccccckccccccccbbaaa
+abbbbbcccccccccccccccckccccccccckcccbbaaa
+aabbbbbccccccccccccccccccccccccccccbbbaaa
+aabbbbbccccccccccccdccccccccccccccbbbbaaa
+aabbbbbcccccdccccccccccccccccccccbbbbbaaa
+aabbbbbccccccccccckccccccccdcccccbbbbaaaa
+aabbbbbbbccccccccccccccccccccccccbbbbaaaa
+aaabbbbbbbcccccccccccccccdccccccbbbbaaaaa
+aaaabbbbbbcckcccccdcccccccccccccbbbbaaaaa
+aaaaabbbbbcccccccccccccccccccccbbbbbaaaaa
+aaaaabbbbbccccccccccccccccccccbbbbbaaaaaa
+aaaaaabbbbbcccdccccccccccccccbbbbbaaaaaaa
+aaaaaaabbbbbcccccccckccccckcbbbbbbaaaaaaa
+aaaaaaabbbbbbcccccccccccccccbbbbbaaaaaaaa
+aaaaaaabbbbbbbbbbbbccccccccccbbbaaaaaaaaa
+aaaaaaaaabbbbbbbbbbbccccccccccbaaaaaaaaaa
+aaaaaaaaaaabbbbbbbbbbccccccccccaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaacccdccccaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaccccccaaaaaaaaaaaa
+"}
diff --git a/maps/submaps/surface_submaps/mountains/mountains.dm b/maps/submaps/surface_submaps/mountains/mountains.dm
index 58fdce2971..c661b94bec 100644
--- a/maps/submaps/surface_submaps/mountains/mountains.dm
+++ b/maps/submaps/surface_submaps/mountains/mountains.dm
@@ -27,6 +27,7 @@
#include "IceCave1A.dmm"
#include "IceCave1B.dmm"
#include "IceCave1C.dmm"
+#include "SwordCave.dmm"
#include "SupplyDrop1.dmm"
#include "BlastMine1.dmm"
#endif
@@ -171,6 +172,11 @@
mappath = 'maps/submaps/surface_submaps/mountains/IceCave1C.dmm'
cost = 10
+/datum/map_template/surface/mountains/normal/SwordCave
+ name = "Cursed Sword Cave"
+ desc = "An underground lake. The sword on the lake's island holds a terrible secret."
+ mappath = 'maps/submaps/surface_submaps/mountains/SwordCave.dmm'
+
/datum/map_template/surface/mountains/normal/supplydrop1
name = "Supply Drop 1"
desc = "A drop pod that landed deep within the mountains."
diff --git a/maps/submaps/surface_submaps/mountains/mountains_areas.dm b/maps/submaps/surface_submaps/mountains/mountains_areas.dm
index e17290aa3a..2555b558f9 100644
--- a/maps/submaps/surface_submaps/mountains/mountains_areas.dm
+++ b/maps/submaps/surface_submaps/mountains/mountains_areas.dm
@@ -76,13 +76,13 @@
name = "Ice Cave 1B"
/area/submap/cave/IceCave1C
-
name = "Ice Cave 1C"
- name = "Mine Vault"
+
+/area/submap/cave/swordcave
+ name = "Cursed Sword Cave"
/area/submap/cave/SupplyDrop1
name = "Supply Drop 1"
/area/submap/cave/BlastMine1
- name = "Blast Mine 1"
-
+ name = "Blast Mine 1"
\ No newline at end of file
diff --git a/nano/js/nano_state.js b/nano/js/nano_state.js
index 3e9ef3ab1f..e211895cee 100644
--- a/nano/js/nano_state.js
+++ b/nano/js/nano_state.js
@@ -7,8 +7,7 @@ function NanoStateClass() {
return;
}
- this.key = this.key.toLowerCase();
-
+ this.key = this.key.toLowerCase();
NanoStateManager.addState(this);*/
}
@@ -18,102 +17,99 @@ NanoStateClass.prototype.contentRendered = false;
NanoStateClass.prototype.mapInitialised = false;
NanoStateClass.prototype.isCurrent = function () {
- return NanoStateManager.getCurrentState() == this;
+ return NanoStateManager.getCurrentState() == this;
};
NanoStateClass.prototype.onAdd = function (previousState) {
- // Do not add code here, add it to the 'default' state (nano_state_defaut.js) or create a new state and override this function
-
- NanoBaseCallbacks.addCallbacks();
- NanoBaseHelpers.addHelpers();
+ // Do not add code here, add it to the 'default' state (nano_state_defaut.js) or create a new state and override this function
+ NanoBaseCallbacks.addCallbacks();
+ NanoBaseHelpers.addHelpers();
};
NanoStateClass.prototype.onRemove = function (nextState) {
- // Do not add code here, add it to the 'default' state (nano_state_defaut.js) or create a new state and override this function
-
- NanoBaseCallbacks.removeCallbacks();
- NanoBaseHelpers.removeHelpers();
+ // Do not add code here, add it to the 'default' state (nano_state_defaut.js) or create a new state and override this function
+ NanoBaseCallbacks.removeCallbacks();
+ NanoBaseHelpers.removeHelpers();
};
NanoStateClass.prototype.onBeforeUpdate = function (data) {
- // Do not add code here, add it to the 'default' state (nano_state_defaut.js) or create a new state and override this function
-
- data = NanoStateManager.executeBeforeUpdateCallbacks(data);
-
- return data; // Return data to continue, return false to prevent onUpdate and onAfterUpdate
+ // Do not add code here, add it to the 'default' state (nano_state_defaut.js) or create a new state and override this function
+ data = NanoStateManager.executeBeforeUpdateCallbacks(data);
+ return data; // Return data to continue, return false to prevent onUpdate and onAfterUpdate
};
NanoStateClass.prototype.onUpdate = function (data) {
- // Do not add code here, add it to the 'default' state (nano_state_defaut.js) or create a new state and override this function
+ // Do not add code here, add it to the 'default' state (nano_state_defaut.js) or create a new state and override this function
+ try
+ {
+ if (!this.layoutRendered || (data['config'].hasOwnProperty('autoUpdateLayout') && data['config']['autoUpdateLayout']))
+ {
+ $("#uiLayout").html(NanoTemplate.parse('layout', data)); // render the 'mail' template to the #mainTemplate div
+ this.layoutRendered = true;
+ }
+ if (!this.contentRendered || (data['config'].hasOwnProperty('autoUpdateContent') && data['config']['autoUpdateContent']))
+ {
+ var content = "";
+ var keys = NanoTemplate.getKeys();
+ for (i = 0; i < keys.length; i++) {
+ if(keys[i] == "layout"){ continue; }
+ content += NanoTemplate.parse(keys[i], data);
+ }
+ $("#uiContent").html(content); // render the 'mail' template to the #mainTemplate div
+ this.contentRendered = true;
+ }
+ if (NanoTemplate.templateExists('mapContent'))
+ {
+ if (!this.mapInitialised)
+ {
+ // Add drag functionality to the map ui
+ $('#uiMap').draggable();
+ $('#uiMapTooltip')
+ .off('click')
+ .on('click', function (event) {
+ event.preventDefault();
+ $(this).fadeOut(400);
+ });
+ this.mapInitialised = true;
+ }
- try
- {
- if (!this.layoutRendered || (data['config'].hasOwnProperty('autoUpdateLayout') && data['config']['autoUpdateLayout']))
- {
- $("#uiLayout").html(NanoTemplate.parse('layout', data)); // render the 'mail' template to the #mainTemplate div
- this.layoutRendered = true;
- }
- if (!this.contentRendered || (data['config'].hasOwnProperty('autoUpdateContent') && data['config']['autoUpdateContent']))
- {
- $("#uiContent").html(NanoTemplate.parse('main', data)); // render the 'mail' template to the #mainTemplate div
- this.contentRendered = true;
- }
- if (NanoTemplate.templateExists('mapContent'))
- {
- if (!this.mapInitialised)
- {
- // Add drag functionality to the map ui
- $('#uiMap').draggable();
+ $("#uiMapContent").html(NanoTemplate.parse('mapContent', data)); // render the 'mapContent' template to the #uiMapContent div
- $('#uiMapTooltip')
- .off('click')
- .on('click', function (event) {
- event.preventDefault();
- $(this).fadeOut(400);
- });
-
- this.mapInitialised = true;
- }
-
- $("#uiMapContent").html(NanoTemplate.parse('mapContent', data)); // render the 'mapContent' template to the #uiMapContent div
-
- if (data['config'].hasOwnProperty('showMap') && data['config']['showMap'])
- {
- $('#uiContent').addClass('hidden');
- $('#uiMapWrapper').removeClass('hidden');
- }
- else
- {
- $('#uiMapWrapper').addClass('hidden');
- $('#uiContent').removeClass('hidden');
- }
- }
- if (NanoTemplate.templateExists('mapHeader'))
- {
- $("#uiMapHeader").html(NanoTemplate.parse('mapHeader', data)); // render the 'mapHeader' template to the #uiMapHeader div
- }
- if (NanoTemplate.templateExists('mapFooter'))
- {
- $("#uiMapFooter").html(NanoTemplate.parse('mapFooter', data)); // render the 'mapFooter' template to the #uiMapFooter div
- }
- }
- catch(error)
- {
- alert('ERROR: An error occurred while rendering the UI: ' + error.message);
- return;
- }
+ if (data['config'].hasOwnProperty('showMap') && data['config']['showMap'])
+ {
+ $('#uiContent').addClass('hidden');
+ $('#uiMapWrapper').removeClass('hidden');
+ }
+ else
+ {
+ $('#uiMapWrapper').addClass('hidden');
+ $('#uiContent').removeClass('hidden');
+ }
+ }
+ if (NanoTemplate.templateExists('mapHeader'))
+ {
+ $("#uiMapHeader").html(NanoTemplate.parse('mapHeader', data)); // render the 'mapHeader' template to the #uiMapHeader div
+ }
+ if (NanoTemplate.templateExists('mapFooter'))
+ {
+ $("#uiMapFooter").html(NanoTemplate.parse('mapFooter', data)); // render the 'mapFooter' template to the #uiMapFooter div
+ }
+ }
+ catch(error)
+ {
+ alert('ERROR: An error occurred while rendering the UI: ' + error.message);
+ return;
+ }
};
NanoStateClass.prototype.onAfterUpdate = function (data) {
- // Do not add code here, add it to the 'default' state (nano_state_defaut.js) or create a new state and override this function
-
- NanoStateManager.executeAfterUpdateCallbacks(data);
+ // Do not add code here, add it to the 'default' state (nano_state_defaut.js) or create a new state and override this function
+ NanoStateManager.executeAfterUpdateCallbacks(data);
};
NanoStateClass.prototype.alertText = function (text) {
- // Do not add code here, add it to the 'default' state (nano_state_defaut.js) or create a new state and override this function
-
- alert(text);
+ // Do not add code here, add it to the 'default' state (nano_state_defaut.js) or create a new state and override this function
+ alert(text);
};
diff --git a/nano/js/nano_template.js b/nano/js/nano_template.js
index f8f5d26594..b2f894fd07 100644
--- a/nano/js/nano_template.js
+++ b/nano/js/nano_template.js
@@ -1,15 +1,15 @@
var NanoTemplate = function () {
- var _templateData = {};
+ var _templateData = {};
- var _templates = {};
- var _compiledTemplates = {};
+ var _templates = {};
+ var _compiledTemplates = {};
var _helpers = {};
- var init = function () {
- // We store templateData in the body tag, it's as good a place as any
+ var init = function () {
+ // We store templateData in the body tag, it's as good a place as any
_templateData = $('body').data('templateData');
if (_templateData == null)
@@ -18,94 +18,101 @@ var NanoTemplate = function () {
}
loadNextTemplate();
- };
+ };
- var loadNextTemplate = function () {
- // we count the number of templates for this ui so that we know when they've all been rendered
- var templateCount = Object.size(_templateData);
+ var loadNextTemplate = function () {
+ // we count the number of templates for this ui so that we know when they've all been rendered
+ var templateCount = Object.size(_templateData);
- if (!templateCount)
- {
- $(document).trigger('templatesLoaded');
- return;
- }
+ if (!templateCount)
+ {
+ $(document).trigger('templatesLoaded');
+ return;
+ }
- // load markup for each template and register it
- for (var key in _templateData)
- {
- if (!_templateData.hasOwnProperty(key))
- {
- continue;
- }
+ // load markup for each template and register it
+ for (var key in _templateData)
+ {
+ if (!_templateData.hasOwnProperty(key))
+ {
+ continue;
+ }
- $.when($.ajax({
- url: _templateData[key],
- cache: false,
- dataType: 'text'
- }))
- .done(function(templateMarkup) {
+ $.when($.ajax({
+ url: _templateData[key],
+ cache: false,
+ dataType: 'text'
+ }))
+ .done(function(templateMarkup) {
- templateMarkup += '';
+ templateMarkup += '';
- try
- {
- NanoTemplate.addTemplate(key, templateMarkup);
- }
- catch(error)
- {
- alert('ERROR: An error occurred while loading the UI: ' + error.message);
- return;
- }
+ try
+ {
+ NanoTemplate.addTemplate(key, templateMarkup);
+ }
+ catch(error)
+ {
+ alert('ERROR: An error occurred while loading the UI: ' + error.message);
+ return;
+ }
- delete _templateData[key];
+ delete _templateData[key];
- loadNextTemplate();
- })
- .fail(function () {
- alert('ERROR: Loading template ' + key + '(' + _templateData[key] + ') failed!');
- });
+ loadNextTemplate();
+ })
+ .fail(function () {
+ alert('ERROR: Loading template ' + key + '(' + _templateData[key] + ') failed!');
+ });
- return;
- }
- }
+ return;
+ }
+ }
- var compileTemplates = function () {
+ var compileTemplates = function () {
- for (var key in _templates) {
- try {
- _compiledTemplates[key] = doT.template(_templates[key], null, _templates)
- }
- catch (error) {
- alert(error.message);
- }
- }
- };
+ for (var key in _templates) {
+ try {
+ _compiledTemplates[key] = doT.template(_templates[key], null, _templates)
+ }
+ catch (error) {
+ alert(error.message);
+ }
+ }
+ };
- return {
- init: function () {
- init();
- },
- addTemplate: function (key, templateString) {
- _templates[key] = templateString;
- },
- templateExists: function (key) {
- return _templates.hasOwnProperty(key);
- },
- parse: function (templateKey, data) {
- if (!_compiledTemplates.hasOwnProperty(templateKey) || !_compiledTemplates[templateKey]) {
- if (!_templates.hasOwnProperty(templateKey)) {
- alert('ERROR: Template "' + templateKey + '" does not exist in _compiledTemplates!');
- return 'Template error (does not exist)
';
- }
- compileTemplates();
- }
- if (typeof _compiledTemplates[templateKey] != 'function') {
- alert(_compiledTemplates[templateKey]);
- alert('ERROR: Template "' + templateKey + '" failed to compile!');
- return 'Template error (failed to compile)
';
- }
- return _compiledTemplates[templateKey].call(this, data['data'], data['config'], _helpers);
- },
+ return {
+ init: function () {
+ init();
+ },
+ addTemplate: function (key, templateString) {
+ _templates[key] = templateString;
+ },
+ templateExists: function (key) {
+ return _templates.hasOwnProperty(key);
+ },
+ getKeys: function () {
+ var _keys = [];
+ for(var key in _templates) {
+ _keys.push(key);
+ }
+ return _keys;
+ },
+ parse: function (templateKey, data) {
+ if (!_compiledTemplates.hasOwnProperty(templateKey) || !_compiledTemplates[templateKey]) {
+ if (!_templates.hasOwnProperty(templateKey)) {
+ alert('ERROR: Template "' + templateKey + '" does not exist in _compiledTemplates!');
+ return 'Templateerror (does not exist)
';
+ }
+ compileTemplates();
+ }
+ if (typeof _compiledTemplates[templateKey] != 'function') {
+ alert(_compiledTemplates[templateKey]);
+ alert('ERROR: Template "' + templateKey + '" failed to compile!');
+ return 'Template error (failed to compile)
';
+ }
+ return _compiledTemplates[templateKey].call(this, data['data'], data['config'], _helpers);
+ },
addHelper: function (helperName, helperFunction) {
if (!jQuery.isFunction(helperFunction)) {
alert('NanoTemplate.addHelper failed to add ' + helperName + ' as it is not a function.');
@@ -129,7 +136,7 @@ var NanoTemplate = function () {
delete _helpers[helperName];
}
}
- }
+ }
}();
diff --git a/nano/templates/crew_manifest.tmpl b/nano/templates/crew_manifest.tmpl
new file mode 100644
index 0000000000..00c45a1d5f
--- /dev/null
+++ b/nano/templates/crew_manifest.tmpl
@@ -0,0 +1,27 @@
+
+
+Crew Manifest
+
+
+{{:helper.link('Home', 'home', {'switch_tab' : 1})}}
+
+
+
+ {{for data.manifest}}
+ {{if value.elems.length}}
+ | {{:value.cat}} |
+ {{for value.elems :itemValue:itemIndex}}
+
+ | {{:itemValue.name}} |
+ {{:itemValue.rank}} |
+ {{:itemValue.active}} |
+
+ {{/for}}
+ {{/if}}
+ {{/for}}
+
+
diff --git a/nano/templates/pai_manifest.tmpl b/nano/templates/pai_manifest.tmpl
deleted file mode 100644
index ca4924d70a..0000000000
--- a/nano/templates/pai_manifest.tmpl
+++ /dev/null
@@ -1,76 +0,0 @@
-
-
-
-
- {{if data.manifest.heads.length}}
- | Command |
- {{for data.manifest["heads"]}}
- {{if value.rank == "Captain"}}
- | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
- {{else}}
- | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
- {{/if}}
- {{/for}}
- {{/if}}
- {{if data.manifest.sec.length}}
- | Security |
- {{for data.manifest["sec"]}}
- {{if value.rank == "Head of Security"}}
- | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
- {{else}}
- | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
- {{/if}}
- {{/for}}
- {{/if}}
- {{if data.manifest.eng.length}}
- | Engineering |
- {{for data.manifest["eng"]}}
- {{if value.rank == "Chief Engineer"}}
- | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
- {{else}}
- | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
- {{/if}}
- {{/for}}
- {{/if}}
- {{if data.manifest.med.length}}
- | Medical |
- {{for data.manifest["med"]}}
- {{if value.rank == "Chief Medical Officer"}}
- | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
- {{else}}
- | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
- {{/if}}
- {{/for}}
- {{/if}}
- {{if data.manifest.sci.length}}
- | Science |
- {{for data.manifest["sci"]}}
- {{if value.rank == "Research Director"}}
- | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
- {{else}}
- | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
- {{/if}}
- {{/for}}
- {{/if}}
- {{if data.manifest.civ.length}}
- | Civilian |
- {{for data.manifest["civ"]}}
- {{if value.rank == "Head of Personnel"}}
- | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
- {{else}}
- | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
- {{/if}}
- {{/for}}
- {{/if}}
- {{if data.manifest.misc.length}}
- | Misc |
- {{for data.manifest["misc"]}}
- | {{:value.name}} | {{:value.rank}} | {{:value.active}} |
- {{/for}}
- {{/if}}
-
-
diff --git a/sound/effects/footstep/snow1.ogg b/sound/effects/footstep/snow1.ogg
new file mode 100644
index 0000000000..e98e6df420
Binary files /dev/null and b/sound/effects/footstep/snow1.ogg differ
diff --git a/sound/effects/footstep/snow2.ogg b/sound/effects/footstep/snow2.ogg
new file mode 100644
index 0000000000..e4e2058e50
Binary files /dev/null and b/sound/effects/footstep/snow2.ogg differ
diff --git a/sound/effects/footstep/snow3.ogg b/sound/effects/footstep/snow3.ogg
new file mode 100644
index 0000000000..1a6e23b6c3
Binary files /dev/null and b/sound/effects/footstep/snow3.ogg differ
diff --git a/sound/effects/footstep/snow4.ogg b/sound/effects/footstep/snow4.ogg
new file mode 100644
index 0000000000..9cc98e830e
Binary files /dev/null and b/sound/effects/footstep/snow4.ogg differ
diff --git a/sound/effects/footstep/snow5.ogg b/sound/effects/footstep/snow5.ogg
new file mode 100644
index 0000000000..a3fa77173f
Binary files /dev/null and b/sound/effects/footstep/snow5.ogg differ
diff --git a/vorestation.dme b/vorestation.dme
index ac579c0790..e48f90f6f1 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -1117,7 +1117,7 @@
#include "code\game\objects\items\weapons\storage\laundry_basket.dm"
#include "code\game\objects\items\weapons\storage\lockbox.dm"
#include "code\game\objects\items\weapons\storage\misc.dm"
-#include "code\game\objects\items\weapons\storage\quickdraw_vr.dm"
+#include "code\game\objects\items\weapons\storage\quickdraw.dm"
#include "code\game\objects\items\weapons\storage\secure.dm"
#include "code\game\objects\items\weapons\storage\storage.dm"
#include "code\game\objects\items\weapons\storage\toolbox.dm"
@@ -1505,6 +1505,7 @@
#include "code\modules\clothing\head\jobs.dm"
#include "code\modules\clothing\head\misc.dm"
#include "code\modules\clothing\head\misc_special.dm"
+#include "code\modules\clothing\head\pilot_helmet.dm"
#include "code\modules\clothing\head\soft_caps.dm"
#include "code\modules\clothing\head\solgov.dm"
#include "code\modules\clothing\head\solgov_vr.dm"
@@ -1620,6 +1621,7 @@
#include "code\modules\economy\EFTPOS.dm"
#include "code\modules\economy\Events.dm"
#include "code\modules\economy\Events_Mundane.dm"
+#include "code\modules\economy\lorenews.dm"
#include "code\modules\economy\price_list.dm"
#include "code\modules\economy\retail_scanner.dm"
#include "code\modules\economy\TradeDestinations.dm"
@@ -2837,7 +2839,6 @@
#include "maps\southern_cross\items\encryptionkey_sc.dm"
#include "maps\southern_cross\items\headset_sc.dm"
#include "maps\southern_cross\items\clothing\sc_accessory.dm"
-#include "maps\southern_cross\items\clothing\sc_head.dm"
#include "maps\southern_cross\items\clothing\sc_suit.dm"
#include "maps\southern_cross\items\clothing\sc_under.dm"
#include "maps\southern_cross\job\outfits.dm"