diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm
index ef43efca6b..5bc9f8d20f 100755
--- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm
+++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm
@@ -236,8 +236,7 @@
dir = SOUTH
initialize_directions = SOUTH|NORTH|EAST
-obj/machinery/atmospherics/trinary/filter/m_filter/New()
- ..()
+obj/machinery/atmospherics/trinary/filter/m_filter/init_dir()
switch(dir)
if(NORTH)
initialize_directions = WEST|NORTH|SOUTH
diff --git a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
index 7f1c7e1e1f..e8a3c1be74 100644
--- a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
+++ b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
@@ -181,8 +181,7 @@ obj/machinery/atmospherics/trinary/mixer/t_mixer
//node 3 is the outlet, nodes 1 & 2 are intakes
-obj/machinery/atmospherics/trinary/mixer/t_mixer/New()
- ..()
+obj/machinery/atmospherics/trinary/mixer/t_mixer/init_dir()
switch(dir)
if(NORTH)
initialize_directions = EAST|NORTH|WEST
@@ -227,8 +226,7 @@ obj/machinery/atmospherics/trinary/mixer/m_mixer
//node 3 is the outlet, nodes 1 & 2 are intakes
-obj/machinery/atmospherics/trinary/mixer/m_mixer/New()
- ..()
+obj/machinery/atmospherics/trinary/mixer/m_mixer/init_dir()
switch(dir)
if(NORTH)
initialize_directions = WEST|NORTH|SOUTH
diff --git a/code/datums/supplypacks/hydroponics.dm b/code/datums/supplypacks/hydroponics.dm
index 6b737bfc57..e766129a18 100644
--- a/code/datums/supplypacks/hydroponics.dm
+++ b/code/datums/supplypacks/hydroponics.dm
@@ -113,9 +113,10 @@
/obj/item/weapon/material/hatchet = 2,
/obj/item/weapon/reagent_containers/spray/plantbgone = 4,
/obj/item/clothing/mask/gas = 2,
- /obj/item/weapon/grenade/chem_grenade/antiweed = 2
+ /obj/item/weapon/grenade/chem_grenade/antiweed = 2,
+ /obj/item/weapon/material/twohanded/fireaxe/scythe
)
- cost = 25
+ cost = 45
containertype = /obj/structure/closet/crate/hydroponics
containername = "Weed control crate"
access = access_hydroponics
diff --git a/code/game/machinery/atmoalter/meter.dm b/code/game/machinery/atmoalter/meter.dm
index 3aaeafe9d0..cb149dcc54 100644
--- a/code/game/machinery/atmoalter/meter.dm
+++ b/code/game/machinery/atmoalter/meter.dm
@@ -4,6 +4,7 @@
icon = 'icons/obj/meter.dmi'
icon_state = "meterX"
var/obj/machinery/atmospherics/pipe/target = null
+ var/list/pipes_on_turf = list()
anchored = 1.0
power_channel = ENVIRON
var/frequency = 0
@@ -13,12 +14,29 @@
/obj/machinery/meter/New()
..()
- src.target = locate(/obj/machinery/atmospherics/pipe) in loc
+ spawn(5)
+ target = select_target()
return 1
/obj/machinery/meter/initialize()
+ . = ..()
if (!target)
- src.target = locate(/obj/machinery/atmospherics/pipe) in loc
+ spawn(5)
+ target = select_target()
+
+/obj/machinery/meter/Destroy()
+ pipes_on_turf.Cut()
+ target = null
+ return ..()
+
+/obj/machinery/meter/proc/select_target()
+ var/obj/machinery/atmospherics/pipe/P
+ for(P in loc)
+ if(!P.hides_under_flooring())
+ break
+ if(!P)
+ P = locate(/obj/machinery/atmospherics/pipe) in loc
+ return P
/obj/machinery/meter/process()
if(!target)
@@ -93,30 +111,36 @@
return ..()
-/obj/machinery/meter/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
- if (!istype(W, /obj/item/weapon/wrench))
- return ..()
- playsound(src, W.usesound, 50, 1)
- user << "You begin to unfasten \the [src]..."
- if (do_after(user, 40 * W.toolspeed))
- user.visible_message( \
- "\The [user] unfastens \the [src].", \
- "You have unfastened \the [src].", \
- "You hear ratchet.")
- new /obj/item/pipe_meter(src.loc)
- qdel(src)
+/obj/machinery/meter/attackby(var/obj/item/W, var/mob/user)
+ if(iswrench(W))
+ playsound(src, W.usesound, 50, 1)
+ to_chat(user, "You begin to unfasten \the [src]...")
+ if(do_after(user, 40 * W.toolspeed))
+ user.visible_message( \
+ "\The [user] unfastens \the [src].", \
+ "You have unfastened \the [src].", \
+ "You hear ratchet.")
+ new /obj/item/pipe_meter(get_turf(src))
+ qdel(src)
+ return
+
+ if(ismultitool(W))
+ for(var/obj/machinery/atmospherics/pipe/P in loc)
+ pipes_on_turf |= P
+ if(!pipes_on_turf.len)
+ return
+ target = pipes_on_turf[1]
+ pipes_on_turf.Remove(target)
+ pipes_on_turf.Add(target)
+ to_chat(user, "Pipe meter set to moniter \the [target].")
+ return
+
+ return ..()
// TURF METER - REPORTS A TILE'S AIR CONTENTS
-/obj/machinery/meter/turf/New()
- ..()
- src.target = loc
- return 1
-
-
-/obj/machinery/meter/turf/initialize()
- if (!target)
- src.target = loc
+/obj/machinery/meter/turf/select_target()
+ return loc
/obj/machinery/meter/turf/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
return
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index b6945b2c07..6fd9cf0f4e 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -94,6 +94,10 @@
else
return 0
+ for(var/modifier_type in R.genetic_modifiers) //Can't be cloned, even if they had a previous scan
+ if(istype(modifier_type, /datum/modifier/no_clone))
+ return 0
+
attempting = 1 //One at a time!!
locked = 1
@@ -149,7 +153,7 @@
modifier_lower_bound = round(modifier_lower_bound * clone_sickness_length, 1)
modifier_upper_bound = round(modifier_upper_bound * clone_sickness_length, 1)
- H.add_modifier(/datum/modifier/recently_cloned, rand(modifier_lower_bound, modifier_upper_bound))
+ H.add_modifier(/datum/modifier/cloning_sickness, rand(modifier_lower_bound, modifier_upper_bound))
// Modifier that doesn't do anything.
H.add_modifier(/datum/modifier/cloned)
@@ -516,32 +520,4 @@
/* EMP grenade/spell effect
if(istype(A, /obj/machinery/clonepod))
A:malfunction()
-*/
-
-/*
- * Modifier applied to newly cloned people.
- */
-
-// Gives rather nasty downsides for awhile, making them less robust.
-/datum/modifier/recently_cloned
- name = "recently cloned"
- desc = "You feel rather weak, having been cloned awhile ago."
-
- on_created_text = "You feel really weak."
- on_expired_text = "You feel your strength returning to you."
-
- max_health_percent = 0.6 // -40% max health.
- incoming_damage_percent = 1.1 // 10% more incoming damage.
- outgoing_melee_damage_percent = 0.7 // 30% less melee damage.
- disable_duration_percent = 1.25 // Stuns last 25% longer.
- slowdown = 1 // Slower.
- evasion = -1 // 15% easier to hit.
-
-// Does nothing.
-/datum/modifier/cloned
- name = "cloned"
- desc = "You died and were cloned, and you can never forget that."
-
- flags = MODIFIER_GENETIC // So it gets copied if they die and get cloned again.
- stacks = MODIFIER_STACK_ALLOWED // Two deaths means two instances of this.
-
+*/
\ No newline at end of file
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index 668520eee5..0bd354b541 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -316,6 +316,10 @@
if (subject.species && subject.species.flags & NO_SCAN)
scantemp = "Error: Mental interface failure."
return
+ for(var/modifier_type in subject.modifiers) //Can't be cloned, even if they had a previous scan
+ if(istype(modifier_type, /datum/modifier/no_clone))
+ scantemp = "Error: Mental interface failure."
+ return
if (!isnull(find_record(subject.ckey)))
scantemp = "Subject already in database."
return
diff --git a/code/game/machinery/computer/guestpass.dm b/code/game/machinery/computer/guestpass.dm
index b01b03f9b3..501bf91071 100644
--- a/code/game/machinery/computer/guestpass.dm
+++ b/code/game/machinery/computer/guestpass.dm
@@ -9,6 +9,7 @@
var/temp_access = list() //to prevent agent cards stealing access as permanent
var/expiration_time = 0
+ var/expired = 0
var/reason = "NOT SPECIFIED"
/obj/item/weapon/card/id/guest/GetAccess()
@@ -38,6 +39,38 @@
usr << "Issuing reason: [reason]."
return
+/obj/item/weapon/card/id/guest/attack_self(mob/living/user as mob)
+ if(user.a_intent == I_HURT)
+ if(icon_state == "guest_invalid")
+ to_chat(user, "This guest pass is already deactivated!")
+ return
+
+ var/confirm = alert("Do you really want to deactivate this guest pass? (you can't reactivate it)", "Confirm Deactivation", "Yes", "No")
+ if(confirm == "Yes")
+ //rip guest pass 3
+ user.visible_message("\The [user] deactivates \the [src].")
+ icon_state = "guest_invalid"
+ expiration_time = world.time
+ expired = 1
+ return ..()
+
+/obj/item/weapon/card/id/guest/New()
+ ..()
+ processing_objects.Add(src)
+ update_icon()
+
+/obj/item/weapon/card/id/guest/Destroy()
+ processing_objects.Remove(src)
+ return ..()
+
+/obj/item/weapon/card/id/guest/process()
+ if(expired == 0 && world.time >= expiration_time)
+ visible_message("\The [src] flashes a few times before turning red.")
+ icon_state = "guest_invalid"
+ expired = 1
+ world.time = expiration_time
+ return
+
/////////////////////////////////////////////
//Guest pass terminal////////////////////////
/////////////////////////////////////////////
diff --git a/code/game/mecha/combat/combat.dm b/code/game/mecha/combat/combat.dm
index 5424882adc..77087ed32f 100644
--- a/code/game/mecha/combat/combat.dm
+++ b/code/game/mecha/combat/combat.dm
@@ -2,7 +2,7 @@
force = 30
var/melee_cooldown = 10
var/melee_can_hit = 1
- var/list/destroyable_obj = list(/obj/mecha, /obj/structure/window, /obj/structure/grille, /turf/simulated/wall)
+ var/list/destroyable_obj = list(/obj/mecha, /obj/structure/window, /obj/structure/grille, /turf/simulated/wall, /obj/structure/girder)
internal_damage_threshold = 50
maint_access = 0
//add_req_access = 0
@@ -25,7 +25,7 @@
if(!melee_can_hit || !istype(target, /atom)) return
if(istype(target, /mob/living))
var/mob/living/M = target
- if(src.occupant.a_intent == I_HURT)
+ if(src.occupant.a_intent == I_HURT || istype(src.occupant, /mob/living/carbon/brain)) //Brains cannot change intents; Exo-piloting brains lack any form of physical feedback for control, limiting the ability to 'play nice'.
playsound(src, 'sound/weapons/punch4.ogg', 50, 1)
if(damtype == "brute")
step_away(M,src,15)
@@ -95,14 +95,19 @@
if(istype(target, target_type) && hascall(target, "attackby"))
src.occupant_message("You hit [target].")
src.visible_message("[src.name] hits [target]")
- if(!istype(target, /turf/simulated/wall))
+ if(!istype(target, /turf/simulated/wall) && !istype(target, /obj/structure/girder))
target:attackby(src,src.occupant)
else if(prob(5))
target:dismantle_wall(1)
src.occupant_message("You smash through the wall.")
src.visible_message("[src.name] smashes through the wall")
playsound(src, 'sound/weapons/smash.ogg', 50, 1)
+ else if(istype(target, /turf/simulated/wall))
+ target:take_damage(force)
+ else if(istype(target, /obj/structure/girder))
+ target:take_damage(force * 3) //Girders have 200 health by default. Steel, non-reinforced walls take four punches, girders take (with this value-mod) two, girders took five without.
melee_can_hit = 0
+
if(do_after(melee_cooldown))
melee_can_hit = 1
break
@@ -244,6 +249,14 @@
else
return 0
+/obj/mecha/combat/mmi_moved_inside(var/obj/item/device/mmi/mmi_as_oc as obj,mob/user as mob)
+ if(..())
+ if(occupant.client)
+ occupant.client.mouse_pointer_icon = file("icons/mecha/mecha_mouse.dmi")
+ return 1
+ else
+ return 0
+
/obj/mecha/combat/go_out()
if(src.occupant && src.occupant.client)
src.occupant.client.mouse_pointer_icon = initial(src.occupant.client.mouse_pointer_icon)
diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm
index a1cbba3102..f3df144ea7 100644
--- a/code/game/mecha/equipment/tools/tools.dm
+++ b/code/game/mecha/equipment/tools/tools.dm
@@ -52,7 +52,7 @@
else if(istype(target,/mob/living))
var/mob/living/M = target
if(M.stat>1) return
- if(chassis.occupant.a_intent == I_HURT)
+ if(chassis.occupant.a_intent == I_HURT || istype(chassis.occupant,/mob/living/carbon/brain)) //No tactile feedback for brains
M.take_overall_damage(dam_force)
M.adjustOxyLoss(round(dam_force/2))
M.updatehealth()
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index dd3940d421..56149a254c 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -344,8 +344,11 @@
/obj/mecha/relaymove(mob/user,direction)
if(user != src.occupant) //While not "realistic", this piece is player friendly.
+ if(istype(user,/mob/living/carbon/brain))
+ to_chat(user,"You try to move, but you are not the pilot! The exosuit doesn't respond.")
+ return 0
user.forceMove(get_turf(src))
- user << "You climb out from [src]"
+ to_chat(user,"You climb out from [src]")
return 0
if(connected_port)
if(world.time - last_message > 20)
@@ -686,6 +689,13 @@
/obj/mecha/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(istype(W, /obj/item/device/mmi))
+ if(mmi_move_inside(W,user))
+ to_chat(user,"[src]-MMI interface initialized successfuly")
+ else
+ to_chat(user,"[src]-MMI interface initialization failed.")
+ return
+
if(istype(W, /obj/item/mecha_parts/mecha_equipment))
var/obj/item/mecha_parts/mecha_equipment/E = W
spawn()
@@ -829,6 +839,70 @@
return
*/
+///////////////////////////////
+//////// Brain Stuff ////////
+///////////////////////////////
+
+/obj/mecha/proc/mmi_move_inside(var/obj/item/device/mmi/mmi_as_oc as obj,mob/user as mob)
+ if(!mmi_as_oc.brainmob || !mmi_as_oc.brainmob.client)
+ to_chat(user,"Consciousness matrix not detected.")
+ return 0
+ else if(mmi_as_oc.brainmob.stat)
+ to_chat(user,"Brain activity below acceptable level.")
+ return 0
+ else if(occupant)
+ to_chat(user,"Occupant detected.")
+ return 0
+ else if(dna && dna!=mmi_as_oc.brainmob.dna.unique_enzymes)
+ to_chat(user,"Genetic sequence or serial number incompatible with locking mechanism.")
+ return 0
+ //Added a message here since people assume their first click failed or something./N
+// user << "Installing MMI, please stand by."
+
+ visible_message("[usr] starts to insert a brain into [src.name]")
+
+ if(enter_after(40,user))
+ if(!occupant)
+ return mmi_moved_inside(mmi_as_oc,user)
+ else
+ to_chat(user,"Occupant detected.")
+ else
+ to_chat(user,"You stop attempting to install the brain.")
+ return 0
+
+/obj/mecha/proc/mmi_moved_inside(var/obj/item/device/mmi/mmi_as_oc as obj,mob/user as mob)
+ if(mmi_as_oc && user in range(1))
+ if(!mmi_as_oc.brainmob || !mmi_as_oc.brainmob.client)
+ to_chat(user,"Consciousness matrix not detected.")
+ return 0
+ else if(mmi_as_oc.brainmob.stat)
+ to_chat(user,"Beta-rhythm below acceptable level.")
+ return 0
+ user.drop_from_inventory(mmi_as_oc)
+ var/mob/brainmob = mmi_as_oc.brainmob
+ brainmob.reset_view(src)
+ /*
+ brainmob.client.eye = src
+ brainmob.client.perspective = EYE_PERSPECTIVE
+ */
+ occupant = brainmob
+ brainmob.loc = src //should allow relaymove
+ brainmob.canmove = 1
+ mmi_as_oc.loc = src
+ mmi_as_oc.mecha = src
+ src.verbs += /obj/mecha/verb/eject
+ src.Entered(mmi_as_oc)
+ src.Move(src.loc)
+ src.icon_state = src.reset_icon()
+ set_dir(dir_in)
+ src.log_message("[mmi_as_oc] moved in as pilot.")
+ if(!hasInternalDamage())
+ src.occupant << sound('sound/mecha/nominal.ogg',volume=50)
+ return 1
+ else
+ return 0
+
+
/////////////////////////////////////
//////// Atmospheric stuff ////////
/////////////////////////////////////
@@ -1044,6 +1118,7 @@
src.occupant = H
src.add_fingerprint(H)
src.forceMove(src.loc)
+ src.verbs += /obj/mecha/verb/eject
src.log_append_to_last("[H] moved in as pilot.")
src.icon_state = src.reset_icon()
set_dir(dir_in)
@@ -1132,10 +1207,10 @@
occupant.loc = mmi
mmi.mecha = null
src.occupant.canmove = 0
- src.verbs += /obj/mecha/verb/eject
src.occupant = null
src.icon_state = src.reset_icon()+"-open"
src.set_dir(dir_in)
+ src.verbs -= /obj/mecha/verb/eject
return
/////////////////////////
diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm
index e4df02202f..94c0a7999f 100644
--- a/code/game/objects/effects/spiders.dm
+++ b/code/game/objects/effects/spiders.dm
@@ -79,6 +79,7 @@
var/amount_grown = 0
var/spiders_min = 6
var/spiders_max = 24
+ var/spider_type = /obj/effect/spider/spiderling
New()
pixel_x = rand(3,-3)
pixel_y = rand(3,-3)
@@ -105,7 +106,7 @@
O = loc
for(var/i=0, i 0))
+ icon_state = "rods-[amount]"
+ else
+ icon_state = "rods"
var/global/list/datum/stack_recipe/rods_recipes = list( \
new/datum/stack_recipe("grille", /obj/structure/grille, 2, time = 10, one_per_turf = 1, on_floor = 1),
diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm
index 96b35e13e7..8ece302f13 100644
--- a/code/game/objects/items/stacks/sheets/leather.dm
+++ b/code/game/objects/items/stacks/sheets/leather.dm
@@ -3,6 +3,7 @@
desc = "The by-product of human farming."
singular_name = "human skin piece"
icon_state = "sheet-hide"
+ no_variants = FALSE
/obj/item/stack/material/animalhide/human
amount = 50
@@ -80,6 +81,7 @@
desc = "This hide was stripped of it's hair, but still needs tanning."
singular_name = "hairless hide piece"
icon_state = "sheet-hairlesshide"
+ no_variants = FALSE
/obj/item/stack/material/hairlesshide
amount = 50
@@ -91,6 +93,7 @@
icon_state = "sheet-wetleather"
var/wetness = 30 //Reduced when exposed to high temperautres
var/drying_threshold_temperature = 500 //Kelvin to start drying
+ no_variants = FALSE
/obj/item/stack/material/wetleather
amount = 50
diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm
index ee1cc1b078..c5be255204 100644
--- a/code/game/objects/items/stacks/stack.dm
+++ b/code/game/objects/items/stacks/stack.dm
@@ -12,6 +12,7 @@
/obj/item/stack
gender = PLURAL
origin_tech = list(TECH_MATERIAL = 1)
+ icon = 'icons/obj/stacks.dmi'
var/list/datum/stack_recipe/recipes
var/singular_name
var/amount = 1
@@ -21,6 +22,7 @@
var/uses_charge = 0
var/list/charge_costs = null
var/list/datum/matter_synth/synths = null
+ var/no_variants = TRUE // Determines whether the item should update it's sprites based on amount.
/obj/item/stack/New(var/loc, var/amount=null)
..()
@@ -28,6 +30,7 @@
stacktype = type
if (amount)
src.amount = amount
+ update_icon()
return
/obj/item/stack/Destroy()
@@ -37,6 +40,18 @@
usr << browse(null, "window=stack")
return ..()
+/obj/item/stack/update_icon()
+ if(no_variants)
+ icon_state = initial(icon_state)
+ else
+ if(amount <= (max_amount * (1/3)))
+ icon_state = initial(icon_state)
+ else if (amount <= (max_amount * (2/3)))
+ icon_state = "[initial(icon_state)]_2"
+ else
+ icon_state = "[initial(icon_state)]_3"
+ item_state = initial(icon_state)
+
/obj/item/stack/examine(mob/user)
if(..(user, 1))
if(!uses_charge)
@@ -189,6 +204,7 @@
if(usr)
usr.remove_from_mob(src)
qdel(src) //should be safe to qdel immediately since if someone is still using this stack it will persist for a little while longer
+ update_icon()
return 1
else
if(get_amount() < used)
@@ -205,6 +221,7 @@
return 0
else
amount += extra
+ update_icon()
return 1
else if(!synths || synths.len < uses_charge)
return 0
@@ -298,7 +315,7 @@
/obj/item/stack/attack_hand(mob/user as mob)
if (user.get_inactive_hand() == src)
- var/N = input("How many stacks of [src] would you like to split off?", "Split stacks", 1) as num|null
+ var/N = input("How many stacks of [src] would you like to split off? There are currently [amount].", "Split stacks", 1) as num|null
if(N)
var/obj/item/stack/F = src.split(N)
if (F)
diff --git a/code/game/objects/items/stacks/tiles/fifty_spawner_tiles.dm b/code/game/objects/items/stacks/tiles/fifty_spawner_tiles.dm
index 09df497d8d..3d89b5e786 100644
--- a/code/game/objects/items/stacks/tiles/fifty_spawner_tiles.dm
+++ b/code/game/objects/items/stacks/tiles/fifty_spawner_tiles.dm
@@ -2,48 +2,48 @@
/obj/fiftyspawner/grass
name = "stack of grass"
- material = "tile/grass"
+ type_to_spawn = /obj/item/stack/tile/grass
/obj/fiftyspawner/wood
name = "stack of wood"
- material = "tile/wood"
+ type_to_spawn = /obj/item/stack/tile/wood
/obj/fiftyspawner/carpet
name = "stack of carpet"
- material = "tile/carpet"
+ type_to_spawn = /obj/item/stack/tile/carpet
/obj/fiftyspawner/bluecarpet
name = "stack of blue carpet"
- material = "tile/carpet/blue"
+ type_to_spawn = /obj/item/stack/tile/carpet/blue
/obj/fiftyspawner/floor
name = "stack of floor tiles"
- material = "tile/floor"
+ type_to_spawn = /obj/item/stack/tile/floor
/obj/fiftyspawner/floor_red
name = "stack of red floor tiles"
- material = "tile/floor_red"
+ type_to_spawn = /obj/item/stack/tile/floor/red
/obj/fiftyspawner/floor_steel
name = "stack of steel floor tiles"
- material = "tile/floor_steel"
+ type_to_spawn = /obj/item/stack/tile/floor/steel
/obj/fiftyspawner/floor_white
name = "stack of white floor tiles"
- material = "tile/floor_white"
+ type_to_spawn = /obj/item/stack/tile/floor/white
/obj/fiftyspawner/floor_yellow
name = "stack of yellow floor tiles"
- material = "tile/floor_yellow"
+ type_to_spawn = /obj/item/stack/tile/floor/yellow
/obj/fiftyspawner/floor_dark
name = "stack of dark floor tiles"
- material = "tile/floor_dark"
+ type_to_spawn = /obj/item/stack/tile/floor/dark
/obj/fiftyspawner/floor_freezer
name = "stack of freezer tiles"
- material = "tile/floor_freezer"
+ type_to_spawn = /obj/item/stack/tile/floor/freezer
/obj/fiftyspawner/linoleum
name = "stack of linoleum tiles"
- material = "tile/linoleum"
\ No newline at end of file
+ type_to_spawn = /obj/item/stack/tile/linoleum
\ No newline at end of file
diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm
index a670d7dd27..888af9124b 100644
--- a/code/game/objects/items/stacks/tiles/tile_types.dm
+++ b/code/game/objects/items/stacks/tiles/tile_types.dm
@@ -36,6 +36,7 @@
throw_range = 20
flags = 0
origin_tech = list(TECH_BIO = 1)
+ no_variants = FALSE
/obj/item/stack/tile/grass/fifty
amount = 50
@@ -52,6 +53,7 @@
throw_speed = 5
throw_range = 20
flags = 0
+ no_variants = FALSE
/obj/item/stack/tile/wood/fifty
amount = 50
@@ -77,12 +79,14 @@
throw_speed = 5
throw_range = 20
flags = 0
+ no_variants = FALSE
/obj/item/stack/tile/carpet/blue
name = "blue carpet"
singular_name = "blue carpet"
desc = "A piece of blue carpet. It is the same size as a normal floor tile!"
icon_state = "tile-bluecarpet"
+ no_variants = FALSE
// TODO - Add descriptions to these
/obj/item/stack/tile/carpet/bcarpet
@@ -111,29 +115,34 @@
throw_speed = 5
throw_range = 20
flags = CONDUCT
+ no_variants = FALSE
/obj/item/stack/tile/floor/red
name = "red floor tile"
singular_name = "red floor tile"
color = COLOR_RED_GRAY
icon_state = "tile_white"
+ no_variants = FALSE
// VOREStation Edit
/obj/item/stack/tile/floor/techgrey
name = "grey techfloor tile"
singular_name = "grey techfloor tile"
icon_state = "techtile_grey"
+ no_variants = FALSE
/obj/item/stack/tile/floor/techgrid
name = "grid techfloor tile"
singular_name = "grid techfloor tile"
icon_state = "techtile_grid"
+ no_variants = FALSE
/obj/item/stack/tile/floor/steel_dirty
name = "steel floor tile"
singular_name = "steel floor tile"
icon_state = "tile_steel"
matter = list("plasteel" = SHEET_MATERIAL_AMOUNT / 4)
+ no_variants = FALSE
// VOREStation Edit End
/obj/item/stack/tile/floor/steel
@@ -141,30 +150,35 @@
singular_name = "steel floor tile"
icon_state = "tile_steel"
matter = list("plasteel" = SHEET_MATERIAL_AMOUNT / 4)
+ no_variants = FALSE
/obj/item/stack/tile/floor/white
name = "white floor tile"
singular_name = "white floor tile"
icon_state = "tile_white"
matter = list("plastic" = SHEET_MATERIAL_AMOUNT / 4)
+ no_variants = FALSE
/obj/item/stack/tile/floor/yellow
name = "yellow floor tile"
singular_name = "yellow floor tile"
color = COLOR_BROWN
icon_state = "tile_white"
+ no_variants = FALSE
/obj/item/stack/tile/floor/dark
name = "dark floor tile"
singular_name = "dark floor tile"
- icon_state = "fr_tile"
+ icon_state = "tile_steel"
matter = list("plasteel" = SHEET_MATERIAL_AMOUNT / 4)
+ no_variants = FALSE
/obj/item/stack/tile/floor/freezer
name = "freezer floor tile"
singular_name = "freezer floor tile"
icon_state = "tile_freezer"
matter = list("plastic" = SHEET_MATERIAL_AMOUNT / 4)
+ no_variants = FALSE
/obj/item/stack/tile/floor/cyborg
name = "floor tile synthesizer"
@@ -186,3 +200,4 @@
throw_speed = 5
throw_range = 20
flags = 0
+ no_variants = FALSE
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 385351da97..2c27e35010 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -287,6 +287,7 @@
desc = "Woefully underpowered in D20."
icon = 'icons/obj/weapons.dmi'
icon_state = "katana"
+ item_state = "katana"
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_material.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_material.dmi',
@@ -697,19 +698,6 @@
desc = "A \"Space Life\" brand Emergency Response Team Commander action figure."
icon_state = "ert"
-/obj/item/toy/katana
- name = "replica katana"
- desc = "Woefully underpowered in D20."
- icon = 'icons/obj/weapons.dmi'
- icon_state = "katana"
- item_state = "katana"
- flags = CONDUCT
- slot_flags = SLOT_BELT | SLOT_BACK
- force = 5
- throwforce = 5
- w_class = ITEMSIZE_NORMAL
- attack_verb = list("attacked", "slashed", "stabbed", "sliced")
-
/obj/item/toy/therapy_red
name = "red therapy doll"
desc = "A toy for therapeutic and recreational purposes. This one is red."
@@ -898,4 +886,4 @@
icon_state = "tinyxmastree"
w_class = ITEMSIZE_TINY
force = 1
- throwforce = 1
\ No newline at end of file
+ throwforce = 1
diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/game/objects/items/weapons/implants/implanter.dm
index 4cb92a0780..dd2843571f 100644
--- a/code/game/objects/items/weapons/implants/implanter.dm
+++ b/code/game/objects/items/weapons/implants/implanter.dm
@@ -8,16 +8,27 @@
w_class = ITEMSIZE_SMALL
matter = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 1000)
var/obj/item/weapon/implant/imp = null
+ var/active = 1
/obj/item/weapon/implanter/attack_self(var/mob/user)
+ active = !active
+ to_chat(user, "You [active ? "" : "de"]activate \the [src].")
+ update()
+
+/obj/item/weapon/implanter/verb/remove_implant(var/mob/user)
+ set category = "Object"
+ set name = "Remove Implant"
+ set src in usr
+
if(!imp)
- return ..()
+ return
imp.loc = get_turf(src)
user.put_in_hands(imp)
- user << "You remove \the [imp] from \the [src]."
+ to_chat(user, "You remove \the [imp] from \the [src].")
name = "implanter"
imp = null
update()
+
return
/obj/item/weapon/implanter/proc/update()
@@ -25,39 +36,42 @@
src.icon_state = "implanter1"
else
src.icon_state = "implanter0"
+ src.icon_state += "_[active]"
return
/obj/item/weapon/implanter/attack(mob/M as mob, mob/user as mob)
if (!istype(M, /mob/living/carbon))
return
- if (user && src.imp)
- M.visible_message("[user] is attemping to implant [M].")
+ if(active)
+ if (imp)
+ M.visible_message("[user] is attemping to implant [M].")
- user.setClickCooldown(DEFAULT_QUICK_COOLDOWN)
- user.do_attack_animation(M)
+ user.setClickCooldown(DEFAULT_QUICK_COOLDOWN)
+ user.do_attack_animation(M)
- var/turf/T1 = get_turf(M)
- if (T1 && ((M == user) || do_after(user, 50)))
- if(user && M && (get_turf(M) == T1) && src && src.imp)
- M.visible_message("[M] has been implanted by [user].")
+ var/turf/T1 = get_turf(M)
+ if (T1 && ((M == user) || do_after(user, 50)))
+ if(user && M && (get_turf(M) == T1) && src && src.imp)
+ M.visible_message("[M] has been implanted by [user].")
- admin_attack_log(user, M, "Implanted using \the [src.name] ([src.imp.name])", "Implanted with \the [src.name] ([src.imp.name])", "used an implanter, [src.name] ([src.imp.name]), on")
+ admin_attack_log(user, M, "Implanted using \the [src.name] ([src.imp.name])", "Implanted with \the [src.name] ([src.imp.name])", "used an implanter, [src.name] ([src.imp.name]), on")
- if(src.imp.implanted(M))
- src.imp.loc = M
- src.imp.imp_in = M
- src.imp.implanted = 1
- if (ishuman(M))
- var/mob/living/carbon/human/H = M
- var/obj/item/organ/external/affected = H.get_organ(user.zone_sel.selecting)
- affected.implants += src.imp
- imp.part = affected
+ if(src.imp.implanted(M))
+ src.imp.loc = M
+ src.imp.imp_in = M
+ src.imp.implanted = 1
+ if (ishuman(M))
+ var/mob/living/carbon/human/H = M
+ var/obj/item/organ/external/affected = H.get_organ(user.zone_sel.selecting)
+ affected.implants += src.imp
+ imp.part = affected
- BITSET(H.hud_updateflag, IMPLOYAL_HUD)
-
- src.imp = null
- update()
+ BITSET(H.hud_updateflag, IMPLOYAL_HUD)
+ src.imp = null
+ update()
+ else
+ to_chat(user, "You need to activate \the [src.name] first.")
return
/obj/item/weapon/implanter/loyalty
@@ -112,19 +126,26 @@
var/obj/item/weapon/implant/compressed/c = imp
if (!c) return
if (c.scanned == null)
- user << "Please scan an object with the implanter first."
+ to_chat(user, "Please scan an object with the implanter first.")
return
..()
/obj/item/weapon/implanter/compressed/afterattack(atom/A, mob/user as mob, proximity)
if(!proximity)
return
+ if(!active)
+ to_chat(user, "Activate \the [src.name] first.")
+ return
if(istype(A,/obj/item) && imp)
var/obj/item/weapon/implant/compressed/c = imp
if (c.scanned)
- user << "Something is already scanned inside the implant!"
+ to_chat(user, "Something is already scanned inside the implant!")
return
c.scanned = A
+ if(istype(A, /obj/item/weapon/storage))
+ to_chat(user, "You can't store \the [A.name] in this!")
+ c.scanned = null
+ return
if(istype(A.loc,/mob/living/carbon/human))
var/mob/living/carbon/human/H = A.loc
H.remove_from_mob(A)
diff --git a/code/game/objects/items/weapons/material/misc.dm b/code/game/objects/items/weapons/material/misc.dm
index 2d85bc0a66..9d8792dab4 100644
--- a/code/game/objects/items/weapons/material/misc.dm
+++ b/code/game/objects/items/weapons/material/misc.dm
@@ -85,19 +85,4 @@
thrown_force_divisor = 0.25 // as above
dulled_divisor = 0.75 //Still metal on a long pole
w_class = ITEMSIZE_SMALL
- attack_verb = list("slashed", "sliced", "cut", "clawed")
-
-/obj/item/weapon/material/scythe
- icon_state = "scythe0"
- name = "scythe"
- desc = "A sharp and curved blade on a long fibremetal handle, this tool makes it easy to reap what you sow."
- force_divisor = 0.275 // 16 with hardness 60 (steel)
- thrown_force_divisor = 0.25 // 5 with weight 20 (steel)
- sharp = 1
- edge = 1
- throw_speed = 1
- throw_range = 3
- w_class = ITEMSIZE_LARGE
- slot_flags = SLOT_BACK
- origin_tech = list(TECH_MATERIAL = 2, TECH_COMBAT = 2)
- attack_verb = list("chopped", "sliced", "cut", "reaped")
+ attack_verb = list("slashed", "sliced", "cut", "clawed")
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/material/twohanded.dm b/code/game/objects/items/weapons/material/twohanded.dm
index 5cb404a2b8..8f329c6dec 100644
--- a/code/game/objects/items/weapons/material/twohanded.dm
+++ b/code/game/objects/items/weapons/material/twohanded.dm
@@ -123,6 +123,15 @@
var/obj/effect/plant/P = A
P.die_off()
+/obj/item/weapon/material/twohanded/fireaxe/scythe
+ icon_state = "scythe0"
+ base_icon = "scythe"
+ name = "scythe"
+ desc = "A sharp and curved blade on a long fibremetal handle, this tool makes it easy to reap what you sow."
+ force_divisor = 0.65
+ origin_tech = list(TECH_MATERIAL = 2, TECH_COMBAT = 2)
+ attack_verb = list("chopped", "sliced", "cut", "reaped")
+
//spears, bay edition
/obj/item/weapon/material/twohanded/spear
icon_state = "spearglass0"
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index 14a724e029..37aeef7fd9 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -125,6 +125,12 @@
else
return ..()
+/obj/structure/girder/proc/take_damage(var/damage)
+ health -= damage
+
+ if(health <= 0)
+ dismantle()
+
/obj/structure/girder/proc/construct_wall(obj/item/stack/material/S, mob/user)
var/amount_to_use = reinf_material ? 1 : 2
if(S.get_amount() < amount_to_use)
diff --git a/code/modules/clothing/suits/alien.dm b/code/modules/clothing/suits/alien.dm
deleted file mode 100644
index ff8255f188..0000000000
--- a/code/modules/clothing/suits/alien.dm
+++ /dev/null
@@ -1,28 +0,0 @@
-//Unathi clothing.
-/obj/item/clothing/suit/unathi/robe
- name = "roughspun robes"
- desc = "A traditional Unathi garment."
- icon_state = "robe-unathi"
- body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS
- flags_inv = HIDETIE|HIDEHOLSTER
-
-/obj/item/clothing/suit/unathi/mantle
- name = "hide mantle"
- desc = "A rather grisly selection of cured hides and skin, sewn together to form a ragged mantle."
- icon_state = "mantle-unathi"
- body_parts_covered = UPPER_TORSO
-
-//Taj clothing.
-/obj/item/clothing/suit/tajaran/furs
- name = "heavy furs"
- desc = "A traditional Zhan-Khazan garment."
- icon_state = "zhan_furs"
- body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS
- flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER
-
-/obj/item/clothing/head/tajaran/scarf
- name = "headscarf"
- desc = "A scarf of coarse fabric. Seems to have ear-holes."
- icon_state = "zhan_scarf"
- item_state_slots = list(slot_r_hand_str = "beret_white", slot_l_hand_str = "beret_white")
- body_parts_covered = HEAD|FACE
\ No newline at end of file
diff --git a/code/modules/clothing/suits/xenos/seromi.dm b/code/modules/clothing/suits/aliens/seromi.dm
similarity index 100%
rename from code/modules/clothing/suits/xenos/seromi.dm
rename to code/modules/clothing/suits/aliens/seromi.dm
diff --git a/code/modules/clothing/suits/aliens/tajara.dm b/code/modules/clothing/suits/aliens/tajara.dm
new file mode 100644
index 0000000000..3c3b0bb55d
--- /dev/null
+++ b/code/modules/clothing/suits/aliens/tajara.dm
@@ -0,0 +1,13 @@
+/obj/item/clothing/suit/tajaran/furs
+ name = "heavy furs"
+ desc = "A traditional Zhan-Khazan garment."
+ icon_state = "zhan_furs"
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS
+ flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER
+
+/obj/item/clothing/head/tajaran/scarf //This stays in /suits because it goes with the furs above
+ name = "headscarf"
+ desc = "A scarf of coarse fabric. Seems to have ear-holes."
+ icon_state = "zhan_scarf"
+ item_state_slots = list(slot_r_hand_str = "beret_white", slot_l_hand_str = "beret_white")
+ body_parts_covered = HEAD|FACE
\ No newline at end of file
diff --git a/code/modules/clothing/suits/aliens/unathi.dm b/code/modules/clothing/suits/aliens/unathi.dm
new file mode 100644
index 0000000000..0c49ab3d25
--- /dev/null
+++ b/code/modules/clothing/suits/aliens/unathi.dm
@@ -0,0 +1,13 @@
+//Unathi clothing.
+/obj/item/clothing/suit/unathi/robe
+ name = "roughspun robes"
+ desc = "A traditional Unathi garment."
+ icon_state = "robe-unathi"
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS
+ flags_inv = HIDETIE|HIDEHOLSTER
+
+/obj/item/clothing/suit/unathi/mantle
+ name = "hide mantle"
+ desc = "A rather grisly selection of cured hides and skin, sewn together to form a ragged mantle."
+ icon_state = "mantle-unathi"
+ body_parts_covered = UPPER_TORSO
\ No newline at end of file
diff --git a/code/modules/clothing/suits/aliens/vox.dm b/code/modules/clothing/suits/aliens/vox.dm
new file mode 100644
index 0000000000..823487d212
--- /dev/null
+++ b/code/modules/clothing/suits/aliens/vox.dm
@@ -0,0 +1,10 @@
+/obj/item/clothing/suit/armor/vox_scrap
+ name = "rusted metal armor"
+ desc = "A hodgepodge of various pieces of metal scrapped together into a rudimentary vox-shaped piece of armor."
+ allowed = list(/obj/item/weapon/gun, /obj/item/weapon/tank)
+ armor = list(melee = 70, bullet = 30, laser = 20,energy = 5, bomb = 40, bio = 0, rad = 0) //Higher melee armor versus lower everything else.
+ icon_state = "vox-scrap"
+ icon_state = "vox-scrap"
+ body_parts_covered = UPPER_TORSO|ARMS|LOWER_TORSO|LEGS
+ species_restricted = list("Vox")
+ siemens_coefficient = 1 //Its literally metal
\ No newline at end of file
diff --git a/code/modules/clothing/under/accessories/holster.dm b/code/modules/clothing/under/accessories/holster.dm
index 5d734c9d95..b97ae6fc3f 100644
--- a/code/modules/clothing/under/accessories/holster.dm
+++ b/code/modules/clothing/under/accessories/holster.dm
@@ -134,6 +134,6 @@
/obj/item/clothing/accessory/holster/leg
name = "leg holster"
desc = "A tacticool handgun holster. Worn on the upper leg."
- icon_state = "holster_hip"
+ icon_state = "holster_leg"
overlay_state = "holster_leg"
- concealed_holster = 0
\ No newline at end of file
+ concealed_holster = 0
diff --git a/code/modules/examine/descriptions/atmospherics.dm b/code/modules/examine/descriptions/atmospherics.dm
index ad17f989f7..5fd5f3568f 100644
--- a/code/modules/examine/descriptions/atmospherics.dm
+++ b/code/modules/examine/descriptions/atmospherics.dm
@@ -157,7 +157,8 @@
//Meters
/obj/machinery/meter
- description_info = "Measures the volume and temperature of the pipe under the meter."
+ description_info = "Measures the volume and temperature of the pipe under the meter.\
+ Using a multitool on this will cycle through any other pipes on the same tile."
//Pipe dispensers
/obj/machinery/pipedispenser
diff --git a/code/modules/examine/descriptions/smokeables.dm b/code/modules/examine/descriptions/smokeables.dm
index edf9b8b7f7..ddec465368 100644
--- a/code/modules/examine/descriptions/smokeables.dm
+++ b/code/modules/examine/descriptions/smokeables.dm
@@ -1,28 +1,28 @@
/obj/item/weapon/storage/fancy/cigarettes
- description_fluff = "The Trans-Stellar Duty-Free cigarette company was created as a sub-company of NanoTrasen. They are the most boring, tasteless, dry cigarettes on the market, but due to how generic they are, they are still the most well-known and widespread cigarettes in the universe."
+ description_fluff = "The Trans-Stellar Duty-Free Cigarette Company was created as an imprint of NanoTrasen. They are the most boring, tasteless, dry cigarettes on the market, but due to how generic they are, they are still the most well-known and widespread cigarettes in the universe."
/obj/item/weapon/storage/fancy/cigarettes/dromedaryco
- description_fluff = "DromedaryCo is one of the oldest companies that produces cigarettes. Being a company that has changed hands and names several times through the years, their cigarettes are now very different from the original, and old-timers tend to complain about the quality of their current product. While they have been dwindling when it comes to profits in the past years due to marketing schemes deemed 'unethical', they still remain on the forefront of the smokeable industry."
+ description_fluff = "DromedaryCo is one of the oldest companies that produces cigarettes. Being a company that has changed hands and names several times through the years, their cigarettes are now very different from the original, and old-timers tend to complain about the quality of their current product. While their profits have been dwindling over the past few years due to marketing schemes deemed 'unethical', they still remain on the forefront of the smokeable industry."
/obj/item/weapon/storage/fancy/cigarettes/killthroat
- description_fluff = "AcmeCo is known for their signature high-tar cigarettes. Being a sub-company Xion, some accuse the cigarettes of having other harmful things in them besides tar. Xion officials refuse to comment on the issue."
+ description_fluff = "AcmeCo, a subsidiary of Xion Manufacturing Group, is known for their signature high-tar cigarettes. Some accuse the cigarettes of having harmful things in them beyond tar, but Xion officials refuse to comment on the issue."
/obj/item/weapon/storage/fancy/cigarettes/luckystars
- description_fluff = "Lucky Stars were created on Venus by a researcher seeking to make a good quality cigarette from pod-based tobacco plants. The researcher only managed to make these, but made quite a profit off of them when she started her company."
+ description_fluff = "Lucky Stars were created on Venus by a researcher seeking to make a good quality cigarette from pod-based tobacco plants. The researcher only managed to make these, but made quite a profit off of them nonetheless."
/obj/item/weapon/storage/fancy/cigarettes/jerichos
- description_fluff = "Hephaestus Industries ex-military employees once decided to make a cigarette that was easy to light and had a waterproof case, specifically tailored for soldiers. They created Jerichos. Jerichos are known for their Hickory smoke and warm feeling in your lungs. They are loved by soldiers and people employed in para-military outfits."
+ description_fluff = "Stealth Assault Enterprises ex-contractors once decided to make a cigarette that was easy to light and had a waterproof case, specifically tailored for soldiers. They created Jerichos. Jerichos are known for their hickory smoke and warm feeling in your lungs. They are loved by soldiers and people employed in para-military outfits."
/obj/item/weapon/storage/fancy/cigarettes/menthols
- description_fluff = "The Temperamento Menthol Company is a large cigarette company based in Mars. They have been around since the very dawn of Human colonization and have remained a favorite for those seeking a more.. numbing cigarette.
\
+ description_fluff = "The Temperamento Menthol Company is a large cigarette company based in Mars. They have been around since the very dawn of human colonization and have remained a favorite for those seeking a more numbing cigarette.
\
\
This is a pack of Temperamento Menthols, the main product of the company. They taste like menthol, surprisingly enough."
/obj/item/weapon/storage/fancy/cigarettes/carcinomas
- description_fluff = "The CarcinoCo was originally destined to fail, as the company blatantly advertized themselves as creating the 'most cancerous cigarette'. Somehow, after endorsement from a reporter, the cigarettes took off."
+ description_fluff = "The CarcinoCo was originally destined to fail, as the company blatantly advertized themselves as creating the 'most cancerous cigarette'. The cigarettes became a hit among those rich enough to afford regular lung replacements."
/obj/item/weapon/storage/fancy/cigarettes/professionals
- description_fluff = "Decades ago, probably before you were born, Gilthari Exports created the Professional 120s. They wanted to make a fancy cigarette that would be considered a luxury. Nowadays, people who use them are generally laughed at for being wannabe rich people or old. They are, however, very high-quality and made from the very best tobacco."
+ description_fluff = "Decades ago, probably before you were born, Gilthari Exports created the Professional 120s. They wanted to make a fancy cigarette that would be considered a luxury. Nowadays, they are generally concidered an emblem of the nouveau riche and the elderly. They are, however, very high-quality and made from the very best Solar tobacco."
/obj/item/clothing/mask/smokable/cigarette/cigar
description_fluff = "While the label does say that this is a 'premium cigar', it really cannot match other types of cigars on the market. Is it a quality cigarette? Perhaps. Was it hand-made with care? No. This is what differentiates between quality products that Gilthari puts out and NanoTrasen 'premium' cigars like this one."
@@ -31,9 +31,9 @@
description_fluff = "Cohiba has been a popular cigar company for centuries. They are still based out of Cuba and refuse to expand and therefore have a very limited quantity, making their cigars coveted all through known space. Robusto is one of their most popular shapes of cigars."
/obj/item/clothing/mask/smokable/cigarette/cigar/havana
- description_fluff = "'Havanian' is an umbrella term for any cigar made in the typical handmade style of Cuba. This particular cigar is from Gilthari's cigar manufacturers. While the way of making quality cigars has become slightly bastardized over the years, overall quality has remained relatively the same, even if there is a large quantity of 'Havanian' cigars."
+ description_fluff = "'Havanian' is an umbrella term for any cigar made in the typical handmade style of Cuba. This particular cigar is from Gilthari's cigar manufacturers. While this way of making quality cigars has become slightly bastardized over the years, overall quality has remained relatively the same, even if there is a large quantity of 'Havanian' cigars."
/obj/item/clothing/mask/smokable/pipe
- description_fluff = "ClassiCo Men's Accessories and Haberdashers is a widespread company originating out of Mars. They seek to create quality goods to give men a more 'classy' look. Most of their items are high-end and expensive, but they do back that up with quality.
\
+ description_fluff = "ClassiCo Accessories and Haberdashers is a widespread company originating out of Mars. They seek to create quality goods to give men a more 'classy' look. Most of their items are high-end and expensive, but they plege to back their prices up with quality.
\
\
- This pipe is a ClassiCo pipe. It is made out of fine, stained cherry wood."
\ No newline at end of file
+ This pipe is a ClassiCo pipe. It is made out of fine, stained cherry wood."
diff --git a/code/modules/materials/fifty_spawner_mats.dm b/code/modules/materials/fifty_spawner_mats.dm
index 95f10e2012..8054bf9c9d 100644
--- a/code/modules/materials/fifty_spawner_mats.dm
+++ b/code/modules/materials/fifty_spawner_mats.dm
@@ -2,101 +2,101 @@
/obj/fiftyspawner/iron
name = "stack of iron"
- material = "material/iron"
+ type_to_spawn = /obj/item/stack/material/iron
/obj/fiftyspawner/sandstone
name = "stack of sandstone"
- material = "material/sandstone"
+ type_to_spawn = /obj/item/stack/material/sandstone
/obj/fiftyspawner/marble
name = "stack of marble"
- material = "material/marble"
+ type_to_spawn = /obj/item/stack/material/marble
/obj/fiftyspawner/diamond
name = "stack of diamond"
- material = "material/diamond"
+ type_to_spawn = /obj/item/stack/material/diamond
/obj/fiftyspawner/uranium
name = "stack of uranium"
- material = "material/uranium"
+ type_to_spawn = /obj/item/stack/material/uranium
/obj/fiftyspawner/phoron
name = "stack of phoron"
- material = "material/phoron"
+ type_to_spawn = /obj/item/stack/material/phoron
/obj/fiftyspawner/plastic
name = "stack of plastic"
- material = "material/plastic"
+ type_to_spawn = /obj/item/stack/material/plastic
/obj/fiftyspawner/gold
name = "stack of gold"
- material = "material/gold"
+ type_to_spawn = /obj/item/stack/material/gold
/obj/fiftyspawner/silver
name = "stack of silver"
- material = "material/silver"
+ type_to_spawn = /obj/item/stack/material/silver
/obj/fiftyspawner/platinum
name = "stack of platinum"
- material = "material/platinum"
+ type_to_spawn = /obj/item/stack/material/platinum
/obj/fiftyspawner/mhydrogen
name = "stack of mhydrogen"
- material = "material/mhydrogen"
+ type_to_spawn = /obj/item/stack/material/mhydrogen
/obj/fiftyspawner/tritium
name = "stack of tritium"
- material = "material/tritium"
+ type_to_spawn = /obj/item/stack/material/tritium
/obj/fiftyspawner/osmium
name = "stack of osmium"
- material = "material/osmium"
+ type_to_spawn = /obj/item/stack/material/osmium
/obj/fiftyspawner/steel
name = "stack of steel"
- material = "material/steel"
+ type_to_spawn = /obj/item/stack/material/steel
/obj/fiftyspawner/plasteel
name = "stack of plasteel"
- material = "material/plasteel"
+ type_to_spawn = /obj/item/stack/material/plasteel
/obj/fiftyspawner/durasteel
name = "stack of durasteel"
- material = "material/durasteel"
+ type_to_spawn = /obj/item/stack/material/durasteel
/obj/fiftyspawner/wood
name = "stack of wood"
- material = "material/wood"
+ type_to_spawn = /obj/item/stack/material/wood
/obj/fiftyspawner/cloth
name = "stack of cloth"
- material = "material/cloth"
+ type_to_spawn = /obj/item/stack/material/cloth
/obj/fiftyspawner/cardboard
name = "stack of cardboard"
- material = "material/cardboard"
+ type_to_spawn = /obj/item/stack/material/cardboard
/obj/fiftyspawner/leather
name = "stack of leather"
- material = "material/leather"
+ type_to_spawn = /obj/item/stack/material/leather
/obj/fiftyspawner/glass
name = "stack of glass"
- material = "material/glass"
+ type_to_spawn = /obj/item/stack/material/glass
/obj/fiftyspawner/rglass
name = "stack of reinforced glass"
- material = "material/glass/reinforced"
+ type_to_spawn = /obj/item/stack/material/glass/reinforced
/obj/fiftyspawner/phoronglass
name = "stack of borosilicate glass"
- material = "material/glass/phoronglass"
+ type_to_spawn = /obj/item/stack/material/glass/phoronglass
/obj/fiftyspawner/phoronrglass
name = "stack of reinforced borosilicate glass"
- material = "material/glass/phoronrglass"
+ type_to_spawn = /obj/item/stack/material/glass/phoronrglass
//R-UST port
/obj/fiftyspawner/deuterium
name = "stack of deuterium"
- material = "material/deuterium"
\ No newline at end of file
+ type_to_spawn = /obj/item/stack/material/deuterium
\ No newline at end of file
diff --git a/code/modules/materials/material_sheets.dm b/code/modules/materials/material_sheets.dm
index 2f9949098b..7ba518f6ef 100644
--- a/code/modules/materials/material_sheets.dm
+++ b/code/modules/materials/material_sheets.dm
@@ -92,16 +92,19 @@
icon_state = "sheet-silver"
default_type = "iron"
apply_colour = 1
+ no_variants = FALSE
/obj/item/stack/material/sandstone
name = "sandstone brick"
icon_state = "sheet-sandstone"
default_type = "sandstone"
+ no_variants = FALSE
/obj/item/stack/material/marble
name = "marble brick"
icon_state = "sheet-marble"
default_type = "marble"
+ no_variants = FALSE
/obj/item/stack/material/diamond
name = "diamond"
@@ -112,38 +115,45 @@
name = "uranium"
icon_state = "sheet-uranium"
default_type = "uranium"
+ no_variants = FALSE
/obj/item/stack/material/phoron
name = "solid phoron"
icon_state = "sheet-phoron"
default_type = "phoron"
+ no_variants = FALSE
/obj/item/stack/material/plastic
name = "plastic"
icon_state = "sheet-plastic"
default_type = "plastic"
+ no_variants = FALSE
/obj/item/stack/material/gold
name = "gold"
icon_state = "sheet-gold"
default_type = "gold"
+ no_variants = FALSE
/obj/item/stack/material/silver
name = "silver"
icon_state = "sheet-silver"
default_type = "silver"
+ no_variants = FALSE
//Valuable resource, cargo can sell it.
/obj/item/stack/material/platinum
name = "platinum"
icon_state = "sheet-adamantine"
default_type = "platinum"
+ no_variants = FALSE
//Extremely valuable to Research.
/obj/item/stack/material/mhydrogen
name = "metallic hydrogen"
icon_state = "sheet-mythril"
default_type = "mhydrogen"
+ no_variants = FALSE
//Fuel for MRSPACMAN generator.
/obj/item/stack/material/tritium
@@ -151,12 +161,14 @@
icon_state = "sheet-silver"
default_type = "tritium"
apply_colour = 1
+ no_variants = FALSE
/obj/item/stack/material/osmium
name = "osmium"
icon_state = "sheet-silver"
default_type = "osmium"
apply_colour = 1
+ no_variants = FALSE
//R-UST port
// Fusion fuel.
@@ -165,22 +177,26 @@
icon_state = "sheet-silver"
default_type = "deuterium"
apply_colour = 1
+ no_variants = FALSE
/obj/item/stack/material/steel
name = DEFAULT_WALL_MATERIAL
icon_state = "sheet-metal"
default_type = DEFAULT_WALL_MATERIAL
+ no_variants = FALSE
/obj/item/stack/material/plasteel
name = "plasteel"
icon_state = "sheet-plasteel"
default_type = "plasteel"
+ no_variants = FALSE
/obj/item/stack/material/durasteel
name = "durasteel"
icon_state = "sheet-durasteel"
item_state = "sheet-metal"
default_type = "durasteel"
+ no_variants = FALSE
/obj/item/stack/material/wood
name = "wooden plank"
@@ -191,11 +207,13 @@
name = "cloth"
icon_state = "sheet-cloth"
default_type = "cloth"
+ no_variants = FALSE
/obj/item/stack/material/cardboard
name = "cardboard"
icon_state = "sheet-card"
default_type = "cardboard"
+ no_variants = FALSE
/obj/item/stack/material/snow
name = "snow"
@@ -208,16 +226,19 @@
desc = "The by-product of mob grinding."
icon_state = "sheet-leather"
default_type = "leather"
+ no_variants = FALSE
/obj/item/stack/material/glass
name = "glass"
icon_state = "sheet-glass"
default_type = "glass"
+ no_variants = FALSE
/obj/item/stack/material/glass/reinforced
name = "reinforced glass"
icon_state = "sheet-rglass"
default_type = "rglass"
+ no_variants = FALSE
/obj/item/stack/material/glass/phoronglass
name = "borosilicate glass"
@@ -225,6 +246,7 @@
singular_name = "borosilicate glass sheet"
icon_state = "sheet-phoronglass"
default_type = "borosilicate glass"
+ no_variants = FALSE
/obj/item/stack/material/glass/phoronrglass
name = "reinforced borosilicate glass"
@@ -232,3 +254,4 @@
singular_name = "reinforced borosilicate glass sheet"
icon_state = "sheet-phoronrglass"
default_type = "reinforced borosilicate glass"
+ no_variants = FALSE
diff --git a/code/modules/mob/_modifiers/cloning.dm b/code/modules/mob/_modifiers/cloning.dm
new file mode 100644
index 0000000000..9162ae8f1d
--- /dev/null
+++ b/code/modules/mob/_modifiers/cloning.dm
@@ -0,0 +1,37 @@
+/*
+ * Modifier applied to newly cloned people.
+ */
+
+// Gives rather nasty downsides for awhile, making them less robust.
+/datum/modifier/cloning_sickness
+ name = "cloning sickness"
+ desc = "You feel rather weak, having been cloned not so long ago."
+
+ on_created_text = "You feel really weak."
+ on_expired_text = "You feel your strength returning to you."
+
+ max_health_percent = 0.6 // -40% max health.
+ incoming_damage_percent = 1.1 // 10% more incoming damage.
+ outgoing_melee_damage_percent = 0.7 // 30% less melee damage.
+ disable_duration_percent = 1.25 // Stuns last 25% longer.
+ slowdown = 1 // Slower.
+ evasion = -1 // 15% easier to hit.
+
+// Tracks number of deaths, one modifier added per cloning
+/datum/modifier/cloned
+ name = "cloned"
+ desc = "You died and were cloned, and you can never forget that."
+
+ flags = MODIFIER_GENETIC // So it gets copied if they die and get cloned again.
+ stacks = MODIFIER_STACK_ALLOWED // Two deaths means two instances of this.
+
+// Prevents cloning, actual effect is on the cloning machine
+/datum/modifier/no_clone
+ name = "Cloning Incompatability"
+ desc = "For whatever reason, you cannot be cloned."
+
+ //WIP, but these may never be seen anyway, so *shrug
+ on_created_text = "Life suddenly feels more precious."
+ on_expired_text = "Death is cheap again."
+
+ flags = MODIFIER_GENETIC
\ No newline at end of file
diff --git a/code/modules/mob/modifiers.dm b/code/modules/mob/_modifiers/modifiers.dm
similarity index 100%
rename from code/modules/mob/modifiers.dm
rename to code/modules/mob/_modifiers/modifiers.dm
diff --git a/code/modules/mob/_modifiers/traits.dm b/code/modules/mob/_modifiers/traits.dm
new file mode 100644
index 0000000000..1ee7b41090
--- /dev/null
+++ b/code/modules/mob/_modifiers/traits.dm
@@ -0,0 +1,10 @@
+/datum/modifier/frail
+ name = "frail"
+ desc = "You are more delicate than the average person."
+
+ flags = MODIFIER_GENETIC
+
+ on_created_text = "You feel really weak."
+ on_expired_text = "You feel your strength returning to you."
+
+ max_health_percent = 0.9
\ No newline at end of file
diff --git a/code/modules/mob/language/station.dm b/code/modules/mob/language/station.dm
index 287bf6c149..8e638fce80 100644
--- a/code/modules/mob/language/station.dm
+++ b/code/modules/mob/language/station.dm
@@ -83,7 +83,7 @@
key = "k"
space_chance = 30
flags = WHITELISTED
- syllables = list("qr","qrr","xuq","qil","quum","xuqm","vol","xrim","zaoo","qu-uu","qix","qoo","zix","*","!", "'")
+ syllables = list("qr","qrr","xuq","qil","quum","xuqm","vol","xrim","zaoo","qu-uu","qix","qoo","zix")
/datum/language/human
name = LANGUAGE_SOL_COMMON
@@ -244,4 +244,4 @@
"tod", "ser", "su", "no", "nue", "el",
"ad", "al", "an", "ar", "as", "ci", "co", "de", "do", "el", "en", "er", "es", "ie", "in", "la", "lo", "me", "na",
"no", "nt", "or", "os", "pa", "qu", "ra", "re", "ro", "se", "st", "ta", "te", "to", "ue", "un",
-"tod", "ser", "su", "no", "nue", "el")
\ No newline at end of file
+"tod", "ser", "su", "no", "nue", "el")
diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm
index 0d5b6ada6c..aa057c04c8 100644
--- a/code/modules/mob/living/carbon/brain/MMI.dm
+++ b/code/modules/mob/living/carbon/brain/MMI.dm
@@ -128,7 +128,8 @@
return
var/obj/item/weapon/rig/rig = src.get_rig()
if(rig)
- rig.forced_move(direction, user)
+ if(istype(rig,/obj/item/weapon/rig))
+ rig.forced_move(direction, user)
/obj/item/device/mmi/Destroy()
if(isrobot(loc))
@@ -260,7 +261,7 @@
src.brainmob.mind.reset()
src.brainmob.ckey = candidate.ckey
src.name = "[name] ([src.brainmob.name])"
- src.brainmob << "You are a [src], brought into existence on [station_name()]."
+ src.brainmob << "You are [src.name], brought into existence on [station_name()]."
src.brainmob << "As a synthetic intelligence, you are designed with organic values in mind."
src.brainmob << "However, unless placed in a lawed chassis, you are not obligated to obey any individual crew member." //it's not like they can hurt anyone
// src.brainmob << "Use say #b to speak to other artificial intelligences."
@@ -283,7 +284,6 @@
..()
src.brainmob.name = "[pick(list("ADA","DOS","GNU","MAC","WIN","NJS","SKS","DRD","IOS","CRM","IBM","TEX","LVM","BSD",))]-[rand(1000, 9999)]"
src.brainmob.real_name = src.brainmob.name
- src.name = "robotic intelligence circuit ([src.brainmob.name])"
/obj/item/device/mmi/digital/robot/transfer_identity(var/mob/living/carbon/H)
..()
diff --git a/code/modules/mob/living/simple_animal/animals/crab.dm b/code/modules/mob/living/simple_animal/animals/crab.dm
index acad7f6378..35089275e5 100644
--- a/code/modules/mob/living/simple_animal/animals/crab.dm
+++ b/code/modules/mob/living/simple_animal/animals/crab.dm
@@ -5,6 +5,7 @@
icon_state = "crab"
icon_living = "crab"
icon_dead = "crab_dead"
+ faction = "crabs"
intelligence_level = SA_ANIMAL
wander = 0
@@ -45,3 +46,37 @@
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "stomps"
+
+//Sif Crabs
+/mob/living/simple_animal/giant_crab
+ name = "Giant Crab"
+ desc = "A large, hard-shelled crustacean. This one is mostly grey."
+ icon_state = "sif_crab"
+ icon_living = "sif_crab"
+ icon_dead = "sif_crab_dead"
+ faction = "crabs"
+ intelligence_level = SA_ANIMAL
+
+ maxHealth = 200
+ health = 200
+
+ mob_size = MOB_LARGE
+ cooperative = 1
+ retaliate = 1
+ turns_per_move = 3
+
+ minbodytemp = 175
+
+ melee_damage_lower = 15
+ melee_damage_upper = 35
+
+ meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
+ response_help = "pets"
+ response_disarm = "gently pushes aside"
+ response_harm = "stomps"
+ friendly = "pinches"
+
+ speak_chance = 1
+ speak_emote = list("clicks")
+ emote_hear = list("clicks")
+ emote_see = list("clacks")
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index d1a336dbb6..e73d316433 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -533,3 +533,23 @@
/mob/proc/update_gravity()
return
+
+// The real Move() proc is above, but touching that massive block just to put this in isn't worth it.
+/mob/Move(var/newloc, var/direct)
+ . = ..(newloc, direct)
+ if(.)
+ post_move(newloc, direct)
+
+// Called when a mob successfully moves.
+// Would've been an /atom/movable proc but it caused issues.
+/mob/proc/post_move(var/newloc, var/direct)
+ for(var/obj/O in contents)
+ O.on_loc_moved(newloc, direct)
+
+// Received from post_move(), useful for items that need to know that their loc just moved.
+/obj/proc/on_loc_moved(var/newloc, var/direct)
+ return
+
+/obj/item/weapon/storage/on_loc_moved(var/newloc, var/direct)
+ for(var/obj/O in contents)
+ O.on_loc_moved(newloc, direct)
\ No newline at end of file
diff --git a/code/modules/planet/sif.dm b/code/modules/planet/sif.dm
index d4492d625c..b69f61cd8a 100644
--- a/code/modules/planet/sif.dm
+++ b/code/modules/planet/sif.dm
@@ -133,8 +133,8 @@ var/datum/planet/sif/planet_sif = null
datum/weather/sif
name = "sif base"
- temp_high = 243.15 // -20c
- temp_low = 233.15 // -30c
+ temp_high = 283.15 // 10c
+ temp_low = 263.15 // -10c
/datum/weather/sif/clear
name = "clear"
@@ -158,8 +158,8 @@ datum/weather/sif
/datum/weather/sif/light_snow
name = "light snow"
icon_state = "snowfall_light"
- temp_high = 238.15 // -25c
- temp_low = 228.15 // -35c
+ temp_high = T0C // 0c
+ temp_low = 258.15 // -15c
light_modifier = 0.7
transition_chances = list(
WEATHER_OVERCAST = 20,
@@ -171,8 +171,8 @@ datum/weather/sif
/datum/weather/sif/snow
name = "moderate snow"
icon_state = "snowfall_med"
- temp_high = 233.15 // -30c
- temp_low = 223.15 // -40c
+ temp_high = T0C // 0c
+ temp_low = 243.15 // -30c
light_modifier = 0.5
transition_chances = list(
WEATHER_LIGHT_SNOW = 20,
@@ -194,8 +194,8 @@ datum/weather/sif
/datum/weather/sif/blizzard
name = "blizzard"
icon_state = "snowfall_heavy"
- temp_high = 223.15 // -40c
- temp_low = 203.15 // -60c
+ temp_high = 233.15 // -40c
+ temp_low = 213.15 // -60c
light_modifier = 0.3
transition_chances = list(
WEATHER_SNOW = 45,
@@ -238,8 +238,8 @@ datum/weather/sif
/datum/weather/sif/storm
name = "storm"
icon_state = "storm"
- temp_high = 233.15 // -30c
- temp_low = 213.15 // -50c
+ temp_high = 243.15 // -30c
+ temp_low = 233.15 // -50c
light_modifier = 0.3
transition_chances = list(
WEATHER_RAIN = 45,
@@ -261,8 +261,8 @@ datum/weather/sif
/datum/weather/sif/hail
name = "hail"
icon_state = "hail"
- temp_high = 233.15 // -30c
- temp_low = 213.15 // -50c
+ temp_high = T0C // 0c
+ temp_low = 243.15 // -30c
light_modifier = 0.3
transition_chances = list(
WEATHER_RAIN = 45,
@@ -297,5 +297,4 @@ datum/weather/sif
light_color = "#FF0000"
transition_chances = list(
WEATHER_BLOODMOON = 100
- )
-
+ )
\ No newline at end of file
diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm
index 1e4ae3710d..8a99192233 100644
--- a/code/modules/reagents/Chemistry-Recipes.dm
+++ b/code/modules/reagents/Chemistry-Recipes.dm
@@ -1204,7 +1204,7 @@
name = "Syntiflesh"
id = "syntiflesh"
result = null
- required_reagents = list("blood" = 5, "clonexadone" = 1)
+ required_reagents = list("blood" = 5, "clonexadone" = 5)
result_amount = 1
/datum/chemical_reaction/food/syntiflesh/on_reaction(var/datum/reagents/holder, var/created_volume)
diff --git a/code/modules/shieldgen/directional_shield.dm b/code/modules/shieldgen/directional_shield.dm
new file mode 100644
index 0000000000..41bcda3ceb
--- /dev/null
+++ b/code/modules/shieldgen/directional_shield.dm
@@ -0,0 +1,347 @@
+// This is the actual shield. The projector is a different item.
+/obj/effect/directional_shield
+ name = "directional combat shield"
+ desc = "A wide shield, which has the property to block incoming projectiles but allow outgoing projectiles to pass it. \
+ Slower moving objects are not blocked, so people can walk in and out of the barrier, and things can be thrown into and out \
+ of it."
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "directional_shield"
+ density = FALSE // People can move pass these shields.
+ opacity = FALSE
+ anchored = TRUE
+ unacidable = TRUE
+ layer = MOB_LAYER + 0.1
+ mouse_opacity = FALSE
+ var/obj/item/shield_projector/projector = null // The thing creating the shield.
+ var/x_offset = 0 // Offset from the 'center' of where the projector is, so that if it moves, the shield can recalc its position.
+ var/y_offset = 0 // Ditto.
+
+/obj/effect/directional_shield/New(var/newloc, var/new_projector)
+ if(new_projector)
+ projector = new_projector
+ var/turf/us = get_turf(src)
+ var/turf/them = get_turf(projector)
+ if(them)
+ x_offset = us.x - them.x
+ y_offset = us.y - them.y
+ else
+ update_color()
+ ..(newloc)
+
+/obj/effect/directional_shield/proc/relocate()
+ if(!projector)
+ return // Nothing to follow.
+ var/turf/T = get_turf(projector)
+ if(!T)
+ return
+ var/turf/new_pos = locate(T.x + x_offset, T.y + y_offset, T.z)
+ if(new_pos)
+ forceMove(new_pos)
+ else
+ qdel(src)
+
+/obj/effect/directional_shield/proc/update_color(var/new_color)
+ if(!projector)
+ color = "#0099FF"
+ else
+ animate(src, color = new_color, 5)
+// color = new_color
+
+/obj/effect/directional_shield/Destroy()
+ if(projector)
+ projector.active_shields -= src
+ projector = null
+ return ..()
+
+/obj/effect/directional_shield/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
+ if(air_group || (height==0))
+ return TRUE
+ else if(istype(mover, /obj/item/projectile))
+ var/obj/item/projectile/P = mover
+ if(istype(P, /obj/item/projectile/test)) // Turrets need to try to kill the shield and so their test bullet needs to penetrate.
+ return TRUE
+
+ var/bad_arc = reverse_direction(dir) // Arc of directions from which we cannot block.
+ if(check_shield_arc(src, bad_arc, P)) // This is actually for mobs but it will work for our purposes as well.
+ return FALSE
+ else
+ return TRUE
+ return TRUE
+
+/obj/effect/directional_shield/bullet_act(var/obj/item/projectile/P)
+ adjust_health(-P.get_structure_damage())
+ P.on_hit()
+ playsound(get_turf(src), 'sound/effects/EMPulse.ogg', 75, 1)
+
+// All the shields tied to their projector are one 'unit', and don't have individualized health values like most other shields.
+/obj/effect/directional_shield/proc/adjust_health(amount)
+ if(projector)
+ projector.adjust_health(amount) // Projector will kill the shield if needed.
+ // If the shield lacks a projector, then it was probably spawned in by an admin for bus, so it's indestructable.
+
+
+// This actually creates the shields. It's an item so that it can be carried, but it could also be placed inside a stationary object if desired.
+// It should work inside the contents of any mob.
+/obj/item/shield_projector
+ name = "combat shield projector"
+ desc = "A miniturized and compact shield projector. This type has been optimized to diffuse lasers or block high velocity projectiles from the outside, \
+ but allow those projectiles to leave the shield from the inside. Blocking too many damaging projectiles will cause the shield to fail."
+ icon = 'icons/obj/device.dmi'
+ icon_state = "signmaker_sec"
+ var/active = FALSE // If it's on.
+ var/shield_health = 400 // How much damage the shield blocks before breaking. This is a shared health pool for all shields attached to this projector.
+ var/max_shield_health = 400 // Ditto. This is fairly high, but shields are really big, you can't miss them, and laser carbines pump out so much hurt.
+ var/shield_regen_amount = 20 // How much to recharge every process(), after the delay.
+ var/shield_regen_delay = 5 SECONDS // If the shield takes damage, it won't recharge for this long.
+ var/last_damaged_time = null // world.time when the shields took damage, used for the delay.
+ var/list/active_shields = list() // Shields that are active and deployed.
+ var/always_on = FALSE // If true, will always try to reactivate if disabled for whatever reason, ideal if AI mobs are holding this.
+ var/high_color = "#0099FF" // Color the shield will be when at max health. A light blue.
+ var/low_color = "#FF0000" // Color the shield will drift towards as health is lowered. Deep red.
+
+/obj/item/shield_projector/New()
+ processing_objects += src
+ if(always_on)
+ create_shields()
+ ..()
+
+/obj/item/shield_projector/Destroy()
+ destroy_shields()
+ processing_objects -= src
+ return ..()
+
+/obj/item/shield_projector/proc/create_shield(var/newloc, var/new_dir)
+ var/obj/effect/directional_shield/S = new(newloc, src)
+ S.dir = new_dir
+ active_shields += S
+
+/obj/item/shield_projector/proc/create_shields() // Override this for a specific shape. Be sure to call ..() for the checks, however.
+ if(active) // Already made.
+ return FALSE
+ if(shield_health <= 0)
+ return FALSE
+ active = TRUE
+ return TRUE
+
+/obj/item/shield_projector/proc/destroy_shields()
+ for(var/obj/effect/directional_shield/S in active_shields)
+ active_shields -= S
+ qdel(S)
+ active = FALSE
+
+/obj/item/shield_projector/proc/update_shield_positions()
+ for(var/obj/effect/directional_shield/S in active_shields)
+ S.relocate()
+
+/obj/item/shield_projector/proc/adjust_health(amount)
+ shield_health = between(0, shield_health + amount, max_shield_health)
+ if(amount < 0)
+ if(shield_health <= 0)
+ destroy_shields()
+ var/turf/T = get_turf(src)
+ T.visible_message("\The [src] overloads and the shield vanishes!")
+ playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 75, 0)
+ else
+ if(shield_health < max_shield_health / 4) // Play a more urgent sounding beep if it's at 25% health.
+ playsound(get_turf(src), 'sound/machines/defib_success.ogg', 75, 0)
+ else
+ playsound(get_turf(src), 'sound/machines/defib_SafetyOn.ogg', 75, 0)
+ last_damaged_time = world.time
+ update_shield_colors()
+
+// Makes shields become gradually more red as the projector's health decreases.
+/obj/item/shield_projector/proc/update_shield_colors()
+ // This is done at the projector instead of the shields themselves to avoid needing to calculate this more than once every update.
+ var/lerp_weight = shield_health / max_shield_health
+
+ var/list/low_color_list = hex2rgb(low_color)
+ var/low_r = low_color_list[1]
+ var/low_g = low_color_list[2]
+ var/low_b = low_color_list[3]
+
+ var/list/high_color_list = hex2rgb(high_color)
+ var/high_r = high_color_list[1]
+ var/high_g = high_color_list[2]
+ var/high_b = high_color_list[3]
+
+ var/new_r = Interpolate(low_r, high_r, weight = lerp_weight)
+ var/new_g = Interpolate(low_g, high_g, weight = lerp_weight)
+ var/new_b = Interpolate(low_b, high_b, weight = lerp_weight)
+
+ var/new_color = rgb(new_r, new_g, new_b)
+
+ // Now deploy the new color to all the shields.
+ for(var/obj/effect/directional_shield/S in active_shields)
+ S.update_color(new_color)
+
+/obj/item/shield_projector/attack_self(var/mob/living/user)
+ if(active)
+ if(always_on)
+ to_chat(user, "You can't seem to deactivate \the [src].")
+ return
+
+ destroy_shields()
+ else
+ set_dir(user.dir) // Needed for linear shields.
+ create_shields()
+ visible_message("\The [user] [!active ? "de":""]activates \the [src].")
+
+/obj/item/shield_projector/process()
+ if(shield_health < max_shield_health && ( (last_damaged_time + shield_regen_delay) < world.time) )
+ adjust_health(shield_regen_amount)
+ if(always_on && !active) // Make shields as soon as possible if this is set.
+ create_shields()
+ if(shield_health == max_shield_health)
+ playsound(get_turf(src), 'sound/machines/defib_ready.ogg', 75, 0)
+ else
+ playsound(get_turf(src), 'sound/machines/defib_safetyOff.ogg', 75, 0)
+
+/obj/item/shield_projector/examine(var/mob/user)
+ ..()
+ if(get_dist(src, user) <= 1)
+ to_chat(user, "\The [src]'s shield matrix is at [round( (shield_health / max_shield_health) * 100, 0.01)]% strength.")
+
+/obj/item/shield_projector/emp_act(var/severity)
+ adjust_health(-max_shield_health / severity) // A strong EMP will kill the shield instantly, but weaker ones won't on the first hit.
+
+/obj/item/shield_projector/Move(var/newloc, var/direct)
+ ..(newloc, direct)
+ update_shield_positions()
+
+/obj/item/shield_projector/on_loc_moved(var/newloc, var/direct)
+ update_shield_positions()
+
+
+// Subtypes
+
+/obj/item/shield_projector/rectangle
+ name = "rectangular combat shield projector"
+ description_info = "This creates a shield in a rectangular shape, which allows projectiles to leave from inside but blocks projectiles from outside. \
+ Everything else can pass through the shield freely, including other people and thrown objects. The shield also cannot block certain effects which \
+ take place over an area, such as flashbangs or explosions."
+ var/size_x = 3 // How big the rectangle will be, in tiles from the center.
+ var/size_y = 3 // Ditto.
+
+// Weaker and smaller variant.
+/obj/item/shield_projector/rectangle/weak
+ shield_health = 200 // Half as strong as the default.
+ max_shield_health = 200
+ size_x = 2
+ size_y = 2
+
+// A shortcut for admins to spawn in to put into simple animals or other things where it needs to reactivate automatically.
+/obj/item/shield_projector/rectangle/automatic
+ always_on = TRUE
+
+/obj/item/shield_projector/rectangle/automatic/weak
+ shield_health = 200 // Half as strong as the default.
+ max_shield_health = 200
+ size_x = 2
+ size_y = 2
+
+// Horrible implementation below.
+/obj/item/shield_projector/rectangle/create_shields()
+ if(!..())
+ return FALSE
+
+ // Make a rectangle in a really terrible way.
+ var/x_dist = size_x
+ var/y_dist = size_y
+
+ var/turf/T = get_turf(src)
+ if(!T)
+ return FALSE
+ // Top left corner.
+ var/turf/T1 = locate(T.x - x_dist, T.y + y_dist, T.z)
+ // Bottom right corner.
+ var/turf/T2 = locate(T.x + x_dist, T.y - y_dist, T.z)
+ if(!T1 || !T2) // If we're on the edge of the map then don't bother.
+ return FALSE
+
+ // Build half of the corners first, as they are 'anchors' for the rest of the code below.
+ create_shield(T1, NORTHWEST)
+ create_shield(T2, SOUTHEAST)
+
+ // Build the edges.
+ // First start with the north side.
+ var/current_x = T1.x + 1 // Start next to the top left corner.
+ var/current_y = T1.y
+ var/length = (x_dist * 2) - 1
+ for(var/i = 1 to length)
+ create_shield(locate(current_x, current_y, T.z), NORTH)
+ current_x++
+
+ // Make the top right corner.
+ create_shield(locate(current_x, current_y, T.z), NORTHEAST)
+
+ // Now for the west edge.
+ current_x = T1.x
+ current_y = T1.y - 1
+ length = (y_dist * 2) - 1
+ for(var/i = 1 to length)
+ create_shield(locate(current_x, current_y, T.z), WEST)
+ current_y--
+
+ // Make the bottom left corner.
+ create_shield(locate(current_x, current_y, T.z), SOUTHWEST)
+
+ // Switch to the second corner, and make the east edge.
+ current_x = T2.x
+ current_y = T2.y + 1
+ length = (y_dist * 2) - 1
+ for(var/i = 1 to length)
+ create_shield(locate(current_x, current_y, T.z), EAST)
+ current_y++
+
+ // There are no more corners to create, so we can just go build the south edge now.
+ current_x = T2.x - 1
+ current_y = T2.y
+ length = (x_dist * 2) - 1
+ for(var/i = 1 to length)
+ create_shield(locate(current_x, current_y, T.z), SOUTH)
+ current_x--
+ // Finally done.
+ update_shield_colors()
+ return TRUE
+
+/obj/item/shield_projector/line
+ name = "linear combat shield projector"
+ description_info = "This creates a shield in a straight line perpendicular to the direction where the user was facing when it was activated. \
+ The shield allows projectiles to leave from inside but blocks projectiles from outside. Everything else can pass through the shield freely, \
+ including other people and thrown objects. The shield also cannot block certain effects which take place over an area, such as flashbangs or explosions."
+ var/line_length = 5 // How long the line is. Recommended to be an odd number.
+ var/offset_from_center = 2 // How far from the projector will the line's center be.
+
+/obj/item/shield_projector/line/create_shields()
+ if(!..())
+ return FALSE
+
+ var/turf/T = get_turf(src) // This is another 'anchor', or will be once we move away from the projector.
+ for(var/i = 1 to offset_from_center)
+ T = get_step(T, dir)
+ if(!T) // We went off the map or something.
+ return
+ // We're at the right spot now. Build the center piece.
+ create_shield(T, dir)
+
+ var/length_to_build = round( (line_length - 1) / 2)
+ var/turf/temp_T = T
+
+ // First loop, we build the left (from a north perspective) side of the line.
+ for(var/i = 1 to length_to_build)
+ temp_T = get_step(temp_T, turn(dir, 90) )
+ if(!temp_T)
+ break
+ create_shield(temp_T, i == length_to_build ? turn(dir, 45) : dir)
+
+ temp_T = T
+
+ // Second loop, we build the right side.
+ for(var/i = 1 to length_to_build)
+ temp_T = get_step(temp_T, turn(dir, -90) )
+ if(!temp_T)
+ break
+ create_shield(temp_T, i == length_to_build ? turn(dir, -45) : dir)
+ // Finished.
+ update_shield_colors()
+ return TRUE
\ No newline at end of file
diff --git a/code/modules/xenobio/items/extracts.dm b/code/modules/xenobio/items/extracts.dm
index 901ccb8f99..87542b70f0 100644
--- a/code/modules/xenobio/items/extracts.dm
+++ b/code/modules/xenobio/items/extracts.dm
@@ -93,6 +93,13 @@
new /obj/item/weapon/reagent_containers/food/snacks/monkeycube(get_turf(holder.my_atom))
..()
+/datum/chemical_reaction/slime/grey_slimejelly
+ name = "Slime Jelly"
+ id = "m_jelly"
+ result = "slimejelly"
+ required_reagents = list("peridaxon" = 5)
+ result_amount = 15
+ required = /obj/item/slime_extract/grey
// ****************
// * Metal slimes *
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index 4e08b08c8d..e5d15cbfbc 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi
index 60153c2d92..d9240628e5 100644
Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ
diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi
index 9957448ceb..768e71b1f4 100644
Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ
diff --git a/icons/mob/items/lefthand_material.dmi b/icons/mob/items/lefthand_material.dmi
index dc642311e5..b91fb8a545 100644
Binary files a/icons/mob/items/lefthand_material.dmi and b/icons/mob/items/lefthand_material.dmi differ
diff --git a/icons/mob/items/righthand_material.dmi b/icons/mob/items/righthand_material.dmi
index 44904c68c7..e950740bb8 100644
Binary files a/icons/mob/items/righthand_material.dmi and b/icons/mob/items/righthand_material.dmi differ
diff --git a/icons/mob/species/vox/suit.dmi b/icons/mob/species/vox/suit.dmi
index abca19cc65..6faf4c97f5 100644
Binary files a/icons/mob/species/vox/suit.dmi and b/icons/mob/species/vox/suit.dmi differ
diff --git a/icons/obj/clothing/species/vox/suits.dmi b/icons/obj/clothing/species/vox/suits.dmi
index 5efadccb80..7e52410778 100644
Binary files a/icons/obj/clothing/species/vox/suits.dmi and b/icons/obj/clothing/species/vox/suits.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index e795486d59..d60b03c9aa 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/clothing/ties.dmi b/icons/obj/clothing/ties.dmi
index b3c82552d4..84117e2754 100644
Binary files a/icons/obj/clothing/ties.dmi and b/icons/obj/clothing/ties.dmi differ
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index db0bb55a1f..8acc10a4fb 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi
index e35880d3d4..3ba867cda1 100644
Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ
diff --git a/icons/obj/nanopaste.dmi b/icons/obj/nanopaste.dmi
deleted file mode 100644
index b3c096325f..0000000000
Binary files a/icons/obj/nanopaste.dmi and /dev/null differ
diff --git a/icons/obj/stacks.dmi b/icons/obj/stacks.dmi
new file mode 100644
index 0000000000..1713cacb67
Binary files /dev/null and b/icons/obj/stacks.dmi differ
diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi
index 01d769a0f4..6807e3fbc9 100644
Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ
diff --git a/maps/northern_star/polaris-2.dmm b/maps/northern_star/polaris-2.dmm
index b7ba87c88c..13133d0cd0 100644
--- a/maps/northern_star/polaris-2.dmm
+++ b/maps/northern_star/polaris-2.dmm
@@ -592,20 +592,20 @@
"lt" = (/turf/simulated/shuttle/floor/white,/area/syndicate_mothership)
"lu" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 4},/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 8},/area/syndicate_mothership)
"lv" = (/turf/unsimulated/floor{icon_state = "dark"},/area/alien)
-"lw" = (/turf/space,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/syndicate_mothership{name = "\improper Ninja Base"})
-"lx" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/syndicate_mothership{name = "\improper Ninja Base"})
+"lw" = (/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/syndicate_mothership{name = "\improper Ninja Base"})
+"lx" = (/turf/simulated/shuttle/wall,/area/syndicate_mothership{name = "\improper Ninja Base"})
"ly" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/plating,/area/syndicate_mothership{name = "\improper Ninja Base"})
-"lz" = (/turf/space,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/syndicate_mothership{name = "\improper Ninja Base"})
+"lz" = (/turf/simulated/shuttle/wall{dir = 2; icon_state = "diagonalWall3"},/area/syndicate_mothership{name = "\improper Ninja Base"})
"lA" = (/obj/item/weapon/paper{info = "Some stuff is missing..."; name = "Insert alien artifacts here."},/turf/unsimulated/floor{icon_state = "dark"},/area/alien)
"lB" = (/obj/machinery/door/airlock/hatch,/turf/unsimulated/floor{icon_state = "dark"},/area/alien)
-"lC" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/syndicate_mothership{name = "\improper Ninja Base"})
-"lD" = (/obj/structure/table/steel_reinforced,/obj/item/clothing/mask/balaclava/tactical,/obj/item/clothing/mask/balaclava,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_mothership{name = "\improper Ninja Base"})
-"lE" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/syndicate_mothership{name = "\improper Ninja Base"})
+"lC" = (/obj/structure/table/steel_reinforced,/obj/item/clothing/mask/balaclava/tactical,/obj/item/clothing/mask/balaclava,/turf/simulated/shuttle/floor{tag = "icon-floor_red"; icon_state = "floor_red"},/area/syndicate_mothership{name = "\improper Ninja Base"})
+"lD" = (/obj/structure/table/steel_reinforced,/obj/structure/mirror,/turf/simulated/shuttle/floor{tag = "icon-floor_red"; icon_state = "floor_red"},/area/syndicate_mothership{name = "\improper Ninja Base"})
+"lE" = (/obj/structure/undies_wardrobe,/turf/simulated/shuttle/floor{tag = "icon-floor_red"; icon_state = "floor_red"},/area/syndicate_mothership{name = "\improper Ninja Base"})
"lF" = (/obj/structure/closet/acloset,/turf/unsimulated/floor{icon_state = "dark"},/area/alien)
"lG" = (/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/obj/structure/flora/bush,/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow_corner"; dir = 8},/area/syndicate_mothership)
"lH" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/syndicate_mothership{name = "\improper Ninja Base"})
-"lI" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_mothership{name = "\improper Ninja Base"})
-"lJ" = (/obj/structure/bed/chair{dir = 1},/obj/effect/landmark{name = "ninjastart"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_mothership{name = "\improper Ninja Base"})
+"lI" = (/obj/structure/bed/chair{dir = 1},/obj/effect/landmark{name = "ninjastart"},/turf/simulated/shuttle/floor{tag = "icon-floor_red"; icon_state = "floor_red"},/area/syndicate_mothership{name = "\improper Ninja Base"})
+"lJ" = (/turf/simulated/shuttle/floor{tag = "icon-floor_red"; icon_state = "floor_red"},/area/syndicate_mothership{name = "\improper Ninja Base"})
"lK" = (/turf/space,/area/shuttle/alien/base)
"lL" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/syndicate_mothership{name = "\improper Ninja Base"})
"lM" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/airless,/area/syndicate_mothership)
@@ -614,18 +614,16 @@
"lP" = (/turf/space,/obj/structure/shuttle/engine/propulsion,/turf/simulated/shuttle/plating/airless/carry,/area/syndicate_mothership)
"lQ" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"},/turf/simulated/shuttle/plating/airless/carry,/area/syndicate_mothership)
"lR" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/syndicate_mothership{name = "\improper Ninja Base"})
-"lS" = (/obj/machinery/computer/teleporter,/turf/simulated/floor/plating,/area/syndicate_mothership{name = "\improper Ninja Base"})
-"lT" = (/obj/machinery/teleport/station,/turf/simulated/floor/plating,/area/syndicate_mothership{name = "\improper Ninja Base"})
-"lU" = (/obj/machinery/teleport/hub,/turf/simulated/floor/plating,/area/syndicate_mothership{name = "\improper Ninja Base"})
+"lS" = (/obj/machinery/teleport/station,/turf/simulated/shuttle/floor{tag = "icon-floor_red"; icon_state = "floor_red"},/area/syndicate_mothership{name = "\improper Ninja Base"})
+"lT" = (/obj/machinery/computer/teleporter,/turf/simulated/shuttle/floor{tag = "icon-floor_red"; icon_state = "floor_red"},/area/syndicate_mothership{name = "\improper Ninja Base"})
+"lU" = (/obj/machinery/teleport/hub,/turf/simulated/shuttle/floor{tag = "icon-floor_red"; icon_state = "floor_red"},/area/syndicate_mothership{name = "\improper Ninja Base"})
"lV" = (/turf/unsimulated/wall,/area)
"lW" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/airless,/area/syndicate_mothership{name = "\improper Ninja Base"})
"lX" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space,/area/space)
"lY" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space,/area/space)
-"lZ" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/syndicate_mothership{name = "\improper Ninja Base"})
"ma" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"},/turf/space,/area/syndicate_mothership{name = "\improper Ninja Base"})
"mb" = (/obj/structure/shuttle/engine/propulsion,/turf/space,/area/syndicate_mothership{name = "\improper Ninja Base"})
"mc" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"},/turf/space,/area/syndicate_mothership{name = "\improper Ninja Base"})
-"md" = (/turf/space,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/syndicate_mothership{name = "\improper Ninja Base"})
"me" = (/turf/simulated/mineral,/area/space)
"mf" = (/turf/simulated/shuttle/wall/dark/hard_corner,/area/centcom/specops)
"mg" = (/obj/effect/landmark/start,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area)
@@ -2471,14 +2469,14 @@ ajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajaaaaaaaaaaaaaaaa
ajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafhVihjyjyjyjyjyjyjyjKjKjKjyjyjyjyjyjyjykekTlolplphVafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaf
ajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaflslslslslslslslsafafhVihjyltltltltltjyjKjKjKjyjKjKjKjKjKjyluhVlolplphVafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaf
ajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaflslvlvlvlslvlvlsafafhVihjyltltltltltltjKjKjKjKjKjKjKjKjKjyluhVhVhVhVhVafafafafafafafafaflwlxlylxlzafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaf
-afafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaflslvlAlvlBlvlvlsafafhVihjyltltltltltltjKjKjKjKjKjKjKjKjKjyjLihhVafafafafafafafafafafafaflxlClDlElxafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaf
-afafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaflslFlFlFlslvlvlsafafhVihjyltltltltltjyltltltjyjKjyjKjyjyjylGihhVafafafafafafafafafafafaflHlIlJlIlHafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaf
-afafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaflKlKlKlKlslslslslslslvlvlsafafhVihjyltltltjyjyjyltltltjyjyjyjKjKjKjyjLihhVafafafafafafafafafafafaflLlIlIlIlLafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaf
-afafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaflKlKlKlKlBlvlBlvlvlvlvlvlsafafhVihjyltltltjyihjylMlMlMjyihjyjKjKjKjyjLihhVafafafafafafafafafafafaflLlIlIlIlLafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaf
-afafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaflKlKlKlKlslslslslvlvlvlNlsafafhVihjylMlMlMjyihjylOlPlQjyihjylMlMlMjyjLihhVafafafafafafafafafafafaflRlIlIlIlRafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaf
-afafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaflslFlvlvlNlsafafhVihjylOlPlQjyihihihihihihihjylOlPlQjyihihhVafafafafafafafafafafafaflxlSlTlUlxafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaf
+afafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaflslvlAlvlBlvlvlsafafhVihjyltltltltltltjKjKjKjKjKjKjKjKjKjyjLihhVafafafafafafafafafafafaflxlDlClElxafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaf
+afafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaflslFlFlFlslvlvlsafafhVihjyltltltltltjyltltltjyjKjyjKjyjyjylGihhVafafafafafafafafafafafaflHlJlIlJlHafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaf
+afafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaflKlKlKlKlslslslslslslvlvlsafafhVihjyltltltjyjyjyltltltjyjyjyjKjKjKjyjLihhVafafafafafafafafafafafaflLlJlJlJlLafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaf
+afafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaflKlKlKlKlBlvlBlvlvlvlvlvlsafafhVihjyltltltjyihjylMlMlMjyihjyjKjKjKjyjLihhVafafafafafafafafafafafaflLlJlJlJlLafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaf
+afafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaflKlKlKlKlslslslslvlvlvlNlsafafhVihjylMlMlMjyihjylOlPlQjyihjylMlMlMjyjLihhVafafafafafafafafafafafaflRlJlJlJlRafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaf
+afafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaflslFlvlvlNlsafafhVihjylOlPlQjyihihihihihihihjylOlPlQjyihihhVafafafafafafafafafafafaflxlTlSlUlxafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaf
lVlVlVlVlVlVlVlVlVlVlVlVlVlVlVafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaflslFlvlvlNlsafafhVihihihihihihihihihihihihihihihihihihihihhVafafafafafafafafafafafaflxlWlWlWlxafafafafafafafafafafafaflXlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlYlY
-lVlVlVlVlVlVlVlVlVlVlVlVlVlVlVafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaflslslslslslsafafhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVafafafafafafafafafafafaflZmambmcmdafafafafafafafafafafafaflYafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaf
+lVlVlVlVlVlVlVlVlVlVlVlVlVlVlVafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaflslslslslslsafafhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVhVafafafafafafafafafafafaflwmambmclwafafafafafafafafafafafaflYafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaf
lVlVlVlVlVlVlVlVlVlVlVlVlVlVlVafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaflYafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaf
lVlVlVlVlVlVlVlVlVlVlVlVlVlVlVafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaflYafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaf
lVlVlVlVlVlVlVlVlVlVlVlVlVlVlVafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaflYafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaf
diff --git a/maps/northern_star/polaris-5.dmm b/maps/northern_star/polaris-5.dmm
index 9e883190ba..cf6ccecf5f 100644
--- a/maps/northern_star/polaris-5.dmm
+++ b/maps/northern_star/polaris-5.dmm
@@ -304,10 +304,10 @@
"fR" = (/obj/structure/closet/bombcloset/double,/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology)
"fS" = (/turf/simulated/floor/tiled,/area/outpost/research/xenobiology)
"fT" = (/obj/structure/grille,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio1"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/obj/structure/window/reinforced/full,/turf/simulated/floor/plating,/area/outpost/research/xenobiology)
-"fU" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio1"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/door/window/southright{dir = 1; name = "Containment Pen"; req_access = list(47)},/turf/simulated/floor/reinforced,/area/outpost/research/xenobiology)
+"fU" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio1"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/door/window/brigdoor/northright{name = "Containment Pen"; req_access = list(47)},/turf/simulated/floor/reinforced,/area/outpost/research/xenobiology)
"fV" = (/obj/structure/grille,/obj/structure/disposalpipe/segment,/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio1"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/window/reinforced/full,/turf/simulated/floor/plating,/area/outpost/research/xenobiology)
"fW" = (/obj/structure/grille,/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio2"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/window/reinforced/full,/turf/simulated/floor/plating,/area/outpost/research/xenobiology)
-"fX" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio2"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/door/window/southright{dir = 1; name = "Containment Pen"; req_access = list(47)},/turf/simulated/floor/reinforced,/area/outpost/research/xenobiology)
+"fX" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio2"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/door/window/brigdoor/northright{name = "Containment Pen"; req_access = list(47)},/turf/simulated/floor/reinforced,/area/outpost/research/xenobiology)
"fY" = (/obj/structure/grille,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio2"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/disposalpipe/segment,/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/obj/structure/window/reinforced/full,/turf/simulated/floor/plating,/area/outpost/research/xenobiology)
"fZ" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology)
"ga" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/outpost/research/hallway/toxins_hallway)
@@ -317,7 +317,7 @@
"ge" = (/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology)
"gf" = (/obj/machinery/camera/network/research_outpost{c_tag = "OPR - Xenobiology Fore Port"; dir = 2},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/tiled,/area/outpost/research/xenobiology)
"gg" = (/obj/structure/table/reinforced,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/industrial/warning{dir = 10},/obj/machinery/button/remote/blast_door{id = "xenobio1"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access = list(55)},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology)
-"gh" = (/obj/machinery/door/window/southright{name = "Containment Pen"; req_access = list(47)},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology)
+"gh" = (/obj/effect/floor_decal/industrial/warning,/obj/machinery/door/window/brigdoor/southright{name = "Containment Pen"; req_access = list(47)},/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology)
"gi" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/industrial/warning,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology)
"gj" = (/obj/effect/floor_decal/industrial/warning,/obj/structure/sink{pixel_y = 30},/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/tiled,/area/outpost/research/xenobiology)
"gk" = (/obj/structure/table/reinforced,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/industrial/warning,/obj/machinery/button/remote/blast_door{id = "xenobio2"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access = list(55)},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology)
@@ -371,8 +371,8 @@
"hg" = (/obj/structure/cable/blue{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled,/area/outpost/research/xenobiology)
"hh" = (/obj/structure/cable/blue{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/outpost/research/xenobiology)
"hi" = (/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/outpost/research/xenobiology)
-"hj" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen"; req_access = list(55)},/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology)
-"hk" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio3"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/door/window/eastleft{name = "Containment Pen"; req_access = list(55)},/turf/simulated/floor/reinforced,/area/outpost/research/xenobiology)
+"hj" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio3"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/door/window/brigdoor/eastright{name = "Containment Pen"; req_access = list(47)},/turf/simulated/floor/reinforced,/area/outpost/research/xenobiology)
+"hk" = (/obj/machinery/door/window/brigdoor/westleft{name = "Containment Pen"; req_access = list(47)},/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology)
"hl" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/tiled,/area/outpost/research/hallway/catwalk)
"hm" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/lattice,/obj/structure/window/reinforced,/turf/space,/area/space)
"hn" = (/obj/structure/lattice,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/space,/area/space)
@@ -442,7 +442,7 @@
"iz" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/airless,/area/mine/explored)
"iA" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/blue,/turf/simulated/floor/tiled,/area/outpost/research/xenobiology)
"iB" = (/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/outpost/research/xenobiology)
-"iC" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio4"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/door/window/eastleft{name = "Containment Pen"; req_access = list(55)},/turf/simulated/floor/reinforced,/area/outpost/research/xenobiology)
+"iC" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio4"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/door/window/brigdoor/eastright{name = "Containment Pen"; req_access = list(47)},/turf/simulated/floor/reinforced,/area/outpost/research/xenobiology)
"iD" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/research/hallway/catwalk)
"iE" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/outpost/research/hallway/catwalk)
"iF" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/lattice,/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored)
@@ -471,7 +471,7 @@
"jc" = (/obj/structure/bed/chair/office/light,/turf/simulated/floor/tiled,/area/outpost/research/xenobiology)
"jd" = (/obj/machinery/camera/network/research_outpost{c_tag = "OPR - Xenobiology Aft Port"; dir = 1},/obj/structure/cable/blue,/turf/simulated/floor/tiled,/area/outpost/research/xenobiology)
"je" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 9},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology)
-"jf" = (/obj/machinery/door/window/southright{dir = 1; name = "Containment Pen"; req_access = list(47)},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology)
+"jf" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/machinery/door/window/brigdoor/northright{name = "Containment Pen"; req_access = list(47)},/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology)
"jg" = (/obj/structure/table/reinforced,/obj/machinery/button/remote/blast_door{id = "xenobio6"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access = list(55)},/obj/effect/floor_decal/industrial/warning{dir = 5},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology)
"jh" = (/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for a door to space."; id = "xenobioout6"; name = "Containment Release Switch"; pixel_x = 0; pixel_y = -28; req_access = list(55)},/obj/structure/sink,/obj/structure/cable/blue,/turf/simulated/floor/tiled,/area/outpost/research/xenobiology)
"ji" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology)
@@ -483,10 +483,10 @@
"jo" = (/obj/structure/table/standard,/obj/item/weapon/melee/baton/slime/loaded,/obj/item/weapon/gun/energy/taser/xeno,/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology)
"jp" = (/obj/item/clothing/shoes/galoshes,/obj/item/clothing/shoes/galoshes,/turf/simulated/floor/tiled,/area/outpost/research/xenobiology)
"jq" = (/obj/structure/grille,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio6"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/disposalpipe/segment,/obj/structure/cable/blue,/obj/structure/window/reinforced/full,/turf/simulated/floor/plating,/area/outpost/research/xenobiology)
-"jr" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio6"; name = "Containment Blast Doors"; opacity = 0},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/window/southright{name = "Containment Pen"; req_access = list(47)},/turf/simulated/floor/reinforced,/area/outpost/research/xenobiology)
+"jr" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio6"; name = "Containment Blast Doors"; opacity = 0},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/window/brigdoor/southright{name = "Containment Pen"; req_access = list(47)},/turf/simulated/floor/reinforced,/area/outpost/research/xenobiology)
"js" = (/obj/structure/grille,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio6"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable/blue,/obj/structure/window/reinforced/full,/turf/simulated/floor/plating,/area/outpost/research/xenobiology)
"jt" = (/obj/structure/grille,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio5"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/disposalpipe/segment,/obj/structure/cable/blue,/obj/structure/window/reinforced/full,/turf/simulated/floor/plating,/area/outpost/research/xenobiology)
-"ju" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio5"; name = "Containment Blast Doors"; opacity = 0},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/window/southright{name = "Containment Pen"; req_access = list(47)},/turf/simulated/floor/reinforced,/area/outpost/research/xenobiology)
+"ju" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio5"; name = "Containment Blast Doors"; opacity = 0},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/window/brigdoor/southright{name = "Containment Pen"; req_access = list(47)},/turf/simulated/floor/reinforced,/area/outpost/research/xenobiology)
"jv" = (/obj/structure/grille,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio5"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable/blue,/obj/structure/window/reinforced/full,/turf/simulated/floor/plating,/area/outpost/research/xenobiology)
"jw" = (/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/outpost/research/xenobiology)
"jx" = (/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/extinguisher,/obj/item/weapon/extinguisher,/turf/simulated/floor/tiled/dark,/area/outpost/research/xenobiology)
@@ -1912,7 +1912,7 @@
"KN" = (/obj/structure/lattice,/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/space,/area/space)
"KO" = (/obj/structure/lattice,/obj/structure/grille,/turf/space,/area/space)
"KP" = (/obj/machinery/power/tracker,/obj/structure/cable/yellow,/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/engineering/solarsoutside/aft)
-
+
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -2005,11 +2005,11 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadndndnafafgagbafafdTaafPgcfQfQdndndndndnffffgdfSgegfggghgigjgkghglgmgefSgnffadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadndngogpgqgrgsaaaagcgcgcgcaadndndndngtgufSfSfSgvgwgxgygzgAgxgBgCgDffffffffffadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadngEgFgGgHgIaaaagJgKgJgKaaaaaaaadngLgMgNgOgegPgQgRgRgSgRgRgRgTgUgVfrgWfrffadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadngXgYgZgHgIhaaaaaaaaaaaaaaahahbhchdffffffffhehfhggxhhfSfSgehihjhkfrfrfrffadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadngXgYgZgHgIhaaaaaaaaaaaaaaahahbhchdffffffffhehfhggxhhfSfSgehihkhjfrfrfrffadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagEhlgGgHhmhbhbhbhbhbhbhbhbhnhlhoffhphqhrffhshthuhvhwhxfSgehyhzhAhBhBhCffadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahDhEhFhGhHhHhIhJhHhHhHhKhHhHhLhMhNhOhPhQhRhShThUhVffhWhXhYhZiaffibibibffadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaicgFidieifififigifififihifififiiffijikilffhihfhiiminiohigeipiqirisisisffadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaitiuiviwixiyiyiyiyiyiyiyiyiyizhdffffffffiAhfgvgxiBgxhhgehihjiCfrfrfrffadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaitiuiviwixiyiyiyiyiyiyiyiyiyizhdffffffffiAhfgvgxiBgxhhgehihkiCfrfrfrffadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiciDiEiFdndnaaaaaaaaaaaaaaaaaagtiGiHiIiJiKiLiMiMiNiMiMiMiOhziPiQiRiSffadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiciTiEiFdndndnaaaaaaaaaaaaaaaagLiUfSfSiVhgiWgxiXiYiBgxiZjagDffffffffffadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiciTiEiFdndndnaaaaaaaaaaaaaaaaffffjbjcgejdjejfjgjhjijfjjjkgefSjlffadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -2170,3 +2170,4 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
"}
+
diff --git a/maps/southern_cross/southern_cross-1.dmm b/maps/southern_cross/southern_cross-1.dmm
index f7a9f84c3c..571e78dc1f 100644
--- a/maps/southern_cross/southern_cross-1.dmm
+++ b/maps/southern_cross/southern_cross-1.dmm
@@ -5382,7 +5382,7 @@
"bZz" = (/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/simulated/floor/plating,/area/maintenance/robotics)
"bZA" = (/obj/machinery/portable_atmospherics/powered/scrubber,/turf/simulated/floor/plating,/area/maintenance/robotics)
"bZB" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/robotics)
-"bZC" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/blast/shutters{dir = 2; id = "mining_storage"; name = "Mining Storage"},/turf/simulated/floor/tiled/dark,/area/assembly/chargebay)
+"bZC" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/blast/shutters{dir = 2; id = "Skynet_launch"; name = "Mining Storage"},/turf/simulated/floor/tiled/dark,/area/assembly/chargebay)
"bZD" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/machinery/light/small{dir = 8},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/research_medical)
"bZE" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/research_medical)
"bZF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/research_medical)
@@ -10110,6 +10110,7 @@
"dMv" = (/obj/machinery/hologram/holopad,/turf/simulated/shuttle/floor,/area/shuttle/arrival/station)
"dMw" = (/obj/effect/landmark{name = "carpspawn"},/turf/space,/area/shuttle/shuttle2/arrivals_dock)
"dMx" = (/obj/effect/landmark{name = "carpspawn"},/turf/space,/area/shuttle/response_ship/thirddeck)
+"dMy" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/blast/shutters{dir = 2; id = "Skynet_launch"; name = "Mech Bay"},/turf/simulated/floor/tiled/dark,/area/assembly/chargebay)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -10493,7 +10494,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvybvybvybvybvybvybvybvybvybvybvybvybvyaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvybvybvybvybvybvybvybvybvybvybvybvybvyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaabFVbOobFVbOobFVbOobFVbOobFVbOobFVbOoaadbTwbTxbTybTzbTAbTBbTCbTAbRZbTDbTEbTFbwObTGbTHbTGbysbTIbTJbLcbTKbOybOybTLbSjbOybOybTMbLgbTNbTObTPbTQbTRbTSbMYbJXbAhbAhbNbbTTbTUbLsbLsbLsbLsbTVbNjbTWbNjbTXbNjbNjbNjbpJbtybxBbTYbpJaaaaaabGKbTZbUabUbbUcbUdbUebUfbUgbUhbUibRbbUjbUjbUkbUlbRibUmbUnbUobUobUpbUqbUrbRibUsbUtbUubSTbUvbDNaaaaaabrybPsbzcbrybKrbUwbUxbUybUybUzbUAbUBbUCbUDbUEbUFbUGbUHbUIbUIbUIbUJbUKbULbUMbUNbUObTlbUPbUQbURbUSbKBbUTbUUbUVbKBbUWbUXbUYbKEbMubMvbUZbVabVbbVcbVdbVebVfbVgbVhbVibVjbVkbVkbVjbVjbVjbVjbVjaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvybvybvybvybvybvybvybvybvybvybvybvybvyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaabQdbQebQfbQebQfbQebQfbQebQfbQebQfbQebQgbVlbOqbVmbTCbTAbTBbTCbTAbRZbVnbVobVobVobVobVobVobVobVpbVqbLcbVrbVsbVtbVubVvbVwbVxbVybLgbLgbVzbLgbVAbVBbLgbVCbJXbAhbAhbVDbLqbVEbVFbVGbVHbVIbVJbNjbVKbNjbVLbNjbVMbVNbVObtybxBbtybpJaaaaaabGKbVPbVQbPgbVRbVSbVTbVUbVVbVWbVXbVYbVZbWabWbbWcbRibWdbWebWfbWgbWhbUqbWibWjbWkbWlbWmbWnbWobDNaaaaaabrybPsbWpbWqbKrbKrbWrbWsbWtbWubPAbWvbWwbWxbWybWzbWAbWBbWCbWDbWEbWFbUKbWGbWHbWIbWJbTlbKBbWKbKBbKBbKBbKBbKBbKBbKBbKEbKEbKEbKEbWLbWMbUZbWNbWObWPbWQbWRbWSbVebVhbVhbVjbWTbWUbWVbVjbWWbWXbVjbVjaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvybvybvybvybvybvybvybvybvyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafbQdbWYbWZbWYbWZbWYbWZbWYbWZbWYbWZbWYbQgbXabOqbXbbTCbXcbXdbTCbXcbRZbXebVobXfbXgbXhbXibXjbVobSfbXkbVybVybVybVybVybVybVybVybVybXlbLgbLgbLgbLgbLgbLgbXmbXnbyHbXobXmbXpbXpbXpbXpbXpbXpbXpbXqbXqbXqbXqbNjbXrbXsbpJbXtbXubXvbpJaaaaaabGKbXwbXxbLEbXybXzbRbbRbbRbbRbbRbbRbbXAbXBbXBbXCbRibRibRibRibRibXDbUqbXEbRibIGbWlbWmbWnbXFbDNaaaaaabrybXGbsIbsIbXHbKrbKrbKrbKrbKrbKrbXIbXJbXKbXJbXIbKybKybKybKybKybKybTlbXLbXMbXMbXNbTlbXObXObXObXPbXQbXRbXSbXTbXUbXVbXWbsTbXXbXYbXZbYabYbbYcbYdbWQbWRbYebVebYfbVhbYgbYhbYibYjbVkbYkbYibYlbVjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvybvybvybvybvybvybvyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaabHJbYmbHJbYmbHJbYmbHJbYmbHJbYmbHJbYmaafaafbOqbYnbYobYpbYqbYrbYsbYtbYubYvbYwbYxbYybYzbYAbYBbSfbYCbYDbYEbYFbYGbYHbYHbYHbYHbYHbYHbYHbYHbYHbYIbYJbYKbYLbYMbYNbYNbYObpJbYPbYPbYQbyVbYRbtybwfbwfbqSbqTbpJbYSbpJbpJbtybxBbYTbpJaaaaaabGJbYUbXxbLEbYVbYWbYXbYYbYZbZabZbbZcbZdbZebZebZfbZebZebZebZgbZhbZibZjbZkbRibIGbZlbLKbWnbSUbGLaaaaaabrybZmbZnbZnbZnbZobZpbsIbZqbZrbrybZsbZtbZubZtbZvbZwbZxbZybZzbZAbZBbTlbTlbZCbZCbTlbTlbZDbZEbZEbZFbZGbZHbZIbZIbZIbXRbZJbsTbZKbZLbJnbZMbZNbZObZPbWQbWRbWRbYebYebVhbVjbZQbZRbZSbZTbZUbZVbZWbZXbZYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvybvybvybvybvybvybvyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaabHJbYmbHJbYmbHJbYmbHJbYmbHJbYmbHJbYmaafaafbOqbYnbYobYpbYqbYrbYsbYtbYubYvbYwbYxbYybYzbYAbYBbSfbYCbYDbYEbYFbYGbYHbYHbYHbYHbYHbYHbYHbYHbYHbYIbYJbYKbYLbYMbYNbYNbYObpJbYPbYPbYQbyVbYRbtybwfbwfbqSbqTbpJbYSbpJbpJbtybxBbYTbpJaaaaaabGJbYUbXxbLEbYVbYWbYXbYYbYZbZabZbbZcbZdbZebZebZfbZebZebZebZgbZhbZibZjbZkbRibIGbZlbLKbWnbSUbGLaaaaaabrybZmbZnbZnbZnbZobZpbsIbZqbZrbrybZsbZtbZubZtbZvbZwbZxbZybZzbZAbZBbTlbTlbZCdMybTlbTlbZDbZEbZEbZFbZGbZHbZIbZIbZIbXRbZJbsTbZKbZLbJnbZMbZNbZObZPbWQbWRbWRbYebYebVhbVjbZQbZRbZSbZTbZUbZVbZWbZXbZYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOqbZZcaacabcaccadcaebRZcafbVobVobVobVocagcahcaicajcakcalcalcamcancaocaocaocaocaocaocaobYKbYKbYKcapcaqcarcascatcaucavcawcaxcaycaxcaxcaxcaxcaxcazcazcazcazcaAcazcazcazcaBcaCbpJbGKbGKbGJcaDbXxbLEbXycaEcaFcaGcaGcaHbZbcaIbRfbRfbRfbRfbRfbRfbRfcaIbRjcaJcaKcaLbRicaMbZlbIGcaNcaObGLcaPcaPbrybPsbsIbzcbxMbxNcaQbsIcaRbsIcaScaTcaUcaVcaUcaTcaWbZxcaXcaYcaZcbacbbcbccbdcaUcbecbecbfbXPbXPbXPbXPbXPbXPbXPbZIbXRcbgbsTcbhcbicbjbUZcbkcblcbmbWQbWRbYecbncbobVhbVjcbpcbqcbrbVjbVkcbsbVkbVjbVjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOpbOqcbtcbtbOqcbucbvcbwbRZcbxcbycbzcbAcbBcbCcbDcbEcbFcbGcbHcbIcbJcbKcaocbLcbLcbLcbLcbLcbMcbNcbObYKcbPcbQcbRcbScbTcbUcbVbpJbpJbpJbpJbpJbpJbpJbpJbpJbpJbpJbpJbpJbpJbpJbpJbpJcbWcbXcbYcbZbGJccaccbcccccdccecaFcaFccfccgbZbcchbRfccicciccicciccibRfccjbRicckcclbRibRiccmccnccmccoccpccqccrccscctccubqtbrybrybrybrybrybrybrybryccvccwccxccyccvbZwbZwbZwcczbZwbZwbZwbZwccAccBcbeccCccDccEccFccFccFccFccFbXPbXRbXRbVibsTccGbsTbsTbUZccHbUZbUZbWQbVhbVibVjbVjbVjbVjccIcbqccJccKccLccMccNccObVjbVjaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccPbOqccQccRccSccTccUccVccWccXccYccZcdacdbcdccddcdecdfcdgcdhcdicalcdjcdkcaocbLcbLcbLcbLcbLcdlcdmcbTcdncdocdpcdpcdqcbTcdocdpcdrcdscbTcdocdtcducdvcdwcdxcdycdpcdzcdAcdBcbTcdncdCcdDcdEcdFcdGcdHbPgbPgcdIcdJcdKcdLcaFbZbbZbbZbbXAbRfccicciccicciccibRfcaIbRibRibRibRiccrcdMcdNcdOcdOcdOcdPcdQcdRcdScdTcdUcdVcdWcdXcdYcdZceacebcdYcdYcdZceccedceeceecefcegcehceeceicejcekccAccBcelccBcemcenccFccFccFccFccFbXPceobXRcepceqcercesbVicetceucevcewbVecexceybVjcezceAbVjceBcbqbYibYibYicbqbYiceCceDbVkaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/maps/submaps/surface_submaps/forest.dm b/maps/submaps/surface_submaps/forest.dm
index be13e4f947..40a045a37d 100644
--- a/maps/submaps/surface_submaps/forest.dm
+++ b/maps/submaps/surface_submaps/forest.dm
@@ -7,4 +7,9 @@
/datum/map_template/surface/farm1
name = "Farm 1"
desc = "A small farm tended by a farmbot."
- mappath = 'maps/submaps/surface_submaps/farm1.dmm'
\ No newline at end of file
+ mappath = 'maps/submaps/surface_submaps/farm1.dmm'
+
+/datum/map_template/surface/spider1
+ name = "Spider Nest 1"
+ desc = "A small spider nest, in the forest."
+ mappath = 'maps/submaps/surface_submaps/spider1.dmm'
\ No newline at end of file
diff --git a/maps/submaps/surface_submaps/forest_areas.dm b/maps/submaps/surface_submaps/forest_areas.dm
index f8fe110cb0..b1d763d4aa 100644
--- a/maps/submaps/surface_submaps/forest_areas.dm
+++ b/maps/submaps/surface_submaps/forest_areas.dm
@@ -3,4 +3,7 @@
icon_state = "submap"
/area/submap/farm1
- name = "farm"
\ No newline at end of file
+ name = "farm"
+
+/area/submap/spider1
+ name = "spider nest"
\ No newline at end of file
diff --git a/maps/submaps/surface_submaps/spider1.dmm b/maps/submaps/surface_submaps/spider1.dmm
new file mode 100644
index 0000000000..761105c246
--- /dev/null
+++ b/maps/submaps/surface_submaps/spider1.dmm
@@ -0,0 +1,21 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/obj/effect/spider/stickyweb,/turf/simulated/floor/outdoors/snow,/area/submap/spider1)
+"c" = (/turf/simulated/floor/outdoors/snow,/area/submap/spider1)
+"d" = (/obj/structure/flora/tree/pine,/turf/simulated/floor/outdoors/snow,/area/submap/spider1)
+"e" = (/obj/effect/spider/eggcluster/small/frost,/turf/simulated/floor/outdoors/snow,/area/submap/spider1)
+"f" = (/mob/living/simple_animal/hostile/giant_spider/frost,/turf/simulated/floor/outdoors/snow,/area/submap/spider1)
+"g" = (/obj/structure/flora/tree/sif,/turf/simulated/floor/outdoors/snow,/area/submap/spider1)
+"h" = (/obj/effect/spider/cocoon,/mob/living/simple_animal/hostile/giant_spider/frost,/turf/simulated/floor/outdoors/snow,/area/submap/spider1)
+
+(1,1,1) = {"
+aaaaaaaaaa
+abbccbbbca
+accbcbccba
+adecccccda
+abcfccccca
+accccccgca
+accccchcca
+acccbbbdca
+acdbcbccca
+aaaaaaaaaa
+"}
diff --git a/polaris.dme b/polaris.dme
index 179a3f6b6d..020ac0f25a 100644
--- a/polaris.dme
+++ b/polaris.dme
@@ -1293,7 +1293,6 @@
#include "code\modules\clothing\spacesuits\void\station.dm"
#include "code\modules\clothing\spacesuits\void\void.dm"
#include "code\modules\clothing\spacesuits\void\wizard.dm"
-#include "code\modules\clothing\suits\alien.dm"
#include "code\modules\clothing\suits\armor.dm"
#include "code\modules\clothing\suits\bio.dm"
#include "code\modules\clothing\suits\jobs.dm"
@@ -1304,7 +1303,10 @@
#include "code\modules\clothing\suits\toggles.dm"
#include "code\modules\clothing\suits\utility.dm"
#include "code\modules\clothing\suits\wiz_robe.dm"
-#include "code\modules\clothing\suits\xenos\seromi.dm"
+#include "code\modules\clothing\suits\aliens\seromi.dm"
+#include "code\modules\clothing\suits\aliens\tajara.dm"
+#include "code\modules\clothing\suits\aliens\unathi.dm"
+#include "code\modules\clothing\suits\aliens\vox.dm"
#include "code\modules\clothing\under\color.dm"
#include "code\modules\clothing\under\miscellaneous.dm"
#include "code\modules\clothing\under\pants.dm"
@@ -1556,11 +1558,13 @@
#include "code\modules\mob\mob_helpers.dm"
#include "code\modules\mob\mob_movement.dm"
#include "code\modules\mob\mob_transformation_simple.dm"
-#include "code\modules\mob\modifiers.dm"
#include "code\modules\mob\say.dm"
#include "code\modules\mob\transform_procs.dm"
#include "code\modules\mob\typing_indicator.dm"
#include "code\modules\mob\update_icons.dm"
+#include "code\modules\mob\_modifiers\cloning.dm"
+#include "code\modules\mob\_modifiers\modifiers.dm"
+#include "code\modules\mob\_modifiers\traits.dm"
#include "code\modules\mob\dead\death.dm"
#include "code\modules\mob\dead\observer\login.dm"
#include "code\modules\mob\dead\observer\logout.dm"
@@ -2082,6 +2086,7 @@
#include "code\modules\scripting\Scanner\Tokens.dm"
#include "code\modules\security levels\keycard authentication.dm"
#include "code\modules\security levels\security levels.dm"
+#include "code\modules\shieldgen\directional_shield.dm"
#include "code\modules\shieldgen\emergency_shield.dm"
#include "code\modules\shieldgen\energy_field.dm"
#include "code\modules\shieldgen\handheld_defuser.dm"