diff --git a/baystation12.dme b/baystation12.dme
index 2d7b5948f0..b4d14db689 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -597,9 +597,6 @@
#include "code\game\objects\items\stacks\sheets\glass.dm"
#include "code\game\objects\items\stacks\sheets\leather.dm"
#include "code\game\objects\items\stacks\sheets\light.dm"
-#include "code\game\objects\items\stacks\sheets\mineral.dm"
-#include "code\game\objects\items\stacks\sheets\sheet_types.dm"
-#include "code\game\objects\items\stacks\sheets\sheets.dm"
#include "code\game\objects\items\stacks\tiles\light.dm"
#include "code\game\objects\items\stacks\tiles\plasteel.dm"
#include "code\game\objects\items\stacks\tiles\tile_types.dm"
@@ -617,6 +614,7 @@
#include "code\game\objects\items\weapons\flamethrower.dm"
#include "code\game\objects\items\weapons\gift_wrappaper.dm"
#include "code\game\objects\items\weapons\handcuffs.dm"
+#include "code\game\objects\items\weapons\improvised_components.dm"
#include "code\game\objects\items\weapons\kitchen.dm"
#include "code\game\objects\items\weapons\manuals.dm"
#include "code\game\objects\items\weapons\mop.dm"
@@ -627,7 +625,6 @@
#include "code\game\objects\items\weapons\RCD.dm"
#include "code\game\objects\items\weapons\RSF.dm"
#include "code\game\objects\items\weapons\scrolls.dm"
-#include "code\game\objects\items\weapons\shards.dm"
#include "code\game\objects\items\weapons\shields.dm"
#include "code\game\objects\items\weapons\stunbaton.dm"
#include "code\game\objects\items\weapons\surgery_tools.dm"
@@ -635,7 +632,7 @@
#include "code\game\objects\items\weapons\tape.dm"
#include "code\game\objects\items\weapons\teleportation.dm"
#include "code\game\objects\items\weapons\tools.dm"
-#include "code\game\objects\items\weapons\twohanded.dm"
+#include "code\game\objects\items\weapons\trays.dm"
#include "code\game\objects\items\weapons\weaponry.dm"
#include "code\game\objects\items\weapons\weldbackpack.dm"
#include "code\game\objects\items\weapons\wires.dm"
@@ -673,6 +670,15 @@
#include "code\game\objects\items\weapons\implants\implantfreedom.dm"
#include "code\game\objects\items\weapons\implants\implantpad.dm"
#include "code\game\objects\items\weapons\implants\implantuplink.dm"
+#include "code\game\objects\items\weapons\material\bats.dm"
+#include "code\game\objects\items\weapons\material\kitchen.dm"
+#include "code\game\objects\items\weapons\material\knives.dm"
+#include "code\game\objects\items\weapons\material\material_weapons.dm"
+#include "code\game\objects\items\weapons\material\misc.dm"
+#include "code\game\objects\items\weapons\material\shards.dm"
+#include "code\game\objects\items\weapons\material\swords.dm"
+#include "code\game\objects\items\weapons\material\thrown.dm"
+#include "code\game\objects\items\weapons\material\twohanded.dm"
#include "code\game\objects\items\weapons\melee\energy.dm"
#include "code\game\objects\items\weapons\melee\misc.dm"
#include "code\game\objects\items\weapons\storage\backpack.dm"
@@ -712,7 +718,6 @@
#include "code\game\objects\structures\ladders.dm"
#include "code\game\objects\structures\lamarr_cage.dm"
#include "code\game\objects\structures\lattice.dm"
-#include "code\game\objects\structures\mineral_doors.dm"
#include "code\game\objects\structures\mirror.dm"
#include "code\game\objects\structures\mop_bucket.dm"
#include "code\game\objects\structures\morgue.dm"
@@ -720,6 +725,7 @@
#include "code\game\objects\structures\noticeboard.dm"
#include "code\game\objects\structures\safe.dm"
#include "code\game\objects\structures\signs.dm"
+#include "code\game\objects\structures\simple_doors.dm"
#include "code\game\objects\structures\tank_dispenser.dm"
#include "code\game\objects\structures\target_stake.dm"
#include "code\game\objects\structures\transit_tubes.dm"
@@ -1040,6 +1046,9 @@
#include "code\modules\maps\reader.dm"
#include "code\modules\maps\swapmaps.dm"
#include "code\modules\maps\writer.dm"
+#include "code\modules\materials\material_recipes.dm"
+#include "code\modules\materials\material_sheets.dm"
+#include "code\modules\materials\material_synth.dm"
#include "code\modules\materials\materials.dm"
#include "code\modules\mining\abandonedcrates.dm"
#include "code\modules\mining\alloys.dm"
@@ -1058,6 +1067,7 @@
#include "code\modules\mining\satchel_ore_boxdm.dm"
#include "code\modules\mining\drilling\drill.dm"
#include "code\modules\mining\drilling\scanner.dm"
+#include "code\modules\mob\animations.dm"
#include "code\modules\mob\death.dm"
#include "code\modules\mob\emote.dm"
#include "code\modules\mob\hear_say.dm"
diff --git a/code/TriDimension/Structures.dm b/code/TriDimension/Structures.dm
index 9224facba2..cf216274bb 100644
--- a/code/TriDimension/Structures.dm
+++ b/code/TriDimension/Structures.dm
@@ -114,7 +114,7 @@
sleep(60)
if(!user || !WT || !WT.isOn()) return
- var/obj/item/stack/sheet/metal/S = new /obj/item/stack/sheet/metal( src )
+ var/obj/item/stack/material/steel/S = new /obj/item/stack/material/steel( src )
S.amount = 2
user << "You remove the ladder and close the hole."
qdel(src)
diff --git a/code/ZAS/Fire.dm b/code/ZAS/Fire.dm
index ebfd029228..27011dc7b3 100644
--- a/code/ZAS/Fire.dm
+++ b/code/ZAS/Fire.dm
@@ -10,6 +10,8 @@ Attach to transfer valve and open. BOOM.
*/
+//#define FIREDBG
+
/turf/var/obj/fire/fire = null
//Some legacy definitions so fires can be started.
@@ -35,14 +37,13 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0)
if(air_contents.check_combustability(liquid))
igniting = 1
- create_fire(vsc.fire_firelevel_multiplier)
+ create_fire(exposed_temperature)
return igniting
/zone/proc/process_fire()
var/datum/gas_mixture/burn_gas = air.remove_ratio(vsc.fire_consuption_rate, fire_tiles.len)
var/firelevel = burn_gas.zburn(src, fire_tiles, force_burn = 1, no_check = 1)
- //world << "[src]: firelevel [firelevel]"
air.merge(burn_gas)
@@ -65,6 +66,29 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0)
if(!fire_tiles.len)
air_master.active_fire_zones.Remove(src)
+/zone/proc/remove_liquidfuel(var/used_liquid_fuel, var/remove_fire=0)
+ if(!fuel_objs.len)
+ return
+
+ //As a simplification, we remove fuel equally from all fuel sources. It might be that some fuel sources have more fuel,
+ //some have less, but whatever. It will mean that sometimes we will remove a tiny bit less fuel then we intended to.
+
+ var/fuel_to_remove = used_liquid_fuel/(fuel_objs.len*LIQUIDFUEL_AMOUNT_TO_MOL) //convert back to liquid volume units
+
+ for(var/O in fuel_objs)
+ var/obj/effect/decal/cleanable/liquid_fuel/fuel = O
+ if(!istype(fuel))
+ fuel_objs -= fuel
+ continue
+
+ fuel.amount -= fuel_to_remove
+ if(fuel.amount <= 0)
+ fuel_objs -= fuel
+ if(remove_fire)
+ var/turf/T = fuel.loc
+ if(istype(T) && T.fire) qdel(T.fire)
+ qdel(fuel)
+
/turf/proc/create_fire(fl)
return 0
@@ -98,7 +122,7 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0)
light_color = "#ED9200"
layer = TURF_LAYER
- var/firelevel = 10000 //Calculated by gas_mixture.calculate_firelevel()
+ var/firelevel = 1 //Calculated by gas_mixture.calculate_firelevel()
/obj/fire/process()
. = 1
@@ -122,7 +146,6 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0)
icon_state = "1"
set_light(3, 1)
- //im not sure how to implement a version that works for every creature so for now monkeys are firesafe
for(var/mob/living/L in loc)
L.FireBurn(firelevel, air_contents.temperature, air_contents.return_pressure()) //Burn the mobs!
@@ -158,7 +181,7 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0)
else
enemy_tile.adjacent_fire_act(loc, air_contents, air_contents.temperature, air_contents.volume)
- animate(src, color = heat2color(air_contents.temperature), 5)
+ animate(src, color = fire_color(air_contents.temperature), 5)
set_light(l_color = color)
/obj/fire/New(newLoc,fl)
@@ -166,27 +189,32 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0)
if(!istype(loc, /turf))
qdel(src)
+ return
set_dir(pick(cardinal))
var/datum/gas_mixture/air_contents = loc.return_air()
- color = heat2color(air_contents.temperature)
+ color = fire_color(air_contents.temperature)
set_light(3, 1, color)
firelevel = fl
air_master.active_hotspots.Add(src)
+/obj/fire/proc/fire_color(var/env_temperature)
+ var/temperature = max(4000*sqrt(firelevel/vsc.fire_firelevel_multiplier), env_temperature)
+ return heat2color(temperature)
/obj/fire/Destroy()
- if (istype(loc, /turf/simulated))
- RemoveFire()
+ RemoveFire()
..()
/obj/fire/proc/RemoveFire()
- if (istype(loc, /turf))
+ var/turf/T = loc
+ if (istype(T))
set_light(0)
-
+
+ T.fire = null
loc = null
air_master.active_hotspots.Remove(src)
@@ -198,6 +226,11 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0)
//Returns the firelevel
/datum/gas_mixture/proc/zburn(zone/zone, force_burn, no_check = 0)
+ #ifdef FIREDBG
+ log_debug("***************** FIREDBG *****************")
+ if(zone) log_debug("Burning [zone.name]!")
+ #endif
+
. = 0
if((temperature > PHORON_MINIMUM_BURN_TEMPERATURE || force_burn) && (no_check ||check_recombustability(zone? zone.fuel_objs : null)))
var/gas_fuel = 0 //in the case of mixed gas/liquid fires, the gas burns first.
@@ -215,9 +248,11 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0)
total_oxidizers *= group_multiplier
//Liquid Fuel
+ var/fuel_area = 0
if(zone)
for(var/obj/effect/decal/cleanable/liquid_fuel/fuel in zone.fuel_objs)
liquid_fuel += fuel.amount*LIQUIDFUEL_AMOUNT_TO_MOL
+ fuel_area++
total_fuel = gas_fuel + liquid_fuel
if(total_fuel <= 0.005)
@@ -225,9 +260,6 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0)
//*** Determine how fast the fire burns
- //calculate the firelevel.
- var/firelevel = calculate_firelevel(zone? zone.fuel_objs : null, total_fuel, total_oxidizers, force = 1)
-
//get the current thermal energy of the gas mix
//this must be taken here to prevent the addition or deletion of energy by a changing heat capacity
var/starting_energy = temperature * heat_capacity()
@@ -235,61 +267,54 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0)
//determine how far the reaction can progress
var/reaction_limit = min(total_oxidizers*(FIRE_REACTION_FUEL_AMOUNT/FIRE_REACTION_OXIDIZER_AMOUNT), total_fuel) //stoichiometric limit
- //determine the actual rate of reaction, as measured by the amount of fuel reacting
+ //calculate the firelevel.
+ var/firelevel = calculate_firelevel(total_fuel, total_oxidizers, reaction_limit)
+
//vapour fuels are extremely volatile! The reaction progress is a percentage of the total fuel (similar to old zburn).
- var/gas_reaction_progress = max(0.2*group_multiplier, (firelevel/vsc.fire_firelevel_multiplier)*gas_fuel)*FIRE_GAS_BURNRATE_MULT
- //liquid fuels are not as volatile, and the reaction progress depends on the size of the area that is burning (which is sort of accounted for by firelevel). Having more fuel means a longer burn.
- var/liquid_reaction_progress = (firelevel/vsc.fire_firelevel_multiplier)*FIRE_LIQUID_BURNRATE_MULT
+ var/gas_reaction_progress = min(0.2, (firelevel/vsc.fire_firelevel_multiplier))*gas_fuel*FIRE_GAS_BURNRATE_MULT
- //world << "liquid_reaction_progress = [liquid_reaction_progress]"
- //world << "gas_reaction_progress = [gas_reaction_progress]"
+ //liquid fuels are not as volatile, and the reaction progress depends on the size of the area that is burning. Limit the burn rate to a certain amount per area.
+ var/liquid_reaction_progress = ((firelevel/vsc.fire_firelevel_multiplier)*0.2 + 0.05)*fuel_area*FIRE_LIQUID_BURNRATE_MULT
var/total_reaction_progress = gas_reaction_progress + liquid_reaction_progress
var/used_fuel = min(total_reaction_progress, reaction_limit)
var/used_oxidizers = used_fuel*(FIRE_REACTION_OXIDIZER_AMOUNT/FIRE_REACTION_FUEL_AMOUNT)
- //world << "used_fuel = [used_fuel]; used_oxidizers = [used_oxidizers]; reaction_limit=[reaction_limit]"
+
+ #ifdef FIREDBG
+ log_debug("firelevel -> [firelevel] / [vsc.fire_firelevel_multiplier]")
+ log_debug("liquid_reaction_progress = [liquid_reaction_progress]")
+ log_debug("gas_reaction_progress = [gas_reaction_progress]")
+ log_debug("used_fuel = [used_fuel]; used_oxidizers = [used_oxidizers]; reaction_limit=[reaction_limit]")
+ #endif
//if the reaction is progressing too slow then it isn't self-sustaining anymore and burns out
- if(zone && zone.fuel_objs.len)
- if(used_fuel <= FIRE_LIQUD_MIN_BURNRATE)
+ if(zone) //be less restrictive with canister and tank reactions
+ if((!liquid_fuel || used_fuel <= FIRE_LIQUD_MIN_BURNRATE) && (!gas_fuel || used_fuel <= FIRE_GAS_MIN_BURNRATE*group_multiplier))
return 0
- else if(used_fuel <= FIRE_GAS_MIN_BURNRATE*group_multiplier) //purely gas fires have more stringent criteria
- return 0
//*** Remove fuel and oxidizer, add carbon dioxide and heat
//remove and add gasses as calculated
- var/used_gas_fuel = min(used_fuel*(gas_reaction_progress/total_reaction_progress), gas_fuel) //remove in proportion to the relative reaction progress
- var/used_liquid_fuel = between(0, used_fuel-used_gas_fuel, liquid_fuel)
+ var/used_gas_fuel = between(0.25, used_fuel*(gas_reaction_progress/total_reaction_progress), gas_fuel) //remove in proportion to the relative reaction progress
+ var/used_liquid_fuel = between(0.25, used_fuel-used_gas_fuel, liquid_fuel)
//remove_by_flag() and adjust_gas() handle the group_multiplier for us.
remove_by_flag(XGM_GAS_OXIDIZER, used_oxidizers)
remove_by_flag(XGM_GAS_FUEL, used_gas_fuel)
adjust_gas("carbon_dioxide", used_oxidizers)
- //As a simplification, we remove fuel equally from all fuel sources. It might be that some fuel sources have more fuel, some have less, but whatever.
- if(zone && zone.fuel_objs.len)
- var/fuel_to_remove = used_liquid_fuel/(zone.fuel_objs.len*LIQUIDFUEL_AMOUNT_TO_MOL) //convert back to liquid volume units
- //world << "used gas fuel = [used_gas_fuel]; used other fuel = [used_fuel-used_gas_fuel]; fuel_to_remove = [fuel_to_remove]"
- var/liquidonly = !check_combustability()
- for(var/O in zone.fuel_objs)
- var/obj/effect/decal/cleanable/liquid_fuel/fuel = O
- if(!istype(fuel))
- zone.fuel_objs -= fuel
- continue
-
- fuel.amount -= fuel_to_remove
- if(fuel.amount <= 0)
- zone.fuel_objs -= fuel
- if(liquidonly)
- var/turf/T = fuel.loc
- if(istype(T) && T.fire) qdel(T.fire)
- qdel(fuel)
+ if(zone)
+ zone.remove_liquidfuel(used_liquid_fuel, !check_combustability())
//calculate the energy produced by the reaction and then set the new temperature of the mix
temperature = (starting_energy + vsc.fire_fuel_energy_release * used_fuel) / heat_capacity()
+
+ #ifdef FIREDBG
+ log_debug("used_gas_fuel = [used_gas_fuel]; used_liquid_fuel = [used_liquid_fuel]; total = [used_gas_fuel+used_liquid_fuel]")
+ log_debug("new temperature = [temperature]")
+ #endif
update_values()
return firelevel
@@ -332,21 +357,28 @@ datum/gas_mixture/proc/check_recombustability(list/fuel_objs)
. = 1
break
-//Returns a value between 0 and vsc.fire_firelevel_multiplier
-/datum/gas_mixture/proc/calculate_firelevel(list/fuel_objs, total_fuel, total_oxidizers, force = 0)
+//returns a value between 0 and vsc.fire_firelevel_multiplier
+/datum/gas_mixture/proc/calculate_firelevel(total_fuel, total_oxidizers, reaction_limit)
//Calculates the firelevel based on one equation instead of having to do this multiple times in different areas.
var/firelevel = 0
- if(force || check_recombustability(fuel_objs))
- var/total_combustables = (total_fuel + total_oxidizers)
+ var/total_combustables = (total_fuel + total_oxidizers)
- if(total_combustables > 0)
- //slows down the burning when the concentration of the reactants is low
- var/dampening_multiplier = total_combustables / total_moles
- //calculates how close the mixture of the reactants is to the optimum
- var/mix_multiplier = 1 / (1 + (5 * ((total_oxidizers / total_combustables) ** 2)))
- //toss everything together
- firelevel = vsc.fire_firelevel_multiplier * mix_multiplier * dampening_multiplier
+ if(total_combustables > 0)
+ //slows down the burning when the concentration of the reactants is low
+ var/dampening_multiplier = min(1, reaction_limit / (total_moles/group_multiplier))
+
+ //calculates how close the mixture of the reactants is to the optimum
+ //fires burn better when there is more oxidizer -- too much fuel will choke them out a bit, reducing firelevel.
+ var/mix_multiplier = 1 / (1 + (5 * ((total_fuel / total_combustables) ** 2)))
+
+ #ifdef FIREDBG
+ ASSERT(dampening_multiplier <= 1)
+ ASSERT(mix_multiplier <= 1)
+ #endif
+
+ //toss everything together -- should produce a value between 0 and fire_firelevel_multiplier
+ firelevel = vsc.fire_firelevel_multiplier * mix_multiplier * dampening_multiplier
return max( 0, firelevel)
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index 7bb85445d4..0c8685162f 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -20,6 +20,15 @@
/obj/item/proc/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
return
+//TODO: refactor mob attack code.
+/*
+Busy writing something else that I don't want to get mixed up in a general attack code, and I don't want to forget this so leaving a note here.
+leave attackby() as handling the general case of "using an item on a mob"
+attackby() will decide to call attacked_by() or not.
+attacked_by() will be made a living level proc and handle the specific case of "attacking with an item to cause harm"
+attacked_by() will then call attack() so that stunbatons and other weapons that have special attack effects can do their thing.
+attacked_by() will handle hitting/missing/logging as it does now, and will call attack() to apply the attack effects (damage) instead of the other way around (as it is now).
+*/
/obj/item/proc/attack(mob/living/M as mob, mob/living/user as mob, def_zone)
@@ -57,6 +66,7 @@
power *= 2
// TODO: needs to be refactored into a mob/living level attacked_by() proc. ~Z
+ user.do_attack_animation(M)
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index 1a7a9b8ae0..fa408d1b8f 100644
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -271,12 +271,12 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/obj/item/weapon/reagent_containers/spray/plantbgone,
/obj/item/weapon/reagent_containers/glass/bottle/ammonia,
/obj/item/weapon/reagent_containers/glass/bottle/ammonia,
- /obj/item/weapon/hatchet,
- /obj/item/weapon/minihoe,
+ /obj/item/weapon/material/hatchet,
+ /obj/item/weapon/material/minihoe,
/obj/item/device/analyzer/plant_analyzer,
/obj/item/clothing/gloves/botanic_leather,
/obj/item/clothing/suit/apron,
- /obj/item/weapon/minihoe,
+ /obj/item/weapon/material/minihoe,
/obj/item/weapon/storage/box/botanydisk
) // Updated with new things
cost = 15
@@ -337,8 +337,8 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/datum/supply_packs/weedcontrol
name = "Weed control crate"
- contains = list(/obj/item/weapon/hatchet,
- /obj/item/weapon/hatchet,
+ contains = list(/obj/item/weapon/material/hatchet,
+ /obj/item/weapon/material/hatchet,
/obj/item/weapon/reagent_containers/spray/plantbgone,
/obj/item/weapon/reagent_containers/spray/plantbgone,
/obj/item/weapon/reagent_containers/spray/plantbgone,
@@ -445,7 +445,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/datum/supply_packs/metal50
name = "50 metal sheets"
- contains = list(/obj/item/stack/sheet/metal)
+ contains = list(/obj/item/stack/material/steel)
amount = 50
cost = 10
containertype = /obj/structure/closet/crate
@@ -454,7 +454,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/datum/supply_packs/glass50
name = "50 glass sheets"
- contains = list(/obj/item/stack/sheet/glass)
+ contains = list(/obj/item/stack/material/glass)
amount = 50
cost = 10
containertype = /obj/structure/closet/crate
@@ -463,7 +463,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/datum/supply_packs/wood50
name = "50 wooden planks"
- contains = list(/obj/item/stack/sheet/wood)
+ contains = list(/obj/item/stack/material/wood)
amount = 50
cost = 10
containertype = /obj/structure/closet/crate
@@ -472,7 +472,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/datum/supply_packs/plastic50
name = "50 plastic sheets"
- contains = list(/obj/item/stack/sheet/mineral/plastic)
+ contains = list(/obj/item/stack/material/plastic)
amount = 50
cost = 10
containertype = /obj/structure/closet/crate
@@ -1255,7 +1255,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
group = "Hydroponics"
/datum/supply_packs/cardboard_sheets
- contains = list(/obj/item/stack/sheet/cardboard)
+ contains = list(/obj/item/stack/material/cardboard)
name = "50 cardboard sheets"
amount = 50
cost = 10
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index 4d564bbf83..e230dfa6c9 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -91,7 +91,7 @@
/obj/item/weapon/cane/concealed/New()
..()
- var/obj/item/weapon/butterfly/switchblade/temp_blade = new(src)
+ var/obj/item/weapon/material/butterfly/switchblade/temp_blade = new(src)
concealed_blade = temp_blade
temp_blade.attack_self()
@@ -109,7 +109,7 @@
else
..()
-/obj/item/weapon/cane/concealed/attackby(var/obj/item/weapon/butterfly/W, var/mob/user)
+/obj/item/weapon/cane/concealed/attackby(var/obj/item/weapon/material/butterfly/W, var/mob/user)
if(!src.concealed_blade && istype(W))
user.visible_message("[user] has sheathed \a [W] into \his [src]!", "You sheathe \the [W] into \the [src].")
user.drop_from_inventory(W)
diff --git a/code/game/antagonist/station/highlander.dm b/code/game/antagonist/station/highlander.dm
index 9b82b15852..3ee73f4a95 100644
--- a/code/game/antagonist/station/highlander.dm
+++ b/code/game/antagonist/station/highlander.dm
@@ -37,7 +37,7 @@ var/datum/antagonist/highlander/highlanders
player.equip_to_slot_or_del(new /obj/item/clothing/under/kilt(player), slot_w_uniform)
player.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(player), slot_l_ear)
player.equip_to_slot_or_del(new /obj/item/clothing/head/beret(player), slot_head)
- player.equip_to_slot_or_del(new /obj/item/weapon/claymore(player), slot_l_hand)
+ player.equip_to_slot_or_del(new /obj/item/weapon/material/sword(player), slot_l_hand)
player.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(player), slot_shoes)
player.equip_to_slot_or_del(new /obj/item/weapon/pinpointer(get_turf(player)), slot_l_store)
diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm
index b5854ed981..d70c181830 100644
--- a/code/game/gamemodes/cult/cult_structures.dm
+++ b/code/game/gamemodes/cult/cult_structures.dm
@@ -38,11 +38,12 @@
/obj/structure/cult/pylon/proc/attackpylon(mob/user as mob, var/damage)
if(!isbroken)
if(prob(1+ damage * 5))
- user << "You hit the pylon, and its crystal breaks apart!"
- for(var/mob/M in viewers(src))
- if(M == user)
- continue
- M.show_message("[user.name] smashed the pylon!", 3, "You hear a tinkle of crystal shards", 2)
+ user.visible_message(
+ "[user] smashed the pylon!",
+ "You hit the pylon, and its crystal breaks apart!",
+ "You hear a tinkle of crystal shards"
+ )
+ user.do_attack_animation(src)
playsound(get_turf(src), 'sound/effects/Glassbr3.ogg', 75, 1)
isbroken = 1
density = 0
diff --git a/code/game/gamemodes/cult/cultify/obj.dm b/code/game/gamemodes/cult/cultify/obj.dm
index cbc3571896..4306182eaf 100644
--- a/code/game/gamemodes/cult/cultify/obj.dm
+++ b/code/game/gamemodes/cult/cultify/obj.dm
@@ -14,14 +14,14 @@
new /obj/structure/cult/pylon(loc)
..()
-/obj/item/stack/sheet/wood/cultify()
+/obj/item/stack/material/wood/cultify()
return
/obj/item/weapon/book/cultify()
new /obj/item/weapon/book/tome(loc)
..()
-/obj/item/weapon/claymore/cultify()
+/obj/item/weapon/material/sword/cultify()
new /obj/item/weapon/melee/cultblade(loc)
..()
@@ -59,7 +59,7 @@
qdel(src)
/obj/machinery/door/airlock/external/cultify()
- new /obj/structure/mineral_door/wood(loc)
+ new /obj/structure/simple_door/wood(loc)
..()
/obj/machinery/door/cultify()
@@ -114,11 +114,11 @@
/obj/structure/grille/cult/cultify()
return
-/obj/structure/mineral_door/cultify()
- new /obj/structure/mineral_door/wood(loc)
+/obj/structure/simple_door/cultify()
+ new /obj/structure/simple_door/wood(loc)
..()
-/obj/structure/mineral_door/wood/cultify()
+/obj/structure/simple_door/wood/cultify()
return
/obj/singularity/cultify()
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index d13f90d2be..0ad6e7fc5f 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -513,9 +513,9 @@ datum/objective/steal
"diamond drill" = /obj/item/weapon/pickaxe/diamonddrill,
"bag of holding" = /obj/item/weapon/storage/backpack/holding,
"hyper-capacity cell" = /obj/item/weapon/cell/hyper,
- "10 diamonds" = /obj/item/stack/sheet/mineral/diamond,
- "50 gold bars" = /obj/item/stack/sheet/mineral/gold,
- "25 refined uranium bars" = /obj/item/stack/sheet/mineral/uranium,
+ "10 diamonds" = /obj/item/stack/material/diamond,
+ "50 gold bars" = /obj/item/stack/material/gold,
+ "25 refined uranium bars" = /obj/item/stack/material/uranium,
)
@@ -830,13 +830,13 @@ datum/objective/heist/salvage
for(var/obj/item/O in locate(/area/shuttle/skipjack/station))
- var/obj/item/stack/sheet/S
- if(istype(O,/obj/item/stack/sheet))
+ var/obj/item/stack/material/S
+ if(istype(O,/obj/item/stack/material))
if(O.name == target)
S = O
total_amount += S.get_amount()
for(var/obj/I in O.contents)
- if(istype(I,/obj/item/stack/sheet))
+ if(istype(I,/obj/item/stack/material))
if(I.name == target)
S = I
total_amount += S.get_amount()
@@ -844,9 +844,9 @@ datum/objective/heist/salvage
for(var/datum/mind/raider in raiders.current_antagonists)
if(raider.current)
for(var/obj/item/O in raider.current.get_contents())
- if(istype(O,/obj/item/stack/sheet))
+ if(istype(O,/obj/item/stack/material))
if(O.name == target)
- var/obj/item/stack/sheet/S = O
+ var/obj/item/stack/material/S = O
total_amount += S.get_amount()
if(total_amount >= target_amount) return 1
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index 40db18e42f..e3b161b6fb 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -293,7 +293,7 @@
var/material/M = name_to_material[mat]
if(!istype(M))
continue
- var/obj/item/stack/sheet/S = new M.stack_type(get_turf(src))
+ var/obj/item/stack/material/S = new M.stack_type(get_turf(src))
if(stored_material[mat] > S.perunit)
S.amount = round(stored_material[mat] / S.perunit)
else
diff --git a/code/game/machinery/autolathe_datums.dm b/code/game/machinery/autolathe_datums.dm
index 3b323cd69f..ca56b4bf78 100644
--- a/code/game/machinery/autolathe_datums.dm
+++ b/code/game/machinery/autolathe_datums.dm
@@ -81,15 +81,15 @@
name = "wrench"
path = /obj/item/weapon/wrench
category = "Tools"
-
+
/datum/autolathe/recipe/hatchet
name = "hatchet"
- path = /obj/item/weapon/hatchet
+ path = /obj/item/weapon/material/hatchet
category = "Tools"
-
+
/datum/autolathe/recipe/minihoe
name = "mini hoe"
- path = /obj/item/weapon/minihoe
+ path = /obj/item/weapon/material/minihoe
category = "Tools"
/datum/autolathe/recipe/radio_headset
@@ -109,19 +109,19 @@
/datum/autolathe/recipe/metal
name = "steel sheets"
- path = /obj/item/stack/sheet/metal
+ path = /obj/item/stack/material/steel
category = "General"
is_stack = 1
/datum/autolathe/recipe/glass
name = "glass sheets"
- path = /obj/item/stack/sheet/glass
+ path = /obj/item/stack/material/glass
category = "General"
is_stack = 1
/datum/autolathe/recipe/rglass
name = "reinforced glass sheets"
- path = /obj/item/stack/sheet/glass/reinforced
+ path = /obj/item/stack/material/glass/reinforced
category = "General"
is_stack = 1
@@ -133,7 +133,7 @@
/datum/autolathe/recipe/knife
name = "kitchen knife"
- path = /obj/item/weapon/kitchenknife
+ path = /obj/item/weapon/material/knife
category = "General"
/datum/autolathe/recipe/taperecorder
@@ -217,7 +217,7 @@
category = "Medical"
/datum/autolathe/recipe/syringegun_ammo
- name = "syringe"
+ name = "syringe gun cartridge"
path = /obj/item/weapon/syringe_cartridge
category = "Arms and Ammunition"
@@ -293,7 +293,7 @@
/datum/autolathe/recipe/ashtray_glass
name = "glass ashtray"
- path = /obj/item/ashtray/glass
+ path = /obj/item/weapon/material/ashtray/glass
category = "General"
/datum/autolathe/recipe/camera_assembly
@@ -369,7 +369,7 @@
/datum/autolathe/recipe/tacknife
name = "tactical knife"
- path = /obj/item/weapon/hatchet/tacknife
+ path = /obj/item/weapon/material/hatchet/tacknife
hidden = 1
category = "Arms and Ammunition"
diff --git a/code/game/machinery/bioprinter.dm b/code/game/machinery/bioprinter.dm
index 5a8b25bb84..9f144c23b1 100644
--- a/code/game/machinery/bioprinter.dm
+++ b/code/game/machinery/bioprinter.dm
@@ -73,8 +73,8 @@
qdel(W)
return
// Steel for matter.
- else if(prints_prosthetics && istype(W, /obj/item/stack/sheet/metal))
- var/obj/item/stack/sheet/metal/M = W
+ else if(prints_prosthetics && istype(W, /obj/item/stack/material/steel))
+ var/obj/item/stack/material/steel/M = W
stored_matter += M.amount * 10
user.drop_item()
user << "\The [src] processes \the [W]. Levels of stored matter now: [stored_matter]"
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index 43e26a7d46..3550a129a3 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -115,6 +115,7 @@
if(user.species.can_shred(user))
set_status(0)
+ user.do_attack_animation(src)
visible_message("\The [user] slashes at [src]!")
playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1)
icon_state = "[initial(icon_state)]1"
@@ -190,6 +191,7 @@
else if(W.damtype == BRUTE || W.damtype == BURN) //bashing cameras
if (W.force >= src.toughness)
+ user.do_attack_animation(src)
visible_message("[src] has been [pick(W.attack_verb)] with [W] by [user]!")
if (istype(W, /obj/item)) //is it even possible to get into attackby() with non-items?
var/obj/item/I = W
diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm
index 28691004f3..75397278c0 100644
--- a/code/game/machinery/camera/camera_assembly.dm
+++ b/code/game/machinery/camera/camera_assembly.dm
@@ -9,7 +9,7 @@
matter = list(DEFAULT_WALL_MATERIAL = 700,"glass" = 300)
// Motion, EMP-Proof, X-Ray
- var/list/obj/item/possible_upgrades = list(/obj/item/device/assembly/prox_sensor, /obj/item/stack/sheet/mineral/osmium, /obj/item/weapon/stock_parts/scanning_module)
+ var/list/obj/item/possible_upgrades = list(/obj/item/device/assembly/prox_sensor, /obj/item/stack/material/osmium, /obj/item/weapon/stock_parts/scanning_module)
var/list/upgrades = list()
var/state = 0
var/busy = 0
diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm
index d4b795730f..24588582e5 100644
--- a/code/game/machinery/camera/presets.dm
+++ b/code/game/machinery/camera/presets.dm
@@ -144,7 +144,7 @@ var/global/list/engineering_networks = list(
// CHECKS
/obj/machinery/camera/proc/isEmpProof()
- var/O = locate(/obj/item/stack/sheet/mineral/osmium) in assembly.upgrades
+ var/O = locate(/obj/item/stack/material/osmium) in assembly.upgrades
return O
/obj/machinery/camera/proc/isXRay()
@@ -160,7 +160,7 @@ var/global/list/engineering_networks = list(
// UPGRADE PROCS
/obj/machinery/camera/proc/upgradeEmpProof()
- assembly.upgrades.Add(new /obj/item/stack/sheet/mineral/osmium(assembly))
+ assembly.upgrades.Add(new /obj/item/stack/material/osmium(assembly))
setPowerUsage()
/obj/machinery/camera/proc/upgradeXRay()
diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm
index 028f1ba307..53416cd2b3 100644
--- a/code/game/machinery/computer/ai_core.dm
+++ b/code/game/machinery/computer/ai_core.dm
@@ -29,7 +29,7 @@
if(do_after(user, 20))
if(!src || !WT.remove_fuel(0, user)) return
user << "\blue You deconstruct the frame."
- new /obj/item/stack/sheet/plasteel( loc, 4)
+ new /obj/item/stack/material/plasteel( loc, 4)
qdel(src)
if(1)
if(istype(P, /obj/item/weapon/wrench))
@@ -88,8 +88,8 @@
var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( loc )
A.amount = 5
- if(istype(P, /obj/item/stack/sheet/glass/reinforced))
- var/obj/item/stack/sheet/glass/reinforced/RG = P
+ if(istype(P, /obj/item/stack/material/glass/reinforced))
+ var/obj/item/stack/material/glass/reinforced/RG = P
if (RG.get_amount() < 2)
user << "You need two sheets of glass to put in the glass panel."
return
@@ -162,7 +162,7 @@
icon_state = "3b"
else
icon_state = "3"
- new /obj/item/stack/sheet/glass/reinforced( loc, 2 )
+ new /obj/item/stack/material/glass/reinforced( loc, 2 )
return
if(istype(P, /obj/item/weapon/screwdriver))
diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm
index a325ab90f3..7cae6c6d93 100644
--- a/code/game/machinery/computer/buildandrepair.dm
+++ b/code/game/machinery/computer/buildandrepair.dm
@@ -28,7 +28,7 @@
if(do_after(user, 20))
if(!src || !WT.isOn()) return
user << "\blue You deconstruct the frame."
- new /obj/item/stack/sheet/metal( src.loc, 5 )
+ new /obj/item/stack/material/steel( src.loc, 5 )
qdel(src)
if(1)
if(istype(P, /obj/item/weapon/wrench))
@@ -87,8 +87,8 @@
var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( src.loc )
A.amount = 5
- if(istype(P, /obj/item/stack/sheet/glass))
- var/obj/item/stack/sheet/glass/G = P
+ if(istype(P, /obj/item/stack/material/glass))
+ var/obj/item/stack/material/glass/G = P
if (G.get_amount() < 2)
user << "You need two sheets of glass to put in the glass panel."
return
@@ -105,7 +105,7 @@
user << "\blue You remove the glass panel."
src.state = 3
src.icon_state = "3"
- new /obj/item/stack/sheet/glass( src.loc, 2 )
+ new /obj/item/stack/material/glass( src.loc, 2 )
if(istype(P, /obj/item/weapon/screwdriver))
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
user << "\blue You connect the monitor."
diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm
index 37cb62c5cb..baa75fed05 100644
--- a/code/game/machinery/computer/computer.dm
+++ b/code/game/machinery/computer/computer.dm
@@ -125,7 +125,7 @@
C.loc = src.loc
if (src.stat & BROKEN)
user << "\blue The broken glass falls out."
- new /obj/item/weapon/shard( src.loc )
+ new /obj/item/weapon/material/shard( src.loc )
A.state = 3
A.icon_state = "3"
else
diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm
index 257e76ede8..7e23437e25 100644
--- a/code/game/machinery/computer/pod.dm
+++ b/code/game/machinery/computer/pod.dm
@@ -58,7 +58,7 @@
if(stat & BROKEN)
user << "\blue The broken glass falls out."
var/obj/structure/computerframe/A = new /obj/structure/computerframe( loc )
- new /obj/item/weapon/shard( loc )
+ new /obj/item/weapon/material/shard( loc )
//generate appropriate circuitboard. Accounts for /pod/old computer types
var/obj/item/weapon/circuitboard/pod/M = null
diff --git a/code/game/machinery/computer/prisonshuttle.dm b/code/game/machinery/computer/prisonshuttle.dm
index 0fd1a2df05..59aa575a5b 100644
--- a/code/game/machinery/computer/prisonshuttle.dm
+++ b/code/game/machinery/computer/prisonshuttle.dm
@@ -38,7 +38,7 @@ var/prison_shuttle_timeleft = 0
if (src.stat & BROKEN)
user << "\blue The broken glass falls out."
- new /obj/item/weapon/shard( src.loc )
+ new /obj/item/weapon/material/shard( src.loc )
A.state = 3
A.icon_state = "3"
else
diff --git a/code/game/machinery/computer3/buildandrepair.dm b/code/game/machinery/computer3/buildandrepair.dm
index eef7503f97..5e5c8af856 100644
--- a/code/game/machinery/computer3/buildandrepair.dm
+++ b/code/game/machinery/computer3/buildandrepair.dm
@@ -93,7 +93,7 @@
if(do_after(user, 20))
if(!src || !WT.isOn()) return
user << "\blue You deconstruct the frame."
- new /obj/item/stack/sheet/metal( src.loc, 5 )
+ new /obj/item/stack/material/steel( src.loc, 5 )
qdel(src)
if(1)
if(istype(P, /obj/item/weapon/wrench))
@@ -178,7 +178,7 @@
if(istype(P, /obj/item/weapon/crowbar)) // complicated check
remove_peripheral()
- if(istype(P, /obj/item/stack/sheet/glass))
+ if(istype(P, /obj/item/stack/material/glass))
if(P:amount >= 2)
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
if(do_after(user, 20))
@@ -193,7 +193,7 @@
user << "\blue You remove the glass panel."
src.state = 3
src.icon_state = "3"
- new /obj/item/stack/sheet/glass( src.loc, 2 )
+ new /obj/item/stack/material/glass( src.loc, 2 )
if(istype(P, /obj/item/weapon/screwdriver))
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
user << "\blue You connect the monitor."
diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm
index e01c3e4b8e..9ebe4a6ec2 100644
--- a/code/game/machinery/constructable_frame.dm
+++ b/code/game/machinery/constructable_frame.dm
@@ -48,7 +48,7 @@
if(istype(P, /obj/item/weapon/wrench))
playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
user << "\blue You dismantle the frame"
- new /obj/item/stack/sheet/metal(src.loc, 5)
+ new /obj/item/stack/material/steel(src.loc, 5)
qdel(src)
if(2)
if(istype(P, /obj/item/weapon/circuitboard))
diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm
index e49fb26283..4f19ab0118 100644
--- a/code/game/machinery/deployable.dm
+++ b/code/game/machinery/deployable.dm
@@ -53,89 +53,101 @@ for reference:
*/
-
-//Barricades, maybe there will be a metal one later...
-/obj/structure/barricade/wooden
- name = "wooden barricade"
- desc = "This space is blocked off by a wooden barricade."
+//Barricades!
+/obj/structure/barricade
+ name = "barricade"
+ desc = "This space is blocked off by a barricade."
icon = 'icons/obj/structures.dmi'
- icon_state = "woodenbarricade"
+ icon_state = "barricade"
anchored = 1.0
density = 1.0
- var/health = 100.0
- var/maxhealth = 100.0
+ var/health = 100
+ var/maxhealth = 100
+ var/material/material
- attackby(obj/item/W as obj, mob/user as mob)
- if (istype(W, /obj/item/stack/sheet/wood))
- var/obj/item/stack/sheet/wood/D = W
- if (health < maxhealth)
- if (D.get_amount() < 1)
- user << "You need one plank of wood to repair \the [src]."
- return
- visible_message("[user] begins to repair \the [src].")
- if(do_after(user,20) && health < maxhealth)
- if (D.use(1))
- health = maxhealth
- visible_message("[user] repairs \the [src].")
- return
- return
- else
- switch(W.damtype)
- if("fire")
- src.health -= W.force * 1
- if("brute")
- src.health -= W.force * 0.75
- else
- if (src.health <= 0)
- visible_message("\red The barricade is smashed apart!")
- new /obj/item/stack/sheet/wood(get_turf(src))
- new /obj/item/stack/sheet/wood(get_turf(src))
- new /obj/item/stack/sheet/wood(get_turf(src))
- qdel(src)
- ..()
-
- ex_act(severity)
- switch(severity)
- if(1.0)
- visible_message("\red The barricade is blown apart!")
- qdel(src)
- return
- if(2.0)
- src.health -= 25
- if (src.health <= 0)
- visible_message("\red The barricade is blown apart!")
- new /obj/item/stack/sheet/wood(get_turf(src))
- new /obj/item/stack/sheet/wood(get_turf(src))
- new /obj/item/stack/sheet/wood(get_turf(src))
- qdel(src)
- return
-
- meteorhit()
- visible_message("\red The barricade is smashed apart!")
- new /obj/item/stack/sheet/wood(get_turf(src))
- new /obj/item/stack/sheet/wood(get_turf(src))
- new /obj/item/stack/sheet/wood(get_turf(src))
+/obj/structure/barricade/New(var/newloc, var/material_name)
+ ..(newloc)
+ if(!material_name)
+ material_name = "wood"
+ material = get_material_by_name("[material_name]")
+ if(!material)
qdel(src)
return
+ name = "[material.display_name] barricade"
+ desc = "This space is blocked off by a barricade made of [material.display_name]."
+ color = material.icon_colour
+ maxhealth = material.integrity
+ health = maxhealth
- blob_act()
- src.health -= 25
- if (src.health <= 0)
- visible_message("\red The blob eats through the barricade!")
- qdel(src)
+/obj/structure/barricade/attackby(obj/item/W as obj, mob/user as mob)
+ if (istype(W, /obj/item/stack/material))
+ var/obj/item/stack/material/D = W
+ if(D.material.name != material.name)
+ user << "That is the wrong material needed to repair \the [src]."
+ return
+ if (health < maxhealth)
+ if (D.get_amount() < 1)
+ user << "You need one sheet of [material.display_name] to repair \the [src]."
+ return
+ visible_message("[user] begins to repair \the [src].")
+ if(do_after(user,20) && health < maxhealth)
+ if (D.use(1))
+ health = maxhealth
+ visible_message("[user] repairs \the [src].")
+ return
return
+ else
+ switch(W.damtype)
+ if("fire")
+ src.health -= W.force * 1
+ if("brute")
+ src.health -= W.force * 0.75
+ else
+ if (src.health <= 0)
+ visible_message("The barricade is smashed apart!")
+ dismantle()
+ qdel(src)
+ return
+ ..()
+/obj/structure/barricade/proc/dismantle()
+ material.place_dismantled_product(get_turf(src))
+ qdel(src)
+ return
- CanPass(atom/movable/mover, turf/target, height=0, air_group=0)//So bullets will fly over and stuff.
- if(air_group || (height==0))
- return 1
- if(istype(mover) && mover.checkpass(PASSTABLE))
- return 1
- else
- return 0
+/obj/structure/barricade/ex_act(severity)
+ switch(severity)
+ if(1.0)
+ visible_message("\The [src] is blown apart!")
+ qdel(src)
+ return
+ if(2.0)
+ src.health -= 25
+ if (src.health <= 0)
+ visible_message("\The [src] is blown apart!")
+ dismantle()
+ return
+/obj/structure/barricade/meteorhit()
+ visible_message("\The [src] is smashed apart!")
+ dismantle()
+ return
+
+/obj/structure/barricade/blob_act()
+ src.health -= 25
+ if (src.health <= 0)
+ visible_message("The blob eats through \the [src]!")
+ qdel(src)
+ return
+
+/obj/structure/barricade/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)//So bullets will fly over and stuff.
+ if(air_group || (height==0))
+ return 1
+ if(istype(mover) && mover.checkpass(PASSTABLE))
+ return 1
+ else
+ return 0
//Actual Deployable machinery stuff
-
/obj/machinery/deployable
name = "deployable"
desc = "deployable"
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 2211fced44..4418ceff30 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -805,18 +805,18 @@ About the new airlock wires panel:
else
spawn(0) close(1)
- else if(istype(C, /obj/item/weapon/twohanded/fireaxe) && !arePowerSystemsOn())
+ else if(istype(C, /obj/item/weapon/material/twohanded/fireaxe) && !arePowerSystemsOn())
if(locked)
user << "\blue The airlock's bolts prevent it from being forced."
else if( !welded && !operating )
if(density)
- var/obj/item/weapon/twohanded/fireaxe/F = C
+ var/obj/item/weapon/material/twohanded/fireaxe/F = C
if(F.wielded)
spawn(0) open(1)
else
user << "\red You need to be wielding \the [C] to do that."
else
- var/obj/item/weapon/twohanded/fireaxe/F = C
+ var/obj/item/weapon/material/twohanded/fireaxe/F = C
if(F.wielded)
spawn(0) close(1)
else
diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm
index 374f0426ad..2c5c00caaa 100644
--- a/code/game/machinery/doors/blast_door.dm
+++ b/code/game/machinery/doors/blast_door.dm
@@ -90,18 +90,18 @@
// This only works on broken doors or doors without power. Also allows repair with Plasteel.
/obj/machinery/door/blast/attackby(obj/item/weapon/C as obj, mob/user as mob)
src.add_fingerprint(user)
- if(istype(C, /obj/item/weapon/crowbar) || (istype(C, /obj/item/weapon/twohanded/fireaxe) && C:wielded == 1))
+ if(istype(C, /obj/item/weapon/crowbar) || (istype(C, /obj/item/weapon/material/twohanded/fireaxe) && C:wielded == 1))
if(((stat & NOPOWER) || (stat & BROKEN)) && !( src.operating ))
force_toggle()
else
usr << "[src]'s motors resist your effort."
return
- if(istype(C, /obj/item/stack/sheet/plasteel))
+ if(istype(C, /obj/item/stack/material/plasteel))
var/amt = repair_price()
if(!amt)
usr << "\The [src] is already fully repaired."
return
- var/obj/item/stack/sheet/plasteel/P = C
+ var/obj/item/stack/material/plasteel/P = C
if(P.amount < amt)
usr << "You don't have enough sheets to repair this! You need at least [amt] sheets."
return
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 0f3760009d..03971f4fbb 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -26,7 +26,7 @@
var/destroy_hits = 10 //How many strong hits it takes to destroy the door
var/min_force = 10 //minimum amount of force needed to damage the door with a melee weapon
var/hitsound = 'sound/weapons/smash.ogg' //sound door makes when hit with a weapon
- var/obj/item/stack/sheet/metal/repairing
+ var/obj/item/stack/material/steel/repairing
var/block_air_zones = 1 //If set, air zones cannot merge across the door even when it is opened.
var/close_door_at = 0 //When to automatically close the door, if possible
@@ -43,6 +43,7 @@
take_damage(damage)
else
visible_message("\The [user] bonks \the [src] harmlessly.")
+ user.do_attack_animation(src)
/obj/machinery/door/New()
. = ..()
@@ -163,7 +164,7 @@
visible_message("\red \The [src.name] disintegrates!")
switch (Proj.damage_type)
if(BRUTE)
- new /obj/item/stack/sheet/metal(src.loc, 2)
+ new /obj/item/stack/material/steel(src.loc, 2)
PoolOrNew(/obj/item/stack/rods, list(src.loc, 3))
if(BURN)
new /obj/effect/decal/cleanable/ash(src.loc) // Turn it to ashes!
@@ -205,7 +206,7 @@
if(src.operating > 0 || isrobot(user)) return //borgs can't attack doors open because it conflicts with their AI-like interaction with them.
src.add_fingerprint(user)
- if(istype(I, /obj/item/stack/sheet/metal))
+ if(istype(I, /obj/item/stack/material/steel))
if(stat & BROKEN)
user << "It looks like \the [src] is pretty busted. It's going to need more than just patching up now."
return
@@ -220,7 +221,7 @@
var/amount_needed = (maxhealth - health) / DOOR_REPAIR_AMOUNT
amount_needed = (round(amount_needed) == amount_needed)? amount_needed : round(amount_needed) + 1 //Why does BYOND not have a ceiling proc?
- var/obj/item/stack/sheet/metal/metalstack = I
+ var/obj/item/stack/material/steel/metalstack = I
var/transfer
if (repairing)
transfer = metalstack.transfer_to(repairing, amount_needed - repairing.amount)
@@ -264,6 +265,7 @@
if(src.density && istype(I, /obj/item/weapon) && user.a_intent == I_HURT && !istype(I, /obj/item/weapon/card))
var/obj/item/weapon/W = I
if(W.damtype == BRUTE || W.damtype == BURN)
+ user.do_attack_animation(src)
if(W.force < min_force)
user.visible_message("\red \The [user] hits \the [src] with \the [W] with no visible effect." )
else
diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm
index a3fca76a44..0c0d23b52a 100644
--- a/code/game/machinery/doors/firedoor.dm
+++ b/code/game/machinery/doors/firedoor.dm
@@ -238,7 +238,7 @@
user << "\The [src] is welded shut!"
return
- if(istype(C, /obj/item/weapon/crowbar) || istype(C,/obj/item/weapon/twohanded/fireaxe))
+ if(istype(C, /obj/item/weapon/crowbar) || istype(C,/obj/item/weapon/material/twohanded/fireaxe))
if(operating)
return
@@ -248,8 +248,8 @@
"You hear someone struggle and metal straining.")
return
- if(istype(C,/obj/item/weapon/twohanded/fireaxe))
- var/obj/item/weapon/twohanded/fireaxe/F = C
+ if(istype(C,/obj/item/weapon/material/twohanded/fireaxe))
+ var/obj/item/weapon/material/twohanded/fireaxe/F = C
if(!F.wielded)
return
diff --git a/code/game/machinery/doors/firedoor_assembly.dm b/code/game/machinery/doors/firedoor_assembly.dm
index d3a70fe85e..c01fff5bed 100644
--- a/code/game/machinery/doors/firedoor_assembly.dm
+++ b/code/game/machinery/doors/firedoor_assembly.dm
@@ -61,7 +61,7 @@ obj/structure/firedoor_assembly/attackby(C as obj, mob/user as mob)
if(!src || !WT.isOn()) return
user.visible_message("[user] has dissassembled \the [src].",
"You have dissassembled \the [src].")
- new /obj/item/stack/sheet/metal(src.loc, 2)
+ new /obj/item/stack/material/steel(src.loc, 2)
qdel(src)
else
user << "You need more welding fuel."
diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm
index d693f848eb..692662e6d2 100644
--- a/code/game/machinery/doors/windowdoor.dm
+++ b/code/game/machinery/doors/windowdoor.dm
@@ -25,7 +25,7 @@
return
/obj/machinery/door/window/proc/shatter(var/display_message = 1)
- new /obj/item/weapon/shard(src.loc)
+ new /obj/item/weapon/material/shard(src.loc)
var/obj/item/stack/cable_coil/CC = new /obj/item/stack/cable_coil(src.loc)
CC.amount = 2
var/obj/item/weapon/airlock_electronics/ae
diff --git a/code/game/machinery/pipe/pipelayer.dm b/code/game/machinery/pipe/pipelayer.dm
index 32aafb21cd..0f2dc3c855 100644
--- a/code/game/machinery/pipe/pipelayer.dm
+++ b/code/game/machinery/pipe/pipelayer.dm
@@ -50,7 +50,7 @@
user.visible_message("[user] has [!a_dis?"de":""]activated auto-dismantling.", "You [!a_dis?"de":""]activate auto-dismantling.")
return
- if(istype(W, /obj/item/stack/sheet/metal))
+ if(istype(W, /obj/item/stack/material/steel))
var/result = load_metal(W)
if(isnull(result))
@@ -70,7 +70,7 @@
m = round(m)
if(m)
use_metal(m)
- var/obj/item/stack/sheet/metal/MM = new (get_turf(src))
+ var/obj/item/stack/material/steel/MM = new (get_turf(src))
MM.amount = m
user.visible_message("[user] removes [m] sheet\s of metal from the \the [src].", "You remove [m] sheet\s of metal from \the [src]")
else
@@ -86,7 +86,7 @@
on=0
return
-/obj/machinery/pipelayer/proc/load_metal(var/obj/item/stack/sheet/metal/MM)
+/obj/machinery/pipelayer/proc/load_metal(var/obj/item/stack/material/steel/MM)
if(istype(MM) && MM.get_amount())
var/cur_amount = metal
var/to_load = max(max_metal - round(cur_amount),0)
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index 3709f2dac6..5476d9f6fa 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -267,7 +267,7 @@
Gun.power_supply.charge = gun_charge
Gun.update_icon()
if(prob(50))
- new /obj/item/stack/sheet/metal(loc, rand(1,4))
+ new /obj/item/stack/material/steel(loc, rand(1,4))
if(prob(50))
new /obj/item/device/assembly/prox_sensor(loc)
else
@@ -671,13 +671,13 @@
else if(istype(I, /obj/item/weapon/crowbar) && !anchored)
playsound(loc, 'sound/items/Crowbar.ogg', 75, 1)
user << "You dismantle the turret construction."
- new /obj/item/stack/sheet/metal( loc, 5)
+ new /obj/item/stack/material/steel( loc, 5)
qdel(src) // qdel
return
if(1)
- if(istype(I, /obj/item/stack/sheet/metal))
- var/obj/item/stack/sheet/metal/M = I
+ if(istype(I, /obj/item/stack/material/steel))
+ var/obj/item/stack/material/steel/M = I
if(M.use(2))
user << "You add some metal armor to the interior frame."
build_step = 2
@@ -714,7 +714,7 @@
if(!src || !WT.remove_fuel(5, user)) return
build_step = 1
user << "You remove the turret's interior metal armor."
- new /obj/item/stack/sheet/metal( loc, 2)
+ new /obj/item/stack/material/steel( loc, 2)
return
@@ -768,8 +768,8 @@
//attack_hand() removes the prox sensor
if(6)
- if(istype(I, /obj/item/stack/sheet/metal))
- var/obj/item/stack/sheet/metal/M = I
+ if(istype(I, /obj/item/stack/material/steel))
+ var/obj/item/stack/material/steel/M = I
if(M.use(2))
user << "You add some metal armor to the exterior frame."
build_step = 7
@@ -813,7 +813,7 @@
else if(istype(I, /obj/item/weapon/crowbar))
playsound(loc, 'sound/items/Crowbar.ogg', 75, 1)
user << "You pry off the turret's exterior armor."
- new /obj/item/stack/sheet/metal(loc, 2)
+ new /obj/item/stack/material/steel(loc, 2)
build_step = 6
return
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index 1020833e31..d41ab317d9 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -169,7 +169,8 @@
return
if(!R.cell.fully_charged())
var/diff = min(R.cell.maxcharge - R.cell.charge, charge_rate) // Capped at charge_rate charge / tick
- if (cell.use(diff))
+ if (cell.charge >= diff)
+ cell.use(diff)
R.cell.give(diff)
if(weld_rate && R.getBruteLoss())
R.adjustBruteLoss(-1)
diff --git a/code/game/machinery/robot_fabricator.dm b/code/game/machinery/robot_fabricator.dm
index 6b0cb71fbd..b2461f1d7f 100644
--- a/code/game/machinery/robot_fabricator.dm
+++ b/code/game/machinery/robot_fabricator.dm
@@ -12,8 +12,8 @@
active_power_usage = 10000
/obj/machinery/robotic_fabricator/attackby(var/obj/item/O as obj, var/mob/user as mob)
- if (istype(O, /obj/item/stack/sheet/metal))
- var/obj/item/stack/sheet/metal/M = O
+ if (istype(O, /obj/item/stack/material/steel))
+ var/obj/item/stack/material/steel/M = O
if (src.metal_amount < 150000.0)
var/count = 0
src.overlays += "fab-load-metal"
diff --git a/code/game/machinery/telecomms/logbrowser.dm b/code/game/machinery/telecomms/logbrowser.dm
index 50fa8b185b..cdcd98beba 100644
--- a/code/game/machinery/telecomms/logbrowser.dm
+++ b/code/game/machinery/telecomms/logbrowser.dm
@@ -192,7 +192,7 @@
if (src.stat & BROKEN)
user << "\blue The broken glass falls out."
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
- new /obj/item/weapon/shard( 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
diff --git a/code/game/machinery/telecomms/telemonitor.dm b/code/game/machinery/telecomms/telemonitor.dm
index a0f7b351ef..10ebe3dabc 100644
--- a/code/game/machinery/telecomms/telemonitor.dm
+++ b/code/game/machinery/telecomms/telemonitor.dm
@@ -130,7 +130,7 @@
if (src.stat & BROKEN)
user << "\blue The broken glass falls out."
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
- new /obj/item/weapon/shard( 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
diff --git a/code/game/machinery/telecomms/traffic_control.dm b/code/game/machinery/telecomms/traffic_control.dm
index 287577626c..459ae15da0 100644
--- a/code/game/machinery/telecomms/traffic_control.dm
+++ b/code/game/machinery/telecomms/traffic_control.dm
@@ -213,7 +213,7 @@
if (src.stat & BROKEN)
user << "\blue The broken glass falls out."
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
- new /obj/item/weapon/shard( 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
diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm
index e3a104d21c..c36fe7c064 100644
--- a/code/game/machinery/turrets.dm
+++ b/code/game/machinery/turrets.dm
@@ -341,6 +341,7 @@
if(stat & BROKEN)
user << "That object is useless to you."
return 0
+ user.do_attack_animation(src)
visible_message("[user] [attack_message] the [src]!")
user.attack_log += text("\[[time_stamp()]\] attacked [src.name]")
src.health -= damage
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 6895124593..5d290a6aa4 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -910,8 +910,8 @@
desc = "A kitchen and restaurant equipment vendor."
product_ads = "Mm, food stuffs!;Food and food accessories.;Get your plates!;You like forks?;I like forks.;Woo, utensils.;You don't really need these..."
icon_state = "dinnerware"
- products = list(/obj/item/weapon/tray = 8,/obj/item/weapon/kitchen/utensil/fork = 6,/obj/item/weapon/kitchenknife = 3,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 8,/obj/item/clothing/suit/chef/classic = 2)
- contraband = list(/obj/item/weapon/kitchen/utensil/spoon = 2,/obj/item/weapon/kitchen/utensil/knife = 2,/obj/item/weapon/kitchen/rollingpin = 2, /obj/item/weapon/butch = 2)
+ products = list(/obj/item/weapon/tray = 8,/obj/item/weapon/material/kitchen/utensil/fork = 6,/obj/item/weapon/material/knife = 3,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 8,/obj/item/clothing/suit/chef/classic = 2)
+ contraband = list(/obj/item/weapon/material/kitchen/utensil/spoon = 2,/obj/item/weapon/material/kitchen/utensil/knife = 2,/obj/item/weapon/material/kitchen/rollingpin = 2, /obj/item/weapon/material/knife/butch = 2)
/obj/machinery/vending/sovietsoda
name = "BODA"
diff --git a/code/game/machinery/wall_frames.dm b/code/game/machinery/wall_frames.dm
index 36e37cb9c6..7f9bedbd9d 100644
--- a/code/game/machinery/wall_frames.dm
+++ b/code/game/machinery/wall_frames.dm
@@ -6,7 +6,7 @@
flags = CONDUCT
var/build_machine_type
var/refund_amt = 2
- var/refund_type = /obj/item/stack/sheet/metal
+ var/refund_type = /obj/item/stack/material/steel
/obj/item/frame/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (istype(W, /obj/item/weapon/wrench))
@@ -73,7 +73,7 @@
icon = 'icons/rust.dmi'
icon_state = "fuel_compressor0"
w_class = 4
- refund_type = /obj/item/stack/sheet/plasteel
+ refund_type = /obj/item/stack/material/plasteel
refund_amt = 12
build_machine_type = /obj/machinery/rust_fuel_compressor
diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm
index 8f2e6aaee2..be0a0e6d3a 100644
--- a/code/game/machinery/washing_machine.dm
+++ b/code/game/machinery/washing_machine.dm
@@ -47,11 +47,11 @@
I.decontaminate()
//Tanning!
- for(var/obj/item/stack/sheet/hairlesshide/HH in contents)
- var/obj/item/stack/sheet/wetleather/WL = new(src)
+ for(var/obj/item/stack/material/hairlesshide/HH in contents)
+ var/obj/item/stack/material/wetleather/WL = new(src)
WL.amount = HH.amount
qdel(HH)
-
+
if( locate(/mob,contents) )
state = 7
gibs_ready = 1
@@ -95,7 +95,7 @@
state = 3
else
..()
- else if(istype(W,/obj/item/stack/sheet/hairlesshide) || \
+ else if(istype(W,/obj/item/stack/material/hairlesshide) || \
istype(W,/obj/item/clothing/under) || \
istype(W,/obj/item/clothing/mask) || \
istype(W,/obj/item/clothing/head) || \
diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm
index b765a32e68..073c807be9 100644
--- a/code/game/mecha/equipment/tools/tools.dm
+++ b/code/game/mecha/equipment/tools/tools.dm
@@ -200,9 +200,9 @@
set_ready_state(0)
if(do_after_cooldown(target))
if( istype(target, /obj/structure/reagent_dispensers/watertank) && get_dist(chassis,target) <= 1)
- var/obj/o = target
+ var/obj/o = target
var/amount = o.reagents.trans_to_obj(src, 200)
- occupant_message("[amount] units transferred into internal tank.")
+ occupant_message("[amount] units transferred into internal tank.")
playsound(chassis, 'sound/effects/refill.ogg', 50, 1, -6)
return
@@ -221,7 +221,7 @@
var/list/the_targets = list(T,T1,T2)
for(var/a = 1 to 5)
- spawn(0)
+ spawn(0)
var/obj/effect/effect/water/W = PoolOrNew(/obj/effect/effect/water, get_turf(chassis))
var/turf/my_target
if(a == 1)
@@ -237,7 +237,7 @@
return
reagents.trans_to_obj(W, spray_amount)
W.set_color()
- W.set_up(my_target)
+ W.set_up(my_target)
return 1
get_equip_info()
@@ -842,7 +842,7 @@
construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"silver"=500,"glass"=1000)
var/datum/global_iterator/pr_mech_generator
var/coeff = 100
- var/obj/item/stack/sheet/fuel
+ var/obj/item/stack/material/fuel
var/max_fuel = 150000
var/fuel_per_cycle_idle = 100
var/fuel_per_cycle_active = 500
@@ -860,7 +860,7 @@
..()
proc/init()
- fuel = new /obj/item/stack/sheet/mineral/phoron(src)
+ fuel = new /obj/item/stack/material/phoron(src)
fuel.amount = 0
pr_mech_generator = new /datum/global_iterator/mecha_generator(list(src),0)
pr_mech_generator.set_delay(equip_cooldown)
@@ -903,7 +903,7 @@
occupant_message(message)
return
- proc/load_fuel(var/obj/item/stack/sheet/P)
+ proc/load_fuel(var/obj/item/stack/material/P)
if(P.type == fuel.type && P.amount)
var/to_load = max(max_fuel - fuel.amount*fuel.perunit,0)
if(to_load)
@@ -988,7 +988,7 @@
reliability = 1000
init()
- fuel = new /obj/item/stack/sheet/mineral/uranium(src)
+ fuel = new /obj/item/stack/material/uranium(src)
fuel.amount = 0
pr_mech_generator = new /datum/global_iterator/mecha_generator/nuclear(list(src),0)
pr_mech_generator.set_delay(equip_cooldown)
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index 9dadd13554..9013e0b8a6 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -720,23 +720,23 @@
var/type
switch(mat_string)
if(DEFAULT_WALL_MATERIAL)
- type = /obj/item/stack/sheet/metal
+ type = /obj/item/stack/material/steel
if("glass")
- type = /obj/item/stack/sheet/glass
+ type = /obj/item/stack/material/glass
if("gold")
- type = /obj/item/stack/sheet/mineral/gold
+ type = /obj/item/stack/material/gold
if("silver")
- type = /obj/item/stack/sheet/mineral/silver
+ type = /obj/item/stack/material/silver
if("diamond")
- type = /obj/item/stack/sheet/mineral/diamond
+ type = /obj/item/stack/material/diamond
if("phoron")
- type = /obj/item/stack/sheet/mineral/phoron
+ type = /obj/item/stack/material/phoron
if("uranium")
- type = /obj/item/stack/sheet/mineral/uranium
+ type = /obj/item/stack/material/uranium
else
return 0
var/result = 0
- var/obj/item/stack/sheet/res = new type(src)
+ var/obj/item/stack/material/res = new type(src)
// amount available to take out
var/total_amount = round(resources[mat_string]/res.perunit)
@@ -775,25 +775,25 @@
I.crit_fail = 1
I.loc = src.loc
if(src.resources[DEFAULT_WALL_MATERIAL] >= 3750)
- var/obj/item/stack/sheet/metal/G = new /obj/item/stack/sheet/metal(src.loc)
+ var/obj/item/stack/material/steel/G = new /obj/item/stack/material/steel(src.loc)
G.amount = round(src.resources[DEFAULT_WALL_MATERIAL] / G.perunit)
if(src.resources["glass"] >= 3750)
- var/obj/item/stack/sheet/glass/G = new /obj/item/stack/sheet/glass(src.loc)
+ var/obj/item/stack/material/glass/G = new /obj/item/stack/material/glass(src.loc)
G.amount = round(src.resources["glass"] / G.perunit)
if(src.resources["phoron"] >= 2000)
- var/obj/item/stack/sheet/mineral/phoron/G = new /obj/item/stack/sheet/mineral/phoron(src.loc)
+ var/obj/item/stack/material/phoron/G = new /obj/item/stack/material/phoron(src.loc)
G.amount = round(src.resources["phoron"] / G.perunit)
if(src.resources["silver"] >= 2000)
- var/obj/item/stack/sheet/mineral/silver/G = new /obj/item/stack/sheet/mineral/silver(src.loc)
+ var/obj/item/stack/material/silver/G = new /obj/item/stack/material/silver(src.loc)
G.amount = round(src.resources["silver"] / G.perunit)
if(src.resources["gold"] >= 2000)
- var/obj/item/stack/sheet/mineral/gold/G = new /obj/item/stack/sheet/mineral/gold(src.loc)
+ var/obj/item/stack/material/gold/G = new /obj/item/stack/material/gold(src.loc)
G.amount = round(src.resources["gold"] / G.perunit)
if(src.resources["uranium"] >= 2000)
- var/obj/item/stack/sheet/mineral/uranium/G = new /obj/item/stack/sheet/mineral/uranium(src.loc)
+ var/obj/item/stack/material/uranium/G = new /obj/item/stack/material/uranium(src.loc)
G.amount = round(src.resources["uranium"] / G.perunit)
if(src.resources["diamond"] >= 2000)
- var/obj/item/stack/sheet/mineral/diamond/G = new /obj/item/stack/sheet/mineral/diamond(src.loc)
+ var/obj/item/stack/material/diamond/G = new /obj/item/stack/material/diamond(src.loc)
G.amount = round(src.resources["diamond"] / G.perunit)
qdel(src)
return 1
@@ -807,19 +807,19 @@
var/material
switch(W.type)
- if(/obj/item/stack/sheet/mineral/gold)
+ if(/obj/item/stack/material/gold)
material = "gold"
- if(/obj/item/stack/sheet/mineral/silver)
+ if(/obj/item/stack/material/silver)
material = "silver"
- if(/obj/item/stack/sheet/mineral/diamond)
+ if(/obj/item/stack/material/diamond)
material = "diamond"
- if(/obj/item/stack/sheet/mineral/phoron)
+ if(/obj/item/stack/material/phoron)
material = "phoron"
- if(/obj/item/stack/sheet/metal)
+ if(/obj/item/stack/material/steel)
material = DEFAULT_WALL_MATERIAL
- if(/obj/item/stack/sheet/glass)
+ if(/obj/item/stack/material/glass)
material = "glass"
- if(/obj/item/stack/sheet/mineral/uranium)
+ if(/obj/item/stack/material/uranium)
material = "uranium"
else
return ..()
@@ -828,7 +828,7 @@
user << "The fabricator is currently processing. Please wait until completion."
return
- var/obj/item/stack/sheet/stack = W
+ var/obj/item/stack/material/stack = W
var/sname = "[stack.name]"
var/amnt = stack.perunit
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index b52f98827a..d1d2a37ea2 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -1764,8 +1764,9 @@
if(!damage)
return 0
- src.log_message("Attack by an animal. Attacker - [user].",1)
+ src.log_message("Attacked. Attacker - [user].",1)
+ user.do_attack_animation(src)
if(!prob(src.deflect_chance))
src.take_damage(damage)
src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm
index 167b9f63d0..98e81cb83f 100644
--- a/code/game/mecha/mecha_construction_paths.dm
+++ b/code/game/mecha/mecha_construction_paths.dm
@@ -108,7 +108,7 @@
"backkey"=/obj/item/weapon/crowbar,
"desc"="External armor is installed."),
//3
- list("key"=/obj/item/stack/sheet/plasteel,
+ list("key"=/obj/item/stack/material/plasteel,
"backkey"=/obj/item/weapon/weldingtool,
"desc"="Internal armor is welded."),
//4
@@ -120,7 +120,7 @@
"backkey"=/obj/item/weapon/crowbar,
"desc"="Internal armor is installed"),
//6
- list("key"=/obj/item/stack/sheet/metal,
+ list("key"=/obj/item/stack/material/steel,
"backkey"=/obj/item/weapon/screwdriver,
"desc"="Peripherals control module is secured"),
//7
@@ -236,7 +236,7 @@
holder.icon_state = "ripley10"
else
user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].")
- var/obj/item/stack/sheet/metal/MS = new /obj/item/stack/sheet/metal(get_turf(holder))
+ var/obj/item/stack/material/steel/MS = new /obj/item/stack/material/steel(get_turf(holder))
MS.amount = 5
holder.icon_state = "ripley8"
if(4)
@@ -259,7 +259,7 @@
holder.icon_state = "ripley13"
else
user.visible_message("[user] pries external armor layer from [holder].", "You prie external armor layer from [holder].")
- var/obj/item/stack/sheet/plasteel/MS = new /obj/item/stack/sheet/plasteel(get_turf(holder))
+ var/obj/item/stack/material/plasteel/MS = new /obj/item/stack/material/plasteel(get_turf(holder))
MS.amount = 5
holder.icon_state = "ripley11"
if(1)
@@ -330,7 +330,7 @@
"backkey"=/obj/item/weapon/crowbar,
"desc"="Internal armor is installed"),
//6
- list("key"=/obj/item/stack/sheet/metal,
+ list("key"=/obj/item/stack/material/steel,
"backkey"=/obj/item/weapon/screwdriver,
"desc"="Advanced capacitor is secured"),
//7
@@ -518,7 +518,7 @@
holder.icon_state = "gygax16"
else
user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].")
- var/obj/item/stack/sheet/metal/MS = new /obj/item/stack/sheet/metal(get_turf(holder))
+ var/obj/item/stack/material/steel/MS = new /obj/item/stack/material/steel(get_turf(holder))
MS.amount = 5
holder.icon_state = "gygax14"
if(4)
@@ -599,11 +599,11 @@
"backkey"=/obj/item/weapon/crowbar,
"desc"="External armor is installed."),
//3
- list("key"=/obj/item/stack/sheet/plasteel,
+ list("key"=/obj/item/stack/material/plasteel,
"backkey"=/obj/item/weapon/crowbar,
"desc"="External armor is being installed."),
//4
- list("key"=/obj/item/stack/sheet/plasteel,
+ list("key"=/obj/item/stack/material/plasteel,
"backkey"=/obj/item/weapon/weldingtool,
"desc"="Internal armor is welded."),
//5
@@ -616,7 +616,7 @@
"desc"="Internal armor is installed"),
//7
- list("key"=/obj/item/stack/sheet/plasteel,
+ list("key"=/obj/item/stack/material/plasteel,
"backkey"=/obj/item/weapon/screwdriver,
"desc"="Peripherals control module is secured"),
//8
@@ -733,7 +733,7 @@
holder.icon_state = "fireripley10"
else
user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].")
- var/obj/item/stack/sheet/plasteel/MS = new /obj/item/stack/sheet/plasteel(get_turf(holder))
+ var/obj/item/stack/material/plasteel/MS = new /obj/item/stack/material/plasteel(get_turf(holder))
MS.amount = 5
holder.icon_state = "fireripley8"
if(5)
@@ -756,7 +756,7 @@
holder.icon_state = "fireripley13"
else
user.visible_message("[user] removes the external armor from [holder].", "You remove the external armor from [holder].")
- var/obj/item/stack/sheet/plasteel/MS = new /obj/item/stack/sheet/plasteel(get_turf(holder))
+ var/obj/item/stack/material/plasteel/MS = new /obj/item/stack/material/plasteel(get_turf(holder))
MS.amount = 5
holder.icon_state = "fireripley11"
if(2)
@@ -765,7 +765,7 @@
holder.icon_state = "fireripley14"
else
user.visible_message("[user] pries external armor layer from [holder].", "You prie external armor layer from [holder].")
- var/obj/item/stack/sheet/plasteel/MS = new /obj/item/stack/sheet/plasteel(get_turf(holder))
+ var/obj/item/stack/material/plasteel/MS = new /obj/item/stack/material/plasteel(get_turf(holder))
MS.amount = 5
holder.icon_state = "fireripley12"
if(1)
@@ -833,7 +833,7 @@
"backkey"=/obj/item/weapon/crowbar,
"desc"="Internal armor is installed"),
//6
- list("key"=/obj/item/stack/sheet/metal,
+ list("key"=/obj/item/stack/material/steel,
"backkey"=/obj/item/weapon/screwdriver,
"desc"="Advanced capacitor is secured"),
//7
@@ -1022,7 +1022,7 @@
holder.icon_state = "durand16"
else
user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].")
- var/obj/item/stack/sheet/metal/MS = new /obj/item/stack/sheet/metal(get_turf(holder))
+ var/obj/item/stack/material/steel/MS = new /obj/item/stack/material/steel(get_turf(holder))
MS.amount = 5
holder.icon_state = "durand14"
if(4)
@@ -1125,7 +1125,7 @@
"backkey"=/obj/item/weapon/crowbar,
"desc"="External armor is installed."),
//3
- list("key"=/obj/item/stack/sheet/plasteel,
+ list("key"=/obj/item/stack/material/plasteel,
"backkey"=/obj/item/weapon/weldingtool,
"desc"="Internal armor is welded."),
//4
@@ -1137,7 +1137,7 @@
"backkey"=/obj/item/weapon/crowbar,
"desc"="Internal armor is installed"),
//6
- list("key"=/obj/item/stack/sheet/metal,
+ list("key"=/obj/item/stack/material/steel,
"backkey"=/obj/item/weapon/screwdriver,
"desc"="Peripherals control module is secured"),
//7
@@ -1253,7 +1253,7 @@
holder.icon_state = "odysseus10"
else
user.visible_message("[user] pries internal armor layer from [holder].", "You prie internal armor layer from [holder].")
- var/obj/item/stack/sheet/metal/MS = new /obj/item/stack/sheet/metal(get_turf(holder))
+ var/obj/item/stack/material/steel/MS = new /obj/item/stack/material/steel(get_turf(holder))
MS.amount = 5
holder.icon_state = "odysseus8"
if(4)
@@ -1276,7 +1276,7 @@
user.visible_message("[user] secures external armor layer.", "You secure external reinforced armor layer.")
holder.icon_state = "odysseus13"
else
- var/obj/item/stack/sheet/plasteel/MS = new /obj/item/stack/sheet/plasteel(get_turf(holder))
+ var/obj/item/stack/material/plasteel/MS = new /obj/item/stack/material/plasteel(get_turf(holder))
MS.amount = 5
user.visible_message("[user] pries [MS] from [holder].", "You prie [MS] from [holder].")
holder.icon_state = "odysseus11"
diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm
index 8bbeb03fd7..d9e96bca19 100644
--- a/code/game/mecha/mecha_wreckage.dm
+++ b/code/game/mecha/mecha_wreckage.dm
@@ -10,7 +10,7 @@
density = 1
anchored = 0
opacity = 0
- var/list/welder_salvage = list(/obj/item/stack/sheet/plasteel,/obj/item/stack/sheet/metal,/obj/item/stack/rods)
+ var/list/welder_salvage = list(/obj/item/stack/material/plasteel,/obj/item/stack/material/steel,/obj/item/stack/rods)
var/list/wirecutters_salvage = list(/obj/item/stack/cable_coil)
var/list/crowbar_salvage
var/salvage_num = 5
diff --git a/code/game/objects/items/apc_frame.dm b/code/game/objects/items/apc_frame.dm
index 208a2111da..0f3fdde0d8 100644
--- a/code/game/objects/items/apc_frame.dm
+++ b/code/game/objects/items/apc_frame.dm
@@ -10,7 +10,7 @@
/obj/item/apc_frame/attackby(obj/item/weapon/W as obj, mob/user as mob)
..()
if (istype(W, /obj/item/weapon/wrench))
- new /obj/item/stack/sheet/metal( get_turf(src.loc), 2 )
+ new /obj/item/stack/material/steel( get_turf(src.loc), 2 )
qdel(src)
/obj/item/apc_frame/proc/try_build(turf/on_wall)
diff --git a/code/game/objects/items/ashtray.dm b/code/game/objects/items/ashtray.dm
index abb6adb48d..63059fef8e 100644
--- a/code/game/objects/items/ashtray.dm
+++ b/code/game/objects/items/ashtray.dm
@@ -1,25 +1,54 @@
-/obj/item/ashtray
- icon = 'icons/ashtray.dmi'
- var/
- max_butts = 0
- empty_desc = ""
- icon_empty = ""
- icon_half = ""
- icon_full = ""
- icon_broken = ""
+var/global/list/ashtray_cache = list()
-/obj/item/ashtray/New()
- ..()
+/obj/item/weapon/material/ashtray
+ name = "ashtray"
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "blank"
+ force_divisor = 0.1
+ thrown_force_divisor = 0.1
+ var/image/base_image
+ var/max_butts = 10
+
+/obj/item/weapon/material/ashtray/New(var/newloc, var/material_name)
+ ..(newloc, material_name)
+ if(!material)
+ qdel(src)
+ return
+ max_butts = round(material.hardness/10) //This is arbitrary but whatever.
src.pixel_y = rand(-5, 5)
src.pixel_x = rand(-6, 6)
+ update_icon()
return
-/obj/item/ashtray/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if (health < 1)
+/obj/item/weapon/material/ashtray/update_icon()
+ color = null
+ overlays.Cut()
+ var/cache_key = "base-[material.name]"
+ if(!ashtray_cache[cache_key])
+ var/image/I = image('icons/obj/objects.dmi',"ashtray")
+ I.color = material.icon_colour
+ ashtray_cache[cache_key] = I
+ overlays |= ashtray_cache[cache_key]
+
+ if (contents.len == max_butts)
+ if(!ashtray_cache["full"])
+ ashtray_cache["full"] = image('icons/obj/objects.dmi',"ashtray_full")
+ overlays |= ashtray_cache["full"]
+ desc = "It's stuffed full."
+ else if (contents.len > max_butts/2)
+ if(!ashtray_cache["half"])
+ ashtray_cache["half"] = image('icons/obj/objects.dmi',"ashtray_half")
+ overlays |= ashtray_cache["half"]
+ desc = "It's half-filled."
+ else
+ desc = "An ashtray made of [material.display_name]."
+
+/obj/item/weapon/material/ashtray/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if (health <= 0)
return
if (istype(W,/obj/item/weapon/cigbutt) || istype(W,/obj/item/clothing/mask/smokable/cigarette) || istype(W, /obj/item/weapon/flame/match))
if (contents.len >= max_butts)
- user << "This ashtray is full."
+ user << "\The [src] is full."
return
user.remove_from_mob(W)
W.loc = src
@@ -27,12 +56,14 @@
if (istype(W,/obj/item/clothing/mask/smokable/cigarette))
var/obj/item/clothing/mask/smokable/cigarette/cig = W
if (cig.lit == 1)
- src.visible_message("[user] crushes [cig] in [src], putting it out.")
+ src.visible_message("[user] crushes [cig] in \the [src], putting it out.")
processing_objects.Remove(cig)
var/obj/item/butt = new cig.type_butt(src)
cig.transfer_fingerprints_to(butt)
qdel(cig)
W = butt
+ spawn(1)
+ TemperatureAct(150)
else if (cig.lit == 0)
user << "You place [cig] in [src] without even smoking it. Why would you do that?"
@@ -40,12 +71,7 @@
user.update_inv_l_hand()
user.update_inv_r_hand()
add_fingerprint(user)
- if (contents.len == max_butts)
- icon_state = icon_full
- desc = empty_desc + " It's stuffed full."
- else if (contents.len > max_butts/2)
- icon_state = icon_half
- desc = empty_desc + " It's half-filled."
+ update_icon()
else
health = max(0,health - W.force)
user << "You hit [src] with [W]."
@@ -53,83 +79,29 @@
die()
return
-/obj/item/ashtray/throw_impact(atom/hit_atom)
+/obj/item/weapon/material/ashtray/throw_impact(atom/hit_atom)
if (health > 0)
health = max(0,health - 3)
if (health < 1)
die()
return
if (contents.len)
- src.visible_message("\red [src] slams into [hit_atom] spilling its contents!")
+ src.visible_message("\The [src] slams into [hit_atom], spilling its contents!")
for (var/obj/item/clothing/mask/smokable/cigarette/O in contents)
O.loc = src.loc
- icon_state = icon_empty
+ update_icon()
return ..()
-/obj/item/ashtray/proc/die()
- src.visible_message("\red [src] shatters spilling its contents!")
- for (var/obj/item/clothing/mask/smokable/cigarette/O in contents)
- O.loc = src.loc
- icon_state = icon_broken
+/obj/item/weapon/material/ashtray/proc/die()
+ material.place_shard(get_turf(src))
+ qdel(src)
+ return
-/obj/item/ashtray/plastic
- name = "plastic ashtray"
- desc = "Cheap plastic ashtray."
- icon_state = "ashtray_bl"
- icon_empty = "ashtray_bl"
- icon_half = "ashtray_half_bl"
- icon_full = "ashtray_full_bl"
- icon_broken = "ashtray_bork_bl"
- max_butts = 14
- health = 24.0
- matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 30)
- empty_desc = "Cheap plastic ashtray."
- throwforce = 3.0
- die()
- ..()
- name = "pieces of plastic"
- desc = "Pieces of plastic with ash on them."
- return
+/obj/item/weapon/material/ashtray/plastic/New(var/newloc)
+ ..(newloc, "plastic")
+/obj/item/weapon/material/ashtray/bronze/New(var/newloc)
+ ..(newloc, "gold") //placeholder
-/obj/item/ashtray/bronze
- name = "bronze ashtray"
- desc = "Massive bronze ashtray."
- icon_state = "ashtray_br"
- icon_empty = "ashtray_br"
- icon_half = "ashtray_half_br"
- icon_full = "ashtray_full_br"
- icon_broken = "ashtray_bork_br"
- max_butts = 10
- health = 72.0
- matter = list(DEFAULT_WALL_MATERIAL = 80)
- empty_desc = "Massive bronze ashtray."
- throwforce = 10.0
-
- die()
- ..()
- name = "pieces of bronze"
- desc = "Pieces of bronze with ash on them."
- return
-
-
-/obj/item/ashtray/glass
- name = "glass ashtray"
- desc = "Glass ashtray. Looks fragile."
- icon_state = "ashtray_gl"
- icon_empty = "ashtray_gl"
- icon_half = "ashtray_half_gl"
- icon_full = "ashtray_full_gl"
- icon_broken = "ashtray_bork_gl"
- max_butts = 12
- health = 12.0
- matter = list("glass" = 60)
- empty_desc = "Glass ashtray. Looks fragile."
- throwforce = 6.0
-
- die()
- ..()
- name = "shards of glass"
- desc = "Shards of glass with ash on them."
- playsound(src, "shatter", 30, 1)
- return
\ No newline at end of file
+/obj/item/weapon/material/ashtray/glass/New(var/newloc)
+ ..(newloc, "glass")
diff --git a/code/game/objects/items/devices/floor_painter.dm b/code/game/objects/items/devices/floor_painter.dm
index a1c21a7b3f..43bc58261b 100644
--- a/code/game/objects/items/devices/floor_painter.dm
+++ b/code/game/objects/items/devices/floor_painter.dm
@@ -108,7 +108,7 @@
mode_nice = design
mode = "[replacetext(design, "-", "")]full"
if("corner")
- var/design = input("Which design?", "Floor painter") in list("black", "red", "blue", "green", "yellow", "purple", "neutral", "white", "white-grey", "white-red", "white-blue", "white-green", "white-yellow", "white-purple")
+ var/design = input("Which design?", "Floor painter") in list("black", "red", "blue", "green", "yellow", "purple", "neutral", "white", "white-red", "white-blue", "white-green", "white-yellow", "white-purple")
mode_nice = "[design] corner"
mode = "[replacetext(design, "-", "")]corner"
tile_dir_mode = 2
@@ -128,11 +128,13 @@
if(design == "white")
mode = "whitehall"
mode_nice = "white side"
- tile_dir_mode = 1
+ else if(design == "black") // because SOMEONE made the black/grey side/corner sprite have the same name as the 'empty space' sprite :(
+ mode = "blackfloor"
+ mode_nice = design
else
mode_nice = design
mode = replacetext(design, "-", "")
- tile_dir_mode = 1
+ tile_dir_mode = 1
if("special")
var/design = input("Which design?", "Floor painter") in list("arrival", "escape", "caution", "warning", "white-warning", "white-blue-green", "loadingarea", "delivery", "bot", "white-delivery", "white-bot")
if(design == "white-blue-green")
diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm
index e9c3687fe4..cd930cc577 100644
--- a/code/game/objects/items/devices/lightreplacer.dm
+++ b/code/game/objects/items/devices/lightreplacer.dm
@@ -71,8 +71,8 @@
Emag()
return
- if(istype(W, /obj/item/stack/sheet/glass))
- var/obj/item/stack/sheet/glass/G = W
+ if(istype(W, /obj/item/stack/material/glass))
+ var/obj/item/stack/material/glass/G = W
if(uses >= max_uses)
user << "[src.name] is full."
return
diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm
index e1ebc9fdc1..563df642ef 100644
--- a/code/game/objects/items/robot/robot_parts.dm
+++ b/code/game/objects/items/robot/robot_parts.dm
@@ -125,8 +125,8 @@
/obj/item/robot_parts/robot_suit/attackby(obj/item/W as obj, mob/user as mob)
..()
- if(istype(W, /obj/item/stack/sheet/metal) && !l_arm && !r_arm && !l_leg && !r_leg && !chest && !head)
- var/obj/item/stack/sheet/metal/M = W
+ if(istype(W, /obj/item/stack/material/steel) && !l_arm && !r_arm && !l_leg && !r_leg && !chest && !head)
+ var/obj/item/stack/material/steel/M = W
if (M.use(1))
var/obj/item/weapon/secbot_assembly/ed209_assembly/B = new /obj/item/weapon/secbot_assembly/ed209_assembly
B.loc = get_turf(src)
diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm
index e3bbce8386..ff5514a3db 100644
--- a/code/game/objects/items/stacks/rods.dm
+++ b/code/game/objects/items/stacks/rods.dm
@@ -32,7 +32,7 @@
return
if(WT.remove_fuel(0,user))
- var/obj/item/stack/sheet/metal/new_item = new(usr.loc)
+ var/obj/item/stack/material/steel/new_item = new(usr.loc)
new_item.add_to_stacks(usr)
for (var/mob/M in viewers(src))
M.show_message("\red [src] is shaped into metal by [user.name] with the weldingtool.", 3, "\red You hear welding.", 2)
diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm
index cac3fffad7..fd20de103c 100644
--- a/code/game/objects/items/stacks/sheets/glass.dm
+++ b/code/game/objects/items/stacks/sheets/glass.dm
@@ -10,32 +10,19 @@
/*
* Glass sheets
*/
-/obj/item/stack/sheet/glass
+/obj/item/stack/material/glass
name = "glass"
- desc = "HOLY SHEET! That is a lot of glass."
singular_name = "glass sheet"
icon_state = "sheet-glass"
- matter = list("glass" = 3750)
- origin_tech = "materials=1"
var/created_window = /obj/structure/window/basic
var/is_reinforced = 0
var/list/construction_options = list("One Direction", "Full Window")
- sheettype = "glass"
+ default_type = "glass"
-/obj/item/stack/sheet/glass/cyborg
- name = "glass synthesizer"
- desc = "A device that makes glass."
- gender = NEUTER
- singular_name = "glass"
- matter = null
- uses_charge = 1
- charge_costs = list(1000)
- stacktype = /obj/item/stack/sheet/glass
-
-/obj/item/stack/sheet/glass/attack_self(mob/user as mob)
+/obj/item/stack/material/glass/attack_self(mob/user as mob)
construct_window(user)
-/obj/item/stack/sheet/glass/attackby(obj/item/W, mob/user)
+/obj/item/stack/material/glass/attackby(obj/item/W, mob/user)
..()
if(!is_reinforced)
if(istype(W,/obj/item/stack/cable_coil))
@@ -54,10 +41,10 @@
user << "You need one rod and one sheet of glass to make reinforced glass."
return
- var/obj/item/stack/sheet/glass/reinforced/RG = new (user.loc)
+ var/obj/item/stack/material/glass/reinforced/RG = new (user.loc)
RG.add_fingerprint(user)
RG.add_to_stacks(user)
- var/obj/item/stack/sheet/glass/G = src
+ var/obj/item/stack/material/glass/G = src
src = null
var/replace = (user.get_inactive_hand()==G)
V.use(1)
@@ -65,7 +52,7 @@
if (!G && replace)
user.put_in_hands(RG)
-/obj/item/stack/sheet/glass/proc/construct_window(mob/user as mob)
+/obj/item/stack/material/glass/proc/construct_window(mob/user as mob)
if(!user || !src) return 0
if(!istype(user.loc,/turf)) return 0
if(!user.IsAdvancedToolUser())
@@ -139,53 +126,34 @@
/*
* Reinforced glass sheets
*/
-/obj/item/stack/sheet/glass/reinforced
+/obj/item/stack/material/glass/reinforced
name = "reinforced glass"
- desc = "Glass which has been reinforced with metal rods."
singular_name = "reinforced glass sheet"
icon_state = "sheet-rglass"
-
- matter = list(DEFAULT_WALL_MATERIAL = 1875,"glass" = 3750)
- origin_tech = "materials=2"
-
+ default_type = "reinforced glass"
created_window = /obj/structure/window/reinforced
is_reinforced = 1
construction_options = list("One Direction", "Full Window", "Windoor")
-/obj/item/stack/sheet/glass/reinforced/cyborg
- name = "reinforced glass synthesizer"
- desc = "A device that makes reinforced glass."
- gender = NEUTER
- matter = null
- uses_charge = 2
- charge_costs = list(1000)
- singular_name = "reinforced glass sheet"
- icon_state = "sheet-rglass"
- charge_costs = list(500, 1000)
- stacktype = /obj/item/stack/sheet/glass/reinforced
-
/*
* Phoron Glass sheets
*/
-/obj/item/stack/sheet/glass/phoronglass
+/obj/item/stack/material/glass/phoronglass
name = "phoron glass"
- desc = "A very strong and very resistant sheet of a phoron-glass alloy."
singular_name = "phoron glass sheet"
icon_state = "sheet-phoronglass"
- matter = list("glass" = 7500)
- origin_tech = "materials=3;phorontech=2"
created_window = /obj/structure/window/phoronbasic
- sheettype = "phoronglass"
+ default_type = "phoron glass"
-/obj/item/stack/sheet/glass/phoronglass/attackby(obj/item/W, mob/user)
+/obj/item/stack/material/glass/phoronglass/attackby(obj/item/W, mob/user)
..()
if( istype(W, /obj/item/stack/rods) )
var/obj/item/stack/rods/V = W
- var/obj/item/stack/sheet/glass/phoronrglass/RG = new (user.loc)
+ var/obj/item/stack/material/glass/phoronrglass/RG = new (user.loc)
RG.add_fingerprint(user)
RG.add_to_stacks(user)
V.use(1)
- var/obj/item/stack/sheet/glass/G = src
+ var/obj/item/stack/material/glass/G = src
src = null
var/replace = (user.get_inactive_hand()==G)
G.use(1)
@@ -197,13 +165,10 @@
/*
* Reinforced phoron glass sheets
*/
-/obj/item/stack/sheet/glass/phoronrglass
+/obj/item/stack/material/glass/phoronrglass
name = "reinforced phoron glass"
- desc = "Phoron glass which has been reinforced with metal rods."
singular_name = "reinforced phoron glass sheet"
icon_state = "sheet-phoronrglass"
- matter = list("glass" = 7500,DEFAULT_WALL_MATERIAL = 1875)
-
- origin_tech = "materials=4;phorontech=2"
+ default_type = "reinforced phoron glass"
created_window = /obj/structure/window/phoronreinforced
is_reinforced = 1
diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm
index a3e7ed53e2..87cdf3b4c2 100644
--- a/code/game/objects/items/stacks/sheets/leather.dm
+++ b/code/game/objects/items/stacks/sheets/leather.dm
@@ -1,39 +1,39 @@
-/obj/item/stack/sheet/animalhide/human
+/obj/item/stack/material/animalhide/human
name = "human skin"
desc = "The by-product of human farming."
singular_name = "human skin piece"
icon_state = "sheet-hide"
origin_tech = ""
-/obj/item/stack/sheet/animalhide/corgi
+/obj/item/stack/material/animalhide/corgi
name = "corgi hide"
desc = "The by-product of corgi farming."
singular_name = "corgi hide piece"
icon_state = "sheet-corgi"
origin_tech = ""
-/obj/item/stack/sheet/animalhide/cat
+/obj/item/stack/material/animalhide/cat
name = "cat hide"
desc = "The by-product of cat farming."
singular_name = "cat hide piece"
icon_state = "sheet-cat"
origin_tech = ""
-/obj/item/stack/sheet/animalhide/monkey
+/obj/item/stack/material/animalhide/monkey
name = "monkey hide"
desc = "The by-product of monkey farming."
singular_name = "monkey hide piece"
icon_state = "sheet-monkey"
origin_tech = ""
-/obj/item/stack/sheet/animalhide/lizard
+/obj/item/stack/material/animalhide/lizard
name = "lizard skin"
desc = "Sssssss..."
singular_name = "lizard skin piece"
icon_state = "sheet-lizard"
origin_tech = ""
-/obj/item/stack/sheet/animalhide/xeno
+/obj/item/stack/material/animalhide/xeno
name = "alien hide"
desc = "The skin of a terrible creature."
singular_name = "alien hide piece"
@@ -41,7 +41,7 @@
origin_tech = ""
//don't see anywhere else to put these, maybe together they could be used to make the xenos suit?
-/obj/item/stack/sheet/xenochitin
+/obj/item/stack/material/xenochitin
name = "alien chitin"
desc = "A piece of the hide of a terrible creature."
singular_name = "alien hide piece"
@@ -63,14 +63,14 @@
icon_state = "weed_extract"
origin_tech = ""
-/obj/item/stack/sheet/hairlesshide
+/obj/item/stack/material/hairlesshide
name = "hairless hide"
desc = "This hide was stripped of it's hair, but still needs tanning."
singular_name = "hairless hide piece"
icon_state = "sheet-hairlesshide"
origin_tech = ""
-/obj/item/stack/sheet/wetleather
+/obj/item/stack/material/wetleather
name = "wet leather"
desc = "This leather has been cleaned but still needs to be dried."
singular_name = "wet leather piece"
@@ -79,35 +79,25 @@
var/wetness = 30 //Reduced when exposed to high temperautres
var/drying_threshold_temperature = 500 //Kelvin to start drying
-/obj/item/stack/sheet/leather
- name = "leather"
- desc = "The by-product of mob grinding."
- singular_name = "leather piece"
- icon_state = "sheet-leather"
- origin_tech = "materials=2"
-
-
-
//Step one - dehairing.
-
-/obj/item/stack/sheet/animalhide/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if( istype(W, /obj/item/weapon/kitchenknife) || \
- istype(W, /obj/item/weapon/kitchen/utensil/knife) || \
- istype(W, /obj/item/weapon/twohanded/fireaxe) || \
- istype(W, /obj/item/weapon/hatchet) )
+/obj/item/stack/material/animalhide/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if( istype(W, /obj/item/weapon/material/knife) || \
+ istype(W, /obj/item/weapon/material/kitchen/utensil/knife) || \
+ istype(W, /obj/item/weapon/material/twohanded/fireaxe) || \
+ istype(W, /obj/item/weapon/material/hatchet) )
//visible message on mobs is defined as visible_message(var/message, var/self_message, var/blind_message)
usr.visible_message("\blue \the [usr] starts cutting hair off \the [src]", "\blue You start cutting the hair off \the [src]", "You hear the sound of a knife rubbing against flesh")
if(do_after(user,50))
usr << "\blue You cut the hair from this [src.singular_name]"
//Try locating an exisitng stack on the tile and add to there if possible
- for(var/obj/item/stack/sheet/hairlesshide/HS in usr.loc)
+ for(var/obj/item/stack/material/hairlesshide/HS in usr.loc)
if(HS.amount < 50)
HS.amount++
src.use(1)
break
//If it gets to here it means it did not find a suitable stack on the tile.
- var/obj/item/stack/sheet/hairlesshide/HS = new(usr.loc)
+ var/obj/item/stack/material/hairlesshide/HS = new(usr.loc)
HS.amount = 1
src.use(1)
else
@@ -117,20 +107,20 @@
//Step two - washing..... it's actually in washing machine code.
//Step three - drying
-/obj/item/stack/sheet/wetleather/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+/obj/item/stack/material/wetleather/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
..()
if(exposed_temperature >= drying_threshold_temperature)
wetness--
if(wetness == 0)
//Try locating an exisitng stack on the tile and add to there if possible
- for(var/obj/item/stack/sheet/leather/HS in src.loc)
+ for(var/obj/item/stack/material/leather/HS in src.loc)
if(HS.amount < 50)
HS.amount++
src.use(1)
wetness = initial(wetness)
break
//If it gets to here it means it did not find a suitable stack on the tile.
- var/obj/item/stack/sheet/leather/HS = new(src.loc)
+ var/obj/item/stack/material/leather/HS = new(src.loc)
HS.amount = 1
wetness = initial(wetness)
src.use(1)
diff --git a/code/game/objects/items/stacks/sheets/light.dm b/code/game/objects/items/stacks/sheets/light.dm
index f43d7ae320..b32cb54def 100644
--- a/code/game/objects/items/stacks/sheets/light.dm
+++ b/code/game/objects/items/stacks/sheets/light.dm
@@ -17,13 +17,13 @@
var/obj/item/stack/cable_coil/CC = new/obj/item/stack/cable_coil(user.loc)
CC.amount = 5
amount--
- new/obj/item/stack/sheet/glass(user.loc)
+ new/obj/item/stack/material/glass(user.loc)
if(amount <= 0)
user.drop_from_inventory(src)
qdel(src)
- if(istype(O,/obj/item/stack/sheet/metal))
- var/obj/item/stack/sheet/metal/M = O
+ if(istype(O,/obj/item/stack/material/steel))
+ var/obj/item/stack/material/steel/M = O
if (M.use(1))
use(1)
new/obj/item/stack/tile/light(get_turf(user))
diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm
deleted file mode 100644
index 1e6fd887f5..0000000000
--- a/code/game/objects/items/stacks/sheets/mineral.dm
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
-Mineral Sheets
- Contains:
- - Sandstone
- - Diamond
- - Uranium
- - Phoron
- - Gold
- - Silver
- - Enriched Uranium
- - Platinum
- - Metallic Hydrogen
- - Tritium
- - Osmium
-*/
-
-var/global/list/datum/stack_recipe/sandstone_recipes = list ( \
- new/datum/stack_recipe("pile of dirt", /obj/machinery/portable_atmospherics/hydroponics/soil, 3, time = 10, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("sandstone door", /obj/structure/mineral_door/sandstone, 10, one_per_turf = 1, on_floor = 1), \
- )
-
-var/global/list/datum/stack_recipe/silver_recipes = list ( \
- new/datum/stack_recipe("silver door", /obj/structure/mineral_door/silver, 10, one_per_turf = 1, on_floor = 1), \
- )
-
-var/global/list/datum/stack_recipe/diamond_recipes = list ( \
- new/datum/stack_recipe("diamond door", /obj/structure/mineral_door/transparent/diamond, 10, one_per_turf = 1, on_floor = 1), \
- )
-
-var/global/list/datum/stack_recipe/uranium_recipes = list ( \
- new/datum/stack_recipe("uranium door", /obj/structure/mineral_door/uranium, 10, one_per_turf = 1, on_floor = 1), \
- )
-
-var/global/list/datum/stack_recipe/gold_recipes = list ( \
- new/datum/stack_recipe("golden door", /obj/structure/mineral_door/gold, 10, one_per_turf = 1, on_floor = 1), \
- )
-
-var/global/list/datum/stack_recipe/phoron_recipes = list ( \
- new/datum/stack_recipe("phoron door", /obj/structure/mineral_door/transparent/phoron, 10, one_per_turf = 1, on_floor = 1), \
- )
-
-var/global/list/datum/stack_recipe/plastic_recipes = list ( \
- new/datum/stack_recipe("plastic crate", /obj/structure/closet/crate/plastic, 10, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("plastic ashtray", /obj/item/ashtray/plastic, 2, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("plastic fork", /obj/item/weapon/kitchen/utensil/pfork, 1, on_floor = 1), \
- new/datum/stack_recipe("plastic spoon", /obj/item/weapon/kitchen/utensil/pspoon, 1, on_floor = 1), \
- new/datum/stack_recipe("plastic knife", /obj/item/weapon/kitchen/utensil/pknife, 1, on_floor = 1), \
- new/datum/stack_recipe("plastic bag", /obj/item/weapon/storage/bag/plasticbag, 3, on_floor = 1), \
- new/datum/stack_recipe("blood pack", /obj/item/weapon/reagent_containers/blood/empty, 4, on_floor = 0), \
- new/datum/stack_recipe("reagent dispenser cartridge (large)", /obj/item/weapon/reagent_containers/chem_disp_cartridge, 5, on_floor=0), // 500u
- new/datum/stack_recipe("reagent dispenser cartridge (med)", /obj/item/weapon/reagent_containers/chem_disp_cartridge/medium, 3, on_floor=0), // 250u
- new/datum/stack_recipe("reagent dispenser cartridge (small)", /obj/item/weapon/reagent_containers/chem_disp_cartridge/small, 1, on_floor=0) // 100u
- )
-
-var/global/list/datum/stack_recipe/iron_recipes = list ( \
- new/datum/stack_recipe("iron door", /obj/structure/mineral_door/iron, 20, one_per_turf = 1, on_floor = 1), \
- null, \
-)
-
-/obj/item/stack/sheet/mineral
- force = 5.0
- throwforce = 5
- w_class = 3.0
- throw_speed = 3
- throw_range = 3
-
-/obj/item/stack/sheet/mineral/New()
- ..()
- pixel_x = rand(0,4)-4
- pixel_y = rand(0,4)-4
-
-obj/item/stack/sheet/mineral/iron
- name = "iron"
- icon_state = "sheet-silver"
- origin_tech = "materials=1"
- sheettype = "iron"
- color = "#333333"
- perunit = 3750
-
-obj/item/stack/sheet/mineral/iron/New()
- ..()
- recipes = iron_recipes
-
-/obj/item/stack/sheet/mineral/sandstone
- name = "sandstone brick"
- desc = "This appears to be a combination of both sand and stone."
- singular_name = "sandstone brick"
- icon_state = "sheet-sandstone"
- throw_speed = 4
- throw_range = 5
- origin_tech = "materials=1"
- sheettype = "sandstone"
-
-/obj/item/stack/sheet/mineral/sandstone/New()
- ..()
- recipes = sandstone_recipes
-
-/obj/item/stack/sheet/mineral/diamond
- name = "diamond"
- icon_state = "sheet-diamond"
- origin_tech = "materials=6"
- perunit = 3750
- sheettype = "diamond"
-
-
-/obj/item/stack/sheet/mineral/diamond/New()
- ..()
- recipes = diamond_recipes
-
-/obj/item/stack/sheet/mineral/uranium
- name = "uranium"
- icon_state = "sheet-uranium"
- origin_tech = "materials=5"
- perunit = 2000
- sheettype = "uranium"
-
-/obj/item/stack/sheet/mineral/uranium/New()
- ..()
- recipes = uranium_recipes
-
-/obj/item/stack/sheet/mineral/phoron
- name = "solid phoron"
- icon_state = "sheet-phoron"
- origin_tech = "phorontech=2;materials=2"
- perunit = 2000
- sheettype = "phoron"
-
-/obj/item/stack/sheet/mineral/phoron/New()
- ..()
- recipes = phoron_recipes
-
-/obj/item/stack/sheet/mineral/plastic
- name = "Plastic"
- icon_state = "sheet-plastic"
- origin_tech = "materials=3"
- perunit = 2000
- sheettype = "plastic"
-
-/obj/item/stack/sheet/mineral/plastic/New()
- ..()
- recipes = plastic_recipes
-
-/obj/item/stack/sheet/mineral/plastic/cyborg
- name = "plastic sheets synthesizer"
- gender = NEUTER
- uses_charge = 1
- charge_costs = list(1000)
- stacktype = /obj/item/stack/sheet/mineral/plastic
-
-/obj/item/stack/sheet/mineral/gold
- name = "gold"
- icon_state = "sheet-gold"
- origin_tech = "materials=4"
- perunit = 2000
- sheettype = "gold"
-
-/obj/item/stack/sheet/mineral/gold/New()
- ..()
- recipes = gold_recipes
-
-/obj/item/stack/sheet/mineral/silver
- name = "silver"
- icon_state = "sheet-silver"
- origin_tech = "materials=3"
- perunit = 2000
- sheettype = "silver"
-
-/obj/item/stack/sheet/mineral/silver/New()
- ..()
- recipes = silver_recipes
-
-/obj/item/stack/sheet/mineral/enruranium
- name = "enriched uranium"
- icon_state = "sheet-enruranium"
- origin_tech = "materials=5"
- perunit = 1000
-
-//Valuable resource, cargo can sell it.
-/obj/item/stack/sheet/mineral/platinum
- name = "platinum"
- icon_state = "sheet-adamantine"
- origin_tech = "materials=2"
- sheettype = "platinum"
- perunit = 2000
-
-//Extremely valuable to Research.
-/obj/item/stack/sheet/mineral/mhydrogen
- name = "metallic hydrogen"
- icon_state = "sheet-mythril"
- origin_tech = "materials=6;powerstorage=5;magnets=5"
- sheettype = "mhydrogen"
- perunit = 2000
-
-//Fuel for MRSPACMAN generator.
-/obj/item/stack/sheet/mineral/tritium
- name = "tritium"
- icon_state = "sheet-silver"
- sheettype = "tritium"
- origin_tech = "materials=5"
- color = "#777777"
- perunit = 2000
-
-/obj/item/stack/sheet/mineral/osmium
- name = "osmium"
- icon_state = "sheet-silver"
- sheettype = "osmium"
- origin_tech = "materials=5"
- color = "#9999FF"
- perunit = 2000
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
deleted file mode 100644
index 4ba9ae9913..0000000000
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ /dev/null
@@ -1,223 +0,0 @@
-/* Diffrent misc types of sheets
- * Contains:
- * Metal
- * Plasteel
- * Wood
- * Cloth
- * Cardboard
- */
-
-/*
- * Metal
- */
-var/global/list/datum/stack_recipe/metal_recipes = list ( \
- new/datum/stack_recipe("stool", /obj/item/weapon/stool, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("chair", /obj/structure/bed/chair, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("bed", /obj/structure/bed, 2, one_per_turf = 1, on_floor = 1), \
- null, \
- new/datum/stack_recipe_list("office chairs",list( \
- new/datum/stack_recipe("dark office chair", /obj/structure/bed/chair/office/dark, 5, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("light office chair", /obj/structure/bed/chair/office/light, 5, one_per_turf = 1, on_floor = 1), \
- ), 5), \
- new/datum/stack_recipe_list("comfy chairs", list( \
- new/datum/stack_recipe("beige comfy chair", /obj/structure/bed/chair/comfy/beige, 2, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("black comfy chair", /obj/structure/bed/chair/comfy/black, 2, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("brown comfy chair", /obj/structure/bed/chair/comfy/brown, 2, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("lime comfy chair", /obj/structure/bed/chair/comfy/lime, 2, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("teal comfy chair", /obj/structure/bed/chair/comfy/teal, 2, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("red comfy chair", /obj/structure/bed/chair/comfy/red, 2, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("blue comfy chair", /obj/structure/bed/chair/comfy/blue, 2, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("purple comfy chair", /obj/structure/bed/chair/comfy/purp, 2, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("green comfy chair", /obj/structure/bed/chair/comfy/green, 2, one_per_turf = 1, on_floor = 1), \
- ), 2), \
- null, \
- new/datum/stack_recipe("table frame", /obj/structure/table, 1, time = 10, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("rack", /obj/structure/table/rack, 1, time = 5, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("metal baseball bat", /obj/item/weapon/twohanded/baseballbat/metal, 10, time = 20, one_per_turf = 0, on_floor = 1), \
- new/datum/stack_recipe("closet", /obj/structure/closet, 2, time = 15, one_per_turf = 1, on_floor = 1), \
- null, \
- new/datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 10, time = 15, one_per_turf = 1, on_floor = 1), \
- null, \
- new/datum/stack_recipe("cannon frame", /obj/item/weapon/cannonframe, 10, time = 15, one_per_turf = 0, on_floor = 0), \
- null, \
- new/datum/stack_recipe("floor tile", /obj/item/stack/tile/plasteel, 1, 4, 20), \
- new/datum/stack_recipe("metal rod", /obj/item/stack/rods, 1, 2, 60), \
- null, \
- new/datum/stack_recipe("computer frame", /obj/structure/computerframe, 5, time = 25, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("wall girders", /obj/structure/girder, 2, time = 50, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("machine frame", /obj/machinery/constructable_frame/machine_frame, 5, time = 25, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, time = 25, one_per_turf = 1, on_floor = 1), \
- null, \
- 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), \
- new/datum/stack_recipe("command airlock assembly", /obj/structure/door_assembly/door_assembly_com, 4, time = 50, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("security airlock assembly", /obj/structure/door_assembly/door_assembly_sec, 4, time = 50, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("engineering airlock assembly", /obj/structure/door_assembly/door_assembly_eng, 4, time = 50, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("mining airlock assembly", /obj/structure/door_assembly/door_assembly_min, 4, time = 50, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("atmospherics airlock assembly", /obj/structure/door_assembly/door_assembly_atmo, 4, time = 50, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("research airlock assembly", /obj/structure/door_assembly/door_assembly_research, 4, time = 50, one_per_turf = 1, on_floor = 1), \
-/* new/datum/stack_recipe("science airlock assembly", /obj/structure/door_assembly/door_assembly_science, 4, time = 50, one_per_turf = 1, on_floor = 1), \ */
- new/datum/stack_recipe("medical airlock assembly", /obj/structure/door_assembly/door_assembly_med, 4, time = 50, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("maintenance airlock assembly", /obj/structure/door_assembly/door_assembly_mai, 4, time = 50, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("external airlock assembly", /obj/structure/door_assembly/door_assembly_ext, 4, time = 50, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("freezer airlock assembly", /obj/structure/door_assembly/door_assembly_fre, 4, time = 50, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("airtight hatch assembly", /obj/structure/door_assembly/door_assembly_hatch, 4, time = 50, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("maintenance hatch assembly", /obj/structure/door_assembly/door_assembly_mhatch, 4, time = 50, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("high security airlock assembly", /obj/structure/door_assembly/door_assembly_highsecurity, 4, time = 50, one_per_turf = 1, on_floor = 1), \
- 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), \
- ), 4), \
- null, \
- new/datum/stack_recipe("grenade casing", /obj/item/weapon/grenade/chem_grenade), \
- new/datum/stack_recipe("light fixture frame", /obj/item/frame/light, 2), \
- new/datum/stack_recipe("small light fixture frame", /obj/item/frame/light/small, 1), \
- null, \
- new/datum/stack_recipe("apc frame", /obj/item/apc_frame, 2), \
- new/datum/stack_recipe("air alarm frame", /obj/item/frame/air_alarm, 2), \
- new/datum/stack_recipe("fire alarm frame", /obj/item/frame/fire_alarm, 2), \
- null, \
- new/datum/stack_recipe("knife blade", /obj/item/butterflyblade, 6, time = 20, one_per_turf = 0, on_floor = 1) \
-)
-
-/obj/item/stack/sheet/metal
- name = DEFAULT_WALL_MATERIAL
- desc = "Sheets made out off steel."
- singular_name = "metal sheet"
- icon_state = "sheet-metal"
- matter = list(DEFAULT_WALL_MATERIAL = 3750)
- throwforce = 14.0
- flags = CONDUCT
- origin_tech = "materials=1"
- sheettype = DEFAULT_WALL_MATERIAL
-
-/obj/item/stack/sheet/metal/cyborg
- name = "steel synthesizer"
- desc = "A device that makes steel sheets."
- gender = NEUTER
- matter = null
- uses_charge = 1
- charge_costs = list(1000)
- stacktype = /obj/item/stack/sheet/metal
-
-/obj/item/stack/sheet/metal/New(var/loc, var/amount=null)
- recipes = metal_recipes
- return ..()
-
-
-/*
- * Plasteel
- */
-var/global/list/datum/stack_recipe/plasteel_recipes = list ( \
- new/datum/stack_recipe("AI core", /obj/structure/AIcore, 4, time = 50, one_per_turf = 1), \
- new/datum/stack_recipe("Metal crate", /obj/structure/closet/crate, 10, time = 50, one_per_turf = 1), \
- new/datum/stack_recipe("RUST fuel assembly port frame", /obj/item/frame/rust/assembly, 12, time = 50, one_per_turf = 1), \
- new/datum/stack_recipe("RUST fuel compressor frame", /obj/item/frame/rust, 12, time = 50, one_per_turf = 1), \
- new/datum/stack_recipe("knife grip", /obj/item/butterflyhandle, 4, time = 20, one_per_turf = 0, on_floor = 1),
- )
-
-/obj/item/stack/sheet/plasteel
- name = "plasteel"
- singular_name = "plasteel sheet"
- desc = "This sheet is an alloy of iron and platinum."
- icon_state = "sheet-plasteel"
- item_state = "sheet-metal"
- matter = list(DEFAULT_WALL_MATERIAL = 7500)
- throwforce = 15.0
- flags = CONDUCT
- origin_tech = "materials=2"
- sheettype = "plasteel"
-
-/obj/item/stack/sheet/plasteel/cyborg
- name = "plasteel synthesizer"
- desc = "A device that makes plasteel sheets."
- gender = NEUTER
- singular_name = "plasteel sheet"
- matter = null
- uses_charge = 1
- charge_costs = list(1000)
- stacktype = /obj/item/stack/sheet/plasteel
-
-/obj/item/stack/sheet/plasteel/New(var/loc, var/amount=null)
- recipes = plasteel_recipes
- return ..()
-
-/*
- * Wood
- */
-var/global/list/datum/stack_recipe/wood_recipes = list ( \
- new/datum/stack_recipe("wooden sandals", /obj/item/clothing/shoes/sandal, 1), \
- new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20), \
- new/datum/stack_recipe("wooden chair", /obj/structure/bed/chair/wood, 3, time = 10, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("wooden barricade", /obj/structure/barricade/wooden, 5, time = 50, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("crossbow frame", /obj/item/weapon/crossbowframe, 5, time = 25, one_per_turf = 0, on_floor = 0), \
- new/datum/stack_recipe("wooden door", /obj/structure/mineral_door/wood, 10, time = 20, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("baseball bat", /obj/item/weapon/twohanded/baseballbat, 10, time = 20, one_per_turf = 0, on_floor = 1) \
-// new/datum/stack_recipe("apiary", /obj/item/apiary, 10, time = 25, one_per_turf = 0, on_floor = 0)
- )
-
-/obj/item/stack/sheet/wood
- name = "wooden plank"
- desc = "One can only guess that this is a bunch of wood."
- singular_name = "wood plank"
- icon_state = "sheet-wood"
- origin_tech = "materials=1;biotech=1"
- sheettype = "wood"
-
-/obj/item/stack/sheet/wood/cyborg
- name = "wood synthesizer"
- desc = "A device that makes wooden planks."
- gender = NEUTER
- singular_name = "wood plank"
- icon_state = "sheet-wood"
- uses_charge = 1
- charge_costs = list(1000)
- stacktype = /obj/item/stack/sheet/wood
-
-/obj/item/stack/sheet/wood/New(var/loc, var/amount=null)
- recipes = wood_recipes
- return ..()
-
-/*
- * Cloth
- */
-/obj/item/stack/sheet/cloth
- name = "cloth"
- desc = "This roll of cloth is made from only the finest chemicals and bunny rabbits."
- singular_name = "cloth roll"
- icon_state = "sheet-cloth"
- origin_tech = "materials=2"
-
-/*
- * Cardboard
- */
-var/global/list/datum/stack_recipe/cardboard_recipes = list ( \
- new/datum/stack_recipe("box", /obj/item/weapon/storage/box), \
- new/datum/stack_recipe("donut box", /obj/item/weapon/storage/box/donut/empty), \
- new/datum/stack_recipe("egg box", /obj/item/weapon/storage/fancy/egg_box), \
- new/datum/stack_recipe("light tubes", /obj/item/weapon/storage/box/lights/tubes), \
- new/datum/stack_recipe("light bulbs", /obj/item/weapon/storage/box/lights/bulbs), \
- new/datum/stack_recipe("mouse traps", /obj/item/weapon/storage/box/mousetraps), \
- new/datum/stack_recipe("cardborg suit", /obj/item/clothing/suit/cardborg, 3), \
- new/datum/stack_recipe("cardborg helmet", /obj/item/clothing/head/cardborg), \
- new/datum/stack_recipe("pizza box", /obj/item/pizzabox), \
- null, \
- new/datum/stack_recipe_list("folders",list( \
- new/datum/stack_recipe("blue folder", /obj/item/weapon/folder/blue), \
- new/datum/stack_recipe("grey folder", /obj/item/weapon/folder), \
- new/datum/stack_recipe("red folder", /obj/item/weapon/folder/red), \
- new/datum/stack_recipe("white folder", /obj/item/weapon/folder/white), \
- new/datum/stack_recipe("yellow folder", /obj/item/weapon/folder/yellow), \
- )) \
-)
-
-/obj/item/stack/sheet/cardboard //BubbleWrap
- name = "cardboard"
- desc = "Large sheets of card, like boxes folded flat."
- singular_name = "cardboard sheet"
- icon_state = "sheet-card"
- origin_tech = "materials=1"
-
-/obj/item/stack/sheet/cardboard/New(var/loc, var/amount=null)
- recipes = cardboard_recipes
- return ..()
diff --git a/code/game/objects/items/stacks/sheets/sheets.dm b/code/game/objects/items/stacks/sheets/sheets.dm
deleted file mode 100644
index ed0a9d2a31..0000000000
--- a/code/game/objects/items/stacks/sheets/sheets.dm
+++ /dev/null
@@ -1,25 +0,0 @@
-/obj/item/stack/sheet
- name = "sheet"
- w_class = 3.0
- force = 5
- throwforce = 5
- max_amount = 50
- throw_speed = 3
- throw_range = 3
- attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "smashed")
- var/perunit = 3750
- var/sheettype = null //this is used for girders in the creation of walls/false walls
-
-
-// Since the sheetsnatcher was consolidated into weapon/storage/bag we now use
-// item/attackby() properly, making this unnecessary
-
-/*/obj/item/stack/sheet/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if (istype(W, /obj/item/weapon/storage/bag/sheetsnatcher))
- var/obj/item/weapon/storage/bag/sheetsnatcher/S = W
- if(!S.mode)
- S.add(src,user)
- else
- for (var/obj/item/stack/sheet/stack in locate(src.x,src.y,src.z))
- S.add(stack,user)
- ..()*/
diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm
index a34e39ab9a..e7dc25fae5 100644
--- a/code/game/objects/items/stacks/stack.dm
+++ b/code/game/objects/items/stacks/stack.dm
@@ -129,7 +129,11 @@
return
if (use(required))
- var/atom/O = new recipe.result_type(user.loc)
+ var/atom/O
+ if(recipe.use_material)
+ O = new recipe.result_type(user.loc, recipe.use_material)
+ else
+ O = new recipe.result_type(user.loc)
O.set_dir(user.dir)
O.add_fingerprint(user)
@@ -338,7 +342,9 @@
var/time = 0
var/one_per_turf = 0
var/on_floor = 0
- New(title, result_type, req_amount = 1, res_amount = 1, max_res_amount = 1, time = 0, one_per_turf = 0, on_floor = 0)
+ var/use_material
+
+ New(title, result_type, req_amount = 1, res_amount = 1, max_res_amount = 1, time = 0, one_per_turf = 0, on_floor = 0, supplied_material = null)
src.title = title
src.result_type = result_type
src.req_amount = req_amount
@@ -347,6 +353,7 @@
src.time = time
src.one_per_turf = one_per_turf
src.on_floor = on_floor
+ src.use_material = supplied_material
/*
* Recipe list datum
diff --git a/code/game/objects/items/stacks/tiles/light.dm b/code/game/objects/items/stacks/tiles/light.dm
index dc57abc513..9785d04bb7 100644
--- a/code/game/objects/items/stacks/tiles/light.dm
+++ b/code/game/objects/items/stacks/tiles/light.dm
@@ -28,7 +28,7 @@
/obj/item/stack/tile/light/attackby(var/obj/item/O as obj, var/mob/user as mob)
..()
if(istype(O,/obj/item/weapon/crowbar))
- new/obj/item/stack/sheet/metal(user.loc)
+ new/obj/item/stack/material/steel(user.loc)
amount--
new/obj/item/stack/light_w(user.loc)
if(amount <= 0)
diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm
index 9a0e5eef78..4eec1009e5 100644
--- a/code/game/objects/items/weapons/extinguisher.dm
+++ b/code/game/objects/items/weapons/extinguisher.dm
@@ -110,8 +110,8 @@
var/list/the_targets = list(T,T1,T2)
for(var/a = 1 to spray_particles)
- spawn(0)
- var/obj/effect/effect/water/W = PoolOrNew(new /obj/effect/effect/water, get_turf(src))
+ spawn(0)
+ var/obj/effect/effect/water/W = PoolOrNew(/obj/effect/effect/water, get_turf(src))
var/turf/my_target
if(a == 1)
my_target = T
@@ -126,7 +126,7 @@
return
reagents.trans_to_obj(W, spray_amount)
W.set_color()
- W.set_up(my_target)
+ W.set_up(my_target)
if((istype(usr.loc, /turf/space)) || (usr.lastarea.has_gravity == 0))
user.inertia_dir = get_dir(target, user)
diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm
index f5559b5778..69dde080c3 100644
--- a/code/game/objects/items/weapons/handcuffs.dm
+++ b/code/game/objects/items/weapons/handcuffs.dm
@@ -147,13 +147,11 @@ var/last_chew = 0
if(istype(I, /obj/item/stack/rods))
var/obj/item/stack/rods/R = I
if (R.use(1))
- var/obj/item/weapon/wirerod/W = new /obj/item/weapon/wirerod
-
+ var/obj/item/weapon/material/wirerod/W = new(get_turf(user))
user.put_in_hands(W)
user << "You wrap the cable restraint around the top of the rod."
qdel(src)
update_icon(user)
-
/obj/item/weapon/handcuffs/cyborg
dispenser = 1
diff --git a/code/game/objects/items/weapons/improvised_components.dm b/code/game/objects/items/weapons/improvised_components.dm
new file mode 100644
index 0000000000..af4e528b70
--- /dev/null
+++ b/code/game/objects/items/weapons/improvised_components.dm
@@ -0,0 +1,70 @@
+/obj/item/weapon/material/butterflyconstruction
+ name = "unfinished concealed knife"
+ desc = "An unfinished concealed knife, it looks like the screws need to be tightened."
+ icon = 'icons/obj/buildingobject.dmi'
+ icon_state = "butterflystep1"
+ force_divisor = 0.1
+ thrown_force_divisor = 0.1
+
+/obj/item/weapon/material/butterflyconstruction/attackby(obj/item/W as obj, mob/user as mob)
+ if(istype(W,/obj/item/weapon/screwdriver))
+ user << "You finish the concealed blade weapon."
+ new /obj/item/weapon/material/butterfly(user.loc, material.name)
+ qdel(src)
+ return
+
+/obj/item/weapon/material/butterflyblade
+ name = "knife blade"
+ desc = "A knife blade. Unusable as a weapon without a grip."
+ icon = 'icons/obj/buildingobject.dmi'
+ icon_state = "butterfly2"
+ force_divisor = 0.1
+ thrown_force_divisor = 0.1
+
+/obj/item/weapon/material/butterflyhandle
+ name = "concealed knife grip"
+ desc = "A plasteel grip with screw fittings for a blade."
+ icon = 'icons/obj/buildingobject.dmi'
+ icon_state = "butterfly1"
+ force_divisor = 0.1
+ thrown_force_divisor = 0.1
+
+/obj/item/weapon/material/butterflyhandle/attackby(obj/item/W as obj, mob/user as mob)
+ if(istype(W,/obj/item/weapon/material/butterflyblade))
+ var/obj/item/weapon/material/butterflyblade/B = W
+ user << "You attach the two concealed blade parts."
+ new /obj/item/weapon/material/butterflyconstruction(user.loc, B.material.name)
+ qdel(W)
+ qdel(src)
+ return
+
+/obj/item/weapon/material/wirerod
+ name = "wired rod"
+ desc = "A rod with some wire wrapped around the top. It'd be easy to attach something to the top bit."
+ icon_state = "wiredrod"
+ item_state = "rods"
+ flags = CONDUCT
+ force = 8
+ throwforce = 10
+ w_class = 3
+ attack_verb = list("hit", "bludgeoned", "whacked", "bonked")
+ force_divisor = 0.1
+ thrown_force_divisor = 0.1
+
+/obj/item/weapon/material/wirerod/attackby(var/obj/item/I, mob/user as mob)
+ ..()
+ var/obj/item/finished
+ if(istype(I, /obj/item/weapon/material/shard))
+ var/obj/item/weapon/material/tmp_shard = I
+ finished = new /obj/item/weapon/material/twohanded/spear(get_turf(user), tmp_shard.material.name)
+ user << "You fasten \the [I] to the top of the rod with the cable."
+ else if(istype(I, /obj/item/weapon/wirecutters))
+ finished = new /obj/item/weapon/melee/baton/cattleprod(get_turf(user))
+ user << "You fasten the wirecutters to the top of the rod with the cable, prongs outward."
+ if(finished)
+ user.drop_from_inventory(src)
+ user.drop_from_inventory(I)
+ qdel(I)
+ qdel(src)
+ user.put_in_hands(finished)
+ update_icon(user)
diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm
index 3a1496939e..e69de29bb2 100644
--- a/code/game/objects/items/weapons/kitchen.dm
+++ b/code/game/objects/items/weapons/kitchen.dm
@@ -1,468 +0,0 @@
-/* Kitchen tools
- * Contains:
- * Utensils
- * Spoons
- * Forks
- * Knives
- * Kitchen knives
- * Butcher's cleaver
- * Rolling Pins
- * Trays
- */
-
-/obj/item/weapon/kitchen
- icon = 'icons/obj/kitchen.dmi'
-
-/*
- * Utensils
- */
-/obj/item/weapon/kitchen/utensil
- force = 5.0
- w_class = 1.0
- throwforce = 5.0
- throw_speed = 3
- throw_range = 5
- flags = CONDUCT
- origin_tech = "materials=1"
- attack_verb = list("attacked", "stabbed", "poked")
- sharp = 0
-
- var/loaded //Descriptive string for currently loaded food object.
-
-/obj/item/weapon/kitchen/utensil/New()
- if (prob(60))
- src.pixel_y = rand(0, 4)
-
- create_reagents(5)
- return
-
-/obj/item/weapon/kitchen/utensil/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
- if(!istype(M))
- return ..()
-
- if(user.a_intent != I_HELP)
- if(user.zone_sel.selecting == "head" || user.zone_sel.selecting == "eyes")
- if((CLUMSY in user.mutations) && prob(50))
- M = user
- return eyestab(M,user)
- else
- return ..()
-
- if (reagents.total_volume > 0)
- reagents.trans_to_mob(M, reagents.total_volume, CHEM_INGEST)
- if(M == user)
- for(var/mob/O in viewers(M, null))
- O.show_message(text("\blue [] eats some [] from \the [].", user, loaded, src), 1)
- M.reagents.add_reagent("nutriment", 1)
- else
- for(var/mob/O in viewers(M, null))
- O.show_message(text("\blue [] feeds [] some [] from \the []", user, M, loaded, src), 1)
- M.reagents.add_reagent("nutriment", 1)
- playsound(M.loc,'sound/items/eatfood.ogg', rand(10,40), 1)
- overlays.Cut()
- return
- else
- ..()
-
-/obj/item/weapon/kitchen/utensil/fork
- name = "fork"
- desc = "It's a fork. Sure is pointy."
- icon_state = "fork"
-
-/obj/item/weapon/kitchen/utensil/pfork
- name = "plastic fork"
- desc = "Yay, no washing up to do."
- icon_state = "pfork"
-
-/obj/item/weapon/kitchen/utensil/spoon
- name = "spoon"
- desc = "It's a spoon. You can see your own upside-down face in it."
- icon_state = "spoon"
- attack_verb = list("attacked", "poked")
-
-/obj/item/weapon/kitchen/utensil/pspoon
- name = "plastic spoon"
- desc = "It's a plastic spoon. How dull."
- icon_state = "pspoon"
- attack_verb = list("attacked", "poked")
-
-/*
- * Knives
- */
-/obj/item/weapon/kitchen/utensil/knife
- name = "knife"
- desc = "Can cut through any food."
- icon_state = "knife"
- force = 10.0
- throwforce = 10.0
- sharp = 1
- edge = 1
-
- suicide_act(mob/user)
- viewers(user) << pick("\red [user] is slitting \his wrists with the [src.name]! It looks like \he's trying to commit suicide.", \
- "\red [user] is slitting \his throat with the [src.name]! It looks like \he's trying to commit suicide.", \
- "\red [user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.")
- return (BRUTELOSS)
-
-/obj/item/weapon/kitchen/utensil/knife/attack(target as mob, mob/living/user as mob)
- if ((CLUMSY in user.mutations) && prob(50))
- user << "\red You accidentally cut yourself with the [src]."
- user.take_organ_damage(20)
- return
- playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
- return ..()
-
-/obj/item/weapon/kitchen/utensil/pknife
- name = "plastic knife"
- desc = "The bluntest of blades."
- icon_state = "pknife"
- force = 1
- throwforce = 1
- sharp = 0
- edge = 1 //for cutting pizzas
-
-/obj/item/weapon/kitchen/utensil/knife/attack(target as mob, mob/living/user as mob)
- if ((CLUMSY in user.mutations) && prob(50))
- user << "\red You somehow managed to cut yourself with the [src]."
- user.take_organ_damage(20)
- return
- playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
- return ..()
-
-/*
- * Kitchen knives
- */
-/obj/item/weapon/kitchenknife
- name = "kitchen knife"
- icon = 'icons/obj/kitchen.dmi'
- icon_state = "knife"
- desc = "A general purpose Chef's Knife made by SpaceCook Incorporated. Guaranteed to stay sharp for years to come."
- flags = CONDUCT
- sharp = 1
- edge = 1
- force = 10.0
- w_class = 3.0
- throwforce = 6.0
- throw_speed = 3
- throw_range = 6
- matter = list(DEFAULT_WALL_MATERIAL = 12000)
- origin_tech = "materials=1"
- attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
-
- suicide_act(mob/user)
- viewers(user) << pick("\red [user] is slitting \his wrists with the [src.name]! It looks like \he's trying to commit suicide.", \
- "\red [user] is slitting \his throat with the [src.name]! It looks like \he's trying to commit suicide.", \
- "\red [user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.")
- return (BRUTELOSS)
-
-/obj/item/weapon/kitchenknife/hook
- name = "meat hook"
- desc = "A sharp, metal hook what sticks into things."
- icon_state = "hook_knife"
- item_state = "hook_knife"
-
-/obj/item/weapon/kitchenknife/ritual
- name = "ritual knife"
- desc = "The unearthly energies that once powered this blade are now dormant."
- icon = 'icons/obj/wizard.dmi'
- icon_state = "render"
-
-/*
- * Bucher's cleaver
- */
-/obj/item/weapon/butch
- name = "butcher's cleaver"
- icon = 'icons/obj/kitchen.dmi'
- icon_state = "butch"
- desc = "A huge thing used for chopping and chopping up meat. This includes clowns and clown-by-products."
- flags = CONDUCT
- force = 15.0
- w_class = 2.0
- throwforce = 8.0
- throw_speed = 3
- throw_range = 6
- matter = list(DEFAULT_WALL_MATERIAL = 12000)
- origin_tech = "materials=1"
- attack_verb = list("cleaved", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
- sharp = 1
- edge = 1
-
-/obj/item/weapon/butch/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
- playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
- return ..()
-
-/*
- * Rolling Pins
- */
-
-/obj/item/weapon/kitchen/rollingpin
- name = "rolling pin"
- desc = "Used to knock out the Bartender."
- icon_state = "rolling_pin"
- force = 8.0
- throwforce = 10.0
- throw_speed = 2
- throw_range = 7
- w_class = 3.0
- attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked") //I think the rollingpin attackby will end up ignoring this anyway.
-
-/obj/item/weapon/kitchen/rollingpin/attack(mob/living/M as mob, mob/living/user as mob)
- if ((CLUMSY in user.mutations) && prob(50))
- user << "\red The [src] slips out of your hand and hits your head."
- user.take_organ_damage(10)
- user.Paralyse(2)
- return
-
- M.attack_log += text("\[[time_stamp()]\] Has been attacked with [src.name] by [user.name] ([user.ckey])")
- user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to attack [M.name] ([M.ckey])")
- msg_admin_attack("[user.name] ([user.ckey]) used the [src.name] to attack [M.name] ([M.ckey]) (JMP)")
-
- var/t = user:zone_sel.selecting
- if (t == "head")
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- if (H.stat < 2 && H.health < 50 && prob(90))
- // ******* Check
- if (istype(H, /obj/item/clothing/head) && H.flags & 8 && prob(80))
- H << "\red The helmet protects you from being hit hard in the head!"
- return
- var/time = rand(2, 6)
- if (prob(75))
- H.Paralyse(time)
- else
- H.Stun(time)
- if(H.stat != 2) H.stat = 1
- user.visible_message("\red [H] has been knocked unconscious!", "\red You knock [H] unconscious!")
- return
- else
- H.visible_message("\red [user] tried to knock [H] unconscious!", "\red [user] tried to knock you unconscious!")
- H.eye_blurry += 3
- return ..()
-
-/*
- * Trays - Agouri
- */
-/obj/item/weapon/tray
- name = "tray"
- icon = 'icons/obj/food.dmi'
- icon_state = "tray"
- desc = "A metal tray to lay food on."
- throwforce = 12.0
- throwforce = 10.0
- throw_speed = 1
- throw_range = 5
- w_class = 3.0
- flags = CONDUCT
- matter = list(DEFAULT_WALL_MATERIAL = 3000)
- /* // NOPE
- var/food_total= 0
- var/burger_amt = 0
- var/cheese_amt = 0
- var/fries_amt = 0
- var/classyalcdrink_amt = 0
- var/alcdrink_amt = 0
- var/bottle_amt = 0
- var/soda_amt = 0
- var/carton_amt = 0
- var/pie_amt = 0
- var/meatbreadslice_amt = 0
- var/salad_amt = 0
- var/miscfood_amt = 0
- */
- var/list/carrying = list() // List of things on the tray. - Doohl
- var/max_carry = 10 // w_class = 1 -- takes up 1
- // w_class = 2 -- takes up 3
- // w_class = 3 -- takes up 5
-
-/obj/item/weapon/tray/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
-
- // Drop all the things. All of them.
- overlays.Cut()
- for(var/obj/item/I in carrying)
- I.loc = M.loc
- carrying.Remove(I)
- if(isturf(I.loc))
- spawn()
- for(var/i = 1, i <= rand(1,2), i++)
- if(I)
- step(I, pick(NORTH,SOUTH,EAST,WEST))
- sleep(rand(2,4))
-
-
- if((CLUMSY in user.mutations) && prob(50)) //What if he's a clown?
- M << "\red You accidentally slam yourself with the [src]!"
- M.Weaken(1)
- user.take_organ_damage(2)
- if(prob(50))
- playsound(M, 'sound/items/trayhit1.ogg', 50, 1)
- return
- else
- playsound(M, 'sound/items/trayhit2.ogg', 50, 1) //sound playin'
- return //it always returns, but I feel like adding an extra return just for safety's sakes. EDIT; Oh well I won't :3
-
- var/mob/living/carbon/human/H = M ///////////////////////////////////// /Let's have this ready for later.
-
-
- if(!(user.zone_sel.selecting == ("eyes" || "head"))) //////////////hitting anything else other than the eyes
- if(prob(33))
- src.add_blood(H)
- var/turf/location = H.loc
- if (istype(location, /turf/simulated))
- location.add_blood(H) ///Plik plik, the sound of blood
-
- M.attack_log += text("\[[time_stamp()]\] Has been attacked with [src.name] by [user.name] ([user.ckey])")
- user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to attack [M.name] ([M.ckey])")
- msg_admin_attack("[user.name] ([user.ckey]) used the [src.name] to attack [M.name] ([M.ckey]) (JMP)")
-
- if(prob(15))
- M.Weaken(3)
- M.take_organ_damage(3)
- else
- M.take_organ_damage(5)
- if(prob(50))
- playsound(M, 'sound/items/trayhit1.ogg', 50, 1)
- for(var/mob/O in viewers(M, null))
- O.show_message(text("\red [] slams [] with the tray!", user, M), 1)
- return
- else
- playsound(M, 'sound/items/trayhit2.ogg', 50, 1) //we applied the damage, we played the sound, we showed the appropriate messages. Time to return and stop the proc
- for(var/mob/O in viewers(M, null))
- O.show_message(text("\red [] slams [] with the tray!", user, M), 1)
- return
-
-
-
-
- if(istype(M, /mob/living/carbon/human) && ((H.head && H.head.flags & HEADCOVERSEYES) || (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || (H.glasses && H.glasses.flags & GLASSESCOVERSEYES)))
- M << "\red You get slammed in the face with the tray, against your mask!"
- if(prob(33))
- src.add_blood(H)
- if (H.wear_mask)
- H.wear_mask.add_blood(H)
- if (H.head)
- H.head.add_blood(H)
- if (H.glasses && prob(33))
- H.glasses.add_blood(H)
- var/turf/location = H.loc
- if (istype(location, /turf/simulated)) //Addin' blood! At least on the floor and item :v
- location.add_blood(H)
-
- if(prob(50))
- playsound(M, 'sound/items/trayhit1.ogg', 50, 1)
- for(var/mob/O in viewers(M, null))
- O.show_message(text("\red [] slams [] with the tray!", user, M), 1)
- else
- playsound(M, 'sound/items/trayhit2.ogg', 50, 1) //sound playin'
- for(var/mob/O in viewers(M, null))
- O.show_message(text("\red [] slams [] with the tray!", user, M), 1)
- if(prob(10))
- M.Stun(rand(1,3))
- M.take_organ_damage(3)
- return
- else
- M.take_organ_damage(5)
- return
-
- else //No eye or head protection, tough luck!
- M << "\red You get slammed in the face with the tray!"
- if(prob(33))
- src.add_blood(M)
- var/turf/location = H.loc
- if (istype(location, /turf/simulated))
- location.add_blood(H)
-
- if(prob(50))
- playsound(M, 'sound/items/trayhit1.ogg', 50, 1)
- for(var/mob/O in viewers(M, null))
- O.show_message(text("\red [] slams [] in the face with the tray!", user, M), 1)
- else
- playsound(M, 'sound/items/trayhit2.ogg', 50, 1) //sound playin' again
- for(var/mob/O in viewers(M, null))
- O.show_message(text("\red [] slams [] in the face with the tray!", user, M), 1)
- if(prob(30))
- M.Stun(rand(2,4))
- M.take_organ_damage(4)
- return
- else
- M.take_organ_damage(8)
- if(prob(30))
- M.Weaken(2)
- return
- return
-
-/obj/item/weapon/tray/var/cooldown = 0 //shield bash cooldown. based on world.time
-
-/obj/item/weapon/tray/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W, /obj/item/weapon/kitchen/rollingpin))
- if(cooldown < world.time - 25)
- user.visible_message("[user] bashes [src] with [W]!")
- playsound(user.loc, 'sound/effects/shieldbash.ogg', 50, 1)
- cooldown = world.time
- else
- ..()
-
-/*
-===============~~~~~================================~~~~~====================
-= =
-= Code for trays carrying things. By Doohl for Doohl erryday Doohl Doohl~ =
-= =
-===============~~~~~================================~~~~~====================
-*/
-/obj/item/weapon/tray/proc/calc_carry()
- // calculate the weight of the items on the tray
- var/val = 0 // value to return
-
- for(var/obj/item/I in carrying)
- if(I.w_class == 1.0)
- val ++
- else if(I.w_class == 2.0)
- val += 3
- else
- val += 5
-
- return val
-
-/obj/item/weapon/tray/pickup(mob/user)
-
- if(!isturf(loc))
- return
-
- for(var/obj/item/I in loc)
- if( I != src && !I.anchored && !istype(I, /obj/item/clothing/under) && !istype(I, /obj/item/clothing/suit) && !istype(I, /obj/item/projectile) )
- var/add = 0
- if(I.w_class == 1.0)
- add = 1
- else if(I.w_class == 2.0)
- add = 3
- else
- add = 5
- if(calc_carry() + add >= max_carry)
- break
-
- I.loc = src
- carrying.Add(I)
- overlays += image("icon" = I.icon, "icon_state" = I.icon_state, "layer" = 30 + I.layer)
-
-/obj/item/weapon/tray/dropped(mob/user)
-
- var/mob/living/M
- for(M in src.loc) //to handle hand switching
- return
-
- var/foundtable = 0
- for(var/obj/structure/table/T in loc)
- foundtable = 1
- break
-
- overlays.Cut()
-
- for(var/obj/item/I in carrying)
- I.loc = loc
- carrying.Remove(I)
- if(!foundtable && isturf(loc))
- // if no table, presume that the person just shittily dropped the tray on the ground and made a mess everywhere!
- spawn()
- for(var/i = 1, i <= rand(1,2), i++)
- if(I)
- step(I, pick(NORTH,SOUTH,EAST,WEST))
- sleep(rand(2,4))
diff --git a/code/game/objects/items/weapons/material/bats.dm b/code/game/objects/items/weapons/material/bats.dm
new file mode 100644
index 0000000000..eccc13a298
--- /dev/null
+++ b/code/game/objects/items/weapons/material/bats.dm
@@ -0,0 +1,28 @@
+/obj/item/weapon/material/twohanded/baseballbat
+ name = "bat"
+ desc = "HOME RUN!"
+ icon_state = "metalbat0"
+ base_icon = "metalbat"
+ item_state = "metalbat"
+ throwforce = 7
+ attack_verb = list("smashed", "beaten", "slammed", "smacked", "struck", "battered", "bonked")
+ hitsound = 'sound/weapons/genhit3.ogg'
+ default_material = "wood"
+ force_divisor = 1.1 // 22 when wielded with weight 20 (steel)
+ unwielded_force_divisor = 0.7 // 15 when unwielded based on above.
+
+//Predefined materials go here.
+/obj/item/weapon/material/twohanded/baseballbat/metal/New(var/newloc)
+ ..(newloc,"steel")
+
+/obj/item/weapon/material/twohanded/baseballbat/uranium/New(var/newloc)
+ ..(newloc,"uranium")
+
+/obj/item/weapon/material/twohanded/baseballbat/gold/New(var/newloc)
+ ..(newloc,"gold")
+
+/obj/item/weapon/material/twohanded/baseballbat/platinum/New(var/newloc)
+ ..(newloc,"platinum")
+
+/obj/item/weapon/material/twohanded/baseballbat/diamond/New(var/newloc)
+ ..(newloc,"diamond")
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/material/kitchen.dm b/code/game/objects/items/weapons/material/kitchen.dm
new file mode 100644
index 0000000000..597affcd35
--- /dev/null
+++ b/code/game/objects/items/weapons/material/kitchen.dm
@@ -0,0 +1,114 @@
+/obj/item/weapon/material/kitchen
+ icon = 'icons/obj/kitchen.dmi'
+
+/*
+ * Utensils
+ */
+/obj/item/weapon/material/kitchen/utensil
+ w_class = 1
+ thrown_force_divisor = 1
+ origin_tech = "materials=1"
+ attack_verb = list("attacked", "stabbed", "poked")
+ sharp = 1
+ edge = 1
+ force_divisor = 0.1 // 6 when wielded with hardness 60 (steel)
+ thrown_force_divisor = 0.25 // 5 when thrown with weight 20 (steel)
+ var/loaded //Descriptive string for currently loaded food object.
+
+/obj/item/weapon/material/kitchen/utensil/New()
+ ..()
+ if (prob(60))
+ src.pixel_y = rand(0, 4)
+ create_reagents(5)
+ return
+
+/obj/item/weapon/material/kitchen/utensil/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
+ if(!istype(M))
+ return ..()
+
+ if(user.a_intent != I_HELP)
+ if(user.zone_sel.selecting == "head" || user.zone_sel.selecting == "eyes")
+ if((CLUMSY in user.mutations) && prob(50))
+ M = user
+ return eyestab(M,user)
+ else
+ return ..()
+
+ if (reagents.total_volume > 0)
+ reagents.trans_to_mob(M, reagents.total_volume, CHEM_INGEST)
+ if(M == user)
+ M.visible_message("\The [user] eats some [loaded] from \the [src].")
+ else
+ M.visible_message("\The [user] feeds some [loaded] to \the [M] with \the [src].")
+ playsound(M.loc,'sound/items/eatfood.ogg', rand(10,40), 1)
+ overlays.Cut()
+ return
+ else
+ ..()
+
+/obj/item/weapon/material/kitchen/utensil/fork
+ name = "fork"
+ desc = "It's a fork. Sure is pointy."
+ icon_state = "fork"
+
+/obj/item/weapon/material/kitchen/utensil/fork/plastic
+ default_material = "plastic"
+
+/obj/item/weapon/material/kitchen/utensil/spoon
+ name = "spoon"
+ desc = "It's a spoon. You can see your own upside-down face in it."
+ icon_state = "spoon"
+ attack_verb = list("attacked", "poked")
+ edge = 0
+ sharp = 0
+ force_divisor = 0.25 //5 when wielded with weight 20 (steel)
+
+/obj/item/weapon/material/kitchen/utensil/spoon/plastic
+ default_material = "plastic"
+
+/*
+ * Knives
+ */
+/obj/item/weapon/material/kitchen/utensil/knife
+ name = "knife"
+ desc = "Can cut through any food."
+ icon_state = "knife"
+ force_divisor = 0.2 // 12 when wielded with hardness 60 (steel)
+
+/obj/item/weapon/material/kitchen/utensil/knife/attack(target as mob, mob/living/user as mob)
+ if ((CLUMSY in user.mutations) && prob(50))
+ user << "\red You accidentally cut yourself with the [src]."
+ user.take_organ_damage(20)
+ return
+ return ..()
+
+/obj/item/weapon/material/kitchen/utensil/knife/attack(target as mob, mob/living/user as mob)
+ if ((CLUMSY in user.mutations) && prob(50))
+ user << "\red You somehow managed to cut yourself with the [src]."
+ user.take_organ_damage(20)
+ return
+ return ..()
+
+/obj/item/weapon/material/kitchen/utensil/knife/plastic
+ default_material = "plastic"
+
+/*
+ * Rolling Pins
+ */
+
+/obj/item/weapon/material/kitchen/rollingpin
+ name = "rolling pin"
+ desc = "Used to knock out the Bartender."
+ icon_state = "rolling_pin"
+ attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked") //I think the rollingpin attackby will end up ignoring this anyway.
+ default_material = "wood"
+ force_divisor = 0.7 // 10 when wielded with weight 15 (wood)
+ thrown_force_divisor = 1 // as above
+
+/obj/item/weapon/material/kitchen/rollingpin/attack(mob/living/M as mob, mob/living/user as mob)
+ if ((CLUMSY in user.mutations) && prob(50))
+ user << "\red The [src] slips out of your hand and hits your head."
+ user.take_organ_damage(10)
+ user.Paralyse(2)
+ return
+ return ..()
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/material/knives.dm b/code/game/objects/items/weapons/material/knives.dm
new file mode 100644
index 0000000000..3271650d31
--- /dev/null
+++ b/code/game/objects/items/weapons/material/knives.dm
@@ -0,0 +1,90 @@
+/obj/item/weapon/material/butterfly
+ name = "butterfly knife"
+ desc = "A basic metal blade concealed in a lightweight plasteel grip. Small enough when folded to fit in a pocket."
+ icon_state = "butterflyknife"
+ item_state = null
+ hitsound = null
+ var/active = 0
+ w_class = 2
+ attack_verb = list("patted", "tapped")
+ force_divisor = 0.25 // 15 when wielded with hardness 60 (steel)
+ thrown_force_divisor = 0.25 // 5 when thrown with weight 20 (steel)
+
+/obj/item/weapon/material/butterfly/update_force()
+ if(active)
+ edge = 1
+ sharp = 1
+ ..() //Updates force.
+ throwforce = max(3,force-3)
+ hitsound = initial(hitsound)
+ icon_state += "_open"
+ w_class = 3
+ attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+ else
+ force = 3
+ edge = 0
+ sharp = 0
+ hitsound = null
+ icon_state = initial(icon_state)
+ w_class = initial(w_class)
+ attack_verb = initial(attack_verb)
+
+/obj/item/weapon/material/butterfly/switchblade
+ name = "switchblade"
+ desc = "A classic switchblade with gold engraving. Just holding it makes you feel like a gangster."
+ icon_state = "switchblade"
+ unbreakable = 1
+
+/obj/item/weapon/material/butterfly/attack_self(mob/user)
+ active = !active
+ if(active)
+ user << "You flip out your [src]."
+ playsound(user, 'sound/weapons/flipblade.ogg', 15, 1)
+ else
+ user << "The butterfly knife can now be concealed."
+ update_force()
+ add_fingerprint(user)
+
+/*
+ * Kitchen knives
+ */
+/obj/item/weapon/material/knife
+ name = "kitchen knife"
+ icon = 'icons/obj/kitchen.dmi'
+ icon_state = "knife"
+ desc = "A general purpose Chef's Knife made by SpaceCook Incorporated. Guaranteed to stay sharp for years to come."
+ flags = CONDUCT
+ sharp = 1
+ edge = 1
+ force_divisor = 0.15 // 9 when wielded with hardness 60 (steel)
+ matter = list(DEFAULT_WALL_MATERIAL = 12000)
+ origin_tech = "materials=1"
+ attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+ unbreakable = 1
+
+/obj/item/weapon/material/knife/suicide_act(mob/user)
+ viewers(user) << pick("\red [user] is slitting \his wrists with the [src.name]! It looks like \he's trying to commit suicide.", \
+ "\red [user] is slitting \his throat with the [src.name]! It looks like \he's trying to commit suicide.", \
+ "\red [user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.")
+ return (BRUTELOSS)
+
+/obj/item/weapon/material/knife/hook
+ name = "meat hook"
+ desc = "A sharp, metal hook what sticks into things."
+ icon_state = "hook_knife"
+ item_state = "hook_knife"
+
+/obj/item/weapon/material/knife/ritual
+ name = "ritual knife"
+ desc = "The unearthly energies that once powered this blade are now dormant."
+ icon = 'icons/obj/wizard.dmi'
+ icon_state = "render"
+ applies_material_colour = 0
+
+/obj/item/weapon/material/knife/butch
+ name = "butcher's cleaver"
+ icon = 'icons/obj/kitchen.dmi'
+ icon_state = "butch"
+ desc = "A huge thing used for chopping and chopping up meat. This includes clowns and clown-by-products."
+ force_divisor = 0.25 // 15 when wielded with hardness 60 (steel)
+ attack_verb = list("cleaved", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
diff --git a/code/game/objects/items/weapons/material/material_weapons.dm b/code/game/objects/items/weapons/material/material_weapons.dm
new file mode 100644
index 0000000000..8208576e16
--- /dev/null
+++ b/code/game/objects/items/weapons/material/material_weapons.dm
@@ -0,0 +1,104 @@
+// SEE code/modules/materials/materials.dm FOR DETAILS ON INHERITED DATUM.
+// This class of weapons takes force and appearance data from a material datum.
+// They are also fragile based on material data and many can break/smash apart.
+/obj/item/weapon/material
+ health = 10
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ gender = NEUTER
+ throw_speed = 3
+ throw_range = 7
+ w_class = 3
+ sharp = 0
+ edge = 0
+
+ var/applies_material_colour = 1
+ var/unbreakable
+ var/force_divisor = 0.5
+ var/thrown_force_divisor = 0.5
+ var/default_material = DEFAULT_WALL_MATERIAL
+ var/material/material
+
+/obj/item/weapon/material/New(var/newloc, var/material_key)
+ ..(newloc)
+ if(!material_key)
+ material_key = default_material
+ set_material(material_key)
+
+/obj/item/weapon/material/proc/update_force()
+ if(edge || sharp)
+ force = material.get_edge_damage()
+ else
+ force = material.get_blunt_damage()
+ force = round(force*force_divisor)
+ throwforce = round(material.get_blunt_damage()*thrown_force_divisor)
+ //spawn(1)
+ // world << "[src] has force [force] and throwforce [throwforce] when made from default material [material.name]"
+
+/obj/item/weapon/material/proc/set_material(var/new_material)
+ material = get_material_by_name(new_material)
+ if(!material)
+ qdel(src)
+ else
+ name = "[material.display_name] [initial(name)]"
+ health = round(material.integrity/10)
+ if(applies_material_colour)
+ color = material.icon_colour
+ if(material.products_need_process())
+ processing_objects |= src
+ update_force()
+
+/obj/item/weapon/material/Destroy()
+ processing_objects -= src
+ ..()
+
+/obj/item/weapon/material/attack()
+ if(!..())
+ return
+ if(!unbreakable)
+ if(material.is_brittle())
+ health = 0
+ else if(!prob(material.hardness))
+ health--
+ check_health()
+
+/obj/item/weapon/material/proc/check_health()
+ if(health<=0)
+ shatter()
+
+/obj/item/weapon/material/proc/shatter()
+ var/turf/T = get_turf(src)
+ T.visible_message("\The [src] [material.destruction_desc]!")
+ if(istype(loc, /mob/living))
+ var/mob/living/M = loc
+ M.drop_from_inventory(src)
+ playsound(src, "shatter", 70, 1)
+ new material.shard_type(T)
+ qdel(src)
+
+/obj/item/weapon/material/process()
+ if(!material.radioactivity)
+ return
+ for(var/mob/living/L in range(1,src))
+ L.apply_effect(round(material.radioactivity/3),IRRADIATE,0)
+
+/obj/item/weapon/material/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+ if(exposed_temperature > material.ignition_point)
+ TemperatureAct(exposed_temperature)
+
+// This might need adjustment. Will work that out later.
+/obj/item/weapon/material/proc/TemperatureAct(temperature)
+ if(temperature > material.ignition_point)
+ for(var/turf/simulated/floor/target_tile in range(2,loc))
+ var/phoronToDeduce = temperature/30
+ target_tile.assume_gas("phoron", phoronToDeduce, 200+T0C)
+ spawn (0) target_tile.hotspot_expose(temperature, 400)
+ health -= phoronToDeduce/100
+ check_health()
+
+/obj/item/weapon/material/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(istype(W,/obj/item/weapon/weldingtool))
+ var/obj/item/weapon/weldingtool/WT = W
+ if(material.ignition_point && WT.remove_fuel(0, user))
+ TemperatureAct(150)
+ else
+ return ..()
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/material/misc.dm b/code/game/objects/items/weapons/material/misc.dm
new file mode 100644
index 0000000000..4e7ab42fd3
--- /dev/null
+++ b/code/game/objects/items/weapons/material/misc.dm
@@ -0,0 +1,67 @@
+/obj/item/weapon/material/harpoon
+ name = "harpoon"
+ sharp = 1
+ edge = 1
+ desc = "Tharr she blows!"
+ icon_state = "harpoon"
+ item_state = "harpoon"
+ force_divisor = 0.3 // 18 with hardness 60 (steel)
+ attack_verb = list("jabbed","stabbed","ripped")
+
+/obj/item/weapon/material/hatchet
+ name = "hatchet"
+ desc = "A very sharp axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood."
+ icon = 'icons/obj/weapons.dmi'
+ icon_state = "hatchet"
+ force_divisor = 0.2 // 12 with hardness 60 (steel)
+ thrown_force_divisor = 0.75 // 15 with weight 20 (steel)
+ w_class = 2
+ sharp = 1
+ edge = 1
+ origin_tech = "materials=2;combat=1"
+ attack_verb = list("chopped", "torn", "cut")
+ applies_material_colour = 0
+
+/obj/item/weapon/material/hatchet/unathiknife
+ name = "duelling knife"
+ desc = "A length of leather-bound wood studded with razor-sharp teeth. How crude."
+ icon = 'icons/obj/weapons.dmi'
+ icon_state = "unathiknife"
+ attack_verb = list("ripped", "torn", "cut")
+
+/obj/item/weapon/material/hatchet/tacknife
+ name = "tactical knife"
+ desc = "You'd be killing loads of people if this was Medal of Valor: Heroes of Nyx."
+ icon = 'icons/obj/weapons.dmi'
+ icon_state = "tacknife"
+ item_state = "knife"
+ attack_verb = list("stabbed", "chopped", "cut")
+ applies_material_colour = 1
+
+/obj/item/weapon/material/minihoe // -- Numbers
+ name = "mini hoe"
+ desc = "It's used for removing weeds or scratching your back."
+ icon = 'icons/obj/weapons.dmi'
+ icon_state = "hoe"
+ item_state = "hoe"
+ flags = CONDUCT | NOBLUDGEON
+ force_divisor = 0.25 // 5 with weight 20 (steel)
+ thrown_force_divisor = 0.25 // as above
+ w_class = 2
+ attack_verb = list("slashed", "sliced", "cut", "clawed")
+
+/obj/item/weapon/material/scythe
+ icon_state = "scythe0"
+ name = "scythe"
+ desc = "A sharp and curved blade on a long fibremetal handle, this tool makes it easy to reap what you sow."
+ force_divisor = 0.275 // 16 with hardness 60 (steel)
+ thrown_force_divisor = 0.25 // 5 with weight 20 (steel)
+ sharp = 1
+ edge = 1
+ throw_speed = 1
+ throw_range = 3
+ w_class = 4
+ flags = NOSHIELD
+ slot_flags = SLOT_BACK
+ origin_tech = "materials=2;combat=2"
+ attack_verb = list("chopped", "sliced", "cut", "reaped")
diff --git a/code/game/objects/items/weapons/material/shards.dm b/code/game/objects/items/weapons/material/shards.dm
new file mode 100644
index 0000000000..6c2eb7ced3
--- /dev/null
+++ b/code/game/objects/items/weapons/material/shards.dm
@@ -0,0 +1,89 @@
+// Glass shards
+
+/obj/item/weapon/material/shard
+ name = "shard"
+ icon = 'icons/obj/shards.dmi'
+ desc = "Made of nothing. How does this even exist?" // set based on material, if this desc is visible it's a bug (shards default to being made of glass)
+ icon_state = "large"
+ sharp = 1
+ edge = 1
+ w_class = 2
+ force_divisor = 0.2 // 6 with hardness 30 (glass)
+ thrown_force_divisor = 0.4 // 4 with weight 15 (glass)
+ item_state = "shard-glass"
+ attack_verb = list("stabbed", "slashed", "sliced", "cut")
+ default_material = "glass"
+ unbreakable = 1 //It's already broken.
+
+/obj/item/weapon/material/shard/suicide_act(mob/user)
+ viewers(user) << pick("\red [user] is slitting \his wrists with \the [src]! It looks like \he's trying to commit suicide.", \
+ "\red [user] is slitting \his throat with \the [src]! It looks like \he's trying to commit suicide.")
+ return (BRUTELOSS)
+
+/obj/item/weapon/material/shard/set_material(var/new_material)
+ ..(new_material)
+ if(!istype(material))
+ return
+
+ icon_state = "[material.shard_icon][pick("large", "medium", "small")]"
+ pixel_x = rand(-8, 8)
+ pixel_y = rand(-8, 8)
+ update_icon()
+
+ if(material.shard_type)
+ name = "[material.display_name] [material.shard_type]"
+ desc = "A small piece of [material.display_name]. It looks sharp, you wouldn't want to step on it barefoot. Could probably be used as ... a throwing weapon?"
+ switch(material.shard_type)
+ if(SHARD_SPLINTER, SHARD_SHRAPNEL)
+ gender = PLURAL
+ else
+ gender = NEUTER
+ else
+ qdel(src)
+
+/obj/item/weapon/material/shard/update_icon()
+ if(material)
+ color = material.icon_colour
+ // 1-(1-x)^2, so that glass shards with 0.3 opacity end up somewhat visible at 0.51 opacity
+ alpha = 255 * (1 - (1 - material.opacity)*(1 - material.opacity))
+ else
+ color = "#ffffff"
+ alpha = 255
+
+/obj/item/weapon/material/shard/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(istype(W, /obj/item/weapon/weldingtool) && material.shard_can_repair)
+ var/obj/item/weapon/weldingtool/WT = W
+ if(WT.remove_fuel(0, user))
+ material.place_sheet(loc)
+ qdel(src)
+ return
+ return ..()
+
+/obj/item/weapon/material/shard/Crossed(AM as mob|obj)
+ if(ismob(AM))
+ var/mob/M = AM
+ M << "\red You step on \the [src]!"
+ playsound(src.loc, 'sound/effects/glass_step.ogg', 50, 1) // not sure how to handle metal shards with sounds
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+
+ if(H.species.flags & IS_SYNTHETIC || (H.species.siemens_coefficient<0.5)) //Thick skin.
+ return
+
+ if( !H.shoes && ( !H.wear_suit || !(H.wear_suit.body_parts_covered & FEET) ) )
+ var/obj/item/organ/external/affecting = H.get_organ(pick("l_foot", "r_foot"))
+ if(affecting.status & ORGAN_ROBOT)
+ return
+ if(affecting.take_damage(5, 0))
+ H.UpdateDamageIcon()
+ H.updatehealth()
+ if(!(H.species && (H.species.flags & NO_PAIN)))
+ H.Weaken(3)
+ ..()
+
+// Preset types - left here for the code that uses them
+/obj/item/weapon/material/shard/shrapnel/New(loc)
+ ..(loc, "steel")
+
+/obj/item/weapon/material/shard/phoron/New(loc)
+ ..(loc, "phoron glass")
diff --git a/code/game/objects/items/weapons/material/swords.dm b/code/game/objects/items/weapons/material/swords.dm
new file mode 100644
index 0000000000..8a93d59fe5
--- /dev/null
+++ b/code/game/objects/items/weapons/material/swords.dm
@@ -0,0 +1,30 @@
+/obj/item/weapon/material/sword
+ name = "claymore"
+ desc = "What are you standing around staring at this for? Get to killing!"
+ icon_state = "claymore"
+ item_state = "claymore"
+ slot_flags = SLOT_BELT
+ force_divisor = 0.7 // 42 when wielded with hardnes 60 (steel)
+ thrown_force_divisor = 0.5 // 10 when thrown with weight 20 (steel)
+ sharp = 1
+ edge = 1
+ attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+ hitsound = 'sound/weapons/bladeslice.ogg'
+
+/obj/item/weapon/material/sword/IsShield()
+ return 1
+
+/obj/item/weapon/material/sword/suicide_act(mob/user)
+ viewers(user) << "[user] is falling on the [src.name]! It looks like \he's trying to commit suicide."
+ return(BRUTELOSS)
+
+/obj/item/weapon/material/sword/katana
+ name = "katana"
+ desc = "Woefully underpowered in D20. This one looks pretty sharp."
+ icon_state = "katana"
+ item_state = "katana"
+ slot_flags = SLOT_BELT | SLOT_BACK
+
+/obj/item/weapon/material/sword/katana/suicide_act(mob/user)
+ viewers(user) << "[user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku."
+ return(BRUTELOSS)
diff --git a/code/game/objects/items/weapons/material/thrown.dm b/code/game/objects/items/weapons/material/thrown.dm
new file mode 100644
index 0000000000..0e632de06b
--- /dev/null
+++ b/code/game/objects/items/weapons/material/thrown.dm
@@ -0,0 +1,24 @@
+/obj/item/weapon/material/star
+ name = "shuriken"
+ desc = "A sharp, perfectly weighted piece of metal."
+ icon_state = "star"
+ force_divisor = 0.1 // 6 with hardness 60 (steel)
+ thrown_force_divisor = 0.75 // 15 with weight 20 (steel)
+ throw_speed = 10
+ throw_range = 15
+ sharp = 1
+ edge = 1
+
+/obj/item/weapon/material/star/New()
+ ..()
+ src.pixel_x = rand(-12, 12)
+ src.pixel_y = rand(-12, 12)
+
+/obj/item/weapon/material/star/throw_impact(atom/hit_atom)
+ ..()
+ if(material.radioactivity>0 && istype(hit_atom,/mob/living))
+ var/mob/living/M = hit_atom
+ M.adjustToxLoss(rand(20,40))
+
+/obj/item/weapon/material/star/ninja
+ default_material = "uranium"
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/material/twohanded.dm
similarity index 55%
rename from code/game/objects/items/weapons/twohanded.dm
rename to code/game/objects/items/weapons/material/twohanded.dm
index 7d0f9e3d4a..04e112ba8a 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/material/twohanded.dm
@@ -16,53 +16,69 @@
/*
* Twohanded
*/
-/obj/item/weapon/twohanded
+/obj/item/weapon/material/twohanded
+ w_class = 4
var/wielded = 0
var/force_wielded = 0
+ var/force_unwielded
var/wieldsound = null
var/unwieldsound = null
var/base_icon
+ var/base_name
+ var/unwielded_force_divisor = 0.25
-/obj/item/weapon/twohanded/proc/unwield()
+/obj/item/weapon/material/twohanded/proc/unwield()
wielded = 0
- force = initial(force)
- name = "[initial(name)]"
+ force = force_unwielded
+ name = "[base_name]"
update_icon()
-/obj/item/weapon/twohanded/proc/wield()
+/obj/item/weapon/material/twohanded/proc/wield()
wielded = 1
force = force_wielded
- name = "[initial(name)] (Wielded)"
+ name = "[base_name] (Wielded)"
update_icon()
-/obj/item/weapon/twohanded/New()
+/obj/item/weapon/material/twohanded/update_force()
+ base_name = name
+ if(sharp || edge)
+ force_wielded = material.get_edge_damage()
+ else
+ force_wielded = material.get_blunt_damage()
+ force_wielded = round(force_wielded*force_divisor)
+ force_unwielded = round(force_wielded*unwielded_force_divisor)
+ force = force_unwielded
+ throwforce = round(force*thrown_force_divisor)
+ //world << "[src] has unwielded force [force_unwielded], wielded force [force_wielded] and throwforce [throwforce] when made from default material [material.name]"
+
+/obj/item/weapon/material/twohanded/New()
..()
update_icon()
-/obj/item/weapon/twohanded/mob_can_equip(M as mob, slot)
+/obj/item/weapon/material/twohanded/mob_can_equip(M as mob, slot)
//Cannot equip wielded items.
if(wielded)
- M << "Unwield the [initial(name)] first!"
+ M << "Unwield the [base_name] first!"
return 0
return ..()
-/obj/item/weapon/twohanded/dropped(mob/user as mob)
+/obj/item/weapon/material/twohanded/dropped(mob/user as mob)
//handles unwielding a twohanded weapon when dropped as well as clearing up the offhand
if(user)
- var/obj/item/weapon/twohanded/O = user.get_inactive_hand()
+ var/obj/item/weapon/material/twohanded/O = user.get_inactive_hand()
if(istype(O))
O.unwield()
return unwield()
-/obj/item/weapon/twohanded/update_icon()
+/obj/item/weapon/material/twohanded/update_icon()
icon_state = "[base_icon][wielded]"
item_state = icon_state
-/obj/item/weapon/twohanded/pickup(mob/user)
+/obj/item/weapon/material/twohanded/pickup(mob/user)
unwield()
-/obj/item/weapon/twohanded/attack_self(mob/user as mob)
+/obj/item/weapon/material/twohanded/attack_self(mob/user as mob)
..()
@@ -80,7 +96,7 @@
if (src.unwieldsound)
playsound(src.loc, unwieldsound, 50, 1)
- var/obj/item/weapon/twohanded/offhand/O = user.get_inactive_hand()
+ var/obj/item/weapon/material/twohanded/offhand/O = user.get_inactive_hand()
if(O && istype(O))
O.unwield()
@@ -89,13 +105,13 @@
user << "You need your other hand to be empty"
return
wield()
- user << "You grab the [initial(name)] with both hands."
+ user << "You grab the [base_name] with both hands."
if (src.wieldsound)
playsound(src.loc, wieldsound, 50, 1)
- var/obj/item/weapon/twohanded/offhand/O = new(user) ////Let's reserve his other hand~
- O.name = "[initial(name)] - offhand"
- O.desc = "Your second grip on the [initial(name)]"
+ var/obj/item/weapon/material/twohanded/offhand/O = new(user) ////Let's reserve his other hand~
+ O.name = "[base_name] - offhand"
+ O.desc = "Your second grip on the [base_name]."
user.put_in_inactive_hand(O)
if(istype(user,/mob/living/carbon/human))
@@ -106,37 +122,40 @@
return
///////////OFFHAND///////////////
-/obj/item/weapon/twohanded/offhand
- w_class = 5.0
+/obj/item/weapon/material/twohanded/offhand
+ w_class = 5
icon_state = "offhand"
name = "offhand"
+ default_material = "placeholder"
- unwield()
- qdel(src)
+/obj/item/weapon/material/twohanded/offhand/unwield()
+ qdel(src)
- wield()
- qdel(src)
+/obj/item/weapon/material/twohanded/offhand/wield()
+ qdel(src)
-/obj/item/weapon/twohanded/offhand/update_icon()
+/obj/item/weapon/material/twohanded/offhand/update_icon()
return
/*
* Fireaxe
*/
-/obj/item/weapon/twohanded/fireaxe // DEM AXES MAN, marker -Agouri
+/obj/item/weapon/material/twohanded/fireaxe // DEM AXES MAN, marker -Agouri
icon_state = "fireaxe0"
base_icon = "fireaxe"
name = "fire axe"
desc = "Truly, the weapon of a madman. Who would think to fight fire with an axe?"
- force = 15
+ unwielded_force_divisor = 0.25
+ force_divisor = 0.7 // 10/42 with hardness 60 (steel) and 0.25 unwielded divisor
sharp = 1
edge = 1
w_class = 4.0
slot_flags = SLOT_BACK
force_wielded = 30
attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut")
+ applies_material_colour = 0
-/obj/item/weapon/twohanded/fireaxe/afterattack(atom/A as mob|obj|turf|area, mob/user as mob, proximity)
+/obj/item/weapon/material/twohanded/fireaxe/afterattack(atom/A as mob|obj|turf|area, mob/user as mob, proximity)
if(!proximity) return
..()
if(A && wielded)
@@ -149,11 +168,13 @@
var/obj/effect/plant/P = A
P.die_off()
- qdel(A)
+/*
/*
* Double-Bladed Energy Swords - Cheridan
*/
-/obj/item/weapon/twohanded/dualsaber
+ // Not sure what to do with this one, it won't work nicely with the material system,
+ // but I don't want to copypaste all the twohanded procs..
+/obj/item/weapon/material/twohanded/dualsaber
icon_state = "dualsaber0"
base_icon = "dualsaber"
name = "double-bladed energy sword"
@@ -171,8 +192,9 @@
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
sharp = 1
edge = 1
+ applies_material_colour = 0
-/obj/item/weapon/twohanded/dualsaber/attack(target as mob, mob/living/user as mob)
+/obj/item/weapon/material/twohanded/dualsaber/attack(target as mob, mob/living/user as mob)
..()
if((CLUMSY in user.mutations) && (wielded) &&prob(40))
user << "\red You twirl around a bit before losing your balance and impaling yourself on the [src]."
@@ -184,14 +206,15 @@
user.set_dir(i)
sleep(1)
-/obj/item/weapon/twohanded/dualsaber/IsShield()
+/obj/item/weapon/material/twohanded/dualsaber/IsShield()
if(wielded)
return 1
else
return 0
+*/
//spears, bay edition
-/obj/item/weapon/twohanded/spear
+/obj/item/weapon/material/twohanded/spear
icon_state = "spearglass0"
base_icon = "spearglass"
name = "spear"
@@ -199,38 +222,13 @@
force = 10
w_class = 4.0
slot_flags = SLOT_BACK
- force_wielded = 22 // Was 13, Buffed - RR
- throwforce = 20
+ force_wielded = 0.75 // 22 when wielded with hardness 15 (glass)
+ unwielded_force_divisor = 0.65 // 14 when unwielded based on above
+ thrown_force_divisor = 1.5 // 20 when thrown with weight 15 (glass)
throw_speed = 3
- edge = 0
+ edge = 1
sharp = 1
flags = NOSHIELD
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "poked", "jabbed", "torn", "gored")
-
-/obj/item/weapon/twohanded/baseballbat
- name = "wooden bat"
- desc = "HOME RUN!"
- icon_state = "woodbat0"
- base_icon = "woodbat"
- item_state = "woodbat"
- sharp = 0
- edge = 0
- w_class = 3
- force = 10
- throw_speed = 3
- throw_range = 7
- throwforce = 7
- attack_verb = list("smashed", "beaten", "slammed", "smacked", "struck", "battered", "bonked")
- hitsound = 'sound/weapons/genhit3.ogg'
- force_wielded = 20
-
-/obj/item/weapon/twohanded/baseballbat/metal
- name = "metal bat"
- desc = "A shiny metal bat."
- icon_state = "metalbat0"
- base_icon = "metalbat"
- item_state = "metalbat"
- force = 15
- w_class = 3.0
- force_wielded = 25
\ No newline at end of file
+ default_material = "glass"
diff --git a/code/game/objects/items/weapons/material/twohanded.dm.orig b/code/game/objects/items/weapons/material/twohanded.dm.orig
new file mode 100644
index 0000000000..01f4ee7e55
--- /dev/null
+++ b/code/game/objects/items/weapons/material/twohanded.dm.orig
@@ -0,0 +1,234 @@
+/* Two-handed Weapons
+ * Contains:
+ * Twohanded
+ * Fireaxe
+ * Double-Bladed Energy Swords
+ */
+
+/*##################################################################
+##################### TWO HANDED WEAPONS BE HERE~ -Agouri :3 ########
+####################################################################*/
+
+//Rewrote TwoHanded weapons stuff and put it all here. Just copypasta fireaxe to make new ones ~Carn
+//This rewrite means we don't have two variables for EVERY item which are used only by a few weapons.
+//It also tidies stuff up elsewhere.
+
+/*
+ * Twohanded
+ */
+/obj/item/weapon/material/twohanded
+ w_class = 4
+ var/wielded = 0
+ var/force_wielded = 0
+ var/force_unwielded
+ var/wieldsound = null
+ var/unwieldsound = null
+ var/base_icon
+ var/base_name
+ var/unwielded_force_divisor = 0.25
+
+/obj/item/weapon/material/twohanded/proc/unwield()
+ wielded = 0
+ force = force_unwielded
+ name = "[base_name]"
+ update_icon()
+
+/obj/item/weapon/material/twohanded/proc/wield()
+ wielded = 1
+ force = force_wielded
+ name = "[base_name] (Wielded)"
+ update_icon()
+
+/obj/item/weapon/material/twohanded/update_force()
+ base_name = name
+ if(sharp || edge)
+ force_wielded = material.get_edge_damage()
+ else
+ force_wielded = material.get_blunt_damage()
+ force_wielded = round(force_wielded*force_divisor)
+ force_unwielded = round(force_wielded*unwielded_force_divisor)
+ force = force_unwielded
+ throwforce = round(force*thrown_force_divisor)
+ //world << "[src] has unwielded force [force_unwielded], wielded force [force_wielded] and throwforce [throwforce] when made from default material [material.name]"
+
+/obj/item/weapon/material/twohanded/New()
+ ..()
+ update_icon()
+
+/obj/item/weapon/material/twohanded/mob_can_equip(M as mob, slot)
+ //Cannot equip wielded items.
+ if(wielded)
+ M << "Unwield the [base_name] first!"
+ return 0
+ return ..()
+
+/obj/item/weapon/material/twohanded/dropped(mob/user as mob)
+ //handles unwielding a twohanded weapon when dropped as well as clearing up the offhand
+ if(user)
+ var/obj/item/weapon/material/twohanded/O = user.get_inactive_hand()
+ if(istype(O))
+ O.unwield()
+ return unwield()
+
+/obj/item/weapon/material/twohanded/update_icon()
+ icon_state = "[base_icon][wielded]"
+ item_state = icon_state
+
+/obj/item/weapon/material/twohanded/pickup(mob/user)
+ unwield()
+
+/obj/item/weapon/material/twohanded/attack_self(mob/user as mob)
+
+ ..()
+
+ if(istype(user, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = user
+ if(H.species.is_small)
+ user << "It's too heavy for you to wield fully."
+ return
+ else
+ return
+
+ if(wielded) //Trying to unwield it
+ unwield()
+ user << "You are now carrying the [name] with one hand."
+ if (src.unwieldsound)
+ playsound(src.loc, unwieldsound, 50, 1)
+
+ var/obj/item/weapon/material/twohanded/offhand/O = user.get_inactive_hand()
+ if(O && istype(O))
+ O.unwield()
+
+ else //Trying to wield it
+ if(user.get_inactive_hand())
+ user << "You need your other hand to be empty"
+ return
+ wield()
+ user << "You grab the [base_name] with both hands."
+ if (src.wieldsound)
+ playsound(src.loc, wieldsound, 50, 1)
+
+ var/obj/item/weapon/material/twohanded/offhand/O = new(user) ////Let's reserve his other hand~
+ O.name = "[base_name] - offhand"
+ O.desc = "Your second grip on the [base_name]."
+ user.put_in_inactive_hand(O)
+
+ if(istype(user,/mob/living/carbon/human))
+ var/mob/living/carbon/human/H = user
+ H.update_inv_l_hand()
+ H.update_inv_r_hand()
+
+ return
+
+///////////OFFHAND///////////////
+/obj/item/weapon/material/twohanded/offhand
+ w_class = 5
+ icon_state = "offhand"
+ name = "offhand"
+ default_material = "placeholder"
+
+/obj/item/weapon/material/twohanded/offhand/unwield()
+ qdel(src)
+
+/obj/item/weapon/material/twohanded/offhand/wield()
+ qdel(src)
+
+/obj/item/weapon/material/twohanded/offhand/update_icon()
+ return
+
+/*
+ * Fireaxe
+ */
+/obj/item/weapon/material/twohanded/fireaxe // DEM AXES MAN, marker -Agouri
+ icon_state = "fireaxe0"
+ base_icon = "fireaxe"
+ name = "fire axe"
+ desc = "Truly, the weapon of a madman. Who would think to fight fire with an axe?"
+ unwielded_force_divisor = 0.25
+ force_divisor = 0.7 // 10/42 with hardness 60 (steel) and 0.25 unwielded divisor
+ sharp = 1
+ edge = 1
+ slot_flags = SLOT_BACK
+ attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut")
+ applies_material_colour = 0
+
+/obj/item/weapon/material/twohanded/fireaxe/afterattack(atom/A as mob|obj|turf|area, mob/user as mob, proximity)
+ if(!proximity) return
+ ..()
+ if(A && wielded)
+ if(istype(A,/obj/structure/window))
+ var/obj/structure/window/W = A
+ W.shatter()
+<<<<<<< HEAD:code/game/objects/items/weapons/material/twohanded.dm
+
+/*
+=======
+ else if(istype(A,/obj/structure/grille))
+ qdel(A)
+ else if(istype(A,/obj/effect/plant))
+ var/obj/effect/plant/P = A
+ P.die_off()
+
+ qdel(A)
+>>>>>>> 284d1cc1f5c67503fe0da89ce01985d73bb02038:code/game/objects/items/weapons/twohanded.dm
+/*
+ * Double-Bladed Energy Swords - Cheridan
+ */
+ // Not sure what to do with this one, it won't work nicely with the material system,
+ // but I don't want to copypaste all the twohanded procs..
+/obj/item/weapon/material/twohanded/dualsaber
+ icon_state = "dualsaber0"
+ base_icon = "dualsaber"
+ name = "double-bladed energy sword"
+ desc = "Handle with care."
+ force = 3
+ throwforce = 5.0
+ throw_speed = 1
+ throw_range = 5
+ w_class = 2.0
+ force_wielded = 30
+ wieldsound = 'sound/weapons/saberon.ogg'
+ unwieldsound = 'sound/weapons/saberoff.ogg'
+ flags = NOSHIELD
+ origin_tech = "magnets=3;syndicate=4"
+ attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+ sharp = 1
+ edge = 1
+ applies_material_colour = 0
+
+/obj/item/weapon/material/twohanded/dualsaber/attack(target as mob, mob/living/user as mob)
+ ..()
+ if((CLUMSY in user.mutations) && (wielded) &&prob(40))
+ user << "\red You twirl around a bit before losing your balance and impaling yourself on the [src]."
+ user.take_organ_damage(20,25)
+ return
+ if((wielded) && prob(50))
+ spawn(0)
+ for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2))
+ user.set_dir(i)
+ sleep(1)
+
+/obj/item/weapon/material/twohanded/dualsaber/IsShield()
+ if(wielded)
+ return 1
+ else
+ return 0
+*/
+
+//spears, bay edition
+/obj/item/weapon/material/twohanded/spear
+ icon_state = "spearglass0"
+ base_icon = "spearglass"
+ name = "spear"
+ desc = "A haphazardly-constructed yet still deadly weapon of ancient design."
+ slot_flags = SLOT_BACK
+ force_wielded = 0.75 // 22 when wielded with hardness 15 (glass)
+ unwielded_force_divisor = 0.65 // 14 when unwielded based on above
+ thrown_force_divisor = 1.5 // 20 when thrown with weight 15 (glass)
+ throw_speed = 3
+ edge = 1
+ sharp = 1
+ flags = NOSHIELD
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ attack_verb = list("attacked", "poked", "jabbed", "torn", "gored")
+ default_material = "glass"
diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/game/objects/items/weapons/power_cells.dm
index d40294b5e7..96c635b778 100644
--- a/code/game/objects/items/weapons/power_cells.dm
+++ b/code/game/objects/items/weapons/power_cells.dm
@@ -105,8 +105,11 @@
name = "infinite-capacity power cell!"
icon_state = "icell"
origin_tech = null
- maxcharge = 30000
+ maxcharge = 30000 //determines how badly mobs get shocked
matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 80)
+
+ check_charge()
+ return 1
use()
return 1
diff --git a/code/game/objects/items/weapons/shards.dm b/code/game/objects/items/weapons/shards.dm
deleted file mode 100644
index 593b3d019d..0000000000
--- a/code/game/objects/items/weapons/shards.dm
+++ /dev/null
@@ -1,120 +0,0 @@
-// Glass shards
-
-/obj/item/weapon/shard
- name = "shard"
- icon = 'icons/obj/shards.dmi'
- icon_state = "large"
- sharp = 1
- edge = 1
- desc = "Made of nothing. How does this even exist?" // set based on material, if this desc is visible it's a bug (shards default to being made of glass)
- w_class = 2.0
- force = 5.0
- throwforce = 8.0
- item_state = "shard-glass"
- //matter = list("glass" = 3750) // Weld it into sheets before you use it!
- attack_verb = list("stabbed", "slashed", "sliced", "cut")
-
- gender = "neuter"
- var/material/material = null
-
-/obj/item/weapon/shard/suicide_act(mob/user)
- viewers(user) << pick("\red [user] is slitting \his wrists with \the [src]! It looks like \he's trying to commit suicide.", \
- "\red [user] is slitting \his throat with \the [src]! It looks like \he's trying to commit suicide.")
- return (BRUTELOSS)
-
-/obj/item/weapon/shard/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
- playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
- return ..()
-
-/obj/item/weapon/shard/Bump()
-
- spawn( 0 )
- if (prob(20))
- src.force = 15
- else
- src.force = 4
- ..()
- return
- return
-
-/obj/item/weapon/shard/New(loc, material/material)
- ..(loc)
-
- if(!material || !istype(material)) // We either don't have a material or we've been passed an invalid material. Use glass instead.
- material = get_material_by_name("glass")
-
- set_material(material)
-
-/obj/item/weapon/shard/proc/set_material(material/material)
- if(istype(material))
- src.material = material
- icon_state = "[material.shard_icon][pick("large", "medium", "small")]"
- pixel_x = rand(-8, 8)
- pixel_y = rand(-8, 8)
- update_material()
- update_icon()
-
-/obj/item/weapon/shard/proc/update_material()
- if(material)
- if(material.shard_type)
- name = "[material.display_name] [material.shard_type]"
- desc = "A small piece of [material.display_name]. It looks sharp, you wouldn't want to step on it barefoot. Could probably be used as ... a throwing weapon?"
- switch(material.shard_type)
- if(SHARD_SPLINTER, SHARD_SHRAPNEL)
- gender = "plural"
- else
- gender = "neuter"
- else
- qdel(src)
- return
- else
- name = initial(name)
- desc = initial(desc)
-
-/obj/item/weapon/shard/update_icon()
- if(material)
- color = material.icon_colour
- // 1-(1-x)^2, so that glass shards with 0.3 opacity end up somewhat visible at 0.51 opacity
- alpha = 255 * (1 - (1 - material.opacity)*(1 - material.opacity))
- else
- color = "#ffffff"
- alpha = 255
-
-/obj/item/weapon/shard/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W, /obj/item/weapon/weldingtool) && material.shard_can_repair)
- var/obj/item/weapon/weldingtool/WT = W
- if(WT.remove_fuel(0, user))
- material.place_sheet(loc)
- qdel(src)
- return
- return ..()
-
-/obj/item/weapon/shard/Crossed(AM as mob|obj)
- if(ismob(AM))
- var/mob/M = AM
- M << "\red You step on \the [src]!"
- playsound(src.loc, 'sound/effects/glass_step.ogg', 50, 1) // not sure how to handle metal shards with sounds
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
-
- if(H.species.flags & IS_SYNTHETIC || (H.species.siemens_coefficient<0.5)) //Thick skin.
- return
-
- if( !H.shoes && ( !H.wear_suit || !(H.wear_suit.body_parts_covered & FEET) ) )
- var/obj/item/organ/external/affecting = H.get_organ(pick("l_foot", "r_foot"))
- if(affecting.status & ORGAN_ROBOT)
- return
- if(affecting.take_damage(5, 0))
- H.UpdateDamageIcon()
- H.updatehealth()
- if(!(H.species && (H.species.flags & NO_PAIN)))
- H.Weaken(3)
- ..()
-
-// Preset types - left here for the code that uses them
-
-/obj/item/weapon/shard/shrapnel/New(loc)
- ..(loc, get_material_by_name("steel"))
-
-/obj/item/weapon/shard/phoron/New(loc)
- ..(loc, get_material_by_name("phoron glass"))
diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm
index 52eaa4510d..d91ecb463c 100644
--- a/code/game/objects/items/weapons/storage/bags.dm
+++ b/code/game/objects/items/weapons/storage/bags.dm
@@ -119,12 +119,12 @@
//verbs += /obj/item/weapon/storage/bag/sheetsnatcher/quick_empty
can_be_inserted(obj/item/W as obj, stop_messages = 0)
- if(!istype(W,/obj/item/stack/sheet) || istype(W,/obj/item/stack/sheet/mineral/sandstone) || istype(W,/obj/item/stack/sheet/wood))
+ if(!istype(W,/obj/item/stack/material) || istype(W,/obj/item/stack/material/sandstone) || istype(W,/obj/item/stack/material/wood))
if(!stop_messages)
usr << "The snatcher does not accept [W]."
return 0 //I don't care, but the existing code rejects them for not being "sheets" *shrug* -Sayu
var/current = 0
- for(var/obj/item/stack/sheet/S in contents)
+ for(var/obj/item/stack/material/S in contents)
current += S.amount
if(capacity == current)//If it's full, you're done
if(!stop_messages)
@@ -135,20 +135,20 @@
// Modified handle_item_insertion. Would prefer not to, but...
handle_item_insertion(obj/item/W as obj, prevent_warning = 0)
- var/obj/item/stack/sheet/S = W
+ var/obj/item/stack/material/S = W
if(!istype(S)) return 0
var/amount
var/inserted = 0
var/current = 0
- for(var/obj/item/stack/sheet/S2 in contents)
+ for(var/obj/item/stack/material/S2 in contents)
current += S2.amount
if(capacity < current + S.amount)//If the stack will fill it up
amount = capacity - current
else
amount = S.amount
- for(var/obj/item/stack/sheet/sheet in contents)
+ for(var/obj/item/stack/material/sheet in contents)
if(S.type == sheet.type) // we are violating the amount limitation because these are not sane objects
sheet.amount += amount // they should only be removed through procs in this file, which split them up.
S.amount -= amount
@@ -183,7 +183,7 @@
if(display_contents_with_number)
numbered_contents = list()
adjusted_contents = 0
- for(var/obj/item/stack/sheet/I in contents)
+ for(var/obj/item/stack/material/I in contents)
adjusted_contents++
var/datum/numbered_display/D = new/datum/numbered_display(I)
D.number = I.amount
@@ -200,9 +200,9 @@
// Modified quick_empty verb drops appropriate sized stacks
quick_empty()
var/location = get_turf(src)
- for(var/obj/item/stack/sheet/S in contents)
+ for(var/obj/item/stack/material/S in contents)
while(S.amount)
- var/obj/item/stack/sheet/N = new S.type(location)
+ var/obj/item/stack/material/N = new S.type(location)
var/stacksize = min(S.amount,N.max_amount)
N.amount = stacksize
S.amount -= stacksize
@@ -215,7 +215,7 @@
// Instead of removing
remove_from_storage(obj/item/W as obj, atom/new_location)
- var/obj/item/stack/sheet/S = W
+ var/obj/item/stack/material/S = W
if(!istype(S)) return 0
//I would prefer to drop a new stack, but the item/attack_hand code
@@ -224,7 +224,7 @@
// -Sayu
if(S.amount > S.max_amount)
- var/obj/item/stack/sheet/temp = new S.type(src)
+ var/obj/item/stack/material/temp = new S.type(src)
temp.amount = S.amount - S.max_amount
S.amount = S.max_amount
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index 79b1852e7b..7080cd1931 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -33,8 +33,8 @@
/obj/item/device/analyzer,
/obj/item/taperoll/engineering,
/obj/item/device/robotanalyzer,
- /obj/item/weapon/minihoe,
- /obj/item/weapon/hatchet,
+ /obj/item/weapon/material/minihoe,
+ /obj/item/weapon/material/hatchet,
/obj/item/device/analyzer/plant_analyzer,
/obj/item/weapon/extinguisher/mini
)
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index d5af4b2bc7..0f8cbcc10f 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -598,7 +598,7 @@
icon_state = "light"
desc = "This box is shaped on the inside so that only light tubes and bulbs fit."
item_state = "syringe_kit"
- foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
+ foldable = /obj/item/stack/material/cardboard //BubbleWrap
storage_slots=21
can_hold = list(/obj/item/weapon/light/tube, /obj/item/weapon/light/bulb)
max_storage_space = 42 //holds 21 items of w_class 2
diff --git a/code/game/objects/items/weapons/storage/misc.dm b/code/game/objects/items/weapons/storage/misc.dm
index 65e1bfea37..6bd9495714 100644
--- a/code/game/objects/items/weapons/storage/misc.dm
+++ b/code/game/objects/items/weapons/storage/misc.dm
@@ -18,7 +18,7 @@
storage_slots = 6
var/startswith = 6
can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/donut)
- foldable = /obj/item/stack/sheet/cardboard
+ foldable = /obj/item/stack/material/cardboard
/obj/item/weapon/storage/box/donut/New()
..()
diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm
index 8747bbfacf..bed0591a7e 100644
--- a/code/game/objects/items/weapons/stunbaton.dm
+++ b/code/game/objects/items/weapons/stunbaton.dm
@@ -35,12 +35,13 @@
/obj/item/weapon/melee/baton/proc/deductcharge(var/chrgdeductamt)
if(bcell)
- if(bcell.use(chrgdeductamt))
+ if(bcell.checked_use(chrgdeductamt))
return 1
else
status = 0
update_icon()
return 0
+ return null
/obj/item/weapon/melee/baton/update_icon()
if(status)
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index 9307fabff7..0c563215c7 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -455,9 +455,9 @@
/obj/item/weapon/screwdriver,
/obj/item/weapon/wrench,
/obj/item/weapon/wirecutters,
- /obj/item/weapon/kitchen/utensil/knife,
- /obj/item/weapon/kitchen/utensil/fork,
- /obj/item/weapon/hatchet
+ /obj/item/weapon/material/kitchen/utensil/knife,
+ /obj/item/weapon/material/kitchen/utensil/fork,
+ /obj/item/weapon/material/hatchet
)
var/list/tools = list()
var/current_tool = 1
diff --git a/code/game/objects/items/weapons/trays.dm b/code/game/objects/items/weapons/trays.dm
new file mode 100644
index 0000000000..c52961eda5
--- /dev/null
+++ b/code/game/objects/items/weapons/trays.dm
@@ -0,0 +1,208 @@
+/*
+ * Trays - Agouri
+ */
+/obj/item/weapon/tray
+ name = "tray"
+ icon = 'icons/obj/food.dmi'
+ icon_state = "tray"
+ desc = "A metal tray to lay food on."
+ throwforce = 12.0
+ throwforce = 10.0
+ throw_speed = 1
+ throw_range = 5
+ w_class = 3.0
+ flags = CONDUCT
+ matter = list(DEFAULT_WALL_MATERIAL = 3000)
+ var/list/carrying = list() // List of things on the tray. - Doohl
+ var/max_carry = 10
+
+/obj/item/weapon/tray/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
+
+ // Drop all the things. All of them.
+ overlays.Cut()
+ for(var/obj/item/I in carrying)
+ I.loc = M.loc
+ carrying.Remove(I)
+ if(isturf(I.loc))
+ spawn()
+ for(var/i = 1, i <= rand(1,2), i++)
+ if(I)
+ step(I, pick(NORTH,SOUTH,EAST,WEST))
+ sleep(rand(2,4))
+
+
+ if((CLUMSY in user.mutations) && prob(50)) //What if he's a clown?
+ M << "\red You accidentally slam yourself with the [src]!"
+ M.Weaken(1)
+ user.take_organ_damage(2)
+ if(prob(50))
+ playsound(M, 'sound/items/trayhit1.ogg', 50, 1)
+ return
+ else
+ playsound(M, 'sound/items/trayhit2.ogg', 50, 1) //sound playin'
+ return //it always returns, but I feel like adding an extra return just for safety's sakes. EDIT; Oh well I won't :3
+
+ var/mob/living/carbon/human/H = M ///////////////////////////////////// /Let's have this ready for later.
+
+
+ if(!(user.zone_sel.selecting == ("eyes" || "head"))) //////////////hitting anything else other than the eyes
+ if(prob(33))
+ src.add_blood(H)
+ var/turf/location = H.loc
+ if (istype(location, /turf/simulated))
+ location.add_blood(H) ///Plik plik, the sound of blood
+
+ M.attack_log += text("\[[time_stamp()]\] Has been attacked with [src.name] by [user.name] ([user.ckey])")
+ user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to attack [M.name] ([M.ckey])")
+ msg_admin_attack("[user.name] ([user.ckey]) used the [src.name] to attack [M.name] ([M.ckey]) (JMP)")
+
+ if(prob(15))
+ M.Weaken(3)
+ M.take_organ_damage(3)
+ else
+ M.take_organ_damage(5)
+ if(prob(50))
+ playsound(M, 'sound/items/trayhit1.ogg', 50, 1)
+ for(var/mob/O in viewers(M, null))
+ O.show_message(text("\red [] slams [] with the tray!", user, M), 1)
+ return
+ else
+ playsound(M, 'sound/items/trayhit2.ogg', 50, 1) //we applied the damage, we played the sound, we showed the appropriate messages. Time to return and stop the proc
+ for(var/mob/O in viewers(M, null))
+ O.show_message(text("\red [] slams [] with the tray!", user, M), 1)
+ return
+
+
+ if(istype(M, /mob/living/carbon/human) && ((H.head && H.head.flags & HEADCOVERSEYES) || (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || (H.glasses && H.glasses.flags & GLASSESCOVERSEYES)))
+ M << "\red You get slammed in the face with the tray, against your mask!"
+ if(prob(33))
+ src.add_blood(H)
+ if (H.wear_mask)
+ H.wear_mask.add_blood(H)
+ if (H.head)
+ H.head.add_blood(H)
+ if (H.glasses && prob(33))
+ H.glasses.add_blood(H)
+ var/turf/location = H.loc
+ if (istype(location, /turf/simulated)) //Addin' blood! At least on the floor and item :v
+ location.add_blood(H)
+
+ if(prob(50))
+ playsound(M, 'sound/items/trayhit1.ogg', 50, 1)
+ for(var/mob/O in viewers(M, null))
+ O.show_message(text("\red [] slams [] with the tray!", user, M), 1)
+ else
+ playsound(M, 'sound/items/trayhit2.ogg', 50, 1) //sound playin'
+ for(var/mob/O in viewers(M, null))
+ O.show_message(text("\red [] slams [] with the tray!", user, M), 1)
+ if(prob(10))
+ M.Stun(rand(1,3))
+ M.take_organ_damage(3)
+ return
+ else
+ M.take_organ_damage(5)
+ return
+
+ else //No eye or head protection, tough luck!
+ M << "\red You get slammed in the face with the tray!"
+ if(prob(33))
+ src.add_blood(M)
+ var/turf/location = H.loc
+ if (istype(location, /turf/simulated))
+ location.add_blood(H)
+
+ if(prob(50))
+ playsound(M, 'sound/items/trayhit1.ogg', 50, 1)
+ for(var/mob/O in viewers(M, null))
+ O.show_message(text("\red [] slams [] in the face with the tray!", user, M), 1)
+ else
+ playsound(M, 'sound/items/trayhit2.ogg', 50, 1) //sound playin' again
+ for(var/mob/O in viewers(M, null))
+ O.show_message(text("\red [] slams [] in the face with the tray!", user, M), 1)
+ if(prob(30))
+ M.Stun(rand(2,4))
+ M.take_organ_damage(4)
+ return
+ else
+ M.take_organ_damage(8)
+ if(prob(30))
+ M.Weaken(2)
+ return
+ return
+
+/obj/item/weapon/tray/var/cooldown = 0 //shield bash cooldown. based on world.time
+
+/obj/item/weapon/tray/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(istype(W, /obj/item/weapon/material/kitchen/rollingpin))
+ if(cooldown < world.time - 25)
+ user.visible_message("[user] bashes [src] with [W]!")
+ playsound(user.loc, 'sound/effects/shieldbash.ogg', 50, 1)
+ cooldown = world.time
+ else
+ ..()
+
+/*
+===============~~~~~================================~~~~~====================
+= =
+= Code for trays carrying things. By Doohl for Doohl erryday Doohl Doohl~ =
+= =
+===============~~~~~================================~~~~~====================
+*/
+/obj/item/weapon/tray/proc/calc_carry()
+ // calculate the weight of the items on the tray
+ var/val = 0 // value to return
+
+ for(var/obj/item/I in carrying)
+ if(I.w_class == 1.0)
+ val ++
+ else if(I.w_class == 2.0)
+ val += 3
+ else
+ val += 5
+
+ return val
+
+/obj/item/weapon/tray/pickup(mob/user)
+
+ if(!isturf(loc))
+ return
+
+ for(var/obj/item/I in loc)
+ if( I != src && !I.anchored && !istype(I, /obj/item/clothing/under) && !istype(I, /obj/item/clothing/suit) && !istype(I, /obj/item/projectile) )
+ var/add = 0
+ if(I.w_class == 1.0)
+ add = 1
+ else if(I.w_class == 2.0)
+ add = 3
+ else
+ add = 5
+ if(calc_carry() + add >= max_carry)
+ break
+
+ I.loc = src
+ carrying.Add(I)
+ overlays += image("icon" = I.icon, "icon_state" = I.icon_state, "layer" = 30 + I.layer)
+
+/obj/item/weapon/tray/dropped(mob/user)
+
+ var/mob/living/M
+ for(M in src.loc) //to handle hand switching
+ return
+
+ var/foundtable = 0
+ for(var/obj/structure/table/T in loc)
+ foundtable = 1
+ break
+
+ overlays.Cut()
+
+ for(var/obj/item/I in carrying)
+ I.loc = loc
+ carrying.Remove(I)
+ if(!foundtable && isturf(loc))
+ // if no table, presume that the person just shittily dropped the tray on the ground and made a mess everywhere!
+ spawn()
+ for(var/i = 1, i <= rand(1,2), i++)
+ if(I)
+ step(I, pick(NORTH,SOUTH,EAST,WEST))
+ sleep(rand(2,4))
diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm
index fbbc731f2a..867c5155e0 100644
--- a/code/game/objects/items/weapons/weaponry.dm
+++ b/code/game/objects/items/weapons/weaponry.dm
@@ -89,215 +89,6 @@
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
return ..()
-/obj/item/weapon/claymore
- name = "claymore"
- desc = "What are you standing around staring at this for? Get to killing!"
- icon_state = "claymore"
- item_state = "claymore"
- flags = CONDUCT
- slot_flags = SLOT_BELT
- force = 40
- throwforce = 10
- sharp = 1
- edge = 1
- w_class = 3
- attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
-
- IsShield()
- return 1
-
- suicide_act(mob/user)
- viewers(user) << "[user] is falling on the [src.name]! It looks like \he's trying to commit suicide."
- return(BRUTELOSS)
-
-/obj/item/weapon/claymore/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
- playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
- return ..()
-
-/obj/item/weapon/katana
- name = "katana"
- desc = "Woefully underpowered in D20"
- icon_state = "katana"
- item_state = "katana"
- flags = CONDUCT
- slot_flags = SLOT_BELT | SLOT_BACK
- force = 40
- throwforce = 10
- sharp = 1
- edge = 1
- w_class = 3
- attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
-
- suicide_act(mob/user)
- viewers(user) << "[user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku."
- return(BRUTELOSS)
-
-/obj/item/weapon/katana/IsShield()
- return 1
-
-/obj/item/weapon/katana/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
- playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
- return ..()
-
-/obj/item/weapon/harpoon
- name = "harpoon"
- sharp = 1
- edge = 0
- desc = "Tharr she blows!"
- icon_state = "harpoon"
- item_state = "harpoon"
- force = 20
- throwforce = 15
- w_class = 3
- attack_verb = list("jabbed","stabbed","ripped")
-
-/obj/item/weapon/butterfly
- name = "butterfly knife"
- desc = "A basic metal blade concealed in a lightweight plasteel grip. Small enough when folded to fit in a pocket."
- icon_state = "butterflyknife"
- item_state = null
- hitsound = null
- var/active = 0
- w_class = 2
- force = 2
- sharp = 0
- edge = 0
- throw_speed = 3
- throw_range = 4
- throwforce = 7
- attack_verb = list("patted", "tapped")
-
-/obj/item/butterflyconstruction
- name = "unfinished concealed knife"
- desc = "An unfinished concealed knife, it looks like the screws need to be tightened."
- icon = 'icons/obj/buildingobject.dmi'
- icon_state = "butterflystep1"
-
-/obj/item/butterflyconstruction/attackby(obj/item/W as obj, mob/user as mob)
- if(istype(W,/obj/item/weapon/screwdriver))
- user << "You finish the concealed blade weapon."
- new /obj/item/weapon/butterfly(user.loc)
- qdel(src)
- return
-
-/obj/item/butterflyblade
- name = "knife blade"
- desc = "A knife blade. Unusable as a weapon without a grip."
- icon = 'icons/obj/buildingobject.dmi'
- icon_state = "butterfly2"
- matter = list(DEFAULT_WALL_MATERIAL = 5000)
-
-/obj/item/butterflyhandle
- name = "concealed knife grip"
- desc = "A plasteel grip with screw fittings for a blade."
- icon = 'icons/obj/buildingobject.dmi'
- icon_state = "butterfly1"
- matter = list(DEFAULT_WALL_MATERIAL = 4000)
-
-/obj/item/butterflyhandle/attackby(obj/item/W as obj, mob/user as mob)
- if(istype(W,/obj/item/butterflyblade))
- user << "You attach the two concealed blade parts."
- new /obj/item/butterflyconstruction(user.loc)
- qdel(W)
- qdel(src)
- return
- update_icon(user)
-
-/obj/item/weapon/butterfly/switchblade
- name = "switchblade"
- desc = "A classic switchblade with gold engraving. Just holding it makes you feel like a gangster."
- icon_state = "switchblade"
-
-/obj/item/weapon/butterfly/attack_self(mob/user)
- active = !active
- if(active)
- user << "You flip out your [src]."
- playsound(user, 'sound/weapons/flipblade.ogg', 15, 1)
- force = 15 //bay adjustments
- throwforce = 12
- edge = 1
- sharp = 1
- hitsound = 'sound/weapons/bladeslice.ogg'
- icon_state += "_open"
- w_class = 3
- attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
- else
- user << "The butterfly knife can now be concealed."
- force = initial(force)
- edge = 0
- sharp = 0
- hitsound = initial(hitsound)
- icon_state = initial(icon_state)
- w_class = initial(w_class)
- attack_verb = initial(attack_verb)
- add_fingerprint(user)
-
-
-obj/item/weapon/wirerod
- name = "wired rod"
- desc = "A rod with some wire wrapped around the top. It'd be easy to attach something to the top bit."
- icon_state = "wiredrod"
- item_state = "rods"
- flags = CONDUCT
- force = 8
- throwforce = 10
- w_class = 3
- attack_verb = list("hit", "bludgeoned", "whacked", "bonked")
-
-
-obj/item/weapon/wirerod/attackby(var/obj/item/I, mob/user as mob)
- ..()
- if(istype(I, /obj/item/weapon/shard))
- var/obj/item/weapon/twohanded/spear/S = new /obj/item/weapon/twohanded/spear
-
- user.put_in_hands(S)
- user << "You fasten the glass shard to the top of the rod with the cable."
- qdel(I)
- qdel(src)
- update_icon(user)
-
- else if(istype(I, /obj/item/weapon/wirecutters))
- var/obj/item/weapon/melee/baton/cattleprod/P = new /obj/item/weapon/melee/baton/cattleprod
-
- user.put_in_hands(P)
- user << "You fasten the wirecutters to the top of the rod with the cable, prongs outward."
- qdel(I)
- qdel(src)
- update_icon(user)
- update_icon(user)
-
-/obj/item/weapon/star
- name = "shuriken"
- desc = "A sharp, perfectly weighted piece of metal."
- icon_state = "star"
- force = 5
- throw_speed = 10
- throwforce = 15
- throw_range = 15
- sharp = 1
- edge = 1
- matter = list(DEFAULT_WALL_MATERIAL = 500)
-
- var/poisoned = 0
-
-/obj/item/weapon/star/New()
- ..()
- src.pixel_x = rand(-12, 12)
- src.pixel_y = rand(-12, 12)
-
-//TODO: consider making this something done with reagents.
-/obj/item/weapon/star/throw_impact(atom/hit_atom)
- ..()
- if(poisoned && istype(hit_atom,/mob/living))
- var/mob/living/M = hit_atom
- M.adjustToxLoss(rand(20,40))
- poisoned = 0
- color = null
-
-/obj/item/weapon/star/ninja
- color = "#007700"
- poisoned = 1
-
/obj/item/weapon/energy_net
name = "energy net"
desc = "It's a net made of green energy."
diff --git a/code/game/objects/random/random.dm b/code/game/objects/random/random.dm
index 18e0c75e1a..e64d422a20 100644
--- a/code/game/objects/random/random.dm
+++ b/code/game/objects/random/random.dm
@@ -162,11 +162,11 @@
prob(2);/obj/item/weapon/storage/pill_bottle/happy,\
prob(2);/obj/item/weapon/storage/pill_bottle/zoom,\
prob(5);/obj/item/weapon/contraband/poster,\
- prob(2);/obj/item/weapon/butterfly,\
- prob(3);/obj/item/butterflyblade,\
- prob(3);/obj/item/butterflyhandle,\
- prob(3);/obj/item/weapon/wirerod,\
- prob(1);/obj/item/weapon/butterfly/switchblade,\
+ prob(2);/obj/item/weapon/material/butterfly,\
+ prob(3);/obj/item/weapon/material/butterflyblade,\
+ prob(3);/obj/item/weapon/material/butterflyhandle,\
+ prob(3);/obj/item/weapon/material/wirerod,\
+ prob(1);/obj/item/weapon/material/butterfly/switchblade,\
prob(1);/obj/item/weapon/reagent_containers/syringe/drugs)
diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm
index 4b0501a2d1..8039814f4f 100644
--- a/code/game/objects/structures.dm
+++ b/code/game/objects/structures.dm
@@ -78,8 +78,8 @@
else
return ..()
-/obj/structure/proc/can_climb(var/mob/living/user)
- if (!can_touch(user) || !climbable || (user in climbers))
+/obj/structure/proc/can_climb(var/mob/living/user, post_climb_check=0)
+ if (!can_touch(user) || !climbable || (!post_climb_check && (user in climbers)))
return 0
if (!user.Adjacent(src))
@@ -115,7 +115,7 @@
climbers -= user
return
- if (!can_climb(user))
+ if (!can_climb(user, post_climb_check=1))
climbers -= user
return
@@ -192,5 +192,6 @@
if(!breakable || !damage || !wallbreaker)
return 0
visible_message("[user] [attack_verb] the [src] apart!")
+ user.do_attack_animation(src)
spawn(1) qdel(src)
return 1
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 3b27308f05..334a1c6fbc 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -232,7 +232,7 @@
if(!WT.remove_fuel(0,user))
user << "You need more welding fuel to complete this task."
return
- new /obj/item/stack/sheet/metal(src.loc)
+ new /obj/item/stack/material/steel(src.loc)
for(var/mob/M in viewers(src))
M.show_message("\The [src] has been cut apart by [user] with \the [WT].", 3, "You hear welding.", 2)
qdel(src)
@@ -335,6 +335,7 @@
/obj/structure/closet/attack_generic(var/mob/user, var/damage, var/attack_message = "destroys", var/wallbreaker)
if(!damage || !wallbreaker)
return
+ user.do_attack_animation(src)
visible_message("[user] [attack_message] the [src]!")
dump_contents()
spawn(1) qdel(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
index 8dacfa4c40..481371b424 100644
--- a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
+++ b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
@@ -2,7 +2,7 @@
/obj/structure/closet/fireaxecabinet
name = "fire axe cabinet"
desc = "There is small label that reads \"For Emergency use only\" along with details for safe use of the axe. As if."
- var/obj/item/weapon/twohanded/fireaxe/fireaxe
+ var/obj/item/weapon/material/twohanded/fireaxe/fireaxe
icon_state = "fireaxe1000"
icon_closed = "fireaxe1000"
icon_opened = "fireaxe1100"
@@ -16,7 +16,7 @@
New()
..()
- fireaxe = new /obj/item/weapon/twohanded/fireaxe(src)
+ fireaxe = new /obj/item/weapon/material/twohanded/fireaxe(src)
attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri
//..() //That's very useful, Erro
@@ -55,7 +55,7 @@
src.localopened = 1
update_icon()
return
- if (istype(O, /obj/item/weapon/twohanded/fireaxe) && src.localopened)
+ if (istype(O, /obj/item/weapon/material/twohanded/fireaxe) && src.localopened)
if(!fireaxe)
if(O:wielded)
user << "\red Unwield the axe first."
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm b/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm
index 019d4873bc..bf7aa92fa6 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm
@@ -21,8 +21,8 @@
new /obj/item/device/analyzer/plant_analyzer(src)
new /obj/item/device/radio/headset/headset_service(src)
new /obj/item/clothing/head/greenbandana(src)
- new /obj/item/weapon/minihoe(src)
- new /obj/item/weapon/hatchet(src)
+ new /obj/item/weapon/material/minihoe(src)
+ new /obj/item/weapon/material/hatchet(src)
new /obj/item/weapon/wirecutters/clippers(src)
new /obj/item/weapon/reagent_containers/spray/plantbgone(src)
// new /obj/item/weapon/bee_net(src) //No more bees, March 2014
diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm
index 67a159e7ca..b59cd62dfa 100644
--- a/code/game/objects/structures/crates_lockers/closets/statue.dm
+++ b/code/game/objects/structures/crates_lockers/closets/statue.dm
@@ -105,6 +105,7 @@
/obj/structure/closet/statue/attackby(obj/item/I as obj, mob/user as mob)
health -= I.force
+ user.do_attack_animation(src)
visible_message("[user] strikes [src] with [I].")
if(health <= 0)
for(var/mob/M in src)
diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm
index 2f6b66e5ce..2214a17f8e 100644
--- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm
+++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm
@@ -41,7 +41,7 @@
/obj/structure/closet/syndicate/nuclear/New()
..()
-
+
new /obj/item/ammo_magazine/a12mm(src)
new /obj/item/ammo_magazine/a12mm(src)
new /obj/item/ammo_magazine/a12mm(src)
@@ -86,35 +86,35 @@
//Metal (common ore)
if(pickednum >= 2)
- new /obj/item/stack/sheet/metal(src, rand(common_min, common_max))
+ new /obj/item/stack/material/steel(src, rand(common_min, common_max))
//Glass (common ore)
if(pickednum >= 5)
- new /obj/item/stack/sheet/glass(src, rand(common_min, common_max))
+ new /obj/item/stack/material/glass(src, rand(common_min, common_max))
//Plasteel (common ore) Because it has a million more uses then phoron
if(pickednum >= 10)
- new /obj/item/stack/sheet/plasteel(src, rand(common_min, common_max))
+ new /obj/item/stack/material/plasteel(src, rand(common_min, common_max))
//Phoron (rare ore)
if(pickednum >= 15)
- new /obj/item/stack/sheet/mineral/phoron(src, rand(rare_min, rare_max))
+ new /obj/item/stack/material/phoron(src, rand(rare_min, rare_max))
//Silver (rare ore)
if(pickednum >= 20)
- new /obj/item/stack/sheet/mineral/silver(src, rand(rare_min, rare_max))
+ new /obj/item/stack/material/silver(src, rand(rare_min, rare_max))
//Gold (rare ore)
if(pickednum >= 30)
- new /obj/item/stack/sheet/mineral/gold(src, rand(rare_min, rare_max))
+ new /obj/item/stack/material/gold(src, rand(rare_min, rare_max))
//Uranium (rare ore)
if(pickednum >= 40)
- new /obj/item/stack/sheet/mineral/uranium(src, rand(rare_min, rare_max))
+ new /obj/item/stack/material/uranium(src, rand(rare_min, rare_max))
//Diamond (rare HONK)
if(pickednum >= 45)
- new /obj/item/stack/sheet/mineral/diamond(src, rand(rare_min, rare_max))
+ new /obj/item/stack/material/diamond(src, rand(rare_min, rare_max))
//Jetpack (You hit the jackpot!)
if(pickednum == 50)
@@ -127,14 +127,14 @@
New()
var/list/resources = list(
- /obj/item/stack/sheet/metal,
- /obj/item/stack/sheet/glass,
- /obj/item/stack/sheet/mineral/gold,
- /obj/item/stack/sheet/mineral/silver,
- /obj/item/stack/sheet/mineral/phoron,
- /obj/item/stack/sheet/mineral/uranium,
- /obj/item/stack/sheet/mineral/diamond,
- /obj/item/stack/sheet/plasteel,
+ /obj/item/stack/material/steel,
+ /obj/item/stack/material/glass,
+ /obj/item/stack/material/gold,
+ /obj/item/stack/material/silver,
+ /obj/item/stack/material/phoron,
+ /obj/item/stack/material/uranium,
+ /obj/item/stack/material/diamond,
+ /obj/item/stack/material/plasteel,
/obj/item/stack/rods
)
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index 95e8c06e85..96bdae2336 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -486,7 +486,7 @@
..()
new /obj/item/weapon/reagent_containers/spray/plantbgone(src)
new /obj/item/weapon/reagent_containers/spray/plantbgone(src)
- new /obj/item/weapon/minihoe(src)
+ new /obj/item/weapon/material/minihoe(src)
// new /obj/item/weapon/weedspray(src)
// new /obj/item/weapon/weedspray(src)
// new /obj/item/weapon/pestspray(src)
diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm
index a0ef655579..54a9fc8092 100644
--- a/code/game/objects/structures/crates_lockers/largecrate.dm
+++ b/code/game/objects/structures/crates_lockers/largecrate.dm
@@ -11,7 +11,7 @@
/obj/structure/largecrate/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/crowbar))
- new /obj/item/stack/sheet/wood(src)
+ new /obj/item/stack/material/wood(src)
var/turf/T = get_turf(src)
for(var/obj/O in contents)
O.loc = T
diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm
index 5150319f15..d343e41159 100644
--- a/code/game/objects/structures/displaycase.dm
+++ b/code/game/objects/structures/displaycase.dm
@@ -13,7 +13,7 @@
/obj/structure/displaycase/ex_act(severity)
switch(severity)
if (1)
- new /obj/item/weapon/shard( src.loc )
+ new /obj/item/weapon/material/shard( src.loc )
if (occupied)
new /obj/item/weapon/gun/energy/captain( src.loc )
occupied = 0
@@ -37,7 +37,7 @@
/obj/structure/displaycase/blob_act()
if (prob(75))
- new /obj/item/weapon/shard( src.loc )
+ new /obj/item/weapon/material/shard( src.loc )
if (occupied)
new /obj/item/weapon/gun/energy/captain( src.loc )
occupied = 0
@@ -45,7 +45,7 @@
/obj/structure/displaycase/meteorhit(obj/O as obj)
- new /obj/item/weapon/shard( src.loc )
+ new /obj/item/weapon/material/shard( src.loc )
new /obj/item/weapon/gun/energy/captain( src.loc )
qdel(src)
@@ -55,7 +55,7 @@
if (!( src.destroyed ))
src.density = 0
src.destroyed = 1
- new /obj/item/weapon/shard( src.loc )
+ new /obj/item/weapon/material/shard( src.loc )
playsound(src, "shatter", 70, 1)
update_icon()
else
diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm
index a15650405e..169b1deebd 100644
--- a/code/game/objects/structures/door_assembly.dm
+++ b/code/game/objects/structures/door_assembly.dm
@@ -150,7 +150,7 @@
if(do_after(user, 40))
if(!src || !WT.isOn()) return
user << "\blue You welded the [glass] plating off!"
- var/M = text2path("/obj/item/stack/sheet/mineral/[glass]")
+ var/M = text2path("/obj/item/stack/material/[glass]")
new M(src.loc, 2)
glass = 0
else if(glass == 1)
@@ -158,14 +158,14 @@
if(do_after(user, 40))
if(!src || !WT.isOn()) return
user << "\blue You welded the glass panel out!"
- new /obj/item/stack/sheet/glass/reinforced(src.loc)
+ new /obj/item/stack/material/glass/reinforced(src.loc)
glass = 0
else if(!anchored)
user.visible_message("[user] dissassembles the airlock assembly.", "You start to dissassemble the airlock assembly.")
if(do_after(user, 40))
if(!src || !WT.isOn()) return
user << "\blue You dissasembled the airlock assembly!"
- new /obj/item/stack/sheet/metal(src.loc, 4)
+ new /obj/item/stack/material/steel(src.loc, 4)
qdel (src)
else
user << "\blue You need more welding fuel."
@@ -235,19 +235,19 @@
electronics.loc = src.loc
electronics = null
- else if(istype(W, /obj/item/stack/sheet) && !glass)
- var/obj/item/stack/sheet/S = W
+ else if(istype(W, /obj/item/stack/material) && !glass)
+ var/obj/item/stack/material/S = W
if (S)
if (S.get_amount() >= 1)
- if(istype(S, /obj/item/stack/sheet/glass/reinforced))
+ if(istype(S, /obj/item/stack/material/glass/reinforced))
playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1)
user.visible_message("[user] adds [S.name] to the airlock assembly.", "You start to install [S.name] into the airlock assembly.")
if(do_after(user, 40) && !glass)
if (S.use(1))
user << "You installed reinforced glass windows into the airlock assembly."
glass = 1
- else if(istype(S, /obj/item/stack/sheet/mineral) && S.sheettype)
- var/M = S.sheettype
+ else if(istype(S, /obj/item/stack/material) && S.default_type)
+ var/M = S.default_type
// Ugly hack, will suffice for now. Need to fix it upstream as well, may rewrite mineral walls. ~Z
if(M in list("mhydrogen","osmium","tritium","platinum","iron"))
user << "You cannot make an airlock out of that material."
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index e8cb65a33d..38caaa3230 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -17,6 +17,7 @@
/obj/structure/girder/attack_generic(var/mob/user, var/damage, var/attack_message = "smashes apart", var/wallbreaker)
if(!damage || !wallbreaker)
return 0
+ user.do_attack_animation(src)
visible_message("[user] [attack_message] the [src]!")
spawn(1) dismantle()
return 1
@@ -105,13 +106,13 @@
health = 50
cover = 25
- else if(istype(W, /obj/item/stack/sheet))
+ else if(istype(W, /obj/item/stack/material))
- var/obj/item/stack/sheet/S = W
+ var/obj/item/stack/material/S = W
if(S.get_amount() < 2)
return ..()
- var/material/M = name_to_material[S.sheettype]
+ var/material/M = name_to_material[S.default_type]
if(!istype(M))
return ..()
@@ -171,7 +172,7 @@
user << "\The [src] is already reinforced."
return
- var/obj/item/stack/sheet/S = user.l_hand
+ var/obj/item/stack/material/S = user.l_hand
if(!istype(S))
S = user.r_hand
if(!istype(S))
@@ -182,7 +183,7 @@
user << "There is not enough material here to reinforce the girder."
return
- var/material/M = name_to_material[S.sheettype]
+ var/material/M = name_to_material[S.default_type]
if(!istype(M) || M.integrity < 50)
user << "You cannot reinforce \the [src] with that; it is too soft."
return
@@ -197,7 +198,7 @@
/obj/structure/girder/proc/dismantle()
- new /obj/item/stack/sheet/metal(get_turf(src))
+ new /obj/item/stack/material/steel(get_turf(src))
qdel(src)
/obj/structure/girder/attack_hand(mob/user as mob)
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index b18658d4a6..fa7a448bd6 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -34,6 +34,7 @@
/obj/structure/grille/attack_hand(mob/user as mob)
playsound(loc, 'sound/effects/grillehit.ogg', 80, 1)
+ user.do_attack_animation(src)
var/damage_dealt = 1
var/attack_message = "kicks"
@@ -114,8 +115,8 @@
return
//window placing begin
- else if(istype(W,/obj/item/stack/sheet/glass))
- var/obj/item/stack/sheet/glass/ST = W
+ else if(istype(W,/obj/item/stack/material/glass))
+ var/obj/item/stack/material/glass/ST = W
var/dir_to_set = 1
if(loc == user.loc)
dir_to_set = user.dir
@@ -153,9 +154,10 @@
return
//window placing end
- else if(istype(W, /obj/item/weapon/shard))
+ else if(istype(W, /obj/item/weapon/material/shard))
health -= W.force * 0.1
else if(!shock(user, 70))
+ user.do_attack_animation(src)
playsound(loc, 'sound/effects/grillehit.ogg', 80, 1)
switch(W.damtype)
if("fire")
@@ -217,6 +219,7 @@
/obj/structure/grille/attack_generic(var/mob/user, var/damage, var/attack_verb)
visible_message("[user] [attack_verb] the [src]!")
+ user.do_attack_animation(src)
health -= damage
spawn(1) healthcheck()
return 1
diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm
index 0aae020ba1..91642f3ebb 100644
--- a/code/game/objects/structures/inflatable.dm
+++ b/code/game/objects/structures/inflatable.dm
@@ -116,6 +116,7 @@
/obj/structure/inflatable/attack_generic(var/mob/user, var/damage, var/attack_verb)
health -= damage
+ user.do_attack_animation(src)
if(health <= 0)
user.visible_message("[user] [attack_verb] open the [src]!")
spawn(1) deflate(1)
diff --git a/code/game/objects/structures/lamarr_cage.dm b/code/game/objects/structures/lamarr_cage.dm
index 3c32052d72..1ab233a3ba 100644
--- a/code/game/objects/structures/lamarr_cage.dm
+++ b/code/game/objects/structures/lamarr_cage.dm
@@ -13,7 +13,7 @@
/obj/structure/lamarr/ex_act(severity)
switch(severity)
if (1)
- new /obj/item/weapon/shard( src.loc )
+ new /obj/item/weapon/material/shard( src.loc )
Break()
qdel(src)
if (2)
@@ -35,13 +35,13 @@
/obj/structure/lamarr/blob_act()
if (prob(75))
- new /obj/item/weapon/shard( src.loc )
+ new /obj/item/weapon/material/shard( src.loc )
Break()
qdel(src)
/obj/structure/lamarr/meteorhit(obj/O as obj)
- new /obj/item/weapon/shard( src.loc )
+ new /obj/item/weapon/material/shard( src.loc )
Break()
qdel(src)
@@ -51,7 +51,7 @@
if (!( src.destroyed ))
src.density = 0
src.destroyed = 1
- new /obj/item/weapon/shard( src.loc )
+ new /obj/item/weapon/material/shard( src.loc )
playsound(src, "shatter", 70, 1)
Break()
else
diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm
deleted file mode 100644
index 695b11db95..0000000000
--- a/code/game/objects/structures/mineral_doors.dm
+++ /dev/null
@@ -1,272 +0,0 @@
-//NOT using the existing /obj/machinery/door type, since that has some complications on its own, mainly based on its
-//machineryness
-
-/obj/structure/mineral_door
- name = "mineral door"
- density = 1
- anchored = 1
- opacity = 1
-
- icon = 'icons/obj/doors/mineral_doors.dmi'
- icon_state = "metal"
-
- var/mineralType = DEFAULT_WALL_MATERIAL
- var/state = 0 //closed, 1 == open
- var/isSwitchingStates = 0
- var/hardness = 1
- var/oreAmount = 7
-
- New(location)
- ..()
- icon_state = mineralType
- name = "[mineralType] door"
- update_nearby_tiles(need_rebuild=1)
-
- Destroy()
- update_nearby_tiles()
- ..()
-
- Bumped(atom/user)
- ..()
- if(!state)
- return TryToSwitchState(user)
- return
-
- attack_ai(mob/user as mob) //those aren't machinery, they're just big fucking slabs of a mineral
- if(isAI(user)) //so the AI can't open it
- return
- else if(isrobot(user)) //but cyborgs can
- if(get_dist(user,src) <= 1) //not remotely though
- return TryToSwitchState(user)
-
- attack_hand(mob/user as mob)
- return TryToSwitchState(user)
-
- CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
- if(air_group) return 0
- if(istype(mover, /obj/effect/beam))
- return !opacity
- return !density
-
- proc/TryToSwitchState(atom/user)
- if(isSwitchingStates) return
- if(ismob(user))
- var/mob/M = user
- if(world.time - user.last_bumped <= 60) return //NOTE do we really need that?
- if(M.client)
- if(iscarbon(M))
- var/mob/living/carbon/C = M
- if(!C.handcuffed)
- SwitchState()
- else
- SwitchState()
- else if(istype(user, /obj/mecha))
- SwitchState()
-
- proc/SwitchState()
- if(state)
- Close()
- else
- Open()
-
- proc/Open()
- isSwitchingStates = 1
- playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 100, 1)
- flick("[mineralType]opening",src)
- sleep(10)
- density = 0
- opacity = 0
- state = 1
- update_icon()
- isSwitchingStates = 0
- update_nearby_tiles()
-
- proc/Close()
- isSwitchingStates = 1
- playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 100, 1)
- flick("[mineralType]closing",src)
- sleep(10)
- density = 1
- opacity = 1
- state = 0
- update_icon()
- isSwitchingStates = 0
- update_nearby_tiles()
-
- update_icon()
- if(state)
- icon_state = "[mineralType]open"
- else
- icon_state = mineralType
-
- attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W,/obj/item/weapon/pickaxe))
- var/obj/item/weapon/pickaxe/digTool = W
- user << "You start digging the [name]."
- if(do_after(user,digTool.digspeed*hardness) && src)
- user << "You finished digging."
- Dismantle()
- else if(istype(W,/obj/item/weapon)) //not sure, can't not just weapons get passed to this proc?
- hardness -= W.force/100
- user << "You hit the [name] with your [W.name]!"
- CheckHardness()
- else
- attack_hand(user)
- return
-
- proc/CheckHardness()
- if(hardness <= 0)
- Dismantle(1)
-
- proc/Dismantle(devastated = 0)
- var/material/M = name_to_material[mineralType]
- if(istype(M))
- for(var/i = (devastated? 1 : 3), i <= oreAmount, i++)
- new M.stack_type(get_turf(src))
- qdel(src)
-
- ex_act(severity = 1)
- switch(severity)
- if(1)
- Dismantle(1)
- if(2)
- if(prob(20))
- Dismantle(1)
- else
- hardness--
- CheckHardness()
- if(3)
- hardness -= 0.1
- CheckHardness()
- return
-
-/obj/structure/mineral_door/iron
- mineralType = "iron"
- hardness = 3
-
-/obj/structure/mineral_door/silver
- mineralType = "silver"
- hardness = 3
-
-/obj/structure/mineral_door/gold
- mineralType = "gold"
-
-/obj/structure/mineral_door/uranium
- mineralType = "uranium"
- hardness = 3
- light_range = 2
-
-/obj/structure/mineral_door/sandstone
- mineralType = "sandstone"
- hardness = 0.5
-
-/obj/structure/mineral_door/transparent
- opacity = 0
-
- Close()
- ..()
- opacity = 0
-
-/obj/structure/mineral_door/transparent/phoron
- mineralType = "phoron"
-
- attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W,/obj/item/weapon/weldingtool))
- var/obj/item/weapon/weldingtool/WT = W
- if(WT.remove_fuel(0, user))
- TemperatureAct(100)
- ..()
-
- fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
- if(exposed_temperature > 300)
- TemperatureAct(exposed_temperature)
-
- proc/TemperatureAct(temperature)
- for(var/turf/simulated/floor/target_tile in range(2,loc))
- var/phoronToDeduce = temperature/10
- target_tile.assume_gas("phoron", phoronToDeduce, 200+T0C)
-
- spawn (0) target_tile.hotspot_expose(temperature, 400)
-
- hardness -= phoronToDeduce/100
- CheckHardness()
-
-/obj/structure/mineral_door/transparent/diamond
- mineralType = "diamond"
- hardness = 10
-
-/obj/structure/mineral_door/wood
- mineralType = "wood"
- hardness = 1
-
- Open()
- isSwitchingStates = 1
- playsound(loc, 'sound/effects/doorcreaky.ogg', 100, 1)
- flick("[mineralType]opening",src)
- sleep(10)
- density = 0
- opacity = 0
- state = 1
- update_icon()
- isSwitchingStates = 0
-
- Close()
- isSwitchingStates = 1
- playsound(loc, 'sound/effects/doorcreaky.ogg', 100, 1)
- flick("[mineralType]closing",src)
- sleep(10)
- density = 1
- opacity = 1
- state = 0
- update_icon()
- isSwitchingStates = 0
-
- Dismantle(devastated = 0)
- if(!devastated)
- for(var/i = 1, i <= oreAmount, i++)
- new/obj/item/stack/sheet/wood(get_turf(src))
- qdel(src)
-
-/obj/structure/mineral_door/resin
- mineralType = "resin"
- hardness = 1.5
- var/close_delay = 100
-
- TryToSwitchState(atom/user)
-
- var/mob/living/carbon/M = user
- if(istype(M) && locate(/obj/item/organ/xenos/hivenode) in M.internal_organs)
- return ..()
-
- Open()
- isSwitchingStates = 1
- playsound(loc, 'sound/effects/attackblob.ogg', 100, 1)
- flick("[mineralType]opening",src)
- sleep(10)
- density = 0
- opacity = 0
- state = 1
- update_icon()
- isSwitchingStates = 0
-
- spawn(close_delay)
- if(!isSwitchingStates && state == 1)
- Close()
-
- Close()
- isSwitchingStates = 1
- playsound(loc, 'sound/effects/attackblob.ogg', 100, 1)
- flick("[mineralType]closing",src)
- sleep(10)
- density = 1
- opacity = 1
- state = 0
- update_icon()
- isSwitchingStates = 0
-
- Dismantle(devastated = 0)
- qdel(src)
-
- CheckHardness()
- playsound(loc, 'sound/effects/attackblob.ogg', 100, 1)
- ..()
diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm
index 4868f6e0ca..8141dcf5a3 100644
--- a/code/game/objects/structures/mirror.dm
+++ b/code/game/objects/structures/mirror.dm
@@ -54,6 +54,7 @@
/obj/structure/mirror/attack_generic(var/mob/user, var/damage)
+ user.do_attack_animation(src)
if(shattered)
playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
return 0
diff --git a/code/game/objects/structures/simple_doors.dm b/code/game/objects/structures/simple_doors.dm
new file mode 100644
index 0000000000..313ba17f45
--- /dev/null
+++ b/code/game/objects/structures/simple_doors.dm
@@ -0,0 +1,202 @@
+/obj/structure/simple_door
+ name = "door"
+ density = 1
+ anchored = 1
+
+ icon = 'icons/obj/doors/material_doors.dmi'
+ icon_state = "metal"
+
+ var/material/material
+ var/state = 0 //closed, 1 == open
+ var/isSwitchingStates = 0
+ var/hardness = 1
+ var/oreAmount = 7
+
+/obj/structure/simple_door/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+ if(exposed_temperature > material.ignition_point)
+ TemperatureAct(exposed_temperature)
+
+/obj/structure/simple_door/proc/TemperatureAct(temperature)
+ if(temperature > material.ignition_point)
+ for(var/turf/simulated/floor/target_tile in range(2,loc))
+ var/phoronToDeduce = temperature/10
+ target_tile.assume_gas("phoron", phoronToDeduce, 200+T0C)
+ spawn (0) target_tile.hotspot_expose(temperature, 400)
+ hardness -= phoronToDeduce/100
+ CheckHardness()
+
+/obj/structure/simple_door/New(var/newloc, var/material_name)
+ ..()
+ if(!material_name)
+ material_name = DEFAULT_WALL_MATERIAL
+ material = get_material_by_name(material_name)
+ if(!material)
+ qdel(src)
+ return
+ hardness = max(1,round(material.integrity/10))
+ icon_state = material.door_icon_base
+ name = "[material.display_name] door"
+ color = material.icon_colour
+ if(material.opacity < 0.5)
+ opacity = 0
+ else
+ opacity = 1
+ if(material.products_need_process())
+ processing_objects |= src
+ update_nearby_tiles(need_rebuild=1)
+
+/obj/structure/simple_door/Destroy()
+ processing_objects -= src
+ update_nearby_tiles()
+ ..()
+
+/obj/structure/simple_door/Bumped(atom/user)
+ ..()
+ if(!state)
+ return TryToSwitchState(user)
+ return
+
+/obj/structure/simple_door/attack_ai(mob/user as mob) //those aren't machinery, they're just big fucking slabs of a mineral
+ if(isAI(user)) //so the AI can't open it
+ return
+ else if(isrobot(user)) //but cyborgs can
+ if(get_dist(user,src) <= 1) //not remotely though
+ return TryToSwitchState(user)
+
+/obj/structure/simple_door/attack_hand(mob/user as mob)
+ return TryToSwitchState(user)
+
+/obj/structure/simple_door/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
+ if(air_group) return 0
+ if(istype(mover, /obj/effect/beam))
+ return !opacity
+ return !density
+
+/obj/structure/simple_door/proc/TryToSwitchState(atom/user)
+ if(isSwitchingStates) return
+ if(ismob(user))
+ var/mob/M = user
+ if(!material.can_open_material_door(user))
+ return
+ if(world.time - user.last_bumped <= 60)
+ return
+ if(M.client)
+ if(iscarbon(M))
+ var/mob/living/carbon/C = M
+ if(!C.handcuffed)
+ SwitchState()
+ else
+ SwitchState()
+ else if(istype(user, /obj/mecha))
+ SwitchState()
+
+/obj/structure/simple_door/proc/SwitchState()
+ if(state)
+ Close()
+ else
+ Open()
+
+/obj/structure/simple_door/proc/Open()
+ isSwitchingStates = 1
+ playsound(loc, material.dooropen_noise, 100, 1)
+ flick("[material.door_icon_base]opening",src)
+ sleep(10)
+ density = 0
+ opacity = 0
+ state = 1
+ update_icon()
+ isSwitchingStates = 0
+ update_nearby_tiles()
+
+/obj/structure/simple_door/proc/Close()
+ isSwitchingStates = 1
+ playsound(loc, material.dooropen_noise, 100, 1)
+ flick("[material.door_icon_base]closing",src)
+ sleep(10)
+ density = 1
+ opacity = 1
+ state = 0
+ update_icon()
+ isSwitchingStates = 0
+ update_nearby_tiles()
+
+/obj/structure/simple_door/update_icon()
+ if(state)
+ icon_state = "[material.door_icon_base]open"
+ else
+ icon_state = material.door_icon_base
+
+/obj/structure/simple_door/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(istype(W,/obj/item/weapon/pickaxe))
+ var/obj/item/weapon/pickaxe/digTool = W
+ user << "You start digging the [name]."
+ if(do_after(user,digTool.digspeed*hardness) && src)
+ user << "You finished digging."
+ Dismantle()
+ else if(istype(W,/obj/item/weapon)) //not sure, can't not just weapons get passed to this proc?
+ hardness -= W.force/100
+ user << "You hit the [name] with your [W.name]!"
+ CheckHardness()
+ else if(istype(W,/obj/item/weapon/weldingtool))
+ var/obj/item/weapon/weldingtool/WT = W
+ if(material.ignition_point && WT.remove_fuel(0, user))
+ TemperatureAct(150)
+ else
+ attack_hand(user)
+ return
+
+/obj/structure/simple_door/proc/CheckHardness()
+ if(hardness <= 0)
+ Dismantle(1)
+
+/obj/structure/simple_door/proc/Dismantle(devastated = 0)
+ material.place_dismantled_product(get_turf(src))
+ qdel(src)
+
+/obj/structure/simple_door/ex_act(severity = 1)
+ switch(severity)
+ if(1)
+ Dismantle(1)
+ if(2)
+ if(prob(20))
+ Dismantle(1)
+ else
+ hardness--
+ CheckHardness()
+ if(3)
+ hardness -= 0.1
+ CheckHardness()
+ return
+
+/obj/structure/simple_door/process()
+ if(!material.radioactivity)
+ return
+ for(var/mob/living/L in range(1,src))
+ L.apply_effect(round(material.radioactivity/3),IRRADIATE,0)
+
+/obj/structure/simple_door/iron/New(var/newloc,var/material_name)
+ ..(newloc, "iron")
+
+/obj/structure/simple_door/silver/New(var/newloc,var/material_name)
+ ..(newloc, "silver")
+
+/obj/structure/simple_door/gold/New(var/newloc,var/material_name)
+ ..(newloc, "gold")
+
+/obj/structure/simple_door/uranium/New(var/newloc,var/material_name)
+ ..(newloc, "uranium")
+
+/obj/structure/simple_door/sandstone/New(var/newloc,var/material_name)
+ ..(newloc, "sandstone")
+
+/obj/structure/simple_door/phoron/New(var/newloc,var/material_name)
+ ..(newloc, "phoron")
+
+/obj/structure/simple_door/diamond/New(var/newloc,var/material_name)
+ ..(newloc, "diamond")
+
+/obj/structure/simple_door/wood/New(var/newloc,var/material_name)
+ ..(newloc, "wood")
+
+/obj/structure/simple_door/resin/New(var/newloc,var/material_name)
+ ..(newloc, "resin")
\ No newline at end of file
diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm
index 586a11d181..fb2ef2b525 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm
@@ -16,6 +16,22 @@
anchored = 1
can_buckle = 1
buckle_lying = 1
+ var/material/material
+ var/apply_cosmetics = 1
+
+/obj/structure/bed/New(var/newloc, var/new_material)
+ ..(newloc)
+ if(!new_material)
+ new_material = DEFAULT_WALL_MATERIAL
+
+ material = get_material_by_name(new_material)
+ if(!istype(material))
+ qdel(src)
+ return
+ if(apply_cosmetics)
+ color = material.icon_colour
+ name = "[material.display_name] [initial(name)]"
+ desc = "[initial(desc)] It's made of [material.display_name]."
/obj/structure/bed/ex_act(severity)
switch(severity)
@@ -33,13 +49,13 @@
/obj/structure/bed/blob_act()
if(prob(75))
- new /obj/item/stack/sheet/metal(src.loc)
+ material.place_sheet(get_turf(src))
qdel(src)
/obj/structure/bed/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/wrench))
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
- new /obj/item/stack/sheet/metal(src.loc)
+ material.place_sheet(get_turf(src))
qdel(src)
else if(istype(W, /obj/item/weapon/grab))
user.visible_message("[user] attempts to buckle [W:affecting] into \the [src]!")
@@ -54,14 +70,23 @@
..()
/obj/structure/bed/psych
- name = "psychiatrists couch"
+ name = "psychiatrist's couch"
desc = "For prime comfort during psychiatric evaluations."
icon_state = "psychbed"
+ apply_cosmetics = 0
+
+/obj/structure/bed/psych/New(var/newloc)
+ ..(newloc,"leather")
/obj/structure/bed/alien
name = "resting contraption"
desc = "This looks similar to contraptions from earth. Could aliens be stealing our technology?"
icon_state = "abed"
+ apply_cosmetics = 0
+
+
+/obj/structure/bed/alien/New(var/newloc)
+ ..(newloc,"resin")
/*
* Roller beds
@@ -71,6 +96,7 @@
icon = 'icons/obj/rollerbed.dmi'
icon_state = "down"
anchored = 0
+ apply_cosmetics = 0
/obj/structure/bed/roller/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W,/obj/item/roller_holder))
diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
index b811294a07..271dfde063 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
@@ -3,11 +3,10 @@
desc = "You sit in this. Either by will or force."
icon_state = "chair"
buckle_lying = 0 //force people to sit up in chairs when buckled
-
var/propelled = 0 // Check for fire-extinguisher-driven chairs
-/obj/structure/bed/chair/New()
- ..()
+/obj/structure/bed/chair/New(var/newloc, var/material)
+ ..(newloc, material) //Todo make metal/stone chairs display as thrones
spawn(3) //sorry. i don't think there's a better way to do this.
update_layer()
return
@@ -20,7 +19,7 @@
user << "[SK] is not ready to be attached!"
return
user.drop_item()
- var/obj/structure/bed/chair/e_chair/E = new /obj/structure/bed/chair/e_chair(src.loc)
+ var/obj/structure/bed/chair/e_chair/E = new (src.loc, material.name)
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
E.set_dir(dir)
E.part = SK
@@ -71,24 +70,21 @@
icon_state = "wooden_chair"
name = "wooden chair"
desc = "Old is never too old to not be in fashion."
+ apply_cosmetics = 0
+
+/obj/structure/bed/chair/wood/New(var/newloc)
+ ..(newloc, "wood")
/obj/structure/bed/chair/wood/wings
icon_state = "wooden_chair_wings"
-/obj/structure/bed/chair/wood/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W, /obj/item/weapon/wrench))
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
- new /obj/item/stack/sheet/wood(src.loc)
- qdel(src)
- else
- ..()
-
/obj/structure/bed/chair/comfy
name = "comfy chair"
desc = "It looks comfy."
icon_state = "comfychair"
color = rgb(255,255,255)
var/image/armrest = null
+ apply_cosmetics = 0
/obj/structure/bed/chair/comfy/New()
armrest = image("icons/obj/objects.dmi", "comfychair_armrest")
@@ -129,6 +125,7 @@
/obj/structure/bed/chair/office
anchored = 0
buckle_movable = 1
+ apply_cosmetics = 0
/obj/structure/bed/chair/comfy/lime
color = rgb(255,251,0)
diff --git a/code/game/objects/structures/stool_bed_chair_nest/stools.dm b/code/game/objects/structures/stool_bed_chair_nest/stools.dm
index 8de3bcf0a5..a8f879e084 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/stools.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/stools.dm
@@ -1,18 +1,80 @@
+//Todo: add leather and cloth for arbitrary coloured stools.
+var/global/list/stool_cache = list() //haha stool
+
/obj/item/weapon/stool
name = "stool"
desc = "Apply butt."
icon = 'icons/obj/objects.dmi'
- icon_state = "stool"
+ icon_state = "stool_preview" //set for the map
force = 10
throwforce = 10
w_class = 5
+ var/base_icon = "stool_base"
+ var/material/material
+ var/material/padding_material
+
+/obj/item/weapon/stool/padded
+ icon_state = "stool_padded_preview" //set for the map
+
+/obj/item/weapon/stool/New(var/newloc, var/new_material, var/new_padding_material)
+ ..(newloc)
+ if(!new_material)
+ new_material = DEFAULT_WALL_MATERIAL
+ material = get_material_by_name(new_material)
+ if(new_padding_material)
+ padding_material = get_material_by_name(new_padding_material)
+ if(!istype(material))
+ qdel(src)
+ return
+ force = round(material.get_blunt_damage()*0.4)
+ update_icon()
+
+/obj/item/weapon/stool/padded/New(var/newloc, var/new_material)
+ ..(newloc, "steel", "leather")
+
+/obj/item/weapon/stool/update_icon()
+ // Prep icon.
+ icon_state = "stool"
+ overlays.Cut()
+ // Base icon.
+ var/cache_key = "stool-[material.name]"
+ if(isnull(stool_cache[cache_key]))
+ var/image/I = image('icons/obj/objects.dmi', base_icon)
+ color = material.icon_colour
+ I.color = material.icon_colour
+ stool_cache[cache_key] = I
+ overlays |= stool_cache[cache_key]
+ // Padding overlay.
+ if(padding_material)
+ var/padding_cache_key = "stool-padding-[padding_material.name]"
+ if(isnull(stool_cache[padding_cache_key]))
+ var/image/I = image('icons/obj/objects.dmi', "stool_padding")
+ I.color = padding_material.icon_colour
+ stool_cache[padding_cache_key] = I
+ overlays |= stool_cache[padding_cache_key]
+ // Strings.
+ if(padding_material)
+ name = "[padding_material.display_name] [initial(name)]" //this is not perfect but it will do for now.
+ desc = "A padded stool. Apply butt. It's made of [material.display_name] and covered with [padding_material.display_name]."
+ else
+ name = "[material.display_name] [initial(name)]"
+ desc = "A stool. Apply butt with care. It's made of [material.display_name]."
+
+/obj/item/weapon/stool/proc/add_padding(var/padding_type)
+ padding_material = get_material_by_name(padding_type)
+ update_icon()
+
+/obj/item/weapon/stool/proc/remove_padding()
+ if(padding_material)
+ padding_material.place_sheet(get_turf(src))
+ padding_material = null
+ update_icon()
/obj/item/weapon/stool/attack(mob/M as mob, mob/user as mob)
if (prob(5) && istype(M,/mob/living))
- user.visible_message("\red [user] breaks [src] over [M]'s back!")
+ user.visible_message("[user] breaks [src] over [M]'s back!")
user.remove_from_mob(src)
- var/obj/item/stack/sheet/metal/m = new/obj/item/stack/sheet/metal
- m.loc = get_turf(src)
+ dismantle()
qdel(src)
var/mob/living/T = M
T.Weaken(10)
@@ -36,12 +98,53 @@
/obj/item/weapon/stool/blob_act()
if(prob(75))
- new /obj/item/stack/sheet/metal(src.loc)
+ material.place_sheet(get_turf(src))
qdel(src)
+/obj/item/weapon/stool/proc/dismantle()
+ if(material)
+ material.place_sheet(get_turf(src))
+ if(padding_material)
+ padding_material.place_sheet(get_turf(src))
+ qdel(src)
+
/obj/item/weapon/stool/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/wrench))
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
- new /obj/item/stack/sheet/metal(src.loc)
- qdel(src)
- ..()
+ dismantle()
+ qdel(src)
+ else if(istype(W,/obj/item/stack))
+ if(padding_material)
+ user << "\The [src] is already padded."
+ return
+ var/obj/item/stack/C = W
+ if(C.get_amount() < 1) // How??
+ user.drop_from_inventory(C)
+ qdel(C)
+ return
+ var/padding_type //This is awful but it needs to be like this until tiles are given a material var.
+ if(istype(W,/obj/item/stack/tile/carpet))
+ padding_type = "carpet"
+ else if(istype(W,/obj/item/stack/material))
+ var/obj/item/stack/material/M = W
+ if(M.material && (M.material.name in list("leather", "cloth")))
+ padding_type = "[M.material.name]"
+ if(!padding_type)
+ user << "You cannot pad \the [src] with that."
+ return
+ C.use(1)
+ if(!istype(src.loc, /turf))
+ user.drop_from_inventory(src)
+ src.loc = get_turf(src)
+ user << "You add padding to \the [src]."
+ add_padding(padding_type)
+ return
+ else if (istype(W, /obj/item/weapon/wirecutters))
+ if(!padding_material)
+ user << "\The [src] has no padding to remove."
+ return
+ user << "You remove the padding from \the [src]."
+ playsound(src, 'sound/items/Wirecutter.ogg', 100, 1)
+ remove_padding()
+ else
+ ..()
diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm
index 36135a775e..7d49acba97 100644
--- a/code/game/objects/structures/windoor_assembly.dm
+++ b/code/game/objects/structures/windoor_assembly.dm
@@ -34,7 +34,7 @@ obj/structure/windoor_assembly/New(Loc, start_dir=NORTH, constructed=0)
set_dir(start_dir)
else //If the user is facing northeast. northwest, southeast, southwest or north, default to north
set_dir(NORTH)
-
+
update_nearby_tiles(need_rebuild=1)
obj/structure/windoor_assembly/Destroy()
@@ -76,7 +76,7 @@ obj/structure/windoor_assembly/Destroy()
if(do_after(user, 40))
if(!src || !WT.isOn()) return
user << "\blue You dissasembled the windoor assembly!"
- new /obj/item/stack/sheet/glass/reinforced(get_turf(src), 5)
+ new /obj/item/stack/material/glass/reinforced(get_turf(src), 5)
if(secure)
PoolOrNew(/obj/item/stack/rods, list(get_turf(src), 4))
qdel(src)
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 387c76eb69..41f7754e98 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -13,7 +13,7 @@
var/state = 2
var/reinf = 0
var/basestate
- var/shardtype = /obj/item/weapon/shard
+ var/shardtype = /obj/item/weapon/material/shard
var/glasstype = null // Set this in subtypes. Null is assumed strange or otherwise impossible to dismantle, such as for shuttle glass.
var/silicate = 0 // number of units of silicate
@@ -87,11 +87,11 @@
var/index = null
index = 0
while(index < 2)
- new shardtype(loc)
+ new shardtype(loc) //todo pooling?
if(reinf) PoolOrNew(/obj/item/stack/rods, loc)
index++
else
- new shardtype(loc)
+ new shardtype(loc) //todo pooling?
if(reinf) PoolOrNew(/obj/item/stack/rods, loc)
qdel(src)
return
@@ -178,6 +178,7 @@
if(HULK in user.mutations)
user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!"))
user.visible_message("[user] smashes through [src]!")
+ user.do_attack_animation(src)
shatter()
else if (usr.a_intent == I_HURT)
@@ -189,13 +190,14 @@
return
playsound(src.loc, 'sound/effects/glassknock.ogg', 80, 1)
- usr.visible_message("\red [usr.name] bangs against the [src.name]!", \
- "\red You bang against the [src.name]!", \
+ user.do_attack_animation(src)
+ usr.visible_message("\red [usr.name] bangs against the [src.name]!",
+ "\red You bang against the [src.name]!",
"You hear a banging sound.")
else
playsound(src.loc, 'sound/effects/glassknock.ogg', 80, 1)
- usr.visible_message("[usr.name] knocks on the [src.name].", \
- "You knock on the [src.name].", \
+ usr.visible_message("[usr.name] knocks on the [src.name].",
+ "You knock on the [src.name].",
"You hear a knocking sound.")
return
@@ -207,6 +209,7 @@
take_damage(damage)
else
visible_message("\The [user] bonks \the [src] harmlessly.")
+ user.do_attack_animation(src)
return 1
/obj/structure/window/attackby(obj/item/W as obj, mob/user as mob)
@@ -262,13 +265,14 @@
else
visible_message("[user] dismantles \the [src].")
if(dir == SOUTHWEST)
- var/obj/item/stack/sheet/mats = new glasstype(loc)
+ var/obj/item/stack/material/mats = new glasstype(loc)
mats.amount = is_fulltile() ? 4 : 2
else
new glasstype(loc)
qdel(src)
else
if(W.damtype == BRUTE || W.damtype == BURN)
+ user.do_attack_animation(src)
hit(W.force)
if(health <= 7)
anchored = 0
@@ -398,7 +402,7 @@
desc = "It looks thin and flimsy. A few knocks with... anything, really should shatter it."
icon_state = "window"
basestate = "window"
- glasstype = /obj/item/stack/sheet/glass
+ glasstype = /obj/item/stack/material/glass
/obj/structure/window/phoronbasic
@@ -406,8 +410,8 @@
desc = "A phoron-glass alloy window. It looks insanely tough to break. It appears it's also insanely tough to burn through."
basestate = "phoronwindow"
icon_state = "phoronwindow"
- shardtype = /obj/item/weapon/shard/phoron
- glasstype = /obj/item/stack/sheet/glass/phoronglass
+ shardtype = /obj/item/weapon/material/shard/phoron
+ glasstype = /obj/item/stack/material/glass/phoronglass
maxhealth = 120
/obj/structure/window/phoronbasic/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
@@ -420,8 +424,8 @@
desc = "A phoron-glass alloy window, with rods supporting it. It looks hopelessly tough to break. It also looks completely fireproof, considering how basic phoron windows are insanely fireproof."
basestate = "phoronrwindow"
icon_state = "phoronrwindow"
- shardtype = /obj/item/weapon/shard/phoron
- glasstype = /obj/item/stack/sheet/glass/phoronrglass
+ shardtype = /obj/item/weapon/material/shard/phoron
+ glasstype = /obj/item/stack/material/glass/phoronrglass
reinf = 1
maxhealth = 160
@@ -435,7 +439,7 @@
basestate = "rwindow"
maxhealth = 40
reinf = 1
- glasstype = /obj/item/stack/sheet/glass/reinforced
+ glasstype = /obj/item/stack/material/glass/reinforced
/obj/structure/window/New(Loc, constructed=0)
..()
diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm
index 2b39256e5b..caf2c11fca 100644
--- a/code/game/supplyshuttle.dm
+++ b/code/game/supplyshuttle.dm
@@ -205,13 +205,13 @@ var/list/mechtoys = list(
continue
// Sell phoron
- if(istype(A, /obj/item/stack/sheet/mineral/phoron))
- var/obj/item/stack/sheet/mineral/phoron/P = A
+ if(istype(A, /obj/item/stack/material/phoron))
+ var/obj/item/stack/material/phoron/P = A
phoron_count += P.get_amount()
// Sell platinum
- if(istype(A, /obj/item/stack/sheet/mineral/platinum))
- var/obj/item/stack/sheet/mineral/platinum/P = A
+ if(istype(A, /obj/item/stack/material/platinum))
+ var/obj/item/stack/material/platinum/P = A
plat_count += P.get_amount()
qdel(MA)
@@ -235,7 +235,7 @@ var/list/mechtoys = list(
if(T.density) continue
var/contcount
for(var/atom/A in T.contents)
- if(A.simulated)
+ if(!A.simulated)
continue
contcount++
if(contcount)
diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm
index bb7d93fbf1..b34144fc39 100644
--- a/code/game/turfs/simulated/floor.dm
+++ b/code/game/turfs/simulated/floor.dm
@@ -84,12 +84,12 @@ var/list/wood_icons = list("wood","wood-broken")
if(2.0)
switch(pick(40;1,40;2,3))
if (1)
- if(prob(33)) new /obj/item/stack/sheet/metal(src)
+ if(prob(33)) new /obj/item/stack/material/steel(src)
src.ReplaceWithLattice()
if(2)
src.ChangeTurf(/turf/space)
if(3)
- if(prob(33)) new /obj/item/stack/sheet/metal(src)
+ if(prob(33)) new /obj/item/stack/material/steel(src)
if(prob(80))
src.break_tile_to_plating()
else
diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm
index 4d86d70877..e3037f94a9 100644
--- a/code/game/turfs/simulated/wall_attacks.dm
+++ b/code/game/turfs/simulated/wall_attacks.dm
@@ -28,6 +28,7 @@
/turf/simulated/wall/proc/success_smash(var/mob/user)
user << "You smash through the wall!"
+ user.do_attack_animation(src)
spawn(1)
dismantle_wall(1)
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 1012883781..9ab952de64 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -597,7 +597,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/thunderdome(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle/destroyer(M), slot_r_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/kitchenknife(M), slot_l_hand)
+ M.equip_to_slot_or_del(new /obj/item/weapon/material/knife(M), slot_l_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/grenade/smokebomb(M), slot_r_store)
@@ -620,10 +620,10 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/head/chefhat(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/rollingpin(M), slot_r_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/kitchenknife(M), slot_l_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/kitchenknife(M), slot_r_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/kitchenknife(M), slot_s_store)
+ M.equip_to_slot_or_del(new /obj/item/weapon/material/kitchen/rollingpin(M), slot_r_hand)
+ M.equip_to_slot_or_del(new /obj/item/weapon/material/knife(M), slot_l_hand)
+ M.equip_to_slot_or_del(new /obj/item/weapon/material/knife(M), slot_r_store)
+ M.equip_to_slot_or_del(new /obj/item/weapon/material/knife(M), slot_s_store)
if ("tournament janitor")
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/janitor(M), slot_w_uniform)
@@ -687,7 +687,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
W.registered_name = M.real_name
M.equip_to_slot_or_del(W, slot_wear_id)
- var/obj/item/weapon/twohanded/fireaxe/fire_axe = new(M)
+ var/obj/item/weapon/material/twohanded/fireaxe/fire_axe = new(M)
M.equip_to_slot_or_del(fire_axe, slot_r_hand)
if("masked killer")
@@ -699,10 +699,10 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/plain/monocle(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/apron(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/weapon/kitchenknife(M), slot_l_store)
+ M.equip_to_slot_or_del(new /obj/item/weapon/material/knife(M), slot_l_store)
M.equip_to_slot_or_del(new /obj/item/weapon/scalpel(M), slot_r_store)
- var/obj/item/weapon/twohanded/fireaxe/fire_axe = new(M)
+ var/obj/item/weapon/material/twohanded/fireaxe/fire_axe = new(M)
M.equip_to_slot_or_del(fire_axe, slot_r_hand)
for(var/obj/item/carried_item in M.contents)
diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm
index b63869bccb..a3c9f3560d 100644
--- a/code/modules/client/preferences_gear.dm
+++ b/code/modules/client/preferences_gear.dm
@@ -1035,7 +1035,7 @@ var/global/list/gear_datums = list()
/datum/gear/ashtray
display_name = "ashtray, plastic"
- path = /obj/item/ashtray/plastic
+ path = /obj/item/weapon/material/ashtray/plastic
sort_category = "misc"
cost = 1
diff --git a/code/modules/clothing/spacesuits/breaches.dm b/code/modules/clothing/spacesuits/breaches.dm
index 495f7b9f24..6789a50dfc 100644
--- a/code/modules/clothing/spacesuits/breaches.dm
+++ b/code/modules/clothing/spacesuits/breaches.dm
@@ -178,7 +178,7 @@ var/global/list/breach_burn_descriptors = list(
//Handles repairs (and also upgrades).
/obj/item/clothing/suit/space/attackby(obj/item/W as obj, mob/user as mob)
- if(istype(W,/obj/item/stack/sheet/mineral/plastic) || istype(W,/obj/item/stack/sheet/metal))
+ if(istype(W,/obj/item/stack/material/plastic) || istype(W,/obj/item/stack/material/steel))
if(istype(src.loc,/mob/living))
user << "\red How do you intend to patch a hardsuit while someone is wearing it?"
@@ -188,13 +188,13 @@ var/global/list/breach_burn_descriptors = list(
user << "There is no surface damage on \the [src] to repair."
return
- var/obj/item/stack/sheet/P = W
+ var/obj/item/stack/material/P = W
if(P.get_amount() < 3)
P.use(P.get_amount())
- repair_breaches(BURN, ( istype(P,/obj/item/stack/sheet/mineral/plastic) ? P.get_amount() : (P.get_amount()*2) ), user)
+ repair_breaches(BURN, ( istype(P,/obj/item/stack/material/plastic) ? P.get_amount() : (P.get_amount()*2) ), user)
else
P.use(3)
- repair_breaches(BURN, ( istype(P,/obj/item/stack/sheet/mineral/plastic) ? 3 : 5), user)
+ repair_breaches(BURN, ( istype(P,/obj/item/stack/material/plastic) ? 3 : 5), user)
return
else if(istype(W, /obj/item/weapon/weldingtool))
diff --git a/code/modules/clothing/spacesuits/rig/modules/combat.dm b/code/modules/clothing/spacesuits/rig/modules/combat.dm
index d40f74202e..b367a5369f 100644
--- a/code/modules/clothing/spacesuits/rig/modules/combat.dm
+++ b/code/modules/clothing/spacesuits/rig/modules/combat.dm
@@ -212,7 +212,7 @@
interface_name = "death blossom launcher"
interface_desc = "An integrated microfactory that produces poisoned throwing stars from thin air and electricity."
- var/fabrication_type = /obj/item/weapon/star/ninja
+ var/fabrication_type = /obj/item/weapon/material/star/ninja
var/fire_force = 30
var/fire_distance = 10
diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm
index 235ac1fd22..7cbd14cb21 100644
--- a/code/modules/clothing/spacesuits/rig/rig.dm
+++ b/code/modules/clothing/spacesuits/rig/rig.dm
@@ -707,7 +707,7 @@
take_hit((100/severity_class), "electrical pulse", 1)
/obj/item/weapon/rig/proc/shock(mob/user)
- if (electrocute_mob(user, cell, src))
+ if (electrocute_mob(user, cell, src)) //electrocute_mob() handles removing charge from the cell, no need to do that here.
spark_system.start()
if(user.stunned)
return 1
diff --git a/code/modules/clothing/spacesuits/rig/rig_attackby.dm b/code/modules/clothing/spacesuits/rig/rig_attackby.dm
index e7a59ea305..d9e75f9907 100644
--- a/code/modules/clothing/spacesuits/rig/rig_attackby.dm
+++ b/code/modules/clothing/spacesuits/rig/rig_attackby.dm
@@ -3,13 +3,11 @@
if(!istype(user,/mob/living)) return 0
if(electrified != 0)
- if(cell && cell.charge >= 100)
- cell.use(100)
- if(shock(user, 100))
+ if(shock(user)) //Handles removing charge from the cell, as well. No need to do that here.
return
// Pass repair items on to the chestpiece.
- if(chest && (istype(W,/obj/item/stack/sheet/mineral/plastic) || istype(W,/obj/item/stack/sheet/metal) || istype(W, /obj/item/weapon/weldingtool)))
+ if(chest && (istype(W,/obj/item/stack/material/plastic) || istype(W,/obj/item/stack/material/steel) || istype(W, /obj/item/weapon/weldingtool)))
return chest.attackby(W,user)
// Lock or unlock the access panel.
@@ -193,8 +191,6 @@
/obj/item/weapon/rig/attack_hand(var/mob/user)
if(electrified != 0)
- if(cell && cell.charge >= 100)
- cell.use(100)
- if(shock(user, 100))
+ if(shock(user)) //Handles removing charge from the cell, as well. No need to do that here.
return
..()
\ No newline at end of file
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index e0fa47f64f..e4188212c7 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -10,7 +10,7 @@
item_state = "apron"
blood_overlay_type = "armor"
body_parts_covered = 0
- allowed = list (/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/device/analyzer/plant_analyzer,/obj/item/seeds,/obj/item/weapon/reagent_containers/glass/fertilizer,/obj/item/weapon/minihoe)
+ allowed = list (/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/device/analyzer/plant_analyzer,/obj/item/seeds,/obj/item/weapon/reagent_containers/glass/fertilizer,/obj/item/weapon/material/minihoe)
sprite_sheets = list("Vox" = 'icons/mob/species/vox/suit.dmi')
//Captain
/obj/item/clothing/suit/captunic
@@ -51,14 +51,14 @@
//Chef
/obj/item/clothing/suit/chef
- name = "Chef's apron"
+ name = "chef's apron"
desc = "An apron used by a high class chef."
icon_state = "chef"
item_state = "chef"
gas_transfer_coefficient = 0.90
permeability_coefficient = 0.50
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
- allowed = list (/obj/item/weapon/kitchenknife,/obj/item/weapon/butch)
+ allowed = list (/obj/item/weapon/material/knife)
sprite_sheets = list("Vox" = 'icons/mob/species/vox/suit.dmi')
//Chef
diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm
index 7f13449d16..8ef17ca0b1 100644
--- a/code/modules/clothing/under/accessories/storage.dm
+++ b/code/modules/clothing/under/accessories/storage.dm
@@ -72,11 +72,11 @@
/obj/item/clothing/accessory/storage/knifeharness/New()
..()
hold.max_storage_space = 4
- hold.can_hold = list(/obj/item/weapon/hatchet/unathiknife,\
- /obj/item/weapon/kitchen/utensil/knife,\
- /obj/item/weapon/kitchen/utensil/pknife,\
- /obj/item/weapon/kitchenknife,\
- /obj/item/weapon/kitchenknife/ritual)
+ hold.can_hold = list(/obj/item/weapon/material/hatchet/unathiknife,\
+ /obj/item/weapon/material/kitchen/utensil/knife,\
+ /obj/item/weapon/material/kitchen/utensil/knife/plastic,\
+ /obj/item/weapon/material/knife,\
+ /obj/item/weapon/material/knife/ritual)
- new /obj/item/weapon/hatchet/unathiknife(hold)
- new /obj/item/weapon/hatchet/unathiknife(hold)
+ new /obj/item/weapon/material/hatchet/unathiknife(hold)
+ new /obj/item/weapon/material/hatchet/unathiknife(hold)
diff --git a/code/modules/examine/descriptions/stacks.dm b/code/modules/examine/descriptions/stacks.dm
index 431e5c37b9..fb2e8e277b 100644
--- a/code/modules/examine/descriptions/stacks.dm
+++ b/code/modules/examine/descriptions/stacks.dm
@@ -2,23 +2,23 @@
description_info = "Made from metal sheets. You can build a grille by using it in your hand. \
Clicking on a floor without any tiles will reinforce the floor. You can make reinforced glass by combining rods and normal glass sheets."
-/obj/item/stack/sheet/glass
+/obj/item/stack/material/glass
description_info = "Use in your hand to build a window. Can be upgraded to reinforced glass by adding metal rods, which are made from metal sheets."
-/obj/item/stack/sheet/glass/cyborg
+/obj/item/stack/material/cyborg/glass
description_info = "Use in your hand to build a window. Can be upgraded to reinforced glass by adding metal rods, which are made from metal sheets.
\
As a synthetic, you can acquire more sheets of glass by recharging."
-/obj/item/stack/sheet/glass/reinforced
+/obj/item/stack/material/glass/reinforced
description_info = "Use in your hand to build a window. Reinforced glass is much stronger against damage."
-/obj/item/stack/sheet/glass/reinforced/cyborg
+/obj/item/stack/material/cyborg/glass/reinforced
description_info = "Use in your hand to build a window. Reinforced glass is much stronger against damage.
\
As a synthetic, you can gain more reinforced glass by recharging."
-/obj/item/stack/sheet/metal/cyborg
+/obj/item/stack/material/cyborg/steel
description_info = "Use in your hand to bring up the recipe menu. If you have enough sheets, click on something on the list to build it.
\
You can replenish your supply of metal as a synthetic by recharging."
-/obj/item/stack/sheet
+/obj/item/stack/material
description_info = "Use in your hand to bring up the recipe menu. If you have enough sheets, click on something on the list to build it."
\ No newline at end of file
diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm
index 2f6dc0ad73..8b7678f19f 100644
--- a/code/modules/hydroponics/grown.dm
+++ b/code/modules/hydroponics/grown.dm
@@ -192,12 +192,12 @@
qdel(src)
return
else if(seed.chems)
- if(istype(W,/obj/item/weapon/hatchet) && !isnull(seed.chems["woodpulp"]))
+ if(istype(W,/obj/item/weapon/material/hatchet) && !isnull(seed.chems["woodpulp"]))
user.show_message("You make planks out of \the [src]!", 1)
for(var/i=0,i<2,i++)
- var/obj/item/stack/sheet/wood/NG = new (user.loc)
+ var/obj/item/stack/material/wood/NG = new (user.loc)
NG.color = seed.get_trait(TRAIT_PRODUCT_COLOUR)
- for (var/obj/item/stack/sheet/wood/G in user.loc)
+ for (var/obj/item/stack/material/wood/G in user.loc)
if(G==NG)
continue
if(G.amount>=G.max_amount)
diff --git a/code/modules/hydroponics/grown_inedible.dm b/code/modules/hydroponics/grown_inedible.dm
index 680a7a5ec8..01fd8764d8 100644
--- a/code/modules/hydroponics/grown_inedible.dm
+++ b/code/modules/hydroponics/grown_inedible.dm
@@ -45,7 +45,7 @@
/obj/item/weapon/corncob/attackby(obj/item/weapon/W as obj, mob/user as mob)
..()
- if(istype(W, /obj/item/weapon/circular_saw) || istype(W, /obj/item/weapon/hatchet) || istype(W, /obj/item/weapon/kitchen/utensil/knife) || istype(W, /obj/item/weapon/kitchenknife) || istype(W, /obj/item/weapon/kitchenknife/ritual))
+ if(istype(W, /obj/item/weapon/circular_saw) || istype(W, /obj/item/weapon/material/hatchet) || istype(W, /obj/item/weapon/material/kitchen/utensil/knife) || istype(W, /obj/item/weapon/material/knife) || istype(W, /obj/item/weapon/material/knife/ritual))
user << "You use [W] to fashion a pipe out of the corn cob!"
new /obj/item/clothing/mask/smokable/pipe/cobpipe (user.loc)
qdel(src)
diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm
index ea20f2c0e3..7726775a1d 100644
--- a/code/modules/hydroponics/trays/tray.dm
+++ b/code/modules/hydroponics/trays/tray.dm
@@ -475,7 +475,7 @@
else
user << "\The [src] already has seeds in it!"
- else if (istype(O, /obj/item/weapon/minihoe)) // The minihoe
+ else if (istype(O, /obj/item/weapon/material/minihoe)) // The minihoe
if(weedlevel > 0)
user.visible_message("[user] starts uprooting the weeds.", "You remove the weeds from the [src].")
diff --git a/code/modules/hydroponics/trays/tray_apiary.dm b/code/modules/hydroponics/trays/tray_apiary.dm
index 4ac67613a6..80280fecde 100644
--- a/code/modules/hydroponics/trays/tray_apiary.dm
+++ b/code/modules/hydroponics/trays/tray_apiary.dm
@@ -63,7 +63,7 @@
else
user << "\blue You insert [O] into [src]. Now it just needs some bees."
qdel(O)
- else if(istype(O, /obj/item/weapon/minihoe))
+ else if(istype(O, /obj/item/weapon/material/minihoe))
if(health > 0)
user << "\red You begin to dislodge the apiary from the tray, the bees don't like that."
angry_swarm(user)
diff --git a/code/modules/hydroponics/trays/tray_reagents.dm b/code/modules/hydroponics/trays/tray_reagents.dm
index 8dac48ca8a..7583deae41 100644
--- a/code/modules/hydroponics/trays/tray_reagents.dm
+++ b/code/modules/hydroponics/trays/tray_reagents.dm
@@ -48,7 +48,7 @@
toxicity = 8
pest_kill_str = 7
-/obj/item/weapon/minihoe // -- Numbers
+/obj/item/weapon/material/minihoe // -- Numbers
name = "mini hoe"
desc = "It's used for removing weeds or scratching your back."
icon = 'icons/obj/weapons.dmi'
diff --git a/code/modules/hydroponics/trays/tray_tools.dm b/code/modules/hydroponics/trays/tray_tools.dm
index 3548c390a1..1371aa943f 100644
--- a/code/modules/hydroponics/trays/tray_tools.dm
+++ b/code/modules/hydroponics/trays/tray_tools.dm
@@ -204,69 +204,3 @@
user << browse(dat,"window=plant_analyzer")
return
-
-/obj/item/weapon/minihoe // -- Numbers
- name = "mini hoe"
- desc = "It's used for removing weeds or scratching your back."
- icon = 'icons/obj/weapons.dmi'
- icon_state = "hoe"
- item_state = "hoe"
- flags = CONDUCT | NOBLUDGEON
- force = 5.0
- throwforce = 7.0
- w_class = 2.0
- matter = list(DEFAULT_WALL_MATERIAL = 50)
- attack_verb = list("slashed", "sliced", "cut", "clawed")
-
-//Hatchets and things to kill kudzu
-/obj/item/weapon/hatchet
- name = "hatchet"
- desc = "A very sharp axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood."
- icon = 'icons/obj/weapons.dmi'
- icon_state = "hatchet"
- flags = CONDUCT
- force = 12.0
- w_class = 2
- throwforce = 15.0
- throw_speed = 4
- throw_range = 4
- sharp = 1
- edge = 1
- matter = list(DEFAULT_WALL_MATERIAL = 15000)
- origin_tech = "materials=2;combat=1"
- attack_verb = list("chopped", "torn", "cut")
-
-/obj/item/weapon/hatchet/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
- playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
- return ..()
-
-//If it's a hatchet it goes here. I guess
-/obj/item/weapon/hatchet/unathiknife
- name = "duelling knife"
- desc = "A length of leather-bound wood studded with razor-sharp teeth. How crude."
- icon = 'icons/obj/weapons.dmi'
- icon_state = "unathiknife"
- attack_verb = list("ripped", "torn", "cut")
-
-/obj/item/weapon/hatchet/tacknife
- name = "tactical knife"
- desc = "You'd be killing loads of people if this was Medal of Valor: Heroes of Nyx."
- icon = 'icons/obj/weapons.dmi'
- icon_state = "tacknife"
- item_state = "knife"
- attack_verb = list("stabbed", "chopped", "cut")
-
-
-/obj/item/weapon/scythe
- icon_state = "scythe0"
- name = "scythe"
- desc = "A sharp and curved blade on a long fibremetal handle, this tool makes it easy to reap what you sow."
- force = 13.0
- throwforce = 5.0
- throw_speed = 1
- throw_range = 3
- w_class = 4.0
- flags = NOSHIELD
- slot_flags = SLOT_BACK
- origin_tech = "materials=2;combat=2"
- attack_verb = list("chopped", "sliced", "cut", "reaped")
diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm
index 354d674215..f9292dc1b1 100644
--- a/code/modules/library/lib_items.dm
+++ b/code/modules/library/lib_items.dm
@@ -226,7 +226,7 @@
return
scanner.computer.inventory.Add(src)
user << "[W]'s screen flashes: 'Book stored in buffer. Title added to general inventory.'"
- else if(istype(W, /obj/item/weapon/kitchenknife) || istype(W, /obj/item/weapon/wirecutters))
+ else if(istype(W, /obj/item/weapon/material/knife) || istype(W, /obj/item/weapon/wirecutters))
if(carved) return
user << "You begin to carve out [title]."
if(do_after(user, 30))
diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm
new file mode 100644
index 0000000000..dd325942a0
--- /dev/null
+++ b/code/modules/materials/material_recipes.dm
@@ -0,0 +1,127 @@
+/material/proc/get_recipes()
+ if(!recipes)
+ generate_recipes()
+ return recipes
+
+/material/proc/generate_recipes()
+ recipes = list()
+
+ // If is_brittle() returns true, these are only good for a single strike.
+ recipes += new/datum/stack_recipe("[display_name] baseball bat", /obj/item/weapon/material/twohanded/baseballbat, 10, time = 20, one_per_turf = 0, on_floor = 1, supplied_material = "[name]")
+ recipes += new/datum/stack_recipe("[display_name] ashtray", /obj/item/weapon/material/ashtray, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
+ recipes += new/datum/stack_recipe("[display_name] spoon", /obj/item/weapon/material/kitchen/utensil/spoon/plastic, 1, on_floor = 1, supplied_material = "[name]")
+
+ if(integrity>=100)
+ recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
+ recipes += new/datum/stack_recipe("[display_name] barricade", /obj/structure/barricade, 5, time = 50, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
+ recipes += new/datum/stack_recipe("[display_name] stool", /obj/item/weapon/stool, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
+ recipes += new/datum/stack_recipe("[display_name] chair", /obj/structure/bed/chair, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
+ recipes += new/datum/stack_recipe("[display_name] bed", /obj/structure/bed, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
+
+ if(hardness>50)
+ recipes += new/datum/stack_recipe("[display_name] fork", /obj/item/weapon/material/kitchen/utensil/fork/plastic, 1, on_floor = 1, supplied_material = "[name]")
+ recipes += new/datum/stack_recipe("[display_name] knife", /obj/item/weapon/material/kitchen/utensil/knife/plastic, 1, on_floor = 1, supplied_material = "[name]")
+ recipes += new/datum/stack_recipe("[display_name] blade", /obj/item/weapon/material/butterflyblade, 6, time = 20, one_per_turf = 0, on_floor = 1, supplied_material = "[name]")
+
+/material/steel/generate_recipes()
+ ..()
+ recipes += new/datum/stack_recipe_list("office chairs",list( \
+ new/datum/stack_recipe("dark office chair", /obj/structure/bed/chair/office/dark, 5, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("light office chair", /obj/structure/bed/chair/office/light, 5, one_per_turf = 1, on_floor = 1) \
+ ), 5)
+ recipes += new/datum/stack_recipe_list("comfy chairs", list( \
+ new/datum/stack_recipe("beige comfy chair", /obj/structure/bed/chair/comfy/beige, 2, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("black comfy chair", /obj/structure/bed/chair/comfy/black, 2, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("brown comfy chair", /obj/structure/bed/chair/comfy/brown, 2, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("lime comfy chair", /obj/structure/bed/chair/comfy/lime, 2, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("teal comfy chair", /obj/structure/bed/chair/comfy/teal, 2, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("red comfy chair", /obj/structure/bed/chair/comfy/red, 2, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("blue comfy chair", /obj/structure/bed/chair/comfy/blue, 2, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("purple comfy chair", /obj/structure/bed/chair/comfy/purp, 2, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("green comfy chair", /obj/structure/bed/chair/comfy/green, 2, one_per_turf = 1, on_floor = 1), \
+ ), 2)
+
+ recipes += new/datum/stack_recipe("table frame", /obj/structure/table, 1, time = 10, one_per_turf = 1, on_floor = 1)
+ recipes += new/datum/stack_recipe("rack", /obj/structure/table/rack, 1, time = 5, one_per_turf = 1, on_floor = 1)
+ recipes += new/datum/stack_recipe("closet", /obj/structure/closet, 2, time = 15, one_per_turf = 1, on_floor = 1)
+ recipes += new/datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 10, time = 15, one_per_turf = 1, on_floor = 1)
+ 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("floor tile", /obj/item/stack/tile/plasteel, 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("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), \
+ new/datum/stack_recipe("command airlock assembly", /obj/structure/door_assembly/door_assembly_com, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("security airlock assembly", /obj/structure/door_assembly/door_assembly_sec, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("engineering airlock assembly", /obj/structure/door_assembly/door_assembly_eng, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("mining airlock assembly", /obj/structure/door_assembly/door_assembly_min, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("atmospherics airlock assembly", /obj/structure/door_assembly/door_assembly_atmo, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("research airlock assembly", /obj/structure/door_assembly/door_assembly_research, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("medical airlock assembly", /obj/structure/door_assembly/door_assembly_med, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("maintenance airlock assembly", /obj/structure/door_assembly/door_assembly_mai, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("external airlock assembly", /obj/structure/door_assembly/door_assembly_ext, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("freezer airlock assembly", /obj/structure/door_assembly/door_assembly_fre, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("airtight hatch assembly", /obj/structure/door_assembly/door_assembly_hatch, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("maintenance hatch assembly", /obj/structure/door_assembly/door_assembly_mhatch, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ new/datum/stack_recipe("high security airlock assembly", /obj/structure/door_assembly/door_assembly_highsecurity, 4, time = 50, one_per_turf = 1, on_floor = 1), \
+ 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), \
+ ), 4)
+
+ 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/apc_frame, 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)
+
+/material/plasteel/generate_recipes()
+ ..()
+ recipes += new/datum/stack_recipe("AI core", /obj/structure/AIcore, 4, time = 50, one_per_turf = 1)
+ recipes += new/datum/stack_recipe("Metal crate", /obj/structure/closet/crate, 10, time = 50, one_per_turf = 1)
+ recipes += new/datum/stack_recipe("RUST fuel assembly port frame", /obj/item/frame/rust/assembly, 12, time = 50, one_per_turf = 1)
+ recipes += new/datum/stack_recipe("RUST fuel compressor frame", /obj/item/frame/rust, 12, 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)
+
+/material/sandstone/generate_recipes()
+ ..()
+ recipes += new/datum/stack_recipe("pile of dirt", /obj/machinery/portable_atmospherics/hydroponics/soil, 3, time = 10, one_per_turf = 1, on_floor = 1)
+
+/material/plastic/generate_recipes()
+ ..()
+ recipes += new/datum/stack_recipe("plastic crate", /obj/structure/closet/crate/plastic, 10, one_per_turf = 1, on_floor = 1)
+ recipes += new/datum/stack_recipe("plastic bag", /obj/item/weapon/storage/bag/plasticbag, 3, on_floor = 1)
+ recipes += new/datum/stack_recipe("blood pack", /obj/item/weapon/reagent_containers/blood/empty, 4, on_floor = 0)
+ recipes += new/datum/stack_recipe("reagent dispenser cartridge (large)", /obj/item/weapon/reagent_containers/chem_disp_cartridge, 5, on_floor=0) // 500u
+ recipes += new/datum/stack_recipe("reagent dispenser cartridge (med)", /obj/item/weapon/reagent_containers/chem_disp_cartridge/medium, 3, on_floor=0) // 250u
+ recipes += new/datum/stack_recipe("reagent dispenser cartridge (small)", /obj/item/weapon/reagent_containers/chem_disp_cartridge/small, 1, on_floor=0) // 100u
+
+/material/wood/generate_recipes()
+ ..()
+ recipes += new/datum/stack_recipe("wooden sandals", /obj/item/clothing/shoes/sandal, 1)
+ recipes += new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20)
+ recipes += new/datum/stack_recipe("wooden chair", /obj/structure/bed/chair/wood, 3, time = 10, one_per_turf = 1, on_floor = 1)
+ recipes += new/datum/stack_recipe("crossbow frame", /obj/item/weapon/crossbowframe, 5, time = 25, one_per_turf = 0, on_floor = 0)
+ recipes += new/datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1)
+
+/material/cardboard/generate_recipes()
+ ..()
+ recipes += new/datum/stack_recipe("box", /obj/item/weapon/storage/box)
+ recipes += new/datum/stack_recipe("donut box", /obj/item/weapon/storage/box/donut/empty)
+ recipes += new/datum/stack_recipe("egg box", /obj/item/weapon/storage/fancy/egg_box)
+ recipes += new/datum/stack_recipe("light tubes box", /obj/item/weapon/storage/box/lights/tubes)
+ recipes += new/datum/stack_recipe("light bulbs box", /obj/item/weapon/storage/box/lights/bulbs)
+ recipes += new/datum/stack_recipe("mouse traps box", /obj/item/weapon/storage/box/mousetraps)
+ recipes += new/datum/stack_recipe("cardborg suit", /obj/item/clothing/suit/cardborg, 3)
+ recipes += new/datum/stack_recipe("cardborg helmet", /obj/item/clothing/head/cardborg)
+ recipes += new/datum/stack_recipe("pizza box", /obj/item/pizzabox)
+ recipes += new/datum/stack_recipe_list("folders",list( \
+ new/datum/stack_recipe("blue folder", /obj/item/weapon/folder/blue), \
+ new/datum/stack_recipe("grey folder", /obj/item/weapon/folder), \
+ new/datum/stack_recipe("red folder", /obj/item/weapon/folder/red), \
+ new/datum/stack_recipe("white folder", /obj/item/weapon/folder/white), \
+ new/datum/stack_recipe("yellow folder", /obj/item/weapon/folder/yellow), \
+ ), 3)
\ No newline at end of file
diff --git a/code/modules/materials/material_sheets.dm b/code/modules/materials/material_sheets.dm
new file mode 100644
index 0000000000..2d53c6c29c
--- /dev/null
+++ b/code/modules/materials/material_sheets.dm
@@ -0,0 +1,151 @@
+// Stacked resources. They use a material datum for a lot of inherited values.
+/obj/item/stack/material
+ force = 5.0
+ throwforce = 5
+ w_class = 3.0
+ throw_speed = 3
+ throw_range = 3
+ var/default_type = DEFAULT_WALL_MATERIAL
+ var/material/material
+ var/perunit
+ var/apply_colour //temp pending icon rewrite
+
+/obj/item/stack/material/New()
+ ..()
+ pixel_x = rand(0,4)-4
+ pixel_y = rand(0,4)-4
+
+ if(!default_type)
+ default_type = DEFAULT_WALL_MATERIAL
+ material = get_material_by_name("[default_type]")
+ if(!material)
+ qdel(src)
+ return 0
+
+ // Update from material datum.
+ name = "[material.display_name] sheets"
+ desc = "A stack of sheets of [material.display_name]."
+ recipes = material.get_recipes()
+ stacktype = material.stack_type
+ origin_tech = material.stack_origin_tech
+ perunit = material.stack_per_sheet
+
+ if(apply_colour)
+ color = material.icon_colour
+
+ if(material.conductive)
+ flags |= CONDUCT
+
+ if(!islist(matter))
+ matter = list()
+ if(material.composite_material)
+ for(var/material_string in material.composite_material)
+ matter[material_string] = material.composite_material[material_string]
+ else
+ matter[material.name] = material.stack_per_sheet
+ return 1
+
+obj/item/stack/material/iron
+ name = "iron"
+ icon_state = "sheet-silver"
+ default_type = "iron"
+ apply_colour = 1
+
+/obj/item/stack/material/sandstone
+ name = "sandstone brick"
+ singular_name = "sandstone brick"
+ icon_state = "sheet-sandstone"
+ default_type = "sandstone"
+
+/obj/item/stack/material/diamond
+ name = "diamond"
+ icon_state = "sheet-diamond"
+ default_type = "diamond"
+
+/obj/item/stack/material/uranium
+ name = "uranium"
+ icon_state = "sheet-uranium"
+ default_type = "uranium"
+
+/obj/item/stack/material/phoron
+ name = "solid phoron"
+ icon_state = "sheet-phoron"
+ default_type = "phoron"
+
+/obj/item/stack/material/plastic
+ name = "Plastic"
+ icon_state = "sheet-plastic"
+ default_type = "plastic"
+
+/obj/item/stack/material/gold
+ name = "gold"
+ icon_state = "sheet-gold"
+ default_type = "gold"
+
+/obj/item/stack/material/silver
+ name = "silver"
+ icon_state = "sheet-silver"
+ default_type = "silver"
+
+//Valuable resource, cargo can sell it.
+/obj/item/stack/material/platinum
+ name = "platinum"
+ icon_state = "sheet-adamantine"
+ default_type = "platinum"
+
+//Extremely valuable to Research.
+/obj/item/stack/material/mhydrogen
+ name = "metallic hydrogen"
+ icon_state = "sheet-mythril"
+ default_type = "mhydrogen"
+
+//Fuel for MRSPACMAN generator.
+/obj/item/stack/material/tritium
+ name = "tritium"
+ icon_state = "sheet-silver"
+ default_type = "tritium"
+ apply_colour = 1
+
+/obj/item/stack/material/osmium
+ name = "osmium"
+ icon_state = "sheet-silver"
+ default_type = "osmium"
+ apply_colour = 1
+
+/obj/item/stack/material/steel
+ name = DEFAULT_WALL_MATERIAL
+ singular_name = "steel sheet"
+ icon_state = "sheet-metal"
+ default_type = DEFAULT_WALL_MATERIAL
+
+/obj/item/stack/material/plasteel
+ name = "plasteel"
+ singular_name = "plasteel sheet"
+ icon_state = "sheet-plasteel"
+ item_state = "sheet-metal"
+ default_type = "plasteel"
+
+/obj/item/stack/material/wood
+ name = "wooden plank"
+ singular_name = "wood plank"
+ icon_state = "sheet-wood"
+ default_type = "wood"
+
+/obj/item/stack/material/cloth
+ name = "cloth"
+ singular_name = "cloth roll"
+ icon_state = "sheet-cloth"
+ default_type = "cloth"
+
+/obj/item/stack/material/cardboard
+ name = "cardboard"
+ singular_name = "cardboard sheet"
+ icon_state = "sheet-card"
+ default_type = "cardboard"
+
+/obj/item/stack/material/leather
+ name = "leather"
+ desc = "The by-product of mob grinding."
+ singular_name = "leather piece"
+ icon_state = "sheet-leather"
+ default_type = "leather"
diff --git a/code/modules/materials/material_synth.dm b/code/modules/materials/material_synth.dm
new file mode 100644
index 0000000000..a0977e69c5
--- /dev/null
+++ b/code/modules/materials/material_synth.dm
@@ -0,0 +1,32 @@
+// These objects are used by cyborgs to get around a lot of the limitations on stacks
+// and the weird bugs that crop up when expecting borg module code to behave sanely.
+/obj/item/stack/material/cyborg
+ uses_charge = 1
+ charge_costs = list(1000)
+ gender = NEUTER
+ matter = null // Don't shove it in the autholathe.
+
+/obj/item/stack/material/cyborg/New()
+ if(..())
+ name = "[material.display_name] synthesiser"
+ desc = "A device that synthesises [material.display_name]."
+ matter = null
+
+/obj/item/stack/material/cyborg/plastic
+ default_type = "plastic"
+
+/obj/item/stack/material/cyborg/steel
+ default_type = "steel"
+
+/obj/item/stack/material/cyborg/plasteel
+ default_type = "plasteel"
+
+/obj/item/stack/material/cyborg/wood
+ default_type = "wood"
+
+/obj/item/stack/material/cyborg/glass
+ default_type = "glass"
+
+/obj/item/stack/material/cyborg/glass/reinforced
+ default_type = "reinforced glass"
+ charge_costs = list(500, 1000)
\ No newline at end of file
diff --git a/code/modules/materials/materials.dm b/code/modules/materials/materials.dm
index d2fa4bcab1..a3189d6e0f 100644
--- a/code/modules/materials/materials.dm
+++ b/code/modules/materials/materials.dm
@@ -1,5 +1,33 @@
+/*
+ MATERIAL DATUMS
+ This data is used by various parts of the game for basic physical properties and behaviors
+ of the metals/materials used for constructing many objects. Each var is commented and should be pretty
+ self-explanatory but the various object types may have their own documentation. ~Z
+
+ PATHS THAT USE DATUMS
+ /turf/simulated/wall
+ /obj/item/weapon/material
+ /obj/structure/barricade
+ /obj/item/stack/material
+ /obj/structure/table
+
+ VALID ICONS
+ WALLS
+ stone
+ metal
+ solid
+ cult
+ DOORS
+ stone
+ metal
+ resin
+ wood
+*/
+
+// Assoc list containing all material datums indexed by name.
var/list/name_to_material
+// Builds the datum list above.
/proc/populate_material_list(force_remake=0)
if(name_to_material && !force_remake) return // Already set up!
name_to_material = list()
@@ -10,42 +38,58 @@ var/list/name_to_material
name_to_material[lowertext(new_mineral.name)] = new_mineral
return 1
+// Safety proc to make sure the material list exists before trying to grab from it.
/proc/get_material_by_name(name)
if(!name_to_material)
populate_material_list()
-
return name_to_material[name]
-/*
- Valid sprite masks:
- stone
- metal
- solid
- cult
-*/
-
+// Material definition and procs follow.
/material
- var/name // Tag for use in overlay generation/list population .
- var/display_name
- var/flags = 0
- var/icon_base = "metal"
- var/icon_colour
- var/icon_reinf = "reinf_metal"
- var/stack_type
- var/cut_delay = 0
- var/radioactivity
- var/ignition_point
- var/melting_point = 1800 // K, walls will take damage if they're next to a fire hotter than this
- var/integrity = 150 // Damage before wall falls apart, essentially.
- var/hardness = 60 // Used to determine if a hulk can punch through this wall.
- var/rotting_touch_message = "crumbles under your touch"
- var/opacity = 1
- var/explosion_resistance = 5
- var/shard_type = SHARD_SHRAPNEL
- var/shard_icon
- var/shard_can_repair = 1
- var/tableslam_noise = 'sound/weapons/tablehit1.ogg'
+ var/name // Unique name for use in indexing the list.
+ var/display_name // Prettier name for display.
+ var/flags = 0 // Various status modifiers.
+ // Shards/tables/structures
+ var/shard_type = SHARD_SHRAPNEL // Path of debris object.
+ var/shard_icon // Related to above.
+ var/shard_can_repair = 1 // Can shards be turned into sheets with a welder?
+ var/list/recipes // Holder for all recipes usable with a sheet of this material.
+ var/destruction_desc = "breaks apart" // Fancy string for barricades/tables/objects exploding.
+
+ // Icons
+ var/icon_colour // Colour applied to products of this material.
+ var/icon_base = "metal" // Wall and table base icon tag. See header.
+ var/door_icon_base = "metal" // Door base icon tag. See header.
+ var/icon_reinf = "reinf_metal" // Overlay used
+ var/stack_origin_tech = "materials=1" // Research level for stacks.
+ var/stack_per_sheet = 2000 // perunit value for stacks.
+
+ // Attributes
+ var/cut_delay = 0 // Delay in ticks when cutting through this wall.
+ var/radioactivity // Radiation var. Used in wall and object processing to irradiate surroundings.
+ var/ignition_point // Point at which the material catches on fire.
+ var/melting_point = 1800 // K, walls will take damage if they're next to a fire hotter than this
+ var/integrity = 150 // General-use HP value for products.
+ var/opacity = 1 // Is the material transparent? 0.5< makes transparent walls/doors.
+ var/explosion_resistance = 5 // Only used by walls currently.
+ var/conductive = 1 // Objects with this var add CONDUCTS to flags on spawn.
+ var/list/composite_material // If set, object matter var will be a list containing these values.
+
+ // Damage values.
+ var/hardness = 60 // Prob of wall destruction by hulk, used for edge damage in weapons.
+ var/weight = 20 // Determines blunt damage/throwforce for weapons.
+
+ // Noise when someone is faceplanted onto a table made of this material.
+ var/tableslam_noise = 'sound/weapons/tablehit1.ogg'
+ // Noise made when a simple door made of this material opens or closes.
+ var/dooropen_noise = 'sound/effects/stonedoor_openclose.ogg'
+ // Path to resulting stacktype. Todo remove need for this.
+ var/stack_type = /obj/item/stack/material/steel
+ // Wallrot crumble message.
+ var/rotting_touch_message = "crumbles under your touch"
+
+// Make sure we have a display name and shard icon even if they aren't explicitly set.
/material/New()
..()
if(!display_name)
@@ -53,77 +97,126 @@ var/list/name_to_material
if(!shard_icon)
shard_icon = shard_type
+// Weapons handle applying a divisor for this value locally.
+/material/proc/get_blunt_damage()
+ return weight //todo
+
+// As above.
+/material/proc/get_edge_damage()
+ return hardness //todo
+
+// Snowflakey, only checked for alien doors at the moment.
+/material/proc/can_open_material_door(var/mob/living/user)
+ return 1
+
+// Currently used for weapons and objects made of uranium to irradiate things.
+/material/proc/products_need_process()
+ return (radioactivity>0) //todo
+
+// Used by walls when qdel()ing to avoid neighbor merging.
/material/placeholder
name = "placeholder"
+// Places a girder object when a wall is dismantled, also applies reinforced material.
/material/proc/place_dismantled_girder(var/turf/target, var/material/reinf_material)
var/obj/structure/girder/G = new(target)
if(reinf_material)
G.reinf_material = reinf_material
G.reinforce_girder()
+// General wall debris product placement.
+// Not particularly necessary aside from snowflakey cult girders.
/material/proc/place_dismantled_product(var/turf/target,var/is_devastated)
for(var/x=1;x<(is_devastated?2:3);x++)
place_sheet(target)
+// Debris product. Used ALL THE TIME.
/material/proc/place_sheet(var/turf/target)
if(stack_type)
return new stack_type(target)
+// As above.
/material/proc/place_shard(var/turf/target)
if(shard_type)
- return new /obj/item/weapon/shard(target, src)
+ return new /obj/item/weapon/material/shard(target, src.name)
+// Used by walls and weapons to determine if they break or not.
/material/proc/is_brittle()
return !!(flags & MATERIAL_BRITTLE)
+// Datum definitions follow.
/material/uranium
name = "uranium"
- stack_type = /obj/item/stack/sheet/mineral/uranium
+ stack_type = /obj/item/stack/material/uranium
radioactivity = 12
icon_base = "stone"
icon_reinf = "reinf_stone"
icon_colour = "#007A00"
+ weight = 22
+ stack_origin_tech = "materials=5"
+ door_icon_base = "stone"
/material/diamond
name = "diamond"
- stack_type = /obj/item/stack/sheet/mineral/diamond
+ stack_type = /obj/item/stack/material/diamond
flags = MATERIAL_UNMELTABLE
cut_delay = 60
icon_colour = "#00FFE1"
opacity = 0.4
shard_type = SHARD_SHARD
tableslam_noise = 'sound/effects/Glasshit.ogg'
+ hardness = 100
+ stack_origin_tech = "materials=6"
+ stack_per_sheet = 3750
/material/gold
name = "gold"
- stack_type = /obj/item/stack/sheet/mineral/gold
+ stack_type = /obj/item/stack/material/gold
icon_colour = "#EDD12F"
+ weight = 24
+ hardness = 40
+ stack_origin_tech = "materials=4"
/material/silver
name = "silver"
- stack_type = /obj/item/stack/sheet/mineral/silver
+ stack_type = /obj/item/stack/material/silver
icon_colour = "#D1E6E3"
+ weight = 22
+ hardness = 50
+ stack_origin_tech = "materials=3"
/material/phoron
name = "phoron"
- stack_type = /obj/item/stack/sheet/mineral/phoron
- ignition_point = 300
+ stack_type = /obj/item/stack/material/phoron
+ ignition_point = 100
icon_base = "stone"
icon_colour = "#FC2BC5"
shard_type = SHARD_SHARD
+ hardness = 30
+ stack_origin_tech = "phorontech=2;materials=2"
+ door_icon_base = "stone"
-/material/sandstone
+/material/stone
name = "sandstone"
- stack_type = /obj/item/stack/sheet/mineral/sandstone
+ stack_type = /obj/item/stack/material/sandstone
icon_base = "stone"
icon_reinf = "reinf_stone"
icon_colour = "#D9C179"
shard_type = SHARD_STONE_PIECE
+ weight = 22
+ hardness = 55
+ door_icon_base = "stone"
+
+/material/stone/marble
+ name = "marble"
+ icon_colour = "#AAAAAA"
+ weight = 26
+ hardness = 100
+ integrity = 201 //hack to stop kitchen benches being flippable, todo: refactor into weight system
/material/steel
name = DEFAULT_WALL_MATERIAL
- stack_type = /obj/item/stack/sheet/metal
+ stack_type = /obj/item/stack/material/steel
icon_base = "solid"
icon_reinf = "reinf_over"
icon_colour = "#666666"
@@ -136,74 +229,119 @@ var/list/name_to_material
/material/plasteel
name = "plasteel"
- stack_type = /obj/item/stack/sheet/plasteel
+ stack_type = /obj/item/stack/material/plasteel
integrity = 800
melting_point = 6000
icon_base = "solid"
icon_reinf = "reinf_over"
icon_colour = "#777777"
explosion_resistance = 25
+ hardness = 80
+ weight = 23
+ stack_origin_tech = "materials=2"
+ composite_material = list() //todo
/material/glass
name = "glass"
- stack_type = /obj/item/stack/sheet/glass
+ stack_type = /obj/item/stack/material/glass
flags = MATERIAL_BRITTLE
icon_colour = "#00E1FF"
opacity = 0.3
integrity = 100
shard_type = SHARD_SHARD
tableslam_noise = 'sound/effects/Glasshit.ogg'
+ hardness = 30
+ weight = 15
+ door_icon_base = "stone"
+ destruction_desc = "shatters"
/material/glass/phoron
name = "phoron glass"
- stack_type = /obj/item/stack/sheet/glass/phoronglass
+ stack_type = /obj/item/stack/material/glass/phoronglass
flags = MATERIAL_BRITTLE
ignition_point = 300
integrity = 200 // idk why but phoron windows are strong, so.
icon_colour = "#FC2BC5"
+ stack_origin_tech = "materials=3;phorontech=2"
+
+/material/glass/phoron/reinforced
+ name = "reinforced phoron glass"
+ stack_type = /obj/item/stack/material/glass/phoronrglass
+ stack_origin_tech = "materials=4;phorontech=2"
+ composite_material = list() //todo
+
+/material/glass/reinforced
+ name = "reinforced glass"
+ stack_type = /obj/item/stack/material/glass/reinforced
+ flags = MATERIAL_BRITTLE
+ icon_colour = "#00E1FF"
+ opacity = 0.3
+ integrity = 100
+ shard_type = SHARD_SHARD
+ tableslam_noise = 'sound/effects/Glasshit.ogg'
+ hardness = 40
+ weight = 30
+ stack_origin_tech = "materials=2"
+ composite_material = list() //todo
/material/plastic
name = "plastic"
- stack_type = /obj/item/stack/sheet/mineral/plastic
+ stack_type = /obj/item/stack/material/plastic
flags = MATERIAL_BRITTLE
icon_base = "solid"
icon_reinf = "reinf_over"
icon_colour = "#CCCCCC"
+ hardness = 10
+ weight = 12
+ stack_origin_tech = "materials=3"
/material/osmium
name = "osmium"
- stack_type = /obj/item/stack/sheet/mineral/osmium
+ stack_type = /obj/item/stack/material/osmium
icon_colour = "#9999FF"
+ stack_origin_tech = "materials=5"
/material/tritium
name = "tritium"
- stack_type = /obj/item/stack/sheet/mineral/tritium
+ stack_type = /obj/item/stack/material/tritium
icon_colour = "#777777"
+ stack_origin_tech = "materials=5"
/material/mhydrogen
name = "mhydrogen"
- stack_type = /obj/item/stack/sheet/mineral/mhydrogen
+ stack_type = /obj/item/stack/material/mhydrogen
icon_colour = "#E6C5DE"
+ stack_origin_tech = "materials=6;powerstorage=5;magnets=5"
/material/platinum
name = "platinum"
- stack_type = /obj/item/stack/sheet/mineral/platinum
+ stack_type = /obj/item/stack/material/platinum
icon_colour = "#9999FF"
+ weight = 27
+ stack_origin_tech = "materials=2"
/material/iron
name = "iron"
- stack_type = /obj/item/stack/sheet/mineral/iron
+ stack_type = /obj/item/stack/material/iron
icon_colour = "#5C5454"
+ weight = 22
+ stack_per_sheet = 3750
/material/wood
name = "wood"
- stack_type = /obj/item/stack/sheet/wood
+ stack_type = /obj/item/stack/material/wood
icon_colour = "#824B28"
integrity = 25
icon_base = "solid"
explosion_resistance = 2
shard_type = SHARD_SPLINTER
shard_can_repair = 0 // you can't weld splinters back into planks
+ hardness = 15
+ weight = 18
+ stack_origin_tech = "materials=1;biotech=1"
+ dooropen_noise = 'sound/effects/doorcreaky.ogg'
+ door_icon_base = "wood"
+ destruction_desc = "splinters"
/material/wood/holographic
name = "holographic wood"
@@ -211,6 +349,24 @@ var/list/name_to_material
stack_type = null
shard_type = SHARD_NONE
+/material/cardboard
+ name = "cardboard"
+ stack_type = /obj/item/stack/material/cardboard
+ flags = MATERIAL_BRITTLE
+ icon_base = "solid"
+ icon_reinf = "reinf_over"
+ icon_colour = "#AAAAAA"
+ hardness = 1
+ weight = 1
+ stack_origin_tech = "materials=1"
+ door_icon_base = "wood"
+ destruction_desc = "crumples"
+
+/material/cloth //todo
+ name = "cloth"
+ stack_origin_tech = "materials=2"
+ door_icon_base = "wood"
+
/material/cult
name = "cult"
display_name = "disturbing stone"
@@ -231,3 +387,25 @@ var/list/name_to_material
/material/cult/reinf/place_dismantled_product(var/turf/target)
new /obj/effect/decal/remains/human(target)
+
+/material/resin
+ name = "resin"
+ icon_colour = "#E85DD8"
+ dooropen_noise = 'sound/effects/attackblob.ogg'
+ door_icon_base = "resin"
+
+/material/resin/can_open_material_door(var/mob/living/user)
+ var/mob/living/carbon/M = user
+ if(istype(M) && locate(/obj/item/organ/xenos/hivenode) in M.internal_organs)
+ return 1
+ return 0
+
+/material/leather //todo
+ name = "leather"
+ icon_colour = "#5C4831"
+ stack_origin_tech = "materials=2"
+
+/material/carpet
+ name = "carpet"
+ display_name = "padding"
+ icon_colour = "#A83C1B"
\ No newline at end of file
diff --git a/code/modules/mining/abandonedcrates.dm b/code/modules/mining/abandonedcrates.dm
index 7376ed2851..1f8a75bf71 100644
--- a/code/modules/mining/abandonedcrates.dm
+++ b/code/modules/mining/abandonedcrates.dm
@@ -109,7 +109,7 @@
if(91)
new/obj/item/device/soulstone(src)
if(92)
- new/obj/item/weapon/katana(src)
+ new/obj/item/weapon/material/sword/katana(src)
if(93)
new/obj/item/weapon/dnainjector/xraymut(src) // Probably the least OP
if(94) // Why the hell not
diff --git a/code/modules/mining/alloys.dm b/code/modules/mining/alloys.dm
index 6495d706b4..9461c1e6b9 100644
--- a/code/modules/mining/alloys.dm
+++ b/code/modules/mining/alloys.dm
@@ -16,7 +16,7 @@
"hematite" = 2
)
product_mod = 0.3
- product = /obj/item/stack/sheet/plasteel
+ product = /obj/item/stack/material/plasteel
/datum/alloy/steel
metaltag = DEFAULT_WALL_MATERIAL
@@ -24,4 +24,4 @@
"coal" = 1,
"hematite" = 1
)
- product = /obj/item/stack/sheet/metal
\ No newline at end of file
+ product = /obj/item/stack/material/steel
\ No newline at end of file
diff --git a/code/modules/mining/machine_stacking.dm b/code/modules/mining/machine_stacking.dm
index e9f193cd73..6e548c6aa5 100644
--- a/code/modules/mining/machine_stacking.dm
+++ b/code/modules/mining/machine_stacking.dm
@@ -53,7 +53,7 @@
if(href_list["release_stack"])
if(machine.stack_storage[href_list["release_stack"]] > 0)
var/stacktype = machine.stack_paths[href_list["release_stack"]]
- var/obj/item/stack/sheet/S = new stacktype (get_turf(machine.output))
+ var/obj/item/stack/material/S = new stacktype (get_turf(machine.output))
S.amount = machine.stack_storage[href_list["release_stack"]]
machine.stack_storage[href_list["release_stack"]] = 0
@@ -81,18 +81,18 @@
/obj/machinery/mineral/stacking_machine/New()
..()
- for(var/stacktype in typesof(/obj/item/stack/sheet/mineral)-/obj/item/stack/sheet/mineral)
+ for(var/stacktype in typesof(/obj/item/stack/material)-/obj/item/stack/material)
var/obj/item/stack/S = new stacktype(src)
stack_storage[S.name] = 0
stack_paths[S.name] = stacktype
qdel(S)
stack_storage["glass"] = 0
- stack_paths["glass"] = /obj/item/stack/sheet/glass
+ stack_paths["glass"] = /obj/item/stack/material/glass
stack_storage[DEFAULT_WALL_MATERIAL] = 0
- stack_paths[DEFAULT_WALL_MATERIAL] = /obj/item/stack/sheet/metal
+ stack_paths[DEFAULT_WALL_MATERIAL] = /obj/item/stack/material/steel
stack_storage["plasteel"] = 0
- stack_paths["plasteel"] = /obj/item/stack/sheet/plasteel
+ stack_paths["plasteel"] = /obj/item/stack/material/plasteel
spawn( 5 )
for (var/dir in cardinal)
@@ -122,7 +122,7 @@
for(var/sheet in stack_storage)
if(stack_storage[sheet] >= stack_amt)
var/stacktype = stack_paths[sheet]
- var/obj/item/stack/sheet/S = new stacktype (get_turf(output))
+ var/obj/item/stack/material/S = new stacktype (get_turf(output))
S.amount = stack_amt
stack_storage[sheet] -= stack_amt
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index 80a19e7b96..0ca011ee63 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -346,25 +346,25 @@
R.amount = rand(1,5)
if(3)
- var/obj/item/stack/sheet/metal/R = new(src)
+ var/obj/item/stack/material/steel/R = new(src)
R.amount = rand(5,25)
if(4)
- var/obj/item/stack/sheet/plasteel/R = new(src)
+ var/obj/item/stack/material/plasteel/R = new(src)
R.amount = rand(5,25)
if(5)
var/quantity = rand(1,3)
for(var/i=0, i 100 && !is_dizzy)
+ spawn(0)
+ dizzy_process()
+
+
+/*
+dizzy process - wiggles the client's pixel offset over time
+spawned from make_dizzy(), will terminate automatically when dizziness gets <100
+note dizziness decrements automatically in the mob's Life() proc.
+*/
+/mob/proc/dizzy_process()
+ is_dizzy = 1
+ while(dizziness > 100)
+ if(client)
+ var/amplitude = dizziness*(sin(dizziness * 0.044 * world.time) + 1) / 70
+ client.pixel_x = amplitude * sin(0.008 * dizziness * world.time)
+ client.pixel_y = amplitude * cos(0.008 * dizziness * world.time)
+
+ sleep(1)
+ //endwhile - reset the pixel offsets to zero
+ is_dizzy = 0
+ if(client)
+ client.pixel_x = 0
+ client.pixel_y = 0
+
+// jitteriness - copy+paste of dizziness
+/mob/var/is_jittery = 0
+/mob/var/jitteriness = 0//Carbon
+/mob/proc/make_jittery(var/amount)
+ if(!istype(src, /mob/living/carbon/human)) // for the moment, only humans get dizzy
+ return
+
+ jitteriness = min(1000, jitteriness + amount) // store what will be new value
+ // clamped to max 1000
+ if(jitteriness > 100 && !is_jittery)
+ spawn(0)
+ jittery_process()
+
+
+// Typo from the oriignal coder here, below lies the jitteriness process. So make of his code what you will, the previous comment here was just a copypaste of the above.
+/mob/proc/jittery_process()
+ //var/old_x = pixel_x
+ //var/old_y = pixel_y
+ is_jittery = 1
+ while(jitteriness > 100)
+// var/amplitude = jitteriness*(sin(jitteriness * 0.044 * world.time) + 1) / 70
+// pixel_x = amplitude * sin(0.008 * jitteriness * world.time)
+// pixel_y = amplitude * cos(0.008 * jitteriness * world.time)
+
+ var/amplitude = min(4, jitteriness / 100)
+ pixel_x = old_x + rand(-amplitude, amplitude)
+ pixel_y = old_y + rand(-amplitude/3, amplitude/3)
+
+ sleep(1)
+ //endwhile - reset the pixel offsets to zero
+ is_jittery = 0
+ pixel_x = old_x
+ pixel_y = old_y
+
+
+//handles up-down floaty effect in space
+/mob/var/is_floating = 0
+/mob/var/floatiness = 0
+
+/mob/proc/make_floating(var/n)
+
+ floatiness = n
+
+ if(floatiness && !is_floating)
+ start_floating()
+ else if(!floatiness && is_floating)
+ stop_floating()
+
+/mob/proc/start_floating()
+
+ is_floating = 1
+
+ var/amplitude = 2 //maximum displacement from original position
+ var/period = 36 //time taken for the mob to go up >> down >> original position, in deciseconds. Should be multiple of 4
+
+ var/top = old_y + amplitude
+ var/bottom = old_y - amplitude
+ var/half_period = period / 2
+ var/quarter_period = period / 4
+
+ animate(src, pixel_y = top, time = quarter_period, easing = SINE_EASING | EASE_OUT, loop = -1) //up
+ animate(pixel_y = bottom, time = half_period, easing = SINE_EASING, loop = -1) //down
+ animate(pixel_y = old_y, time = quarter_period, easing = SINE_EASING | EASE_IN, loop = -1) //back
+
+/mob/proc/stop_floating()
+ animate(src, pixel_y = old_y, time = 5, easing = SINE_EASING | EASE_IN) //halt animation
+ //reset the pixel offsets to zero
+ is_floating = 0
+
+/atom/movable/proc/do_attack_animation(atom/A)
+
+ var/pixel_x_diff = 0
+ var/pixel_y_diff = 0
+ var/direction = get_dir(src, A)
+ switch(direction)
+ if(NORTH)
+ pixel_y_diff = 8
+ if(SOUTH)
+ pixel_y_diff = -8
+ if(EAST)
+ pixel_x_diff = 8
+ if(WEST)
+ pixel_x_diff = -8
+ if(NORTHEAST)
+ pixel_x_diff = 8
+ pixel_y_diff = 8
+ if(NORTHWEST)
+ pixel_x_diff = -8
+ pixel_y_diff = 8
+ if(SOUTHEAST)
+ pixel_x_diff = 8
+ pixel_y_diff = -8
+ if(SOUTHWEST)
+ pixel_x_diff = -8
+ pixel_y_diff = -8
+ animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff, time = 2)
+ animate(pixel_x = initial(pixel_x), pixel_y = initial(pixel_y), time = 2)
+
+/mob/do_attack_animation(atom/A)
+ ..()
+ is_floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure we restart the bouncing after the next movement.
+
+/mob/proc/spin(spintime, speed)
+ spawn()
+ var/D = dir
+ while(spintime >= speed)
+ sleep(speed)
+ switch(D)
+ if(NORTH)
+ D = EAST
+ if(SOUTH)
+ D = WEST
+ if(EAST)
+ D = SOUTH
+ if(WEST)
+ D = NORTH
+ set_dir(D)
+ spintime -= speed
+ return
diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm
index 55232be0f6..d835ea6446 100644
--- a/code/modules/mob/inventory.dm
+++ b/code/modules/mob/inventory.dm
@@ -218,7 +218,7 @@ var/list/slot_equipment_priority = list( \
drop_from_inventory(I)
return 1
-//Attemps to remove an object on a mob. Will not move it to another area or such, just removes from the mob.
+//Attemps to remove an object on a mob.
/mob/proc/remove_from_mob(var/obj/O)
src.u_equip(O)
if (src.client)
@@ -227,6 +227,7 @@ var/list/slot_equipment_priority = list( \
O.screen_loc = null
if(istype(O, /obj/item))
var/obj/item/I = O
+ I.loc = src.loc
I.dropped(src)
return 1
diff --git a/code/modules/mob/living/bot/farmbot.dm b/code/modules/mob/living/bot/farmbot.dm
index f1c84f3866..7900b38527 100644
--- a/code/modules/mob/living/bot/farmbot.dm
+++ b/code/modules/mob/living/bot/farmbot.dm
@@ -228,6 +228,7 @@
switch(action)
if("weed")
flick("farmbot_hoe", src)
+ do_attack_animation(A)
if(prob(50))
visible_message("[src] swings wildly at [A] with a minihoe, missing completely!")
return
@@ -241,7 +242,7 @@
visible_message("[src] blows apart!")
var/turf/Tsec = get_turf(src)
- new /obj/item/weapon/minihoe(Tsec)
+ new /obj/item/weapon/material/minihoe(Tsec)
new /obj/item/weapon/reagent_containers/glass/bucket(Tsec)
new /obj/item/device/assembly/prox_sensor(Tsec)
new /obj/item/device/analyzer/plant_analyzer(Tsec)
@@ -326,7 +327,7 @@
user.remove_from_mob(W)
qdel(W)
- else if((istype(W, /obj/item/weapon/minihoe)) && (build_step == 2))
+ else if((istype(W, /obj/item/weapon/material/minihoe)) && (build_step == 2))
build_step++
user << "You add a minihoe to [src]."
name = "farmbot assembly with bucket and minihoe"
diff --git a/code/modules/mob/living/bot/floorbot.dm b/code/modules/mob/living/bot/floorbot.dm
index 08c5ac1c4b..8d61d0bb03 100644
--- a/code/modules/mob/living/bot/floorbot.dm
+++ b/code/modules/mob/living/bot/floorbot.dm
@@ -154,7 +154,7 @@
target = T
break
if(maketiles && !target)
- for(var/obj/item/stack/sheet/metal/T in view(src))
+ for(var/obj/item/stack/material/steel/T in view(src))
if(T in ignorelist)
continue
target = T
@@ -249,8 +249,8 @@
target = null
repairing = 0
update_icons()
- else if(istype(A, /obj/item/stack/sheet/metal) && amount + 3 < maxAmount)
- var/obj/item/stack/sheet/metal/M = A
+ else if(istype(A, /obj/item/stack/material/steel) && amount + 3 < maxAmount)
+ var/obj/item/stack/material/steel/M = A
visible_message("[src] begins to make tiles.")
repairing = 1
update_icons()
diff --git a/code/modules/mob/living/bot/secbot.dm b/code/modules/mob/living/bot/secbot.dm
index eba380340f..848da5633a 100644
--- a/code/modules/mob/living/bot/secbot.dm
+++ b/code/modules/mob/living/bot/secbot.dm
@@ -264,6 +264,7 @@
if(!cuff)
C.stun_effect_act(0, 60, null)
playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1)
+ do_attack_animation(C)
is_attacking = 1
update_icons()
spawn(2)
@@ -283,6 +284,7 @@
var/mob/living/simple_animal/S = M
S.AdjustStunned(10)
S.adjustBruteLoss(15)
+ do_attack_animation(M)
playsound(loc, "swing_hit", 50, 1, -1)
is_attacking = 1
update_icons()
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 72bd64453d..f0af6e1464 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -132,7 +132,7 @@
/mob/living/carbon/proc/swap_hand()
var/obj/item/item_in_hand = src.get_active_hand()
if(item_in_hand) //this segment checks if the item in your hand is twohanded.
- if(istype(item_in_hand,/obj/item/weapon/twohanded))
+ if(istype(item_in_hand,/obj/item/weapon/material/twohanded))
if(item_in_hand:wielded == 1)
usr << "Your other hand is too busy holding the [item_in_hand.name]"
return
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 3eacc54926..b79f4b269d 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1026,7 +1026,7 @@
var/list/visible_implants = list()
for(var/obj/item/organ/external/organ in src.organs)
for(var/obj/item/weapon/O in organ.implants)
- if(!istype(O,/obj/item/weapon/implant) && (O.w_class > class) && !istype(O,/obj/item/weapon/shard/shrapnel))
+ if(!istype(O,/obj/item/weapon/implant) && (O.w_class > class) && !istype(O,/obj/item/weapon/material/shard/shrapnel))
visible_implants += O
return(visible_implants)
@@ -1061,30 +1061,28 @@
set src in view(1)
var/self = 0
- if(usr.stat == 1 || usr.restrained() || !isliving(usr)) return
+ if(usr.stat || usr.restrained() || !isliving(usr)) return
if(usr == src)
self = 1
if(!self)
- usr.visible_message("\blue [usr] kneels down, puts \his hand on [src]'s wrist and begins counting their pulse.",\
+ usr.visible_message("[usr] kneels down, puts \his hand on [src]'s wrist and begins counting their pulse.",\
"You begin counting [src]'s pulse")
else
- usr.visible_message("\blue [usr] begins counting their pulse.",\
+ usr.visible_message("[usr] begins counting their pulse.",\
"You begin counting your pulse.")
if(src.pulse)
- usr << "\blue [self ? "You have a" : "[src] has a"] pulse! Counting..."
+ usr << "[self ? "You have a" : "[src] has a"] pulse! Counting..."
else
- usr << "\red [src] has no pulse!" //it is REALLY UNLIKELY that a dead person would check his own pulse
+ usr << "[src] has no pulse!" //it is REALLY UNLIKELY that a dead person would check his own pulse
return
- usr << "Don't move until counting is finished."
- var/time = world.time
- sleep(60)
- if(usr.l_move_time >= time) //checks if our mob has moved during the sleep()
- usr << "You moved while counting. Try again."
+ usr << "You must [self ? "" : "both"] stand until counting is finished."
+ if(do_mob(usr, src, 60))
+ usr << "[self ? "Your" : "[src]'s"] pulse is [src.get_pulse(GETPULSE_HAND)]."
else
- usr << "\blue [self ? "Your" : "[src]'s"] pulse is [src.get_pulse(GETPULSE_HAND)]."
+ usr << "You failed to check the pulse. Try again."
/mob/living/carbon/human/proc/set_species(var/new_species, var/default_colour)
diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index 0deb593c84..6c995d75e0 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand.dm
@@ -15,10 +15,11 @@
if(istype(H))
if((H != src) && check_shields(0, H.name))
visible_message("\red [H] attempted to touch [src]!")
+ H.do_attack_animation(src)
return 0
if(istype(H.gloves, /obj/item/clothing/gloves/boxing/hologlove))
-
+ H.do_attack_animation(src)
var/damage = rand(0, 9)
if(!damage)
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
@@ -95,6 +96,7 @@
G.synch()
LAssailant = M
+ H.do_attack_animation(src)
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
visible_message("[M] has grabbed [src] passively!")
return 1
@@ -186,6 +188,7 @@
if(!attack)
return 0
+ H.do_attack_animation(src)
if(!attack_message)
attack.show_attack(H, src, hit_zone, rand_damage)
else
@@ -220,6 +223,7 @@
src.attack_log += text("\[[time_stamp()]\] Has been disarmed by [M.name] ([M.ckey])")
msg_admin_attack("[key_name(M)] disarmed [src.name] ([src.ckey])")
+ M.do_attack_animation(src)
if(w_uniform)
w_uniform.add_fingerprint(M)
@@ -278,6 +282,7 @@
user.attack_log += text("\[[time_stamp()]\] attacked [src.name] ([src.ckey])")
src.attack_log += text("\[[time_stamp()]\] was attacked by [user.name] ([user.ckey])")
src.visible_message("[user] has [attack_message] [src]!")
+ user.do_attack_animation(src)
var/dam_zone = pick("head", "chest", "l_arm", "r_arm", "l_leg", "r_leg", "groin")
var/obj/item/organ/external/affecting = get_organ(ran_zone(dam_zone))
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index f409bee147..994cab11f6 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -43,7 +43,7 @@ emp_act
if(P.can_embed())
var/armor = getarmor_organ(organ, "bullet")
if(prob(20 + max(P.damage - armor, -10)))
- var/obj/item/weapon/shard/shrapnel/SP = new()
+ var/obj/item/weapon/material/shard/shrapnel/SP = new()
SP.name = (P.name != "shrapnel")? "[P.name] shrapnel" : "shrapnel"
SP.desc = "[SP.desc] It looks like it was fired from [P.shot_from]."
SP.loc = organ
diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm
index 0357d4ee09..27a8f93753 100644
--- a/code/modules/mob/living/carbon/human/human_powers.dm
+++ b/code/modules/mob/living/carbon/human/human_powers.dm
@@ -253,6 +253,6 @@
visible_message("\The [src] quivers slightly, then splits apart with a wet slithering noise.")
- del(src)
+ qdel(src)
diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm
index bdc505fe34..68e106ee1d 100644
--- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm
+++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_facehugger.dm
@@ -54,8 +54,10 @@ var/const/MAX_ACTIVE_TIME = 400
user << "\red \b It looks like the proboscis has been removed."
return
-/obj/item/clothing/mask/facehugger/attackby()
- Die()
+/obj/item/clothing/mask/facehugger/attackby(obj/item/I, mob/user)
+ if(I.force)
+ user.do_attack_animation(src)
+ Die()
return
/obj/item/clothing/mask/facehugger/bullet_act()
@@ -63,7 +65,7 @@ var/const/MAX_ACTIVE_TIME = 400
return
/obj/item/clothing/mask/facehugger/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
- if(exposed_temperature > 300)
+ if(exposed_temperature > T0C+80)
Die()
return
diff --git a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm
index bee6928a23..a11bccf163 100644
--- a/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm
+++ b/code/modules/mob/living/carbon/human/species/xenomorphs/alien_powers.dm
@@ -210,7 +210,7 @@
visible_message("[src] vomits up a thick purple substance and begins to shape it!", "You shape a [choice].")
switch(choice)
if("resin door")
- new /obj/structure/mineral_door/resin(loc)
+ new /obj/structure/simple_door/resin(loc)
if("resin wall")
new /obj/effect/alien/resin/wall(loc)
if("resin membrane")
diff --git a/code/modules/mob/living/carbon/resist.dm b/code/modules/mob/living/carbon/resist.dm
index 7a4c184ca7..9a511504f3 100644
--- a/code/modules/mob/living/carbon/resist.dm
+++ b/code/modules/mob/living/carbon/resist.dm
@@ -118,7 +118,7 @@
say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
- del(handcuffed)
+ qdel(handcuffed)
handcuffed = null
if(buckled && buckled.buckle_require_restraints)
buckled.unbuckle_mob()
@@ -139,7 +139,7 @@
say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
- del(legcuffed)
+ qdel(legcuffed)
legcuffed = null
update_inv_legcuffed()
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index c37dce2824..80902ddaa9 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -777,20 +777,3 @@ default behaviour is:
return
..()
-/mob/living/carbon/proc/spin(spintime, speed)
- spawn()
- var/D = dir
- while(spintime >= speed)
- sleep(speed)
- switch(D)
- if(NORTH)
- D = EAST
- if(SOUTH)
- D = WEST
- if(EAST)
- D = SOUTH
- if(WEST)
- D = NORTH
- set_dir(D)
- spintime -= speed
- return
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 4a41479e34..9dd399a804 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -194,6 +194,7 @@
user.attack_log += text("\[[time_stamp()]\] attacked [src.name] ([src.ckey])")
src.attack_log += text("\[[time_stamp()]\] was attacked by [user.name] ([user.ckey])")
src.visible_message("[user] has [attack_message] [src]!")
+ user.do_attack_animation(src)
spawn(1) updatehealth()
return 1
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm
index 7452514f17..d859810ea1 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm
@@ -92,7 +92,7 @@
icon_state = "gripper-sheet"
can_hold = list(
- /obj/item/stack/sheet
+ /obj/item/stack/material
)
/obj/item/weapon/gripper/attack_self(mob/user as mob)
@@ -328,10 +328,10 @@
else if(istype(W,/obj/item/ammo_casing))
if(metal)
metal.add_charge(1000)
- else if(istype(W,/obj/item/weapon/shard/shrapnel))
+ else if(istype(W,/obj/item/weapon/material/shard/shrapnel))
if(metal)
metal.add_charge(1000)
- else if(istype(W,/obj/item/weapon/shard))
+ else if(istype(W,/obj/item/weapon/material/shard))
if(glass)
glass.add_charge(1000)
else if(istype(W,/obj/item/weapon/reagent_containers/food/snacks/grown))
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 589af5a168..5d192a50cd 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -1081,8 +1081,9 @@
if(cell.charge == 0)
return 0
- if(cell.use(amount * CELLRATE * CYBORG_POWER_USAGE_MULTIPLIER))
- used_power_this_tick += amount * CYBORG_POWER_USAGE_MULTIPLIER
+ var/power_use = amount * CYBORG_POWER_USAGE_MULTIPLIER
+ if(cell.checked_use(CELLRATE * power_use))
+ used_power_this_tick += power_use
return 1
return 0
diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm
index 768e42370f..59e251e01b 100644
--- a/code/modules/mob/living/silicon/robot/robot_items.dm
+++ b/code/modules/mob/living/silicon/robot/robot_items.dm
@@ -37,8 +37,8 @@
for(var/obj/I in contents)
for(var/mob/M in I.contents)
M.death()
- if(istype(I,/obj/item/stack/sheet))//Only deconsturcts one sheet at a time instead of the entire stack
- var/obj/item/stack/sheet/S = I
+ if(istype(I,/obj/item/stack/material))//Only deconsturcts one sheet at a time instead of the entire stack
+ var/obj/item/stack/material/S = I
if(S.get_amount() > 1)
S.use(1)
loaded_item = S
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 1b15a3681f..359562063d 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -310,7 +310,7 @@ var/global/list/robot_modules = list(
synths += plasteel
synths += glass
- var/obj/item/stack/sheet/metal/cyborg/M = new /obj/item/stack/sheet/metal/cyborg(src)
+ var/obj/item/stack/material/cyborg/steel/M = new (src)
M.synths = list(metal)
src.modules += M
@@ -318,11 +318,11 @@ var/global/list/robot_modules = list(
R.synths = list(metal)
src.modules += R
- var/obj/item/stack/sheet/plasteel/cyborg/S = new /obj/item/stack/sheet/plasteel/cyborg(src)
+ var/obj/item/stack/material/cyborg/plasteel/S = new (src)
S.synths = list(plasteel)
src.modules += S
- var/obj/item/stack/sheet/glass/reinforced/cyborg/RG = new /obj/item/stack/sheet/glass/reinforced/cyborg(src)
+ var/obj/item/stack/material/cyborg/glass/reinforced/RG = new (src)
RG.synths = list(metal, glass)
src.modules += RG
@@ -356,11 +356,11 @@ var/global/list/robot_modules = list(
MD.glass = glass
src.modules += MD
- var/obj/item/stack/sheet/metal/cyborg/M = new /obj/item/stack/sheet/metal/cyborg(src)
+ var/obj/item/stack/material/cyborg/steel/M = new (src)
M.synths = list(metal)
src.modules += M
- var/obj/item/stack/sheet/glass/cyborg/G = new /obj/item/stack/sheet/glass/cyborg(src)
+ var/obj/item/stack/material/cyborg/glass/G = new (src)
G.synths = list(glass)
src.modules += G
@@ -376,7 +376,7 @@ var/global/list/robot_modules = list(
S.synths = list(metal)
src.modules += S
- var/obj/item/stack/sheet/glass/reinforced/cyborg/RG = new /obj/item/stack/sheet/glass/reinforced/cyborg(src)
+ var/obj/item/stack/material/cyborg/glass/reinforced/RG = new (src)
RG.synths = list(metal, glass)
src.modules += RG
@@ -484,8 +484,8 @@ var/global/list/robot_modules = list(
src.modules += new /obj/item/device/flash(src)
src.modules += new /obj/item/weapon/gripper/service(src)
src.modules += new /obj/item/weapon/reagent_containers/glass/bucket(src)
- src.modules += new /obj/item/weapon/minihoe(src)
- src.modules += new /obj/item/weapon/hatchet(src)
+ src.modules += new /obj/item/weapon/material/minihoe(src)
+ src.modules += new /obj/item/weapon/material/hatchet(src)
src.modules += new /obj/item/device/analyzer/plant_analyzer(src)
src.modules += new /obj/item/weapon/storage/bag/plants(src)
src.modules += new /obj/item/weapon/robot_harvester(src)
@@ -676,11 +676,11 @@ var/global/list/robot_modules = list(
MD.plastic = plastic
src.modules += MD
- var/obj/item/stack/sheet/metal/cyborg/M = new /obj/item/stack/sheet/metal/cyborg(src)
+ var/obj/item/stack/material/cyborg/steel/M = new (src)
M.synths = list(metal)
src.modules += M
- var/obj/item/stack/sheet/glass/cyborg/G = new /obj/item/stack/sheet/glass/cyborg(src)
+ var/obj/item/stack/material/cyborg/glass/G = new (src)
G.synths = list(glass)
src.modules += G
@@ -696,7 +696,7 @@ var/global/list/robot_modules = list(
S.synths = list(metal)
src.modules += S
- var/obj/item/stack/sheet/glass/reinforced/cyborg/RG = new /obj/item/stack/sheet/glass/reinforced/cyborg(src)
+ var/obj/item/stack/material/cyborg/glass/reinforced/RG = new (src)
RG.synths = list(metal, glass)
src.modules += RG
@@ -704,11 +704,11 @@ var/global/list/robot_modules = list(
WT.synths = list(wood)
src.modules += WT
- var/obj/item/stack/sheet/wood/cyborg/W = new /obj/item/stack/sheet/wood/cyborg(src)
+ var/obj/item/stack/material/cyborg/wood/W = new (src)
W.synths = list(wood)
src.modules += W
- var/obj/item/stack/sheet/mineral/plastic/cyborg/P = new /obj/item/stack/sheet/mineral/plastic/cyborg(src)
+ var/obj/item/stack/material/cyborg/plastic/P = new (src)
P.synths = list(plastic)
src.modules += P
diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
index 1dcd98ffdc..217b1f0914 100644
--- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
@@ -51,7 +51,7 @@
if(locate(/obj/machinery/portable_atmospherics/hydroponics/soil/invisible) in loc)
var/obj/machinery/portable_atmospherics/hydroponics/soil/invisible/SP = locate() in loc
- del(SP)
+ qdel(SP)
if(!pulledby)
var/obj/effect/plant/food
diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
index af59941b1f..0631273769 100644
--- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
+++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
@@ -135,19 +135,7 @@
spawn(300) src.explode()
else
- if(O.force)
- var/damage = O.force
- if (O.damtype == HALLOSS)
- damage = 0
- adjustBruteLoss(damage)
- for(var/mob/M in viewers(src, null))
- if ((M.client && !( M.blinded )))
- M.show_message("\red \b [src] has been attacked with the [O] by [user]. ")
- else
- usr << "\red This weapon is ineffective, it does no damage."
- for(var/mob/M in viewers(src, null))
- if ((M.client && !( M.blinded )))
- M.show_message("\red [user] gently taps [src] with the [O]. ")
+ attacked_with_item(O, user)
/mob/living/simple_animal/spiderbot/proc/transfer_personality(var/obj/item/device/mmi/M as obj)
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index d4be3a638a..a92819606c 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -232,8 +232,8 @@
if(istype(A,/obj/machinery/door/airlock))
var/obj/machinery/door/airlock/D = A
D.open(1)
- else if(istype(A,/obj/structure/mineral_door))
- var/obj/structure/mineral_door/D = A
+ else if(istype(A,/obj/structure/simple_door))
+ var/obj/structure/simple_door/D = A
if(D.density)
D.Open()
else if(istype(A,/obj/structure/cult/pylon))
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm
index a2e9e21f75..869bf93b8e 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm
@@ -170,16 +170,16 @@
var/obj/O
//shards
- O = new /obj/item/weapon/shard(src.loc)
+ O = new /obj/item/weapon/material/shard(src.loc)
step_to(O, get_turf(pick(view(7, src))))
if(prob(75))
- O = new /obj/item/weapon/shard(src.loc)
+ O = new /obj/item/weapon/material/shard(src.loc)
step_to(O, get_turf(pick(view(7, src))))
if(prob(50))
- O = new /obj/item/weapon/shard(src.loc)
+ O = new /obj/item/weapon/material/shard(src.loc)
step_to(O, get_turf(pick(view(7, src))))
if(prob(25))
- O = new /obj/item/weapon/shard(src.loc)
+ O = new /obj/item/weapon/material/shard(src.loc)
step_to(O, get_turf(pick(view(7, src))))
//rods
@@ -196,16 +196,16 @@
step_to(O, get_turf(pick(view(7, src))))
//plasteel
- O = new /obj/item/stack/sheet/plasteel(src.loc)
+ O = new /obj/item/stack/material/plasteel(src.loc)
step_to(O, get_turf(pick(view(7, src))))
if(prob(75))
- O = new /obj/item/stack/sheet/plasteel(src.loc)
+ O = new /obj/item/stack/material/plasteel(src.loc)
step_to(O, get_turf(pick(view(7, src))))
if(prob(50))
- O = new /obj/item/stack/sheet/plasteel(src.loc)
+ O = new /obj/item/stack/material/plasteel(src.loc)
step_to(O, get_turf(pick(view(7, src))))
if(prob(25))
- O = new /obj/item/stack/sheet/plasteel(src.loc)
+ O = new /obj/item/stack/material/plasteel(src.loc)
step_to(O, get_turf(pick(view(7, src))))
//also drop dummy circuit boards deconstructable for research (loot)
diff --git a/code/modules/mob/living/simple_animal/hostile/russian.dm b/code/modules/mob/living/simple_animal/hostile/russian.dm
index ab044a02f0..da2599aeb7 100644
--- a/code/modules/mob/living/simple_animal/hostile/russian.dm
+++ b/code/modules/mob/living/simple_animal/hostile/russian.dm
@@ -20,7 +20,7 @@
attacktext = "punched"
a_intent = I_HURT
var/corpse = /obj/effect/landmark/mobcorpse/russian
- var/weapon1 = /obj/item/weapon/kitchenknife
+ var/weapon1 = /obj/item/weapon/material/knife
min_oxy = 5
max_oxy = 0
min_tox = 0
diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
index e0845a399d..870ad82c8e 100644
--- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
@@ -68,6 +68,7 @@
visible_message("\red \b [src] has been attacked with the [O] by [user]. ")
else
visible_message("\red \b [src] blocks the [O] with its shield! ")
+ //user.do_attack_animation(src)
else
usr << "\red This weapon is ineffective, it does no damage."
visible_message("\red [user] gently taps [src] with the [O]. ")
diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm
index 56bcafd6f5..1c438d2bc8 100644
--- a/code/modules/mob/living/simple_animal/hostile/tree.dm
+++ b/code/modules/mob/living/simple_animal/hostile/tree.dm
@@ -52,5 +52,5 @@
/mob/living/simple_animal/hostile/tree/death()
..(null,"is hacked into pieces!")
- new /obj/item/stack/sheet/wood(loc)
+ new /obj/item/stack/material/wood(loc)
qdel(src)
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index aec9fd1894..e2ec5059a2 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -240,6 +240,7 @@
if(I_DISARM)
M.visible_message("\blue [M] [response_disarm] \the [src]")
+ M.do_attack_animation(src)
//TODO: Push the mob away or something
if(I_GRAB)
@@ -257,10 +258,12 @@
LAssailant = M
M.visible_message("\red [M] has grabbed [src] passively!")
+ M.do_attack_animation(src)
if(I_HURT)
adjustBruteLoss(harm_intent_damage)
M.visible_message("\red [M] [response_harm] \the [src]")
+ M.do_attack_animation(src)
return
@@ -279,28 +282,33 @@
if ((M.client && !( M.blinded )))
M.show_message("[user] applies the [MED] on [src].")
else
- user << "\The [src] is dead, medical items won't bring it back to life."
+ user << "\The [src] is dead, medical items won't bring \him back to life."
if(meat_type && (stat == DEAD)) //if the animal has a meat, and if it is dead.
- if(istype(O, /obj/item/weapon/kitchenknife) || istype(O, /obj/item/weapon/butch))
+ if(istype(O, /obj/item/weapon/material/knife) || istype(O, /obj/item/weapon/material/knife/butch))
harvest(user)
else
- user.changeNext_move(8)
- if(O.force > resistance)
- var/damage = O.force
- if (O.damtype == HALLOSS)
- damage = 0
- if(supernatural && istype(O,/obj/item/weapon/nullrod))
- damage *= 2
- purge = 3
- adjustBruteLoss(damage)
- for(var/mob/M in viewers(src, null))
- if ((M.client && !( M.blinded )))
- M.show_message("This weapon is ineffective, it does no damage."
- for(var/mob/M in viewers(src, null))
- if ((M.client && !( M.blinded )))
- M.show_message("[user] gently taps [src] with \the [O].")
+ attacked_with_item(O, user)
+
+//TODO: refactor mob attackby(), attacked_by(), and friends.
+/mob/living/simple_animal/proc/attacked_with_item(var/obj/item/O, var/mob/user)
+ user.changeNext_move(8)
+ if(!O.force)
+ visible_message("[user] gently taps [src] with \the [O].")
+ return
+
+ if(O.force > resistance)
+ var/damage = O.force
+ if (O.damtype == HALLOSS)
+ damage = 0
+ if(supernatural && istype(O,/obj/item/weapon/nullrod))
+ damage *= 2
+ purge = 3
+ adjustBruteLoss(damage)
+ else
+ usr << "[src] has been attacked with the [O] by [user].")
+ user.do_attack_animation(src)
/mob/living/simple_animal/movement_delay()
var/tally = 0 //Incase I need to add stuff other than "speed" later
diff --git a/code/modules/mob/living/simple_animal/worm.dm b/code/modules/mob/living/simple_animal/worm.dm
index 20a8ee499c..9775a68c9c 100644
--- a/code/modules/mob/living/simple_animal/worm.dm
+++ b/code/modules/mob/living/simple_animal/worm.dm
@@ -175,18 +175,18 @@
for(var/atom/movable/stomachContent in contents)
if(prob(digestionProbability))
if(istype(stomachContent,/obj/item/stack)) //converts to plasma, keeping the stack value
- if(!istype(stomachContent,/obj/item/stack/sheet/mineral/phoron))
+ if(!istype(stomachContent,/obj/item/stack/material/phoron))
var/obj/item/stack/oldStack = stomachContent
- new /obj/item/stack/sheet/mineral/phoron(src, oldStack.get_amount())
+ new /obj/item/stack/material/phoron(src, oldStack.get_amount())
qdel(oldStack)
continue
else if(istype(stomachContent,/obj/item)) //converts to plasma, keeping the w_class
var/obj/item/oldItem = stomachContent
- new /obj/item/stack/sheet/mineral/phoron(src, oldItem.w_class)
+ new /obj/item/stack/material/phoron(src, oldItem.w_class)
qdel(oldItem)
continue
else
- new /obj/item/stack/sheet/mineral/phoron(src, flatPlasmaValue) //just flat amount
+ new /obj/item/stack/material/phoron(src, flatPlasmaValue) //just flat amount
qdel(stomachContent)
continue
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 0d0bc2a226..0ff35abdca 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -601,111 +601,6 @@
for(var/mob/M in viewers())
M.see(message)
-/*
-adds a dizziness amount to a mob
-use this rather than directly changing var/dizziness
-since this ensures that the dizzy_process proc is started
-currently only humans get dizzy
-
-value of dizziness ranges from 0 to 1000
-below 100 is not dizzy
-*/
-/mob/proc/make_dizzy(var/amount)
- if(!istype(src, /mob/living/carbon/human)) // for the moment, only humans get dizzy
- return
-
- dizziness = min(1000, dizziness + amount) // store what will be new value
- // clamped to max 1000
- if(dizziness > 100 && !is_dizzy)
- spawn(0)
- dizzy_process()
-
-
-/*
-dizzy process - wiggles the client's pixel offset over time
-spawned from make_dizzy(), will terminate automatically when dizziness gets <100
-note dizziness decrements automatically in the mob's Life() proc.
-*/
-/mob/proc/dizzy_process()
- is_dizzy = 1
- while(dizziness > 100)
- if(client)
- var/amplitude = dizziness*(sin(dizziness * 0.044 * world.time) + 1) / 70
- client.pixel_x = amplitude * sin(0.008 * dizziness * world.time)
- client.pixel_y = amplitude * cos(0.008 * dizziness * world.time)
-
- sleep(1)
- //endwhile - reset the pixel offsets to zero
- is_dizzy = 0
- if(client)
- client.pixel_x = 0
- client.pixel_y = 0
-
-// jitteriness - copy+paste of dizziness
-
-/mob/proc/make_jittery(var/amount)
- if(!istype(src, /mob/living/carbon/human)) // for the moment, only humans get dizzy
- return
-
- jitteriness = min(1000, jitteriness + amount) // store what will be new value
- // clamped to max 1000
- if(jitteriness > 100 && !is_jittery)
- spawn(0)
- jittery_process()
-
-
-// Typo from the oriignal coder here, below lies the jitteriness process. So make of his code what you will, the previous comment here was just a copypaste of the above.
-/mob/proc/jittery_process()
- //var/old_x = pixel_x
- //var/old_y = pixel_y
- is_jittery = 1
- while(jitteriness > 100)
-// var/amplitude = jitteriness*(sin(jitteriness * 0.044 * world.time) + 1) / 70
-// pixel_x = amplitude * sin(0.008 * jitteriness * world.time)
-// pixel_y = amplitude * cos(0.008 * jitteriness * world.time)
-
- var/amplitude = min(4, jitteriness / 100)
- pixel_x = old_x + rand(-amplitude, amplitude)
- pixel_y = old_y + rand(-amplitude/3, amplitude/3)
-
- sleep(1)
- //endwhile - reset the pixel offsets to zero
- is_jittery = 0
- pixel_x = old_x
- pixel_y = old_y
-
-
-//handles up-down floaty effect in space
-/mob/proc/make_floating(var/n)
-
- floatiness = n
-
- if(floatiness && !is_floating)
- start_floating()
- else if(!floatiness && is_floating)
- stop_floating()
-
-/mob/proc/start_floating()
-
- is_floating = 1
-
- var/amplitude = 2 //maximum displacement from original position
- var/period = 36 //time taken for the mob to go up >> down >> original position, in deciseconds. Should be multiple of 4
-
- var/top = old_y + amplitude
- var/bottom = old_y - amplitude
- var/half_period = period / 2
- var/quarter_period = period / 4
-
- animate(src, pixel_y = top, time = quarter_period, easing = SINE_EASING | EASE_OUT, loop = -1) //up
- animate(pixel_y = bottom, time = half_period, easing = SINE_EASING, loop = -1) //down
- animate(pixel_y = old_y, time = quarter_period, easing = SINE_EASING | EASE_IN, loop = -1) //back
-
-/mob/proc/stop_floating()
- animate(src, pixel_y = old_y, time = 5, easing = SINE_EASING | EASE_IN) //halt animation
- //reset the pixel offsets to zero
- is_floating = 0
-
/mob/Stat()
..()
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index 792517c6d0..897c5181da 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -108,12 +108,6 @@
var/old_x = 0
var/old_y = 0
var/drowsyness = 0.0//Carbon
- var/dizziness = 0//Carbon
- var/is_dizzy = 0
- var/is_jittery = 0
- var/jitteriness = 0//Carbon
- var/is_floating = 0
- var/floatiness = 0
var/charges = 0.0
var/nutrition = 400.0//Carbon
diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm
index 4a51684139..9471a70545 100644
--- a/code/modules/mob/mob_grab.dm
+++ b/code/modules/mob/mob_grab.dm
@@ -328,6 +328,7 @@
bad = 1
if(E.status & ORGAN_DEAD)
assailant << "[E] is decaying!"
+ bad = 1
if(!bad)
assailant << "[H]'s skin is normal."
else
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 34f3525191..f21db9327d 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -452,7 +452,7 @@
if(W.w_class != 3)
user << "\The [W] is too [W.w_class < 3? "small" : "large"] to fit here."
return
-
+
user.drop_item()
W.loc = src
cell = W
@@ -590,7 +590,7 @@
if(do_after(user, 50))
if(!src || !WT.remove_fuel(3, user)) return
if (emagged || malfhack || (stat & BROKEN) || opened==2)
- new /obj/item/stack/sheet/metal(loc)
+ new /obj/item/stack/material/steel(loc)
user.visible_message(\
"[src] has been cut apart by [user.name] with the weldingtool.",\
"You disassembled the broken APC frame.",\
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index 6523e2f85f..bf32a41f8d 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -10,7 +10,7 @@
..()
updateicon()
-/obj/item/weapon/cell/drain_power(var/drain_check, var/surge, var/amount = 0)
+/obj/item/weapon/cell/drain_power(var/drain_check, var/surge, var/power = 0)
if(drain_check)
return 1
@@ -18,9 +18,9 @@
if(charge <= 0)
return 0
- var/cell_amt = min((amount * CELLRATE), charge)
- use(cell_amt)
- return cell_amt / CELLRATE
+ var/cell_amt = power * CELLRATE
+
+ return use(cell_amt) / CELLRATE
/obj/item/weapon/cell/proc/updateicon()
overlays.Cut()
@@ -38,13 +38,26 @@
/obj/item/weapon/cell/proc/fully_charged()
return (charge == maxcharge)
-// use power from a cell
+// checks if the power cell is able to provide the specified amount of charge
+/obj/item/weapon/cell/proc/check_charge(var/amount)
+ return (charge >= amount)
+
+// use power from a cell, returns the amount actually used
/obj/item/weapon/cell/proc/use(var/amount)
if(rigged && amount > 0)
explode()
return 0
- charge = max(0, charge - amount)
- return charge
+ var/used = min(charge, amount)
+ charge -= used
+ return used
+
+// Checks if the specified amount can be provided. If it can, it removes the amount
+// from the cell and returns 1. Otherwise does nothing and returns 0.
+/obj/item/weapon/cell/proc/checked_use(var/amount)
+ if(!check_charge(amount))
+ return 0
+ use(amount)
+ return 1
// recharge the cell
/obj/item/weapon/cell/proc/give(var/amount)
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index ba3c539c77..37133f7ff3 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -50,7 +50,7 @@
usr << "You begin deconstructing [src]."
if (!do_after(usr, 30))
return
- new /obj/item/stack/sheet/metal( get_turf(src.loc), sheets_refunded )
+ new /obj/item/stack/material/steel( get_turf(src.loc), sheets_refunded )
user.visible_message("[user.name] deconstructs [src].", \
"You deconstruct [src].", "You hear a noise.")
playsound(src.loc, 'sound/items/Deconstruct.ogg', 75, 1)
@@ -271,6 +271,7 @@
if(!(status == LIGHT_OK||status == LIGHT_BURNED))
return
visible_message("[user] smashes the light!")
+ user.do_attack_animation(src)
broken()
return 1
diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm
index bd113ff268..a631c8279c 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -87,7 +87,7 @@
desc = "A power generator that runs on solid phoron sheets. Rated for 80 kW max safe output."
var/sheet_name = "Phoron Sheets"
- var/sheet_path = /obj/item/stack/sheet/mineral/phoron
+ var/sheet_path = /obj/item/stack/material/phoron
var/board_path = "/obj/item/weapon/circuitboard/pacman"
/*
@@ -162,7 +162,7 @@
//Removes one stack's worth of material from the generator.
/obj/machinery/power/port_gen/pacman/DropFuel()
if(sheets)
- var/obj/item/stack/sheet/S = new sheet_path(loc)
+ var/obj/item/stack/material/S = new sheet_path(loc)
var/amount = min(sheets, S.max_amount)
S.amount = amount
sheets -= amount
@@ -403,7 +403,7 @@
name = "S.U.P.E.R.P.A.C.M.A.N.-type Portable Generator"
desc = "A power generator that utilizes uranium sheets as fuel. Can run for much longer than the standard PACMAN type generators. Rated for 80 kW max safe output."
icon_state = "portgen1"
- sheet_path = /obj/item/stack/sheet/mineral/uranium
+ sheet_path = /obj/item/stack/material/uranium
sheet_name = "Uranium Sheets"
time_per_sheet = 576 //same power output, but a 50 sheet stack will last 2 hours at max safe power
board_path = "/obj/item/weapon/circuitboard/pacman/super"
@@ -430,7 +430,7 @@
name = "M.R.S.P.A.C.M.A.N.-type Portable Generator"
desc = "An advanced power generator that runs on tritium. Rated for 200 kW maximum safe output!"
icon_state = "portgen2"
- sheet_path = /obj/item/stack/sheet/mineral/tritium
+ sheet_path = /obj/item/stack/material/tritium
sheet_name = "Tritium Fuel Sheets"
//I don't think tritium has any other use, so we might as well make this rewarding for players
diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm
index 387a8c03d1..3b9d094bda 100644
--- a/code/modules/power/power.dm
+++ b/code/modules/power/power.dm
@@ -374,7 +374,7 @@
if (source_area)
source_area.use_power(drained_energy/CELLRATE)
else if (istype(power_source,/datum/powernet))
- var/drained_power = drained_energy/CELLRATE //convert from "joules" to "watts"
+ var/drained_power = drained_energy/CELLRATE
drained_power = PN.draw_power(drained_power)
else if (istype(power_source, /obj/item/weapon/cell))
cell.use(drained_energy)
diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm
index 6bdef2c273..eb8bb66b72 100644
--- a/code/modules/power/solar.dm
+++ b/code/modules/power/solar.dm
@@ -50,10 +50,10 @@ var/list/solars_list = list()
/obj/machinery/power/solar/proc/Make(var/obj/item/solar_assembly/S)
if(!S)
S = new /obj/item/solar_assembly(src)
- S.glass_type = /obj/item/stack/sheet/glass
+ S.glass_type = /obj/item/stack/material/glass
S.anchored = 1
S.loc = src
- if(S.glass_type == /obj/item/stack/sheet/glass/reinforced) //if the panel is in reinforced glass
+ if(S.glass_type == /obj/item/stack/material/glass/reinforced) //if the panel is in reinforced glass
health *= 2 //this need to be placed here, because panels already on the map don't have an assembly linked to
update_icon()
@@ -91,8 +91,8 @@ var/list/solars_list = list()
if(!(stat & BROKEN))
broken()
else
- new /obj/item/weapon/shard(src.loc)
- new /obj/item/weapon/shard(src.loc)
+ new /obj/item/weapon/material/shard(src.loc)
+ new /obj/item/weapon/material/shard(src.loc)
qdel(src)
return
return
@@ -153,13 +153,13 @@ var/list/solars_list = list()
switch(severity)
if(1.0)
if(prob(15))
- new /obj/item/weapon/shard( src.loc )
+ new /obj/item/weapon/material/shard( src.loc )
qdel(src)
return
if(2.0)
if (prob(25))
- new /obj/item/weapon/shard( src.loc )
+ new /obj/item/weapon/material/shard( src.loc )
qdel(src)
return
@@ -231,7 +231,7 @@ var/list/solars_list = list()
// Give back the glass type we were supplied with
/obj/item/solar_assembly/proc/give_glass()
if(glass_type)
- var/obj/item/stack/sheet/S = new glass_type(src.loc)
+ var/obj/item/stack/material/S = new glass_type(src.loc)
S.amount = 2
glass_type = null
@@ -251,8 +251,8 @@ var/list/solars_list = list()
playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
return 1
- if(istype(W, /obj/item/stack/sheet/glass))
- var/obj/item/stack/sheet/S = W
+ if(istype(W, /obj/item/stack/material/glass))
+ var/obj/item/stack/material/S = W
if(S.use(2))
glass_type = W.type
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
@@ -420,7 +420,7 @@ var/list/solars_list = list()
if (src.stat & BROKEN)
user << "\blue The broken glass falls out."
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
- new /obj/item/weapon/shard( 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
diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm
index ea572a2b97..34e20d499c 100644
--- a/code/modules/power/tracker.dm
+++ b/code/modules/power/tracker.dm
@@ -41,7 +41,7 @@
/obj/machinery/power/tracker/proc/Make(var/obj/item/solar_assembly/S)
if(!S)
S = new /obj/item/solar_assembly(src)
- S.glass_type = /obj/item/stack/sheet/glass
+ S.glass_type = /obj/item/stack/material/glass
S.tracker = 1
S.anchored = 1
S.loc = src
diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm
index 10d6d8238d..0119de8308 100644
--- a/code/modules/power/turbine.dm
+++ b/code/modules/power/turbine.dm
@@ -234,7 +234,7 @@
if (src.stat & BROKEN)
user << "\blue The broken glass falls out."
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
- new /obj/item/weapon/shard( src.loc )
+ new /obj/item/weapon/material/shard( src.loc )
var/obj/item/weapon/circuitboard/turbine_control/M = new /obj/item/weapon/circuitboard/turbine_control( A )
for (var/obj/C in src)
C.loc = src.loc
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index 32771984f6..2a7fdad647 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -78,7 +78,7 @@
/obj/item/weapon/gun/energy/consume_next_projectile()
if(!power_supply) return null
if(!ispath(projectile_type)) return null
- if(!power_supply.use(charge_cost)) return null
+ if(!power_supply.checked_use(charge_cost)) return null
return new projectile_type(src)
/obj/item/weapon/gun/energy/proc/get_external_power_supply()
diff --git a/code/modules/projectiles/guns/launcher/crossbow.dm b/code/modules/projectiles/guns/launcher/crossbow.dm
index 860776faec..b199d4ad8b 100644
--- a/code/modules/projectiles/guns/launcher/crossbow.dm
+++ b/code/modules/projectiles/guns/launcher/crossbow.dm
@@ -41,7 +41,7 @@
/obj/item/weapon/arrow/rod/removed(mob/user)
if(throwforce == 15) // The rod has been superheated - we don't want it to be useable when removed from the bow.
user << "[src] shatters into a scattering of overstressed metal shards as it leaves the crossbow."
- var/obj/item/weapon/shard/shrapnel/S = new()
+ var/obj/item/weapon/material/shard/shrapnel/S = new()
S.loc = get_turf(src)
qdel(src)
@@ -254,9 +254,9 @@
else
user << "You need at least five segments of cable coil to complete this task."
return
- else if(istype(W,/obj/item/stack/sheet/mineral/plastic))
+ else if(istype(W,/obj/item/stack/material/plastic))
if(buildstate == 3)
- var/obj/item/stack/sheet/mineral/plastic/P = W
+ var/obj/item/stack/material/plastic/P = W
if(P.use(3))
user << "You assemble and install a heavy plastic lath onto the crossbow."
buildstate++
diff --git a/code/modules/projectiles/guns/launcher/pneumatic.dm b/code/modules/projectiles/guns/launcher/pneumatic.dm
index d26750a36e..e7c3870ed0 100644
--- a/code/modules/projectiles/guns/launcher/pneumatic.dm
+++ b/code/modules/projectiles/guns/launcher/pneumatic.dm
@@ -167,9 +167,9 @@
buildstate++
update_icon()
return
- else if(istype(W,/obj/item/stack/sheet/metal))
+ else if(istype(W,/obj/item/stack/material/steel))
if(buildstate == 2)
- var/obj/item/stack/sheet/metal/M = W
+ var/obj/item/stack/material/steel/M = W
if(M.use(5))
user << "You assemble a chassis around the cannon frame."
buildstate++
diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm
index b3ff7722c9..b4749d06d3 100644
--- a/code/modules/reagents/Chemistry-Holder.dm
+++ b/code/modules/reagents/Chemistry-Holder.dm
@@ -3,7 +3,6 @@
var/total_volume = 0
var/maximum_volume = 100
var/atom/my_atom = null
- var/reacting = 0 // Reacting right now
/datum/reagents/New(var/max = 100)
maximum_volume = max
diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm
index 83aaf915fb..7f6da07d67 100644
--- a/code/modules/reagents/Chemistry-Machinery.dm
+++ b/code/modules/reagents/Chemistry-Machinery.dm
@@ -587,12 +587,12 @@
var/limit = 10
var/list/holdingitems = list()
var/list/sheet_reagents = list(
- /obj/item/stack/sheet/mineral/iron = "iron",
- /obj/item/stack/sheet/mineral/uranium = "uranium",
- /obj/item/stack/sheet/mineral/phoron = "phoron",
- /obj/item/stack/sheet/mineral/gold = "gold",
- /obj/item/stack/sheet/mineral/silver = "silver",
- /obj/item/stack/sheet/mineral/mhydrogen = "hydrogen"
+ /obj/item/stack/material/iron = "iron",
+ /obj/item/stack/material/uranium = "uranium",
+ /obj/item/stack/material/phoron = "phoron",
+ /obj/item/stack/material/gold = "gold",
+ /obj/item/stack/material/silver = "silver",
+ /obj/item/stack/material/mhydrogen = "hydrogen"
)
/obj/machinery/reagentgrinder/New()
@@ -798,4 +798,4 @@
if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
break
-#undef REAGENTS_PER_SHEET
+#undef REAGENTS_PER_SHEET
diff --git a/code/modules/reagents/Chemistry-Readme.dm b/code/modules/reagents/Chemistry-Readme.dm
index ac8792c1e7..399e856bf3 100644
--- a/code/modules/reagents/Chemistry-Readme.dm
+++ b/code/modules/reagents/Chemistry-Readme.dm
@@ -24,212 +24,258 @@ About the Holder:
The holder (reagents datum) is the datum that holds a list of all reagents
currently in the object.It also has all the procs needed to manipulate reagents
- remove_any(var/amount)
- This proc removes reagents from the holder until the passed amount
- is matched. It'll try to remove some of ALL reagents contained.
+ Vars:
+ list/datum/reagent/reagent_list
+ List of reagent datums.
- trans_to(var/obj/target, var/amount)
- This proc equally transfers the contents of the holder to another
- objects holder. You need to pass it the object (not the holder) you want
- to transfer to and the amount you want to transfer. Its return value is the
- actual amount transfered (if one of the objects is full/empty)
+ total_volume
+ Total volume of all reagents.
- trans_id_to(var/obj/target, var/reagent, var/amount)
- Same as above but only for a specific reagent in the reagent list.
- If the specified amount is greater than what is available, it will use
- the amount of the reagent that is available. If no reagent exists, returns null.
+ maximum_volume
+ Maximum volume.
- metabolize(var/mob/M)
- This proc is called by the mobs life proc. It simply calls on_mob_life for
- all contained reagents. You shouldnt have to use this one directly.
+ atom/my_atom
+ Reference to the object that contains this.
- handle_reactions()
- This proc check all recipes and, on a match, uses them.
- It will also call the recipe's on_reaction proc (for explosions or w/e).
- Currently, this proc is automatically called by trans_to.
- - Modified from the original to preserve reagent data across reactions (originally for xenoarchaeology)
+ Procs:
- isolate_reagent(var/reagent)
- Pass it a reagent id and it will remove all reagents but that one.
- It's that simple.
+ get_free_space()
+ Returns the remaining free volume in the holder.
- del_reagent(var/reagent)
- Completely remove the reagent with the matching id.
+ get_master_reagent()
+ Returns the reference to the reagent with the largest volume
- reaction_fire(exposed_temp)
- Simply calls the reaction_fire procs of all contained reagents.
+ get_master_reagent_name()
+ Ditto, but returns the name.
+
+ get_master_reagent_id()
+ Ditto, but returns ID.
update_total()
- This one simply updates the total volume of the holder.
- (the volume of all reagents added together)
+ Updates total volume, called automatically.
+
+ handle_reactions()
+ Checks reagents and triggers any reactions that happen. Usually called automatically.
+
+ add_reagent(var/id, var/amount, var/data = null, var/safety = 0)
+ Adds [amount] units of [id] reagent. [data] will be passed to reagent's mix_data() or initialize_data(). If [safety] is 0, handle_reactions() will be called. Returns 1 if successful, 0 otherwise.
+
+ remove_reagent(var/id, var/amount, var/safety = 0)
+ Ditto, but removes reagent. Returns 1 if successful, 0 otherwise.
+
+ del_reagent(var/id)
+ Removes all of the reagent.
+
+ has_reagent(var/id, var/amount = 0)
+ Checks if holder has at least [amount] of [id] reagent. Returns 1 if the reagent is found and volume is above [amount]. Returns 0 otherwise.
clear_reagents()
- This proc removes ALL reagents from the holder.
+ Removes all reagents.
- reaction(var/atom/A, var/method=TOUCH, var/volume_modifier=0)
- This proc calls the appropriate reaction procs of the reagents.
- I.e. if A is an object, it will call the reagents reaction_obj
- proc. The method var is used for reaction on mobs. It simply tells
- us if the mob TOUCHed the reagent or if it INGESTed the reagent.
- Since the volume can be checked in a reagents proc, you might want to
- use the volume_modifier var to modifiy the passed value without actually
- changing the volume of the reagents.
- If you're not sure if you need to use this the answer is very most likely 'No'.
- You'll want to use this proc whenever an atom first comes in
- contact with the reagents of a holder. (in the 'splash' part of a beaker i.e.)
- More on the reaction in the reagent part of this readme.
+ get_reagent_amount(var/id)
+ Returns reagent volume. Returns 0 if reagent is not found.
- add_reagent(var/reagent, var/amount, var/data)
- Attempts to add X of the matching reagent to the holder.
- You wont use this much. Mostly in new procs for pre-filled
- objects.
+ get_data(var/id)
+ Returns get_data() of the reagent.
- remove_reagent(var/reagent, var/amount)
- The exact opposite of the add_reagent proc.
- - Modified from original to return the reagent's data, in order to preserve reagent data across reactions (originally for xenoarchaeology)
+ get_reagents()
+ Returns a string containing all reagent ids and volumes, e.g. "carbon(4),nittrogen(5)".
- has_reagent(var/reagent, var/amount)
- Returns 1 if the holder contains this reagent.
- Or 0 if not.
- If you pass it an amount it will additionally check
- if the amount is matched. This is optional.
+ remove_any(var/amount = 1)
+ Removes up to [amount] of reagents from [src]. Returns actual amount removed.
- get_reagent_amount(var/reagent)
- Returns the amount of the matching reagent inside the
- holder. Returns 0 if the reagent is missing.
+ trans_to_holder(var/datum/reagents/target, var/amount = 1, var/multiplier = 1, var/copy = 0)
+ Transfers [amount] reagents from [src] to [target], multiplying them by [multiplier]. Returns actual amount removed from [src] (not amount transferred to [target]). If [copy] is 1, copies reagents instead.
- Important variables:
+ touch(var/atom/target)
+ Not recommended to use. Calls touch_mob(target), touch_turf(target), or touch_obj(target), depending on target's type.
- total_volume
- This variable contains the total volume of all reagents in this holder.
+ touch_mob(var/mob/target)
+ Calls each reagent's touch_mob(target).
- reagent_list
- This is a list of all contained reagents. More specifically, references
- to the reagent datums.
+ touch_turf(var/turf/target)
+ Calls each reagent's touch_turf(target).
- maximum_volume
- This is the maximum volume of the holder.
+ touch_obj(var/obj/target)
+ Calls each reagent's touch_obj(target).
- my_atom
- This is the atom the holder is 'in'. Useful if you need to find the location.
- (i.e. for explosions)
+ trans_to(var/atom/target, var/amount = 1, var/multiplier = 1, var/copy = 0)
+ Checks the type of [target], calling splash_mob(target, amount), trans_to_turf(target, amount, multiplier, copy), or trans_to_obj(target, amount, multiplier, copy).
+ trans_id_to(var/atom/target, var/id, var/amount = 1)
+ Transfers [amount] of [id] to [target]. Returns amount transferred.
+
+ splash_mob(var/mob/target, var/amount = 1, var/clothes = 1)
+ Checks mob's clothing if [clothes] is 1 and transfers [amount] reagents to mob's skin.
+
+ trans_to_mob(var/mob/target, var/amount = 1, var/type = CHEM_BLOOD, var/multiplier = 1, var/copy = 0)
+ Transfers [amount] reagents to the mob's appropriate holder, depending on [type]. Ignores protection.
+
+ trans_to_turf(var/turf/target, var/amount = 1, var/multiplier = 1, var/copy = 0)
+ Turfs don't currently have any reagents. Puts [amount] reagents into a temporary holder, calls touch_turf(target) from it, and deletes it.
+
+ trans_to_obj(var/turf/target, var/amount = 1, var/multiplier = 1, var/copy = 0)
+ If target has reagents, transfers [amount] to it. Otherwise, same as trans_to_turf().
+
+ /atom/proc/create_reagents(var/max_vol)
+ Creates a new reagent datum.
About Reagents:
Reagents are all the things you can mix and fille in bottles etc. This can be anything from
- rejuvs over water to ... iron. Each reagent also has a few procs - i'll explain those below.
+ rejuvs over water to... iron.
- reaction_mob(var/mob/M, var/method=TOUCH)
- This is called by the holder's reation proc.
- This version is only called when the reagent
- reacts with a mob. The method var can be either
- TOUCH or INGEST. You'll want to put stuff like
- acid-facemelting in here.
-
- reaction_obj(var/obj/O)
- This is called by the holder's reation proc.
- This version is called when the reagents reacts
- with an object. You'll want to put stuff like
- object melting in here ... or something. i dunno.
-
- reaction_turf(var/turf/T)
- This is called by the holder's reaction proc.
- This version is called when the reagents reacts
- with a turf. You'll want to put stuff like extra
- slippery floors for lube or something in here.
-
- on_mob_life(var/mob/M)
- This proc is called everytime the mobs life proc executes.
- This is the place where you put damage for toxins ,
- drowsyness for sleep toxins etc etc.
- You'll want to call the parents proc by using ..() .
- If you don't, the chemical will stay in the mob forever -
- unless you write your own piece of code to slowly remove it.
- (Should be pretty easy, 1 line of code)
-
- Important variables:
-
- holder
- This variable contains a reference to the holder the chemical is 'in'
-
- volume
- This is the volume of the reagent.
-
- id
- The id of the reagent
+ Vars:
name
- The name of the reagent.
+ Name that shows up in-game.
- data
- This var can be used for whatever the fuck you want. I used it for the sleep
- toxins to make them work slowly instead of instantly. You could also use this
- for DNA in a blood reagent or ... well whatever you want.
+ id
+ ID that is used for internal tracking. MUST BE UNIQUE.
+
+ description
+ Description that shows up in-game.
+
+ datum/reagents/holder
+ Reference to holder.
+
+ reagent_state
+ Could be GAS, LIQUID, or SOLID. Affects nothing. Reserved for future use.
+
+ list/data
+ Use varies by reagent. Custom variable. For example, blood stores blood group and viruses.
+
+ volume
+ Current volume.
+
+ metabolism
+ How quickly reagent is processed in mob's bloodstream; by default aslo affects ingest and touch metabolism.
+
+ ingest_met
+ How quickly reagent is processed when ingested; [metabolism] is used if zero.
+
+ touch_met
+ Ditto when touching.
+
+ dose
+ How much of the reagent has been processed, limited by [max_dose]. Used for reagents with varying effects (e.g. ethanol or rezadone) and overdosing.
+
+ max_dose
+ Maximum amount of reagent that has ever been in a mob. Exists so dose won't grow infinitely when small amounts of reagent are added over time.
+
+ overdose
+ If [dose] is bigger than [overdose], overdose() proc is called every tick.
+
+ scannable
+ If set to 1, will show up on health analyzers by name.
+
+ affects_dead
+ If set to 1, will affect dead players. Used by Adminordrazine.
+
+ glass_icon_state
+ Used by drinks. icon_state of the glass when this reagent is the master reagent.
+
+ glass_name
+ Ditto for glass name.
+
+ glass_desc
+ Ditto for glass desciption.
+
+ glass_center_of_mass
+ Used for glass placement on tables.
color
- This is a hexadecimal color that represents the reagent outside of containers,
- you define it as "#RRGGBB", or, red green blue. You can also define it using the
- rgb() proc, which returns a hexadecimal value too. The color is black by default.
+ "#RRGGBB" or "#RRGGBBAA" where A is alpha channel.
- A good website for color calculations: http://www.psyclops.com/tools/rgb/
+ color_weight
+ How much reagent affects color of holder. Used by paint.
+ Procs:
+ remove_self(var/amount)
+ Removes [amount] of itself.
+ touch_mob(var/mob/M)
+ Called when reagent is in another holder and not splashing the mob. Can be used with noncarbons.
+
+ touch_obj(var/obj/O)
+ How reagent reacts with objects.
+
+ touch_turf(var/turf/T)
+ How reagent reacts with turfs.
+
+ on_mob_life(var/mob/living/carbon/M, var/alien, var/location)
+ Makes necessary checks and calls one of affect procs.
+
+ affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ How reagent affects mob when injected. [removed] is the amount of reagent that has been removed this tick. [alien] is the mob's reagent flag.
+
+ affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
+ Ditto, ingested. Defaults to affect_blood with halved dose.
+
+ affect_touch(var/mob/living/carbon/M, var/alien, var/removed)
+ Ditto, touching.
+
+ overdose(var/mob/living/carbon/M, var/alien)
+ Called when dose is above overdose. Defaults to M.adjustToxLoss(REM).
+
+ initialize_data(var/newdata)
+ Called when reagent is created. Defaults to setting [data] to [newdata].
+
+ mix_data(var/newdata, var/newamount)
+ Called when [newamount] of reagent with [newdata] data is added to the current reagent. Used by paint.
+
+ get_data()
+ Returns data. Can be overriden.
About Recipes:
Recipes are simple datums that contain a list of required reagents and a result.
They also have a proc that is called when the recipe is matched.
- on_reaction(var/datum/reagents/holder, var/created_volume)
- This proc is called when the recipe is matched.
- You'll want to add explosions etc here.
- To find the location you'll have to do something
- like get_turf(holder.my_atom)
+ Vars:
- name & id
- Should be pretty obvious.
+ name
+ Name of the reaction, currently unused.
+
+ id
+ ID of the reaction, must be unique.
result
- This var contains the id of the resulting reagent.
+ ID of the resulting reagent. Can be null.
- required_reagents
- This is a list of ids of the required reagents.
- Each id also needs an associated value that gives us the minimum required amount
- of that reagent. The handle_reaction proc can detect mutiples of the same recipes
- so for most cases you want to set the required amount to 1.
+ list/required_reagents
+ Reagents that are required for the reaction and are used up during it.
- required_catalysts (Added May 2011)
- This is a list of the ids of the required catalysts.
- Functionally similar to required_reagents, it is a list of reagents that are required
- for the reaction. However, unlike required_reagents, catalysts are NOT consumed.
- They mearly have to be present in the container.
+ list/catalysts
+ Ditto, but not used up.
+
+ list/inhibitors
+ Opposite, prevent the reaction from happening.
result_amount
- This is the amount of the resulting reagent this recipe will produce.
- I recommend you set this to the total volume of all required reagent.
+ Amount of resulting reagent.
- required_container
- The container the recipe has to take place in in order to happen. Leave this blank/null
- if you want the reaction to happen anywhere.
+ mix_message
+ Message that is shown to mobs when reaction happens.
- required_other
- Basically like a reagent's data variable. You can set extra requirements for a
- reaction with this.
+ Procs:
+ can_happen(var/datum/reagents/holder)
+ Customizable. If it returns 0, reaction will not happen. Defaults to always returning 1. Used by slime core reactions.
+
+ on_reaction(var/datum/reagents/holder, var/created_volume)
+ Called when reaction happens. Used by explosives.
+
+ send_data(var/datum/reagents/T)
+ Sets resulting reagent's data. Used by blood paint.
About the Tools:
By default, all atom have a reagents var - but its empty. if you want to use an object for the chem.
system you'll need to add something like this in its new proc:
- var/datum/reagents/R = new/datum/reagents(100) <<<<< create a new datum , 100 is the maximum_volume of the new holder datum.
- reagents = R <<<<< assign the new datum to the objects reagents var
- R.my_atom = src <<<<< set the holders my_atom to src so that we know where we are.
-
- This can also be done by calling a convenience proc:
- atom/proc/create_reagents(var/max_volume)
+ /atom/proc/create_reagents(var/max_volume)
Other important stuff:
diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm
index 2912a392cb..72ce607065 100644
--- a/code/modules/reagents/Chemistry-Recipes.dm
+++ b/code/modules/reagents/Chemistry-Recipes.dm
@@ -439,7 +439,7 @@
result_amount = 1
/datum/chemical_reaction/phoronsolidification/on_reaction(var/datum/reagents/holder, var/created_volume)
- new /obj/item/stack/sheet/mineral/phoron(get_turf(holder.my_atom), created_volume)
+ new /obj/item/stack/material/phoron(get_turf(holder.my_atom), created_volume)
return
/datum/chemical_reaction/plastication
@@ -450,7 +450,7 @@
result_amount = 1
/datum/chemical_reaction/plastication/on_reaction(var/datum/reagents/holder, var/created_volume)
- new /obj/item/stack/sheet/mineral/plastic(get_turf(holder.my_atom), created_volume)
+ new /obj/item/stack/material/plastic(get_turf(holder.my_atom), created_volume)
return
/* Grenade reactions */
@@ -884,7 +884,7 @@
if(T.Uses <= 0)
T.visible_message("\icon[T]\The [T]'s power is consumed in the reaction.")
T.name = "used slime extract"
- T.desc = "This extract has been used up."
+ T.desc = "This extract has been used up."
//Grey
/datum/chemical_reaction/slime/spawn
@@ -934,10 +934,10 @@
required = /obj/item/slime_extract/metal
/datum/chemical_reaction/slime/metal/on_reaction(var/datum/reagents/holder)
- var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal
+ var/obj/item/stack/material/steel/M = new /obj/item/stack/material/steel
M.amount = 15
M.loc = get_turf(holder.my_atom)
- var/obj/item/stack/sheet/plasteel/P = new /obj/item/stack/sheet/plasteel
+ var/obj/item/stack/material/plasteel/P = new /obj/item/stack/material/plasteel
P.amount = 5
P.loc = get_turf(holder.my_atom)
..()
@@ -1104,7 +1104,7 @@
/datum/chemical_reaction/slime/plasma/on_reaction(var/datum/reagents/holder)
..()
- var/obj/item/stack/sheet/mineral/phoron/P = new /obj/item/stack/sheet/mineral/phoron
+ var/obj/item/stack/material/phoron/P = new /obj/item/stack/material/phoron
P.amount = 10
P.loc = get_turf(holder.my_atom)
@@ -1145,7 +1145,7 @@
var/obj/item/weapon/slimepotion/P = new /obj/item/weapon/slimepotion
P.loc = get_turf(holder.my_atom)
-//Black
+//Black
/datum/chemical_reaction/slime/mutate2
name = "Advanced Mutation Toxin"
id = "mutationtoxin2"
@@ -1154,7 +1154,7 @@
result_amount = 1
required = /obj/item/slime_extract/black
-//Oil
+//Oil
/datum/chemical_reaction/slime/explosion
name = "Slime Explosion"
id = "m_explosion"
@@ -1167,7 +1167,7 @@
/datum/chemical_reaction/slime/explosion/on_reaction(var/datum/reagents/holder)
..()
sleep(50)
- explosion(get_turf(holder.my_atom), 1, 3, 6)
+ explosion(get_turf(holder.my_atom), 1, 3, 6)
//Light Pink
/datum/chemical_reaction/slime/potion2
@@ -1266,32 +1266,32 @@
var/location = get_turf(holder.my_atom)
for(var/i = 1, i <= created_volume, i++)
new /obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesewheel(location)
- return
-
-/datum/chemical_reaction/meatball
- name = "Meatball"
- id = "meatball"
- result = null
- required_reagents = list("protein" = 3, "flour" = 5)
- result_amount = 3
-
+ return
+
+/datum/chemical_reaction/meatball
+ name = "Meatball"
+ id = "meatball"
+ result = null
+ required_reagents = list("protein" = 3, "flour" = 5)
+ result_amount = 3
+
/datum/chemical_reaction/meatball/on_reaction(var/datum/reagents/holder, var/created_volume)
var/location = get_turf(holder.my_atom)
- for(var/i = 1, i <= created_volume, i++)
- new /obj/item/weapon/reagent_containers/food/snacks/meatball(location)
- return
-
-/datum/chemical_reaction/dough
- name = "Dough"
- id = "dough"
- result = null
- required_reagents = list("egg" = 3, "flour" = 10)
- result_amount = 1
-
+ for(var/i = 1, i <= created_volume, i++)
+ new /obj/item/weapon/reagent_containers/food/snacks/meatball(location)
+ return
+
+/datum/chemical_reaction/dough
+ name = "Dough"
+ id = "dough"
+ result = null
+ required_reagents = list("egg" = 3, "flour" = 10)
+ result_amount = 1
+
/datum/chemical_reaction/dough/on_reaction(var/datum/reagents/holder, var/created_volume)
var/location = get_turf(holder.my_atom)
- for(var/i = 1, i <= created_volume, i++)
- new /obj/item/weapon/reagent_containers/food/snacks/dough(location)
+ for(var/i = 1, i <= created_volume, i++)
+ new /obj/item/weapon/reagent_containers/food/snacks/dough(location)
return
/datum/chemical_reaction/syntiflesh
@@ -1941,4 +1941,4 @@ datum
required_reagents = list("density_separated_sample" = 5)
result_amount = 4
requires_heating = 1
-*/
+*/
diff --git a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm
index 8b7de10bcd..e6b1308603 100644
--- a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm
+++ b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm
@@ -16,7 +16,7 @@
var/obj/item/weapon/broken_bottle/B = new /obj/item/weapon/broken_bottle(user.loc)
user.put_in_active_hand(B)
if(prob(33))
- new/obj/item/weapon/shard(target.loc) // Create a glass shard at the target's location!
+ new/obj/item/weapon/material/shard(target.loc) // Create a glass shard at the target's location!
B.icon_state = src.icon_state
var/icon/I = new('icons/obj/drinks.dmi', src.icon_state)
diff --git a/code/modules/reagents/reagent_containers/food/sandwich.dm b/code/modules/reagents/reagent_containers/food/sandwich.dm
index b3e3ce9d1f..c853706ad5 100644
--- a/code/modules/reagents/reagent_containers/food/sandwich.dm
+++ b/code/modules/reagents/reagent_containers/food/sandwich.dm
@@ -1,6 +1,6 @@
/obj/item/weapon/reagent_containers/food/snacks/breadslice/attackby(obj/item/W as obj, mob/user as mob)
- if(istype(W,/obj/item/weapon/shard) || istype(W,/obj/item/weapon/reagent_containers/food/snacks))
+ if(istype(W,/obj/item/weapon/material/shard) || istype(W,/obj/item/weapon/reagent_containers/food/snacks))
var/obj/item/weapon/reagent_containers/food/snacks/csandwich/S = new(get_turf(src))
S.attackby(W,user)
qdel(src)
@@ -25,7 +25,7 @@
if(src.contents.len > sandwich_limit)
user << "\red If you put anything else on \the [src] it's going to collapse."
return
- else if(istype(W,/obj/item/weapon/shard))
+ else if(istype(W,/obj/item/weapon/material/shard))
user << "\blue You hide [W] in \the [src]."
user.drop_item()
W.loc = src
@@ -87,7 +87,7 @@
var/obj/item/shard
for(var/obj/item/O in contents)
- if(istype(O,/obj/item/weapon/shard))
+ if(istype(O,/obj/item/weapon/material/shard))
shard = O
break
diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm
index faca2e1fb0..a63fbdd46b 100644
--- a/code/modules/reagents/reagent_containers/food/snacks.dm
+++ b/code/modules/reagents/reagent_containers/food/snacks.dm
@@ -48,12 +48,12 @@
if(H.species.flags & IS_SYNTHETIC)
H << "You have a monitor for a head, where do you think you're going to put that?"
return
-
+
var/obj/item/blocked = H.check_mouth_coverage()
if(blocked)
user << "\The [blocked] is in the way!"
return
-
+
if (fullness <= 50)
M << "You hungrily chew out a piece of [src] and gobble it!"
if (fullness > 50 && fullness <= 150)
@@ -71,7 +71,7 @@
if(H.species.flags & IS_SYNTHETIC)
user << "They have a monitor for a head, where do you think you're going to put that?"
return
-
+
var/obj/item/blocked = H.check_mouth_coverage()
if(blocked)
user << "\The [blocked] is in the way!"
@@ -128,8 +128,8 @@
return
// Eating with forks
- if(istype(W,/obj/item/weapon/kitchen/utensil))
- var/obj/item/weapon/kitchen/utensil/U = W
+ if(istype(W,/obj/item/weapon/material/kitchen/utensil))
+ var/obj/item/weapon/material/kitchen/utensil/U = W
if(!U.reagents)
U.create_reagents(5)
@@ -186,9 +186,9 @@
var/reagents_per_slice = reagents.total_volume/slices_num
for(var/i=1 to (slices_num-slices_lost))
- var/obj/slice = new slice_path (src.loc)
+ var/obj/slice = new slice_path (src.loc)
reagents.trans_to_obj(slice, reagents_per_slice)
- qdel(src)
+ qdel(src)
return
/obj/item/weapon/reagent_containers/food/snacks/proc/is_sliceable()
@@ -2819,7 +2819,7 @@
// Dough + rolling pin = flat dough
/obj/item/weapon/reagent_containers/food/snacks/dough/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W,/obj/item/weapon/kitchen/rollingpin))
+ if(istype(W,/obj/item/weapon/material/kitchen/rollingpin))
new /obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough(src)
user << "You flatten the dough."
qdel(src)
@@ -2964,7 +2964,7 @@
// potato + knife = raw sticks
/obj/item/weapon/reagent_containers/food/snacks/grown/potato/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W,/obj/item/weapon/kitchen/utensil/knife))
+ if(istype(W,/obj/item/weapon/material/kitchen/utensil/knife))
new /obj/item/weapon/reagent_containers/food/snacks/rawsticks(src)
user << "You cut the potato."
qdel(src)
diff --git a/code/modules/reagents/reagent_containers/food/snacks/meat.dm b/code/modules/reagents/reagent_containers/food/snacks/meat.dm
index 797f605b08..46bf9e4baf 100644
--- a/code/modules/reagents/reagent_containers/food/snacks/meat.dm
+++ b/code/modules/reagents/reagent_containers/food/snacks/meat.dm
@@ -10,7 +10,7 @@
src.bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/meat/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W,/obj/item/weapon/kitchenknife))
+ if(istype(W,/obj/item/weapon/material/knife))
new /obj/item/weapon/reagent_containers/food/snacks/rawcutlet(src)
new /obj/item/weapon/reagent_containers/food/snacks/rawcutlet(src)
new /obj/item/weapon/reagent_containers/food/snacks/rawcutlet(src)
diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm
index 986f3a6291..d0cfe226f6 100644
--- a/code/modules/research/circuitprinter.dm
+++ b/code/modules/research/circuitprinter.dm
@@ -68,16 +68,16 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis).
if(istype(I, /obj/item/weapon/reagent_containers/glass/beaker))
reagents.trans_to_obj(I, reagents.total_volume)
if(g_amount >= 3750)
- var/obj/item/stack/sheet/glass/G = new /obj/item/stack/sheet/glass(loc)
+ var/obj/item/stack/material/glass/G = new /obj/item/stack/material/glass(loc)
G.amount = round(g_amount / 3750)
if(gold_amount >= 2000)
- var/obj/item/stack/sheet/mineral/gold/G = new /obj/item/stack/sheet/mineral/gold(loc)
+ var/obj/item/stack/material/gold/G = new /obj/item/stack/material/gold(loc)
G.amount = round(gold_amount / 2000)
if(diamond_amount >= 2000)
- var/obj/item/stack/sheet/mineral/diamond/G = new /obj/item/stack/sheet/mineral/diamond(loc)
+ var/obj/item/stack/material/diamond/G = new /obj/item/stack/material/diamond(loc)
G.amount = round(diamond_amount / 2000)
if(uranium_amount >= 2000)
- var/obj/item/stack/sheet/mineral/uranium/G = new /obj/item/stack/sheet/mineral/uranium(loc)
+ var/obj/item/stack/material/uranium/G = new /obj/item/stack/material/uranium(loc)
G.amount = round(uranium_amount / 2000)
..()
@@ -104,7 +104,7 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis).
return 1
if(O.is_open_container())
return 0
-// if(!istype(O, /obj/item/stack/sheet/glass) && !istype(O, /obj/item/stack/sheet/mineral/gold) && !istype(O, /obj/item/stack/sheet/mineral/diamond) && !istype(O, /obj/item/stack/sheet/mineral/uranium))
+// if(!istype(O, /obj/item/stack/material/glass) && !istype(O, /obj/item/stack/material/gold) && !istype(O, /obj/item/stack/material/diamond) && !istype(O, /obj/item/stack/material/uranium))
// user << "You cannot insert this item into \the [src]!"
// return 1
if(stat)
@@ -113,9 +113,9 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis).
user << "\The [src] is busy. Please wait for completion of previous operation."
return 1
- if(istype(O, /obj/item/stack/sheet/glass) || istype(O, /obj/item/stack/sheet/mineral/gold) || istype(O, /obj/item/stack/sheet/mineral/diamond) || istype(O, /obj/item/stack/sheet/mineral/uranium))
+ if(istype(O, /obj/item/stack/material/glass) || istype(O, /obj/item/stack/material/gold) || istype(O, /obj/item/stack/material/diamond) || istype(O, /obj/item/stack/material/uranium))
- var/obj/item/stack/sheet/stack = O
+ var/obj/item/stack/material/stack = O
if((TotalMaterials() + stack.perunit) > max_material_amount)
user << "\The [src] is full. Please remove glass from \the [src] in order to insert more."
return 1
@@ -135,13 +135,13 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis).
if(do_after(usr, 16))
user << "You add [amount] sheets to \the [src]."
switch(stacktype)
- if(/obj/item/stack/sheet/glass)
+ if(/obj/item/stack/material/glass)
g_amount += amount * 3750
- if(/obj/item/stack/sheet/mineral/gold)
+ if(/obj/item/stack/material/gold)
gold_amount += amount * 2000
- if(/obj/item/stack/sheet/mineral/diamond)
+ if(/obj/item/stack/material/diamond)
diamond_amount += amount * 2000
- if(/obj/item/stack/sheet/mineral/uranium)
+ if(/obj/item/stack/material/uranium)
uranium_amount += amount * 2000
else
new stacktype(loc, amount)
diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm
index 086cd80c9b..c35d820372 100644
--- a/code/modules/research/protolathe.dm
+++ b/code/modules/research/protolathe.dm
@@ -63,25 +63,25 @@ Note: Must be placed west/left of and R&D console to function.
if(istype(I, /obj/item/weapon/reagent_containers/glass/beaker))
reagents.trans_to_obj(I, reagents.total_volume)
if(m_amount >= 3750)
- var/obj/item/stack/sheet/metal/G = new /obj/item/stack/sheet/metal(loc)
+ var/obj/item/stack/material/steel/G = new /obj/item/stack/material/steel(loc)
G.amount = round(m_amount / G.perunit)
if(g_amount >= 3750)
- var/obj/item/stack/sheet/glass/G = new /obj/item/stack/sheet/glass(loc)
+ var/obj/item/stack/material/glass/G = new /obj/item/stack/material/glass(loc)
G.amount = round(g_amount / G.perunit)
if(phoron_amount >= 2000)
- var/obj/item/stack/sheet/mineral/phoron/G = new /obj/item/stack/sheet/mineral/phoron(loc)
+ var/obj/item/stack/material/phoron/G = new /obj/item/stack/material/phoron(loc)
G.amount = round(phoron_amount / G.perunit)
if(silver_amount >= 2000)
- var/obj/item/stack/sheet/mineral/silver/G = new /obj/item/stack/sheet/mineral/silver(loc)
+ var/obj/item/stack/material/silver/G = new /obj/item/stack/material/silver(loc)
G.amount = round(silver_amount / G.perunit)
if(gold_amount >= 2000)
- var/obj/item/stack/sheet/mineral/gold/G = new /obj/item/stack/sheet/mineral/gold(loc)
+ var/obj/item/stack/material/gold/G = new /obj/item/stack/material/gold(loc)
G.amount = round(gold_amount / G.perunit)
if(uranium_amount >= 2000)
- var/obj/item/stack/sheet/mineral/uranium/G = new /obj/item/stack/sheet/mineral/uranium(loc)
+ var/obj/item/stack/material/uranium/G = new /obj/item/stack/material/uranium(loc)
G.amount = round(uranium_amount / G.perunit)
if(diamond_amount >= 2000)
- var/obj/item/stack/sheet/mineral/diamond/G = new /obj/item/stack/sheet/mineral/diamond(loc)
+ var/obj/item/stack/material/diamond/G = new /obj/item/stack/material/diamond(loc)
G.amount = round(diamond_amount / G.perunit)
..()
@@ -118,13 +118,13 @@ Note: Must be placed west/left of and R&D console to function.
return 1
if(stat)
return 1
- if(istype(O,/obj/item/stack/sheet))
- var/obj/item/stack/sheet/S = O
+ if(istype(O,/obj/item/stack/material))
+ var/obj/item/stack/material/S = O
if(TotalMaterials() + S.perunit > max_material_storage)
user << "\The [src]'s material bin is full. Please remove material before adding more."
return 1
- var/obj/item/stack/sheet/stack = O
+ var/obj/item/stack/material/stack = O
var/amount = round(input("How many sheets do you want to add?") as num)//No decimals
if(!O)
return
@@ -150,19 +150,19 @@ Note: Must be placed west/left of and R&D console to function.
user << "You add [amount] sheets to \the [src]."
icon_state = "protolathe"
switch(stacktype)
- if(/obj/item/stack/sheet/metal)
+ if(/obj/item/stack/material/steel)
m_amount += amount * 3750
- if(/obj/item/stack/sheet/glass)
+ if(/obj/item/stack/material/glass)
g_amount += amount * 3750
- if(/obj/item/stack/sheet/mineral/gold)
+ if(/obj/item/stack/material/gold)
gold_amount += amount * 2000
- if(/obj/item/stack/sheet/mineral/silver)
+ if(/obj/item/stack/material/silver)
silver_amount += amount * 2000
- if(/obj/item/stack/sheet/mineral/phoron)
+ if(/obj/item/stack/material/phoron)
phoron_amount += amount * 2000
- if(/obj/item/stack/sheet/mineral/uranium)
+ if(/obj/item/stack/material/uranium)
uranium_amount += amount * 2000
- if(/obj/item/stack/sheet/mineral/diamond)
+ if(/obj/item/stack/material/diamond)
diamond_amount += amount * 2000
else
new stacktype(loc, amount)
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index 8f1113043d..4f0178ed3d 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -269,8 +269,8 @@ won't update every console in existence) but it's more of a hassle to do. Also,
for(var/obj/I in linked_destroy.contents)
for(var/mob/M in I.contents)
M.death()
- if(istype(I,/obj/item/stack/sheet))//Only deconsturcts one sheet at a time instead of the entire stack
- var/obj/item/stack/sheet/S = I
+ if(istype(I,/obj/item/stack/material))//Only deconsturcts one sheet at a time instead of the entire stack
+ var/obj/item/stack/material/S = I
if(S.get_amount() > 1)
S.use(1)
linked_destroy.loaded_item = S
@@ -460,7 +460,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
res_amount = "diamond_amount"
if(ispath(type) && hasvar(linked_lathe, res_amount))
- var/obj/item/stack/sheet/sheet = new type(linked_lathe.loc)
+ var/obj/item/stack/material/sheet = new type(linked_lathe.loc)
var/available_num_sheets = round(linked_lathe.vars[res_amount]/sheet.perunit)
if(available_num_sheets>0)
sheet.amount = min(available_num_sheets, desired_num_sheets)
@@ -472,19 +472,19 @@ won't update every console in existence) but it's more of a hassle to do. Also,
var/res_amount, type
switch(href_list["imprinter_ejectsheet"])
if("glass")
- type = /obj/item/stack/sheet/glass
+ type = /obj/item/stack/material/glass
res_amount = "g_amount"
if("gold")
- type = /obj/item/stack/sheet/mineral/gold
+ type = /obj/item/stack/material/gold
res_amount = "gold_amount"
if("diamond")
- type = /obj/item/stack/sheet/mineral/diamond
+ type = /obj/item/stack/material/diamond
res_amount = "diamond_amount"
if("uranium")
- type = /obj/item/stack/sheet/mineral/uranium
+ type = /obj/item/stack/material/uranium
res_amount = "uranium_amount"
if(ispath(type) && hasvar(linked_imprinter, res_amount))
- var/obj/item/stack/sheet/sheet = new type(linked_imprinter.loc)
+ var/obj/item/stack/material/sheet = new type(linked_imprinter.loc)
var/available_num_sheets = round(linked_imprinter.vars[res_amount]/sheet.perunit)
if(available_num_sheets>0)
sheet.amount = min(available_num_sheets, desired_num_sheets)
diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_crystal.dm b/code/modules/research/xenoarchaeology/artifact/artifact_crystal.dm
index 44f257060a..081683b044 100644
--- a/code/modules/research/xenoarchaeology/artifact/artifact_crystal.dm
+++ b/code/modules/research/xenoarchaeology/artifact/artifact_crystal.dm
@@ -20,17 +20,17 @@
/obj/structure/crystal/Destroy()
src.visible_message("\red[src] shatters!")
if(prob(75))
- new /obj/item/weapon/shard/phoron(src.loc)
+ new /obj/item/weapon/material/shard/phoron(src.loc)
if(prob(50))
- new /obj/item/weapon/shard/phoron(src.loc)
+ new /obj/item/weapon/material/shard/phoron(src.loc)
if(prob(25))
- new /obj/item/weapon/shard/phoron(src.loc)
+ new /obj/item/weapon/material/shard/phoron(src.loc)
if(prob(75))
- new /obj/item/weapon/shard(src.loc)
+ new /obj/item/weapon/material/shard(src.loc)
if(prob(50))
- new /obj/item/weapon/shard(src.loc)
+ new /obj/item/weapon/material/shard(src.loc)
if(prob(25))
- new /obj/item/weapon/shard(src.loc)
+ new /obj/item/weapon/material/shard(src.loc)
..()
//todo: laser_act
diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm b/code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm
index 8e6097a39b..66b5f7dc7d 100644
--- a/code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm
+++ b/code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm
@@ -43,17 +43,17 @@
/obj/item/weapon/autopsy_scanner,\
/obj/item/weapon/bikehorn,\
/obj/item/weapon/bonesetter,\
- /obj/item/weapon/butch,\
+ /obj/item/weapon/material/knife/butch,\
/obj/item/weapon/caution,\
/obj/item/weapon/caution/cone,\
/obj/item/weapon/crowbar,\
/obj/item/weapon/clipboard,\
/obj/item/weapon/cell,\
/obj/item/weapon/circular_saw,\
- /obj/item/weapon/hatchet,\
+ /obj/item/weapon/material/hatchet,\
/obj/item/weapon/handcuffs,\
/obj/item/weapon/hemostat,\
- /obj/item/weapon/kitchenknife,\
+ /obj/item/weapon/material/knife,\
/obj/item/weapon/flame/lighter,\
/obj/item/weapon/light/bulb,\
/obj/item/weapon/light/tube,\
diff --git a/code/modules/research/xenoarchaeology/finds/finds.dm b/code/modules/research/xenoarchaeology/finds/finds.dm
index 7c1a238083..e4520e1378 100644
--- a/code/modules/research/xenoarchaeology/finds/finds.dm
+++ b/code/modules/research/xenoarchaeology/finds/finds.dm
@@ -136,11 +136,11 @@
if(3)
item_type = "[pick("fork","spoon","knife")]"
if(prob(25))
- new_item = new /obj/item/weapon/kitchen/utensil/fork(src.loc)
+ new_item = new /obj/item/weapon/material/kitchen/utensil/fork(src.loc)
else if(prob(50))
- new_item = new /obj/item/weapon/kitchen/utensil/knife(src.loc)
+ new_item = new /obj/item/weapon/material/kitchen/utensil/knife(src.loc)
else
- new_item = new /obj/item/weapon/kitchen/utensil/spoon(src.loc)
+ new_item = new /obj/item/weapon/material/kitchen/utensil/spoon(src.loc)
additional_desc = "[pick("It's like no [item_type] you've ever seen before",\
"It's a mystery how anyone is supposed to eat with this",\
"You wonder what the creator's mouth was shaped like")]."
@@ -167,7 +167,7 @@
"You wonder what kind of music was made with it")]."
if(6)
item_type = "[pick("bladed knife","serrated blade","sharp cutting implement")]"
- new_item = new /obj/item/weapon/kitchenknife(src.loc)
+ new_item = new /obj/item/weapon/material/knife(src.loc)
additional_desc = "[pick("It doesn't look safe.",\
"It looks wickedly jagged",\
"There appear to be [pick("dark red","dark purple","dark green","dark blue")] stains along the edges")]."
@@ -236,16 +236,16 @@
if(14)
apply_material_decorations = 0
var/list/possible_spawns = list()
- possible_spawns += /obj/item/stack/sheet/metal
- possible_spawns += /obj/item/stack/sheet/plasteel
- possible_spawns += /obj/item/stack/sheet/glass
- possible_spawns += /obj/item/stack/sheet/glass/reinforced
- possible_spawns += /obj/item/stack/sheet/mineral/phoron
- possible_spawns += /obj/item/stack/sheet/mineral/gold
- possible_spawns += /obj/item/stack/sheet/mineral/silver
- possible_spawns += /obj/item/stack/sheet/mineral/enruranium
- possible_spawns += /obj/item/stack/sheet/mineral/sandstone
- possible_spawns += /obj/item/stack/sheet/mineral/silver
+ possible_spawns += /obj/item/stack/material/steel
+ possible_spawns += /obj/item/stack/material/plasteel
+ possible_spawns += /obj/item/stack/material/glass
+ possible_spawns += /obj/item/stack/material/glass/reinforced
+ possible_spawns += /obj/item/stack/material/phoron
+ possible_spawns += /obj/item/stack/material/gold
+ possible_spawns += /obj/item/stack/material/silver
+ possible_spawns += /obj/item/stack/material/uranium
+ possible_spawns += /obj/item/stack/material/sandstone
+ possible_spawns += /obj/item/stack/material/silver
var/new_type = pick(possible_spawns)
new_item = new new_type(src.loc)
@@ -294,7 +294,7 @@
new_item.desc = ""
if(19)
apply_prefix = 0
- new_item = new /obj/item/weapon/claymore(src.loc)
+ new_item = new /obj/item/weapon/material/sword(src.loc)
new_item.force = 10
item_type = new_item.name
if(20)
@@ -315,9 +315,9 @@
apply_material_decorations = 0
if(22)
if(prob(50))
- new_item = new /obj/item/weapon/shard(src.loc)
+ new_item = new /obj/item/weapon/material/shard(src.loc)
else
- new_item = new /obj/item/weapon/shard/phoron(src.loc)
+ new_item = new /obj/item/weapon/material/shard/phoron(src.loc)
apply_prefix = 0
apply_image_decorations = 0
apply_material_decorations = 0
@@ -337,7 +337,7 @@
apply_material_decorations = 0
if(25)
apply_prefix = 0
- new_item = new /obj/item/weapon/katana(src.loc)
+ new_item = new /obj/item/weapon/material/sword/katana(src.loc)
new_item.force = 10
item_type = new_item.name
if(26)
diff --git a/code/modules/research/xenoarchaeology/tools/tools_pickaxe.dm b/code/modules/research/xenoarchaeology/tools/tools_pickaxe.dm
index 1762cfbb0d..e8bedc0987 100644
--- a/code/modules/research/xenoarchaeology/tools/tools_pickaxe.dm
+++ b/code/modules/research/xenoarchaeology/tools/tools_pickaxe.dm
@@ -107,7 +107,7 @@
icon_state = "excavation"
desc = "A set of picks for excavation."
item_state = "syringe_kit"
- foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
+ foldable = /obj/item/stack/material/cardboard //BubbleWrap
storage_slots = 7
w_class = 2
can_hold = list(/obj/item/weapon/pickaxe/brush,\
diff --git a/code/modules/surgery/brainrepair.dm b/code/modules/surgery/brainrepair.dm
index 60fdffe31d..6935b09d24 100644
--- a/code/modules/surgery/brainrepair.dm
+++ b/code/modules/surgery/brainrepair.dm
@@ -6,7 +6,7 @@
allowed_tools = list(
/obj/item/weapon/hemostat = 100, \
/obj/item/weapon/wirecutters = 75, \
- /obj/item/weapon/kitchen/utensil/fork = 20
+ /obj/item/weapon/material/kitchen/utensil/fork = 20
)
priority = 3
diff --git a/code/modules/surgery/encased.dm b/code/modules/surgery/encased.dm
index fedf5bbc1c..8e1a516384 100644
--- a/code/modules/surgery/encased.dm
+++ b/code/modules/surgery/encased.dm
@@ -18,7 +18,7 @@
/datum/surgery_step/open_encased/saw
allowed_tools = list(
/obj/item/weapon/circular_saw = 100, \
- /obj/item/weapon/hatchet = 75
+ /obj/item/weapon/material/hatchet = 75
)
min_duration = 50
diff --git a/code/modules/surgery/eye.dm b/code/modules/surgery/eye.dm
index edc1c54c67..7b69fea7ff 100644
--- a/code/modules/surgery/eye.dm
+++ b/code/modules/surgery/eye.dm
@@ -20,8 +20,8 @@
/datum/surgery_step/eye/cut_open
allowed_tools = list(
/obj/item/weapon/scalpel = 100, \
- /obj/item/weapon/kitchenknife = 75, \
- /obj/item/weapon/shard = 50, \
+ /obj/item/weapon/material/knife = 75, \
+ /obj/item/weapon/material/shard = 50, \
)
min_duration = 90
@@ -52,7 +52,7 @@
/datum/surgery_step/eye/lift_eyes
allowed_tools = list(
/obj/item/weapon/retractor = 100, \
- /obj/item/weapon/kitchen/utensil/fork = 50
+ /obj/item/weapon/material/kitchen/utensil/fork = 50
)
min_duration = 30
diff --git a/code/modules/surgery/face.dm b/code/modules/surgery/face.dm
index e25291eba5..0a42f7c137 100644
--- a/code/modules/surgery/face.dm
+++ b/code/modules/surgery/face.dm
@@ -17,8 +17,8 @@
/datum/surgery_step/generic/cut_face
allowed_tools = list(
/obj/item/weapon/scalpel = 100, \
- /obj/item/weapon/kitchenknife = 75, \
- /obj/item/weapon/shard = 50, \
+ /obj/item/weapon/material/knife = 75, \
+ /obj/item/weapon/material/shard = 50, \
)
min_duration = 90
@@ -76,7 +76,7 @@
allowed_tools = list(
/obj/item/weapon/retractor = 100, \
/obj/item/weapon/crowbar = 55, \
- /obj/item/weapon/kitchen/utensil/fork = 75)
+ /obj/item/weapon/material/kitchen/utensil/fork = 75)
min_duration = 80
max_duration = 100
diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm
index f6352f6b74..c1e51d9c4d 100644
--- a/code/modules/surgery/generic.dm
+++ b/code/modules/surgery/generic.dm
@@ -110,8 +110,8 @@
/datum/surgery_step/generic/cut_open
allowed_tools = list(
/obj/item/weapon/scalpel = 100, \
- /obj/item/weapon/kitchenknife = 75, \
- /obj/item/weapon/shard = 50, \
+ /obj/item/weapon/material/knife = 75, \
+ /obj/item/weapon/material/shard = 50, \
)
min_duration = 90
@@ -185,7 +185,7 @@
allowed_tools = list(
/obj/item/weapon/retractor = 100, \
/obj/item/weapon/crowbar = 75, \
- /obj/item/weapon/kitchen/utensil/fork = 50
+ /obj/item/weapon/material/kitchen/utensil/fork = 50
)
min_duration = 30
@@ -276,7 +276,7 @@
/datum/surgery_step/generic/amputate
allowed_tools = list(
/obj/item/weapon/circular_saw = 100, \
- /obj/item/weapon/hatchet = 75
+ /obj/item/weapon/material/hatchet = 75
)
min_duration = 110
diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm
index f660061ccc..95980d5252 100644
--- a/code/modules/surgery/implant.dm
+++ b/code/modules/surgery/implant.dm
@@ -150,7 +150,7 @@
allowed_tools = list(
/obj/item/weapon/hemostat = 100, \
/obj/item/weapon/wirecutters = 75, \
- /obj/item/weapon/kitchen/utensil/fork = 20
+ /obj/item/weapon/material/kitchen/utensil/fork = 20
)
min_duration = 80
diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm
index 182c3eac2a..a97184f35c 100644
--- a/code/modules/surgery/organs_internal.dm
+++ b/code/modules/surgery/organs_internal.dm
@@ -19,7 +19,7 @@
allowed_tools = list(
/obj/item/weapon/hemostat = 100, \
/obj/item/weapon/wirecutters = 75, \
- /obj/item/weapon/kitchen/utensil/fork = 20
+ /obj/item/weapon/material/kitchen/utensil/fork = 20
)
blood_level = 2
@@ -211,8 +211,8 @@
allowed_tools = list(
/obj/item/weapon/scalpel = 100, \
- /obj/item/weapon/kitchenknife = 75, \
- /obj/item/weapon/shard = 50, \
+ /obj/item/weapon/material/knife = 75, \
+ /obj/item/weapon/material/shard = 50, \
)
min_duration = 90
@@ -267,7 +267,7 @@
allowed_tools = list(
/obj/item/weapon/hemostat = 100, \
/obj/item/weapon/wirecutters = 75, \
- /obj/item/weapon/kitchen/utensil/fork = 20
+ /obj/item/weapon/material/kitchen/utensil/fork = 20
)
min_duration = 60
@@ -447,8 +447,8 @@
// /datum/surgery_step/ribcage/heart/cut
// allowed_tools = list(
// /obj/item/weapon/scalpel = 100, \
-// /obj/item/weapon/kitchenknife = 75, \
-// /obj/item/weapon/shard = 50, \
+// /obj/item/weapon/material/knife = 75, \
+// /obj/item/weapon/material/shard = 50, \
// )
// min_duration = 30
diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm
index f81baa4468..50e6c3bcfb 100644
--- a/code/modules/surgery/other.dm
+++ b/code/modules/surgery/other.dm
@@ -56,8 +56,8 @@
priority = 2
allowed_tools = list(
/obj/item/weapon/scalpel = 100, \
- /obj/item/weapon/kitchenknife = 75, \
- /obj/item/weapon/shard = 50, \
+ /obj/item/weapon/material/knife = 75, \
+ /obj/item/weapon/material/shard = 50, \
)
can_infect = 1
diff --git a/code/modules/surgery/slimes.dm b/code/modules/surgery/slimes.dm
index 048c6d3e3c..3d9865c511 100644
--- a/code/modules/surgery/slimes.dm
+++ b/code/modules/surgery/slimes.dm
@@ -12,8 +12,8 @@
/datum/surgery_step/slime/cut_flesh
allowed_tools = list(
/obj/item/weapon/scalpel = 100, \
- /obj/item/weapon/kitchenknife = 75, \
- /obj/item/weapon/shard = 50, \
+ /obj/item/weapon/material/knife = 75, \
+ /obj/item/weapon/material/shard = 50, \
)
min_duration = 30
@@ -38,8 +38,8 @@
/datum/surgery_step/slime/cut_innards
allowed_tools = list(
/obj/item/weapon/scalpel = 100, \
- /obj/item/weapon/kitchenknife = 75, \
- /obj/item/weapon/shard = 50, \
+ /obj/item/weapon/material/knife = 75, \
+ /obj/item/weapon/material/shard = 50, \
)
min_duration = 30
@@ -64,7 +64,7 @@
/datum/surgery_step/slime/saw_core
allowed_tools = list(
/obj/item/weapon/circular_saw = 100, \
- /obj/item/weapon/hatchet = 75
+ /obj/item/weapon/material/hatchet = 75
)
min_duration = 50
diff --git a/code/modules/tables/interactions.dm b/code/modules/tables/interactions.dm
index 980227db8c..13350ee1d8 100644
--- a/code/modules/tables/interactions.dm
+++ b/code/modules/tables/interactions.dm
@@ -89,7 +89,7 @@
playsound(loc, 'sound/weapons/tablehit1.ogg', 50, 1)
var/list/L = take_damage(rand(1,5))
// Shards. Extra damage, plus potentially the fact YOU LITERALLY HAVE A PIECE OF GLASS/METAL/WHATEVER IN YOUR FACE
- for(var/obj/item/weapon/shard/S in L)
+ for(var/obj/item/weapon/material/shard/S in L)
if(prob(50))
M.visible_message("\The [S] slices [M]'s face messily!",
"\The [S] slices your face messily!")
diff --git a/code/modules/tables/presets.dm b/code/modules/tables/presets.dm
index 5f009e7e88..e52dac3bd6 100644
--- a/code/modules/tables/presets.dm
+++ b/code/modules/tables/presets.dm
@@ -7,6 +7,20 @@
material = get_material_by_name(DEFAULT_WALL_MATERIAL)
..()
+ plastic
+ icon_state = "plain_preview"
+ color = "#EEEEEE"
+ New()
+ material = get_material_by_name("plastic")
+ ..()
+
+ marble
+ icon_state = "stone_preview"
+ color = "#CCCCCC"
+ New()
+ material = get_material_by_name("marble")
+ ..()
+
reinforced
icon_state = "reinf_preview"
color = "#666666"
diff --git a/code/modules/tables/tables.dm b/code/modules/tables/tables.dm
index 88042181a1..1ee34e9d80 100644
--- a/code/modules/tables/tables.dm
+++ b/code/modules/tables/tables.dm
@@ -1,5 +1,3 @@
-
-
/obj/structure/table
name = "table frame"
icon = 'icons/obj/tables.dmi'
@@ -22,7 +20,7 @@
var/material/material = null
var/material/reinforced = null
- // Gambling tables. I'd prefer reinforced with carpet/felt/cloth/whatever, but AFAIK it's either harder or impossible to get /obj/item/stack/sheet of those.
+ // Gambling tables. I'd prefer reinforced with carpet/felt/cloth/whatever, but AFAIK it's either harder or impossible to get /obj/item/stack/material of those.
// Convert if/when you can easily get stacks of these.
var/carpeted = 0
@@ -148,7 +146,7 @@
health = max(health+(maxhealth/5), maxhealth) // 20% repair per application
return 1
- if(!material && can_plate && istype(W, /obj/item/stack/sheet))
+ if(!material && can_plate && istype(W, /obj/item/stack/material))
material = common_material_add(W, user, "plat")
if(material)
update_connections(1)
@@ -159,13 +157,13 @@
return ..()
-/obj/structure/table/MouseDrop_T(obj/item/stack/sheet/what)
+/obj/structure/table/MouseDrop_T(obj/item/stack/material/what)
if(can_reinforce && isliving(usr) && (!usr.stat) && istype(what) && usr.get_active_hand() == what && Adjacent(usr))
reinforce_table(what, usr)
else
return ..()
-/obj/structure/table/proc/reinforce_table(obj/item/stack/sheet/S, mob/user)
+/obj/structure/table/proc/reinforce_table(obj/item/stack/material/S, mob/user)
if(reinforced)
user << "\The [src] is already reinforced!"
return
@@ -197,8 +195,8 @@
desc = initial(desc)
// Returns the material to set the table to.
-/obj/structure/table/proc/common_material_add(obj/item/stack/sheet/S, mob/user, verb) // Verb is actually verb without 'e' or 'ing', which is added. Works for 'plate'/'plating' and 'reinforce'/'reinforcing'.
- var/material/M = name_to_material[S.sheettype]
+/obj/structure/table/proc/common_material_add(obj/item/stack/material/S, mob/user, verb) // Verb is actually verb without 'e' or 'ing', which is added. Works for 'plate'/'plating' and 'reinforce'/'reinforcing'.
+ var/material/M = name_to_material[S.default_type]
if(!istype(M))
user << "You cannot [verb]e \the [src] with \the [S]."
return null
@@ -251,11 +249,11 @@
return
user.visible_message("\The [user] dismantles \the [src].",
"You dismantle \the [src].")
- new /obj/item/stack/sheet/metal(src.loc)
+ new /obj/item/stack/material/steel(src.loc)
qdel(src)
return
-// Returns a list of /obj/item/weapon/shard objects that were created as a result of this table's breakage.
+// Returns a list of /obj/item/weapon/material/shard objects that were created as a result of this table's breakage.
// Used for !fun! things such as embedding shards in the faces of tableslammed people.
// The repeated
@@ -265,7 +263,7 @@
/obj/structure/table/proc/break_to_parts(full_return = 0)
var/list/shards = list()
- var/obj/item/weapon/shard/S = null
+ var/obj/item/weapon/material/shard/S = null
if(reinforced)
if(reinforced.stack_type && (full_return || prob(20)))
reinforced.place_sheet(loc)
@@ -281,7 +279,7 @@
if(carpeted && (full_return || prob(50))) // Higher chance to get the carpet back intact, since there's no non-intact option
new /obj/item/stack/tile/carpet(src.loc)
if(full_return || prob(20))
- new /obj/item/stack/sheet/metal(src.loc)
+ new /obj/item/stack/material/steel(src.loc)
else
var/material/M = get_material_by_name(DEFAULT_WALL_MATERIAL)
S = M.place_shard(loc)
diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm
index 9407dc937a..556e82cd0c 100644
--- a/code/modules/vehicles/vehicle.dm
+++ b/code/modules/vehicles/vehicle.dm
@@ -149,7 +149,7 @@
/obj/vehicle/emp_act(severity)
var/was_on = on
stat |= EMPED
- var/obj/effect/overlay/pulse2 = PoolOrNew(new/obj/effect/overlay, src.loc)
+ var/obj/effect/overlay/pulse2 = PoolOrNew(/obj/effect/overlay, src.loc)
pulse2.icon = 'icons/effects/effects.dmi'
pulse2.icon_state = "empdisable"
pulse2.name = "emp sparks"
@@ -363,6 +363,7 @@
return
visible_message("[user] [attack_message] the [src]!")
user.attack_log += text("\[[time_stamp()]\] attacked [src.name]")
+ user.do_attack_animation(src)
src.health -= damage
if(prob(10))
new /obj/effect/decal/cleanable/blood/oil(src.loc)
diff --git a/code/setup.dm b/code/setup.dm
index b8eb28e864..cbd079c9a5 100644
--- a/code/setup.dm
+++ b/code/setup.dm
@@ -137,17 +137,17 @@
#define PHORON_FLASHPOINT (T0C + 246) //519 K - autoignite temperature in air if that ever gets implemented.
//These control the mole ratio of oxidizer and fuel used in the combustion reaction
-#define FIRE_REACTION_OXIDIZER_AMOUNT 3
+#define FIRE_REACTION_OXIDIZER_AMOUNT 3 //should be greater than the fuel amount if fires are going to spread much
#define FIRE_REACTION_FUEL_AMOUNT 2
//These control the speed at which fire burns
#define FIRE_GAS_BURNRATE_MULT 1
-#define FIRE_LIQUID_BURNRATE_MULT 0.5
+#define FIRE_LIQUID_BURNRATE_MULT 1
//If the fire is burning slower than this rate then the reaction is going too slow to be self sustaining and the fire burns itself out.
//This ensures that fires don't grind to a near-halt while still remaining active forever.
-#define FIRE_GAS_MIN_BURNRATE 0.1
-#define FIRE_LIQUD_MIN_BURNRATE 0.05
+#define FIRE_GAS_MIN_BURNRATE 0.01
+#define FIRE_LIQUD_MIN_BURNRATE 0.01
//How many moles of fuel are contained within one solid/liquid fuel volume unit
#define LIQUIDFUEL_AMOUNT_TO_MOL 1 //mol/volume unit
diff --git a/html/changelog.html b/html/changelog.html
index 6cc3c3bc31..0aadb8c879 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -56,6 +56,36 @@
-->
+
22 May 2015
+
Ccomp5950 updated:
+
+ - Beepsky no longer kills goats.
+ - Goats will move towards vines that are 4 spaces away now instead of 1
+ - Goats will eat the spawning plants for vines as well as the vines themselves.
+
+
Chinsky updated:
+
+ - Ghetto diagnosis. Grab patient, aim at bodypart you want to check, click on them with help intent. This will tell you about their wounds, fractures and other oddities (toxins/oxygen) for that bodypart.
+ - Fractures are visible on very damaged limbs. Dislocations are always visible. Surgery incisions now visible too.
+ - Stethoscopes actually make sense now. They care for heart/lungs status when reporting pulse and respiration now.
+
+
HarpyEagle updated:
+
+ - Re-implemented fuel fires. Tweaked fire behaviour overall.
+
+
Yoshax updated:
+
+ - Bear traps now do damage when stood on, enough to break bones! Bear traps can now affect any limb of a person who is on the ground, including head! Bear traps are no longer legcuffs and instead embed in the limb they attack.
+ - Bear traps now take several seconds to deploy and cannot be picked up when armed, they must be disarmed by clicking on them. They also cannot be moved then they are deployed.
+
+
Zuhayr updated:
+
+ - Massive material refactor. Walls, beds, chairs, stools, tables, ashtrays, knives, baseball bats, axes, simple doors, barricades, so on.
+ - Tables are now built via steel then another sheet on the resulting frame. They can then be reinforced by dragging a stack of sheets onto the table.
+ - Walls are built with steel for girders, then right-click the girder and select the reinforce verb while holding a stack, then click the girders with a final sheet.
+ - Various things can be built with various sheet types. Experiment! Just keep in mind that uranium is now radioactive and phoron is now flammable.
+
+
18 May 2015
Hubblenaut updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index a0bf108e0e..25b2ca7dc7 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -1816,3 +1816,35 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- rscadd: Turf are now processed. This, for example, causes radioactive walls to
regularly irradiate nearby mobs.
- bugfix: Welders should now always update their icon and inhand states properly.
+2015-05-22:
+ Ccomp5950:
+ - bugfix: Beepsky no longer kills goats.
+ - tweak: Goats will move towards vines that are 4 spaces away now instead of 1
+ - bugfix: Goats will eat the spawning plants for vines as well as the vines themselves.
+ Chinsky:
+ - rscadd: Ghetto diagnosis. Grab patient, aim at bodypart you want to check, click
+ on them with help intent. This will tell you about their wounds, fractures and
+ other oddities (toxins/oxygen) for that bodypart.
+ - rscadd: Fractures are visible on very damaged limbs. Dislocations are always visible.
+ Surgery incisions now visible too.
+ - rscadd: Stethoscopes actually make sense now. They care for heart/lungs status
+ when reporting pulse and respiration now.
+ HarpyEagle:
+ - rscadd: Re-implemented fuel fires. Tweaked fire behaviour overall.
+ Yoshax:
+ - tweak: Bear traps now do damage when stood on, enough to break bones! Bear traps
+ can now affect any limb of a person who is on the ground, including head! Bear
+ traps are no longer legcuffs and instead embed in the limb they attack.
+ - tweak: Bear traps now take several seconds to deploy and cannot be picked up when
+ armed, they must be disarmed by clicking on them. They also cannot be moved
+ then they are deployed.
+ Zuhayr:
+ - rscadd: Massive material refactor. Walls, beds, chairs, stools, tables, ashtrays,
+ knives, baseball bats, axes, simple doors, barricades, so on.
+ - rscadd: Tables are now built via steel then another sheet on the resulting frame.
+ They can then be reinforced by dragging a stack of sheets onto the table.
+ - rscadd: Walls are built with steel for girders, then right-click the girder and
+ select the reinforce verb while holding a stack, then click the girders with
+ a final sheet.
+ - rscadd: Various things can be built with various sheet types. Experiment! Just
+ keep in mind that uranium is now radioactive and phoron is now flammable.
diff --git a/html/changelogs/Ccomp5950-Goats.yml b/html/changelogs/Ccomp5950-Goats.yml
deleted file mode 100644
index be80867380..0000000000
--- a/html/changelogs/Ccomp5950-Goats.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: Ccomp5950
-delete-after: True
-
-changes:
- - bugfix: "Beepsky no longer kills goats."
- - tweak: "Goats will move towards vines that are 4 spaces away now instead of 1"
- - bugfix: "Goats will eat the spawning plants for vines as well as the vines themselves."
diff --git a/html/changelogs/Comma-PR-9337.yml b/html/changelogs/Comma-PR-9337.yml
deleted file mode 100644
index cf1aac2891..0000000000
--- a/html/changelogs/Comma-PR-9337.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-author: Chinsky
-
-delete-after: True
-
-changes:
- - rscadd: "Ghetto diagnosis. Grab patient, aim at bodypart you want to check, click on them with help intent. This will tell you about their wounds, fractures and other oddities (toxins/oxygen) for that bodypart."
- - rscadd: "Fractures are visible on very damaged limbs. Dislocations are always visible. Surgery incisions now visible too."
- - rscadd: "Stethoscopes actually make sense now. They care for heart/lungs status when reporting pulse and respiration now."
\ No newline at end of file
diff --git a/html/changelogs/PsiOmegaDelta-PulseCheck.yml b/html/changelogs/PsiOmegaDelta-PulseCheck.yml
new file mode 100644
index 0000000000..4bc80dd2af
--- /dev/null
+++ b/html/changelogs/PsiOmegaDelta-PulseCheck.yml
@@ -0,0 +1,6 @@
+author: PsiOmegaDelta
+delete-after: True
+
+changes:
+ - tweak: "Both the pulse taker and target must now remain still for the duration of the check or it will fail."
+
diff --git a/html/changelogs/Yoshax - trapping.YML b/html/changelogs/Yoshax - trapping.YML
deleted file mode 100644
index d9b7884761..0000000000
--- a/html/changelogs/Yoshax - trapping.YML
+++ /dev/null
@@ -1,37 +0,0 @@
-################################
-# Example Changelog File
-#
-# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
-#
-# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
-# When it is, any changes listed below will disappear.
-#
-# Valid Prefixes:
-# bugfix
-# wip (For works in progress)
-# tweak
-# soundadd
-# sounddel
-# rscadd (general adding of nice things)
-# rscdel (general deleting of nice things)
-# imageadd
-# imagedel
-# maptweak
-# spellcheck (typo fixes)
-# experiment
-#################################
-
-# Your name.
-author: Yoshax
-
-# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
-delete-after: True
-
-# Any changes you've made. See valid prefix list above.
-# INDENT WITH TWO SPACES. NOT TABS. SPACES.
-# SCREW THIS UP AND IT WON'T WORK.
-# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
-# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
-changes:
- - tweak: "Bear traps now do damage when stood on, enough to break bones! Bear traps can now affect any limb of a person who is on the ground, including head! Bear traps are no longer legcuffs and instead embed in the limb they attack."
- - tweak: "Bear traps now take several seconds to deploy and cannot be picked up when armed, they must be disarmed by clicking on them. They also cannot be moved then they are deployed."
\ No newline at end of file
diff --git a/icons/ashtray.dmi b/icons/ashtray.dmi
deleted file mode 100644
index 2a5ba56819..0000000000
Binary files a/icons/ashtray.dmi and /dev/null differ
diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi
index e10b6649de..89392d81f7 100644
Binary files a/icons/mob/robots.dmi and b/icons/mob/robots.dmi differ
diff --git a/icons/obj/doors/material_doors.dmi b/icons/obj/doors/material_doors.dmi
new file mode 100644
index 0000000000..da1780ff8b
Binary files /dev/null and b/icons/obj/doors/material_doors.dmi differ
diff --git a/icons/obj/doors/mineral_doors.dmi b/icons/obj/doors/mineral_doors.dmi
deleted file mode 100644
index 1613f466d5..0000000000
Binary files a/icons/obj/doors/mineral_doors.dmi and /dev/null differ
diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi
index 6d39c35541..1a9d80bb13 100644
Binary files a/icons/obj/kitchen.dmi and b/icons/obj/kitchen.dmi differ
diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi
index 390bd3c4ef..ac5c73a100 100644
Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ
diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi
index c3fdbcdb33..d947725e03 100644
Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ
diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi
index 67b9a67155..ecc8646cd8 100644
Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ
diff --git a/maps/exodus-1.dmm b/maps/exodus-1.dmm
index 9e54641cc1..0df4c6028c 100644
--- a/maps/exodus-1.dmm
+++ b/maps/exodus-1.dmm
@@ -15,7 +15,7 @@
"aao" = (/turf/simulated/floor/airless{icon_state = "damaged2"},/area/space)
"aap" = (/turf/simulated/floor/airless,/area/space)
"aaq" = (/obj/structure/grille/broken,/obj/structure/lattice,/turf/space,/area/space)
-"aar" = (/obj/structure/grille/broken,/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/airless{icon_state = "circuit"},/area/space)
+"aar" = (/obj/structure/grille/broken,/obj/item/weapon/material/shard{icon_state = "small"},/turf/simulated/floor/airless{icon_state = "circuit"},/area/space)
"aas" = (/obj/item/clothing/suit/ianshirt,/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/space)
"aat" = (/turf/simulated/wall/r_wall,/area/space)
"aau" = (/turf/space,/area/skipjack_station/northwest_solars)
@@ -254,7 +254,7 @@
"aeT" = (/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; frequency = 1475; listening = 1; name = "Station Intercom (Security)"; pixel_x = 30; pixel_y = 0},/obj/machinery/camera/network/security{c_tag = "Security - Briefing"; dir = 8},/turf/simulated/floor{dir = 2; icon_state = "redcorner"},/area/security/main)
"aeU" = (/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/security_port)
"aeV" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/security_port)
-"aeW" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/barricade/wooden,/turf/simulated/floor/plating,/area/maintenance/security_port)
+"aeW" = (/obj/structure/grille/broken,/obj/item/weapon/material/shard,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/security_port)
"aeX" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/warden)
"aeY" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{icon_state = "floorgrime"},/area/security/warden)
"aeZ" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor,/area/security/warden)
@@ -262,7 +262,7 @@
"afb" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "red"},/area/security/main)
"afc" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 1; name = "Security"; sortType = "Security"},/turf/simulated/floor{icon_state = "red"},/area/security/main)
"afd" = (/turf/simulated/floor{icon_state = "red"},/area/security/main)
-"afe" = (/obj/structure/grille/broken,/obj/item/weapon/shard,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/security_port)
+"afe" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/barricade,/turf/simulated/floor/plating,/area/maintenance/security_port)
"aff" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/security/main)
"afg" = (/obj/machinery/photocopier,/turf/simulated/floor{dir = 8; icon_state = "redcorner"},/area/security/main)
"afh" = (/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,/area/security/main)
@@ -297,8 +297,8 @@
"afK" = (/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod_berth{frequency = 1380; id_tag = "escape_pod_3_berth"; pixel_x = 25; pixel_y = 25; tag_door = "escape_pod_3_berth_hatch"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/security_starboard)
"afL" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/camera/network/security{c_tag = "Security - Equipment North"; dir = 4},/turf/simulated/floor,/area/security/main)
"afM" = (/obj/structure/table/standard,/obj/item/weapon/folder/red,/obj/item/weapon/folder/red,/obj/item/weapon/folder/blue,/obj/item/weapon/pen/blue{pixel_x = 4; pixel_y = 4},/obj/item/weapon/pen/red,/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office)
-"afN" = (/obj/item/weapon/stool,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "redfull"; dir = 9},/area/security/main)
-"afO" = (/obj/structure/disposalpipe/segment,/obj/item/weapon/stool,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "redfull"; dir = 9},/area/security/main)
+"afN" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/weapon/stool/padded,/turf/simulated/floor{icon_state = "redfull"; dir = 9},/area/security/main)
+"afO" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/weapon/stool/padded,/turf/simulated/floor{icon_state = "redfull"; dir = 9},/area/security/main)
"afP" = (/obj/structure/window/shuttle,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/escape_pod3/station)
"afQ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/security_port)
"afR" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/security_port)
@@ -400,7 +400,7 @@
"ahJ" = (/obj/structure/grille,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/window/reinforced/polarized{dir = 1},/obj/structure/window/reinforced/polarized,/obj/structure/window/reinforced/polarized{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/heads/hos)
"ahK" = (/turf/simulated/floor,/area/security/brig)
"ahL" = (/turf/simulated/floor{icon_state = "floorgrime"},/area/security/brig)
-"ahM" = (/obj/structure/table/standard,/obj/item/ashtray/plastic,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison)
+"ahM" = (/obj/structure/table/woodentable,/obj/item/weapon/material/ashtray/bronze,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/obj/item/device/taperecorder{pixel_x = -4; pixel_y = 2},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/carpet,/area/security/detectives_office)
"ahN" = (/obj/structure/closet/wardrobe/red,/obj/structure/window/reinforced,/obj/item/clothing/accessory/holster/waist,/obj/item/clothing/accessory/holster/waist,/obj/item/clothing/accessory/holster/waist,/obj/item/clothing/accessory/armband,/obj/item/clothing/accessory/armband,/obj/item/clothing/accessory/armband,/turf/simulated/floor,/area/security/main)
"ahO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/security/brig)
"ahP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/effect/decal/cleanable/blood/oil,/obj/item/trash/tastybread,/turf/simulated/floor/plating,/area/maintenance/security_starboard)
@@ -601,7 +601,7 @@
"alC" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/effect/landmark/start{name = "Detective"},/turf/simulated/floor/carpet,/area/security/detectives_office)
"alD" = (/turf/simulated/floor/carpet,/area/security/detectives_office)
"alE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/carpet,/area/security/detectives_office)
-"alF" = (/obj/structure/table/woodentable,/obj/item/ashtray/bronze,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/obj/item/device/taperecorder{pixel_x = -4; pixel_y = 2},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/carpet,/area/security/detectives_office)
+"alF" = (/obj/structure/table/woodentable,/obj/item/weapon/material/ashtray/bronze,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/obj/item/device/flash,/obj/item/weapon/handcuffs,/turf/simulated/floor/carpet,/area/security/detectives_office)
"alG" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/carpet,/area/security/detectives_office)
"alH" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/filingcabinet/chestdrawer,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office)
"alI" = (/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/obj/item/trash/raisins,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/security_starboard)
@@ -637,7 +637,7 @@
"amm" = (/obj/structure/closet/lawcloset,/obj/item/clothing/glasses/sunglasses/big,/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice)
"amn" = (/obj/item/weapon/storage/secure/safe{pixel_x = -23},/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/obj/item/device/taperecorder{pixel_x = -4; pixel_y = 2},/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office)
"amo" = (/obj/machinery/door/window/brigdoor{dir = 1; id = "Cell 3"; name = "Cell 3"; req_access = list(2)},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/security/brig)
-"amp" = (/obj/structure/table/woodentable,/obj/item/ashtray/bronze,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/obj/item/device/flash,/obj/item/weapon/handcuffs,/turf/simulated/floor/carpet,/area/security/detectives_office)
+"amp" = (/obj/structure/table/reinforced,/obj/item/weapon/pen/blue{pixel_x = -5; pixel_y = -1},/obj/item/weapon/pen/red{pixel_x = -1; pixel_y = 3},/obj/item/weapon/material/ashtray/plastic{pixel_x = 4; pixel_y = 6},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice)
"amq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/security/detectives_office)
"amr" = (/obj/item/weapon/storage/secure/safe{pixel_x = 35; pixel_y = 5},/turf/simulated/floor{icon_state = "grimy"},/area/security/detectives_office)
"ams" = (/obj/machinery/door/airlock/glass_security{id_tag = "prisonexit"; name = "Brig Exit"; req_access = list(2)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "red"; dir = 4},/area/security/prison)
@@ -703,7 +703,7 @@
"anA" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/security/lobby)
"anB" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/security/lobby)
"anC" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "redcorner"; dir = 4},/area/security/lobby)
-"anD" = (/obj/structure/table/reinforced,/obj/item/weapon/pen/blue{pixel_x = -5; pixel_y = -1},/obj/item/weapon/pen/red{pixel_x = -1; pixel_y = 3},/obj/item/ashtray/plastic{pixel_x = 4; pixel_y = 6},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice)
+"anD" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/table/reinforced,/obj/item/weapon/pen/blue{pixel_x = -5; pixel_y = -1},/obj/item/weapon/pen/red{pixel_x = -1; pixel_y = 3},/obj/item/weapon/material/ashtray/plastic{pixel_x = 4; pixel_y = 6},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice)
"anE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice)
"anF" = (/obj/structure/table/reinforced,/obj/machinery/photocopier/faxmachine{anchored = 0; department = "Internal Affairs"},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice)
"anG" = (/turf/simulated/wall/r_wall,/area/security/detectives_office)
@@ -840,7 +840,7 @@
"aqh" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice)
"aqi" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice)
"aqj" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice)
-"aqk" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/table/reinforced,/obj/item/weapon/pen/blue{pixel_x = -5; pixel_y = -1},/obj/item/weapon/pen/red{pixel_x = -1; pixel_y = 3},/obj/item/ashtray/plastic{pixel_x = 4; pixel_y = 6},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice)
+"aqk" = (/obj/structure/table/standard,/obj/item/weapon/material/ashtray/plastic,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison)
"aql" = (/obj/machinery/computer/med_data,/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office)
"aqm" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 1; frequency = 1443; icon_state = "on"; id = "air_in"; use_power = 1},/obj/structure/bed/chair,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/security/prison)
"aqn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor{icon_state = "white"},/area/security/detectives_office)
@@ -1144,7 +1144,7 @@
"avZ" = (/obj/machinery/light/small,/obj/structure/mopbucket,/obj/item/weapon/mop,/turf/simulated/floor{icon_state = "freezerfloor"},/area/security/prison)
"awa" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/mirror{pixel_x = 30},/obj/item/weapon/soap/nanotrasen,/turf/simulated/floor{icon_state = "freezerfloor"},/area/security/prison)
"awb" = (/obj/structure/table/standard,/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Port - East"; dir = 1},/turf/simulated/floor,/area/hallway/primary/port)
-"awc" = (/obj/structure/table/standard,/obj/item/weapon/hatchet,/obj/item/weapon/minihoe,/turf/simulated/floor{icon_state = "green"; dir = 8},/area/hydroponics)
+"awc" = (/obj/structure/table/standard,/obj/item/weapon/material/minihoe,/obj/item/device/analyzer/plant_analyzer,/obj/item/clothing/head/greenbandana,/turf/simulated/floor,/area/security/prison)
"awd" = (/obj/machinery/door/airlock/external{frequency = 1331; icon_state = "door_locked"; id_tag = "nuke_shuttle_dock_outer"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1331; master_tag = "nuke_shuttle_dock_airlock"; name = "exterior access button"; pixel_x = -5; pixel_y = -26; req_one_access = list(13)},/turf/simulated/floor/plating,/area/hallway/secondary/entry/port)
"awe" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor,/area/security/prison)
"awf" = (/obj/item/weapon/stool,/turf/simulated/floor{icon_state = "blue"; dir = 4},/area/crew_quarters/fitness)
@@ -1179,7 +1179,7 @@
"awI" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/hallway/secondary/entry/fore)
"awJ" = (/obj/structure/closet,/obj/item/weapon/storage/backpack,/turf/simulated/floor/plating,/area/maintenance/arrivals)
"awK" = (/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plating,/area/maintenance/substation/security)
-"awL" = (/obj/item/weapon/stool{pixel_y = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/crew_quarters/sleep)
+"awL" = (/obj/item/weapon/stool/padded,/turf/simulated/floor,/area/crew_quarters/sleep)
"awM" = (/obj/machinery/door/airlock{name = "Brig Restroom"},/turf/simulated/floor,/area/security/prison)
"awN" = (/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/turf/simulated/floor/plating,/area/maintenance/arrivals)
"awO" = (/obj/structure/table/reinforced,/obj/machinery/door/blast/shutters{dir = 2; id = "bar"; layer = 3.1; name = "Bar Shutters"},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar)
@@ -1209,8 +1209,8 @@
"axm" = (/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/fitness)
"axn" = (/obj/structure/window/basic{dir = 1},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/fitness)
"axo" = (/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/fitness)
-"axp" = (/obj/item/weapon/stool{pixel_y = 8},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/crew_quarters/sleep)
-"axq" = (/obj/item/weapon/stool{pixel_y = 8},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor,/area/crew_quarters/sleep)
+"axp" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/stool/padded,/turf/simulated/floor,/area/crew_quarters/sleep)
+"axq" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/weapon/stool/padded,/turf/simulated/floor,/area/crew_quarters/sleep)
"axr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/crew_quarters/fitness)
"axs" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/crew_quarters/fitness)
"axt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor,/area/crew_quarters/fitness)
@@ -1254,8 +1254,8 @@
"ayf" = (/turf/simulated/floor{dir = 4; icon_state = "escapecorner"},/area/crew_quarters/fitness)
"ayg" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{icon_state = "whitehall"; dir = 1},/area/crew_quarters/fitness)
"ayh" = (/turf/simulated/floor{icon_state = "whitehall"; dir = 1},/area/crew_quarters/fitness)
-"ayi" = (/obj/item/weapon/stool{pixel_y = 8},/turf/simulated/floor,/area/crew_quarters/sleep)
-"ayj" = (/obj/item/weapon/stool{pixel_y = 8},/turf/simulated/floor{icon_state = "neutralcorner"; dir = 2},/area/crew_quarters/sleep)
+"ayi" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/item/weapon/stool/padded,/turf/simulated/floor,/area/crew_quarters/sleep)
+"ayj" = (/obj/item/weapon/stool/padded,/turf/simulated/floor{icon_state = "neutralcorner"; dir = 2},/area/crew_quarters/sleep)
"ayk" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/crew_quarters/fitness)
"ayl" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "neutralcorner"},/area/crew_quarters/fitness)
"aym" = (/turf/simulated/floor/airless{icon_state = "catwalk12"},/area/space)
@@ -1398,7 +1398,7 @@
"aAT" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/ai_monitored/storage/eva)
"aAU" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva)
"aAV" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva)
-"aAW" = (/obj/structure/table/reinforced,/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva)
+"aAW" = (/obj/structure/table/reinforced,/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva)
"aAX" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/ai_monitored/storage/eva)
"aAY" = (/turf/simulated/floor/carpet{tag = "icon-carpet3-0"; icon_state = "carpet3-0"},/area/crew_quarters/sleep/bedrooms)
"aAZ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/crew_quarters/fitness)
@@ -1489,7 +1489,7 @@
"aCG" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 8},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/arrivals)
"aCH" = (/obj/structure/table/standard,/obj/machinery/recharger{pixel_y = 0},/turf/simulated/floor,/area/storage/primary)
"aCI" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
-"aCJ" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor{icon_state = "green"; dir = 8},/area/hydroponics)
+"aCJ" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/table/reinforced,/obj/item/stack/rods{amount = 50},/obj/machinery/camera/network/security{c_tag = "EVA Northeast"; dir = 8},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva)
"aCK" = (/turf/simulated/wall,/area/storage/primary)
"aCL" = (/obj/machinery/door/airlock{name = "Unisex Showers"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
"aCM" = (/turf/simulated/wall/r_wall,/area/storage/primary)
@@ -1520,17 +1520,17 @@
"aDl" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/item/weapon/bikehorn/rubberducky,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
"aDm" = (/obj/machinery/vending/coffee,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"aDn" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 6; icon_state = "intact"; tag = "icon-intact-f (SOUTHEAST)"},/mob/living/simple_animal/mouse,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/arrivals)
-"aDo" = (/obj/structure/table/standard,/obj/structure/window/basic{dir = 4},/turf/simulated/floor,/area/security/vacantoffice)
+"aDo" = (/obj/structure/table/reinforced,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva)
"aDp" = (/turf/simulated/wall,/area/crew_quarters/bar)
"aDq" = (/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/bar)
"aDr" = (/obj/item/weapon/stool{pixel_y = 8},/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor,/area/storage/primary)
"aDs" = (/turf/simulated/wall,/area/maintenance/bar)
-"aDt" = (/obj/structure/closet/crate,/obj/item/stack/sheet/mineral/gold,/obj/item/stack/sheet/mineral/gold,/obj/item/stack/sheet/mineral/gold,/obj/item/stack/sheet/mineral/gold,/obj/item/stack/sheet/mineral/gold,/obj/item/weapon/storage/belt/champion,/turf/simulated/floor{icon_state = "vault"; dir = 1},/area/security/nuke_storage)
+"aDt" = (/obj/structure/closet/crate,/obj/item/stack/material/gold,/obj/item/weapon/storage/belt/champion,/turf/simulated/floor{icon_state = "vault"; dir = 1},/area/security/nuke_storage)
"aDu" = (/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/power/smes/buildable{charge = 0; RCon_tag = "Substation - Civilian East"},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/substation/civilian_east)
"aDv" = (/obj/machinery/power/breakerbox/activated{RCon_tag = "Civilian East Substation Bypass"},/turf/simulated/floor/plating,/area/maintenance/substation/civilian_east)
"aDw" = (/obj/structure/cable/green,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/plating,/area/maintenance/substation/civilian_east)
"aDx" = (/obj/machinery/requests_console{department = "EVA"; pixel_x = -32; pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/table/reinforced,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/device/multitool,/obj/machinery/camera/network/security{c_tag = "EVA Northwest"; dir = 4},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva)
-"aDy" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/table/reinforced,/obj/item/stack/sheet/glass/reinforced{amount = 50},/obj/item/stack/rods{amount = 50},/obj/machinery/camera/network/security{c_tag = "EVA Northeast"; dir = 8},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva)
+"aDy" = (/obj/machinery/light/small{dir = 4},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32},/obj/structure/table/woodentable,/obj/item/weapon/material/ashtray/bronze{pixel_x = -1; pixel_y = 1},/turf/simulated/floor/carpet,/area/crew_quarters/bar)
"aDz" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "neutral"; dir = 4},/area/crew_quarters/sleep)
"aDA" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
"aDB" = (/obj/machinery/power/terminal,/obj/machinery/light/small{dir = 4},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
@@ -1560,10 +1560,10 @@
"aDZ" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/auxsolarport)
"aEa" = (/obj/machinery/vending/assist,/turf/simulated/floor,/area/storage/primary)
"aEb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/storage/primary)
-"aEc" = (/obj/structure/table/standard,/obj/machinery/newscaster{pixel_y = -32},/turf/simulated/floor,/area/security/vacantoffice)
-"aEd" = (/obj/structure/table/standard,/obj/item/weapon/folder/yellow,/turf/simulated/floor,/area/security/vacantoffice)
+"aEc" = (/obj/item/weapon/reagent_containers/glass/bucket,/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor{icon_state = "green"; dir = 8},/area/hydroponics)
+"aEd" = (/obj/item/weapon/material/hatchet,/obj/item/weapon/material/minihoe,/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor{icon_state = "green"; dir = 8},/area/hydroponics)
"aEe" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/camera/network/engineering{c_tag = "Solar Maintenance Fore Port"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
-"aEf" = (/obj/structure/table/standard,/turf/simulated/floor,/area/security/vacantoffice)
+"aEf" = (/obj/item/weapon/stool/padded,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"aEg" = (/obj/structure/table/standard,/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/crew_quarters/locker)
"aEh" = (/obj/structure/table/standard,/obj/item/device/destTagger{pixel_x = 4; pixel_y = 3},/obj/item/device/destTagger{pixel_x = 4; pixel_y = 3},/obj/machinery/light{dir = 4},/turf/simulated/floor{icon_state = "arrival"; dir = 4},/area/quartermaster/office)
"aEi" = (/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,/area/storage/primary)
@@ -1586,7 +1586,7 @@
"aEz" = (/obj/structure/table/reinforced{icon_state = "table"},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 6},/obj/item/weapon/storage/briefcase/inflatable{pixel_y = 3},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = -3},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva)
"aEA" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/ai_monitored/storage/eva)
"aEB" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/jetpack/carbondioxide,/obj/item/clothing/shoes/magboots,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva)
-"aEC" = (/obj/structure/table/reinforced,/obj/item/stack/sheet/plasteel{amount = 10},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva)
+"aEC" = (/obj/machinery/computer/security/telescreen/entertainment{pixel_x = -32},/obj/item/weapon/stool/padded,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"aED" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor{dir = 1; icon_state = "bluecorner"},/area/hallway/primary/central_one)
"aEE" = (/turf/simulated/floor{dir = 5; icon_state = "blue"},/area/hallway/primary/central_one)
"aEF" = (/obj/structure/table/woodentable,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/weapon/tape_roll,/turf/simulated/floor/wood,/area/library)
@@ -1748,7 +1748,7 @@
"aHF" = (/obj/structure/toilet{pixel_y = 8},/obj/machinery/light/small{dir = 8},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
"aHG" = (/obj/machinery/light/small{dir = 8},/obj/machinery/recharge_station,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
"aHH" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"aHI" = (/obj/structure/table/standard,/turf/simulated/floor,/area/crew_quarters/locker)
+"aHI" = (/obj/machinery/light/small{dir = 1},/obj/item/clothing/head/cakehat,/obj/structure/table/marble,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar)
"aHJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/camera/network/civilian_east{c_tag = "Dormitories South"; dir = 4},/turf/simulated/floor{icon_state = "neutral"; dir = 8},/area/crew_quarters/sleep)
"aHK" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/bar)
"aHL" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-j1"; dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/bar)
@@ -1802,7 +1802,7 @@
"aIH" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/hallway/secondary/entry/starboard)
"aII" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/substation/civilian_east)
"aIJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/hallway/secondary/entry/starboard)
-"aIK" = (/obj/structure/table/standard,/obj/item/clothing/head/soft/grey{pixel_x = -2; pixel_y = 3},/turf/simulated/floor,/area/crew_quarters/locker)
+"aIK" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/cobweb,/obj/item/weapon/material/shard{icon_state = "small"},/turf/simulated/floor/plating,/area/maintenance/locker)
"aIL" = (/obj/effect/landmark/start{name = "Assistant"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor,/area/storage/primary)
"aIM" = (/obj/effect/landmark/start{name = "Assistant"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor,/area/storage/primary)
"aIN" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/library)
@@ -1810,7 +1810,7 @@
"aIP" = (/obj/effect/landmark/start{name = "Assistant"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor,/area/storage/primary)
"aIQ" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/security/nuke_storage)
"aIR" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/meter,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/library)
-"aIS" = (/obj/structure/table/standard,/obj/structure/disposalpipe/segment,/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,/obj/item/weapon/tape_roll,/turf/simulated/floor,/area/crew_quarters/locker)
+"aIS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table/marble,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar)
"aIT" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/gateway)
"aIU" = (/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,/area/gateway)
"aIV" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor,/area/gateway)
@@ -1885,7 +1885,7 @@
"aKm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/storage/primary)
"aKn" = (/turf/simulated/floor,/area/storage/primary)
"aKo" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/storage/primary)
-"aKp" = (/obj/structure/table/standard,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/security/vacantoffice)
+"aKp" = (/obj/structure/table/marble,/turf/simulated/floor{icon_state = "grimy"},/area/hydroponics/garden)
"aKq" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor,/area/storage/primary)
"aKr" = (/turf/simulated/floor{icon_state = "delivery"},/area/storage/primary)
"aKs" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "Tool Storage"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "bot"},/area/storage/primary)
@@ -1912,7 +1912,7 @@
"aKN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/hallway/primary/central_one)
"aKO" = (/turf/simulated/floor{dir = 4; icon_state = "bluecorner"},/area/hallway/primary/central_one)
"aKP" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/machinery/door/window/brigdoor{dir = 1; name = "Security Checkpoint"; req_access = list(63)},/turf/simulated/floor{icon_state = "delivery"},/area/hallway/secondary/entry/starboard)
-"aKQ" = (/obj/structure/table/standard,/obj/structure/window/basic{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/security/vacantoffice)
+"aKQ" = (/obj/effect/landmark/start{name = "Gardener"},/obj/item/weapon/stool/padded,/turf/simulated/floor{dir = 9; icon_state = "green"},/area/hydroponics/garden)
"aKR" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/primary/central_one)
"aKS" = (/obj/machinery/vending/cola,/turf/simulated/floor{icon_state = "dark"},/area/hallway/primary/central_two)
"aKT" = (/obj/structure/disposalpipe/segment,/obj/machinery/button/crematorium{pixel_x = 25},/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "dark"},/area/chapel/office)
@@ -1944,7 +1944,7 @@
"aLt" = (/obj/structure/table/woodentable,/obj/item/weapon/nullrod,/obj/item/device/eftpos{eftpos_name = "Chapel EFTPOS scanner"},/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office)
"aLu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor,/area/hallway/secondary/exit)
"aLv" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/bed/chair/comfy/brown{dir = 4},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/carpet,/area/crew_quarters/bar)
-"aLw" = (/obj/structure/table/standard,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
+"aLw" = (/obj/structure/table/woodentable,/obj/item/weapon/material/kitchen/utensil/fork,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"aLx" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/chapel/main)
"aLy" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/shuttle/arrival/station)
"aLz" = (/turf/simulated/shuttle/wall{icon_state = "swall13"; dir = 2},/area/shuttle/arrival/station)
@@ -2028,9 +2028,9 @@
"aMZ" = (/obj/structure/bed/chair/comfy/brown{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet,/area/crew_quarters/bar)
"aNa" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office)
"aNb" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "grimy"},/area/chapel/office)
-"aNc" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/condiment/enzyme{layer = 5},/obj/item/weapon/packageWrap,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
+"aNc" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/table/marble,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar)
"aNd" = (/obj/structure/bed/chair/comfy/brown{dir = 8},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/carpet,/area/crew_quarters/bar)
-"aNe" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 5},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
+"aNe" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/table/marble,/turf/simulated/floor{icon_state = "grimy"},/area/hydroponics/garden)
"aNf" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/chapel/main)
"aNg" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/shuttle/arrival/station)
"aNh" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry/port)
@@ -2067,7 +2067,7 @@
"aNM" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/hallway/primary/central_one)
"aNN" = (/obj/machinery/light{dir = 1},/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/hallway/primary/central_one)
"aNO" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = 30},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/hallway/primary/central_one)
-"aNP" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
+"aNP" = (/obj/effect/landmark/start{name = "Gardener"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/weapon/stool/padded,/turf/simulated/floor{icon_state = "green"; dir = 8},/area/hydroponics/garden)
"aNQ" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/hallway/primary/central_one)
"aNR" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/hallway/primary/central_one)
"aNS" = (/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/hallway/primary/central_one)
@@ -2075,7 +2075,7 @@
"aNU" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor{dir = 1; icon_state = "bluecorner"},/area/hallway/primary/central_one)
"aNV" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor{icon_state = "L1"},/area/hallway/primary/central_one)
"aNW" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/turf/simulated/floor{icon_state = "L3"},/area/hallway/primary/central_one)
-"aNX" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/turf/simulated/floor,/area/crew_quarters/locker)
+"aNX" = (/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor,/area/crew_quarters/locker)
"aNY" = (/turf/simulated/floor{icon_state = "L7"},/area/hallway/primary/central_one)
"aNZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "L9"},/area/hallway/primary/central_one)
"aOa" = (/turf/simulated/floor{icon_state = "L11"},/area/hallway/primary/central_one)
@@ -2182,23 +2182,23 @@
"aPX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor,/area/hallway/primary/central_two)
"aPY" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=EVA2"; location = "Dorm"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor,/area/hallway/primary/central_two)
"aPZ" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/hallway/primary/central_two)
-"aQa" = (/obj/item/weapon/stool{pixel_y = 8},/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"aQa" = (/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor,/area/crew_quarters/locker)
"aQb" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar)
"aQc" = (/obj/structure/extinguisher_cabinet{pixel_x = -13; pixel_y = 28},/obj/machinery/atm{pixel_x = 6; pixel_y = 28},/turf/simulated/floor,/area/hallway/primary/port)
"aQd" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Central - Northwest"},/turf/simulated/floor{dir = 4; icon_state = "bluecorner"},/area/hallway/primary/central_one)
"aQe" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/carpet,/area/crew_quarters/bar)
"aQf" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/carpet,/area/crew_quarters/bar)
-"aQg" = (/obj/machinery/light/small{dir = 4},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32},/obj/structure/table/woodentable,/obj/item/ashtray/bronze{pixel_x = -1; pixel_y = 1},/turf/simulated/floor/carpet,/area/crew_quarters/bar)
+"aQg" = (/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/structure/disposalpipe/segment,/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,/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor,/area/crew_quarters/locker)
"aQh" = (/obj/structure/kitchenspike,/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
"aQi" = (/obj/machinery/gibber,/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
"aQj" = (/obj/structure/closet/crate/freezer,/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
"aQk" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "showroomfloor"},/area/crew_quarters/kitchen)
-"aQl" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/structure/disposalpipe/segment,/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,/area/crew_quarters/locker)
+"aQl" = (/obj/structure/table/woodentable,/obj/item/weapon/material/kitchen/utensil/fork,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"aQm" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "hydrofloor"},/area/hydroponics)
"aQn" = (/turf/simulated/floor,/area/hydroponics)
"aQo" = (/obj/structure/disposalpipe/segment,/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "green"; dir = 4},/area/hydroponics)
"aQp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hydroponics)
-"aQq" = (/obj/machinery/computer/security/telescreen/entertainment{pixel_x = -32},/obj/item/weapon/stool{pixel_y = 8},/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"aQq" = (/obj/structure/table/marble,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar)
"aQr" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/hydroponics)
"aQs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/hydroponics)
"aQt" = (/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor{icon_state = "green"; dir = 4},/area/hydroponics)
@@ -2262,7 +2262,7 @@
"aRz" = (/obj/machinery/biogenerator,/turf/simulated/floor,/area/hydroponics)
"aRA" = (/obj/machinery/seed_extractor,/turf/simulated/floor,/area/hydroponics)
"aRB" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor,/area/hydroponics)
-"aRC" = (/obj/item/weapon/stool{pixel_y = 8},/obj/effect/landmark/start{name = "Gardener"},/turf/simulated/floor{dir = 9; icon_state = "green"},/area/hydroponics/garden)
+"aRC" = (/obj/item/weapon/reagent_containers/food/snacks/mint,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/table/marble,/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
"aRD" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/disposal,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor{icon_state = "green"; dir = 4},/area/hydroponics)
"aRE" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hydroponics)
"aRF" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor{icon_state = "green"; dir = 8},/area/hydroponics)
@@ -2333,7 +2333,7 @@
"aSS" = (/turf/simulated/floor/wood,/area/crew_quarters/bar)
"aST" = (/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"aSU" = (/obj/machinery/camera/network/exodus{c_tag = "Arrivals Southwest"},/turf/simulated/floor,/area/hallway/secondary/entry/port)
-"aSV" = (/obj/structure/table/reinforced,/obj/machinery/light/small{dir = 1},/obj/item/clothing/head/cakehat,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar)
+"aSV" = (/obj/item/weapon/material/kitchen/rollingpin,/obj/structure/table/marble,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
"aSW" = (/obj/machinery/disposal,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar)
"aSX" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/kitchen)
"aSY" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
@@ -2425,7 +2425,7 @@
"aUG" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"aUH" = (/obj/machinery/hologram/holopad,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"aUI" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"aUJ" = (/obj/structure/table/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar)
+"aUJ" = (/obj/machinery/chemical_dispenser/bar_soft/full,/obj/structure/table/marble,/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
"aUK" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar)
"aUL" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/crew_quarters/kitchen)
"aUM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
@@ -2437,7 +2437,7 @@
"aUS" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "escape_dock_north_airlock"; name = "interior access button"; pixel_x = 26; pixel_y = 26; req_one_access = list(13)},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/hallway/secondary/exit)
"aUT" = (/obj/structure/closet/secure_closet/freezer/kitchen,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
"aUU" = (/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor{icon_state = "grimy"},/area/hydroponics/garden)
-"aUV" = (/obj/structure/table/reinforced,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor{icon_state = "grimy"},/area/hydroponics/garden)
+"aUV" = (/obj/item/weapon/book/manual/chef_recipes,/obj/structure/table/marble,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
"aUW" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/bed/chair/wood/wings,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"aUX" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor{dir = 1; icon_state = "green"},/area/hydroponics/garden)
"aUY" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{dir = 5; icon_state = "green"},/area/hydroponics/garden)
@@ -2479,11 +2479,11 @@
"aVI" = (/obj/machinery/door/airlock/external{frequency = 1331; icon_state = "door_locked"; id_tag = "nuke_shuttle_dock_inner"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/hallway/secondary/entry/port)
"aVJ" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/research_port)
"aVK" = (/turf/simulated/floor/plating,/area/storage/emergency2)
-"aVL" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/cobweb,/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plating,/area/maintenance/locker)
+"aVL" = (/obj/effect/landmark/start{name = "Gardener"},/obj/item/weapon/stool/padded,/turf/simulated/floor{icon_state = "green"; dir = 8},/area/hydroponics/garden)
"aVM" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor,/area/storage/tools)
"aVN" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor,/area/storage/tools)
"aVO" = (/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor,/area/storage/tools)
-"aVP" = (/obj/structure/table/standard,/obj/item/weapon/book/manual/chef_recipes,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
+"aVP" = (/obj/item/weapon/stool/padded,/turf/simulated/floor{icon_state = "chapel"},/area/chapel/main)
"aVQ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/primary/central_one)
"aVR" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor{icon_state = "red"; dir = 9},/area/bridge)
"aVS" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/bed/chair/wood/wings{icon_state = "wooden_chair_wings"; dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/crew_quarters/bar)
@@ -2497,17 +2497,17 @@
"aWa" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "grimy"},/area/hydroponics/garden)
"aWb" = (/turf/simulated/floor{icon_state = "whitehall"; dir = 5},/area/bridge)
"aWc" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/primary/central_two)
-"aWd" = (/obj/item/weapon/stool{pixel_y = 8},/obj/effect/landmark/start{name = "Gardener"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "green"; dir = 8},/area/hydroponics/garden)
+"aWd" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/weapon/stool/padded,/turf/simulated/floor{dir = 8; icon_state = "chapel"},/area/chapel/main)
"aWe" = (/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 2; pixel_y = 6},/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -2; pixel_y = 4},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"aWf" = (/obj/structure/bed/chair{dir = 4},/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor{dir = 8; icon_state = "escape"},/area/hallway/secondary/exit)
"aWg" = (/obj/item/weapon/stool{pixel_y = 8},/turf/simulated/floor,/area/crew_quarters/locker)
"aWh" = (/obj/structure/bed/chair/wood/wings{icon_state = "wooden_chair_wings"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"aWi" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"aWj" = (/obj/item/weapon/stool{pixel_y = 8},/obj/effect/landmark/start{name = "Gardener"},/turf/simulated/floor{icon_state = "green"; dir = 8},/area/hydroponics/garden)
-"aWk" = (/obj/structure/table/woodentable,/obj/item/weapon/kitchen/utensil/fork,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"aWj" = (/obj/item/weapon/stool/padded,/turf/simulated/floor{dir = 8; icon_state = "chapel"},/area/chapel/main)
+"aWk" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/item/weapon/stool/padded,/turf/simulated/floor{icon_state = "chapel"},/area/chapel/main)
"aWl" = (/obj/structure/bed/chair/comfy/black,/turf/simulated/floor/wood,/area/library)
"aWm" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"aWn" = (/obj/structure/table/reinforced,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar)
+"aWn" = (/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor,/area/security/vacantoffice)
"aWo" = (/obj/machinery/door/airlock{name = "Port Emergency Storage"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/hallway/primary/port)
"aWp" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
"aWq" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
@@ -2518,7 +2518,7 @@
"aWv" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
"aWw" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass{name = "Auxiliary Tool Storage"; req_access = list(12)},/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,/area/hallway/primary/port)
"aWx" = (/obj/item/device/radio/intercom{pixel_x = 28},/obj/machinery/libraryscanner,/turf/simulated/floor/wood,/area/library)
-"aWy" = (/obj/structure/table/reinforced,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "grimy"},/area/hydroponics/garden)
+"aWy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor,/area/security/vacantoffice)
"aWz" = (/obj/effect/landmark/start{name = "Librarian"},/obj/structure/bed/chair/office/dark,/turf/simulated/floor/wood,/area/library)
"aWA" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/hydroponics/garden)
"aWB" = (/turf/simulated/floor{icon_state = "green"; dir = 4},/area/hydroponics/garden)
@@ -2553,10 +2553,10 @@
"aXe" = (/turf/simulated/floor/plating,/area/maintenance/locker)
"aXf" = (/obj/effect/decal/cleanable/generic,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plating,/area/maintenance/locker)
"aXg" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/closet/wardrobe/white,/turf/simulated/floor,/area/crew_quarters/locker)
-"aXh" = (/obj/item/weapon/stool,/turf/simulated/floor{icon_state = "chapel"},/area/chapel/main)
-"aXi" = (/obj/structure/table/standard,/obj/machinery/chemical_dispenser/bar_soft/full,/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
-"aXj" = (/obj/structure/table/standard,/obj/item/weapon/kitchen/rollingpin,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
-"aXk" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/snacks/mint,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
+"aXh" = (/obj/structure/window/basic{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor,/area/security/vacantoffice)
+"aXi" = (/obj/item/clothing/head/soft/grey{pixel_x = -2; pixel_y = 3},/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor,/area/crew_quarters/locker)
+"aXj" = (/obj/structure/disposalpipe/segment,/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,/obj/item/weapon/tape_roll,/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor,/area/crew_quarters/locker)
+"aXk" = (/obj/item/weapon/reagent_containers/food/condiment/enzyme{layer = 5},/obj/item/weapon/packageWrap,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/table/marble,/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
"aXl" = (/obj/machinery/door/morgue{dir = 2; name = "Private Study"; req_access = list(37)},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/library)
"aXm" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "centcom_shuttle_dock_airlock"; name = "interior access button"; pixel_x = -28; pixel_y = 26; req_one_access = list(13)},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"; tag = "icon-manifold-f (EAST)"},/turf/simulated/floor,/area/hallway/secondary/entry/aft)
"aXn" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/camera/network/civilian_east{c_tag = "Chapel South"; dir = 8},/turf/simulated/floor{icon_state = "dark"},/area/chapel/main)
@@ -2568,7 +2568,7 @@
"aXt" = (/obj/structure/extinguisher_cabinet{pixel_x = -24},/turf/simulated/floor,/area/storage/tools)
"aXu" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "centcom_shuttle_dock_outer"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "centcom_shuttle_dock_airlock"; name = "exterior access button"; pixel_x = -5; pixel_y = -26; req_one_access = list(13)},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft)
"aXv" = (/turf/simulated/floor,/area/storage/tools)
-"aXw" = (/obj/structure/table/standard,/obj/item/ashtray/plastic{pixel_x = 4; pixel_y = 6},/turf/simulated/floor,/area/security/vacantoffice)
+"aXw" = (/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/obj/structure/table/marble,/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
"aXx" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/primary/central_one)
"aXy" = (/turf/simulated/wall,/area/bridge)
"aXz" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1331; id_tag = "nuke_shuttle_dock_pump"},/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "nuke_shuttle_dock_sensor"; pixel_x = 0; pixel_y = -25},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/hallway/secondary/entry/port)
@@ -2586,15 +2586,15 @@
"aXL" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/primary/central_two)
"aXM" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/primary/central_two)
"aXN" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/glass{name = "Kitchen"; req_access = list(28)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
-"aXO" = (/obj/structure/table/woodentable,/obj/item/weapon/kitchen/utensil/fork,/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"aXO" = (/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 5},/obj/structure/table/marble,/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
"aXP" = (/obj/structure/disposalpipe/segment,/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"aXQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/woodentable,/obj/item/weapon/deck{pixel_y = 4},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"aXR" = (/obj/item/weapon/stool,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 8; icon_state = "chapel"},/area/chapel/main)
+"aXR" = (/obj/structure/table/marble,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
"aXS" = (/obj/structure/table/woodentable,/obj/item/device/camera,/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"aXT" = (/obj/structure/table/reinforced,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar)
+"aXT" = (/obj/item/weapon/stool/padded,/turf/simulated/floor{dir = 4; icon_state = "chapel"},/area/chapel/main)
"aXU" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/crew_quarters/kitchen)
"aXV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
-"aXW" = (/obj/structure/table/standard,/obj/structure/window/basic{dir = 4},/obj/item/weapon/folder/blue{pixel_x = 5},/turf/simulated/floor,/area/security/vacantoffice)
+"aXW" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/weapon/stool/padded,/turf/simulated/floor{dir = 1; icon_state = "chapel"},/area/chapel/main)
"aXX" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/glass{name = "Kitchen"; req_access = list(28)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/hydroponics/garden)
"aXY" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/table/standard,/obj/item/weapon/stamp,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/item/weapon/pen,/turf/simulated/floor,/area/security/vacantoffice)
"aXZ" = (/obj/structure/table/standard,/obj/machinery/reagentgrinder,/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
@@ -2602,13 +2602,13 @@
"aYb" = (/obj/structure/closet/secure_closet/freezer/fridge,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
"aYc" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/hydroponics/garden)
"aYd" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "grimy"},/area/hydroponics/garden)
-"aYe" = (/obj/structure/table/reinforced,/turf/simulated/floor{icon_state = "grimy"},/area/hydroponics/garden)
-"aYf" = (/obj/item/weapon/stool,/turf/simulated/floor{dir = 8; icon_state = "chapel"},/area/chapel/main)
+"aYe" = (/obj/item/weapon/stool/padded,/turf/simulated/floor{dir = 1; icon_state = "chapel"},/area/chapel/main)
+"aYf" = (/obj/structure/window/basic{dir = 4},/obj/item/weapon/folder/blue{pixel_x = 5},/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor,/area/security/vacantoffice)
"aYg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/hydroponics/garden)
"aYh" = (/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/grass,/area/hydroponics/garden)
"aYi" = (/obj/structure/flora/ausbushes/sunnybush,/obj/item/device/radio/intercom{pixel_x = 25},/turf/simulated/floor/grass,/area/hydroponics/garden)
"aYj" = (/obj/structure/bookcase{name = "bookcase (Adult)"},/turf/simulated/floor/wood,/area/library)
-"aYk" = (/obj/item/weapon/stool,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{icon_state = "chapel"},/area/chapel/main)
+"aYk" = (/obj/item/weapon/reagent_containers/food/snacks/pie,/obj/structure/table/marble,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar)
"aYl" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{pixel_x = 1; pixel_y = 5},/turf/simulated/floor/wood,/area/library)
"aYm" = (/obj/structure/bed/chair{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor{dir = 8; icon_state = "escape"},/area/hallway/secondary/exit)
"aYn" = (/obj/structure/bed/chair{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor,/area/bridge)
@@ -2630,11 +2630,11 @@
"aYD" = (/obj/structure/closet/emcloset,/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/hallway/secondary/entry/aft)
"aYE" = (/turf/simulated/floor{dir = 8; icon_state = "whitecorner"},/area/hallway/secondary/entry/port)
"aYF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/hallway/secondary/entry/aft)
-"aYG" = (/obj/item/weapon/stool,/turf/simulated/floor{dir = 4; icon_state = "chapel"},/area/chapel/main)
+"aYG" = (/obj/item/weapon/material/hatchet,/obj/item/weapon/material/minihoe,/obj/structure/table/marble,/turf/simulated/floor{icon_state = "grimy"},/area/hydroponics/garden)
"aYH" = (/obj/structure/table/standard,/obj/structure/bedsheetbin,/turf/simulated/floor,/area/security/prison)
"aYI" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/security/vacantoffice)
"aYJ" = (/obj/structure/table/standard,/obj/machinery/light{dir = 8},/obj/machinery/microwave,/turf/simulated/floor,/area/security/prison)
-"aYK" = (/obj/structure/table/standard,/obj/item/weapon/minihoe,/obj/item/device/analyzer/plant_analyzer,/obj/item/clothing/head/greenbandana,/turf/simulated/floor,/area/security/prison)
+"aYK" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/table/marble,/turf/simulated/floor{icon_state = "grimy"},/area/hydroponics/garden)
"aYL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor,/area/security/vacantoffice)
"aYM" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/bridge)
"aYN" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets,/obj/item/weapon/storage/box/donkpockets{pixel_x = -3; pixel_y = -3},/turf/simulated/floor,/area/security/prison)
@@ -2647,14 +2647,14 @@
"aYU" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_chapel_outer"; locked = 1; name = "Engineering External Access"; req_access = list(11,13)},/obj/effect/decal/cleanable/dirt,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
"aYV" = (/obj/structure/noticeboard{pixel_y = 27},/obj/machinery/camera/network/command{c_tag = "Bridge East"},/turf/simulated/floor{icon_state = "whitehall"; dir = 1},/area/bridge)
"aYW" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/crew_quarters/locker)
-"aYX" = (/obj/item/weapon/stool,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 1; icon_state = "chapel"},/area/chapel/main)
+"aYX" = (/obj/structure/window/basic{dir = 4},/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor,/area/security/vacantoffice)
"aYY" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor,/area/storage/tools)
"aYZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/storage/tools)
"aZa" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 32},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/turf/simulated/floor{dir = 5; icon_state = "blue"},/area/hallway/primary/central_one)
"aZb" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/bridge)
"aZc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/hallway/secondary/exit)
"aZd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor{icon_state = "red"; dir = 8},/area/bridge)
-"aZe" = (/obj/item/weapon/stool,/turf/simulated/floor{dir = 1; icon_state = "chapel"},/area/chapel/main)
+"aZe" = (/obj/item/weapon/folder/yellow,/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor,/area/security/vacantoffice)
"aZf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/bridge)
"aZg" = (/obj/machinery/atm{pixel_x = -25},/obj/machinery/camera/network/civilian_east{c_tag = "Bar West"; dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"aZh" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "solar_tool_airlock"; name = "exterior access button"; pixel_x = -25; pixel_y = -25; req_access = list(11,13)},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/solar/auxport)
@@ -2773,14 +2773,14 @@
"bbq" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor,/area/hallway/primary/starboard)
"bbr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bbs" = (/obj/structure/bed/chair/comfy/black{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/wood,/area/library)
-"bbt" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/food/snacks/pie,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar)
+"bbt" = (/obj/machinery/newscaster{pixel_y = -32},/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor,/area/security/vacantoffice)
"bbu" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
"bbv" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
"bbw" = (/obj/effect/landmark/start{name = "Chef"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
"bbx" = (/obj/structure/table/standard,/obj/machinery/requests_console{department = "Tool Storage"; departmentType = 0; pixel_y = 30},/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/machinery/camera/network/civilian_west{c_tag = "Tool Storage - Primary"},/turf/simulated/floor,/area/storage/primary)
"bby" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/hydroponics/garden)
-"bbz" = (/obj/structure/table/reinforced,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "grimy"},/area/hydroponics/garden)
-"bbA" = (/obj/structure/table/reinforced,/obj/item/weapon/hatchet,/obj/item/weapon/minihoe,/turf/simulated/floor{icon_state = "grimy"},/area/hydroponics/garden)
+"bbz" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/stack/rods{amount = 50},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage)
+"bbA" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor{icon_state = "arrival"; dir = 4},/area/quartermaster/office)
"bbB" = (/turf/simulated/floor{icon_state = "green"; dir = 8},/area/hydroponics/garden)
"bbC" = (/obj/structure/flora/ausbushes/fernybush,/turf/simulated/floor/grass,/area/hydroponics/garden)
"bbD" = (/obj/machinery/door/airlock/glass_command{name = "Bridge"; req_access = list(19)},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/bridge)
@@ -2966,7 +2966,7 @@
"bfb" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/crew_quarters/locker)
"bfc" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/crew_quarters/locker)
"bfd" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/crew_quarters/locker)
-"bfe" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/stack/sheet/cardboard,/obj/item/stack/rods{amount = 50},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage)
+"bfe" = (/obj/effect/decal/cleanable/cobweb,/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/maintenance/locker)
"bff" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage)
"bfg" = (/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage)
"bfh" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/module/power_control,/obj/item/weapon/cell{maxcharge = 2000},/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage)
@@ -3129,7 +3129,7 @@
"bii" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage)
"bij" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage)
"bik" = (/obj/machinery/conveyor_switch/oneway{id = "packageSort1"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/quartermaster/office)
-"bil" = (/obj/structure/table/standard,/obj/structure/disposalpipe/segment,/obj/machinery/camera/network/medbay{c_tag = "Medbay Lounge"},/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay4)
+"bil" = (/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor{icon_state = "arrival"; dir = 4},/area/quartermaster/office)
"bim" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor,/area/hallway/primary/central_one)
"bin" = (/obj/structure/closet/coffin,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "chapel"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor{icon_state = "dark"},/area/chapel/office)
"bio" = (/obj/item/weapon/hand_labeler,/obj/item/device/assembly/timer,/obj/item/device/eftpos{eftpos_name = "Bridge EFTPOS scanner"},/obj/structure/table/woodentable,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/wood,/area/bridge/meeting_room)
@@ -3196,7 +3196,7 @@
"bjx" = (/obj/structure/disposalpipe/tagger/partial{name = "Sorting Office"; sort_tag = "Sorting Office"},/turf/simulated/floor/plating,/area/maintenance/locker)
"bjy" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage)
"bjz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage)
-"bjA" = (/obj/item/stack/sheet/cardboard,/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage)
+"bjA" = (/obj/structure/table/reinforced,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry)
"bjB" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/locker)
"bjC" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/maintenance/locker)
"bjD" = (/obj/structure/filingcabinet/filingcabinet,/turf/simulated/floor{icon_state = "arrival"; dir = 4},/area/quartermaster/office)
@@ -3213,7 +3213,7 @@
"bjO" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/wall,/area/maintenance/locker)
"bjP" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai)
"bjQ" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/camera/network/civilian_west{c_tag = "Locker Room South"; dir = 8},/turf/simulated/floor,/area/crew_quarters/locker)
-"bjR" = (/obj/machinery/light{dir = 1},/obj/item/weapon/stool,/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/reception)
+"bjR" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/item/weapon/storage/box/cups{pixel_x = 0; pixel_y = 0},/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/reception)
"bjS" = (/obj/effect/landmark{name = "tripai"},/obj/item/device/radio/intercom{anyai = 1; freerange = 1; listening = 0; name = "Custom Channel"; pixel_x = 0; pixel_y = 19},/obj/item/device/radio/intercom{anyai = 1; broadcasting = 0; freerange = 1; frequency = 1447; name = "Private Channel"; pixel_x = 0; pixel_y = -26},/obj/item/device/radio/intercom{anyai = 1; broadcasting = 1; freerange = 1; listening = 1; name = "Common Channel"; pixel_x = 27; pixel_y = -3},/obj/structure/cable/cyan{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
"bjT" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/wood,/area/crew_quarters/captain)
"bjU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/wood,/area/crew_quarters/captain)
@@ -3288,7 +3288,7 @@
"bll" = (/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Starboard - Central East"; dir = 1},/turf/simulated/floor,/area/hallway/primary/starboard)
"blm" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/embedded_controller/radio/docking_port_multi{child_names_txt = "Airlock One;Airlock Two"; child_tags_txt = "escape_dock_north_airlock;escape_dock_south_airlock"; frequency = 1380; id_tag = "escape_dock"; pixel_x = 0; pixel_y = -25; req_one_access = list(13)},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/hallway/secondary/exit)
"bln" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/quartermaster/office)
-"blo" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/structure/table/reinforced,/turf/simulated/floor{icon_state = "arrival"; dir = 4},/area/quartermaster/office)
+"blo" = (/obj/machinery/light{dir = 1},/obj/item/weapon/stool/padded,/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/reception)
"blp" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/primary/central_one)
"blq" = (/turf/simulated/floor{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central_one)
"blr" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "specops_dock_airlock"; pixel_x = 0; pixel_y = 30; req_one_access = list(13); tag_airpump = "specops_dock_pump"; tag_chamber_sensor = "specops_dock_sensor"; tag_exterior_door = "specops_dock_outer"; tag_interior_door = "specops_dock_inner"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "specops_dock_sensor"; pixel_x = 0; pixel_y = -25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1380; id_tag = "specops_dock_pump"},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft)
@@ -3301,7 +3301,7 @@
"bly" = (/obj/machinery/vending/coffee,/turf/simulated/floor/wood,/area/bridge/meeting_room)
"blz" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
"blA" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
-"blB" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/patient_wing)
+"blB" = (/obj/machinery/camera/network/mining{c_tag = "Medbay Lobby Port"},/obj/item/weapon/stool/padded,/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/reception)
"blC" = (/obj/structure/table/standard,/obj/item/stack/cable_coil{pixel_x = -3; pixel_y = 3},/obj/item/stack/cable_coil,/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/plating,/area/storage/tech)
"blD" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
"blE" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "specops_dock_inner"; locked = 1; name = "Docking Port Airlock"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft)
@@ -3340,7 +3340,7 @@
"bml" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/locker)
"bmm" = (/obj/machinery/door/airlock{name = "Unit 4"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet)
"bmn" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet)
-"bmo" = (/obj/item/stack/sheet/glass/reinforced,/obj/effect/decal/cleanable/cobweb,/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/maintenance/locker)
+"bmo" = (/obj/machinery/camera/network/mining{c_tag = "Medbay Lobby Starboard"},/obj/item/weapon/stool/padded,/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/reception)
"bmp" = (/obj/item/weapon/screwdriver,/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/locker)
"bmq" = (/obj/item/device/flashlight,/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/locker)
"bmr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/locker)
@@ -3354,8 +3354,8 @@
"bmz" = (/obj/structure/disposalpipe/sortjunction/untagged{dir = 1},/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage)
"bmA" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/locker)
"bmB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/camera/network/civilian_west{c_tag = "Locker Room Toilets"; dir = 8},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet)
-"bmC" = (/obj/item/weapon/stool,/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/reception)
-"bmD" = (/obj/structure/table/reinforced,/turf/simulated/floor{icon_state = "arrival"; dir = 4},/area/quartermaster/office)
+"bmC" = (/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/obj/item/weapon/stool/padded,/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/reception)
+"bmD" = (/obj/item/weapon/book/manual/robotics_cyborgs{pixel_x = 2; pixel_y = 5},/obj/item/weapon/storage/belt/utility,/obj/machinery/requests_console{department = "Robotics"; departmentType = 2; name = "Robotics RC"; pixel_y = 30},/obj/machinery/light{dir = 1},/obj/item/weapon/storage/belt/utility,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics)
"bmE" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/quartermaster/office)
"bmF" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "warningcorner"; dir = 1},/area/quartermaster/office)
"bmG" = (/turf/simulated/wall/r_wall,/area/maintenance/substation/command)
@@ -3374,7 +3374,7 @@
"bmT" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/dropper,/obj/machinery/light{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry)
"bmU" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/light/small{dir = 1},/obj/structure/cable/cyan{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc/super/equipment{dir = 1; name = "north bump"; pixel_y = 24},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
"bmV" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Morgue"; req_access = list(6)},/turf/simulated/floor,/area/hallway/primary/starboard)
-"bmW" = (/obj/structure/table/reinforced,/obj/item/stack/sheet/mineral/phoron,/obj/item/stack/sheet/mineral/phoron,/obj/item/stack/sheet/mineral/phoron,/obj/item/stack/sheet/mineral/phoron,/obj/item/stack/sheet/mineral/phoron,/obj/item/stack/sheet/mineral/phoron,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry)
+"bmW" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/door/window/southright{name = "Research and Development Desk"; req_access = list(7)},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor/plating,/area/hallway/primary/starboard)
"bmX" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/maintenance{req_one_access = list(5,12,47)},/turf/simulated/floor/plating,/area/hallway/primary/starboard)
"bmY" = (/obj/structure/sign/chemistry,/turf/simulated/wall/r_wall,/area/medical/chemistry)
"bmZ" = (/obj/structure/reagent_dispensers/water_cooler,/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = 32},/turf/simulated/floor{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/medical/reception)
@@ -3389,7 +3389,7 @@
"bni" = (/turf/simulated/wall,/area/medical/reception)
"bnj" = (/obj/machinery/light{dir = 1},/obj/structure/closet/secure_closet/medical1,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room)
"bnk" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/effect/landmark/start{name = "Chemist"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor{dir = 4; icon_state = "whiteyellow"},/area/medical/chemistry)
-"bnl" = (/obj/item/weapon/stool,/turf/simulated/floor{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/reception)
+"bnl" = (/obj/effect/decal/cleanable/generic,/obj/item/weapon/material/shard{icon_state = "medium"},/turf/simulated/floor/plating,/area/maintenance/locker)
"bnm" = (/obj/machinery/light{dir = 1},/obj/machinery/disposal,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room)
"bnn" = (/turf/simulated/wall,/area/medical/exam_room)
"bno" = (/obj/machinery/door/airlock/glass_research{autoclose = 0; frequency = 1379; glass = 1; icon_state = "door_locked"; id_tag = "tox_airlock_interior"; locked = 1; name = "Mixing Room Interior Airlock"; req_access = list(7)},/turf/simulated/floor/engine,/area/rnd/mixing)
@@ -3440,12 +3440,12 @@
"boh" = (/obj/machinery/chemical_dispenser/full,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry)
"boi" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = 30},/obj/machinery/chem_master,/obj/machinery/camera/network/medbay{c_tag = "Medbay - Chemistry"},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry)
"boj" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/table/reinforced,/obj/machinery/button/remote/blast_door{id = "chemcounter"; name = "Pharmacy Counter Lockdown Control"; pixel_y = 25},/obj/machinery/reagentgrinder,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry)
-"bok" = (/obj/item/weapon/folder/yellow,/obj/item/weapon/pen{pixel_x = 4; pixel_y = 4},/obj/structure/table/reinforced,/turf/simulated/floor{icon_state = "arrival"; dir = 4},/area/quartermaster/office)
-"bol" = (/obj/item/weapon/stool,/obj/machinery/camera/network/mining{c_tag = "Medbay Lobby Port"},/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/reception)
+"bok" = (/obj/item/weapon/folder/yellow,/obj/item/weapon/pen{pixel_x = 4; pixel_y = 4},/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor{icon_state = "arrival"; dir = 4},/area/quartermaster/office)
+"bol" = (/obj/item/weapon/stool/padded,/turf/simulated/floor{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/reception)
"bom" = (/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/substation/command)
"bon" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/terminal{dir = 4},/turf/simulated/floor/plating,/area/maintenance/substation/command)
"boo" = (/obj/item/weapon/stool,/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{dir = 1; icon_state = "whitered"},/area/assembly/robotics)
-"bop" = (/obj/item/weapon/stool,/obj/machinery/camera/network/mining{c_tag = "Medbay Lobby Starboard"},/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/reception)
+"bop" = (/obj/item/clothing/glasses/welding,/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor{dir = 1; icon_state = "whitepurple"},/area/rnd/lab)
"boq" = (/obj/item/weapon/stool,/obj/effect/landmark/start{name = "Scientist"},/turf/simulated/floor{dir = 1; icon_state = "whitepurple"},/area/rnd/lab)
"bor" = (/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/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor/plating,/area/maintenance/substation/command)
"bos" = (/obj/structure/disposalpipe/segment,/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,/area/maintenance/substation/command)
@@ -3499,7 +3499,7 @@
"bpo" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/item/weapon/folder/white,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/door/window/eastright{base_state = "left"; dir = 2; icon_state = "left"; name = "Robotics Desk"; req_access = list(29)},/turf/simulated/floor/plating,/area/hallway/primary/starboard)
"bpp" = (/turf/simulated/wall,/area/assembly/robotics)
"bpq" = (/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics)
-"bpr" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/door/window/southright{name = "Research and Development Desk"; req_access = list(7)},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/hallway/primary/starboard)
+"bpr" = (/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor{dir = 1; icon_state = "whitepurple"},/area/rnd/lab)
"bps" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "toxin_test_airlock"; name = "exterior access button"; pixel_x = -20; pixel_y = -20; req_access = newlist(); req_one_access = list(7,13)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating/airless,/area/space)
"bpt" = (/turf/simulated/floor{dir = 1; icon_state = "whitered"},/area/assembly/robotics)
"bpu" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room)
@@ -3527,7 +3527,7 @@
"bpQ" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -29},/obj/machinery/light/small,/turf/simulated/floor/plating,/area/maintenance/disposal)
"bpR" = (/obj/machinery/light_switch{pixel_y = -25},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/disposal)
"bpS" = (/obj/machinery/light/small{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/locker)
-"bpT" = (/obj/effect/decal/cleanable/generic,/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/plating,/area/maintenance/locker)
+"bpT" = (/obj/machinery/camera/network/civilian_west{c_tag = "Waste Disposal"; dir = 8},/obj/item/weapon/material/ashtray/plastic{pixel_x = 5; pixel_y = -5},/obj/effect/decal/cleanable/ash,/obj/item/weapon/cigbutt/cigarbutt,/turf/simulated/floor/plating,/area/maintenance/disposal)
"bpU" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/maintenance/locker)
"bpV" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plating,/area/maintenance/locker)
"bpW" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/locker)
@@ -3702,7 +3702,7 @@
"btj" = (/obj/machinery/light,/turf/simulated/floor{icon_state = "warning"},/area/hallway/secondary/entry/aft)
"btk" = (/obj/machinery/disposal/deliveryChute{dir = 1; name = "disposal inlet"},/obj/structure/disposalpipe/trunk{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/disposal)
"btl" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/disposal)
-"btm" = (/obj/machinery/camera/network/civilian_west{c_tag = "Waste Disposal"; dir = 8},/obj/item/ashtray/plastic{pixel_x = 5; pixel_y = -5},/obj/effect/decal/cleanable/ash,/obj/item/weapon/cigbutt/cigarbutt,/turf/simulated/floor/plating,/area/maintenance/disposal)
+"btm" = (/obj/machinery/door/window/northright{name = "Medbay Lobby"; req_access = list(5)},/obj/item/weapon/reagent_containers/spray/cleaner{pixel_x = -5},/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/medical/reception)
"btn" = (/turf/space,/area/supply/station)
"bto" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/quartermaster/storage)
"btp" = (/obj/machinery/status_display{density = 0; pixel_x = 0; pixel_y = 32},/obj/structure/closet/emcloset,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/quartermaster/storage)
@@ -3757,7 +3757,7 @@
"bum" = (/obj/structure/sign/redcross{desc = "The Star of Life, a symbol of Medical Aid."; icon_state = "lifestar"; name = "Medbay"; pixel_x = 32},/turf/simulated/floor{tag = "icon-whiteblue (SOUTHEAST)"; icon_state = "whiteblue"; dir = 6},/area/medical/reception)
"bun" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room)
"buo" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/syringes,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/item/weapon/screwdriver,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry)
-"bup" = (/obj/structure/table/standard,/obj/item/stack/sheet/metal{amount = 10},/turf/simulated/floor/engine,/area/rnd/misc_lab)
+"bup" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/storage/box/cups,/obj/item/weapon/storage/box/cups{pixel_x = 2; pixel_y = 5},/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor{dir = 9; icon_state = "blue"},/area/medical/reception)
"buq" = (/obj/structure/morgue,/turf/simulated/floor{icon_state = "blue"; dir = 10},/area/medical/morgue)
"bur" = (/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = -22},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/medical/morgue)
"bus" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor,/area/medical/morgue)
@@ -3768,20 +3768,20 @@
"bux" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{req_one_access = list(7,12)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/research_shuttle)
"buy" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/assembly/chargebay)
"buz" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/assembly/robotics)
-"buA" = (/obj/structure/table/standard,/obj/item/weapon/clipboard,/obj/item/weapon/stamp{name = "Quartermaster's stamp"; pixel_x = 0; pixel_y = 0},/turf/simulated/floor,/area/quartermaster/qm)
+"buA" = (/obj/structure/window/reinforced{dir = 1},/obj/item/weapon/paper_bin,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/medical/reception)
"buB" = (/obj/structure/table/woodentable,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/item/weapon/storage/box/matches,/obj/item/clothing/mask/smokable/cigarette/cigar,/obj/item/weapon/reagent_containers/food/drinks/flask{pixel_x = 8},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/carpet,/area/crew_quarters/captain)
"buC" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "bot"},/area/assembly/robotics)
"buD" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{icon_state = "bot"},/area/assembly/robotics)
"buE" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/hologram/holopad,/turf/simulated/floor{dir = 8; icon_state = "warnwhite"},/area/assembly/robotics)
"buF" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics)
-"buG" = (/obj/structure/table/standard,/obj/item/weapon/folder/yellow,/obj/item/weapon/pen{pixel_x = 4; pixel_y = 4},/obj/item/weapon/pen/red{pixel_x = 2; pixel_y = 6},/turf/simulated/floor,/area/quartermaster/qm)
+"buG" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/computer/med_data/laptop,/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/medical/reception)
"buH" = (/obj/structure/closet/firecloset,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{dir = 10; icon_state = "warnwhite"},/area/rnd/research)
"buI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
"buJ" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor{dir = 6; icon_state = "warnwhite"},/area/rnd/research)
"buK" = (/obj/machinery/computer/rdconsole/core,/turf/simulated/floor,/area/rnd/lab)
"buL" = (/obj/effect/landmark/start{name = "Scientist"},/turf/simulated/floor,/area/rnd/lab)
"buM" = (/obj/machinery/r_n_d/circuit_imprinter,/obj/item/weapon/reagent_containers/glass/beaker/sulphuric,/turf/simulated/floor,/area/rnd/lab)
-"buN" = (/obj/structure/table/standard,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/device/megaphone,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/quartermaster/qm)
+"buN" = (/obj/machinery/door/window/northright{name = "Medbay Lobby"; req_access = list(5)},/obj/item/device/radio/intercom{broadcasting = 0; canhear_range = 5; freerange = 0; frequency = 1485; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = 0; pixel_y = 3},/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/medical/reception)
"buO" = (/obj/structure/table/standard,/obj/item/weapon/folder/yellow,/obj/item/weapon/pen,/obj/machinery/requests_console{department = "Cargo Bay"; departmentType = 2; pixel_x = -30; pixel_y = 0},/turf/simulated/floor,/area/quartermaster/miningdock)
"buP" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/shuttle/research/station)
"buQ" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/research/station)
@@ -3875,14 +3875,14 @@
"bwA" = (/turf/simulated/floor{icon_state = "warnwhite"; dir = 1},/area/rnd/lab)
"bwB" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{icon_state = "warnwhite"; dir = 1},/area/rnd/lab)
"bwC" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor{dir = 4; icon_state = "warnwhitecorner"},/area/rnd/lab)
-"bwD" = (/obj/structure/table/standard,/obj/machinery/recharger{pixel_y = 0},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak)
+"bwD" = (/obj/structure/closet/secure_closet/medical_wall{name = "Pill Cabinet"; pixel_y = -32},/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/storage/pill_bottle/antitox,/obj/item/weapon/storage/pill_bottle/tramadol,/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room)
"bwE" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/storage/emergency)
"bwF" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/storage/emergency)
"bwG" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/research/station)
"bwH" = (/obj/structure/closet/crate,/turf/simulated/shuttle/floor,/area/shuttle/research/station)
"bwI" = (/obj/structure/grille,/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = -32},/obj/structure/cable/green,/obj/structure/window/reinforced/polarized,/obj/structure/window/reinforced/polarized{dir = 4},/obj/structure/window/reinforced/polarized{dir = 8},/turf/simulated/floor/plating,/area/crew_quarters/heads/hop)
"bwJ" = (/turf/simulated/shuttle/floor,/area/shuttle/research/station)
-"bwK" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/drinks/britcup,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak)
+"bwK" = (/obj/item/weapon/cane,/obj/item/weapon/cane{pixel_x = -3; pixel_y = 2},/obj/item/weapon/cane{pixel_x = -6; pixel_y = 4},/obj/item/weapon/storage/box/rxglasses,/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room)
"bwL" = (/turf/space,/area/shuttle/administration/station)
"bwM" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/quartermaster/storage)
"bwN" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/quartermaster/storage)
@@ -3905,7 +3905,7 @@
"bxe" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "loadingarea"},/area/hallway/primary/central_three)
"bxf" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor{icon_state = "delivery"},/area/hallway/primary/central_three)
"bxg" = (/obj/machinery/door/firedoor,/obj/machinery/door/blast/shutters{density = 0; dir = 4; icon_state = "shutter0"; id = "scanhideside"; name = "Diagnostics Room Privacy Shutters"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "whitered"},/area/medical/medbay4)
-"bxh" = (/obj/structure/table/standard,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/machinery/requests_console{department = "Janitorial"; departmentType = 1; pixel_y = -29},/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor,/area/janitor)
+"bxh" = (/obj/item/weapon/paper_bin{pixel_y = -10},/obj/item/weapon/folder/white{pixel_y = 0},/obj/item/weapon/pen,/obj/machinery/vending/wallmed1{name = "NanoMed Wall"; pixel_x = 25; pixel_y = 16},/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room)
"bxi" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/carpet,/area/crew_quarters/heads/hop)
"bxj" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/carpet,/area/crew_quarters/heads/hop)
"bxk" = (/turf/simulated/floor/carpet,/area/crew_quarters/heads/hop)
@@ -3921,7 +3921,7 @@
"bxu" = (/obj/machinery/cryopod/robot/right,/turf/simulated/floor,/area/assembly/chargebay)
"bxv" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/disposal)
"bxw" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/hallway/primary/central_two)
-"bxx" = (/obj/structure/table/standard,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/turf/simulated/floor,/area/janitor)
+"bxx" = (/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/assembly/robotics)
"bxy" = (/obj/structure/closet/secure_closet/medical1,/turf/simulated/floor{dir = 1; icon_state = "whiteyellow"},/area/medical/chemistry)
"bxz" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/door/airlock/glass_mining{name = "Cargo Bay"; req_access = list(31)},/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,/area/quartermaster/storage)
"bxA" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry)
@@ -4004,7 +4004,7 @@
"byZ" = (/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay3)
"bza" = (/obj/structure/closet/secure_closet/medical3,/obj/machinery/alarm{pixel_y = 25},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{tag = "icon-whiteblue (NORTHEAST)"; icon_state = "whiteblue"; dir = 5},/area/medical/medbay3)
"bzb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/medical/medbay2)
-"bzc" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/door/window/westleft{name = "Cargo Desk"; req_access = list(50)},/obj/structure/noticeboard{pixel_y = 27},/turf/simulated/floor,/area/quartermaster/office)
+"bzc" = (/obj/machinery/button/remote/blast_door{id = "medbayrecquar"; name = "Medbay Entrance Lockdown Shutters Control"; pixel_x = 6; pixel_y = 8; req_access = list(5)},/obj/item/device/radio{anchored = 1; broadcasting = 0; canhear_range = 1; frequency = 1487; icon = 'icons/obj/items.dmi'; icon_state = "red_phone"; listening = 1; name = "Reception Emergency Phone"; pixel_x = -5},/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor,/area/medical/reception)
"bzd" = (/turf/simulated/floor{dir = 1; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay2)
"bze" = (/obj/machinery/door/firedoor,/obj/structure/sign/examroom{pixel_y = 32},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2)
"bzf" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2)
@@ -4019,15 +4019,15 @@
"bzo" = (/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = -22},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 2; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/patient_wing)
"bzp" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/medical/patient_wing)
"bzq" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{tag = "icon-whitebluecorner (WEST)"; icon_state = "whitebluecorner"; dir = 8},/area/medical/patient_wing)
-"bzr" = (/obj/structure/table/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/noticeboard{pixel_y = 27},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "hop_office_desk"; name = "HoP Office Privacy Shutters"; opacity = 0},/obj/machinery/door/window/northleft{dir = 8; icon_state = "left"; name = "Reception Window"},/obj/machinery/door/window/brigdoor{base_state = "rightsecure"; dir = 4; icon_state = "rightsecure"; name = "Head of Personnel's Desk"; req_access = list(57)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/crew_quarters/heads/hop)
+"bzr" = (/obj/item/device/radio{anchored = 1; broadcasting = 0; canhear_range = 1; frequency = 1487; icon = 'icons/obj/items.dmi'; icon_state = "red_phone"; listening = 1; name = "Reception Emergency Phone"},/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor,/area/medical/reception)
"bzs" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/assembly/chargebay)
"bzt" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor,/area/assembly/chargebay)
"bzu" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/assembly/chargebay)
"bzv" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor,/area/assembly/chargebay)
"bzw" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green,/turf/simulated/floor,/area/assembly/chargebay)
"bzx" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/regular{pixel_x = 5; pixel_y = 5},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/random/firstaid,/turf/simulated/floor{dir = 8; icon_state = "whiteyellowcorner"},/area/medical/chemistry)
-"bzy" = (/obj/structure/table/standard,/obj/item/weapon/pen,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/item/device/megaphone,/turf/simulated/floor,/area/crew_quarters/heads/hop)
-"bzz" = (/obj/structure/table/standard,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/weapon/folder/yellow,/obj/item/device/eftpos{eftpos_name = "Cargo Bay EFTPOS scanner"},/turf/simulated/floor,/area/quartermaster/office)
+"bzy" = (/obj/machinery/computer/med_data/laptop,/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = -28},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room)
+"bzz" = (/obj/item/stack/cable_coil,/obj/item/device/flash,/obj/item/device/flash,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor,/area/assembly/robotics)
"bzA" = (/turf/simulated/wall,/area/rnd/research)
"bzB" = (/obj/machinery/light{dir = 8},/obj/machinery/computer/guestpass{pixel_x = -28},/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/turf/simulated/floor{dir = 2; icon_state = "whitecorner"},/area/rnd/research)
"bzC" = (/obj/effect/landmark{name = "lightsout"},/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "whitehall"; dir = 2},/area/rnd/research)
@@ -4168,7 +4168,7 @@
"bCh" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/disposalpipe/segment,/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,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/medical/medbay)
"bCi" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay3)
"bCj" = (/turf/simulated/floor{icon_state = "white"},/area/medical/medbay3)
-"bCk" = (/obj/structure/table/standard,/obj/machinery/requests_console{department = "Cargo Bay"; departmentType = 2; pixel_x = -30; pixel_y = 0},/obj/item/stack/sheet/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/stack/sheet/metal{amount = 50},/obj/item/device/multitool,/obj/machinery/camera/network/civilian_west{c_tag = "Cargo Office"; dir = 4},/turf/simulated/floor,/area/quartermaster/office)
+"bCk" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/door/window/westleft{name = "Cargo Desk"; req_access = list(50)},/obj/structure/noticeboard{pixel_y = 27},/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor,/area/quartermaster/office)
"bCl" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/medical/medbay2)
"bCm" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2)
"bCn" = (/obj/structure/table/standard,/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/item/weapon/reagent_containers/glass/bottle/stoxin{pixel_x = -6; pixel_y = 10},/obj/item/weapon/reagent_containers/glass/bottle/antitoxin{pixel_x = 5; pixel_y = 5},/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline{pixel_x = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/random/medical,/turf/simulated/floor{dir = 8; icon_state = "whiteyellow"},/area/medical/chemistry)
@@ -4312,7 +4312,7 @@
"bEV" = (/obj/effect/landmark/start{name = "Cyborg"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_cyborg_station)
"bEW" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_cyborg_station)
"bEX" = (/obj/effect/landmark/start{name = "Cyborg"},/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/turf/simulated/floor{icon_state = "vault"; dir = 1},/area/turret_protected/ai_cyborg_station)
-"bEY" = (/obj/structure/table/reinforced,/obj/machinery/door/window/eastright{dir = 1; name = "Emergency Kit"; req_access = list(5)},/obj/machinery/door/firedoor,/obj/item/weapon/storage/toolbox/emergency,/obj/item/bodybag/cryobag{pixel_x = 6},/obj/item/bodybag/cryobag{pixel_x = 6},/obj/item/bodybag/cryobag,/obj/item/device/radio{frequency = 1487; name = "Medbay Emergency Radio Link"},/turf/simulated/floor{dir = 1; icon_state = "whiteyellow"},/area/medical/sleeper)
+"bEY" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/noticeboard{pixel_y = 27},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "hop_office_desk"; name = "HoP Office Privacy Shutters"; opacity = 0},/obj/machinery/door/window/northleft{dir = 8; icon_state = "left"; name = "Reception Window"},/obj/machinery/door/window/brigdoor{base_state = "rightsecure"; dir = 4; icon_state = "rightsecure"; name = "Head of Personnel's Desk"; req_access = list(57)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor,/area/crew_quarters/heads/hop)
"bEZ" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 2; pixel_y = 3},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/turf/simulated/floor{icon_state = "white"},/area/rnd/lab)
"bFa" = (/obj/structure/table/rack,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/weapon/storage/belt/medical,/obj/item/clothing/accessory/stethoscope,/obj/item/clothing/accessory/stethoscope,/obj/item/clothing/accessory/stethoscope,/obj/item/clothing/accessory/stethoscope,/obj/item/clothing/accessory/stethoscope,/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = -22},/obj/machinery/camera/network/medbay{c_tag = "Medbay Equipment Storage"; dir = 1},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay3)
"bFb" = (/obj/structure/table/standard,/obj/machinery/cell_charger,/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor{icon_state = "white"},/area/rnd/lab)
@@ -4588,7 +4588,7 @@
"bKl" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plating,/area/maintenance/research_shuttle)
"bKm" = (/obj/structure/closet/crate,/obj/item/device/multitool,/obj/item/device/multitool,/obj/item/device/assembly/prox_sensor,/obj/item/device/flashlight,/obj/item/weapon/storage/backpack,/turf/simulated/floor/plating,/area/maintenance/research_shuttle)
"bKn" = (/obj/structure/table/rack,/obj/item/weapon/extinguisher,/obj/item/weapon/storage/belt/utility,/obj/item/clothing/mask/gas,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/research_shuttle)
-"bKo" = (/obj/structure/table/standard,/obj/machinery/newscaster{pixel_x = -27; pixel_y = 1},/obj/item/weapon/tape_roll,/obj/item/weapon/storage/firstaid/regular{pixel_x = 6; pixel_y = -5},/turf/simulated/floor,/area/quartermaster/office)
+"bKo" = (/obj/machinery/requests_console{department = "Cargo Bay"; departmentType = 2; pixel_x = -30; pixel_y = 0},/obj/item/device/multitool,/obj/machinery/camera/network/civilian_west{c_tag = "Cargo Office"; dir = 4},/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor,/area/quartermaster/office)
"bKp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/rnd/test_area)
"bKq" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/rnd/test_area)
"bKr" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/rnd/test_area)
@@ -4641,9 +4641,9 @@
"bLm" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "cmooffice"; name = "CMO Office Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/medbay4)
"bLn" = (/obj/machinery/ai_status_display{pixel_y = 32},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "warningcorner"; dir = 4},/area/hallway/primary/central_three)
"bLo" = (/turf/simulated/wall,/area/medical/genetics_cloning)
-"bLp" = (/obj/structure/computerframe,/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor{icon_state = "floorgrime"},/area/medical/genetics)
+"bLp" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/weapon/folder/yellow,/obj/item/device/eftpos{eftpos_name = "Cargo Bay EFTPOS scanner"},/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor,/area/quartermaster/office)
"bLq" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/constructable_frame/machine_frame,/turf/simulated/floor/plating,/area/medical/genetics)
-"bLr" = (/obj/item/weapon/shard,/turf/simulated/floor{icon_state = "floorgrime"},/area/medical/genetics)
+"bLr" = (/obj/item/weapon/pen,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/item/device/megaphone,/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor,/area/crew_quarters/heads/hop)
"bLs" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/medical/genetics)
"bLt" = (/obj/structure/window/reinforced,/obj/structure/computerframe,/turf/simulated/floor{icon_state = "floorgrime"},/area/medical/genetics)
"bLu" = (/obj/structure/disposalpipe/segment,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/effect/decal/cleanable/dirt,/obj/structure/cable{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/plating,/area/maintenance/research_port)
@@ -4659,7 +4659,7 @@
"bLE" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/rnd/storage)
"bLF" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
"bLG" = (/obj/machinery/light_switch{pixel_y = -23},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
-"bLH" = (/obj/structure/table/standard,/obj/machinery/photocopier/faxmachine{department = "Head of Personnel's Office"},/turf/simulated/floor,/area/crew_quarters/heads/hop)
+"bLH" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/item/weapon/storage/belt/utility,/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor,/area/quartermaster/office)
"bLI" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "warningcorner"; dir = 8},/area/hallway/primary/central_three)
"bLJ" = (/obj/structure/closet/secure_closet/RD,/obj/structure/window/reinforced,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bLK" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/structure/window/reinforced,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
@@ -4712,11 +4712,11 @@
"bMF" = (/obj/structure/table/rack,/obj/item/weapon/rig/hazmat/equipped,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bMG" = (/obj/structure/reagent_dispensers/water_cooler,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak)
"bMH" = (/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced/polarized{dir = 8},/obj/structure/window/reinforced/polarized,/obj/structure/window/reinforced/polarized{dir = 4},/turf/simulated/floor/plating,/area/rnd/research)
-"bMI" = (/obj/structure/noticeboard{pixel_y = 28},/obj/structure/table/woodentable,/obj/item/weapon/book/manual/medical_diagnostics_manual{pixel_y = 7},/obj/item/device/radio{anchored = 1; broadcasting = 0; canhear_range = 4; frequency = 1487; icon = 'icons/obj/items.dmi'; icon_state = "red_phone"; listening = 1; name = "Break Room Emergency Phone"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak)
+"bMI" = (/obj/item/weapon/folder/blue,/obj/item/weapon/stamp/hop,/obj/item/device/eftpos{eftpos_name = "HoP EFTPOS scanner"},/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor,/area/crew_quarters/heads/hop)
"bMJ" = (/obj/machinery/light{dir = 1},/obj/structure/bookcase/manuals/medical,/obj/item/weapon/book/manual/stasis,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak)
"bMK" = (/turf/simulated/wall,/area/crew_quarters/medbreak)
"bML" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor{icon_state = "floorgrime"},/area/medical/genetics)
-"bMM" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor{icon_state = "floorgrime"},/area/medical/genetics)
+"bMM" = (/obj/machinery/door/window/eastright{dir = 1; name = "Emergency Kit"; req_access = list(5)},/obj/machinery/door/firedoor,/obj/item/weapon/storage/toolbox/emergency,/obj/item/bodybag/cryobag{pixel_x = 6},/obj/item/bodybag/cryobag{pixel_x = 6},/obj/item/bodybag/cryobag,/obj/item/device/radio{frequency = 1487; name = "Medbay Emergency Radio Link"},/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor{dir = 1; icon_state = "whiteyellow"},/area/medical/sleeper)
"bMN" = (/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/obj/structure/cable{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/plating,/area/maintenance/research_port)
"bMO" = (/turf/simulated/wall/r_wall,/area/rnd/misc_lab)
"bMP" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/shuttle/plating,/area/rnd/docking)
@@ -4748,14 +4748,14 @@
"bNp" = (/obj/structure/disposalpipe/segment,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor,/area/quartermaster/miningdock)
"bNq" = (/obj/machinery/hologram/holopad,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/hallway/primary/central_three)
"bNr" = (/obj/structure/closet/secure_closet/quartermaster,/turf/simulated/floor,/area/quartermaster/qm)
-"bNs" = (/obj/structure/table/standard,/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/item/device/radio/intercom{broadcasting = 0; name = "Station Intercom (General)"; pixel_y = 20},/obj/item/weapon/wrench,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 7; pixel_y = 1},/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = -4; pixel_y = 0},/obj/machinery/camera/network/medbay{c_tag = "Medbay Cryogenics"},/turf/simulated/floor{dir = 5; icon_state = "whitered"},/area/medical/cryo)
+"bNs" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/item/device/radio/intercom{broadcasting = 0; name = "Station Intercom (General)"; pixel_y = 20},/obj/item/weapon/wrench,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 7; pixel_y = 1},/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = -4; pixel_y = 0},/obj/machinery/camera/network/medbay{c_tag = "Medbay Cryogenics"},/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor{dir = 5; icon_state = "whitered"},/area/medical/cryo)
"bNt" = (/obj/structure/table,/turf/simulated/floor/plating,/area/medical/genetics)
"bNu" = (/obj/structure/closet/crate,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/cargo)
"bNv" = (/obj/structure/closet/crate,/turf/simulated/floor/plating,/area/maintenance/cargo)
"bNw" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{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/plating,/area/maintenance/cargo)
"bNx" = (/turf/simulated/wall,/area/maintenance/cargo)
"bNy" = (/turf/simulated/wall,/area/storage/tech)
-"bNz" = (/obj/structure/table/standard,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/item/weapon/storage/belt/utility,/turf/simulated/floor,/area/quartermaster/office)
+"bNz" = (/obj/machinery/newscaster{pixel_x = -27; pixel_y = 1},/obj/item/weapon/tape_roll,/obj/item/weapon/storage/firstaid/regular{pixel_x = 6; pixel_y = -5},/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor,/area/quartermaster/office)
"bNA" = (/obj/machinery/light/small{dir = 1},/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor/plating,/area/storage/tech)
"bNB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor,/area/hallway/primary/central_three)
"bNC" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/matter_bin,/obj/item/weapon/stock_parts/matter_bin,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/capacitor,/turf/simulated/floor/plating,/area/storage/tech)
@@ -4805,7 +4805,7 @@
"bOu" = (/obj/item/device/radio/intercom{pixel_y = 25},/turf/simulated/floor/engine,/area/rnd/misc_lab)
"bOv" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/engine,/area/rnd/misc_lab)
"bOw" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/light{dir = 1},/turf/simulated/floor/engine,/area/rnd/misc_lab)
-"bOx" = (/obj/structure/table/standard,/obj/item/weapon/folder/blue,/obj/item/weapon/stamp/hop,/obj/item/device/eftpos{eftpos_name = "HoP EFTPOS scanner"},/turf/simulated/floor,/area/crew_quarters/heads/hop)
+"bOx" = (/obj/machinery/photocopier/faxmachine{department = "Head of Personnel's Office"},/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor,/area/crew_quarters/heads/hop)
"bOy" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/light/small{dir = 8},/turf/simulated/floor,/area/rnd/storage)
"bOz" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/rnd/storage)
"bOA" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/rnd/storage)
@@ -4838,7 +4838,7 @@
"bPb" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/storage/tech)
"bPc" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/storage/tech)
"bPd" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/storage/tech)
-"bPe" = (/obj/structure/table/standard,/obj/item/stack/sheet/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/stack/sheet/metal{amount = 50},/obj/item/clothing/glasses/welding,/turf/simulated/floor{dir = 1; icon_state = "whitepurple"},/area/rnd/lab)
+"bPe" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/device/megaphone,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor,/area/quartermaster/qm)
"bPf" = (/turf/simulated/floor/plating,/area/storage/tech)
"bPg" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/storage/tech)
"bPh" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/plating,/area/storage/tech)
@@ -4864,15 +4864,15 @@
"bPB" = (/mob/living/simple_animal/cat/fluff/Runtime,/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo)
"bPC" = (/obj/machinery/door/airlock/external{name = "Toxins Test Chamber"},/turf/simulated/floor/plating/airless,/area/rnd/test_area)
"bPD" = (/obj/machinery/light{dir = 1},/obj/machinery/camera/network/research{c_tag = "Research - Toxins Test Chamber North"; network = list("Research","Toxins Test Area")},/turf/simulated/floor/airless,/area/rnd/test_area)
-"bPE" = (/obj/structure/table/standard,/turf/simulated/floor{dir = 1; icon_state = "whitepurple"},/area/rnd/lab)
+"bPE" = (/obj/item/weapon/clipboard,/obj/item/weapon/stamp{name = "Quartermaster's stamp"; pixel_x = 0; pixel_y = 0},/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor,/area/quartermaster/qm)
"bPF" = (/obj/machinery/light/small{dir = 4; pixel_y = 8},/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "mining_dock_airlock"; pixel_x = 25; pixel_y = -5; req_one_access = list(13,48); tag_airpump = "mining_dock_pump"; tag_chamber_sensor = "mining_dock_sensor"; tag_exterior_door = "mining_dock_outer"; tag_interior_door = "mining_dock_inner"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "mining_dock_sensor"; pixel_x = 25; pixel_y = 8},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1; icon_state = "map"; tag = "icon-manifold-f (NORTH)"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/quartermaster/miningdock)
"bPG" = (/obj/structure/table/standard,/obj/item/weapon/autopsy_scanner,/obj/item/weapon/scalpel,/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/medical/morgue)
"bPH" = (/obj/structure/closet,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/quartermaster/qm)
"bPI" = (/obj/structure/disposalpipe/segment,/obj/machinery/newscaster{pixel_x = 30},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2)
"bPJ" = (/obj/structure/table/standard,/obj/item/weapon/storage/belt/utility,/obj/item/clothing/gloves/latex,/turf/simulated/floor{icon_state = "white"},/area/rnd/lab)
-"bPK" = (/obj/structure/table/standard,/obj/item/weapon/book/manual/robotics_cyborgs{pixel_x = 2; pixel_y = 5},/obj/item/weapon/storage/belt/utility,/obj/machinery/requests_console{department = "Robotics"; departmentType = 2; name = "Robotics RC"; pixel_y = 30},/obj/machinery/light{dir = 1},/obj/item/weapon/storage/belt/utility,/obj/item/weapon/reagent_containers/glass/beaker/large,/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics)
+"bPK" = (/obj/item/weapon/folder/yellow,/obj/item/weapon/pen{pixel_x = 4; pixel_y = 4},/obj/item/weapon/pen/red{pixel_x = 2; pixel_y = 6},/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor,/area/quartermaster/qm)
"bPL" = (/obj/structure/table/standard,/obj/item/device/camera{name = "Autopsy Camera"; pixel_x = -2; pixel_y = 7},/obj/item/weapon/paper_bin{pixel_y = -6},/obj/item/weapon/pen/red{pixel_x = -1; pixel_y = -9},/obj/item/weapon/pen/blue{pixel_x = 3; pixel_y = -5},/turf/simulated/floor{dir = 9; icon_state = "blue"},/area/medical/morgue)
-"bPM" = (/obj/structure/table/standard,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/item/weapon/storage/box/cups{pixel_x = 0; pixel_y = 0},/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/reception)
+"bPM" = (/obj/structure/computerframe,/obj/item/weapon/material/shard{icon_state = "medium"},/turf/simulated/floor{icon_state = "floorgrime"},/area/medical/genetics)
"bPN" = (/obj/machinery/computer/med_data,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak)
"bPO" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{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/plating,/area/maintenance/research_port)
"bPP" = (/obj/machinery/sparker{id = "Xenobio"; pixel_x = -25},/turf/simulated/floor/engine,/area/rnd/misc_lab)
@@ -4927,7 +4927,7 @@
"bQM" = (/obj/structure/table/standard,/obj/machinery/newscaster/security_unit{pixel_x = 0; pixel_y = 32},/obj/machinery/recharger{pixel_y = 0},/obj/item/weapon/packageWrap,/obj/item/weapon/hand_labeler,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/crew_quarters/heads/hop)
"bQN" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/light,/turf/simulated/floor,/area/janitor)
"bQO" = (/obj/structure/janitorialcart,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor,/area/janitor)
-"bQP" = (/obj/item/weapon/beartrap,/obj/item/weapon/storage/box/mousetraps,/obj/item/weapon/storage/box/mousetraps,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/weapon/beartrap,/turf/simulated/floor,/area/janitor)
+"bQP" = (/obj/item/weapon/material/shard,/turf/simulated/floor{icon_state = "floorgrime"},/area/medical/genetics)
"bQQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/janitor)
"bQR" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/janitor)
"bQS" = (/obj/effect/decal/cleanable/cobweb,/obj/effect/decal/cleanable/generic,/turf/simulated/floor/plating,/area/maintenance/engineering)
@@ -5171,7 +5171,7 @@
"bVw" = (/obj/machinery/vending/cigarette{pixel_x = 0; pixel_y = 2},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
"bVx" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/rnd/research)
"bVy" = (/obj/structure/table/standard,/obj/machinery/cell_charger,/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics)
-"bVz" = (/obj/structure/table/standard,/obj/item/stack/sheet/plasteel{amount = 10},/obj/item/stack/cable_coil,/obj/item/device/flash,/obj/item/device/flash,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/assembly/robotics)
+"bVz" = (/obj/structure/noticeboard{pixel_y = 28},/obj/item/weapon/book/manual/medical_diagnostics_manual{pixel_y = 7},/obj/item/device/radio{anchored = 1; broadcasting = 0; canhear_range = 4; frequency = 1487; icon = 'icons/obj/items.dmi'; icon_state = "red_phone"; listening = 1; name = "Break Room Emergency Phone"},/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak)
"bVA" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "bot"},/area/rnd/research)
"bVB" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/wall/r_wall,/area/rnd/mixing)
"bVC" = (/obj/structure/table/woodentable,/obj/item/weapon/book/manual/engineering_guide{pixel_x = 3; pixel_y = 2},/obj/item/weapon/book/manual/atmospipes,/obj/machinery/light{dir = 1},/turf/simulated/floor/carpet,/area/engineering/break_room)
@@ -5193,7 +5193,7 @@
"bVS" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/cargo)
"bVT" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/cargo)
"bVU" = (/obj/structure/disposalpipe/segment,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/cable{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/plating,/area/maintenance/cargo)
-"bVV" = (/obj/structure/table/standard,/obj/machinery/computer/med_data/laptop,/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = -28},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room)
+"bVV" = (/obj/item/weapon/material/shard{icon_state = "medium"},/turf/simulated/floor{icon_state = "floorgrime"},/area/medical/genetics)
"bVW" = (/obj/machinery/light/small,/turf/simulated/floor/plating,/area/storage/tech)
"bVX" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/obj/item/clothing/gloves/yellow,/obj/item/device/t_scanner,/obj/item/clothing/glasses/meson,/obj/item/device/multitool,/turf/simulated/floor/plating,/area/storage/tech)
"bVY" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/device/analyzer/plant_analyzer,/obj/item/device/healthanalyzer,/obj/item/device/analyzer,/obj/item/device/analyzer,/turf/simulated/floor/plating,/area/storage/tech)
@@ -5232,7 +5232,7 @@
"bWF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "whiteredcorner"},/area/medical/patient_wing)
"bWG" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor{dir = 1; icon_state = "whitered_a"; tag = "icon-whitered_a (WEST)"},/area/medical/patient_wing)
"bWH" = (/obj/structure/bed/chair/comfy/beige,/obj/effect/landmark/start{name = "Station Engineer"},/turf/simulated/floor/carpet,/area/engineering/break_room)
-"bWI" = (/obj/structure/table/standard,/obj/item/device/radio{anchored = 1; broadcasting = 0; canhear_range = 1; frequency = 1487; icon = 'icons/obj/items.dmi'; icon_state = "red_phone"; listening = 1; name = "Reception Emergency Phone"},/turf/simulated/floor,/area/medical/reception)
+"bWI" = (/obj/structure/table/standard,/turf/simulated/floor/engine,/area/rnd/misc_lab)
"bWJ" = (/turf/simulated/floor/carpet,/area/engineering/break_room)
"bWK" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/turf/simulated/floor{dir = 1; icon_state = "whitered_b"; tag = "icon-whitered_b (WEST)"},/area/medical/patient_wing)
"bWL" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor{dir = 1; icon_state = "whiteredcorner"},/area/medical/patient_wing)
@@ -5263,7 +5263,7 @@
"bXk" = (/turf/simulated/floor/airless{dir = 5; icon_state = "warning"},/area/rnd/test_area)
"bXl" = (/turf/simulated/floor/airless{icon_state = "warningcorner"; dir = 4},/area/rnd/test_area)
"bXm" = (/obj/structure/window/shuttle,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/escape_pod5/station)
-"bXn" = (/obj/structure/table/standard,/obj/machinery/button/remote/blast_door{id = "medbayrecquar"; name = "Medbay Entrance Lockdown Shutters Control"; pixel_x = 6; pixel_y = 8; req_access = list(5)},/obj/item/device/radio{anchored = 1; broadcasting = 0; canhear_range = 1; frequency = 1487; icon = 'icons/obj/items.dmi'; icon_state = "red_phone"; listening = 1; name = "Reception Emergency Phone"; pixel_x = -5},/turf/simulated/floor,/area/medical/reception)
+"bXn" = (/obj/item/weapon/reagent_containers/food/drinks/britcup,/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak)
"bXo" = (/obj/structure/closet/wardrobe/atmospherics_yellow,/turf/simulated/floor{icon_state = "yellowfull"; dir = 8},/area/crew_quarters/sleep/engi_wash)
"bXp" = (/obj/machinery/atmospherics/pipe/manifold/visible,/obj/machinery/meter,/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing)
"bXq" = (/obj/machinery/atmospherics/unary/heat_exchanger{dir = 4},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/rnd/mixing)
@@ -5461,14 +5461,14 @@
"cba" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/research_starboard)
"cbb" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating/airless,/area/maintenance/atmos_control)
"cbc" = (/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/research_starboard)
-"cbd" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table/standard,/obj/machinery/computer/med_data/laptop,/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/medical/reception)
+"cbd" = (/obj/machinery/recharger{pixel_y = 0},/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/medbreak)
"cbe" = (/obj/item/weapon/wrench,/turf/simulated/floor/plating,/area/maintenance/research_starboard)
"cbf" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod{frequency = 1380; id_tag = "escape_pod_5"; pixel_x = 0; pixel_y = -25; tag_door = "escape_pod_5_hatch"},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod5/station)
"cbg" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_5_hatch"; locked = 1; name = "Escape Pod Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod5/station)
"cbh" = (/obj/effect/decal/cleanable/spiderling_remains,/obj/machinery/atmospherics/valve,/turf/simulated/floor/plating,/area/maintenance/research_starboard)
"cbi" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_5_berth_hatch"; locked = 1; name = "Escape Pod"; req_access = list(13)},/turf/simulated/floor/plating,/area/maintenance/cargo)
"cbj" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/camera/network/medbay{c_tag = "Medbay Patient Hallway - Starboard"; dir = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/patient_wing)
-"cbk" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table/standard,/obj/item/weapon/paper_bin,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/medical/reception)
+"cbk" = (/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/machinery/requests_console{department = "Janitorial"; departmentType = 1; pixel_y = -29},/obj/item/weapon/reagent_containers/spray/cleaner,/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor,/area/janitor)
"cbl" = (/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "eng_eva_sensor"; pixel_x = 0; pixel_y = 25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "eng_eva_pump"},/turf/simulated/floor{dir = 9; icon_state = "floorgrimecaution"},/area/maintenance/atmos_control)
"cbm" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/camera/network/research{c_tag = "Research Division South"; dir = 1},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
"cbn" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 5},/turf/simulated/floor/engine/vacuum,/area/rnd/mixing)
@@ -5500,7 +5500,7 @@
"cbN" = (/turf/simulated/floor{icon_state = "white"},/area/medical/ward)
"cbO" = (/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/window/reinforced/polarized{dir = 1},/obj/structure/window/reinforced/polarized{dir = 8},/obj/structure/window/reinforced/polarized,/obj/structure/window/reinforced/polarized{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/heads/chief)
"cbP" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/wood,/area/medical/psych)
-"cbQ" = (/obj/structure/table/standard,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/storage/box/cups,/obj/item/weapon/storage/box/cups{pixel_x = 2; pixel_y = 5},/turf/simulated/floor{dir = 9; icon_state = "blue"},/area/medical/reception)
+"cbQ" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor,/area/janitor)
"cbR" = (/obj/structure/bed/roller,/turf/simulated/floor{icon_state = "white"},/area/medical/patient_wing)
"cbS" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "dark"},/area/medical/biostorage)
"cbT" = (/obj/structure/closet/crate{icon_state = "crateopen"; name = "Grenade Crate"; opened = 1},/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/grenade/chem_grenade,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/turf/simulated/floor{icon_state = "dark"},/area/medical/biostorage)
@@ -5577,7 +5577,7 @@
"cdm" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{autoclose = 0; name = "Diagnostics Room"; req_access = list(5)},/turf/simulated/floor{dir = 8; icon_state = "whitered"},/area/medical/medbay4)
"cdn" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/turf/simulated/floor{icon_state = "white_halfo"},/area/medical/medbay4)
"cdo" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white_halfp"},/area/medical/medbay4)
-"cdp" = (/obj/structure/table/standard,/obj/machinery/door/window/northright{name = "Medbay Lobby"; req_access = list(5)},/obj/item/weapon/reagent_containers/spray/cleaner{pixel_x = -5},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/medical/reception)
+"cdp" = (/obj/item/weapon/beartrap,/obj/item/weapon/storage/box/mousetraps,/obj/item/weapon/storage/box/mousetraps,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/weapon/beartrap,/turf/simulated/floor,/area/janitor)
"cdq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "whitered"},/area/medical/ward)
"cdr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/ward)
"cds" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "white"},/area/medical/ward)
@@ -5594,7 +5594,7 @@
"cdD" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/research_port)
"cdE" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/medical/virologyaccess)
"cdF" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/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/carpet,/area/engineering/break_room)
-"cdG" = (/obj/structure/table/standard,/obj/item/weapon/paper_bin{pixel_y = -10},/obj/item/weapon/folder/white{pixel_y = 0},/obj/item/weapon/pen,/obj/machinery/vending/wallmed1{name = "NanoMed Wall"; pixel_x = 25; pixel_y = 16},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room)
+"cdG" = (/obj/structure/disposalpipe/segment,/obj/machinery/camera/network/medbay{c_tag = "Medbay Lounge"},/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay4)
"cdH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/medical/virologyaccess)
"cdI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/research_port)
"cdJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/research_port)
@@ -5628,14 +5628,14 @@
"cel" = (/obj/structure/closet/secure_closet/engineering_chief,/obj/item/weapon/tank/emergency_oxygen/engi,/turf/simulated/floor,/area/crew_quarters/heads/chief)
"cem" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/carpet,/area/engineering/break_room)
"cen" = (/obj/machinery/iv_drip,/turf/simulated/floor{icon_state = "white"},/area/medical/patient_wing)
-"ceo" = (/obj/structure/table/standard,/obj/machinery/door/window/northright{name = "Medbay Lobby"; req_access = list(5)},/obj/item/device/radio/intercom{broadcasting = 0; canhear_range = 5; freerange = 0; frequency = 1485; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = 0; pixel_y = 3},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/medical/reception)
-"cep" = (/obj/structure/table/standard,/obj/item/weapon/cane,/obj/item/weapon/cane{pixel_x = -3; pixel_y = 2},/obj/item/weapon/cane{pixel_x = -6; pixel_y = 4},/obj/item/weapon/storage/box/rxglasses,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room)
+"ceo" = (/obj/item/weapon/reagent_containers/spray/cleaner,/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/patient_wing)
+"cep" = (/obj/item/weapon/material/shard,/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/research_port)
"ceq" = (/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/purple,/turf/simulated/floor{dir = 2; icon_state = "whitegreen"},/area/rnd/xenobiology)
"cer" = (/obj/machinery/keycard_auth{pixel_x = -24; pixel_y = 0},/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for engine core."; id = "EngineVent"; name = "Engine Ventillatory Control"; pixel_x = -24; pixel_y = 10; req_access = list(10)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/button/remote/airlock{desc = "A remote control-switch for the engine core airlock hatch bolts."; id = "engine_access_hatch"; name = "Engine Hatch Bolt Control"; pixel_x = -24; pixel_y = -10; req_access = list(10); specialfunctions = 4},/turf/simulated/floor,/area/crew_quarters/heads/chief)
"ces" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/disposalpipe/segment,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/maintenance/atmos_control)
"cet" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/atmos_control)
"ceu" = (/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/window/reinforced/polarized{dir = 8},/obj/structure/window/reinforced/polarized{dir = 4},/obj/structure/window/reinforced/polarized{dir = 1},/turf/simulated/floor/plating,/area/crew_quarters/heads/chief)
-"cev" = (/obj/structure/table/standard,/obj/structure/closet/secure_closet/medical_wall{name = "Pill Cabinet"; pixel_y = -32},/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/storage/pill_bottle/antitox,/obj/item/weapon/storage/pill_bottle/tramadol,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room)
+"cev" = (/obj/structure/table/standard,/obj/item/clothing/head/welding{pixel_x = -5; pixel_y = 3},/obj/item/clothing/glasses/welding,/obj/structure/closet/fireaxecabinet{pixel_y = 32},/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/engineering/atmos)
"cew" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{dir = 8; icon_state = "yellowcorner"},/area/engineering/foyer)
"cex" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/camera/network/engineering{c_tag = "Engineering Break Room"; dir = 8},/turf/simulated/floor/carpet,/area/engineering/break_room)
"cey" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/engineering/foyer)
@@ -5665,7 +5665,7 @@
"ceW" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/engineering/break_room)
"ceX" = (/obj/structure/noticeboard{pixel_x = 32; pixel_y = 0},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/engineering/break_room)
"ceY" = (/obj/machinery/light,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/sleep/engi_wash)
-"ceZ" = (/obj/structure/table/standard,/obj/item/stack/sheet/glass{amount = 20; pixel_x = -3; pixel_y = 6},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/assembly/robotics)
+"ceZ" = (/obj/structure/table/standard,/obj/machinery/newscaster{pixel_y = 30},/obj/item/clothing/gloves/black,/obj/item/clothing/gloves/black,/obj/item/weapon/storage/belt/utility/atmostech,/obj/item/weapon/storage/belt/utility/atmostech,/turf/simulated/floor,/area/engineering/atmos)
"cfa" = (/obj/structure/bed/chair,/turf/simulated/floor,/area/medical/surgeryobs)
"cfb" = (/obj/structure/closet/secure_closet/hydroponics{req_access = list(47)},/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora_storage)
"cfc" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/smartfridge/drying_rack,/turf/simulated/floor{tag = "icon-whitegreen_v (NORTHEAST)"; icon_state = "whitegreen_v"; dir = 5},/area/rnd/xenobiology/xenoflora_storage)
@@ -5674,7 +5674,7 @@
"cff" = (/obj/structure/sign/securearea,/turf/simulated/wall,/area/rnd/xenobiology)
"cfg" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/disposalpipe/trunk,/obj/machinery/disposal,/obj/structure/sign/deathsposal{pixel_x = 0; pixel_y = 32},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor{dir = 8; icon_state = "whitegreen"},/area/rnd/xenobiology/xenoflora)
"cfh" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/hydroponics{closed_system = 1; name = "isolation tray"},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology/xenoflora)
-"cfi" = (/obj/item/weapon/shard,/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/research_port)
+"cfi" = (/obj/structure/closet/crate,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = 28},/turf/simulated/floor/plating,/area/engineering/storage)
"cfj" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{req_one_access = list(12,47)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/rnd/xenobiology)
"cfk" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{req_one_access = list(12,47)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/turf/simulated/floor/plating,/area/rnd/xenobiology)
"cfl" = (/obj/structure/table/standard,/obj/item/weapon/hand_labeler,/obj/item/weapon/pen,/obj/item/weapon/packageWrap,/obj/item/weapon/packageWrap,/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor{icon_state = "white"},/area/rnd/lab)
@@ -6083,7 +6083,7 @@
"cmY" = (/obj/machinery/door/blast/regular{desc = "By gods, release the hounds!"; id = "xenobioout6"; name = "Containment Release"},/turf/simulated/floor/engine,/area/rnd/xenobiology)
"cmZ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/solar/starboard)
"cna" = (/obj/structure/cable/yellow,/turf/simulated/floor/plating/airless,/area/solar/starboard)
-"cnb" = (/obj/structure/table/standard,/obj/item/stack/sheet/glass{amount = 50},/obj/item/clothing/head/welding{pixel_x = -5; pixel_y = 3},/obj/item/clothing/glasses/welding,/obj/structure/closet/fireaxecabinet{pixel_y = 32},/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/engineering/atmos)
+"cnb" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table/reinforced,/turf/simulated/floor,/area/engineering/workshop)
"cnc" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
"cnd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
"cne" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering EVA Storage"; req_one_access = list(11,24)},/turf/simulated/floor,/area/engineering/engine_eva)
@@ -6128,7 +6128,7 @@
"cnR" = (/turf/simulated/wall/r_wall,/area/engineering/locker_room)
"cnS" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{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/plating{dir = 4; icon_state = "warnplatecorner"},/area/maintenance/engineering)
"cnT" = (/obj/structure/table/standard,/obj/item/device/t_scanner,/obj/item/device/multitool{pixel_x = 5},/obj/item/device/radio/headset/headset_eng,/obj/item/weapon/cartridge/atmos,/obj/item/weapon/cartridge/atmos,/obj/item/device/pipe_painter,/obj/machinery/requests_console{department = "Atmospherics"; departmentType = 4; name = "Atmos RC"; pixel_x = 0; pixel_y = 28},/turf/simulated/floor,/area/engineering/atmos)
-"cnU" = (/obj/structure/table/standard,/obj/machinery/newscaster{pixel_y = 30},/obj/item/stack/sheet/metal{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/clothing/gloves/black,/obj/item/clothing/gloves/black,/obj/item/weapon/storage/belt/utility/atmostech,/obj/item/weapon/storage/belt/utility/atmostech,/turf/simulated/floor,/area/engineering/atmos)
+"cnU" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/reinforced,/turf/simulated/floor,/area/engineering/workshop)
"cnV" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/syringes,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology)
"cnW" = (/obj/machinery/computer/med_data,/obj/machinery/light,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
"cnX" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/glass_jar,/obj/item/glass_jar,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology)
@@ -6158,7 +6158,7 @@
"cov" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/engineering/atmos)
"cow" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/engineering/atmos)
"cox" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plating,/area/engineering/atmos)
-"coy" = (/obj/structure/table/standard,/obj/item/stack/sheet/mineral/phoron{amount = 5; layer = 2.9},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology)
+"coy" = (/obj/structure/table/standard,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology)
"coz" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/hallway/secondary/entry/port)
"coA" = (/obj/machinery/door/airlock/maintenance{name = "Engineering EVA Storage Maintainance"; req_access = list(12); req_one_access = list(11,24)},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/red,/turf/simulated/floor,/area/engineering/engine_eva)
"coB" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Locker 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},/turf/simulated/floor,/area/engineering/locker_room)
@@ -6378,7 +6378,6 @@
"csH" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgery2)
"csI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/medbay)
"csJ" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{dir = 9; icon_state = "warnwhite"},/area/medical/virology)
-"csK" = (/obj/structure/closet/crate,/obj/item/stack/sheet/mineral/phoron{amount = 25},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = 28},/turf/simulated/floor/plating,/area/engineering/storage)
"csL" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor{dir = 9; icon_state = "blue"},/area/engineering/atmos)
"csM" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "o2_in"; name = "Oxygen Supply Control"; output_tag = "o2_out"; sensors = list("o2_sensor" = "Tank")},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/light{dir = 1},/obj/machinery/camera/network/engineering{c_tag = "Atmospherics Northwest"},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/engineering/atmos)
"csN" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
@@ -6408,17 +6407,14 @@
"ctl" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor,/area/engineering)
"ctm" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plating,/area/maintenance/medbay)
"ctn" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/engineering/workshop)
-"cto" = (/obj/structure/window/reinforced{dir = 1},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/structure/table/reinforced,/turf/simulated/floor,/area/engineering/workshop)
"ctp" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "surgeryobs"; name = "Operating Theatre Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/surgeryobs)
"ctq" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "surgeryobs"; name = "Operating Theatre Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/surgeryobs)
"ctr" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "surgeryobs"; name = "Operating Theatre Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/surgeryobs)
"cts" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology)
"ctt" = (/obj/structure/window/reinforced{dir = 1},/obj/item/stack/rods{amount = 50},/obj/item/weapon/airlock_electronics,/obj/item/weapon/airlock_electronics,/obj/item/weapon/cell/high,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/table/reinforced,/turf/simulated/floor,/area/engineering/workshop)
-"ctu" = (/obj/structure/window/reinforced{dir = 1},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/reinforced,/turf/simulated/floor,/area/engineering/workshop)
"ctv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/engineering)
"ctw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/engineering)
"ctx" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/light,/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for shutters."; id = "virologyquar"; name = "Virology Emergency Lockdown Control"; pixel_x = 0; pixel_y = -28; req_access = list(5)},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "greencorner"},/area/medical/virologyaccess)
-"cty" = (/obj/structure/window/reinforced{dir = 1},/obj/item/stack/sheet/plasteel{amount = 10},/obj/item/stack/sheet/plasteel{amount = 10},/obj/item/stack/sheet/mineral/plastic{amount = 10},/obj/structure/table/reinforced,/turf/simulated/floor,/area/engineering/workshop)
"ctz" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/medbay)
"ctA" = (/obj/machinery/light/small{dir = 1},/obj/item/weapon/cigbutt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/medbay)
"ctB" = (/obj/structure/table/reinforced,/obj/machinery/button/remote/blast_door{id = "xenobio3"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access = list(55)},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/rnd/xenobiology)
@@ -7452,8 +7448,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaIaafcKrapgaavaaacKrapgaavaaacKrapgaavaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaadDadEacuadYadpadpadpadpadfadpaecadradaacQadvadHadIadJakEadLadUajtajtajtadVadPacradQadlabbadRaehaicabbaaLaaLaafaaaaafaaaaaLaafaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaIaafcKrapgaavaaacKrapgaavaafcKrapgaavaafaafaafaaaaafaafaaaaaaaaaaaaaaaadTadEacuacuaeqaeoaevaeuaezaexacuacuaeBacQadbaebaddadZaeaadyadUajtaebajtaetaedacradQaeeabbabbabbabbabbaaLaaaaaaaaaaaaaaaaaaaafaafaafaaaaaaaafaafaaLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaqaafcKrarDaavaaacKrarDaavaaacKrarDaavaafaaaaafaafaafaaaaaaaaaaaaaaaaaaadTaegacuacuacuacuacuacuaePacuacuacuarrarsartaelaemaenarwaepaeMarCasDarCafAaeTacradBafaabbaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaaaafaaaaaaaaaaafaafaafaaaaaaaafaafaaaaaaaafaafaaaaaaaaaaaaaaaaafaaaaewadEafeaeyarcaaTaeAafmaeCaeDaeEaeFaeGaeHaeIaeHaddadZaeJaeKaeLaeLafBaeLaeNaeOafyaeQafHabbaeSaeSaeSaeSaeSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauabgaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaIafIaamaamaamaamaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaafaafabfadEaeUaeVaeWaaTaeAaeAaeXaeYaeZaeFafLafbafcafdaddargaffafgacQacQafhacQafiafjacrafkageabbaggafnafoafoafpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaaaafaaaaaaaaaaafaafaafaaaaaaaafaafaaaaaaaafaafaaaaaaaaaaaaaaaaafaaaaewadEaeWaeyarcaaTaeAafmaeCaeDaeEaeFaeGaeHaeIaeHaddadZaeJaeKaeLaeLafBaeLaeNaeOafyaeQafHabbaeSaeSaeSaeSaeSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauabgaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaIafIaamaamaamaamaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaafaafabfadEaeUaeVafeaaTaeAaeAaeXaeYaeZaeFafLafbafcafdaddargaffafgacQacQafhacQafiafjacrafkageabbaggafnafoafoafpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaacaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfabfabfabfabfabfabfabfabfabfabfadEafqafrafsaaTaftafuafvafwafxagqafzafNafOafNafCaqLadxafEafFacQafhacQafGagragsafJafKagtadlaguaghagxafPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfafQafRafSabfafTafUafVafWafXafYafZafZafZafZafZafZagaagbagcagbaaTagHagdagfagKahiaeFagiagjagkaglagmarbagoagpahtahpahGahzahJagpagvagwahPabbadlagyafoafoagzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaabgaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaabfagAagBafZafZafZafYafYafZagCagDagDagDagDagDagDagDagDagDagDahRaaTagFagGahUagIagJaeFahNagLagLagLaddagMagNagOagPagQagRagQagPagSagvagTadlabbabbaeSaeSaeSaeSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -7464,28 +7460,28 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfajAabfabfajBajlagWagWajIagWagWakkagWagWagWakAagWagWajpajsakFantakRajuagWajvajwakWajyajqagWagWajzalealaagWagWagWagpajCagpagpagpagpagpagvahxabbajDajEaboaaaaafaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaaaafaaaaaqaaaaaaaaaaaaaaaaaaaaaaaaaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfagBafYajFafYajGajHalfajJajKajLajMajNajOajPajQajRajSajTajUajVajWajXajUajYajWajWajZakaakaakbakcakdahOakeajbakgajzakhakiakjalnaklakmaknakoakpalqakZakqabOaaaaaaaaaaaaaaaaaaaaaaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafabQaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaamaamaaIaamaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfadEagWagWagWagWagWagWaksaktakuakvakwakxakyakzalrakBakCakDakXalvakwakGakwakwakHakIakJakKakLakMalxakOakPakJakQalNakSakTakUalbalPalCakYakoalIabbalOabZactaaaaaaaaaaafaaaaaaaaaaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaIaaIaaIaaIaaaaaaaaaabpaaaaaaaaaaaIaaIaamaamaamaaaaaaaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaaaaaqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfadEagWalcaldalZalQagWalgalhahLalialjagWacTamoacTagWabVamsabUagWalpamuamtalsagDaltaluamxalwamyagWabTabSabSabRagWalBamcalDalEalFalGalHakoamAanQamDanQanQaaaaaaaafaafaaaaaaaaaaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqaaaaaaaafaafaafaaaaaaaoYaafaafaaaaafaafaaaaaaaamaaaaaaaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafabMaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafabfadEabWalMalMamHamFamMamJalRahKalSaljagWalTalUalValWalXalYamNamOahKambahKamPabYameameamfamgamhamiamjamkamlammakoamnamUampamqalDalDamrakoadQanQamvawKamwaaaaaaaaLaaaaaaaaaaafaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafanTanTanTanTanTaafalJaafanTanTanTanTanTaafaaIaaaaaaaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaaaaaqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfadEagWalcaldalZalQagWalgalhahLalialjagWacTamoacTagWabVamsabUagWalpamuamtalsagDaltaluamxalwamyagWabTabSabSabRagWalBamcalDalEahMalGalHakoamAanQamDanQanQaaaaaaaafaafaaaaaaaaaaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqaaaaaaaafaafaafaaaaaaaoYaafaafaaaaafaafaaaaaaaamaaaaaaaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafabMaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafabfadEabWalMalMamHamFamMamJalRahKalSaljagWalTalUalValWalXalYamNamOahKambahKamPabYameameamfamgamhamiamjamkamlammakoamnamUalFamqalDalDamrakoadQanQamvawKamwaaaaaaaaLaaaaaaaaaaafaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafanTanTanTanTanTaafalJaafanTanTanTanTanTaafaaIaaaaaaaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaamaaIaaIaaaaaaaaaaoXaaaaaaaaaaaIaaIaamaamaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfadEagWamWamBamCamZagWankalRaljanlamGagWamRamIanmalWamKamLannaiNaiSanPaiManaajkamgamgamfamgamTaoWamVanfamXanhakoaoeanWalDamqalDalDanbakoancandaneaocangaafaaLaafaafaaLaafaafaafakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafanianjanjanjanjanualJansanqanqanqanqanwaafaaIaaaaaaaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafaafaaaaaaaaaaoVaafaafaaaaafaafaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaofagWagWagWagWagWagWaqqaqXagWagWagWagWaoRaoSaoRalWaoTaoUapealWapfapiaplanzanAamgamgamfanBanCamianDanEamXanFanGanHanIanJanKanLanManNanGanOaoPapqanRanSaaaaaaaafaaaaafaaLaafaacakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafapIapIapIapIapIaafalJaafapIapIapIapIapIaafaaIaaaaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafaafaaaaaaaaaaoVaafaafaaaaafaafaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaofagWagWagWagWagWagWaqqaqXagWagWagWagWaoRaoSaoRalWaoTaoUapealWapfapiaplanzanAamgamgamfanBanCamiampanEamXanFanGanHanIanJanKanLanManNanGanOaoPapqanRanSaaaaaaaafaaaaafaaLaafaacakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafapIapIapIapIapIaafalJaafapIapIapIapIapIaafaaIaaaaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafanVanVanVanVanVaafalkaafanVanVanVanVanVaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanXanYanZaoaagDaekaoZagWaoCapdalKaogappaoiapDaokaolaonaonaooaonaopaoqaoGaoMaoOaiqamgamgaouaovaowamiaoxaqgamXaoyanGaozaoAaoBaoQaoDaoEaoFanGaqCanQanQanQanQaoIaoJaoHaoLaqJaaaaafaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafaaaaaaaafalJaaaaaaaaaaafaaaaaaaaaaamaaaaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaIaafalzalyalyalyalyalAalkallaivaivaivaivagEaafaaIaaaaaaaaaaaaaaaaaaaacaaaaaaaaaanXanXapaapbagDalMapcaqPaohaodanvanramSaomaosaosaotaojaonapmapnaoraonapoaonaoNapEapramgamfamgamTaraamYanEamXaptanGapuapvapwapxapyapzapAanGapBaoHapCapLapGapFapPaoHaoHarjaoHaoHaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafanTanTanTanTanTaafalJaafanTanTanTanTanTaafaaIaaaaaaaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafapJapJapJapJapJaafalkaafapJapJapJapJapJaafaaIaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaapKapaapbagDapUapMagWalgapNalKapOapVapQapRaokapSaqmaqcaqpapWapXapYapZaqaanUaqNaqdaovaqeaovaqfarnaqhaqiaqjaqkanGaqlaqWapyaqnaqoarlaqoaroaqraqsapFaqtaquapFailaoHaqwaqxaqyaoHaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafanianjanjanjanjanualJansanqanqanqanqanwaafaaIaaaaaaaaaaaaaaaaaaaihaihaihaihaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafaaaaaaaafalkaaaaaaaaaaafaaaaaaaaaaaqaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaqzaqAaqBagDagWagWagWarvalRagWalWalWalWahbaqEapkahCahDahMaonaqIagnaqKahaanyarMaqOaryaqQaqRaqSanxaqUaqVarQamVanGarzaqYaqZafDaflafMardanGarearfapFaqtaqtapFaifaoHarhariarFaoHaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafapIapIapIapIapIaafalJaafapIapIapIapIapIaafaaIaaaaaaaaaaaaabgaaaaihaihaihaihaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafapJapJapJapJapJaafalkaafapJapJapJapJapJaafaaIaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaapKapaapbagDapUapMagWalgapNalKapOapVapQapRaokapSaqmaqcaqpapWapXapYapZaqaanUaqNaqdaovaqeaovaqfarnaqhaqiaqjanDanGaqlaqWapyaqnaqoarlaqoaroaqraqsapFaqtaquapFailaoHaqwaqxaqyaoHaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafanianjanjanjanjanualJansanqanqanqanqanwaafaaIaaaaaaaaaaaaaaaaaaaihaihaihaihaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafaaaaaaaafalkaaaaaaaaaaafaaaaaaaaaaaqaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaqzaqAaqBagDagWagWagWarvalRagWalWalWalWahbaqEapkahCahDaqkaonaqIagnaqKahaanyarMaqOaryaqQaqRaqSanxaqUaqVarQamVanGarzaqYaqZafDaflafMardanGarearfapFaqtaqtapFaifaoHarhariarFaoHaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafapIapIapIapIapIaafalJaafapIapIapIapIapIaafaaIaaaaaaaaaaaaabgaaaaihaihaihaihaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafanVanVanVanVanVaafalkaafanVanVanVanVanVaafaaIaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaqzarkaqBagDaekarHagWarmarOalKaogarPaoiaokarparqaesaeRaeraonarualWarZarSarxalLasnarAasBamzasOarEasRarGasWamjanGanGarIanGanGanGanGanGanGarJarKarLasaasaapFarNaoHaoHasXaoHaoHaaaaaaakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafaaaaaaaaaalJaaaaaaaaaaafaaaaaaaaaaamaaaaaaaaaaaaaaaaaaaihaihaihaihaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLasYaaLaaaaaaaaaaaaaaaaaaaaaaaIaafalzalyalyalyalyalAalkallaivaivaivaivagEaafaaIaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaqzataaqBagDarRapcatiarTarUatIapharWaloaonaonarYasFasyasMaonascalWasdasealmasgasharAasiasjaskarEaoHaoHaoHaoHaoHaslatQatJasoasoaspaspasqasrassastastasuasvasvaswasxatXaszaqsaaaaafaafaafaaaaaaaafaafaafaafaaaaaaaafaafaafaaaaaaaaaaaaaaIaafanTanTanTanTanTaafalJaafanTanTanTanTanTaafaaIaaaaaaaaaaaaaaaaaaaihaihaihaihaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafasAauiasAaaaaaaaaaaaaaaaaaaaaaaaIaafapJapJapJapJapJaafalkaafapJapJapJapJapJaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasCasbapbagDapUapMagWaZtasEalKapOasPaoiasGasGasHasIaonasJaonasKalWasLatgaZuathauuarAasQauvasSarEasTasUasUasVauSasVavCavbasZasZasZasZasZasZasZasZasZasmavFatbatcaoKatdateatfaaaaafatPatratjatjatjatjavRatjatjatjatjatUaafaaaaaaaaaaaaaamaafanianjanjanjanjanualJansanqanqanqanqanwaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatkatlatmaaaatnatoatpaaaaafatqatWatqaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafaaaaaaaaaalkaaaaaaaaaaafaaaaaaaaaaamaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaanXatsattagDagDagDagWagWagWagWalWalWalWalWalWatuaonaoratvaqEatwalWalWalWatxatxatxarAatyatzatAarEatBasZasZasZasZatCatDatEatFatGatHavTavUatKatLatMatNatOatPatPatPatPatPatPatPatPatPatPatRatRatRatRatRatRatRatRatRatRaumaafaaaaaaaaaaaaaamaaaapIapIapIapIapIaafalJaafapIapIapIapIapIaaaaaqaaaaaaaaaaaaaaaaaaaaaaaaaaaaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatSatTaLAatTatSatVaLBatVatSaafatqawvatYaaaaaaaaaaaaaaaaaaaaaaaIaafanVanVanVanVanVaafalkaafanVanVanVanVanVaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafatZauaanYaubaucanXaafaafalWaudaueaufaugauhawMaonapnaonasJaqEaujaukaulawRaunauKauparAauqaurausarEatBasZauLaxdauMatCauxauyatFatGauzauAauBauCauDatMatNauEauFauGauHauIauHauJauwauOauPaxsatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaamaaaaafaaaaafaafaaaaaabepaaaaaaaafaaaaaaaafaaaaaIaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauNatTavmatTauNatVavyatVauNauQauRaxuauTauUauUauVauQauQaafaaaaaIaafalzalyalyalyalyalAalkallaivaivaivaivagEaafaaIaaaaaaaaaaaaaaaaaaaaaaaaanXanXanXauWanXanXapbaucanXaaaaaaalWauXalWauYauZavaalWaZYavzaonavdaveaveavfavgaveavhaviavjarAavkauravlarEatBasZavAavoavJatCawravqatFatGauzauAavravsavtatMatNavuavvauGauHauHauHauJavwavQawfavVatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaamaamaaIaaaaaaaafaaaaaaabpaaaaafaafaafaafaaIaaIaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauNavBaxyavDauNavEaxAavGauNavHavIaxCavKavLavMavNavOauQaaaaaaaaqaaaapJapJapJapJapJaafbeSaafapJapJapJapJapJaaaaaIaaaaaaaaaaaaaaaaaaaaaaaaawkaxGavSayqaxOawoavWavXanXaaaaaaalWalWalWavYavZawaalWaYJaYNaYKaweawpaYHaukawhawxautawyawlarAawmaurayzarEatBasZawzawUawYaxaaxbawZatFatFatFawsawtawuatFatFatNayNawwauGauHauHauHauJawAavxawfaykatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaaaaafaafaaaaafaaaaaaaYxaaaaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauNavBaxyavDauNavEaxAavGauNavHavIaxCavKavLavMavNavOauQaaaaaaaaqaaaapJapJapJapJapJaafbeSaafapJapJapJapJapJaaaaaIaaaaaaaaaaaaaaaaaaaaaaaaawkaxGavSayqaxOawoavWavXanXaaaaaaalWalWalWavYavZawaalWaYJaYNawcaweawpaYHaukawhawxautawyawlarAawmaurayzarEatBasZawzawUawYaxaaxbawZatFatFatFawsawtawuatFatFatNayNawwauGauHauHauHauJawAavxawfaykatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaaaaafaafaaaaafaaaaaaaYxaaaaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauNawGawHawIauNawGawHawIauNawJavHavHavHavHavHavHavHasAaaaaaaaaIaaaaafaaaaafaafaaaaaaaZhaaaaaaaafaaaaaaaafaaaaaIaafaaaaaaaafaafaaaaaaaafawPaxGawQazgaxOawSaucawTanXaafaaLcqTatxatxatxatxatxatxatxatxatxatxatxatxatxatxatxatxatxatxarAawVaurawWarEatBasZawBaxjawCatCaxVavnazpaxcaxfaxeaxhaxgaxhaxiaxkaxlaxmaxnaxoaxoaxoaxnaxmavxawEawDatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaaaaaaaafaafaafaaaazoaYUazoaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaatSauNazFaxxatSauNazUaxxatSauNaAbauNauNauNauNauNavHatqaaaaaaaaIaaIaaIaaaaaaaafaaaaxBaZnaxBaafaafaafaafaaIaaIaaIaafanXanXanXanXaxDaxEaxEaxFanXanXanXanXaAvaucaucanXaxHaxIanXanXaxJaxKaxLaxMaxMaxMaxMaxMaxMaxMaxMaxNaxMaxMaxMaxMaxMaAHaxPaxQaxRaAHavpasZaxSawjcfSatCaxVaxXaxXaxXaxZaxYayaawLaxXavqaydayeayfaygayhayhayhayhawXavxawEawDatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaAuaBaaAuaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaynayoaypayoaBcayoayrayoaysaytayvayvayvayvaywauNawNatqaaaaafaafaaaaaaaaaaaaaafaaaayyaBkayAaafaaaaafaaaaaaaaaaaaaaaanXayBayCayDayCayCayCayCayEayCayCayFayGayDayHayIaxMaxMaxMaxMaxMaxMayJayKayLayLayLayLayMayLayLaZsayLayMayLayLayLarAaBEayPayQarEaAiasZcfSaycaxUatCayUayTayWaxpayYayXayYaxqayTazaazbazcazdazeazdazdazfaxraBOaxtaxTaxvatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaaaaaaaaaaafaafaBuaBvaZraBxaByaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazqazrazsaztazuazvazwazxazyazwazzazAazwazwaCeauNavHauRaafaafaaaaaaaaaaaaaaaaafazDazEbdHazGazHaaaaafaaaaaaaaaaaaaaaanXazIanXazJazKazLazLazLazMazLazLazLazNazJazOazPazPazPazPazPazPazPazQazRayLazSazTazTazVazWazXazYazZaAabeTazTaAcarAaAdayPayQarEaAiasZaybaAeauMatCaxWaxXaxXaxXaxXayiayjaAlaAmaAnaxkaAoaylaApaApaApaAqayVatPayZatPatPatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaCvaCwbfyaCyaCvaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaatSauNazFaxxatSauNazUaxxatSauNaAbauNauNauNauNauNavHatqaaaaaaaaIaaIaaIaaaaaaaafaaaaxBaZnaxBaafaafaafaafaaIaaIaaIaafanXanXanXanXaxDaxEaxEaxFanXanXanXanXaAvaucaucanXaxHaxIanXanXaxJaxKaxLaxMaxMaxMaxMaxMaxMaxMaxMaxNaxMaxMaxMaxMaxMaAHaxPaxQaxRaAHavpasZaxSawjcfSatCaxVaxXaxXawLaxZaxYayaaxpaxXavqaydayeayfaygayhayhayhayhawXavxawEawDatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaAuaBaaAuaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaynayoaypayoaBcayoayrayoaysaytayvayvayvayvaywauNawNatqaaaaafaafaaaaaaaaaaaaaafaaaayyaBkayAaafaaaaafaaaaaaaaaaaaaaaanXayBayCayDayCayCayCayCayEayCayCayFayGayDayHayIaxMaxMaxMaxMaxMaxMayJayKayLayLayLayLayMayLayLaZsayLayMayLayLayLarAaBEayPayQarEaAiasZcfSaycaxUatCayUayTayWaxqayYayXayYayiayTazaazbazcazdazeazdazdazfaxraBOaxtaxTaxvatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaaaaaaaaaaafaafaBuaBvaZraBxaByaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazqazrazsaztazuazvazwazxazyazwazzazAazwazwaCeauNavHauRaafaafaaaaaaaaaaaaaaaaafazDazEbdHazGazHaaaaafaaaaaaaaaaaaaaaanXazIanXazJazKazLazLazLazMazLazLazLazNazJazOazPazPazPazPazPazPazPazQazRayLazSazTazTazVazWazXazYazZaAabeTazTaAcarAaAdayPayQarEaAiasZaybaAeauMatCaxWaxXaxXaxXaxXawLayjaAlaAmaAnaxkaAoaylaApaApaApaAqayVatPayZatPatPatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaCvaCwbfyaCyaCvaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafauNaAwaAxaAwaAyazsazsaAzaAwaAxaAwaAAaABaACaADauNavHauQauQaAEauUauUauUauUauVauQaAFaAGbfAaAIaAFanXanXaxHaAJaxIanXanXanXazIaAKazJaaaaafaaaaafaaaaafaaaaafaaaazJazOazPaALaAMaANaAOaAPazPazQaucayLaAQaAQaARaASaATaAUaAVaATaAWaAXazTaAcarAaAdayPaDdarEaAiasZawzaAgaAhaBbayRaBdaBeazhaBgaBhaBiaBjaBjaCLaBjatPaBlaBmaBnaBoaBpaBraxvazibguazjatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaacaaaaaaaafaaaaCvazlaDAaDBaCvaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaBzatSaBAawHaBBaBCaBDaDcaBFaBBawHaBGaBHaBIaBJaBKaBLavHavHavHavHavHavHavHavHaDnaBPaAFazmaBRaBSaAFaBTaBUayCayCayCayCayCaBVaBWaBXazJaafaBYaBYaBYaBYaBYaBYaBYaafazJazOazPaBZaCaaCbaCcaBZazPazQaCdayLayLayLayLaDxaCfaCgaChaCfaDyaCjazTaCkarAaAdayPaClarEaJCasZaznaAYazCatCaxWavqatEaBjaBjaBjaBjaBjaCqaCraCsaBjatPatPatPatPaDQatPatPaAfaAkaAjatRatRatRatRatRatRatRatRatRatRaumaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaCvaEXaEYaDYaCvaaaaaaaaaaafaafaaaaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazqaAxaCzaCAaCAaCAaCAaCBaAxazqaaaaBIaCCaxzaBLaCEaCEaCEaCEaCEaCEaCEavHaCFaCGaAFaEeaCIaAsaAFaCKaEvaCKaCKaCKaCKaCKaCKaCKaCKaCMaaaaBYaCNaCOaCPaCQaCRaBYaaaazJazOazPaBZaCSaCTaCUaBZazPazQanXayLaCVaCWaARaCXaCYaCZaDaaDbaECayLayLayLarAaAdayPayQarEaAiasZaAtaEMauMatCaDgavqatEaDhaDiaDjaDkaBjaCqaDlaCsaBjaDmaESbgIaDpaDqaGwaDsatPatPatPaAZatjatjatjatjaEVatjatjatjatjaBfaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaCvaCvbgHaGyaCvaDCaDDaDEaDCaDCaDCaDCaDCaDCaDCaDFaDGaDGaDGaDHaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaBzatSaBAawHaBBaBCaBDaDcaBFaBBawHaBGaBHaBIaBJaBKaBLavHavHavHavHavHavHavHavHaDnaBPaAFazmaBRaBSaAFaBTaBUayCayCayCayCayCaBVaBWaBXazJaafaBYaBYaBYaBYaBYaBYaBYaafazJazOazPaBZaCaaCbaCcaBZazPazQaCdayLayLayLayLaDxaCfaCgaChaCfaCJaCjazTaCkarAaAdayPaClarEaJCasZaznaAYazCatCaxWavqatEaBjaBjaBjaBjaBjaCqaCraCsaBjatPatPatPatPaDQatPatPaAfaAkaAjatRatRatRatRatRatRatRatRatRatRaumaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaCvaEXaEYaDYaCvaaaaaaaaaaafaafaaaaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazqaAxaCzaCAaCAaCAaCAaCBaAxazqaaaaBIaCCaxzaBLaCEaCEaCEaCEaCEaCEaCEavHaCFaCGaAFaEeaCIaAsaAFaCKaEvaCKaCKaCKaCKaCKaCKaCKaCKaCMaaaaBYaCNaCOaCPaCQaCRaBYaaaazJazOazPaBZaCSaCTaCUaBZazPazQanXayLaCVaCWaARaCXaCYaCZaDaaDbaDoayLayLayLarAaAdayPayQarEaAiasZaAtaEMauMatCaDgavqatEaDhaDiaDjaDkaBjaCqaDlaCsaBjaDmaESbgIaDpaDqaGwaDsatPatPatPaAZatjatjatjatjaEVatjatjatjatjaBfaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaCvaCvbgHaGyaCvaDCaDDaDEaDCaDCaDCaDCaDCaDCaDCaDFaDGaDGaDGaDHaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaaaDIaDJaDKaDJaDJaDLaDMaDJaDJaDKaDNaDOaBIaDPaFEaBLaDRaDSaDTaDUaDVaDWaCEavHaDXauQaAFaAFbaNaDZaCMaEaaEbbcCbbTbbxbaCbafbacaEiaEjaCMaafaBYaEkaElaEmaEnaEoaBYaafazJazOazPaEpaEqaEraEsaEtazPazQaEuayLazSazTaFSaEwaCfaExaEyaATaEzaEAaEBaEBarAaAdayPayQarEaAiaCmaCmaCmaCmaCmaEHaEIatEaEJaEKaEKaELaFZaEKaENaEOaBjaEPaEQaERaGfaETaCnaDsaaaaafaafaafaaaaaaaafaafaafaafaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaDCaBsaBqaDCaBtaCpaGkaFdaFdaFdaFdaFeaFfaFgaFgaFgaFgaFgaFgaFgaGqaFiaFjaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaDIaDNaDJaFkawiaFlaFmbIraFoaFpbHfaFlawnaFraFsaFtaDPayuaBLaFvayxaBMaCxaBMaBNaGravHaFuaGxaFxaGHaFzaDfaGPaFJaFKaFLaFLaFLaDraFLaFLaFNaFOaCMaaaaBYaDtaElaFQaEnaFRaBYaaaazJazOazPaGVaFTaFUaFTaFVazPazQaFWayLayLayLayLaFXaCfaCgazTaCfaFYbcEazTaGaarAaGbaGcaGdarEaAiaDeaDvaDuaCoaDeaHJaDzaHYaGlaGmaBjaBjaBjaBjaBjaBjaGnaGoaGpaIcaDpaIkaIhaDsaDsaDsaDsaDsaDsaDsaDsaDsaFaaFbaDsaDsaFaaGtaDsaDsaaaaaaaDCaDCaDCaDCaDCaEZaEWaFdaFcaFwaDCaDCaDCaDCaDCaGDaGEaGFaGFaGFaGFaGFaGFaGGaGGaIlaGGaGGaGGaGGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaFraGIaFyaGKaFlaFMaFlaFMaFlaFMaFlaFMaFlaGMaGNaGOaDPayuaBLaInaFAaGRaGSaGTaGUaCEaFBaFDaFCaFCaFCbazaIzaFCbcTaFLaFLaFLaFLaFLaFLaFLaFNbcPaCMaafaBYaHeaHfaHgaHhaHiaBYaafazJazOazPaHjaFPaFUaHlaHmazPaHnaHoayLaHpazTaARaHqaATaHrazTaCfaFYaHsazTaHtarAaHuaHvaHwarEaGuaIDaEUaGvaDwaIIaGzaGjatEaHCaHDaBjaHEaBjaHFaBjaHGaBjaHHaGpaIZaDpaJsaJjaHLaHMaHMaHNaHOaHKaHKaHKaHKaHKaHPaHKaHKaHKaHQaHVaDsaDsaDsaDCaGBaGAaGCaGCaGLaGJaDCaDCaJwaDCaIdaIeaIfaIgaGFaJBaGFaIiaIjaJHaKjbinaKlaIoaIpaIqaKHaIsbjFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaa
@@ -7493,49 +7489,49 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaT
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaFraJXaFyaGKaFlaFMaFlaFMaFlaFMaFlaFMaFlaGMaGNaGOaDPaGYaGXaHaaGZaHbaHbaIBaLiaIHaIGaIJaLkaJZaJYaJGaKaaFCaCDaKmaKnaKoaCHaCDaKqaKraKsaKtaKuaaaaafaaaaKvaKwaKvaaaaafaaaaKuazOazPaCtaKyaKzaKAaKBazPaKCaKDayLaKEazTaARaKFaKGaHrazTaLmaKIaKJaKKaKLaJeaEDaKNaKOaLYaEEaKRaaaaaaaJlaKSaJKaMcaJlaJLaJnaJnaJnaKWaJnaJnaJnaBjaDpaMvaDpaDpaDpaDpaMwaDpaKZaLaaLbaMEaMVaMFaLfaLgaLhaLfaLfaLfaLfaLfaMXaLfaLfaLfaLfaLfaLfaLfaLfaJRaIgaLjaJWaLlaEFaKbaLoaIgaLpaKTaGFaLraLsaLtaJTbkuaJUaIoaJVaIoaKUaCiaLxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaLyaLzaDJaFkawiaFlaFlaFqaFlaFlaFnaFlawnaFraLCaLDaDPaLEaLFaLGaLHaLGaLGaLGaLGaLGaLIaLJaFCaFCaFCaFCaFCaFCaLLaLMaLNaLOaLOaLOaLOaLPaLQaLRaKuaLSaLTaLTaLUaLVaLWaLTaLTaLXaKuaNAaKuaKuaLZaMaaLZaJeaJeaMbaNGaJeaJeaJeaJeaMdaMeaBwaBQaMhaMiaJeaJeaJeaJeaMjaKNaMkaMkaMlaMmaMnaMoaJlaMpaLqaLnaJlaJlaJlaJlaJlaJlaJlaJlaBjaBjaMsaMtaMuaOiaOoaLvaMyaMfaKZaMAaMBaMCaMCaMDaLfaOpaOqaMGaMHaMIaMJaMKaMLaMMaMNaMHaMJaMIaMHaMOaLfaJRaIgaMPaMgaMRaMSaMqaMUaIgaOsaMWaOCaMYaMraNaaNbaGFaGGaOHaJVaIoaMxaAraNfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaaaLyaDJaDKaDJaDJaDLaDMaDJaDJaDKaLzaNgaBIaNhaLEaNiaMzaMzaNkaMzaNlaIAaNmaNnaLJaNoaNpaNqaNraNsaNtaNraNuaNraNraNraNvaNraNraNwaNxaNyaNzaNzaNBaOMaNCaNzaNzaNzaNzaNDaNEaNFaQcaNraNHaNIaNJaNKaNLaNMaNLaNNaNOaQdaNQaNQaNRaNSaNTaNSaNUaNVaNWaEGaNYaNZaOaaObaOcaMkaMkaMkaOdaOeaMTaMQaOhaQxaOjaOkaOlaOmaOnaJlaQAaQyaQEaOraOtaOtaOuaMZaOwaNdaKZaOyaOzaOAaOAaOBaLfaQJaODaOEaOEaOEaOEaOFaOGaQTaOIaOJaOKaOKaOLaRbaLfaJRaIgaONaOOaNjaOfaONaONaIgaORaOSaGFaOTaOUaOVaOWaGFaIoaIoaJVaIoaGGaGGaGGaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOXaOYaOZaPaaPaaPaaPaaPbaOYaOXaaaaBIaPcaPdaPeaOvaOgaPhaPhaOxaIAaPjaNnaPkaPlaPmaPnaPoaPpaPqaPqaPraPsaPsaPsaPtaPuaPuaPvaPwaNIaPqaPqaPxaPyaPzaPAaPBaPBaPCaPBaPDaPyaPyaPyaPEaPFaPGaPHaMkaPIaPJaPJaPJaPJaPJaPJaPJaPJaPKaPJaPLaPMaPNaPOaPPaPQaPRaPSaPTaPJaPUaPJaPVaPWaPXaPWaPWaPWaPWaPWaPWaPYaPZaRsaQbaQbaQbaRraQbaQbaRxaQeaQfaQgaKZaQhaMCaQiaQjaQkaLfaCJaQmaQnaQnaQnaQnaQnaQoaQpaOPaQraQnaQnaQsaQtaLfaJRaIgaQuaONaONaQvaONaQwaIgaGFaGFaGFaGFaGFaGFaSoaGFaIoaIoaJVaIoaStaOQaGGaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaafaBIawqaBIaQBaQCaGOaQDaSuaQFaQGaGOaQCaQHaQIaBIaSyaLEaPeaPfaQLaPhaPhaOxaIAaQMaNnaLJaQNaNpaQOaQPaNraNraQQaQRaQSaSEaNraQUaQVaQWaQVaQXaQYaQVaQVaQZaQVaQVaRaaSHaQVaRcaQVaRdaNraNraNraReaPFaPGaPHaMkaRfaMkaRgaRgaRgaRgaRgaRgaRgaRgaRhaRiaRgaRjaRgaRgaRkaRgaRgaRgaRgaRlaRmaRnaRoaRoaRoaRoaRoaRoaRoaRpaRqaRpaJlaImawOawOawOawOawOaItaRuaRvaRwaKZaKZaKZaKZaKZaSIaLfawcaQmaQnaRzaRAaRBaPgaRDaREaRFaQraRGaRHaRIaRJaLfaJRaIgaRKaRKaRLaRMaRNaRNaROaIgaRPaRQaRRaGGaRSaRTaRUaRVaRVaRWaRXaGGaRYaGGaRZaRZaRZaSaaSbaScaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaGeaGgaGgaGiaSUaGhaSdaOYaLDaDPaHxaHxaSfaLDaOYaLDaHyaHAaHzaLEaSkaPiaPiaNkaPiaNlaIAaSmaNnaSnaIAaLKaLKaSZaLKaLKaLKaLKaLKaLKaSpaSqaLKaLKaLKaLKaLKaLKaSraSsaSraLKaTPaLKaNraQPawbauoaSwaSxaNraReaUlaMbaMbaMkaSzaKOaSAaMnaMnaSBaSBaSBaSBaSCaJeasfasNarVarXarXavParXarXarVasNawFaJeaSJaSKaSKaSKaSKaSLaSLaSMaSNaRqaRpaJlaQqaQaaQaaQaaQaaQaaQaaSQaSRaSSaSTaUOaSVaSWaSXaSYaKZaKZaVeaTaaTbaTcaTdaTeaTeaTeaTfaTgaTfaTeaTeaTeaTeaJRaIgaThaONaRLaRMaONaONaTiaIgaTjaQzaTlaGGaIoaTmaTnaToaTpaTqaIoaTraQKaGGaTtaTuaRZaTvaTwaTxaafaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaVfaVraVkaVIazkaSgaSeaSiaShaSjaSiaTzaTyaTBaTAaTEaTCaTAaTFcozaTIaTJaTKaTLaTLaTLaTMaTLaTNaTOaIAaVLaTQaTRaTSaTTaTUaTVaTWaTXaTUaTYaTZaUaaUbaUcaUdaUeazBaUgaUhaUeaUiaLKaLKaWoaLKaLKaLKaLKaUkaWwaLKaUmaMbaUnaSzaKOaUoaaaaaaaaaaaaaaaaaaaaaaUpaUqaUraUsaUtaUvaUuaUxaUwaUzaUyaVUaUpaaaaaaaaaaaaaaaaaaaaaaUAaSNaRqaUBaUCaUDaUEaUFaUFaUFaUFaUGaUHaUIaUFaUFaUFaUJaUKaULaUMaUNaWFaUPaUQayOaySaUTaTfaUUaUVaRCaUXaUYaUZaVaaVbaTeaJRaIgaVcaVcaRLaRMaVdaVdaWKaIgaIgaXlaIgaGGaVgaVhaViaViaViaVjaXnaGGaGGaGGaVlaVmaVnaVoaVpaVqaafaafaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDawdcmVaXzaXCaDPaVsaVsaVtaVsaVsaVsaVDaVsaVsaVtaVsaVsaYEaWYaVuaVvaKdaKdaKdaKdaKdaVwaVxaVyaXGaIAaTQaTQaVAaTSaVBaTUaTUaTUaTUaTUaTYaVCaTUaTUaTUaUdaUeawgaVEaVFaUeaUiaVGaVHaKeaKcaVKaUmaXIaVMaVNaVOaxwaVQaMkaSzaKOaUoaaaaaaaaaaaaaUpaUpaUpaUpaVRaSlaVTaXEaVVaSDaVXaXFaVZaSOaWbaUpaUpaUpaUpaaaaaaaaaaaaaUAaSNaRqaRpaWcaSSaSPaWeaTkaSSaTsaUWaWiaVSaWkaVWaWmaWnaQbaXNaWpaWqaWraWsaWtaWtaWuaWvaXXaWaaWyaWdaWAaWBaWCaWDaWEaTeaJRaIgaThaONaRLaRMaONaONaONaYqaWGaONaWHaGGaWIaWJaToaToaToaTqaIoaYsaGGaWfaVoaLuaWQaVoaWRaWSaWTaWTaWUaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTGaGgaTHaGiaBIaBIaBIaWVaWWaWWaWWaWWaWWaWWaWWaWXaBIaBLcpSaWZaIAaXcaXbaXbaXbaYraXdaIAaIAaIAaIAaTQaXeaXfaTSaXgaTUaTUaWgaNXaHIaQlaWgaTUaTUaTUaYwaUeaRyaUfaSvaUeaUiaVGaXpaKfaXraXsaUmaXtaxwaURaXvaUjaXxaMkaSzaKOaMmaSCaMbaXyaUpaUpaVYaXAaYyaYAaXDaXDaXEaXFaYMaXEaXFaXDaXDaXHaYVaXJaXBaUpaUpaXyaJlaXLaXMaSNaRqaRpaJlaZgaSPaXOaTkaSSaXPaXQaSSaWhaXSaTkaSSaXTaOtaXUaXVaUQaXkaXiaXjaVPaYaaYbaYcaYdaYeaWjaYgaWBaYhaWDaYiaTeaJRaIgaYjaYjaRLaRMaWlaONaONaYlaONaWzaWxaGGaIoaXRaXhaToaYfaYkaZXaWLbaOaYmaWOaZcaVoaYvaUSbaBbanaYzaVzaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaafaYCaYDcpKaYFaWPaEfaEfaYIaKpaKQaYLbaPaKxaYOaYPaYQaYRaYSaTSaYTaTUaTUaWgaHIaIKaISaWgaTUaTUaYWaUdaUeaUeaUeaUeaUeaUiaVGaVGaVGaVGaVGaUmaYYaXvaYZaXvaXvaXxaMkaSzaKOaNSaNSaZaaZbaWNaUpaZdaYnaZfbaTbaSbaVbaUbaXbaWbaZbaYbbbbbabbcaZfaYoaZjaUpaWMaZbaZlaZmbbeaSNaRqaRpaWcaSSaSSaSSaSSaSSaXPaZoaSSaWhaZpaTkaSSaXTaOtaZqaXVaUQaNcaNeaNPaLwaYaaYpaZwaYdaYeaWjaYgaWBaYhaZxaZyaZzbbfaZzaZzaZzaZBaZCaZDaYtaOOaZFaZGaZHaZIaGGaZJaYXaYGaToaZeaYGaIoaIoaXaaZiaVoaYuaVoaZNaZOaZPaZQaWTaZRaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaZSaZTaZUbjnaZWaSFaXwaZkbaaaZvaXWbadbaeaXYaYObagbahbaibajaTSbakbalbambbhbaobapbaqbarbarbarbasbataTSbaubavbawbaxaKgbajbnZaKhbajbkZaUmbaDbaEbaFbaGbaHbaIaMkbaJbaKaMkbaLbaMbbDbcybbPbbLbaRbaQbbQaUpaUpaUpaUpaUpbcDaUpaUpaUpbbRbaQbbdbbSbbWbeobcabbibbjbbkbblbbmbbnaJlaUDaSPbboaTkaSSaZAaZEbbraZKaXOaTkaSSaXTbbtaULaXVbbubbvbbwaUQaUQaYaaXZbbybbzbbAbbBaYgaWBbbCaWDbcuaZzaZLbbFbbFbbGbbHbbIaRLaRLaRLaRLaRLaRLaRLaGGbbJaXRaXhaToaYfaXhaIobbKaGGbcBaVoaYuaVoaZNbbMbbNbbOaafaafaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOXaOYaOZaPaaPaaPaaPaaPbaOYaOXaaaaBIaPcaPdaPeaOvaOgaPhaPhaOxaIAaPjaNnaPkaPlaPmaPnaPoaPpaPqaPqaPraPsaPsaPsaPtaPuaPuaPvaPwaNIaPqaPqaPxaPyaPzaPAaPBaPBaPCaPBaPDaPyaPyaPyaPEaPFaPGaPHaMkaPIaPJaPJaPJaPJaPJaPJaPJaPJaPKaPJaPLaPMaPNaPOaPPaPQaPRaPSaPTaPJaPUaPJaPVaPWaPXaPWaPWaPWaPWaPWaPWaPYaPZaRsaQbaQbaQbaRraQbaQbaRxaQeaQfaDyaKZaQhaMCaQiaQjaQkaLfaEcaQmaQnaQnaQnaQnaQnaQoaQpaOPaQraQnaQnaQsaQtaLfaJRaIgaQuaONaONaQvaONaQwaIgaGFaGFaGFaGFaGFaGFaSoaGFaIoaIoaJVaIoaStaOQaGGaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaafaBIawqaBIaQBaQCaGOaQDaSuaQFaQGaGOaQCaQHaQIaBIaSyaLEaPeaPfaQLaPhaPhaOxaIAaQMaNnaLJaQNaNpaQOaQPaNraNraQQaQRaQSaSEaNraQUaQVaQWaQVaQXaQYaQVaQVaQZaQVaQVaRaaSHaQVaRcaQVaRdaNraNraNraReaPFaPGaPHaMkaRfaMkaRgaRgaRgaRgaRgaRgaRgaRgaRhaRiaRgaRjaRgaRgaRkaRgaRgaRgaRgaRlaRmaRnaRoaRoaRoaRoaRoaRoaRoaRpaRqaRpaJlaImawOawOawOawOawOaItaRuaRvaRwaKZaKZaKZaKZaKZaSIaLfaEdaQmaQnaRzaRAaRBaPgaRDaREaRFaQraRGaRHaRIaRJaLfaJRaIgaRKaRKaRLaRMaRNaRNaROaIgaRPaRQaRRaGGaRSaRTaRUaRVaRVaRWaRXaGGaRYaGGaRZaRZaRZaSaaSbaScaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaGeaGgaGgaGiaSUaGhaSdaOYaLDaDPaHxaHxaSfaLDaOYaLDaHyaHAaHzaLEaSkaPiaPiaNkaPiaNlaIAaSmaNnaSnaIAaLKaLKaSZaLKaLKaLKaLKaLKaLKaSpaSqaLKaLKaLKaLKaLKaLKaSraSsaSraLKaTPaLKaNraQPawbauoaSwaSxaNraReaUlaMbaMbaMkaSzaKOaSAaMnaMnaSBaSBaSBaSBaSCaJeasfasNarVarXarXavParXarXarVasNawFaJeaSJaSKaSKaSKaSKaSLaSLaSMaSNaRqaRpaJlaECaEfaEfaEfaEfaEfaEfaSQaSRaSSaSTaUOaHIaSWaSXaSYaKZaKZaVeaTaaTbaTcaTdaTeaTeaTeaTfaTgaTfaTeaTeaTeaTeaJRaIgaThaONaRLaRMaONaONaTiaIgaTjaQzaTlaGGaIoaTmaTnaToaTpaTqaIoaTraQKaGGaTtaTuaRZaTvaTwaTxaafaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaVfaVraVkaVIazkaSgaSeaSiaShaSjaSiaTzaTyaTBaTAaTEaTCaTAaTFcozaTIaTJaTKaTLaTLaTLaTMaTLaTNaTOaIAaIKaTQaTRaTSaTTaTUaTVaTWaTXaTUaTYaTZaUaaUbaUcaUdaUeazBaUgaUhaUeaUiaLKaLKaWoaLKaLKaLKaLKaUkaWwaLKaUmaMbaUnaSzaKOaUoaaaaaaaaaaaaaaaaaaaaaaUpaUqaUraUsaUtaUvaUuaUxaUwaUzaUyaVUaUpaaaaaaaaaaaaaaaaaaaaaaUAaSNaRqaUBaUCaUDaUEaUFaUFaUFaUFaUGaUHaUIaUFaUFaUFaISaUKaULaUMaUNaWFaUPaUQayOaySaUTaTfaUUaKpaKQaUXaUYaUZaVaaVbaTeaJRaIgaVcaVcaRLaRMaVdaVdaWKaIgaIgaXlaIgaGGaVgaVhaViaViaViaVjaXnaGGaGGaGGaVlaVmaVnaVoaVpaVqaafaafaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDawdcmVaXzaXCaDPaVsaVsaVtaVsaVsaVsaVDaVsaVsaVtaVsaVsaYEaWYaVuaVvaKdaKdaKdaKdaKdaVwaVxaVyaXGaIAaTQaTQaVAaTSaVBaTUaTUaTUaTUaTUaTYaVCaTUaTUaTUaUdaUeawgaVEaVFaUeaUiaVGaVHaKeaKcaVKaUmaXIaVMaVNaVOaxwaVQaMkaSzaKOaUoaaaaaaaaaaaaaUpaUpaUpaUpaVRaSlaVTaXEaVVaSDaVXaXFaVZaSOaWbaUpaUpaUpaUpaaaaaaaaaaaaaUAaSNaRqaRpaWcaSSaSPaWeaTkaSSaTsaUWaWiaVSaLwaVWaWmaNcaQbaXNaWpaWqaWraWsaWtaWtaWuaWvaXXaWaaNeaNPaWAaWBaWCaWDaWEaTeaJRaIgaThaONaRLaRMaONaONaONaYqaWGaONaWHaGGaWIaWJaToaToaToaTqaIoaYsaGGaWfaVoaLuaWQaVoaWRaWSaWTaWTaWUaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTGaGgaTHaGiaBIaBIaBIaWVaWWaWWaWWaWWaWWaWWaWWaWXaBIaBLcpSaWZaIAaXcaXbaXbaXbaYraXdaIAaIAaIAaIAaTQaXeaXfaTSaXgaTUaTUaWgaQaaNXaQgaWgaTUaTUaTUaYwaUeaRyaUfaSvaUeaUiaVGaXpaKfaXraXsaUmaXtaxwaURaXvaUjaXxaMkaSzaKOaMmaSCaMbaXyaUpaUpaVYaXAaYyaYAaXDaXDaXEaXFaYMaXEaXFaXDaXDaXHaYVaXJaXBaUpaUpaXyaJlaXLaXMaSNaRqaRpaJlaZgaSPaQlaTkaSSaXPaXQaSSaWhaXSaTkaSSaQqaOtaXUaXVaUQaRCaUJaSVaUVaYaaYbaYcaYdaKpaVLaYgaWBaYhaWDaYiaTeaJRaIgaYjaYjaRLaRMaWlaONaONaYlaONaWzaWxaGGaIoaWdaVPaToaWjaWkaZXaWLbaOaYmaWOaZcaVoaYvaUSbaBbanaYzaVzaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaafaYCaYDcpKaYFaWPaWnaWnaYIaWyaXhaYLbaPaKxaYOaYPaYQaYRaYSaTSaYTaTUaTUaWgaNXaXiaXjaWgaTUaTUaYWaUdaUeaUeaUeaUeaUeaUiaVGaVGaVGaVGaVGaUmaYYaXvaYZaXvaXvaXxaMkaSzaKOaNSaNSaZaaZbaWNaUpaZdaYnaZfbaTbaSbaVbaUbaXbaWbaZbaYbbbbbabbcaZfaYoaZjaUpaWMaZbaZlaZmbbeaSNaRqaRpaWcaSSaSSaSSaSSaSSaXPaZoaSSaWhaZpaTkaSSaQqaOtaZqaXVaUQaXkaXOaXwaXRaYaaYpaZwaYdaKpaVLaYgaWBaYhaZxaZyaZzbbfaZzaZzaZzaZBaZCaZDaYtaOOaZFaZGaZHaZIaGGaZJaXWaXTaToaYeaXTaIoaIoaXaaZiaVoaYuaVoaZNaZOaZPaZQaWTaZRaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaZSaZTaZUbjnaZWaSFaWnaZkbaaaZvaYfbadbaeaXYaYObagbahbaibajaTSbakbalbambbhbaobapbaqbarbarbarbasbataTSbaubavbawbaxaKgbajbnZaKhbajbkZaUmbaDbaEbaFbaGbaHbaIaMkbaJbaKaMkbaLbaMbbDbcybbPbbLbaRbaQbbQaUpaUpaUpaUpaUpbcDaUpaUpaUpbbRbaQbbdbbSbbWbeobcabbibbjbbkbblbbmbbnaJlaUDaSPbboaTkaSSaZAaZEbbraZKaQlaTkaSSaQqaYkaULaXVbbubbvbbwaUQaUQaYaaXZbbyaYKaYGbbBaYgaWBbbCaWDbcuaZzaZLbbFbbFbbGbbHbbIaRLaRLaRLaRLaRLaRLaRLaGGbbJaWdaVPaToaWjaVPaIobbKaGGbcBaVoaYuaVoaZNbbMbbNbbOaafaafaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaXubcFbcZaXmbbUaSFbaabaabaabaabaabbVbaaaXoaYObbXbbYbaibbZbbZbbZbbZbdKbbZbcbaTUbccbcdbcebcebcfbcgaTSaXebchbcibcjaKibdQblcaKkbcobcobcpbcpbcpbcpbcpbcqaMbbcrbcsbctbeabcvbcwbcxbbgaUpbczbcAbeeaUpaUpaaaaaaaafaafbekaaaaaaaUpaUpbezbcGbczaUpbbgbcxbcHbcIbcJbcKbcLaRpaWcaSSaSSaSSaSSaSSaGpbcMaSSbcNaSSbcObcObcObcObeBbcQbcRbcSaUQaUQaUQbeMbcUaTeaZMbcWbcXaYgaWBaYhaWDbcYaZzaZZbdabdbbdcbddbdebddbddbddbddbddbdfbdgbdhbdibdjbdkbdlbdmbdnbdobdpbdqbdraVoaYubdsaZNaVobeNbbOaafaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBbdubdvaZUbdwbdxaSFaEfbabbaaaZvaDobbVbaabdAaYObbpbdCbaibbZbdDbdEbdFbdGbbZaEgbdIbdJaTSbeRbdLbdMbdNaTSaXebdObdPbdPbeVbdPbdPbdPbdPbdRbdSbdSbdSbdTbdSbdUaMbbdVbdWbdXbdYbdYbdYbdYbdYbdYbdZbeWbdZbdYbebbebbebbebbebbecbebbebbebbedbedbfobedaUpaUpaUpaJiaJiaJibcKbcLaRpaJlbefbegaDmbehaSSbeibcMbejbfqbelbcObcObembenaZzaZzaZzbfwaSGaSGaSGaZzaZzaZzbeqberbesbetaWBaYhaYhbeuaZzbevbewbbqaZzbeybbsbeAaYtbfxbbEbeDbcmaONaGGaIobeFbeGbeHbeFbeIaIoaIoaGGbeJaVoaYuaVoaZNbeKbeLbbOaafaafaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaafbeObePbeQbfWaRtaEfaEdbeUaEcaDobbVbgNbgMaYObeXbeYbaibbZbbZbbZbeZbfabbZbfbbdIbfcaTSbeRbdLbdMbfdaTSaXebdObdPbfebffbfgbfgbfhbdPbfibcVbfkbflbfmbfmbfmaMbaMkbcsbctbdYbfnbgUbfpbgWbfrbfsbftbfubdYbebbfvbgXbfvbhebhCbfvbdybebbedbfCbfDbfEbfFbfGbfHbfIbfJaJibfKbfLbfMaJlaZzaZzaZzaZzbfNbfObfPbfQaZzaZzbfRaZzaZzaZzaZzbfSbfTbfUbfVbfVbfVbhJbfXaZzbfYbfZbgabgbbgcbgcbgcbgdaZzbevbewbdBaZzaZzaZzaZzaZzaZzaZzaZzaZzaZzaZzbgfbggbghbgibgjbgfbggaZzaRZbgkaVoaYuaVoaZNaZObglbgmaWTaZRaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBbdubdvaZUbdwbdxaSFaWnbabbaaaZvaYXbbVbaabdAaYObbpbdCbaibbZbdDbdEbdFbdGbbZaEgbdIbdJaTSbeRbdLbdMbdNaTSaXebdObdPbdPbeVbdPbdPbdPbdPbdRbdSbdSbdSbdTbdSbdUaMbbdVbdWbdXbdYbdYbdYbdYbdYbdYbdZbeWbdZbdYbebbebbebbebbebbecbebbebbebbedbedbfobedaUpaUpaUpaJiaJiaJibcKbcLaRpaJlbefbegaDmbehaSSbeibcMbejbfqbelbcObcObembenaZzaZzaZzbfwaSGaSGaSGaZzaZzaZzbeqberbesbetaWBaYhaYhbeuaZzbevbewbbqaZzbeybbsbeAaYtbfxbbEbeDbcmaONaGGaIobeFbeGbeHbeFbeIaIoaIoaGGbeJaVoaYuaVoaZNbeKbeLbbOaafaafaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaafbeObePbeQbfWaRtaWnaZebeUbbtaYXbbVbgNbgMaYObeXbeYbaibbZbbZbbZbeZbfabbZbfbbdIbfcaTSbeRbdLbdMbfdaTSaXebdObdPbbzbffbfgbfgbfhbdPbfibcVbfkbflbfmbfmbfmaMbaMkbcsbctbdYbfnbgUbfpbgWbfrbfsbftbfubdYbebbfvbgXbfvbhebhCbfvbdybebbedbfCbfDbfEbfFbfGbfHbfIbfJaJibfKbfLbfMaJlaZzaZzaZzaZzbfNbfObfPbfQaZzaZzbfRaZzaZzaZzaZzbfSbfTbfUbfVbfVbfVbhJbfXaZzbfYbfZbgabgbbgcbgcbgcbgdaZzbevbewbdBaZzaZzaZzaZzaZzaZzaZzaZzaZzaZzaZzbgfbggbghbgibgjbgfbggaZzaRZbgkaVoaYuaVoaZNaZObglbgmaWTaZRaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaabgnbgobgpbgqaZUbgrbgrbgrbgrbgrbgrbgsbgtbgraYOaYOaYOaYOaYObhKaYOaYOaYObgvbgvbgwbbZbdDbgxbeZbgybbZbgzbgAbgzaTSbeRbdLbdMbfdaTSaXebdObdPbgBbgCbgDbfgbgDbdPbfibgEbgFbgGaFIaFGaFhaMbbgKbgLbctbhLbivbgObgPbexbexbgRbgSbgTbdYbebbmIbgVbhRbhNbfzbgYbhSbebbedbhabhbbhcbeCbhTbeEbhgbhhaJibhibhjaRpbhkbhlbhmbewbewbhnbewbhobewbewbewbewbhpbewbewbewbewbhqbewbewbewbewbewbewbhmbewbewbhrbhsbhsbhtbhsbhsbhubhvbewbhqbhwbhxbhpbewbhybewbewbewbhzbhAbhBbhUbewbhDbewbhEbewbewbhFbhGbhHaVoaYuaVobhIaHdbhXbhWbhMaHcaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhOaaaaafbhPaYDbhQbitbiqbjubjqbjwbjvbjubjBbjGbjCbjObhYbhZbgwbbZbbZbbZbiabfabbZaTSaTSaTSaTSbeRbibbicbjQaTSbiebifbdPbigbihbiibgDbijbdPbfibikbgFbgGbgGbgGaEhaMbbimaSzbctbjVbiobipbfjbirbisbfBbiubjMbdYbebbiwbixbiybjYbiybgYbgebebbedbiAbiBbiCbgQbiEbgZbiGbiHaJibiIbiJbiKbiLbiMbiNbiObiObiPbiQbiRbiSbiSbiSbiTbiSbiSbiSbiSbiSbiUbiVbiVbiVbiWbiObiObiNbiObiObiXbiVbiVbiYbiSbiZbjabjbbiSbjcbiObiObiObiObiObiObiObiObiObiObiObiObiObjdbiTbjebiSbjfbjgbjhbjibjibjjbjkaZNaWRbjlaWTaWTaWUaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhObhOaZSaZTbjmbjnbjobgrbjpbjpbjZbjpbjpbjpbjrbajbajbajbajbaibbZbdDbjsbjtbgybbZbkZbkZbkZaTSaTSaTSaTSbkkaTSbjxbdObdPbjybjzbgDbjAbkxbdPbkAbfmbkHbgGbgGbgGbjDaMbbjEaSzbctbkKbkLbgObhdbjIbjJbhfbjLblybdYbjNbkMbjPbiybkNbiybgVbkPbjSbedbjTbjUbizbjWbjWbjWbjXbkVaJibkXbkabkbbkcbkdbkebbFbkfbkgbkhbkibkjbkYbklbkmbknbknbkobewbewbewbewbewbkpbkqbkrbewbksbktcsfbkvbewbkpbkwcLYbkybhFbewbewbkzbewbewbllbkBbewbkpbewbewbewbewbewbewbewbewbewbhqbewbewbhFbkCbkDbkEbkFbkGblmbkIbkJaafaaaaafaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhObhObQDblrblEbQLbkObgrblTbkQbkRbkRbkSbkTbkUbmdbmlbmlbmAbmxbbZbbZbbZbeZbmBbbZbajbajbajbajblaaXeaXeblbblcbldbleblfblgblhblibljblkbdPbmEbfmbmFbgGblnbgGbloblpblqaSzbctbdYbmHblsbltblublvblwblxbdYbdYbebblzblAbmUbmNblDblAbiDbebbedbedblFblGblHblIbiCblJblKaJiblLblMblNaJiblOblOblOblOblOblOaZzaZzblPblQbZNcdMblQblPaZzaZzaZzaZzaZzaZzaZzaZzaZzaZzbmVaZzaZzaZzaZzaZzaZzbmXaZzbewbewblVblWbiFblOblOblOblOblOblXblYblYblZblYbewblYblZbmablYbmbblObmcbmcbmcbnbaRZbmeaRZaRZaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhObhObdubdvbjmbjnbmfbgrbmgbjpbmhbmibjpbjpbjpbnsbmjbmkbmkbnwbbZbdDbmmbeZbmnbbZbmobmpbmqbmrbmsbmtbmtbmubmtbmtbmvbdPbmwbnNbfgbmybmzblfbnRbnPbnSbgGbgGbjHbmDbnUblqaSzbnVbmGbmGbmGbmGbmGbmGbmGbnWbmGaafbebbmIbmJbmKbmLbmKbmMbjKbebaafbedbmObnXbmQbmRbiCbiGbmSaJibcKaRqaRpaJibmTbohboibmWbojbmYbmZbPMbolbjRbndbnebjRbopbmCbnhbnibnjbmPboKbnmbnnbPLbnpbnqbnrboWbntbntbnubYfaVJblOblObpmblObZMbZMblObnzbPKbnBblObZtbpobZtblOblXblYbmbblObZnbprbZnblObnGbPJbnIbnJbnKbnLbnMaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhOaaaaaabnObpwbeQbnQbgrbpLbpBbpMbnTbpPbpNbjpbpSbpTbnYbnZbnwbbZbbZbbZbbZbbZbbZboabobbocbodboebdPbdPbdPbdPbdPbdPbdPbWqbdPbdPbdPbogbdPbfmbqcbnSbgGbgGbgGbokblpblqaSzbqgbmGbombonbncbOIbvGbotbosbotaafbebboubovbowboxboybozbnfbebaafbedboBboCboDboEbiCbiGboFaJiboGboHaRpbXHboJbngboLboMbnkbPZboPboQboRboRboSboTboUboUboVbnlboXboYboZbpabpbbnnbPGbpdbpebpfbpgbphbpfbpibYfaVJbpjbpkbplbOJbpnbnybppbnCbnDbpqbqxbptboobqyblOaZzbqBbpxblObPeboqbPEbqGbpCbpDbnIbpEbpFbpGbnMaaaaaaaaaaacaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhObhOaZSaZTbjmbjnbjobgrbjpbjpbjZbjpbjpbjpbjrbajbajbajbajbaibbZbdDbjsbjtbgybbZbkZbkZbkZaTSaTSaTSaTSbkkaTSbjxbdObdPbjybjzbgDbfgbkxbdPbkAbfmbkHbgGbgGbgGbjDaMbbjEaSzbctbkKbkLbgObhdbjIbjJbhfbjLblybdYbjNbkMbjPbiybkNbiybgVbkPbjSbedbjTbjUbizbjWbjWbjWbjXbkVaJibkXbkabkbbkcbkdbkebbFbkfbkgbkhbkibkjbkYbklbkmbknbknbkobewbewbewbewbewbkpbkqbkrbewbksbktcsfbkvbewbkpbkwcLYbkybhFbewbewbkzbewbewbllbkBbewbkpbewbewbewbewbewbewbewbewbewbhqbewbewbhFbkCbkDbkEbkFbkGblmbkIbkJaafaaaaafaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhObhObQDblrblEbQLbkObgrblTbkQbkRbkRbkSbkTbkUbmdbmlbmlbmAbmxbbZbbZbbZbeZbmBbbZbajbajbajbajblaaXeaXeblbblcbldbleblfblgblhblibljblkbdPbmEbfmbmFbgGblnbgGbbAblpblqaSzbctbdYbmHblsbltblublvblwblxbdYbdYbebblzblAbmUbmNblDblAbiDbebbedbedblFblGblHblIbiCblJblKaJiblLblMblNaJiblOblOblOblOblOblOaZzaZzblPblQbZNcdMblQblPaZzaZzaZzaZzaZzaZzaZzaZzaZzaZzbmVaZzaZzaZzaZzaZzaZzbmXaZzbewbewblVblWbiFblOblOblOblOblOblXblYblYblZblYbewblYblZbmablYbmbblObmcbmcbmcbnbaRZbmeaRZaRZaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhObhObdubdvbjmbjnbmfbgrbmgbjpbmhbmibjpbjpbjpbnsbmjbmkbmkbnwbbZbdDbmmbeZbmnbbZbfebmpbmqbmrbmsbmtbmtbmubmtbmtbmvbdPbmwbnNbfgbmybmzblfbnRbnPbnSbgGbgGbjHbilbnUblqaSzbnVbmGbmGbmGbmGbmGbmGbmGbnWbmGaafbebbmIbmJbmKbmLbmKbmMbjKbebaafbedbmObnXbmQbmRbiCbiGbmSaJibcKaRqaRpaJibmTbohboibjAbojbmYbmZbjRblBblobndbneblobmobmCbnhbnibnjbmPboKbnmbnnbPLbnpbnqbnrboWbntbntbnubYfaVJblOblObpmblObZMbZMblObnzbmDbnBblObZtbpobZtblOblXblYbmbblObZnbmWbZnblObnGbPJbnIbnJbnKbnLbnMaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhOaaaaaabnObpwbeQbnQbgrbpLbpBbpMbnTbpPbpNbjpbpSbnlbnYbnZbnwbbZbbZbbZbbZbbZbbZboabobbocbodboebdPbdPbdPbdPbdPbdPbdPbWqbdPbdPbdPbogbdPbfmbqcbnSbgGbgGbgGbokblpblqaSzbqgbmGbombonbncbOIbvGbotbosbotaafbebboubovbowboxboybozbnfbebaafbedboBboCboDboEbiCbiGboFaJiboGboHaRpbXHboJbngboLboMbnkbPZboPboQboRboRboSboTboUboUboVbolboXboYboZbpabpbbnnbPGbpdbpebpfbpgbphbpfbpibYfaVJbpjbpkbplbOJbpnbnybppbnCbnDbpqbqxbptboobqyblOaZzbqBbpxblObopboqbprbqGbpCbpDbnIbpEbpFbpGbnMaaaaaaaaaaacaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaaaaaaaaaaaabgnbgobgpbgqbdvbpHbpHbpHbpIbpHbpJaZVbpKbqKbgrbqQbjpbrkbrcbpQbpRbrvbrubrwbrwbrwbrxbkWbpUbkWbkWbkWbkWbpVbpWbpWbpXbpYbdPcfycfocfzbrybqdbqebqfbrCbqhbqibqjbqkbqkbrDbrIbgGbgGbqmbfmaMbblqbqnbqoaJubqqbqrbqrbxqborbrPbxsbotaafbebbebbebbebbshbebbebbebbebaafbedbqzboCbqAbsjbqCbqDbqEaJibqFaRqaRpaJibskbqHbqIbqJaJDbqLboPbqNboUboUboUboUboUboUbqObqPbslboYbqRbqSboNbnnbqUbqVbqWbsnbpgbphbpfbqXbYfaVJbpjbqYbqZbqZbrabrbbsobrdbrdbrdbrebrdbrfboObrhbribrjbsqbnIbrlbpCbrmbrnbrobsrbnIbrqbpFbrrbnMaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaabrsbrtbsvbsBcaLbsHbsHbthbrzbrAbgrbtkbtlcaMbtmbjpbjpbjpbajbrEbrFbrGbrHbrGbrGbrGbrHbrGbajbajbdPbdPbdPbtBbdPbrJbrJbrJbrJbrJbrJbqfbrKbrLbrMbrNbrObtIbrQbrRbrSbrTbrUbrVbrWbrXbrYbrZaHBbsbbqvbsabYZcanbotbosbotaafbsibZibtKbtTbsmbtXbtKcaJbsiaafbedbspbuibspbedbedbedbujaJibssaRqaRpbXHboJbngbstbsubuobqLbswbqNcbQcdpcbdcbkceobsCbqObsDbnicevbsFcepcdGbnncdtbqVbpebpfbpgbphbpfbpibYfaVJbpjbsJbsKbsLbsMbplbsNceZbsPbsQbsRbsSbsTbsUbrhbsVbsWbsXbnIbsYbsZbtabtbbtccflbnIbrqbpFbtebnMaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaacaaaaaaaaaaaaaaaaaaaaabrsbtfbtgbuYbtibtibtibtjbtibtibgrbvabuZboAbvjbjpaaaaaaaaaaafaafbtnbtnbtnbtnbtnbtnbtnaaaaaabtobtpbtqbtrbtsbrJbrJbrJbrJbrJbrJbttbtubvqbtwbtxbtybtzbtAbfmbfmbvCbfmbfmbtCbtDbtEbtFbmGbtHbmGbmGbmGbmGbmGbvEbmGaafbtJbvFbtLbtMbtNbtMbtLbvIbtPaafbspbtQbtRbtSbvObtUbspbtVaJlbtWbbmbvZaJibtYbohbtZbuabwcbucbudbuebufbwgbWIbXnbwnbukbulbumbnibnnbunbpubVVbnnbuqburbusbutbuubuubuvbuwbYfaXqbpjbwxbplbplbsMbuybuzbVzbpvbuCbuDbuEbuFbVybrhbuHbuIbuJbnIbuKbuLbuMbtbbpCbVebnIbpEbpFbUAbnMaaaaaaaaaaaacHOaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaabrsbrtbsvbsBcaLbsHbsHbthbrzbrAbgrbtkbtlcaMbpTbjpbjpbjpbajbrEbrFbrGbrHbrGbrGbrGbrHbrGbajbajbdPbdPbdPbtBbdPbrJbrJbrJbrJbrJbrJbqfbrKbrLbrMbrNbrObtIbrQbrRbrSbrTbrUbrVbrWbrXbrYbrZaHBbsbbqvbsabYZcanbotbosbotaafbsibZibtKbtTbsmbtXbtKcaJbsiaafbedbspbuibspbedbedbedbujaJibssaRqaRpbXHboJbngbstbsubuobqLbswbqNbupbtmbuGbuAbuNbsCbqObsDbnibwDbsFbwKbxhbnncdtbqVbpebpfbpgbphbpfbpibYfaVJbpjbsJbsKbsLbsMbplbsNbxxbsPbsQbsRbsSbsTbsUbrhbsVbsWbsXbnIbsYbsZbtabtbbtccflbnIbrqbpFbtebnMaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaacaaaaaaaaaaaaaaaaaaaaabrsbtfbtgbuYbtibtibtibtjbtibtibgrbvabuZboAbvjbjpaaaaaaaaaaafaafbtnbtnbtnbtnbtnbtnbtnaaaaaabtobtpbtqbtrbtsbrJbrJbrJbrJbrJbrJbttbtubvqbtwbtxbtybtzbtAbfmbfmbvCbfmbfmbtCbtDbtEbtFbmGbtHbmGbmGbmGbmGbmGbvEbmGaafbtJbvFbtLbtMbtNbtMbtLbvIbtPaafbspbtQbtRbtSbvObtUbspbtVaJlbtWbbmbvZaJibtYbohbtZbuabwcbucbudbuebufbwgbzrbzcbwnbukbulbumbnibnnbunbpubzybnnbuqburbusbutbuubuubuvbuwbYfaXqbpjbwxbplbplbsMbuybuzbzzbpvbuCbuDbuEbuFbVybrhbuHbuIbuJbnIbuKbuLbuMbtbbpCbVebnIbpEbpFbUAbnMaaaaaaaaaaaacHOaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeObSwbxmbuVbpHbuWbgnbgobuXbuWbgrbxpbjpbxvbvbbjpaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnaaaaaabvcbvdbrJbvebvfbvfbvfbvfbvfbvgbvhbvfbvibxzbvkbvlbvmbSlbSrbfmbvpbgGbxDbpzbvsbvtbvubvvbmGbmGbmGbRcbQMbvzbvAbvBbvwaafbpObRpbvHbvJbvKbvMbvNbRybpOaafbspbqMbvQbxnbedbvRbspbvSaJlbvTbcLbvUaJibvVbvWbvXbTTbxObucbyobxTbyKbwdbwebwebwfbyMcdWcdVbUqbwkbTWbwmbwkbwkbwkbwkbyQbwkbwkaXKaXKaXKaXKaVJbpjbsJbsKbsLbwobwpbwqbwrbwsbwsbwsbsSbwtbTsbwvbwwbyUbwybnIbwzbwAbwBbwCbpCbSEbnIbwEbwFbnMbnMaaaaaaaaaaaaaafbuPbuQbuRbuQbuRbuQbuSaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbwMbwNbwObwPbrJbwQbrJbwRbwRbwRbwSbwTbrKbrJbrJbrLbwUbwVbwWbwXbrpbzcbxabgGbgGbugbxcbvtbvubxdbxebxfbzrbzHbxibxjbxkbxlbvwaafbxrbzNbzJbzObyLbxobzPbzVbxraafbspbqwbAebuBbedbAibspbtVaJlbxwbcLaRpaJibDDbxybAobxAbxBbxCbAtbxEbxCbxFbxGbDIbxFbwkbAxbxJbwkbwkbxKbxLbxMbxNbAAbxPbxQbxRbxSaXKbaybvraXKaVJbpjbxXbqZbqZbxYbxZbppbDQbwsbwsbwsbsSbwtbEFbwwbvDbUabTQbwwbESbFbbEZbyibpCbFybnIbrqbykbnMaaaaaaaaaaaaaaaaafbwGbwHbrgcLebwJbFUbwGaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbwMbwNbwObwPbrJbwQbrJbwRbwRbwRbwSbwTbrKbrJbrJbrLbwUbwVbwWbwXbrpbCkbxabgGbgGbugbxcbvtbvubxdbxebxfbEYbzHbxibxjbxkbxlbvwaafbxrbzNbzJbzObyLbxobzPbzVbxraafbspbqwbAebuBbedbAibspbtVaJlbxwbcLaRpaJibDDbxybAobxAbxBbxCbAtbxEbxCbxFbxGbDIbxFbwkbAxbxJbwkbwkbxKbxLbxMbxNbAAbxPbxQbxRbxSaXKbaybvraXKaVJbpjbxXbqZbqZbxYbxZbppbDQbwsbwsbwsbsSbwtbEFbwwbvDbUabTQbwwbESbFbbEZbyibpCbFybnIbrqbykbnMaaaaaaaaaaaaaaaaafbwGbwHbrgcLebwJbFUbwGaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbAFbypbAFbyqbyrbwQbrJbrJbrJbysbrJbwTbrKbytbdPbdPbyubgGbrNbwXbyvbywbyxbyybyybyzbyAbyBbyCbyDbvsbyEbvPbyGbxkbyHbyIbyJbvwaafbxrbxrbxrbxrbALbxrbxrbxrbxraafbyNbyNbyNbyNbyNbyNbyNbAVaJibyPblMblNaJibCnbyRbyRbySbyTbxCbAXbyVbyWbCobyYbyZbzabwmbzbbBqbzdbzebzfbzgbzgbzhbzibzgbzjbzkbckbaAbwubclbBsbcnbCQbzsbztbzubzvbzwbppbCXbpqbpqbDBbsSbwtbCLbzAbzBbzCbzDbzAbzEbzFbzGbBwbzIbwwbwwbBxbnMbnMbzKbzLbzLbzLbzMbCJbylbymbrgbwJbrgbynbuRaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaacaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbBAbzQbBAbzRbrJbwQbrJbzSbzSbzSbzSbwTbrKbzTbzUbdPbCkbgGbrNbBJbzWbzXbzYbgGblnbgGbzZbAabAbbAcbAdbyEbwIbAfbxkbxkbxkbAgbvwbAhbAhbBKbAhbBRbBQbBSbAjbBUbAjbAjbyNbCcbCdbAmbAnbBXbApbAqaJibAraRqaRpaJibAlbAsbAubAvbAwbBtbAybAzbBabABbACbADbAEbBEbAGbAHbAIbAJbAKbAIbxtbAMbANbAObnvblUbsdbBGbsgbsfbaAbPObpjbxubxUbAYbAZbAZbppbAkbBbbBcbppbBdbBebBfbBgbBhbBibBjbBkbBlbBlbBmbBnbBobTHbCrbBrbCwbCAbTIbBvbCEbCIbCHbCKbwGbwJbrgbwJbwJbBNbwGaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbBCbwNbBDbCYbrJbwQbrJbrJbrJbrJbrJbwTbrKbzTbBFbdPbzzbgGbBHbBIbgGbCZbgFbgGbgGbyjbvsbvtbAbbAcbAdbyEbvwbBLbBMbzybBMbBObvwbDbbDabDdbDcbDfbDebDhbDgbDjbDibBVbyNbBWbzmbBYbBZbCabCabCbbDwbAraRqaRpaJibzxbCebCebySbCfbxCbCgbChbxCbCibCjbCjbyObwkbClbCmbwkbwkbwkbwkbwkbwkbyXbwkbwkbwmbDKaXKaXKaXKaXKbDYbpjbwwbzAbzAbzAbzAbzAbzAbzAbzAbzAbzIbEibCsbCtbBhbCubCvbEjbCxbCxbCxbCybCzbEkbCBbCCbCDbEpbTGbCGbErbCGbEsbEubBzbuQbuRbEwbuRbuQbBBaafaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbBAbzQbBAbCMbCNbCObrJbrJbrJbCNbrJbwTbrKbzTbCPbdPbNzbgGbrNbwXbgGbqlbCRbgGbgGbECbxcbvtbAbbCTbxcbCUbvwbCVbEKbOxbAWbxlbvwbEMbELbERbAhbEUbEUbEUbAjbEWbEVbEXbyNbDkbDlbDlbDmbDnbDobDpaJibDqbDrbDsaJibDtbEYbDvbMpbDxbDybDzbDAbyWbLWbFabCjbMybwmbDEbDFbwmbDGbDHbNsbDJbFobDLbDMbCpbDNbDObBTbNtbDRbCpbVLbVMbDUbVAbDWbDXbDXbFrbDZbEabEbbEcbEdbEebEfbEabEgbEhbCvbFVbFFbGfbwwbwwbwwbwwbwwbGhbGgbEnbzKbzMbCJbEobGibCJbzKbzLbzMbGjbCJbGkaafcHOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbGubExbGubEybEzbEAbEAbEAbEAbEAbEBbGAbEDbzTbEEbdPbKobEGbEHbEIbEJbGDbGCbGWbGEbGvbtCbENbAbbEObEPbyEbvwbEQbHabLHbBMbETbvwbBPbHibHjbAhaaaaaaaaabAjbHmbHlbFcbyNbFdbFebFfbFgbDnbDobFhaJibxwaRqaRpbHMbFjbFkbFlbFmbFnbHNbFpbFqbxCbxFbxFbIZbxFbwkbFsbFtbFubFvbFwbFxbDJbIYbDLbFzbFAbFBbDObFCbFDbFEbHPbVlbDXbHQbVAbFJbDXbDXbFKbFLbFMbFLbFLbFNbFObFPbFQbFRbFSbCvbHRbJrbJabFWbFXbFYbFZbGabGbbGcbGdaafaafbCJbGebHUbHUbHVbIfbHZbIobEvaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaacaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbBAbzQbBAbzRbrJbwQbrJbzSbzSbzSbzSbwTbrKbzTbzUbdPbKobgGbrNbBJbzWbzXbzYbgGblnbgGbzZbAabAbbAcbAdbyEbwIbAfbxkbxkbxkbAgbvwbAhbAhbBKbAhbBRbBQbBSbAjbBUbAjbAjbyNbCcbCdbAmbAnbBXbApbAqaJibAraRqaRpaJibAlbAsbAubAvbAwbBtbAybAzbBabABbACbADbAEbBEbAGbAHbAIbAJbAKbAIbxtbAMbANbAObnvblUbsdbBGbsgbsfbaAbPObpjbxubxUbAYbAZbAZbppbAkbBbbBcbppbBdbBebBfbBgbBhbBibBjbBkbBlbBlbBmbBnbBobTHbCrbBrbCwbCAbTIbBvbCEbCIbCHbCKbwGbwJbrgbwJbwJbBNbwGaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbBCbwNbBDbCYbrJbwQbrJbrJbrJbrJbrJbwTbrKbzTbBFbdPbLpbgGbBHbBIbgGbCZbgFbgGbgGbyjbvsbvtbAbbAcbAdbyEbvwbBLbBMbLrbBMbBObvwbDbbDabDdbDcbDfbDebDhbDgbDjbDibBVbyNbBWbzmbBYbBZbCabCabCbbDwbAraRqaRpaJibzxbCebCebySbCfbxCbCgbChbxCbCibCjbCjbyObwkbClbCmbwkbwkbwkbwkbwkbwkbyXbwkbwkbwmbDKaXKaXKaXKaXKbDYbpjbwwbzAbzAbzAbzAbzAbzAbzAbzAbzAbzIbEibCsbCtbBhbCubCvbEjbCxbCxbCxbCybCzbEkbCBbCCbCDbEpbTGbCGbErbCGbEsbEubBzbuQbuRbEwbuRbuQbBBaafaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbBAbzQbBAbCMbCNbCObrJbrJbrJbCNbrJbwTbrKbzTbCPbdPbLHbgGbrNbwXbgGbqlbCRbgGbgGbECbxcbvtbAbbCTbxcbCUbvwbCVbEKbMIbAWbxlbvwbEMbELbERbAhbEUbEUbEUbAjbEWbEVbEXbyNbDkbDlbDlbDmbDnbDobDpaJibDqbDrbDsaJibDtbMMbDvbMpbDxbDybDzbDAbyWbLWbFabCjbMybwmbDEbDFbwmbDGbDHbNsbDJbFobDLbDMbCpbDNbDObBTbNtbDRbCpbVLbVMbDUbVAbDWbDXbDXbFrbDZbEabEbbEcbEdbEebEfbEabEgbEhbCvbFVbFFbGfbwwbwwbwwbwwbwwbGhbGgbEnbzKbzMbCJbEobGibCJbzKbzLbzMbGjbCJbGkaafcHOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbGubExbGubEybEzbEAbEAbEAbEAbEAbEBbGAbEDbzTbEEbdPbNzbEGbEHbEIbEJbGDbGCbGWbGEbGvbtCbENbAbbEObEPbyEbvwbEQbHabOxbBMbETbvwbBPbHibHjbAhaaaaaaaaabAjbHmbHlbFcbyNbFdbFebFfbFgbDnbDobFhaJibxwaRqaRpbHMbFjbFkbFlbFmbFnbHNbFpbFqbxCbxFbxFbIZbxFbwkbFsbFtbFubFvbFwbFxbDJbIYbDLbFzbFAbFBbDObFCbFDbFEbHPbVlbDXbHQbVAbFJbDXbDXbFKbFLbFMbFLbFLbFNbFObFPbFQbFRbFSbCvbHRbJrbJabFWbFXbFYbFZbGabGbbGcbGdaafaafbCJbGebHUbHUbHVbIfbHZbIobEvaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbGlbGmbGnbdPbdPbGobwNbwNbwNbGpbdPbdPbGqbGrbGsbdPbGtbGtbGtbITbGtbGvbGwbGxbGybGzbtCbvtbAbbIAbGBbtCbtGbtGbtGbtGbtGbIBbtGbtGbtGbIRbtGbIUbIMbIXbtGbJbbtGbtGbtGbtGbtGbtGbtGaJiaJiaJiaJibxwaRqaRpbHMbJqbFkbCSbGGbCWbGIbGJbGKbGLbGMbGNbCjbGObGPbGQbGRbGSbGTbGUbGVbIDbGXbGYbGZbJDbHbbHcbHdbHecLVbCpbUSbUfbwwbwwbwwbwwbwwbJVbwwbwwbwwbzAbKfbzAbzAbHkbBhbCubCvbHRbIvbKzbHnbHobHpbHqbGabGbbGcbHraaaaaabCJbHsbHtbEobCIbBybKBbKUbCJaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaaaafaaaaaaaaabHuaafaaaaaaaaaaaabGtbIubHwbHxbHybGvbHzbKVbHBbHCbtCbvtbAbbAcbAabHDbHEbHFbHGbHHbHIbHJbHKbHLbLabLxbLnbLzbAabAabLIbMhbLYbAabHTbAabzZbHHbKJbHWbHXbHYbMibxwaRqbDsaJlbDtbDubDtbDCbDPbxCbIbbIcbIdbIebMlbIgbIhbIibIjbIkbwmbIlbImbInbDJbDTbElbIpbIqcLUbFDbIsbItbHObCpbHSbIwbIxbIybUdbLybMqbICbMCbUcbIFbIGbIHbIIbIJbzAbIKbCubCvbMHbMFbINbIObIPbIQbHvbGabGbbISbEnbEnbEnbCJbCJbCJbMSbMPbCJbCJbBybCJaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaabMZaaaaaaaaaaaaaaaaaaaaaaaaaaabGtbuObEmbIVbIWbNdbuNbuGbuAbNfbtCbvtbJcbJdbJebJebJfbJgbJhbJibJjbJgbJfbJebJebNkbJkbJlbNqbJnbJobNBbJebJebJpbJgbJhbJibJjbJsbJtbJubJtbJvbJwbvUaJlbEtbEqbFHbGFbNLbGHbDzbHAbFibDVbxFbNQbCFbDSbDEbJGbwkbJHbJIbJJbDJbJKbJLbJMbJNbJObFDbJPbItbJObCpbJQbJRbIxbJSbJTbJUbNZbJWbObbJYbIFbJZbKabKbbKbbzAbKcbKdbKebOcbKgbKhbKibKjbKjbKkbGabGbbKlbEnbKmbOdbKnbEnaafaafaafaafaafaafaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbKpbKqbKqbKrbKsbKsbKtbKtbKtbKtbKuaafaafaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaaaaaaaabKvbKwbKxbKwbKyaaaaaaaaabGtbGtbOfbKAbIVbKAbOibKCbOnbKDbKEbtCbKFbvtbKGbKHbAabKIbAabzZbHHbKJbAabKKbKLbKMbKNbKObAcbAabKPbKQbHLbKRbHLbHLbKSbKTbODbOtbKWbKXbcLbKYaRpaRpaRpaJlbOEbFlbFnbOFbJmbOGbJybJxbFIbLgbLhbLibLjbHgbDEbIkbIabIzbHhbDJbDJbLobLobLobCpbLpbLqbLrbLsbLtbCpbLubLvbIxbLwbFGbLybOHbLAbLBbLCbIFbJCbLEbKbbKbbzAbRsbLFbCvbwwbLGbuTbuUbLJbLKbLLbGabLMbLNbLObLObLObLPbGdaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafbLQbLRbLSbLRbKsbKtbKtbLTbLUbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLVbsObLXbtdbLVbLZbMabMbbGtbMcbMdbMebMfbMgbOLbOKbMjbMjbMkbtCbtCbtCbOMbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbMmbMnbMobtCbtCbtCbtCbtCbONbtCbtCbtCaJlaJlbOQaJlaKSaMpbMraJlbKZbJXbORbGFbLdbxCbDzbLDbxCbtvbMzbMAbMBbwkbOTbMDbMEbOUbMGbPubMIbMJbMKbMLbItbJObFDbFDbMMbJObCpbMNbMObMObMObMObMObMObMObMObMObMObPvbMQbMRbMRbzAbPAbMTbMUbwwbMVbMVbMVbMWbMXbMYbMVbMVbMVbMVbMVbMVbNabNbaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymbPCbLRbLRbNebKtbKtbLTbLTbPDbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabKxbNgbMsbNgbKxbNibNjbPFbNlbNmbNnbKAbNobNpbGvbPHbNrbubbtObGvbNubNvbNwbNxaaaaaaaaaaaabNybuhbNAbPSbNDbNCbNEbNFbNGbNHbNIbNFbNJbNKbPXbNMbNNbNObNPbqsbNRbNSbNTbNUbNUbNUbNUbDtbDtbDtbDtbMtbMtbxCbQabOabQbbMzbMvbMubOebQcbOgbOhbQdbOjbMxbMwbOmbNhbMKbOobFDbFDbNVbJObJObOobCpbMNbMObOqbOrbOsbQebOubOvbOwbupbMObOybOzbOAbOAbzAbOBbOCbCvbzIbQgbQpbQjbQBbQubRdbQXbRvbRebRxbVFbMVbuxbEnbOObOObOObOObOOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabOPbKtbPCbKtbKtbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLVbNgbNgbNgbRAbRzbKAbOSbRDbRBbKAbRFbOVbOWbGvbGvbGvbGvbGvbGvbOXbOYbOZbPaaaabPbbPcbPcbPdbvYbPfbPgbPhbPfbPibNFbPjbPkbPlbNFbPmbNXbPobPpbPqbPrbPsbPtbPtbNSbRWbRJbPwbPxbPybDtbNYbLbbScbGFbGFbSgbDzbSibxCbSnbwZbwYbwlbwkbSubPIbwkbOkbwDbwKbOlbPNbMKbCpbCpbCpbCpbCpbCpbCpbCpbPObMObPPbQYbPRbOsbOsbOsbOsbwjbMObPTbLEbPUbPUbzAbBhbPVbPWbwbbPYbPYbSMbSObSNbSQbSPbSSbSRbSSbSVbMVbQfbSWbOObQhbTgbOpbQkaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKsbKtbQlbQmbQmbLTbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabKxbMsbMsbMsbKxbQnbQobTAbQqbQrbKAbKAbQsbQtbTObQvbQvbQvbQvbQvbQvbQwbQxbQyaaabQzbQAbUbbQCbxbbPfbQEbQGbQFbPfbNFbQIbQJbQKbNFbxxbxhbQNbQObQPbQQbQRbPtbQSbPxbQTbNUbPxbPxbQUbDtbPnbGFbQVbUkbGFbPzbDzbLebRCbQZbPBbUobyhbRGbDEbIkbSpbOkbwKbwKbOlbRfbMKbRgbRhbygbRjbRkbRlbybbRnbPObMObOsbOsbRobOsbOsbOsbOsbyabMObRqbLEbRrbRrbzAbRsbRtbRubyfbRwbUGbUwbUPbUObUWbURbVkbVjbVvbVmbxIbREbVGbxHbRHbRIbQibRKaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabKtbKtbRLbLTbLTbLTbLTbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaabMZaaaaaaaaaaaaaaaaaaaaaaaaaaabGtbuObEmbIVbIWbNdbPebPKbPEbNfbtCbvtbJcbJdbJebJebJfbJgbJhbJibJjbJgbJfbJebJebNkbJkbJlbNqbJnbJobNBbJebJebJpbJgbJhbJibJjbJsbJtbJubJtbJvbJwbvUaJlbEtbEqbFHbGFbNLbGHbDzbHAbFibDVbxFbNQbCFbDSbDEbJGbwkbJHbJIbJJbDJbJKbJLbJMbJNbJObFDbJPbItbJObCpbJQbJRbIxbJSbJTbJUbNZbJWbObbJYbIFbJZbKabKbbKbbzAbKcbKdbKebOcbKgbKhbKibKjbKjbKkbGabGbbKlbEnbKmbOdbKnbEnaafaafaafaafaafaafaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbKpbKqbKqbKrbKsbKsbKtbKtbKtbKtbKuaafaafaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaaaaaaaabKvbKwbKxbKwbKyaaaaaaaaabGtbGtbOfbKAbIVbKAbOibKCbOnbKDbKEbtCbKFbvtbKGbKHbAabKIbAabzZbHHbKJbAabKKbKLbKMbKNbKObAcbAabKPbKQbHLbKRbHLbHLbKSbKTbODbOtbKWbKXbcLbKYaRpaRpaRpaJlbOEbFlbFnbOFbJmbOGbJybJxbFIbLgbLhbLibLjbHgbDEbIkbIabIzbHhbDJbDJbLobLobLobCpbPMbLqbQPbLsbLtbCpbLubLvbIxbLwbFGbLybOHbLAbLBbLCbIFbJCbLEbKbbKbbzAbRsbLFbCvbwwbLGbuTbuUbLJbLKbLLbGabLMbLNbLObLObLObLPbGdaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafbLQbLRbLSbLRbKsbKtbKtbLTbLUbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLVbsObLXbtdbLVbLZbMabMbbGtbMcbMdbMebMfbMgbOLbOKbMjbMjbMkbtCbtCbtCbOMbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbMmbMnbMobtCbtCbtCbtCbtCbONbtCbtCbtCaJlaJlbOQaJlaKSaMpbMraJlbKZbJXbORbGFbLdbxCbDzbLDbxCbtvbMzbMAbMBbwkbOTbMDbMEbOUbMGbPubVzbMJbMKbMLbItbJObFDbFDbVVbJObCpbMNbMObMObMObMObMObMObMObMObMObMObPvbMQbMRbMRbzAbPAbMTbMUbwwbMVbMVbMVbMWbMXbMYbMVbMVbMVbMVbMVbMVbNabNbaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymbPCbLRbLRbNebKtbKtbLTbLTbPDbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabKxbNgbMsbNgbKxbNibNjbPFbNlbNmbNnbKAbNobNpbGvbPHbNrbubbtObGvbNubNvbNwbNxaaaaaaaaaaaabNybuhbNAbPSbNDbNCbNEbNFbNGbNHbNIbNFbNJbNKbPXbNMbNNbNObNPbqsbNRbNSbNTbNUbNUbNUbNUbDtbDtbDtbDtbMtbMtbxCbQabOabQbbMzbMvbMubOebQcbOgbOhbQdbOjbMxbMwbOmbNhbMKbOobFDbFDbNVbJObJObOobCpbMNbMObOqbOrbOsbQebOubOvbOwbWIbMObOybOzbOAbOAbzAbOBbOCbCvbzIbQgbQpbQjbQBbQubRdbQXbRvbRebRxbVFbMVbuxbEnbOObOObOObOObOOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabOPbKtbPCbKtbKtbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLVbNgbNgbNgbRAbRzbKAbOSbRDbRBbKAbRFbOVbOWbGvbGvbGvbGvbGvbGvbOXbOYbOZbPaaaabPbbPcbPcbPdbvYbPfbPgbPhbPfbPibNFbPjbPkbPlbNFbPmbNXbPobPpbPqbPrbPsbPtbPtbNSbRWbRJbPwbPxbPybDtbNYbLbbScbGFbGFbSgbDzbSibxCbSnbwZbwYbwlbwkbSubPIbwkbOkcbdbXnbOlbPNbMKbCpbCpbCpbCpbCpbCpbCpbCpbPObMObPPbQYbPRbOsbOsbOsbOsbwjbMObPTbLEbPUbPUbzAbBhbPVbPWbwbbPYbPYbSMbSObSNbSQbSPbSSbSRbSSbSVbMVbQfbSWbOObQhbTgbOpbQkaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKsbKtbQlbQmbQmbLTbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabKxbMsbMsbMsbKxbQnbQobTAbQqbQrbKAbKAbQsbQtbTObQvbQvbQvbQvbQvbQvbQwbQxbQyaaabQzbQAbUbbQCbxbbPfbQEbQGbQFbPfbNFbQIbQJbQKbNFcbQcbkbQNbQOcdpbQQbQRbPtbQSbPxbQTbNUbPxbPxbQUbDtbPnbGFbQVbUkbGFbPzbDzbLebRCbQZbPBbUobyhbRGbDEbIkbSpbOkbXnbXnbOlbRfbMKbRgbRhbygbRjbRkbRlbybbRnbPObMObOsbOsbRobOsbOsbOsbOsbyabMObRqbLEbRrbRrbzAbRsbRtbRubyfbRwbUGbUwbUPbUObUWbURbVkbVjbVvbVmbxIbREbVGbxHbRHbRIbQibRKaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabKtbKtbRLbLTbLTbLTbLTbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaabLVbRMbRNbRObLVbRPbMabMbbGtbGtbRQbRQbRQbGtbGtbNxbRRbRRbRSbRSbRSbRSbNwbQyaaabRTbRUbRVbVObRXbRYbRZbSabSbbSbbWgbSdbSebWibNFbPtbPtbPtbPtbPtbWkbPtbPtbShbWobSjbNUbPxbSkbvnbDtbQHbLbbQVbSmbWMbPzbSobJAbJBbSqbRabSsbStbJzbFsbSvbIEbSxbRibRbbSAbSBbMKbRmbSDbWVbRjbSfbSGbXabRnbPObMObMObMObRobOsbOsbOsbMObMObMObSIbSJbRrbRrbzAbSKbSLbCvbzIbXcbXfbXebSQbXibXqbXpbXvbXubYabXxbMVbQfbYobOObSXbSYbSybTaaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKtbLTbLTbLTbLTbLTbLTbTbbLTbTcbLTbLTbLTbLTbLTbKtbKtaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabTdbKwbTebKwbTfbYtaafaaaaaabGtbThbTibTjbGtaaabNxbTkbTlbTmbTnbTnbTnbTobQyaaabQzbTpbTqbTrbvobPfbTtbTvbTubTwbNFbSzbTybTzbYwbTBbTBbTBbTCbTCbTDbTEbULbPxbPxbTFbNUbNUbNUbNUbDtbDtbLfbLkbLcbDtbTJbTKbTLbJFbJEbTJbQbbLlbLmbTRbTSbTJbMKbMKbMKbMKbMKbMKbvLbTUbTVbRjbvybTXbTYbRnbPObMObTZbQWbPQbYHbYzbNWbNcbTZbUgbUhbUibIIbIJbzAbIKbSLbUjbwwbMVbMVbYMbYSbMVbMVbMVbMVbYYbSCbVFbMVbvxbUnbOObUpbZbbUrbOOaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabKtbUsbUsbUsbUsbUsbUsbUtbLTbUubUsbTcbLTbLTbLTbLTbKtaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMZaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbUvbNxbNxbNxbNxbRSbZcbNwbUxaaabUybPcbPcbUzblCbPfbPfbUBbPfbSFbNFbUDbSHbSTbNFbSUbSUbSUbSUbSUbSUbSUbSUbUHbUIbUJbUKbUKbUMbNUbDtbUNbSZbTxbUQbZebwabUTbUUbTMbilbTNbUTbUYbUZbVabVbbUebTPbVdblBbVgbVhbVibUlbZrbUmbRjbUCbZsbUCbRnbPObMObVnbUFbVpbVqbVrbVsbVtbVubUgbzAbZubzAbzAbVwbCxbSLbCxbVxaafbnxbZvbZzblSbVBbZBbZLbZCbZObUVbMVbVHbVIbOObVJbVKbVKbwhaaLaaLaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwibLRbLRbLRbLRbLRbLRbLRbVNbLUbLTbLTbLTbLTbZPbLUbKuaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMZaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbUvbNxbNxbNxbNxbRSbZcbNwbUxaaabUybPcbPcbUzblCbPfbPfbUBbPfbSFbNFbUDbSHbSTbNFbSUbSUbSUbSUbSUbSUbSUbSUbUHbUIbUJbUKbUKbUMbNUbDtbUNbSZbTxbUQbZebwabUTbUUbTMcdGbTNbUTbUYbUZbVabVbbUebTPbVdceobVgbVhbVibUlbZrbUmbRjbUCbZsbUCbRnbPObMObVnbUFbVpbVqbVrbVsbVtbVubUgbzAbZubzAbzAbVwbCxbSLbCxbVxaafbnxbZvbZzblSbVBbZBbZLbZCbZObUVbMVbVHbVIbOObVJbVKbVKbwhaaLaaLaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwibLRbLRbLRbLRbLRbLRbLRbVNbLUbLTbLTbLTbLTbZPbLUbKuaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabVPbVQbVQbVRbVSbNxbVTbRSbVUbNxaaaaaaaaaaaabNybpcbVWbVXbVZbVYbPfbNFbWabWbbNIbNFbSUbUXbVfbVcbVDbVCbVEbSUcaqcaqcaqcaqcaqbTFbWjbZSbWlbWcbWdbZUbWpbxgbWrbWsbWtbWubWtbWvbWtbWwbWxbWybWzbWAbWBbWAbWCbWDbWEbWFbWGbWebnHbWfbWKbWLbZVbxVbMObxWcaabzlbWSbWTbWhbWSbWSbnAbWWbWXbWYbWZbCxbCxbSLbCxbFTaafbnxcaxcaxbXbbnabXdbnocaWbXgbXhbMVbVHcbebOObOObOObOObOOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabKtbQmbQmbQmbQmbQmbQmbXkbLTbQlbQmbXlbLTbLTbLTbLTbKtaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabXmcbfbWmcbgbRScbibXrbRSbXsbNxaaKaaaaaaaaabNybNybNybNybNybNybNybNFbUDbUEbXtbNFbSUbWnbWJbWHbWHbWJbWRbSUbhVbWUbWUbXocaqbXBbDtbDtbXCbXDbXEbXFbXGblRbXIbXJbXKbXLbXMbXNbXObXPbXQbXRbXSbXTbXUbznbzpbzobAPbzqbARbAQbATbAScbjbAUbYfbYgbIwbYhbVobCqbWObWNbWPbYmbYnbgJbYpbYqbYrbYscbmbYrbYubYvbILaafbnxcbncbrbrBbVBcbtcbAcbycbDbYAbMVbVHbYBbYCbUnaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKtbLTbLTbLTbLTbLTbLTbTbbLTbXlbLTbLTbLTbLTbLTbKtbKtaafaaaaaaaaaaaaabgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYDbVQbVQbVRbYEbYFbYGbNxcbJbNxbYIbYJbYKbYIbYIbYLcbLbYNbYObYPcbObXwbXzbXybYebXAbYjbWJbYybYxbYRbYQbYTbidbYVbYUbYXbYWcaqbZhbNScbWbZjbZkbZlbZlbZmbnEbZobZpbTJbTJbZqcccbTJbTJccncceccrcaIcctbWQbZxbZyccubZybZAbZaccvbZabZAccEbYfbMNbIwbZEbXWbXVbZdccGbZJbZKbMObMObwwbwwbwwbwwbwwboIbnFbofbwwbMVbMVbMVbMVbMVbMVbMVbMVbMVbMVbMVbMVccJbZQbZRbUnaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabKtbKtbRLbLTbLTbLTbLTbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamccMaamaamaamaamaamaaaaaaaaaaaaaaaaaaaafaafaaabZfbZgbZgbZgbZHbZgbZgbZTbZIbYIbZYbZZbYIccQcabccScadbZWcafccYbZXcaecaccahcagcaibWJbYycajcakbYQcalbSUcaqcaqcaqcaqcaqcarbNSbDtcascatcdjcamcawcdmcaycazbTJcaocaBcaCcaDcaEcaFcaGcaHcaIbZxbWQcapbZycaKbsEbZAbsGcaNcaObZAbXXbYfbPObIwbXYbsAbXZbXYbXYbIwbIwbIwcaRcaScaTcaUcaVbwwbwwcdBbwwbwwcaXcaYcaucaAcavcdNcaZcbacbccdUcdTcdZcdYcbhbUnbUnbUnaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKsbKtbUubUsbUsbLTbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcbbceccebcblcedceicefcbpcbobYIcelcbsbYIbYIcercbucbvcbwcbxceucbqbXzbXybYecbzbsIbWJbWJcbBcbCbWJcexbSUcbFcbGcaqcbHcaqbTFcbIcbIcbIcbIcbIcbIcbIbTJceCcbEbTJcbKcbMcbNceHcaEcbPceIceKcaIbZxbWQcbRbZycbScbTbZAcbUcbVcfebZAccqbYfbYbbYdbYcbYiccsccAbYccfibYkbYlcktbZDbZwbZFcktcfjbZGccCccBcfkccDccPccFcfscfmcfGcfucfmcfIcfMcfLcfRccwccxccycczbUnbUnbUnbUnaaaaafaaaaaaaaaaahaahaahaafaaaaaaaafaaaaaaaafaaaaaabOPbKtbPCbKtbKtbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcbbceccebcblcedceicefcbpcbobYIcelcbsbYIbYIcercbucbvcbwcbxceucbqbXzbXybYecbzbsIbWJbWJcbBcbCbWJcexbSUcbFcbGcaqcbHcaqbTFcbIcbIcbIcbIcbIcbIcbIbTJceCcbEbTJcbKcbMcbNceHcaEcbPceIceKcaIbZxbWQcbRbZycbScbTbZAcbUcbVcfebZAccqbYfbYbbYdbYcbYiccsccAbYccepbYkbYlcktbZDbZwbZFcktcfjbZGccCccBcfkccDccPccFcfscfmcfGcfucfmcfIcfMcfLcfRccwccxccycczbUnbUnbUnbUnaaaaafaaaaaaaaaaahaahaahaafaaaaaaaafaaaaaaaafaaaaaabOPbKtbPCbKtbKtbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafccRccRcebccTcfZceiccUccWccVbYIcgeccHccIcgfccKccLcgmccNccOcgoccXcdaccZcdecdbbqTcdycdQcdFcekceecembsccdccddaJEcdfcaqbTFcbIcdgcdhcdicgOcdkcdlcgRcdncdocgWcdqcdrcdsbqtcaEcducdvcdwcaIbZxbWQcenbZycdxbqbbZAcdzcdAbqabZAcaPbYfbYfcaQbYccbYcbXcbZbYcchBccacjfcdLcdLbyFbBucdLcdOcdPceqcdRcdOcdSbBpbyebydcdScdScdScdScgXbyebydcdScdSbXjcdXbpZbpAceachabpybpsbycbycbycbycbycbycbycbycbycbycbycbycbycbycbycbycchicegcegcehbKtbKtbLTbLTchnbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacejcejcejcejcejcejcejcetcesbYIbYIbYIbYIbYIchpchuchqchqchqchzcewbXzbXybYeceybYjceEceTceSceWceUceXbSUcezaJFceYaJFcaqbTFcbIceDcfacfacfaceFceGbTJchPchLbTJcbKcbNceJceHcaEchSceLceMcaIbZxbWQceNbZyceOcePbZAbZAbZAbZAbZAccbceRbYfcaQbYcccdbszbYcbYcchBcifcjfcdLbsycfbcfbcfccdOcfdciycffcdOcfgcfhcfhcfhciCciLciKbsxciPcfnbsecfpcdScfqcfrciQbUnbUnbUnbUnaaaaafaaaaaaaaaaahaahaahaafaaaaaaaafaaaaaaaafaafaafcftcfBcfvbNebKsbKtbKtbLTbLUbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcejcfwcfxcvbcvccwfcejcfDcfCcfFcfEcfHciVcjacjacfKcfJcfJcjlcjpcbqbXzbXybYecfNcaicfOcfQcfPcvtcwecggbSUaJFaJFcaqceBcaqbTFcbIcfVcfWcfWcfWcfXcbIcfYcjtcgacfYcgbcgccgdcjvcaEcjCceLcgicaIcghccfcwEbZycgkcglbZycjIbLvbVicgnccgcchbYfccjcciccicckcclcclcclcclccmcdLckncgycgycgzcgActscgrcgpcgucgtcgGcgGcgGcgxcgIcgIcgJckocgLcgDcgMcdScgNcwDcgPcgNaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcgQbKqbKqbKrbKsbKsbKtbKtbKtbKtbKuaafaafaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -7546,10 +7542,10 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafaafcgEclXcmmcmjcgEcmtcmmcEgcgEcmtcmmcEgcgEaaaaafcmzcgTcgTcgUcgUcmAcejcmvcmucmxcpocprcmycmCcmCcmEcmDcmCcmFcyXcbqcmIcmHcmKcmJcimcmLcmLcmMcljcmNczJczeczeciAcibceVcCgcqgciGcClciIcnccndcpCciGcmSciNcmWcfYcpGcnicnjciScCOciUclLclMclNcnlcpHcnlclNaaaaaaaaabYfbYfbYfcnnclSclSclTbYfbYfaaaaaaaaaaaacdOcdOcdOcdOcdOcdOcdOcdOcdOcnocnpcnqcdScdScnrcnscntcdScdScdScdScpIcnscntcdScdScnvcpNcnvaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccMaafaafaafaaaaafcnxaafcnxaafcKAaafcpOaafcKAaafcpOaafaafaaacejcnAcnBcgUcgUcnCcnDcpRcpPcnycnmcpUcnzcnzcqecnzcnGcqrcnHcnGcnJcjscDXcEjcnMcnOcnOcnOcnOcqIcqDcnRcnRcnRcgscgscgscgscnSciGcKCcJpcnccEZcnWciGcmSciNcEXciUcnYcEJcnjcEBcEqciUclLclMclNcoccodcoeclNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaacdOcofcogcohcwlcojcokcqLcomcqNcopcoocdOaaLaafaafaafaafaaaaaaaaacqOaaaaaaaaaaafcoscKGcosaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafcoucrvcracoxcovcowcrzcoxcrQcrUcrzcoDcrVcrXcoEcnycnycnycnycnycnycnycnycoHcoGcrZcoIcsacoKcoNcoMcoOcnGcoQcoPcoRcnGcoTcoScoUcnOcoWcoVcoYcoXcpacoZcpjcpbcpbcpkcpncpncpjcsbciGciGcpccscciGciGciGcpeciNcDIciUciUciUcsecphciUciUclLcpiclNcvmcpscvmclNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaafcdOcplcpmcplcsgcLZcppcpqcomcomcsicomcdOcdOaaaaaaaaaaafaafaaaaacaaaaaaaaaaaaaafaaacDLaaaaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaaaaaaaaaafcptcsDcpucpxcpwcpFcsLcsMcpzcsWcsQcpEcpDcsXcpFcpLcpJcsYcnTcnbcnkcnUcpTcpWcpVcpYcpXcqacpZcqccqbctccqdcticqfctkcqzcoTcqJcqKcnOcpacpacpacpacpacqMcpjcqPcqPcqPcpncpncpjbTFcrYciGcqhcqicqjcqkciGcqlciNcmOciUcqncqocqpcqqciUctmclLcpiclNctxcqQcquclNaaaaaaaaaaaaaaaaaacqvcqwcqxcqycqvaafaaaaaaaaaaaacdOcplcplcplcoictBcqBcqCctIcqEcqFcqGcqHcdOaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaaacmZaaaaafaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaaaaaaaaaafcptcsDcpucpxcpwcpFcsLcsMcpzcsWcsQcpEcpDcsXcpFcpLcpJcsYcnTcevcnkceZcpTcpWcpVcpYcpXcqacpZcqccqbctccqdcticqfctkcqzcoTcqJcqKcnOcpacpacpacpacpacqMcpjcqPcqPcqPcpncpncpjbTFcrYciGcqhcqicqjcqkciGcqlciNcmOciUcqncqocqpcqqciUctmclLcpiclNctxcqQcquclNaaaaaaaaaaaaaaaaaacqvcqwcqxcqycqvaafaaaaaaaaaaaacdOcplcplcplcoictBcqBcqCctIcqEcqFcqGcqHcdOaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaaacmZaaaaafaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafcqRcqYcqScqVcqUcpFcqXcpFcvWcqYcqXcpFcvWcqYcpFcpFcpFcpFcpFcqZcpFcpFcpFcrbctOcrdcrcctScpZcrfcrecrhcrgcrjcricrlcrkcoTcqJcrmcnOcrncpacpacrocpacrpcpjcrIcrKcrJcrKcrLcpjbTFcrqciGcrrcrscrtcructTcrwcrxcryctVcrAcrBcrCcrDciUcrEcrFcrGcrHcqvcuacqvcrHaaaaaaaafaaaaaaaaacqvcrRcrTcrScqvaafaafaaaaaaaaacdOcomcomcomcomcrMcppcrNcrNcrNcnpcrNcrOcdOaaaaaaaaaaaaaaacrPcrPcrPccMaafaafaafaafcnaaafaafaafaafaafaaqcrPcrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaafaafcptcpFcrccpFcrccpFcqXcpFcuecxacufcxaculcxacxacuycurcpFcpFcuLcuEcuEcuEcuYcuUcvkcvkcvlcpZcvncshcsjcnGcsmcskcvscnGcspcsocsrcsqcstcsscsvcsucpacswcpjcsxcrKcsycrKcsKcpjbTFcizciGcszcsAcsBcsCciGcfYcoacfYciUcsEcsFcsGcsHciUcsIcrGcrGcqvcsJcsNcvvcqvcqvcqvcqvcqvcqvcqvcqvctMctDctNcqvcqvcqvcrHaaaaaacdOcofcogcohcslcsRcqBcrNcrNcrNcnpcrNcsScdOaaaaaaaaaaaaaaacrPaaaaafaaaaafaaaaaaaaackxaaaaafaafaaaaaaaaaaaacrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaafaaaaaacptcpFcrccpFcsOcsTcvEcsVcsUcvGcufcxacvOcxacxacvXcvRcwmcwacwzctacwUcwHcwHcwWcrccrccthctgctjcwXcnzcnGcwYcnGcnGcnGcwZctlcsrctncttctoctyctucpacxdcpjcxocrKcsycrKcxpcpjctvctwciGciGcxqciGciGciGciBctzctAciUciUciUcxrciUciUcsIcrGaaacqvctCctZctEctFcnZctHcxsctJctKctLcqvcuVcxtcuVcqvcxFctPcqvaafaafcdOcplcplcplcxHcLZctRcuccnXcnVcudcrNctWcdOcdOcdOcdOaaaaaacrPaaactXctXctXctXctXaafckxaafctXctXctXctXctXaaacrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaafaafcptcpFcrccpFcrccpFcqXcpFcuecxacufcxaculcxacxacuycurcpFcpFcuLcuEcuEcuEcuYcuUcvkcvkcvlcpZcvncshcsjcnGcsmcskcvscnGcspcsocsrcsqcstcsscsvcsucpacswcpjcsxcrKcsycrKcficpjbTFcizciGcszcsAcsBcsCciGcfYcoacfYciUcsEcsFcsGcsHciUcsIcrGcrGcqvcsJcsNcvvcqvcqvcqvcqvcqvcqvcqvcqvctMctDctNcqvcqvcqvcrHaaaaaacdOcofcogcohcslcsRcqBcrNcrNcrNcnpcrNcsScdOaaaaaaaaaaaaaaacrPaaaaafaaaaafaaaaaaaaackxaaaaafaafaaaaaaaaaaaacrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaafaaaaaacptcpFcrccpFcsOcsTcvEcsVcsUcvGcufcxacvOcxacxacvXcvRcwmcwacwzctacwUcwHcwHcwWcrccrccthctgctjcwXcnzcnGcwYcnGcnGcnGcwZctlcsrctncttcnbcnbcnUcpacxdcpjcxocrKcsycrKcxpcpjctvctwciGciGcxqciGciGciGciBctzctAciUciUciUcxrciUciUcsIcrGaaacqvctCctZctEctFcnZctHcxsctJctKctLcqvcuVcxtcuVcqvcxFctPcqvaafaafcdOcplcplcplcxHcLZctRcuccnXcnVcudcrNctWcdOcdOcdOcdOaaaaaacrPaaactXctXctXctXctXaafckxaafctXctXctXctXctXaaacrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacptcpFcsOcsTcsTcsTcvEcsTcsTcsTcvEcsTcsTcsTcsTcsTcxVcyacsTcybcsTcyccsTcsTcsTcuhcugcuicpvcpFcujcygcukcuncumcupcuocumcuqcuscyhcuucutcutcuvcutcuwcyicuxcuAcuzcuBcuBcpjcuCcuDcymcuFcuFcuGcuHcuIcuJcuJcuJcuJcuJcuJcuJcuJcuKcrFcrGaaactFcypcuPcuNctFcpycuRcuQcuQcvdcvacuQcuQcvhcuQcuVcuXcuQcqvaaaaaacdOcplcplcplcslcyrcuZcvicpBcpAcvjcrNcrNcvecvfcvgcdOaafaafcrPaafckVckSckSckSckSckyckxckwckvckvckvckvckUaafcrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacptcpFcpFcpFcpFcpFcqXcpFcpFcpFcqXcpFcpFcpFcpFcpFcvWcpFcpFctScpFcyucpFcyEcyzcvpcvocvrcvqcyFcvqcyHcvucvxcvwcvycvucvucvzcvAcqIcvBcpacvDcvCcpacpacyJcrKcrKcvFcuBcuBcpjbPxcAscvNcvNcvNcvNcyKcvNcvNcvNcvNclMcvPcrGcrGcrGcrGcrGcrGaaactFctFcyRctFctFcobcvScvTcvUcvVcvHcvJcvIcvLcvKcyZcwbcwccqvaaaaaacdOcomcomcomcomcwdcppcvicpgcoycvQcrNcrNcwhcrNcwicdOaaaaaacrPaafcwjcwjcwjcwjcwjaaackxaaacwjcwjcwjcwjcwjaafcrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaccMaaaaaaaaaaaacptcpFcpFcpFcpFcpFcqXcpFcpFcpFcqXcpFcpFcpFcpFcpFcvWcpFcpFctScpFczncpFcpFczncznczocpFcpFcvZcvYcwgcwgcwgcwgczqcwkcoTcwocwpcsqcwqcpacwscvCcpacwtcpjcwucrKcwvcwxcwwcpjczrcvMcvNcwIcwJcwKcwLcwMcwNcwOcvNcwPcwQcrGaaaaaaaaaaaaaaaaaacqvcwRcwycwAczBcwCcwBcqWcqAcqtcwFcwTcwScwVczFcuWcuQcqmcqvaaaaaacdOcofcogcohckXcsRcuZcxgcxhcxhcxicxjcxkczLcxmcqscdOaaaaaacrPaaaaafaaaaafaafaafaaackxaaaaafaaaaafaaaaafaaacrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/maps/exodus-2.dmm b/maps/exodus-2.dmm
index 54f5f95db4..f42d980970 100644
--- a/maps/exodus-2.dmm
+++ b/maps/exodus-2.dmm
@@ -517,7 +517,7 @@
"jW" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/centcom/evac)
"jX" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/centcom/evac)
"jY" = (/obj/structure/table/reinforced,/obj/item/weapon/pen,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/centcom/evac)
-"jZ" = (/obj/structure/table/standard,/obj/item/stack/sheet/glass{amount = 15},/obj/item/weapon/cell{charge = 100; maxcharge = 15000},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_mothership)
+"jZ" = (/obj/structure/table/standard,/obj/item/stack/material/glass{amount = 15},/obj/item/weapon/cell{charge = 100; maxcharge = 15000},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_mothership)
"ka" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; freerange = 1; frequency = 1213; name = "Syndicate Intercom"; pixel_y = -32; subspace_transmission = 1; syndie = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_mothership)
"kb" = (/obj/structure/closet/syndicate/personal,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_mothership)
"kc" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/syndicate_mothership)
@@ -731,7 +731,7 @@
"oc" = (/obj/machinery/door/airlock/centcom{name = "Bathroom"; opacity = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
"od" = (/obj/machinery/shower{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
"oe" = (/obj/structure/table/rack,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership)
-"of" = (/obj/structure/table/standard,/obj/item/stack/sheet/glass{amount = 15},/obj/item/weapon/cell{charge = 100; maxcharge = 15000},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start)
+"of" = (/obj/item/stack/material/steel{amount = 50},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom)
"og" = (/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor,/area/supply/dock)
"oh" = (/obj/structure/table/standard,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 8},/obj/item/weapon/pen{pixel_y = 4},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start)
"oi" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/structure/window/reinforced,/turf/unsimulated/floor{icon_state = "floor5"},/area/syndicate_mothership)
@@ -802,7 +802,7 @@
"pv" = (/obj/item/device/multitool,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/structure/table/reinforced{icon_state = "table"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom)
"pw" = (/obj/item/weapon/storage/toolbox/mechanical,/obj/structure/table/reinforced{icon_state = "table"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom)
"px" = (/obj/machinery/vending/cigarette{name = "hacked cigarette machine"; prices = list(); products = list(/obj/item/weapon/storage/fancy/cigarettes = 10, /obj/item/weapon/storage/box/matches = 10, /obj/item/weapon/flame/lighter/zippo = 4, /obj/item/clothing/mask/smokable/cigarette/cigar/havana = 2)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start)
-"py" = (/obj/structure/table/standard,/obj/item/weapon/kitchen/utensil/knife{pixel_x = -6},/obj/item/weapon/reagent_containers/syringe/drugs{pixel_x = 3; pixel_y = -1},/obj/item/weapon/reagent_containers/syringe/drugs{pixel_x = 3; pixel_y = 4},/obj/item/weapon/reagent_containers/syringe/drugs{pixel_x = 3; pixel_y = 9},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start)
+"py" = (/obj/structure/table/standard,/obj/item/weapon/material/kitchen/utensil/knife{pixel_x = -6},/obj/item/weapon/reagent_containers/syringe/drugs{pixel_x = 3; pixel_y = -1},/obj/item/weapon/reagent_containers/syringe/drugs{pixel_x = 3; pixel_y = 4},/obj/item/weapon/reagent_containers/syringe/drugs{pixel_x = 3; pixel_y = 9},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start)
"pz" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/syndicate_station/start)
"pA" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "admin_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/floor/plating,/area/shuttle/administration/centcom)
"pB" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom)
@@ -821,8 +821,8 @@
"pO" = (/obj/item/weapon/flame/lighter/zippo,/obj/structure/table/reinforced{icon_state = "table"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom)
"pP" = (/obj/item/weapon/storage/fancy/cigarettes,/obj/structure/table/reinforced{icon_state = "table"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom)
"pQ" = (/obj/machinery/door/airlock/glass,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom)
-"pR" = (/obj/item/stack/sheet/glass{amount = 50},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom)
-"pS" = (/obj/item/stack/sheet/metal{amount = 50},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom)
+"pR" = (/obj/item/stack/material/glass{amount = 50},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom)
+"pS" = (/obj/structure/table/standard,/obj/item/stack/material/glass{amount = 15},/obj/item/weapon/cell{charge = 100; maxcharge = 15000},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start)
"pT" = (/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/living)
"pU" = (/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/living)
"pV" = (/obj/structure/closet/secure_closet/personal,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/living)
@@ -963,7 +963,7 @@
"sA" = (/obj/structure/mirror{pixel_y = 28},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/living)
"sB" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/living)
"sC" = (/obj/machinery/computer/card/centcom,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/living)
-"sD" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/kitchen/rollingpin,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/living)
+"sD" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/material/kitchen/rollingpin,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/living)
"sE" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/turf/simulated/shuttle/floor,/area/supply/dock)
"sF" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "supply_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/shuttle/plating,/area/supply/dock)
"sG" = (/obj/machinery/light/small{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start)
@@ -1135,7 +1135,7 @@
"vQ" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/handcuffs,/obj/item/clothing/glasses/night{pixel_x = -1; pixel_y = -3},/obj/item/clothing/glasses/night{pixel_x = -1; pixel_y = -3},/obj/item/clothing/glasses/night{pixel_x = -1; pixel_y = -3},/obj/item/clothing/glasses/night,/obj/item/weapon/storage/box/handcuffs,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
"vR" = (/obj/structure/table/rack,/obj/item/weapon/rig/ert/security,/obj/item/clothing/accessory/storage/black_vest,/obj/item/weapon/rig/ert/security,/obj/item/clothing/accessory/storage/black_vest,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
"vS" = (/obj/structure/table/rack,/obj/item/rig_module/mounted,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
-"vT" = (/obj/structure/table/reinforced,/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/metal{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/sheet/metal{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/sheet/metal{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/sheet/metal{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/sheet/plasteel{amount = 50},/obj/item/stack/sheet/plasteel{amount = 50},/obj/item/stack/sheet/plasteel{amount = 50},/obj/item/stack/sheet/plasteel{amount = 50},/obj/item/stack/sheet/glass/reinforced{amount = 50},/obj/item/stack/sheet/glass/reinforced{amount = 50},/obj/item/stack/sheet/glass/reinforced{amount = 50},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 3},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
+"vT" = (/obj/structure/table/reinforced,/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/steel{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/material/steel{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/material/steel{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/material/steel{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/material/plasteel{amount = 50},/obj/item/stack/material/plasteel{amount = 50},/obj/item/stack/material/plasteel{amount = 50},/obj/item/stack/material/plasteel{amount = 50},/obj/item/stack/material/glass/reinforced{amount = 50},/obj/item/stack/material/glass/reinforced{amount = 50},/obj/item/stack/material/glass/reinforced{amount = 50},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 3},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
"vU" = (/obj/structure/table/standard,/obj/item/weapon/scalpel,/obj/item/weapon/circular_saw{pixel_y = 8},/obj/machinery/light/small{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start)
"vV" = (/turf/unsimulated/floor{icon_state = "green"; dir = 4},/area/centcom/control)
"vW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/control)
@@ -1494,7 +1494,7 @@
"CL" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/holding)
"CM" = (/obj/structure/window/shuttle{icon_state = "window3"},/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom)
"CN" = (/turf/unsimulated/wall,/area/centcom/holding)
-"CO" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/flame/lighter/zippo,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/ashtray/bronze{pixel_x = -1; pixel_y = 1},/turf/unsimulated/floor{tag = "icon-wood"; icon_state = "wood"},/area/centcom/holding)
+"CO" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/flame/lighter/zippo,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/material/ashtray/bronze{pixel_x = -1; pixel_y = 1},/turf/unsimulated/floor{tag = "icon-wood"; icon_state = "wood"},/area/centcom/holding)
"CP" = (/turf/unsimulated/floor{tag = "icon-wood"; icon_state = "wood"},/area/centcom/holding)
"CQ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/holding)
"CR" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "greencorner"; dir = 1},/area/centcom/holding)
@@ -1587,7 +1587,7 @@
"EA" = (/turf/simulated/shuttle/wall{icon_state = "swall7"; dir = 2},/area/shuttle/escape/centcom)
"EB" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/shuttle/escape/centcom)
"EC" = (/turf/unsimulated/floor{icon_state = "warning"},/area/centcom/holding)
-"ED" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/flame/lighter/zippo,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/ashtray/bronze{pixel_x = -1; pixel_y = 1},/obj/machinery/camera/network/crescent{c_tag = "Crescent Bar East"; dir = 4},/turf/unsimulated/floor{tag = "icon-wood"; icon_state = "wood"},/area/centcom/holding)
+"ED" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/flame/lighter/zippo,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/material/ashtray/bronze{pixel_x = -1; pixel_y = 1},/obj/machinery/camera/network/crescent{c_tag = "Crescent Bar East"; dir = 4},/turf/unsimulated/floor{tag = "icon-wood"; icon_state = "wood"},/area/centcom/holding)
"EE" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/centcom/holding)
"EF" = (/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/beach/sand{tag = "icon-beach (SOUTHEAST)"; icon_state = "beach"; dir = 6},/area/centcom/holding)
"EG" = (/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/beach/sand{tag = "icon-seashallow"; icon_state = "seashallow"},/area/centcom/holding)
@@ -1699,7 +1699,7 @@
"GI" = (/turf/simulated/floor{icon_state = "red"; dir = 8},/area/tdome)
"GJ" = (/turf/simulated/floor{icon_state = "green"; dir = 4},/area/tdome)
"GK" = (/obj/effect/landmark{name = "tdome1"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome1)
-"GL" = (/obj/structure/table/rack,/obj/item/weapon/kitchenknife/ritual,/turf/unsimulated/floor{dir = 1; icon_state = "chapel"},/area/wizard_station)
+"GL" = (/obj/item/weapon/material/knife/ritual,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station)
"GM" = (/obj/machinery/recharger{pixel_y = 4},/obj/effect/landmark{name = "tdome2"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome2)
"GN" = (/obj/machinery/recharger{pixel_y = 4},/obj/effect/landmark{name = "tdome1"},/turf/unsimulated/floor{name = "plating"},/area/tdome/tdome1)
"GO" = (/obj/machinery/porta_turret{anchored = 0; check_records = 0; enabled = 0; req_one_access = list(103); use_power = 0},/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/holding)
@@ -1723,7 +1723,7 @@
"Hg" = (/obj/machinery/door/blast/regular{id = "thunderdomeaxe"; name = "Axe Supply"},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome)
"Hh" = (/obj/effect/overlay/coconut,/turf/unsimulated/beach/sand,/area/beach)
"Hi" = (/turf/unsimulated/floor{icon_state = "redcorner"; dir = 8},/area/tdome)
-"Hj" = (/obj/structure/table/rack,/obj/item/weapon/kitchenknife/ritual,/turf/unsimulated/floor{dir = 4; icon_state = "chapel"},/area/wizard_station)
+"Hj" = (/obj/structure/table/rack,/obj/item/weapon/material/knife/ritual,/turf/unsimulated/floor{dir = 1; icon_state = "chapel"},/area/wizard_station)
"Hk" = (/obj/item/tape/engineering{tag = "icon-engineering_v"; icon_state = "engineering_v"},/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"})
"Hl" = (/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor,/area/tdome)
"Hm" = (/turf/unsimulated/wall{tag = "icon-iron1"; icon_state = "iron1"},/area/syndicate_mothership{name = "\improper Raider Base"})
@@ -1778,11 +1778,11 @@
"Ij" = (/obj/structure/toilet{pixel_y = 8},/turf/unsimulated/floor{icon_state = "engine"},/area/wizard_station)
"Ik" = (/turf/unsimulated/floor{icon_state = "engine"},/area/wizard_station)
"Il" = (/obj/structure/mirror{pixel_y = 28},/turf/unsimulated/floor{icon_state = "engine"},/area/wizard_station)
-"Im" = (/obj/structure/mineral_door/wood{tag = "icon-wood"; icon_state = "wood"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
+"Im" = (/obj/structure/simple_door/iron,/turf/unsimulated/floor{icon_state = "engine"},/area/wizard_station)
"In" = (/turf/unsimulated/floor{dir = 8; icon_state = "carpetside"},/area/wizard_station)
"Io" = (/obj/effect/landmark/start{name = "wizard"},/turf/unsimulated/floor{dir = 2; icon_state = "carpetsymbol"},/area/wizard_station)
"Ip" = (/turf/unsimulated/floor{dir = 4; icon_state = "carpetside"},/area/wizard_station)
-"Iq" = (/obj/structure/mineral_door/iron,/turf/unsimulated/floor{icon_state = "engine"},/area/wizard_station)
+"Iq" = (/obj/structure/simple_door/wood{tag = "icon-wood"; icon_state = "wood"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
"Ir" = (/obj/machinery/shower{icon_state = "shower"; dir = 8},/turf/unsimulated/floor{icon_state = "engine"},/area/wizard_station)
"Is" = (/obj/structure/bookcase{name = "bookcase (Tactics)"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
"It" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; freerange = 1; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/obj/structure/closet/coffin,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
@@ -1798,7 +1798,7 @@
"ID" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station)
"IE" = (/obj/structure/bookcase,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
"IF" = (/obj/machinery/vending/magivend,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
-"IG" = (/obj/structure/mineral_door/wood{tag = "icon-wood"; icon_state = "wood"},/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station)
+"IG" = (/obj/structure/simple_door/wood{tag = "icon-wood"; icon_state = "wood"},/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station)
"IH" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; freerange = 1; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station)
"II" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/drinkingglasses{pixel_x = 1; pixel_y = 4},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership{name = "\improper Raider Base"})
"IJ" = (/obj/structure/table/reinforced,/obj/item/weapon/tray{pixel_y = 5},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership{name = "\improper Raider Base"})
@@ -1906,7 +1906,7 @@
"KH" = (/obj/structure/flora/ausbushes/grassybush,/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/wizard_station)
"KI" = (/mob/living/simple_animal/hostile/retaliate/goat{name = "Experiment 97d"},/turf/unsimulated/floor{icon_state = "grass1"; name = "grass"},/area/wizard_station)
"KJ" = (/obj/item/weapon/caution,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station)
-"KK" = (/obj/item/weapon/kitchenknife/ritual,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station)
+"KK" = (/obj/structure/table/rack,/obj/item/weapon/material/knife/ritual,/turf/unsimulated/floor{dir = 4; icon_state = "chapel"},/area/wizard_station)
"KL" = (/obj/machinery/computer/station_alert,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership{name = "\improper Raider Base"})
"KM" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/item/weapon/tank/nitrogen,/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"})
"KN" = (/obj/item/clothing/head/philosopher_wig,/turf/unsimulated/floor{tag = "icon-asteroid"; icon_state = "asteroid"},/area/syndicate_mothership{name = "\improper Raider Base"})
@@ -1991,9 +1991,9 @@
"Mo" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/skipjack/station)
"Mp" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{frequency = 1331; id_tag = "vox_west_vent"},/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station)
"Mq" = (/obj/machinery/door/airlock/medical{name = "Operating Theatre"; req_access = list(45)},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/holding)
-"Mr" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/ionrifle,/obj/item/weapon/harpoon,/obj/item/clothing/suit/space/void/merc,/obj/item/clothing/head/helmet/space/void/merc,/obj/item/clothing/head/helmet/space/void/engineering,/obj/item/clothing/suit/space/void/engineering,/obj/item/weapon/tank/oxygen,/obj/item/weapon/tank/oxygen,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/weapon/rig/light/stealth,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station)
+"Mr" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/ionrifle,/obj/item/weapon/material/harpoon,/obj/item/clothing/suit/space/void/merc,/obj/item/clothing/head/helmet/space/void/merc,/obj/item/clothing/head/helmet/space/void/engineering,/obj/item/clothing/suit/space/void/engineering,/obj/item/weapon/tank/oxygen,/obj/item/weapon/tank/oxygen,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/weapon/rig/light/stealth,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station)
"Ms" = (/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station)
-"Mt" = (/obj/structure/table/standard,/obj/item/seeds/potatoseed,/obj/item/seeds/potatoseed,/obj/item/seeds/ambrosiavulgarisseed,/obj/item/weapon/minihoe,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station)
+"Mt" = (/obj/structure/table/standard,/obj/item/seeds/potatoseed,/obj/item/seeds/potatoseed,/obj/item/seeds/ambrosiavulgarisseed,/obj/item/weapon/material/minihoe,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station)
"Mu" = (/obj/structure/table/standard,/obj/machinery/microwave{pixel_x = -1; pixel_y = 8},/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station)
"Mv" = (/obj/machinery/vending/hydroseeds,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station)
"Mw" = (/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "vox_west_sensor"; pixel_x = 25},/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station)
@@ -2001,7 +2001,7 @@
"My" = (/obj/structure/table/rack,/obj/item/weapon/storage/belt/utility/full,/obj/item/weapon/storage/belt/utility/full,/obj/item/device/multitool,/obj/item/device/multitool,/obj/item/clothing/shoes/magboots,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station)
"Mz" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/sniperrifle,/obj/item/clothing/suit/space/void/mining,/obj/item/clothing/head/helmet/space/void/mining,/obj/item/clothing/head/helmet/space/void/atmos,/obj/item/clothing/suit/space/void/atmos,/obj/item/weapon/tank/oxygen,/obj/item/weapon/tank/oxygen,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station)
"MA" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/north/shuttlespace_ns12,/area/space)
-"MB" = (/obj/structure/table/standard,/obj/item/weapon/storage/fancy/cigarettes,/obj/structure/table/reinforced{icon_state = "table"},/obj/item/weapon/flame/lighter/zippo,/obj/item/clothing/gloves/yellow,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/weapon/card/emag,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station)
+"MB" = (/obj/structure/table/standard,/obj/item/weapon/storage/fancy/cigarettes,/obj/structure/table/reinforced{icon_state = "table"},/obj/item/weapon/flame/lighter/zippo,/obj/item/clothing/gloves/yellow,/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/weapon/card/emag,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station)
"MC" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = 28},/turf/unsimulated/floor{tag = "icon-whitecorner (NORTH)"; icon_state = "whitecorner"; dir = 1},/area/centcom/holding)
"MD" = (/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station)
"ME" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/obj/machinery/airlock_sensor{frequency = 1331; id_tag = "merc_shuttle_sensor"; pixel_x = 8; pixel_y = 25},/obj/machinery/light/small{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start)
@@ -2261,7 +2261,7 @@ aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMmumumumumuaMaMaMaMaMaMaMaMaMnvnHnInJninLnnnHnzaMndnenmnmnenenenenCnonononpihihihihihmumumumumumumumumumu
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMmumumumuaMaMaMaMaMaMaMaMaMnHnQnRnRnSnRnRnLnHaMndnqnrnsntneneneihnonononuihbOkQbTihmumumumumumumumumumu
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumuaMaMaMaMaMaMaMaMaMaMnHDgnRnRnRnRoaDqnHaMndnenAnAnenenepaihnKnonDnEihbLkQmkihmumumumumumumumumumu
-aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHofnRnRLqnRnRohnHaMndnenenenenenenMihihihihihihbPkQnGihmumumumumumumumumumu
+aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHpSnRnRLqnRnRohnHaMndnenenenenenenMihihihihihihbPkQnGihmumumumumumumumumumu
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMomnHonnHnHnHnHnHooaMnTnananUihkdkdkdihkTkTnVnWihcikQrcihmumumumumumumumumumu
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHoCoyNpounFnHaMaMaMaMaMaMobkdkdkdoclalaododihcikQrcihmumumumumumumumumumu
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHoBoAoanRornHaMaMaMaMaMaMoikdkdkdihojlaihihihokolokihihihihmumumumumumumu
@@ -2274,7 +2274,7 @@ aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUoVoVoVpdpepepepepApApepepepepgoVoVoVoVoNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMnHpynRnRnRpCnRnRnRpJnRnRnRoXnHmKmKmKmKaMaMaMaMmumumuihoEkQoEihmumumumumumumumumumu
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUoVoVpdpppqprpspeqbpupepvpwpepepepgoVoVoNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumumumumuaMaMaMaMnHqCnRnRnRqcnRnRnRqpnRnRnRqFnHaMaMaMaMaMaMaMaMaMmumuihoEkQoEihmumumumumumumumumumu
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUoVpdpepBpBpBpBpeqDqDpepBpBpDpEpepepgoVpFpFpFpFpFaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMnvnHnHnHnHnHnHnRnRnRnHnHnHnHnHnHnzaMaMaMaMaMmAaMmBmumuihoEkQoEihmumumumumumumumumumu
-aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUpdpepepMpNpOpPpepBpBpQpBpBpBpBpRpSpeoVpFpTpUpVpFpFpFpFpFpWpXpXpYpFpFaMaMaMaMaMaMaMaMpZpZpZpZpZpZpZpZpZpZpZaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMnHqZrasesrqEnHqanRqdnHsurfrfrgscnHaMaMaMaMaMmAmBmumumuihoEkQoEihmumumumumumumumumumu
+aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUpdpepepMpNpOpPpepBpBpQpBpBpBpBpRofpeoVpFpTpUpVpFpFpFpFpFpWpXpXpYpFpFaMaMaMaMaMaMaMaMpZpZpZpZpZpZpZpZpZpZpZaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMnHqZrasesrqEnHqanRqdnHsurfrfrgscnHaMaMaMaMaMmAmBmumumuihoEkQoEihmumumumumumumumumumu
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUqeqfqgpBqhqhqhpepBpBpeqiqjqkqlqmqnpeoVpFqopUpUqIqqqrqsqtquqsqvqwqxpFpFpFpFpFpFpFpFpFpFqyqzqzqzqzqzqzqzqAqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumumuaMaMaMaMaMnxrjrjrjrjrjnHnRnRnRnHrenRnRnRrknwaMaMaMaMaMmPaMmumumuihihyxihihmumumumumumumumumumu
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUqGqfpBpBpBpBpBpQpBpBpepepepepepepeqHrdpFpFpFpFpFqqqvqsqJOaqsqvqvqvqLqMqMqMqMqMqMqMqMqNqyqOqPqPqPqPqPqQqAqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumuaMaMaMaMaMaMnhrCrDrjrjrjrinRnRnRrqnRnRnRrGrHmiaMaMaMaMaMmAmBmBmumumuihihihmumumumumumumumumumumu
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUqRpeqSpBqSpBqSpepBpBpBqTqUoVoVoVoVoVqVqWqMqMqMqLqvqvqvqvqvqvqvqvqvqLqMqMqMqMqMqMqMqMqNqyqXqYqYqYqYqYqXqAqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnyrjrjrjrjrjrtnRnRnRrAnRnRnRnRrSnBaMaMaMaMaMmAaMaMmBmumumumumumumumumumumumumumumumu
@@ -2391,20 +2391,20 @@ aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYHYHYHYHYHYHYHYHYHYHYHYHYHZHYHYHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIaIbIcIdIeIfHYIgIhIiHYIjIkIlHYHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
-aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcIcIcIcIcIcImInIoIpIqIkIkIrHYHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
+aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcIcIcIcIcIcIqInIoIpImIkIkIrHYHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIsIsIcIcIcItHYIuIvIwHYHYHYHYHYHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcIcIcIcIcIxHYIyIyIzHYIAIBICIDHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIEIEIcIcIcIFHYIyIyIyIGIyIyIyIHHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcIcIcIcIcOUHYIMINIOHYIPIQIRIDHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVaMaMaMOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcIcIcIcIcItHYHYHYHYHYHYHYHYHYHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
-aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcJdJeJfJgIcJhJiJjJhJkGLJmJnHjHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVaMaMOVaMaMOVOVOVOVOVOVOVaMaMOVaMaMOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
+aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcJdJeJfJgIcJhJiJjJhJkHjJmJnKKHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVaMaMOVaMaMOVOVOVOVOVOVOVaMaMOVaMaMOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcJdJsJtJgIcJuJuJuJuJvJwJxJwJxHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVaMOVOVOVOVOVOVOVOVOVaMOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcJdJGOWJgIcJuJuJuJuJuJuJuJuJuHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVaMOVOVOVOVOVOVOVOVOVaMOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcJdJPJQJgIcJuJuJuJuJuJuJRJSJTHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVaMOVOVOVOVOVOVOVOVOVaMOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcIcIcIcIcIcJuJuJuJuJuJuJuJuJuHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYKeKfKfKgKfKfKfKgKfKfKfKgKfKfKhHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYKkKlKlJkKmKoKnJkKpKpKqJkKrOXKtHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
-aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYKlKEKkJvKGLvLuJvKHKIKpJvKJKtKKHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
+aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYKlKEKkJvKGLvLuJvKHKIKpJvKJKtGLHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVaMaMOVOVOVOVOVOVOVaMaMOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
diff --git a/maps/exodus-3.dmm b/maps/exodus-3.dmm
index caf3272970..f747f6627b 100644
--- a/maps/exodus-3.dmm
+++ b/maps/exodus-3.dmm
@@ -78,8 +78,8 @@
"bz" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/space)
"bA" = (/turf/simulated/shuttle/wall{icon_state = "swall13"; dir = 2},/area/space)
"bB" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/space)
-"bC" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
-"bD" = (/obj/item/weapon/shard,/obj/structure/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
+"bC" = (/obj/item/weapon/material/shard{icon_state = "medium"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
+"bD" = (/obj/item/weapon/material/shard,/obj/structure/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
"bE" = (/obj/structure/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
"bF" = (/obj/structure/cable,/obj/structure/computerframe{anchored = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
"bG" = (/obj/structure/cable,/obj/structure/computerframe{anchored = 1},/obj/item/stack/cable_coil/cut,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
@@ -380,7 +380,7 @@
"hp" = (/obj/structure/computerframe,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating/airless,/area/AIsattele)
"hq" = (/obj/machinery/teleport/station,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating/airless,/area/AIsattele)
"hr" = (/turf/simulated/floor/plating/airless,/area/AIsattele)
-"hs" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/plating/airless,/area/AIsattele)
+"hs" = (/obj/item/weapon/material/shard{icon_state = "medium"},/turf/simulated/floor/plating/airless,/area/AIsattele)
"ht" = (/obj/structure/cable,/turf/simulated/floor/plating/airless,/area/AIsattele)
"hu" = (/obj/structure/table/rack,/obj/item/clothing/gloves/yellow,/turf/simulated/floor/plating/airless,/area/AIsattele)
"hv" = (/obj/structure/girder,/turf/simulated/floor/plating/airless,/area/AIsattele)
diff --git a/maps/exodus-4.dmm b/maps/exodus-4.dmm
index 3819e505cb..9a4353df6b 100644
--- a/maps/exodus-4.dmm
+++ b/maps/exodus-4.dmm
@@ -27,9 +27,9 @@
"aA" = (/obj/machinery/shieldgen,/obj/structure/window/basic{tag = "icon-window (EAST)"; icon_state = "window"; dir = 4},/obj/structure/window/basic{tag = "icon-window (NORTH)"; icon_state = "window"; dir = 1},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/constructionsite/teleporter)
"aB" = (/obj/machinery/portable_atmospherics/canister/air,/obj/structure/window/basic{tag = "icon-window (WEST)"; icon_state = "window"; dir = 8},/obj/structure/window/basic{tag = "icon-window (NORTH)"; icon_state = "window"; dir = 1},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/constructionsite/teleporter)
"aC" = (/obj/machinery/portable_atmospherics/canister/air,/obj/structure/window/basic{tag = "icon-window (EAST)"; icon_state = "window"; dir = 4},/obj/structure/window/basic{tag = "icon-window (NORTH)"; icon_state = "window"; dir = 1},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/constructionsite/teleporter)
-"aD" = (/obj/structure/table/reinforced,/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/item/stack/sheet/metal{amount = 50; pixel_x = 0; pixel_y = 0},/obj/item/stack/sheet/metal{amount = 50; pixel_x = 0; pixel_y = 0},/obj/item/stack/sheet/metal{amount = 50; pixel_x = 0; pixel_y = 0},/obj/item/stack/sheet/metal{amount = 50; pixel_x = 0; pixel_y = 0},/obj/item/stack/sheet/metal{amount = 50; pixel_x = 0; pixel_y = 0},/obj/random/tech_supply,/turf/simulated/floor,/area/constructionsite/teleporter)
-"aE" = (/obj/structure/table/reinforced,/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/random/tech_supply,/obj/machinery/camera/motion/engineering_outpost,/turf/simulated/floor,/area/constructionsite/teleporter)
-"aF" = (/obj/structure/table/reinforced,/obj/item/stack/sheet/plasteel{amount = 50},/obj/random/tech_supply,/turf/simulated/floor,/area/constructionsite/teleporter)
+"aD" = (/obj/structure/table/reinforced,/obj/item/stack/material/plasteel{amount = 50},/obj/random/tech_supply,/turf/simulated/floor,/area/constructionsite/teleporter)
+"aE" = (/obj/structure/table/reinforced,/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/item/stack/material/steel{amount = 50; pixel_x = 0; pixel_y = 0},/obj/item/stack/material/steel{amount = 50; pixel_x = 0; pixel_y = 0},/obj/item/stack/material/steel{amount = 50; pixel_x = 0; pixel_y = 0},/obj/item/stack/material/steel{amount = 50; pixel_x = 0; pixel_y = 0},/obj/item/stack/material/steel{amount = 50; pixel_x = 0; pixel_y = 0},/obj/random/tech_supply,/turf/simulated/floor,/area/constructionsite/teleporter)
+"aF" = (/obj/structure/table/reinforced,/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/random/tech_supply,/obj/machinery/camera/motion/engineering_outpost,/turf/simulated/floor,/area/constructionsite/teleporter)
"aG" = (/obj/structure/table/reinforced,/obj/random/powercell,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor,/area/constructionsite/teleporter)
"aH" = (/obj/machinery/shieldgen,/obj/structure/window/basic{tag = "icon-window (WEST)"; icon_state = "window"; dir = 8},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/constructionsite/teleporter)
"aI" = (/obj/machinery/shieldgen,/obj/structure/window/basic{tag = "icon-window (EAST)"; icon_state = "window"; dir = 4},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/constructionsite/teleporter)
@@ -37,7 +37,7 @@
"aK" = (/obj/machinery/portable_atmospherics/canister/air,/obj/structure/window/basic{tag = "icon-window (EAST)"; icon_state = "window"; dir = 4},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/constructionsite/teleporter)
"aL" = (/turf/simulated/floor,/area/constructionsite/teleporter)
"aM" = (/obj/structure/table/reinforced,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/void/engineering,/obj/item/clothing/glasses/meson,/obj/item/clothing/head/helmet/space/void/engineering,/obj/item/weapon/tank/oxygen,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor,/area/constructionsite/teleporter)
-"aN" = (/obj/structure/table/reinforced,/obj/item/stack/sheet/mineral/phoron{amount = 10},/obj/random/powercell,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor,/area/constructionsite/teleporter)
+"aN" = (/obj/structure/table/reinforced,/obj/item/stack/material/phoron{amount = 10},/obj/random/powercell,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor,/area/constructionsite/teleporter)
"aO" = (/obj/machinery/access_button/airlock_exterior{master_tag = "constructionsite_airlock"; pixel_x = 20; pixel_y = 0; req_access = list(10)},/turf/simulated/floor/airless,/area/constructionsite/hallway/fore)
"aP" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'VACUUM'"; icon_state = "space"; layer = 4; name = "VACUUM"; pixel_x = -32; pixel_y = 0},/obj/machinery/access_button/airlock_interior{master_tag = "constructionsite_airlock"; pixel_x = -20; pixel_y = 0; req_access = list(10)},/turf/simulated/floor,/area/constructionsite/teleporter)
"aQ" = (/obj/structure/cable/blue{d2 = 2; icon_state = "0-2"},/obj/machinery/power/port_gen/pacman,/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/constructionsite/teleporter)
@@ -243,7 +243,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavababaaaaaaabanaoaoaoaoapapapapaqapapapapapapapapapapaoaoaoapapapapapapapapapapaqapapapapauauauauanabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaaaaabapapaoaoapapaeaeaeaeaeaeaeaeaeaeaeaeaeapaoaoaoapaeaeaeaeaeaeaeaeaeaeaeaeaeapapauauapapabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaabababanaoaoapaeaeawawawawawawawawawawaeaeapaoaoaoapaeaeaxaxaxaxaxaxaxaxaxaxaeaeapauaoanabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabavabababaaaaaaabanaoaoapaeawawayayayayayayayayawaeaeapaoaoaoapaeaeaxazaAaBaCaDaEaFaGaxaxaeapauaoanabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabavabababaaaaaaabanaoaoapaeawawayayayayayayayayawaeaeapaoaoaoapaeaeaxazaAaBaCaEaFaDaGaxaxaeapauaoanabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaaaabanaoaoapaeawayayayayayayayayayawaeaeapaoaoaoapaeaeaxaHaIaJaKaLaLaLaMaNaxaeapauaoanabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabavabababaaabababanaoaoapaeawayayayayayayayayayawawawapaoaoaOaxaxaxaxaPaLaLaLaLaLaLaLaQaxaeapaoaoanabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavababavaaaaaaabanaoaoapaeawayayayayayayayayayaRayayaSaoaoaoaTaUaVaWaLaLaLaLaLaLaLaLaXaxaeapaoaoanabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/maps/exodus-5.dmm b/maps/exodus-5.dmm
index 8aba1343d8..9ba2de46e1 100644
--- a/maps/exodus-5.dmm
+++ b/maps/exodus-5.dmm
@@ -39,7 +39,7 @@
"aM" = (/obj/structure/sign/botany{pixel_x = 32},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "warningcorner"; dir = 1},/area/outpost/research/chemistry)
"aN" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/analysis)
"aO" = (/obj/structure/reagent_dispensers/coolanttank,/turf/simulated/floor{dir = 4; icon_state = "whitegreen"},/area/outpost/research/analysis)
-"aP" = (/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plating/airless,/area/outpost/abandoned)
+"aP" = (/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/material/shard{icon_state = "small"},/turf/simulated/floor/plating/airless,/area/outpost/abandoned)
"aQ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/outpost/abandoned)
"aR" = (/obj/item/stack/rods,/obj/structure/door_assembly/door_assembly_ext{name = "Broken External Airlock"},/turf/simulated/floor,/area/outpost/abandoned)
"aS" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/outpost/abandoned)
@@ -79,7 +79,7 @@
"bA" = (/turf/simulated/floor{icon_state = "white"},/area/outpost/research/chemistry)
"bB" = (/obj/structure/table/standard,/obj/effect/landmark{name = "bluespacerift"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/outpost/research/kitchen)
"bC" = (/turf/simulated/floor/airless{icon_state = "damaged5"},/area/outpost/abandoned)
-"bD" = (/obj/item/weapon/shard{icon_state = "medium"},/obj/effect/alien/weeds{icon_state = "weeds"},/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/outpost/abandoned)
+"bD" = (/obj/item/weapon/material/shard{icon_state = "medium"},/obj/effect/alien/weeds{icon_state = "weeds"},/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/outpost/abandoned)
"bE" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/outpost/abandoned)
"bF" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/research{name = "Sample Preparation"; req_access = list(65)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway)
"bG" = (/obj/machinery/artifact_analyser,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor/bluegrid,/area/outpost/research/lab)
@@ -116,7 +116,7 @@
"cl" = (/obj/machinery/chem_master,/turf/simulated/floor{dir = 2; icon_state = "whiteblue"},/area/outpost/research/chemistry)
"cm" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "whitegreen"},/area/outpost/research/analysis)
"cn" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 6; icon_state = "whitegreen"},/area/outpost/research/analysis)
-"co" = (/obj/item/stack/rods,/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/shard,/turf/simulated/floor/plating/airless,/area/outpost/abandoned)
+"co" = (/obj/item/stack/rods,/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/material/shard,/turf/simulated/floor/plating/airless,/area/outpost/abandoned)
"cp" = (/turf/simulated/floor/airless{icon_state = "damaged2"},/area/outpost/abandoned)
"cq" = (/obj/item/stack/rods,/obj/effect/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/outpost/abandoned)
"cr" = (/turf/simulated/wall,/area/outpost/abandoned)
@@ -143,7 +143,7 @@
"cM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 1; icon_state = "whitepurple"},/area/outpost/research/lab)
"cN" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/glass/beaker/water,/obj/item/weapon/reagent_containers/glass/beaker/fuel,/obj/item/weapon/reagent_containers/glass/bottle/toxin,/obj/item/weapon/reagent_containers/glass/beaker/sulphuric{name = "beaker 'sulphuric acid'"},/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Sample Preparation"; dir = 1},/turf/simulated/floor{dir = 2; icon_state = "whiteblue"},/area/outpost/research/chemistry)
"cO" = (/obj/machinery/vending/snack,/turf/simulated/floor/wood,/area/outpost/research/kitchen)
-"cP" = (/obj/item/weapon/shard,/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/outpost/abandoned)
+"cP" = (/obj/item/weapon/material/shard,/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/outpost/abandoned)
"cQ" = (/obj/machinery/alarm{dir = 2; pixel_y = 25},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway)
"cR" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway)
"cS" = (/obj/structure/sign/science{desc = "A warning sign which reads 'MASS SPECTROMETRY'"; name = "\improper MASS SPECTROMETRY"; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "whitegreencorner"},/area/outpost/research/hallway)
@@ -261,11 +261,12 @@
"fa" = (/obj/effect/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/plating,/area/outpost/abandoned)
"fb" = (/obj/effect/alien/weeds,/turf/simulated/floor/plating,/area/outpost/abandoned)
"fc" = (/obj/item/stack/rods,/turf/simulated/floor/plating/airless,/area/outpost/abandoned)
-"fd" = (/obj/item/weapon/shard{icon_state = "small"},/obj/item/clothing/suit/space/syndicate,/turf/simulated/floor/plating/airless,/area/outpost/abandoned)
-"fe" = (/obj/item/weapon/shard,/obj/item/stack/rods,/turf/simulated/floor/plating/airless,/area/outpost/abandoned)
+"fd" = (/obj/structure/lattice,/obj/item/weapon/material/shard{icon_state = "medium"},/turf/space,/area/space)
+"fe" = (/obj/item/weapon/material/shard{icon_state = "small"},/obj/item/clothing/suit/space/syndicate,/turf/simulated/floor/plating/airless,/area/outpost/abandoned)
"ff" = (/turf/simulated/floor/airless{icon_state = "damaged3"},/area/outpost/abandoned)
"fg" = (/obj/machinery/newscaster{layer = 3.3; pixel_x = 0; pixel_y = -27},/turf/simulated/floor/wood,/area/outpost/research/hallway)
"fh" = (/obj/structure/bookcase/manuals/xenoarchaeology,/turf/simulated/floor/wood,/area/outpost/research/hallway)
+"fi" = (/obj/item/weapon/material/shard,/obj/item/stack/rods,/turf/simulated/floor/plating/airless,/area/outpost/abandoned)
"fj" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/reagent_dispensers/water_cooler,/turf/simulated/floor/wood,/area/outpost/research/hallway)
"fk" = (/obj/structure/extinguisher_cabinet{pixel_x = -25; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway)
"fl" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway)
@@ -280,7 +281,7 @@
"fu" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/washing_machine,/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/outpost/research/hallway)
"fv" = (/obj/machinery/vending/coffee,/turf/simulated/floor/wood,/area/outpost/research/hallway)
"fw" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway)
-"fx" = (/obj/structure/lattice,/obj/item/weapon/shard{icon_state = "medium"},/turf/space,/area/space)
+"fx" = (/obj/structure/lattice,/obj/item/weapon/material/shard{icon_state = "small"},/obj/item/clothing/mask/facehugger{icon_state = "facehugger_dead"; stat = 2},/turf/space,/area/outpost/abandoned)
"fy" = (/turf/simulated/floor/plating/airless,/turf/simulated/shuttle/wall{icon_state = "pwall"; dir = 6},/area/shuttle/alien/mine)
"fz" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/outpost/research/hallway)
"fA" = (/turf/simulated/floor/plating,/area/outpost/research/disposal)
@@ -327,10 +328,10 @@
"gp" = (/obj/effect/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/airless{icon_state = "damaged5"},/area/outpost/abandoned)
"gq" = (/obj/effect/alien/weeds,/turf/simulated/floor/airless{icon_state = "floorscorched2"},/area/outpost/abandoned)
"gr" = (/obj/machinery/door/airlock,/turf/simulated/floor,/area/outpost/abandoned)
-"gs" = (/obj/structure/lattice,/obj/item/weapon/shard{icon_state = "small"},/obj/item/clothing/mask/facehugger{icon_state = "facehugger_dead"; stat = 2},/turf/space,/area/outpost/abandoned)
+"gs" = (/obj/item/weapon/material/shard,/turf/simulated/floor/plating/airless,/area/outpost/abandoned)
"gt" = (/obj/structure/lattice,/turf/space,/area/outpost/abandoned)
"gu" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/outpost/abandoned)
-"gv" = (/obj/item/weapon/shard,/turf/simulated/floor/plating/airless,/area/outpost/abandoned)
+"gv" = (/obj/item/weapon/material/shard{icon_state = "small"},/turf/simulated/floor/plating/airless,/area/outpost/abandoned)
"gw" = (/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/outpost/research/eva)
"gx" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/research{name = "Anomalous Materials Sample Preparation"; req_access = list(65)},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/chemistry)
"gy" = (/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored)
@@ -362,7 +363,7 @@
"gY" = (/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/outpost/research/eva)
"gZ" = (/turf/simulated/floor{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/outpost/research/eva)
"ha" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/toxin,/turf/simulated/floor{icon_state = "white"},/area/outpost/research/medical)
-"hb" = (/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plating/airless,/area/outpost/abandoned)
+"hb" = (/obj/item/weapon/material/shard,/obj/structure/lattice,/turf/space,/area/space)
"hc" = (/obj/effect/alien/weeds{icon_state = "weeds1"},/obj/effect/decal/remains/xeno,/turf/simulated/floor/plating,/area/outpost/abandoned)
"hd" = (/obj/effect/gibspawner/human,/turf/simulated/floor/airless{icon_state = "damaged2"},/area/outpost/abandoned)
"he" = (/obj/effect/gibspawner/robot,/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/outpost/abandoned)
@@ -405,7 +406,7 @@
"hP" = (/obj/effect/decal/remains/human,/turf/simulated/floor/airless{icon_state = "damaged5"},/area/outpost/abandoned)
"hQ" = (/obj/effect/alien/weeds,/turf/simulated/floor/plating/airless,/area/outpost/abandoned)
"hR" = (/turf/simulated/floor/airless{icon_state = "damaged4"},/area/outpost/abandoned)
-"hS" = (/obj/item/weapon/shard,/obj/structure/lattice,/turf/space,/area/space)
+"hS" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/material/shard,/turf/simulated/floor/plating/airless,/area/outpost/abandoned)
"hT" = (/obj/effect/alien/weeds,/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/outpost/abandoned)
"hU" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/outpost/research/dock)
"hV" = (/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/disposal,/obj/structure/sign/deathsposal{pixel_x = 32},/turf/simulated/floor/wood,/area/outpost/research/kitchen)
@@ -466,7 +467,7 @@
"iY" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored)
"iZ" = (/obj/structure/bed,/obj/item/weapon/bedsheet/brown,/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/turf/simulated/floor/carpet,/area/outpost/research/hallway)
"ja" = (/obj/machinery/button/remote/airlock{id = "rdorm2"; name = "Door Bolt Control"; pixel_x = -25; pixel_y = 0; specialfunctions = 4},/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/carpet,/area/outpost/research/hallway)
-"jb" = (/obj/structure/table/rack,/obj/item/stack/sheet/metal{amount = 50; pixel_x = 5; pixel_y = 5},/obj/item/stack/sheet/glass{amount = 50},/obj/item/weapon/storage/belt/utility{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/toolbox/mechanical,/obj/item/weapon/storage/toolbox/emergency{pixel_x = 5; pixel_y = 5},/turf/simulated/floor/plating,/area/outpost/research/chemistry)
+"jb" = (/obj/structure/table/rack,/obj/item/stack/material/steel{amount = 50; pixel_x = 5; pixel_y = 5},/obj/item/stack/material/glass{amount = 50},/obj/item/weapon/storage/belt/utility{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/toolbox/mechanical,/obj/item/weapon/storage/toolbox/emergency{pixel_x = 5; pixel_y = 5},/turf/simulated/floor/plating,/area/outpost/research/chemistry)
"jc" = (/obj/structure/table/standard,/obj/item/weapon/anodevice{pixel_x = 3; pixel_y = 3},/obj/item/weapon/anodevice,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/anomaly_analysis)
"jd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/outpost/research/chemistry)
"je" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/outpost/research/kitchen)
@@ -480,7 +481,7 @@
"jm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/carpet,/area/outpost/research/hallway)
"jn" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock{id_tag = "rddorm1"; name = "Dorm 1"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "carpet"},/area/outpost/research/hallway)
"jo" = (/obj/structure/table/standard,/obj/item/device/analyzer/plant_analyzer,/obj/item/weapon/cell,/obj/item/stack/cable_coil/random,/obj/item/stack/cable_coil/random,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/outpost/research/chemistry)
-"jp" = (/obj/structure/closet/crate/hydroponics,/obj/item/weapon/shovel/spade,/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/weapon/minihoe,/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 13; pixel_y = 5},/obj/item/weedkiller/triclopyr,/obj/item/weapon/reagent_containers/glass/fertilizer/ez,/turf/simulated/floor/plating,/area/outpost/research/chemistry)
+"jp" = (/obj/structure/closet/crate/hydroponics,/obj/item/weapon/shovel/spade,/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/weapon/material/minihoe,/obj/item/weapon/reagent_containers/spray/plantbgone{pixel_x = 13; pixel_y = 5},/obj/item/weedkiller/triclopyr,/obj/item/weapon/reagent_containers/glass/fertilizer/ez,/turf/simulated/floor/plating,/area/outpost/research/chemistry)
"jq" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/explored)
"jr" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/maintenance{name = "Auxiliary Storage"; req_one_access = list(65,12)},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/chemistry)
"js" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/explored)
@@ -519,7 +520,7 @@
"jZ" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_north)
"ka" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/research{name = "Anomalous Materials Locker Room"; req_access = list(65)},/turf/simulated/floor{icon_state = "white"},/area/outpost/research/hallway)
"kb" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/plating,/area/outpost/mining_north)
-"kc" = (/obj/effect/decal/cleanable/cobweb,/obj/item/stack/sheet/metal{amount = 10},/obj/item/weapon/storage/toolbox/mechanical,/obj/item/clothing/glasses/meson,/obj/item/weapon/storage/box/lights/mixed,/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/plating,/area/outpost/mining_north)
+"kc" = (/obj/structure/table,/obj/structure/table/rack,/obj/item/stack/material/glass/reinforced{amount = 8},/obj/item/stack/rods{amount = 6},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_north)
"kd" = (/obj/structure/table/standard,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/carpet,/area/outpost/research/hallway)
"ke" = (/obj/machinery/recharge_station,/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_north)
"kf" = (/obj/structure/bed/chair,/obj/effect/decal/cleanable/dirt,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_north)
@@ -554,7 +555,7 @@
"kI" = (/obj/machinery/disposal/deliveryChute{dir = 1},/obj/structure/disposalpipe/trunk,/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/research/eva)
"kJ" = (/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/outpost/abandoned)
"kK" = (/obj/structure/table/rack,/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/outpost/abandoned)
-"kL" = (/obj/structure/table,/obj/structure/table/rack,/obj/item/stack/sheet/glass/reinforced{amount = 8},/obj/item/stack/rods{amount = 6},/turf/simulated/floor{icon_state = "floorgrime"},/area/outpost/mining_north)
+"kL" = (/obj/effect/decal/cleanable/cobweb,/obj/item/stack/material/steel{amount = 10},/obj/item/weapon/storage/toolbox/mechanical,/obj/item/clothing/glasses/meson,/obj/item/weapon/storage/box/lights/mixed,/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/plating,/area/outpost/mining_north)
"kM" = (/obj/effect/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/airless{icon_state = "damaged4"},/area/outpost/abandoned)
"kN" = (/obj/effect/alien/weeds{icon_state = "weeds"},/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/outpost/abandoned)
"kO" = (/obj/effect/decal/remains/human,/obj/item/clothing/mask/facehugger{icon_state = "facehugger_dead"; stat = 2},/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/outpost/abandoned)
@@ -631,7 +632,7 @@
"mh" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/floor,/area/outpost/research/isolation_monitoring)
"mi" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor/plating,/area/outpost/research/emergency_storage)
"mj" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/outpost/abandoned)
-"mk" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/shard,/turf/simulated/floor/plating/airless,/area/outpost/abandoned)
+"mk" = (/obj/item/weapon/material/shard{icon_state = "small"},/turf/simulated/floor/airless,/area/outpost/abandoned)
"ml" = (/obj/machinery/light/small{dir = 8},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "research_pump"; tag_exterior_door = "research_outer"; frequency = 1379; id_tag = "research_airlock"; tag_interior_door = "research_inner"; pixel_x = -25; pixel_y = 0; tag_chamber_sensor = "research_sensor"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "research_pump"},/turf/simulated/floor,/area/outpost/research/eva)
"mm" = (/obj/effect/alien/weeds,/turf/simulated/floor/airless{icon_state = "damaged4"},/area/outpost/abandoned)
"mn" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/outpost/abandoned)
@@ -719,9 +720,9 @@
"nR" = (/obj/machinery/disposal/deliveryChute{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/disposalpipe/trunk,/turf/simulated/floor/plating,/area/outpost/research/eva)
"nS" = (/obj/machinery/conveyor{dir = 2; id = "anotempload"},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/outpost/research/eva)
"nT" = (/obj/machinery/conveyor{dir = 5; id = "anosample"},/obj/machinery/light/small{dir = 1},/obj/structure/sign/securearea{desc = "A warning sign which reads 'MOVING PARTS'."; name = "\improper MOVING PARTS"; pixel_y = 32},/turf/simulated/floor/plating,/area/outpost/research/eva)
-"nU" = (/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/airless,/area/outpost/abandoned)
+"nU" = (/obj/item/weapon/material/shard,/turf/simulated/floor/airless{icon_state = "floorscorched2"},/area/outpost/abandoned)
"nV" = (/obj/structure/table/rack,/turf/simulated/floor/airless{icon_state = "damaged5"},/area/outpost/abandoned)
-"nW" = (/obj/item/weapon/shard,/turf/simulated/floor/airless{icon_state = "floorscorched2"},/area/outpost/abandoned)
+"nW" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/item/weapon/material/shard{icon_state = "medium"},/turf/simulated/floor/plating/airless,/area/outpost/abandoned)
"nX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/meter,/turf/simulated/floor/plating,/area/outpost/research/power)
"nY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/outpost/research/eva)
"nZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/outpost/research/eva)
@@ -754,16 +755,16 @@
"oA" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/blue{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/anomaly_storage)
"oB" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/anomaly_storage)
"oC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/closet/walllocker/emerglocker/west,/turf/simulated/floor/plating,/area/outpost/research/emergency_storage)
-"oD" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/plating/airless,/area/outpost/abandoned)
+"oD" = (/obj/item/weapon/material/shard{icon_state = "medium"},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 2},/area/outpost/abandoned)
"oE" = (/obj/structure/table/standard,/turf/simulated/floor,/area/outpost/research/isolation_monitoring)
"oF" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/outpost/abandoned)
"oG" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/outpost/abandoned)
"oH" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/outpost/abandoned)
-"oI" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 2},/area/outpost/abandoned)
+"oI" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille/broken,/obj/item/stack/rods,/obj/item/weapon/material/shard,/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/outpost/abandoned)
"oJ" = (/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 2},/area/outpost/abandoned)
"oK" = (/obj/structure/cable/blue{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/outpost/research/power)
-"oL" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille/broken,/obj/item/stack/rods,/obj/item/weapon/shard,/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/outpost/abandoned)
-"oM" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/grille/broken,/obj/item/weapon/shard{icon_state = "small"},/obj/item/stack/rods,/turf/simulated/floor/plating/airless,/area/outpost/abandoned)
+"oL" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/grille/broken,/obj/item/weapon/material/shard{icon_state = "small"},/obj/item/stack/rods,/turf/simulated/floor/plating/airless,/area/outpost/abandoned)
+"oM" = (/obj/machinery/light_construct/small,/obj/structure/table/rack,/obj/item/stack/material/steel{amount = 10},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored)
"oN" = (/obj/structure/table/standard,/obj/item/weapon/paper/crumpled,/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/outpost/abandoned)
"oO" = (/obj/machinery/artifact_scanpad,/obj/machinery/light,/turf/simulated/floor/bluegrid,/area/outpost/research/isolation_a)
"oP" = (/obj/machinery/artifact_analyser,/turf/simulated/floor/bluegrid,/area/outpost/research/isolation_a)
@@ -904,7 +905,7 @@
"ru" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 1},/area/mine/explored)
"rv" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/outpost/research/power)
"rw" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway)
-"rx" = (/obj/machinery/light_construct/small,/obj/structure/table/rack,/obj/item/stack/sheet/metal{amount = 10},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored)
+"rx" = (/obj/structure/table/standard,/obj/item/stack/material/plasteel{amount = 10},/obj/item/stack/material/wood{amount = 30},/obj/item/stack/material/plastic{amount = 10},/turf/simulated/floor,/area/outpost/engineering/storage)
"ry" = (/obj/structure/table/rack,/obj/item/weapon/pickaxe,/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored)
"rz" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway)
"rA" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway)
@@ -1060,7 +1061,7 @@
"uu" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway)
"uv" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eoutpost_main_outer"; locked = 1; name = "Engineering Outpost"},/turf/simulated/floor,/area/outpost/engineering/hallway)
"uw" = (/turf/simulated/floor,/area/outpost/engineering/storage)
-"ux" = (/obj/structure/table/standard,/obj/item/stack/sheet/plasteel{amount = 10},/obj/item/stack/sheet/wood{amount = 30},/obj/item/stack/sheet/mineral/plastic{amount = 10},/turf/simulated/floor,/area/outpost/engineering/storage)
+"ux" = (/obj/structure/table/standard,/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/turf/simulated/floor,/area/outpost/engineering/storage)
"uy" = (/turf/simulated/wall/r_wall,/area/outpost/engineering/storage)
"uz" = (/obj/structure/table/rack,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor,/area/outpost/engineering/storage)
"uA" = (/turf/simulated/floor/wood,/area/outpost/engineering/meeting)
@@ -1160,7 +1161,7 @@
"wq" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating/airless,/area/space)
"wr" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating/airless,/area/space)
"ws" = (/obj/machinery/power/tracker,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area/space)
-"wt" = (/obj/structure/table/standard,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/turf/simulated/floor,/area/outpost/engineering/storage)
+"wt" = (/obj/structure/table/standard,/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/turf/simulated/floor,/area/outpost/engineering/storage)
"wu" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/machinery/power/apc/super{dir = 1; pixel_y = 24},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored)
"wv" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/floor,/area/outpost/engineering/hallway)
"ww" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway)
@@ -1194,7 +1195,6 @@
"wY" = (/obj/structure/cable/blue{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor{icon_state = "white"},/area/outpost/mining_main/medbay)
"wZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor{icon_state = "white"},/area/outpost/mining_main/medbay)
"xa" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/effect/decal/cleanable/dirt,/obj/structure/sign/securearea{desc = "A warning sign which reads 'MOVING PARTS'."; name = "\improper MOVING PARTS"; pixel_y = -32},/turf/simulated/floor{dir = 8; icon_state = "loadingarea"},/area/outpost/mining_north)
-"xb" = (/obj/structure/table/standard,/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/turf/simulated/floor,/area/outpost/engineering/storage)
"xc" = (/obj/structure/cable/blue{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/outpost/mining_main/maintenance)
"xd" = (/obj/structure/cable/blue{d2 = 8; icon_state = "0-8"},/obj/structure/cable/blue{d2 = 4; icon_state = "0-4"},/obj/machinery/power/sensor{long_range = 1; name_tag = "Mining Outpost"},/turf/simulated/floor/plating,/area/outpost/mining_main/maintenance)
"xe" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "eoutpost_solar_airlock"; name = "exterior access button"; pixel_x = -25; pixel_y = -25; req_access = list(10)},/turf/simulated/floor/plating/airless,/area/outpost/engineering/hallway)
@@ -1679,38 +1679,38 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadQdRdSdTbDbCbEaeaeababababababababababababababababababababababababababababababababababababababababababababababababababalalalaeaeaeaeaeaeaeaebTaGaGaGaGaGaGbUaGaGaGaGbFaGaGbIbQbGbLbKbJaGbPbObNbMbSbYbRhVjeiYalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaetdldlfycPbVcrabababababababababababababababababababababababababababababababababababababababababababababababababababalalalaaaaaaexexexexexexexaicWcXcUjBcScTcQcRdcdbdejIaGcYdadEdidhdjaGdgdfbNbMbMbMbMbMazalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaecocqcpcrabababababababababababababababababababababababababababababababababababababababababababababababababababababalaaaaaaexexexexexexexcscwcxcyctctcucvctcycFcEcDcCcBcAczcMcMcLcKcJcIcHcGcOdDddazazalalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaefxemelekcrababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaexexexexexexexejcwdAdBdCeifFdFdGdYaGeadZaGebedecehdNjQaGdVdUaidWdWdWdWeeefegalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaefdemelekcrababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaexexexexexexexejcwdAdBdCeifFdFdGdYaGeadZaGebedecehdNjQaGdVdUaidWdWdWdWeeefegalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaedLdKdMcrdJdIcrcrcrcrabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaexexexexexexexdHcwdAdBdCdOdPdFdGdyaGdxdwaGkaaGaGaGaGcCaGkoduaidtdodpdmdndqdrdqdqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacaaacacacacacaaacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaegzfefEfHgVfGafbCeYcrfbfacrabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaexexexexexexexaifkflfjdCfhdGdFfgfvaGfzfwfsfrfuftfoaGeLeKfmeRaifnfAfBfCfDdqalalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacaaacacacacacaaacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefcfdfeffeUeTeWeVeYeXfaeZfbcrabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaeAereseyezeresevewepeqeneneneoeoeoeoeoeSeReQePeOeNeMaGfqfpeJeIaieHeFeGeDeEeCaGaGeBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacaaaaaaaaaaaaaaacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahSfchbfcfEfEdJheeUcrekhdcrfahccrabababababababababababababababababababababababababababababababababababababababababababababababdXaaaaaaaaaagMgPgQgNgOgTgQgRgSgWgXgUhahfeogYgZgweoloeRgBgAgDgCgEaGgGgFgIgHaiaigJaiaiaieReRgKeBeBeBeBgLeBeBeBeBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaegugvfEgsgtfEcpgqeTgrgpgocrcrcrcrcrcrababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaagngbgcgcgcgcgdgegfggghgigjgkeoglgmfVfUfTeIfXfWeReRfYfweReReJeIgafZfKfLfIlyeReRfMeBfOfPeBfNfRfSfQeBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaegzfifEfHgVfGafbCeYcrfbfacrabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaexexexexexexexaifkflfjdCfhdGdFfgfvaGfzfwfsfrfuftfoaGeLeKfmeRaifnfAfBfCfDdqalalalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacaaacacacacacaaacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefcfefiffeUeTeWeVeYeXfaeZfbcrabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaeAereseyezeresevewepeqeneneneoeoeoeoeoeSeReQePeOeNeMaGfqfpeJeIaieHeFeGeDeEeCaGaGeBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacaaaaaaaaaaaaaaacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahbfcgvfcfEfEdJheeUcrekhdcrfahccrabababababababababababababababababababababababababababababababababababababababababababababababdXaaaaaaaaaagMgPgQgNgOgTgQgRgSgWgXgUhahfeogYgZgweoloeRgBgAgDgCgEaGgGgFgIgHaiaigJaiaiaieReRgKeBeBeBeBgLeBeBeBeBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaegugsfEfxgtfEcpgqeTgrgpgocrcrcrcrcrcrababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaagngbgcgcgcgcgdgegfggghgigjgkeoglgmfVfUfTeIfXfWeReRfYfweReReJeIgafZfKfLfIlyeReRfMeBfOfPeBfNfRfSfQeBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeiCiBhRfEgtiDffiGeUiFcriIiHcriWhKbCiEcrabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaagngQgQgQhWgQlzhUgQibgXhZiahYeogmhXihigijiiidicifieillQimmrikieieieirisitiuinioipiqixiyiziAivmFjceBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeababcrfGhLhPhQhRhThNeTiWafbChKcriWhLhKhMcrababababababababababababababababababababababababababababababababababalalalalalalababababababkDkEaaaaaahrgQgQhihjhyiwgRhhhnhopdhqhkeohlhmhHeoeohGhGhFhuhEhxhuhJhuhIhwhwhwhwhxhuhvhththseBhChDeBhBhzhAiPeBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaecrcrcrcrcrcrgVeUnWhLeUgqnUiWiWeVeYiIcriWcpeknVcrababababababababababababababababababababababababababababababababalalalgygygygyalalalababsEgygyaaaaaaaanwereseynwnwnwnwnwpMnwnununueopJeonSnTnRhGoTsjhunMnKnLnInJnGoikmkmkmnFhunEnChtnBlulululupHnznyfQeBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaecrmPeUhRoNcriCoDiBcrgrcroGoHoFcrbClLiFmOcpeleUcrabababababababababababababababababababababababababababababababalalgygygygygygygygyalalabgygyaaaaaaaaaaaaaaaeaekBohogoflnoeodpLqOoanZnYqhoqorosrIrfrvhuopokollDkmnGoEojkmkmmghuoCozhtoBoAovoulueBeBeBeBeBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaecrcrcrcrcrcrgVeUnUhLeUgqmkiWiWeVeYiIcriWcpeknVcrababababababababababababababababababababababababababababababababalalalgygygygyalalalababsEgygyaaaaaaaanwereseynwnwnwnwnwpMnwnununueopJeonSnTnRhGoTsjhunMnKnLnInJnGoikmkmkmnFhunEnChtnBlulululupHnznyfQeBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaecrmPeUhRoNcriCnWiBcrgrcroGoHoFcrbClLiFmOcpeleUcrabababababababababababababababababababababababababababababababalalgygygygygygygygyalalabgygyaaaaaaaaaaaaaaaeaekBohogoflnoeodpLqOoanZnYqhoqorosrIrfrvhuopokollDkmnGoEojkmkmmghuoCozhtoBoAovoulueBeBeBeBeBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcrmPcphRcpmUlLhLmShLmTbCbCmNeYbCcpcpcreUmOeUeUcrababababababababababababababababababababababababababababababalalgygygygygygygygygygymQmRgygyaaaaaaaaaaaaaaaaaekBmLllmMlOmImHmJkBkBllmKeomCmDhGhGnPnXhumEmxmbmvmwmAocnAnHmBnfhumqmuhtmtmpmpmoluabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababcrlMhReUcpnscpnrdJcpnqmTnrhKntcpkNekcrlIcpgobCcrabababababababababababababababababababababababababababababalmRgygygygygygygygygygygynDnjgyaeaaaaaaaaaaaaaaaaaekBmLllnppGnmnlllnkkBnneoeonNnOhGoXotoKhupPmVmWmXnQonoomEobmGquhungnhhtnineneneluabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababcrlMlNeUfGcrkPcrlJlKcrcpcrlJlKcreUlLcrdIlHiFlIcrabababababababababababababababababababababababababababababalomgygygygygygygygygygygygygygyaeaaaaaaaaaaaaaaaaaekBlmllqWlnmzjPltmskBlpeoowoxoyhGnamYmZhulxlqlGlDlElBlCkmnbkmkmhulwlvhtlululululuabababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababcrcrcrcrcrcrkPcrgokNcphTmmeUhTeUgoffcrmnmknxmjcrabababababababababababababababababababababababababababababalmQgygygygygygygygygygygygygygyaeaaaaaaaaaaaaaaaeaekBqZlRlPlOnojPndmykBlSeooYoxoyhGnvhGnchulWmbmclZlFlYmalqlqmhmghumimfhtababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababcrcrcrcrcrcrkPcrgokNcphTmmeUhTeUgoffcrmnhSnxmjcrabababababababababababababababababababababababababababababalmQgygygygygygygygygygygygygygyaeaaaaaaaaaaaaaaaeaekBqZlRlPlOnojPndmykBlSeooYoxoyhGnvhGnchulWmbmclZlFlYmalqlqmhmghumimfhtababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababcrkPcrkNekkOhTkMcphKcreUekcrhOkJkJkKcradababababababababababababababababababababababababababababalalgygygyprgygygygygygygygygygyaeaaaaaaaaaaaaaeaeaekBkBkCkFkBkBkGlhkGkBkIeoowpBrVhGkpsekshukVkvkwkYkukzkAlckyknkmhuhththtababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababcrkPcrhTcpbVljeUekgocrkPcrcriWeUkJkKlkadababababababababababababababababababababababababababababallTpTgypUlTpQgygygygygygygygygytjaaaaaaaaaaaetjtjtjgygyqdqeqfkBmllglfkBlieogylrlAhGkSkTkTkUlUkWkXkUlVkZlalblXleldlbababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababcrkPcrcrcrcrcrcrcrcrcrkPcrpSbCeUbCkKpiadababababababababababababababababababababababababababababallTgygygylTpQgygygygygygygyqwqCpjsWsWsWsWsWsWpoqwqCgygygygygykBplpnsIkBpkgygygygyhGpApxpykUpwpupvkUptpqpslbpppEpDlbababmdabababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLaaaaaaaaaaqLababababababababababababababcrkPkPkPkPkPkPkPkPkPkPkPcriWeUiFeUiEcradababababababababababababababababababababababababababababalgygygygyqMqNgygygygygygygygyrWqPqPqPqPqPqPqPqPrWgygygygygygykBtlrUkGkBpFrigygygypmpXkTkTkUpWpOtykUpRuStZlbpNpKuWlbababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababcrcrcrcrcrcrcrcrcrcrcrcrcrcrmjrOoMcrcradababababababababababababababababababababababababababababalgygygygygygygygygygygygygyqwqCrdrerererererereqwqCgygygygygyuXpBrSpCvcpcpeoVoVoVxVoUsyoZkUpboOoPkUoWoRoSlboQphpalbabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababcrcrcrcrcrcrcrcrcrcrcrcrcrcrmjrOoLcrcradababababababababababababababababababababababababababababalgygygygygygygygygygygygygyqwqCrdrerererererereqwqCgygygygygyuXpBrSpCvcpcpeoVoVoVxVoUsyoZkUpboOoPkUoWoRoSlboQphpalbabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababadadadcrkJkJeUcradadababababababababababababababababababababababababababababallTpTgygygygygygygygygygyaaaaaaaaaaaaaaaaalalalalalalalalgygygygygygypBpgpCgygyalhGhGhGhGkUkUkUkUkUpfpfpflblblblblbabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababadadadcroJoIoJcradabababababababababababababababababababababababababababababallTgygygygygygygygygygygyaaaaaaaaaaaaaaaaalalalababababalalalalalalalgyjHgygyalalababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababadadcroLrOmjcradabababababababababababababababababababababababababababababalalpVryrxgygygygygyalalalaaaaaaaaaaaaaaaaaaababababababababalalalalalgyjHgygyalabababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababadadadcroJoDoJcradabababababababababababababababababababababababababababababallTgygygygygygygygygygygyaaaaaaaaaaaaaaaaalalalababababalalalalalalalgyjHgygyalalababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababadadcroIrOmjcradabababababababababababababababababababababababababababababalalpVryoMgygygygygyalalalaaaaaaaaaaaaaaaaaaababababababababalalalalalgyjHgygyalabababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLababqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababadadadrBrCrDadadababababababababababababababababababababababababababababababalalalmRalgygymQmQalababaaaaaaaaaaaaaaaaaaababababababababababalalalgyjHgygyalababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababalalalalalalababaaaaaaaaaaaaaaaaaaabababababababababababalalgyjHgygyalababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLababababababqLqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaababaaaaaaaaababababababababababalalgyjqkhgyalababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLababababababqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaabababaaaaaaababababababababababalalgygyjHgyalabababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaababaaaaaaababababababababababalalalgyjHgyalalalalalababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaabababababababababalalalgyjHgygygygyrHjFjFjFjFjFjFjFjFjFjFjFjFabababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaabababababababababalalalgyjHgygygygyrJvtkQjYjXkgkfkelsjFkckbjFababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaabababababababababalalalgyjHgygygygyrJvtkQjYjXkgkfkelsjFkLkbjFababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLababqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaabababababababababalalalgykHjSjSjSoVjVjOjNvHmekqjZkxktjWjRjTjFababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaabaaaaaaaaababababababababababalalgykigygygygyjFjFjFjFjFjFjKjJwOjFjMjLjFababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaabababaaaaababababababababababalalgyqqjsjujtjtjvjxjwjzjyxajAjUkLjEjDjGjFababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaabababaaaaababababababababababalalgyqqjsjujtjtjvjxjwjzjyxajAjUkcjEjDjGjFababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLabqLqLqLqLqLqLqLqLqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaabababaaaaaaabababababababababalalgygygykigygyjFjFjFjFkljFjFjFjFjFjFjFjFabababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaabababababababababalalalalgykigygygygysAkRsCsCalababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaabababababababababalalalrJkkrigygygygygygygyalababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -1754,9 +1754,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababqLqLqLqL
aaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLababababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababababqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaababababababababalalgygygykigygygygygyalalababababababababababababababababababababababababuyuyuyuyuyvewkveveveqjqjqjabalaaaeaaaeaeaaaaaeaaaaaaaaaaaaaaqgqcqbaaqgqcqbaaqgqcqbaaqaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLababababqLqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababalalalaeaeaeaeaeaeaeaeaeaeaealalalalabababababalalgygyqqjsjsqngygygyalalababababababalalalababababababababababababababuyvbuZEqvJEpuVEoxnvKuOuOqjalalxyaeaaaeaaaaaaaeaeaeaeaeaeaeaeqgqcqbaeqgqcqbaeqgqcqbaeqaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLababababqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababalalalalsHsHsHsHsHsHsHsHsHsHsHsHsHsHalalalalababababalgygygygygykigygygygyalalabababalalalgyalababababababababababababababuyuQuRxDuTuUuAuPuNuMuPxLypxMxMiYaeaaaaaaaaaaaeaaaaaeaaaaaaaaqgqcqbaaqgqcqbaaqgqcqbaaaeaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLabababqLqLqLqLqLabababababqLqLqLqLqLqLqLqLqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababalaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaealalabababababalalgygygygyqqjsjsqngygyalabalalalgygygyalababababababababababababababuyuzuwuxuFuGuAuBuKuJuIuHqjuLuLuLuLuLrMrLrLrNrtrMrNrtaaaaaaaaqgqcqbaaqgqcqbaaqgqcqbaaqaqaqaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLabababqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababqLqLqLqLqLabqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababalalalalgysMgygykigygyalalalgygygygygypzpzpzpzabababababababvMvMvMvMuywJuwxbwHwIEBuPwKwFuIwGvewBwDyqwywxwAwzshwawwwvECrMrLrNaaaaaewLaeaaaewLaeaaaewLaeaaaeaaqaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLabababqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLababababababababqLqLqLqLqLqLababqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaababababababababababalalmRgygykigygygygygygygygygygyAwwuwEpzabababababababvMvXvVvWuyvUuwwtvRvTuAuPwjwiuPwhvewgwfwewdwcwbtEshwavZvYxlxmzoxqxewlsNsNsNsNsNsNsNsNsNsNwrwqwsaeqaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLabababqLqLqLqLqLabababababqLqLqLqLqLqLqLqLqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababalaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaealalabababababalalgygygygyqqjsjsqngygyalabalalalgygygyalababababababababababababababuyuzuwrxuFuGuAuBuKuJuIuHqjuLuLuLuLuLrMrLrLrNrtrMrNrtaaaaaaaaqgqcqbaaqgqcqbaaqgqcqbaaqaqaqaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLabababqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababqLqLqLqLqLabqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababalalalalgysMgygykigygyalalalgygygygygypzpzpzpzabababababababvMvMvMvMuywJuwwtwHwIEBuPwKwFuIwGvewBwDyqwywxwAwzshwawwwvECrMrLrNaaaaaewLaeaaaewLaeaaaewLaeaaaeaaqaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLabababqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLababababababababqLqLqLqLqLqLababqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaababababababababababalalmRgygykigygygygygygygygygygyAwwuwEpzabababababababvMvXvVvWuyvUuwuxvRvTuAuPwjwiuPwhvewgwfwewdwcwbtEshwavZvYxlxmzoxqxewlsNsNsNsNsNsNsNsNsNsNwrwqwsaeqaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababababqLqLabqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaababababababababababababalalgyqqjsqngygygygygygygygyAwAevSpzababrtrtrtrtabvMvNvOztuyAfvIAyuTvQuAvLvCvBuAvDvevEvGvFvwvvvgvxvzvysvqGEvrMrLrNaaaaaevuaeaaaevuaeaaaevuaeaaaeaaqaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaababababababababaaaaaaaaaaaaaaabababababababababababababalgygygyqygygygygygygygygyAwAeACrtrtrtrtviAWrtrtrtrtwnrtrtrGrGrGrGvhrNrGwRrGvhrNrGvsvrrGwpEtvlvkvpvorGqHEsrtaaaaaaaaqgrgqbaaqgrgqbaaqgrgqbaaqaqaqaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLabababababqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaabababababababababababababalalalrJqzrigygygygygygygypBAzuDuvvPsxulwosJBawCwmsDsFsGtdtetctfsYtctctctrtqtctcxCtktntmtAzgtDtCtvtuBbsptEtFaaaeaaaaqgrgqbaaqgrgqbaaqgrgqbaaaeaaaaaaaaaaaaaaaaaaaaaaaaaa