diff --git a/code/ATMOSPHERICS/components/unary/cold_sink.dm b/code/ATMOSPHERICS/components/unary/cold_sink.dm
index 9fcdad86139..faefa64883d 100644
--- a/code/ATMOSPHERICS/components/unary/cold_sink.dm
+++ b/code/ATMOSPHERICS/components/unary/cold_sink.dm
@@ -10,6 +10,7 @@
anchored = 1
use_power = 0
idle_power_usage = 5 // 5 Watts for thermostat related circuitry
+ circuit = /obj/item/weapon/circuitboard/unary_atmos/cooler
var/heatsink_temperature = T20C // The constant temperature reservoir into which the freezer pumps heat. Probably the hull of the station or something.
var/internal_volume = 600 // L
@@ -24,7 +25,6 @@
..()
initialize_directions = dir
component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/unary_atmos/cooler(src)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
component_parts += new /obj/item/weapon/stock_parts/capacitor(src)
component_parts += new /obj/item/weapon/stock_parts/capacitor(src)
diff --git a/code/ATMOSPHERICS/components/unary/heat_source.dm b/code/ATMOSPHERICS/components/unary/heat_source.dm
index e139f6faf3f..aa51d9669f0 100644
--- a/code/ATMOSPHERICS/components/unary/heat_source.dm
+++ b/code/ATMOSPHERICS/components/unary/heat_source.dm
@@ -10,6 +10,7 @@
anchored = 1
use_power = 0
idle_power_usage = 5 //5 Watts for thermostat related circuitry
+ circuit = /obj/item/weapon/circuitboard/unary_atmos/heater
var/max_temperature = T20C + 680
var/internal_volume = 600 //L
@@ -25,7 +26,6 @@
initialize_directions = dir
component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/unary_atmos/heater(src)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
component_parts += new /obj/item/weapon/stock_parts/capacitor(src)
component_parts += new /obj/item/weapon/stock_parts/capacitor(src)
diff --git a/code/ZAS/Fire.dm b/code/ZAS/Fire.dm
index 7222470f71c..bb4ec95a844 100644
--- a/code/ZAS/Fire.dm
+++ b/code/ZAS/Fire.dm
@@ -406,7 +406,7 @@ datum/gas_mixture/proc/check_recombustability(list/fuel_objs)
//Get heat transfer coefficients for clothing.
for(var/obj/item/clothing/C in src)
- if(l_hand == C || r_hand == C)
+ if(item_is_in_hands(C))
continue
if( C.max_heat_protection_temperature >= last_temperature )
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index 9fa5fa36546..7d7468b91a7 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -94,10 +94,7 @@
if(W == A) // Handle attack_self
W.attack_self(src)
- if(hand)
- update_inv_l_hand(0)
- else
- update_inv_r_hand(0)
+ update_inv_active_hand(0)
return 1
//Atoms on your person
diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm
index 751021892c8..63ef549122e 100644
--- a/code/_onclick/hud/human.dm
+++ b/code/_onclick/hud/human.dm
@@ -162,7 +162,7 @@
inv_box.name = "r_hand"
inv_box.icon = ui_style
inv_box.icon_state = "r_hand_inactive"
- if(mymob && !mymob.hand) //This being 0 or null means the right hand is in use
+ if(!target.hand) //This being 0 or null means the right hand is in use
inv_box.icon_state = "r_hand_active"
inv_box.screen_loc = ui_rhand
inv_box.slot_id = slot_r_hand
@@ -177,7 +177,7 @@
inv_box.name = "l_hand"
inv_box.icon = ui_style
inv_box.icon_state = "l_hand_inactive"
- if(mymob && mymob.hand) //This being 1 means the left hand is in use
+ if(target.hand) //This being 1 means the left hand is in use
inv_box.icon_state = "l_hand_active"
inv_box.screen_loc = ui_lhand
inv_box.slot_id = slot_l_hand
diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index 1bf774c8500..c4f43411fba 100644
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -1001,7 +1001,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
containername = "Security barrier crate"
group = "Security"
-/datum/supply_packs/securitybarriers
+/datum/supply_packs/securityshieldgen
name = "Wall shield Generators"
contains = list(/obj/machinery/shieldwallgen,
/obj/machinery/shieldwallgen,
@@ -1729,7 +1729,8 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/obj/item/device/camera_film,
/obj/item/device/camera_film,
/obj/item/weapon/storage/photo_album,
- /obj/item/device/reagent_scanner)
+ /obj/item/device/reagent_scanner,
+ /obj/item/device/flashlight/maglight)
cost = 35
containertype = "/obj/structure/closet/crate/secure"
containername = "Forensic equipment"
@@ -1785,7 +1786,8 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/obj/item/clothing/accessory/storage/black_vest,
/obj/item/clothing/head/soft/sec/corp,
/obj/item/clothing/under/rank/security/corp,
- /obj/item/weapon/gun/energy/taser)
+ /obj/item/weapon/gun/energy/taser,
+ /obj/item/device/flashlight/maglight)
cost = 30
containertype = "/obj/structure/closet/crate/secure"
containername = "Officer equipment"
@@ -1811,7 +1813,8 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/obj/item/weapon/reagent_containers/spray/pepper,
/obj/item/weapon/melee/baton/loaded,
/obj/item/weapon/storage/box/holobadge,
- /obj/item/clothing/head/beret/sec/corporate/warden)
+ /obj/item/clothing/head/beret/sec/corporate/warden,
+ /obj/item/device/flashlight/maglight)
cost = 45
containertype = "/obj/structure/closet/crate/secure"
containername = "Warden equipment"
@@ -1835,7 +1838,8 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/obj/item/clothing/accessory/holster/waist,
/obj/item/weapon/melee/telebaton,
/obj/item/weapon/shield/riot/tele,
- /obj/item/clothing/head/beret/sec/corporate/hos)
+ /obj/item/clothing/head/beret/sec/corporate/hos,
+ /obj/item/device/flashlight/maglight)
cost = 65
containertype = "/obj/structure/closet/crate/secure"
containername = "Head of security equipment"
diff --git a/code/datums/wires/alarm.dm b/code/datums/wires/alarm.dm
index c34b0291fbb..ace1ba9ec35 100644
--- a/code/datums/wires/alarm.dm
+++ b/code/datums/wires/alarm.dm
@@ -11,7 +11,7 @@ var/const/AALARM_WIRE_AALARM = 16
/datum/wires/alarm/CanUse(var/mob/living/L)
var/obj/machinery/alarm/A = holder
- if(A.wiresexposed && A.buildstage == 2)
+ if(A.wiresexposed)
return 1
return 0
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index 83033257e37..a366dc98460 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -599,3 +599,29 @@
icon = 'icons/obj/stock_parts.dmi'
icon_state = "smes_coil"
origin_tech = list(TECH_MATERIAL = 19, TECH_ENGINEERING = 19, TECH_PHORON = 19, TECH_POWER = 19, TECH_BLUESPACE = 19, TECH_BIO = 19, TECH_COMBAT = 19, TECH_MAGNET = 19, TECH_DATA = 19, TECH_ILLEGAL = 19, TECH_ARCANE = 19)
+
+// Additional construction stock parts
+
+/obj/item/weapon/stock_parts/gear
+ name = "gear"
+ desc = "A gear used for construction."
+ icon = 'icons/obj/stock_parts.dmi'
+ icon_state = "gear"
+ origin_tech = list(TECH_ENGINEERING = 1)
+ matter = list(DEFAULT_WALL_MATERIAL = 50)
+
+/obj/item/weapon/stock_parts/motor
+ name = "motor"
+ desc = "A motor used for construction."
+ icon = 'icons/obj/stock_parts.dmi'
+ icon_state = "motor"
+ origin_tech = list(TECH_ENGINEERING = 1)
+ matter = list(DEFAULT_WALL_MATERIAL = 60, "glass" = 10)
+
+/obj/item/weapon/stock_parts/spring
+ name = "spring"
+ desc = "A spring used for construction."
+ icon = 'icons/obj/stock_parts.dmi'
+ icon_state = "spring"
+ origin_tech = list(TECH_ENGINEERING = 1)
+ matter = list(DEFAULT_WALL_MATERIAL = 40)
\ No newline at end of file
diff --git a/code/game/antagonist/antagonist_create.dm b/code/game/antagonist/antagonist_create.dm
index 072dd88bee4..65c7a080cd8 100644
--- a/code/game/antagonist/antagonist_create.dm
+++ b/code/game/antagonist/antagonist_create.dm
@@ -76,7 +76,7 @@
P.info = "The nuclear authorization code is: [code]"
P.name = "nuclear bomb code"
if(leader && leader.current)
- if(get_turf(P) == get_turf(leader.current) && !(leader.current.l_hand && leader.current.r_hand))
+ if(get_turf(P) == get_turf(leader.current))
leader.current.put_in_hands(P)
if(!code_owner && leader)
diff --git a/code/game/antagonist/station/renegade.dm b/code/game/antagonist/station/renegade.dm
index cd9dd9b83bb..b077977fd7a 100644
--- a/code/game/antagonist/station/renegade.dm
+++ b/code/game/antagonist/station/renegade.dm
@@ -50,8 +50,7 @@ var/datum/antagonist/renegade/renegades
var/gun_type = pick(spawn_guns)
var/obj/item/gun = new gun_type(get_turf(player))
- if(!(player.l_hand && player.r_hand))
- player.put_in_hands(gun)
+ player.put_in_hands(gun)
/proc/rightandwrong()
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index 07b3dcacc5c..81f0da074de 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -292,12 +292,14 @@ var/list/mob/living/forced_ambiance_list = new
mob << "The sudden appearance of gravity makes you fall to the floor!"
/area/proc/prison_break()
- for(var/obj/machinery/power/apc/temp_apc in src)
- temp_apc.overload_lighting(70)
- for(var/obj/machinery/door/airlock/temp_airlock in src)
- temp_airlock.prison_open()
- for(var/obj/machinery/door/window/temp_windoor in src)
- temp_windoor.open()
+ var/obj/machinery/power/apc/theAPC = get_apc()
+ if(theAPC.operating)
+ for(var/obj/machinery/power/apc/temp_apc in src)
+ temp_apc.overload_lighting(70)
+ for(var/obj/machinery/door/airlock/temp_airlock in src)
+ temp_airlock.prison_open()
+ for(var/obj/machinery/door/window/temp_windoor in src)
+ temp_windoor.open()
/area/proc/has_gravity()
return has_gravity
diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm
index b37342ced52..3138c654394 100644
--- a/code/game/dna/dna_modifier.dm
+++ b/code/game/dna/dna_modifier.dm
@@ -47,6 +47,7 @@
idle_power_usage = 50
active_power_usage = 300
interact_offline = 1
+ circuit = /obj/item/weapon/circuitboard/clonescanner
var/locked = 0
var/mob/living/carbon/occupant = null
var/obj/item/weapon/reagent_containers/glass/beaker = null
@@ -55,7 +56,6 @@
/obj/machinery/dna_scannernew/New()
..()
component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/clonescanner(src)
component_parts += new /obj/item/weapon/stock_parts/scanning_module(src)
component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
component_parts += new /obj/item/weapon/stock_parts/micro_laser(src)
diff --git a/code/game/gamemodes/changeling/generic_equip_procs.dm b/code/game/gamemodes/changeling/generic_equip_procs.dm
index 5569db85125..930e50c9c84 100644
--- a/code/game/gamemodes/changeling/generic_equip_procs.dm
+++ b/code/game/gamemodes/changeling/generic_equip_procs.dm
@@ -244,7 +244,7 @@
var/mob/living/carbon/human/M = src
- if(M.l_hand && M.r_hand) //Make sure our hands aren't full.
+ if(M.hands_are_full()) //Make sure our hands aren't full.
src << "Our hands are full. Drop something first."
return 0
diff --git a/code/game/gamemodes/changeling/powers/armblade.dm b/code/game/gamemodes/changeling/powers/armblade.dm
index c5441d90eef..92b86ce2ee5 100644
--- a/code/game/gamemodes/changeling/powers/armblade.dm
+++ b/code/game/gamemodes/changeling/powers/armblade.dm
@@ -68,7 +68,7 @@
..()
/obj/item/weapon/melee/arm_blade/process() //Stolen from ninja swords.
- if(!creator || loc != creator || (creator.l_hand != src && creator.r_hand != src))
+ if(!creator || loc != creator || !creator.item_is_in_hands(src))
// Tidy up a bit.
if(istype(loc,/mob/living))
var/mob/living/carbon/human/host = loc
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index d3603fe96e1..699898fde07 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -54,6 +54,7 @@
var/wiresexposed = 0 // If it's been screwdrivered open.
var/aidisabled = 0
var/shorted = 0
+ circuit = /obj/item/weapon/circuitboard/airalarm
var/datum/wires/alarm/wires
@@ -61,7 +62,6 @@
var/screen = AALARM_SCREEN_MAIN
var/area_uid
var/area/alarm_area
- var/buildstage = 2 //2 is built, 1 is building, 0 is frame.
var/target_temperature = T0C+20
var/regulating_temperature = 0
@@ -105,23 +105,8 @@
wires = null
return ..()
-/obj/machinery/alarm/New(var/loc, var/dir, var/building = 0)
+/obj/machinery/alarm/New()
..()
-
- if(building)
- if(loc)
- src.loc = loc
-
- if(dir)
- src.set_dir(dir)
-
- buildstage = 0
- wiresexposed = 1
- pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24)
- pixel_y = (dir & 3)? (dir ==1 ? -24 : 24) : 0
- update_icon()
- return
-
first_run()
/obj/machinery/alarm/proc/first_run()
@@ -148,7 +133,7 @@
elect_master()
/obj/machinery/alarm/process()
- if((stat & (NOPOWER|BROKEN)) || shorted || buildstage != 2)
+ if((stat & (NOPOWER|BROKEN)) || shorted)
return
var/turf/simulated/location = loc
@@ -605,9 +590,6 @@
data["thresholds"] = thresholds
/obj/machinery/alarm/CanUseTopic(var/mob/user, var/datum/topic_state/state, var/href_list = list())
- if(buildstage != 2)
- return STATUS_CLOSE
-
if(aidisabled && isAI(user))
user << "AI control for \the [src] interface has been disabled."
return STATUS_CLOSE
@@ -763,73 +745,43 @@
/obj/machinery/alarm/attackby(obj/item/W as obj, mob/user as mob)
src.add_fingerprint(user)
+ if(istype(W, /obj/item/weapon/screwdriver)) // Opening that Air Alarm up.
+ //user << "You pop the Air Alarm's maintence panel open."
+ wiresexposed = !wiresexposed
+ user << "The wires have been [wiresexposed ? "exposed" : "unexposed"]"
+ update_icon()
+ return
- switch(buildstage)
- if(2)
- if(istype(W, /obj/item/weapon/screwdriver)) // Opening that Air Alarm up.
- //user << "You pop the Air Alarm's maintence panel open."
- wiresexposed = !wiresexposed
- user << "The wires have been [wiresexposed ? "exposed" : "unexposed"]"
- update_icon()
- return
+ if (wiresexposed && istype(W, /obj/item/weapon/wirecutters))
+ user.visible_message("[user] has cut the wires inside \the [src]!", "You have cut the wires inside \the [src].")
+ playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
+ new/obj/item/stack/cable_coil(get_turf(src), 5)
+ var/obj/structure/frame/A = new /obj/structure/frame( src.loc )
+ var/obj/item/weapon/circuitboard/M = new circuit( A )
+ A.frame_type = "airalarm"
+ A.pixel_x = pixel_x
+ A.pixel_y = pixel_y
+ A.set_dir(dir)
+ A.circuit = M
+ A.anchored = 1
+ for (var/obj/C in src)
+ C.forceMove(loc)
+ A.state = 2
+ A.icon_state = "airalarm_2"
+ M.deconstruct(src)
+ qdel(src)
+ return
- if (wiresexposed && istype(W, /obj/item/weapon/wirecutters))
- user.visible_message("[user] has cut the wires inside \the [src]!", "You have cut the wires inside \the [src].")
- playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
- new/obj/item/stack/cable_coil(get_turf(src), 5)
- buildstage = 1
- update_icon()
- return
-
- if (istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda))// trying to unlock the interface with an ID card
- if(stat & (NOPOWER|BROKEN))
- user << "It does nothing"
- return
- else
- if(allowed(usr) && !wires.IsIndexCut(AALARM_WIRE_IDSCAN))
- locked = !locked
- user << "You [ locked ? "lock" : "unlock"] the Air Alarm interface."
- else
- user << "Access denied."
+ if (istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda))// trying to unlock the interface with an ID card
+ if(stat & (NOPOWER|BROKEN))
+ user << "It does nothing"
return
-
- if(1)
- if(istype(W, /obj/item/stack/cable_coil))
- var/obj/item/stack/cable_coil/C = W
- if (C.use(5))
- user << "You wire \the [src]."
- buildstage = 2
- update_icon()
- first_run()
- return
- else
- user << "You need 5 pieces of cable to do wire \the [src]."
- return
-
- else if(istype(W, /obj/item/weapon/crowbar))
- user << "You start prying out the circuit."
- playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
- if(do_after(user,20))
- user << "You pry out the circuit!"
- var/obj/item/weapon/airalarm_electronics/circuit = new /obj/item/weapon/airalarm_electronics()
- circuit.loc = user.loc
- buildstage = 0
- update_icon()
- return
- if(0)
- if(istype(W, /obj/item/weapon/airalarm_electronics))
- user << "You insert the circuit!"
- qdel(W)
- buildstage = 1
- update_icon()
- return
-
- else if(istype(W, /obj/item/weapon/wrench))
- user << "You remove the fire alarm assembly from the wall!"
- new /obj/item/frame/air_alarm(get_turf(user))
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
- qdel(src)
-
+ else
+ if(allowed(usr) && !wires.IsIndexCut(AALARM_WIRE_IDSCAN))
+ locked = !locked
+ user << "You [ locked ? "lock" : "unlock"] the Air Alarm interface."
+ else
+ user << "Access denied."
return ..()
/obj/machinery/alarm/power_change()
@@ -839,14 +791,10 @@
/obj/machinery/alarm/examine(mob/user)
..(user)
- if (buildstage < 2)
- user << "It is not wired."
- if (buildstage < 1)
- user << "The circuit is missing."
/*
AIR ALARM CIRCUIT
Just a object used in constructing air alarms
-*/
+
/obj/item/weapon/airalarm_electronics
name = "air alarm electronics"
icon = 'icons/obj/doors/door_assembly.dmi'
@@ -854,7 +802,7 @@ Just a object used in constructing air alarms
desc = "Looks like a circuit. Probably is."
w_class = 2.0
matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
-
+*/
/*
FIRE ALARM
*/
@@ -875,20 +823,13 @@ FIRE ALARM
power_channel = ENVIRON
var/last_process = 0
var/wiresexposed = 0
- var/buildstage = 2 // 2 = complete, 1 = no wires, 0 = circuit gone
var/seclevel
+ circuit = /obj/item/weapon/circuitboard/firealarm
/obj/machinery/firealarm/update_icon()
overlays.Cut()
if(wiresexposed)
- switch(buildstage)
- if(2)
- icon_state="fire_b2"
- if(1)
- icon_state="fire_b1"
- if(0)
- icon_state="fire_b0"
set_light(0)
return
@@ -932,56 +873,36 @@ FIRE ALARM
/obj/machinery/firealarm/attackby(obj/item/W as obj, mob/user as mob)
src.add_fingerprint(user)
- if (istype(W, /obj/item/weapon/screwdriver) && buildstage == 2)
+ if (istype(W, /obj/item/weapon/screwdriver))
wiresexposed = !wiresexposed
update_icon()
return
if(wiresexposed)
- switch(buildstage)
- if(2)
- if (istype(W, /obj/item/device/multitool))
- src.detecting = !( src.detecting )
- if (src.detecting)
- user.visible_message("\The [user] has reconnected [src]'s detecting unit!", "You have reconnected [src]'s detecting unit.")
- else
- user.visible_message("\The [user] has disconnected [src]'s detecting unit!", "You have disconnected [src]'s detecting unit.")
- else if (istype(W, /obj/item/weapon/wirecutters))
- user.visible_message("\The [user] has cut the wires inside \the [src]!", "You have cut the wires inside \the [src].")
- new/obj/item/stack/cable_coil(get_turf(src), 5)
- playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
- buildstage = 1
- update_icon()
- if(1)
- if(istype(W, /obj/item/stack/cable_coil))
- var/obj/item/stack/cable_coil/C = W
- if (C.use(5))
- user << "You wire \the [src]."
- buildstage = 2
- return
- else
- user << "You need 5 pieces of cable to wire \the [src]."
- return
- else if(istype(W, /obj/item/weapon/crowbar))
- user << "You pry out the circuit!"
- playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
- spawn(20)
- var/obj/item/weapon/firealarm_electronics/circuit = new /obj/item/weapon/firealarm_electronics()
- circuit.loc = user.loc
- buildstage = 0
- update_icon()
- if(0)
- if(istype(W, /obj/item/weapon/firealarm_electronics))
- user << "You insert the circuit!"
- qdel(W)
- buildstage = 1
- update_icon()
-
- else if(istype(W, /obj/item/weapon/wrench))
- user << "You remove the fire alarm assembly from the wall!"
- new /obj/item/frame/fire_alarm(get_turf(user))
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
- qdel(src)
+ if (istype(W, /obj/item/device/multitool))
+ src.detecting = !( src.detecting )
+ if (src.detecting)
+ user.visible_message("\The [user] has reconnected [src]'s detecting unit!", "You have reconnected [src]'s detecting unit.")
+ else
+ user.visible_message("\The [user] has disconnected [src]'s detecting unit!", "You have disconnected [src]'s detecting unit.")
+ else if (istype(W, /obj/item/weapon/wirecutters))
+ user.visible_message("\The [user] has cut the wires inside \the [src]!", "You have cut the wires inside \the [src].")
+ new/obj/item/stack/cable_coil(get_turf(src), 5)
+ playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
+ var/obj/structure/frame/A = new /obj/structure/frame( src.loc )
+ var/obj/item/weapon/circuitboard/M = new circuit( A )
+ A.frame_type = "firealarm"
+ A.pixel_x = pixel_x
+ A.pixel_y = pixel_y
+ A.set_dir(dir)
+ A.circuit = M
+ A.anchored = 1
+ for (var/obj/C in src)
+ C.forceMove(loc)
+ A.state = 2
+ A.icon_state = "firealarm_2"
+ M.deconstruct(src)
+ qdel(src)
return
src.alarm()
@@ -1016,9 +937,6 @@ FIRE ALARM
if(user.stat || stat & (NOPOWER|BROKEN))
return
- if (buildstage != 2)
- return
-
user.set_machine(src)
var/area/A = src.loc
var/d1
@@ -1061,9 +979,6 @@ FIRE ALARM
if (usr.stat || stat & (BROKEN|NOPOWER))
return
- if (buildstage != 2)
- return
-
if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
usr.set_machine(src)
if (href_list["reset"])
@@ -1106,23 +1021,6 @@ FIRE ALARM
//playsound(src.loc, 'sound/ambience/signal.ogg', 75, 0)
return
-
-
-/obj/machinery/firealarm/New(loc, dir, building)
- ..()
-
- if(loc)
- src.loc = loc
-
- if(dir)
- src.set_dir(dir)
-
- if(building)
- buildstage = 0
- wiresexposed = 1
- pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24)
- pixel_y = (dir & 3)? (dir ==1 ? -24 : 24) : 0
-
/obj/machinery/firealarm/proc/set_security_level(var/newlevel)
if(seclevel != newlevel)
seclevel = newlevel
@@ -1135,7 +1033,7 @@ FIRE ALARM
/*
FIRE ALARM CIRCUIT
Just a object used in constructing fire alarms
-*/
+
/obj/item/weapon/firealarm_electronics
name = "fire alarm electronics"
icon = 'icons/obj/doors/door_assembly.dmi'
@@ -1143,7 +1041,7 @@ Just a object used in constructing fire alarms
desc = "A circuit. It has a label on it, it says \"Can handle heat levels up to 40 degrees celsius!\""
w_class = 2.0
matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
-
+*/
/obj/machinery/partyalarm
name = "\improper PARTY BUTTON"
desc = "Cuban Pete is in the house!"
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index 972d9a717bf..14512fb8391 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -7,7 +7,7 @@
use_power = 1
idle_power_usage = 10
active_power_usage = 2000
-
+ circuit = /obj/item/weapon/circuitboard/autolathe
var/list/machine_recipes
var/list/stored_material = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0)
var/list/storage_capacity = list(DEFAULT_WALL_MATERIAL = 0, "glass" = 0)
@@ -30,14 +30,13 @@
wires = new(src)
//Create parts for lathe.
component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/autolathe(src)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
component_parts += new /obj/item/weapon/stock_parts/console_screen(src)
RefreshParts()
-
+
/obj/machinery/autolathe/Destroy()
qdel(wires)
wires = null
diff --git a/code/game/machinery/autolathe_datums.dm b/code/game/machinery/autolathe_datums.dm
index 8c4c2447998..244b74f17fc 100644
--- a/code/game/machinery/autolathe_datums.dm
+++ b/code/game/machinery/autolathe_datums.dm
@@ -158,12 +158,12 @@
/datum/autolathe/recipe/airalarm
name = "air alarm electronics"
- path = /obj/item/weapon/airalarm_electronics
+ path = /obj/item/weapon/circuitboard/airalarm
category = "Engineering"
/datum/autolathe/recipe/firealarm
name = "fire alarm electronics"
- path = /obj/item/weapon/firealarm_electronics
+ path = /obj/item/weapon/circuitboard/firealarm
category = "Engineering"
/datum/autolathe/recipe/powermodule
@@ -171,6 +171,96 @@
path = /obj/item/weapon/module/power_control
category = "Engineering"
+/datum/autolathe/recipe/statusdisplay
+ name = "status display electronics"
+ path = /obj/item/weapon/circuitboard/status_display
+ category = "Engineering"
+
+/datum/autolathe/recipe/aistatusdisplay
+ name = "ai status display electronics"
+ path = /obj/item/weapon/circuitboard/ai_status_display
+ category = "Engineering"
+
+/datum/autolathe/recipe/newscaster
+ name = "newscaster electronics"
+ path = /obj/item/weapon/circuitboard/newscaster
+ category = "Engineering"
+
+/datum/autolathe/recipe/atm
+ name = "atm electronics"
+ path = /obj/item/weapon/circuitboard/atm
+ category = "Engineering"
+
+/datum/autolathe/recipe/intercom
+ name = "intercom electronics"
+ path = /obj/item/weapon/circuitboard/intercom
+ category = "Engineering"
+
+/datum/autolathe/recipe/holopad
+ name = "holopad electronics"
+ path = /obj/item/weapon/circuitboard/holopad
+ category = "Engineering"
+
+/datum/autolathe/recipe/guestpass
+ name = "guestpass console electronics"
+ path = /obj/item/weapon/circuitboard/guestpass
+ category = "Engineering"
+
+/datum/autolathe/recipe/entertainment
+ name = "entertainment camera electronics"
+ path = /obj/item/weapon/circuitboard/security/telescreen/entertainment
+ category = "Engineering"
+
+/datum/autolathe/recipe/keycard
+ name = "keycard authenticator electronics"
+ path = /obj/item/weapon/circuitboard/keycard_auth
+ category = "Engineering"
+
+/datum/autolathe/recipe/photocopier
+ name = "photocopier electronics"
+ path = /obj/item/weapon/circuitboard/photocopier
+ category = "Engineering"
+
+/datum/autolathe/recipe/fax
+ name = "fax machine electronics"
+ path = /obj/item/weapon/circuitboard/fax
+ category = "Engineering"
+
+/datum/autolathe/recipe/conveyor
+ name = "conveyor electronics"
+ path = /obj/item/weapon/circuitboard/conveyor
+ category = "Engineering"
+
+/datum/autolathe/recipe/microwave
+ name = "microwave electronics"
+ path = /obj/item/weapon/circuitboard/microwave
+ category = "Engineering"
+
+/datum/autolathe/recipe/vending
+ name = "vending machine electronics"
+ path = /obj/item/weapon/circuitboard/vending
+ category = "Engineering"
+
+/datum/autolathe/recipe/washing
+ name = "washing machine electronics"
+ path = /obj/item/weapon/circuitboard/washing
+ category = "Engineering"
+
+/datum/autolathe/recipe/motor
+ name = "motor"
+ path = /obj/item/weapon/stock_parts/motor
+ category = "Engineering"
+
+/datum/autolathe/recipe/gear
+ name = "gear"
+ path = /obj/item/weapon/stock_parts/gear
+ category = "Engineering"
+
+/datum/autolathe/recipe/spring
+ name = "spring"
+ path = /obj/item/weapon/stock_parts/spring
+ category = "Engineering"
+
/datum/autolathe/recipe/rcd_ammo
name = "matter cartridge"
path = /obj/item/weapon/rcd_ammo
diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm
index 61ed92d58e5..f2500f0afaa 100644
--- a/code/game/machinery/biogenerator.dm
+++ b/code/game/machinery/biogenerator.dm
@@ -5,6 +5,7 @@
icon_state = "biogen-stand"
density = 1
anchored = 1
+ circuit = /obj/item/weapon/circuitboard/biogenerator
use_power = 1
idle_power_usage = 40
var/processing = 0
@@ -23,7 +24,6 @@
beaker = new /obj/item/weapon/reagent_containers/glass/bottle(src)
component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/biogenerator(src)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index a06b22927db..3f7a8d600ce 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -30,6 +30,7 @@
desc = "An electronically-lockable pod for growing organic tissue."
density = 1
anchored = 1
+ circuit = /obj/item/weapon/circuitboard/clonepod
icon = 'icons/obj/cloning.dmi'
icon_state = "pod_0"
req_access = list(access_genetics) //For premature unlocking.
@@ -47,7 +48,6 @@
/obj/machinery/clonepod/New()
..()
component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/clonepod(src)
component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
component_parts += new /obj/item/weapon/stock_parts/scanning_module(src)
diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm
index e7f92e02375..4b64cbadce9 100644
--- a/code/game/machinery/computer/camera.dm
+++ b/code/game/machinery/computer/camera.dm
@@ -215,7 +215,8 @@
icon_screen = "entertainment"
light_color = "#FFEEDB"
light_range_on = 2
- circuit = null
+ network = list(NETWORK_THUNDER)
+ circuit = /obj/item/weapon/circuitboard/security/telescreen/entertainment
/obj/machinery/computer/security/wooden_tv
name = "security camera monitor"
desc = "An old TV hooked into the stations camera network."
diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm
index d9d5f4707be..6f380739cc4 100644
--- a/code/game/machinery/computer/computer.dm
+++ b/code/game/machinery/computer/computer.dm
@@ -7,7 +7,7 @@
use_power = 1
idle_power_usage = 300
active_power_usage = 300
- var/circuit = null //The path to the circuit board type. If circuit==null, the computer can't be disassembled.
+ frame_type = "computer"
var/processing = 0
var/icon_keyboard = "generic_key"
@@ -98,23 +98,28 @@
/obj/machinery/computer/attackby(I as obj, user as mob)
if(istype(I, /obj/item/weapon/screwdriver) && circuit)
+ user << "You start disconnecting the monitor."
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
if(do_after(user, 20))
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
+ var/obj/structure/frame/A = new /obj/structure/frame( src.loc )
var/obj/item/weapon/circuitboard/M = new circuit( A )
A.circuit = M
A.anchored = 1
+ A.density = 1
+ A.frame_type = M.board_type
for (var/obj/C in src)
- C.loc = src.loc
+ C.forceMove(loc)
if (src.stat & BROKEN)
user << "The broken glass falls out."
new /obj/item/weapon/material/shard( src.loc )
A.state = 3
- A.icon_state = "3"
+ A.icon_state = "[A.frame_type]_3"
else
user << "You disconnect the monitor."
A.state = 4
- A.icon_state = "4"
+ A.icon_state = "[A.frame_type]_4"
+ A.pixel_x = pixel_x
+ A.pixel_y = pixel_y
M.deconstruct(src)
qdel(src)
else
diff --git a/code/game/machinery/computer/guestpass.dm b/code/game/machinery/computer/guestpass.dm
index ccbce91b619..648df34dc0c 100644
--- a/code/game/machinery/computer/guestpass.dm
+++ b/code/game/machinery/computer/guestpass.dm
@@ -46,6 +46,7 @@
icon_keyboard = null
icon_screen = "pass"
density = 0
+ circuit = /obj/item/weapon/circuitboard/guestpass
var/obj/item/weapon/card/id/giver
var/list/accesses = list()
@@ -60,11 +61,30 @@
..()
uid = "[rand(100,999)]-G[rand(10,99)]"
-/obj/machinery/computer/guestpass/attackby(obj/O, mob/user)
- if(istype(O, /obj/item/weapon/card/id))
- if(!giver && user.unEquip(O))
- O.loc = src
- giver = O
+/obj/machinery/computer/guestpass/attackby(obj/I, mob/user)
+ if(istype(I, /obj/item/weapon/screwdriver) && circuit)
+ user << "You start disconnecting the monitor."
+ playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ if(do_after(user, 20))
+ var/obj/structure/frame/A = new /obj/structure/frame( src.loc )
+ var/obj/item/weapon/circuitboard/M = new circuit( A )
+ A.frame_type = "guestpass"
+ A.pixel_x = pixel_x
+ A.pixel_y = pixel_y
+ A.circuit = M
+ A.anchored = 1
+ for (var/obj/C in src)
+ C.forceMove(loc)
+ user << "You disconnect the monitor."
+ A.state = 4
+ A.icon_state = "guestpass_4"
+ M.deconstruct(src)
+ qdel(src)
+ return
+ if(istype(I, /obj/item/weapon/card/id))
+ if(!giver && user.unEquip(I))
+ I.loc = src
+ giver = I
updateUsrDialog()
else if(giver)
user << "There is already ID card inside."
diff --git a/code/game/machinery/computer/prisonshuttle.dm b/code/game/machinery/computer/prisonshuttle.dm
index c2c45987063..1c54fb0f4ce 100644
--- a/code/game/machinery/computer/prisonshuttle.dm
+++ b/code/game/machinery/computer/prisonshuttle.dm
@@ -26,32 +26,6 @@ var/prison_shuttle_timeleft = 0
attack_ai(var/mob/user as mob)
return src.attack_hand(user)
- attackby(I as obj, user as mob)
- if(istype(I, /obj/item/weapon/screwdriver))
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- if(do_after(user, 20))
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
- var/obj/item/weapon/circuitboard/prison_shuttle/M = new /obj/item/weapon/circuitboard/prison_shuttle( A )
- for (var/obj/C in src)
- C.loc = src.loc
- A.circuit = M
- A.anchored = 1
-
- if (src.stat & BROKEN)
- user << "The broken glass falls out."
- new /obj/item/weapon/material/shard( src.loc )
- A.state = 3
- A.icon_state = "3"
- else
- user << "You disconnect the monitor."
- A.state = 4
- A.icon_state = "4"
-
- qdel(src)
- else
- return src.attack_hand(user)
-
-
attack_hand(var/mob/user as mob)
if(!src.allowed(user) && (!hacked))
user << "Access Denied."
diff --git a/code/game/machinery/computer3/computer.dm b/code/game/machinery/computer3/computer.dm
index 37d9a67d924..e0040a6d838 100644
--- a/code/game/machinery/computer3/computer.dm
+++ b/code/game/machinery/computer3/computer.dm
@@ -29,7 +29,7 @@
// when you had to search the list to find what you had.
// Mostly decorative, holds the OS rom
- var/obj/item/part/computer/circuitboard/circuit
+ var/obj/item/part/computer/circuitboard/circuitb
// Storage
var/obj/item/part/computer/storage/hdd/hdd = null
@@ -97,11 +97,11 @@
overlays += kb
if(!built)
- if(!circuit || !istype(circuit))
- circuit = new(src)
- if(circuit.OS)
- os = circuit.OS
- circuit.OS.computer = src
+ if(!circuitb || !istype(circuitb))
+ circuitb = new(src)
+ if(circuitb.OS)
+ os = circuitb.OS
+ circuitb.OS.computer = src
else
os = null
@@ -121,10 +121,10 @@
floppy.addfile(P)
program = P
else
- circuit.OS = P
- circuit.OS.computer = src
- os = circuit.OS
- circuit.name = "Circuitboard ([P])"
+ circuitb.OS = P
+ circuitb.OS.computer = src
+ os = circuitb.OS
+ circuitb.name = "Circuitboard ([P])"
if(hdd) // Spawn files
diff --git a/code/game/machinery/computer3/computers/camera.dm b/code/game/machinery/computer3/computers/camera.dm
index 5a1b3acc0e2..0f92519c361 100644
--- a/code/game/machinery/computer3/computers/camera.dm
+++ b/code/game/machinery/computer3/computers/camera.dm
@@ -26,7 +26,7 @@
New()
..(built=0)
os = program
- circuit.OS = os
+ circuitb.OS = os
/obj/machinery/computer3/security/mining
diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm
index 08d47db1582..266aeb2f234 100644
--- a/code/game/machinery/doors/firedoor.dm
+++ b/code/game/machinery/doors/firedoor.dm
@@ -221,7 +221,7 @@
if (stat & BROKEN)
new /obj/item/weapon/circuitboard/broken(src.loc)
else
- new/obj/item/weapon/airalarm_electronics(src.loc)
+ new/obj/item/weapon/circuitboard/airalarm(src.loc)
var/obj/structure/firedoor_assembly/FA = new/obj/structure/firedoor_assembly(src.loc)
FA.anchored = 1
diff --git a/code/game/machinery/doors/firedoor_assembly.dm b/code/game/machinery/doors/firedoor_assembly.dm
index c01fff5bed3..a96065d2c6d 100644
--- a/code/game/machinery/doors/firedoor_assembly.dm
+++ b/code/game/machinery/doors/firedoor_assembly.dm
@@ -36,7 +36,7 @@ obj/structure/firedoor_assembly/attackby(C as obj, mob/user as mob)
new/obj/item/stack/cable_coil(src.loc, 1)
wired = 0
- else if(istype(C, /obj/item/weapon/airalarm_electronics) && wired)
+ else if(istype(C, /obj/item/weapon/circuitboard/airalarm) && wired)
if(anchored)
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
user.visible_message("[user] has inserted a circuit into \the [src]!",
diff --git a/code/game/machinery/frame.dm b/code/game/machinery/frame.dm
new file mode 100644
index 00000000000..35f0cf6af0c
--- /dev/null
+++ b/code/game/machinery/frame.dm
@@ -0,0 +1,412 @@
+/obj/structure/frame
+ anchored = 0
+ name = "frame"
+ icon = 'icons/obj/stock_parts.dmi'
+ icon_state = "machine_0"
+ var/state = 0
+ var/obj/item/weapon/circuitboard/circuit = null
+ var/need_circuit = 1
+ var/frame_type = "machine"
+
+ var/list/components = null
+ var/list/req_components = null
+ var/list/req_component_names = null
+
+ var/list/alarms = list("firealarm", "airalarm", "intercom", "keycard")
+ var/list/machines = list("machine", "photocopier", "fax", "microwave", "conveyor", "vending", "recharger", "wrecharger", "washing", "grinder")
+ var/list/computers = list("computer", "holopad")
+ var/list/displays = list("display", "guestpass", "newscaster", "atm")
+ var/list/no_circuit = list("wrecharger", "recharger", "grinder","conveyor")
+
+/obj/structure/frame/proc/update_desc()
+ var/D
+ if(req_components)
+ var/list/component_list = new
+ for(var/I in req_components)
+ if(req_components[I] > 0)
+ component_list += "[num2text(req_components[I])] [req_component_names[I]]"
+ D = "Requires [english_list(component_list)]."
+ desc = D
+
+/obj/structure/frame/proc/check_components(mob/user as mob)
+ components = list()
+ req_components = circuit.req_components.Copy()
+ for(var/A in circuit.req_components)
+ req_components[A] = circuit.req_components[A]
+ req_component_names = circuit.req_components.Copy()
+ for(var/A in req_components)
+ var/cp = text2path(A)
+ var/obj/ct = new cp() // have to quickly instantiate it get name
+ req_component_names[A] = ct.name
+
+/obj/structure/frame/New(var/loc, var/dir, var/building = 0, var/obj/item/frame/frame_type, mob/user as mob)
+ ..()
+ if(building)
+ src.frame_type = frame_type
+ icon_state = "[frame_type]_0"
+
+ if(frame_type in alarms)
+ if(loc)
+ src.loc = loc
+
+ state = 0
+ if(frame_type == "airalarm" || frame_type == "firealarm" || frame_type == "keycard")
+ if(dir)
+ src.set_dir(dir)
+ pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24)
+ pixel_y = (dir & 3)? (dir == 1 ? -24 : 24) : 0
+
+ if(frame_type == "intercom")
+ if(dir)
+ src.set_dir(dir)
+ pixel_x = (dir & 3)? 0 : (dir == 4 ? -28 : 28)
+ pixel_y = (dir & 3)? (dir == 1 ? -28 : 28) : 0
+
+ update_icon()
+ return
+
+ if(frame_type in displays)
+ if(loc)
+ src.loc = loc
+
+ if(frame_type == "display" || frame_type == "atm")
+ pixel_x = (dir & 3)? 0 : (dir == 4 ? -32 : 32)
+ pixel_y = (dir & 3)? (dir == 1 ? -32 : 32) : 0
+
+ if(frame_type == "newscaster")
+ pixel_x = (dir & 3)? 0 : (dir == 4 ? -28 : 28)
+ pixel_y = (dir & 3)? (dir == 1 ? -30 : 30) : 0
+
+ if(frame_type == "guestpass")
+ pixel_x = (dir & 3)? 0 : (dir == 4 ? -30 : 30)
+ pixel_y = (dir & 3)? (dir == 1 ? -30 : 30) : 0
+
+ update_icon()
+ return
+
+ if(frame_type in no_circuit)
+ need_circuit = 0
+ if(frame_type == "wrecharger")
+ circuit = new /obj/item/weapon/circuitboard/recharger/wrecharger(src)
+ if(loc)
+ src.loc = loc
+
+ state = 0
+
+ pixel_x = (dir & 3)? 0 : (dir == 4 ? -26 : 32)
+ pixel_y = (dir & 3)? (dir == 1 ? -32 : 32) : 0
+
+ update_icon()
+ return
+ if(frame_type == "recharger")
+ circuit = new /obj/item/weapon/circuitboard/recharger(src)
+ if(frame_type == "grinder")
+ circuit = new /obj/item/weapon/circuitboard/grinder(src)
+ if(frame_type == "conveyor")
+ circuit = new /obj/item/weapon/circuitboard/conveyor(src)
+ if(dir)
+ src.set_dir(dir)
+
+ if(frame_type == "computer")
+ density = 1
+ if(frame_type in machines)
+ density = 1
+ return
+
+/obj/structure/frame/attackby(obj/item/P as obj, mob/user as mob)
+ if(istype(P, /obj/item/weapon/wrench))
+ if(state == 0)
+ user << "You start to wrench the frame into place."
+ playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ if(do_after(user, 20))
+ src.anchored = 1
+ if(!need_circuit && circuit)
+ src.state = 2
+ check_components()
+ update_desc()
+ src.icon_state = "[frame_type]_2"
+ user << "You wrench the frame into place and set the outer cover."
+ else
+ src.state = 1
+ user << "You wrench the frame into place."
+ return
+
+ if(state == 1)
+ playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ if(do_after(user, 20))
+ user << "You unfasten the frame."
+ src.anchored = 0
+ src.state = 0
+ return
+
+ if(istype(P, /obj/item/weapon/weldingtool))
+ if(state == 0)
+ var/obj/item/weapon/weldingtool/WT = P
+ if(!WT.remove_fuel(0, user))
+ user << "The welding tool must be on to complete this task."
+ return
+ playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
+ if(do_after(user, 20))
+ if(!src || !WT.isOn()) return
+ user << "You deconstruct the frame."
+ if(frame_type == "holopad" || frame_type == "microwave")
+ new /obj/item/stack/material/steel( src.loc, 4 )
+ else if(frame_type == "fax" || frame_type == "newscaster" || frame_type == "recharger" || frame_type == "wrecharger" || frame_type == "grinder")
+ new /obj/item/stack/material/steel( src.loc, 3 )
+ else if(frame_type == "firealarm" || frame_type == "airalarm" || frame_type == "intercom" || frame_type == "guestpass")
+ new /obj/item/stack/material/steel( src.loc, 2 )
+ else if(frame_type == "keycard")
+ new /obj/item/stack/material/steel( src.loc, 1 )
+ else
+ new /obj/item/stack/material/steel( src.loc, 5 )
+ qdel(src)
+ return
+
+ if(istype(P, /obj/item/weapon/circuitboard) && need_circuit && !circuit)
+ if(state == 1)
+ var/obj/item/weapon/circuitboard/B = P
+ if(B.board_type == frame_type)
+ playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ user << "You place the circuit board inside the frame."
+ src.icon_state = "[frame_type]_1"
+ src.circuit = P
+ user.drop_item()
+ P.loc = src
+ if(frame_type in machines) //because machines are assholes
+ check_components()
+ update_desc()
+ return
+ else
+ user << "This frame does not accept circuit boards of this type!"
+ return
+
+ if(istype(P, /obj/item/weapon/screwdriver))
+ if(state == 1)
+ if(need_circuit && circuit)
+ playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ user << "You screw the circuit board into place."
+ src.state = 2
+ src.icon_state = "[frame_type]_2"
+ return
+
+ if(state == 2)
+ if(need_circuit && circuit)
+ playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ user << "You unfasten the circuit board."
+ src.state = 1
+ src.icon_state = "[frame_type]_1"
+ return
+
+ if(!need_circuit && circuit)
+ playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ user << "You unfasten the outer cover."
+ src.state = 1
+ src.icon_state = "[frame_type]_0"
+ return
+
+ if(state == 3)
+ if(frame_type in machines)
+ var/component_check = 1
+ for(var/R in req_components)
+ if(req_components[R] > 0)
+ component_check = 0
+ break
+ if(component_check)
+ playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ var/obj/machinery/new_machine = new src.circuit.build_path(src.loc, src.dir)
+ if(!new_machine.component_parts)
+ for(var/obj/O in src.components)
+ O.forceMove(null)
+ new_machine.RefreshParts()
+
+ src.circuit.construct(new_machine)
+ new_machine.pixel_x = src.pixel_x
+ new_machine.pixel_y = src.pixel_y
+ qdel(src)
+ return
+
+ if(frame_type in alarms)
+ playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ user << "You fasten the cover."
+ var/obj/machinery/B = new src.circuit.build_path ( src.loc )
+ B.pixel_x = src.pixel_x
+ B.pixel_y = src.pixel_y
+ B.set_dir(dir)
+ src.circuit.construct(B)
+ qdel(src)
+ return
+
+ if(state == 4)
+ if(frame_type in computers)
+ playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ user << "You connect the monitor."
+ var/obj/machinery/B = new src.circuit.build_path ( src.loc )
+ B.pixel_x = src.pixel_x
+ B.pixel_y = src.pixel_y
+ src.circuit.construct(B)
+ qdel(src)
+ return
+
+ if(frame_type in displays)
+ playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ user << "You connect the monitor."
+ var/obj/machinery/B = new src.circuit.build_path ( src.loc )
+ B.pixel_x = src.pixel_x
+ B.pixel_y = src.pixel_y
+ src.circuit.construct(B)
+ qdel(src)
+ return
+
+ if(istype(P, /obj/item/weapon/crowbar))
+ if(state == 1)
+ if(need_circuit && circuit)
+ playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
+ user << "You remove the circuit board."
+ src.state = 1
+ src.icon_state = "[frame_type]_0"
+ circuit.loc = src.loc
+ src.circuit = null
+ if(frame_type in machines) //becuase machines are assholes
+ req_components = null
+ return
+
+ if(state == 3)
+ if(frame_type in machines)
+ playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
+ if(components.len == 0)
+ user << "There are no components to remove."
+ else
+ user << "You remove the components."
+ for(var/obj/item/weapon/W in components)
+ W.forceMove(loc)
+ check_components()
+ update_desc()
+ user << desc
+ return
+
+ if(state == 4)
+ if(frame_type in computers)
+ playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
+ user << "You remove the glass panel."
+ src.state = 3
+ src.icon_state = "[frame_type]_3"
+ new /obj/item/stack/material/glass( src.loc, 2 )
+ return
+
+ if(frame_type in displays)
+ playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
+ user << "You remove the glass panel."
+ src.state = 3
+ src.icon_state = "[frame_type]_3"
+ new /obj/item/stack/material/glass( src.loc, 2 )
+ return
+
+ if(istype(P, /obj/item/stack/cable_coil))
+ if(state == 2)
+ var/obj/item/stack/cable_coil/C = P
+ if (C.get_amount() < 5)
+ user << "You need five coils of wire to add them to the frame."
+ return
+ user << "You start to add cables to the frame."
+ playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ if(do_after(user, 20) && state == 2)
+ if (C.use(5))
+ user << "You add cables to the frame."
+ state = 3
+ icon_state = "[frame_type]_3"
+ if(frame_type in machines)
+ user << desc
+ return
+
+ if(istype(P, /obj/item/weapon/wirecutters))
+ if(state == 3)
+ if(frame_type in computers)
+ playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
+ user << "You remove the cables."
+ src.state = 2
+ src.icon_state = "[frame_type]_2"
+ new /obj/item/stack/cable_coil( src.loc, 5 )
+ return
+
+ if(frame_type in displays)
+ playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
+ user << "You remove the cables."
+ src.state = 2
+ src.icon_state = "[frame_type]_2"
+ new /obj/item/stack/cable_coil( src.loc, 5 )
+ return
+
+ if(frame_type in alarms)
+ playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
+ user << "You remove the cables."
+ src.state = 2
+ src.icon_state = "[frame_type]_2"
+ new /obj/item/stack/cable_coil( src.loc, 5 )
+ return
+
+ if(frame_type in machines)
+ playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
+ user << "You remove the cables."
+ src.state = 2
+ src.icon_state = "[frame_type]_2"
+ new /obj/item/stack/cable_coil( src.loc, 5 )
+ return
+
+ if(istype(P, /obj/item/stack/material) && P.get_material_name() == "glass")
+ if(state == 3)
+ if(frame_type in computers)
+ var/obj/item/stack/G = P
+ if (G.get_amount() < 2)
+ user << "You need two sheets of glass to put in the glass panel."
+ return
+ playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ user << "You start to put in the glass panel."
+ if(do_after(user, 20) && state == 3)
+ if (G.use(2))
+ user << "You put in the glass panel."
+ src.state = 4
+ src.icon_state = "[frame_type]_4"
+ return
+
+ if(frame_type in displays)
+ var/obj/item/stack/G = P
+ if (G.get_amount() < 2)
+ user << "You need two sheets of glass to put in the glass panel."
+ return
+ playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ user << "You start to put in the glass panel."
+ if(do_after(user, 20) && state == 3)
+ if (G.use(2))
+ user << "You put in the glass panel."
+ src.state = 4
+ src.icon_state = "[frame_type]_4"
+ return
+
+ if(istype(P, /obj/item))
+ if(state == 3)
+ if(frame_type in machines)
+ for(var/I in req_components)
+ if(istype(P, text2path(I)) && (req_components[I] > 0))
+ playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ if(istype(P, /obj/item/stack))
+ var/obj/item/stack/CP = P
+ if(CP.get_amount() > 1)
+ var/camt = min(CP.amount, req_components[I]) // amount of cable to take, idealy amount required, but limited by amount provided
+ var/obj/item/stack/CC = new /obj/item/stack(src)
+ CC.amount = camt
+ CC.update_icon()
+ CP.use(camt)
+ components += CC
+ req_components[I] -= camt
+ update_desc()
+ break
+ user.drop_item()
+ P.forceMove(src)
+ components += P
+ req_components[I]--
+ update_desc()
+ break
+ user << desc
+ if(P && P.loc != src && !istype(P, /obj/item/stack/cable_coil) && !istype(P, /obj/item/stack/material))
+ user << "You cannot add that component to the machine!"
+ return
\ No newline at end of file
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index d34acd5d2d4..58c8423a23e 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -36,6 +36,7 @@ var/const/HOLOPAD_MODE = RANGE_BASED
desc = "It's a floor-mounted device for projecting holographic images. It is activated remotely."
icon_state = "holopad0"
show_messages = 1
+ circuit = /obj/item/weapon/circuitboard/holopad
layer = TURF_LAYER+0.1 //Preventing mice and drones from sneaking under them.
@@ -47,6 +48,30 @@ var/const/HOLOPAD_MODE = RANGE_BASED
var/last_request = 0 //to prevent request spam. ~Carn
var/holo_range = 5 // Change to change how far the AI can move away from the holopad before deactivating.
+/obj/machinery/hologram/holopad/attackby(obj/item/I as obj, user as mob)
+ if(istype(I, /obj/item/weapon/screwdriver) && circuit)
+ user << "You start removing the glass."
+ playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ if(do_after(user, 20))
+ var/obj/structure/frame/A = new /obj/structure/frame( src.loc )
+ var/obj/item/weapon/circuitboard/M = new circuit( A )
+ A.circuit = M
+ A.anchored = 1
+ A.density = 1
+ A.frame_type = "holopad"
+ for (var/obj/C in src)
+ C.forceMove(loc)
+ user << "You remove the glass."
+ A.state = 4
+ A.icon_state = "holopad_4"
+ M.deconstruct(src)
+ for (var/mob/living/silicon/ai/master in masters)
+ clear_holo(master)
+ qdel(src)
+ else
+ src.attack_hand(user)
+ return
+
/obj/machinery/hologram/holopad/attack_hand(var/mob/living/carbon/human/user) //Carn: Hologram requests.
if(!istype(user))
return
diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm
index d2fa5478cbb..1df586b809e 100644
--- a/code/game/machinery/iv_drip.dm
+++ b/code/game/machinery/iv_drip.dm
@@ -62,6 +62,19 @@
user << "You attach \the [W] to \the [src]."
src.update_icon()
return
+
+ if(istype(W, /obj/item/weapon/screwdriver))
+ playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ user << "You start to dismantle the IV drip."
+ if(do_after(user, 15))
+ user << "You dismantle the IV drip."
+ var/obj/item/stack/rods/A = new /obj/item/stack/rods( src.loc )
+ A.amount = 6
+ if(src.beaker)
+ src.beaker.loc = get_turf(src)
+ src.beaker = null
+ qdel(src)
+ return
else
return ..()
diff --git a/code/game/machinery/kitchen/microwave.dm b/code/game/machinery/kitchen/microwave.dm
index e78f2b52271..ace68645d8a 100644
--- a/code/game/machinery/kitchen/microwave.dm
+++ b/code/game/machinery/kitchen/microwave.dm
@@ -10,6 +10,7 @@
idle_power_usage = 5
active_power_usage = 100
flags = OPENCONTAINER | NOREACT
+ circuit = /obj/item/weapon/circuitboard/microwave
var/operating = 0 // Is it on?
var/dirty = 0 // = {0..100} Does it need cleaning?
var/broken = 0 // ={0,1,2} How broken is it???
@@ -29,6 +30,13 @@
..()
reagents = new/datum/reagents(100)
reagents.my_atom = src
+
+ component_parts = list()
+ component_parts += new /obj/item/weapon/stock_parts/console_screen(src)
+ component_parts += new /obj/item/weapon/stock_parts/motor(src)
+ component_parts += new /obj/item/weapon/stock_parts/capacitor(src)
+ RefreshParts()
+
if (!available_recipes)
available_recipes = new
for (var/type in (typesof(/datum/recipe)-/datum/recipe))
@@ -82,6 +90,11 @@
else
user << "It's broken!"
return 1
+ else if(default_deconstruction_screwdriver(user, O))
+ return
+ else if(default_deconstruction_crowbar(user, O))
+ return
+
else if(src.dirty==100) // The microwave is all dirty so can't be used!
if(istype(O, /obj/item/weapon/reagent_containers/spray/cleaner)) // If they're trying to clean it then let them
user.visible_message( \
diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm
index ded7ebc9b98..74f60a3a729 100644
--- a/code/game/machinery/lightswitch.dm
+++ b/code/game/machinery/lightswitch.dm
@@ -7,10 +7,12 @@
icon = 'icons/obj/power.dmi'
icon_state = "light1"
anchored = 1.0
+ use_power = 1
+ idle_power_usage = 10
+ power_channel = LIGHT
var/on = 1
var/area/area = null
var/otherarea = null
- // luminosity = 1
/obj/machinery/light_switch/New()
..()
@@ -31,8 +33,12 @@
/obj/machinery/light_switch/proc/updateicon()
if(stat & NOPOWER)
icon_state = "light-p"
+ set_light(0)
+ layer = OBJ_LAYER
else
icon_state = "light[on]"
+ set_light(2, 1.5, on ? "#82FF4C" : "#F86060")
+ layer = LIGHTING_LAYER+0.1
/obj/machinery/light_switch/examine(mob/user)
if(..(user, 1))
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 6c391b75b5e..9ad2fd73eb1 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -112,6 +112,8 @@ Class Procs:
var/panel_open = 0
var/global/gl_uid = 1
var/interact_offline = 0 // Can the machine be interacted with while de-powered.
+ var/circuit = null
+ var/frame_type = "machine"
/obj/machinery/New(l, d=0)
..(l)
@@ -225,11 +227,6 @@ Class Procs:
istype(usr, /mob/living/silicon)))
usr << "You don't have the dexterity to do this!"
return 1
-/*
- //distance checks are made by atom/proc/DblClick
- if ((get_dist(src, user) > 1 || !istype(src.loc, /turf)) && !istype(user, /mob/living/silicon))
- return 1
-*/
if (ishuman(user))
var/mob/living/carbon/human/H = user
if(H.getBrainLoss() >= 55)
@@ -280,29 +277,13 @@ Class Procs:
return 1
return 0
-/obj/machinery/proc/default_deconstruction_crowbar(var/mob/user, var/obj/item/weapon/crowbar/C)
- if(!istype(C))
- return 0
- if(!panel_open)
- return 0
- . = dismantle()
-
-/obj/machinery/proc/default_deconstruction_screwdriver(var/mob/user, var/obj/item/weapon/screwdriver/S)
- if(!istype(S))
- return 0
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- panel_open = !panel_open
- user << "You [panel_open ? "open" : "close"] the maintenance hatch of [src]."
- update_icon()
- return 1
-
/obj/machinery/proc/default_part_replacement(var/mob/user, var/obj/item/weapon/storage/part_replacer/R)
if(!istype(R))
return 0
if(!component_parts)
return 0
if(panel_open)
- var/obj/item/weapon/circuitboard/CB = locate(/obj/item/weapon/circuitboard) in component_parts
+ var/obj/item/weapon/circuitboard/CB = circuit
var/P
for(var/obj/item/weapon/stock_parts/A in component_parts)
for(var/D in CB.req_components)
@@ -328,13 +309,45 @@ Class Procs:
user << " [C.name]"
return 1
+/obj/machinery/proc/default_deconstruction_crowbar(var/mob/user, var/obj/item/weapon/crowbar/C)
+ if(!istype(C))
+ return 0
+ if(!panel_open)
+ return 0
+ . = dismantle()
+
+/obj/machinery/proc/default_deconstruction_screwdriver(var/mob/user, var/obj/item/weapon/screwdriver/S)
+ if(!istype(S))
+ return 0
+ playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ panel_open = !panel_open
+ user << "You [panel_open ? "open" : "close"] the maintenance hatch of [src]."
+ update_icon()
+ return 1
+
/obj/machinery/proc/dismantle()
playsound(loc, 'sound/items/Crowbar.ogg', 50, 1)
- var/obj/machinery/constructable_frame/machine_frame/M = new /obj/machinery/constructable_frame/machine_frame(loc)
- M.set_dir(src.dir)
- M.state = 2
- M.icon_state = "box_1"
- for(var/obj/I in component_parts)
- I.loc = loc
+ var/obj/structure/frame/A = new /obj/structure/frame( src.loc )
+ var/obj/item/weapon/circuitboard/M = new circuit( A )
+ A.circuit = M
+ A.anchored = 1
+ A.density = 1
+ A.frame_type = M.board_type
+ if(A.frame_type in A.no_circuit)
+ A.need_circuit = 0
+ for (var/obj/D in src)
+ D.forceMove(loc)
+ if(A.components)
+ A.components.Cut()
+ else
+ A.components = list()
+ component_parts = list()
+ A.icon_state = "[A.frame_type]_3"
+ A.state = 3
+ A.pixel_x = pixel_x
+ A.pixel_y = pixel_y
+ A.check_components()
+ A.update_desc()
+ M.deconstruct(src)
qdel(src)
return 1
diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm
index 5a2663a7d1b..7bfe32d7191 100644
--- a/code/game/machinery/newscaster.dm
+++ b/code/game/machinery/newscaster.dm
@@ -167,7 +167,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
light_range = 0
anchored = 1
var/obj/machinery/exonet_node/node = null
-
+ circuit = /obj/item/weapon/circuitboard/newscaster
/obj/machinery/newscaster/security_unit //Security unit
name = "Security Newscaster"
@@ -751,32 +751,34 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
-/obj/machinery/newscaster/attackby(obj/item/I as obj, mob/user as mob)
- if (src.isbroken)
- playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 100, 1)
- for (var/mob/O in hearers(5, src.loc))
- O.show_message("[user.name] further abuses the shattered [src.name].")
- else
- if(istype(I, /obj/item/weapon) )
- var/obj/item/weapon/W = I
- if(W.force <15)
- for (var/mob/O in hearers(5, src.loc))
- O.show_message("[user.name] hits the [src.name] with the [W.name] with no visible effect." )
- playsound(src.loc, 'sound/effects/Glasshit.ogg', 100, 1)
+/obj/machinery/newscaster/attackby(I as obj, user as mob)
+ if(istype(I, /obj/item/weapon/screwdriver) && circuit)
+ user << "You start disconnecting the monitor."
+ playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ if(do_after(user, 20))
+ var/obj/structure/frame/A = new /obj/structure/frame( src.loc )
+ var/obj/item/weapon/circuitboard/M = new circuit( A )
+ A.frame_type = "newscaster"
+ A.pixel_x = pixel_x
+ A.pixel_y = pixel_y
+ A.circuit = M
+ A.anchored = 1
+ for (var/obj/C in src)
+ C.forceMove(loc)
+ if (src.stat & isbroken == 1)
+ user << "The broken glass falls out."
+ new /obj/item/weapon/material/shard( src.loc )
+ A.state = 3
+ A.icon_state = "newscaster_3"
else
- src.hitstaken++
- if(src.hitstaken==3)
- for (var/mob/O in hearers(5, src.loc))
- O.show_message("[user.name] smashes the [src.name]!" )
- src.isbroken=1
- playsound(src.loc, 'sound/effects/Glassbr3.ogg', 100, 1)
- else
- for (var/mob/O in hearers(5, src.loc))
- O.show_message("[user.name] forcefully slams the [src.name] with the [I.name]!" )
- playsound(src.loc, 'sound/effects/Glasshit.ogg', 100, 1)
- else
- user << "This does nothing."
- src.update_icon()
+ user << "You disconnect the monitor."
+ A.state = 4
+ A.icon_state = "newscaster_4"
+ M.deconstruct(src)
+ qdel(src)
+ else
+ src.attack_hand(user)
+ return
/obj/machinery/newscaster/attack_ai(mob/user as mob)
return src.attack_hand(user) //or maybe it'll have some special functions? No idea.
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index 992a93c40a9..72c125e8b26 100644
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -14,6 +14,15 @@ obj/machinery/recharger
var/icon_state_charging = "recharger1"
var/icon_state_idle = "recharger0" //also when unpowered
var/portable = 1
+ circuit = /obj/item/weapon/circuitboard/recharger
+ frame_type = "recharger"
+
+obj/machinery/recharger/New()
+ component_parts = list()
+ component_parts += new /obj/item/weapon/stock_parts/capacitor(src)
+ component_parts += new /obj/item/stack/cable_coil(src, 5)
+ RefreshParts()
+ return
obj/machinery/recharger/attackby(obj/item/weapon/G as obj, mob/user as mob)
if(istype(user,/mob/living/silicon))
@@ -52,6 +61,10 @@ obj/machinery/recharger/attackby(obj/item/weapon/G as obj, mob/user as mob)
anchored = !anchored
user << "You [anchored ? "attached" : "detached"] the recharger."
playsound(loc, 'sound/items/Ratchet.ogg', 75, 1)
+ else if(default_deconstruction_screwdriver(user, G))
+ return
+ else if(default_deconstruction_crowbar(user, G))
+ return
obj/machinery/recharger/attack_hand(mob/user as mob)
if(istype(user,/mob/living/silicon))
@@ -156,3 +169,5 @@ obj/machinery/recharger/wallcharger
icon_state_charging = "wrecharger1"
icon_state_idle = "wrecharger0"
portable = 0
+ circuit = /obj/item/weapon/circuitboard/recharger/wrecharger
+ frame_type = "wrecharger"
\ No newline at end of file
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index efcc8314c12..c3759100fb3 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -5,6 +5,7 @@
icon_state = "borgcharger0"
density = 1
anchored = 1
+ circuit = /obj/item/weapon/circuitboard/recharge_station
use_power = 1
idle_power_usage = 50
var/mob/occupant = null
@@ -25,7 +26,6 @@
..()
component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/recharge_station(src)
component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
component_parts += new /obj/item/weapon/stock_parts/capacitor(src)
diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm
index dd862a77543..8b0d78cb968 100644
--- a/code/game/machinery/status_display.dm
+++ b/code/game/machinery/status_display.dm
@@ -17,6 +17,7 @@
density = 0
use_power = 1
idle_power_usage = 10
+ circuit = /obj/item/weapon/circuitboard/status_display
var/mode = 1 // 0 = Blank
// 1 = Shuttle timer
// 2 = Arbitrary message(s)
@@ -51,6 +52,29 @@
radio_controller.remove_object(src,frequency)
return ..()
+/obj/machinery/status_display/attackby(I as obj, user as mob)
+ if(istype(I, /obj/item/weapon/screwdriver) && circuit)
+ playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ if(do_after(user, 20))
+ var/obj/structure/frame/A = new /obj/structure/frame( src.loc )
+ var/obj/item/weapon/circuitboard/M = new circuit( A )
+ A.frame_type = "display"
+ A.pixel_x = pixel_x
+ A.pixel_y = pixel_y
+ A.circuit = M
+ A.anchored = 1
+ for (var/obj/C in src)
+ C.forceMove(loc)
+ user << "You disconnect the monitor."
+ A.state = 4
+ A.icon_state = "display_4"
+ M.deconstruct(src)
+ qdel(src)
+ else
+ src.attack_hand(user)
+ return
+
+
// register for radio system
/obj/machinery/status_display/initialize()
..()
diff --git a/code/game/machinery/status_display_ai.dm b/code/game/machinery/status_display_ai.dm
index 0b7371c1b08..51fcfb4f51c 100644
--- a/code/game/machinery/status_display_ai.dm
+++ b/code/game/machinery/status_display_ai.dm
@@ -59,6 +59,7 @@ var/list/ai_status_emotions = list(
name = "AI display"
anchored = 1
density = 0
+ circuit = /obj/item/weapon/circuitboard/ai_status_display
var/mode = 0 // 0 = Blank
// 1 = AI emoticon
@@ -68,6 +69,28 @@ var/list/ai_status_emotions = list(
var/emotion = "Neutral"
+/obj/machinery/ai_status_display/attackby(I as obj, user as mob)
+ if(istype(I, /obj/item/weapon/screwdriver) && circuit)
+ playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ if(do_after(user, 20))
+ var/obj/structure/frame/A = new /obj/structure/frame( src.loc )
+ var/obj/item/weapon/circuitboard/M = new circuit( A )
+ A.frame_type = "display"
+ A.pixel_x = pixel_x
+ A.pixel_y = pixel_y
+ A.circuit = M
+ A.anchored = 1
+ for (var/obj/C in src)
+ C.forceMove(loc)
+ user << "You disconnect the monitor."
+ A.state = 4
+ A.icon_state = "display_4"
+ M.deconstruct(src)
+ qdel(src)
+ else
+ src.attack_hand(user)
+ return
+
/obj/machinery/ai_status_display/attack_ai/(mob/user as mob)
var/list/ai_emotions = get_ai_emotions(user.ckey)
var/emote = input("Please, select a status!", "AI Status", null, null) in ai_emotions
diff --git a/code/game/machinery/telecomms/logbrowser.dm b/code/game/machinery/telecomms/logbrowser.dm
index 072c99322fe..b9cc3428f93 100644
--- a/code/game/machinery/telecomms/logbrowser.dm
+++ b/code/game/machinery/telecomms/logbrowser.dm
@@ -10,6 +10,7 @@
var/screen = 0 // the screen number:
var/list/servers = list() // the servers located by the computer
var/obj/machinery/telecomms/server/SelectedServer
+ circuit = /obj/item/weapon/circuitboard/comm_server
var/network = "NULL" // the network to probe
var/temp = "" // temporary feedback messages
@@ -188,36 +189,6 @@
updateUsrDialog()
return
- attackby(var/obj/item/weapon/D as obj, var/mob/user as mob)
- if(istype(D, /obj/item/weapon/screwdriver))
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- if(do_after(user, 20))
- if (src.stat & BROKEN)
- user << "The broken glass falls out."
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
- new /obj/item/weapon/material/shard( src.loc )
- var/obj/item/weapon/circuitboard/comm_server/M = new /obj/item/weapon/circuitboard/comm_server( A )
- for (var/obj/C in src)
- C.loc = src.loc
- A.circuit = M
- A.state = 3
- A.icon_state = "3"
- A.anchored = 1
- qdel(src)
- else
- user << "You disconnect the monitor."
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
- var/obj/item/weapon/circuitboard/comm_server/M = new /obj/item/weapon/circuitboard/comm_server( A )
- for (var/obj/C in src)
- C.loc = src.loc
- A.circuit = M
- A.state = 4
- A.icon_state = "4"
- A.anchored = 1
- qdel(src)
- src.updateUsrDialog()
- return
-
/obj/machinery/computer/telecomms/server/emag_act(var/remaining_charges, var/mob/user)
if(!emagged)
playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1)
diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm
index 2859083c9d6..2b3561395f5 100644
--- a/code/game/machinery/telecomms/machine_interactions.dm
+++ b/code/game/machinery/telecomms/machine_interactions.dm
@@ -98,8 +98,8 @@
// Drop a circuit board too
C.loc = user.loc
- // Create a machine frame and delete the current machine
- var/obj/machinery/constructable_frame/machine_frame/F = new
+ // Create a frame and delete the current machine
+ var/obj/structure/frame/F = new
F.loc = src.loc
qdel(src)
diff --git a/code/game/machinery/telecomms/telemonitor.dm b/code/game/machinery/telecomms/telemonitor.dm
index 24549bd8b71..6567012a800 100644
--- a/code/game/machinery/telecomms/telemonitor.dm
+++ b/code/game/machinery/telecomms/telemonitor.dm
@@ -14,6 +14,7 @@
var/screen = 0 // the screen number:
var/list/machinelist = list() // the machines located by the computer
var/obj/machinery/telecomms/SelectedMachine
+ circuit = /obj/item/weapon/circuitboard/comm_monitor
var/network = "NULL" // the network to probe
@@ -123,36 +124,6 @@
updateUsrDialog()
return
- attackby(var/obj/item/weapon/D as obj, var/mob/user as mob)
- if(istype(D, /obj/item/weapon/screwdriver))
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- if(do_after(user, 20))
- if (src.stat & BROKEN)
- user << "The broken glass falls out."
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
- new /obj/item/weapon/material/shard( src.loc )
- var/obj/item/weapon/circuitboard/comm_monitor/M = new /obj/item/weapon/circuitboard/comm_monitor( A )
- for (var/obj/C in src)
- C.loc = src.loc
- A.circuit = M
- A.state = 3
- A.icon_state = "3"
- A.anchored = 1
- qdel(src)
- else
- user << "You disconnect the monitor."
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
- var/obj/item/weapon/circuitboard/comm_monitor/M = new /obj/item/weapon/circuitboard/comm_monitor( A )
- for (var/obj/C in src)
- C.loc = src.loc
- A.circuit = M
- A.state = 4
- A.icon_state = "4"
- A.anchored = 1
- qdel(src)
- src.updateUsrDialog()
- return
-
/obj/machinery/computer/telecomms/monitor/emag_act(var/remaining_charges, var/mob/user)
if(!emagged)
playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1)
diff --git a/code/game/machinery/telecomms/traffic_control.dm b/code/game/machinery/telecomms/traffic_control.dm
index e941a268ef9..0d372b2aaae 100644
--- a/code/game/machinery/telecomms/traffic_control.dm
+++ b/code/game/machinery/telecomms/traffic_control.dm
@@ -14,6 +14,7 @@
var/mob/lasteditor
var/list/viewingcode = list()
var/obj/machinery/telecomms/server/SelectedServer
+ circuit = /obj/item/weapon/circuitboard/comm_traffic
var/network = "NULL" // the network to probe
var/temp = "" // temporary feedback messages
@@ -206,40 +207,10 @@
updateUsrDialog()
return
- attackby(var/obj/item/weapon/D as obj, var/mob/user as mob)
- if(istype(D, /obj/item/weapon/screwdriver))
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- if(do_after(user, 20))
- if (src.stat & BROKEN)
- user << "The broken glass falls out."
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
- new /obj/item/weapon/material/shard( src.loc )
- var/obj/item/weapon/circuitboard/comm_traffic/M = new /obj/item/weapon/circuitboard/comm_traffic( A )
- for (var/obj/C in src)
- C.loc = src.loc
- A.circuit = M
- A.state = 3
- A.icon_state = "3"
- A.anchored = 1
- qdel(src)
- else
- user << "You disconnect the monitor."
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
- var/obj/item/weapon/circuitboard/comm_traffic/M = new /obj/item/weapon/circuitboard/comm_traffic( A )
- for (var/obj/C in src)
- C.loc = src.loc
- A.circuit = M
- A.state = 4
- A.icon_state = "4"
- A.anchored = 1
- qdel(src)
- src.updateUsrDialog()
- return
-
/obj/machinery/computer/telecomms/traffic/emag_act(var/remaining_charges, var/mob/user)
if(!emagged)
playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1)
emagged = 1
user << "You you disable the security protocols"
src.updateUsrDialog()
- return 1
+ return 1
\ No newline at end of file
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index b1b8d497b33..8099103d8af 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -36,6 +36,8 @@
layer = 2.9
anchored = 1
density = 1
+ circuit = /obj/item/weapon/circuitboard/vending
+ frame_type = "vending"
var/icon_vend //Icon_state when vending
var/icon_deny //Icon_state when denying access
@@ -94,6 +96,14 @@
/obj/machinery/vending/New()
..()
wires = new(src)
+ component_parts = list()
+ component_parts += new /obj/item/weapon/stock_parts/spring(src)
+ component_parts += new /obj/item/weapon/stock_parts/spring(src)
+ component_parts += new /obj/item/weapon/stock_parts/motor(src)
+ component_parts += new /obj/item/weapon/stock_parts/motor(src)
+ component_parts += new /obj/item/weapon/stock_parts/console_screen(src)
+ component_parts += new /obj/item/stack/material/glass/reinforced(src, 2)
+ RefreshParts()
spawn(4)
if(src.product_slogans)
src.slogan_list += splittext(src.product_slogans, ";")
@@ -232,6 +242,8 @@
user << "You [anchored? "un" : ""]secured \the [src]!"
anchored = !anchored
return
+ else if(default_deconstruction_crowbar(user, W))
+ return
else
@@ -922,7 +934,15 @@
icon_state = "engivend"
icon_deny = "engivend-deny"
req_access = list(access_engine_equip)
- products = list(/obj/item/clothing/glasses/meson = 2,/obj/item/device/multitool = 4,/obj/item/weapon/airlock_electronics = 10,/obj/item/weapon/module/power_control = 10,/obj/item/weapon/airalarm_electronics = 10,/obj/item/weapon/cell/high = 10)
+ products = list(/obj/item/clothing/glasses/meson = 2,/obj/item/device/multitool = 4,/obj/item/weapon/cell/high = 10,
+ /obj/item/weapon/airlock_electronics = 10,/obj/item/weapon/module/power_control = 10,
+ /obj/item/weapon/circuitboard/airalarm = 10,/obj/item/weapon/circuitboard/firealarm = 10,/obj/item/weapon/circuitboard/status_display = 2,
+ /obj/item/weapon/circuitboard/ai_status_display = 2,/obj/item/weapon/circuitboard/newscaster = 2,/obj/item/weapon/circuitboard/holopad = 2,
+ /obj/item/weapon/circuitboard/intercom = 4,/obj/item/weapon/circuitboard/security/telescreen/entertainment = 4,
+ /obj/item/weapon/circuitboard/atm = 0,/obj/item/weapon/circuitboard/guestpass = 0,/obj/item/weapon/circuitboard/keycard_auth = 0,
+ /obj/item/weapon/circuitboard/photocopier = 0,/obj/item/weapon/circuitboard/fax = 0,/obj/item/weapon/circuitboard/conveyor = 0,
+ /obj/item/weapon/circuitboard/microwave = 0,/obj/item/weapon/circuitboard/vending = 0,/obj/item/weapon/circuitboard/washing = 0,
+ /obj/item/weapon/stock_parts/motor = 0,/obj/item/weapon/stock_parts/spring = 0,/obj/item/weapon/stock_parts/gear = 0)
contraband = list(/obj/item/weapon/cell/potato = 3)
premium = list(/obj/item/weapon/storage/belt/utility = 3)
diff --git a/code/game/machinery/wall_frames.dm b/code/game/machinery/wall_frames.dm
index c9182586c8c..fd0fd3ce7c2 100644
--- a/code/game/machinery/wall_frames.dm
+++ b/code/game/machinery/wall_frames.dm
@@ -1,13 +1,14 @@
/obj/item/frame
- name = "frame"
- desc = "Used for building machines."
- icon = 'icons/obj/monitors.dmi'
- icon_state = "fire_bitem"
+ name = "frame parts"
+ desc = "Used for building frames."
+ icon = 'icons/obj/stock_parts.dmi'
+ icon_state = "frame_bitem"
flags = CONDUCT
- var/build_machine_type
- var/refund_amt = 2
+ var/build_machine_type = /obj/structure/frame
+ var/refund_amt = 5
var/refund_type = /obj/item/stack/material/steel
var/reverse = 0 //if resulting object faces opposite its dir (like light fixtures)
+ var/frame_type = null
/obj/item/frame/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (istype(W, /obj/item/weapon/wrench))
@@ -16,7 +17,82 @@
return
..()
-/obj/item/frame/proc/try_build(turf/on_wall)
+/obj/item/frame/attack_self(mob/user as mob)
+ ..()
+ if(!build_machine_type)
+ return
+
+ var/ndir
+ if(!frame_type)
+ var/response = input(usr, "What kind of frame would you like to make?", "Frame type request", null) in list("Computer", "Machine", "Holopad", "Conveyor",
+ "Photocopier", "Fax", "Microwave", "Vending Machine",
+ "Recharger", "Washing Machine", "Grinder",
+ "Cancel")
+
+ if(response == "Cancel")
+ return
+
+ frame_type = lowertext(response)
+
+ switch(response)
+ if("Holopad")
+ new /obj/item/stack/material/steel( usr.loc, 1 ) //holopads are smaller, they only need 4 sheets
+ if("Conveyor")
+ ndir = get_dir(src,usr)
+ if (!(ndir in cardinal))
+ return
+ if("Fax")
+ new /obj/item/stack/material/steel( usr.loc, 2 ) //faxes are smaller, they only need 3 sheets
+ if("Microwave")
+ new /obj/item/stack/material/steel( usr.loc, 1 ) //microwaves are smaller, they only need 4 sheets
+ if("Vending Machine")
+ frame_type = "vending"
+ if("Recharger")
+ new /obj/item/stack/material/steel( usr.loc, 2 ) //rechargers are smaller, they only need 3 sheets
+ if("Washing Machine")
+ frame_type = "washing"
+ if("Grinder")
+ new /obj/item/stack/material/steel( usr.loc, 2 ) //grinders are smaller, they only need 3 sheets
+
+ var/obj/machinery/M = new build_machine_type(get_turf(src.loc), ndir, 1, frame_type)
+ M.fingerprints = src.fingerprints
+ M.fingerprintshidden = src.fingerprintshidden
+ M.fingerprintslast = src.fingerprintslast
+ qdel(src)
+
+/obj/item/frame/proc/try_build(turf/on_wall, mob/user as mob)
+ if(!frame_type)
+ var/response = input(usr, "What kind of frame would you like to make?", "Frame type request", null) in list("Fire Alarm", "Air Alarm", "Display", "Newscaster",
+ "ATM", "Guest Pass Console", "Intercom", "Keycard Authenticator",
+ "Wall Charger",
+ "Cancel")
+
+ if(response == "Cancel")
+ return
+
+ frame_type = lowertext(response)
+
+ switch(response)
+ if("Fire Alarm")
+ frame_type = "firealarm"
+ new /obj/item/stack/material/steel( usr.loc, 3 ) //fire alarms are smaller, they only need 2 sheets
+ if("Air Alarm")
+ frame_type = "airalarm"
+ new /obj/item/stack/material/steel( usr.loc, 3 ) //air alarms are smaller, they only need 2 sheets
+ if("Intercom")
+ new /obj/item/stack/material/steel( usr.loc, 3 ) //intercoms are smaller, they only need 2 sheets
+ if("Newscaster")
+ new /obj/item/stack/material/steel( usr.loc, 2 ) //newscasters are smaller, they only need 3 sheets
+ if("Guest Pass Console")
+ frame_type = "guestpass"
+ new /obj/item/stack/material/steel( usr.loc, 3 ) //guestpass consoles are smaller, they only need 2 sheets
+ if("Keycard Authenticator")
+ frame_type = "keycard"
+ new /obj/item/stack/material/steel( usr.loc, 4 ) //keycard authenticators are smaller, they only need 1 sheets
+ if("Wall Charger")
+ frame_type = "wrecharger"
+ new /obj/item/stack/material/steel( usr.loc, 2 ) //wall rechargers are smaller, they only need 3 sheets
+
if(!build_machine_type)
return
@@ -35,7 +111,7 @@
var/turf/loc = get_turf(usr)
var/area/A = loc.loc
if (!istype(loc, /turf/simulated/floor))
- usr << "\The [src] Alarm cannot be placed on this spot."
+ usr << "\The frame cannot be placed on this spot."
return
if (A.requires_power == 0 || A.name == "Space")
usr << "\The [src] Alarm cannot be placed in this area."
@@ -44,23 +120,12 @@
if(gotwallitem(loc, ndir))
usr << "There's already an item on this wall!"
return
-
- var/obj/machinery/M = new build_machine_type(loc, ndir, 1)
+ var/obj/machinery/M = new build_machine_type(loc, ndir, 1, frame_type)
M.fingerprints = src.fingerprints
M.fingerprintshidden = src.fingerprintshidden
M.fingerprintslast = src.fingerprintslast
qdel(src)
-/obj/item/frame/fire_alarm
- name = "fire alarm frame"
- desc = "Used for building fire alarms."
- build_machine_type = /obj/machinery/firealarm
-
-/obj/item/frame/air_alarm
- name = "air alarm frame"
- desc = "Used for building air alarms."
- build_machine_type = /obj/machinery/alarm
-
/obj/item/frame/light
name = "light fixture frame"
desc = "Used for building lights."
@@ -68,9 +133,48 @@
icon_state = "tube-construct-item"
build_machine_type = /obj/machinery/light_construct
reverse = 1
+ frame_type = 1
/obj/item/frame/light/small
name = "small light fixture frame"
icon_state = "bulb-construct-item"
refund_amt = 1
build_machine_type = /obj/machinery/light_construct/small
+ frame_type = 1
+
+/obj/item/frame/extinguisher_cabinet
+ name = "extinguisher cabinet frame"
+ desc = "Used for building fire extinguisher cabinets."
+ icon = 'icons/obj/closet.dmi'
+ icon_state = "extinguisher_empty"
+ refund_amt = 4
+ build_machine_type = /obj/structure/extinguisher_cabinet
+ frame_type = 1
+
+/obj/item/frame/noticeboard
+ name = "noticeboard frame"
+ desc = "Used for building noticeboards."
+ icon = 'icons/obj/stationobjs.dmi'
+ icon_state = "nboard00"
+ refund_amt = 4
+ refund_type = /obj/item/stack/material/wood
+ build_machine_type = /obj/structure/noticeboard
+ frame_type = 1
+
+/obj/item/frame/mirror
+ name = "mirror frame"
+ desc = "Used for building mirrors."
+ icon = 'icons/obj/watercloset.dmi'
+ icon_state = "mirror_frame"
+ refund_amt = 1
+ build_machine_type = /obj/structure/mirror
+ frame_type = 1
+
+/obj/item/frame/fireaxe_cabinet
+ name = "fire axe cabinet frame"
+ desc = "Used for building fire axe cabinets."
+ icon = 'icons/obj/closet.dmi'
+ icon_state = "fireaxe0101"
+ refund_amt = 4
+ build_machine_type = /obj/structure/closet/fireaxecabinet
+ frame_type = 1
\ No newline at end of file
diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm
index a22482a4168..830a848bfe7 100644
--- a/code/game/machinery/washing_machine.dm
+++ b/code/game/machinery/washing_machine.dm
@@ -4,6 +4,7 @@
icon_state = "wm_10"
density = 1
anchored = 1.0
+ circuit = /obj/item/weapon/circuitboard/washing
var/state = 1
//1 = empty, open door
//2 = empty, closed door
@@ -13,14 +14,19 @@
//6 = blood, open door
//7 = blood, closed door
//8 = blood, running
- var/panel = 0
- //0 = closed
- //1 = open
var/hacked = 1 //Bleh, screw hacking, let's have it hacked by default.
//0 = not hacked
//1 = hacked
var/gibs_ready = 0
var/obj/crayon
+ var/list/washing = list()
+
+/obj/machinery/washing_machine/New()
+ component_parts = list()
+ component_parts += new /obj/item/weapon/stock_parts/motor(src)
+ component_parts += new /obj/item/weapon/stock_parts/gear(src)
+ component_parts += new /obj/item/weapon/stock_parts/gear(src)
+ RefreshParts()
/obj/machinery/washing_machine/verb/start()
set name = "Start Washing"
@@ -34,25 +40,25 @@
usr << "The washing machine cannot run in this state."
return
- if( locate(/mob,contents) )
+ if( locate(/mob,washing) )
state = 8
else
state = 5
update_icon()
sleep(200)
- for(var/atom/A in contents)
+ for(var/atom/A in washing)
A.clean_blood()
- for(var/obj/item/I in contents)
+ for(var/obj/item/I in washing)
I.decontaminate()
//Tanning!
- for(var/obj/item/stack/material/hairlesshide/HH in contents)
+ for(var/obj/item/stack/material/hairlesshide/HH in washing)
var/obj/item/stack/material/wetleather/WL = new(src)
WL.amount = HH.amount
qdel(HH)
- if( locate(/mob,contents) )
+ if( locate(/mob,washing) )
state = 7
gibs_ready = 1
else
@@ -70,9 +76,14 @@
/obj/machinery/washing_machine/update_icon()
- icon_state = "wm_[state][panel]"
+ icon_state = "wm_[state][panel_open]"
/obj/machinery/washing_machine/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(state == 2 && washing.len < 1)
+ if(default_deconstruction_screwdriver(user, W))
+ return
+ if(default_deconstruction_crowbar(user, W))
+ return
/*if(istype(W,/obj/item/weapon/screwdriver))
panel = !panel
user << "You [panel ? "open" : "close"] the [src]'s maintenance panel"*/
@@ -142,10 +153,11 @@
user << "This item does not fit."
return
- if(contents.len < 5)
+ if(washing.len < 5)
if ( state in list(1, 3) )
user.drop_item()
W.loc = src
+ washing += W
state = 3
else
user << "You can't put the item in right now."
@@ -161,15 +173,17 @@
state = 2
if(2)
state = 1
- for(var/atom/movable/O in contents)
+ for(var/atom/movable/O in washing)
O.loc = src.loc
+ washing.Cut()
if(3)
state = 4
if(4)
state = 3
- for(var/atom/movable/O in contents)
+ for(var/atom/movable/O in washing)
O.loc = src.loc
crayon = null
+ washing.Cut()
state = 1
if(5)
user << "The [src] is busy."
@@ -178,13 +192,13 @@
if(7)
if(gibs_ready)
gibs_ready = 0
- if(locate(/mob,contents))
- var/mob/M = locate(/mob,contents)
+ if(locate(/mob,washing))
+ var/mob/M = locate(/mob,washing)
M.gib()
- for(var/atom/movable/O in contents)
+ for(var/atom/movable/O in washing)
O.loc = src.loc
crayon = null
state = 1
+ washing.Cut()
-
- update_icon()
+ update_icon()
\ No newline at end of file
diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm
index cf50e695259..23c30d3a3d9 100644
--- a/code/game/mecha/mech_bay.dm
+++ b/code/game/mecha/mech_bay.dm
@@ -5,6 +5,7 @@
icon_state = "recharge_floor"
density = 0
layer = TURF_LAYER + 0.1
+ circuit = /obj/item/weapon/circuitboard/mech_recharger
var/obj/mecha/charging = null
var/charge = 45
@@ -14,7 +15,6 @@
..()
component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/mech_recharger(src)
component_parts += new /obj/item/weapon/stock_parts/capacitor(src)
component_parts += new /obj/item/weapon/stock_parts/capacitor(src)
component_parts += new /obj/item/weapon/stock_parts/scanning_module(src)
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index 0685e6efd20..425b959d31d 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -9,6 +9,7 @@
idle_power_usage = 20
active_power_usage = 5000
req_access = list(access_robotics)
+ circuit = /obj/item/weapon/circuitboard/mechfab
var/speed = 1
var/mat_efficiency = 1
@@ -29,7 +30,6 @@
..()
component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/mechfab(src)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
@@ -89,7 +89,7 @@
return
ui_interact(user)
-/obj/machinery/mecha_part_fabricator/ui_interact(var/mob/user, var/ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+/obj/machinery/mecha_part_fabricator/ui_interact(var/mob/user, var/ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
var/data[0]
var/datum/design/current = queue.len ? queue[1] : null
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 6961e957ffe..f66b6686641 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -76,13 +76,10 @@
/obj/item/equipped()
..()
- var/mob/M = loc
+ var/mob/living/M = loc
if(!istype(M))
return
- if(M.l_hand)
- M.l_hand.update_held_icon()
- if(M.r_hand)
- M.r_hand.update_held_icon()
+ M.update_held_icons()
/obj/item/Destroy()
if(ismob(loc))
@@ -98,8 +95,8 @@
//Checks if the item is being held by a mob, and if so, updates the held icons
/obj/item/proc/update_held_icon()
- if(ismob(src.loc))
- var/mob/M = src.loc
+ if(isliving(src.loc))
+ var/mob/living/M = src.loc
if(M.l_hand == src)
M.update_inv_l_hand()
else if(M.r_hand == src)
@@ -160,7 +157,7 @@
size = "huge"
return ..(user, distance, "", "It is a [size] item.")
-/obj/item/attack_hand(mob/user as mob)
+/obj/item/attack_hand(mob/living/user as mob)
if (!user) return
if (hasorgans(user))
var/mob/living/carbon/human/H = user
@@ -399,17 +396,15 @@ var/list/global/slot_flags_enumeration = list(
if((!istype(usr, /mob/living/carbon)) || (istype(usr, /mob/living/carbon/brain)))//Is humanoid, and is not a brain
usr << "You can't pick things up!"
return
+ var/mob/living/carbon/C = usr
if( usr.stat || usr.restrained() )//Is not asleep/dead and is not restrained
usr << "You can't pick things up!"
return
if(src.anchored) //Object isn't anchored
usr << "You can't pick that up!"
return
- if(!usr.hand && usr.r_hand) //Right hand is not full
- usr << "Your right hand is full."
- return
- if(usr.hand && usr.l_hand) //Left hand is not full
- usr << "Your left hand is full."
+ if(C.get_active_hand()) //Hand is not full
+ usr << "Your hand is full."
return
if(!istype(src.loc, /turf)) //Object is on a turf
usr << "You can't pick that up!"
diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm
index e5e94fc93d3..5b769ed8034 100644
--- a/code/game/objects/items/devices/radio/electropack.dm
+++ b/code/game/objects/items/devices/radio/electropack.dm
@@ -12,7 +12,7 @@
var/code = 2
-/obj/item/device/radio/electropack/attack_hand(mob/user as mob)
+/obj/item/device/radio/electropack/attack_hand(mob/living/user as mob)
if(src == user.back)
user << "You need help taking this off!"
return
diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm
index ed8cf4ce0bc..7aaf609eca6 100644
--- a/code/game/objects/items/devices/radio/intercom.dm
+++ b/code/game/objects/items/devices/radio/intercom.dm
@@ -6,8 +6,10 @@
w_class = 4.0
canhear_range = 2
flags = CONDUCT | NOBLOODY
+ var/circuit = /obj/item/weapon/circuitboard/intercom
var/number = 0
var/last_tick //used to delay the powercheck
+ var/wiresexposed = 0
/obj/item/device/radio/intercom/custom
name = "station intercom (Custom)"
@@ -81,6 +83,41 @@
spawn (0)
attack_self(user)
+/obj/item/device/radio/intercom/attackby(obj/item/W as obj, mob/user as mob)
+ src.add_fingerprint(user)
+ if(istype(W, /obj/item/weapon/screwdriver)) // Opening the intercom up.
+ wiresexposed = !wiresexposed
+ user << "The wires have been [wiresexposed ? "exposed" : "unexposed"]"
+ if(wiresexposed)
+ if(!on)
+ icon_state = "intercom-p_open"
+ else
+ icon_state = "intercom_open"
+ else
+ icon_state = "intercom"
+ return
+ if (wiresexposed && istype(W, /obj/item/weapon/wirecutters))
+ user.visible_message("[user] has cut the wires inside \the [src]!", "You have cut the wires inside \the [src].")
+ playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
+ new/obj/item/stack/cable_coil(get_turf(src), 5)
+ var/obj/structure/frame/A = new /obj/structure/frame( src.loc )
+ var/obj/item/weapon/circuitboard/M = new circuit( A )
+ A.frame_type = "intercom"
+ A.pixel_x = pixel_x
+ A.pixel_y = pixel_y
+ A.circuit = M
+ A.set_dir(dir)
+ A.anchored = 1
+ for (var/obj/C in src)
+ C.forceMove(loc)
+ A.state = 2
+ A.icon_state = "intercom_2"
+ M.deconstruct(src)
+ qdel(src)
+ else
+ src.attack_hand(user)
+ return
+
/obj/item/device/radio/intercom/receive_range(freq, level)
if (!on)
return -1
@@ -110,9 +147,15 @@
on = A.powered(EQUIP) // set "on" to the power status
if(!on)
- icon_state = "intercom-p"
+ if(wiresexposed)
+ icon_state = "intercom-p_open"
+ else
+ icon_state = "intercom-p"
else
- icon_state = initial(icon_state)
+ if(wiresexposed)
+ icon_state = "intercom_open"
+ else
+ icon_state = initial(icon_state)
/obj/item/device/radio/intercom/locked
var/locked_frequency
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index b8b79a5ca16..451b2c41af1 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -209,7 +209,7 @@
amount = 5
max_amount = 5
-/obj/item/stack/medical/splint/attack(mob/living/carbon/M as mob, mob/user as mob)
+/obj/item/stack/medical/splint/attack(mob/living/carbon/M as mob, mob/living/user as mob)
if(..())
return 1
diff --git a/code/game/objects/items/weapons/autopsy.dm b/code/game/objects/items/weapons/autopsy.dm
index c17d8ba6505..d196bc4ea7a 100644
--- a/code/game/objects/items/weapons/autopsy.dm
+++ b/code/game/objects/items/weapons/autopsy.dm
@@ -160,20 +160,7 @@
P.icon_state = "paper_words"
if(istype(usr,/mob/living/carbon))
- // place the item in the usr's hand if possible
- if(!usr.r_hand)
- P.loc = usr
- usr.r_hand = P
- P.layer = 20
- else if(!usr.l_hand)
- P.loc = usr
- usr.l_hand = P
- P.layer = 20
-
- if (ismob(src.loc))
- var/mob/M = src.loc
- M.update_inv_l_hand()
- M.update_inv_r_hand()
+ usr.put_in_hands(src)
/obj/item/weapon/autopsy_scanner/attack(mob/living/carbon/human/M as mob, mob/living/carbon/user as mob)
if(!istype(M))
diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm
index b156d569ad6..4772063b4c7 100644
--- a/code/game/objects/items/weapons/cigs_lighters.dm
+++ b/code/game/objects/items/weapons/cigs_lighters.dm
@@ -445,39 +445,36 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/weapon/flame/lighter/attack_self(mob/living/user)
if(!base_state)
base_state = icon_state
- if(user.r_hand == src || user.l_hand == src)
- if(!lit)
- lit = 1
- icon_state = "[base_state]on"
- item_state = "[base_state]on"
- if(istype(src, /obj/item/weapon/flame/lighter/zippo) )
- user.visible_message("Without even breaking stride, [user] flips open and lights [src] in one smooth movement.")
- else
- if(prob(95))
- user.visible_message("After a few attempts, [user] manages to light the [src].")
- else
- user << "You burn yourself while lighting the lighter."
- if (user.l_hand == src)
- user.apply_damage(2,BURN,"l_hand")
- else
- user.apply_damage(2,BURN,"r_hand")
- user.visible_message("After a few attempts, [user] manages to light the [src], they however burn their finger in the process.")
-
- set_light(2)
- processing_objects.Add(src)
+ if(!lit)
+ lit = 1
+ icon_state = "[base_state]on"
+ item_state = "[base_state]on"
+ if(istype(src, /obj/item/weapon/flame/lighter/zippo) )
+ user.visible_message("Without even breaking stride, [user] flips open and lights [src] in one smooth movement.")
else
- lit = 0
- icon_state = "[base_state]"
- item_state = "[base_state]"
- if(istype(src, /obj/item/weapon/flame/lighter/zippo) )
- user.visible_message("You hear a quiet click, as [user] shuts off [src] without even looking at what they're doing.")
+ if(prob(95))
+ user.visible_message("After a few attempts, [user] manages to light the [src].")
else
- user.visible_message("[user] quietly shuts off the [src].")
+ user << "You burn yourself while lighting the lighter."
+ if (user.get_left_hand() == src)
+ user.apply_damage(2,BURN,"l_hand")
+ else
+ user.apply_damage(2,BURN,"r_hand")
+ user.visible_message("After a few attempts, [user] manages to light the [src], they however burn their finger in the process.")
- set_light(0)
- processing_objects.Remove(src)
+ set_light(2)
+ processing_objects.Add(src)
else
- return ..()
+ lit = 0
+ icon_state = "[base_state]"
+ item_state = "[base_state]"
+ if(istype(src, /obj/item/weapon/flame/lighter/zippo) )
+ user.visible_message("You hear a quiet click, as [user] shuts off [src] without even looking at what they're doing.")
+ else
+ user.visible_message("[user] quietly shuts off the [src].")
+
+ set_light(0)
+ processing_objects.Remove(src)
return
diff --git a/code/game/objects/items/weapons/circuitboards/computer/camera_monitor.dm b/code/game/objects/items/weapons/circuitboards/computer/camera_monitor.dm
index 60f8bce2684..0016fc730ab 100644
--- a/code/game/objects/items/weapons/circuitboards/computer/camera_monitor.dm
+++ b/code/game/objects/items/weapons/circuitboards/computer/camera_monitor.dm
@@ -29,6 +29,16 @@
network = list("MINE")
req_access = list()
+/obj/item/weapon/circuitboard/security/telescreen/entertainment
+ name = T_BOARD("entertainment camera monitor")
+ build_path = /obj/machinery/computer/security/telescreen/entertainment
+ board_type = "display"
+ matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
+
+/obj/item/weapon/circuitboard/security/telescreen/entertainment/New()
+ ..()
+ network = NETWORK_THUNDER
+
/obj/item/weapon/circuitboard/security/construct(var/obj/machinery/computer/security/C)
if (..(C))
C.network = network.Copy()
diff --git a/code/game/objects/items/weapons/circuitboards/frame.dm b/code/game/objects/items/weapons/circuitboards/frame.dm
new file mode 100644
index 00000000000..30be1d52f7b
--- /dev/null
+++ b/code/game/objects/items/weapons/circuitboards/frame.dm
@@ -0,0 +1,253 @@
+#ifndef T_BOARD
+#error T_BOARD macro is not defined but we need it!
+#endif
+
+//Circuitboards for frames (mostly wall based frames). Most of these don't fit into other categories.
+
+//Display
+
+/obj/item/weapon/circuitboard/guestpass
+ name = T_BOARD("guestpass console")
+ build_path = /obj/machinery/computer/guestpass
+ board_type = "guestpass"
+ matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
+
+/obj/item/weapon/circuitboard/status_display
+ name = T_BOARD("status display")
+ build_path = /obj/machinery/status_display
+ board_type = "display"
+ matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
+
+/obj/item/weapon/circuitboard/ai_status_display
+ name = T_BOARD("ai status display")
+ build_path = /obj/machinery/ai_status_display
+ board_type = "display"
+ matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
+
+/obj/item/weapon/circuitboard/newscaster
+ name = T_BOARD("newscaster")
+ build_path = /obj/machinery/newscaster
+ board_type = "newscaster"
+ matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
+
+/obj/item/weapon/circuitboard/atm
+ name = T_BOARD("atm")
+ build_path = /obj/machinery/atm
+ board_type = "atm"
+ matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
+
+//Alarm
+
+/obj/item/weapon/circuitboard/firealarm
+ name = T_BOARD("fire alarm")
+ build_path = /obj/machinery/firealarm
+ board_type = "firealarm"
+ matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
+
+/obj/item/weapon/circuitboard/airalarm
+ name = T_BOARD("air alarm")
+ build_path = /obj/machinery/alarm
+ board_type = "airalarm"
+ matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
+
+/obj/item/weapon/circuitboard/intercom
+ name = T_BOARD("intercom")
+ build_path = /obj/item/device/radio/intercom
+ board_type = "intercom"
+ matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
+
+/obj/item/weapon/circuitboard/keycard_auth
+ name = T_BOARD("keycard authenticator")
+ build_path = /obj/machinery/keycard_auth
+ board_type = "keycard"
+ matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
+
+//Computer
+
+/obj/item/weapon/circuitboard/holopad
+ name = T_BOARD("holopad")
+ build_path = /obj/machinery/hologram/holopad
+ board_type = "holopad"
+ matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
+
+//Machine
+
+/obj/item/weapon/circuitboard/photocopier
+ name = T_BOARD("photocopier")
+ build_path = /obj/machinery/photocopier
+ board_type = "photocopier"
+ matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
+ req_components = list(
+ "/obj/item/weapon/stock_parts/scanning_module" = 1,
+ "/obj/item/weapon/stock_parts/motor" = 1,
+ "/obj/item/weapon/stock_parts/micro_laser" = 1,
+ "/obj/item/weapon/stock_parts/matter_bin" = 1)
+
+/obj/item/weapon/circuitboard/fax
+ name = T_BOARD("fax")
+ build_path = /obj/machinery/photocopier/faxmachine
+ board_type = "fax"
+ matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
+ req_components = list(
+ "/obj/item/weapon/stock_parts/scanning_module" = 1,
+ "/obj/item/weapon/stock_parts/motor" = 1,
+ "/obj/item/weapon/stock_parts/micro_laser" = 1,
+ "/obj/item/weapon/stock_parts/matter_bin" = 1)
+
+/obj/item/weapon/circuitboard/conveyor
+ name = T_BOARD("conveyor")
+ build_path = /obj/machinery/conveyor
+ board_type = "conveyor"
+ req_components = list(
+ "/obj/item/weapon/stock_parts/gear" = 2,
+ "/obj/item/weapon/stock_parts/motor" = 2,
+ "/obj/item/stack/cable_coil" = 5)
+
+/obj/item/weapon/circuitboard/microwave
+ name = T_BOARD("microwave")
+ build_path = /obj/machinery/microwave
+ board_type = "microwave"
+ matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
+ req_components = list(
+ "/obj/item/weapon/stock_parts/console_screen" = 1,
+ "/obj/item/weapon/stock_parts/motor" = 1,
+ "/obj/item/weapon/stock_parts/capacitor" = 1)
+
+/obj/item/weapon/circuitboard/vending
+ name = T_BOARD("vending")
+ build_path = /obj/machinery/vending
+ board_type = "vending"
+ matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
+ req_components = list(
+ "/obj/item/weapon/stock_parts/console_screen" = 1,
+ "/obj/item/weapon/stock_parts/motor" = 2,
+ "/obj/item/weapon/stock_parts/spring" = 2,
+ "/obj/item/stack/material/glass/reinforced" = 2)
+
+/obj/item/weapon/circuitboard/recharger
+ name = T_BOARD("recharger")
+ build_path = /obj/machinery/recharger
+ board_type = "recharger"
+ matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
+ req_components = list(
+ "/obj/item/weapon/stock_parts/capacitor" = 1,
+ "/obj/item/stack/cable_coil" = 5)
+
+/obj/item/weapon/circuitboard/recharger/wrecharger
+ name = T_BOARD("wall recharger")
+ build_path = /obj/machinery/recharger/wallcharger
+ board_type = "wrecharger"
+
+/obj/item/weapon/circuitboard/washing
+ name = T_BOARD("washing machine")
+ build_path = /obj/machinery/washing_machine
+ board_type = "washing"
+ matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
+ req_components = list(
+ "/obj/item/weapon/stock_parts/motor" = 1,
+ "/obj/item/weapon/stock_parts/gear" = 2)
+
+/obj/item/weapon/circuitboard/grinder
+ name = T_BOARD("reagent grinder")
+ build_path = /obj/machinery/reagentgrinder
+ board_type = "grinder"
+ matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
+ req_components = list(
+ "/obj/item/weapon/stock_parts/motor" = 1,
+ "/obj/item/weapon/stock_parts/gear" = 1,
+ "/obj/item/weapon/reagent_containers/glass/beaker/large" = 1)
+
+//for testing - If this is still in when I commit, someone shoot me. --leaving in for now, shouldn't be able to get these on station anyways.
+/obj/item/weapon/storage/box/frame_parts
+ display_contents_with_number = 1
+ New()
+ ..()
+ new /obj/item/weapon/circuitboard/guestpass( src )
+ new /obj/item/weapon/circuitboard/status_display( src )
+ new /obj/item/weapon/circuitboard/ai_status_display( src )
+ new /obj/item/weapon/circuitboard/newscaster( src )
+ new /obj/item/weapon/circuitboard/atm( src )
+ new /obj/item/weapon/circuitboard/firealarm( src )
+ new /obj/item/weapon/circuitboard/airalarm( src )
+ new /obj/item/weapon/circuitboard/intercom( src )
+ new /obj/item/weapon/circuitboard/keycard_auth( src )
+ new /obj/item/weapon/circuitboard/holopad( src )
+ new /obj/item/weapon/circuitboard/photocopier( src )
+ new /obj/item/weapon/circuitboard/fax( src )
+ new /obj/item/weapon/circuitboard/microwave( src )
+ new /obj/item/weapon/circuitboard/vending( src )
+ new /obj/item/weapon/circuitboard/washing( src )
+ new /obj/item/weapon/stock_parts/scanning_module( src )
+ new /obj/item/weapon/stock_parts/motor( src )
+ new /obj/item/weapon/stock_parts/micro_laser( src )
+ new /obj/item/weapon/stock_parts/matter_bin( src )
+ new /obj/item/weapon/stock_parts/gear( src )
+ new /obj/item/weapon/stock_parts/console_screen( src )
+ new /obj/item/weapon/stock_parts/capacitor( src )
+ new /obj/item/weapon/stock_parts/spring( src )
+ new /obj/item/weapon/stock_parts/scanning_module( src )
+ new /obj/item/weapon/stock_parts/motor( src )
+ new /obj/item/weapon/stock_parts/micro_laser( src )
+ new /obj/item/weapon/stock_parts/matter_bin( src )
+ new /obj/item/weapon/stock_parts/gear( src )
+ new /obj/item/weapon/stock_parts/console_screen( src )
+ new /obj/item/weapon/stock_parts/capacitor( src )
+ new /obj/item/weapon/stock_parts/spring( src )
+ new /obj/item/weapon/stock_parts/scanning_module( src )
+ new /obj/item/weapon/stock_parts/motor( src )
+ new /obj/item/weapon/stock_parts/micro_laser( src )
+ new /obj/item/weapon/stock_parts/matter_bin( src )
+ new /obj/item/weapon/stock_parts/gear( src )
+ new /obj/item/weapon/stock_parts/console_screen( src )
+ new /obj/item/weapon/stock_parts/capacitor( src )
+ new /obj/item/weapon/stock_parts/spring( src )
+ new /obj/item/weapon/stock_parts/scanning_module( src )
+ new /obj/item/weapon/stock_parts/motor( src )
+ new /obj/item/weapon/stock_parts/micro_laser( src )
+ new /obj/item/weapon/stock_parts/matter_bin( src )
+ new /obj/item/weapon/stock_parts/gear( src )
+ new /obj/item/weapon/stock_parts/console_screen( src )
+ new /obj/item/weapon/stock_parts/capacitor( src )
+ new /obj/item/weapon/stock_parts/spring( src )
+ new /obj/item/weapon/stock_parts/scanning_module( src )
+ new /obj/item/weapon/stock_parts/motor( src )
+ new /obj/item/weapon/stock_parts/micro_laser( src )
+ new /obj/item/weapon/stock_parts/matter_bin( src )
+ new /obj/item/weapon/stock_parts/gear( src )
+ new /obj/item/weapon/stock_parts/console_screen( src )
+ new /obj/item/weapon/stock_parts/capacitor( src )
+ new /obj/item/weapon/stock_parts/spring( src )
+ new /obj/item/weapon/stock_parts/scanning_module( src )
+ new /obj/item/weapon/stock_parts/motor( src )
+ new /obj/item/weapon/stock_parts/micro_laser( src )
+ new /obj/item/weapon/stock_parts/matter_bin( src )
+ new /obj/item/weapon/stock_parts/gear( src )
+ new /obj/item/weapon/stock_parts/console_screen( src )
+ new /obj/item/weapon/stock_parts/capacitor( src )
+ new /obj/item/weapon/stock_parts/spring( src )
+ new /obj/item/weapon/stock_parts/scanning_module( src )
+ new /obj/item/weapon/stock_parts/motor( src )
+ new /obj/item/weapon/stock_parts/micro_laser( src )
+ new /obj/item/weapon/stock_parts/matter_bin( src )
+ new /obj/item/weapon/stock_parts/gear( src )
+ new /obj/item/weapon/stock_parts/console_screen( src )
+ new /obj/item/weapon/stock_parts/capacitor( src )
+ new /obj/item/weapon/stock_parts/spring( src )
+ new /obj/item/weapon/stock_parts/scanning_module( src )
+ new /obj/item/weapon/stock_parts/motor( src )
+ new /obj/item/weapon/stock_parts/micro_laser( src )
+ new /obj/item/weapon/stock_parts/matter_bin( src )
+ new /obj/item/weapon/stock_parts/gear( src )
+ new /obj/item/weapon/stock_parts/console_screen( src )
+ new /obj/item/weapon/stock_parts/capacitor( src )
+ new /obj/item/weapon/stock_parts/spring( src )
+ new /obj/item/weapon/stock_parts/scanning_module( src )
+ new /obj/item/weapon/stock_parts/motor( src )
+ new /obj/item/weapon/stock_parts/micro_laser( src )
+ new /obj/item/weapon/stock_parts/matter_bin( src )
+ new /obj/item/weapon/stock_parts/gear( src )
+ new /obj/item/weapon/stock_parts/console_screen( src )
+ new /obj/item/weapon/stock_parts/capacitor( src )
+ new /obj/item/weapon/stock_parts/spring( src )
+ new /obj/item/stack/cable_coil( src , 5 )
+ new /obj/item/stack/material/glass/reinforced( src , 2 )
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/circuitboards/other.dm b/code/game/objects/items/weapons/circuitboards/other.dm
index 6d016a96fa1..da70371e4ac 100644
--- a/code/game/objects/items/weapons/circuitboards/other.dm
+++ b/code/game/objects/items/weapons/circuitboards/other.dm
@@ -1,5 +1,5 @@
#ifndef T_BOARD
-#error T_BOARD macro is not defined but we need it!
+#error T_BOARD macro is not defined but we need it!
#endif
//Stuff that doesn't fit into any category goes here
@@ -7,4 +7,4 @@
/obj/item/weapon/circuitboard/aicore
name = T_BOARD("AI core")
origin_tech = list(TECH_DATA = 4, TECH_BIO = 2)
- board_type = "other"
+ board_type = "other"
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm
index 218d2fb21cf..d92ad00babb 100644
--- a/code/game/objects/items/weapons/cosmetics.dm
+++ b/code/game/objects/items/weapons/cosmetics.dm
@@ -77,7 +77,5 @@
icon_state = "purplecomb"
item_state = "purplecomb"
-/obj/item/weapon/haircomb/attack_self(mob/user)
- if(user.r_hand == src || user.l_hand == src)
- user.visible_message(text("[] uses [] to comb their hair with incredible style and sophistication. What a [].", user, src, user.gender == FEMALE ? "lady" : "guy"))
- return
+/obj/item/weapon/haircomb/attack_self(mob/living/user)
+ user.visible_message(text("[] uses [] to comb their hair with incredible style and sophistication. What a [].", user, src, user.gender == FEMALE ? "lady" : "guy"))
diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm
index bbdd46cdb39..8cd4c373e90 100644
--- a/code/game/objects/items/weapons/flamethrower.dm
+++ b/code/game/objects/items/weapons/flamethrower.dm
@@ -39,8 +39,8 @@
return null
var/turf/location = loc
if(istype(location, /mob/))
- var/mob/M = location
- if(M.l_hand == src || M.r_hand == src)
+ var/mob/living/M = location
+ if(M.item_is_in_hands(src))
location = M.loc
if(isturf(location)) //start a fire if possible
location.hotspot_expose(700, 2)
diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm
index 43b58a17264..73c198c8ab6 100644
--- a/code/game/objects/items/weapons/gift_wrappaper.dm
+++ b/code/game/objects/items/weapons/gift_wrappaper.dm
@@ -125,12 +125,12 @@
icon_state = "wrap_paper"
var/amount = 20.0
-/obj/item/weapon/wrapping_paper/attackby(obj/item/weapon/W as obj, mob/user as mob)
+/obj/item/weapon/wrapping_paper/attackby(obj/item/weapon/W as obj, mob/living/user as mob)
..()
if (!( locate(/obj/structure/table, src.loc) ))
user << "You MUST put the paper on a table!"
if (W.w_class < 4)
- if ((istype(user.l_hand, /obj/item/weapon/wirecutters) || istype(user.r_hand, /obj/item/weapon/wirecutters)))
+ if (user.get_type_in_hands(/obj/item/weapon/wirecutters))
var/a_used = 2 ** (src.w_class - 1)
if (src.amount < a_used)
user << "You need more paper!"
diff --git a/code/game/objects/items/weapons/implants/implantpad.dm b/code/game/objects/items/weapons/implants/implantpad.dm
index 476ed726cd9..a6feac29981 100644
--- a/code/game/objects/items/weapons/implants/implantpad.dm
+++ b/code/game/objects/items/weapons/implants/implantpad.dm
@@ -24,8 +24,8 @@
return
- attack_hand(mob/user as mob)
- if ((src.case && (user.l_hand == src || user.r_hand == src)))
+ attack_hand(mob/living/user as mob)
+ if ((src.case && user.item_is_in_hands(src)))
user.put_in_active_hand(case)
src.case.add_fingerprint(user)
diff --git a/code/game/objects/items/weapons/material/twohanded.dm b/code/game/objects/items/weapons/material/twohanded.dm
index 2c11456b708..b404b69f0b9 100644
--- a/code/game/objects/items/weapons/material/twohanded.dm
+++ b/code/game/objects/items/weapons/material/twohanded.dm
@@ -29,7 +29,7 @@
/obj/item/weapon/material/twohanded/update_held_icon()
var/mob/living/M = loc
- if(istype(M) && !issmall(M) && ((M.r_hand == src && !M.l_hand) || (M.l_hand == src && !M.r_hand)))
+ if(istype(M) && !issmall(M) && M.item_is_in_hands(src) && !M.hands_are_full())
wielded = 1
force = force_wielded
name = "[base_name] (wielded)"
diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm
index 6a236e1b8f7..ac8da3d835c 100644
--- a/code/game/objects/items/weapons/melee/energy.dm
+++ b/code/game/objects/items/weapons/melee/energy.dm
@@ -214,7 +214,7 @@
spawn(1) if(src) qdel(src)
/obj/item/weapon/melee/energy/blade/process()
- if(!creator || loc != creator || (creator.l_hand != src && creator.r_hand != src))
+ if(!creator || loc != creator || !creator.item_is_in_hands(src))
// Tidy up a bit.
if(istype(loc,/mob/living))
var/mob/living/carbon/human/host = loc
diff --git a/code/game/objects/items/weapons/mop_deploy.dm b/code/game/objects/items/weapons/mop_deploy.dm
index 66ae01797e7..e50f82966bf 100644
--- a/code/game/objects/items/weapons/mop_deploy.dm
+++ b/code/game/objects/items/weapons/mop_deploy.dm
@@ -59,7 +59,7 @@
spawn(1) if(src) del(src)
/obj/item/weapon/mop_deploy/process()
- if(!creator || loc != creator || (creator.l_hand != src && creator.r_hand != src))
+ if(!creator || loc != creator || !creator.item_is_in_hands(src))
// Tidy up a bit.
if(istype(loc,/mob/living))
var/mob/living/carbon/human/host = loc
diff --git a/code/game/objects/items/weapons/storage/laundry_basket.dm b/code/game/objects/items/weapons/storage/laundry_basket.dm
index 92dd28c61a5..ffb4867ca68 100644
--- a/code/game/objects/items/weapons/storage/laundry_basket.dm
+++ b/code/game/objects/items/weapons/storage/laundry_basket.dm
@@ -21,7 +21,7 @@
var/linked
-/obj/item/weapon/storage/laundry_basket/attack_hand(mob/user as mob)
+/obj/item/weapon/storage/laundry_basket/attack_hand(mob/living/user as mob)
if(ishuman(user))
var/mob/living/carbon/human/H = user
var/obj/item/organ/external/temp = H.get_organ("r_hand")
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index 0a5b1ec6868..a79d6575e5e 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -173,7 +173,7 @@
user << text("\icon[] [] contains []/[] units of fuel!", src, src.name, get_fuel(),src.max_fuel )
-/obj/item/weapon/weldingtool/attackby(obj/item/W as obj, mob/user as mob)
+/obj/item/weapon/weldingtool/attackby(obj/item/W as obj, mob/living/user as mob)
if(istype(W,/obj/item/weapon/screwdriver))
if(welding)
user << "Stop welding first!"
@@ -222,9 +222,9 @@
//I'm not sure what this does. I assume it has to do with starting fires...
//...but it doesnt check to see if the welder is on or not.
var/turf/location = src.loc
- if(istype(location, /mob/))
- var/mob/M = location
- if(M.l_hand == src || M.r_hand == src)
+ if(istype(location, /mob/living))
+ var/mob/living/M = location
+ if(M.item_is_in_hands(src))
location = get_turf(M)
if (istype(location, /turf))
location.hotspot_expose(700, 5)
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index fa4fa27f758..bc10bc43596 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -90,11 +90,12 @@
// check for TK users
if (istype(usr, /mob/living/carbon/human))
- if(istype(usr.l_hand, /obj/item/tk_grab) || istype(usr.r_hand, /obj/item/tk_grab/))
- if(!(usr in nearby))
- if(usr.client && usr.machine==src)
+ var/mob/living/carbon/human/H = usr
+ if(H.get_type_in_hands(/obj/item/tk_grab))
+ if(!(H in nearby))
+ if(H.client && H.machine==src)
is_in_use = 1
- src.attack_hand(usr)
+ src.attack_hand(H)
in_use = is_in_use
/obj/proc/updateDialog()
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index fcbe9e90605..0a3ca351227 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -297,6 +297,7 @@
new /obj/item/taperoll/police(src)
new /obj/item/weapon/gun/projectile/colt/detective(src)
new /obj/item/clothing/accessory/holster/armpit(src)
+ new /obj/item/device/flashlight/maglight(src)
return
/obj/structure/closet/secure_closet/detective/update_icon()
diff --git a/code/game/objects/structures/curtains.dm b/code/game/objects/structures/curtains.dm
index cc67d80ac3b..fd3427e21e6 100644
--- a/code/game/objects/structures/curtains.dm
+++ b/code/game/objects/structures/curtains.dm
@@ -35,6 +35,21 @@
icon_state = "open"
layer = SHOWER_OPEN_LAYER
+/obj/structure/curtain/attackby(obj/item/P, mob/user)
+ if(istype(P, /obj/item/weapon/wirecutters))
+ playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
+ user << "You start to cut the shower curtains."
+ playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ if(do_after(user, 10))
+ user << "You cut the shower curtains."
+ var/obj/item/stack/material/plastic/A = new /obj/item/stack/material/plastic( src.loc )
+ A.amount = 3
+ qdel(src)
+ return
+ else
+ src.attack_hand(user)
+ return
+
/obj/structure/curtain/black
name = "black curtain"
color = "#222222"
diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm
index c8ccd4b32bd..dcc0270abc4 100644
--- a/code/game/objects/structures/extinguisher.dm
+++ b/code/game/objects/structures/extinguisher.dm
@@ -8,9 +8,19 @@
var/obj/item/weapon/extinguisher/has_extinguisher
var/opened = 0
-/obj/structure/extinguisher_cabinet/New()
+/obj/structure/extinguisher_cabinet/New(var/loc, var/dir, var/building = 0)
..()
- has_extinguisher = new/obj/item/weapon/extinguisher(src)
+
+ if(building)
+ if(loc)
+ src.loc = loc
+
+ pixel_x = (dir & 3)? 0 : (dir == 4 ? -27 : 27)
+ pixel_y = (dir & 3)? (dir ==1 ? -27 : 27) : 0
+ update_icon()
+ return
+ else
+ has_extinguisher = new/obj/item/weapon/extinguisher(src)
/obj/structure/extinguisher_cabinet/attackby(obj/item/O, mob/user)
if(isrobot(user))
@@ -23,12 +33,21 @@
user << "You place [O] in [src]."
else
opened = !opened
+ if(istype(O, /obj/item/weapon/wrench))
+ if(!has_extinguisher)
+ user << "You start to unwrench the extinguisher cabinet."
+ playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ if(do_after(user, 15))
+ user << "You unwrench the extinguisher cabinet."
+ new /obj/item/frame/extinguisher_cabinet( src.loc )
+ qdel(src)
+ return
else
opened = !opened
update_icon()
-/obj/structure/extinguisher_cabinet/attack_hand(mob/user)
+/obj/structure/extinguisher_cabinet/attack_hand(mob/living/user)
if(isrobot(user))
return
if (ishuman(user))
diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm
index 17957cc5894..b3ad998895a 100644
--- a/code/game/objects/structures/janicart.dm
+++ b/code/game/objects/structures/janicart.dm
@@ -107,7 +107,7 @@
if(!isliving(usr))
return
var/mob/living/user = usr
-
+
if(href_list["take"])
switch(href_list["take"])
if("garbage")
@@ -213,10 +213,10 @@
..()
-/obj/structure/bed/chair/janicart/relaymove(mob/user, direction)
+/obj/structure/bed/chair/janicart/relaymove(mob/living/user, direction)
if(user.stat || user.stunned || user.weakened || user.paralysis)
unbuckle_mob()
- if(istype(user.l_hand, /obj/item/key) || istype(user.r_hand, /obj/item/key))
+ if(user.get_type_in_hands(/obj/item/key))
step(src, direction)
update_mob()
else
diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm
index 88e771f8edd..a8747e07ec1 100644
--- a/code/game/objects/structures/mirror.dm
+++ b/code/game/objects/structures/mirror.dm
@@ -8,9 +8,18 @@
anchored = 1
var/shattered = 0
var/list/ui_users = list()
+ var/glass = 1
+
+/obj/structure/mirror/New(var/loc, var/dir, var/building = 0, mob/user as mob)
+ if(building)
+ glass = 0
+ icon_state = "mirror_frame"
+ pixel_x = (dir & 3)? 0 : (dir == 4 ? -28 : 28)
+ pixel_y = (dir & 3)? (dir == 1 ? -30 : 30) : 0
+ return
/obj/structure/mirror/attack_hand(mob/user as mob)
-
+ if(!glass) return
if(shattered) return
if(ishuman(user))
@@ -22,6 +31,7 @@
AC.ui_interact(user)
/obj/structure/mirror/proc/shatter()
+ if(!glass) return
if(shattered) return
shattered = 1
icon_state = "mirror_broke"
@@ -34,18 +44,57 @@
if(prob(Proj.get_structure_damage() * 2))
if(!shattered)
shatter()
- else
+ else if(glass)
playsound(src, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
..()
/obj/structure/mirror/attackby(obj/item/I as obj, mob/user as mob)
- if(shattered)
+ if(istype(I, /obj/item/weapon/wrench))
+ if(!glass)
+ playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ if(do_after(user, 20))
+ user << "You unfasten the frame."
+ new /obj/item/frame/mirror( src.loc )
+ qdel(src)
+ return
+ if(istype(I, /obj/item/weapon/crowbar))
+ if(shattered && glass)
+ user << "The broken glass falls out."
+ icon_state = "mirror_frame"
+ glass = !glass
+ new /obj/item/weapon/material/shard( src.loc )
+ return
+ if(!shattered && glass)
+ playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
+ user << "You remove the glass."
+ glass = !glass
+ icon_state = "mirror_frame"
+ new /obj/item/stack/material/glass( src.loc, 2 )
+ return
+
+ if(istype(I, /obj/item/stack/material/glass))
+ if(!glass)
+ var/obj/item/stack/material/glass/G = I
+ if (G.get_amount() < 2)
+ user << "You need two sheets of glass to add them to the frame."
+ return
+ user << "You start to add the glass to the frame."
+ if(do_after(user, 20))
+ if (G.use(2))
+ shattered = 0
+ glass = 1
+ icon_state = "mirror"
+ user << "You add the glass to the frame."
+ return
+
+ if(shattered && glass)
playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
return
if(prob(I.force * 2))
visible_message("[user] smashes [src] with [I]!")
- shatter()
+ if(glass)
+ shatter()
else
visible_message("[user] hits [src] with [I]!")
playsound(src.loc, 'sound/effects/Glasshit.ogg', 70, 1)
@@ -53,13 +102,14 @@
/obj/structure/mirror/attack_generic(var/mob/user, var/damage)
user.do_attack_animation(src)
- if(shattered)
+ if(shattered && glass)
playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
return 0
if(damage)
user.visible_message("[user] smashes [src]!")
- shatter()
+ if(glass)
+ shatter()
else
user.visible_message("[user] hits [src] and bounces off!")
return 1
diff --git a/code/game/objects/structures/noticeboard.dm b/code/game/objects/structures/noticeboard.dm
index 3647d565f7e..174634e3cb9 100644
--- a/code/game/objects/structures/noticeboard.dm
+++ b/code/game/objects/structures/noticeboard.dm
@@ -7,6 +7,18 @@
anchored = 1
var/notices = 0
+/obj/structure/noticeboard/New(var/loc, var/dir, var/building = 0)
+ ..()
+
+ if(building)
+ if(loc)
+ src.loc = loc
+
+ pixel_x = (dir & 3)? 0 : (dir == 4 ? -32 : 32)
+ pixel_y = (dir & 3)? (dir ==1 ? -27 : 27) : 0
+ update_icon()
+ return
+
/obj/structure/noticeboard/initialize()
for(var/obj/item/I in loc)
if(notices > 4) break
@@ -28,6 +40,14 @@
user << "You pin the paper to the noticeboard."
else
user << "You reach to pin your paper to the board but hesitate. You are certain your paper will not be seen among the many others already attached."
+ if(istype(O, /obj/item/weapon/wrench))
+ user << "You start to unwrench the noticeboard."
+ playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ if(do_after(user, 15))
+ user << "You unwrench the noticeboard."
+ new /obj/item/frame/noticeboard( src.loc )
+ qdel(src)
+ return
/obj/structure/noticeboard/attack_hand(var/mob/user)
examine(user)
@@ -64,15 +84,14 @@
return
var/obj/item/P = locate(href_list["write"])
if((P && P.loc == src)) //ifthe paper's on the board
- if(istype(usr.r_hand, /obj/item/weapon/pen)) //and you're holding a pen
- add_fingerprint(usr)
- P.attackby(usr.r_hand, usr) //then do ittttt
- else
- if(istype(usr.l_hand, /obj/item/weapon/pen)) //check other hand for pen
- add_fingerprint(usr)
- P.attackby(usr.l_hand, usr)
+ var/mob/living/M = usr
+ if(istype(M))
+ var/obj/item/weapon/pen/E = M.get_type_in_hands(/obj/item/weapon/pen)
+ if(E)
+ add_fingerprint(M)
+ P.attackby(E, usr)
else
- usr << "You'll need something to write with!"
+ M << "You'll need something to write with!"
if(href_list["read"])
var/obj/item/weapon/paper/P = locate(href_list["read"])
if((P && P.loc == src))
diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm
index a3904f65a1b..7003f4d3a22 100644
--- a/code/game/objects/structures/safe.dm
+++ b/code/game/objects/structures/safe.dm
@@ -90,7 +90,7 @@ FLOOR SAFES
var/mob/living/carbon/human/user = usr
var/canhear = 0
- if(istype(user.l_hand, /obj/item/clothing/accessory/stethoscope) || istype(user.r_hand, /obj/item/clothing/accessory/stethoscope))
+ if(user.get_type_in_hands(/obj/item/clothing/accessory/stethoscope))
canhear = 1
if(href_list["open"])
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index 8df5be2629f..4ac596267dc 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -358,7 +358,7 @@
if (ishuman(user))
var/mob/living/carbon/human/H = user
var/obj/item/organ/external/temp = H.organs_by_name["r_hand"]
- if (user.hand)
+ if (H.hand)
temp = H.organs_by_name["l_hand"]
if(temp && !temp.is_usable())
user << "You try to move your [temp.name], but cannot!"
diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm
index cc91ee49a20..47a3c5a63e9 100644
--- a/code/game/supplyshuttle.dm
+++ b/code/game/supplyshuttle.dm
@@ -55,6 +55,20 @@ var/list/mechtoys = list(
/mob/living/silicon/robot/drone
)
+/obj/structure/plasticflaps/attackby(obj/item/P, mob/user)
+ if(istype(P, /obj/item/weapon/wirecutters))
+ playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
+ user << "You start to cut the plastic flaps."
+ playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ if(do_after(user, 10))
+ user << "You cut the plastic flaps."
+ var/obj/item/stack/material/plastic/A = new /obj/item/stack/material/plastic( src.loc )
+ A.amount = 4
+ qdel(src)
+ return
+ else
+ return
+
/obj/structure/plasticflaps/CanPass(atom/A, turf/T)
if(istype(A) && A.checkpass(PASSGLASS))
return prob(60)
diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm
index c3c395f15a8..b731905e5fb 100644
--- a/code/modules/assembly/mousetrap.dm
+++ b/code/modules/assembly/mousetrap.dm
@@ -94,7 +94,7 @@
..()
- on_found(mob/finder as mob)
+ on_found(mob/living/finder as mob)
if(armed)
finder.visible_message("[finder] accidentally sets off [src], breaking their fingers.", \
"You accidentally trigger [src]!")
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index a8887c17f59..a15a6aeb555 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -76,7 +76,7 @@
var/turf/location = src.loc
if(istype(location, /mob/))
var/mob/living/carbon/human/M = location
- if(M.l_hand == src || M.r_hand == src || M.head == src)
+ if(M.item_is_in_hands(src) || M.head == src)
location = M.loc
if (istype(location, /turf))
diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm
index 214f63c2237..ad83edfbc42 100644
--- a/code/modules/clothing/masks/miscellaneous.dm
+++ b/code/modules/clothing/masks/miscellaneous.dm
@@ -22,7 +22,7 @@
say_verbs = list("mumbles", "says")
// Clumsy folks can't take the mask off themselves.
-/obj/item/clothing/mask/muzzle/attack_hand(mob/user as mob)
+/obj/item/clothing/mask/muzzle/attack_hand(mob/living/user as mob)
if(user.wear_mask == src && !user.IsAdvancedToolUser())
return 0
..()
diff --git a/code/modules/clothing/spacesuits/rig/rig_attackby.dm b/code/modules/clothing/spacesuits/rig/rig_attackby.dm
index c9526f16261..cda9d51796a 100644
--- a/code/modules/clothing/spacesuits/rig/rig_attackby.dm
+++ b/code/modules/clothing/spacesuits/rig/rig_attackby.dm
@@ -1,6 +1,6 @@
-/obj/item/weapon/rig/attackby(obj/item/W as obj, mob/user as mob)
+/obj/item/weapon/rig/attackby(obj/item/W as obj, mob/living/user as mob)
- if(!istype(user,/mob/living)) return 0
+ if(!istype(user)) return 0
if(electrified != 0)
if(shock(user)) //Handles removing charge from the cell, as well. No need to do that here.
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 41b0209e4d0..f98f222b937 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -1,6 +1,6 @@
/obj/item/clothing/suit/armor
- allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs)
+ allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/device/flashlight/maglight)
body_parts_covered = UPPER_TORSO|LOWER_TORSO
item_flags = THICKMATERIAL
@@ -263,7 +263,7 @@
icon_state = "kvest"
item_state = "kvest"
armor = list(melee = 40, bullet = 30, laser = 30, energy = 10, bomb = 10, bio = 0, rad = 0)
- allowed = list(/obj/item/weapon/gun,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs)
+ allowed = list(/obj/item/weapon/gun,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/device/flashlight/maglight)
body_parts_covered = UPPER_TORSO|LOWER_TORSO
item_flags = THICKMATERIAL
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index 3931b3ec675..8a3daf68ff0 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -96,7 +96,7 @@
item_state = "det_suit"
blood_overlay_type = "coat"
body_parts_covered = UPPER_TORSO|ARMS
- allowed = list(/obj/item/weapon/tank/emergency_oxygen, /obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/flame/lighter,/obj/item/device/taperecorder)
+ allowed = list(/obj/item/weapon/tank/emergency_oxygen, /obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/flame/lighter,/obj/item/device/taperecorder,/obj/item/device/uv_light)
armor = list(melee = 50, bullet = 10, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/suit/storage/det_trench/grey
@@ -109,7 +109,7 @@
desc = "A forensics technician jacket."
item_state = "det_suit"
body_parts_covered = UPPER_TORSO|ARMS
- allowed = list(/obj/item/weapon/tank/emergency_oxygen, /obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/device/taperecorder)
+ allowed = list(/obj/item/weapon/tank/emergency_oxygen, /obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/device/taperecorder,/obj/item/device/uv_light)
armor = list(melee = 10, bullet = 10, laser = 15, energy = 10, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/suit/storage/forensics/red
diff --git a/code/modules/detectivework/tools/evidencebag.dm b/code/modules/detectivework/tools/evidencebag.dm
index 31c5b6a3588..6aa4bdf99fb 100644
--- a/code/modules/detectivework/tools/evidencebag.dm
+++ b/code/modules/detectivework/tools/evidencebag.dm
@@ -15,7 +15,7 @@
var/mob/living/carbon/human/user = usr
- if (!(user.l_hand == src || user.r_hand == src))
+ if(!user.item_is_in_hands(src))
return //bag must be in your hands to use
if (isturf(I.loc))
@@ -31,10 +31,8 @@
var/obj/item/weapon/storage/U = I.loc
user.client.screen -= I
U.contents.Remove(I)
- else if(user.l_hand == I) //in a hand
- user.drop_l_hand()
- else if(user.r_hand == I) //in a hand
- user.drop_r_hand()
+ else if(user.item_is_in_hands(I))
+ user.drop_from_inventory(I)
else
return
diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm
index ce8c4e765d8..bc0388d40d9 100644
--- a/code/modules/economy/ATM.dm
+++ b/code/modules/economy/ATM.dm
@@ -22,6 +22,7 @@ log transactions
anchored = 1
use_power = 1
idle_power_usage = 10
+ circuit = /obj/item/weapon/circuitboard/atm
var/datum/money_account/authenticated_account
var/number_incorrect_tries = 0
var/previous_account_number = 0
@@ -79,6 +80,25 @@ log transactions
return 1
/obj/machinery/atm/attackby(obj/item/I as obj, mob/user as mob)
+ if(istype(I, /obj/item/weapon/screwdriver) && circuit)
+ user << "You start disconnecting the monitor."
+ playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ if(do_after(user, 20))
+ var/obj/structure/frame/A = new /obj/structure/frame( src.loc )
+ var/obj/item/weapon/circuitboard/M = new circuit( A )
+ A.frame_type = "atm"
+ A.pixel_x = pixel_x
+ A.pixel_y = pixel_y
+ A.circuit = M
+ A.anchored = 1
+ for (var/obj/C in src)
+ C.forceMove(loc)
+ user << "You disconnect the monitor."
+ A.state = 4
+ A.icon_state = "atm_4"
+ M.deconstruct(src)
+ qdel(src)
+ return
if(istype(I, /obj/item/weapon/card))
if(emagged > 0)
//prevent inserting id into an emagged ATM
diff --git a/code/modules/events/prison_break.dm b/code/modules/events/prison_break.dm
index d10659e24e2..51732366275 100644
--- a/code/modules/events/prison_break.dm
+++ b/code/modules/events/prison_break.dm
@@ -61,9 +61,12 @@
/datum/event/prison_break/tick()
if(activeFor == releaseWhen)
if(areas && areas.len > 0)
+ var/obj/machinery/power/apc/theAPC = null
for(var/area/A in areas)
- for(var/obj/machinery/light/L in A)
- L.flicker(10)
+ theAPC = A.get_apc()
+ if(theAPC.operating) //If the apc's off, it's a little hard to overload the lights.
+ for(var/obj/machinery/light/L in A)
+ L.flicker(10)
/datum/event/prison_break/end()
diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm
index 1ea1a9a3563..1b353e34071 100644
--- a/code/modules/games/cards.dm
+++ b/code/modules/games/cards.dm
@@ -77,12 +77,8 @@
usr << "There are no cards in the deck."
return
- var/obj/item/weapon/hand/H
- if(user.l_hand && istype(user.l_hand,/obj/item/weapon/hand))
- H = user.l_hand
- else if(user.r_hand && istype(user.r_hand,/obj/item/weapon/hand))
- H = user.r_hand
- else
+ var/obj/item/weapon/hand/H = user.get_type_in_hands(/obj/item/weapon/hand)
+ if(!H)
H = new(get_turf(src))
user.put_in_hands(H)
diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm
index 160dec82f4b..608398a039c 100644
--- a/code/modules/hydroponics/grown.dm
+++ b/code/modules/hydroponics/grown.dm
@@ -172,7 +172,7 @@
if(seed) seed.thrown_at(src,hit_atom)
..()
-/obj/item/weapon/reagent_containers/food/snacks/grown/attackby(var/obj/item/weapon/W, var/mob/user)
+/obj/item/weapon/reagent_containers/food/snacks/grown/attackby(var/obj/item/weapon/W, var/mob/living/user)
if(seed)
if(seed.get_trait(TRAIT_PRODUCES_POWER) && istype(W, /obj/item/stack/cable_coil))
@@ -181,7 +181,7 @@
//TODO: generalize this.
user << "You add some cable to the [src.name] and slide it inside the battery casing."
var/obj/item/weapon/cell/potato/pocell = new /obj/item/weapon/cell/potato(get_turf(user))
- if(src.loc == user && !(user.l_hand && user.r_hand) && istype(user,/mob/living/carbon/human))
+ if(src.loc == user && istype(user,/mob/living/carbon/human))
user.put_in_hands(pocell)
pocell.maxcharge = src.potency * 10
pocell.charge = pocell.maxcharge
diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm
index 0dc46f9e352..0974a705ced 100644
--- a/code/modules/hydroponics/seed.dm
+++ b/code/modules/hydroponics/seed.dm
@@ -150,7 +150,7 @@
var/body_coverage = HEAD|FACE|EYES|UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
for(var/obj/item/clothing/clothes in target)
- if(target.l_hand == clothes|| target.r_hand == clothes)
+ if(target.item_is_in_hands(clothes))
continue
body_coverage &= ~(clothes.body_parts_covered)
@@ -182,7 +182,7 @@
continue
var/body_coverage = HEAD|FACE|EYES|UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
for(var/obj/item/clothing/clothes in M)
- if(M.l_hand == clothes || M.r_hand == clothes)
+ if(M.item_is_in_hands(clothes))
continue
body_coverage &= ~(clothes.body_parts_covered)
if(!body_coverage)
diff --git a/code/modules/hydroponics/seed_machines.dm b/code/modules/hydroponics/seed_machines.dm
index b1d31343444..015ab88ccbf 100644
--- a/code/modules/hydroponics/seed_machines.dm
+++ b/code/modules/hydroponics/seed_machines.dm
@@ -94,16 +94,10 @@
user << "You load [W] into [src]."
return
- if(istype(W,/obj/item/weapon/screwdriver))
- open = !open
- user << "You [open ? "open" : "close"] the maintenance panel."
+ if(default_deconstruction_screwdriver(user, W))
+ return
+ if(default_deconstruction_crowbar(user, W))
return
-
- if(open)
- if(istype(W, /obj/item/weapon/crowbar))
- dismantle()
- return
-
if(istype(W,/obj/item/weapon/disk/botany))
if(loaded_disk)
user << "There is already a data disk loaded."
diff --git a/code/modules/hydroponics/trays/tray_tools.dm b/code/modules/hydroponics/trays/tray_tools.dm
index 1a76ad22fd0..856af9b3e8b 100644
--- a/code/modules/hydroponics/trays/tray_tools.dm
+++ b/code/modules/hydroponics/trays/tray_tools.dm
@@ -34,7 +34,7 @@
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(get_turf(src))
P.name = "paper - [form_title]"
P.info = "[last_data]"
- if(istype(user,/mob/living/carbon/human) && !(user.l_hand && user.r_hand))
+ if(istype(user,/mob/living/carbon/human))
user.put_in_hands(P)
user.visible_message("\The [src] spits out a piece of paper.")
return
diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm
index 13caccfba02..3dbb74d9335 100644
--- a/code/modules/library/lib_items.dm
+++ b/code/modules/library/lib_items.dm
@@ -45,7 +45,7 @@
user << "You begin dismantling \the [src]."
if(do_after(user,25))
user << "You dismantle \the [src]."
- new /obj/item/stack/material/wood(get_turf(src), amount = 3)
+ new /obj/item/stack/material/wood(get_turf(src), 3)
for(var/obj/item/weapon/book/b in contents)
b.loc = (get_turf(src))
qdel(src)
diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm
index 18c96cf622c..cf83cef983a 100644
--- a/code/modules/materials/material_recipes.dm
+++ b/code/modules/materials/material_recipes.dm
@@ -47,9 +47,11 @@
recipes += new/datum/stack_recipe("cannon frame", /obj/item/weapon/cannonframe, 10, time = 15, one_per_turf = 0, on_floor = 0)
recipes += new/datum/stack_recipe("regular floor tile", /obj/item/stack/tile/floor, 1, 4, 20)
recipes += new/datum/stack_recipe("metal rod", /obj/item/stack/rods, 1, 2, 60)
- recipes += new/datum/stack_recipe("computer frame", /obj/structure/computerframe, 5, time = 25, one_per_turf = 1, on_floor = 1)
+ recipes += new/datum/stack_recipe("frame", /obj/item/frame, 5, time = 25, one_per_turf = 1, on_floor = 1)
+ recipes += new/datum/stack_recipe("mirror frame", /obj/item/frame/mirror, 1, time = 5, one_per_turf = 0, on_floor = 1)
+ recipes += new/datum/stack_recipe("fire extinguisher cabinet frame", /obj/item/frame/extinguisher_cabinet, 4, time = 5, one_per_turf = 0, on_floor = 1)
+ //recipes += new/datum/stack_recipe("fire axe cabinet frame", /obj/item/frame/fireaxe_cabinet, 4, time = 5, one_per_turf = 0, on_floor = 1)
recipes += new/datum/stack_recipe("wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1)
- recipes += new/datum/stack_recipe("machine frame", /obj/machinery/constructable_frame/machine_frame, 5, time = 25, one_per_turf = 1, on_floor = 1)
recipes += new/datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, time = 25, one_per_turf = 1, on_floor = 1)
recipes += new/datum/stack_recipe_list("airlock assemblies", list( \
new/datum/stack_recipe("standard airlock assembly", /obj/structure/door_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1), \
@@ -70,13 +72,17 @@
new/datum/stack_recipe("emergency shutter", /obj/structure/firedoor_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("multi-tile airlock assembly", /obj/structure/door_assembly/multi_tile, 4, time = 50, one_per_turf = 1, on_floor = 1), \
))
-
+ recipes += new/datum/stack_recipe("IV drip", /obj/machinery/iv_drip, 4, time = 20, one_per_turf = 1, on_floor = 1)
+ recipes += new/datum/stack_recipe("conveyor switch", /obj/machinery/conveyor_switch, 2, time = 20, one_per_turf = 1, on_floor = 1)
recipes += new/datum/stack_recipe("grenade casing", /obj/item/weapon/grenade/chem_grenade)
recipes += new/datum/stack_recipe("light fixture frame", /obj/item/frame/light, 2)
recipes += new/datum/stack_recipe("small light fixture frame", /obj/item/frame/light/small, 1)
recipes += new/datum/stack_recipe("apc frame", /obj/item/frame/apc, 2)
- recipes += new/datum/stack_recipe("air alarm frame", /obj/item/frame/air_alarm, 2)
- recipes += new/datum/stack_recipe("fire alarm frame", /obj/item/frame/fire_alarm, 2)
+ recipes += new/datum/stack_recipe_list("filing cabinets", list( \
+ new/datum/stack_recipe("filing cabinet", /obj/structure/filingcabinet, 4, time = 20, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("tall filing cabinet", /obj/structure/filingcabinet/filingcabinet, 4, time = 20, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("chest drawer", /obj/structure/filingcabinet/chestdrawer, 4, time = 20, one_per_turf = 1, on_floor = 1), \
+ ))
/material/plasteel/generate_recipes()
..()
@@ -84,6 +90,7 @@
recipes += new/datum/stack_recipe("Metal crate", /obj/structure/closet/crate, 10, time = 50, one_per_turf = 1)
recipes += new/datum/stack_recipe("knife grip", /obj/item/weapon/material/butterflyhandle, 4, time = 20, one_per_turf = 0, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("dark floor tile", /obj/item/stack/tile/floor_dark, 1, 4, 20)
+ recipes += new/datum/stack_recipe("roller bed", /obj/item/roller, 5, time = 30, on_floor = 1)
/material/sandstone/generate_recipes()
..()
@@ -99,6 +106,10 @@
recipes += new/datum/stack_recipe("reagent dispenser cartridge (small)", /obj/item/weapon/reagent_containers/chem_disp_cartridge/small, 1, on_floor=0) // 100u
recipes += new/datum/stack_recipe("white floor tile", /obj/item/stack/tile/floor_white, 1, 4, 20)
recipes += new/datum/stack_recipe("freezer floor tile", /obj/item/stack/tile/floor_freezer, 1, 4, 20)
+ recipes += new/datum/stack_recipe("shower curtain", /obj/structure/curtain, 4, time = 15, one_per_turf = 1, on_floor = 1)
+ recipes += new/datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 4, time = 25, one_per_turf = 1, on_floor = 1)
+ recipes += new/datum/stack_recipe("airtight plastic flaps", /obj/structure/plasticflaps/mining, 5, time = 25, one_per_turf = 1, on_floor = 1)
+ recipes += new/datum/stack_recipe("water-cooler", /obj/structure/reagent_dispensers/water_cooler, 4, time = 1, one_per_turf = 1, on_floor = 1)
/material/wood/generate_recipes()
..()
@@ -110,6 +121,7 @@
recipes += new/datum/stack_recipe("beehive assembly", /obj/item/beehive_assembly, 4)
recipes += new/datum/stack_recipe("beehive frame", /obj/item/honey_frame, 1)
recipes += new/datum/stack_recipe("book shelf", /obj/structure/bookcase, 5, time = 15, one_per_turf = 1, on_floor = 1)
+ recipes += new/datum/stack_recipe("noticeboard frame", /obj/item/frame/noticeboard, 4, time = 5, one_per_turf = 0, on_floor = 1)
/material/cardboard/generate_recipes()
..()
diff --git a/code/modules/materials/materials.dm b/code/modules/materials/materials.dm
index 760303ac238..25edc577289 100644
--- a/code/modules/materials/materials.dm
+++ b/code/modules/materials/materials.dm
@@ -128,7 +128,7 @@ var/list/name_to_material
S.add_fingerprint(user)
S.add_to_stacks(user)
-/material/proc/build_wired_product(var/mob/user, var/obj/item/stack/used_stack, var/obj/item/stack/target_stack)
+/material/proc/build_wired_product(var/mob/living/user, var/obj/item/stack/used_stack, var/obj/item/stack/target_stack)
if(!wire_product)
user << "You cannot make anything out of \the [target_stack]"
return
@@ -140,8 +140,7 @@ var/list/name_to_material
target_stack.use(1)
user << "You attach wire to the [name]."
var/obj/item/product = new wire_product(get_turf(user))
- if(!(user.l_hand && user.r_hand))
- user.put_in_hands(product)
+ user.put_in_hands(product)
// Make sure we have a display name and shard icon even if they aren't explicitly set.
/material/New()
diff --git a/code/modules/mining/drilling/drill.dm b/code/modules/mining/drilling/drill.dm
index 381072871f0..baa3306c88d 100644
--- a/code/modules/mining/drilling/drill.dm
+++ b/code/modules/mining/drilling/drill.dm
@@ -9,6 +9,7 @@
name = "mining drill head"
desc = "An enormous drill."
icon_state = "mining_drill"
+ circuit = /obj/item/weapon/circuitboard/miningdrill
var/braces_needed = 2
var/list/supports = list()
var/supported = 0
@@ -43,7 +44,6 @@
..()
component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/miningdrill(src)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
component_parts += new /obj/item/weapon/stock_parts/capacitor(src)
component_parts += new /obj/item/weapon/stock_parts/micro_laser(src)
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index 7a2783767be..8e9155d044e 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -172,10 +172,9 @@ var/list/mining_overlay_cache = list()
if(istype(AM,/mob/living/carbon/human))
var/mob/living/carbon/human/H = AM
- if((istype(H.l_hand,/obj/item/weapon/pickaxe)) && (!H.hand))
- attackby(H.l_hand,H)
- else if((istype(H.r_hand,/obj/item/weapon/pickaxe)) && H.hand)
- attackby(H.r_hand,H)
+ var/obj/item/weapon/pickaxe/P = H.get_inactive_hand()
+ if(istype(P))
+ src.attackby(P, H)
else if(istype(AM,/mob/living/silicon/robot))
var/mob/living/silicon/robot/R = AM
diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm
index 77eedec9005..d5fde7978df 100644
--- a/code/modules/mob/inventory.dm
+++ b/code/modules/mob/inventory.dm
@@ -1,43 +1,3 @@
-//This proc is called whenever someone clicks an inventory ui slot.
-/mob/proc/attack_ui(slot)
- var/obj/item/W = get_active_hand()
- if(istype(W))
- equip_to_slot_if_possible(W, slot)
-
-/mob/proc/put_in_any_hand_if_possible(obj/item/W as obj, del_on_fail = 0, disable_warning = 1, redraw_mob = 1)
- if(equip_to_slot_if_possible(W, slot_l_hand, del_on_fail, disable_warning, redraw_mob))
- return 1
- else if(equip_to_slot_if_possible(W, slot_r_hand, del_on_fail, disable_warning, redraw_mob))
- return 1
- return 0
-
-//This is a SAFE proc. Use this instead of equip_to_slot()!
-//set del_on_fail to have it delete W if it fails to equip
-//set disable_warning to disable the 'you are unable to equip that' warning.
-//unset redraw_mob to prevent the mob from being redrawn at the end.
-/mob/proc/equip_to_slot_if_possible(obj/item/W as obj, slot, del_on_fail = 0, disable_warning = 0, redraw_mob = 1)
- if(!istype(W)) return 0
-
- if(!W.mob_can_equip(src, slot))
- if(del_on_fail)
- qdel(W)
- else
- if(!disable_warning)
- src << "\red You are unable to equip that." //Only print if del_on_fail is false
- return 0
-
- equip_to_slot(W, slot, redraw_mob) //This proc should not ever fail.
- return 1
-
-//This is an UNSAFE proc. It merely handles the actual job of equipping. All the checks on whether you can or can't eqip need to be done before! Use mob_can_equip() for that task.
-//In most cases you will want to use equip_to_slot_if_possible()
-/mob/proc/equip_to_slot(obj/item/W as obj, slot)
- return
-
-//This is just a commonly used configuration for the equip_to_slot_if_possible() proc, used to equip people when the rounds tarts and when events happen and such.
-/mob/proc/equip_to_slot_or_del(obj/item/W as obj, slot)
- return equip_to_slot_if_possible(W, slot, 1, 1, 0)
-
//The list of slots by priority. equip_to_appropriate_slot() uses this list. Doesn't matter if a mob type doesn't have a slot.
var/list/slot_equipment_priority = list( \
slot_back,\
@@ -58,6 +18,49 @@ var/list/slot_equipment_priority = list( \
slot_r_store\
)
+/mob
+ var/obj/item/weapon/storage/s_active = null // Even ghosts can/should be able to peek into boxes on the ground
+
+//This proc is called whenever someone clicks an inventory ui slot.
+/mob/proc/attack_ui(var/slot)
+ var/obj/item/W = get_active_hand()
+ if(istype(W))
+ equip_to_slot_if_possible(W, slot)
+
+/* Inventory manipulation */
+
+/mob/proc/put_in_any_hand_if_possible(obj/item/W as obj, del_on_fail = 0, disable_warning = 1, redraw_mob = 1)
+ if(equip_to_slot_if_possible(W, slot_l_hand, del_on_fail, disable_warning, redraw_mob))
+ return 1
+ else if(equip_to_slot_if_possible(W, slot_r_hand, del_on_fail, disable_warning, redraw_mob))
+ return 1
+ return 0
+
+//This is a SAFE proc. Use this instead of equip_to_slot()!
+//set del_on_fail to have it delete W if it fails to equip
+//set disable_warning to disable the 'you are unable to equip that' warning.
+//unset redraw_mob to prevent the mob from being redrawn at the end.
+/mob/proc/equip_to_slot_if_possible(obj/item/W as obj, slot, del_on_fail = 0, disable_warning = 0, redraw_mob = 1)
+ if(!W.mob_can_equip(src, slot))
+ if(del_on_fail)
+ qdel(W)
+ else
+ if(!disable_warning)
+ src << "\red You are unable to equip that." //Only print if del_on_fail is false
+ return 0
+
+ equip_to_slot(W, slot, redraw_mob) //This proc should not ever fail.
+ return 1
+
+//This is an UNSAFE proc. It merely handles the actual job of equipping. All the checks on whether you can or can't eqip need to be done before! Use mob_can_equip() for that task.
+//In most cases you will want to use equip_to_slot_if_possible()
+/mob/proc/equip_to_slot(obj/item/W as obj, slot)
+ return
+
+//This is just a commonly used configuration for the equip_to_slot_if_possible() proc, used to equip people when the rounds tarts and when events happen and such.
+/mob/proc/equip_to_slot_or_del(obj/item/W as obj, slot)
+ return equip_to_slot_if_possible(W, slot, 1, 1, 0)
+
//Checks if a given slot can be accessed at this time, either to equip or unequip I
/mob/proc/slot_is_accessible(var/slot, var/obj/item/I, mob/user=null)
return 1
@@ -65,8 +68,6 @@ var/list/slot_equipment_priority = list( \
//puts the item "W" into an appropriate slot in a human's inventory
//returns 0 if it cannot, 1 if successful
/mob/proc/equip_to_appropriate_slot(obj/item/W)
- if(!istype(W)) return 0
-
for(var/slot in slot_equipment_priority)
if(equip_to_slot_if_possible(W, slot, del_on_fail=0, disable_warning=1, redraw_mob=1))
return 1
@@ -74,32 +75,15 @@ var/list/slot_equipment_priority = list( \
return 0
/mob/proc/equip_to_storage(obj/item/newitem)
- // Try put it in their backpack
- if(istype(src.back,/obj/item/weapon/storage))
- var/obj/item/weapon/storage/backpack = src.back
- if(backpack.contents.len < backpack.storage_slots)
- newitem.forceMove(src.back)
- return 1
-
- // Try to place it in any item that can store stuff, on the mob.
- for(var/obj/item/weapon/storage/S in src.contents)
- if (S.contents.len < S.storage_slots)
- newitem.forceMove(S)
- return 1
return 0
-//These procs handle putting s tuff in your hand. It's probably best to use these rather than setting l_hand = ...etc
-//as they handle all relevant stuff like adding it to the player's screen and updating their overlays.
+/* Hands */
//Returns the thing in our active hand
/mob/proc/get_active_hand()
- if(hand) return l_hand
- else return r_hand
//Returns the thing in our inactive hand
/mob/proc/get_inactive_hand()
- if(hand) return r_hand
- else return l_hand
//Puts the item into your l_hand if possible and calls all necessary triggers/updates. returns 1 on success.
/mob/proc/put_in_l_hand(var/obj/item/W)
@@ -150,16 +134,15 @@ var/list/slot_equipment_priority = list( \
//Drops the item in our left hand
/mob/proc/drop_l_hand(var/atom/Target)
- return drop_from_inventory(l_hand, Target)
+ return 0
//Drops the item in our right hand
/mob/proc/drop_r_hand(var/atom/Target)
- return drop_from_inventory(r_hand, Target)
+ return 0
//Drops the item in our active hand. TODO: rename this to drop_active_hand or something
/mob/proc/drop_item(var/atom/Target)
- if(hand) return drop_l_hand(Target)
- else return drop_r_hand(Target)
+ return
/*
Removes the object from any slots the mob might have, calling the appropriate icon update proc.
@@ -173,19 +156,6 @@ var/list/slot_equipment_priority = list( \
the search through all the slots, without having to duplicate the rest of the item dropping.
*/
/mob/proc/u_equip(obj/W as obj)
- if (W == r_hand)
- r_hand = null
- update_inv_r_hand(0)
- else if (W == l_hand)
- l_hand = null
- update_inv_l_hand(0)
- else if (W == back)
- back = null
- update_inv_back(0)
- else if (W == wear_mask)
- wear_mask = null
- update_inv_wear_mask(0)
- return
/mob/proc/isEquipped(obj/item/I)
if(!I)
@@ -229,11 +199,6 @@ var/list/slot_equipment_priority = list( \
//Returns the item equipped to the specified slot, if any.
/mob/proc/get_equipped_item(var/slot)
- switch(slot)
- if(slot_l_hand) return l_hand
- if(slot_r_hand) return r_hand
- if(slot_back) return back
- if(slot_wear_mask) return wear_mask
return null
//Outdated but still in use apparently. This should at least be a human proc.
diff --git a/code/modules/mob/living/bot/floorbot.dm b/code/modules/mob/living/bot/floorbot.dm
index 30e137c21a5..783af91c659 100644
--- a/code/modules/mob/living/bot/floorbot.dm
+++ b/code/modules/mob/living/bot/floorbot.dm
@@ -288,7 +288,7 @@
/* Assembly */
-/obj/item/weapon/storage/toolbox/mechanical/attackby(var/obj/item/stack/tile/floor/T, mob/user as mob)
+/obj/item/weapon/storage/toolbox/mechanical/attackby(var/obj/item/stack/tile/floor/T, mob/living/user as mob)
if(!istype(T, /obj/item/stack/tile/floor))
..()
return
diff --git a/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm b/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm
index b9338f361ff..9bf9e62dfb9 100644
--- a/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm
+++ b/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm
@@ -2,7 +2,7 @@
var/mob/living/carbon/human/H = over_object
if(!istype(H) || !Adjacent(H))
return ..()
- if(H.a_intent == "grab" && hat && !(H.l_hand && H.r_hand))
+ if(H.a_intent == "grab" && hat && !H.hands_are_full())
hat.loc = get_turf(src)
H.put_in_hands(hat)
H.visible_message("\The [H] removes \the [src]'s [hat].")
diff --git a/code/modules/mob/living/carbon/give.dm b/code/modules/mob/living/carbon/give.dm
index 5c4be494ee5..14c8efbbadd 100644
--- a/code/modules/mob/living/carbon/give.dm
+++ b/code/modules/mob/living/carbon/give.dm
@@ -3,40 +3,40 @@
set name = "Give"
// TODO : Change to incapacitated() on merge.
- if(usr.stat || usr.lying || usr.resting || usr.buckled)
+ if(src.stat || src.lying || src.resting || src.buckled)
return
if(!istype(target) || target.stat || target.lying || target.resting || target.buckled || target.client == null)
return
- var/obj/item/I = usr.get_active_hand()
+ var/obj/item/I = src.get_active_hand()
if(!I)
- I = usr.get_inactive_hand()
+ I = src.get_inactive_hand()
if(!I)
- usr << "You don't have anything in your hands to give to \the [target]."
+ src << "You don't have anything in your hands to give to \the [target]."
return
- if(alert(target,"[usr] wants to give you \a [I]. Will you accept it?",,"No","Yes") == "No")
- target.visible_message("\The [usr] tried to hand \the [I] to \the [target], \
+ if(alert(target,"[src] wants to give you \a [I]. Will you accept it?",,"No","Yes") == "No")
+ target.visible_message("\The [src] tried to hand \the [I] to \the [target], \
but \the [target] didn't want it.")
return
if(!I) return
if(!Adjacent(target))
- usr << "You need to stay in reaching distance while giving an object."
- target << "\The [usr] moved too far away."
+ src << "You need to stay in reaching distance while giving an object."
+ target << "\The [src] moved too far away."
return
- if(I.loc != usr || (usr.l_hand != I && usr.r_hand != I))
- usr << "You need to keep the item in your hands."
- target << "\The [usr] seems to have given up on passing \the [I] to you."
+ if(I.loc != src || !src.item_is_in_hands(I))
+ src << "You need to keep the item in your hands."
+ target << "\The [src] seems to have given up on passing \the [I] to you."
return
- if(target.r_hand != null && target.l_hand != null)
+ if(target.hands_are_full())
target << "Your hands are full."
- usr << "Their hands are full."
+ src << "Their hands are full."
return
- if(usr.unEquip(I))
+ if(src.unEquip(I))
target.put_in_hands(I) // If this fails it will just end up on the floor, but that's fitting for things like dionaea.
- target.visible_message("\The [usr] handed \the [I] to \the [target].")
+ target.visible_message("\The [src] handed \the [I] to \the [target].")
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index 885d3e0866b..87c05245717 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -538,9 +538,9 @@
if ("handshake")
m_type = 1
if (!src.restrained() && !src.r_hand)
- var/mob/M = null
+ var/mob/living/M = null
if (param)
- for (var/mob/A in view(1, null))
+ for (var/mob/living/A in view(1, null))
if (param == A.name)
M = A
break
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 37034b29ca1..74d8b54a930 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1115,9 +1115,11 @@
spawn(0)
regenerate_icons()
if(vessel.total_volume < species.blood_volume)
+ vessel.maximum_volume = species.blood_volume
vessel.add_reagent("blood", species.blood_volume - vessel.total_volume)
else if(vessel.total_volume > species.blood_volume)
vessel.remove_reagent("blood", vessel.total_volume - species.blood_volume)
+ vessel.maximum_volume = species.blood_volume
fixblood()
// Rebuild the HUD. If they aren't logged in then login() should reinstantiate it for them.
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index a8222dc2801..797b9b1fe63 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -207,7 +207,7 @@
var/covered = 0 // Basic coverage can help.
for(var/obj/item/clothing/clothes in H)
- if(H.l_hand == clothes|| H.r_hand == clothes)
+ if(H.item_is_in_hands(clothes))
continue
if((clothes.body_parts_covered & UPPER_TORSO) && (clothes.body_parts_covered & LOWER_TORSO))
covered = 1
diff --git a/code/modules/mob/living/inventory.dm b/code/modules/mob/living/inventory.dm
new file mode 100644
index 00000000000..1cd446eaec4
--- /dev/null
+++ b/code/modules/mob/living/inventory.dm
@@ -0,0 +1,172 @@
+/mob/living
+ var/hand = null
+ var/obj/item/l_hand = null
+ var/obj/item/r_hand = null
+ var/obj/item/weapon/back = null//Human/Monkey
+ var/obj/item/weapon/tank/internal = null//Human/Monkey
+ var/obj/item/clothing/mask/wear_mask = null//Carbon
+
+/mob/living/equip_to_storage(obj/item/newitem)
+ // Try put it in their backpack
+ if(istype(src.back,/obj/item/weapon/storage))
+ var/obj/item/weapon/storage/backpack = src.back
+ if(backpack.contents.len < backpack.storage_slots)
+ newitem.forceMove(src.back)
+ return 1
+
+ // Try to place it in any item that can store stuff, on the mob.
+ for(var/obj/item/weapon/storage/S in src.contents)
+ if (S.contents.len < S.storage_slots)
+ newitem.forceMove(S)
+ return 1
+ return 0
+
+//Returns the thing in our active hand
+/mob/living/get_active_hand()
+ if(hand) return l_hand
+ else return r_hand
+
+//Returns the thing in our inactive hand
+/mob/living/get_inactive_hand()
+ if(hand) return r_hand
+ else return l_hand
+
+//Drops the item in our active hand. TODO: rename this to drop_active_hand or something
+/mob/living/drop_item(var/atom/Target)
+ if(hand) return drop_l_hand(Target)
+ else return drop_r_hand(Target)
+
+//Drops the item in our left hand
+/mob/living/drop_l_hand(var/atom/Target)
+ return drop_from_inventory(l_hand, Target)
+
+//Drops the item in our right hand
+/mob/living/drop_r_hand(var/atom/Target)
+ return drop_from_inventory(r_hand, Target)
+
+/mob/living/proc/hands_are_full()
+ return (r_hand && l_hand)
+
+/mob/living/proc/item_is_in_hands(var/obj/item/I)
+ return (I == r_hand || I == l_hand)
+
+/mob/living/proc/update_held_icons()
+ if(l_hand)
+ l_hand.update_held_icon()
+ if(r_hand)
+ r_hand.update_held_icon()
+
+/mob/living/proc/get_type_in_hands(var/T)
+ if(istype(l_hand, T))
+ return l_hand
+ if(istype(r_hand, T))
+ return r_hand
+ return null
+
+/mob/living/proc/get_left_hand()
+ return l_hand
+
+/mob/living/proc/get_right_hand()
+ return r_hand
+
+/mob/living/u_equip(obj/W as obj)
+ if (W == r_hand)
+ r_hand = null
+ update_inv_r_hand(0)
+ else if (W == l_hand)
+ l_hand = null
+ update_inv_l_hand(0)
+ else if (W == back)
+ back = null
+ update_inv_back(0)
+ else if (W == wear_mask)
+ wear_mask = null
+ update_inv_wear_mask(0)
+ return
+
+/mob/living/get_equipped_item(var/slot)
+ switch(slot)
+ if(slot_l_hand) return l_hand
+ if(slot_r_hand) return r_hand
+ if(slot_back) return back
+ if(slot_wear_mask) return wear_mask
+ return null
+
+/mob/living/show_inv(mob/user as mob)
+ user.set_machine(src)
+ var/dat = {"
+
[name]
+
+
Head(Mask): [(wear_mask ? wear_mask : "Nothing")]
+
Left Hand: [(l_hand ? l_hand : "Nothing")]
+
Right Hand: [(r_hand ? r_hand : "Nothing")]
+
Back: [(back ? back : "Nothing")] [((istype(wear_mask, /obj/item/clothing/mask) && istype(back, /obj/item/weapon/tank) && !( internal )) ? text(" Set Internal", src) : "")]
+
[(internal ? text("Remove Internal") : "")]
+
Empty Pockets
+
Refresh
+
Close
+
"}
+ user << browse(dat, text("window=mob[];size=325x500", name))
+ onclose(user, "mob[name]")
+ return
+
+/mob/living/ret_grab(obj/effect/list_container/mobl/L as obj, flag)
+ if ((!( istype(l_hand, /obj/item/weapon/grab) ) && !( istype(r_hand, /obj/item/weapon/grab) )))
+ if (!( L ))
+ return null
+ else
+ return L.container
+ else
+ if (!( L ))
+ L = new /obj/effect/list_container/mobl( null )
+ L.container += src
+ L.master = src
+ if (istype(l_hand, /obj/item/weapon/grab))
+ var/obj/item/weapon/grab/G = l_hand
+ if (!( L.container.Find(G.affecting) ))
+ L.container += G.affecting
+ if (G.affecting)
+ G.affecting.ret_grab(L, 1)
+ if (istype(r_hand, /obj/item/weapon/grab))
+ var/obj/item/weapon/grab/G = r_hand
+ if (!( L.container.Find(G.affecting) ))
+ L.container += G.affecting
+ if (G.affecting)
+ G.affecting.ret_grab(L, 1)
+ if (!( flag ))
+ if (L.master == src)
+ var/list/temp = list( )
+ temp += L.container
+ //L = null
+ qdel(L)
+ return temp
+ else
+ return L.container
+ return
+
+/mob/living/mode()
+ set name = "Activate Held Object"
+ set category = "Object"
+ set src = usr
+
+ if(istype(loc,/obj/mecha)) return
+
+ if(hand)
+ var/obj/item/W = l_hand
+ if (W)
+ W.attack_self(src)
+ update_inv_l_hand()
+ else
+ var/obj/item/W = r_hand
+ if (W)
+ W.attack_self(src)
+ update_inv_r_hand()
+ return
+
+/mob/living/abiotic(var/full_body = 0)
+ if(full_body && ((src.l_hand && !( src.l_hand.abstract )) || (src.r_hand && !( src.r_hand.abstract )) || (src.back || src.wear_mask)))
+ return 1
+
+ if((src.l_hand && !( src.l_hand.abstract )) || (src.r_hand && !( src.r_hand.abstract )))
+ return 1
+ return 0
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 374ade2f219..70a3f4c3a26 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -865,3 +865,63 @@ default behaviour is:
sleep(350)
lastpuke = 0
+/mob/living/update_canmove()
+ if(!resting && cannot_stand() && can_stand_overridden())
+ lying = 0
+ canmove = 1
+ else
+ if(istype(buckled, /obj/vehicle))
+ var/obj/vehicle/V = buckled
+ if(cannot_stand())
+ lying = 0
+ canmove = 1
+ pixel_y = V.mob_offset_y - 5
+ else
+ if(buckled.buckle_lying != -1) lying = buckled.buckle_lying
+ canmove = 1
+ pixel_y = V.mob_offset_y
+ else if(buckled)
+ anchored = 1
+ canmove = 0
+ if(istype(buckled))
+ if(buckled.buckle_lying != -1)
+ lying = buckled.buckle_lying
+ if(buckled.buckle_movable)
+ anchored = 0
+ canmove = 1
+
+ else if(cannot_stand())
+ lying = 1
+ canmove = 0
+ else if(stunned)
+ canmove = 0
+ else if(captured)
+ anchored = 1
+ canmove = 0
+ lying = 0
+ else
+ lying = 0
+ canmove = 1
+
+ if(lying)
+ density = 0
+ if(l_hand) unEquip(l_hand)
+ if(r_hand) unEquip(r_hand)
+ else
+ density = initial(density)
+
+ for(var/obj/item/weapon/grab/G in grabbed_by)
+ if(G.state >= GRAB_AGGRESSIVE)
+ canmove = 0
+ break
+
+ //Temporarily moved here from the various life() procs
+ //I'm fixing stuff incrementally so this will likely find a better home.
+ //It just makes sense for now. ~Carn
+ if( update_icon ) //forces a full overlay update
+ update_icon = 0
+ regenerate_icons()
+ else if( lying != lying_prev )
+ update_icons()
+ return canmove
+
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm
index 88f989f15ef..977dfce221a 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm
@@ -11,8 +11,6 @@
//Has a list of items that it can hold.
var/list/can_hold = list(
/obj/item/weapon/cell,
- /obj/item/weapon/firealarm_electronics,
- /obj/item/weapon/airalarm_electronics,
/obj/item/weapon/airlock_electronics,
/obj/item/weapon/tracker_electronics,
/obj/item/weapon/module/power_control,
diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm
index 5340ee39fb3..8b9271a40c3 100644
--- a/code/modules/mob/living/simple_animal/parrot.dm
+++ b/code/modules/mob/living/simple_animal/parrot.dm
@@ -71,7 +71,7 @@
//Parrots will generally sit on their pertch unless something catches their eye.
//These vars store their preffered perch and if they dont have one, what they can use as a perch
var/obj/parrot_perch = null
- var/obj/desired_perches = list(/obj/structure/computerframe, /obj/structure/displaycase, \
+ var/obj/desired_perches = list(/obj/structure/frame, /obj/structure/displaycase, \
/obj/structure/filingcabinet, /obj/machinery/teleport, \
/obj/machinery/computer, /obj/machinery/clonepod, \
/obj/machinery/dna_scannernew, /obj/machinery/telecomms, \
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index abcaf66ae61..fdbb295b94e 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -195,21 +195,6 @@
/mob/proc/show_inv(mob/user as mob)
- user.set_machine(src)
- var/dat = {"
-
[name]
-
-
Head(Mask): [(wear_mask ? wear_mask : "Nothing")]
-
Left Hand: [(l_hand ? l_hand : "Nothing")]
-
Right Hand: [(r_hand ? r_hand : "Nothing")]
-
Back: [(back ? back : "Nothing")] [((istype(wear_mask, /obj/item/clothing/mask) && istype(back, /obj/item/weapon/tank) && !( internal )) ? text(" Set Internal", src) : "")]
-
[(internal ? text("Remove Internal") : "")]
-
Empty Pockets
-
Refresh
-
Close
-
"}
- user << browse(dat, text("window=mob[];size=325x500", name))
- onclose(user, "mob[name]")
return
//mob verbs are faster than object verbs. See http://www.byond.com/forum/?post=1326139&page=2#comment8198716 for why this isn't atom/verb/examine()
@@ -248,37 +233,6 @@
/mob/proc/ret_grab(obj/effect/list_container/mobl/L as obj, flag)
- if ((!( istype(l_hand, /obj/item/weapon/grab) ) && !( istype(r_hand, /obj/item/weapon/grab) )))
- if (!( L ))
- return null
- else
- return L.container
- else
- if (!( L ))
- L = new /obj/effect/list_container/mobl( null )
- L.container += src
- L.master = src
- if (istype(l_hand, /obj/item/weapon/grab))
- var/obj/item/weapon/grab/G = l_hand
- if (!( L.container.Find(G.affecting) ))
- L.container += G.affecting
- if (G.affecting)
- G.affecting.ret_grab(L, 1)
- if (istype(r_hand, /obj/item/weapon/grab))
- var/obj/item/weapon/grab/G = r_hand
- if (!( L.container.Find(G.affecting) ))
- L.container += G.affecting
- if (G.affecting)
- G.affecting.ret_grab(L, 1)
- if (!( flag ))
- if (L.master == src)
- var/list/temp = list( )
- temp += L.container
- //L = null
- qdel(L)
- return temp
- else
- return L.container
return
/mob/verb/mode()
@@ -286,18 +240,6 @@
set category = "Object"
set src = usr
- if(istype(loc,/obj/mecha)) return
-
- if(hand)
- var/obj/item/W = l_hand
- if (W)
- W.attack_self(src)
- update_inv_l_hand()
- else
- var/obj/item/W = r_hand
- if (W)
- W.attack_self(src)
- update_inv_r_hand()
return
/*
@@ -735,65 +677,6 @@
//Updates canmove, lying and icons. Could perhaps do with a rename but I can't think of anything to describe it.
/mob/proc/update_canmove()
-
- if(!resting && cannot_stand() && can_stand_overridden())
- lying = 0
- canmove = 1
- else
- if(istype(buckled, /obj/vehicle))
- var/obj/vehicle/V = buckled
- if(cannot_stand())
- lying = 0
- canmove = 1
- pixel_y = V.mob_offset_y - 5
- else
- if(buckled.buckle_lying != -1) lying = buckled.buckle_lying
- canmove = 1
- pixel_y = V.mob_offset_y
- else if(buckled)
- anchored = 1
- canmove = 0
- if(istype(buckled))
- if(buckled.buckle_lying != -1)
- lying = buckled.buckle_lying
- if(buckled.buckle_movable)
- anchored = 0
- canmove = 1
-
- else if(cannot_stand())
- lying = 1
- canmove = 0
- else if(stunned)
- canmove = 0
- else if(captured)
- anchored = 1
- canmove = 0
- lying = 0
- else
- lying = 0
- canmove = 1
-
- if(lying)
- density = 0
- if(l_hand) unEquip(l_hand)
- if(r_hand) unEquip(r_hand)
- else
- density = initial(density)
-
- for(var/obj/item/weapon/grab/G in grabbed_by)
- if(G.state >= GRAB_AGGRESSIVE)
- canmove = 0
- break
-
- //Temporarily moved here from the various life() procs
- //I'm fixing stuff incrementally so this will likely find a better home.
- //It just makes sense for now. ~Carn
- if( update_icon ) //forces a full overlay update
- update_icon = 0
- regenerate_icons()
- else if( lying != lying_prev )
- update_icons()
-
return canmove
@@ -1007,8 +890,7 @@ mob/proc/yank_out_object()
R.adjustFireLoss(10)
selection.forceMove(get_turf(src))
- if(!(U.l_hand && U.r_hand))
- U.put_in_hands(selection)
+ U.put_in_hands(selection)
for(var/obj/item/weapon/O in pinned)
if(O == selection)
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index eaa88e62124..7eb32ea8db6 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -60,7 +60,6 @@
var/next_move = null
var/transforming = null //Carbon
var/other = 0.0
- var/hand = null
var/eye_blind = null //Carbon
var/eye_blurry = null //Carbon
var/ear_deaf = null //Carbon
@@ -119,12 +118,6 @@
var/m_intent = "run"//Living
var/lastKnownIP = null
var/obj/buckled = null//Living
- var/obj/item/l_hand = null//Living
- var/obj/item/r_hand = null//Living
- var/obj/item/weapon/back = null//Human/Monkey
- var/obj/item/weapon/tank/internal = null//Human/Monkey
- var/obj/item/weapon/storage/s_active = null//Carbon
- var/obj/item/clothing/mask/wear_mask = null//Carbon
var/seer = 0 //for cult//Carbon, probably Human
diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm
index c85b8d96a23..ec83ced425f 100644
--- a/code/modules/mob/mob_grab.dm
+++ b/code/modules/mob/mob_grab.dm
@@ -5,8 +5,10 @@
///Called by client/Move()
///Checks to see if you are grabbing anything and if moving will affect your grab.
/client/proc/Process_Grab()
- for(var/obj/item/weapon/grab/G in list(mob.l_hand, mob.r_hand))
- G.reset_kill_state() //no wandering across the station/asteroid while choking someone
+ if(istype(mob, /mob/living))
+ var/mob/living/L = mob
+ for(var/obj/item/weapon/grab/G in list(L.l_hand, L.r_hand))
+ G.reset_kill_state() //no wandering across the station/asteroid while choking someone
/obj/item/weapon/grab
name = "grab"
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 871215a519b..316e0e2f306 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -288,12 +288,6 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
/mob/proc/abiotic(var/full_body = 0)
- if(full_body && ((src.l_hand && !( src.l_hand.abstract )) || (src.r_hand && !( src.r_hand.abstract )) || (src.back || src.wear_mask)))
- return 1
-
- if((src.l_hand && !( src.l_hand.abstract )) || (src.r_hand && !( src.r_hand.abstract )))
- return 1
-
return 0
//converts intent-strings into numbers and back
diff --git a/code/modules/mob/update_icons.dm b/code/modules/mob/update_icons.dm
index a6ae6dc4a09..ceca667c39c 100644
--- a/code/modules/mob/update_icons.dm
+++ b/code/modules/mob/update_icons.dm
@@ -19,6 +19,15 @@
/mob/proc/update_inv_back()
return
+/mob/proc/update_inv_active_hand()
+ return
+
+/mob/living/update_inv_active_hand(var/A)
+ if(hand)
+ update_inv_l_hand(A)
+ else
+ update_inv_r_hand(A)
+
/mob/proc/update_inv_l_hand()
return
diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm
index e3452512d1b..ac27e85841d 100644
--- a/code/modules/organs/organ_external.dm
+++ b/code/modules/organs/organ_external.dm
@@ -98,7 +98,7 @@
if (2)
take_damage(4)
-/obj/item/organ/external/attack_self(var/mob/user)
+/obj/item/organ/external/attack_self(var/mob/living/user)
if(!contents.len)
return ..()
var/list/removable_objects = list()
@@ -113,8 +113,7 @@
var/obj/item/I = pick(removable_objects)
I.loc = get_turf(user) //just in case something was embedded that is not an item
if(istype(I))
- if(!(user.l_hand && user.r_hand))
- user.put_in_hands(I)
+ user.put_in_hands(I)
user.visible_message("\The [user] rips \the [I] out of \the [src]!")
return //no eating the limb until everything's been removed
return ..()
@@ -128,7 +127,7 @@
usr << "There is \a [I] sticking out of it."
return
-/obj/item/organ/external/attackby(obj/item/weapon/W as obj, mob/user as mob)
+/obj/item/organ/external/attackby(obj/item/weapon/W as obj, mob/living/user as mob)
switch(stage)
if(0)
if(istype(W,/obj/item/weapon/scalpel))
@@ -145,8 +144,7 @@
if(contents.len)
var/obj/item/removing = pick(contents)
removing.loc = get_turf(user.loc)
- if(!(user.l_hand && user.r_hand))
- user.put_in_hands(removing)
+ user.put_in_hands(removing)
user.visible_message("[user] extracts [removing] from [src] with [W]!")
else
user.visible_message("[user] fishes around fruitlessly in [src] with [W].")
diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm
index a7d489ba537..dc7ec847772 100644
--- a/code/modules/paperwork/faxmachine.dm
+++ b/code/modules/paperwork/faxmachine.dm
@@ -14,6 +14,7 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins
use_power = 1
idle_power_usage = 30
active_power_usage = 200
+ frame_type = "fax"
var/obj/item/weapon/card/id/scan = null // identification
var/authenticated = 0
diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm
index 67eb5c9aeba..57691fed9ba 100644
--- a/code/modules/paperwork/filingcabinet.dm
+++ b/code/modules/paperwork/filingcabinet.dm
@@ -17,12 +17,10 @@
density = 1
anchored = 1
-
/obj/structure/filingcabinet/chestdrawer
name = "chest drawer"
icon_state = "chestdrawer"
-
/obj/structure/filingcabinet/filingcabinet //not changing the path to avoid unecessary map issues, but please don't name stuff like this in the future -Pete
icon_state = "tallcabinet"
@@ -46,6 +44,16 @@
playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
anchored = !anchored
user << "You [anchored ? "wrench" : "unwrench"] \the [src]."
+ else if(istype(P, /obj/item/weapon/screwdriver))
+ user << "You begin taking the [name] apart."
+ if(do_after(user, 10))
+ playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ user << "You take the [name] apart."
+ new /obj/item/stack/material/steel( src.loc, 4 )
+ for(var/obj/item/I in contents)
+ I.forceMove(loc)
+ qdel(src)
+ return
else
user << "You can't put [P] in [src]!"
@@ -151,7 +159,7 @@
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(src)
P.info = "Medical Record
"
P.info += "Name: [G.fields["name"]] ID: [G.fields["id"]]
\nSex: [G.fields["sex"]]
\nAge: [G.fields["age"]]
\nFingerprint: [G.fields["fingerprint"]]
\nPhysical Status: [G.fields["p_stat"]]
\nMental Status: [G.fields["m_stat"]]
"
-
+
P.info += "
\nMedical Data
\nBlood Type: [M.fields["b_type"]]
\nDNA: [M.fields["b_dna"]]
\n
\nMinor Disabilities: [M.fields["mi_dis"]]
\nDetails: [M.fields["mi_dis_d"]]
\n
\nMajor Disabilities: [M.fields["ma_dis"]]
\nDetails: [M.fields["ma_dis_d"]]
\n
\nAllergies: [M.fields["alg"]]
\nDetails: [M.fields["alg_d"]]
\n
\nCurrent Diseases: [M.fields["cdi"]] (per disease info placed in log/comment section)
\nDetails: [M.fields["cdi_d"]]
\n
\nImportant Notes:
\n\t[M.fields["notes"]]
\n
\nComments/Log
"
var/counter = 1
while(M.fields["com_[counter]"])
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index cc8feae5b21..bb4a9d1a23f 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -337,8 +337,9 @@
var/obj/item/i = usr.get_active_hand() // Check to see if he still got that darn pen, also check if he's using a crayon or pen.
var/iscrayon = 0
if(!istype(i, /obj/item/weapon/pen))
- if(usr.back && istype(usr.back,/obj/item/weapon/rig))
- var/obj/item/weapon/rig/r = usr.back
+ var/mob/living/M = usr
+ if(istype(M) && M.back && istype(M.back,/obj/item/weapon/rig))
+ var/obj/item/weapon/rig/r = M.back
var/obj/item/rig_module/device/pen/m = locate(/obj/item/rig_module/device/pen) in r.installed_modules
if(!r.offline && m)
i = m.device
diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm
index 6d24a8f238d..f29883a54cd 100644
--- a/code/modules/paperwork/photocopier.dm
+++ b/code/modules/paperwork/photocopier.dm
@@ -9,11 +9,21 @@
idle_power_usage = 30
active_power_usage = 200
power_channel = EQUIP
+ circuit = /obj/item/weapon/circuitboard/photocopier
+ frame_type = "photocopier"
var/obj/item/copyitem = null //what's in the copier!
var/copies = 1 //how many copies to print!
var/toner = 30 //how much toner is left! woooooo~
var/maxcopies = 10 //how many copies can be copied at once- idea shamelessly stolen from bs12's copier!
+/obj/machinery/photocopier/New()
+ component_parts = list()
+ component_parts += new /obj/item/weapon/stock_parts/scanning_module(src)
+ component_parts += new /obj/item/weapon/stock_parts/motor(src)
+ component_parts += new /obj/item/weapon/stock_parts/micro_laser(src)
+ component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
+ RefreshParts()
+
/obj/machinery/photocopier/attack_ai(mob/user as mob)
return attack_hand(user)
@@ -126,6 +136,12 @@
playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
anchored = !anchored
user << "You [anchored ? "wrench" : "unwrench"] \the [src]."
+
+ else if(default_deconstruction_screwdriver(user, O))
+ return
+ else if(default_deconstruction_crowbar(user, O))
+ return
+
return
/obj/machinery/photocopier/ex_act(severity)
diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm
index 90ed7ccf59e..5787ff2d029 100644
--- a/code/modules/paperwork/photography.dm
+++ b/code/modules/paperwork/photography.dm
@@ -91,7 +91,7 @@ var/global/photo_count = 0
/obj/item/weapon/storage/photo_album/MouseDrop(obj/over_object as obj)
if((istype(usr, /mob/living/carbon/human)))
- var/mob/M = usr
+ var/mob/living/carbon/human/M = usr
if(!( istype(over_object, /obj/screen) ))
return ..()
playsound(loc, "rustle", 50, 1, -5)
diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm
index a6954e9e2f0..f37cdce7063 100644
--- a/code/modules/paperwork/stamps.dm
+++ b/code/modules/paperwork/stamps.dm
@@ -52,6 +52,10 @@
name = "centcomm rubber stamp"
icon_state = "stamp-cent"
+/obj/item/weapon/stamp/qm
+ name = "quartermaster's stamp"
+ icon_state = "stamp-qm"
+
// Syndicate stamp to forge documents.
/obj/item/weapon/stamp/chameleon/attack_self(mob/user as mob)
diff --git a/code/modules/power/batteryrack.dm b/code/modules/power/batteryrack.dm
index a70b19421ec..2d7f38e3b99 100644
--- a/code/modules/power/batteryrack.dm
+++ b/code/modules/power/batteryrack.dm
@@ -9,6 +9,7 @@
input_level_max = 0
output_level_max = 0
icon_state = "gsmes"
+ circuit = /obj/item/weapon/circuitboard/batteryrack
var/cells_amount = 0
var/capacitors_amount = 0
var/global/list/br_cache = null
@@ -22,7 +23,6 @@
//Maybe this should be moved up to obj/machinery
/obj/machinery/power/smes/batteryrack/proc/add_parts()
component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/batteryrack
component_parts += new /obj/item/weapon/cell/high
component_parts += new /obj/item/weapon/cell/high
component_parts += new /obj/item/weapon/cell/high
@@ -49,7 +49,7 @@
/obj/machinery/power/smes/batteryrack/update_icon()
overlays.Cut()
if(stat & BROKEN) return
-
+
if(!br_cache)
br_cache = list()
br_cache.len = 7
@@ -60,7 +60,7 @@
br_cache[5] = image('icons/obj/power.dmi', "gsmes_og2")
br_cache[6] = image('icons/obj/power.dmi', "gsmes_og3")
br_cache[7] = image('icons/obj/power.dmi', "gsmes_og4")
-
+
if (output_attempt)
overlays += br_cache[1]
if(inputting)
@@ -83,9 +83,10 @@
if (charge < (capacity / 100))
if (!output_attempt && !input_attempt)
playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1)
- var/obj/machinery/constructable_frame/machine_frame/M = new /obj/machinery/constructable_frame/machine_frame(src.loc)
+ var/obj/structure/frame/M = new /obj/structure/frame(src.loc)
+ M.frame_type = "machine"
M.state = 2
- M.icon_state = "box_1"
+ M.icon_state = "machine_1"
for(var/obj/I in component_parts)
I.loc = src.loc
qdel(src)
@@ -117,12 +118,12 @@
/obj/machinery/power/smes/batteryrack/makeshift
name = "makeshift PSU"
desc = "A rack of batteries connected by a mess of wires posing as a PSU."
+ circuit = /obj/item/weapon/circuitboard/ghettosmes
var/overcharge_percent = 0
/obj/machinery/power/smes/batteryrack/makeshift/add_parts()
component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/ghettosmes
component_parts += new /obj/item/weapon/cell/high
component_parts += new /obj/item/weapon/cell/high
component_parts += new /obj/item/weapon/cell/high
diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm
index 400e7281b6f..41e182b91bc 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -287,14 +287,15 @@
else
user << "\blue You close the access panel."
else if(istype(O, /obj/item/weapon/crowbar) && open)
- var/obj/machinery/constructable_frame/machine_frame/new_frame = new /obj/machinery/constructable_frame/machine_frame(src.loc)
+ var/obj/structure/frame/new_frame = new /obj/structure/frame(src.loc)
for(var/obj/item/I in component_parts)
I.loc = src.loc
while ( sheets > 0 )
DropFuel()
+ new_frame.frame_type = "machine"
new_frame.state = 2
- new_frame.icon_state = "box_1"
+ new_frame.icon_state = "machine_1"
qdel(src)
/obj/machinery/power/port_gen/pacman/attack_hand(mob/user as mob)
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index 05dae4fdbfd..29714847151 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -12,6 +12,7 @@
density = 1
anchored = 1
use_power = 0
+ circuit = /obj/item/weapon/circuitboard/smes
var/capacity = 5e6 // maximum charge
var/charge = 1e6 // actual charge
diff --git a/code/modules/power/smes_construction.dm b/code/modules/power/smes_construction.dm
index 497e16a885e..f14c084882a 100644
--- a/code/modules/power/smes_construction.dm
+++ b/code/modules/power/smes_construction.dm
@@ -116,7 +116,6 @@
/obj/machinery/power/smes/buildable/New(var/install_coils = 1)
component_parts = list()
component_parts += new /obj/item/stack/cable_coil(src,30)
- component_parts += new /obj/item/weapon/circuitboard/smes(src)
src.wires = new /datum/wires/smes(src)
// Allows for mapped-in SMESs with larger capacity/IO
@@ -345,9 +344,10 @@
return
usr << "\red You have disassembled the SMES cell!"
- var/obj/machinery/constructable_frame/machine_frame/M = new /obj/machinery/constructable_frame/machine_frame(src.loc)
+ var/obj/structure/frame/M = new /obj/structure/frame(src.loc)
+ M.frame_type = "machine"
M.state = 2
- M.icon_state = "box_1"
+ M.icon_state = "machine_1"
for(var/obj/I in component_parts)
I.loc = src.loc
component_parts -= I
diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm
index 232adb345b8..dd1c2a56b60 100644
--- a/code/modules/power/solar.dm
+++ b/code/modules/power/solar.dm
@@ -407,25 +407,27 @@ var/list/solars_list = list()
if(do_after(user, 20))
if (src.stat & BROKEN)
user << "\blue The broken glass falls out."
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
+ var/obj/structure/frame/A = new /obj/structure/frame( src.loc )
new /obj/item/weapon/material/shard( src.loc )
var/obj/item/weapon/circuitboard/solar_control/M = new /obj/item/weapon/circuitboard/solar_control( A )
for (var/obj/C in src)
C.loc = src.loc
A.circuit = M
+ A.frame_type = "computer"
A.state = 3
- A.icon_state = "3"
+ A.icon_state = "computer_3"
A.anchored = 1
qdel(src)
else
user << "\blue You disconnect the monitor."
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
+ var/obj/structure/frame/A = new /obj/structure/frame( src.loc )
var/obj/item/weapon/circuitboard/solar_control/M = new /obj/item/weapon/circuitboard/solar_control( A )
for (var/obj/C in src)
C.loc = src.loc
A.circuit = M
+ A.frame_type = "computer"
A.state = 4
- A.icon_state = "4"
+ A.icon_state = "computer_4"
A.anchored = 1
qdel(src)
else
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 3e801be0d14..44b36db8ac7 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -93,7 +93,7 @@
if(requires_two_hands)
var/mob/living/M = loc
if(istype(M))
- if((M.l_hand == src && !M.r_hand) || (M.r_hand == src && !M.l_hand))
+ if(M.item_is_in_hands(src) && !M.hands_are_full())
name = "[initial(name)] (wielded)"
item_state = wielded_icon
else
@@ -179,7 +179,7 @@
var/held_acc_mod = 0
var/held_disp_mod = 0
if(requires_two_hands)
- if((user.l_hand == src && user.r_hand) || (user.r_hand == src && user.l_hand))
+ if(user.item_is_in_hands(src) && user.hands_are_full())
held_acc_mod = -3
held_disp_mod = 3
diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm
index 4763b83bb66..c3a48cd3747 100644
--- a/code/modules/projectiles/guns/projectile/pistol.dm
+++ b/code/modules/projectiles/guns/projectile/pistol.dm
@@ -1,6 +1,6 @@
/obj/item/weapon/gun/projectile/colt
var/unique_reskin
- name = "vintage .45 pistol"
+ name = ".45 pistol"
desc = "A cheap Martian knock-off of a Colt M1911. Uses .45 rounds."
magazine_type = /obj/item/ammo_magazine/c45m
icon_state = "colt"
@@ -171,10 +171,10 @@
name = "holdout signal pistol"
magazine_type = /obj/item/ammo_magazine/mc9mm/flash
-/obj/item/weapon/gun/projectile/pistol/attack_hand(mob/user as mob)
+/obj/item/weapon/gun/projectile/pistol/attack_hand(mob/living/user as mob)
if(user.get_inactive_hand() == src)
if(silenced)
- if(user.l_hand != src && user.r_hand != src)
+ if(!user.item_is_in_hands(src))
..()
return
user << "You unscrew [silenced] from [src]."
@@ -185,9 +185,9 @@
return
..()
-/obj/item/weapon/gun/projectile/pistol/attackby(obj/item/I as obj, mob/user as mob)
+/obj/item/weapon/gun/projectile/pistol/attackby(obj/item/I as obj, mob/living/user as mob)
if(istype(I, /obj/item/weapon/silencer))
- if(user.l_hand != src && user.r_hand != src) //if we're not in his hands
+ if(!user.item_is_in_hands(src)) //if we're not in his hands
user << "You'll need [src] in your hands to do that."
return
user.drop_item()
diff --git a/code/modules/projectiles/targeting/targeting_overlay.dm b/code/modules/projectiles/targeting/targeting_overlay.dm
index 7a6fdcc0ca9..46b01a9d1bf 100644
--- a/code/modules/projectiles/targeting/targeting_overlay.dm
+++ b/code/modules/projectiles/targeting/targeting_overlay.dm
@@ -113,7 +113,8 @@ obj/aiming_overlay/proc/update_aiming_deferred()
var/cancel_aim = 1
- if(!(aiming_with in owner) || (istype(owner, /mob/living/carbon/human) && (owner.l_hand != aiming_with && owner.r_hand != aiming_with)))
+ var/mob/living/carbon/human/H = owner
+ if(!(aiming_with in owner) || (istype(H) && !H.item_is_in_hands(aiming_with)))
owner << "You must keep hold of your weapon!"
else if(owner.eye_blind)
owner << "You are blind and cannot see your target!"
diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm
index 0febaa68bce..d176ab205e1 100644
--- a/code/modules/reagents/Chemistry-Machinery.dm
+++ b/code/modules/reagents/Chemistry-Machinery.dm
@@ -310,6 +310,7 @@
use_power = 1
idle_power_usage = 5
active_power_usage = 100
+ circuit = /obj/item/weapon/circuitboard/grinder
var/inuse = 0
var/obj/item/weapon/reagent_containers/beaker = null
var/limit = 10
@@ -326,6 +327,10 @@
/obj/machinery/reagentgrinder/New()
..()
beaker = new /obj/item/weapon/reagent_containers/glass/beaker/large(src)
+ component_parts = list()
+ component_parts += new /obj/item/weapon/stock_parts/motor(src)
+ component_parts += new /obj/item/weapon/stock_parts/gear(src)
+ RefreshParts()
return
/obj/machinery/reagentgrinder/update_icon()
@@ -333,6 +338,11 @@
return
/obj/machinery/reagentgrinder/attackby(var/obj/item/O as obj, var/mob/user as mob)
+ if(beaker)
+ if(default_deconstruction_screwdriver(user, O))
+ return
+ if(default_deconstruction_crowbar(user, O))
+ return
if (istype(O,/obj/item/weapon/reagent_containers/glass) || \
istype(O,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass) || \
diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm
index 9ba46eb271e..a5903e744d8 100644
--- a/code/modules/reagents/reagent_containers/glass.dm
+++ b/code/modules/reagents/reagent_containers/glass.dm
@@ -40,7 +40,7 @@
/obj/machinery/sleeper,
/obj/machinery/smartfridge/,
/obj/machinery/biogenerator,
- /obj/machinery/constructable_frame,
+ /obj/structure/frame,
/obj/machinery/radiocarbon_spectrometer
)
@@ -246,6 +246,17 @@
var/image/lid = image(icon, src, "lid_[initial(icon_state)]")
overlays += lid
+/obj/item/weapon/reagent_containers/glass/cooler_bottle
+ desc = "A bottle for a water-cooler."
+ name = "water-cooler bottle"
+ icon = 'icons/obj/vending.dmi'
+ icon_state = "water_cooler_bottle"
+ matter = list(DEFAULT_WALL_MATERIAL = 200)
+ w_class = 3.0
+ amount_per_transfer_from_this = 20
+ possible_transfer_amounts = list(10,20,30,60,120)
+ volume = 120
+
/*
/obj/item/weapon/reagent_containers/glass/blender_jug
name = "Blender Jug"
diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm
index e31c0096770..7fc7707c28b 100644
--- a/code/modules/reagents/reagent_containers/pill.dm
+++ b/code/modules/reagents/reagent_containers/pill.dm
@@ -3,7 +3,7 @@
////////////////////////////////////////////////////////////////////////////////
/obj/item/weapon/reagent_containers/pill
name = "pill"
- desc = "a pill."
+ desc = "A pill."
icon = 'icons/obj/chemical.dmi'
icon_state = null
item_state = "pill"
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index d68be94b9ba..7ae41565b75 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -202,10 +202,51 @@
icon_state = "water_cooler"
possible_transfer_amounts = null
anchored = 1
- New()
- ..()
- reagents.add_reagent("water",500)
+ var/bottle = 0
+/obj/structure/reagent_dispensers/water_cooler/New()
+ if(bottle == 1)
+ ..()
+ reagents.add_reagent("water",120)
+ else
+ icon_state = "water_cooler_0"
+
+/obj/structure/reagent_dispensers/water_cooler/attackby(obj/item/I as obj, mob/user as mob)
+ if(istype(I, /obj/item/weapon/wrench))
+ if(bottle)
+ playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ if(do_after(user, 20))
+ user << "You unfasten the jug."
+ var/obj/item/weapon/reagent_containers/glass/cooler_bottle/G = new /obj/item/weapon/reagent_containers/glass/cooler_bottle( src.loc )
+ for(var/datum/reagent/R in reagents.reagent_list)
+ var/total_reagent = reagents.get_reagent_amount(R.id)
+ G.reagents.add_reagent(R.id, total_reagent)
+ reagents.clear_reagents()
+ bottle = 0
+ icon_state = "water_cooler_0"
+ return
+
+ if(istype(I, /obj/item/weapon/screwdriver))
+ if(!bottle)
+ playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ user << "You take the water-cooler apart."
+ new /obj/item/stack/material/plastic( src.loc, 4 )
+ qdel(src)
+ return
+
+ if(istype(I, /obj/item/weapon/reagent_containers/glass/cooler_bottle))
+ if(!bottle)
+ var/obj/item/weapon/reagent_containers/glass/cooler_bottle/G = I
+ user << "You start to screw the bottle onto the water-cooler."
+ if(do_after(user, 20))
+ bottle = 1
+ icon_state = "water_cooler"
+ user << "You screw the bottle onto the water-cooler but accidently spill some!" //you spill some because it for somereason transfers 5 units to the bottle after it gets attached but before it's deleted...
+ for(var/datum/reagent/R in G.reagents.reagent_list)
+ var/total_reagent = G.reagents.get_reagent_amount(R.id)
+ reagents.add_reagent(R.id, total_reagent)
+ qdel(G)
+ return
/obj/structure/reagent_dispensers/beerkeg
name = "beer keg"
diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm
index 957c3b574dc..0e591e97b0b 100644
--- a/code/modules/recycling/conveyor2.dm
+++ b/code/modules/recycling/conveyor2.dm
@@ -8,6 +8,8 @@
desc = "A conveyor belt."
layer = 2 // so they appear under stuff
anchored = 1
+ circuit = /obj/item/weapon/circuitboard/conveyor
+ frame_type = "conveyor"
var/operating = 0 // 1 if running forward, -1 if backwards, 0 if off
var/operable = 1 // true if can operate (no broken segments in this belt run)
var/forwards // this is the default (forward) direction, set by the map dir
@@ -37,6 +39,14 @@
operating = 1
setmove()
+ component_parts = list()
+ component_parts += new /obj/item/weapon/stock_parts/gear(src)
+ component_parts += new /obj/item/weapon/stock_parts/motor(src)
+ component_parts += new /obj/item/weapon/stock_parts/gear(src)
+ component_parts += new /obj/item/weapon/stock_parts/motor(src)
+ component_parts += new /obj/item/stack/cable_coil(src,5)
+ RefreshParts()
+
/obj/machinery/conveyor/proc/setmove()
if(operating == 1)
movedir = forwards
@@ -81,6 +91,23 @@
if(isrobot(user)) return //Carn: fix for borgs dropping their modules on conveyor belts
if(I.loc != user) return // This should stop mounted modules ending up outside the module.
+ if(default_deconstruction_screwdriver(user, I))
+ return
+ if(default_deconstruction_crowbar(user, I))
+ return
+
+ if(istype(I, /obj/item/device/multitool))
+ if(panel_open)
+ var/input = sanitize(input(usr, "What id would you like to give this conveyor?", "Multitool-Conveyor interface", id))
+ if(!input)
+ usr << "No input found please hang up and try your call again."
+ return
+ id = input
+ for(var/obj/machinery/conveyor_switch/C in world)
+ if(C.id == id)
+ C.conveyors += src
+ return
+
user.drop_item(get_turf(src))
return
@@ -221,6 +248,36 @@
S.position = position
S.update()
+/obj/machinery/conveyor_switch/attackby(var/obj/item/I, mob/user)
+ if(default_deconstruction_screwdriver(user, I))
+ return
+
+ if(istype(I, /obj/item/weapon/weldingtool))
+ if(panel_open)
+ var/obj/item/weapon/weldingtool/WT = I
+ if(!WT.remove_fuel(0, user))
+ user << "The welding tool must be on to complete this task."
+ return
+ playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
+ if(do_after(user, 20))
+ if(!src || !WT.isOn()) return
+ user << "You deconstruct the frame."
+ new /obj/item/stack/material/steel( src.loc, 2 )
+ qdel(src)
+ return
+
+ if(istype(I, /obj/item/device/multitool))
+ if(panel_open)
+ var/input = sanitize(input(usr, "What id would you like to give this conveyor switch?", "Multitool-Conveyor interface", id))
+ if(!input)
+ usr << "No input found please hang up and try your call again."
+ return
+ id = input
+ for(var/obj/machinery/conveyor/C in world)
+ if(C.id == id)
+ conveyors += C
+ return
+
/obj/machinery/conveyor_switch/oneway
var/convdir = 1 //Set to 1 or -1 depending on which way you want the convayor to go. (In other words keep at 1 and set the proper dir on the belts.)
desc = "A conveyor control switch. It appears to only go in one direction."
diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm
index 0e3858e662d..6831034edf1 100644
--- a/code/modules/research/circuitprinter.dm
+++ b/code/modules/research/circuitprinter.dm
@@ -8,6 +8,7 @@ using metal and glass, it uses glass and reagents (usually sulphuric acid).
name = "Circuit Imprinter"
icon_state = "circuit_imprinter"
flags = OPENCONTAINER
+ circuit = /obj/item/weapon/circuitboard/circuit_imprinter
var/list/datum/design/queue = list()
var/progress = 0
@@ -24,7 +25,6 @@ using metal and glass, it uses glass and reagents (usually sulphuric acid).
/obj/machinery/r_n_d/circuit_imprinter/New()
..()
component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/circuit_imprinter(src)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(src)
diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm
index ccf20c0ce7d..3fbb141f7e8 100644
--- a/code/modules/research/destructive_analyzer.dm
+++ b/code/modules/research/destructive_analyzer.dm
@@ -11,7 +11,7 @@ Note: Must be placed within 3 tiles of the R&D Console
icon_state = "d_analyzer"
var/obj/item/weapon/loaded_item = null
var/decon_mod = 0
-
+ circuit = /obj/item/weapon/circuitboard/destructive_analyzer
use_power = 1
idle_power_usage = 30
active_power_usage = 2500
@@ -19,7 +19,6 @@ Note: Must be placed within 3 tiles of the R&D Console
/obj/machinery/r_n_d/destructive_analyzer/New()
..()
component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/destructive_analyzer(src)
component_parts += new /obj/item/weapon/stock_parts/scanning_module(src)
component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
component_parts += new /obj/item/weapon/stock_parts/micro_laser(src)
diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm
index 8809ee29554..7d5bae00caa 100644
--- a/code/modules/research/protolathe.dm
+++ b/code/modules/research/protolathe.dm
@@ -2,7 +2,7 @@
name = "Protolathe"
icon_state = "protolathe"
flags = OPENCONTAINER
-
+ circuit = /obj/item/weapon/circuitboard/protolathe
use_power = 1
idle_power_usage = 30
active_power_usage = 5000
@@ -20,7 +20,6 @@
/obj/machinery/r_n_d/protolathe/New()
..()
component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/protolathe(src)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm
index a5e5a00043d..fcaaa7a2128 100644
--- a/code/modules/research/server.dm
+++ b/code/modules/research/server.dm
@@ -13,11 +13,11 @@
idle_power_usage = 800
var/delay = 10
req_access = list(access_rd) //Only the R&D can change server settings.
+ circuit = /obj/item/weapon/circuitboard/rdserver
/obj/machinery/r_n_d/server/New()
..()
component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/rdserver(src)
component_parts += new /obj/item/weapon/stock_parts/scanning_module(src)
component_parts += new /obj/item/stack/cable_coil(src)
component_parts += new /obj/item/stack/cable_coil(src)
diff --git a/code/modules/research/xenoarchaeology/artifact/artifact.dm b/code/modules/research/xenoarchaeology/artifact/artifact.dm
index a3256d6f530..71819efc651 100644
--- a/code/modules/research/xenoarchaeology/artifact/artifact.dm
+++ b/code/modules/research/xenoarchaeology/artifact/artifact.dm
@@ -108,10 +108,9 @@
. = ..()
if(istype(AM,/mob/living/carbon/human))
var/mob/living/carbon/human/H = AM
- if((istype(H.l_hand,/obj/item/weapon/pickaxe)) && (!H.hand))
- attackby(H.l_hand,H)
- else if((istype(H.r_hand,/obj/item/weapon/pickaxe)) && H.hand)
- attackby(H.r_hand,H)
+ var/obj/item/weapon/pickaxe/P = H.get_inactive_hand()
+ if(istype(P))
+ src.attackby(P, H)
else if(istype(AM,/mob/living/silicon/robot))
var/mob/living/silicon/robot/R = AM
diff --git a/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm b/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm
index b449237d775..ebab6fac765 100644
--- a/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm
+++ b/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm
@@ -181,7 +181,7 @@
out += " have been detected "
//how the artifact does it's effect
- switch(A.my_effect.effect_type)
+ switch(A.my_effect.effect)
if(1)
out += " emitting in an ambient energy field."
if(2)
@@ -224,7 +224,7 @@
out += "low level radiation"
//how the artifact does it's effect
- switch(A.secondary_effect.effect_type)
+ switch(A.secondary_effect.effect)
if(1)
out += " emitting in an ambient energy field."
if(2)
diff --git a/code/modules/research/xenoarchaeology/master_controller.dm b/code/modules/research/xenoarchaeology/master_controller.dm
index 332b1ce06ae..65f4b9f1fc0 100644
--- a/code/modules/research/xenoarchaeology/master_controller.dm
+++ b/code/modules/research/xenoarchaeology/master_controller.dm
@@ -9,9 +9,12 @@
#define ARTIFACTSPAWNNUM_LOWER 6
#define ARTIFACTSPAWNNUM_UPPER 12
-datum/controller/game_controller/proc/SetupXenoarch()
+/datum/controller/game_controller/proc/SetupXenoarch()
//create digsites
for(var/turf/simulated/mineral/M in block(locate(1,1,1), locate(world.maxx, world.maxy, world.maxz)))
+ if(!(M.density))
+ continue
+
if(isnull(M.geologic_data))
M.geologic_data = new/datum/geosample(M)
diff --git a/code/modules/security levels/keycard authentication.dm b/code/modules/security levels/keycard authentication.dm
index 87514a5473b..b4301cf557a 100644
--- a/code/modules/security levels/keycard authentication.dm
+++ b/code/modules/security levels/keycard authentication.dm
@@ -3,6 +3,7 @@
desc = "This device is used to trigger station functions, which require more than one ID card to authenticate."
icon = 'icons/obj/monitors.dmi'
icon_state = "auth_off"
+ circuit = /obj/item/weapon/circuitboard/keycard_auth
var/active = 0 //This gets set to 1 on all devices except the one where the initial request was made.
var/event = ""
var/screen = 1
@@ -40,6 +41,24 @@
event_triggered_by = usr
broadcast_request() //This is the device making the initial event request. It needs to broadcast to other devices
+ if(istype(W, /obj/item/weapon/screwdriver))
+ user << "You remove the faceplate from the [src]"
+ var/obj/structure/frame/A = new /obj/structure/frame( src.loc )
+ var/obj/item/weapon/circuitboard/M = new circuit( A )
+ A.frame_type = "keycard"
+ A.pixel_x = pixel_x
+ A.pixel_y = pixel_y
+ A.set_dir(dir)
+ A.circuit = M
+ A.anchored = 1
+ for (var/obj/C in src)
+ C.forceMove(loc)
+ A.state = 3
+ A.icon_state = "keycard_3"
+ M.deconstruct(src)
+ qdel(src)
+ return
+
/obj/machinery/keycard_auth/power_change()
..()
if(stat &NOPOWER)
diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm
index 721f124e4ef..82c6ad543c8 100644
--- a/code/modules/surgery/other.dm
+++ b/code/modules/surgery/other.dm
@@ -27,7 +27,7 @@
internal_bleeding = 1
break
- return affected.open >= 2 && internal_bleeding
+ return affected.open == (affected.encased ? 3 : 2) && internal_bleeding
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -206,4 +206,4 @@
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message("[user]'s [tool] can't quite seem to get through the metal...", \
- "Your [tool] can't quite seem to get through the metal. It's weakening, though - try again.")
\ No newline at end of file
+ "Your [tool] can't quite seem to get through the metal. It's weakening, though - try again.")
diff --git a/html/changelogs/Datraen-PBAPCCheck.yml b/html/changelogs/Datraen-PBAPCCheck.yml
new file mode 100644
index 00000000000..03e3702eba4
--- /dev/null
+++ b/html/changelogs/Datraen-PBAPCCheck.yml
@@ -0,0 +1,6 @@
+author: Datraen
+
+delete-after: True
+
+changes:
+ - bugfix: "Adds a check to prison breaks that makes sure the APC is on before continuing."
diff --git a/html/changelogs/Datraen-SpawnTurf.yml b/html/changelogs/Datraen-SpawnTurf.yml
new file mode 100644
index 00000000000..ab5d705c177
--- /dev/null
+++ b/html/changelogs/Datraen-SpawnTurf.yml
@@ -0,0 +1,6 @@
+author: Datraen
+
+delete-after: True
+
+changes:
+ - bugfix: "Artifacts will no longer spawn on floor turfs."
diff --git a/icons/mob/items/lefthand.dmi b/icons/mob/items/lefthand.dmi
index 728255c8417..ff683bc069e 100644
Binary files a/icons/mob/items/lefthand.dmi and b/icons/mob/items/lefthand.dmi differ
diff --git a/icons/mob/items/righthand.dmi b/icons/mob/items/righthand.dmi
index a47ee5d686b..4b45b5f0afe 100644
Binary files a/icons/mob/items/righthand.dmi and b/icons/mob/items/righthand.dmi differ
diff --git a/icons/obj/monitors.dmi b/icons/obj/monitors.dmi
index a817a42648c..940051fea10 100644
Binary files a/icons/obj/monitors.dmi and b/icons/obj/monitors.dmi differ
diff --git a/icons/obj/radio.dmi b/icons/obj/radio.dmi
index 75196e856d0..e5cd99b2071 100644
Binary files a/icons/obj/radio.dmi and b/icons/obj/radio.dmi differ
diff --git a/icons/obj/stock_parts.dmi b/icons/obj/stock_parts.dmi
index 920114b5500..58cf8bcff7e 100644
Binary files a/icons/obj/stock_parts.dmi and b/icons/obj/stock_parts.dmi differ
diff --git a/icons/obj/vending.dmi b/icons/obj/vending.dmi
index 3cf5a6eabcc..fa4ef129a6e 100755
Binary files a/icons/obj/vending.dmi and b/icons/obj/vending.dmi differ
diff --git a/icons/obj/watercloset.dmi b/icons/obj/watercloset.dmi
index 89d382c824d..0a5aeb5b446 100644
Binary files a/icons/obj/watercloset.dmi and b/icons/obj/watercloset.dmi differ
diff --git a/maps/polaris-1.dmm b/maps/polaris-1.dmm
index a712597e8c6..c8948448073 100644
--- a/maps/polaris-1.dmm
+++ b/maps/polaris-1.dmm
@@ -1035,7 +1035,7 @@
"atU" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/vacant/vacant_site)
"atV" = (/obj/machinery/newscaster{pixel_x = 0; pixel_y = -28},/turf/simulated/floor/wood,/area/vacant/vacant_site)
"atW" = (/obj/structure/bed/chair/comfy/black{dir = 4},/turf/simulated/floor/wood,/area/vacant/vacant_site)
-"atX" = (/obj/structure/table/woodentable,/obj/effect/decal/cleanable/dirt,/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/item/frame/fire_alarm,/turf/simulated/floor/wood,/area/vacant/vacant_site)
+"atX" = (/obj/structure/table/woodentable,/obj/effect/decal/cleanable/dirt,/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/item/frame,/turf/simulated/floor/wood,/area/vacant/vacant_site)
"atY" = (/obj/structure/bed/chair/comfy/brown{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/wood,/area/vacant/vacant_site)
"atZ" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/wood,/area/vacant/vacant_site)
"aua" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/structure/extinguisher_cabinet{pixel_x = -27},/turf/simulated/floor/tiled,/area/storage/primary)
@@ -1646,6 +1646,9 @@
"aFH" = (/obj/item/weapon/stool/padded,/obj/machinery/ai_status_display{pixel_y = 32},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/pool)
"aFI" = (/obj/structure/table/glass,/obj/item/inflatable{pixel_x = 6; pixel_y = 6},/obj/item/inflatable{pixel_x = 2; pixel_y = 2},/obj/item/inflatable{pixel_x = -2; pixel_y = -3},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/pool)
"aFJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/maintenance/pool)
+"aFK" = (/obj/structure/reagent_dispensers/water_cooler{bottle = 1},/turf/simulated/floor/carpet,/area/crew_quarters/recreation_area)
+"aFL" = (/obj/structure/reagent_dispensers/water_cooler{bottle = 1},/obj/effect/floor_decal/corner/paleblue{dir = 2},/turf/simulated/floor/tiled,/area/medical/surgeryobs)
+"aFM" = (/obj/structure/reagent_dispensers/water_cooler{bottle = 1},/obj/effect/floor_decal/corner/lime/full{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/virology)
"aFN" = (/obj/effect/floor_decal/industrial/warning{dir = 9},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/security/armoury)
"aFO" = (/obj/machinery/door/blast/regular{id = "Armoury"; name = "Emergency Access"},/turf/simulated/floor/tiled,/area/security/armoury)
"aFP" = (/obj/effect/floor_decal/industrial/warning{dir = 5},/turf/simulated/floor/tiled,/area/security/brig)
@@ -1697,7 +1700,7 @@
"aGJ" = (/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/crew_quarters/recreation_area_hallway)
"aGK" = (/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/crew_quarters/recreation_area_hallway)
"aGL" = (/obj/machinery/door/firedoor/glass,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/crew_quarters/recreation_area_hallway)
-"aGM" = (/obj/structure/reagent_dispensers/water_cooler,/turf/simulated/floor/carpet,/area/crew_quarters/recreation_area)
+"aGM" = (/obj/structure/reagent_dispensers/water_cooler{bottle = 1},/obj/effect/floor_decal/corner/paleblue{dir = 10},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 21},/turf/simulated/floor/tiled/white,/area/medical/reception)
"aGN" = (/turf/simulated/floor/carpet,/area/crew_quarters/recreation_area)
"aGO" = (/obj/item/weapon/stool/padded,/turf/simulated/floor/carpet,/area/crew_quarters/recreation_area)
"aGP" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet,/area/crew_quarters/recreation_area)
@@ -1705,7 +1708,11 @@
"aGR" = (/turf/simulated/floor/tiled/freezer,/area/crew_quarters/pool)
"aGS" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/pool)
"aGT" = (/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/pool)
+"aGU" = (/obj/effect/floor_decal/corner/blue,/obj/structure/reagent_dispensers/water_cooler{bottle = 1},/turf/simulated/floor/tiled,/area/bridge_hallway)
"aGV" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled/dark,/area/security/armoury)
+"aGW" = (/obj/item/frame,/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor,/area/vacant/vacant_shop)
+"aGX" = (/obj/structure/table/standard,/obj/item/weapon/clipboard,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/weapon/stamp/qm,/turf/simulated/floor/tiled,/area/quartermaster/qm)
+"aGY" = (/obj/structure/reagent_dispensers/water_cooler{bottle = 1},/obj/effect/floor_decal/corner/white{dir = 4},/obj/effect/floor_decal/corner/blue{dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_dinning)
"aGZ" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/security/armoury)
"aHa" = (/obj/machinery/door/blast/regular{id = "Armoury"; name = "Emergency Access"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/security/armoury)
"aHb" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/security/brig)
@@ -1771,6 +1778,8 @@
"aIj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/pool)
"aIk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/pool)
"aIl" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/pool)
+"aIm" = (/obj/structure/frame,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos)
+"aIn" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/frame,/turf/simulated/floor/tiled,/area/engineering/workshop)
"aIr" = (/obj/machinery/door/blast/regular{id = "Armoury"; name = "Emergency Access"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/security/armoury)
"aIs" = (/obj/effect/floor_decal/industrial/warning{dir = 6},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/button/remote/blast_door{id = "Armoury"; name = "Emergency Access"; pixel_x = 0; pixel_y = -28; req_access = list(3)},/turf/simulated/floor/tiled,/area/security/brig)
"aIt" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/turf/simulated/floor/tiled,/area/security/brig)
@@ -2927,7 +2936,6 @@
"beY" = (/obj/structure/disposalpipe/segment,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/tiled,/area/hallway/primary/central_two)
"beZ" = (/turf/simulated/wall,/area/medical/surgeryobs)
"bfa" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/cups{pixel_x = 0; pixel_y = 0},/turf/simulated/floor/tiled,/area/medical/surgeryobs)
-"bfb" = (/obj/structure/reagent_dispensers/water_cooler,/obj/effect/floor_decal/corner/paleblue{dir = 2},/turf/simulated/floor/tiled,/area/medical/surgeryobs)
"bfc" = (/obj/structure/table/standard,/obj/item/weapon/hemostat,/obj/item/weapon/cautery,/obj/effect/floor_decal/corner/pink/full{dir = 8},/obj/machinery/button/remote/blast_door{id = "surgeryobs2"; name = "Privacy Shutters"; pixel_x = -26; pixel_y = 0},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled/white,/area/medical/surgery2)
"bfd" = (/obj/structure/table/standard,/obj/item/stack/medical/advanced/bruise_pack,/obj/item/weapon/retractor,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/tiled/white,/area/medical/surgery2)
"bfe" = (/obj/structure/table/standard,/obj/item/weapon/circular_saw{pixel_y = 8},/obj/item/weapon/scalpel,/obj/effect/floor_decal/corner/pink{dir = 5},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled/white,/area/medical/surgery2)
@@ -3381,7 +3389,6 @@
"bnK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/black{dir = 10},/turf/simulated/floor/tiled/white,/area/medical/virology)
"bnL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled/white,/area/medical/virology)
"bnM" = (/obj/item/weapon/stool/padded,/obj/effect/floor_decal/corner/lime{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/virology)
-"bnN" = (/obj/structure/reagent_dispensers/water_cooler,/obj/effect/floor_decal/corner/lime/full{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/virology)
"bnO" = (/obj/structure/lattice,/obj/machinery/light{dir = 1},/turf/simulated/mineral/floor/ignore_mapgen,/area/rnd/docking)
"bnP" = (/turf/simulated/shuttle/wall{icon_state = "swall_straight"; dir = 1},/area/shuttle/research/station)
"bnQ" = (/obj/structure/table/reinforced,/turf/simulated/shuttle/floor,/area/shuttle/research/station)
@@ -4571,7 +4578,6 @@
"bKJ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/medical/chemistry)
"bKK" = (/obj/effect/floor_decal/corner/paleblue{dir = 10},/obj/machinery/newscaster{pixel_y = -30},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/reception)
"bKL" = (/obj/effect/floor_decal/corner/paleblue{dir = 10},/obj/machinery/camera/network/medbay{c_tag = "MED - Diagnostics Aft"; dir = 1},/obj/item/device/radio/intercom{broadcasting = 0; canhear_range = 5; dir = 2; frequency = 1487; icon_state = "intercom"; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = 0; pixel_y = -21},/turf/simulated/floor/tiled/white,/area/medical/sleeper)
-"bKM" = (/obj/structure/reagent_dispensers/water_cooler,/obj/effect/floor_decal/corner/paleblue{dir = 10},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 21},/turf/simulated/floor/tiled/white,/area/medical/reception)
"bKN" = (/turf/simulated/wall,/area/medical/medbay_emt_bay)
"bKO" = (/obj/machinery/door/airlock/multi_tile/glass{id_tag = "MedbayFoyerPort"; req_access = list(5)},/obj/machinery/door/firedoor/glass,/obj/effect/floor_decal/corner/pink{dir = 9},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/medical/medbay_emt_bay)
"bKP" = (/obj/machinery/door/firedoor/glass,/obj/effect/floor_decal/corner/pink{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/medical/medbay_emt_bay)
@@ -4716,7 +4722,6 @@
"bNy" = (/obj/effect/floor_decal/corner/blue,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop)
"bNz" = (/obj/effect/floor_decal/corner/blue{dir = 8},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/bridge_hallway)
"bNA" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled,/area/bridge_hallway)
-"bNB" = (/obj/effect/floor_decal/corner/blue,/obj/structure/reagent_dispensers/water_cooler,/turf/simulated/floor/tiled,/area/bridge_hallway)
"bNC" = (/turf/simulated/wall/r_wall,/area/crew_quarters/captain)
"bND" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
"bNE" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen)
@@ -6650,7 +6655,6 @@
"cyK" = (/obj/machinery/door/airlock/glass_mining{name = "Quartermaster"; req_access = list(41)},/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/qm)
"cyL" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/quartermaster/qm)
"cyM" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/quartermaster/qm)
-"cyN" = (/obj/structure/table/standard,/obj/item/weapon/clipboard,/obj/item/weapon/stamp{name = "Quartermaster's stamp"; pixel_x = 0; pixel_y = 0},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/quartermaster/qm)
"cyO" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/quartermaster/qm)
"cyP" = (/obj/machinery/computer/security/mining,/turf/simulated/floor/tiled,/area/quartermaster/qm)
"cyQ" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/turf/simulated/floor,/area/maintenance/apmaint)
@@ -7503,7 +7507,6 @@
"cPf" = (/obj/machinery/vending/coffee,/obj/effect/floor_decal/corner/white{dir = 4},/obj/effect/floor_decal/corner/blue{dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_dinning)
"cPg" = (/obj/machinery/vending/snack,/obj/effect/floor_decal/corner/white{dir = 4},/obj/effect/floor_decal/corner/blue{dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_dinning)
"cPh" = (/obj/machinery/vending/cigarette,/obj/effect/floor_decal/corner/white{dir = 4},/obj/effect/floor_decal/corner/blue{dir = 1},/obj/machinery/camera/network/civilian{c_tag = "CIV - Visitor's Dinning"; dir = 2},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_dinning)
-"cPi" = (/obj/structure/reagent_dispensers/water_cooler,/obj/effect/floor_decal/corner/white{dir = 4},/obj/effect/floor_decal/corner/blue{dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_dinning)
"cPj" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/cups,/obj/effect/floor_decal/corner/white{dir = 4},/obj/effect/floor_decal/corner/blue{dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_dinning)
"cPk" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/effect/floor_decal/corner/white{dir = 4},/obj/effect/floor_decal/corner/blue{dir = 1},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_dinning)
"cPl" = (/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging)
@@ -8052,7 +8055,6 @@
"cZJ" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/tiled,/area/engineering/foyer)
"cZK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/foyer)
"cZL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/window/westleft{name = "Engineering Reception Desk"; req_access = list(10); req_one_access = newlist()},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/engineering/foyer)
-"cZM" = (/obj/item/frame/fire_alarm,/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor,/area/vacant/vacant_shop)
"cZN" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/engineering/foyer)
"cZO" = (/obj/machinery/door/airlock/glass_engineeringatmos{name = "Engineering Monitoring Room"; req_one_access = list(11,24)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled,/area/engineering/engineering_monitoring)
"cZP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/engineering/engineering_monitoring)
@@ -8106,7 +8108,6 @@
"daL" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos)
"daM" = (/obj/machinery/atmospherics/unary/freezer{dir = 2; icon_state = "freezer"},/obj/machinery/hologram/holopad,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos)
"daN" = (/obj/machinery/atmospherics/unary/heater{dir = 2; icon_state = "heater"},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos)
-"daO" = (/obj/machinery/constructable_frame/machine_frame,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos)
"daP" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos)
"daQ" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Port to Waste"},/turf/simulated/floor/tiled,/area/engineering/atmos)
"daR" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/tiled,/area/engineering/atmos)
@@ -8368,7 +8369,6 @@
"dfN" = (/obj/item/clothing/shoes/magboots,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/void/engineering,/obj/structure/table/rack{dir = 8; layer = 2.6},/obj/item/clothing/suit/space/void/engineering,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/window/northright{name = "Engineering Hardsuits"; req_access = list(11)},/obj/machinery/light,/turf/simulated/floor/tiled,/area/engineering/engine_eva)
"dfO" = (/obj/structure/bed/chair,/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod{frequency = 1380; id_tag = "escape_pod_6"; pixel_x = 25; pixel_y = 0; tag_door = "escape_pod_6_hatch"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod6/station)
"dfP" = (/obj/structure/bed/chair,/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod{frequency = 1380; id_tag = "escape_pod_5"; pixel_x = 25; pixel_y = 0; tag_door = "escape_pod_5_hatch"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod5/station)
-"dfQ" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/constructable_frame/machine_frame,/turf/simulated/floor/tiled,/area/engineering/workshop)
"dfR" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/secondary/entry/D1)
"dfS" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/secondary/entry/D1)
"dfT" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/secondary/entry/D1)
@@ -9852,7 +9852,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaALaALdFKaDxaJGdFLdFNdFMdFPdFOaALaCvaCwaCxaCyaCzazHaCAaCBaCCaCDaCEaCFaCGaCHaCIaCJaCKaCLaCMaCNaCNaCOaCPaCQaCRaCSaCTaCUaCVaCWaCXaCYaCZaDadEhaDbaDcaDddEiaDfaDgaDhaDiaDjaAeaDkaDlauNatNaahaahaahaahaahaahaahavCaxlaxmaxdavCahyahyahyahyahyahyahyaCjaDmaDnaCjahyahyahyahyahyahyahyahyaahaahaahaahaahaDoaDpaDqaDraDsaClaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaDtaDuaDvaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaALaALdFQaDxaGVdFRdFSdFRdFTaDxaDyazHaDzaDAaDBazHazHaDCaBGaBGaDDaBGaDEaDGaDHaDIaDJaDKaDLaDMaDNaDOazMaDPaDQaDRaBVaDSaDTaDUaDVaDWaDXaDYaDZaEaaEbaEcaEdaEaaEeaEfaEgaEhaEiaEjaEkaElaEmatNaahaahaahaahaahaahaahavCaxlaxmaEnavCahyahyahyahyahyahyahyaCjaEoaDnaCjahyahyahyahyahyahyahyahyahyahyaahaahaahaEpaEtaEraEsaGyaClaEuaEuaEuaEuaEuaEuaEuaEuaEuaEvaEvaEvaEvaEvaEvaEvaEvaEvaEvaEvaEvaEvaEvaEwaExaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaALaALaALdFUaDxaDxaDxaDxdFVaEBaALaECaEDaEEaEFdFWaEHaEFaEIaEzaDDaDFaELaEMaENaEOaEPaEQaERaESaETaEUazMaBVaEVaBVaEWaEXaEYaEZaFaaFbaFcaFdaFaaFeaFfaFeaFaaFeaFgaFeaFhayPaFiatNaFjaFkaFlatNaahaahaahaFmaFmaFmaFmaFmaFnaxcaxdaFoaFoaFoaFoaFoahyahyahyaCjaDmaCjaCjahyahyahyahyahyahyahyahyahyahyahyaahaahaFpaFqaFraFsaFtaClaFuaFvaFwaFxaFyaFzaLgaFAaFuaEvaFBaFBaFCaFDaFEaFFaFGaFFaFHaFDaFCaFIaEvaDtaFJaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaALaALaALaALdFYdFXdFZaDxdGaaFNaFOaFPaCIaFQaEFaECaEKaEFaFSaFTaFUaFVaFWaFXaFYaFZazMaGaaGbaGcaGdaGeazMaGfaGgaGhaGiaGjaGkaGlaFaaGmaGnaGoaFaaGpaGqaGraFaaGpaGnaGraFhaahaahatNaGsaGtaGuatNaahaahaFmaFmaGvaFRaGxaKwaxlaxmaGzaFoaGAaGBaGCaFoaFoahyahyaCjaDmaCjahyahyaGDaGDaGEaGFaGFaGFaGGaGFaGFaGFaGFaGHaGDaGIaGJaGKaGLaClaGMaGNaGOaGNaGPaGNaGOaGNaGQaEvaGRaGSaGRaGRaGRaGRaGRaGRaGRaGRaGRaGRaGTaDtaFJaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaALaALaALaALdFYdFXdFZaDxdGaaFNaFOaFPaCIaFQaEFaECaEKaEFaFSaFTaFUaFVaFWaFXaFYaFZazMaGaaGbaGcaGdaGeazMaGfaGgaGhaGiaGjaGkaGlaFaaGmaGnaGoaFaaGpaGqaGraFaaGpaGnaGraFhaahaahatNaGsaGtaGuatNaahaahaFmaFmaGvaFRaGxaKwaxlaxmaGzaFoaGAaGBaGCaFoaFoahyahyaCjaDmaCjahyahyaGDaGDaGEaGFaGFaGFaGGaGFaGFaGFaGFaGHaGDaGIaGJaGKaGLaClaFKaGNaGOaGNaGPaGNaGOaGNaGQaEvaGRaGSaGRaGRaGRaGRaGRaGRaGRaGRaGRaGRaGTaDtaFJaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaALaALaALaALaALaALdGbdGcaGZaHaaHbaHcaHdaHeaHfaGwaHhaHiaHjaHkaHlaHmaHnaHoaHpaHqaHraHsaHtaHlaHuaHvaHwaHxaHyaHzaHAaHBaHCaFaaHDaHEaHFaFaaHGaHHaHIaFaaHJaHEaHKaFhaahaahatNaHLaHMaHNatNaahaFmaFmaHOaHPaHQaHRaFmaHSaxmaxdaFoaHTaHUaHVaHWaFoaFoahyaCjaDmaCjahyahyaGDaHXaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaHZaIaaIbaIcaIdaClaIeaGNaGNaIfaIgaIhaGNaGNaIiaEvaGRaIjaIkaIkaIkaIkaIkaIkaIkaIkaIkaIlaGRaDtaFJaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaALaALaALdGedGddGfaDxdGadGgaIraIsaItaIuaIvaIwaHgaIyaIzaIAaIBaICaIDaIEaIFaIGaIHaIIaIHaIJaIKaILaIMaINaIOaBXaIPaIQaGkaIRaFaaISaITaIUaFaaIVaIWaIVaFaaIVaIXaIVaFhaahaahatNaIYaIZaHNatNaFmaFmaJaaJbaJcaJdaJeaJfaJgaJhaJiaJjaJkaJlaJmaJnaJoaFoahyaCjaDmaCjahyahyaGDaJpaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaJqaJraFraFsaQkaClaJsaGNaJtaJuaJvaJwaJxaGNaJyaEvaJzaJAaJBaJCaJCaJCaJCaJCaJCaJCaJDaGRaJEaDtaFJaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaALaALaALdGhaGVdFRdFRdFRdGjdGiaALaJJaJKaJKaJKaJLaJMaJKaJNaJKaJOaJPaJKaJQaJRaJSaJTaJQaJUaJVaJWaFaaJXaJYaFaaJZaKaaFaaKbaFaaFaaKcaKdaKeaKfaKgaKhbjdaKjaKiaKdaKkaFhaFhaahatNatNaKlaHNayZaKmaKnaJbaJbaKoaKpaKqaFmaxlaxmaxdaKraJkaKsaKtaJkaKuaFoahyaCjaDmaCjaGDaGDaGDaGDaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaJqaKvaIbaIcaLJaDoaKyaGNaJtaJuaJvaJwaJxaGNaLKaKzaKAaJAaKBaKCaKCaKCaKCaKCaKCaKCaKDaGRaKEaDtaFJaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -9879,14 +9879,14 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdaaaaaabbdaaaaaaaaabbdaaaaaaaaaaaaaaabbdaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdaaaaaaaaabbdbbdbbdbbdbbdbbdbbdaaaaaaaaabbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZobccbcdbceaZoaahaahaahaahaYPbcfbcgbchbchbchbcibchbcjbckbclbclbcmbcnbcobamahyahyaahaahaahaahaahaahaZCbcpbcqbcraZDbcsbctbcuaZDbcvbcwbcxaZFaahaahaZdaZHaZdahyaZIbcybbEbbFbfMdCqbbGbbGbczbcAbcBbcCbcDbbGbbGbgHdCrbbLbbEbcyaZIahyaTobcEbcFbcGbcHbcLbcKbcNbcMbcNbcQbdzbdybdzdCsbdDbcObaZdCtbdEaZRbcRbcRbcRbcRaZmbcSbcTaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaabbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZoaZpbcUaZoaZoaahaahaahaahaYPbcVbcWbcXbcYbcZbdabdbbdcbddbdebdebdfbdgbdhbaiahyahyaahaahaahaahaahaahaZCbdibdjbdkbdlbdlbdmbdlbdlbdnbdobdpaZFaahaahaZdaZHaZdahybdqbaJbbFbfMdCqbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbgHdCrbdsbaKbdqahyaTobdubdvaUwbdwbaLbdFbfkbdGbLZbdIbWObNGbiVbYuaZRccRcsWdCucwuaZRbdJbdKbdLbcRbdMbdNbdOaZmaahaahaZmaZmaZmaZmaZmaZmaZmaZmaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaabbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbdPbdPbdPbdPbdQbdRbdSbdTaahaahaahaahaYPaRtbdVbdWbdXbdYbdXbdZbeabebbecbecaZzbcnbedbeebefbefbefbefbefaahaahaahaZCaZCaZCaZCbdlbegbehbeibdlaZFaZFaZFaZFaahaahaZdaZHaZdahybejbiHbfMdCqbbGbelbbGbembenbbGbbGbbGbeobepbbGbelbbGbgHdCvbiFbejahyaZPbesbetaUwaToaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRbeubevbewbcRbdMbdNbdOaZmaahaZmaZmbexbeybdObdObdObezbeAaZmaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbeBbeCbeDbdPbeEbeFbeGbdTaahaahaahaahaYPaYPbeHbeIbeJbeKbeLaYPaYPbbmbbnbbobeMbcnbeNbeebeObePbeQbeRbefaahaahaahaahaahbdlbdlbeSbeTbeUbeTbeSbdlbdlaahaahaahaahaZdaZHaZdahybcybiHdCwbeqbbGbbGbeVbeWbbGbbGbbGbbGbbGbeXbepbbGbbGbbGdCxbiFbcyahybaNbbObetbeYaToaahaahbeZbeZbfabfbbeZbfcbfdbfebffbfgbfhbfibfjbcRbkhbevbevbflbdMbdNbfmaZmaZmaZmbfnbfobfobfobfobfobfobfobfpaZmaZmaZmaZmaZmaZmaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbeBbeCbeDbdPbeEbeFbeGbdTaahaahaahaahaYPaYPbeHbeIbeJbeKbeLaYPaYPbbmbbnbbobeMbcnbeNbeebeObePbeQbeRbefaahaahaahaahaahbdlbdlbeSbeTbeUbeTbeSbdlbdlaahaahaahaahaZdaZHaZdahybcybiHdCwbeqbbGbbGbeVbeWbbGbbGbbGbbGbbGbeXbepbbGbbGbbGdCxbiFbcyahybaNbbObetbeYaToaahaahbeZbeZbfaaFLbeZbfcbfdbfebffbfgbfhbfibfjbcRbkhbevbevbflbdMbdNbfmaZmaZmaZmbfnbfobfobfobfobfobfobfobfpaZmaZmaZmaZmaZmaZmaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbfqbfrbfsbdPbftbfubfvbdTaahaahaahaahaahaYPaYPbfwbfxbfyaYPaYPahyahyahybfzbfAbcnbfBbeebfCbfDbfEbfFbefbefaahaahaahaahbdlbfGbeTbfHbfIbfJbeTbfKbdlaahaahaahaahaZdaZHaZdahyaZIbfLdCybbJbbGbeVbfNbfObbGdCzdCzdCzbbGbjlbfPbfQbbGbbGdCAbfSaZIahybbNaYGbetaUwaToaahaahbeZbfTbfUbfVbfWbfXbfYbfZbfZbgabgbbgcbgdbgebgfbggbghbcRbdMbgibfobfobfobfobgjbgkbgkbgkbgkbgkbgkbgkbglbfobfobfobfobfobfpaZmaZmaahaahaahaahaahaahbgmbgmbgmbgmbgmbgmbgmaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbgnbfrbgobdPbgpbgqbgrbdTaahaahaahaahahyahyahyahyahyahyahyahyahyahybbobbobgsbcnbgtbeebefbgubgvbgwbgxbefaahaahaahaahbdlbgybeTbeibgzbeibeTbgAbdlaahaahaahaZdaZdaZHaZdahyaZIbgBdCBbfRbbGbgCbbGbbGdCCbgDbgEbgFdCDbbGbbGbgCbbGbgGbgHdCEaZIaZfaTobgIbgJbgKaToaToaahbeZbgLbgMbgNbgObgPbgQbgRbgSbgTbgUbgVbgWbgXbgYbgYbgYbgYbgYbgYbgZbgZbgZbgZbgZbgkbhabhbbmzbhdbhebgkbhfbhfbhfbhfbhfbhfbglbfpaZmaahaahaahaahaahbgmbgmbhgbhhbhibhhbhjbgmbgmaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbhkbhlbhkbdPbhmbfubhnbhobhobhobhoaahaahaahahyahyahyahyahyahyahyahyaZybhpbajbhqbhrbhsbefbhtbgvbgwbhubefaahaahaahaahbdlbhvbeTbhwbhxbhwbeTbhybdlaahaahaahaZdaZGaZHaZdahybdqbaUdCFbbGbbGbbGbbGdCGbgDbhAbhAbhAbgFdCFbbGbbGbbGbhBbbGbhCbhDbhEbhFbhGbetaUwbhHaToaahbeZbhIbhJbgNbhKbhLbhLbhLbhLbhMbhNbgVbhObhPbgYbhQbhRbhSbhTbgYbhUbhVbhVbhWbgZbhXbhYbhYbhZbhZbhYbiabhfbibbicbidbiebhfbdOaZWaZmaahaahaahaahaahbgmbifbigbihbiibijbikbifbgmaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyaahaahaahaahaahaahaahaahaahaahaahaahbilbilbilbilbilbilbilbilbilbimbinbiobipbeEbfubinbhobiqbirbhobhobhoaahaahahyahyahyahyahyahyahybambisaZzbitbiubdebivbiwbixbgwbhubefaahaahaahaahbdlbiybeTbizbiAbiBbeTbiCbdlaahaahaahaZdbiDaZHaZdahybejbdrdCFbbGbbGbbGbbGdCGbiFbhAbdtbhAbiHdCFbbGbbGbbGbiIbiJbiJbiKbiLbiMbiNbiObiPbiQaToaahbeZbfTbiRbiSbeZbiTbiUblObiWbiXbfhbgVbhObiYbgYbiZbjabjbbjcbgYbSjbjebjfbjgbgZbjhbjibjjbjkbpybjmbjnbhfbibbjobjpbjqbhfbjrbjsaZmaahaahaahaahaahbgmbjtbjubjvbjwbjvbjubjxbgmaahaahbgmbgmbgmbgmbgmaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyahyahyahyahyaahaahaahaahaahaahaahaahaahaahbilbjybjzbjAbjBbjCbjDbjEbilbjFbjGbjHbjIbjJbjKbjLbhobjMbjNbjObjPbhoaahaahaahahyahyahyahyahyahybaibjQbjRbjSbhrbecbjTbjUbjVbgwbhubefaahaahaahaahbjWbjWbjWbjWbjXbjWbjWbjWbjWaahaahaahaZdbjYaZHaZdahybcybaUdCFbbGbbGbbGbbGdCGbjZbhAbhAbhAbkadCFbbGbbGbbGbkbbbGbbGbkcaZibkdaYGbetaUwbkeaToaahbeZbkfbkgblRbeZbfhbfhbfhbfhbkibfhbkjbkkbklbgYbkmbknbkobkpbgYbkqbkrbksbktbgZbkubkvbkwbkxbkybkzbkAbkBbkCbkDbkEbkFbhfbdObkGaZmaahaahbgmbgmbgmbgmbkHbkIbkHbkJbkHbkKbkHbgmbgmbgmbgmbkLbkMbkNbgmbgmaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkObkPbkRbkQbkSbkPbkPahyaahaahaahaahaahaahaahaahaahbilbkTbkUbkVbkWbkXbkYbkZblablbblcbldbleblfblgblhbhoblibljblkblkbhobllbllbllbllahyahyahyahyahybbobboblmblnblobeebefblpbjVbgwblqbefaahaahaahaahbjWblrblsbltblublvblwblxbjWaahaahaahaZdaZdaZHaZdahyaZIblydCwbeqbbGblzbbGbbGdCrbjZblAbkabfMbbGbbGblzbbGblBdCHdCIaZIaZfaToaZjblDaZlaToaToaahbeZblEblFblGbeZblHblIblJblKblLblMblNbhOblWbgYbgYblPblQbpabgYblSblTblUblVbgZbrKbhZbhYblXbhYbhYblYbhfblZbmabhfbmbbhfbmcaZWaZmaahbgmbgmbifbmdbkHbmebmfbmgbmhbmibmfbmgbmjbkJbmkbmlbmibmmbmgbmnbgmbgmaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkPbmobmpbmqbmpbmobkRahyahyaahbkPbkPbkPbkPaahaahaahbilbmrbmsbjAbmtbmubmvbmwbilbmxbfubmybdTbrebdTbrebhoblibmAbmBbmCblkbmDbmEbmFbllbmGbmHbmIbllahyahyaZyaZzbcnbhrbeebmJbmKbmLbmMbefbefaahaahaahaahbjWbmNbmObmPbmQbmPbmRbmSbjWaahaahaahaahaZdaZHaZdahyaZIbmTdCJbbJbbGbfPbfQbmUbbGbdCbdCbdCbbGbmUbeVbfNbbGbbGdCKbmVaZIahyaZPaYGaYHaUwaToaahaahbeZbmWbmXbmYbmZbnabnbbncbncbndbnebnfbngbnhbnibgYbnjbnkbnlbgYbnmbnnbnobnpbgZbnqbnrbhYbnsbhYbntbnubhfbnvbnwbhfbnxbhfbnyaZWaZmaahbgmbnzbnAbnBbnCbnDbnEbnDbnFbnDbnGbihbnHbkJbnIbnJbnKbnLbihbnMbnNbgmaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkPbmobmpbmqbmpbmobkRahyahyaahbkPbkPbkPbkPaahaahaahbilbmrbmsbjAbmtbmubmvbmwbilbmxbfubmybdTbrebdTbrebhoblibmAbmBbmCblkbmDbmEbmFbllbmGbmHbmIbllahyahyaZyaZzbcnbhrbeebmJbmKbmLbmMbefbefaahaahaahaahbjWbmNbmObmPbmQbmPbmRbmSbjWaahaahaahaahaZdaZHaZdahyaZIbmTdCJbbJbbGbfPbfQbmUbbGbdCbdCbdCbbGbmUbeVbfNbbGbbGdCKbmVaZIahyaZPaYGaYHaUwaToaahaahbeZbmWbmXbmYbmZbnabnbbncbncbndbnebnfbngbnhbnibgYbnjbnkbnlbgYbnmbnnbnobnpbgZbnqbnrbhYbnsbhYbntbnubhfbnvbnwbhfbnxbhfbnyaZWaZmaahbgmbnzbnAbnBbnCbnDbnEbnDbnFbnDbnGbihbnHbkJbnIbnJbnKbnLbihbnMaFMbgmaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnObnPbnQbnRbnRbnPbnSbnTbkPbkPbkPbnUbnVbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbftbfubnWbdTbnXbnYbnZblkblkboabobbocblkbodboeboebofbogbohboibllahyahybamaZzbcnbojbeebmKbmKbokbolbefaahaahaahaahbjWbjWbombonboobopboqbonborbjWbjWaahaahaahaZdaZHaZdahybdqbiHdCBbfRbbGbbGbfPbfQbbGbbGbbGbbGbbGbembeWbbGbbGbbGdCxbdxbdqahybaNbbObotbouaToaahaahbeZbgLbovbgNbowboxboybozboAboBboCbgVbhOboDboEbgYboFboGboFbgYboHboIbTzboKbgZbgkboLboMbdAboLboMboOboOboOboOboOboOboOboOaZWaZmaahbgmboPboQboRbkHboSbmfboTboUboVboWbmmbmgbkHbmibmmboXboYboSboZbuPbgmaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkQbmqbpbbpcbpcbmqbpdbpebpfbpgbphbpibpjbpkbplbpmbpnbpobppbpqbprbprbpsbprbptbpubpvbpwbpxbMKbpzbpzbpzbpAblkblkbpBblkblkbpCbpDbpEbpEbpEbpFbpGbllahyahybamaZzbcnbfBbeebefbefbefbefbefaahaahaahaahbjWbpHbpIbpJbpKbpLbpKbpMbpNbpObjWaahaahaahaZdaZHaZdahybejbiHdCDdCLbbGbelbbGbfPbenbbGbbGbbGbeobeWbbGbelbbGdCHdCMbdxbejahybbNaYGaYHaUwbpPahyaahbeZbpQbpRbgNbpSbpTbpUbpVbpVbpWbpXbpYbpZbqabqabqbbqcbqdbqcbqebqcbqfbqgbqhbqibqjbqkbqhbqlbqmbqnboObqoaCqbqqbqrbqsbqtboOaZWaZmaahbgmbqubqvbqwbkJbqxbqybqzbgmbqAbqBbqCbqCbqDbsnbqCbqEbqFbqGboZbqHbgmaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaacAacOacAacAacAacAacAacAacAacOacAacAacAacAaaaaaaacAacAacAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqIaadahybkQbnPbqJbpcbpcbqKbqLbqMbqNbqObqPbqQbqRbqSbqTbqUbqVbqTbqWbqXbqTbqYbqZbrabrbbrcbrdbgqbinbMNbrfbrgbpzbrhbrebribrjbrkbrlbrmbrnbrobrpbrqbrrbrsbllahyahybambrtbrubrvaZyahyahyahyahyahyahyaahaahaahbjWbjWbrwbrxbpKbpKbpKbrybrzbjWbjWaahaahaahaZdaZHaZdahybcyaTsbrBdCDdCLbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGdCHdCCbrCbdBbcyahyaTobrEaYHbrFbrGahyahybeZbfTblFbrHbeZbrIbrJbvUbrLbrMblMbrNbrObrPbrQbrRbrSbrTbrSbrSbrSbrUbrVbrWbrXbrYbrZbrYbsabrYbrYbsbbscaCrbsebsfbsgbsgboOaZWaZmaahbgmboPbshboRbkHbmibsibsjbskbslbmmbmmbsmbkHbuYbmmbsobspbmiboZbsqbgmaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -9901,9 +9901,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaaaadaaaaaaaadbEMaadaaaaadbEMaadaaaaadbEMaadaaaaadbEMaadaaaaadaaaaaaaaabAZbBabENbEObEPbEQbznbERbESbETbEUbEUbEVbEWbtHbEXbtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbwMbEYbEZbFabFbbFcbFdbFebFfbwMbFgbfubFhbFibFjbFkbFlbFmbFibFnbFobFnbyhbyhbyhbyhbyhbrDbFqbFrbyhbfzbeebFsbecbcnbFtbboaZdbFubFubFubFubFubFubFvbFwaZdbFxbFybFxaZdbFzbFAbFBbFCaZdaahaahaZdaZdaZGaZHaZGbFDbFEbFFbFGbEgbFHbFIbFJbFJbFKbFLbFMbFObFNbFPbFNbHvbHubEjbFQbEjaZdaZdaTobFRbgJaUvbFSaTobypbyqbFTbAlbFUbFVbFWbFXbEqbFYbFZbGabGbbGcbGdbGebGfbGgbGhbGibGjbGjbGkbGlbtbbGmbGnbGobGpbySbGqbGrbGsbGtbGubGvbGwbyWbAJbySaZWaZmaZmaahaahaahaahaahaahbgmbxybGybGzbgmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAacAacAaadaadbtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaaaadaaaaaaaaaaaaaaabGBbznbznbznbznbtHbtHbGCbGDbDibGEbGFbGGbGHbtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbwMbwMbwMbGIbGJbGJbGJbwMbwMbwMbGKbGLbyfbGMbGNbGObGPbGQbFibJWbGSbGTbGUbGVbGWbGXbGYbFnbGZbFnbGYahybeebeebHabcnbecbHbbHcbFubHdbHebHfbHgbFubFubFubFubHhbHibHhbHjbHjbHkbHlbHjbHmaahaahaahaZdaZdaZHbEgbEgbHnbHobHpbEgbHqbHrbHsbHsbHsbHtbHwbHybHxbHxbHzbKBbJbbHAbHBbEjahyahyaToaZjblDbHCaToaToahybxcbHDbHEbCqbHFbHGbHHbCqbHIbHJbHKbHLbHMbHNbHMbHObHPbHPbHQbHPbHPbHRbHSbHTbHUbHVbHWbHXbySbHYbHZbIabGtbGubGvbIbbyWbAJbySbbbbJraZmaahaahaahaahaahaahbgmbIdbIebIfbgmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaaaadaaaaaaaaaaahaahaahaahaahaahaahaahbtHbtHbtHbtHbtHbIgbIhbIibtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbwMbIjbGJbGIbGJbGJbGJbGJbIkbwMbIlbfubImbInbIobIpbIqbIrbFibIsbItbIubIvbIubIwbIubLzbIybIzbIAbGYahyahybIBbecbRQbecbICbHcbIDbIEbIFbIFbIGbIHbIIbIJbFubIKbILbIMbHjbINbIObIPbHjaahaahaahaahaZdaZGaZHbEgbIQbIRbISbITbEgbIUbIVbIWbFJbFJbIXbIYbIZbJabJabJabJabJabJbbJcbJdahyahybJeaYGbRSaUvbpPahyahybuobosbvSbvSbJfbJgbvSbvSbJhbJibJjbJkbxqbJlbJmbJnbthbJobJpbJqbKLbJsbJtbJubJvbJwbJxbJybJzbJAbJBbJCbJDbJEbJFbJGbJHbJIbySbglbfpaZmaahaahaahaahaahaahbgmbgmbLDbJKbgmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaabtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaaacAaaaaaaaahaahahyahyahyahyahyahyahyahyaahaahaahbtHbtHbJLbIibtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbwMbJMbGJbJNbJObGJbGJbGJbIkbwMbJPbtUbJQbJRbJSbJTbJUbJVbFibGYbLEbJXbJYbJXbJXbJXbJZbJYbKabKbbKcahyahybKdbecbcnbecbKebHcbKfbKgbKhbKibKjbKhbKhbKkbFubKlbILbKmbHjbKnbKobKpbHjaahaahaahaahaZdbKqaZHbEgbIQbKrbKsbKtbEgbKubKvbKwbFJbKxbKycuybKAbJabJabJabJabJabKBbKCbKDahyahybrGbKEbynbKFbrGahyahybvObsDbKHbKHbKIbKKbMHbKMbKNbKNbKObKPbKQbKRbKNbKSbKTbKUbKVbKSbKWbKWbKWbKWbKWbKXbKYbKZbLabySbySbySbySbySbySbySbySbySbySbLbbLcaZmbLdbLebLebLebLdbLdbLfbLgbLhbLibLfbLdaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaabtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaaacAaaaaaaaahaahahyahyahyahyahyahyahyahyaahaahaahbtHbtHbJLbIibtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbwMbJMbGJbJNbJObGJbGJbGJbIkbwMbJPbtUbJQbJRbJSbJTbJUbJVbFibGYbLEbJXbJYbJXbJXbJXbJZbJYbKabKbbKcahyahybKdbecbcnbecbKebHcbKfbKgbKhbKibKjbKhbKhbKkbFubKlbILbKmbHjbKnbKobKpbHjaahaahaahaahaZdbKqaZHbEgbIQbKrbKsbKtbEgbKubKvbKwbFJbKxbKycuybKAbJabJabJabJabJabKBbKCbKDahyahybrGbKEbynbKFbrGahyahybvObsDbKHbKHbKIbKKbMHaGMbKNbKNbKObKPbKQbKRbKNbKSbKTbKUbKVbKSbKWbKWbKWbKWbKWbKXbKYbKZbLabySbySbySbySbySbySbySbySbySbySbLbbLcaZmbLdbLebLebLebLdbLdbLfbLgbLhbLibLfbLdaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaadbtEbGAbtGaadbtEbGAbtGaadbtEbGAbtGaadbtEbGAbtGaadacAaaabLjaahbLkbLkbLlbkQbkQbkQbLmbLkbLkahyaahaahaahbtHbLnbIibtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbwMbLobLpbLqbGJbLrbGJbLsbwMbwMbLtbfubImbFibLubLvbLwbLxbLybGYbPnbNsbLBbLCbLCbLAbLAbLBbRjbRibLFahyahybKdbLGbhqbecbKebHcbLHbLIbKhbLJbLKbLLbLMbLNbLObLPbLQbLRbLSbLTbLUbLVbHjaahaahaahaahaZdaZdaZHbEgbEgbLWbEgbEgbEgbLXbLYcAgbMabKxbMbcuBbMdbMebMfbMgbMhbKBbKBbMibKDahyahybvNbMjbgJaUvbvNahyahybMkbMlbMmbKJbOcbMkbMkbMkbMkbOabMqbMrbMsbMtbMsbKSbMubMvbMwbMxbKWbMybMzbMAbMBbMCbMDbMEbMFbMGbOdbMIbMJbRXbMLbMMdFecbabUSbMQbMRbMSbMTbMUbMVbMWbMXbMYbMZbNabNbbNabNcbLdaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOaaabtEbNdbtGaaabtEbNdbtGaaabtEbNdbtGaaabtEbNdbtGaaaaadaadbLjaahbLkbNebNfbNgbNfbNgbNfbNebLkahyahyaahaahbtHbNhbIibtHbtHaahaahaahaahaahaahaahaahaahaahaahbtHbtHbtHbwMbwMbwMbwMbwMbwMbwMbwMbwMbNibNjbfubyfbGMbNkbNlbNmbLxbNnbGYbNobNpbNpbNqbNqbNrbNqbNqbRlbRkbGYahyahybKdbecbDMbDNbKebNtbFubNubKhbNvbNwbNxbKhbNybFubNzbNAbNBbNCbNCbNCbNCbNCbNCbNCbNCaahaahaZdaZHbEgbNDbNEbNFbQAbNHbFJbFJbNIbFJbNJbEgbNKbNLbNMbNNbNObKBbNPbNQbNRbNSahyahyaTobNTbetbNUaToahyahybMkbNVbNWbNXbNYbSkbUXbMnbMobWTbMqbMrbOebOfbOgbKSbOhbOibOjbOkbKWbOlbOmbOnbOobOpbOqbOrbOsbOtbOtbOubOvbOqbOtbOwbOtbOxbOybOzbOAbOBbOCbODbOEbOEbOFbOEbOGbOHbOIbOJbOKbLdaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOaaabtEbNdbtGaaabtEbNdbtGaaabtEbNdbtGaaabtEbNdbtGaaaaadaadbLjaahbLkbNebNfbNgbNfbNgbNfbNebLkahyahyaahaahbtHbNhbIibtHbtHaahaahaahaahaahaahaahaahaahaahaahbtHbtHbtHbwMbwMbwMbwMbwMbwMbwMbwMbwMbNibNjbfubyfbGMbNkbNlbNmbLxbNnbGYbNobNpbNpbNqbNqbNrbNqbNqbRlbRkbGYahyahybKdbecbDMbDNbKebNtbFubNubKhbNvbNwbNxbKhbNybFubNzbNAaGUbNCbNCbNCbNCbNCbNCbNCbNCaahaahaZdaZHbEgbNDbNEbNFbQAbNHbFJbFJbNIbFJbNJbEgbNKbNLbNMbNNbNObKBbNPbNQbNRbNSahyahyaTobNTbetbNUaToahyahybMkbNVbNWbNXbNYbSkbUXbMnbMobWTbMqbMrbOebOfbOgbKSbOhbOibOjbOkbKWbOlbOmbOnbOobOpbOqbOrbOsbOtbOtbOubOvbOqbOtbOwbOtbOxbOybOzbOAbOBbOCbODbOEbOEbOFbOEbOGbOHbOIbOJbOKbLdaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaaaadaaaaaaaaaaadaadaadaaaaaaaaaaaaaaaaaaaaaaadaaaaadaadaahaahaahbOLbOMbONbOObOPbOQbOLbORahyahyaahaahbtHbOSbIibOTbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbOUbOVbOWbOXbOYbOZbzHbPabPbbPcbPdbPebPfbPgbImbInbIobPhbPibLxbPjbGYbPkbPlbPmbNpbNpbSzcpCcpubRlcGibGYahyahybKdbecbcnbecbPobHcbFubPpbKhbPqbPrbPsbKhbPtbFubPubPvbPwbNCbPxbPybPzbPAbNCbPBbNCbNCaahaZdaZHbEgbPCbPDbPEbPEbPFbPEbPEbPGbFJbPHbEgbPIbPJbPKbPLbPMbPNbPIbPJbPKbEjbPObPPaToaZjblDbHCaToaToahybMkbPQbPRbPSbPTbPUbPVbPWbPXbPYbPZbQabQbbQcbQdbKSbQebQfbQgbQhbKWbQibQjbQkbMBbQlbQmbQnbQobQpbQqbQrbQsbQtbQpbQubQvbQwbMPbMQbQxbQybQzbMUbMVbWWbQBbOJbQCbQDbQEbOJcAfbLdaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczaczacAaczaczacOacAaadaadaadaadaaaaaaaaaaadaadaadacOaadaaaaahaahaahbNgbQFbQGbQHbQHbQIbNgahyahyahyaahaahbtHbQJbQKbQLbQLbQLbQLbQLbQLbQLbQLbQLbQLbQLbQLbQLbQLbQMbQNbQObQPbQQbQRbQSbQTbQUbQVbQWbQXbQYbQZbyfbJRbRabRbbRcbRdbRebGYbRfbRgbRhbNpbNpcGQbRgcIgbRlcNkbGYahyahybKdbecbcnbRmbRnbRobRpbRqbRrbRsbRtbRubRvbRwbFubRxbPvbRybNCbRzbRAbRBbRBbRCbRDbREbNCaahaZdaZHbEgbRFbRGbFJbRHbRIbFJbFJbFJbFJbRJbEgbupbTlbTkbRNbRObRPbRObRPbvEbRTbRUbRUbRVbRWbetaUvbvFaToahybMkbRYbRZbSabNWbSbbScbSdbSebSfbSgbShbSibMpbvIbKSbXibQfbSlbSmbKWbKWbKWbKWbKWbSnbSobSpbSpbSpbSpbSpbSqbSrbSqbSqbSqbSqbSqbSsbStbSubSvbSwbSwbSwbLdbLdbSxbSycNtbSxbLdbLdaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahbOLbSAbQGbQHbQHbSBbOLbORahyahyaahaahbtHbSCbIibSDbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbSEbSEbSFbSGbSEbSHbSIbSJbSKbSLbSMbSNbSObSPbSLbSLbSLbSLbSLbSLbSQbSRbSQbSSbSSbSQbSTbSQbSUbSQbGYahyahybKdbecbcnbSVbbobbobFubFubFubFubFubFubSWbFubFubSXbSYbSZbNCbTabTbbTcbTdbNCbTebTfbNCaahaZdaZHbEgbFLbvJbEgbEgbThbTibTibTibTibEgbEgbTjbTkbTlbTmbTnbTkbTlbTkbTobTpaUvaUvaUvaUvbTqbTrbTsaToahybMkbGxbTubTvbTubTtbScbTxbTybVhbTAbTBbTCbTDbTEbKSbTFbTGbTHbTIbTJbTKbTLbTMbTNbTObTPbTQbTRbTSbTTbSpbTUbTVbTWbTXbTYbTZbSqbUabUbbSubUcbUdbUebSuaahaahbSxbUfbUgbSxaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -9932,9 +9932,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaaaaaaahaahcjgcsdcknckncsecsfcsgcshcshcsicshcsjcskcslcsmcsncsncsncsocspcsqcsrcsqcsqcsqcsscsqcsqcsqcstcsqcsqcsqcsscsqcsqcsqcstcsqcsqcsucsvcswcsxcsycswcswcsvdBPcswcswcszcsAcsBcrucrucrucricrucsCcswcsDcswcsEcswcswcswcsFcswcsvcswcsGcsHcsIcrucsJcsRahyahyahyahyahyctmcqtcrKcrLcsMcsMcsMcrLcpBcqtctmahyahyahyctucsOcrOcsPcsQcumcsSahyahyahycMYcJacJacNfcEVcEVcEVcEVcEVcrQcrQcwtctdcsXcwtcwvcsXcsYcwwctbcsYctbctecxOcwxcrQcrQaahaahcrXcrXcrXcrXcrXctfctgcthcrXctictjcrZctkctlcurcrZcrZcrZcrZcrZcsacsacsacsactnctoctpcsactqctrcscctscttcuTcsccsccsccsccscaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaaaaaaaabLjbLjcjgctvctwcALctycmacjgbRMctActBctCctDctEctFctGctHcrfcrfcrfctIctJctKcrfctLctMctNcrfctFctOcrfcrfctPctQctRctSctTctQctQctUctVctWcrocrpctXctYctZcuacubdCbcuadCfcuacuccudcuacuacuacubcuecufcuacubcuacugcuacuhcuicuacuacubcuacujcrucukcruculcuYahyahyahyahyahyctmcuncuocrLcsMcupcsMcrLcuqcunctmahyahyahycvacqycrOcrPcqycqycvaahyahyahycMYcPocJacPvcJacQdcEVcEVcEVcrQcxScsYcwrcwscwscwscwscwscwsczmczlczoczncPbcPbcBjcrQaahaahcrXcuucuvcuucrXcuwcuxcuKcrXcuzcuAcrZcuNcuCcuDcrZcuEcuFcuEcrZcuGcuHcuGcsacuIcuJcvzcsacuLcuMcsccwEcuOcuPcsccuQcuRcuQcscaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadcuScuScvgcuUcuScuVcuWcuScuScuScuXcvocuZcuXcvrcvbcuXcvccvdcvecvfcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpjcvNcvhcrFcvicvjcpjcpjcpjcpjcrIcqfcqfcqfcqfcqgcpjbRRcvlcqdcpjcrIcqfcqgcpjcrIcqfcqgcpjcvmcrucrucrGcvncpjcpjahyahyahyahyahycwjcvpcuocrLcrLcrLcrLcrLcuqcvqcwjahyahyahycqvcwqcrOcrPcqycvscqvahyahyahycRUcWQcJacJacJacJacEVcEVcWRcrQcBkcsYcsYcsYcvucvucvucvucvuctbcDpcwzcsYcsYcsYcducrQaahaahcrXcvwcvxcvwcrXcrXcvycrXcrXcwFcwGcrZcrZcvBcrZcrZcvCcvDcvCcrZcvEcvFcvEcsacsacvGcsacsacvHcvIcsccsccvJcsccsccvKcvLcvKcscaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMaadaaacxfcvOcvPcvQcvRcvScvTcvUdEKdEJcvXcvYcvZcwacwbcwccuXcpXcpXcpXcpXcpXaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahcpjcwdcwecwfcwgcwdcpjdELdELdELahyahyahyahyahyahycpjcwhcwicwhcpjahyahyahyahyahyahyahycxAcqicqicqicwkcqicxAahyahyahyahyahyahycovcuncwlcwmcwncwocuncuncuqcwpcovahyahyahycsKcqycrOcrPcqycqycsKahyahyahyczZcZMcJacJadcEdcLcDncEVcEVcrQcvucvucsYcsYcBicDqdBUcxPbdUctbcxRcsYcFdcFdcFdcFdcrQaahaahcrXcwBcwCcwDcwDcwDcwJcwHcwLcwKcwUcwTcwXcwVcwMcwNcwMcwOcwPcrZcwQcwRcwScwScwScyacyecybcyqcyfcwYcwZcxacxbcxccxbcxdcxecscaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMaadaaacxfcvOcvPcvQcvRcvScvTcvUdEKdEJcvXcvYcvZcwacwbcwccuXcpXcpXcpXcpXcpXaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahcpjcwdcwecwfcwgcwdcpjdELdELdELahyahyahyahyahyahycpjcwhcwicwhcpjahyahyahyahyahyahyahycxAcqicqicqicwkcqicxAahyahyahyahyahyahycovcuncwlcwmcwncwocuncuncuqcwpcovahyahyahycsKcqycrOcrPcqycqycsKahyahyahyczZaGWcJacJadcEdcLcDncEVcEVcrQcvucvucsYcsYcBicDqdBUcxPbdUctbcxRcsYcFdcFdcFdcFdcrQaahaahcrXcwBcwCcwDcwDcwDcwJcwHcwLcwKcwUcwTcwXcwVcwMcwNcwMcwOcwPcrZcwQcwRcwScwScwScyacyecybcyqcyfcwYcwZcxacxbcxccxbcxdcxecscaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMaadaaacxNcxgcxgcxgcxgcvScvTcxhcxhcxicuXcxjcxkcxlcxmcxncuXcxocxpcxqcxraahaahaahaahaahcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxscxtcxucxvcxwcwhcwhcwhcwhcwhcwhcwhcwhcwhcwhcwhcxxcxycwhahyahyahyahyahyahyahyahycxzcyBcxBczkcxDcyBcxzahyahyahyahyahyahycovcovcxEcxFcxGcxHcxIcxJcxKcovcovahyahyahycumcsScxLcxMcqyctucsOahyahyahyczZczZdcYdcEdcEdcEcJacDnddacrQcEFcxPcsYcsYcxQcxQcxQcxQcxQctbcxRcsYcFdcFdcFdcFbcrQaahaahcrXcxVdEMcxXcxYcxZcytcyrcrXcyccydcrZcAkcyucygcyhcyidENcykcrZcyldEPcyncyocypcAqcAucsacyscAxcBocBncyvcywcyxcyydEQcyAcscaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMczTcyCcyDcyEcyFcxgcxgcvScyGcyHcyIcyJcyKcyLcyMcyNcyOcyPcuXcxqcxqcxqcxrcxrcxrcxrcxrcxrcxrcyQcyRcyScyScyScyScyScyScyScyScyScyScyScyTcyScyUcyVcyWcyXcyYcyVcyZczaczbczaczaczaczaczaczaczaczaczaczccwhahyahyahyahyahycxzcxzcxzcxzczdczebTgczgczhcxzcxzcxzcxzahyahyahyahycovcovcovcziczjczicovcovcovahyahyahyahyahycvacrOcrPcqycvaahyahyahyahyahyczZczZczZczZddeczZczZczZcrQcxQcxQcDocwycwycwycFccHvcHrcJzcHxcsYcFdcFdcFdcFdcrQaahaahcrXcrXcrXcrXcrXcrXcBqcrXcrXczpcuAcrZcrZcBrcrZcrZcrZcrZcrZcrZcsacsacsacsacsacBucsacsacuLcBvcsccsccsccsccsccsccsccsccscaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMczTcyCcyDcyEcyFcxgcxgcvScyGcyHcyIcyJcyKcyLcyMaGXcyOcyPcuXcxqcxqcxqcxrcxrcxrcxrcxrcxrcxrcyQcyRcyScyScyScyScyScyScyScyScyScyScyScyTcyScyUcyVcyWcyXcyYcyVcyZczaczbczaczaczaczaczaczaczaczaczaczccwhahyahyahyahyahycxzcxzcxzcxzczdczebTgczgczhcxzcxzcxzcxzahyahyahyahycovcovcovcziczjczicovcovcovahyahyahyahyahycvacrOcrPcqycvaahyahyahyahyahyczZczZczZczZddeczZczZczZcrQcxQcxQcDocwycwycwycFccHvcHrcJzcHxcsYcFdcFdcFdcFdcrQaahaahcrXcrXcrXcrXcrXcrXcBqcrXcrXczpcuAcrZcrZcBrcrZcrZcrZcrZcrZcrZcsacsacsacsacsacBucsacsacuLcBvcsccsccsccsccsccsccsccsccscaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMczrczsczrczscztczuczvczwczxczyczzcxgcArczBczCczDczEcuXcuXczFczGczGczGczGczGczGczGczGczGczGczHcxqcxrcxrcxrcxrcxrczIczIczJcxrcOHczKcxqcxrczLczMczNczOczPcwhczQczQddgddmddkczQczQcwhcwhcwhcwhczRcwhahyahyahyahyahycxzczSczScABczUczVczWczXczYcAIcAacAacxzaahahyahyahyahyaahaahczicAbcziaahaahaahahyahyahyahyahycqvcAccAdcAecqvahyahyahyahyahyahyahyahycBgcQzcBgahyaahcrQcJNcxTcKMcxTcxTcFacFacKNcxTcxTcMecDrcFdcFdcFdcmYcrQaahaahaahaahaahaahcAicAjcBxcAlcAicAmcAncAocApcCccBbcAoaahaahaahaahaahaahaahcAscAtcClcAvcAscAwcCmcAycAzcAAcBAcAyaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMcACcADcACcAEcAFcxgcxgcvScvTcAGczzcAHcBTcAJcAKcMdbWMcuXcxqcANcxqcxqcxrcxrcxrcxrcxrcxrcxrcxrcAOcxrcxraahaahaahcxrcAPcAPcAPcxrcxrcxrcxrcwdcwdcAQcARcAScwdcwdcwhcwhcwhcwhcwhczQcwhcwhaahaahcwhczRcwhaahahyahyahyahycxzcATczecAUcAVczeczeczgcAWcAXczecAYcxzaahahyahyaahaahaahaahczicAZcziaahaahaahcBacCScBccBacqvcqvcBdcBecBfcqvcBgcBgcBgcBgcBgahyahyahycBgcQzcBgaahaahcrQcvucvucMXcGzcGAcGAcGAcNJcGAcGzcNMcsYcNVcNVcNWcNXcrQaahaahcAicAicAicAicAicBmcDycDxcAiczpcBpcAocDDcDCcBscAocAocAocAocAocAscAscAscAscBtcDMcDNcAscBwcBvcAycFkcBycBzcAycAycAycAycAyaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMcEBcyCcBBcBCcxgcxgcxgcBDcvTcAGczzcBEcuXcvrcvbcuXcuXcuXcxrcANcBFcxrcxraahaahaahaahaahaahcxrcBGcBHcxraahaahaahcBIcBIcBJcBIcBIaahaahaahaahcwdcBKcxucxvcwdaahaahaahaahaahcwhczQcwhaahaahaahcwhczRcwhaahaahaahahyahycxzcxzcxzcxzcBLcBMcBNcBOcbocxzcxzcxzcxzaahaahaahaahaahaahaahczicAbczicziczicBacBacBQcBRcBacBScEIcrOcrPcqycBUcBgcBVcBWcBXcBgcBgahyahycBgcQzcBgaTWaahcrQcNRcxPcMXcGzcHscHtcHucNUdFccGzcNMcsYcPccPccPccOVcrQaahaahcAicBZcCacCbcAicAicFlcAicAicCdcvAcAocFmcCecAocAocCfcCgcChcAocCicCjcCkcAscAscFncAscAscvHcFycAycAycCncAycAycCocCpcCqcAyaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -9947,7 +9947,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaaaaadbkQaahaahaahaahaahcuScuScuScuScCtcCtcCtcCtcCtcCtaahahycIccJccJccJccIcahyahyaahcJecKgcKhcKicJecKjcKjcKjcBIcBIcKkcKlcBIcKmcKncKocKpcKqcKrcKscKtcKqcKucGedeccKvcEwcKwcKwcKwcCKahyahycwhczRcwhaahaahaahaahaahcxzcKxczecHScKyczecKzczgcKAcHScKBcKBcxzaahaahaahaahaahaahaahczicAbcziaahcKCcKCcNYcKEcKFcKCcKCcKCcKGcKHcKIcKCcKCcKCcKCcKCcKCcKCcKCaahcBgcHqcBgaahaahcrQcrQcQAcQBcQCcrQcQDcQEdDydDxcsYcsYcQGdDzcQGdDAcQGaahaahaahcHycKOcKPcKQcKRcKQcMzcMycKUcDAcwIcKVcMBcMAcKYcKZcKYcLacLbcHEcLccLdcLecLfcLecMCcMDcLicwWcHNcLjcLkcLlcLmcLncLmcLocLpcHOaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaahyaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahycIccLqcLrcLscIcahyaahaahcJecLtcLudEXcJecLwcLxcLycLzcBIcLAcBIcCGcCGcLBcCGcLCcKqcLDcLEcLFcKqcLGcLGcLGcLGcLGcLGcLGcLGahyahyahycwhczRcwhcziaahaahaahaahcxzcxzcxzcxzcLHcLIcLJcLKcLLcxzcxzcxzcxzaahaahaahaahaahaahcziczicAbczicKCcKCcLMcLNcLOcLPcLQcLRcLScLTcLUcLVcLWcLXcLYcLZcMacMbcMccKCcKCcBgcHqcBgahyaahaahcrQcrQcrQcrQcrQcrQcrQcrQcrQdDCdDBcQGcQGcQGcQGcQGaahaahaahcHycMidEYcMkcMlcMmcMndBWcHycyccydcHEdBYdBXdCadBZdCcdEZdCedCddCgdFadCidChdCkdCjdClcHIcysdCmdCodCncMEcMFcMGcMHdFbcMJcHOaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahybkQcIccMKcNZcMMcIcbkQcMNcMNcMNcMNcMPcMOcKjcMQcMRcMScMTcMUcMVcMWdDDcoucMZcNacMUcNbcNccNdcNecrVcOpcNhcNicNjcQncLGcNlcLGcLGahyahycwhcNmcNncziczicziczicziczicNocNpcxzcNqcxzcNrcxzcNqcxzcEDcEDcziczicziczicziczicziczicUqcXxcUucKCcNucLPcLPcNvcNwcNwcNxcNycNzcNAcNBcNCcNDcNEcNEcNEcNFcLPcNGcKCcZgdDEcBgahyahyaahaahaahaahaahaahaahaahcWudDFdbMdbMdDGcWuaahaahaahaahaahaahcHycHycHycHycHycHycHycHycHyczpcuAcHEcHEcHEcHEcHEcHEcHEcHEcHEcHIcHIcHIcHIcHIcHIcHIcHIcuLczqcHOcHOcHOcHOcHOcHOcHOcHOcHOaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahybkQbkQcOsahycOMbkQbkQcMNcOacObcOccOdcOecOfcOgcOhcOicMTcOjcOkcOlcOlcOmcOncOocPFcOqcNccNdcNecOrcPPcOtcOtcOudDHcOvcOtcOwcLGahyahycwhcOxcOycOzcOAcOBcOCcOCcOCcOCcOAcOAcOAcODcOEcOFcOAcOCcOCcOGcOCcOCcOCcOCcOCcOCcOCcOCdlDdBIdBHcKCcOKcLPcLPcOLcLPcLPcPYcONcOOcOPcOQcONcPYcLPcLPcLPcORcLPcLPcKCdBJcHqcBgahyahyahyaahaahaahaahaahaahaahcWudDIdbMdbMdDJcWuaahaahaahaahaahaahcPdcPecPfcPgcPhcPicPjcPkcPdcPlcPmcPncuscPpcPpcPqcPpcutcPrcPscPpcPtcPpcPucPpcPpcvkcPncPwcPlcPxcPycPzcPAaEycPCcPDcPEcPxaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahybkQbkQcOsahycOMbkQbkQcMNcOacObcOccOdcOecOfcOgcOhcOicMTcOjcOkcOlcOlcOmcOncOocPFcOqcNccNdcNecOrcPPcOtcOtcOudDHcOvcOtcOwcLGahyahycwhcOxcOycOzcOAcOBcOCcOCcOCcOCcOAcOAcOAcODcOEcOFcOAcOCcOCcOGcOCcOCcOCcOCcOCcOCcOCcOCdlDdBIdBHcKCcOKcLPcLPcOLcLPcLPcPYcONcOOcOPcOQcONcPYcLPcLPcLPcORcLPcLPcKCdBJcHqcBgahyahyahyaahaahaahaahaahaahaahcWudDIdbMdbMdDJcWuaahaahaahaahaahaahcPdcPecPfcPgcPhaGYcPjcPkcPdcPlcPmcPncuscPpcPpcPqcPpcutcPrcPscPpcPtcPpcPucPpcPpcvkcPncPwcPlcPxcPycPzcPAaEycPCcPDcPEcPxaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahycQscPGcPGcPHcPGcPIcPJcPKcMNcPLcPMcPMcPNcPOcRfcPQcPRcPScMTcPTcPUcOocPVcPWcOocPXcRucPZcNccQacQbcQccxUdDKdDMdDLdDNcQicQjcQkcLGahyahycwhcQlczQczicziczicziczicziczicziczicEDcEDcEEcNscEDczicziczicziczicziczicziczicziczicQmcEDdBKcKCcQocQocLPcQpcQqcQrcRJcQtcOOcQucQvcQwcRJcQxcQocLPcQycQqcQocKCdCRcHqcBgahyahyahyahyaahaahaahaahaahaahcWucWudDPdDOcWucWuaahaahaahaahaahaahcPdcQJcQKcQKcQLcQKcQKcQMcQNcQOcQPcQQcQRcQRcQRcQScQRcQTcQUcQVcQWcQXcQRcQYcQRcQRcQRcQQcQZcRacRbcRccRccRccRdcRccRccRecPxaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbLjbLjaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahycSAcRgcRhcRicRjcRkcRlcRmcRncRocRpcRqcRrcRscRtcSLcRvcRwcRxcMTcRycPUcRzcRAcRBcRCcOlcRDcREcRFcRGcRHcRIcTadDQcRKcRLcRMcRNcROcRPcLGahyahycwhcRQcwhcziahyahyahyahyahyahyahycziczicziczicziczicziaahaahaahaahaahaahaahaahaahcziczicRRdCScKCcRTcRWcRVcLPcRWcRXcRJcRYcOOcOPcOQcRZcRJcRTcRWcLPcRVcRWcSacKCdCTcSccBgahyahyahyahyahyaahaahaahaahaahahydDRdbMdDScWuaahaahaahaahaahaahaahcPdcSdcSecSfcSgcShcSicSjcSjcSkcSlcSmcSlcSlcSlcSncSlcSlcSlcSocSpcSqcSqcSrcSqcSqcSqcSscStcSkcSucSucSvcSwcSxcSycSycSzcPxaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahbLjbLjaahaahaahaahaahaahaahaahaahbkQbkQahyahyahybkQbkQcTZcSBcSCcPMcSDcPMcSEcSFcSGcSHcPMcPMcSIcSJcSKcUlcSMcSNcSOcMTcSPcSQcSRcSScSTcSUcSVcSWcSXcSYcSZcNecRIcUscTbcOtcTccTdcTecTfcTgcLGahyahycwhcRQcwhahyahyahyahyahyahyahyahyahyahyahyahyaahaahaahaahaahaahaahaahaahaahaahaahaahczicThcRScKCcTicTjcTkcLPcTlcTjcRJcTmcTncTocOQcTmcRJcTjcTjcTpcLPcTlcTqcKCcSbcTrcBgahyahyahyahyahyahyahyahyahyahyahydDTdbMdDUcWuaahaahaahaahaahaahaahcPdcPdcTscTtcTucTvcTwcTxcPdcPncPncPncTycTzcTzcTAcTBcTCcTDcTEcTFcTGdCUcTHcTzcTzcTIcPncPncPncPxcTJcTKcTLcTMcTNcTOcPxcPxaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -9957,11 +9957,11 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahbkQcIccUEcUEcWzcWAcVucXucWCcWDcWEcWFcWGcWHcWIcWJcWJcWJcWFcWFcWFcWKcWLcPMcWMcWNcMTcMTcXycWPcwAcvvcXycWPcWScWTcWUcVYcNecWVcWWcWXcWicWYcWZcXacXbcXccVmdDXcXecXecXfczQcWhcXgcXhcXicXjcXkcXlcXhcXmcXhcXhcWhcWhcXHcXocXocXocXocXocXpcXqcXHcXpcXqcXqcXrcXscXtcKCcKCcNYcKEcKFcKCcKCcKCcYfcXvcXvcKIcYfcKCcKCcKCcNYcKEcKFcKCcKCcXtcXwdCXcXqcXqcZncXzcXzcXzcXAcWucWucWudDYcWucWwdDZcWucWucWucXBcXCcXCcWucWucWucWucZncXzcXzcXAcWucWucWucWucWucWucWucZncXzcXzcXAcWucXDcXEcXFcWucXGcXGcXGcXGcXGaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahbkQcIccIccIccIccIcbkQcZocXIcXJcVDcXKcXLcUMcUNcXMcXMcXNcUOcVEcXOcXPcWFcXQcXRcXScXTcXUcXVcXWcXXcXYcXZcYacYbcYacYccYdcNecYecWacNcdaTcYgcYhcYicYjcYkcVmcRQczQcYlczQczQcYmcYncYocYpcYqcYncYrcYpcYscYtcYucYvcYwcYxcYycYxcYxcYzcYxcYAcYBcYxcYxcYCcYDcYEcYFcYGcYHcYCcYxcYIcYxcYycYJcYKcYxcYxcYxcYLcYxcYMcYNcYycYxcYxcYxcYCcYxcYGcYOcYPcYPcYQcYRcYScYRcYTcYRcYUcYVdCYcYRcYScYWcYRcYRcYXcYScYYcYRcYZdCYcYXcYRcZacYRcYRcZbcYRcYRcZccYUdCYcYRcYRcZdcYRcYRcYScYRcYXcZecZfcXFdCZcXGcZhcZicZjcXGaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahbkQcIccZkcZkcZlcZmdbDdbdcZpcZqcVMcZrcPMcUMcUNcZscZtcZucVGcVHcZvcZqcZwcZxcZycZqcZzcZAcZBcZCcZDcZEcZFcZGcZHcZGcZIcZJcZKcZLdmbcZNcZOcZPcZQcZRcZScZTcVmcRQcwhcwhcZUcwhcZVcZWcZXcWhcZVcZWcZYcWhcZVcZZdaadabdacdaddaddaddaedaddaddafdaddaddaddagdaedahdaidajdakdagdaddajdaddaddaddaedaddaddaddaddaddafdaddaddaddaddaddagdakdajdaldaddaedagdamdamdamdandamdamdaodamdamdamdapdamdamdaqdaodardasdatdaudaqdamdandamdamdaodamdamdamdamdamdamdamdavdamdamdaudamdaqdawdaxdaydazdaAdaBdaCdaDcXGaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahahycIcdaEdaFdaGcNZahycTZdaHdaIdaJdaKcTSdaLcUNdaMdaNdaOcUNcPMdaPcPMdaQcPMcPMdaRdaSdaSdbIdaUdaVdaWdbIdaUdaSdaXdaYdaZdbadbbdbcdbNdbedbfdbgdbNdbedbcdbccRQcwhdbhdbidbjcZVdbkdbldbmcWhdbndbldbocZVcWhdbpcXhdbqdbrdbrdbrdbsdbtdbrdbrdbudbrdbrdbvdbwdbxdbydbzdbAdbBdbCdcedbCdbCdbEdbFdbCdbCdbGdbCdbCdbCdbHdbCdbCdcfdbCdbBdbJdbzdbydbKdbLdbvdbMdbMdcrdbMdbMdbMdbOdbMdbMdbMdbPdbMdbMcWwdbQdbRdbScXEdbTcWwdbMdcrdbMdbMdbUdbMdbVdbMdbMdbMdbVdbMdbMdbMdbMdbWdbMcWwdbWdbXcXFdbYcXGdbZdcadcbcXGaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahahycIcdaEdaFdaGcNZahycTZdaHdaIdaJdaKcTSdaLcUNdaMdaNaImcUNcPMdaPcPMdaQcPMcPMdaRdaSdaSdbIdaUdaVdaWdbIdaUdaSdaXdaYdaZdbadbbdbcdbNdbedbfdbgdbNdbedbcdbccRQcwhdbhdbidbjcZVdbkdbldbmcWhdbndbldbocZVcWhdbpcXhdbqdbrdbrdbrdbsdbtdbrdbrdbudbrdbrdbvdbwdbxdbydbzdbAdbBdbCdcedbCdbCdbEdbFdbCdbCdbGdbCdbCdbCdbHdbCdbCdcfdbCdbBdbJdbzdbydbKdbLdbvdbMdbMdcrdbMdbMdbMdbOdbMdbMdbMdbPdbMdbMcWwdbQdbRdbScXEdbTcWwdbMdcrdbMdbMdbUdbMdbVdbMdbMdbMdbVdbMdbMdbMdbMdbWdbMcWwdbWdbXcXFdbYcXGdbZdcadcbcXGaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahbkQcIccZkcZkdccdcddcDdczdcgdchdcidaPcPMcUMdcjdckdcldcmdcndcodcpcTQdcpdcmdcodcqdcJdcsdctdcudcvdcwdcxdcydcxddbdcAdcBdcCddndmkdcFdcGdcHdcIddtdcKczfdbcdcMcwhdcNdbidcOcZVdcPdcQdcRcWhdcSdcTdcUcZVcWhcWhcWhcWhcXHcXocXocXocXocXocXpdcVcXHcXpdcWdcXdpPdqIdpQdcXdcWddDdcVcXHcXocXocXocXocXpdcVcXHcXocXocXocXocXpdcVddDddcddddskdtrdstddddddcZncXAddhcZncXzcXAddhcZncXzcXAddhcZncXAddiddjdBAdBCdBBddjddiddPddhcZncXzcXzcXzcXzcXAddhcZncXzcXzcXzcXzcXAddhddPddodBEdBDdBFddscXGcXGcXGcXGcXGaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahbkQcIccIccIccIccIcbkQddWdducXJddvddwcTSddxcPMcUOcVFcVEcPMcPMddyddzcWLddAddBddCdeedcsdcudcudcvdcwddEddEddFddGddHddIdcCddJddKddKddKddLddMddNddNdBGdbccRQcwhdekddQddRcZVddSddTddScWhddUddVddUcZVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadeqddXddYddZdeadebdeqaaaaaaaaaaaaaaadeddeddeddeddeddeddedaaaaaaaaaaaaaaadeWdefdegdehdeidejdeWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfbdeldemdendeodepdfbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfcderdesdetdeuddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahbkQcIcdevdevdewcZmdbDdbddexcZqdeydezcVNcUMcPMdcjdclcVHcSHcPMcWLcWLcVIcVJdeAdeBdeCdeDdcudeEdeFdeGdeHdeIdeJdeKdeLdeMdeNddJddKddKdeOdePdeQdeRddKdeSdbccRQcwhahyahyahycZVddSdeTddScWhddUdeUddUcZVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVaaaaaadfhdeXdeYdeZdeadfadfmaaaaaaaaaaaadeddeddeddeddeddeddeddeddedaaaaaaaaaaaadfBdfddegdfedffdfgdfBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfIdfidfjdfkdeodfldfIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfLderdesdfndfoddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahahycIcdfpdfqdfrcNZahycTZdfscPMcUMcWLcVIdeydftcZqdfucZqdftcZqdfvcWLcPMcPMdfwdfxdfydfzdcudcudfAdfQdfCdfDdfEddbdfFdfGdfHddndfXdfJdfKdfYdfMdfYdfNdbcdbccRQcwhahyahyahyahyddSdfOddScZVddUdfPddUdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdgwdfRdfSdfTdfUdfVdfWdhgdcWaaaaaaaaadeddeddeddeddeddeddeddeddeddeddedaaaaaaaaaddcdhudfZdgadgbdgcddcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddidgddemdgedgfdggddiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddodghdgidgjdgkddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahahycIcdfpdfqdfrcNZahycTZdfscPMcUMcWLcVIdeydftcZqdfucZqdftcZqdfvcWLcPMcPMdfwdfxdfydfzdcudcudfAaIndfCdfDdfEddbdfFdfGdfHddndfXdfJdfKdfYdfMdfYdfNdbcdbccRQcwhahyahyahyahyddSdfOddScZVddUdfPddUdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdgwdfRdfSdfTdfUdfVdfWdhgdcWaaaaaaaaadeddeddeddeddeddeddeddeddeddeddedaaaaaaaaaddcdhudfZdgadgbdgcddcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddidgddemdgedgfdggddiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddodghdgidgjdgkddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahahycIcdevdevdgldcddcDdczdgmcTSdgncWLcPMdgocTTcTSdgpcTScTScTSdgpdgpdgqcPMdgrdgsdaSdgtdcudgudgvdhzdgxdfDdgydgzdgAddIdgBdgCdgCdgCdgCdgCdgCdgCdgCdbcdgDdgEcwhcwhahyahyahydgFdgGdgHaaadgIdgJdgKdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdgLdgMdgNdgOdgPdgQdgRdfadeqaaaaaaaaadeddeddeddeddeddeddeddeddeddeddedaaaaaaaaadeWdfddgSdgTdeidfgdeWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfbdfidemdgUdgVdfldfbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfcderdgWdgjdgXddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahbkQcIccIccIccIccIcbkQddWdgYcXJcPMcWLcPMcPMdgZdhacWLcPMcPMdhacWLcWLdhbdhadhcdhddaSdhedcudcudEadhEdfCdhhdhidgzdhjdfGdhkdhldhmdhndhodhpdhqdhrdhsczQczQdhtczQcwhahyahyaaaaaaaaaaaaaaaaaaaaaaaadeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdhIdfRdhvdfTdhwdhxdgRdhydfhaaaaaaaaadeddeddeddeddeddeddeddeddeddeddedaaaaaaaaadhMdhAdhBdgadhCdhDdhMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadifdhFdemdgedhGdhHdifaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiydhJdesdhKdhLddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahbkQbkQahyahyahybkQbkQdiLdhNdhOdhPcVIdhQdhRdhSdhTdhUdhVdhWdhXdhYdhZdiadibdicdiddaSdiedcudcudEadiYdfCdfDdigdgzdfFdihdgBdiidijdikdildimdindiodipcXecXediqdircwhahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVaaaaaadfmdeXddYddZdgRdfadfmaaaaaaaaadeddeddeddeddeddeddeddeddeddeddedaaaaaaaaadfBdfddgSdehdeidfgdfBaaaaaaaaadisditdiudiudiudivdiwaaaaaaaaadfIdfidemdendhGdfldfIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfLderdesdixdgXddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/maps/polaris-2.dmm b/maps/polaris-2.dmm
index 9a3b1721e5e..46a82f0e156 100644
--- a/maps/polaris-2.dmm
+++ b/maps/polaris-2.dmm
@@ -861,7 +861,7 @@
"qC" = (/obj/structure/table/standard,/obj/machinery/recharger,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start)
"qD" = (/obj/machinery/computer/security/nuclear,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start)
"qE" = (/obj/machinery/computer/shuttle_control/multi/syndicate,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start)
-"qF" = (/obj/structure/computerframe,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start)
+"qF" = (/obj/structure/frame{frame_type = "computer"; icon_state = "computer_0"},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start)
"qG" = (/obj/structure/table/standard,/obj/machinery/button/remote/blast_door{id = "syndieshutters"; name = "remote shutter control"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start)
"qH" = (/obj/structure/bed/chair/comfy/black,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership)
"qI" = (/obj/machinery/door/airlock/centcom{name = "Kitchen"; opacity = 1; req_access = list(150)},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership)
@@ -910,7 +910,7 @@
"rz" = (/obj/item/weapon/stool/padded,/obj/effect/floor_decal/corner/red/diagonal,/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/specops)
"rA" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets{pixel_x = 2; pixel_y = 3},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start)
"rB" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start)
-"rC" = (/obj/structure/computerframe,/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start)
+"rC" = (/obj/structure/frame{frame_type = "computer"; icon_state = "computer_0"},/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start)
"rD" = (/obj/structure/bed/chair/comfy/black{dir = 1},/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership)
"rE" = (/obj/machinery/vending/cola{name = "hacked Robust Softdrinks"; prices = list()},/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership)
"rF" = (/obj/structure/closet/secure_closet/freezer/kitchen{req_access = list(150)},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership)
diff --git a/maps/polaris-3.dmm b/maps/polaris-3.dmm
index 850b38a5053..3207a9d9c94 100644
--- a/maps/polaris-3.dmm
+++ b/maps/polaris-3.dmm
@@ -20,7 +20,7 @@
"at" = (/obj/item/weapon/scalpel,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
"au" = (/turf/simulated/shuttle/wall{icon_state = "swall_t"; dir = 8},/area/derelict/ship)
"av" = (/turf/simulated/shuttle/plating,/area/derelict/ship)
-"aw" = (/obj/structure/computerframe{anchored = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
+"aw" = (/obj/structure/frame{anchored = 1; frame_type = "computer"; icon_state = "computer_0"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
"ax" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/shuttle/plating,/area/derelict/ship)
"ay" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/shuttle/plating,/area/derelict/ship)
"az" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/shuttle/plating,/area/derelict/ship)
@@ -80,8 +80,8 @@
"bB" = (/obj/item/weapon/material/shard{icon_state = "medium"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
"bC" = (/obj/item/weapon/material/shard,/obj/structure/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
"bD" = (/obj/structure/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"bE" = (/obj/structure/cable,/obj/structure/computerframe{anchored = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"bF" = (/obj/structure/cable,/obj/structure/computerframe{anchored = 1},/obj/item/stack/cable_coil/cut,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
+"bE" = (/obj/structure/cable,/obj/structure/frame{anchored = 1; frame_type = "computer"; icon_state = "computer_0"},/obj/item/stack/cable_coil/cut,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
+"bF" = (/obj/structure/cable,/obj/structure/frame{anchored = 1; frame_type = "computer"; icon_state = "computer_0"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
"bG" = (/obj/structure/table/rack,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
"bH" = (/obj/structure/table/rack,/obj/item/clothing/suit/space/syndicate,/obj/item/clothing/head/helmet/space/syndicate,/obj/item/clothing/mask/breath,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
"bI" = (/obj/structure/table/rack,/obj/item/weapon/storage/toolbox/syndicate,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
@@ -197,6 +197,7 @@
"dO" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/airless,/area/tcomsat)
"dP" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/camera/network/telecom{c_tag = "Telecoms - Solar South"},/turf/simulated/floor/airless,/area/tcomsat)
"dQ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless,/area/tcomsat)
+"dR" = (/obj/structure/frame{frame_type = "computer"; icon_state = "computer_0"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/airless,/area/AIsattele)
"dS" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/tcomsat)
"dT" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/space,/area/tcomsat)
"dU" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/lattice,/obj/machinery/light,/turf/space,/area/tcomsat)
@@ -387,7 +388,6 @@
"hJ" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 21; pixel_y = 0},/turf/simulated/floor/tiled/dark,/area/tcommsat/entrance)
"hM" = (/turf/space,/area/syndicate_station/commssat)
"hN" = (/turf/simulated/wall/r_wall,/area/AIsattele)
-"hO" = (/obj/structure/computerframe,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/airless,/area/AIsattele)
"hP" = (/obj/machinery/teleport/station,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/airless,/area/AIsattele)
"hQ" = (/turf/simulated/floor/airless,/area/AIsattele)
"hR" = (/obj/item/weapon/material/shard{icon_state = "medium"},/turf/simulated/floor/airless,/area/AIsattele)
@@ -453,7 +453,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPagagagagagaBagagaiacacaMafagagaBagagagaLaobraabsajacacacacacacacajbraaaaaTauasagagagagbcagagaLalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwagagagagbxauasagagagagagagagagaBagaLadajbraaaaaaaaaaaaaaaaaaaaaaaaaaaaaTaabsajacacacacacacacajbraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBbBbCbDagaLaoajacacadasagagagagauacaobraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBagbEbFaLaoafbGbHbIaialbJbKaFbLaGavbMadakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBagbFbEaLaoafbGbHbIaialbJbKaFbLaGavbMadakaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsacadacaoafagagagagagaBagagaLadalavavaqaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabObPbQagagagagagagbRbSaLaobrbsbTavaqaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsacalbUagagagagagauadaobraaaabsbTaqaraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -599,7 +599,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahMhMhMhMhMhMhMhMhMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahMhMhMhMhMhMhMhMhMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahMhMhMhMhMhMhMhMhMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahNhNhNhNhNaTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahMhMhMhMhMhMhMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTaThNhNhOhPilhNhNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahMhMhMhMhMhMhMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTaThNhNdRhPilhNhNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahMhMhMhMhMhMhMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTaTaThNhNhRhQhShQhThNhNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahMhMhMhMhMhMhMhMhMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahUhVhQhWhXhQhQhYhNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahMhMhMhMhMhMhMhMhMhMhMhMhMhMhMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahQhQhQhZhZhZhQhQhNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/maps/polaris-4.dmm b/maps/polaris-4.dmm
index 5b7187b4393..c54e550a842 100644
--- a/maps/polaris-4.dmm
+++ b/maps/polaris-4.dmm
@@ -8,7 +8,7 @@
"ah" = (/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored)
"ai" = (/obj/item/weapon/circuitboard/teleporter,/turf/simulated/floor/airless,/area/mine/explored)
"aj" = (/obj/structure/girder,/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored)
-"ak" = (/obj/structure/computerframe,/turf/simulated/floor/airless,/area/mine/explored)
+"ak" = (/obj/structure/frame{frame_type = "computer"; icon_state = "computer_0"},/turf/simulated/floor/airless,/area/mine/explored)
"al" = (/obj/machinery/teleport/station,/turf/simulated/floor/airless,/area/mine/explored)
"am" = (/obj/machinery/teleport/hub,/turf/simulated/floor/airless,/area/mine/explored)
"an" = (/turf/simulated/floor/tiled/white/airless,/area/mine/explored)
diff --git a/maps/polaris-5.dmm b/maps/polaris-5.dmm
index c8ca0f7c697..bb438d4f593 100644
--- a/maps/polaris-5.dmm
+++ b/maps/polaris-5.dmm
@@ -602,7 +602,7 @@
"lD" = (/obj/structure/sign/greencross,/turf/simulated/wall/r_wall,/area/outpost/research/medical)
"lE" = (/obj/machinery/portable_atmospherics/canister/air/airlock,/obj/effect/floor_decal/corner/purple{dir = 9},/turf/simulated/floor/tiled/white,/area/outpost/research/dock)
"lF" = (/obj/effect/floor_decal/corner/purple,/turf/simulated/floor/tiled/white,/area/outpost/research/dock)
-"lG" = (/obj/structure/reagent_dispensers/water_cooler,/turf/simulated/floor/wood,/area/outpost/research/dorms)
+"lG" = (/obj/structure/reagent_dispensers/water_cooler{bottle = 1},/turf/simulated/floor/wood,/area/outpost/research/dorms)
"lH" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/wood,/area/outpost/research/dorms)
"lI" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/wood,/area/outpost/research/dorms)
"lJ" = (/obj/structure/table/glass,/obj/item/weapon/tape_roll,/turf/simulated/floor/wood,/area/outpost/research/dorms)
diff --git a/polaris.dme b/polaris.dme
index bc37b4ccb3b..6af4c66aa1e 100644
--- a/polaris.dme
+++ b/polaris.dme
@@ -373,7 +373,6 @@
#include "code\game\machinery\CableLayer.dm"
#include "code\game\machinery\cell_charger.dm"
#include "code\game\machinery\cloning.dm"
-#include "code\game\machinery\constructable_frame.dm"
#include "code\game\machinery\cryo.dm"
#include "code\game\machinery\cryopod.dm"
#include "code\game\machinery\deployable.dm"
@@ -384,6 +383,7 @@
#include "code\game\machinery\floodlight.dm"
#include "code\game\machinery\floor_light.dm"
#include "code\game\machinery\floorlayer.dm"
+#include "code\game\machinery\frame.dm"
#include "code\game\machinery\hologram.dm"
#include "code\game\machinery\holosign.dm"
#include "code\game\machinery\igniter.dm"
@@ -434,7 +434,6 @@
#include "code\game\machinery\computer\arcade.dm"
#include "code\game\machinery\computer\atmos_alert.dm"
#include "code\game\machinery\computer\atmos_control.dm"
-#include "code\game\machinery\computer\buildandrepair.dm"
#include "code\game\machinery\computer\camera.dm"
#include "code\game\machinery\computer\card.dm"
#include "code\game\machinery\computer\cloning.dm"
@@ -686,6 +685,7 @@
#include "code\game\objects\items\weapons\wires.dm"
#include "code\game\objects\items\weapons\circuitboards\broken.dm"
#include "code\game\objects\items\weapons\circuitboards\circuitboard.dm"
+#include "code\game\objects\items\weapons\circuitboards\frame.dm"
#include "code\game\objects\items\weapons\circuitboards\mecha.dm"
#include "code\game\objects\items\weapons\circuitboards\other.dm"
#include "code\game\objects\items\weapons\circuitboards\computer\air_management.dm"
@@ -1276,6 +1276,7 @@
#include "code\modules\mob\living\autohiss.dm"
#include "code\modules\mob\living\damage_procs.dm"
#include "code\modules\mob\living\default_language.dm"
+#include "code\modules\mob\living\inventory.dm"
#include "code\modules\mob\living\life.dm"
#include "code\modules\mob\living\living.dm"
#include "code\modules\mob\living\living_defense.dm"