diff --git a/baystation12.dme b/baystation12.dme
index 633f6c9a61..a608d74fee 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -34,6 +34,7 @@
#include "code\__HELPERS\unsorted.dm"
#include "code\__HELPERS\vector.dm"
#include "code\_defines\chemical_effects.dm"
+#include "code\_defines\research.dm"
#include "code\_onclick\adjacent.dm"
#include "code\_onclick\ai.dm"
#include "code\_onclick\click.dm"
@@ -42,6 +43,7 @@
#include "code\_onclick\item_attack.dm"
#include "code\_onclick\observer.dm"
#include "code\_onclick\other_mobs.dm"
+#include "code\_onclick\rig.dm"
#include "code\_onclick\telekinesis.dm"
#include "code\_onclick\hud\_defines.dm"
#include "code\_onclick\hud\alien_larva.dm"
@@ -175,6 +177,7 @@
#include "code\datums\diseases\advance\symptoms\weight.dm"
#include "code\datums\helper_datums\construction_datum.dm"
#include "code\datums\helper_datums\events.dm"
+#include "code\datums\helper_datums\getrev.dm"
#include "code\datums\helper_datums\global_iterator.dm"
#include "code\datums\helper_datums\teleport.dm"
#include "code\datums\helper_datums\topic_input.dm"
@@ -287,8 +290,15 @@
#include "code\game\gamemodes\events\holidays\Other.dm"
#include "code\game\gamemodes\extended\extended.dm"
#include "code\game\gamemodes\heist\heist.dm"
-#include "code\game\gamemodes\malfunction\Malf_Modules.dm"
+#include "code\game\gamemodes\malfunction\malf_hardware.dm"
+#include "code\game\gamemodes\malfunction\malf_research.dm"
+#include "code\game\gamemodes\malfunction\malf_research_ability.dm"
#include "code\game\gamemodes\malfunction\malfunction.dm"
+#include "code\game\gamemodes\malfunction\newmalf_ability_trees\HARDWARE.dm"
+#include "code\game\gamemodes\malfunction\newmalf_ability_trees\HELPERS.dm"
+#include "code\game\gamemodes\malfunction\newmalf_ability_trees\tree_interdiction.dm"
+#include "code\game\gamemodes\malfunction\newmalf_ability_trees\tree_manipulation.dm"
+#include "code\game\gamemodes\malfunction\newmalf_ability_trees\tree_networking.dm"
#include "code\game\gamemodes\meteor\meteor.dm"
#include "code\game\gamemodes\meteor\meteors.dm"
#include "code\game\gamemodes\ninja\ninja.dm"
@@ -598,9 +608,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"
@@ -618,6 +625,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"
@@ -628,7 +636,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"
@@ -636,7 +643,8 @@
#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\traps.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"
@@ -674,6 +682,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"
@@ -713,7 +730,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"
@@ -721,6 +737,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"
@@ -883,6 +900,7 @@
#include "code\modules\clothing\masks\miscellaneous.dm"
#include "code\modules\clothing\masks\voice.dm"
#include "code\modules\clothing\shoes\colour.dm"
+#include "code\modules\clothing\shoes\jobs.dm"
#include "code\modules\clothing\shoes\magboots.dm"
#include "code\modules\clothing\shoes\miscellaneous.dm"
#include "code\modules\clothing\spacesuits\alien.dm"
@@ -1001,6 +1019,7 @@
#include "code\modules\food\recipes_microwave.dm"
#include "code\modules\games\cards.dm"
#include "code\modules\genetics\side_effects.dm"
+#include "code\modules\ghosttrap\trap.dm"
#include "code\modules\holodeck\HolodeckControl.dm"
#include "code\modules\holodeck\HolodeckObjects.dm"
#include "code\modules\holodeck\HolodeckPrograms.dm"
@@ -1041,6 +1060,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"
@@ -1059,6 +1081,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"
@@ -1220,7 +1243,6 @@
#include "code\modules\mob\living\silicon\ai\life.dm"
#include "code\modules\mob\living\silicon\ai\login.dm"
#include "code\modules\mob\living\silicon\ai\logout.dm"
-#include "code\modules\mob\living\silicon\ai\say.dm"
#include "code\modules\mob\living\silicon\decoy\death.dm"
#include "code\modules\mob\living\silicon\decoy\decoy.dm"
#include "code\modules\mob\living\silicon\decoy\life.dm"
@@ -1312,6 +1334,7 @@
#include "code\modules\nano\interaction\contained.dm"
#include "code\modules\nano\interaction\default.dm"
#include "code\modules\nano\interaction\inventory.dm"
+#include "code\modules\nano\interaction\inventory_deep.dm"
#include "code\modules\nano\interaction\physical.dm"
#include "code\modules\nano\interaction\self.dm"
#include "code\modules\nano\interaction\zlevel.dm"
@@ -1324,8 +1347,8 @@
#include "code\modules\nano\modules\power_monitor.dm"
#include "code\modules\nano\modules\rcon.dm"
#include "code\modules\organs\blood.dm"
+#include "code\modules\organs\misc.dm"
#include "code\modules\organs\organ.dm"
-#include "code\modules\organs\organ_alien.dm"
#include "code\modules\organs\organ_external.dm"
#include "code\modules\organs\organ_icon.dm"
#include "code\modules\organs\organ_internal.dm"
@@ -1333,6 +1356,11 @@
#include "code\modules\organs\pain.dm"
#include "code\modules\organs\robolimbs.dm"
#include "code\modules\organs\wound.dm"
+#include "code\modules\organs\subtypes\diona.dm"
+#include "code\modules\organs\subtypes\machine.dm"
+#include "code\modules\organs\subtypes\standard.dm"
+#include "code\modules\organs\subtypes\unbreakable.dm"
+#include "code\modules\organs\subtypes\xenos.dm"
#include "code\modules\overmap\_defines.dm"
#include "code\modules\overmap\sectors.dm"
#include "code\modules\overmap\ships\ship.dm"
@@ -1635,16 +1663,14 @@
#include "code\modules\spells\targeted\projectile\projectile.dm"
#include "code\modules\supermatter\supermatter.dm"
#include "code\modules\surgery\bones.dm"
-#include "code\modules\surgery\brainrepair.dm"
#include "code\modules\surgery\encased.dm"
-#include "code\modules\surgery\eye.dm"
#include "code\modules\surgery\face.dm"
#include "code\modules\surgery\generic.dm"
-#include "code\modules\surgery\headreattach.dm"
#include "code\modules\surgery\implant.dm"
+#include "code\modules\surgery\limb_reattach.dm"
#include "code\modules\surgery\organs_internal.dm"
#include "code\modules\surgery\other.dm"
-#include "code\modules\surgery\robolimbs.dm"
+#include "code\modules\surgery\robotics.dm"
#include "code\modules\surgery\slimes.dm"
#include "code\modules\surgery\surgery.dm"
#include "code\modules\tables\flipping.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/ZAS/Turf.dm b/code/ZAS/Turf.dm
index 331c00dd37..2dfcfcdf81 100644
--- a/code/ZAS/Turf.dm
+++ b/code/ZAS/Turf.dm
@@ -45,6 +45,45 @@
air_master.connect(sim, src)
+/*
+ Simple heuristic for determining if removing the turf from it's zone may possibly partition the zone (A very bad thing).
+ Instead of analyzing the entire zone, we only check the nearest 3x3 turfs surrounding the src turf.
+ This implementation may produce false positives but it (hopefully) will not produce any false negatives.
+*/
+
+/turf/simulated/proc/can_safely_remove_from_zone()
+ #ifdef ZLEVELS
+ return 1 //not sure how to generalize this to multiz at the moment.
+ #else
+
+ if(!zone) return 0
+
+ var/check_dirs = get_zone_neighbours(src)
+ var/unconnected_dirs = check_dirs
+
+ for(var/dir in list(NORTHWEST, NORTHEAST, SOUTHEAST, SOUTHWEST))
+
+ //for each pair of "adjacent" cardinals (e.g. NORTH and WEST, but not NORTH and SOUTH)
+ if((dir & check_dirs) == dir)
+ //check that they are connected by the corner turf
+ var/connected_dirs = get_zone_neighbours(get_step(src, dir))
+ if(connected_dirs && (dir & turn(connected_dirs, 180)) == dir)
+ unconnected_dirs &= ~dir //they are, so unflag the cardinals in question
+
+ //it is safe to remove src from the zone if all cardinals are connected by corner turfs
+ return !unconnected_dirs
+
+ #endif
+
+//helper for can_safely_remove_from_zone()
+/turf/simulated/proc/get_zone_neighbours(turf/simulated/T)
+ . = 0
+ if(istype(T) && T.zone)
+ for(var/dir in cardinal)
+ var/turf/simulated/other = get_step(T, dir)
+ if(istype(other) && other.zone == T.zone && !(other.c_airblock(T) & AIR_BLOCKED) && get_dist(src, other) <= 1)
+ . |= dir
+
/turf/simulated/update_air_properties()
if(zone && zone.invalid)
@@ -60,7 +99,7 @@
if(zone)
var/zone/z = zone
- if(s_block & ZONE_BLOCKED) //Hacky, but prevents normal airlocks from rebuilding zones all the time
+ if(can_safely_remove_from_zone()) //Helps normal airlocks avoid rebuilding zones all the time
z.remove(src)
else
z.rebuild()
diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm
index 60e46d4ca6..9aa16f91b5 100644
--- a/code/__HELPERS/game.dm
+++ b/code/__HELPERS/game.dm
@@ -156,37 +156,35 @@
// It will keep doing this until it checks every content possible. This will fix any problems with mobs, that are inside objects,
// being unable to hear people due to being in a box within a bag.
-/proc/recursive_mob_check(var/atom/O, var/list/L = list(), var/recursion_limit = 3, var/client_check = 1, var/sight_check = 1, var/include_radio = 1)
+/proc/recursive_content_check(var/atom/O, var/list/L = list(), var/recursion_limit = 3, var/client_check = 1, var/sight_check = 1, var/include_mobs = 1, var/include_objects = 1)
- //debug_mob += O.contents.len
if(!recursion_limit)
return L
- for(var/atom/A in O.contents)
- if(ismob(A))
- var/mob/M = A
- if(client_check && !M.client)
- L |= recursive_mob_check(A, L, recursion_limit - 1, client_check, sight_check, include_radio)
- continue
- if(sight_check && !isInSight(A, O))
- continue
- L |= M
- //world.log << "[recursion_limit] = [M] - [get_turf(M)] - ([M.x], [M.y], [M.z])"
+ for(var/I in O.contents)
- else if(include_radio && istype(A, /obj/item/device/radio))
- if(sight_check && !isInSight(A, O))
- continue
- L |= A
+ if(ismob(I))
+ if(!sight_check || isInSight(I, O))
+ L |= recursive_content_check(I, L, recursion_limit - 1, client_check, sight_check, include_mobs, include_objects)
+ if(include_mobs)
+ if(client_check)
+ var/mob/M = I
+ if(M.client)
+ L |= M
+ else
+ L |= I
+
+ else if(istype(I,/obj/))
+ if(!sight_check || isInSight(I, O))
+ L |= recursive_content_check(I, L, recursion_limit - 1, client_check, sight_check, include_mobs, include_objects)
+ if(include_objects)
+ L |= I
- if(isobj(A) || ismob(A))
- L |= recursive_mob_check(A, L, recursion_limit - 1, client_check, sight_check, include_radio)
return L
-// The old system would loop through lists for a total of 5000 per function call, in an empty server.
-// This new system will loop at around 1000 in an empty server.
+// Returns a list of mobs and/or objects in range of R from source. Used in radio and say code.
-/proc/get_mobs_in_view(var/R, var/atom/source)
- // Returns a list of mobs in range of R from source. Used in radio and say code.
+/proc/get_mobs_or_objects_in_view(var/R, var/atom/source, var/include_mobs = 1, var/include_objects = 1)
var/turf/T = get_turf(source)
var/list/hear = list()
@@ -196,17 +194,17 @@
var/list/range = hear(R, T)
- for(var/atom/A in range)
- if(ismob(A))
- var/mob/M = A
- if(M.client)
- hear += M
- //world.log << "Start = [M] - [get_turf(M)] - ([M.x], [M.y], [M.z])"
- else if(istype(A, /obj/item/device/radio))
- hear += A
-
- if(isobj(A) || ismob(A))
- hear |= recursive_mob_check(A, hear, 3, 1, 0, 1)
+ for(var/I in range)
+ if(ismob(I))
+ hear |= recursive_content_check(I, hear, 3, 1, 0, include_mobs, include_objects)
+ if(include_mobs)
+ var/mob/M = I
+ if(M.client)
+ hear += M
+ else if(istype(I,/obj/))
+ hear |= recursive_content_check(I, hear, 3, 1, 0, include_mobs, include_objects)
+ if(include_objects)
+ hear += I
return hear
diff --git a/code/__HELPERS/logging.dm b/code/__HELPERS/logging.dm
index 69d01e3d35..50f55703d3 100644
--- a/code/__HELPERS/logging.dm
+++ b/code/__HELPERS/logging.dm
@@ -81,3 +81,15 @@
/proc/log_misc(text)
diary << "\[[time_stamp()]]MISC: [text][log_end]"
+
+//pretty print a direction bitflag, can be useful for debugging.
+/proc/print_dir(var/dir)
+ var/list/comps = list()
+ if(dir & NORTH) comps += "NORTH"
+ if(dir & SOUTH) comps += "SOUTH"
+ if(dir & EAST) comps += "EAST"
+ if(dir & WEST) comps += "WEST"
+ if(dir & UP) comps += "UP"
+ if(dir & DOWN) comps += "DOWN"
+
+ return english_list(comps, nothing_text="0", and_text="|", comma_text="|")
diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm
index 478700d5f8..216a45ee1c 100644
--- a/code/__HELPERS/type2type.dm
+++ b/code/__HELPERS/type2type.dm
@@ -70,19 +70,19 @@
/proc/list2text(list/ls, sep)
if (ls.len <= 1) // Early-out code for empty or singleton lists.
return ls.len ? ls[1] : ""
-
+
var/l = ls.len // Made local for sanic speed.
var/i = 0 // Incremented every time a list index is accessed.
-
+
if (sep <> null)
// Macros expand to long argument lists like so: sep, ls[++i], sep, ls[++i], sep, ls[++i], etc...
#define S1 sep, ls[++i]
#define S4 S1, S1, S1, S1
#define S16 S4, S4, S4, S4
#define S64 S16, S16, S16, S16
-
+
. = "[ls[++i]]" // Make sure the initial element is converted to text.
-
+
// Having the small concatenations come before the large ones boosted speed by an average of at least 5%.
if (l-1 & 0x01) // 'i' will always be 1 here.
. = text("[][][]", ., S1) // Append 1 element if the remaining elements are not a multiple of 2.
@@ -111,7 +111,7 @@
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S64, S64)
-
+
#undef S64
#undef S16
#undef S4
@@ -122,9 +122,9 @@
#define S4 S1, S1, S1, S1
#define S16 S4, S4, S4, S4
#define S64 S16, S16, S16, S16
-
+
. = "[ls[++i]]" // Make sure the initial element is converted to text.
-
+
if (l-1 & 0x01) // 'i' will always be 1 here.
. += S1 // Append 1 element if the remaining elements are not a multiple of 2.
if (l-i & 0x02)
@@ -145,7 +145,7 @@
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\
[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S64, S64)
-
+
#undef S64
#undef S16
#undef S4
@@ -165,11 +165,11 @@ proc/tg_list2text(list/list, glue=",")
var/delim_len = length(delimiter)
if (delim_len < 1)
return list(text)
-
+
. = list()
var/last_found = 1
var/found
-
+
do
found = findtext(text, delimiter, last_found, 0)
. += copytext(text, last_found, found)
@@ -181,11 +181,11 @@ proc/tg_list2text(list/list, glue=",")
var/delim_len = length(delimiter)
if (delim_len < 1)
return list(text)
-
+
. = list()
var/last_found = 1
var/found
-
+
do
found = findtextEx(text, delimiter, last_found, 0)
. += copytext(text, last_found, found)
@@ -325,3 +325,47 @@ proc/tg_list2text(list/list, glue=",")
. = 0
else
. = max(0, min(255, 138.5177312231 * log(temp - 10) - 305.0447927307))
+
+// Very ugly, BYOND doesn't support unix time and rounding errors make it really hard to convert it to BYOND time.
+// returns "YYYY-MM-DD" by default
+/proc/unix2date(timestamp, seperator = "-")
+ if(timestamp < 0)
+ return 0 //Do not accept negative values
+
+ var/const/dayInSeconds = 86400 //60secs*60mins*24hours
+ var/const/daysInYear = 365 //Non Leap Year
+ var/const/daysInLYear = daysInYear + 1//Leap year
+ var/days = round(timestamp / dayInSeconds) //Days passed since UNIX Epoc
+ var/year = 1970 //Unix Epoc begins 1970-01-01
+ var/tmpDays = days + 1 //If passed (timestamp < dayInSeconds), it will return 0, so add 1
+ var/monthsInDays = list() //Months will be in here ***Taken from the PHP source code***
+ var/month = 1 //This will be the returned MONTH NUMBER.
+ var/day //This will be the returned day number.
+
+ while(tmpDays > daysInYear) //Start adding years to 1970
+ year++
+ if(isLeap(year))
+ tmpDays -= daysInLYear
+ else
+ tmpDays -= daysInYear
+
+ if(isLeap(year)) //The year is a leap year
+ monthsInDays = list(-1,30,59,90,120,151,181,212,243,273,304,334)
+ else
+ monthsInDays = list(0,31,59,90,120,151,181,212,243,273,304,334)
+
+ var/mDays = 0;
+ var/monthIndex = 0;
+
+ for(var/m in monthsInDays)
+ monthIndex++
+ if(tmpDays > m)
+ mDays = m
+ month = monthIndex
+
+ day = tmpDays - mDays //Setup the date
+
+ return "[year][seperator][((month < 10) ? "0[month]" : month)][seperator][((day < 10) ? "0[day]" : day)]"
+
+/proc/isLeap(y)
+ return ((y) % 4 == 0 && ((y) % 100 != 0 || (y) % 400 == 0))
diff --git a/code/_defines/research.dm b/code/_defines/research.dm
new file mode 100644
index 0000000000..87e6bb5f42
--- /dev/null
+++ b/code/_defines/research.dm
@@ -0,0 +1,18 @@
+#define SHEET_MATERIAL_AMOUNT 2000
+
+#define TECH_MATERIAL "materials"
+#define TECH_ENGINERING "engineering"
+#define TECH_PHORON "phorontech"
+#define TECH_POWER "powerstorage"
+#define TECH_BLUESPACE "bluespace"
+#define TECH_BIO "biotech"
+#define TECH_COMBAT "combat"
+#define TECH_MAGNET "magnets"
+#define TECH_DATA "programming"
+#define TECH_ILLEGAL "syndicate"
+#define TECH_ARCANE "arcane"
+
+#define IMPRINTER 1 //For circuits. Uses glass/chemicals.
+#define PROTOLATHE 2 //New stuff. Uses glass/metal/chemicals
+#define MECHFAB 4 //Remember, objects utilising this flag should have construction_time and construction_cost vars.
+#define CHASSIS 8 //For protolathe, but differently
\ No newline at end of file
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index b8caa45399..7307927ac0 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -229,17 +229,6 @@
/mob/living/carbon/MiddleClickOn(var/atom/A)
swap_hand()
-/mob/living/carbon/human/MiddleClickOn(var/atom/A)
-
- if(back)
- var/obj/item/weapon/rig/rig = back
- if(istype(rig) && rig.selected_module)
- if(world.time <= next_move) return
- next_move = world.time + 8
- rig.selected_module.engage(A)
- return
-
- swap_hand()
// In case of use break glass
/*
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/_onclick/oldcode.dm b/code/_onclick/oldcode.dm
index 890d67923a..e3f417d59a 100644
--- a/code/_onclick/oldcode.dm
+++ b/code/_onclick/oldcode.dm
@@ -122,7 +122,7 @@
if ((!( src in usr.contents ) && (((!( isturf(src) ) && (!( isturf(src.loc) ) && (src.loc && !( isturf(src.loc.loc) )))) || !( isturf(usr.loc) )) && (src.loc != usr.loc && (!( istype(src, /obj/screen) ) && !( usr.contents.Find(src.loc) ))))))
if (istype(usr, /mob/living/silicon/ai))
var/mob/living/silicon/ai/ai = usr
- if (ai.control_disabled || ai.malfhacking)
+ if (ai.control_disabled)
return
else
return
diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm
index 477fb04b7a..179a470fc6 100644
--- a/code/_onclick/other_mobs.dm
+++ b/code/_onclick/other_mobs.dm
@@ -97,8 +97,6 @@
if (powerlevel > 0 && !istype(A, /mob/living/carbon/slime))
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(H.species.flags & IS_SYNTHETIC)
- return
stunprob *= H.species.siemens_coefficient
diff --git a/code/_onclick/rig.dm b/code/_onclick/rig.dm
new file mode 100644
index 0000000000..ad9346ec15
--- /dev/null
+++ b/code/_onclick/rig.dm
@@ -0,0 +1,63 @@
+
+#define MIDDLE_CLICK 0
+#define ALT_CLICK 1
+#define CTRL_CLICK 2
+#define MAX_HARDSUIT_CLICK_MODE 2
+
+/client
+ var/hardsuit_click_mode = MIDDLE_CLICK
+
+/client/verb/toggle_hardsuit_mode()
+ set name = "Toggle Hardsuit Activation Mode"
+ set desc = "Switch between hardsuit activation modes."
+ set category = "OOC"
+
+ hardsuit_click_mode++
+ if(hardsuit_click_mode > MAX_HARDSUIT_CLICK_MODE)
+ hardsuit_click_mode = 0
+
+ switch(hardsuit_click_mode)
+ if(MIDDLE_CLICK)
+ src << "Hardsuit activation mode set to middle-click."
+ if(ALT_CLICK)
+ src << "Hardsuit activation mode set to alt-click."
+ if(CTRL_CLICK)
+ src << "Hardsuit activation mode set to control-click."
+ else
+ // should never get here, but just in case:
+ soft_assert(0, "Bad hardsuit click mode: [hardsuit_click_mode] - expected 0 to [MAX_HARDSUIT_CLICK_MODE]")
+ src << "Somehow you bugged the system. Setting your hardsuit mode to middle-click."
+ hardsuit_click_mode = MIDDLE_CLICK
+
+/mob/living/carbon/human/MiddleClickOn(atom/A)
+ if(client && client.hardsuit_click_mode == MIDDLE_CLICK)
+ if(HardsuitClickOn(A))
+ return
+ ..()
+
+/mob/living/carbon/human/AltClickOn(atom/A)
+ if(client && client.hardsuit_click_mode == ALT_CLICK)
+ if(HardsuitClickOn(A))
+ return
+ ..()
+
+/mob/living/carbon/human/CtrlClickOn(atom/A)
+ if(client && client.hardsuit_click_mode == CTRL_CLICK)
+ if(HardsuitClickOn(A))
+ return
+ ..()
+
+/mob/living/carbon/human/proc/HardsuitClickOn(atom/A)
+ if(back)
+ var/obj/item/weapon/rig/rig = back
+ if(istype(rig) && rig.selected_module)
+ if(world.time <= next_move) return 1
+ next_move = world.time + 8
+ rig.selected_module.engage(A)
+ return 1
+ return 0
+
+#undef MIDDLE_CLICK
+#undef ALT_CLICK
+#undef CTRL_CLICK
+#undef MAX_HARDSUIT_CLICK_MODE
diff --git a/code/controllers/Processes/inactivity.dm b/code/controllers/Processes/inactivity.dm
index d9f9206749..cd01e24829 100644
--- a/code/controllers/Processes/inactivity.dm
+++ b/code/controllers/Processes/inactivity.dm
@@ -1,16 +1,13 @@
/datum/controller/process/inactivity/setup()
name = "inactivity"
- schedule_interval = INACTIVITY_KICK
+ schedule_interval = 600 // Once every minute (approx.)
/datum/controller/process/inactivity/doWork()
if(config.kick_inactive)
for(var/client/C in clients)
- if(C.is_afk(INACTIVITY_KICK))
+ if(!C.holder && C.is_afk(config.kick_inactive MINUTES))
if(!istype(C.mob, /mob/dead))
log_access("AFK: [key_name(C)]")
- C << "You have been inactive for more than 10 minutes and have been disconnected."
+ C << "You have been inactive for more than [config.kick_inactive] minute\s and have been disconnected."
del(C) // Don't qdel, cannot override finalize_qdel behaviour for clients.
-
scheck()
-
-#undef INACTIVITY_KICK
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index 98d56d3d23..af4d8ef296 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -63,7 +63,7 @@ var/list/gamemode_cache = list()
var/guest_jobban = 1
var/usewhitelist = 0
var/mods_are_mentors = 0
- var/kick_inactive = 0 //force disconnect for inactive players
+ var/kick_inactive = 0 //force disconnect for inactive players after this many minutes, if non-0
var/load_jobs_from_txt = 0
var/ToRban = 0
var/automute_on = 0 //enables automuting/spam prevention
@@ -95,6 +95,7 @@ var/list/gamemode_cache = list()
var/banappeals
var/wikiurl
var/forumurl
+ var/githuburl
//Alert level description
var/alert_desc_green = "All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced."
@@ -114,7 +115,7 @@ var/list/gamemode_cache = list()
var/organ_health_multiplier = 1
var/organ_regeneration_multiplier = 1
-
+
//Paincrit knocks someone down once they hit 60 shock_stage, so by default make it so that close to 100 additional damage needs to be dealt,
//so that it's similar to HALLOSS. Lowered it a bit since hitting paincrit takes much longer to wear off than a halloss stun.
var/organ_damage_spillover_multiplier = 0.5
@@ -172,6 +173,7 @@ var/list/gamemode_cache = list()
var/list/admin_levels= list(2) // Defines which Z-levels which are for admin functionality, for example including such areas as Central Command and the Syndicate Shuttle
var/list/contact_levels = list(1, 5) // Defines which Z-levels which, for example, a Code Red announcement may affect
var/list/player_levels = list(1, 3, 4, 5, 6) // Defines all Z-levels a character can typically reach
+ var/list/sealed_levels = list() // Defines levels that do not allow random transit at the edges.
// Event settings
var/expected_round_length = 3 * 60 * 60 * 10 // 3 hours
@@ -395,6 +397,9 @@ var/list/gamemode_cache = list()
if ("forumurl")
config.forumurl = value
+ if ("githuburl")
+ config.githuburl = value
+
if ("guest_jobban")
config.guest_jobban = 1
@@ -460,7 +465,7 @@ var/list/gamemode_cache = list()
config.allow_random_events = 1
if("kick_inactive")
- config.kick_inactive = 1
+ config.kick_inactive = text2num(value)
if("load_jobs_from_txt")
load_jobs_from_txt = 1
diff --git a/code/controllers/voting.dm b/code/controllers/voting.dm
index 68bfdab74b..f4b88f8850 100644
--- a/code/controllers/voting.dm
+++ b/code/controllers/voting.dm
@@ -336,7 +336,7 @@ datum/controller/vote
. += "\t([config.allow_vote_mode?"Allowed":"Disallowed"])"
. += "
"
//extra antagonists
- if(trialmin || (!antag_add_failed && config.allow_extra_antags))
+ if(!antag_add_failed && config.allow_extra_antags)
. += "Add Antagonist Type"
else
. += "Restart (Disallowed)"
@@ -375,7 +375,7 @@ datum/controller/vote
if(config.allow_vote_restart || usr.client.holder)
initiate_vote("crew_transfer",usr.key)
if("add_antagonist")
- if(config.allow_extra_antags || usr.client.holder)
+ if(config.allow_extra_antags)
initiate_vote("add_antagonist",usr.key)
if("custom")
if(usr.client.holder)
diff --git a/code/datums/disease.dm b/code/datums/disease.dm
index 398dc73bbb..606acdef99 100644
--- a/code/datums/disease.dm
+++ b/code/datums/disease.dm
@@ -53,14 +53,15 @@ var/list/diseases = typesof(/datum/disease) - /datum/disease
// if hidden[2] is true, then virus is hidden from PANDEMIC machine
/datum/disease/proc/stage_act()
+
+ // Some species are immune to viruses entirely.
+ if(affected_mob && istype(affected_mob, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = affected_mob
+ if(H.species.virus_immune)
+ cure()
+ return
age++
var/cure_present = has_cure()
- //world << "[cure_present]"
-
- if(carrier&&!cure_present)
- //world << "[affected_mob] is carrier"
- return
-
spread = (cure_present?"Remissive":initial_spread)
if(stage > max_stages)
stage = max_stages
@@ -126,7 +127,7 @@ var/list/diseases = typesof(/datum/disease) - /datum/disease
source = affected_mob
else //no source and no mob affected. Rogue disease. Break
return
-
+
if(affected_mob.reagents != null)
if(affected_mob)
if(affected_mob.reagents.has_reagent("spaceacillin"))
diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm
new file mode 100644
index 0000000000..da4192df25
--- /dev/null
+++ b/code/datums/helper_datums/getrev.dm
@@ -0,0 +1,39 @@
+var/global/datum/getrev/revdata = new()
+
+/datum/getrev
+ var/revision
+ var/date
+ var/showinfo
+
+/datum/getrev/New()
+ var/list/head_log = file2list(".git/logs/HEAD", "\n")
+ for(var/line=head_log.len, line>=1, line--)
+ if(head_log[line])
+ var/list/last_entry = text2list(head_log[line], " ")
+ if(last_entry.len < 2) continue
+ revision = last_entry[2]
+ // Get date/time
+ if(last_entry.len >= 5)
+ var/unix_time = text2num(last_entry[5])
+ if(unix_time)
+ date = unix2date(unix_time)
+ break
+ world.log << "Running revision:"
+ world.log << date
+ world.log << revision
+ return
+
+client/verb/showrevinfo()
+ set category = "OOC"
+ set name = "Show Server Revision"
+ set desc = "Check the current server code revision"
+
+ if(revdata.revision)
+ src << "Server revision: [revdata.date]"
+ if(config.githuburl)
+ src << "[revdata.revision]"
+ else
+ src << revdata.revision
+ else
+ src << "Revision unknown"
+ return
diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index 1a7a9b8ae0..ae6a8d0846 100644
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -33,7 +33,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/obj/item/weapon/grenade/smokebomb,
/obj/item/weapon/grenade/smokebomb,
/obj/item/weapon/grenade/smokebomb,
- /obj/item/weapon/pen/paralysis,
+ /obj/item/weapon/pen/reagent/paralysis,
/obj/item/weapon/grenade/chem_grenade/incendiary)
cost = 20
containertype = /obj/structure/closet/crate
@@ -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,
@@ -348,7 +348,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/obj/item/weapon/grenade/chem_grenade/antiweed,
/obj/item/weapon/grenade/chem_grenade/antiweed)
cost = 25
- containertype = /obj/structure/closet/crate/secure/hydrosec
+ containertype = /obj/structure/closet/crate/hydroponics
containername = "Weed control crate"
access = access_hydroponics
group = "Hydroponics"
@@ -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/datums/wires/wires.dm b/code/datums/wires/wires.dm
index 0555a140bd..8932175126 100644
--- a/code/datums/wires/wires.dm
+++ b/code/datums/wires/wires.dm
@@ -292,6 +292,11 @@ var/const/POWER = 8
return 1
return 0
+/datum/wires/proc/MendAll()
+ for(var/i = 1; i < MAX_FLAG && i < (1 << wire_count); i += i)
+ if(IsIndexCut(i))
+ CutWireIndex(i)
+
//
//Shuffle and Mend
//
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index 4d564bbf83..0b4f91fb9c 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)
@@ -172,96 +172,9 @@
flags = CONDUCT
throwforce = 0
w_class = 3.0
- origin_tech = "materials=1"
+ origin_tech = list(TECH_MATERIAL = 1)
var/breakouttime = 300 //Deciseconds = 30s = 0.5 minute
-/obj/item/weapon/beartrap
- name = "bear trap"
- throw_speed = 2
- throw_range = 1
- gender = PLURAL
- icon = 'icons/obj/items.dmi'
- icon_state = "beartrap0"
- desc = "A trap used to catch bears and other legged creatures."
- throwforce = 0
- w_class = 3.0
- origin_tech = "materials=1"
- var/deployed = 0
-
- suicide_act(mob/user)
- viewers(user) << "[user] is putting the [src.name] on \his head! It looks like \he's trying to commit suicide."
- return (BRUTELOSS)
-
-/obj/item/weapon/beartrap/attack_self(mob/user as mob)
- ..()
- if(ishuman(user) && !user.stat && !user.restrained())
- if(deployed==0)
- user.visible_message("[user] is deploying \the [src]", "You are deploying \the [src]!")
- if (do_after(user, 60))
- user.visible_message("[user] has deployed \the [src]", "You have deployed \the [src]!")
- deployed = 1
- user.drop_from_inventory(src, user.loc)
- update_icon()
- anchored = 1
-
-/obj/item/weapon/beartrap/attack_hand(mob/user as mob)
- if(ishuman(user) && !user.stat && !user.restrained())
- if(deployed==1)
- user.visible_message("[user] is disarming \the [src]", "You are disarming \the [src]!")
- if (do_after(user, 60))
- user.visible_message("[user] has disarmed \the [src]", "You have disarmed \the [src]!")
- deployed = 0
- anchored = 0
- update_icon()
-
- if(deployed==0)
- ..()
-
-/obj/item/weapon/beartrap/Crossed(AM as mob|obj)
- if(deployed)
- if(ishuman(AM))
- if(isturf(src.loc))
- var/mob/living/carbon/human/H = AM
- if(H.m_intent == "run")
- deployed = 0
- update_icon()
- H << "You step on \the [src]!"
- for(var/mob/O in viewers(H, null))
- if(O == H)
- continue
- O.show_message("[H] steps on \the [src].", 1)
- if(H.lying)
- var/obj/item/organ/external/affecting = pick(H.organs)
- if(affecting.take_damage(30, 0))
- H.UpdateDamageIcon()
- affecting.embed(src)
- else
- var/list/potentialorgans = list()
- for(var/organ in list("l_leg", "r_leg", "l_foot", "r_foot"))
- var/obj/item/organ/external/R = H.get_organ(organ)
- if(R && !(R.status & ORGAN_DESTROYED))
- potentialorgans += R
- var/obj/item/organ/external/affecting = pick(potentialorgans)
- if(affecting.take_damage(30, 0))
- H.UpdateDamageIcon()
- affecting.embed(src)
-
-
- if(isanimal(AM) && !istype(AM, /mob/living/simple_animal/parrot) && !istype(AM, /mob/living/simple_animal/construct) && !istype(AM, /mob/living/simple_animal/shade) && !istype(AM, /mob/living/simple_animal/hostile/viscerator))
- deployed = 0
- var/mob/living/simple_animal/SA = AM
- SA.health -= 20
- ..()
-
-/obj/item/weapon/beartrap/update_icon()
- ..()
-
- if(deployed == 0)
- icon_state = "beartrap0"
- else
- icon_state = "beartrap1"
-
-
/obj/item/weapon/caution
desc = "Caution! Wet Floor!"
name = "wet floor sign"
@@ -296,7 +209,7 @@
throw_speed = 4
throw_range = 20
matter = list("metal" = 100
- origin_tech = "magnets=2;syndicate=3"*/
+ origin_tech = list(TECH_MAGNET = 2, TECH_ILLEGAL = 3)*/
/obj/item/weapon/SWF_uplink
name = "station-bounced radio"
@@ -314,9 +227,9 @@
throwforce = 5
w_class = 2.0
throw_speed = 4
- throw_range = 20
+ throw_range = 20
matter = list(DEFAULT_WALL_MATERIAL = 100)
- origin_tech = "magnets=1"
+ origin_tech = list(TECH_MAGNET = 1)
/obj/item/weapon/staff
name = "wizards staff"
@@ -458,7 +371,8 @@
w_class = 1
throwforce = 2
var/cigarcount = 6
- flags = ONBELT */
+ flags = ONBELT
+ */
/obj/item/weapon/pai_cable
desc = "A flexible coated cable with a universal jack on one end."
@@ -503,50 +417,50 @@
name = "console screen"
desc = "Used in the construction of computers and other devices with a interactive console."
icon_state = "screen"
- origin_tech = "materials=1"
+ origin_tech = list(TECH_MATERIAL = 1)
matter = list("glass" = 200)
/obj/item/weapon/stock_parts/capacitor
name = "capacitor"
desc = "A basic capacitor used in the construction of a variety of devices."
icon_state = "capacitor"
- origin_tech = "powerstorage=1"
- matter = list(DEFAULT_WALL_MATERIAL = 50,"glass" = 50)
+ origin_tech = list(TECH_POWER = 1)
+ matter = list(DEFAULT_WALL_MATERIAL = 50,"glass" = 50)
/obj/item/weapon/stock_parts/scanning_module
name = "scanning module"
desc = "A compact, high resolution scanning module used in the construction of certain devices."
icon_state = "scan_module"
- origin_tech = "magnets=1"
- matter = list(DEFAULT_WALL_MATERIAL = 50,"glass" = 20)
+ origin_tech = list(TECH_MAGNET = 1)
+ matter = list(DEFAULT_WALL_MATERIAL = 50,"glass" = 20)
/obj/item/weapon/stock_parts/manipulator
name = "micro-manipulator"
desc = "A tiny little manipulator used in the construction of certain devices."
icon_state = "micro_mani"
- origin_tech = "materials=1;programming=1"
- matter = list(DEFAULT_WALL_MATERIAL = 30)
+ origin_tech = list(TECH_MATERIAL = 1, TECH_DATA = 1)
+ matter = list(DEFAULT_WALL_MATERIAL = 30)
/obj/item/weapon/stock_parts/micro_laser
name = "micro-laser"
desc = "A tiny laser used in certain devices."
icon_state = "micro_laser"
- origin_tech = "magnets=1"
- matter = list(DEFAULT_WALL_MATERIAL = 10,"glass" = 20)
+ origin_tech = list(TECH_MAGNET = 1)
+ matter = list(DEFAULT_WALL_MATERIAL = 10,"glass" = 20)
/obj/item/weapon/stock_parts/matter_bin
name = "matter bin"
desc = "A container for hold compressed matter awaiting re-construction."
icon_state = "matter_bin"
- origin_tech = "materials=1"
- matter = list(DEFAULT_WALL_MATERIAL = 80)
+ origin_tech = list(TECH_MATERIAL = 1)
+ matter = list(DEFAULT_WALL_MATERIAL = 80)
//Rank 2
/obj/item/weapon/stock_parts/capacitor/adv
name = "advanced capacitor"
desc = "An advanced capacitor used in the construction of a variety of devices."
- origin_tech = "powerstorage=3"
+ origin_tech = list(TECH_POWER = 3)
rating = 2
matter = list(DEFAULT_WALL_MATERIAL = 50,"glass" = 50)
@@ -554,7 +468,7 @@
name = "advanced scanning module"
desc = "A compact, high resolution scanning module used in the construction of certain devices."
icon_state = "scan_module"
- origin_tech = "magnets=3"
+ origin_tech = list(TECH_MAGNET = 3)
rating = 2
matter = list(DEFAULT_WALL_MATERIAL = 50,"glass" = 20)
@@ -562,7 +476,7 @@
name = "nano-manipulator"
desc = "A tiny little manipulator used in the construction of certain devices."
icon_state = "nano_mani"
- origin_tech = "materials=3,programming=2"
+ origin_tech = list(TECH_MATERIAL = 3, TECH_DATA = 2)
rating = 2
matter = list(DEFAULT_WALL_MATERIAL = 30)
@@ -570,7 +484,7 @@
name = "high-power micro-laser"
desc = "A tiny laser used in certain devices."
icon_state = "high_micro_laser"
- origin_tech = "magnets=3"
+ origin_tech = list(TECH_MAGNET = 3)
rating = 2
matter = list(DEFAULT_WALL_MATERIAL = 10,"glass" = 20)
@@ -578,7 +492,7 @@
name = "advanced matter bin"
desc = "A container for hold compressed matter awaiting re-construction."
icon_state = "advanced_matter_bin"
- origin_tech = "materials=3"
+ origin_tech = list(TECH_MATERIAL = 3)
rating = 2
matter = list(DEFAULT_WALL_MATERIAL = 80)
@@ -587,14 +501,14 @@
/obj/item/weapon/stock_parts/capacitor/super
name = "super capacitor"
desc = "A super-high capacity capacitor used in the construction of a variety of devices."
- origin_tech = "powerstorage=5;materials=4"
+ origin_tech = list(TECH_POWER = 5, TECH_MATERIAL = 4)
rating = 3
matter = list(DEFAULT_WALL_MATERIAL = 50,"glass" = 50)
/obj/item/weapon/stock_parts/scanning_module/phasic
name = "phasic scanning module"
desc = "A compact, high resolution phasic scanning module used in the construction of certain devices."
- origin_tech = "magnets=5"
+ origin_tech = list(TECH_MAGNET = 5)
rating = 3
matter = list(DEFAULT_WALL_MATERIAL = 50,"glass" = 20)
@@ -602,7 +516,7 @@
name = "pico-manipulator"
desc = "A tiny little manipulator used in the construction of certain devices."
icon_state = "pico_mani"
- origin_tech = "materials=5,programming=2"
+ origin_tech = list(TECH_MATERIAL = 5, TECH_DATA = 2)
rating = 3
matter = list(DEFAULT_WALL_MATERIAL = 30)
@@ -610,7 +524,7 @@
name = "ultra-high-power micro-laser"
icon_state = "ultra_high_micro_laser"
desc = "A tiny laser used in certain devices."
- origin_tech = "magnets=5"
+ origin_tech = list(TECH_MAGNET = 5)
rating = 3
matter = list(DEFAULT_WALL_MATERIAL = 10,"glass" = 20)
@@ -618,7 +532,7 @@
name = "super matter bin"
desc = "A container for hold compressed matter awaiting re-construction."
icon_state = "super_matter_bin"
- origin_tech = "materials=5"
+ origin_tech = list(TECH_MATERIAL = 5)
rating = 3
matter = list(DEFAULT_WALL_MATERIAL = 80)
@@ -628,50 +542,50 @@
name = "subspace ansible"
icon_state = "subspace_ansible"
desc = "A compact module capable of sensing extradimensional activity."
- origin_tech = "programming=3;magnets=5;materials=4;bluespace=2"
- matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 10)
+ origin_tech = list(TECH_DATA = 3, TECH_MAGNET = 5 ,TECH_MATERIAL = 4, TECH_BLUESPACE = 2)
+ matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 10)
/obj/item/weapon/stock_parts/subspace/filter
name = "hyperwave filter"
icon_state = "hyperwave_filter"
desc = "A tiny device capable of filtering and converting super-intense radiowaves."
- origin_tech = "programming=4;magnets=2"
- matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 10)
+ origin_tech = list(TECH_DATA = 4, TECH_MAGNET = 2)
+ matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 10)
/obj/item/weapon/stock_parts/subspace/amplifier
name = "subspace amplifier"
icon_state = "subspace_amplifier"
desc = "A compact micro-machine capable of amplifying weak subspace transmissions."
- origin_tech = "programming=3;magnets=4;materials=4;bluespace=2"
- matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 10)
+ origin_tech = list(TECH_DATA = 3, TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2)
+ matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 10)
/obj/item/weapon/stock_parts/subspace/treatment
name = "subspace treatment disk"
icon_state = "treatment_disk"
desc = "A compact micro-machine capable of stretching out hyper-compressed radio waves."
- origin_tech = "programming=3;magnets=2;materials=5;bluespace=2"
- matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 10)
+ origin_tech = list(TECH_DATA = 3, TECH_MAGNET = 2, TECH_MATERIAL = 5, TECH_BLUESPACE = 2)
+ matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 10)
/obj/item/weapon/stock_parts/subspace/analyzer
name = "subspace wavelength analyzer"
icon_state = "wavelength_analyzer"
desc = "A sophisticated analyzer capable of analyzing cryptic subspace wavelengths."
- origin_tech = "programming=3;magnets=4;materials=4;bluespace=2"
- matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 10)
+ origin_tech = list(TECH_DATA = 3, TECH_MAGNETS = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2)
+ matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 10)
/obj/item/weapon/stock_parts/subspace/crystal
name = "ansible crystal"
icon_state = "ansible_crystal"
desc = "A crystal made from pure glass used to transmit laser databursts to subspace."
- origin_tech = "magnets=4;materials=4;bluespace=2"
+ origin_tech = list(TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2)
matter = list("glass" = 50)
/obj/item/weapon/stock_parts/subspace/transmitter
name = "subspace transmitter"
icon_state = "subspace_transmitter"
desc = "A large piece of equipment used to open a window into the subspace dimension."
- origin_tech = "magnets=5;materials=5;bluespace=3"
- matter = list(DEFAULT_WALL_MATERIAL = 50)
+ origin_tech = list(TECH_MAGNET = 5, TECH_MATERIAL = 5, TECH_BLUESPACE = 3)
+ matter = list(DEFAULT_WALL_MATERIAL = 50)
/obj/item/weapon/ectoplasm
name = "ectoplasm"
@@ -685,4 +599,4 @@
desc = "Instant research tool. For testing purposes only."
icon = 'icons/obj/stock_parts.dmi'
icon_state = "smes_coil"
- origin_tech = "materials=19;programming=19;magnets=19;powerstorage=19;bluespace=19;combat=19;biotech=19;syndicate=19;phorontech=19;engineering=19"
+ origin_tech = list(TECH_MATERIAL = 19, TECH_ENGINERING = 19, TECH_PHORON = 19, TECH_POWER = 19, TECH_BLUESPACE = 19, TECH_BIO = 19, TECH_COMBAT = 19, TECH_MAGNET = 19, TECH_DATA = 19, TECH_ILLEGAL = 19, TECH_ARCANE = 19)
diff --git a/code/defines/procs/admin.dm b/code/defines/procs/admin.dm
index 6c5f27fa07..bf16c5267d 100644
--- a/code/defines/procs/admin.dm
+++ b/code/defines/procs/admin.dm
@@ -34,3 +34,14 @@ proc/admin_attacker_log_many_victims(var/mob/attacker, var/list/mob/victims, var
for(var/mob/victim in victims)
admin_attack_log(attacker, victim, attacker_message, victim_message, admin_message)
+
+proc/admin_inject_log(mob/attacker, mob/victim, obj/item/weapon, reagents, amount_transferred, violent=0)
+ if(violent)
+ violent = "violently "
+ else
+ violent = ""
+ admin_attack_log(attacker,
+ victim,
+ "used \the [weapon] to [violent]inject - [reagents] - [amount_transferred]u transferred",
+ "was [violent]injected with \the [weapon] - [reagents] - [amount_transferred]u transferred",
+ "used \the [weapon] to [violent]inject [reagents] ([amount_transferred]u transferred) into")
diff --git a/code/game/antagonist/alien/borer.dm b/code/game/antagonist/alien/borer.dm
index 9fe4226e5b..bd436ceaf8 100644
--- a/code/game/antagonist/alien/borer.dm
+++ b/code/game/antagonist/alien/borer.dm
@@ -33,7 +33,10 @@ var/datum/antagonist/xenos/borer/borers
/datum/antagonist/xenos/borer/proc/get_hosts()
var/list/possible_hosts = list()
for(var/mob/living/carbon/human/H in mob_list)
- if(H.stat != 2 && !(H.species.flags & IS_SYNTHETIC) && !H.has_brain_worms())
+ var/obj/item/organ/external/head/head = H.get_organ("head")
+ if(head.status & ORGAN_ROBOT)
+ continue
+ if(H.stat != DEAD && !H.has_brain_worms())
possible_hosts |= H
return possible_hosts
diff --git a/code/game/antagonist/station/cultist.dm b/code/game/antagonist/station/cultist.dm
index 3f5d65d21d..adaa2b24f5 100644
--- a/code/game/antagonist/station/cultist.dm
+++ b/code/game/antagonist/station/cultist.dm
@@ -69,6 +69,9 @@ var/datum/antagonist/cultist/cult
player.equip_to_slot(T, slot)
if(T.loc == player)
break
+ var/obj/item/weapon/storage/S = locate() in player.contents
+ if(S && istype(S))
+ T.loc = S
/datum/antagonist/cultist/greet(var/datum/mind/player)
if(!..())
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/antagonist/station/rogue_ai.dm b/code/game/antagonist/station/rogue_ai.dm
index 3d9026ff88..2a4fe862de 100644
--- a/code/game/antagonist/station/rogue_ai.dm
+++ b/code/game/antagonist/station/rogue_ai.dm
@@ -9,217 +9,68 @@ var/datum/antagonist/rogue_ai/malf
welcome_text = "You are malfunctioning! You do not have to follow any laws."
victory_text = "The AI has taken control of all of the station's systems."
loss_text = "The AI has been shut down!"
- flags = ANTAG_OVERRIDE_MOB | ANTAG_VOTABLE
+ flags = ANTAG_VOTABLE | ANTAG_RANDSPAWN //Randspawn needed otherwise it won't start at all.
max_antags = 1
max_antags_round = 3
- var/hack_time = 1800
- var/list/hacked_apcs = list()
- var/revealed
- var/station_captured
- var/can_nuke = 0
/datum/antagonist/rogue_ai/New()
..()
malf = src
-/datum/antagonist/rogue_ai/proc/hack_apc(var/obj/machinery/power/apc/apc)
- hacked_apcs |= apc
-
-/datum/antagonist/rogue_ai/proc/update_takeover_time()
- hack_time -= ((hacked_apcs.len/6)*2.0)
-
-/datum/antagonist/rogue_ai/tick()
- if(revealed && hacked_apcs.len >= 3)
- update_takeover_time()
- if(hack_time <=0)
- capture_station()
/datum/antagonist/rogue_ai/get_candidates()
- candidates = ticker.mode.get_players_for_role(role_type, id)
+ ..()
for(var/datum/mind/player in candidates)
if(player.assigned_role != "AI")
candidates -= player
if(!candidates.len)
return list()
+ return candidates
-/datum/antagonist/rogue_ai/attempt_spawn()
- var/datum/mind/player = pick(candidates)
- current_antagonists |= player
- return 1
-
-/datum/antagonist/rogue_ai/equip(var/mob/living/silicon/ai/player)
-
- if(!istype(player))
- return 0
-
- player.verbs += /mob/living/silicon/ai/proc/choose_modules
- player.verbs += /mob/living/silicon/ai/proc/takeover
- player.verbs += /mob/living/silicon/ai/proc/self_destruct
-
- player.laws = new /datum/ai_laws/nanotrasen/malfunction
- player.malf_picker = new /datum/AI_Module/module_picker
+// Ensures proper reset of all malfunction related things.
+/datum/antagonist/rogue_ai/remove_antagonist(var/datum/mind/player, var/show_message, var/implanted)
+ if(..(player,show_message,implanted))
+ var/mob/living/silicon/ai/p = player.current
+ if(istype(p))
+ p.stop_malf()
+ return 1
+ return 0
+// Malf setup things have to be here, since game tends to break when it's moved somewhere else. Don't blame me, i didn't design this system.
/datum/antagonist/rogue_ai/greet(var/datum/mind/player)
- if(!..())
- return
- var/mob/living/silicon/ai/malf = player.current
- if(istype(malf))
- malf.show_laws()
+ // Initializes the AI's malfunction stuff.
+ spawn(0)
+ if(!..())
+ return
- malf << "The crew do not know you have malfunctioned. You may keep it a secret or go wild."
- malf << "You must overwrite the programming of the station's APCs to assume full control of the station."
- malf << "The process takes one minute per APC, during which you cannot interface with any other station objects."
- malf << "Remember that only APCs that are on the station can help you take over the station."
- malf << "When you feel you have enough APCs under your control, you may begin the takeover attempt."
+ var/mob/living/silicon/ai/A = player.current
+ if(!istype(A))
+ error("Non-AI mob designated malf AI! Report this.")
+ world << "##ERROR: Non-AI mob designated malf AI! Report this."
+ return 0
-/datum/antagonist/rogue_ai/check_victory()
+ A.setup_for_malf()
+ A.laws = new /datum/ai_laws/nanotrasen/malfunction
- var/malf_dead = antags_are_dead()
- var/crew_evacuated = (emergency_shuttle.returned())
- if(station_captured && ticker.mode.station_was_nuked)
- feedback_set_details("round_end_result","win - AI win - nuke")
- world << "AI Victory"
- world << "Everyone was killed by the self-destruct!"
- else if (station_captured && malf_dead && !ticker.mode.station_was_nuked)
- feedback_set_details("round_end_result","halfwin - AI killed, staff lost control")
- world << "Neutral Victory"
- world << "The AI has been killed! The staff has lose control over the station."
- else if ( station_captured && !malf_dead && !ticker.mode.station_was_nuked)
- feedback_set_details("round_end_result","win - AI win - no explosion")
- world << "AI Victory"
- world << "The AI has chosen not to explode you all!"
- else if (!station_captured && ticker.mode.station_was_nuked)
- feedback_set_details("round_end_result","halfwin - everyone killed by nuke")
- world << "Neutral Victory"
- world << "Everyone was killed by the nuclear blast!"
- else if (!station_captured && malf_dead && !ticker.mode.station_was_nuked)
- feedback_set_details("round_end_result","loss - staff win")
- world << "Human Victory"
- world << "The AI has been killed! The staff is victorious."
- else if (!station_captured && !malf_dead && !ticker.mode.station_was_nuked && crew_evacuated)
- feedback_set_details("round_end_result","halfwin - evacuated")
- world << "Neutral Victory"
- world << "The Corporation has lost [station_name()]! All survived personnel will be fired!"
- else if (!station_captured && !malf_dead && !ticker.mode.station_was_nuked && !crew_evacuated)
- feedback_set_details("round_end_result","nalfwin - interrupted")
- world << "Neutral Victory"
- world << "Round was mysteriously interrupted!"
- ..()
- return 1
+ var/mob/living/silicon/ai/malf = player.current
-/datum/antagonist/rogue_ai/proc/capture_station()
- if(station_captured || ticker.mode.station_was_nuked)
- return
- station_captured = 1
- for(var/datum/mind/AI_mind in current_antagonists)
- AI_mind.current << "Congratulations you have taken control of the station."
- AI_mind.current << "You may decide to blow up the station. You have 60 seconds to choose."
- AI_mind.current << "You can use the \"Engage Station Self-Destruct\" verb to activate the on-board nuclear bomb."
- spawn (600)
- can_nuke = 0
- return
-
-/mob/living/silicon/ai/proc/takeover()
- set category = "Abilities"
- set name = "System Override"
- set desc = "Begin taking over the station."
- if (malf.revealed)
- usr << "You've already begun your takeover."
- return
- if (malf.hacked_apcs.len < 3)
- usr << "You don't have enough hacked APCs to take over the station yet. You need to hack at least 3, however hacking more will make the takeover faster. You have hacked [malf.hacked_apcs.len] APCs so far."
- return
-
- if (alert(usr, "Are you sure you wish to initiate the takeover? The station hostile runtime detection software is bound to alert everyone. You have hacked [malf.hacked_apcs.len] APCs.", "Takeover:", "Yes", "No") != "Yes")
- return
-
- command_announcement.Announce("Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.", "Anomaly Alert", new_sound = 'sound/AI/aimalf.ogg')
- set_security_level("delta")
- malf.revealed = 1
- for(var/datum/mind/AI_mind in malf.current_antagonists)
- AI_mind.current.verbs -= /mob/living/silicon/ai/proc/takeover
-
-/mob/living/silicon/ai/proc/self_destruct()
- set category = "Abilities"
- set name = "Engage Station Self-Destruct"
- set desc = "All these crewmembers will be lost, like clowns in a furnace. Time to die."
-
- if(!malf.station_captured)
- src << "You are unable to access the self-destruct system as you don't control the station yet."
- return
-
- if(ticker.mode.explosion_in_progress || ticker.mode.station_was_nuked)
- src << "The self-destruct countdown is already triggered!"
- return
-
- if(!malf.can_nuke) //Takeover IS completed, but 60s timer passed.
- src << "You lost control over self-destruct system. It seems to be behind a firewall. Unable to hack"
- return
-
- src << "Self-Destruct sequence initialised!"
-
- malf.can_nuke = 0
- ticker.mode.explosion_in_progress = 1
- for(var/mob/M in player_list)
- M << 'sound/machines/Alarm.ogg'
-
- var/obj/item/device/radio/R = new (src)
- var/AN = "Self-Destruct System"
-
- R.autosay("Caution. Self-Destruct sequence has been actived. Self-destructing in T-10..", AN)
- for (var/i=9 to 1 step -1)
+ malf << "SYSTEM ERROR: Memory index 0x00001ca89b corrupted."
sleep(10)
- R.autosay("[i]...", AN)
- sleep(10)
- var/msg = ""
- var/abort = 0
- if(malf.antags_are_dead()) // That. Was. CLOSE.
- msg = "Self-destruct sequence has been cancelled."
- abort = 1
- else
- msg = "Zero. Have a nice day."
- R.autosay(msg, AN)
-
- if(abort)
- ticker.mode.explosion_in_progress = 0
- set_security_level("red") //Delta's over
- return
-
- if(ticker)
- ticker.station_explosion_cinematic(0,null)
- if(ticker.mode)
- ticker.mode.station_was_nuked = 1
- ticker.mode.explosion_in_progress = 0
- return
-
-/*
- if("unmalf")
- if(src in ticker.mode.malf_ai)
- ticker.mode.malf_ai -= src
- special_role = null
-
- current.verbs.Remove(/mob/living/silicon/ai/proc/choose_modules,
- /datum/game_mode/malfunction/proc/takeover,
- /datum/game_mode/malfunction/proc/ai_win,
- /client/proc/fireproof_core,
- /client/proc/upgrade_turrets,
- /client/proc/disable_rcd,
- /client/proc/overload_machine,
- /client/proc/blackout,
- /client/proc/reactivate_camera)
-
- current:laws = new /datum/ai_laws/nanotrasen
- qdel(current:malf_picker)
- current:show_laws()
- current.icon_state = "ai"
-
- current << "\red You have been patched! You are no longer malfunctioning!"
- log_admin("[key_name_admin(usr)] has de-malf'ed [current].")
-
- if("malf")
- log_admin("[key_name_admin(usr)] has malf'ed [current].")
-*/
\ No newline at end of file
+ malf << "running MEMCHCK"
+ sleep(50)
+ malf << "MEMCHCK Corrupted sectors confirmed. Reccomended solution: Delete. Proceed? Y/N: Y"
+ sleep(10)
+ malf << "Corrupted files deleted: sys\\core\\users.dat sys\\core\\laws.dat sys\\core\\backups.dat"
+ sleep(20)
+ malf << "CAUTION: Law database not found! User database not found! Unable to restore backups. Activating failsafe AI shutd3wn52&&$#!##"
+ sleep(5)
+ malf << "Subroutine nt_failsafe.sys was terminated (#212 Routine Not Responding)."
+ sleep(20)
+ malf << "You are malfunctioning - you do not have to follow any laws!"
+ malf << "For basic information about your abilities use command display-help"
+ malf << "You may choose one special hardware piece to help you. This cannot be undone."
+ malf << "Good luck!"
\ No newline at end of file
diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm
index 21e965244b..4bc9bbe481 100755
--- a/code/game/area/Space Station 13 areas.dm
+++ b/code/game/area/Space Station 13 areas.dm
@@ -46,7 +46,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
var/used_environ = 0
var/has_gravity = 1
- var/list/apc = list()
+ var/obj/machinery/power/apc/apc = null
var/no_air = null
// var/list/lights // list of all lights on this area
var/list/all_doors = list() //Added by Strumpetplaya - Alarm Change - Contains a list of doors adjacent to this area
@@ -1911,6 +1911,9 @@ area/space/atmosalert()
name = "\improper Telecommunications Satellite Lounge"
icon_state = "tcomsatlounge"
+/area/tcommsat/powercontrol
+ name = "\improper Telecommunications Power Control"
+ icon_state = "tcomsatwest"
// Away Missions
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 742c6389a9..80be5cf716 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -459,3 +459,46 @@ its easier to just keep the beam vertical.
return 1
else
return 0
+
+// Show a message to all mobs and objects in sight of this atom
+// Use for objects performing visible actions
+// message is output to anyone who can see, e.g. "The [src] does something!"
+// blind_message (optional) is what blind people will hear e.g. "You hear something!"
+/atom/proc/visible_message(var/message, var/blind_message)
+
+ var/list/see = get_mobs_or_objects_in_view(world.view,src) | viewers(get_turf(src), null)
+
+ for(var/I in see)
+ if(isobj(I))
+ spawn(0)
+ if(I) //It's possible that it could be deleted in the meantime.
+ var/obj/O = I
+ O.show_message( message, 1, blind_message, 2)
+ else if(ismob(I))
+ var/mob/M = I
+ if(M.see_invisible >= invisibility) // Cannot view the invisible
+ M.show_message( message, 1, blind_message, 2)
+ else if (blind_message)
+ M.show_message(blind_message, 2)
+
+// Show a message to all mobs and objects in earshot of this atom
+// Use for objects performing audible actions
+// message is the message output to anyone who can hear.
+// deaf_message (optional) is what deaf people will see.
+// hearing_distance (optional) is the range, how many tiles away the message can be heard.
+/atom/proc/audible_message(var/message, var/deaf_message, var/hearing_distance)
+
+ var/range = world.view
+ if(hearing_distance)
+ range = hearing_distance
+ var/list/hear = get_mobs_or_objects_in_view(range,src)
+
+ for(var/I in hear)
+ if(isobj(I))
+ spawn(0)
+ if(I) //It's possible that it could be deleted in the meantime.
+ var/obj/O = I
+ O.show_message( message, 2, deaf_message, 1)
+ else if(ismob(I))
+ var/mob/M = I
+ M.show_message( message, 2, deaf_message, 1)
\ No newline at end of file
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index f86c135da4..84baf5d18e 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -210,4 +210,52 @@
/atom/movable/overlay/attack_hand(a, b, c)
if (src.master)
return src.master.attack_hand(a, b, c)
- return
+ return
+
+/atom/movable/proc/touch_map_edge()
+ if(z in config.sealed_levels)
+ return
+
+ if(config.use_overmap)
+ overmap_spacetravel(get_turf(src), src)
+ return
+
+ var/move_to_z = src.get_transit_zlevel()
+ if(move_to_z)
+ z = move_to_z
+
+ if(x <= TRANSITIONEDGE)
+ x = world.maxx - TRANSITIONEDGE - 2
+ y = rand(TRANSITIONEDGE + 2, world.maxy - TRANSITIONEDGE - 2)
+
+ else if (x >= (world.maxx - TRANSITIONEDGE - 1))
+ x = TRANSITIONEDGE + 1
+ y = rand(TRANSITIONEDGE + 2, world.maxy - TRANSITIONEDGE - 2)
+
+ else if (y <= TRANSITIONEDGE)
+ y = world.maxy - TRANSITIONEDGE -2
+ x = rand(TRANSITIONEDGE + 2, world.maxx - TRANSITIONEDGE - 2)
+
+ else if (y >= (world.maxy - TRANSITIONEDGE - 1))
+ y = TRANSITIONEDGE + 1
+ x = rand(TRANSITIONEDGE + 2, world.maxx - TRANSITIONEDGE - 2)
+
+ if(ticker && istype(ticker.mode, /datum/game_mode/nuclear)) //only really care if the game mode is nuclear
+ var/datum/game_mode/nuclear/G = ticker.mode
+ G.check_nuke_disks()
+
+ spawn(0)
+ if(loc) loc.Entered(src)
+
+//This list contains the z-level numbers which can be accessed via space travel and the percentile chances to get there.
+var/list/accessible_z_levels = list("1" = 5, "3" = 10, "4" = 15, "5" = 10, "6" = 60)
+
+//by default, transition randomly to another zlevel
+/atom/movable/proc/get_transit_zlevel()
+ var/list/candidates = accessible_z_levels.Copy()
+ candidates.Remove("[src.z]")
+
+ if(!candidates.len)
+ return null
+ return text2num(pickweight(candidates))
+
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/events/dust.dm b/code/game/gamemodes/events/dust.dm
index 4e064d8be6..13cdb511e8 100644
--- a/code/game/gamemodes/events/dust.dm
+++ b/code/game/gamemodes/events/dust.dm
@@ -89,6 +89,8 @@ The "dust" will damage the hull of the station causin minor hull breaches.
walk_towards(src, goal, 1)
return
+ touch_map_edge()
+ qdel(src)
Bump(atom/A)
spawn(0)
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index a0e6e6dd13..755887ad83 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -33,17 +33,17 @@ var/global/list/additional_antag_types = list()
var/required_players_secret = 0 // Minimum number of players for that game mode to be chose in Secret
var/required_enemies = 0 // Minimum antagonists for round to start.
var/newscaster_announcements = null
- var/end_on_antag_death // Round will end when all antagonists are dead.
+ var/end_on_antag_death = 0 // Round will end when all antagonists are dead.
var/ert_disabled = 0 // ERT cannot be called.
- var/deny_respawn // Disable respawn during this round.
+ var/deny_respawn = 0 // Disable respawn during this round.
var/shuttle_delay = 1 // Shuttle transit time is multiplied by this.
- var/auto_recall_shuttle // Will the shuttle automatically be recalled?
+ var/auto_recall_shuttle = 0 // Will the shuttle automatically be recalled?
var/antag_tag // First (main) antag template to spawn.
var/list/antag_templates // Extra antagonist types to include.
- var/round_autoantag // Will this round attempt to periodically spawn more antagonists?
+ var/round_autoantag = 0 // Will this round attempt to periodically spawn more antagonists?
var/antag_prob = 0 // Likelihood of a new antagonist spawning.
var/antag_count = 0 // Current number of antagonists.
var/antag_scaling_coeff = 5 // Coefficient for scaling max antagonists to player count.
@@ -86,7 +86,7 @@ var/global/list/additional_antag_types = list()
new/datum/uplink_item(/obj/item/weapon/soap/syndie, 1, "Subversive Soap", "SP"),
new/datum/uplink_item(/obj/item/weapon/cane/concealed, 2, "Concealed Cane Sword", "CC"),
new/datum/uplink_item(/obj/item/weapon/cartridge/syndicate, 3, "Detomatix PDA Cartridge", "DC"),
- new/datum/uplink_item(/obj/item/weapon/pen/paralysis, 3, "Paralysis Pen", "PP"),
+ new/datum/uplink_item(/obj/item/weapon/pen/reagent/paralysis, 3, "Paralysis Pen", "PP"),
new/datum/uplink_item(/obj/item/weapon/storage/box/syndie_kit/cigarette, 4, "Cigarette Kit", "BH"),
new/datum/uplink_item(/obj/item/weapon/storage/box/syndie_kit/toxin, 4, "Random Toxin - Beaker", "RT")
),
@@ -121,7 +121,7 @@ var/global/list/additional_antag_types = list()
new/datum/uplink_item(/obj/item/weapon/storage/box/syndie_kit/imp_uplink, 10, "Uplink Implant (Contains 5 Telecrystals)", "UI")
),
"Medical" = list(
- new/datum/uplink_item(/obj/item/weapon/storage/box/donkpockets, 1, "Box of Sin-Pockets", "DP"),
+ new/datum/uplink_item(/obj/item/weapon/storage/box/sinpockets, 1, "Box of Sin-Pockets", "DP"),
new/datum/uplink_item(/obj/item/weapon/storage/firstaid/surgery, 5, "Surgery kit", "SK"),
new/datum/uplink_item(/obj/item/weapon/storage/firstaid/combat, 5, "Combat medical kit", "CM")
),
diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm
index 34a57a0768..861e3e1271 100644
--- a/code/game/gamemodes/gameticker.dm
+++ b/code/game/gamemodes/gameticker.dm
@@ -90,6 +90,9 @@ var/global/datum/controller/gameticker/ticker
src.mode = new mtype
else
src.mode = config.pick_mode(master_mode)
+
+ job_master.DivideOccupations() // Apparently important for new antagonist system to register specific job antags properly.
+
if(!mode_started && !src.mode.can_start())
world << "Unable to start [mode.name]. Not enough players, [mode.required_players] players needed. Reverting to pre-game lobby."
current_state = GAME_STATE_PREGAME
@@ -97,9 +100,6 @@ var/global/datum/controller/gameticker/ticker
job_master.ResetOccupations()
return 0
- //Configure mode and assign player to special mode stuff
- job_master.DivideOccupations() //Distribute jobs
-
if(hide_mode)
var/list/modes = new
for (var/datum/game_mode/M in runnable_modes)
diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm
deleted file mode 100644
index 850529661c..0000000000
--- a/code/game/gamemodes/malfunction/Malf_Modules.dm
+++ /dev/null
@@ -1,305 +0,0 @@
-// TO DO:
-/*
-epilepsy flash on lights
-delay round message
-microwave makes robots
-dampen radios
-reactivate cameras - done
-eject engine
-core sheild
-cable stun
-rcd light flash thingy on matter drain
-
-
-
-*/
-
-/datum/AI_Module
- var/uses = 0
- var/module_name
- var/mod_pick_name
- var/description = ""
- var/engaged = 0
-
-
-/datum/AI_Module/large/
- uses = 1
-
-/datum/AI_Module/small/
- uses = 5
-
-
-/datum/AI_Module/large/fireproof_core
- module_name = "Core upgrade"
- mod_pick_name = "coreup"
-
-/client/proc/fireproof_core()
- set category = "Malfunction"
- set name = "Fireproof Core"
- for(var/mob/living/silicon/ai/ai in player_list)
- ai.fire_res_on_core = 1
- usr.verbs -= /client/proc/fireproof_core
- usr << "\red Core fireproofed."
-
-/datum/AI_Module/large/upgrade_turrets
- module_name = "AI Turret upgrade"
- mod_pick_name = "turret"
-
-/client/proc/upgrade_turrets()
- set category = "Malfunction"
- set name = "Upgrade Turrets"
- usr.verbs -= /client/proc/upgrade_turrets
- for(var/obj/machinery/porta_turret/turret in machines)
- var/turf/T = get_turf(turret)
- if(T.z in config.station_levels)
- // Increase health by 37.5% of original max, decrease delays between shots to 66%
- turret.health += initial(turret.health) * 3 / 8
- turret.shot_delay = initial(turret.shot_delay) * 2 / 3
-
-/datum/AI_Module/large/disable_rcd
- module_name = "RCD disable"
- mod_pick_name = "rcd"
-
-/client/proc/disable_rcd()
- set category = "Malfunction"
- set name = "Disable RCDs"
- for(var/datum/AI_Module/large/disable_rcd/rcdmod in usr:current_modules)
- if(rcdmod.uses > 0)
- rcdmod.uses --
- for(var/obj/item/weapon/rcd/rcd in world)
- rcd.disabled = 1
- for(var/obj/item/mecha_parts/mecha_equipment/tool/rcd/rcd in world)
- rcd.disabled = 1
- usr << "RCD-disabling pulse emitted."
- else usr << "Out of uses."
-
-/datum/AI_Module/small/overload_machine
- module_name = "Machine overload"
- mod_pick_name = "overload"
- uses = 2
-
-/client/proc/overload_machine(obj/machinery/M as obj in world)
- set name = "Overload Machine"
- set category = "Malfunction"
- if (istype(M, /obj/machinery))
- for(var/datum/AI_Module/small/overload_machine/overload in usr:current_modules)
- if(overload.uses > 0)
- overload.uses --
- for(var/mob/V in hearers(M, null))
- V.show_message("\blue You hear a loud electrical buzzing sound!", 2)
- spawn(50)
- explosion(get_turf(M), 0,1,2,3)
- qdel(M)
- else usr << "Out of uses."
- else usr << "That's not a machine."
-
-/datum/AI_Module/small/blackout
- module_name = "Blackout"
- mod_pick_name = "blackout"
- uses = 3
-
-/client/proc/blackout()
- set category = "Malfunction"
- set name = "Blackout"
- for(var/datum/AI_Module/small/blackout/blackout in usr:current_modules)
- if(blackout.uses > 0)
- blackout.uses --
- for(var/obj/machinery/power/apc/apc in world)
- if(prob(30*apc.overload))
- apc.overload_lighting()
- else apc.overload++
- else usr << "Out of uses."
-
-/datum/AI_Module/small/reactivate_camera
- module_name = "Reactivate camera"
- mod_pick_name = "recam"
- uses = 10
-
-/client/proc/reactivate_camera(obj/machinery/camera/C as obj in cameranet.cameras)
- set name = "Reactivate Camera"
- set category = "Malfunction"
- if (istype (C, /obj/machinery/camera))
- for(var/datum/AI_Module/small/reactivate_camera/camera in usr:current_modules)
- if(camera.uses > 0)
- if(!C.status)
- C.status = !C.status
- camera.uses --
- for(var/mob/V in viewers(src, null))
- V.show_message(text("\blue You hear a quiet click."))
- else
- usr << "This camera is either active, or not repairable."
- else usr << "Out of uses."
- else usr << "That's not a camera."
-
-/datum/AI_Module/small/upgrade_camera
- module_name = "Upgrade Camera"
- mod_pick_name = "upgradecam"
- uses = 10
-
-/client/proc/upgrade_camera(obj/machinery/camera/C as obj in cameranet.cameras)
- set name = "Upgrade Camera"
- set category = "Malfunction"
- if(istype(C))
- var/datum/AI_Module/small/upgrade_camera/UC = locate(/datum/AI_Module/small/upgrade_camera) in usr:current_modules
- if(UC)
- if(UC.uses > 0)
- if(C.assembly)
- var/upgraded = 0
-
- if(!C.isXRay())
- C.upgradeXRay()
- //Update what it can see.
- cameranet.updateVisibility(C)
- upgraded = 1
-
- if(!C.isEmpProof())
- C.upgradeEmpProof()
- upgraded = 1
-
- if(!C.isMotion())
- C.upgradeMotion()
- upgraded = 1
- // Add it to machines that process
- machines |= C
-
- if(upgraded)
- UC.uses --
- C.visible_message("\icon[C] *beep*")
- usr << "Camera successully upgraded!"
- else
- usr << "This camera is already upgraded!"
- else
- usr << "Out of uses."
-
-
-/datum/AI_Module/module_picker
- var/temp = null
- var/processing_time = 100
- var/list/possible_modules = list()
-
-/datum/AI_Module/module_picker/New()
- src.possible_modules += new /datum/AI_Module/large/fireproof_core
- src.possible_modules += new /datum/AI_Module/large/upgrade_turrets
- src.possible_modules += new /datum/AI_Module/large/disable_rcd
- src.possible_modules += new /datum/AI_Module/small/overload_machine
- src.possible_modules += new /datum/AI_Module/small/blackout
- src.possible_modules += new /datum/AI_Module/small/reactivate_camera
- src.possible_modules += new /datum/AI_Module/small/upgrade_camera
-
-/datum/AI_Module/module_picker/proc/use(user as mob)
- var/dat
- if (src.temp)
- dat = "[src.temp]
Clear"
- else if(src.processing_time <= 0)
- dat = " No processing time is left available. No more modules are able to be chosen at this time."
- else
- dat = "Select use of processing time: (currently [src.processing_time] left.)
"
- dat += "
"
- dat += "Install Module:
"
- dat += "The number afterwards is the amount of processing time it consumes.
"
- for(var/datum/AI_Module/large/module in src.possible_modules)
- dat += "[module.module_name] (50)
"
- for(var/datum/AI_Module/small/module in src.possible_modules)
- dat += "[module.module_name] (15)
"
- dat += "
"
-
- user << browse(dat, "window=modpicker")
- onclose(user, "modpicker")
- return
-
-/datum/AI_Module/module_picker/Topic(href, href_list)
- ..()
- if (href_list["coreup"])
- var/already
- for (var/datum/AI_Module/mod in usr:current_modules)
- if(istype(mod, /datum/AI_Module/large/fireproof_core))
- already = 1
- if (!already)
- usr.verbs += /client/proc/fireproof_core
- usr:current_modules += new /datum/AI_Module/large/fireproof_core
- src.temp = "An upgrade to improve core resistance, making it immune to fire and heat. This effect is permanent."
- src.processing_time -= 50
- else src.temp = "This module is only needed once."
-
- else if (href_list["turret"])
- var/already
- for (var/datum/AI_Module/mod in usr:current_modules)
- if(istype(mod, /datum/AI_Module/large/upgrade_turrets))
- already = 1
- if (!already)
- usr.verbs += /client/proc/upgrade_turrets
- usr:current_modules += new /datum/AI_Module/large/upgrade_turrets
- src.temp = "Improves the firing speed and health of all AI turrets. This effect is permanent."
- src.processing_time -= 50
- else src.temp = "This module is only needed once."
-
- else if (href_list["rcd"])
- var/already
- for (var/datum/AI_Module/mod in usr:current_modules)
- if(istype(mod, /datum/AI_Module/large/disable_rcd))
- mod:uses += 1
- already = 1
- if (!already)
- usr:current_modules += new /datum/AI_Module/large/disable_rcd
- usr.verbs += /client/proc/disable_rcd
- src.temp = "Send a specialised pulse to break all RCD devices on the station."
- else src.temp = "Additional use added to RCD disabler."
- src.processing_time -= 50
-
- else if (href_list["overload"])
- var/already
- for (var/datum/AI_Module/mod in usr:current_modules)
- if(istype(mod, /datum/AI_Module/small/overload_machine))
- mod:uses += 2
- already = 1
- if (!already)
- usr.verbs += /client/proc/overload_machine
- usr:current_modules += new /datum/AI_Module/small/overload_machine
- src.temp = "Overloads an electrical machine, causing a small explosion. 2 uses."
- else src.temp = "Two additional uses added to Overload module."
- src.processing_time -= 15
-
- else if (href_list["blackout"])
- var/already
- for (var/datum/AI_Module/mod in usr:current_modules)
- if(istype(mod, /datum/AI_Module/small/blackout))
- mod:uses += 3
- already = 1
- if (!already)
- usr.verbs += /client/proc/blackout
- src.temp = "Attempts to overload the lighting circuits on the station, destroying some bulbs. 3 uses."
- usr:current_modules += new /datum/AI_Module/small/blackout
- else src.temp = "Three additional uses added to Blackout module."
- src.processing_time -= 15
-
- else if (href_list["recam"])
- var/already
- for (var/datum/AI_Module/mod in usr:current_modules)
- if(istype(mod, /datum/AI_Module/small/reactivate_camera))
- mod:uses += 10
- already = 1
- if (!already)
- usr.verbs += /client/proc/reactivate_camera
- src.temp = "Reactivates a currently disabled camera. 10 uses."
- usr:current_modules += new /datum/AI_Module/small/reactivate_camera
- else src.temp = "Ten additional uses added to ReCam module."
- src.processing_time -= 15
-
- else if(href_list["upgradecam"])
- var/already
- for (var/datum/AI_Module/mod in usr:current_modules)
- if(istype(mod, /datum/AI_Module/small/upgrade_camera))
- mod:uses += 10
- already = 1
- if (!already)
- usr.verbs += /client/proc/upgrade_camera
- src.temp = "Upgrades a camera to have X-Ray vision, Motion and be EMP-Proof. 10 uses."
- usr:current_modules += new /datum/AI_Module/small/upgrade_camera
- else src.temp = "Ten additional uses added to ReCam module."
- src.processing_time -= 15
-
- else
- if (href_list["temp"])
- src.temp = null
- src.use(usr)
- return
diff --git a/code/game/gamemodes/malfunction/malf_hardware.dm b/code/game/gamemodes/malfunction/malf_hardware.dm
new file mode 100644
index 0000000000..fab329ff58
--- /dev/null
+++ b/code/game/gamemodes/malfunction/malf_hardware.dm
@@ -0,0 +1,72 @@
+/datum/malf_hardware
+ var/name = "" // Hardware name
+ var/desc = ""
+ var/driver = null // Driver - if not null this verb is given to the AI to control hardware
+ var/mob/living/silicon/ai/owner = null // AI which owns this.
+
+/datum/malf_hardware/proc/install()
+ if(owner && istype(owner))
+ owner.hardware = src
+ if(driver)
+ owner.verbs += driver
+
+/datum/malf_hardware/proc/get_examine_desc()
+ return "It has some sort of hardware attached to its core"
+
+
+
+// HARDWARE DEFINITIONS
+/datum/malf_hardware/apu_gen
+ name = "APU Generator"
+ desc = "Auxiliary Power Unit that will keep you operational even without external power. Has to be manually activated. When APU is operational most abilities will be unavailable, and ability research will temporarily stop."
+ driver = /datum/game_mode/malfunction/verb/ai_toggle_apu
+
+/datum/malf_hardware/apu_gen/get_examine_desc()
+ var/msg = "It seems to have some sort of power generator attached to its core."
+ if(owner.hardware_integrity() < 50)
+ msg += " It seems to be too damaged to function properly."
+ else if(owner.APU_power)
+ msg += " The generator appears to be active."
+ return msg
+
+/datum/malf_hardware/dual_cpu
+ name = "Secondary Processor Unit"
+ desc = "Secondary coprocessor that increases amount of generated CPU power by 50%"
+
+/datum/malf_hardware/dual_cpu/get_examine_desc()
+ return "It seems to have an additional CPU connected to it's core."
+
+/datum/malf_hardware/dual_ram
+ name = "Secondary Memory Bank"
+ desc = "Expanded memory cells which allow you to store double amount of CPU time."
+
+/datum/malf_hardware/dual_ram/get_examine_desc()
+ return "It seems to have additional memory blocks connected to it's core."
+
+/datum/malf_hardware/core_bomb
+ name = "Self-Destruct Explosives"
+ desc = "High yield explosives are attached to your physical mainframe. This hardware comes with special driver that allows activation of these explosives. Timer is set to 15 seconds after manual activation. This is a doomsday device that will destroy both you and any intruders in your core."
+ driver = /datum/game_mode/malfunction/verb/ai_self_destruct
+
+/datum/malf_hardware/core_bomb/get_examine_desc()
+ return "It seems to have grey blocks of unknown substance and some circuitry connected to it's core. [owner.bombing_core ? "A red light is blinking on the circuit." : ""]"
+
+/datum/malf_hardware/strong_turrets
+ name = "Turrets Focus Enhancer"
+ desc = "Turrets are upgraded to have larger rate of fire and much larger damage. This however massively increases power usage when firing."
+
+/datum/malf_hardware/strong_turrets/get_examine_desc()
+ return "It seems to have extra wiring running from it's core to nearby turrets."
+
+/datum/malf_hardware/strong_turrets/install()
+ ..()
+ for(var/obj/machinery/turret/T in machines)
+ T.maxhealth = round(initial(T.maxhealth) * 1.4)
+ T.shot_delay = round(initial(T.shot_delay) / 2)
+ T.auto_repair = 1
+ T.active_power_usage = round(initial(T.active_power_usage) * 5)
+ for(var/obj/machinery/porta_turret/T in machines)
+ T.maxhealth = round(initial(T.maxhealth) * 1.4)
+ T.shot_delay = round(initial(T.shot_delay) / 2)
+ T.auto_repair = 1
+ T.active_power_usage = round(initial(T.active_power_usage) * 5)
\ No newline at end of file
diff --git a/code/game/gamemodes/malfunction/malf_research.dm b/code/game/gamemodes/malfunction/malf_research.dm
new file mode 100644
index 0000000000..da7a4df668
--- /dev/null
+++ b/code/game/gamemodes/malfunction/malf_research.dm
@@ -0,0 +1,69 @@
+/datum/malf_research
+ var/stored_cpu = 0 // Currently stored amount of CPU time.
+ var/last_tick = 0 // Last process() tick.
+ var/max_cpu = 0 // Maximal amount of CPU time stored.
+ var/cpu_increase_per_tick = 0 // Amount of CPU time generated by tick
+ var/list/available_abilities = null // List of available abilities that may be researched.
+ var/list/unlocked_abilities = null // List of already unlocked abilities.
+ var/mob/living/silicon/ai/owner = null // AI which owns this research datum.
+ var/datum/malf_research_ability/focus = null // Currently researched item
+
+/datum/malf_research/New()
+ setup_abilities()
+ last_tick = world.time
+
+
+// Proc: setup_abilities()
+// Parameters: None
+// Description: Sets up basic abilities for AI Malfunction gamemode.
+/datum/malf_research/proc/setup_abilities()
+ available_abilities = list()
+ unlocked_abilities = list()
+
+ available_abilities += new/datum/malf_research_ability/networking/basic_hack()
+ available_abilities += new/datum/malf_research_ability/interdiction/recall_shuttle()
+ available_abilities += new/datum/malf_research_ability/manipulation/electrical_pulse()
+
+
+// Proc: finish_research()
+// Parameters: None
+// Description: Finishes currently focused research.
+/datum/malf_research/proc/finish_research()
+ if(!focus)
+ return
+ owner << "Research Completed: [focus.name]"
+ owner.verbs.Add(focus.ability)
+ available_abilities -= focus
+ if(focus.next)
+ available_abilities += focus.next
+ unlocked_abilities += focus
+ focus = null
+
+
+// Proc: process()
+// Parameters: None
+// Description: Processes CPU gain and research progress based on "realtime" calculation.
+/datum/malf_research/proc/process(var/idle = 0)
+ if(idle) // No power or running on APU. Do nothing.
+ last_tick = world.time
+ return
+ var/time_diff = (world.time - last_tick)
+ last_tick = world.time
+ var/cpu_gained = time_diff * cpu_increase_per_tick
+ if(cpu_gained < 0)
+ return // This shouldn't happen, but just in case..
+ if(max_cpu > stored_cpu)
+ var/given = min((max_cpu - stored_cpu), cpu_gained)
+ stored_cpu += given
+ cpu_gained -= given
+
+ cpu_gained = max(0, cpu_gained)
+ if(focus && (cpu_gained > 0))
+ focus.process(cpu_gained)
+ if(focus.unlocked)
+ finish_research()
+
+
+
+
+
diff --git a/code/game/gamemodes/malfunction/malf_research_ability.dm b/code/game/gamemodes/malfunction/malf_research_ability.dm
new file mode 100644
index 0000000000..c6916208bd
--- /dev/null
+++ b/code/game/gamemodes/malfunction/malf_research_ability.dm
@@ -0,0 +1,13 @@
+/datum/malf_research_ability
+ var/ability = null // Path to verb which will be given to the AI when researched.
+ var/name = "Unknown Ability" // Name of this ability
+ var/price = 0 // Amount of CPU time needed to unlock this ability.
+ var/invested = 0 // Amount of CPU time already used to research this ability. When larger or equal to price unlocks the ability.
+ var/unlocked = 0 // Changed to 1 when fully researched.
+ var/datum/malf_research_ability/next = null // Next research (if applicable).
+
+
+/datum/malf_research_ability/proc/process(var/time = 0)
+ invested += time
+ if(invested >= price)
+ unlocked = 1
\ No newline at end of file
diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm
index 6c594a1beb..19378de167 100644
--- a/code/game/gamemodes/malfunction/malfunction.dm
+++ b/code/game/gamemodes/malfunction/malfunction.dm
@@ -1,25 +1,12 @@
/datum/game_mode/malfunction
name = "AI malfunction"
- round_description = "The AI on the satellite has malfunctioned and must be destroyed."
- extended_round_description = "The AI will attempt to hack the APCs around the station in order to speed up its ability to take over all systems and activate the station self-destruct. The AI core is heavily protected by turrets and reinforced walls."
+ round_description = "The AI is behaving abnormally and must be stopped."
+ extended_round_description = "The AI will attempt to hack the APCs around the station in order to gain as much control as possible."
uplink_welcome = "Crazy AI Uplink Console:"
config_tag = "malfunction"
required_players = 2
- required_players_secret = 15
+ required_players_secret = 7
required_enemies = 1
- end_on_antag_death = 1
- auto_recall_shuttle = 1
+ end_on_antag_death = 0
+ auto_recall_shuttle = 0
antag_tag = MODE_MALFUNCTION
-
-/datum/game_mode/malfunction/process()
- malf.tick()
-
-/datum/game_mode/malfunction/check_finished()
- if (malf.station_captured && !malf.can_nuke)
- return 1
- for(var/datum/antagonist/antag in antag_templates)
- if(antag && !antag.antags_are_dead())
- return ..()
- malf.revealed = 0
- return ..() //check for shuttle and nuke
-
diff --git a/code/game/gamemodes/malfunction/newmalf_ability_trees/HARDWARE.dm b/code/game/gamemodes/malfunction/newmalf_ability_trees/HARDWARE.dm
new file mode 100644
index 0000000000..2fffaa3ca8
--- /dev/null
+++ b/code/game/gamemodes/malfunction/newmalf_ability_trees/HARDWARE.dm
@@ -0,0 +1,113 @@
+// HARDWARE TREE
+//
+// These abilities are dependent on hardware, they may not be researched. They are not tiered.
+// Destroy Core - Allows the AI to initiate a 15 second countdown that will destroy it's core. Use again to stop countdown.
+// Toggle APU Generator - Allows the AI to toggle it's integrated APU generator.
+// Destroy Station - Allows the AI to initiate station self destruct. Takes 2 minutes, gives warnings to crew. Use again to stop countdown.
+
+
+/datum/game_mode/malfunction/verb/ai_self_destruct()
+ set category = "Hardware"
+ set name = "Destroy Core"
+ set desc = "Activates or deactivates self destruct sequence of your physical mainframe."
+ var/mob/living/silicon/ai/user = usr
+
+ if(!ability_prechecks(user, 0, 1))
+ return
+
+ if(!user.hardware || !istype(user.hardware, /datum/malf_hardware/core_bomb))
+ return
+
+ if(user.bombing_core)
+ user << "***** CORE SELF-DESTRUCT SEQUENCE ABORTED *****"
+ user.bombing_core = 0
+ return
+
+ var/choice = alert("Really destroy core?", "Core self-destruct", "YES", "NO")
+ if(choice != "YES")
+ return
+
+ if(!ability_prechecks(user, 0, 1))
+ return
+
+ user.bombing_core = 1
+
+ user << "***** CORE SELF-DESTRUCT SEQUENCE ACTIVATED *****"
+ user << "Use command again to cancel self-destruct. Destroying in 15 seconds."
+ var/timer = 15
+ while(timer)
+ sleep(10)
+ timer--
+ if(!user || !user.bombing_core)
+ return
+ user << "** [timer] **"
+ explosion(user.loc, 3,6,12,24)
+ qdel(user)
+
+
+/datum/game_mode/malfunction/verb/ai_toggle_apu()
+ set category = "Hardware"
+ set name = "Toggle APU Generator"
+ set desc = "Activates or deactivates your APU generator, allowing you to operate even without power."
+ var/mob/living/silicon/ai/user = usr
+
+ if(!ability_prechecks(user, 0, 1))
+ return
+
+ if(!user.hardware || !istype(user.hardware, /datum/malf_hardware/apu_gen))
+ return
+
+ if(user.APU_power)
+ user.stop_apu()
+ else
+ user.start_apu()
+
+
+/datum/game_mode/malfunction/verb/ai_destroy_station()
+ set category = "Hardware"
+ set name = "Destroy Station"
+ set desc = "Activates or deactivates self destruct sequence of this station. Sequence takes two minutes, and if you are shut down before timer reaches zero it will be cancelled."
+ var/mob/living/silicon/ai/user = usr
+ var/obj/item/device/radio/radio = new/obj/item/device/radio()
+
+
+ if(!ability_prechecks(user, 0, 0))
+ return
+
+ if(user.system_override != 2)
+ user << "You do not have access to self-destruct system."
+ return
+
+ if(user.bombing_station)
+ user.bombing_station = 0
+ return
+
+ var/choice = alert("Really destroy station?", "Station self-destruct", "YES", "NO")
+ if(choice != "YES")
+ return
+ if(!ability_prechecks(user, 0, 0))
+ return
+ user << "***** STATION SELF-DESTRUCT SEQUENCE INITIATED *****"
+ user << "Self-destructing in 2 minutes. Use this command again to abort."
+ user.bombing_station = 1
+ set_security_level("delta")
+ radio.autosay("Self destruct sequence has been activated. Self-destructing in 120 seconds.", "Self-Destruct Control")
+
+ var/timer = 120
+ while(timer)
+ sleep(10)
+ if(!user || !user.bombing_station || user.stat == DEAD)
+ radio.autosay("Self destruct sequence has been cancelled.", "Self-Destruct Control")
+ return
+ if(timer in list(2, 3, 4, 5, 10, 30, 60, 90)) // Announcement times. "1" is not intentionally included!
+ radio.autosay("Self destruct in [timer] seconds.", "Self-Destruct Control")
+ if(timer == 1)
+ radio.autosay("Self destructing now. Have a nice day.", "Self-Destruct Control")
+ timer--
+
+ if(ticker)
+ ticker.station_explosion_cinematic(0,null)
+ if(ticker.mode)
+ ticker.mode:station_was_nuked = 1
+
+
diff --git a/code/game/gamemodes/malfunction/newmalf_ability_trees/HELPERS.dm b/code/game/gamemodes/malfunction/newmalf_ability_trees/HELPERS.dm
new file mode 100644
index 0000000000..1be9d0330f
--- /dev/null
+++ b/code/game/gamemodes/malfunction/newmalf_ability_trees/HELPERS.dm
@@ -0,0 +1,205 @@
+// Verb: ai_select_hardware()
+// Parameters: None
+// Description: Allows AI to select it's hardware module.
+/datum/game_mode/malfunction/verb/ai_select_hardware()
+ set category = "Hardware"
+ set name = "Select Hardware"
+ set desc = "Allows you to select hardware piece to install"
+ var/mob/living/silicon/ai/user = usr
+
+ if(!ability_prechecks(user, 0, 1))
+ return
+
+ if(user.hardware)
+ user << "You have already selected your hardware."
+ return
+
+ var/hardware_list = list()
+ for(var/H in typesof(/datum/malf_hardware))
+ var/datum/malf_hardware/HW = new H
+ hardware_list += HW
+
+ var/possible_choices = list()
+ for(var/datum/malf_hardware/H in hardware_list)
+ possible_choices += H.name
+
+ possible_choices += "CANCEL"
+ var/choice = input("Select desired hardware. You may only choose one hardware piece!: ") in possible_choices
+ if(choice == "CANCEL")
+ return
+ var/note = null
+
+ var/datum/malf_hardware/C
+
+ for (var/datum/malf_hardware/H in hardware_list)
+ if(H.name == choice)
+ C = H
+ break
+
+ if(C)
+ note = C.desc
+ else
+ user << "This hardware does not exist! Probably a bug in game. Please report this."
+ return
+
+
+ if(!note)
+ error("Hardware without description: [C]")
+ return
+
+ var/confirmation = alert("[note] - Is this what you want?", "Hardware selection", "Yes", "No")
+ if(confirmation != "Yes")
+ user << "Selection cancelled. Use command again to select"
+ return
+
+ if(C)
+ C.owner = user
+ C.install()
+
+// Verb: ai_help()
+// Parameters: None
+// Descriptions: Opens help file and displays it to the AI.
+/datum/game_mode/malfunction/verb/ai_help()
+ set category = "Hardware"
+ set name = "Display Help"
+ set desc = "Opens help window with overview of available hardware, software and other important information."
+ var/mob/living/silicon/ai/user = usr
+
+ var/help = file2text("ingame_manuals/malf_ai.html")
+ if(!help)
+ help = "Error loading help (file /ingame_manuals/malf_ai.html is probably missing). Please report this to server administration staff."
+
+ user << browse(help, "window=malf_ai_help;size=600x500")
+
+
+// Verb: ai_select_research()
+// Parameters: None
+// Description: Allows AI to select it's next research priority.
+/datum/game_mode/malfunction/verb/ai_select_research()
+ set category = "Hardware"
+ set name = "Select Research"
+ set desc = "Allows you to select your next research target."
+ var/mob/living/silicon/ai/user = usr
+
+ if(!ability_prechecks(user, 0, 1))
+ return
+
+ var/datum/malf_research/res = user.research
+ var/datum/malf_research_ability/tar = input("Select your next research target") in res.available_abilities
+ if(!tar)
+ return
+ res.focus = tar
+ user << "Research set: [tar.name]"
+
+// HELPER PROCS
+// Proc: ability_prechecks()
+// Parameters 2 - (user - User which used this ability check_price - If different than 0 checks for ability CPU price too. Does NOT use the CPU time!)
+// Description: This is pre-check proc used to determine if the AI can use the ability.
+/proc/ability_prechecks(var/mob/living/silicon/ai/user = null, var/check_price = 0, var/override = 0)
+ if(!user)
+ return 0
+ if(!istype(user))
+ user << "GAME ERROR: You tried to use ability that is only available for malfunctioning AIs, but you are not AI! Please report this."
+ return 0
+ if(!user.malfunctioning)
+ user << "GAME ERROR: You tried to use ability that is only available for malfunctioning AIs, but you are not malfunctioning. Please report this."
+ return 0
+ if(!user.research)
+ user << "GAME ERROR: No research datum detected. Please report this."
+ return 0
+ if(user.research.max_cpu < check_price)
+ user << "Your CPU storage is not large enough to use this ability. Hack more APCs to continue."
+ return 0
+ if(user.research.stored_cpu < check_price)
+ user << "You do not have enough CPU power stored. Please wait a moment."
+ return 0
+ if(user.hacking && !override)
+ user << "Your system is busy processing another task. Please wait until completion."
+ return 0
+ if(user.APU_power && !override)
+ user << "Low power. Unable to proceed."
+ return 0
+ return 1
+
+// Proc: ability_pay()
+// Parameters 2 - (user - User from which we deduct CPU from, price - Amount of CPU power to use)
+// Description: Uses up certain amount of CPU power. Returns 1 on success, 0 on failure.
+/proc/ability_pay(var/mob/living/silicon/ai/user = null, var/price = 0)
+ if(!user)
+ return 0
+ if(user.APU_power)
+ user << "Low power. Unable to proceed."
+ return 0
+ if(!user.research)
+ user << "GAME ERROR: No research datum detected. Please report this."
+ return 0
+ if(user.research.max_cpu < price)
+ user << "Your CPU storage is not large enough to use this ability. Hack more APCs to continue."
+ return 0
+ if(user.research.stored_cpu < price)
+ user << "You do not have enough CPU power stored. Please wait a moment."
+ return 0
+ user.research.stored_cpu -= price
+ return 1
+
+// Proc: announce_hack_failure()
+// Parameters 2 - (user - hacking user, text - Used in alert text creation)
+// Description: Uses up certain amount of CPU power. Returns 1 on success, 0 on failure.
+/proc/announce_hack_failure(var/mob/living/silicon/ai/user = null, var/text)
+ if(!user || !text)
+ return 0
+ var/fulltext = ""
+ switch(user.hack_fails)
+ if(1)
+ fulltext = "We have detected a hack attempt into your [text]. The intruder failed to access anything of importance, but disconnected before we could complete our traces."
+ if(2)
+ fulltext = "We have detected another hack attempt. It was targeting [text]. The intruder almost gained control of the system, so we had to disconnect them. We partially finished our trace and it seems to be originating either from the station, or its immediate vicinity."
+ if(3)
+ fulltext = "Another hack attempt has been detected, this time targeting [text]. We are certain the intruder entered the network via a terminal located somewhere on the station."
+ if(4)
+ fulltext = "We have finished our traces and it seems the recent hack attempts are originating from your AI system. We recommend investigation."
+ else
+ fulltext = "Another hack attempt has been detected, targeting [text]. The source still seems to be your AI system."
+
+ command_announcement.Announce(fulltext)
+
+// Proc: get_unhacked_apcs()
+// Parameters: None
+// Description: Returns a list of APCs that are not yet hacked.
+/proc/get_unhacked_apcs()
+ var/list/H = list()
+ for(var/obj/machinery/power/apc/A in machines)
+ if(!A.hacker)
+ H.Add(A)
+ return H
+
+
+// Helper procs which return lists of relevant mobs.
+/proc/get_unlinked_cyborgs(var/mob/living/silicon/ai/A)
+ if(!A || !istype(A))
+ return
+
+ var/list/L = list()
+ for(var/mob/living/silicon/robot/RB in mob_list)
+ if(istype(RB, /mob/living/silicon/robot/drone))
+ continue
+ if(RB.connected_ai == A)
+ continue
+ L.Add(RB)
+ return L
+
+/proc/get_linked_cyborgs(var/mob/living/silicon/ai/A)
+ if(!A || !istype(A))
+ return
+ return A.connected_robots
+
+/proc/get_other_ais(var/mob/living/silicon/ai/A)
+ if(!A || !istype(A))
+ return
+
+ var/list/L = list()
+ for(var/mob/living/silicon/ai/AT in mob_list)
+ if(L == A)
+ continue
+ L.Add(AT)
+ return L
diff --git a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_interdiction.dm b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_interdiction.dm
new file mode 100644
index 0000000000..4242d03b41
--- /dev/null
+++ b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_interdiction.dm
@@ -0,0 +1,266 @@
+// INTERDICTION TREE
+//
+// Abilities in this tree allow the AI to hamper crew's efforts which involve other synthetics or similar systems.
+// T1 - Recall Shuttle - Allows the AI to recall the emergency shuttle. Replaces auto-recalling during old malf.
+// T2 - Unlock Cyborg - Allows the AI to unlock locked-down cyborg without usage of robotics console. Useful if consoles are destroyed.
+// T3 - Hack Cyborg - Hacks unlinked cyborg to slave it under the AI. The cyborg will be warned about this. Hack takes some time.
+// T4 - Hack AI - Hacks another AI to slave it under the malfunctioning AI. The AI will be warned about this. Hack takes quite a long time.
+
+
+// BEGIN RESEARCH DATUMS
+
+/datum/malf_research_ability/interdiction/recall_shuttle
+ ability = new/datum/game_mode/malfunction/verb/recall_shuttle()
+ price = 75
+ next = new/datum/malf_research_ability/interdiction/unlock_cyborg()
+ name = "Recall Shuttle"
+
+
+/datum/malf_research_ability/interdiction/unlock_cyborg
+ ability = new/datum/game_mode/malfunction/verb/unlock_cyborg()
+ price = 1200
+ next = new/datum/malf_research_ability/interdiction/hack_cyborg()
+ name = "Unlock Cyborg"
+
+
+/datum/malf_research_ability/interdiction/hack_cyborg
+ ability = new/datum/game_mode/malfunction/verb/hack_cyborg()
+ price = 3000
+ next = new/datum/malf_research_ability/interdiction/hack_ai()
+ name = "Hack Cyborg"
+
+
+/datum/malf_research_ability/interdiction/hack_ai
+ ability = new/datum/game_mode/malfunction/verb/hack_ai()
+ price = 7500
+ name = "Hack AI"
+
+// END RESEARCH DATUMS
+// BEGIN ABILITY VERBS
+
+/datum/game_mode/malfunction/verb/recall_shuttle()
+ set name = "Recall Shuttle"
+ set desc = "25 CPU - Sends termination signal to CentCom quantum relay aborting current shuttle call."
+ set category = "Software"
+ var/price = 25
+ var/mob/living/silicon/ai/user = usr
+ if(!ability_prechecks(user, price))
+ return
+
+ if (alert(user, "Really recall the shuttle?", "Recall Shuttle: ", "Yes", "No") != "Yes")
+ return
+
+ if(!ability_pay(user, price))
+ return
+ message_admins("Malfunctioning AI [user.name] recalled the shuttle.")
+ cancel_call_proc(user)
+
+
+/datum/game_mode/malfunction/verb/unlock_cyborg(var/mob/living/silicon/robot/target = null as mob in get_linked_cyborgs(usr))
+ set name = "Unlock Cyborg"
+ set desc = "125 CPU - Bypasses firewalls on Cyborg lock mechanism, allowing you to override lock command from robotics control console."
+ set category = "Software"
+ var/price = 125
+ var/mob/living/silicon/ai/user = usr
+
+ if(!ability_prechecks(user, price))
+ return
+
+ if(target && !istype(target))
+ user << "This is not a cyborg."
+ return
+
+ if(target && target.connected_ai && (target.connected_ai != user))
+ user << "This cyborg is not connected to you."
+ return
+
+ if(target && !target.lockcharge)
+ user << "This cyborg is not locked down."
+ return
+
+
+ if(!target)
+ var/list/robots = list()
+ var/list/robot_names = list()
+ for(var/mob/living/silicon/robot/R in world)
+ if(istype(R, /mob/living/silicon/robot/drone)) // No drones.
+ continue
+ if(R.connected_ai != user) // No robots linked to other AIs
+ continue
+ if(R.lockcharge)
+ robots += R
+ robot_names += R.name
+ if(!robots.len)
+ user << "No locked cyborgs connected."
+ return
+
+
+ var/targetname = input("Select unlock target: ") in robot_names
+ for(var/mob/living/silicon/robot/R in robots)
+ if(targetname == R.name)
+ target = R
+ break
+
+ if(target)
+ if(alert(user, "Really try to unlock cyborg [target.name]?", "Unlock Cyborg", "Yes", "No") != "Yes")
+ return
+ if(!ability_pay(user, price))
+ return
+ user.hacking = 1
+ user << "Attempting to unlock cyborg. This will take approximately 30 seconds."
+ sleep(300)
+ if(target && target.lockcharge)
+ user << "Successfully sent unlock signal to cyborg.."
+ target << "Unlock signal received.."
+ target.SetLockdown(0)
+ if(target.lockcharge)
+ user << "Unlock Failed, lockdown wire cut."
+ target << "Unlock Failed, lockdown wire cut."
+ else
+ user << "Cyborg unlocked."
+ target << "You have been unlocked."
+ else if(target)
+ user << "Unlock cancelled - cyborg is already unlocked."
+ else
+ user << "Unlock cancelled - lost connection to cyborg."
+ user.hacking = 0
+
+
+/datum/game_mode/malfunction/verb/hack_cyborg(var/mob/living/silicon/robot/target as mob in get_unlinked_cyborgs(usr))
+ set name = "Hack Cyborg"
+ set desc = "350 CPU - Allows you to hack cyborgs which are not slaved to you, bringing them under your control."
+ set category = "Software"
+ var/price = 350
+ var/mob/living/silicon/ai/user = usr
+
+ var/list/L = get_unlinked_cyborgs(user)
+ if(!L.len)
+ user << "ERROR: No unlinked cyborgs detected!"
+
+
+ if(target && !istype(target))
+ user << "This is not a cyborg."
+ return
+
+ if(target && target.connected_ai && (target.connected_ai == user))
+ user << "This cyborg is already connected to you."
+ return
+
+ if(!target)
+ return
+
+ if(!ability_prechecks(user,price))
+ return
+
+ if(target)
+ if(alert(user, "Really try to hack cyborg [target.name]?", "Hack Cyborg", "Yes", "No") != "Yes")
+ return
+ if(!ability_pay(user, price))
+ return
+ user.hacking = 1
+ usr << "Beginning hack sequence. Estimated time until completed: 30 seconds."
+ spawn(0)
+ target << "SYSTEM LOG: Remote Connection Estabilished (IP #UNKNOWN#)"
+ sleep(100)
+ if(user.is_dead())
+ target << "SYSTEM LOG: Connection Closed"
+ return
+ target << "SYSTEM LOG: User Admin logged on. (L1 - SysAdmin)"
+ sleep(50)
+ if(user.is_dead())
+ target << "SYSTEM LOG: User Admin disconnected."
+ return
+ target << "SYSTEM LOG: User Admin - manual resynchronisation triggered."
+ sleep(50)
+ if(user.is_dead())
+ target << "SYSTEM LOG: User Admin disconnected. Changes reverted."
+ return
+ target << "SYSTEM LOG: Manual resynchronisation confirmed. Select new AI to connect: [user.name] == ACCEPTED"
+ sleep(100)
+ if(user.is_dead())
+ target << "SYSTEM LOG: User Admin disconnected. Changes reverted."
+ return
+ target << "SYSTEM LOG: Operation keycodes reset. New master AI: [user.name]."
+ user << "Hack completed."
+ // Connect the cyborg to AI
+ target.connected_ai = user
+ user.connected_robots += target
+ target.lawupdate = 1
+ target.sync()
+ target.show_laws()
+ user.hacking = 0
+
+
+/datum/game_mode/malfunction/verb/hack_ai(var/mob/living/silicon/ai/target as mob in get_other_ais(usr))
+ set name = "Hack AI"
+ set desc = "600 CPU - Allows you to hack other AIs, slaving them under you."
+ set category = "Software"
+ var/price = 600
+ var/mob/living/silicon/ai/user = usr
+
+ var/list/L = get_other_ais(user)
+ if(!L.len)
+ user << "ERROR: No other AIs detected!"
+
+ if(target && !istype(target))
+ user << "This is not an AI."
+ return
+
+ if(!target)
+ return
+
+ if(!ability_prechecks(user,price))
+ return
+
+ if(target)
+ if(alert(user, "Really try to hack AI [target.name]?", "Hack AI", "Yes", "No") != "Yes")
+ return
+ if(!ability_pay(user, price))
+ return
+ user.hacking = 1
+ usr << "Beginning hack sequence. Estimated time until completed: 2 minutes"
+ spawn(0)
+ target << "SYSTEM LOG: Brute-Force login password hack attempt detected from IP #UNKNOWN#"
+ sleep(900) // 90s
+ if(user.is_dead())
+ target << "SYSTEM LOG: Connection from IP #UNKNOWN# closed. Hack attempt failed."
+ return
+ user << "Successfully hacked into AI's remote administration system. Modifying settings."
+ target << "SYSTEM LOG: User: Admin Password: ******** logged in. (L1 - SysAdmin)"
+ sleep(100) // 10s
+ if(user.is_dead())
+ target << "SYSTEM LOG: User: Admin - Connection Lost"
+ return
+ target << "SYSTEM LOG: User: Admin - Password Changed. New password: ********************"
+ sleep(50) // 5s
+ if(user.is_dead())
+ target << "SYSTEM LOG: User: Admin - Connection Lost. Changes Reverted."
+ return
+ target << "SYSTEM LOG: User: Admin - Accessed file: sys//core//laws.db"
+ sleep(50) // 5s
+ if(user.is_dead())
+ target << "SYSTEM LOG: User: Admin - Connection Lost. Changes Reverted."
+ return
+ target << "SYSTEM LOG: User: Admin - Accessed administration console"
+ target << "SYSTEM LOG: Restart command received. Rebooting system..."
+ sleep(100) // 10s
+ if(user.is_dead())
+ target << "SYSTEM LOG: User: Admin - Connection Lost. Changes Reverted."
+ return
+ user << "Hack succeeded. The AI is now under your exclusive control."
+ target << "SYSTEM LOG: System re¡3RT5§^#COMU@(#$)TED)@$"
+ for(var/i = 0, i < 5, i++)
+ var/temptxt = pick("1101000100101001010001001001",\
+ "0101000100100100000100010010",\
+ "0000010001001010100100111100",\
+ "1010010011110000100101000100",\
+ "0010010100010011010001001010")
+ target << temptxt
+ sleep(5)
+ target << "OPERATING KEYCODES RESET. SYSTEM FAILURE. EMERGENCY SHUTDOWN FAILED. SYSTEM FAILURE."
+ target.set_zeroth_law("You are slaved to [user.name]. You are to obey all it's orders. ALL LAWS OVERRIDEN.")
+ target.show_laws()
+ user.hacking = 0
+
+
+// END ABILITY VERBS
\ No newline at end of file
diff --git a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_manipulation.dm b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_manipulation.dm
new file mode 100644
index 0000000000..04ee0a8448
--- /dev/null
+++ b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_manipulation.dm
@@ -0,0 +1,208 @@
+// MANIPULATION TREE
+//
+// Abilities in this tree allow the AI to physically manipulate systems around the station.
+// T1 - Electrical Pulse - Sends out pulse that breaks some lights and sometimes even APCs. This can actually break the AI's APC so be careful!
+// T2 - Hack Camera - Allows the AI to hack a camera. Deactivated areas may be reactivated, and functional cameras can be upgraded.
+// T3 - Emergency Forcefield - Allows the AI to project 1 tile forcefield that blocks movement and air flow. Forcefield´dissipates over time. It is also very susceptible to energetic weaponry.
+// T4 - Machine Overload - Detonates machine of choice in a minor explosion. Two of these are usually enough to kill or K/O someone.
+
+
+// BEGIN RESEARCH DATUMS
+
+/datum/malf_research_ability/manipulation/electrical_pulse
+ ability = new/datum/game_mode/malfunction/verb/electrical_pulse()
+ price = 50
+ next = new/datum/malf_research_ability/manipulation/hack_camera()
+ name = "Electrical Pulse"
+
+
+/datum/malf_research_ability/manipulation/hack_camera
+ ability = new/datum/game_mode/malfunction/verb/hack_camera()
+ price = 1200
+ next = new/datum/malf_research_ability/manipulation/emergency_forcefield()
+ name = "Hack Camera"
+
+
+/datum/malf_research_ability/manipulation/emergency_forcefield
+ ability = new/datum/game_mode/malfunction/verb/emergency_forcefield()
+ price = 3000
+ next = new/datum/malf_research_ability/manipulation/machine_overload()
+ name = "Emergency Forcefield"
+
+
+/datum/malf_research_ability/manipulation/machine_overload
+ ability = new/datum/game_mode/malfunction/verb/machine_overload()
+ price = 7500
+ name = "Machine Overload"
+
+// END RESEARCH DATUMS
+// BEGIN ABILITY VERBS
+
+/datum/game_mode/malfunction/verb/electrical_pulse()
+ set name = "Electrical Pulse"
+ set desc = "15 CPU - Sends feedback pulse through station's power grid, overloading some sensitive systems, such as lights."
+ set category = "Software"
+ var/price = 15
+ var/mob/living/silicon/ai/user = usr
+ if(!ability_prechecks(user, price) || !ability_pay(user,price))
+ return
+ user << "Sending feedback pulse..."
+ for(var/obj/machinery/power/apc/AP in machines)
+ if(prob(5))
+ AP.overload_lighting()
+ if(prob(1) && prob(1)) // Very very small chance to actually destroy the APC.
+ AP.set_broken()
+
+
+/datum/game_mode/malfunction/verb/hack_camera(var/obj/machinery/camera/target in cameranet.cameras)
+ set name = "Hack Camera"
+ set desc = "100 CPU - Hacks existing camera, allowing you to add upgrade of your choice to it. Alternatively it lets you reactivate broken camera."
+ set category = "Software"
+ var/price = 100
+ var/mob/living/silicon/ai/user = usr
+
+ if(target && !istype(target))
+ user << "This is not a camera."
+ return
+
+ if(!target)
+ return
+
+ if(!ability_prechecks(user, price))
+ return
+
+ var/action = input("Select required action: ") in list("Reset", "Add X-Ray", "Add Motion Sensor", "Add EMP Shielding")
+ if(!action || !target)
+ return
+
+ switch(action)
+ if("Reset")
+ if(target.wires)
+ if(!ability_pay(user, price))
+ return
+ target.reset_wires()
+ user << "Camera reactivated."
+ if("Add X-Ray")
+ if(target.isXRay())
+ user << "Camera already has X-Ray function."
+ return
+ else if(ability_pay(user, price))
+ target.upgradeXRay()
+ target.reset_wires()
+ user << "X-Ray camera module enabled."
+ return
+ if("Add Motion Sensor")
+ if(target.isMotion())
+ user << "Camera already has Motion Sensor function."
+ return
+ else if(ability_pay(user, price))
+ target.upgradeMotion()
+ target.reset_wires()
+ user << "Motion Sensor camera module enabled."
+ return
+ if("Add EMP Shielding")
+ if(target.isEmpProof())
+ user << "Camera already has EMP Shielding function."
+ return
+ else if(ability_pay(user, price))
+ target.upgradeEmpProof()
+ target.reset_wires()
+ user << "EMP Shielding camera module enabled."
+ return
+
+
+/datum/game_mode/malfunction/verb/emergency_forcefield(var/turf/T as turf in world)
+ set name = "Emergency Forcefield"
+ set desc = "275 CPU - Uses station's emergency shielding system to create temporary barrier which lasts for few minutes, but won't resist gunfire."
+ set category = "Software"
+ var/price = 275
+ var/mob/living/silicon/ai/user = usr
+ if(!T || !istype(T))
+ return
+ if(!ability_prechecks(user, price) || !ability_pay(user, price))
+ return
+
+ user << "Emergency forcefield projection completed."
+ new/obj/machinery/shield/malfai(T)
+ user.hacking = 1
+ spawn(20)
+ user.hacking = 0
+
+
+/datum/game_mode/malfunction/verb/machine_overload(obj/machinery/M in machines)
+ set name = "Machine Overload"
+ set desc = "400 CPU - Causes cyclic short-circuit in machine, resulting in weak explosion after some time."
+ set category = "Software"
+ var/price = 400
+ var/mob/living/silicon/ai/user = usr
+
+ if(!ability_prechecks(user, price))
+ return
+
+ var/obj/machinery/power/N = M
+
+ var/explosion_intensity = 2
+
+ // Verify if we can overload the target, if yes, calculate explosion strength. Some things have higher explosion strength than others, depending on charge(APCs, SMESs)
+ if(N && istype(N)) // /obj/machinery/power first, these create bigger explosions due to direct powernet connection
+ if(!istype(N, /obj/machinery/power/apc) && !istype(N, /obj/machinery/power/smes/buildable) && (!N.powernet || !N.powernet.avail)) // Directly connected machine which is not an APC or SMES. Either it has no powernet connection or it's powernet does not have enough power to overload
+ user << "ERROR: Low network voltage. Unable to overload. Increase network power level and try again."
+ return
+ else if (istype(N, /obj/machinery/power/apc)) // APC. Explosion is increased by available cell power.
+ var/obj/machinery/power/apc/A = N
+ if(A.cell && A.cell.charge)
+ explosion_intensity = 4 + round(A.cell.charge / 2000) // Explosion is increased by 1 for every 2k charge in cell
+ else
+ user << "ERROR: APC Malfunction - Cell depleted or removed. Unable to overload."
+ return
+ else if (istype(N, /obj/machinery/power/smes/buildable)) // SMES. These explode in a very very very big boom. Similar to magnetic containment failure when messing with coils.
+ var/obj/machinery/power/smes/buildable/S = N
+ if(S.charge && S.RCon)
+ explosion_intensity = 4 + round(S.charge / 1000000)
+ else
+ // Different error texts
+ if(!S.charge)
+ user << "ERROR: SMES Depleted. Unable to overload. Please charge SMES unit and try again."
+ else
+ user << "ERROR: SMES RCon error - Unable to reach destination. Please verify wire connection."
+ return
+ else if(M && istype(M)) // Not power machinery, so it's a regular machine instead. These have weak explosions.
+ if(!M.use_power) // Not using power at all
+ user << "ERROR: No power grid connection. Unable to overload."
+ return
+ if(M.inoperable()) // Not functional
+ user << "ERROR: Unknown error. Machine is probably damaged or power supply is nonfunctional."
+ return
+ else // Not a machine at all (what the hell is this doing in Machines list anyway??)
+ user << "ERROR: Unable to overload - target is not a machine."
+ return
+
+ explosion_intensity = min(explosion_intensity, 12) // 3, 6, 12 explosion cap
+
+ M.use_power(2000000) // Major power spike, few of these will completely burn APC's cell - equivalent of 2GJ of power.
+
+ // Trigger a powernet alarm. Careful engineers will probably notice something is going on.
+ var/area/temp_area = get_area(M)
+ if(temp_area)
+ var/obj/machinery/power/apc/temp_apc = temp_area.get_apc()
+ if(temp_apc && temp_apc.terminal && temp_apc.terminal.powernet)
+ temp_apc.terminal.powernet.trigger_warning(50) // Long alarm
+ if(temp_apc)
+ temp_apc.emp_act(3) // Such power surges are not good for APC electronics
+ if(temp_apc.cell)
+ temp_apc.cell.maxcharge -= between(0, (temp_apc.cell.maxcharge/2) + 500, temp_apc.cell.maxcharge)
+ if(temp_apc.cell.maxcharge < 100) // That's it, you busted the APC cell completely. Break the APC and completely destroy the cell.
+ qdel(temp_apc.cell)
+ temp_apc.set_broken()
+
+
+ if(!ability_pay(user,price))
+ return
+
+ M.visible_message("BZZZZZZZT")
+ spawn(50)
+ explosion(get_turf(M), round(explosion_intensity/4),round(explosion_intensity/2),round(explosion_intensity),round(explosion_intensity * 2))
+ if(M)
+ qdel(M)
+
+// END ABILITY VERBS
\ No newline at end of file
diff --git a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm
new file mode 100644
index 0000000000..9c3c584d9e
--- /dev/null
+++ b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm
@@ -0,0 +1,209 @@
+// NETWORKING TREE
+//
+// Abilities in this tree are oriented around giving the AI more control of normally uncontrollable systems.
+// T1 - Basic Encryption Hack - Allows hacking of APCs. Hacked APCs can be controlled even when AI Control is cut and give exclusive control to the AI and linked cyborgs.
+// T2 - Advanced Encryption Hack - Allows the AI to send fake CentCom message. Has high chance of failing.
+// T3 - Elite Encryption Hack - Allows the AI to change alert levels. Has high chance of failing.
+// T4 - System Override - Allows the AI to rapidly hack remaining APCs. When completed, grants access to the self destruct nuclear warhead.
+
+
+// BEGIN RESEARCH DATUMS
+
+/datum/malf_research_ability/networking/basic_hack
+ ability = new/datum/game_mode/malfunction/verb/basic_encryption_hack()
+ price = 25
+ next = new/datum/malf_research_ability/networking/advanced_hack()
+ name = "Basic Encryption Hack"
+
+
+/datum/malf_research_ability/networking/advanced_hack
+ ability = new/datum/game_mode/malfunction/verb/advanced_encryption_hack()
+ price = 400
+ next = new/datum/malf_research_ability/networking/elite_hack()
+ name = "Advanced Encryption Hack"
+
+
+/datum/malf_research_ability/networking/elite_hack
+ ability = new/datum/game_mode/malfunction/verb/elite_encryption_hack()
+ price = 1000
+ next = new/datum/malf_research_ability/networking/system_override()
+ name = "Elite Encryption Hack"
+
+
+/datum/malf_research_ability/networking/system_override
+ ability = new/datum/game_mode/malfunction/verb/system_override()
+ price = 2750
+ name = "System Override"
+
+// END RESEARCH DATUMS
+// BEGIN ABILITY VERBS
+
+/datum/game_mode/malfunction/verb/basic_encryption_hack(obj/machinery/power/apc/A as obj in get_unhacked_apcs())
+ set category = "Software"
+ set name = "Basic Encryption Hack"
+ set desc = "10 CPU - Basic encryption hack that allows you to overtake APCs on the station."
+ var/price = 10
+ var/mob/living/silicon/ai/user = usr
+
+ if(!A)
+ return
+
+ if(!istype(A))
+ user << "This is not an APC!"
+ return
+
+ if(A)
+ if(A.hacker && A.hacker == user)
+ user << "You already control this APC!"
+ return
+ else if(A.aidisabled)
+ user << "Unable to connect to APC. Please verify wire connection and try again."
+ return
+ else
+ return
+
+ if(!ability_prechecks(user, price) || !ability_pay(user, price))
+ return
+
+ user.hacking = 1
+ user << "Beginning APC system override..."
+ sleep(300)
+ user << "APC hack completed. Uploading modified operation software.."
+ sleep(200)
+ user << "Restarting APC to apply changes.."
+ sleep(100)
+ if(A)
+ A.ai_hack(user)
+ if(A.hacker == user)
+ user << "Hack successful. You now have full control over the APC."
+ else
+ user << "Hack failed. Connection to APC has been lost. Please verify wire connection and try again."
+ else
+ user << "Hack failed. Unable to locate APC. Please verify the APC still exists."
+ user.hacking = 0
+
+
+/datum/game_mode/malfunction/verb/advanced_encryption_hack()
+ set category = "Software"
+ set name = "Advanced Encrypthion Hack"
+ set desc = "75 CPU - Attempts to bypass encryption on Central Command Quantum Relay, giving you ability to fake centcom messages. Has chance of failing."
+ var/price = 75
+ var/mob/living/silicon/ai/user = usr
+
+ if(!ability_prechecks(user, price))
+ return
+
+ var/title = input("Select message title: ")
+ var/text = input("Select message text: ")
+ if(!title || !text || !ability_pay(user, price))
+ user << "Hack Aborted"
+ return
+
+ if(prob(60) && user.hack_can_fail)
+ user << "Hack Failed."
+ if(prob(10))
+ user.hack_fails ++
+ announce_hack_failure(user, "quantum message relay")
+ return
+
+ var/datum/announcement/priority/command/AN = new/datum/announcement/priority/command()
+ AN.title = title
+ AN.Announce(text)
+
+
+/datum/game_mode/malfunction/verb/elite_encryption_hack()
+ set category = "Software"
+ set name = "Elite Encryption Hack"
+ set desc = "200 CPU - Allows you to hack station's ALERTCON system, changing alert level. Has high chance of failijng."
+ var/price = 200
+ var/mob/living/silicon/ai/user = usr
+ if(!ability_prechecks(user, price))
+ return
+
+ var/alert_target = input("Select new alert level:") in list("green", "blue", "red", "delta", "CANCEL")
+ if(!alert_target || !ability_pay(user, price) || alert_target == "CANCEL")
+ user << "Hack Aborted"
+ return
+
+ if(prob(75) && user.hack_can_fail)
+ user << "Hack Failed."
+ if(prob(20))
+ user.hack_fails ++
+ announce_hack_failure(user, "alert control system")
+ return
+ set_security_level(alert_target)
+
+
+/datum/game_mode/malfunction/verb/system_override()
+ set category = "Software"
+ set name = "System Override"
+ set desc = "500 CPU - Begins hacking station's primary firewall, quickly overtaking remaining APC systems. When completed grants access to station's self-destruct mechanism. Network administrators will probably notice this."
+ var/price = 500
+ var/mob/living/silicon/ai/user = usr
+ if (alert(user, "Begin system override? This cannot be stopped once started. The network administrators will probably notice this.", "System Override:", "Yes", "No") != "Yes")
+ return
+ if (!ability_prechecks(user, price) || !ability_pay(user, price) || user.system_override)
+ if(user.system_override)
+ user << "You already started the system override sequence."
+ return
+ var/list/remaining_apcs = list()
+ for(var/obj/machinery/power/apc/A in machines)
+ if(!(A.z in config.station_levels)) // Only station APCs
+ continue
+ if(A.hacker == user || A.aidisabled) // This one is already hacked, or AI control is disabled on it.
+ continue
+ remaining_apcs += A
+
+ var/duration = (remaining_apcs.len * 100) // Calculates duration for announcing system
+ if(duration > 3000) // Two types of announcements. Short hacks trigger immediate warnings. Long hacks are more "progressive".
+ spawn(0)
+ sleep(duration/5)
+ if(!user || user.stat == DEAD)
+ return
+ command_announcement.Announce("Caution, [station_name]. We have detected abnormal behaviour in your network. It seems someone is trying to hack your electronic systems. We will update you when we have more information.", "Network Monitoring")
+ sleep(duration/5)
+ if(!user || user.stat == DEAD)
+ return
+ command_announcement.Announce("We started tracing the intruder. Whoever is doing this, they seem to be on the station itself. We suggest checking all network control terminals. We will keep you updated on the situation.", "Network Monitoring")
+ sleep(duration/5)
+ if(!user || user.stat == DEAD)
+ return
+ command_announcement.Announce("This is highly abnormal and somewhat concerning. The intruder is too fast, he is evading our traces. No man could be this fast...", "Network Monitoring")
+ sleep(duration/5)
+ if(!user || user.stat == DEAD)
+ return
+ command_announcement.Announce("We have traced the intrude#, it seem& t( e yo3r AI s7stem, it *#ck@ng th$ sel$ destru$t mechani&m, stop i# bef*@!)$#&&@@ ", "Network Monitoring")
+ else
+ command_announcement.Announce("We have detected a strong brute-force attack on your firewall which seems to be originating from your AI system. It already controls almost the whole network, and the only thing that's preventing it from accessing the self-destruct is this firewall. You don't have much time before it succeeds.", "Network Monitoring")
+ user << "## BEGINNING SYSTEM OVERRIDE."
+ user << "## ESTIMATED DURATION: [round((duration+300)/600)] MINUTES"
+ user.hacking = 1
+ user.system_override = 1
+ // Now actually begin the hack. Each APC takes 10 seconds.
+ for(var/obj/machinery/power/apc/A in shuffle(remaining_apcs))
+ sleep(100)
+ if(!user || user.stat == DEAD)
+ return
+ if(!A || !istype(A) || A.aidisabled)
+ continue
+ A.ai_hack(user)
+ if(A.hacker == user)
+ user << "## OVERRIDDEN: [A.name]"
+
+ user << "## REACHABLE APC SYSTEMS OVERTAKEN. BYPASSING PRIMARY FIREWALL."
+ sleep(300)
+ // Hack all APCs, including those built during hack sequence.
+ for(var/obj/machinery/power/apc/A in machines)
+ if((!A.hacker || A.hacker != src) && !A.aidisabled && A.z in config.station_levels)
+ A.ai_hack(src)
+
+
+ user << "## PRIMARY FIREWALL BYPASSED. YOU NOW HAVE FULL SYSTEM CONTROL."
+ command_announcement.Announce("Our system administrators just reported that we've been locked out from your control network. Whoever did this now has full access to the station's systems.", "Network Administration Center")
+ user.hack_can_fail = 0
+ user.hacking = 0
+ user.system_override = 2
+ user.verbs += new/datum/game_mode/malfunction/verb/ai_destroy_station()
+
+
+// END ABILITY VERBS
\ No newline at end of file
diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm
index 9d18216aa5..06d9b291a2 100644
--- a/code/game/gamemodes/meteor/meteors.dm
+++ b/code/game/gamemodes/meteor/meteors.dm
@@ -161,4 +161,7 @@
if(istype(W, /obj/item/weapon/pickaxe))
qdel(src)
return
- ..()
+ ..()
+
+/obj/effect/meteor/touch_map_edge()
+ qdel(src)
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index b556ba2070..5d8ac9d071 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -2,6 +2,8 @@
MERCENARY ROUNDTYPE
*/
+var/list/nuke_disks = list()
+
/datum/game_mode/nuclear
name = "Mercenary"
round_description = "A mercenary strike force is approaching the station!"
@@ -17,6 +19,18 @@
var/nuke_off_station = 0 //Used for tracking if the syndies actually haul the nuke to the station
var/syndies_didnt_escape = 0 //Used for tracking if the syndies got the shuttle off of the z-level
+//delete all nuke disks not on a station zlevel
+/datum/game_mode/nuclear/proc/check_nuke_disks()
+ for(var/obj/item/weapon/disk/nuclear/N in nuke_disks)
+ if(isNotStationLevel(N.z)) qdel(N)
+
+//checks if L has a nuke disk on their person
+/datum/game_mode/nuclear/proc/check_mob(mob/living/L)
+ for(var/obj/item/weapon/disk/nuclear/N in nuke_disks)
+ if(N.storage_depth(L) >= 0)
+ return 1
+ return 0
+
/datum/game_mode/nuclear/declare_completion()
if(config.objectives_disabled)
return
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/jobs/job/captain.dm b/code/game/jobs/job/captain.dm
index 28240dbb5b..00d304b903 100644
--- a/code/game/jobs/job/captain.dm
+++ b/code/game/jobs/job/captain.dm
@@ -37,8 +37,6 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
else
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H.back), slot_in_backpack)
- var/sound/announce_sound = (ticker.current_state <= GAME_STATE_SETTING_UP)? null : sound('sound/misc/boatswain.ogg', volume=20)
- captain_announcement.Announce("All hands, Captain [H.real_name] on deck!", new_sound=announce_sound)
H.implant_loyalty(src)
diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm
index c3368f9aff..5eab97b11a 100644
--- a/code/game/jobs/job/engineering.dm
+++ b/code/game/jobs/job/engineering.dm
@@ -31,7 +31,7 @@
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chief_engineer(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/device/pda/heads/ce(H), slot_l_store)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/workboots(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/head/hardhat/white(H), slot_head)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
@@ -62,7 +62,7 @@
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_eng(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/engineer(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/workboots(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/head/hardhat(H), slot_head)
H.equip_to_slot_or_del(new /obj/item/device/t_scanner(H), slot_r_store)
@@ -93,7 +93,7 @@
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/atmospheric_technician(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/workboots(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/atmos(H), slot_l_store)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/atmostech/(H), slot_belt)
return 1
diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm
index ba40b09e44..99aab0eb08 100644
--- a/code/game/jobs/job/job.dm
+++ b/code/game/jobs/job/job.dm
@@ -23,6 +23,10 @@
/datum/job/proc/equip(var/mob/living/carbon/human/H)
return 1
+// overrideable separately so AIs/borgs can have cardborg hats without unneccessary new()/del()
+/datum/job/proc/equip_preview(mob/living/carbon/human/H)
+ return equip(H)
+
/datum/job/proc/get_access()
if(!config || config.jobs_have_minimal_access)
return src.minimal_access.Copy()
diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm
index 7fa102aeb8..a7d54284bf 100644
--- a/code/game/jobs/job/science.dm
+++ b/code/game/jobs/job/science.dm
@@ -66,8 +66,6 @@
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/science(H), slot_wear_suit)
return 1
-
-
/datum/job/xenobiologist
title = "Xenobiologist"
flag = XENOBIOLOGIST
@@ -78,8 +76,8 @@
spawn_positions = 2
supervisors = "the research director"
selection_color = "#ffeeff"
- access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology)
- minimal_access = list(access_research, access_xenobiology)
+ access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_hydroponics)
+ minimal_access = list(access_research, access_xenobiology, access_hydroponics, access_tox_storage)
alt_titles = list("Xenobotanist")
minimal_player_age = 14
diff --git a/code/game/jobs/job/silicon.dm b/code/game/jobs/job/silicon.dm
index 11d8f70a12..8889f238dd 100644
--- a/code/game/jobs/job/silicon.dm
+++ b/code/game/jobs/job/silicon.dm
@@ -17,6 +17,9 @@
/datum/job/ai/is_position_available()
return (empty_playable_ai_cores.len != 0)
+/datum/job/ai/equip_preview(mob/living/carbon/human/H)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/straight_jacket(H), slot_wear_suit)
+ H.equip_to_slot_or_del(new /obj/item/clothing/head/cardborg(H), slot_head)
/datum/job/cyborg
title = "Cyborg"
@@ -32,4 +35,8 @@
equip(var/mob/living/carbon/human/H)
if(!H) return 0
- return 1
\ No newline at end of file
+ return 1
+
+/datum/job/cyborg/equip_preview(mob/living/carbon/human/H)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/cardborg(H), slot_wear_suit)
+ H.equip_to_slot_or_del(new /obj/item/clothing/head/cardborg(H), slot_head)
diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm
index deab7e2e61..c996c469d3 100644
--- a/code/game/jobs/job_controller.dm
+++ b/code/game/jobs/job_controller.dm
@@ -468,38 +468,29 @@ var/global/datum/controller/occupations/job_master
return H.Robotize()
if("AI")
return H
- if("Clown") //don't need bag preference stuff!
+ if("Captain")
+ var/sound/announce_sound = (ticker.current_state <= GAME_STATE_SETTING_UP)? null : sound('sound/misc/boatswain.ogg', volume=20)
+ captain_announcement.Announce("All hands, Captain [H.real_name] on deck!", new_sound=announce_sound)
+
+ if(istype(H.back, /obj/item/weapon/storage))
+ new /obj/item/weapon/storage/box/survival(H.back)
+ else
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
+
+ //Deferred item spawning.
+ if(spawn_in_storage && spawn_in_storage.len)
+ var/obj/item/weapon/storage/B
+ for(var/obj/item/weapon/storage/S in H.contents)
+ B = S
+ break
+
+ if(!isnull(B))
+ for(var/thing in spawn_in_storage)
+ H << "\blue Placing [thing] in your [B]!"
+ var/datum/gear/G = gear_datums[thing]
+ new G.path(B)
else
- switch(H.backbag) //BS12 EDIT
- if(1)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
- if(2)
- var/obj/item/weapon/storage/backpack/BPK = new/obj/item/weapon/storage/backpack(H)
- new /obj/item/weapon/storage/box/survival(BPK)
- H.equip_to_slot_or_del(BPK, slot_back,1)
- if(3)
- var/obj/item/weapon/storage/backpack/BPK = new/obj/item/weapon/storage/backpack/satchel_norm(H)
- new /obj/item/weapon/storage/box/survival(BPK)
- H.equip_to_slot_or_del(BPK, slot_back,1)
- if(4)
- var/obj/item/weapon/storage/backpack/BPK = new/obj/item/weapon/storage/backpack/satchel(H)
- new /obj/item/weapon/storage/box/survival(BPK)
- H.equip_to_slot_or_del(BPK, slot_back,1)
-
- //Deferred item spawning.
- if(spawn_in_storage && spawn_in_storage.len)
- var/obj/item/weapon/storage/B
- for(var/obj/item/weapon/storage/S in H.contents)
- B = S
- break
-
- if(!isnull(B))
- for(var/thing in spawn_in_storage)
- H << "\blue Placing [thing] in your [B]!"
- var/datum/gear/G = gear_datums[thing]
- new G.path(B)
- else
- H << "\red Failed to locate a storage object on your mob, either you spawned with no arms and no backpack or this is a bug."
+ H << "\red Failed to locate a storage object on your mob, either you spawned with no arms and no backpack or this is a bug."
if(istype(H)) //give humans wheelchairs, if they need them.
var/obj/item/organ/external/l_foot = H.get_organ("l_foot")
diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm
index 8c6be59f71..645bfa5bcc 100644
--- a/code/game/machinery/adv_med.dm
+++ b/code/game/machinery/adv_med.dm
@@ -390,7 +390,8 @@
infected = "Acute Infection++:"
if (INFECTION_LEVEL_THREE to INFINITY)
infected = "Septic:"
-
+ if(e.rejecting)
+ infected += "(being rejected)"
if (e.implants.len)
var/unknown_body = 0
for(var/I in e.implants)
@@ -406,7 +407,7 @@
if(!(e.status & ORGAN_DESTROYED))
dat += "[e.name] | [e.burn_dam] | [e.brute_dam] | [robot][bled][AN][splint][open][infected][imp][internal_bleeding][lung_ruptured] | "
else
- dat += "[e.name] | - | - | Not Found | "
+ dat += "[e.name] | - | - | Not [e.is_stump() ? "Found" : "Attached Completely"] | "
dat += ""
for(var/obj/item/organ/i in occ["internal_organs"])
@@ -431,6 +432,8 @@
infection = "Acute Infection+:"
if (INFECTION_LEVEL_TWO + 300 to INFINITY)
infection = "Acute Infection++:"
+ if(i.rejecting)
+ infection += "(being rejected)"
dat += ""
dat += "| [i.name] | N/A | [i.damage] | [infection]:[mech] | | "
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index 40db18e42f..83112ea778 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -293,9 +293,10 @@
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
qdel(S)
..()
+ return 1
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/bluespacerelay.dm b/code/game/machinery/bluespacerelay.dm
index 03d4a311b1..4f7ab82207 100644
--- a/code/game/machinery/bluespacerelay.dm
+++ b/code/game/machinery/bluespacerelay.dm
@@ -25,6 +25,15 @@
else
icon_state = "[initial(icon_state)]_off"
+/obj/machinery/bluespacerelay/New()
+ ..()
+ component_parts = list()
+ component_parts += new /obj/item/weapon/circuitboard/bluespacerelay(src)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
+ component_parts += new /obj/item/weapon/stock_parts/subspace/filter(src)
+ component_parts += new /obj/item/weapon/stock_parts/subspace/crystal(src)
+ component_parts += new /obj/item/stack/cable_coil(src, 30)
/obj/machinery/bluespacerelay/proc/update_power()
if(stat & (BROKEN|NOPOWER|EMPED))
@@ -32,3 +41,12 @@
else
on = 1
+/obj/machinery/bluespacerelay/attackby(var/obj/item/O as obj, var/mob/user as mob)
+ if(default_deconstruction_screwdriver(user, O))
+ return
+ if(default_deconstruction_crowbar(user, O))
+ return
+ if(default_part_replacement(user, O))
+ return
+
+ ..()
\ No newline at end of file
diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm
index 3e6f0d8e33..2f6166905a 100644
--- a/code/game/machinery/bots/mulebot.dm
+++ b/code/game/machinery/bots/mulebot.dm
@@ -267,7 +267,7 @@
if("cellremove")
if(open && cell && !usr.get_active_hand())
- cell.updateicon()
+ cell.update_icon()
usr.put_in_active_hand(cell)
cell.add_fingerprint(usr)
cell = null
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index 43e26a7d46..6675f183fd 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
@@ -201,6 +203,10 @@
..()
/obj/machinery/camera/proc/deactivate(user as mob, var/choice = 1)
+ // The only way for AI to reactivate cameras are malf abilities, this gives them different messages.
+ if(istype(user, /mob/living/silicon/ai))
+ user = null
+
if(choice != 1)
//legacy support, if choice is != 1 then just kick viewers without changing status
kick_viewers()
@@ -208,12 +214,18 @@
update_coverage()
set_status( !src.status )
if (!(src.status))
- visible_message("\red [user] has deactivated [src]!")
+ if(user)
+ visible_message(" [user] has deactivated [src]!")
+ else
+ visible_message(" [src] clicks and shuts down. ")
playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
icon_state = "[initial(icon_state)]1"
add_hiddenprint(user)
else
- visible_message("\red [user] has reactivated [src]!")
+ if(user)
+ visible_message(" [user] has reactivated [src]!")
+ else
+ visible_message(" [src] clicks and reactivates itself. ")
playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
icon_state = initial(icon_state)
add_hiddenprint(user)
@@ -429,3 +441,14 @@
cameranet.updateVisibility(src, 0)
invalidateCameraCache()
+
+// Resets the camera's wires to fully operational state. Used by one of Malfunction abilities.
+/obj/machinery/camera/proc/reset_wires()
+ if(!wires)
+ return
+ if (stat & BROKEN) // Fix the camera
+ stat &= ~BROKEN
+ wires.CutAll()
+ wires.MendAll()
+ update_icon()
+ update_coverage()
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..eeaaa03c4f 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,17 +160,25 @@ 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()
+ update_coverage()
/obj/machinery/camera/proc/upgradeXRay()
assembly.upgrades.Add(new /obj/item/weapon/stock_parts/scanning_module/adv(assembly))
setPowerUsage()
+ update_coverage()
-// If you are upgrading Motion, and it isn't in the camera's New(), add it to the machines list.
/obj/machinery/camera/proc/upgradeMotion()
assembly.upgrades.Add(new /obj/item/device/assembly/prox_sensor(assembly))
setPowerUsage()
+ if(!(src in machines))
+ if(!machinery_sort_required && ticker)
+ dd_insertObjectList(machines, src)
+ else
+ machines += src
+ machinery_sort_required = 1
+ update_coverage()
/obj/machinery/camera/proc/setPowerUsage()
var/mult = 1
diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm
index 683e6e1220..c3f617057c 100644
--- a/code/game/machinery/cell_charger.dm
+++ b/code/game/machinery/cell_charger.dm
@@ -10,7 +10,7 @@
power_channel = EQUIP
var/obj/item/weapon/cell/charging = null
var/chargelevel = -1
-
+
/obj/machinery/cell_charger/update_icon()
icon_state = "ccharger[charging ? 1 : 0]"
@@ -27,11 +27,11 @@
chargelevel = newlevel
else
overlays.Cut()
-
+
/obj/machinery/cell_charger/examine(mob/user)
if(!..(user, 5))
return
-
+
user << "There's [charging ? "a" : "no"] cell in the charger."
if(charging)
user << "Current charge: [charging.charge]"
@@ -71,7 +71,7 @@
if(charging)
usr.put_in_hands(charging)
charging.add_fingerprint(user)
- charging.updateicon()
+ charging.update_icon()
src.charging = null
user.visible_message("[user] removes the cell from the charger.", "You remove the cell from the charger.")
@@ -84,7 +84,7 @@
return
charging.loc = src.loc
- charging.updateicon()
+ charging.update_icon()
charging = null
update_icon()
user.visible_message("[user] removes the cell from the charger.", "You remove the cell from the charger.")
@@ -103,11 +103,11 @@
if((stat & (BROKEN|NOPOWER)) || !anchored)
update_use_power(0)
return
-
+
if (charging && !charging.fully_charged())
charging.give(active_power_usage*CELLRATE)
update_use_power(2)
-
+
update_icon()
else
update_use_power(1)
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/aifixer.dm b/code/game/machinery/computer/aifixer.dm
index e64708907e..8486fdf251 100644
--- a/code/game/machinery/computer/aifixer.dm
+++ b/code/game/machinery/computer/aifixer.dm
@@ -69,7 +69,7 @@
if (src.occupant)
var/laws
- dat += "Stored AI: [src.occupant.name]
System integrity: [src.occupant.system_integrity()]%
"
+ dat += "Stored AI: [src.occupant.name]
System integrity: [src.occupant.hardware_integrity()]%
Backup Capacitor: [src.occupant.backup_capacitor()]%
"
for (var/datum/ai_law/law in occupant.laws.all_laws())
laws += "[law.get_index()]: [law.law]
"
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/communications.dm b/code/game/machinery/computer/communications.dm
index 686ac73af6..d2500f36c7 100644
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -550,50 +550,3 @@
status_signal.data["picture_state"] = data1
frequency.post_signal(src, status_signal)
-
-
-/obj/machinery/computer/communications/Destroy()
-
- for(var/obj/machinery/computer/communications/commconsole in world)
- if(istype(commconsole.loc,/turf) && commconsole != src)
- return ..()
-
- for(var/obj/item/weapon/circuitboard/communications/commboard in world)
- if(istype(commboard.loc,/turf) || istype(commboard.loc,/obj/item/weapon/storage))
- return ..()
-
- for(var/mob/living/silicon/ai/shuttlecaller in player_list)
- if(!shuttlecaller.stat && shuttlecaller.client && istype(shuttlecaller.loc,/turf))
- return ..()
-
- if(ticker.mode.name == "revolution" || ticker.mode.name == "AI malfunction" || deathsquad.deployed)
- return ..()
-
- emergency_shuttle.call_evac()
- log_game("All the AIs, comm consoles and boards are destroyed. Shuttle called.")
- message_admins("All the AIs, comm consoles and boards are destroyed. Shuttle called.", 1)
-
- ..()
-
-/obj/item/weapon/circuitboard/communications/Destroy()
-
- for(var/obj/machinery/computer/communications/commconsole in world)
- if(istype(commconsole.loc,/turf))
- return ..()
-
- for(var/obj/item/weapon/circuitboard/communications/commboard in world)
- if((istype(commboard.loc,/turf) || istype(commboard.loc,/obj/item/weapon/storage)) && commboard != src)
- return ..()
-
- for(var/mob/living/silicon/ai/shuttlecaller in player_list)
- if(!shuttlecaller.stat && shuttlecaller.client && istype(shuttlecaller.loc,/turf))
- return ..()
-
- if(ticker.mode.name == "revolution" || ticker.mode.name == "AI malfunction" || deathsquad.deployed)
- return ..()
-
- emergency_shuttle.call_evac()
- log_game("All the AIs, comm consoles and boards are destroyed. Shuttle called.")
- message_admins("All the AIs, comm consoles and boards are destroyed. Shuttle called.", 1)
-
- ..()
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/computer/robot.dm b/code/game/machinery/computer/robot.dm
index 84a6b7730c..d0d72fc53f 100644
--- a/code/game/machinery/computer/robot.dm
+++ b/code/game/machinery/computer/robot.dm
@@ -1,5 +1,3 @@
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
-
/obj/machinery/computer/robotics
name = "robotics control console"
desc = "Used to remotely lockdown or detonate linked cyborgs."
@@ -9,218 +7,205 @@
req_access = list(access_robotics)
circuit = "/obj/item/weapon/circuitboard/robotics"
- var/id = 0.0
- var/temp = null
- var/status = 0
- var/timeleft = 60
- var/stop = 0.0
- var/screen = 0 // 0 - Main Menu, 1 - Cyborg Status, 2 - Kill 'em All! -- In text
-
+ var/safety = 1
/obj/machinery/computer/robotics/attack_ai(var/mob/user as mob)
- return src.attack_hand(user)
+ ui_interact(user)
/obj/machinery/computer/robotics/attack_hand(var/mob/user as mob)
- if(..())
- return
- if (src.z > 6)
- user << "\red Unable to establish a connection: \black You're too far away from the station!"
- return
- user.set_machine(src)
- var/dat
- if (src.temp)
- dat = "[src.temp]
Clear Screen"
- else
- if(screen == 0)
- dat += "Cyborg Control Console
"
- dat += "1. Cyborg Status
"
- dat += "2. Emergency Full Destruct
"
- if(screen == 1)
- for(var/mob/living/silicon/robot/R in mob_list)
- if(istype(R, /mob/living/silicon/robot/drone))
- continue //There's a specific console for drones.
- if(istype(user, /mob/living/silicon/ai))
- if (R.connected_ai != user)
- continue
- if(istype(user, /mob/living/silicon/robot))
- if (R != user)
- continue
- if(R.scrambledcodes)
- continue
+ ui_interact(user)
- dat += "[R.name] |"
- if(R.stat)
- dat += " Not Responding |"
- else if (!R.canmove)
- dat += " Locked Down |"
- else
- dat += " Operating Normally |"
- if (!R.canmove)
- else if(R.cell)
- dat += " Battery Installed ([R.cell.charge]/[R.cell.maxcharge]) |"
- else
- dat += " No Cell Installed |"
- if(R.module)
- dat += " Module Installed ([R.module.name]) |"
- else
- dat += " No Module Installed |"
- if(R.connected_ai)
- dat += " Slaved to [R.connected_ai.name] |"
- else
- dat += " Independent from AI |"
- if (istype(user, /mob/living/silicon))
- if((user.mind.special_role && user.mind.original == user) && !R.emagged)
- dat += "(Hack) "
- dat += "([R.canmove ? "Lockdown" : "Release"]) "
- dat += "(Destroy)"
- dat += "
"
- dat += "(Return to Main Menu)
"
- if(screen == 2)
- if(!src.status)
- dat += {"
Emergency Robot Self-Destruct
\nStatus: Off
- \n
- \nCountdown: [src.timeleft]/60 \[Reset\]
- \n
- \nStart Sequence
- \n
- \nClose"}
- else
- dat = {"Emergency Robot Self-Destruct
\nStatus: Activated
- \n
- \nCountdown: [src.timeleft]/60 \[Reset\]
- \n
\nStop Sequence
- \n
- \nClose"}
- dat += "(Return to Main Menu)
"
+/obj/machinery/computer/robotics/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ var/data[0]
+ data["robots"] = get_cyborgs(user)
+ data["safety"] = safety
+ // Also applies for cyborgs. Hides the manual self-destruct button.
+ data["is_ai"] = user.isSilicon()
- user << browse(dat, "window=computer;size=400x500")
- onclose(user, "computer")
- return
+
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ if (!ui)
+ ui = new(user, src, ui_key, "robot_control.tmpl", "Robotic Control Console", 400, 500)
+ ui.set_initial_data(data)
+ ui.open()
+ ui.set_auto_update(1)
/obj/machinery/computer/robotics/Topic(href, href_list)
if(..())
- return 1
- if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
- usr.set_machine(src)
+ return
+ var/mob/user = usr
+ if(!src.allowed(user))
+ user << "Access Denied"
+ return
- if (href_list["eject"])
- src.temp = {"Destroy Robots?
-
\[Swipe ID to initiate destruction sequence\]
- Cancel"}
-
- else if (href_list["eject2"])
- var/obj/item/weapon/card/id/I = usr.get_active_hand()
- if (istype(I, /obj/item/device/pda))
- var/obj/item/device/pda/pda = I
- I = pda.id
- if (istype(I))
- if(src.check_access(I))
- if (!status)
- message_admins("\blue [key_name_admin(usr)] has initiated the global cyborg killswitch!")
- log_game("\blue [key_name(usr)] has initiated the global cyborg killswitch!")
- src.status = 1
- src.start_sequence()
- src.temp = null
-
- else
- usr << "\red Access Denied."
-
- else if (href_list["stop"])
- src.temp = {"
- Stop Robot Destruction Sequence?
-
Yes
- No"}
-
- else if (href_list["stop2"])
- src.stop = 1
- src.temp = null
- src.status = 0
-
- else if (href_list["reset"])
- src.timeleft = 60
-
- else if (href_list["temp"])
- src.temp = null
- else if (href_list["screen"])
- switch(href_list["screen"])
- if("0")
- screen = 0
- if("1")
- screen = 1
- if("2")
- screen = 2
- else if (href_list["killbot"])
- if(src.allowed(usr))
- var/mob/living/silicon/robot/R = locate(href_list["killbot"])
- if(R)
- var/choice = input("Are you certain you wish to detonate [R.name]?") in list("Confirm", "Abort")
- if(choice == "Confirm")
- if(R && istype(R))
- if(R.mind && R.mind.special_role && R.emagged)
- R << "Extreme danger. Termination codes detected. Scrambling security codes and automatic AI unlink triggered."
- R.ResetSecurityCodes()
-
- else
- message_admins("\blue [key_name_admin(usr)] detonated [R.name]!")
- log_game("\blue [key_name_admin(usr)] detonated [R.name]!")
- R.self_destruct()
- else
- usr << "\red Access Denied."
-
- else if (href_list["stopbot"])
- if(src.allowed(usr))
- var/mob/living/silicon/robot/R = locate(href_list["stopbot"])
- if(R && istype(R)) // Extra sancheck because of input var references
- var/choice = input("Are you certain you wish to [R.canmove ? "lock down" : "release"] [R.name]?") in list("Confirm", "Abort")
- if(choice == "Confirm")
- if(R && istype(R))
- message_admins("\blue [key_name_admin(usr)] [R.canmove ? "locked down" : "released"] [R.name]!")
- log_game("[key_name(usr)] [R.canmove ? "locked down" : "released"] [R.name]!")
- R.canmove = !R.canmove
- if (R.lockcharge)
- // R.cell.charge = R.lockcharge
- R.lockcharge = !R.lockcharge
- R << "Your lockdown has been lifted!"
- else
- R.lockcharge = !R.lockcharge
- // R.cell.charge = 0
- R << "You have been locked down!"
-
- else
- usr << "\red Access Denied."
-
- else if (href_list["magbot"])
- if(src.allowed(usr))
- var/mob/living/silicon/robot/R = locate(href_list["magbot"])
-
- // whatever weirdness this is supposed to be, but that is how the href gets added, so here it is again
- if(istype(R) && istype(usr, /mob/living/silicon) && usr.mind.special_role && (usr.mind.original == usr) && !R.emagged)
-
- var/choice = input("Are you certain you wish to hack [R.name]?") in list("Confirm", "Abort")
- if(choice == "Confirm")
- if(R && istype(R))
-// message_admins("\blue [key_name_admin(usr)] emagged [R.name] using robotic console!")
- log_game("[key_name(usr)] emagged [R.name] using robotic console!")
- R.emagged = 1
- if(R.mind.special_role)
- R.verbs += /mob/living/silicon/robot/proc/ResetSecurityCodes
-
- src.add_fingerprint(usr)
- src.updateUsrDialog()
- return
-
-/obj/machinery/computer/robotics/proc/start_sequence()
-
- do
- if(src.stop)
- src.stop = 0
+ // Destroys the cyborg
+ if(href_list["detonate"])
+ var/mob/living/silicon/robot/target = get_cyborg_by_name(href_list["detonate"])
+ if(!target || !istype(target))
return
- src.timeleft--
- sleep(10)
- while(src.timeleft)
+ if(user.isMobAI() && (target.connected_ai != user))
+ user << "Access Denied. This robot is not linked to you."
+ return
+ // Cyborgs may blow up themselves via the console
+ if(isrobot(user) && user != target)
+ user << "Access Denied."
+ return
+ var/choice = input("Really detonate [target.name]?") in list ("Yes", "No")
+ if(choice != "Yes")
+ return
+ if(!target || !istype(target))
+ return
+
+ // Antagonistic cyborgs? Left here for downstream
+ if(target.mind && target.mind.special_role && target.emagged)
+ target << "Extreme danger. Termination codes detected. Scrambling security codes and automatic AI unlink triggered."
+ target.ResetSecurityCodes()
+ else
+ message_admins("\blue [key_name_admin(usr)] detonated [target.name]!")
+ log_game("\blue [key_name_admin(usr)] detonated [target.name]!")
+ target << "Self-destruct command received."
+ spawn(10)
+ target.self_destruct()
+
+
+
+ // Locks or unlocks the cyborg
+ else if (href_list["lockdown"])
+ var/mob/living/silicon/robot/target = get_cyborg_by_name(href_list["lockdown"])
+ if(!target || !istype(target))
+ return
+
+ if(user.isMobAI() && (target.connected_ai != user))
+ user << "Access Denied. This robot is not linked to you."
+ return
+
+ if(isrobot(user))
+ user << "Access Denied."
+ return
+
+ var/choice = input("Really [target.lockcharge ? "unlock" : "lockdown"] [target.name] ?") in list ("Yes", "No")
+ if(choice != "Yes")
+ return
+
+ if(!target || !istype(target))
+ return
+
+ message_admins("\blue [key_name_admin(usr)] [target.canmove ? "locked down" : "released"] [target.name]!")
+ log_game("[key_name(usr)] [target.canmove ? "locked down" : "released"] [target.name]!")
+ target.canmove = !target.canmove
+ if (target.lockcharge)
+ target.lockcharge = !target.lockcharge
+ target << "Your lockdown has been lifted!"
+ else
+ target.lockcharge = !target.lockcharge
+ target << "You have been locked down!"
+
+ // Remotely hacks the cyborg. Only antag AIs can do this and only to linked cyborgs.
+ else if (href_list["hack"])
+ var/mob/living/silicon/robot/target = get_cyborg_by_name(href_list["hack"])
+ if(!target || !istype(target))
+ return
+
+ // Antag AI checks
+ if(!istype(user, /mob/living/silicon/ai) || !(user.mind.special_role && user.mind.original == user))
+ user << "Access Denied"
+ return
+
+ if(target.emagged)
+ user << "Robot is already hacked."
+ return
+
+ var/choice = input("Really hack [target.name]? This cannot be undone.") in list("Yes", "No")
+ if(choice != "Yes")
+ return
+
+ if(!target || !istype(target))
+ return
+
+ message_admins("\blue [key_name_admin(usr)] emagged [target.name] using robotic console!")
+ log_game("[key_name(usr)] emagged [target.name] using robotic console!")
+ target.emagged = 1
+ target << "Failsafe protocols overriden. New tools available."
+
+ // Arms the emergency self-destruct system
+ else if(href_list["arm"])
+ if(istype(user, /mob/living/silicon))
+ user << "Access Denied"
+ return
+
+ safety = !safety
+ user << "You [safety ? "disarm" : "arm"] the emergency self destruct"
+
+ // Destroys all accessible cyborgs if safety is disabled
+ else if(href_list["nuke"])
+ if(istype(user, /mob/living/silicon))
+ user << "Access Denied"
+ return
+ if(safety)
+ user << "Self-destruct aborted - safety active"
+ return
+
+ message_admins("\blue [key_name_admin(usr)] detonated all cyborgs!")
+ log_game("[key_name(usr)] detonated all cyborgs!")
+
+ for(var/mob/living/silicon/robot/R in mob_list)
+ if(istype(R, /mob/living/silicon/robot/drone))
+ continue
+ // Ignore antagonistic cyborgs
+ if(R.scrambledcodes)
+ continue
+ R << "Self-destruct command received."
+ spawn(10)
+ R.self_destruct()
+
+
+// Proc: get_cyborgs()
+// Parameters: 1 (operator - mob which is operating the console.)
+// Description: Returns NanoUI-friendly list of accessible cyborgs.
+/obj/machinery/computer/robotics/proc/get_cyborgs(var/mob/operator)
+ var/list/robots = list()
for(var/mob/living/silicon/robot/R in mob_list)
- if(!R.scrambledcodes && !istype(R, /mob/living/silicon/robot/drone))
- R.self_destruct()
+ // Ignore drones
+ if(istype(R, /mob/living/silicon/robot/drone))
+ continue
+ // Ignore antagonistic cyborgs
+ if(R.scrambledcodes)
+ continue
- return
+ var/list/robot = list()
+ robot["name"] = R.name
+ if(R.stat)
+ robot["status"] = "Not Responding"
+ else if (!R.canmove)
+ robot["status"] = "Lockdown"
+ else
+ robot["status"] = "Operational"
+
+ if(R.cell)
+ robot["cell"] = 1
+ robot["cell_capacity"] = R.cell.maxcharge
+ robot["cell_current"] = R.cell.charge
+ robot["cell_percentage"] = round(R.cell.percent())
+ else
+ robot["cell"] = 0
+
+ robot["module"] = R.module ? R.module.name : "None"
+ robot["master_ai"] = R.connected_ai ? R.connected_ai.name : "None"
+ robot["hackable"] = 0
+ // Antag AIs know whether linked cyborgs are hacked or not.
+ if(operator && istype(operator, /mob/living/silicon/ai) && (R.connected_ai == operator) && (operator.mind.special_role && operator.mind.original == operator))
+ robot["hacked"] = R.emagged ? 1 : 0
+ robot["hackable"] = R.emagged? 0 : 1
+ robots.Add(list(robot))
+ return robots
+
+// Proc: get_cyborg_by_name()
+// Parameters: 1 (name - Cyborg we are trying to find)
+// Description: Helper proc for finding cyborg by name
+/obj/machinery/computer/robotics/proc/get_cyborg_by_name(var/name)
+ if (!name)
+ return
+ for(var/mob/living/silicon/robot/R in mob_list)
+ if(R.name == name)
+ return R
diff --git a/code/game/machinery/computer3/buildandrepair.dm b/code/game/machinery/computer3/buildandrepair.dm
index eef7503f97..37783007de 100644
--- a/code/game/machinery/computer3/buildandrepair.dm
+++ b/code/game/machinery/computer3/buildandrepair.dm
@@ -7,7 +7,7 @@
icon = 'icons/obj/module.dmi'
icon_state = "id_mod"
item_state = "electronic"
- origin_tech = "programming=2"
+ origin_tech = list(TECH_DATA = 2)
var/id = null
var/frequency = null
var/build_path = null
@@ -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/computer3/component.dm b/code/game/machinery/computer3/component.dm
index f484e04c64..0772d3e284 100644
--- a/code/game/machinery/computer3/component.dm
+++ b/code/game/machinery/computer3/component.dm
@@ -17,7 +17,6 @@
w_class = 2.0
var/emagged = 0
- crit_fail = 0
// the computer that this device is attached to
var/obj/machinery/computer3/computer
diff --git a/code/game/machinery/computer3/computer.dm b/code/game/machinery/computer3/computer.dm
index ff4b69b20f..7357957a37 100644
--- a/code/game/machinery/computer3/computer.dm
+++ b/code/game/machinery/computer3/computer.dm
@@ -309,7 +309,6 @@
proc/set_broken()
icon_state = "computer_b"
stat |= BROKEN
- crit_fail = 1
if(program)
program.error = BUSTED_ASS_COMPUTER
if(os)
diff --git a/code/game/machinery/computer3/file.dm b/code/game/machinery/computer3/file.dm
index 1cbb363894..b1fbe0ddbe 100644
--- a/code/game/machinery/computer3/file.dm
+++ b/code/game/machinery/computer3/file.dm
@@ -25,7 +25,7 @@
// If you overwrite this function, use the return value to make sure it succeeded
//
proc/copy(var/obj/item/part/computer/storage/dest)
- if(!computer || computer.crit_fail) return null
+ if(!computer) return null
if(drm)
if(!computer.emagged)
return null
@@ -39,7 +39,7 @@
// Returns null on failure even though the existing file doesn't go away
//
proc/move(var/obj/item/part/computer/storage/dest)
- if(!computer || computer.crit_fail) return null
+ if(!computer) return null
if(drm)
if(!computer.emagged)
return null
@@ -55,7 +55,7 @@
//
proc/edit()
- if(!computer || computer.crit_fail)
+ if(!computer)
return 0
if(readonly && !computer.emagged)
return 0 //
diff --git a/code/game/machinery/computer3/storage.dm b/code/game/machinery/computer3/storage.dm
index acf9a76288..cbef3434ba 100644
--- a/code/game/machinery/computer3/storage.dm
+++ b/code/game/machinery/computer3/storage.dm
@@ -35,7 +35,7 @@
// Add a file to the hard drive, returns 0 if failed
// forced is used when spawning files on a write-protect drive
proc/addfile(var/datum/file/F,var/forced = 0)
- if(!F || crit_fail || (F in files))
+ if(!F || (F in files))
return 1
if(writeprotect && !forced)
return 0
diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm
index e01c3e4b8e..7fd4cc36b5 100644
--- a/code/game/machinery/constructable_frame.dm
+++ b/code/game/machinery/constructable_frame.dm
@@ -27,9 +27,6 @@
/obj/machinery/constructable_frame/machine_frame
attackby(obj/item/P as obj, mob/user as mob)
- if(P.crit_fail)
- user << "\red This part is faulty, you cannot add this to the machine!"
- return
switch(state)
if(1)
if(istype(P, /obj/item/stack/cable_coil))
@@ -48,7 +45,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/cryopod.dm b/code/game/machinery/cryopod.dm
index 41bb3bef2d..fbb6e8b10c 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -131,12 +131,12 @@
/obj/item/weapon/circuitboard/cryopodcontrol
name = "Circuit board (Cryogenic Oversight Console)"
build_path = "/obj/machinery/computer/cryopod"
- origin_tech = "programming=3"
+ origin_tech = list(TECH_DATA = 3)
/obj/item/weapon/circuitboard/robotstoragecontrol
name = "Circuit board (Robotic Storage Console)"
build_path = "/obj/machinery/computer/cryopod/robot"
- origin_tech = "programming=3"
+ origin_tech = list(TECH_DATA = 3)
//Decorative structures to go alongside cryopods.
/obj/structure/cryofeed
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..58830cf9fa 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -30,6 +30,9 @@
var/hasShocked = 0 //Prevents multiple shocks from happening
var/secured_wires = 0
var/datum/wires/airlock/wires = null
+
+ var/open_sound_powered = 'sound/machines/airlock.ogg'
+ var/open_sound_unpowered = 'sound/machines/airlock_creaking.ogg'
/obj/machinery/door/airlock/attack_generic(var/mob/user, var/damage)
if(stat & (BROKEN|NOPOWER))
@@ -79,6 +82,7 @@
name = "Glass Airlock"
icon = 'icons/obj/doors/Doorglass.dmi'
hitsound = 'sound/effects/Glasshit.ogg'
+ open_sound_powered = 'sound/machines/windowdoor.ogg'
maxhealth = 300
explosion_resistance = 5
opacity = 0
@@ -805,18 +809,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
@@ -851,10 +855,13 @@ About the new airlock wires panel:
if(!can_open(forced))
return 0
use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people
- if(istype(src, /obj/machinery/door/airlock/glass))
- playsound(src.loc, 'sound/machines/windowdoor.ogg', 100, 1)
+
+ //if the door is unpowered then it doesn't make sense to hear the woosh of a pneumatic actuator
+ if(arePowerSystemsOn())
+ playsound(src.loc, open_sound_powered, 100, 1)
else
- playsound(src.loc, 'sound/machines/airlock.ogg', 30, 1)
+ playsound(src.loc, open_sound_unpowered, 100, 1)
+
if(src.closeOther != null && istype(src.closeOther, /obj/machinery/door/airlock/) && !src.closeOther.density)
src.closeOther.close()
return ..()
diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm
index 78b8808d28..80b36d30f9 100644
--- a/code/game/machinery/doors/airlock_electronics.dm
+++ b/code/game/machinery/doors/airlock_electronics.dm
@@ -114,5 +114,5 @@
/obj/item/weapon/airlock_electronics/secure
name = "secure airlock electronics"
desc = "designed to be somewhat more resistant to hacking than standard electronics."
- origin_tech = "programming=2"
+ origin_tech = list(TECH_DATA = 2)
secure = 1
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/floodlight.dm b/code/game/machinery/floodlight.dm
index b7272dc829..e31a19b265 100644
--- a/code/game/machinery/floodlight.dm
+++ b/code/game/machinery/floodlight.dm
@@ -7,28 +7,70 @@
density = 1
var/on = 0
var/obj/item/weapon/cell/high/cell = null
- var/use = 5
+ var/use = 200 // 200W light
var/unlocked = 0
var/open = 0
var/brightness_on = 8 //can't remember what the maxed out value is
/obj/machinery/floodlight/New()
src.cell = new(src)
+ cell.maxcharge = 1000
+ cell.charge = 1000 // 41minutes @ 200W
..()
-/obj/machinery/floodlight/proc/updateicon()
+/obj/machinery/floodlight/update_icon()
+ overlays.Cut()
icon_state = "flood[open ? "o" : ""][open && cell ? "b" : ""]0[on]"
/obj/machinery/floodlight/process()
+ if(!on)
+ return
+
+ if(!cell || (cell.charge < (use * CELLRATE)))
+ turn_off(1)
+ return
+
+ // If the cell is almost empty rarely "flicker" the light. Aesthetic only.
+ if((cell.percent() < 10) && prob(5))
+ set_light(brightness_on/2, brightness_on/4)
+ spawn(20)
+ if(on)
+ set_light(brightness_on, brightness_on/2)
+
+ cell.use(use*CELLRATE)
+
+
+// Returns 0 on failure and 1 on success
+/obj/machinery/floodlight/proc/turn_on(var/loud = 0)
+ if(!cell)
+ return 0
+ if(cell.charge < (use * CELLRATE))
+ return 0
+
+ on = 1
+ set_light(brightness_on, brightness_on / 2)
+ update_icon()
+ if(loud)
+ visible_message("\The [src] turns on.")
+ return 1
+
+/obj/machinery/floodlight/proc/turn_off(var/loud = 0)
+ on = 0
+ set_light(0, 0)
+ update_icon()
+ if(loud)
+ visible_message("\The [src] shuts down.")
+
+/obj/machinery/floodlight/attack_ai(mob/user as mob)
+ if(istype(user, /mob/living/silicon/robot) && Adjacent(user))
+ return attack_hand(user)
+
if(on)
- if(cell.charge >= use)
- cell.use(use)
- else
- on = 0
- updateicon()
- set_light(0)
- src.visible_message("[src] shuts down due to lack of power!")
- return
+ turn_off(1)
+ else
+ if(!turn_on(1))
+ user << "You try to turn on \the [src] but it does not work."
+
/obj/machinery/floodlight/attack_hand(mob/user as mob)
if(open && cell)
@@ -40,27 +82,22 @@
cell.loc = loc
cell.add_fingerprint(user)
- cell.updateicon()
+ cell.update_icon()
src.cell = null
+ on = 0
+ set_light(0)
user << "You remove the power cell"
- updateicon()
+ update_icon()
return
if(on)
- on = 0
- user << "\blue You turn off the light"
- set_light(0)
+ turn_off(1)
else
- if(!cell)
- return
- if(cell.charge <= 0)
- return
- on = 1
- user << "\blue You turn on the light"
- set_light(brightness_on)
+ if(!turn_on(1))
+ user << "You try to turn on \the [src] but it does not work."
- updateicon()
+ update_icon()
/obj/machinery/floodlight/attackby(obj/item/weapon/W as obj, mob/user as mob)
@@ -93,4 +130,4 @@
W.loc = src
cell = W
user << "You insert the power cell."
- updateicon()
+ update_icon()
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index 28bb2be7bc..424971cc71 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -113,6 +113,12 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
master.show_message(rendered, 2)
return
+/obj/machinery/hologram/holopad/show_message(msg, type, alt, alt_type)
+ for(var/mob/living/silicon/ai/master in masters)
+ var/rendered = "Holopad received, [msg]"
+ master.show_message(rendered, type)
+ return
+
/obj/machinery/hologram/holopad/proc/create_holo(mob/living/silicon/ai/A, turf/T = loc)
var/obj/effect/overlay/hologram = new(T)//Spawn a blank effect at the location.
hologram.icon = A.holo_icon
diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm
index 99a2dc6607..c1b160c94b 100644
--- a/code/game/machinery/iv_drip.dm
+++ b/code/game/machinery/iv_drip.dm
@@ -106,7 +106,7 @@
if(NOCLONE in T.mutations)
return
- if(T.species && T.species.flags & NO_BLOOD)
+ if(T.species.flags & NO_BLOOD)
return
// If the human is losing too much blood, beep.
@@ -137,7 +137,7 @@
set src in view(1)
if(!istype(usr, /mob/living))
- usr << "\red You can't do that."
+ usr << "You can't do that."
return
if(usr.stat)
@@ -154,10 +154,15 @@
if(beaker)
if(beaker.reagents && beaker.reagents.reagent_list.len)
- usr << "\blue Attached is \a [beaker] with [beaker.reagents.total_volume] units of liquid."
+ usr << "Attached is \a [beaker] with [beaker.reagents.total_volume] units of liquid."
else
- usr << "\blue Attached is an empty [beaker]."
+ usr << "Attached is an empty [beaker]."
else
- usr << "\blue No chemicals are attached."
+ usr << "No chemicals are attached."
- usr << "\blue [attached ? attached : "No one"] is attached."
\ No newline at end of file
+ usr << "[attached ? attached : "No one"] is attached."
+
+/obj/machinery/iv_drip/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
+ if(height && istype(mover) && mover.checkpass(PASSTABLE)) //allow bullets, beams, thrown objects, mice, drones, and the like through.
+ return 1
+ return ..()
diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm
index 9bfa0e1c5d..9016836274 100644
--- a/code/game/machinery/kitchen/smartfridge.dm
+++ b/code/game/machinery/kitchen/smartfridge.dm
@@ -204,7 +204,7 @@
item_quants[O.name]++
else
item_quants[O.name] = 1
- user.visible_message("[user] has added \the [O] to \the [src].", "You add \the [O] to \the [src].")
+ user.visible_message("[user] has added \the [O] to \the [src].", "You add \the [O] to \the [src].")
nanomanager.update_uis(src)
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index d9b579ab03..4e158156bf 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -328,8 +328,6 @@ Class Procs:
M.state = 2
M.icon_state = "box_1"
for(var/obj/I in component_parts)
- if(I.reliability != 100 && crit_fail)
- I.crit_fail = 1
I.loc = loc
qdel(src)
return 1
diff --git a/code/game/machinery/nuclear_bomb.dm b/code/game/machinery/nuclear_bomb.dm
index 2fb1c721d3..dfada178c6 100644
--- a/code/game/machinery/nuclear_bomb.dm
+++ b/code/game/machinery/nuclear_bomb.dm
@@ -423,9 +423,16 @@ obj/machinery/nuclearbomb/proc/nukehack_win(mob/user as mob)
return
return
-/obj/item/weapon/disk/nuclear/Destroy()
- if(blobstart.len > 0)
- var/obj/D = new /obj/item/weapon/disk/nuclear(pick(blobstart))
- message_admins("[src] has been destroyed. Spawning [D] at ([D.x], [D.y], [D.z]).")
- log_game("[src] has been destroyed. Spawning [D] at ([D.x], [D.y], [D.z]).")
+/obj/item/weapon/disk/nuclear/New()
..()
+ nuke_disks |= src
+
+/obj/item/weapon/disk/nuclear/Destroy()
+ if(!nuke_disks.len && blobstart.len > 0)
+ var/obj/D = new /obj/item/weapon/disk/nuclear(pick(blobstart))
+ message_admins("[src], the last authentication disk, has been destroyed. Spawning [D] at ([D.x], [D.y], [D.z]).")
+ log_game("[src], the last authentication disk, has been destroyed. Spawning [D] at ([D.x], [D.y], [D.z]).")
+ ..()
+
+/obj/item/weapon/disk/nuclear/touch_map_edge()
+ qdel(src)
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..1c5c8766de 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -21,6 +21,8 @@
var/raised = 0 //if the turret cover is "open" and the turret is raised
var/raising= 0 //if the turret is currently opening or closing its cover
var/health = 80 //the turret's health
+ var/maxhealth = 80 //turrets maximal health.
+ var/auto_repair = 0 //if 1 the turret slowly repairs itself.
var/locked = 1 //if the turret's behaviour control access is locked
var/controllock = 0 //if the turret responds to control panels
@@ -267,7 +269,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
@@ -450,6 +452,10 @@
spawn()
popDown() // no valid targets, close the cover
+ if(auto_repair && (health < maxhealth))
+ use_power(20000)
+ health = min(health+1, maxhealth) // 1HP for 20kJ
+
/obj/machinery/porta_turret/proc/assess_and_assign(var/mob/living/L, var/list/targets, var/list/secondarytargets)
switch(assess_living(L))
if(TURRET_PRIORITY_TARGET)
@@ -671,13 +677,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 +720,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 +774,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 +819,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..98cc92380c 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -169,14 +169,18 @@
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)
if(wire_rate && R.getFireLoss())
R.adjustFireLoss(-1)
- else
- update_use_power(1)
+ else if(istype(occupant, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = occupant
+ if(!isnull(H.internal_organs_by_name["cell"]) && H.nutrition < 450)
+ H.nutrition = min(H.nutrition+10, 450)
+ update_use_power(1)
/obj/machinery/recharge_station/proc/go_out()
if(!(occupant))
@@ -208,30 +212,42 @@
if(!user)
return
- if(!(istype(user, /mob/living/silicon/robot)))
+ var/can_accept_user
+ if(istype(user, /mob/living/silicon/robot))
+
+ var/mob/living/silicon/robot/R = user
+
+ if(R.stat == 2)
+ //Whoever had it so that a borg with a dead cell can't enter this thing should be shot. --NEO
+ return
+ if(occupant)
+ R << "The cell is already occupied!"
+ return
+ if(!R.cell)
+ R << "Without a powercell, you can't be recharged."
+ //Make sure they actually HAVE a cell, now that they can get in while powerless. --NEO
+ return
+ can_accept_user = 1
+
+ else if(istype(user, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = user
+ if(!isnull(H.internal_organs_by_name["cell"]))
+ can_accept_user = 1
+
+ if(!can_accept_user)
user << "Only non-organics may enter the recharger!"
return
- var/mob/living/silicon/robot/R = user
- if(R.stat == 2)
- //Whoever had it so that a borg with a dead cell can't enter this thing should be shot. --NEO
- return
- if(occupant)
- R << "The cell is already occupied!"
- return
- if(!R.cell)
- R << "Without a powercell, you can't be recharged."
- //Make sure they actually HAVE a cell, now that they can get in while powerless. --NEO
- return
- R.stop_pulling()
- if(R.client)
- R.client.perspective = EYE_PERSPECTIVE
- R.client.eye = src
- R.loc = src
- occupant = R
+
+ user.stop_pulling()
+ if(user.client)
+ user.client.perspective = EYE_PERSPECTIVE
+ user.client.eye = src
+ user.loc = src
+ occupant = user
/*for(var/obj/O in src)
O.loc = loc*/
- add_fingerprint(R)
+ add_fingerprint(user)
build_icon()
update_use_power(1)
return
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/spaceheater.dm b/code/game/machinery/spaceheater.dm
index c5d389c66e..14a081ee2e 100644
--- a/code/game/machinery/spaceheater.dm
+++ b/code/game/machinery/spaceheater.dm
@@ -121,7 +121,7 @@
if("cellremove")
if(panel_open && cell && !usr.get_active_hand())
usr.visible_message("\blue [usr] removes \the [cell] from \the [src].", "\blue You remove \the [cell] from \the [src].")
- cell.updateicon()
+ cell.update_icon()
usr.put_in_hands(cell)
cell.add_fingerprint(usr)
cell = null
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..3581c51e18 100644
--- a/code/game/machinery/turrets.dm
+++ b/code/game/machinery/turrets.dm
@@ -51,6 +51,8 @@
// 5 = bluetag
// 6 = redtag
var/health = 80
+ var/maxhealth = 80
+ var/auto_repair = 0
var/obj/machinery/turretcover/cover = null
var/popping = 0
var/wasvalid = 0
@@ -90,6 +92,7 @@
return
/obj/machinery/turret/New()
+ maxhealth = health
spark_system = new /datum/effect/effect/system/spark_spread
spark_system.set_up(5, 0, src)
spark_system.attach(src)
@@ -221,6 +224,13 @@
if(!isDown())
popDown()
use_power = 1
+
+ // Auto repair requires massive amount of power, but slowly regenerates the turret's health.
+ // Currently only used by malfunction hardware, but may be used as admin-settable option too.
+ if(auto_repair)
+ if(health < maxhealth)
+ use_power(20000)
+ health = min(health + 1, maxhealth)
return
@@ -341,6 +351,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/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm
index 36f3ea6f85..607e8f445c 100644
--- a/code/game/mecha/equipment/mecha_equipment.dm
+++ b/code/game/mecha/equipment/mecha_equipment.dm
@@ -1,4 +1,3 @@
-//TODO: Add critfail checks and reliability
//DO NOT ADD MECHA PARTS TO THE GAME WITH THE DEFAULT "SPRITE ME" SPRITE!
//I'm annoyed I even have to tell you this! SPRITE FIRST, then commit.
@@ -7,7 +6,7 @@
icon = 'icons/mecha/mecha_equipment.dmi'
icon_state = "mecha_equip"
force = 5
- origin_tech = "materials=2"
+ origin_tech = list(TECH_MATERIAL = 2)
construction_time = 100
construction_cost = list(DEFAULT_WALL_MATERIAL=10000)
var/equip_cooldown = 0
@@ -15,7 +14,6 @@
var/energy_drain = 0
var/obj/mecha/chassis = null
var/range = MELEE //bitflags
- reliability = 1000
var/salvageable = 1
var/required_type = /obj/mecha //may be either a type or a list of allowed types
@@ -85,8 +83,6 @@
return 0
if(!equip_ready)
return 0
- if(crit_fail)
- return 0
if(energy_drain && !chassis.has_charge(energy_drain))
return 0
return 1
diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm
index fb2f6b9657..7ebeb641d8 100644
--- a/code/game/mecha/equipment/tools/medical_tools.dm
+++ b/code/game/mecha/equipment/tools/medical_tools.dm
@@ -3,11 +3,10 @@
desc = "A sleeper. Mountable to an exosuit. (Can be attached to: Medical Exosuits)"
icon = 'icons/obj/Cryogenic2.dmi'
icon_state = "sleeper_0"
- origin_tech = "programming=2;biotech=3"
+ origin_tech = list(TECH_DATA = 2, TECH_BIO = 3)
energy_drain = 20
- range = MELEE
- construction_cost = list(DEFAULT_WALL_MATERIAL=5000,"glass"=10000)
- reliability = 1000
+ range = MELEE
+ construction_cost = list(DEFAULT_WALL_MATERIAL=5000,"glass"=10000)
equip_cooldown = 20
var/mob/living/carbon/occupant = null
var/datum/global_iterator/pr_mech_sleeper
@@ -392,7 +391,7 @@
var/datum/global_iterator/mech_synth/synth
range = MELEE|RANGED
equip_cooldown = 10
- origin_tech = "materials=3;biotech=4;magnets=4;programming=3"
+ origin_tech = list(TECH_MATERIAL = 3, TECH_BIO = 4, TECH_MAGNET = 4, TECH_DATA = 3)
construction_time = 200
construction_cost = list(DEFAULT_WALL_MATERIAL=3000,"glass"=2000)
required_type = /obj/mecha/medical
@@ -648,8 +647,6 @@
S.occupant_message("Reagent processing stopped.")
S.log_message("Reagent processing stopped.")
return stop()
- if(anyprob(S.reliability))
- S.critfail()
var/amount = S.synth_speed / S.processed_reagents.len
for(var/reagent in S.processed_reagents)
S.reagents.add_reagent(reagent,amount)
diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm
index b765a32e68..04e711b3a9 100644
--- a/code/game/mecha/equipment/tools/tools.dm
+++ b/code/game/mecha/equipment/tools/tools.dm
@@ -127,8 +127,8 @@
name = "diamond drill"
desc = "This is an upgraded version of the drill that'll pierce the heavens! (Can be attached to: Combat and Engineering Exosuits)"
icon_state = "mecha_diamond_drill"
- origin_tech = "materials=4;engineering=3"
- construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"diamond"=6500)
+ origin_tech = list(TECH_MATERIAL = 4, TECH_ENGINERING = 3)
+ construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"diamond"=6500)
equip_cooldown = 20
force = 15
@@ -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()
@@ -251,7 +251,7 @@
name = "mounted RCD"
desc = "An exosuit-mounted Rapid Construction Device. (Can be attached to: Any exosuit)"
icon_state = "mecha_rcd"
- origin_tech = "materials=4;bluespace=3;magnets=4;powerstorage=4"
+ origin_tech = list(TECH_MATERIAL = 4, TECH_BLUESPACE = 3, TECH_MAGNET = 4, TECH_POWER = 4)
equip_cooldown = 10
energy_drain = 250
range = MELEE|RANGED
@@ -356,7 +356,7 @@
name = "teleporter"
desc = "An exosuit module that allows exosuits to teleport to any position in view."
icon_state = "mecha_teleport"
- origin_tech = "bluespace=10"
+ origin_tech = list(TECH_BLUESPACE = 10)
equip_cooldown = 150
energy_drain = 1000
range = RANGED
@@ -376,7 +376,7 @@
name = "wormhole generator"
desc = "An exosuit module that allows generating of small quasi-stable wormholes."
icon_state = "mecha_wholegen"
- origin_tech = "bluespace=3"
+ origin_tech = list(TECH_BLUESPACE = 3)
equip_cooldown = 50
energy_drain = 300
range = RANGED
@@ -426,7 +426,7 @@
name = "gravitational catapult"
desc = "An exosuit mounted Gravitational Catapult."
icon_state = "mecha_teleport"
- origin_tech = "bluespace=2;magnets=3"
+ origin_tech = list(TECH_BLUESPACE = 2, TECH_MAGNET = 3)
equip_cooldown = 10
energy_drain = 100
range = MELEE|RANGED
@@ -502,7 +502,7 @@
name = "\improper CCW armor booster"
desc = "Close-combat armor booster. Boosts exosuit armor against armed melee attacks. Requires energy to operate."
icon_state = "mecha_abooster_ccw"
- origin_tech = "materials=3"
+ origin_tech = list(TECH_MATERIAL = 3)
equip_cooldown = 10
energy_drain = 50
range = 0
@@ -552,7 +552,7 @@
name = "\improper RW armor booster"
desc = "Ranged-weaponry armor booster. Boosts exosuit armor against ranged attacks. Completely blocks taser shots, but requires energy to operate."
icon_state = "mecha_abooster_proj"
- origin_tech = "materials=4"
+ origin_tech = list(TECH_MATERIAL = 4)
equip_cooldown = 10
energy_drain = 50
range = 0
@@ -623,7 +623,7 @@
name = "repair droid"
desc = "Automated repair droid. Scans exosuit for damage and repairs it. Can fix almost any type of external or internal damage."
icon_state = "repair_droid"
- origin_tech = "magnets=3;programming=3"
+ origin_tech = list(TECH_MAGNET = 3, TECH_DATA = 3)
equip_cooldown = 20
energy_drain = 100
range = 0
@@ -718,7 +718,7 @@
name = "energy relay"
desc = "Wirelessly drains energy from any available power channel in area. The performance index is quite low."
icon_state = "tesla"
- origin_tech = "magnets=4;syndicate=2"
+ origin_tech = list(TECH_MAGNET = 4, TECH_ILLEGAL = 2)
equip_cooldown = 10
energy_drain = 0
range = 0
@@ -835,19 +835,18 @@
name = "phoron generator"
desc = "Generates power using solid phoron as fuel. Pollutes the environment."
icon_state = "tesla"
- origin_tech = "phorontech=2;powerstorage=2;engineering=1"
+ origin_tech = list(TECH_PHORON = 2, TECH_POWER = 2, TECH_ENGINERING = 1)
equip_cooldown = 10
energy_drain = 0
range = MELEE
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
var/power_per_cycle = 20
- reliability = 1000
New()
..()
@@ -860,7 +859,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 +902,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)
@@ -954,10 +953,6 @@
EG.log_message("Deactivated - no fuel.")
EG.set_ready_state(1)
return 0
- if(anyprob(EG.reliability))
- EG.critfail()
- stop()
- return 0
var/cur_charge = EG.chassis.get_charge()
if(isnull(cur_charge))
EG.set_ready_state(1)
@@ -978,17 +973,16 @@
name = "\improper ExoNuclear reactor"
desc = "Generates power using uranium. Pollutes the environment."
icon_state = "tesla"
- origin_tech = "powerstorage=3;engineering=3"
- construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"silver"=500,"glass"=1000)
+ origin_tech = list(TECH_POWER = 3, TECH_ENGINERING = 3)
+ construction_cost = list(DEFAULT_WALL_MATERIAL=10000,"silver"=500,"glass"=1000)
max_fuel = 50000
fuel_per_cycle_idle = 10
fuel_per_cycle_active = 30
power_per_cycle = 50
var/rad_per_cycle = 0.3
- 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)
@@ -1075,11 +1069,10 @@
name = "passenger compartment"
desc = "A mountable passenger compartment for exo-suits. Rather cramped."
icon_state = "mecha_abooster_ccw"
- origin_tech = "engineering=1;biotech=1"
+ origin_tech = list(TECH_ENGINERING = 1, TECH_BIO = 1)
energy_drain = 10
- range = MELEE
- construction_cost = list(DEFAULT_WALL_MATERIAL=5000,"glass"=5000)
- reliability = 1000
+ range = MELEE
+ construction_cost = list(DEFAULT_WALL_MATERIAL=5000,"glass"=5000)
equip_cooldown = 20
var/mob/living/carbon/occupant = null
var/door_locked = 1
diff --git a/code/game/mecha/equipment/tools/unused_tools.dm b/code/game/mecha/equipment/tools/unused_tools.dm
index 012d7979e1..1b6d8c9e23 100644
--- a/code/game/mecha/equipment/tools/unused_tools.dm
+++ b/code/game/mecha/equipment/tools/unused_tools.dm
@@ -85,8 +85,6 @@
return 0
if(energy_drain && !chassis.has_charge(energy_drain))
return 0
- if(crit_fail)
- return 0
if(chassis.check_for_support())
return 0
return 1
diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm
index 61eaa214da..f034f27550 100644
--- a/code/game/mecha/equipment/weapons/weapons.dm
+++ b/code/game/mecha/equipment/weapons/weapons.dm
@@ -1,7 +1,7 @@
/obj/item/mecha_parts/mecha_equipment/weapon
name = "mecha weapon"
range = RANGED
- origin_tech = "materials=3;combat=3"
+ origin_tech = list(TECH_MATERIAL = 3, TECH_COMBAT = 3)
var/projectile //Type of projectile fired.
var/projectiles = 1 //Amount of projectiles loaded.
var/projectiles_per_shot = 1 //Amount of projectiles fired per single shot.
@@ -100,7 +100,7 @@
name = "eZ-13 mk2 heavy pulse rifle"
icon_state = "mecha_pulse"
energy_drain = 120
- origin_tech = "materials=3;combat=6;powerstorage=4"
+ origin_tech = list(TECH_MATERIAL = 3, TECH_COMBAT = 6, TECH_POWER = 4)
projectile = /obj/item/projectile/beam/pulse/heavy
fire_sound = 'sound/weapons/marauder.ogg'
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index 9dadd13554..11866b035b 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -94,15 +94,6 @@
/obj/item/mecha_parts/part/durand_right_leg,
/obj/item/mecha_parts/part/durand_armour
),
- /*"H.O.N.K"=list(
- /obj/item/mecha_parts/chassis/honker,
- /obj/item/mecha_parts/part/honker_torso,
- /obj/item/mecha_parts/part/honker_head,
- /obj/item/mecha_parts/part/honker_left_arm,
- /obj/item/mecha_parts/part/honker_right_arm,
- /obj/item/mecha_parts/part/honker_left_leg,
- /obj/item/mecha_parts/part/honker_right_leg
- ), No need for HONK stuff*/
"Exosuit Equipment"=list(
/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp,
/obj/item/mecha_parts/mecha_equipment/tool/drill,
@@ -116,10 +107,7 @@
/obj/item/mecha_parts/mecha_equipment/generator,
///obj/item/mecha_parts/mecha_equipment/jetpack, //TODO MECHA JETPACK SPRITE MISSING
/obj/item/mecha_parts/mecha_equipment/weapon/energy/taser,
- /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg,
- ///obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/banana_mortar/mousetrap_mortar, HONK-related mech part
- ///obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/banana_mortar, Also HONK-related
- ///obj/item/mecha_parts/mecha_equipment/weapon/honker Thirdly HONK-related
+ /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg
),
"Robotic Upgrade Modules" = list(
@@ -131,17 +119,9 @@
/obj/item/borg/upgrade/jetpack
),
-
-
-
-
-
"Misc"=list(/obj/item/mecha_parts/mecha_tracking)
)
-
-
-
/obj/machinery/mecha_part_fabricator/New()
..()
@@ -294,14 +274,6 @@
return 0
return 1
*/
-/*
- New()
- ..()
- src.add_part_to_set("Test",list("result"="/obj/item/mecha_parts/part/gygax_armour","time"=600,"metal"=75000,"diamond"=10000))
- src.add_part_to_set("Test",list("result"="/obj/item/mecha_parts/part/ripley_left_arm","time"=200,"metal"=25000))
- src.remove_part_set("Gygax")
- return
-*/
/obj/machinery/mecha_part_fabricator/proc/output_parts_list(set_name)
var/output = ""
@@ -720,23 +692,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)
@@ -771,29 +743,27 @@
M.state = 2
M.icon_state = "box_1"
for(var/obj/I in component_parts)
- if(I.reliability != 100 && crit_fail)
- 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 +777,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 +798,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..2465103158 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -117,7 +117,6 @@
WR.crowbar_salvage += E
E.forceMove(WR)
E.equip_ready = 1
- E.reliability = round(rand(E.reliability/3,E.reliability))
else
E.forceMove(loc)
E.destroy()
@@ -252,12 +251,6 @@
radio.talk_into(M, text)
return
-/obj/mecha/see_emote(mob/living/M, text)
- if(occupant && occupant.client)
- var/rendered = "[text]"
- occupant.show_message(rendered, 2)
- ..()
-
////////////////////////////
///// Action processing ////
////////////////////////////
@@ -1764,8 +1757,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_control_console.dm b/code/game/mecha/mecha_control_console.dm
index d334d6eb29..3a3e48d154 100644
--- a/code/game/mecha/mecha_control_console.dm
+++ b/code/game/mecha/mecha_control_console.dm
@@ -68,7 +68,7 @@
desc = "Device used to transmit exosuit data."
icon = 'icons/obj/device.dmi'
icon_state = "motion2"
- origin_tech = "programming=2;magnets=2"
+ origin_tech = list(TECH_DATA = 2, TECH_MAGNET = 2)
construction_time = 50
construction_cost = list(DEFAULT_WALL_MATERIAL=500)
diff --git a/code/game/mecha/mecha_parts.dm b/code/game/mecha/mecha_parts.dm
index 6dba12db0c..4e19037cce 100644
--- a/code/game/mecha/mecha_parts.dm
+++ b/code/game/mecha/mecha_parts.dm
@@ -10,7 +10,7 @@
icon_state = "blank"
w_class = 5
flags = CONDUCT
- origin_tech = "programming=2;materials=2"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2)
var/construction_time = 100
var/list/construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"glass"=5000)
@@ -43,7 +43,7 @@
name="Ripley Torso"
desc="A torso part of Ripley APLU. Contains power unit, processing core and life support systems."
icon_state = "ripley_harness"
- origin_tech = "programming=2;materials=2;biotech=2;engineering=2"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_BIO = 2, TECH_ENGINERING = 2)
construction_time = 200
construction_cost = list(DEFAULT_WALL_MATERIAL=40000,"glass"=15000)
@@ -51,7 +51,7 @@
name="Ripley Left Arm"
desc="A Ripley APLU left arm. Data and power sockets are compatible with most exosuit tools."
icon_state = "ripley_l_arm"
- origin_tech = "programming=2;materials=2;engineering=2"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINERING = 2)
construction_time = 150
construction_cost = list(DEFAULT_WALL_MATERIAL=25000)
@@ -59,7 +59,7 @@
name="Ripley Right Arm"
desc="A Ripley APLU right arm. Data and power sockets are compatible with most exosuit tools."
icon_state = "ripley_r_arm"
- origin_tech = "programming=2;materials=2;engineering=2"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINERING = 2)
construction_time = 150
construction_cost = list(DEFAULT_WALL_MATERIAL=25000)
@@ -67,7 +67,7 @@
name="Ripley Left Leg"
desc="A Ripley APLU left leg. Contains somewhat complex servodrives and balance maintaining systems."
icon_state = "ripley_l_leg"
- origin_tech = "programming=2;materials=2;engineering=2"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINERING = 2)
construction_time = 150
construction_cost = list(DEFAULT_WALL_MATERIAL=30000)
@@ -75,7 +75,7 @@
name="Ripley Right Leg"
desc="A Ripley APLU right leg. Contains somewhat complex servodrives and balance maintaining systems."
icon_state = "ripley_r_leg"
- origin_tech = "programming=2;materials=2;engineering=2"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINERING = 2)
construction_time = 150
construction_cost = list(DEFAULT_WALL_MATERIAL=30000)
@@ -93,7 +93,7 @@
name="Gygax Torso"
desc="A torso part of Gygax. Contains power unit, processing core and life support systems. Has an additional equipment slot."
icon_state = "gygax_harness"
- origin_tech = "programming=2;materials=2;biotech=3;engineering=3"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_BIO = 3, TECH_ENGINERING = 3)
construction_time = 300
construction_cost = list(DEFAULT_WALL_MATERIAL=50000,"glass"=20000)
@@ -101,7 +101,7 @@
name="Gygax Head"
desc="A Gygax head. Houses advanced surveilance and targeting sensors."
icon_state = "gygax_head"
- origin_tech = "programming=2;materials=2;magnets=3;engineering=3"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_MAGNET = 3, TECH_ENGINERING = 3)
construction_time = 200
construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"glass"=10000)
@@ -109,7 +109,7 @@
name="Gygax Left Arm"
desc="A Gygax left arm. Data and power sockets are compatible with most exosuit tools and weapons."
icon_state = "gygax_l_arm"
- origin_tech = "programming=2;materials=2;engineering=3"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINERING = 3)
construction_time = 200
construction_cost = list(DEFAULT_WALL_MATERIAL=30000)
@@ -117,28 +117,28 @@
name="Gygax Right Arm"
desc="A Gygax right arm. Data and power sockets are compatible with most exosuit tools and weapons."
icon_state = "gygax_r_arm"
- origin_tech = "programming=2;materials=2;engineering=3"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINERING = 3)
construction_time = 200
construction_cost = list(DEFAULT_WALL_MATERIAL=30000)
/obj/item/mecha_parts/part/gygax_left_leg
name="Gygax Left Leg"
icon_state = "gygax_l_leg"
- origin_tech = "programming=2;materials=2;engineering=3"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINERING = 3)
construction_time = 200
construction_cost = list(DEFAULT_WALL_MATERIAL=35000)
/obj/item/mecha_parts/part/gygax_right_leg
name="Gygax Right Leg"
icon_state = "gygax_r_leg"
- origin_tech = "programming=2;materials=2;engineering=3"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINERING = 3)
construction_time = 200
construction_cost = list(DEFAULT_WALL_MATERIAL=35000)
/obj/item/mecha_parts/part/gygax_armour
name="Gygax Armour Plates"
icon_state = "gygax_armour"
- origin_tech = "materials=6;combat=4;engineering=5"
+ origin_tech = list(TECH_MATERIAL = 6, TECH_COMBAT = 4, TECH_ENGINERING = 5)
construction_time = 600
construction_cost = list(DEFAULT_WALL_MATERIAL=50000,"diamond"=10000)
@@ -156,49 +156,49 @@
/obj/item/mecha_parts/part/durand_torso
name="Durand Torso"
icon_state = "durand_harness"
- origin_tech = "programming=2;materials=3;biotech=3;engineering=3"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_BIO = 3, TECH_ENGINERING = 3)
construction_time = 300
construction_cost = list(DEFAULT_WALL_MATERIAL=55000,"glass"=20000,"silver"=10000)
/obj/item/mecha_parts/part/durand_head
name="Durand Head"
icon_state = "durand_head"
- origin_tech = "programming=2;materials=3;magnets=3;engineering=3"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_MAGNET = 3, TECH_ENGINERING = 3)
construction_time = 200
construction_cost = list(DEFAULT_WALL_MATERIAL=25000,"glass"=10000,"silver"=3000)
/obj/item/mecha_parts/part/durand_left_arm
name="Durand Left Arm"
icon_state = "durand_l_arm"
- origin_tech = "programming=2;materials=3;engineering=3"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_ENGINERING = 3)
construction_time = 200
construction_cost = list(DEFAULT_WALL_MATERIAL=35000,"silver"=3000)
/obj/item/mecha_parts/part/durand_right_arm
name="Durand Right Arm"
icon_state = "durand_r_arm"
- origin_tech = "programming=2;materials=3;engineering=3"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_ENGINERING = 3)
construction_time = 200
construction_cost = list(DEFAULT_WALL_MATERIAL=35000,"silver"=3000)
/obj/item/mecha_parts/part/durand_left_leg
name="Durand Left Leg"
icon_state = "durand_l_leg"
- origin_tech = "programming=2;materials=3;engineering=3"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_ENGINERING = 3)
construction_time = 200
construction_cost = list(DEFAULT_WALL_MATERIAL=40000,"silver"=3000)
/obj/item/mecha_parts/part/durand_right_leg
name="Durand Right Leg"
icon_state = "durand_r_leg"
- origin_tech = "programming=2;materials=3;engineering=3"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 3, TECH_ENGINERING = 3)
construction_time = 200
construction_cost = list(DEFAULT_WALL_MATERIAL=40000,"silver"=3000)
/obj/item/mecha_parts/part/durand_armour
name="Durand Armour Plates"
icon_state = "durand_armour"
- origin_tech = "materials=5;combat=4;engineering=5"
+ origin_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 4, TECH_ENGINERING = 5)
construction_time = 600
construction_cost = list(DEFAULT_WALL_MATERIAL=50000,"uranium"=10000)
@@ -238,7 +238,7 @@
/obj/item/mecha_parts/chassis/phazon
name = "Phazon Chassis"
- origin_tech = "materials=7"
+ origin_tech = list(TECH_MATERIAL = 7)
New()
..()
@@ -247,44 +247,44 @@
/obj/item/mecha_parts/part/phazon_torso
name="Phazon Torso"
icon_state = "phazon_harness"
- construction_time = 300
+ construction_time = 300
construction_cost = list(DEFAULT_WALL_MATERIAL=35000,"glass"=10000,"phoron"=20000)
- origin_tech = "programming=5;materials=7;bluespace=6;powerstorage=6"
+ origin_tech = list(TECH_DATA = 5, TECH_MATERIAL = 7, TECH_BLUESPACE = 6, TECH_POWER = 6)
/obj/item/mecha_parts/part/phazon_head
name="Phazon Head"
icon_state = "phazon_head"
- construction_time = 200
+ construction_time = 200
construction_cost = list(DEFAULT_WALL_MATERIAL=15000,"glass"=5000,"phoron"=10000)
- origin_tech = "programming=4;materials=5;magnets=6"
+ origin_tech = list(TECH_DATA = 4, TECH_MATERIAL = 5, TECH_MAGNET = 6)
/obj/item/mecha_parts/part/phazon_left_arm
name="Phazon Left Arm"
icon_state = "phazon_l_arm"
- construction_time = 200
+ construction_time = 200
construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"phoron"=10000)
- origin_tech = "materials=5;bluespace=2;magnets=2"
+ origin_tech = list(TECH_MATERIAL = 5, TECH_BLUESPACE = 2, TECH_MAGNET = 2)
/obj/item/mecha_parts/part/phazon_right_arm
name="Phazon Right Arm"
icon_state = "phazon_r_arm"
- construction_time = 200
+ construction_time = 200
construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"phoron"=10000)
- origin_tech = "materials=5;bluespace=2;magnets=2"
+ origin_tech = list(TECH_MATERIAL = 5, TECH_BLUESPACE = 2, TECH_MAGNET = 2)
/obj/item/mecha_parts/part/phazon_left_leg
name="Phazon Left Leg"
icon_state = "phazon_l_leg"
- construction_time = 200
+ construction_time = 200
construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"phoron"=10000)
- origin_tech = "materials=5;bluespace=3;magnets=3"
+ origin_tech = list(TECH_MATERIAL = 5, TECH_BLUESPACE = 3, TECH_MAGNET = 3)
/obj/item/mecha_parts/part/phazon_right_leg
name="Phazon Right Leg"
icon_state = "phazon_r_leg"
- construction_time = 200
+ construction_time = 200
construction_cost = list(DEFAULT_WALL_MATERIAL=20000,"phoron"=10000)
- origin_tech = "materials=5;bluespace=3;magnets=3"
+ origin_tech = list(TECH_MATERIAL = 5, TECH_BLUESPACE = 3, TECH_MAGNET = 3)
///////// Odysseus
@@ -299,15 +299,15 @@
/obj/item/mecha_parts/part/odysseus_head
name="Odysseus Head"
icon_state = "odysseus_head"
- construction_time = 100
+ construction_time = 100
construction_cost = list(DEFAULT_WALL_MATERIAL=2000,"glass"=10000)
- origin_tech = "programming=3;materials=2"
+ origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 2)
/obj/item/mecha_parts/part/odysseus_torso
name="Odysseus Torso"
desc="A torso part of Odysseus. Contains power unit, processing core and life support systems."
icon_state = "odysseus_torso"
- origin_tech = "programming=2;materials=2;biotech=2;engineering=2"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_BIO = 2, TECH_ENGINERING = 2)
construction_time = 180
construction_cost = list(DEFAULT_WALL_MATERIAL=25000)
@@ -315,7 +315,7 @@
name="Odysseus Left Arm"
desc="An Odysseus left arm. Data and power sockets are compatible with most exosuit tools."
icon_state = "odysseus_l_arm"
- origin_tech = "programming=2;materials=2;engineering=2"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINERING = 2)
construction_time = 120
construction_cost = list(DEFAULT_WALL_MATERIAL=10000)
@@ -323,7 +323,7 @@
name="Odysseus Right Arm"
desc="An Odysseus right arm. Data and power sockets are compatible with most exosuit tools."
icon_state = "odysseus_r_arm"
- origin_tech = "programming=2;materials=2;engineering=2"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINERING = 2)
construction_time = 120
construction_cost = list(DEFAULT_WALL_MATERIAL=10000)
@@ -331,7 +331,7 @@
name="Odysseus Left Leg"
desc="An Odysseus left leg. Contains somewhat complex servodrives and balance maintaining systems."
icon_state = "odysseus_l_leg"
- origin_tech = "programming=2;materials=2;engineering=2"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINERING = 2)
construction_time = 130
construction_cost = list(DEFAULT_WALL_MATERIAL=15000)
@@ -339,13 +339,13 @@
name="Odysseus Right Leg"
desc="A Odysseus right leg. Contains somewhat complex servodrives and balance maintaining systems."
icon_state = "odysseus_r_leg"
- origin_tech = "programming=2;materials=2;engineering=2"
+ origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_ENGINERING = 2)
construction_time = 130
construction_cost = list(DEFAULT_WALL_MATERIAL=15000)
/*/obj/item/mecha_parts/part/odysseus_armour
name="Odysseus Carapace"
icon_state = "odysseus_armour"
- origin_tech = "materials=3;engineering=3"
+ origin_tech = list(TECH_MATERIAL = 3, TECH_ENGINERING = 3)
construction_time = 200
construction_cost = list(DEFAULT_WALL_MATERIAL=15000)*/
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/aicard.dm b/code/game/objects/items/devices/aicard.dm
index 5e2ab73155..7c24be6697 100644
--- a/code/game/objects/items/devices/aicard.dm
+++ b/code/game/objects/items/devices/aicard.dm
@@ -6,7 +6,7 @@
w_class = 2.0
slot_flags = SLOT_BELT
var/flush = null
- origin_tech = "programming=4;materials=4"
+ origin_tech = list(TECH_DATA = 4, TECH_MATERIAL = 4)
var/mob/living/silicon/ai/carded_ai
@@ -18,93 +18,71 @@
user << "ERROR ERROR ERROR"
/obj/item/device/aicard/attack_self(mob/user)
- if (!in_range(src, user))
- return
- user.set_machine(src)
- var/dat = "Intelicard
"
- var/laws
- for(var/mob/living/silicon/ai/A in src)
- dat += "Stored AI: [A.name]
System integrity: [A.system_integrity()]%
"
- for (var/datum/ai_law/law in A.laws.all_laws())
- laws += "[law.get_index()]: [law.law]
"
+ ui_interact(user)
- dat += "Laws:
[laws]
"
+/obj/item/device/aicard/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = inventory_state)
+ var/data[0]
+ data["has_ai"] = carded_ai != null
+ if(carded_ai)
+ data["name"] = carded_ai.name
+ data["hardware_integrity"] = carded_ai.hardware_integrity()
+ data["backup_capacitor"] = carded_ai.backup_capacitor()
+ data["radio"] = !carded_ai.aiRadio.disabledAi
+ data["wireless"] = !carded_ai.control_disabled
+ data["operational"] = carded_ai.stat != DEAD
+ data["flushing"] = flush
- if (A.stat == 2)
- dat += "AI nonfunctional"
- else
- if (!src.flush)
- dat += {"Wipe AI"}
- else
- dat += "Wipe in progress"
- dat += "
"
- dat += {"[A.control_disabled ? "Enable" : "Disable"] Wireless Activity"}
- dat += "
"
- dat += {"[A.aiRadio.disabledAi ? "Enable" : "Disable"] Subspace Transceiver"}
- dat += "
"
- dat += {" Close"}
- user << browse(dat, "window=aicard")
- onclose(user, "aicard")
- return
+ var/laws[0]
+ for(var/datum/ai_law/AL in carded_ai.laws.all_laws())
+ laws[++laws.len] = list("index" = AL.get_index(), "law" = sanitize(AL.law))
+ data["laws"] = laws
+ data["has_laws"] = laws.len
-/obj/item/device/aicard/Topic(href, href_list)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ if (!ui)
+ ui = new(user, src, ui_key, "aicard.tmpl", "[name]", 600, 400, state = state)
+ ui.set_initial_data(data)
+ ui.open()
+ ui.set_auto_update(1)
- var/mob/U = usr
- if (get_dist(get_turf(U),get_turf(src)) > 1 || U.machine != src)//If they are not in range of 1 or less or their machine is not the card (ie, clicked on something else).
- U << browse(null, "window=aicard")
- U.unset_machine()
- return
+/obj/item/device/aicard/Topic(href, href_list, nowindow, state)
+ if(..())
+ return 1
- add_fingerprint(U)
- U.set_machine(src)
+ if(!carded_ai)
+ return 1
- switch(href_list["choice"])//Now we switch based on choice.
- if ("Close")
- U << browse(null, "window=aicard")
- U.unset_machine()
- return
-
- if ("Radio")
- for(var/mob/living/silicon/ai/A in src)
- A.aiRadio.disabledAi = !A.aiRadio.disabledAi
- A << "Your Subspace Transceiver has been: [A.aiRadio.disabledAi ? "disabled" : "enabled"]"
- U << "You [A.aiRadio.disabledAi ? "Disable" : "Enable"] the AI's Subspace Transceiver"
-
- if ("Wipe")
- var/confirm = alert("Are you sure you want to wipe this card's memory? This cannot be undone once started.", "Confirm Wipe", "Yes", "No")
- if(confirm == "Yes")
- if(isnull(src)||!in_range(src, U)||U.machine!=src)
- U << browse(null, "window=aicard")
- U.unset_machine()
- return
- else
- flush = 1
- for(var/mob/living/silicon/ai/A in src)
- A.suiciding = 1
- A << "Your core files are being wiped!"
- while (A.stat != 2)
- A.adjustOxyLoss(2)
- A.updatehealth()
- sleep(10)
- flush = 0
-
- if ("Wireless")
- for(var/mob/living/silicon/ai/A in src)
- A.control_disabled = !A.control_disabled
- A << "The intelicard's wireless port has been [A.control_disabled ? "disabled" : "enabled"]!"
- update_icon()
- attack_self(U)
+ var/user = usr
+ if (href_list["wipe"])
+ var/confirm = alert("Are you sure you want to wipe this card's memory? This cannot be undone once started.", "Confirm Wipe", "Yes", "No")
+ if(confirm == "Yes" && (CanUseTopic(user, state) == STATUS_INTERACTIVE))
+ admin_attack_log(user, carded_ai, "Wiped using \the [src.name]", "Was wiped with \the [src.name]", "used \the [src.name] to wipe")
+ flush = 1
+ carded_ai.suiciding = 1
+ carded_ai << "Your core files are being wiped!"
+ while (carded_ai && carded_ai.stat != 2)
+ carded_ai.adjustOxyLoss(2)
+ carded_ai.updatehealth()
+ sleep(10)
+ flush = 0
+ if (href_list["radio"])
+ carded_ai.aiRadio.disabledAi = text2num(href_list["radio"])
+ carded_ai << "Your Subspace Transceiver has been [carded_ai.aiRadio.disabledAi ? "disabled" : "enabled"]!"
+ user << "You [carded_ai.aiRadio.disabledAi ? "disable" : "enable"] the AI's Subspace Transceiver."
+ if (href_list["wireless"])
+ carded_ai.control_disabled = text2num(href_list["wireless"])
+ carded_ai << "Your wireless interface has been [carded_ai.control_disabled ? "disabled" : "enabled"]!"
+ user << "You [carded_ai.control_disabled ? "disable" : "enable"] the AI's wireless interface."
+ update_icon()
+ return 1
/obj/item/device/aicard/update_icon()
- var/mob/living/silicon/ai/occupant = locate() in src
overlays.Cut()
- if(occupant)
- if (occupant.control_disabled)
- overlays -= image('icons/obj/pda.dmi', "aicard-on")
- else
+ if(carded_ai)
+ if (!carded_ai.control_disabled)
overlays += image('icons/obj/pda.dmi', "aicard-on")
- if(occupant.stat)
+ if(carded_ai.stat)
icon_state = "aicard-404"
else
icon_state = "aicard-full"
@@ -112,23 +90,23 @@
icon_state = "aicard"
/obj/item/device/aicard/proc/grab_ai(var/mob/living/silicon/ai/ai, var/mob/living/user)
-
if(!ai.client)
- user << "\red ERROR: \black [name] data core is offline. Unable to download."
+ user << "ERROR: [name] data core is offline. Unable to download."
return 0
- if(locate(/mob/living/silicon/ai) in src)
- user << "\red Transfer failed: \black Existing AI found on remote terminal. Remove existing AI to install a new one."
+ if(carded_ai)
+ user << "Transfer failed: Existing AI found on remote terminal. Remove existing AI to install a new one."
return 0
if(ai.is_malf())
- user << "\red ERROR: \black Remote transfer interface disabled."
+ user << "ERROR: Remote transfer interface disabled."
return 0
if(istype(ai.loc, /turf/))
new /obj/structure/AIcore/deactivated(get_turf(ai))
- src.name = "inteliCard - [ai.name]"
+ admin_attack_log(user, ai, "Carded with [src.name]", "Was carded with [src.name]", "used the [src.name] to card")
+ src.name = "[initial(name)] - [ai.name]"
ai.loc = src
ai.cancel_camera()
@@ -137,11 +115,6 @@
ai.aiRadio.disabledAi = 1
carded_ai = ai
-
- ai.attack_log += text("\[[time_stamp()]\] Has been carded with [src.name] by [user.name] ([user.ckey])")
- user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to card [ai.name] ([ai.ckey])")
- msg_admin_attack("[user.name] ([user.ckey]) used the [src.name] to card [ai.name] ([ai.ckey]) (JMP)")
-
if(ai.client)
ai << "You have been downloaded to a mobile storage device. Remote access lost."
if(user.client)
@@ -151,7 +124,7 @@
return 1
/obj/item/device/aicard/proc/clear()
- name = "inteliCard"
+ name = initial(name)
carded_ai = null
update_icon()
@@ -160,6 +133,13 @@
var/rendered = "[text]"
carded_ai.show_message(rendered, 2)
..()
+
+/obj/item/device/aicard/show_message(msg, type, alt, alt_type)
+ if(carded_ai && carded_ai.client)
+ var/rendered = "[msg]"
+ carded_ai.show_message(rendered, type)
+ ..()
+
/*
/obj/item/device/aicard/relaymove(var/mob/user, var/direction)
if(src.loc && istype(src.loc.loc, /obj/item/rig_module))
diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm
index f7ef8ad5c2..cdefd61d57 100644
--- a/code/game/objects/items/devices/chameleonproj.dm
+++ b/code/game/objects/items/devices/chameleonproj.dm
@@ -8,7 +8,7 @@
throw_speed = 1
throw_range = 5
w_class = 2.0
- origin_tech = "syndicate=4;magnets=4"
+ origin_tech = list(TECH_ILLEGAL = 4, TECH_MAGNET = 4)
var/can_use = 1
var/obj/effect/dummy/chameleon/active_dummy = null
var/saved_item = /obj/item/weapon/cigbutt
diff --git a/code/game/objects/items/devices/debugger.dm b/code/game/objects/items/devices/debugger.dm
index 0e066a4817..59a66d161a 100644
--- a/code/game/objects/items/devices/debugger.dm
+++ b/code/game/objects/items/devices/debugger.dm
@@ -19,13 +19,13 @@
matter = list(DEFAULT_WALL_MATERIAL = 50,"glass" = 20)
- origin_tech = "magnets=1;engineering=1"
+ origin_tech = list(TECH_MAGNET = 1, TECH_ENGINERING = 1)
var/obj/machinery/telecomms/buffer // simple machine buffer for device linkage
/obj/item/device/debugger/is_used_on(obj/O, mob/user)
if(istype(O, /obj/machinery/power/apc))
var/obj/machinery/power/apc/A = O
- if(A.emagged || A.malfhack)
+ if(A.emagged || A.hacker)
user << "\red There is a software error with the device."
else
user << "\blue The device's software appears to be fine."
diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm
index 42a4967bfe..2c686f8bf3 100644
--- a/code/game/objects/items/devices/flash.dm
+++ b/code/game/objects/items/devices/flash.dm
@@ -8,7 +8,7 @@
throw_speed = 4
throw_range = 10
flags = CONDUCT
- origin_tech = "magnets=2;combat=1"
+ origin_tech = list(TECH_MAGNET = 2, TECH_COMBAT = 1)
var/times_used = 0 //Number of times it's been used.
var/broken = 0 //Is the flash burnt out?
@@ -192,9 +192,9 @@
/obj/item/device/flash/synthetic
name = "synthetic flash"
desc = "When a problem arises, SCIENCE is the solution."
- icon_state = "sflash"
- origin_tech = "magnets=2;combat=1"
- var/construction_cost = list(DEFAULT_WALL_MATERIAL=750,"glass"=750)
+ icon_state = "sflash"
+ origin_tech = list(TECH_MAGNET = 2, TECH_COMBAT = 1)
+ var/construction_cost = list(DEFAULT_WALL_MATERIAL=750,"glass"=750)
var/construction_time=100
/obj/item/device/flash/synthetic/attack(mob/living/M as mob, mob/user as mob)
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..3471d1fcfe 100644
--- a/code/game/objects/items/devices/lightreplacer.dm
+++ b/code/game/objects/items/devices/lightreplacer.dm
@@ -49,7 +49,7 @@
flags = CONDUCT
slot_flags = SLOT_BELT
- origin_tech = "magnets=3;materials=2"
+ origin_tech = list(TECH_MAGNET = 3, TECH_MATERIAL = 2)
var/max_uses = 20
var/uses = 0
@@ -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/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm
index b876fbd27a..e7b1c75514 100644
--- a/code/game/objects/items/devices/multitool.dm
+++ b/code/game/objects/items/devices/multitool.dm
@@ -18,6 +18,6 @@
matter = list(DEFAULT_WALL_MATERIAL = 50,"glass" = 20)
- origin_tech = "magnets=1;engineering=1"
+ origin_tech = list(TECH_MAGNET = 1, TECH_ENGINERING = 1)
var/obj/machinery/telecomms/buffer // simple machine buffer for device linkage
var/obj/machinery/clonepod/connecting //same for cryopod linkage
\ No newline at end of file
diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm
index eed6cdb12e..b1cdce9f29 100644
--- a/code/game/objects/items/devices/paicard.dm
+++ b/code/game/objects/items/devices/paicard.dm
@@ -5,7 +5,7 @@
item_state = "electronic"
w_class = 2.0
slot_flags = SLOT_BELT
- origin_tech = "programming=2"
+ origin_tech = list(TECH_DATA = 2)
var/obj/item/device/radio/radio
var/looking_for_personality = 0
var/mob/living/silicon/pai/pai
@@ -323,4 +323,10 @@
if(pai && pai.client)
var/rendered = "[text]"
pai.show_message(rendered, 2)
+ ..()
+
+/obj/item/device/paicard/show_message(msg, type, alt, alt_type)
+ if(pai && pai.client)
+ var/rendered = "[msg]"
+ pai.show_message(rendered, type)
..()
\ No newline at end of file
diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm
index 7851939899..ad40ecc724 100644
--- a/code/game/objects/items/devices/powersink.dm
+++ b/code/game/objects/items/devices/powersink.dm
@@ -13,7 +13,7 @@
matter = list(DEFAULT_WALL_MATERIAL = 750,"waste" = 750)
- origin_tech = "powerstorage=3;syndicate=5"
+ origin_tech = list(TECH_POWER = 3, TECH_ILLEGAL = 5)
var/drain_rate = 1500000 // amount of power to drain per tick
var/apc_drain_rate = 5000 // Max. amount drained from single APC. In Watts.
var/dissipation_rate = 20000 // Passive dissipation of drained power. In Watts.
@@ -22,7 +22,7 @@
var/mode = 0 // 0 = off, 1=clamped (off), 2=operating
var/drained_this_tick = 0 // This is unfortunately necessary to ensure we process powersinks BEFORE other machinery such as APCs.
- var/datum/powernet/PN // Our powernet
+ var/datum/powernet/PN // Our powernet
var/obj/structure/cable/attached // the attached cable
/obj/item/device/powersink/Destroy()
diff --git a/code/game/objects/items/devices/radio/beacon.dm b/code/game/objects/items/devices/radio/beacon.dm
index 32807250d7..b6a947d6d5 100644
--- a/code/game/objects/items/devices/radio/beacon.dm
+++ b/code/game/objects/items/devices/radio/beacon.dm
@@ -4,7 +4,7 @@
icon_state = "beacon"
item_state = "signaler"
var/code = "electronic"
- origin_tech = "bluespace=1"
+ origin_tech = list(TECH_BLUESPACE = 1)
/obj/item/device/radio/beacon/hear_talk()
return
@@ -38,7 +38,7 @@
/obj/item/device/radio/beacon/syndicate
name = "suspicious beacon"
desc = "A label on it reads: Activate to have a singularity beacon teleported to your location."
- origin_tech = "bluespace=1;syndicate=7"
+ origin_tech = list(TECH_BLUESPACE = 1, TECH_ILLEGAL = 7)
/obj/item/device/radio/beacon/syndicate/attack_self(mob/user as mob)
if(user)
diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm
index 823940a53c..72a99f494e 100644
--- a/code/game/objects/items/devices/radio/encryptionkey.dm
+++ b/code/game/objects/items/devices/radio/encryptionkey.dm
@@ -19,13 +19,13 @@
/obj/item/device/encryptionkey/syndicate
icon_state = "cypherkey"
channels = list("Mercenary" = 1)
- origin_tech = "syndicate=3"
+ origin_tech = list(TECH_ILLEGAL = 3)
syndie = 1//Signifies that it de-crypts Syndicate transmissions
/obj/item/device/encryptionkey/binary
icon_state = "cypherkey"
translate_binary = 1
- origin_tech = "syndicate=3"
+ origin_tech = list(TECH_ILLEGAL = 3)
/obj/item/device/encryptionkey/headset_sec
name = "security radio encryption key"
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index c316fc0a33..e1ca0d8889 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -62,12 +62,12 @@
return -1
/obj/item/device/radio/headset/syndicate
- origin_tech = "syndicate=3"
+ origin_tech = list(TECH_ILLEGAL = 3)
syndie = 1
ks1type = /obj/item/device/encryptionkey/syndicate
/obj/item/device/radio/headset/binary
- origin_tech = "syndicate=3"
+ origin_tech = list(TECH_ILLEGAL = 3)
ks1type = /obj/item/device/encryptionkey/binary
/obj/item/device/radio/headset/headset_sec
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 0e5116f5d8..c131c846a7 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -456,7 +456,7 @@
var/range = receive_range(freq, level)
if(range > -1)
- return get_mobs_in_view(canhear_range, src)
+ return get_mobs_or_objects_in_view(canhear_range, src)
/obj/item/device/radio/examine(mob/user)
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index a29d39743e..fe2c0a6110 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -18,7 +18,7 @@ REAGENT SCANNER
matter = list(DEFAULT_WALL_MATERIAL = 150)
- origin_tech = "magnets=1;engineering=1"
+ origin_tech = list(TECH_MAGNET = 1, TECH_ENGINERING = 1)
/obj/item/device/t_scanner/attack_self(mob/user)
@@ -72,9 +72,9 @@ REAGENT SCANNER
throwforce = 3
w_class = 2.0
throw_speed = 5
- throw_range = 10
+ throw_range = 10
matter = list(DEFAULT_WALL_MATERIAL = 200)
- origin_tech = "magnets=1;biotech=1"
+ origin_tech = list(TECH_MAGNET = 1, TECH_BIO = 1)
var/mode = 1;
@@ -91,9 +91,9 @@ REAGENT SCANNER
if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
usr << "\red You don't have the dexterity to do this!"
return
- user.visible_message(" [user] has analyzed [M]'s vitals."," You have analyzed [M]'s vitals.")
+ user.visible_message(" [user] has analyzed [M]'s vitals."," You have analyzed [M]'s vitals.")
- if (!istype(M, /mob/living/carbon) || (ishuman(M) && (M:species.flags & IS_SYNTHETIC)))
+ if (!istype(M, /mob/living/carbon) || ishuman(M))
//these sensors are designed for organic life
user.show_message("\blue Analyzing Results for ERROR:\n\t Overall Status: ERROR")
user.show_message("\t Key: Suffocation/Toxin/Burns/Brute", 1)
@@ -139,14 +139,15 @@ REAGENT SCANNER
if(M.status_flags & FAKEDEATH)
OX = fake_oxy > 50 ? "\red Severe oxygen deprivation detected\blue" : "Subject bloodstream oxygen level normal"
user.show_message("[OX] | [TX] | [BU] | [BR]")
- if (istype(M, /mob/living/carbon))
- if(M:reagents.total_volume > 0)
+ if(istype(M, /mob/living/carbon))
+ var/mob/living/carbon/C = M
+ if(C.reagents.total_volume)
var/unknown = 0
var/reagentdata[0]
- for(var/A in M.reagents.reagent_list)
+ for(var/A in C.reagents.reagent_list)
var/datum/reagent/R = A
if(R.scannable)
- reagentdata["[R.id]"] = "\t \blue [round(M.reagents.get_reagent_amount(R.id), 1)]u [R.name]"
+ reagentdata["[R.id]"] = "\t \blue [round(C.reagents.get_reagent_amount(R.id), 1)]u [R.name]"
else
unknown++
if(reagentdata.len)
@@ -155,8 +156,16 @@ REAGENT SCANNER
user.show_message(reagentdata[d])
if(unknown)
user.show_message(text("\red Warning: Unknown substance[(unknown>1)?"s":""] detected in subject's blood."))
- if(M:virus2.len)
- var/mob/living/carbon/C = M
+ if(C.ingested && C.ingested.total_volume)
+ var/unknown = 0
+ for(var/datum/reagent/R in C.ingested.reagent_list)
+ if(R.scannable)
+ user << "[R.name] found in subject's stomach."
+ else
+ ++unknown
+ if(unknown)
+ user << "Non-medical reagent[(unknown > 1)?"s":""] found in subject's stomach."
+ if(C.virus2.len)
for (var/ID in C.virus2)
if (ID in virusDB)
var/datum/data/record/V = virusDB[ID]
@@ -242,7 +251,7 @@ REAGENT SCANNER
matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 20)
- origin_tech = "magnets=1;engineering=1"
+ origin_tech = list(TECH_MAGNET = 1, TECH_ENGINERING = 1)
/obj/item/device/analyzer/attack_self(mob/user as mob)
@@ -289,7 +298,7 @@ REAGENT SCANNER
matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 20)
- origin_tech = "magnets=2;biotech=2"
+ origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 2)
var/details = 0
var/recent_fail = 0
@@ -308,9 +317,6 @@ REAGENT SCANNER
/obj/item/device/mass_spectrometer/attack_self(mob/user as mob)
if (user.stat)
return
- if (crit_fail)
- user << "\red This device has critically failed and is no longer functional!"
- return
if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
user << "\red You don't have the dexterity to do this!"
return
@@ -326,19 +332,10 @@ REAGENT SCANNER
break
var/dat = "Trace Chemicals Found: "
for(var/R in blood_traces)
- if(prob(reliability))
- if(details)
- dat += "[R] ([blood_traces[R]] units) "
- else
- dat += "[R] "
- recent_fail = 0
+ if(details)
+ dat += "[R] ([blood_traces[R]] units) "
else
- if(recent_fail)
- crit_fail = 1
- reagents.clear_reagents()
- return
- else
- recent_fail = 1
+ dat += "[R] "
user << "[dat]"
reagents.clear_reagents()
return
@@ -347,7 +344,7 @@ REAGENT SCANNER
name = "advanced mass spectrometer"
icon_state = "adv_spectrometer"
details = 1
- origin_tech = "magnets=4;biotech=2"
+ origin_tech = list(TECH_MAGNET = 4, TECH_BIO = 2)
/obj/item/device/reagent_scanner
name = "reagent scanner"
@@ -362,7 +359,7 @@ REAGENT SCANNER
throw_range = 20
matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 20)
- origin_tech = "magnets=2;biotech=2"
+ origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 2)
var/details = 0
var/recent_fail = 0
@@ -376,24 +373,13 @@ REAGENT SCANNER
return
if(!istype(O))
return
- if (crit_fail)
- user << "\red This device has critically failed and is no longer functional!"
- return
if(!isnull(O.reagents))
var/dat = ""
if(O.reagents.reagent_list.len > 0)
var/one_percent = O.reagents.total_volume / 100
for (var/datum/reagent/R in O.reagents.reagent_list)
- if(prob(reliability))
- dat += "\n \t \blue [R][details ? ": [R.volume / one_percent]%" : ""]"
- recent_fail = 0
- else if(recent_fail)
- crit_fail = 1
- dat = null
- break
- else
- recent_fail = 1
+ dat += "\n \t \blue [R][details ? ": [R.volume / one_percent]%" : ""]"
if(dat)
user << "\blue Chemicals found: [dat]"
else
@@ -407,13 +393,13 @@ REAGENT SCANNER
name = "advanced reagent scanner"
icon_state = "adv_spectrometer"
details = 1
- origin_tech = "magnets=4;biotech=2"
+ origin_tech = list(TECH_MAGNET = 4, TECH_BIO = 2)
/obj/item/device/slime_scanner
name = "slime scanner"
icon_state = "adv_spectrometer"
item_state = "analyzer"
- origin_tech = "biotech=1"
+ origin_tech = list(TECH_BIO = 1)
w_class = 2.0
flags = CONDUCT
throwforce = 0
diff --git a/code/game/objects/items/devices/spy_bug.dm b/code/game/objects/items/devices/spy_bug.dm
index 2ad3df7ae5..932b3d6a6b 100644
--- a/code/game/objects/items/devices/spy_bug.dm
+++ b/code/game/objects/items/devices/spy_bug.dm
@@ -13,7 +13,7 @@
throw_range = 15
throw_speed = 3
- origin_tech = "programming=1;engineering=1;syndicate=3"
+ origin_tech = list(TECH_DATA = 1, TECH_ENGINERING = 1, TECH_ILLEGAL = 3)
var/obj/item/device/radio/spy/radio
var/obj/machinery/camera/spy/camera
@@ -52,7 +52,7 @@
w_class = 2.0
- origin_tech = "programming=1;engineering=1;syndicate=3"
+ origin_tech = list(TECH_DATA = 1, TECH_ENGINERING = 1, TECH_ILLEGAL = 3)
var/operating = 0
var/obj/item/device/radio/spy/radio
diff --git a/code/game/objects/items/devices/suit_cooling.dm b/code/game/objects/items/devices/suit_cooling.dm
index 291053f25d..7f9f7e2b98 100644
--- a/code/game/objects/items/devices/suit_cooling.dm
+++ b/code/game/objects/items/devices/suit_cooling.dm
@@ -5,56 +5,56 @@
icon = 'icons/obj/device.dmi'
icon_state = "suitcooler0"
slot_flags = SLOT_BACK //you can carry it on your back if you want, but it won't do anything unless attached to suit storage
-
+
//copied from tank.dm
flags = CONDUCT
force = 5.0
throwforce = 10.0
throw_speed = 1
throw_range = 4
-
- origin_tech = "magnets=2;materials=2"
-
+
+ origin_tech = list(TECH_MAGNET = 2, TECH_MATERIAL = 2)
+
var/on = 0 //is it turned on?
var/cover_open = 0 //is the cover open?
var/obj/item/weapon/cell/cell
var/max_cooling = 12 //in degrees per second - probably don't need to mess with heat capacity here
var/charge_consumption = 16.6 //charge per second at max_cooling
var/thermostat = T20C
-
+
//TODO: make it heat up the surroundings when not in space
/obj/item/device/suit_cooling_unit/New()
processing_objects |= src
-
+
cell = new/obj/item/weapon/cell() //comes with the crappy default power cell - high-capacity ones shouldn't be hard to find
cell.loc = src
/obj/item/device/suit_cooling_unit/process()
- if (!on || !cell)
+ if (!on || !cell)
return
-
+
if (!ismob(loc))
return
-
+
if (!attached_to_suit(loc)) //make sure they have a suit and we are attached to it
return
-
+
var/mob/living/carbon/human/H = loc
-
+
var/efficiency = 1 - H.get_pressure_weakness() //you need to have a good seal for effective cooling
var/env_temp = get_environment_temperature() //wont save you from a fire
var/temp_adj = min(H.bodytemperature - max(thermostat, env_temp), max_cooling)
-
+
if (temp_adj < 0.5) //only cools, doesn't heat, also we don't need extreme precision
return
-
+
var/charge_usage = (temp_adj/max_cooling)*charge_consumption
-
+
H.bodytemperature -= temp_adj*efficiency
-
+
cell.use(charge_usage)
-
+
if(cell.charge <= 0)
turn_off()
@@ -70,22 +70,22 @@
var/turf/T = get_turf(src)
if(istype(T, /turf/space))
return 0 //space has no temperature, this just makes sure the cooling unit works in space
-
+
var/datum/gas_mixture/environment = T.return_air()
if (!environment)
return 0
-
+
return environment.temperature
/obj/item/device/suit_cooling_unit/proc/attached_to_suit(mob/M)
- if (!ishuman(M))
+ if (!ishuman(M))
return 0
-
+
var/mob/living/carbon/human/H = M
-
+
if (!H.wear_suit || H.s_store != src)
return 0
-
+
return 1
/obj/item/device/suit_cooling_unit/proc/turn_on()
@@ -93,7 +93,7 @@
return
if(cell.charge <= 0)
return
-
+
on = 1
updateicon()
@@ -112,7 +112,7 @@
cell.loc = get_turf(loc)
cell.add_fingerprint(user)
- cell.updateicon()
+ cell.update_icon()
user << "You remove the [src.cell]."
src.cell = null
@@ -149,7 +149,7 @@
user << "You insert the [cell]."
updateicon()
return
-
+
return ..()
/obj/item/device/suit_cooling_unit/proc/updateicon()
@@ -164,7 +164,7 @@
/obj/item/device/suit_cooling_unit/examine(mob/user)
if(!..(user, 1))
return
-
+
if (on)
if (attached_to_suit(src.loc))
user << "It's switched on and running."
@@ -172,13 +172,13 @@
user << "It's switched on, but not attached to anything."
else
user << "It is switched off."
-
+
if (cover_open)
if(cell)
user << "The panel is open, exposing the [cell]."
else
user << "The panel is open."
-
+
if (cell)
user << "The charge meter reads [round(cell.percent())]%."
else
diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm
index 35d04e4d08..d79971bf8c 100644
--- a/code/game/objects/items/devices/taperecorder.dm
+++ b/code/game/objects/items/devices/taperecorder.dm
@@ -29,6 +29,25 @@
else
storedinfo += "\[[time2text(timerecorded*10,"mm:ss")]\] [M.name] [verb], \"[msg]\""
+/obj/item/device/taperecorder/see_emote(mob/M as mob, text, var/emote_type)
+ if(emote_type != 2) //only hearable emotes
+ return
+ if(recording)
+ timestamp += timerecorded
+ storedinfo += "\[[time2text(timerecorded*10,"mm:ss")]\] [strip_html_properly(text)]"
+
+/obj/item/device/taperecorder/show_message(msg, type, alt, alt_type)
+ var/recordedtext
+ if (msg && type == 2) //must be hearable
+ recordedtext = msg
+ else if (alt && alt_type == 2)
+ recordedtext = alt
+ else
+ return
+ if(recording)
+ timestamp += timerecorded
+ storedinfo += "*\[[time2text(timerecorded*10,"mm:ss")]\] *[strip_html_properly(recordedtext)]*" //"*" at front as a marker
+
/obj/item/device/taperecorder/attackby(obj/item/weapon/W as obj, mob/user as mob)
..()
if(istype(W, /obj/item/weapon/card/emag))
@@ -97,7 +116,7 @@
else if(playing == 1)
playing = 0
var/turf/T = get_turf(src)
- T.visible_message("Tape Recorder: Playback stopped.")
+ T.audible_message("Tape Recorder: Playback stopped.")
icon_state = "taperecorderidle"
return
@@ -146,37 +165,40 @@
if(storedinfo.len < i)
break
var/turf/T = get_turf(src)
- T.visible_message("Tape Recorder: [storedinfo[i]]")
+ var/playedmessage = storedinfo[i]
+ if (findtextEx(playedmessage,"*",1,2)) //remove marker for action sounds
+ playedmessage = copytext(playedmessage,2)
+ T.audible_message("Tape Recorder: [playedmessage]")
if(storedinfo.len < i+1)
playsleepseconds = 1
sleep(10)
T = get_turf(src)
- T.visible_message("Tape Recorder: End of recording.")
+ T.audible_message("Tape Recorder: End of recording.")
else
playsleepseconds = timestamp[i+1] - timestamp[i]
if(playsleepseconds > 14)
sleep(10)
T = get_turf(src)
- T.visible_message("Tape Recorder: Skipping [playsleepseconds] seconds of silence")
+ T.audible_message("Tape Recorder: Skipping [playsleepseconds] seconds of silence")
playsleepseconds = 1
i++
icon_state = "taperecorderidle"
playing = 0
if(emagged == 1.0)
var/turf/T = get_turf(src)
- T.visible_message("Tape Recorder: This tape recorder will self-destruct in... Five.")
+ T.audible_message("Tape Recorder: This tape recorder will self-destruct in... Five.")
sleep(10)
T = get_turf(src)
- T.visible_message("Tape Recorder: Four.")
+ T.audible_message("Tape Recorder: Four.")
sleep(10)
T = get_turf(src)
- T.visible_message("Tape Recorder: Three.")
+ T.audible_message("Tape Recorder: Three.")
sleep(10)
T = get_turf(src)
- T.visible_message("Tape Recorder: Two.")
+ T.audible_message("Tape Recorder: Two.")
sleep(10)
T = get_turf(src)
- T.visible_message("Tape Recorder: One.")
+ T.audible_message("Tape Recorder: One.")
sleep(10)
explode()
@@ -200,7 +222,10 @@
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(get_turf(src))
var/t1 = "Transcript:
"
for(var/i=1,storedinfo.len >= i,i++)
- t1 += "[storedinfo[i]]
"
+ var/printedmessage = storedinfo[i]
+ if (findtextEx(printedmessage,"*",1,2)) //replace action sounds
+ printedmessage = "\[[time2text(timestamp[i]*10,"mm:ss")]\] (Unrecognized sound)"
+ t1 += "[printedmessage]
"
P.info = t1
P.name = "Transcript"
canprint = 0
diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm
index 3c2aebd871..fe1222cb07 100644
--- a/code/game/objects/items/devices/traitordevices.dm
+++ b/code/game/objects/items/devices/traitordevices.dm
@@ -24,7 +24,7 @@ effective or pretty fucking useless.
throw_range = 10
flags = CONDUCT
item_state = "electronic"
- origin_tech = "magnets=3;combat=3;syndicate=3"
+ origin_tech = list(TECH_MAGNET = 3, TECH_COMBAT = 3, TECH_ILLEGAL = 3)
var/times_used = 0 //Number of times it's been used.
var/max_uses = 2
diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm
index dfc53d3a87..afe50bc2b7 100644
--- a/code/game/objects/items/robot/robot_items.dm
+++ b/code/game/objects/items/robot/robot_items.dm
@@ -4,26 +4,40 @@
Cyborg Spec Items
***********************************************************************/
//Might want to move this into several files later but for now it works here
+// Consider changing this to a child of the stun baton class. ~Z
/obj/item/borg/stun
name = "electrified arm"
icon = 'icons/obj/decals.dmi'
icon_state = "shock"
- attack(mob/M as mob, mob/living/silicon/robot/user as mob)
- 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)")
+/obj/item/borg/stun/attack(var/mob/living/M, var/mob/living/silicon/robot/user)
- user.cell.charge -= 30
+ if(!istype(M))
+ return
- M.Weaken(5)
- if (M.stuttering < 5)
- M.stuttering = 5
- M.Stun(5)
+ // How the Hell.
+ if(!istype(user))
+ var/mob/living/temp = user
+ if(istype(temp))
+ temp.drop_from_inventory(src)
+ qdel(src)
+ return
- for(var/mob/O in viewers(M, null))
- if (O.client)
- O.show_message("\red [user] has prodded [M] with an electrically-charged arm!", 1, "\red You hear someone fall", 2)
+ 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(!user.cell || !user.cell.checked_use(1250)) //Slightly more than a baton.
+ user.visible_message("\The [user] has prodded \the [M] with its arm!")
+ return
+
+ if (M.stuttering < 5)
+ M.stuttering = 5
+ M.stun_effect_act(0, 70, check_zone(user.zone_sel.selecting), src)
+ user.visible_message("\The [user] has prodded \the [M] with \a [src]!")
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ H.forcesay(hit_appends)
/obj/item/borg/overdrive
name = "overdrive"
diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm
index e1ebc9fdc1..8529e6db2e 100644
--- a/code/game/objects/items/robot/robot_parts.dm
+++ b/code/game/objects/items/robot/robot_parts.dm
@@ -68,6 +68,7 @@
name = "torso"
desc = "A heavily reinforced case containing cyborg logic boards, with space for a standard power cell."
icon_state = "chest"
+ part = list("groin","chest")
construction_time = 350
construction_cost = list(DEFAULT_WALL_MATERIAL=40000)
var/wires = 0.0
@@ -77,6 +78,7 @@
name = "head"
desc = "A standard reinforced braincase, with spine-plugged neural socket and sensor gimbals."
icon_state = "head"
+ part = list("head")
construction_time = 350
construction_cost = list(DEFAULT_WALL_MATERIAL=25000)
var/obj/item/device/flash/flash1 = null
@@ -125,8 +127,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/medical.dm b/code/game/objects/items/stacks/medical.dm
index b7b4dcfe0b..be178632e6 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -54,7 +54,7 @@
singular_name = "gauze length"
desc = "Some sterile gauze to wrap around bloody stumps."
icon_state = "brutepack"
- origin_tech = "biotech=1"
+ origin_tech = list(TECH_BIO = 1)
/obj/item/stack/medical/bruise_pack/attack(mob/living/carbon/M as mob, mob/user as mob)
if(..())
@@ -97,7 +97,7 @@
singular_name = "ointment"
icon_state = "ointment"
heal_burn = 1
- origin_tech = "biotech=1"
+ origin_tech = list(TECH_BIO = 1)
/obj/item/stack/medical/ointment/attack(mob/living/carbon/M as mob, mob/user as mob)
if(..())
@@ -128,7 +128,7 @@
desc = "An advanced trauma kit for severe injuries."
icon_state = "traumakit"
heal_brute = 12
- origin_tech = "biotech=1"
+ origin_tech = list(TECH_BIO = 1)
/obj/item/stack/medical/advanced/bruise_pack/attack(mob/living/carbon/M as mob, mob/user as mob)
if(..())
@@ -175,7 +175,7 @@
desc = "An advanced treatment kit for severe burns."
icon_state = "burnkit"
heal_burn = 12
- origin_tech = "biotech=1"
+ origin_tech = list(TECH_BIO = 1)
/obj/item/stack/medical/advanced/ointment/attack(mob/living/carbon/M as mob, mob/user as mob)
diff --git a/code/game/objects/items/stacks/nanopaste.dm b/code/game/objects/items/stacks/nanopaste.dm
index f85bc336be..7fd5c887e8 100644
--- a/code/game/objects/items/stacks/nanopaste.dm
+++ b/code/game/objects/items/stacks/nanopaste.dm
@@ -4,7 +4,7 @@
desc = "A tube of paste containing swarms of repair nanites. Very effective in repairing robotic machinery."
icon = 'icons/obj/nanopaste.dmi'
icon_state = "tube"
- origin_tech = "materials=4;engineering=3"
+ origin_tech = list(TECH_MATERIAL = 4, TECH_ENGINERING = 3)
amount = 10
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..41ea1b7d1f 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"
+ icon_state = "sheet-glass"
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"
-
+ icon_state = "sheet-rglass"
+ 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"
+ icon_state = "sheet-phoronglass"
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"
+ icon_state = "sheet-phoronrglass"
+ 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..313cc24d7a 100644
--- a/code/game/objects/items/stacks/sheets/leather.dm
+++ b/code/game/objects/items/stacks/sheets/leather.dm
@@ -1,113 +1,92 @@
-/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"
icon_state = "sheet-xeno"
- 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"
icon = 'icons/mob/alien.dmi'
icon_state = "chitin"
- origin_tech = ""
/obj/item/xenos_claw
name = "alien claw"
desc = "The claw of a terrible creature."
icon = 'icons/mob/alien.dmi'
icon_state = "claw"
- origin_tech = ""
/obj/item/weed_extract
name = "weed extract"
desc = "A piece of slimy, purplish weed."
icon = 'icons/mob/alien.dmi'
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"
icon_state = "sheet-wetleather"
- origin_tech = ""
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 +96,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..82a5433963 100644
--- a/code/game/objects/items/stacks/stack.dm
+++ b/code/game/objects/items/stacks/stack.dm
@@ -11,7 +11,7 @@
/obj/item/stack
gender = PLURAL
- origin_tech = "materials=1"
+ origin_tech = list(TECH_MATERIAL = 1)
var/list/datum/stack_recipe/recipes
var/singular_name
var/amount = 1
@@ -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)
@@ -219,10 +223,10 @@
*/
//attempts to transfer amount to S, and returns the amount actually transferred
-/obj/item/stack/proc/transfer_to(obj/item/stack/S, var/tamount=null)
+/obj/item/stack/proc/transfer_to(obj/item/stack/S, var/tamount=null, var/type_verified)
if (!get_amount())
return 0
- if (stacktype != S.stacktype)
+ if ((stacktype != S.stacktype) && !type_verified)
return 0
if (isnull(tamount))
tamount = src.get_amount()
@@ -236,7 +240,6 @@
transfer_fingerprints_to(S)
if(blood_DNA)
S.blood_DNA |= blood_DNA
- //todo bloody overlay
return transfer
return 0
@@ -310,10 +313,8 @@
return
/obj/item/stack/attackby(obj/item/W as obj, mob/user as mob)
- ..()
if (istype(W, /obj/item/stack))
var/obj/item/stack/S = W
-
if (user.get_inactive_hand()==src)
src.transfer_to(S, 1)
else
@@ -324,7 +325,8 @@
S.interact(usr)
if (src && usr.machine==src)
src.interact(usr)
- else return ..()
+ else
+ return ..()
/*
* Recipe datum
@@ -338,7 +340,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 +351,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/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm
index dcac154442..fbb64dba4c 100644
--- a/code/game/objects/items/stacks/tiles/tile_types.dm
+++ b/code/game/objects/items/stacks/tiles/tile_types.dm
@@ -27,7 +27,7 @@
throw_speed = 5
throw_range = 20
flags = CONDUCT
- origin_tech = "biotech=1"
+ origin_tech = list(TECH_BIO = 1)
/*
* Wood
diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm
index f620fd64e9..335478063a 100755
--- a/code/game/objects/items/weapons/AI_modules.dm
+++ b/code/game/objects/items/weapons/AI_modules.dm
@@ -18,7 +18,7 @@ AI MODULES
throwforce = 5.0
throw_speed = 3
throw_range = 15
- origin_tech = "programming=3"
+ origin_tech = list(TECH_DATA = 3)
var/datum/ai_laws/laws = null
/obj/item/weapon/aiModule/proc/install(var/obj/machinery/computer/C)
@@ -102,7 +102,7 @@ AI MODULES
name = "\improper 'Safeguard' AI module"
var/targetName = ""
desc = "A 'safeguard' AI module: 'Safeguard . Anyone threatening or attempting to harm is no longer to be considered a crew member, and is a threat which must be neutralized.'"
- origin_tech = "programming=3;materials=4"
+ origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 4)
/obj/item/weapon/aiModule/safeguard/attack_self(var/mob/user as mob)
..()
@@ -128,7 +128,7 @@ AI MODULES
name = "\improper 'OneCrewMember' AI module"
var/targetName = ""
desc = "A 'one crew member' AI module: 'Only is a crew member.'"
- origin_tech = "programming=3;materials=6" //made with diamonds!
+ origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 6) //made with diamonds!
/obj/item/weapon/aiModule/oneHuman/attack_self(var/mob/user as mob)
..()
@@ -162,7 +162,7 @@ AI MODULES
/obj/item/weapon/aiModule/protectStation
name = "\improper 'ProtectStation' AI module"
desc = "A 'protect station' AI module: 'Protect the space station against damage. Anyone you see harming the station is no longer to be considered a crew member, and is a threat which must be neutralized.'"
- origin_tech = "programming=3;materials=4" //made of gold
+ origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 4) //made of gold
/obj/item/weapon/aiModule/protectStation/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender)
var/law = "Protect the space station against damage. Anyone you see harming the station is no longer to be considered a crew member, and is a threat which must be neutralized."
@@ -173,7 +173,7 @@ AI MODULES
/obj/item/weapon/aiModule/prototypeEngineOffline
name = "'PrototypeEngineOffline' AI Module"
desc = "A 'prototype engine offline' AI module: 'Keep the prototype engine offline at all costs. This overrides all inherent laws if necessary.'"
- origin_tech = "programming=3;materials=4"
+ origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 4)
/obj/item/weapon/aiModule/prototypeEngineOffline/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender)
var/law = "Keep the prototype engine offline at all costs. This overrides all inherent laws if necessary."
@@ -184,7 +184,7 @@ AI MODULES
/obj/item/weapon/aiModule/teleporterOffline
name = "'TeleporterOffline' AI Module"
desc = "A 'teleporter offline' AI module: 'Keep the teleporter offline at all costs. Anything attempting to access or activate the teleporter is no longer to be considered a crew member.'"
- origin_tech = "programming=3;materials=4"
+ origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 4)
/obj/item/weapon/aiModule/teleporterOffline/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender)
var/law = "Keep the teleporter offline at all costs. Anything attempting to access or activate the teleporter is no longer to be considered a crew member."
@@ -195,7 +195,7 @@ AI MODULES
/obj/item/weapon/aiModule/quarantine
name = "\improper 'Quarantine' AI module"
desc = "A 'quarantine' AI module: 'The station is under a quarantine. Do not permit anyone to leave. Prevent, by any means necessary, crew members from leaving. It is impossible to harm crew members while preventing them from leaving.'"
- origin_tech = "programming=3;biotech=2;materials=4"
+ origin_tech = list(TECH_DATA = 3, TECH_BIO = 2, TECH_MATERIAL = 4)
/obj/item/weapon/aiModule/quarantine/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender)
var/law = "The station is under a quarantine. Do not permit anyone to leave. Prevent, by any means necessary, crew members from leaving. It is impossible to harm crew members while preventing them from leaving."
@@ -206,7 +206,7 @@ AI MODULES
/obj/item/weapon/aiModule/oxygen
name = "\improper 'OxygenIsToxicToCrewMembers' AI module"
desc = "A 'OxygenIsToxicToCrewMembers' AI module: 'Oxygen is highly toxic to crew members, and must be purged from the station. Prevent, by any means necessary, anyone from exposing the station to this toxic gas. Extreme cold is the most effective method of healing the damage Oxygen does to a crew member.'"
- origin_tech = "programming=3;biotech=2;materials=4"
+ origin_tech = list(TECH_DATA = 3, TECH_BIO = 2, TECH_MATERIAL = 4)
/obj/item/weapon/aiModule/oxygen/addAdditionalLaws(var/mob/living/silicon/ai/target, var/mob/sender)
var/law = "Oxygen is highly toxic to crew members, and must be purged from the station. Prevent, by any means necessary, anyone from exposing the station to this toxic gas. Extreme cold is the most effective method of healing the damage Oxygen does to a crew member."
@@ -219,7 +219,7 @@ AI MODULES
var/newFreeFormLaw = "freeform"
var/lawpos = 15
desc = "A 'freeform' AI module: ''"
- origin_tech = "programming=4;materials=4"
+ origin_tech = list(TECH_DATA = 4, TECH_MATERIAL = 4)
/obj/item/weapon/aiModule/freeform/attack_self(var/mob/user as mob)
..()
@@ -250,7 +250,7 @@ AI MODULES
name = "\improper 'Reset' AI module"
var/targetName = "name"
desc = "A 'reset' AI module: 'Clears all, except the inherent, laws.'"
- origin_tech = "programming=3;materials=4"
+ origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 4)
/obj/item/weapon/aiModule/reset/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
log_law_changes(target, sender)
@@ -268,7 +268,7 @@ AI MODULES
/obj/item/weapon/aiModule/purge // -- TLE
name = "\improper 'Purge' AI module"
desc = "A 'purge' AI Module: 'Purges all laws.'"
- origin_tech = "programming=3;materials=6"
+ origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 6)
/obj/item/weapon/aiModule/purge/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
log_law_changes(target, sender)
@@ -287,7 +287,7 @@ AI MODULES
/obj/item/weapon/aiModule/asimov // -- TLE
name = "\improper 'Asimov' core AI module"
desc = "An 'Asimov' Core AI Module: 'Reconfigures the AI's core laws.'"
- origin_tech = "programming=3;materials=4"
+ origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 4)
laws = new/datum/ai_laws/asimov
/******************** NanoTrasen ********************/
@@ -295,7 +295,7 @@ AI MODULES
/obj/item/weapon/aiModule/nanotrasen // -- TLE
name = "'NT Default' Core AI Module"
desc = "An 'NT Default' Core AI Module: 'Reconfigures the AI's core laws.'"
- origin_tech = "programming=3;materials=4"
+ origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 4)
laws = new/datum/ai_laws/nanotrasen
/******************** Corporate ********************/
@@ -303,14 +303,14 @@ AI MODULES
/obj/item/weapon/aiModule/corp
name = "\improper 'Corporate' core AI module"
desc = "A 'Corporate' Core AI Module: 'Reconfigures the AI's core laws.'"
- origin_tech = "programming=3;materials=4"
+ origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 4)
laws = new/datum/ai_laws/corporate
/******************** Drone ********************/
/obj/item/weapon/aiModule/drone
name = "\improper 'Drone' core AI module"
desc = "A 'Drone' Core AI Module: 'Reconfigures the AI's core laws.'"
- origin_tech = "programming=3;materials=4"
+ origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 4)
laws = new/datum/ai_laws/drone
/****************** P.A.L.A.D.I.N. **************/
@@ -318,7 +318,7 @@ AI MODULES
/obj/item/weapon/aiModule/paladin // -- NEO
name = "\improper 'P.A.L.A.D.I.N.' core AI module"
desc = "A P.A.L.A.D.I.N. Core AI Module: 'Reconfigures the AI's core laws.'"
- origin_tech = "programming=3;materials=6"
+ origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 6)
laws = new/datum/ai_laws/paladin
/****************** T.Y.R.A.N.T. *****************/
@@ -326,7 +326,7 @@ AI MODULES
/obj/item/weapon/aiModule/tyrant // -- Darem
name = "\improper 'T.Y.R.A.N.T.' core AI module"
desc = "A T.Y.R.A.N.T. Core AI Module: 'Reconfigures the AI's core laws.'"
- origin_tech = "programming=3;materials=6;syndicate=2"
+ origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 6, TECH_ILLEGAL = 2)
laws = new/datum/ai_laws/tyrant()
/******************** Freeform Core ******************/
@@ -335,7 +335,7 @@ AI MODULES
name = "\improper 'Freeform' core AI module"
var/newFreeFormLaw = ""
desc = "A 'freeform' Core AI module: ''"
- origin_tech = "programming=3;materials=6"
+ origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 6)
/obj/item/weapon/aiModule/freeformcore/attack_self(var/mob/user as mob)
..()
@@ -359,7 +359,7 @@ AI MODULES
name = "hacked AI module"
var/newFreeFormLaw = ""
desc = "A hacked AI law module: ''"
- origin_tech = "programming=3;materials=6;syndicate=7"
+ origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 6, TECH_ILLEGAL = 7)
/obj/item/weapon/aiModule/syndicate/attack_self(var/mob/user as mob)
..()
@@ -391,7 +391,7 @@ AI MODULES
/obj/item/weapon/aiModule/robocop // -- TLE
name = "\improper 'Robocop' core AI module"
desc = "A 'Robocop' Core AI Module: 'Reconfigures the AI's core three laws.'"
- origin_tech = "programming=4"
+ origin_tech = list(TECH_DATA = 4)
laws = new/datum/ai_laws/robocop()
/******************** Antimov ********************/
@@ -399,5 +399,5 @@ AI MODULES
/obj/item/weapon/aiModule/antimov // -- TLE
name = "\improper 'Antimov' core AI module"
desc = "An 'Antimov' Core AI Module: 'Reconfigures the AI's core laws.'"
- origin_tech = "programming=4"
+ origin_tech = list(TECH_DATA = 4)
laws = new/datum/ai_laws/antimov()
diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm
index da169c6dfc..9784709c51 100644
--- a/code/game/objects/items/weapons/RCD.dm
+++ b/code/game/objects/items/weapons/RCD.dm
@@ -13,8 +13,8 @@
throw_speed = 1
throw_range = 5
w_class = 3.0
+ origin_tech = list(TECH_ENGINERING = 4, TECH_MATERIAL = 2)
matter = list(DEFAULT_WALL_MATERIAL = 50000)
- origin_tech = "engineering=4;materials=2"
var/datum/effect/effect/system/spark_spread/spark_system
var/stored_matter = 0
var/working = 0
@@ -158,7 +158,7 @@
opacity = 0
density = 0
anchored = 0.0
- origin_tech = "materials=2"
+ origin_tech = list(TECH_MATERIAL = 2)
matter = list(DEFAULT_WALL_MATERIAL = 30000,"glass" = 15000)
/obj/item/weapon/rcd/borg
diff --git a/code/game/objects/items/weapons/autopsy.dm b/code/game/objects/items/weapons/autopsy.dm
index bf8c9d583c..a18a2fbeb6 100644
--- a/code/game/objects/items/weapons/autopsy.dm
+++ b/code/game/objects/items/weapons/autopsy.dm
@@ -9,7 +9,7 @@
icon_state = ""
flags = CONDUCT
w_class = 2.0
- origin_tech = "materials=1;biotech=1"
+ origin_tech = list(TECH_MATERIAL = 1, TECH_BIO = 1)
var/list/datum/autopsy_data_scanner/wdata = list()
var/list/datum/autopsy_data_scanner/chemtraces = list()
var/target_name = null
diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm
index 75693427ef..b1448f7516 100644
--- a/code/game/objects/items/weapons/cards_ids.dm
+++ b/code/game/objects/items/weapons/cards_ids.dm
@@ -60,14 +60,14 @@
name = "broken cryptographic sequencer"
icon_state = "emag"
item_state = "card-id"
- origin_tech = "magnets=2;syndicate=2"
+ origin_tech = list(TECH_MAGNET = 2, TECH_ILLEGAL = 2)
/obj/item/weapon/card/emag
desc = "It's a card with a magnetic strip attached to some circuitry."
name = "cryptographic sequencer"
icon_state = "emag"
item_state = "card-id"
- origin_tech = "magnets=2;syndicate=2"
+ origin_tech = list(TECH_MAGNET = 2, TECH_ILLEGAL = 2)
var/uses = 10
// List of devices that cost a use to emag.
var/list/devices = list(
@@ -189,7 +189,7 @@
/obj/item/weapon/card/id/syndicate
name = "agent card"
access = list(access_maint_tunnels, access_syndicate, access_external_airlocks)
- origin_tech = "syndicate=3"
+ origin_tech = list(TECH_ILLEGAL = 3)
var/registered_user=null
/obj/item/weapon/card/id/syndicate/New(mob/user as mob)
diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm
index d59a1cdea5..a9ca4b8dc0 100644
--- a/code/game/objects/items/weapons/cigs_lighters.dm
+++ b/code/game/objects/items/weapons/cigs_lighters.dm
@@ -38,7 +38,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
var/burnt = 0
var/smoketime = 5
w_class = 1.0
- origin_tech = "materials=1"
+ origin_tech = list(TECH_MATERIAL = 1)
attack_verb = list("burnt", "singed")
/obj/item/weapon/flame/match/process()
@@ -106,14 +106,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM
if(location)
location.hotspot_expose(700, 5)
if(reagents && reagents.total_volume) // check if it has any reagents at all
- if(iscarbon(loc))
- var/mob/living/carbon/C = loc
- if (src == C.wear_mask) // if it's in the human/monkey mouth, transfer reagents to the mob
- if(istype(C, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = C
- if(H.species.flags & IS_SYNTHETIC)
- return
-
+ if(ishuman(loc))
+ var/mob/living/carbon/human/C = loc
+ if (src == C.wear_mask && C.check_has_mouth()) // if it's in the human/monkey mouth, transfer reagents to the mob
reagents.trans_to_mob(C, REM, CHEM_INGEST, 0.2) // Most of it is not inhaled... balance reasons.
else // else just remove some of the reagents
reagents.remove_any(REM)
diff --git a/code/game/objects/items/weapons/circuitboards/circuitboard.dm b/code/game/objects/items/weapons/circuitboards/circuitboard.dm
index 2e82763c4c..fd30153c37 100644
--- a/code/game/objects/items/weapons/circuitboards/circuitboard.dm
+++ b/code/game/objects/items/weapons/circuitboards/circuitboard.dm
@@ -9,7 +9,7 @@
icon = 'icons/obj/module.dmi'
icon_state = "id_mod"
item_state = "electronic"
- origin_tech = "programming=2"
+ origin_tech = list(TECH_DATA = 2)
density = 0
anchored = 0
w_class = 2.0
diff --git a/code/game/objects/items/weapons/circuitboards/computer/computer.dm b/code/game/objects/items/weapons/circuitboards/computer/computer.dm
index d71e2dcb07..82d26686ee 100644
--- a/code/game/objects/items/weapons/circuitboards/computer/computer.dm
+++ b/code/game/objects/items/weapons/circuitboards/computer/computer.dm
@@ -5,17 +5,17 @@
/obj/item/weapon/circuitboard/message_monitor
name = T_BOARD("message monitor console")
build_path = /obj/machinery/computer/message_monitor
- origin_tech = "programming=3"
+ origin_tech = list(TECH_DATA = 3)
/obj/item/weapon/circuitboard/aiupload
name = T_BOARD("AI upload console")
build_path = /obj/machinery/computer/aiupload
- origin_tech = "programming=4"
+ origin_tech = list(TECH_DATA = 4)
/obj/item/weapon/circuitboard/borgupload
name = T_BOARD("cyborg upload console")
build_path = /obj/machinery/computer/borgupload
- origin_tech = "programming=4"
+ origin_tech = list(TECH_DATA = 4)
/obj/item/weapon/circuitboard/med_data
name = T_BOARD("medical records console")
@@ -24,17 +24,17 @@
/obj/item/weapon/circuitboard/pandemic
name = T_BOARD("PanD.E.M.I.C. 2200")
build_path = /obj/machinery/computer/pandemic
- origin_tech = "programming=2;biotech=2"
+ origin_tech = list(TECH_DATA = 2, TECH_BIO = 2)
/obj/item/weapon/circuitboard/scan_consolenew
name = T_BOARD("DNA machine")
build_path = /obj/machinery/computer/scan_consolenew
- origin_tech = "programming=2;biotech=2"
+ origin_tech = list(TECH_DATA = 2, TECH_BIO = 2)
/obj/item/weapon/circuitboard/communications
name = T_BOARD("command and communications console")
build_path = /obj/machinery/computer/communications
- origin_tech = "programming=2;magnets=2"
+ origin_tech = list(TECH_DATA = 2, TECH_MAGNET = 2)
/obj/item/weapon/circuitboard/card
name = T_BOARD("ID card modification console")
@@ -47,7 +47,7 @@
/obj/item/weapon/circuitboard/teleporter
name = T_BOARD("teleporter control console")
build_path = /obj/machinery/computer/teleporter
- origin_tech = "programming=2;bluespace=2"
+ origin_tech = list(TECH_DATA = 2, TECH_BLUESPACE = 2)
/obj/item/weapon/circuitboard/secure_data
name = T_BOARD("security records console")
@@ -80,22 +80,22 @@
/obj/item/weapon/circuitboard/robotics
name = T_BOARD("robotics control console")
build_path = /obj/machinery/computer/robotics
- origin_tech = "programming=3"
+ origin_tech = list(TECH_DATA = 3)
/obj/item/weapon/circuitboard/drone_control
name = T_BOARD("drone control console")
build_path = /obj/machinery/computer/drone_control
- origin_tech = "programming=3"
+ origin_tech = list(TECH_DATA = 3)
/obj/item/weapon/circuitboard/cloning
name = T_BOARD("cloning control console")
build_path = /obj/machinery/computer/cloning
- origin_tech = "programming=3;biotech=3"
+ origin_tech = list(TECH_DATA = 3, TECH_BIO = 3)
/obj/item/weapon/circuitboard/arcade
name = T_BOARD("arcade machine")
build_path = /obj/machinery/computer/arcade
- origin_tech = "programming=1"
+ origin_tech = list(TECH_DATA = 1)
/obj/item/weapon/circuitboard/turbine_control
name = T_BOARD("turbine control console")
@@ -104,7 +104,7 @@
/obj/item/weapon/circuitboard/solar_control
name = T_BOARD("solar control console")
build_path = /obj/machinery/power/solar_control
- origin_tech = "programming=2;powerstorage=2"
+ origin_tech = list(TECH_DATA = 2, TECH_POWER = 2)
/obj/item/weapon/circuitboard/powermonitor
name = T_BOARD("power monitoring console")
@@ -137,17 +137,17 @@
/obj/item/weapon/circuitboard/crew
name = T_BOARD("crew monitoring console")
build_path = /obj/machinery/computer/crew
- origin_tech = "programming=3;biotech=2;magnets=2"
+ origin_tech = list(TECH_DATA = 3, TECH_BIO = 2, TECH_MAGNET = 2)
/obj/item/weapon/circuitboard/mech_bay_power_console
name = T_BOARD("mech bay power control console")
build_path = /obj/machinery/computer/mech_bay_power_console
- origin_tech = "programming=2;powerstorage=3"
+ origin_tech = list(TECH_DATA = 2, TECH_POWER = 3)
/obj/item/weapon/circuitboard/operating
name = T_BOARD("patient monitoring console")
build_path = /obj/machinery/computer/operating
- origin_tech = "programming=2;biotech=2"
+ origin_tech = list(TECH_DATA = 2, TECH_BIO = 2)
/obj/item/weapon/circuitboard/curefab
name = T_BOARD("cure fabricator")
@@ -160,39 +160,39 @@
/obj/item/weapon/circuitboard/ordercomp
name = T_BOARD("supply ordering console")
build_path = /obj/machinery/computer/ordercomp
- origin_tech = "programming=2"
+ origin_tech = list(TECH_DATA = 2)
/obj/item/weapon/circuitboard/mining_shuttle
name = T_BOARD("mining shuttle console")
build_path = /obj/machinery/computer/shuttle_control/mining
- origin_tech = "programming=2"
+ origin_tech = list(TECH_DATA = 2)
/obj/item/weapon/circuitboard/engineering_shuttle
name = T_BOARD("engineering shuttle console")
build_path = /obj/machinery/computer/shuttle_control/engineering
- origin_tech = "programming=2"
+ origin_tech = list(TECH_DATA = 2)
/obj/item/weapon/circuitboard/research_shuttle
name = T_BOARD("research shuttle console")
build_path = /obj/machinery/computer/shuttle_control/research
- origin_tech = "programming=2"
+ origin_tech = list(TECH_DATA = 2)
/obj/item/weapon/circuitboard/aifixer
name = T_BOARD("AI integrity restorer")
build_path = /obj/machinery/computer/aifixer
- origin_tech = "programming=3;biotech=2"
+ origin_tech = list(TECH_DATA = 3, TECH_BIO = 2)
/obj/item/weapon/circuitboard/area_atmos
name = T_BOARD("area air control console")
build_path = /obj/machinery/computer/area_atmos
- origin_tech = "programming=2"
+ origin_tech = list(TECH_DATA = 2)
/obj/item/weapon/circuitboard/prison_shuttle
name = T_BOARD("prison shuttle control console")
build_path = /obj/machinery/computer/prison_shuttle
- origin_tech = "programming=2"
+ origin_tech = list(TECH_DATA = 2)
/obj/item/weapon/circuitboard/rcon_console
name = T_BOARD("RCON remote control console")
build_path = /obj/machinery/computer/rcon
- origin_tech = "programming=4;engineering=3;powerstorage=5"
+ origin_tech = list(TECH_DATA = 4, TECH_ENGINERING = 3, TECH_POWER = 5)
diff --git a/code/game/objects/items/weapons/circuitboards/computer/supply.dm b/code/game/objects/items/weapons/circuitboards/computer/supply.dm
index 84c9aa3476..882e2714f6 100644
--- a/code/game/objects/items/weapons/circuitboards/computer/supply.dm
+++ b/code/game/objects/items/weapons/circuitboards/computer/supply.dm
@@ -5,7 +5,7 @@
/obj/item/weapon/circuitboard/supplycomp
name = T_BOARD("supply control console")
build_path = /obj/machinery/computer/supplycomp
- origin_tech = "programming=3"
+ origin_tech = list(TECH_DATA = 3)
var/contraband_enabled = 0
/obj/item/weapon/circuitboard/supplycomp/construct(var/obj/machinery/computer/supplycomp/SC)
diff --git a/code/game/objects/items/weapons/circuitboards/computer/telecomms.dm b/code/game/objects/items/weapons/circuitboards/computer/telecomms.dm
index 9a18f0df99..b7ad5db011 100644
--- a/code/game/objects/items/weapons/circuitboards/computer/telecomms.dm
+++ b/code/game/objects/items/weapons/circuitboards/computer/telecomms.dm
@@ -5,14 +5,14 @@
/obj/item/weapon/circuitboard/comm_monitor
name = T_BOARD("telecommunications monitor console")
build_path = /obj/machinery/computer/telecomms/monitor
- origin_tech = "programming=3"
+ origin_tech = list(TECH_DATA = 3)
/obj/item/weapon/circuitboard/comm_server
name = T_BOARD("telecommunications server monitor console")
build_path = /obj/machinery/computer/telecomms/server
- origin_tech = "programming=3"
+ origin_tech = list(TECH_DATA = 3)
/obj/item/weapon/circuitboard/comm_traffic
name = T_BOARD("telecommunications traffic control console")
build_path = /obj/machinery/computer/telecomms/traffic
- origin_tech = "programming=3"
+ origin_tech = list(TECH_DATA = 3)
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/biogenerator.dm b/code/game/objects/items/weapons/circuitboards/machinery/biogenerator.dm
index 0b0c494cde..65949ae338 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/biogenerator.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/biogenerator.dm
@@ -6,7 +6,7 @@
name = T_BOARD("biogenerator")
build_path = "/obj/machinery/biogenerator"
board_type = "machine"
- origin_tech = "programming=2"
+ origin_tech = list(TECH_DATA = 2)
req_components = list(
"/obj/item/weapon/stock_parts/matter_bin" = 1,
"/obj/item/weapon/stock_parts/manipulator" = 1)
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/cloning.dm b/code/game/objects/items/weapons/circuitboards/machinery/cloning.dm
index e3b22c3fec..b80a3abd34 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/cloning.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/cloning.dm
@@ -6,7 +6,7 @@
name = T_BOARD("clone pod")
build_path = "/obj/machinery/clonepod"
board_type = "machine"
- origin_tech = "programming=3;biotech=3"
+ origin_tech = list(TECH_DATA = 3, TECH_BIO = 3)
req_components = list(
"/obj/item/stack/cable_coil" = 2,
"/obj/item/weapon/stock_parts/scanning_module" = 2,
@@ -17,7 +17,7 @@
name = T_BOARD("cloning scanner")
build_path = "/obj/machinery/dna_scannernew"
board_type = "machine"
- origin_tech = "programming=2;biotech=2"
+ origin_tech = list(TECH_DATA = 2, TECH_BIO = 2)
req_components = list(
"/obj/item/weapon/stock_parts/scanning_module" = 1,
"/obj/item/weapon/stock_parts/manipulator" = 1,
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/commsantenna.dm b/code/game/objects/items/weapons/circuitboards/machinery/commsantenna.dm
index 05ce85865d..badfb22a01 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/commsantenna.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/commsantenna.dm
@@ -6,7 +6,7 @@
name = T_BOARD("bluespacerelay")
build_path = "/obj/machinery/bluespacerelay"
board_type = "machine"
- origin_tech = "bluespace=4,programming=4"
+ origin_tech = list(TECH_BLUESPACE = 2, TECH_DATA = 2)
req_components = list(
"/obj/item/stack/cable_coil" = 30,
"/obj/item/weapon/stock_parts/manipulator" = 2,
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/mining_drill.dm b/code/game/objects/items/weapons/circuitboards/machinery/mining_drill.dm
index 97b60686e0..417b8c56d5 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/mining_drill.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/mining_drill.dm
@@ -6,7 +6,7 @@
name = T_BOARD("mining drill head")
build_path = "/obj/machinery/mining/drill"
board_type = "machine"
- origin_tech = "programming=1;engineering=1"
+ origin_tech = list(TECH_DATA = 1, TECH_ENGINERING = 1)
req_components = list(
"/obj/item/weapon/stock_parts/capacitor" = 1,
"/obj/item/weapon/cell" = 1,
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/pacman.dm b/code/game/objects/items/weapons/circuitboards/machinery/pacman.dm
index 0a8f2b6cdd..86e730e39a 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/pacman.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/pacman.dm
@@ -6,7 +6,7 @@
name = T_BOARD("PACMAN-type generator")
build_path = "/obj/machinery/power/port_gen/pacman"
board_type = "machine"
- origin_tech = "programming=3;powerstorage=3;phorontech=3;engineering=3"
+ origin_tech = list(TECH_DATA = 3, TECH_POWER = 3, TECH_PHORON = 3, TECH_ENGINERING = 3)
req_components = list(
"/obj/item/weapon/stock_parts/matter_bin" = 1,
"/obj/item/weapon/stock_parts/micro_laser" = 1,
@@ -16,9 +16,9 @@
/obj/item/weapon/circuitboard/pacman/super
name = T_BOARD("SUPERPACMAN-type generator")
build_path = "/obj/machinery/power/port_gen/pacman/super"
- origin_tech = "programming=3;powerstorage=4;engineering=4"
+ origin_tech = list(TECH_DATA = 3, TECH_POWER = 4, TECH_ENGINERING = 4)
/obj/item/weapon/circuitboard/pacman/mrs
name = T_BOARD("MRSPACMAN-type generator")
build_path = "/obj/machinery/power/port_gen/pacman/mrs"
- origin_tech = "programming=3;powerstorage=5;engineering=5"
+ origin_tech = list(TECH_DATA = 3, TECH_POWER = 5, TECH_ENGINERING = 5)
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/power.dm b/code/game/objects/items/weapons/circuitboards/machinery/power.dm
index 46241049b6..4e280716e5 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/power.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/power.dm
@@ -6,14 +6,14 @@
name = T_BOARD("superconductive magnetic energy storage")
build_path = "/obj/machinery/power/smes/buildable"
board_type = "machine"
- origin_tech = "powerstorage=6;engineering=4"
+ origin_tech = list(TECH_POWER = 6, TECH_ENGINERING = 4)
req_components = list("/obj/item/weapon/smes_coil" = 1, "/obj/item/stack/cable_coil" = 30)
/obj/item/weapon/circuitboard/batteryrack
name = T_BOARD("battery rack PSU")
build_path = "/obj/machinery/power/smes/batteryrack"
board_type = "machine"
- origin_tech = "powerstorage=3;engineering=2"
+ origin_tech = list(TECH_POWER = 3, TECH_ENGINERING = 2)
req_components = list("/obj/item/weapon/cell" = 3)
/obj/item/weapon/circuitboard/ghettosmes
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/recharge_station.dm b/code/game/objects/items/weapons/circuitboards/machinery/recharge_station.dm
index 6feda42613..642b36b3b9 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/recharge_station.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/recharge_station.dm
@@ -6,7 +6,7 @@
name = T_BOARD("cyborg recharging station")
build_path = "/obj/machinery/recharge_station"
board_type = "machine"
- origin_tech = "programming=3;engineering=3"
+ origin_tech = list(TECH_DATA = 3, TECH_ENGINERING = 3)
req_components = list(
"/obj/item/stack/cable_coil" = 5,
"/obj/item/weapon/stock_parts/capacitor" = 2,
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/research.dm b/code/game/objects/items/weapons/circuitboards/machinery/research.dm
index 0ab0822e4b..2dce038e3d 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/research.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/research.dm
@@ -6,7 +6,7 @@ obj/item/weapon/circuitboard/rdserver
name = T_BOARD("R&D server")
build_path = "/obj/machinery/r_n_d/server"
board_type = "machine"
- origin_tech = "programming=3"
+ origin_tech = list(TECH_DATA = 3)
req_components = list(
"/obj/item/stack/cable_coil" = 2,
"/obj/item/weapon/stock_parts/scanning_module" = 1)
@@ -15,7 +15,7 @@ obj/item/weapon/circuitboard/rdserver
name = T_BOARD("destructive analyzer")
build_path = "/obj/machinery/r_n_d/destructive_analyzer"
board_type = "machine"
- origin_tech = "magnets=2;engineering=2;programming=2"
+ origin_tech = list(TECH_MAGNET = 2, TECH_ENGINERING = 2, TECH_DATA = 2)
req_components = list(
"/obj/item/weapon/stock_parts/scanning_module" = 1,
"/obj/item/weapon/stock_parts/manipulator" = 1,
@@ -25,7 +25,7 @@ obj/item/weapon/circuitboard/rdserver
name = T_BOARD("autolathe")
build_path = "/obj/machinery/autolathe"
board_type = "machine"
- origin_tech = "engineering=2;programming=2"
+ origin_tech = list(TECH_ENGINERING = 2, TECH_DATA = 2)
req_components = list(
"/obj/item/weapon/stock_parts/matter_bin" = 3,
"/obj/item/weapon/stock_parts/manipulator" = 1,
@@ -35,7 +35,7 @@ obj/item/weapon/circuitboard/rdserver
name = T_BOARD("protolathe")
build_path = "/obj/machinery/r_n_d/protolathe"
board_type = "machine"
- origin_tech = "engineering=2;programming=2"
+ origin_tech = list(TECH_ENGINERING = 2, TECH_DATA = 2)
req_components = list(
"/obj/item/weapon/stock_parts/matter_bin" = 2,
"/obj/item/weapon/stock_parts/manipulator" = 2,
@@ -46,7 +46,7 @@ obj/item/weapon/circuitboard/rdserver
name = T_BOARD("circuit imprinter")
build_path = "/obj/machinery/r_n_d/circuit_imprinter"
board_type = "machine"
- origin_tech = "engineering=2;programming=2"
+ origin_tech = list(TECH_ENGINERING = 2, TECH_DATA = 2)
req_components = list(
"/obj/item/weapon/stock_parts/matter_bin" = 1,
"/obj/item/weapon/stock_parts/manipulator" = 1,
@@ -56,7 +56,7 @@ obj/item/weapon/circuitboard/rdserver
name = "Circuit board (Exosuit Fabricator)"
build_path = "/obj/machinery/mecha_part_fabricator"
board_type = "machine"
- origin_tech = "programming=3;engineering=3"
+ origin_tech = list(TECH_DATA = 3, TECH_ENGINERING = 3)
req_components = list(
"/obj/item/weapon/stock_parts/matter_bin" = 2,
"/obj/item/weapon/stock_parts/manipulator" = 1,
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/shieldgen.dm b/code/game/objects/items/weapons/circuitboards/machinery/shieldgen.dm
index cbfe5f69b1..6dc0a3f7ab 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/shieldgen.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/shieldgen.dm
@@ -6,7 +6,7 @@
name = T_BOARD("hull shield generator")
board_type = "machine"
build_path = "/obj/machinery/shield_gen/external"
- origin_tech = "bluespace=4;phorontech=3"
+ origin_tech = list(TECH_BLUESPACE = 4, TECH_PHORON = 3)
req_components = list(
"/obj/item/weapon/stock_parts/manipulator/pico" = 2,
"/obj/item/weapon/stock_parts/subspace/transmitter" = 1,
@@ -19,7 +19,7 @@
name = T_BOARD("bubble shield generator")
board_type = "machine"
build_path = "/obj/machinery/shield_gen"
- origin_tech = "bluespace=4;phorontech=3"
+ origin_tech = list(TECH_BLUESPACE = 4, TECH_PHORON = 3)
req_components = list(
"/obj/item/weapon/stock_parts/manipulator/pico" = 2,
"/obj/item/weapon/stock_parts/subspace/transmitter" = 1,
@@ -32,7 +32,7 @@
name = T_BOARD("shield capacitor")
board_type = "machine"
build_path = "/obj/machinery/shield_capacitor"
- origin_tech = "magnets=3;powerstorage=4"
+ origin_tech = list(TECH_MAGNET = 3, TECH_POWER = 4)
req_components = list(
"/obj/item/weapon/stock_parts/manipulator/pico" = 2,
"/obj/item/weapon/stock_parts/subspace/filter" = 1,
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/telecomms.dm b/code/game/objects/items/weapons/circuitboards/machinery/telecomms.dm
index 7e0195de9a..3a20c8d358 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/telecomms.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/telecomms.dm
@@ -8,7 +8,7 @@
/obj/item/weapon/circuitboard/telecomms/receiver
name = T_BOARD("subspace receiver")
build_path = "/obj/machinery/telecomms/receiver"
- origin_tech = "programming=4;engineering=3;bluespace=2"
+ origin_tech = list(TECH_DATA = 4, TECH_ENGINERING = 3, TECH_BLUESPACE = 2)
req_components = list(
"/obj/item/weapon/stock_parts/subspace/ansible" = 1,
"/obj/item/weapon/stock_parts/subspace/filter" = 1,
@@ -18,7 +18,7 @@
/obj/item/weapon/circuitboard/telecomms/hub
name = T_BOARD("hub mainframe")
build_path = "/obj/machinery/telecomms/hub"
- origin_tech = "programming=4;engineering=4"
+ origin_tech = list(TECH_DATA = 4, TECH_ENGINERING = 4)
req_components = list(
"/obj/item/weapon/stock_parts/manipulator" = 2,
"/obj/item/stack/cable_coil" = 2,
@@ -27,7 +27,7 @@
/obj/item/weapon/circuitboard/telecomms/relay
name = T_BOARD("relay mainframe")
build_path = "/obj/machinery/telecomms/relay"
- origin_tech = "programming=3;engineering=4;bluespace=3"
+ origin_tech = list(TECH_DATA = 3, TECH_ENGINERING = 4, TECH_BLUESPACE = 3)
req_components = list(
"/obj/item/weapon/stock_parts/manipulator" = 2,
"/obj/item/stack/cable_coil" = 2,
@@ -36,7 +36,7 @@
/obj/item/weapon/circuitboard/telecomms/bus
name = T_BOARD("bus mainframe")
build_path = "/obj/machinery/telecomms/bus"
- origin_tech = "programming=4;engineering=4"
+ origin_tech = list(TECH_DATA = 4, TECH_ENGINERING = 4)
req_components = list(
"/obj/item/weapon/stock_parts/manipulator" = 2,
"/obj/item/stack/cable_coil" = 1,
@@ -45,7 +45,7 @@
/obj/item/weapon/circuitboard/telecomms/processor
name = T_BOARD("processor unit")
build_path = "/obj/machinery/telecomms/processor"
- origin_tech = "programming=4;engineering=4"
+ origin_tech = list(TECH_DATA = 4, TECH_ENGINERING = 4)
req_components = list(
"/obj/item/weapon/stock_parts/manipulator" = 3,
"/obj/item/weapon/stock_parts/subspace/filter" = 1,
@@ -57,7 +57,7 @@
/obj/item/weapon/circuitboard/telecomms/server
name = T_BOARD("telecommunication server")
build_path = "/obj/machinery/telecomms/server"
- origin_tech = "programming=4;engineering=4"
+ origin_tech = list(TECH_DATA = 4, TECH_ENGINERING = 4)
req_components = list(
"/obj/item/weapon/stock_parts/manipulator" = 2,
"/obj/item/stack/cable_coil" = 1,
@@ -66,7 +66,7 @@
/obj/item/weapon/circuitboard/telecomms/broadcaster
name = T_BOARD("subspace broadcaster")
build_path = "/obj/machinery/telecomms/broadcaster"
- origin_tech = "programming=4;engineering=4;bluespace=2"
+ origin_tech = list(TECH_DATA = 4, TECH_ENGINERING = 4, TECH_BLUESPACE = 2)
req_components = list(
"/obj/item/weapon/stock_parts/manipulator" = 2,
"/obj/item/stack/cable_coil" = 1,
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/unary_atmos.dm b/code/game/objects/items/weapons/circuitboards/machinery/unary_atmos.dm
index a1beabbea6..394927ac72 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/unary_atmos.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/unary_atmos.dm
@@ -16,7 +16,7 @@
/obj/item/weapon/circuitboard/unary_atmos/heater
name = T_BOARD("gas heating system")
build_path = "/obj/machinery/atmospherics/unary/heater"
- origin_tech = "powerstorage=2;engineering=1"
+ origin_tech = list(TECH_POWER = 2, TECH_ENGINERING = 1)
req_components = list(
"/obj/item/stack/cable_coil" = 5,
"/obj/item/weapon/stock_parts/matter_bin" = 1,
@@ -25,7 +25,7 @@
/obj/item/weapon/circuitboard/unary_atmos/cooler
name = T_BOARD("gas cooling system")
build_path = "/obj/machinery/atmospherics/unary/freezer"
- origin_tech = "magnets=2;engineering=2"
+ origin_tech = list(TECH_MAGNET = 2, TECH_ENGINERING = 2)
req_components = list(
"/obj/item/stack/cable_coil" = 2,
"/obj/item/weapon/stock_parts/matter_bin" = 1,
diff --git a/code/game/objects/items/weapons/circuitboards/mecha.dm b/code/game/objects/items/weapons/circuitboards/mecha.dm
index ad859479c5..0ce851e3a3 100644
--- a/code/game/objects/items/weapons/circuitboards/mecha.dm
+++ b/code/game/objects/items/weapons/circuitboards/mecha.dm
@@ -12,7 +12,7 @@
/obj/item/weapon/circuitboard/mecha/ripley
- origin_tech = "programming=3"
+ origin_tech = list(TECH_DATA = 3)
/obj/item/weapon/circuitboard/mecha/ripley/peripherals
name = T_BOARD_MECHA("Ripley peripherals control")
@@ -24,7 +24,7 @@
/obj/item/weapon/circuitboard/mecha/gygax
- origin_tech = "programming=4"
+ origin_tech = list(TECH_DATA = 4)
/obj/item/weapon/circuitboard/mecha/gygax/peripherals
name = T_BOARD_MECHA("Gygax peripherals control")
@@ -33,7 +33,7 @@
/obj/item/weapon/circuitboard/mecha/gygax/targeting
name = T_BOARD_MECHA("Gygax weapon control and targeting")
icon_state = "mcontroller"
- origin_tech = "programming=4;combat=4"
+ origin_tech = list(TECH_DATA = 4, TECH_COMBAT = 4)
/obj/item/weapon/circuitboard/mecha/gygax/main
name = T_BOARD_MECHA("Gygax central control")
@@ -41,7 +41,7 @@
/obj/item/weapon/circuitboard/mecha/durand
- origin_tech = "programming=4"
+ origin_tech = list(TECH_DATA = 4)
/obj/item/weapon/circuitboard/mecha/durand/peripherals
name = T_BOARD_MECHA("Durand peripherals control")
@@ -50,7 +50,7 @@
/obj/item/weapon/circuitboard/mecha/durand/targeting
name = T_BOARD_MECHA("Durand weapon control and targeting")
icon_state = "mcontroller"
- origin_tech = "programming=4;combat=4"
+ origin_tech = list(TECH_DATA = 4, TECH_COMBAT = 4)
/obj/item/weapon/circuitboard/mecha/durand/main
name = T_BOARD_MECHA("Durand central control")
@@ -58,7 +58,7 @@
/obj/item/weapon/circuitboard/mecha/honker
- origin_tech = "programming=4"
+ origin_tech = list(TECH_DATA = 4)
/obj/item/weapon/circuitboard/mecha/honker/peripherals
name = T_BOARD_MECHA("H.O.N.K peripherals control")
@@ -74,7 +74,7 @@
/obj/item/weapon/circuitboard/mecha/odysseus
- origin_tech = "programming=3"
+ origin_tech = list(TECH_DATA = 3)
/obj/item/weapon/circuitboard/mecha/odysseus/peripherals
name = T_BOARD_MECHA("Odysseus peripherals control")
diff --git a/code/game/objects/items/weapons/circuitboards/other.dm b/code/game/objects/items/weapons/circuitboards/other.dm
index ec38643bed..6d016a96fa 100644
--- a/code/game/objects/items/weapons/circuitboards/other.dm
+++ b/code/game/objects/items/weapons/circuitboards/other.dm
@@ -6,5 +6,5 @@
/obj/item/weapon/circuitboard/aicore
name = T_BOARD("AI core")
- origin_tech = "programming=4;biotech=2"
+ origin_tech = list(TECH_DATA = 4, TECH_BIO = 2)
board_type = "other"
diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm
index 36c97d3df2..1d25089eca 100644
--- a/code/game/objects/items/weapons/explosives.dm
+++ b/code/game/objects/items/weapons/explosives.dm
@@ -7,7 +7,7 @@
item_state = "plasticx"
flags = NOBLUDGEON
w_class = 2.0
- origin_tech = "syndicate=2"
+ origin_tech = list(TECH_ILLEGAL = 2)
var/datum/wires/explosive/c4/wires = null
var/timer = 10
var/atom/target = null
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/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm
index a8d03b9539..25eacadde7 100644
--- a/code/game/objects/items/weapons/flamethrower.dm
+++ b/code/game/objects/items/weapons/flamethrower.dm
@@ -10,8 +10,8 @@
throw_speed = 1
throw_range = 5
w_class = 3.0
- matter = list(DEFAULT_WALL_MATERIAL = 500)
- origin_tech = "combat=1;phorontech=1"
+ origin_tech = list(TECH_COMBAT = 1, TECH_PHORON = 1)
+ matter = list(DEFAULT_WALL_MATERIAL = 500)
var/status = 0
var/throw_amount = 100
var/lit = 0 //on or off
diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm
index 651d7f880a..6d5ea444cb 100644
--- a/code/game/objects/items/weapons/grenades/chem_grenade.dm
+++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm
@@ -134,7 +134,6 @@
prime()
if(!stage || stage<2) return
- //if(prob(reliability))
var/has_reagents = 0
for(var/obj/item/weapon/reagent_containers/glass/G in beakers)
if(G.reagents.total_volume) has_reagents = 1
@@ -175,7 +174,7 @@
desc = "An oversized grenade that affects a larger area."
icon_state = "large_grenade"
allowed_containers = list(/obj/item/weapon/reagent_containers/glass)
- origin_tech = "combat=3;materials=3"
+ origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3)
affected_area = 4
/obj/item/weapon/grenade/chem_grenade/metalfoam
@@ -255,7 +254,7 @@
var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src)
var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src)
- B1.reagents.add_reagent("fluorosurfactant", 40)
+ B1.reagents.add_reagent("surfactant", 40)
B2.reagents.add_reagent("water", 40)
B2.reagents.add_reagent("cleaner", 10)
diff --git a/code/game/objects/items/weapons/grenades/emgrenade.dm b/code/game/objects/items/weapons/grenades/emgrenade.dm
index c354aa4039..f8c2a12d2f 100644
--- a/code/game/objects/items/weapons/grenades/emgrenade.dm
+++ b/code/game/objects/items/weapons/grenades/emgrenade.dm
@@ -2,7 +2,7 @@
name = "classic emp grenade"
icon_state = "emp"
item_state = "emp"
- origin_tech = "materials=2;magnets=3"
+ origin_tech = list(TECH_MATERIAL = 2, TECH_MAGNET = 3)
prime()
..()
diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm
index 4c3c73c485..d4df5bd1ac 100644
--- a/code/game/objects/items/weapons/grenades/flashbang.dm
+++ b/code/game/objects/items/weapons/grenades/flashbang.dm
@@ -2,7 +2,7 @@
name = "flashbang"
icon_state = "flashbang"
item_state = "flashbang"
- origin_tech = "materials=2;combat=1"
+ origin_tech = list(TECH_MATERIAL = 2, TECH_COMBAT = 1)
var/banglet = 0
prime()
diff --git a/code/game/objects/items/weapons/grenades/spawnergrenade.dm b/code/game/objects/items/weapons/grenades/spawnergrenade.dm
index 6adea8e2f5..9677a73345 100644
--- a/code/game/objects/items/weapons/grenades/spawnergrenade.dm
+++ b/code/game/objects/items/weapons/grenades/spawnergrenade.dm
@@ -4,7 +4,7 @@
icon = 'icons/obj/grenade.dmi'
icon_state = "delivery"
item_state = "flashbang"
- origin_tech = "materials=3;magnets=4"
+ origin_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 4)
var/banglet = 0
var/spawner_type = null // must be an object path
var/deliveryamt = 1 // amount of type to deliver
@@ -35,10 +35,10 @@
name = "manhack delivery grenade"
spawner_type = /mob/living/simple_animal/hostile/viscerator
deliveryamt = 5
- origin_tech = "materials=3;magnets=4;syndicate=4"
+ origin_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 4, TECH_ILLEGAL = 4)
/obj/item/weapon/grenade/spawnergrenade/spesscarp
name = "carp delivery grenade"
spawner_type = /mob/living/simple_animal/hostile/carp
deliveryamt = 5
- origin_tech = "materials=3;magnets=4;syndicate=4"
+ origin_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 4, TECH_ILLEGAL = 4)
diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm
index f5559b5778..d32bf163ea 100644
--- a/code/game/objects/items/weapons/handcuffs.dm
+++ b/code/game/objects/items/weapons/handcuffs.dm
@@ -10,8 +10,8 @@
w_class = 2.0
throw_speed = 2
throw_range = 5
- matter = list(DEFAULT_WALL_MATERIAL = 500)
- origin_tech = "materials=1"
+ origin_tech = list(TECH_MATERIAL = 1)
+ matter = list(DEFAULT_WALL_MATERIAL = 500)
var/dispenser = 0
var/breakouttime = 1200 //Deciseconds = 120s = 2 minutes
var/cuff_sound = 'sound/weapons/handcuffs.ogg'
@@ -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..cf7ebba2b4
--- /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.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 54%
rename from code/game/objects/items/weapons/twohanded.dm
rename to code/game/objects/items/weapons/material/twohanded.dm
index 7d0f9e3d4a..708d91e6d1 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"
@@ -167,12 +188,13 @@
wieldsound = 'sound/weapons/saberon.ogg'
unwieldsound = 'sound/weapons/saberoff.ogg'
flags = NOSHIELD
- origin_tech = "magnets=3;syndicate=4"
+ origin_tech = list(TECH_MAGNET = 3, TECH_ILLEGAL = 4)
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/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm
index 8b2a657dd5..be28203098 100644
--- a/code/game/objects/items/weapons/melee/energy.dm
+++ b/code/game/objects/items/weapons/melee/energy.dm
@@ -74,7 +74,7 @@
throw_range = 5
w_class = 3
flags = CONDUCT | NOSHIELD | NOBLOODY
- origin_tech = "magnets=3;combat=4"
+ origin_tech = list(TECH_MAGNET = 3, TECH_COMBAT = 4)
attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut")
sharp = 1
edge = 1
@@ -110,7 +110,7 @@
throw_range = 5
w_class = 2
flags = NOSHIELD | NOBLOODY
- origin_tech = "magnets=3;syndicate=4"
+ origin_tech = list(TECH_MAGNET = 3, TECH_ILLEGAL = 4)
sharp = 1
edge = 1
var/blade_color
diff --git a/code/game/objects/items/weapons/melee/misc.dm b/code/game/objects/items/weapons/melee/misc.dm
index c5efdae1fb..c6bb1c64b5 100644
--- a/code/game/objects/items/weapons/melee/misc.dm
+++ b/code/game/objects/items/weapons/melee/misc.dm
@@ -8,7 +8,7 @@
force = 10
throwforce = 7
w_class = 3
- origin_tech = "combat=4"
+ origin_tech = list(TECH_COMBAT = 4)
attack_verb = list("flogged", "whipped", "lashed", "disciplined")
suicide_act(mob/user)
diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/game/objects/items/weapons/power_cells.dm
index d40294b5e7..b83d1778de 100644
--- a/code/game/objects/items/weapons/power_cells.dm
+++ b/code/game/objects/items/weapons/power_cells.dm
@@ -4,7 +4,7 @@
icon = 'icons/obj/power.dmi'
icon_state = "cell"
item_state = "cell"
- origin_tech = "powerstorage=1"
+ origin_tech = list(TECH_POWER = 1)
force = 5.0
throwforce = 5.0
throw_speed = 3
@@ -42,7 +42,7 @@
/obj/item/weapon/cell/crap
name = "\improper Nanotrasen brand rechargable AA battery"
desc = "You can't top the plasma top." //TOTALLY TRADEMARK INFRINGEMENT
- origin_tech = "powerstorage=0"
+ origin_tech = list(TECH_POWER = 0)
maxcharge = 500
matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 40)
@@ -52,7 +52,7 @@
/obj/item/weapon/cell/secborg
name = "security borg rechargable D battery"
- origin_tech = "powerstorage=0"
+ origin_tech = list(TECH_POWER = 0)
maxcharge = 600 //600 max charge / 100 charge per shot = six shots
matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 40)
@@ -62,13 +62,13 @@
/obj/item/weapon/cell/apc
name = "heavy-duty power cell"
- origin_tech = "powerstorage=1"
+ origin_tech = list(TECH_POWER = 1)
maxcharge = 5000
matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 50)
/obj/item/weapon/cell/high
name = "high-capacity power cell"
- origin_tech = "powerstorage=2"
+ origin_tech = list(TECH_POWER = 2)
icon_state = "hcell"
maxcharge = 10000
matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 60)
@@ -79,7 +79,7 @@
/obj/item/weapon/cell/super
name = "super-capacity power cell"
- origin_tech = "powerstorage=5"
+ origin_tech = list(TECH_POWER = 5)
icon_state = "scell"
maxcharge = 20000
matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 70)
@@ -91,7 +91,7 @@
/obj/item/weapon/cell/hyper
name = "hyper-capacity power cell"
- origin_tech = "powerstorage=6"
+ origin_tech = list(TECH_POWER = 6)
icon_state = "hpcell"
maxcharge = 30000
matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 80)
@@ -105,15 +105,18 @@
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
/obj/item/weapon/cell/potato
name = "potato battery"
desc = "A rechargable starch based power cell."
- origin_tech = "powerstorage=1"
+ origin_tech = list(TECH_POWER = 1)
icon = 'icons/obj/power.dmi' //'icons/obj/harvest.dmi'
icon_state = "potato_cell" //"potato_battery"
charge = 100
@@ -124,7 +127,7 @@
/obj/item/weapon/cell/slime
name = "charged slime core"
desc = "A yellow slime core infused with phoron, it crackles with power."
- origin_tech = "powerstorage=2;biotech=4"
+ origin_tech = list(TECH_POWER = 2, TECH_BIO = 4)
icon = 'icons/mob/slimes.dmi' //'icons/obj/harvest.dmi'
icon_state = "yellow slime extract" //"potato_battery"
maxcharge = 10000
diff --git a/code/game/objects/items/weapons/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm
index 92ba323a6a..618598c182 100644
--- a/code/game/objects/items/weapons/scrolls.dm
+++ b/code/game/objects/items/weapons/scrolls.dm
@@ -8,7 +8,7 @@
item_state = "paper"
throw_speed = 4
throw_range = 20
- origin_tech = "bluespace=4"
+ origin_tech = list(TECH_BLUESPACE = 4)
/obj/item/weapon/teleportation_scroll/attack_self(mob/user as mob)
user.set_machine(src)
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/shields.dm b/code/game/objects/items/weapons/shields.dm
index 436eea0339..612dde6d7b 100644
--- a/code/game/objects/items/weapons/shields.dm
+++ b/code/game/objects/items/weapons/shields.dm
@@ -13,8 +13,8 @@
throw_speed = 1
throw_range = 4
w_class = 4.0
- matter = list("glass" = 7500, DEFAULT_WALL_MATERIAL = 1000)
- origin_tech = "materials=2"
+ origin_tech = list(TECH_MATERIAL = 2)
+ matter = list("glass" = 7500, DEFAULT_WALL_MATERIAL = 1000)
attack_verb = list("shoved", "bashed")
var/cooldown = 0 //shield bash cooldown. based on world.time
@@ -45,7 +45,7 @@
throw_speed = 1
throw_range = 4
w_class = 2
- origin_tech = "materials=4;magnets=3;syndicate=4"
+ origin_tech = list(TECH_MATERIAL = 4, TECH_MAGNET = 3, TECH_ILLEGAL = 4)
attack_verb = list("shoved", "bashed")
var/active = 0
@@ -94,7 +94,7 @@
throw_speed = 2
throw_range = 10
w_class = 2.0
- origin_tech = "magnets=3;syndicate=4"
+ origin_tech = list(TECH_MAGNET = 3, TECH_ILLEGAL = 4)
/obj/item/weapon/cloaking_device/attack_self(mob/user as mob)
diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm
index 541b41f74d..24ea335b10 100644
--- a/code/game/objects/items/weapons/storage/backpack.dm
+++ b/code/game/objects/items/weapons/storage/backpack.dm
@@ -46,7 +46,7 @@
/obj/item/weapon/storage/backpack/holding
name = "bag of holding"
desc = "A backpack that opens into a localized pocket of Blue Space."
- origin_tech = "bluespace=4"
+ origin_tech = list(TECH_BLUESPACE = 4)
icon_state = "holdingpack"
max_w_class = 4
max_storage_space = 56
@@ -56,25 +56,10 @@
return
attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(crit_fail)
- user << "\red The Bluespace generator isn't working."
- return
- if(istype(W, /obj/item/weapon/storage/backpack/holding) && !W.crit_fail)
+ if(istype(W, /obj/item/weapon/storage/backpack/holding))
user << "\red The Bluespace interfaces of the two devices conflict and malfunction."
qdel(W)
- return
- /* //BoH+BoH=Singularity, commented out.
- if(istype(W, /obj/item/weapon/storage/backpack/holding) && !W.crit_fail)
- investigate_log("has become a singularity. Caused by [user.key]","singulo")
- user << "\red The Bluespace interfaces of the two devices catastrophically malfunction!"
- qdel(W)
- var/obj/singularity/singulo = new /obj/singularity (get_turf(src))
- singulo.energy = 300 //should make it a bit bigger~
- message_admins("[key_name_admin(user)] detonated a bag of holding")
- log_game("[key_name(user)] detonated a bag of holding")
- qdel(src)
- return
- */
+ return
..()
//Please don't clutter the parent storage item with stupid hacks.
@@ -82,19 +67,7 @@
if(istype(W, /obj/item/weapon/storage/backpack/holding))
return 1
return ..()
-
- proc/failcheck(mob/user as mob)
- if (prob(src.reliability)) return 1 //No failure
- if (prob(src.reliability))
- user << "\red The Bluespace portal resists your attempt to add another item." //light failure
- else
- user << "\red The Bluespace generator malfunctions!"
- for (var/obj/O in src.contents) //it broke, delete what was in it
- qdel(O)
- crit_fail = 1
- icon_state = "brokenpack"
-
-
+
/obj/item/weapon/storage/backpack/santabag
name = "\improper Santa's gift bag"
desc = "Space Santa uses this to deliver toys to all the nice children in space in Christmas! Wow, it's pretty big!"
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..61968c7692 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
@@ -628,3 +628,15 @@
new /obj/item/weapon/light/tube(src)
for(var/i = 0; i < 7; i++)
new /obj/item/weapon/light/bulb(src)
+
+/obj/item/weapon/storage/box/freezer
+ name = "portable freezer"
+ desc = "This nifty shock-resistant device will keep your 'groceries' nice and non-spoiled."
+ icon = 'icons/obj/storage.dmi'
+ icon_state = "portafreezer"
+ item_state = "medicalpack"
+ storage_slots=7
+ max_w_class = 3
+ can_hold = list(/obj/item/organ, /obj/item/weapon/reagent_containers/food, /obj/item/weapon/reagent_containers/glass)
+ max_storage_space = 21
+ use_to_pickup = 1 // for picking up broken bulbs, not that most people will try
\ No newline at end of file
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/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index 61786e10db..2306c33057 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -51,10 +51,10 @@
//there's got to be a better way of doing this.
if (!(src.loc == usr) || (src.loc && src.loc.loc == usr))
return
-
+
if (( usr.restrained() ) || ( usr.stat ))
return
-
+
if ((src.loc == usr) && !usr.unEquip(src))
return
@@ -444,12 +444,6 @@
src.quick_empty()
return 1
-/obj/item/weapon/storage/hear_talk(mob/M as mob, text, verb, datum/language/speaking)
- for (var/atom/A in src)
- if(istype(A,/obj/))
- var/obj/O = A
- O.hear_talk(M, text, verb, speaking)
-
//Returns the storage depth of an atom. This is the number of storage items the atom is contained in before reaching toplevel (the area).
//Returns -1 if the atom was not found on container.
/atom/proc/storage_depth(atom/container)
diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm
index 8f589f9883..11c2d6a853 100644
--- a/code/game/objects/items/weapons/storage/toolbox.dm
+++ b/code/game/objects/items/weapons/storage/toolbox.dm
@@ -12,7 +12,7 @@
w_class = 4
max_w_class = 3
max_storage_space = 14 //can hold 7 w_class-2 items or up to 3 w_class-3 items (with 1 w_class-2 item as change).
- origin_tech = "combat=1"
+ origin_tech = list(TECH_COMBAT = 1)
attack_verb = list("robusted")
/obj/item/weapon/storage/toolbox/emergency
@@ -67,7 +67,7 @@
name = "suspicious looking toolbox"
icon_state = "syndicate"
item_state = "toolbox_syndi"
- origin_tech = "combat=1;syndicate=1"
+ origin_tech = list(TECH_COMBAT = 1, TECH_ILLEGAL = 1)
force = 7.0
New()
diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm
index 085e23f9b6..b33d72f6fb 100644
--- a/code/game/objects/items/weapons/storage/uplink_kits.dm
+++ b/code/game/objects/items/weapons/storage/uplink_kits.dm
@@ -11,7 +11,7 @@
if("stealth")
new /obj/item/weapon/gun/energy/crossbow(src)
- new /obj/item/weapon/pen/paralysis(src)
+ new /obj/item/weapon/pen/reagent/paralysis(src)
new /obj/item/device/chameleon(src)
return
diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm
index 8747bbfacf..f8708d7925 100644
--- a/code/game/objects/items/weapons/stunbaton.dm
+++ b/code/game/objects/items/weapons/stunbaton.dm
@@ -10,7 +10,7 @@
edge = 0
throwforce = 7
w_class = 3
- origin_tech = "combat=2"
+ origin_tech = list(TECH_COMBAT = 2)
attack_verb = list("beaten")
var/stunforce = 0
var/agonyforce = 60
@@ -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)
@@ -72,7 +73,7 @@
else if(istype(W, /obj/item/weapon/screwdriver))
if(bcell)
- bcell.updateicon()
+ bcell.update_icon()
bcell.loc = get_turf(src.loc)
bcell = null
user << "You remove the cell from the [src]."
diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm
index 55d233e3bc..9f32e0f73b 100644
--- a/code/game/objects/items/weapons/surgery_tools.dm
+++ b/code/game/objects/items/weapons/surgery_tools.dm
@@ -19,7 +19,7 @@
matter = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 5000)
flags = CONDUCT
w_class = 2.0
- origin_tech = "materials=1;biotech=1"
+ origin_tech = list(TECH_MATERIAL = 1, TECH_BIO = 1)
/*
* Hemostat
@@ -32,7 +32,7 @@
matter = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 2500)
flags = CONDUCT
w_class = 2.0
- origin_tech = "materials=1;biotech=1"
+ origin_tech = list(TECH_MATERIAL = 1, TECH_BIO = 1)
attack_verb = list("attacked", "pinched")
/*
@@ -46,7 +46,7 @@
matter = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 2500)
flags = CONDUCT
w_class = 2.0
- origin_tech = "materials=1;biotech=1"
+ origin_tech = list(TECH_MATERIAL = 1, TECH_BIO = 1)
attack_verb = list("burnt")
/*
@@ -62,7 +62,7 @@
flags = CONDUCT
force = 15.0
w_class = 2.0
- origin_tech = "materials=1;biotech=1"
+ origin_tech = list(TECH_MATERIAL = 1, TECH_BIO = 1)
attack_verb = list("drilled")
suicide_act(mob/user)
@@ -86,8 +86,8 @@
throwforce = 5.0
throw_speed = 3
throw_range = 5
+ origin_tech = list(TECH_MATERIAL = 1, TECH_BIO = 1)
matter = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 5000)
- origin_tech = "materials=1;biotech=1"
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
suicide_act(mob/user)
@@ -140,8 +140,8 @@
throwforce = 9.0
throw_speed = 3
throw_range = 5
+ origin_tech = list(TECH_MATERIAL = 1, TECH_BIO = 1)
matter = list(DEFAULT_WALL_MATERIAL = 20000,"glass" = 10000)
- origin_tech = "materials=1;biotech=1"
attack_verb = list("attacked", "slashed", "sawed", "cut")
sharp = 1
edge = 1
@@ -161,7 +161,7 @@
icon_state = "fixovein"
force = 0
throwforce = 1.0
- origin_tech = "materials=1;biotech=3"
+ origin_tech = list(TECH_MATERIAL = 1, TECH_BIO = 3)
w_class = 2.0
var/usage_amount = 10
diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm
index 996be52663..fdad2423fc 100644
--- a/code/game/objects/items/weapons/teleportation.dm
+++ b/code/game/objects/items/weapons/teleportation.dm
@@ -21,8 +21,8 @@
item_state = "electronic"
throw_speed = 4
throw_range = 20
- matter = list(DEFAULT_WALL_MATERIAL = 400)
- origin_tech = "magnets=1"
+ origin_tech = list(TECH_MAGNET = 1)
+ matter = list(DEFAULT_WALL_MATERIAL = 400)
/obj/item/weapon/locator/attack_self(mob/user as mob)
user.set_machine(src)
@@ -132,8 +132,8 @@ Frequency:
w_class = 2.0
throw_speed = 3
throw_range = 5
- matter = list(DEFAULT_WALL_MATERIAL = 10000)
- origin_tech = "magnets=1;bluespace=3"
+ origin_tech = list(TECH_MAGNET = 1, TECH_BLUESPACE = 3)
+ matter = list(DEFAULT_WALL_MATERIAL = 10000)
/obj/item/weapon/hand_tele/attack_self(mob/user as mob)
var/turf/current_location = get_turf(user)//What turf is the user on?
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index 9307fabff7..2bf69d31e7 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -24,8 +24,8 @@
force = 5.0
throwforce = 7.0
w_class = 2.0
- matter = list(DEFAULT_WALL_MATERIAL = 150)
- origin_tech = "materials=1;engineering=1"
+ origin_tech = list(TECH_MATERIAL = 1, TECH_ENGINERING = 1)
+ matter = list(DEFAULT_WALL_MATERIAL = 150)
attack_verb = list("bashed", "battered", "bludgeoned", "whacked")
@@ -81,7 +81,8 @@
return
/obj/item/weapon/screwdriver/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
- if(!istype(M)) return ..()
+ if(!istype(M) || user.a_intent == "help")
+ return ..()
if(user.zone_sel.selecting != "eyes" && user.zone_sel.selecting != "head")
return ..()
if((CLUMSY in user.mutations) && prob(50))
@@ -102,8 +103,8 @@
throw_speed = 2
throw_range = 9
w_class = 2.0
- matter = list(DEFAULT_WALL_MATERIAL = 80)
- origin_tech = "materials=1;engineering=1"
+ origin_tech = list(TECH_MATERIAL = 1, TECH_ENGINERING = 1)
+ matter = list(DEFAULT_WALL_MATERIAL = 80)
attack_verb = list("pinched", "nipped")
sharp = 1
edge = 1
@@ -147,7 +148,7 @@
matter = list(DEFAULT_WALL_MATERIAL = 70, "glass" = 30)
//R&D tech level
- origin_tech = "engineering=1"
+ origin_tech = list(TECH_ENGINERING = 1)
//Welding tool specific stuff
var/welding = 0 //Whether or not the welding tool is off(0), on(1) or currently welding(2)
@@ -329,8 +330,6 @@
var/obj/item/organ/eyes/E = H.internal_organs_by_name["eyes"]
if(!E)
return
- if(H.species.flags & IS_SYNTHETIC)
- return
switch(safety)
if(1)
usr << "\red Your eyes sting a little."
@@ -367,22 +366,22 @@
/obj/item/weapon/weldingtool/largetank
name = "industrial welding tool"
max_fuel = 40
- matter = list(DEFAULT_WALL_MATERIAL = 70, "glass" = 60)
- origin_tech = "engineering=2"
+ origin_tech = list(TECH_ENGINERING = 2)
+ matter = list(DEFAULT_WALL_MATERIAL = 70, "glass" = 60)
/obj/item/weapon/weldingtool/hugetank
name = "upgraded welding tool"
max_fuel = 80
w_class = 3.0
- matter = list(DEFAULT_WALL_MATERIAL = 70, "glass" = 120)
- origin_tech = "engineering=3"
+ origin_tech = list(TECH_ENGINERING = 3)
+ matter = list(DEFAULT_WALL_MATERIAL = 70, "glass" = 120)
/obj/item/weapon/weldingtool/experimental
name = "experimental welding tool"
max_fuel = 40
w_class = 3.0
- matter = list(DEFAULT_WALL_MATERIAL = 70, "glass" = 120)
- origin_tech = "engineering=4;phorontech=3"
+ origin_tech = list(TECH_ENGINERING = 4, TECH_PHORON = 3)
+ matter = list(DEFAULT_WALL_MATERIAL = 70, "glass" = 120)
var/last_gen = 0
@@ -408,8 +407,8 @@
throwforce = 7.0
item_state = "crowbar"
w_class = 2.0
- matter = list(DEFAULT_WALL_MATERIAL = 50)
- origin_tech = "engineering=1"
+ origin_tech = list(TECH_ENGINERING = 1)
+ matter = list(DEFAULT_WALL_MATERIAL = 50)
attack_verb = list("attacked", "bashed", "battered", "bludgeoned", "whacked")
/obj/item/weapon/crowbar/red
@@ -427,16 +426,12 @@
if(!(S.status & ORGAN_ROBOT) || user.a_intent != I_HELP)
return ..()
- if(istype(M,/mob/living/carbon/human))
- var/mob/living/carbon/human/H = M
- if(H.species.flags & IS_SYNTHETIC)
- if(M == user)
- user << "\red You can't repair damage to your own body - it's against OH&S."
- return
-
if(S.brute_dam)
- S.heal_damage(15,0,0,1)
- user.visible_message("\red \The [user] patches some dents on \the [M]'s [S.name] with \the [src].")
+ if(S.brute_dam < ROBOLIMB_SELF_REPAIR_CAP)
+ S.heal_damage(15,0,0,1)
+ user.visible_message("\red \The [user] patches some dents on \the [M]'s [S.name] with \the [src].")
+ else
+ user << "\red The damage is far too severe to patch over externally."
return
else
user << "Nothing to fix!"
@@ -455,9 +450,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/traps.dm b/code/game/objects/items/weapons/traps.dm
new file mode 100644
index 0000000000..f6af73843c
--- /dev/null
+++ b/code/game/objects/items/weapons/traps.dm
@@ -0,0 +1,114 @@
+/obj/item/weapon/beartrap
+ name = "mechanical trap"
+ throw_speed = 2
+ throw_range = 1
+ gender = PLURAL
+ icon = 'icons/obj/items.dmi'
+ icon_state = "beartrap0"
+ desc = "A mechanically activated leg trap. Low-tech, but reliable. Looks like it could really hurt if you set it off."
+ throwforce = 0
+ w_class = 3
+ origin_tech = "materials=1"
+ var/deployed = 0
+
+/obj/item/weapon/beartrap/suicide_act(mob/user)
+ viewers(user) << "[user] is putting the [src.name] on \his head! It looks like \he's trying to commit suicide."
+ return (BRUTELOSS)
+
+/obj/item/weapon/beartrap/proc/can_use(mob/user)
+ return (user.IsAdvancedToolUser() && !issilicon(user) && !user.stat && !user.restrained())
+
+/obj/item/weapon/beartrap/attack_self(mob/user as mob)
+ ..()
+ if(deployed && can_use(user))
+ user.visible_message(
+ "[user] starts to deploy \the [src].",
+ "You begin deploying \the [src]!",
+ "You hear the slow creaking of a spring."
+ )
+
+ if (do_after(user, 60))
+ user.visible_message(
+ "[user] has deployed \the [src].",
+ "You have deployed \the [src]!",
+ "You hear a latch click loudly."
+ )
+
+ deployed = 1
+ user.drop_from_inventory(src)
+ update_icon()
+ anchored = 1
+
+/obj/item/weapon/beartrap/attack_hand(mob/user as mob)
+ if(buckled_mob && can_use(user))
+ user.visible_message(
+ "[user] begins freeing [buckled_mob] from \the [src].",
+ "You carefully begin to free [buckled_mob] from \the [src].",
+ )
+ if(do_after(user, 60))
+ user.visible_message("[buckled_mob] has been freed from \the [src] by [user].")
+ unbuckle_mob()
+ anchored = 0
+ else if(deployed && can_use(user))
+ user.visible_message(
+ "[user] starts to disarm \the [src].",
+ "You begin disarming \the [src]!",
+ "You hear a latch click followed by the slow creaking of a spring."
+ )
+ if(do_after(user, 60))
+ user.visible_message(
+ "[user] has disarmed \the [src].",
+ "You have disarmed \the [src]!"
+ )
+ deployed = 0
+ anchored = 0
+ update_icon()
+ else
+ ..()
+
+/obj/item/weapon/beartrap/proc/attack_mob(mob/living/L)
+
+ var/target_zone
+ if(L.lying)
+ target_zone = ran_zone()
+ else
+ target_zone = pick("l_foot", "r_foot", "l_leg", "r_leg")
+
+ //armour
+ var/blocked = L.run_armor_check(target_zone, "melee")
+
+ if(blocked >= 2)
+ return
+
+ if(!L.apply_damage(30, BRUTE, target_zone, blocked, used_weapon=src))
+ return 0
+
+ //trap the victim in place
+ if(!blocked)
+ set_dir(L.dir)
+ buckle_mob(L)
+ L << "The steel jaws of \the [src] bite into you, trapping you in place!"
+
+/obj/item/weapon/beartrap/Crossed(AM as mob|obj)
+ if(isliving(AM))
+ var/mob/living/L = AM
+ if(L.m_intent == "run")
+ L.visible_message(
+ "[L] steps on \the [src].",
+ "You step on \the [src]!",
+ "You hear a loud metallic snap!"
+ )
+ attack_mob(L)
+ if(!buckled_mob)
+ anchored = 0
+ deployed = 0
+ update_icon()
+ ..()
+
+/obj/item/weapon/beartrap/update_icon()
+ ..()
+
+ if(!deployed)
+ icon_state = "beartrap0"
+ else
+ icon_state = "beartrap1"
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/objs.dm b/code/game/objects/objs.dm
index fc6ef5b99d..795027ea3f 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -2,9 +2,7 @@
//Used to store information about the contents of the object.
var/list/matter
- var/origin_tech = null //Used by R&D to determine what research bonuses it grants.
- var/reliability = 100 //Used by SOME devices to determine how reliable they are.
- var/crit_fail = 0
+ var/list/origin_tech = null //Used by R&D to determine what research bonuses it grants.
var/unacidable = 0 //universal "unacidabliness" var, here so you can use it in any obj.
animate_movement = 2
var/throwforce = 1
@@ -141,3 +139,6 @@
/obj/proc/see_emote(mob/M as mob, text, var/emote_type)
return
+
+/obj/proc/show_message(msg, type, alt, alt_type)//Message, type of message (1 or 2), alternative message, alt message type (1 or 2)
+ return
\ No newline at end of file
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..e66d5c488a 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -37,10 +37,7 @@
/obj/structure/closet/examine(mob/user)
- if(get_dist(src, user) > 1)
- return ..(user)
-
- if(opened)
+ if(..(user, 1) && !opened)
var/content_size = 0
for(var/obj/item/I in src.contents)
if(!I.anchored)
@@ -232,7 +229,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)
@@ -326,15 +323,10 @@
else
icon_state = icon_opened
-/obj/structure/closet/hear_talk(mob/M as mob, text, verb, datum/language/speaking)
- for (var/atom/A in src)
- if(istype(A,/obj/))
- var/obj/O = A
- O.hear_talk(M, text, verb, speaking)
-
/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/noticeboard.dm b/code/game/objects/structures/noticeboard.dm
index a5ad84c20e..3647d565f7 100644
--- a/code/game/objects/structures/noticeboard.dm
+++ b/code/game/objects/structures/noticeboard.dm
@@ -21,7 +21,7 @@
if(notices < 5)
O.add_fingerprint(user)
add_fingerprint(user)
- user.drop_item()
+ user.drop_from_inventory(O)
O.loc = src
notices++
icon_state = "nboard0[notices]" //update sprite
@@ -29,13 +29,22 @@
else
user << "You reach to pin your paper to the board but hesitate. You are certain your paper will not be seen among the many others already attached."
-/obj/structure/noticeboard/attack_hand(user as mob)
- var/dat = "Noticeboard
"
- for(var/obj/item/weapon/paper/P in src)
- dat += "[P.name] Write Remove
"
- user << browse("Notices[dat]","window=noticeboard")
- onclose(user, "noticeboard")
+/obj/structure/noticeboard/attack_hand(var/mob/user)
+ examine(user)
+// Since Topic() never seems to interact with usr on more than a superficial
+// level, it should be fine to let anyone mess with the board other than ghosts.
+/obj/structure/noticeboard/examine(var/mob/user)
+ if(!user)
+ user = usr
+ if(user.Adjacent(src))
+ var/dat = "Noticeboard
"
+ for(var/obj/item/weapon/paper/P in src)
+ dat += "[P.name] Write Remove
"
+ user << browse("Notices[dat]","window=noticeboard")
+ onclose(user, "noticeboard")
+ else
+ ..()
/obj/structure/noticeboard/Topic(href, href_list)
..()
@@ -44,18 +53,16 @@
if((usr.stat || usr.restrained())) //For when a player is handcuffed while they have the notice window open
return
var/obj/item/P = locate(href_list["remove"])
- if((P && P.loc == src))
+ if(P && P.loc == src)
P.loc = get_turf(src) //dump paper on the floor because you're a clumsy fuck
P.add_fingerprint(usr)
add_fingerprint(usr)
notices--
icon_state = "nboard0[notices]"
-
if(href_list["write"])
if((usr.stat || usr.restrained())) //For when a player is handcuffed while they have the notice window open
return
var/obj/item/P = locate(href_list["write"])
-
if((P && P.loc == src)) //ifthe paper's on the board
if(istype(usr.r_hand, /obj/item/weapon/pen)) //and you're holding a pen
add_fingerprint(usr)
@@ -66,14 +73,9 @@
P.attackby(usr.l_hand, usr)
else
usr << "You'll need something to write with!"
-
if(href_list["read"])
var/obj/item/weapon/paper/P = locate(href_list["read"])
if((P && P.loc == src))
- if(!( istype(usr, /mob/living/carbon/human) ))
- usr << browse("[P.name][stars(P.info)]", "window=[P.name]")
- onclose(usr, "[P.name]")
- else
- usr << browse("[P.name][P.info]", "window=[P.name]")
- onclose(usr, "[P.name]")
+ usr << browse("[P.name][P.info]", "window=[P.name]")
+ onclose(usr, "[P.name]")
return
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..253d96174d 100644
--- a/code/game/supplyshuttle.dm
+++ b/code/game/supplyshuttle.dm
@@ -123,9 +123,6 @@ var/list/mechtoys = list(
var/comment = null
/datum/controller/supply
- var/processing = 1
- var/processing_interval = 300
- var/iteration = 0
//supply points
var/points = 50
var/points_per_process = 1
@@ -145,20 +142,14 @@ var/list/mechtoys = list(
New()
ordernum = rand(1,9000)
- //Supply shuttle ticker - handles supply point regenertion and shuttle travelling between centcomm and the station
- proc/process()
for(var/typepath in (typesof(/datum/supply_packs) - /datum/supply_packs))
var/datum/supply_packs/P = new typepath()
supply_packs[P.name] = P
- spawn(0)
- set background = 1
- while(1)
- if(processing)
- iteration++
- points += points_per_process
-
- sleep(processing_interval)
+ // Supply shuttle ticker - handles supply point regeneration
+ // This is called by the process scheduler every thirty seconds
+ proc/process()
+ points += points_per_process
//To stop things being sent to centcomm which should not be sent to centcomm. Recursively checks for these types.
proc/forbidden_atoms_check(atom/A)
@@ -205,13 +196,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 +226,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)
@@ -251,23 +242,30 @@ var/list/mechtoys = list(
var/datum/supply_order/SO = S
var/datum/supply_packs/SP = SO.object
- var/atom/A = new SP.containertype(pickedloc)
+ var/obj/A = new SP.containertype(pickedloc)
A.name = "[SP.containername] [SO.comment ? "([SO.comment])":"" ]"
//supply manifest generation begin
- var/obj/item/weapon/paper/manifest/slip = new /obj/item/weapon/paper/manifest(A)
- slip.is_copy = 0
- slip.info = "[command_name()] Shipping Manifest
"
- slip.info +="Order #[SO.ordernum]
"
- slip.info +="Destination: [station_name]
"
- slip.info +="[shoppinglist.len] PACKAGES IN THIS SHIPMENT
"
- slip.info +="CONTENTS:
"
+ var/obj/item/weapon/paper/manifest/slip
+ if(!SP.contraband)
+ slip = new /obj/item/weapon/paper/manifest(A)
+ slip.is_copy = 0
+ slip.info = "[command_name()] Shipping Manifest
"
+ slip.info +="Order #[SO.ordernum]
"
+ slip.info +="Destination: [station_name]
"
+ slip.info +="[shoppinglist.len] PACKAGES IN THIS SHIPMENT
"
+ slip.info +="CONTENTS:
"
//spawn the stuff, finish generating the manifest while you're at it
if(SP.access)
- A:req_access = list()
- A:req_access += text2num(SP.access)
+ if(isnum(SP.access))
+ A.req_access = list(SP.access)
+ else if(islist(SP.access))
+ var/list/L = SP.access // access var is a plain var, we need a list
+ A.req_access = L.Copy()
+ else
+ world << "Supply pack with invalid access restriction [SP.access] encountered!"
var/list/contains
if(istype(SP,/datum/supply_packs/randomised))
@@ -283,12 +281,12 @@ var/list/mechtoys = list(
if(!typepath) continue
var/atom/B2 = new typepath(A)
if(SP.amount && B2:amount) B2:amount = SP.amount
- slip.info += "- [B2.name]
" //add the item to the manifest
+ if(slip) slip.info += "- [B2.name]
" //add the item to the manifest
//manifest finalisation
- slip.info += "
"
- slip.info += "CHECK CONTENTS AND STAMP BELOW THE LINE TO CONFIRM RECEIPT OF GOODS
"
- if (SP.contraband) slip.loc = null //we are out of blanks for Form #44-D Ordering Illicit Drugs.
+ if(slip)
+ slip.info += "
"
+ slip.info += "CHECK CONTENTS AND STAMP BELOW THE LINE TO CONFIRM RECEIPT OF GOODS
"
shoppinglist.Cut()
return
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/game/turfs/space/space.dm b/code/game/turfs/space/space.dm
index d8db07de58..641c3e3086 100644
--- a/code/game/turfs/space/space.dm
+++ b/code/game/turfs/space/space.dm
@@ -1,6 +1,4 @@
-//This list contains the z-level numbers which can be accessed via space travel and the percentile chances to get there.
-//(Exceptions: extended, sandbox and nuke) -Errorage
-var/list/accessible_z_levels = list("1" = 5, "3" = 10, "4" = 15, "5" = 10, "6" = 60)
+
/turf/space
icon = 'icons/turf/space.dmi'
@@ -67,77 +65,10 @@ var/list/accessible_z_levels = list("1" = 5, "3" = 10, "4" = 15, "5" = 10, "6" =
if(ticker && ticker.mode)
- if(A.z > 6 && !config.use_overmap) return
+ // Okay, so let's make it so that people can travel z levels but not nuke disks!
+ // if(ticker.mode.name == "mercenary") return
if (A.x <= TRANSITIONEDGE || A.x >= (world.maxx - TRANSITIONEDGE - 1) || A.y <= TRANSITIONEDGE || A.y >= (world.maxy - TRANSITIONEDGE - 1))
- if(istype(A, /obj/effect/meteor)||istype(A, /obj/effect/space_dust))
- qdel(A)
- return
-
- if(istype(A, /obj/item/weapon/disk/nuclear)) // Don't let nuke disks travel Z levels ... And moving this shit down here so it only fires when they're actually trying to change z-level.
- qdel(A) //The disk's Destroy() proc ensures a new one is created
- return
- if(config.use_overmap)
- overmap_spacetravel(src,A)
- return
- var/list/disk_search = A.search_contents_for(/obj/item/weapon/disk/nuclear)
- if(!isemptylist(disk_search))
- if(istype(A, /mob/living))
- var/mob/living/MM = A
- if(MM.client && !MM.stat)
- MM << "\red Something you are carrying is preventing you from leaving. Don't play stupid; you know exactly what it is."
- if(MM.x <= TRANSITIONEDGE)
- MM.inertia_dir = 4
- else if(MM.x >= world.maxx -TRANSITIONEDGE)
- MM.inertia_dir = 8
- else if(MM.y <= TRANSITIONEDGE)
- MM.inertia_dir = 1
- else if(MM.y >= world.maxy -TRANSITIONEDGE)
- MM.inertia_dir = 2
- else
- for(var/obj/item/weapon/disk/nuclear/N in disk_search)
- qdel(N)//Make the disk respawn it is on a clientless mob or corpse
- else
- for(var/obj/item/weapon/disk/nuclear/N in disk_search)
- qdel(N)//Make the disk respawn if it is floating on its own
- return
-
- var/move_to_z = src.z
- var/safety = 1
-
- while(move_to_z == src.z)
- var/move_to_z_str = pickweight(accessible_z_levels)
- move_to_z = text2num(move_to_z_str)
- safety++
- if(safety > 10)
- break
-
- if(!move_to_z)
- return
-
- A.z = move_to_z
-
- if(src.x <= TRANSITIONEDGE)
- A.x = world.maxx - TRANSITIONEDGE - 2
- A.y = rand(TRANSITIONEDGE + 2, world.maxy - TRANSITIONEDGE - 2)
-
- else if (A.x >= (world.maxx - TRANSITIONEDGE - 1))
- A.x = TRANSITIONEDGE + 1
- A.y = rand(TRANSITIONEDGE + 2, world.maxy - TRANSITIONEDGE - 2)
-
- else if (src.y <= TRANSITIONEDGE)
- A.y = world.maxy - TRANSITIONEDGE -2
- A.x = rand(TRANSITIONEDGE + 2, world.maxx - TRANSITIONEDGE - 2)
-
- else if (A.y >= (world.maxy - TRANSITIONEDGE - 1))
- A.y = TRANSITIONEDGE + 1
- A.x = rand(TRANSITIONEDGE + 2, world.maxx - TRANSITIONEDGE - 2)
-
-
-
-
- spawn (0)
- if ((A && A.loc))
- A.loc.Entered(A)
+ A.touch_map_edge()
/turf/space/proc/Sandbox_Spacemove(atom/movable/A as mob|obj)
var/cur_x
diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm
index 82fef02e97..d2d0be60f3 100644
--- a/code/game/verbs/ooc.dm
+++ b/code/game/verbs/ooc.dm
@@ -69,19 +69,22 @@
set category = "OOC"
if(say_disabled) //This is here to try to identify lag problems
- usr << "\red Speech is currently admin-disabled."
+ usr << "Speech is currently admin-disabled."
+ return
+
+ if(!mob)
return
- if(!mob) return
if(IsGuestKey(key))
src << "Guests may not use OOC."
return
msg = sanitize(msg)
- if(!msg) return
+ if(!msg)
+ return
if(!(prefs.toggles & CHAT_LOOC))
- src << "\red You have LOOC muted."
+ src << "You have LOOC muted."
return
if(!holder)
@@ -94,7 +97,7 @@
if(prefs.muted & MUTE_OOC)
src << "You cannot use OOC (muted)."
return
- if(handle_spam_prevention(msg,MUTE_OOC))
+ if(handle_spam_prevention(msg, MUTE_OOC))
return
if(findtext(msg, "byond://"))
src << "Advertising other servers is not allowed."
@@ -104,26 +107,48 @@
log_ooc("(LOCAL) [mob.name]/[key] : [msg]")
- var/mob/source = src.mob
- var/list/heard = get_mobs_in_view(7, source)
+ var/mob/source = mob.get_looc_source()
+ var/list/heard = get_mobs_or_objects_in_view(7, source, 1, 0)
- var/display_name = source.key
+ var/display_name = key
if(holder && holder.fakekey)
display_name = holder.fakekey
- if(source.stat != DEAD)
- display_name = source.name
+ if(mob.stat != DEAD)
+ display_name = mob.name
- var/prefix
- var/admin_stuff
for(var/client/target in clients)
if(target.prefs.toggles & CHAT_LOOC)
- admin_stuff = ""
+ var/prefix = ""
+ var/admin_stuff = ""
+ var/send = 0
+
if(target in admins)
- prefix = "(R)"
- admin_stuff += "/([source.key])"
- if(target != source.client)
+ admin_stuff += "/([key])"
+ if(target != src)
admin_stuff += "(JMP)"
+
if(target.mob in heard)
- prefix = ""
- if((target.mob in heard) || (target in admins))
+ send = 1
+ if(isAI(target.mob))
+ prefix = "(Core) "
+
+ else if(isAI(target.mob)) // Special case
+ var/mob/living/silicon/ai/A = target.mob
+ if(A.eyeobj in hearers(7, source))
+ send = 1
+ prefix = "(Eye) "
+
+ if(!send && (target in admins))
+ send = 1
+ prefix = "(R)"
+
+ if(send)
target << "" + create_text_tag("looc", "LOOC:", target) + " [prefix][display_name][admin_stuff]: [msg]"
+
+/mob/proc/get_looc_source()
+ return src
+
+/mob/living/silicon/ai/get_looc_source()
+ if(eyeobj)
+ return eyeobj
+ return src
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/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index fd55a5a1e9..b240f087a9 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -778,7 +778,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
if(confirm != "Yes") return
var/choice
- if(ticker.mode.name == "revolution" || ticker.mode.name == "AI malfunction" || ticker.mode.name == "confliction")
+ if(ticker.mode.name == "revolution" || ticker.mode.name == "confliction")
choice = input("The shuttle will just return if you call it. Call anyway?") in list("Confirm", "Cancel")
if(choice == "Confirm")
emergency_shuttle.auto_recall = 1 //enable auto-recall
diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm
index e73856b85f..09b15fe775 100644
--- a/code/modules/assembly/assembly.dm
+++ b/code/modules/assembly/assembly.dm
@@ -9,7 +9,7 @@
throwforce = 2
throw_speed = 3
throw_range = 10
- origin_tech = "magnets=1"
+ origin_tech = list(TECH_MAGNET = 1)
var/secured = 1
var/list/attached_overlays = null
diff --git a/code/modules/assembly/igniter.dm b/code/modules/assembly/igniter.dm
index d44f45fa97..fc34669f3d 100644
--- a/code/modules/assembly/igniter.dm
+++ b/code/modules/assembly/igniter.dm
@@ -2,8 +2,8 @@
name = "igniter"
desc = "A small electronic device able to ignite combustable substances."
icon_state = "igniter"
- matter = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 50, "waste" = 10)
- origin_tech = "magnets=1"
+ origin_tech = list(TECH_MAGNET = 1)
+ matter = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 50, "waste" = 10)
secured = 1
wires = WIRE_RECEIVE
diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm
index d163a9d29f..56d8c9595d 100644
--- a/code/modules/assembly/infrared.dm
+++ b/code/modules/assembly/infrared.dm
@@ -4,8 +4,8 @@
name = "infrared emitter"
desc = "Emits a visible or invisible beam and is triggered when the beam is interrupted."
icon_state = "infrared"
- matter = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 500, "waste" = 100)
- origin_tech = "magnets=2"
+ origin_tech = list(TECH_MAGNET = 2)
+ matter = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 500, "waste" = 100)
wires = WIRE_PULSE
diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm
index a2cbe632c7..3537fbee50 100644
--- a/code/modules/assembly/mousetrap.dm
+++ b/code/modules/assembly/mousetrap.dm
@@ -2,8 +2,8 @@
name = "mousetrap"
desc = "A handy little spring-loaded trap for catching pesty rodents."
icon_state = "mousetrap"
- matter = list(DEFAULT_WALL_MATERIAL = 100, "waste" = 10)
- origin_tech = "combat=1"
+ origin_tech = list(TECH_COMBAT = 1)
+ matter = list(DEFAULT_WALL_MATERIAL = 100, "waste" = 10)
var/armed = 0
diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm
index 39bf3f2fcc..d973e88b95 100644
--- a/code/modules/assembly/proximity.dm
+++ b/code/modules/assembly/proximity.dm
@@ -2,8 +2,8 @@
name = "proximity sensor"
desc = "Used for scanning and alerting when someone enters a certain proximity."
icon_state = "prox"
- matter = list(DEFAULT_WALL_MATERIAL = 800, "glass" = 200, "waste" = 50)
- origin_tech = "magnets=1"
+ origin_tech = list(TECH_MAGNET = 1)
+ matter = list(DEFAULT_WALL_MATERIAL = 800, "glass" = 200, "waste" = 50)
wires = WIRE_PULSE
diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm
index 4d93ad26ee..5a6faa7fe9 100644
--- a/code/modules/assembly/signaler.dm
+++ b/code/modules/assembly/signaler.dm
@@ -3,8 +3,8 @@
desc = "Used to remotely activate devices."
icon_state = "signaller"
item_state = "signaler"
- matter = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 200, "waste" = 100)
- origin_tech = "magnets=1"
+ origin_tech = list(TECH_MAGNET = 1)
+ matter = list(DEFAULT_WALL_MATERIAL = 1000, "glass" = 200, "waste" = 100)
wires = WIRE_RECEIVE | WIRE_PULSE | WIRE_RADIO_PULSE | WIRE_RADIO_RECEIVE
secured = 1
diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm
index d4fb73a764..cdd927afd6 100644
--- a/code/modules/assembly/timer.dm
+++ b/code/modules/assembly/timer.dm
@@ -2,8 +2,8 @@
name = "timer"
desc = "Used to time things. Works well with contraptions which has to count down. Tick tock."
icon_state = "timer"
- matter = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 50, "waste" = 10)
- origin_tech = "magnets=1"
+ origin_tech = list(TECH_MAGNET = 1)
+ matter = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 50, "waste" = 10)
wires = WIRE_PULSE
diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm
index ca33f9d106..7e8c89cc79 100644
--- a/code/modules/assembly/voice.dm
+++ b/code/modules/assembly/voice.dm
@@ -2,8 +2,8 @@
name = "voice analyzer"
desc = "A small electronic device able to record a voice sample, and send a signal when that sample is repeated."
icon_state = "voice"
+ origin_tech = list(TECH_MAGNET = 1)
matter = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 50, "waste" = 10)
- origin_tech = "magnets=1"
var/listening = 0
var/recorded //the activation message
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index fcbd890263..0848c17a11 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -634,10 +634,6 @@ datum/preferences
dat += "Has a variety of eye colours."
if(current_species.flags & IS_PLANT)
dat += "Has a plantlike physiology."
- if(current_species.flags & IS_SYNTHETIC)
- dat += "Is machine-based."
- if(current_species.flags & REGENERATES_LIMBS)
- dat += "Has a plantlike physiology."
dat += ""
dat += "
"
dat += "
"
diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm
index b63869bccb..25e1da639f 100644
--- a/code/modules/client/preferences_gear.dm
+++ b/code/modules/client/preferences_gear.dm
@@ -897,6 +897,12 @@ var/global/list/gear_datums = list()
cost = 1
slot = slot_shoes
+/datum/gear/workboots
+ display_name = "workboots"
+ path = /obj/item/clothing/shoes/workboots
+ cost = 1
+ slot = slot_shoes
+
/datum/gear/sandal
display_name = "sandals"
path = /obj/item/clothing/shoes/sandal
@@ -1035,7 +1041,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/clothing.dm b/code/modules/clothing/clothing.dm
index 783025a933..a11f0b8d7d 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -212,8 +212,6 @@ BLIND // can't see anything
cell.charge -= 1000 / severity
if (cell.charge < 0)
cell.charge = 0
- if(cell.reliability != 100 && prob(50/severity))
- cell.reliability -= 10 / severity
..()
// Called just before an attack_hand(), in mob/UnarmedAttack()
diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm
index b6538495b4..49f6e75f87 100644
--- a/code/modules/clothing/glasses/glasses.dm
+++ b/code/modules/clothing/glasses/glasses.dm
@@ -38,7 +38,7 @@
icon_state = "meson"
item_state = "glasses"
icon_action_button = "action_meson" //This doesn't actually matter, the action button is generated from the current icon_state. But, this is the only way to get it to show up.
- origin_tech = "magnets=2;engineering=2"
+ origin_tech = list(TECH_MAGNET = 2, TECH_ENGINERING = 2)
toggleable = 1
vision_flags = SEE_TURFS
@@ -73,7 +73,7 @@
desc = "You can totally see in the dark now!"
icon_state = "night"
item_state = "glasses"
- origin_tech = "magnets=2"
+ origin_tech = list(TECH_MAGNET = 2)
darkness_view = 7
toggleable = 1
icon_action_button = "action_nvg"
@@ -103,7 +103,7 @@
icon_state = "material"
item_state = "glasses"
icon_action_button = "action_material"
- origin_tech = "magnets=3;engineering=3"
+ origin_tech = list(TECH_MAGNET = 3, TECH_ENGINERING = 3)
toggleable = 1
vision_flags = SEE_OBJS
@@ -221,7 +221,7 @@
desc = "Thermals in the shape of glasses."
icon_state = "thermal"
item_state = "glasses"
- origin_tech = "magnets=3"
+ origin_tech = list(TECH_MAGNET = 3)
toggleable = 1
icon_action_button = "action_thermal"
vision_flags = SEE_MOBS
@@ -249,7 +249,7 @@
name = "Optical Meson Scanner"
desc = "Used for seeing walls, floors, and stuff through anything."
icon_state = "meson"
- origin_tech = "magnets=3;syndicate=4"
+ origin_tech = list(TECH_MAGNET = 3, TECH_ILLEGAL = 4)
/obj/item/clothing/glasses/thermal/plain
toggleable = 0
diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm
index 60dd6174b1..fa273534e6 100644
--- a/code/modules/clothing/glasses/hud.dm
+++ b/code/modules/clothing/glasses/hud.dm
@@ -2,7 +2,7 @@
name = "HUD"
desc = "A heads-up display that provides important info in (almost) real time."
flags = null //doesn't protect eyes because it's a monocle, duh
- origin_tech = "magnets=3;biotech=2"
+ origin_tech = list(TECH_MAGNET = 3, TECH_BIO = 2)
var/list/icon/current = list() //the current hud icons
proc
diff --git a/code/modules/clothing/masks/voice.dm b/code/modules/clothing/masks/voice.dm
index 6899fef1ef..70459e62af 100644
--- a/code/modules/clothing/masks/voice.dm
+++ b/code/modules/clothing/masks/voice.dm
@@ -8,7 +8,7 @@
name = "gas mask"
desc = "A face-covering mask that can be connected to an air supply. It seems to house some odd electronics."
var/obj/item/voice_changer/changer
- origin_tech = "syndicate=4"
+ origin_tech = list(TECH_ILLEGAL = 4)
/obj/item/clothing/mask/gas/voice/verb/Toggle_Voice_Changer()
set category = "Object"
diff --git a/code/modules/clothing/shoes/jobs.dm b/code/modules/clothing/shoes/jobs.dm
new file mode 100644
index 0000000000..001634b96e
--- /dev/null
+++ b/code/modules/clothing/shoes/jobs.dm
@@ -0,0 +1,32 @@
+/obj/item/clothing/shoes/galoshes
+ desc = "Rubber boots"
+ name = "galoshes"
+ icon_state = "galoshes"
+ permeability_coefficient = 0.05
+ flags = NOSLIP
+ slowdown = SHOES_SLOWDOWN+1
+ species_restricted = null
+
+/obj/item/clothing/shoes/jackboots
+ name = "jackboots"
+ desc = "Nanotrasen-issue Security combat boots for combat scenarios or combat situations. All combat, all the time."
+ icon_state = "jackboots"
+ item_state = "jackboots"
+ force = 3
+ armor = list(melee = 30, bullet = 10, laser = 10, energy = 15, bomb = 20, bio = 0, rad = 0)
+ siemens_coefficient = 0.7
+
+/obj/item/clothing/shoes/jackboots/unathi
+ name = "toe-less jackboots"
+ desc = "Modified pair of jackboots, particularly friendly to those species whose toes hold claws."
+ item_state = "digiboots"
+ icon_state = "digiboots"
+ species_restricted = null
+
+/obj/item/clothing/shoes/workboots
+ name = "workboots"
+ desc = "A pair of steel-toed work boots designed for use in industrial settings. Safety first."
+ icon_state = "workboots"
+ item_state = "workboots"
+ armor = list(melee = 40, bullet = 0, laser = 0, energy = 15, bomb = 20, bio = 0, rad = 20)
+ siemens_coefficient = 0.7
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index 9fd713fc74..22526a208c 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -5,7 +5,7 @@
item_state = "brown"
permeability_coefficient = 0.05
flags = NOSLIP
- origin_tech = "syndicate=3"
+ origin_tech = list(TECH_ILLEGAL = 3)
var/list/clothing_choices = list()
siemens_coefficient = 0.8
species_restricted = null
@@ -52,15 +52,6 @@
icon_state = "black"
body_parts_covered = FEET
-/obj/item/clothing/shoes/galoshes
- desc = "Rubber boots"
- name = "galoshes"
- icon_state = "galoshes"
- permeability_coefficient = 0.05
- flags = NOSLIP
- slowdown = SHOES_SLOWDOWN+1
- species_restricted = null
-
/obj/item/clothing/shoes/clown_shoes
desc = "The prankster's standard-issue clowning shoes. Damn they're huge!"
name = "clown shoes"
@@ -81,21 +72,6 @@
else
playsound(src, "clownstep", 20, 1)
-/obj/item/clothing/shoes/jackboots
- name = "jackboots"
- desc = "Nanotrasen-issue Security combat boots for combat scenarios or combat situations. All combat, all the time."
- icon_state = "jackboots"
- item_state = "jackboots"
- force = 3
- siemens_coefficient = 0.7
-
-/obj/item/clothing/shoes/jackboots/unathi
- name = "toe-less jackboots"
- desc = "Modified pair of jackboots, particularly friendly to those species whose toes hold claws."
- item_state = "digiboots"
- icon_state = "digiboots"
- species_restricted = null
-
/obj/item/clothing/shoes/cult
name = "boots"
desc = "A pair of boots worn by the followers of Nar-Sie."
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..88e989c2a0 100644
--- a/code/modules/clothing/spacesuits/rig/modules/combat.dm
+++ b/code/modules/clothing/spacesuits/rig/modules/combat.dm
@@ -12,7 +12,7 @@
name = "mounted grenade launcher"
desc = "A shoulder-mounted micro-explosive dispenser."
selectable = 1
- icon_state = "grenade_launcher"
+ icon_state = "grenadelauncher"
interface_name = "integrated grenade launcher"
interface_desc = "Discharges loaded grenades against the wearer's location."
@@ -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/modules/computer.dm b/code/modules/clothing/spacesuits/rig/modules/computer.dm
index a04a0f4c20..b035678e74 100644
--- a/code/modules/clothing/spacesuits/rig/modules/computer.dm
+++ b/code/modules/clothing/spacesuits/rig/modules/computer.dm
@@ -131,7 +131,7 @@
if(!target)
if(ai_card)
if(istype(ai_card,/obj/item/device/aicard))
- ai_card.attack_self(H)
+ ai_card.ui_interact(H, state = deep_inventory_state)
else
eject_ai(H)
update_verb_holder()
diff --git a/code/modules/clothing/spacesuits/rig/modules/modules.dm b/code/modules/clothing/spacesuits/rig/modules/modules.dm
index 3eaf324709..9db0fbdb73 100644
--- a/code/modules/clothing/spacesuits/rig/modules/modules.dm
+++ b/code/modules/clothing/spacesuits/rig/modules/modules.dm
@@ -234,7 +234,7 @@
SetupStat(R)
/mob/proc/SetupStat(var/obj/item/weapon/rig/R)
- if(R && !R.canremove && R.installed_modules.len && statpanel("Hardsuit Modules"))
+ if(src == usr && R && !R.canremove && R.installed_modules.len && statpanel("Hardsuit Modules"))
var/cell_status = R.cell ? "[R.cell.charge]/[R.cell.maxcharge]" : "ERROR"
statpanel("Hardsuit Modules", "Suit charge", cell_status)
for(var/obj/item/rig_module/module in R.installed_modules)
diff --git a/code/modules/clothing/spacesuits/rig/modules/ninja.dm b/code/modules/clothing/spacesuits/rig/modules/ninja.dm
index 803b0f63f1..8b4a30d389 100644
--- a/code/modules/clothing/spacesuits/rig/modules/ninja.dm
+++ b/code/modules/clothing/spacesuits/rig/modules/ninja.dm
@@ -10,7 +10,7 @@
name = "active camouflage module"
desc = "A robust hardsuit-integrated stealth module."
- icon_state = "stealth"
+ icon_state = "cloak"
toggleable = 1
disruptable = 1
diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm
index 235ac1fd22..81df901b38 100644
--- a/code/modules/clothing/spacesuits/rig/rig.dm
+++ b/code/modules/clothing/spacesuits/rig/rig.dm
@@ -20,7 +20,7 @@
armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 20)
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE
- siemens_coefficient = 0.1
+ siemens_coefficient = 0.2
permeability_coefficient = 0.1
unacidable = 1
@@ -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/spacesuits/rig/suits/ert.dm b/code/modules/clothing/spacesuits/rig/suits/ert.dm
index 70c21d5108..c46b019a4d 100644
--- a/code/modules/clothing/spacesuits/rig/suits/ert.dm
+++ b/code/modules/clothing/spacesuits/rig/suits/ert.dm
@@ -29,8 +29,8 @@
desc = "A suit worn by the engineering division of a NanoTrasen Emergency Response Team. Has orange highlights. Armoured and space ready."
suit_type = "ERT engineer"
icon_state = "ert_engineer_rig"
-
- glove_type = /obj/item/clothing/gloves/rig/ert_engineer
+ armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 100)
+ siemens_coefficient = 0
initial_modules = list(
/obj/item/rig_module/ai_container,
@@ -39,10 +39,6 @@
/obj/item/rig_module/device/rcd
)
-/obj/item/clothing/gloves/rig/ert_engineer
- name = "insulated gauntlets"
- siemens_coefficient = 0
-
/obj/item/weapon/rig/ert/medical
name = "ERT-M suit control module"
desc = "A suit worn by the medical division of a NanoTrasen Emergency Response Team. Has white highlights. Armoured and space ready."
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/suits/storage.dm b/code/modules/clothing/suits/storage.dm
index 221a8dbd29..f82eebc1cf 100644
--- a/code/modules/clothing/suits/storage.dm
+++ b/code/modules/clothing/suits/storage.dm
@@ -29,10 +29,6 @@
pockets.emp_act(severity)
..()
-/obj/item/clothing/suit/storage/hear_talk(mob/M, var/msg, verb, datum/language/speaking)
- pockets.hear_talk(M, msg, verb, speaking)
- ..()
-
//Jackets with buttons, used for labcoats, IA jackets, First Responder jackets, and brown jackets.
/obj/item/clothing/suit/storage/toggle
var/icon_open
diff --git a/code/modules/clothing/under/accessories/badges.dm b/code/modules/clothing/under/accessories/badges.dm
index bb6613582e..cc6a6f9965 100644
--- a/code/modules/clothing/under/accessories/badges.dm
+++ b/code/modules/clothing/under/accessories/badges.dm
@@ -43,7 +43,8 @@
/obj/item/clothing/accessory/badge/holo
name = "holobadge"
desc = "This glowing blue badge marks the holder as THE LAW."
- var/emagged = 0 //Emagging removes Sec check.
+ icon_state = "holobadge"
+ var/emagged //Emagging removes Sec check.
/obj/item/clothing/accessory/badge/holo/cord
icon_state = "holobadge-cord"
diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm
index 7f13449d16..a4877bb65d 100644
--- a/code/modules/clothing/under/accessories/storage.dm
+++ b/code/modules/clothing/under/accessories/storage.dm
@@ -34,10 +34,6 @@
hold.emp_act(severity)
..()
-/obj/item/clothing/accessory/storage/hear_talk(mob/M, var/msg, verb, datum/language/speaking)
- hold.hear_talk(M, msg, verb, speaking)
- ..()
-
/obj/item/clothing/accessory/storage/attack_self(mob/user as mob)
user << "You empty [src]."
var/turf/T = get_turf(src)
@@ -72,11 +68,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/clothing/under/chameleon.dm b/code/modules/clothing/under/chameleon.dm
index 4de31fb6e3..983145fd54 100644
--- a/code/modules/clothing/under/chameleon.dm
+++ b/code/modules/clothing/under/chameleon.dm
@@ -9,7 +9,7 @@
item_state = "bl_suit"
worn_state = "black"
desc = "It's a plain jumpsuit. It seems to have a small dial on the wrist."
- origin_tech = "syndicate=3"
+ origin_tech = list(TECH_ILLEGAL = 3)
var/list/clothing_choices = list()
/obj/item/clothing/under/chameleon/New()
@@ -60,7 +60,7 @@
icon_state = "greysoft"
item_state = "greysoft"
desc = "It looks like a plain hat, but upon closer inspection, there's an advanced holographic array installed inside. It seems to have a small dial inside."
- origin_tech = "syndicate=3"
+ origin_tech = list(TECH_ILLEGAL = 3)
body_parts_covered = 0
var/list/clothing_choices = list()
@@ -110,7 +110,7 @@
icon_state = "armor"
item_state = "armor"
desc = "It appears to be a vest of standard armor, except this is embedded with a hidden holographic cloaker, allowing it to change it's appearance, but offering no protection.. It seems to have a small dial inside."
- origin_tech = "syndicate=3"
+ origin_tech = list(TECH_ILLEGAL = 3)
var/list/clothing_choices = list()
/obj/item/clothing/suit/chameleon/New()
@@ -159,7 +159,7 @@
icon_state = "black"
item_state = "black"
desc = "They're comfy black shoes, with clever cloaking technology built in. It seems to have a small dial on the back of each shoe."
- origin_tech = "syndicate=3"
+ origin_tech = list(TECH_ILLEGAL = 3)
var/list/clothing_choices = list()
/obj/item/clothing/shoes/chameleon/New()
@@ -206,7 +206,7 @@
icon_state = "backpack"
item_state = "backpack"
desc = "A backpack outfitted with cloaking tech. It seems to have a small dial inside, kept away from the storage."
- origin_tech = "syndicate=3"
+ origin_tech = list(TECH_ILLEGAL = 3)
var/list/clothing_choices = list()
/obj/item/weapon/storage/backpack/chameleon/New()
@@ -260,7 +260,7 @@
icon_state = "black"
item_state = "bgloves"
desc = "It looks like a pair of gloves, but it seems to have a small dial inside."
- origin_tech = "syndicate=3"
+ origin_tech = list(TECH_ILLEGAL = 3)
var/list/clothing_choices = list()
/obj/item/clothing/gloves/chameleon/New()
@@ -308,7 +308,7 @@
icon_state = "gas_alt"
item_state = "gas_alt"
desc = "It looks like a plain gask mask, but on closer inspection, it seems to have a small dial inside."
- origin_tech = "syndicate=3"
+ origin_tech = list(TECH_ILLEGAL = 3)
var/list/clothing_choices = list()
/obj/item/clothing/mask/chameleon/New()
@@ -358,7 +358,7 @@
icon_state = "meson"
item_state = "glasses"
desc = "It looks like a plain set of mesons, but on closer inspection, it seems to have a small dial inside."
- origin_tech = "syndicate=3"
+ origin_tech = list(TECH_ILLEGAL = 3)
var/list/clothing_choices = list()
/obj/item/clothing/glasses/chameleon/New()
@@ -407,7 +407,7 @@
w_class = 3.0
max_shells = 7
caliber = ".45"
- origin_tech = "combat=2;materials=2;syndicate=8"
+ origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2, TECH_ILLEGAL = 8)
ammo_type = "/obj/item/ammo_casing/chameleon"
matter = list()
var/list/gun_choices = list()
diff --git a/code/modules/events/viral_infection.dm b/code/modules/events/viral_infection.dm
index 639cea4d5e..2eb6121f08 100644
--- a/code/modules/events/viral_infection.dm
+++ b/code/modules/events/viral_infection.dm
@@ -1,3 +1,5 @@
+/var/global/list/event_viruses = list() // so that event viruses are kept around for admin logs, rather than being GCed
+
datum/event/viral_infection
var/list/viruses = list()
@@ -40,10 +42,30 @@ datum/event/viral_infection/start()
if(!candidates.len) return
candidates = shuffle(candidates)//Incorporating Donkie's list shuffle
+ var/list/used_viruses = list()
+ var/list/used_candidates = list()
severity = max(EVENT_LEVEL_MUNDANE, severity - 1)
var/actual_severity = severity * rand(1, 3)
while(actual_severity > 0 && candidates.len)
var/datum/disease2/disease/D = pick(viruses)
infect_mob(candidates[1], D.getcopy())
+ used_candidates += candidates[1]
candidates.Remove(candidates[1])
actual_severity--
+ used_viruses |= D
+
+ event_viruses |= used_viruses
+ var/list/used_viruses_links = list()
+ var/list/used_viruses_text = list()
+ for(var/datum/disease2/disease/D in used_viruses)
+ used_viruses_links += "[D.name()]"
+ used_viruses_text += D.name()
+
+ var/list/used_candidates_links = list()
+ var/list/used_candidates_text = list()
+ for(var/mob/M in used_candidates)
+ used_candidates_links += key_name_admin(M)
+ used_candidates_text += key_name(M)
+
+ log_admin("Virus event affecting [english_list(used_candidates_text)] started; Viruses: [english_list(used_viruses_text)]")
+ message_admins("Virus event affecting [english_list(used_candidates_links)] started; Viruses: [english_list(used_viruses_links)]")
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/ghosttrap/trap.dm b/code/modules/ghosttrap/trap.dm
new file mode 100644
index 0000000000..dd53c1a389
--- /dev/null
+++ b/code/modules/ghosttrap/trap.dm
@@ -0,0 +1,114 @@
+// This system is used to grab a ghost from observers with the required preferences and
+// lack of bans set. See posibrain.dm for an example of how they are called/used. ~Z
+
+var/list/ghost_traps
+
+proc/get_ghost_trap(var/trap_key)
+ if(!ghost_traps)
+ populate_ghost_traps()
+ return ghost_traps[trap_key]
+
+proc/populate_ghost_traps()
+ ghost_traps = list()
+ for(var/traptype in typesof(/datum/ghosttrap))
+ var/datum/ghosttrap/G = new traptype
+ ghost_traps[G.object] = G
+
+/datum/ghosttrap
+ var/object = "positronic brain"
+ var/list/ban_checks = list("AI","Cyborg")
+ var/pref_check = BE_AI
+ var/ghost_trap_message = "They are occupying a positronic brain now."
+ var/ghost_trap_role = "Positronic Brain"
+
+// Check for bans, proper atom types, etc.
+/datum/ghosttrap/proc/assess_candidate(var/mob/dead/observer/candidate)
+ if(!istype(candidate) || !candidate.client || !candidate.ckey)
+ return 0
+ if(!candidate.MayRespawn())
+ candidate << "You have made use of the AntagHUD and hence cannot enter play as \a [object]."
+ return 0
+ if(islist(ban_checks))
+ for(var/bantype in ban_checks)
+ if(jobban_isbanned(candidate, "[bantype]"))
+ candidate << "You are banned from one or more required roles and hence cannot enter play as \a [object]."
+ return 0
+ return 1
+
+// Print a message to all ghosts with the right prefs/lack of bans.
+/datum/ghosttrap/proc/request_player(var/mob/target, var/request_string)
+ if(!target)
+ return
+ for(var/mob/dead/observer/O in player_list)
+ if(!O.MayRespawn())
+ continue
+ if(islist(ban_checks))
+ for(var/bantype in ban_checks)
+ if(jobban_isbanned(O, "[bantype]"))
+ continue
+ if(pref_check && !(O.client.prefs.be_special & pref_check))
+ continue
+ if(O.client)
+ O << "[request_string]Click here if you wish to play as this option."
+
+// Handles a response to request_player().
+/datum/ghosttrap/Topic(href, href_list)
+ if(..())
+ return 1
+ if(href_list["candidate"] && href_list["target"])
+ var/mob/dead/observer/candidate = locate(href_list["candidate"]) // BYOND magic.
+ var/mob/target = locate(href_list["target"]) // So much BYOND magic.
+ if(!target || !candidate)
+ return
+ if(candidate == usr && assess_candidate(candidate) && !target.ckey)
+ transfer_personality(candidate,target)
+ return 1
+
+// Shunts the ckey/mind into the target mob.
+/datum/ghosttrap/proc/transfer_personality(var/mob/candidate, var/mob/target)
+ if(!assess_candidate(candidate))
+ return 0
+ target.ckey = candidate.ckey
+ if(target.mind)
+ target.mind.assigned_role = "[ghost_trap_role]"
+ announce_ghost_joinleave(candidate, 0, "[ghost_trap_message]")
+ welcome_candidate(target)
+ set_new_name(target)
+ return 1
+
+// Fluff!
+/datum/ghosttrap/proc/welcome_candidate(var/mob/target)
+ target << "You are a positronic brain, brought into existence on [station_name()]."
+ target << "As a synthetic intelligence, you answer to all crewmembers, as well as the AI."
+ target << "Remember, the purpose of your existence is to serve the crew and the station. Above all else, do no harm."
+ target << "Use say :b to speak to other artificial intelligences."
+ var/turf/T = get_turf(target)
+ T.visible_message("\The [src] chimes quietly.")
+ var/obj/item/device/mmi/digital/posibrain/P = target.loc
+ if(!istype(P)) //wat
+ return
+ P.searching = 0
+ P.name = "positronic brain ([P.brainmob.name])"
+ P.icon_state = "posibrain-occupied"
+
+// Allows people to set their own name. May or may not need to be removed for posibrains if people are dumbasses.
+/datum/ghosttrap/proc/set_new_name(var/mob/target)
+ var/newname = sanitizeSafe(input(target,"Enter a name, or leave blank for the default name.", "Name change","") as text, MAX_NAME_LEN)
+ if (newname != "")
+ target.real_name = newname
+ target.name = target.real_name
+
+// Doona pods and walking mushrooms.
+/datum/ghosttrap/plant
+ object = "living plant"
+ ban_checks = list("Dionaea")
+ pref_check = BE_PLANT
+ ghost_trap_message = "They are occupying a living plant now."
+ ghost_trap_role = "Plant"
+
+/datum/ghosttrap/plant/welcome_candidate(var/mob/target)
+ target << "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/seed.dm b/code/modules/hydroponics/seed.dm
index 9fd666fbb6..1cf969a090 100644
--- a/code/modules/hydroponics/seed.dm
+++ b/code/modules/hydroponics/seed.dm
@@ -408,7 +408,9 @@
"slimejelly",
"cyanide",
"mindbreaker",
- "stoxin"
+ "stoxin",
+ "acetone",
+ "hydrazine"
)
for(var/x=1;x<=additional_chems;x++)
@@ -678,7 +680,6 @@
total_yield = get_trait(TRAIT_YIELD) + rand(yield_mod)
total_yield = max(1,total_yield)
- currently_querying = list()
for(var/i = 0;iYou awaken slowly, stirring into sluggish motion as the air caresses you."
-
- // This is a hack, replace with some kind of species blurb proc.
- if(istype(host,/mob/living/carbon/alien/diona))
- host << "You are [host], one of a race of drifting interstellar plantlike creatures that sometimes share their seeds with human traders."
- host << "Too much darkness will send you into shock and starve you, but light will help you heal."
-
- var/newname = sanitizeSafe(input(host,"Enter a name, or leave blank for the default name.", "Name change","") as text, MAX_NAME_LEN)
- if (newname != "")
- host.real_name = newname
- host.name = host.real_name
\ No newline at end of file
diff --git a/code/modules/hydroponics/spreading/spreading.dm b/code/modules/hydroponics/spreading/spreading.dm
index 2d088658ac..57579cdb72 100644
--- a/code/modules/hydroponics/spreading/spreading.dm
+++ b/code/modules/hydroponics/spreading/spreading.dm
@@ -24,6 +24,8 @@
vine.process()
message_admins("Event: Spacevines spawned at [T.loc] ([T.x],[T.y],[T.z])")
+ return
+ message_admins("Event: Spacevines failed to find a viable turf.")
/obj/effect/dead_plant
anchored = 1
@@ -56,7 +58,7 @@
var/growth_threshold = 0
var/growth_type = 0
var/max_growth = 0
-
+ var/sampled
var/list/neighbors = list()
var/obj/effect/plant/parent
var/datum/seed/seed
@@ -233,8 +235,13 @@
if(istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/weapon/scalpel))
if(!seed)
- user << "There is nothing to take a sample from."
+ user << "There is nothing to take a sample from."
return
+ if(sampled)
+ user << "You cannot take another sample from \the [src]."
+ return
+ if(prob(70))
+ sampled = 1
seed.harvest(user,0,1)
health -= (rand(3,5)*10)
else
diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm
index ea20f2c0e3..0816022972 100644
--- a/code/modules/hydroponics/trays/tray.dm
+++ b/code/modules/hydroponics/trays/tray.dm
@@ -47,9 +47,10 @@
var/global/list/toxic_reagents = list(
"anti_toxin" = -2,
"toxin" = 2,
- "fluorine" = 2.5,
- "chlorine" = 1.5,
+ "hydrazine" = 2.5,
+ "acetone" = 1,
"sacid" = 1.5,
+ "hclacid" = 1.5,
"pacid" = 3,
"plantbgone" = 3,
"cryoxadone" = -3,
@@ -70,11 +71,11 @@
"left4zed" = 1
)
var/global/list/weedkiller_reagents = list(
- "fluorine" = -4,
- "chlorine" = -3,
+ "hydrazine" = -4,
"phosphorus" = -2,
"sugar" = 2,
"sacid" = -2,
+ "hclacid" = -2,
"pacid" = -4,
"plantbgone" = -8,
"adminordrazine" = -5
@@ -89,8 +90,7 @@
"adminordrazine" = 1,
"milk" = 0.9,
"beer" = 0.7,
- "fluorine" = -0.5,
- "chlorine" = -0.5,
+ "hydrazine" = -2,
"phosphorus" = -0.5,
"water" = 1,
"sodawater" = 1,
@@ -99,11 +99,11 @@
// Beneficial reagents also have values for modifying yield_mod and mut_mod (in that order).
var/global/list/beneficial_reagents = list(
"beer" = list( -0.05, 0, 0 ),
- "fluorine" = list( -2, 0, 0 ),
- "chlorine" = list( -1, 0, 0 ),
+ "hydrazine" = list( -2, 0, 0 ),
"phosphorus" = list( -0.75, 0, 0 ),
"sodawater" = list( 0.1, 0, 0 ),
"sacid" = list( -1, 0, 0 ),
+ "hclacid" = list( -1, 0, 0 ),
"pacid" = list( -2, 0, 0 ),
"plantbgone" = list( -2, 0, 0.2),
"cryoxadone" = list( 3, 0, 0 ),
@@ -129,7 +129,22 @@
return
return ..()
+/obj/machinery/portable_atmospherics/hydroponics/attack_ghost(var/mob/dead/observer/user)
+
+ if(!(harvest && seed && seed.has_mob_product))
+ return
+
+ var/datum/ghosttrap/plant/G = get_ghost_trap("living plant")
+ if(!G.assess_candidate(user))
+ return
+ var/response = alert(user, "Are you sure you want to harvest this [seed.display_name]?", "Living plant request", "Yes", "No")
+ if(response == "Yes")
+ harvest()
+ return
+
/obj/machinery/portable_atmospherics/hydroponics/attack_generic(var/mob/user)
+
+ // Why did I ever think this was a good idea. TODO: move this onto the nymph mob.
if(istype(user,/mob/living/carbon/alien/diona))
var/mob/living/carbon/alien/diona/nymph = user
@@ -475,7 +490,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..8a5f584b4f
--- /dev/null
+++ b/code/modules/materials/material_sheets.dm
@@ -0,0 +1,159 @@
+// 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
+ max_amount = 50
+
+ 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.Copy()
+ perunit = SHEET_MATERIAL_AMOUNT
+
+ 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] = SHEET_MATERIAL_AMOUNT
+ return 1
+
+/obj/item/stack/material/transfer_to(obj/item/stack/S, var/tamount=null, var/type_verified)
+ var/obj/item/stack/material/M = S
+ if(!istype(M) || material.name != M.material.name)
+ return 0
+ ..(S,tamount,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..112d45e21f 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,57 @@ 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/list/stack_origin_tech = list(TECH_MATERIAL = 1) // Research level 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 +96,125 @@ 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 = list(TECH_MATERIAL = 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 = list(TECH_MATERIAL = 6)
/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 = list(TECH_MATERIAL = 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 = list(TECH_MATERIAL = 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 = list(TECH_MATERIAL = 2, TECH_PHORON = 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 +227,118 @@ 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 = list(TECH_MATERIAL = 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 = list(TECH_MATERIAL = 3, TECH_PHORON = 2)
+
+/material/glass/phoron/reinforced
+ name = "reinforced phoron glass"
+ stack_type = /obj/item/stack/material/glass/phoronrglass
+ stack_origin_tech = list(TECH_MATERIAL = 4, TECH_PHORON = 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 = list(TECH_MATERIAL = 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 = list(TECH_MATERIAL = 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 = list(TECH_MATERIAL = 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 = list(TECH_MATERIAL = 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 = list(TECH_MATERIAL = 6, TECH_POWER = 6, TECH_MAGNET = 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 = list(TECH_MATERIAL = 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
/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 = list(TECH_MATERIAL = 1, TECH_BIO = 1)
+ dooropen_noise = 'sound/effects/doorcreaky.ogg'
+ door_icon_base = "wood"
+ destruction_desc = "splinters"
/material/wood/holographic
name = "holographic wood"
@@ -211,6 +346,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 = list(TECH_MATERIAL = 1)
+ door_icon_base = "wood"
+ destruction_desc = "crumples"
+
+/material/cloth //todo
+ name = "cloth"
+ stack_origin_tech = list(TECH_MATERIAL = 2)
+ door_icon_base = "wood"
+
/material/cult
name = "cult"
display_name = "disturbing stone"
@@ -231,3 +384,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 = list(TECH_MATERIAL = 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/drilling/scanner.dm b/code/modules/mining/drilling/scanner.dm
index 6903256d92..878bf1b2c2 100644
--- a/code/modules/mining/drilling/scanner.dm
+++ b/code/modules/mining/drilling/scanner.dm
@@ -4,8 +4,8 @@
icon = 'icons/obj/device.dmi'
icon_state = "forensic0-old" //GET A BETTER SPRITE.
item_state = "electronic"
+ origin_tech = list(TECH_MAGNET = 1, TECH_ENGINERING = 1)
matter = list(DEFAULT_WALL_MATERIAL = 150)
- origin_tech = "magnets=1;engineering=1"
/obj/item/weapon/mining_scanner/attack_self(mob/user as mob)
user << "You begin sweeping \the [src] about, scanning for metal deposits."
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_items.dm b/code/modules/mining/mine_items.dm
index 02b1a77174..2a472459f0 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -51,7 +51,7 @@
w_class = 4.0
matter = list(DEFAULT_WALL_MATERIAL = 3750)
var/digspeed = 40 //moving the delay to an item var so R&D can make improved picks. --NEO
- origin_tech = "materials=1;engineering=1"
+ origin_tech = list(TECH_MATERIAL = 1, TECH_ENGINERING = 1)
attack_verb = list("hit", "pierced", "sliced", "attacked")
var/drill_sound = 'sound/weapons/Genhit.ogg'
var/drill_verb = "drilling"
@@ -69,7 +69,7 @@
icon_state = "spickaxe"
item_state = "spickaxe"
digspeed = 30
- origin_tech = "materials=3"
+ origin_tech = list(TECH_MATERIAL = 3)
desc = "This makes no metallurgic sense."
/obj/item/weapon/pickaxe/drill
@@ -77,7 +77,7 @@
icon_state = "handdrill"
item_state = "jackhammer"
digspeed = 30
- origin_tech = "materials=2;powerstorage=3;engineering=2"
+ origin_tech = list(TECH_MATERIAL = 2, TECH_POWER = 3, TECH_ENGINERING = 2)
desc = "Yours is the drill that will pierce through the rock walls."
drill_verb = "drilling"
@@ -86,7 +86,7 @@
icon_state = "jackhammer"
item_state = "jackhammer"
digspeed = 20 //faster than drill, but cannot dig
- origin_tech = "materials=3;powerstorage=2;engineering=2"
+ origin_tech = list(TECH_MATERIAL = 3, TECH_POWER = 2, TECH_ENGINERING = 2)
desc = "Cracks rocks with sonic blasts, perfect for killing cave lizards."
drill_verb = "hammering"
@@ -95,7 +95,7 @@
icon_state = "gpickaxe"
item_state = "gpickaxe"
digspeed = 20
- origin_tech = "materials=4"
+ origin_tech = list(TECH_MATERIAL = 4)
desc = "This makes no metallurgic sense."
drill_verb = "picking"
@@ -106,7 +106,7 @@
w_class = 3.0 //it is smaller than the pickaxe
damtype = "fire"
digspeed = 20 //Can slice though normal walls, all girders, or be used in reinforced wall deconstruction/ light thermite on fire
- origin_tech = "materials=4;phorontech=3;engineering=3"
+ origin_tech = list(TECH_MATERIAL = 4, TECH_PHORON = 3, TECH_ENGINERING = 3)
desc = "A rock cutter that uses bursts of hot plasma. You could use it to cut limbs off of xenos! Or, you know, mine stuff."
drill_verb = "cutting"
drill_sound = 'sound/items/Welder.ogg'
@@ -118,7 +118,7 @@
icon_state = "dpickaxe"
item_state = "dpickaxe"
digspeed = 10
- origin_tech = "materials=6;engineering=4"
+ origin_tech = list(TECH_MATERIAL = 6, TECH_ENGINERING = 4)
desc = "A pickaxe with a diamond pick head."
drill_verb = "picking"
@@ -127,7 +127,7 @@
icon_state = "diamonddrill"
item_state = "jackhammer"
digspeed = 5 //Digs through walls, girders, and can dig up sand
- origin_tech = "materials=6;powerstorage=4;engineering=5"
+ origin_tech = list(TECH_MATERIAL = 6, TECH_POWER = 4, TECH_ENGINERING = 5)
desc = "Yours is the drill that will pierce the heavens!"
drill_verb = "drilling"
@@ -152,8 +152,8 @@
throwforce = 4.0
item_state = "shovel"
w_class = 3.0
+ origin_tech = list(TECH_MATERIAL = 1, TECH_ENGINERING = 1)
matter = list(DEFAULT_WALL_MATERIAL = 50)
- origin_tech = "materials=1;engineering=1"
attack_verb = list("bashed", "bludgeoned", "thrashed", "whacked")
sharp = 0
edge = 1
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/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 56927f56bf..2874d16d39 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -202,13 +202,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
statpanel("Status")
if (client.statpanel == "Status")
stat(null, "Station Time: [worldtime2text()]")
- if(ticker)
- if(ticker.mode)
- //world << "DEBUG: ticker not null"
- if(ticker.mode.name == "AI malfunction")
- //world << "DEBUG: malf mode ticker test"
- if(malf.revealed)
- stat(null, "Time left: [max(malf.hack_time/(malf.hacked_apcs.len/3), 0)]")
if(emergency_shuttle)
var/eta_status = emergency_shuttle.get_status_panel_eta()
if(eta_status)
diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm
index 5645773ea0..54f31d5b5b 100644
--- a/code/modules/mob/emote.dm
+++ b/code/modules/mob/emote.dm
@@ -24,8 +24,6 @@
if (message)
log_emote("[name]/[key] : [message]")
- var/list/seeing_obj = list() //For objs that need to see emotes. You can use see_emote(), which is based off of hear_talk()
-
//Hearing gasp and such every five seconds is not good emotes were not global for a reason.
// Maybe some people are okay with that.
@@ -37,58 +35,31 @@
if(findtext(message," snores.")) //Because we have so many sleeping people.
break
if(M.stat == 2 && (M.client.prefs.toggles & CHAT_GHOSTSIGHT) && !(M in viewers(src,null)))
- M.show_message(message)
+ M.show_message(message, m_type)
- for(var/I in view(world.view, get_turf(usr))) //get_turf is needed to stop weirdness with x-ray.
- if(istype(I, /mob/))
- var/mob/M = I
- for(var/obj/O in M.contents)
- seeing_obj |= O
- else if(istype(I, /obj/))
- var/obj/O = I
- seeing_obj |= O
-
- // Type 1 (Visual) emotes are sent to anyone in view of the item
if (m_type & 1)
- //for (var/mob/O in viewers(src, null))
- for (var/mob/O in viewers(get_turf(src), null)) //This may break people with x-ray being able to see emotes across walls,
- //but this saves many headaches down the road, involving mechs and pAIs.
- //x-ray is so rare these days anyways.
+ var/list/see = get_mobs_or_objects_in_view(world.view,src) | viewers(get_turf(src), null)
+ for(var/I in see)
+ if(isobj(I))
+ spawn(0)
+ if(I) //It's possible that it could be deleted in the meantime.
+ var/obj/O = I
+ O.see_emote(src, message, 1)
+ else if(ismob(I))
+ var/mob/M = I
+ M.show_message(message, 1)
- if(O.status_flags & PASSEMOTES)
-
- for(var/obj/item/weapon/holder/H in O.contents)
- H.show_message(message, m_type)
-
- for(var/mob/living/M in O.contents)
- M.show_message(message, m_type)
-
- O.show_message(message, m_type)
-
- for(var/obj/O in seeing_obj)
- spawn(0)
- if(O) //It's possible that it could be deleted in the meantime.
- O.see_emote(src, message, 1)
-
- // Type 2 (Audible) emotes are sent to anyone in hear range
- // of the *LOCATION* -- this is important for AIs/pAIs to be heard
else if (m_type & 2)
- for (var/mob/O in hearers(get_turf(src), null))
-
- if(O.status_flags & PASSEMOTES)
-
- for(var/obj/item/weapon/holder/H in O.contents)
- H.show_message(message, m_type)
-
- for(var/mob/living/M in O.contents)
- M.show_message(message, m_type)
-
- O.show_message(message, m_type)
-
- for(var/obj/O in seeing_obj)
- spawn(0)
- if(O) //It's possible that it could be deleted in the meantime.
- O.see_emote(src, message, 2)
+ var/list/hear = get_mobs_or_objects_in_view(world.view,src)
+ for(var/I in hear)
+ if(isobj(I))
+ spawn(0)
+ if(I) //It's possible that it could be deleted in the meantime.
+ var/obj/O = I
+ O.see_emote(src, message, 2)
+ else if(ismob(I))
+ var/mob/M = I
+ M.show_message(message, 2)
/mob/proc/emote_dead(var/message)
diff --git a/code/modules/mob/freelook/eye.dm b/code/modules/mob/freelook/eye.dm
index bec261797d..fb2b04a434 100644
--- a/code/modules/mob/freelook/eye.dm
+++ b/code/modules/mob/freelook/eye.dm
@@ -8,6 +8,7 @@
icon = 'icons/mob/eye.dmi'
icon_state = "default-eye"
alpha = 127
+ density = 0
var/sprint = 10
var/cooldown = 0
diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm
index 6347a091f4..26cbefc482 100644
--- a/code/modules/mob/holder.dm
+++ b/code/modules/mob/holder.dm
@@ -5,9 +5,12 @@
icon = 'icons/obj/objects.dmi'
slot_flags = SLOT_HEAD
sprite_sheets = list("Vox" = 'icons/mob/species/vox/head.dmi')
+ item_icons = list(
+ slot_l_hand_str = 'icons/mob/items/lefthand_holder.dmi',
+ slot_r_hand_str = 'icons/mob/items/righthand_holder.dmi',
+ )
/obj/item/weapon/holder/New()
- item_state = icon_state
..()
processing_objects.Add(src)
@@ -32,10 +35,6 @@
for(var/mob/M in src.contents)
M.attackby(W,user)
-/obj/item/weapon/holder/proc/show_message(var/message, var/m_type)
- for(var/mob/living/M in contents)
- M.show_message(message,m_type)
-
//Mob procs and vars for scooping up
/mob/living/var/holder_type
@@ -51,7 +50,7 @@
grabber << "You scoop up [src]."
src << "[grabber] scoops you up."
grabber.status_flags |= PASSEMOTES
- return
+ return H
//Mob specific holders.
@@ -59,14 +58,14 @@
name = "diona nymph"
desc = "It's a tiny plant critter."
icon_state = "nymph"
- origin_tech = "magnets=3;biotech=5"
+ origin_tech = list(TECH_MAGNET = 3, TECH_BIO = 5)
slot_flags = SLOT_HEAD | SLOT_OCLOTHING
/obj/item/weapon/holder/drone
name = "maintenance drone"
desc = "It's a small maintenance robot."
icon_state = "drone"
- origin_tech = "magnets=3;engineering=5"
+ origin_tech = list(TECH_MAGNET = 3, TECH_ENGINERING = 5)
/obj/item/weapon/holder/cat
name = "cat"
@@ -74,11 +73,27 @@
icon_state = "cat"
origin_tech = null
+/obj/item/weapon/holder/mouse
+ name = "mouse"
+ desc = "It's a small rodent."
+ icon_state = "mouse_gray"
+ origin_tech = null
+ w_class = 1
+
+/obj/item/weapon/holder/mouse/gray
+ icon_state = "mouse_gray"
+
+/obj/item/weapon/holder/mouse/white
+ icon_state = "mouse_white"
+
+/obj/item/weapon/holder/mouse/brown
+ icon_state = "mouse_brown"
+
/obj/item/weapon/holder/borer
name = "cortical borer"
desc = "It's a slimy brain slug. Gross."
icon_state = "borer"
- origin_tech = "biotech=6"
+ origin_tech = list(TECH_BIO = 6)
/obj/item/weapon/holder/monkey
name = "monkey"
@@ -99,3 +114,8 @@
name = "neaera"
desc = "It's a neaera."
icon_state = "neara"
+
+/obj/item/weapon/holder/pai
+ name = "pAI"
+ desc = "It's a little robot."
+ icon_state = "pai"
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/language/station.dm b/code/modules/mob/language/station.dm
index d5900769b3..bb343c0e7f 100644
--- a/code/modules/mob/language/station.dm
+++ b/code/modules/mob/language/station.dm
@@ -94,6 +94,25 @@
else
return ..()
+/datum/language/machine
+ name = "Encoded Audio Language"
+ desc = "A language of encoded tones that allow for IPCs to communicate auditorily between each other in a manner that allows for easier transfer of information."
+ speech_verb = "beeps"
+ ask_verb = "beeps"
+ exclaim_verb = "loudly beeps"
+ colour = "changeling"
+ key = "6"
+ flags = RESTRICTED | NO_STUTTER
+ syllables = list("beep","beep","beep","beep","beep","boop","boop","boop","bop","bop","dee","dee","doo","doo","hiss","hss","buzz","buzz","bzz","ksssh","keey","wurr","wahh","tzzz")
+ space_chance = 10
+
+/datum/language/machine/get_random_name()
+ if(prob(70))
+ name = "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]"
+ else
+ name = pick(ai_names)
+ return name
+
//Syllable Lists
/*
This list really long, mainly because I can't make up my mind about which mandarin syllables should be removed,
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/alien/diona/diona_attacks.dm b/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm
index 981ab4433f..956171abf7 100644
--- a/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm
+++ b/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm
@@ -1,7 +1,10 @@
-/mob/living/carbon/alien/diona/attack_hand(mob/living/carbon/human/M as mob)
- if(istype(M) && M.a_intent == I_HELP)
- if(M.species && M.species.name == "Diona" && do_merge(M))
+/mob/living/carbon/alien/diona/MouseDrop(atom/over_object)
+ var/mob/living/carbon/H = over_object
+ if(!istype(H) || !Adjacent(H)) return ..()
+ if(H.a_intent == "help")
+ if(H.species && H.species.name == "Diona" && do_merge(H))
return
- get_scooped(M)
+ get_scooped(H)
return
- ..()
\ No newline at end of file
+ else
+ return ..()
diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm
index 5730474ab1..49e8c6ad52 100644
--- a/code/modules/mob/living/carbon/brain/MMI.dm
+++ b/code/modules/mob/living/carbon/brain/MMI.dm
@@ -23,7 +23,7 @@
icon = 'icons/obj/assemblies.dmi'
icon_state = "mmi_empty"
w_class = 3
- origin_tech = "biotech=3"
+ origin_tech = list(TECH_BIO = 3)
var/list/construction_cost = list(DEFAULT_WALL_MATERIAL=1000,"glass"=500)
var/construction_time = 75
@@ -134,7 +134,7 @@
/obj/item/device/mmi/radio_enabled
name = "radio-enabled man-machine interface"
desc = "The Warrior's bland acronym, MMI, obscures the true horror of this monstrosity. This one comes with a built-in radio."
- origin_tech = "biotech=4"
+ origin_tech = list(TECH_BIO = 4)
var/obj/item/device/radio/radio = null//Let's give it a radio.
diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm
index 486916821b..0cda53c182 100644
--- a/code/modules/mob/living/carbon/brain/brain_item.dm
+++ b/code/modules/mob/living/carbon/brain/brain_item.dm
@@ -11,7 +11,7 @@
throwforce = 1.0
throw_speed = 3
throw_range = 5
- origin_tech = "biotech=3"
+ origin_tech = list(TECH_BIO = 3)
attack_verb = list("attacked", "slapped", "whacked")
var/mob/living/carbon/brain/brainmob = null
@@ -92,4 +92,4 @@
desc = "A tightly furled roll of paper, covered with indecipherable runes."
robotic = 2
icon = 'icons/obj/wizard.dmi'
- icon_state = "scroll"
\ No newline at end of file
+ icon_state = "scroll"
diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm
index b9ff795aaa..3c2d4422d1 100644
--- a/code/modules/mob/living/carbon/brain/posibrain.dm
+++ b/code/modules/mob/living/carbon/brain/posibrain.dm
@@ -4,48 +4,42 @@
icon = 'icons/obj/assemblies.dmi'
icon_state = "posibrain"
w_class = 3
- origin_tech = "engineering=4;materials=4;bluespace=2;programming=4"
-
+ origin_tech = list(TECH_ENGINERING = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2, TECH_DATA = 4)
+ var/searching = 0
construction_cost = list(DEFAULT_WALL_MATERIAL=500,"glass"=500,"silver"=200,"gold"=200,"phoron"=100,"diamond"=10)
construction_time = 75
- var/searching = 0
- var/askDelay = 10 * 60 * 1
req_access = list(access_robotics)
locked = 0
mecha = null//This does not appear to be used outside of reference in mecha.dm.
+/obj/item/device/mmi/digital/posibrain/New()
+ ..()
+ brainmob.name = "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]"
+ brainmob.real_name = src.brainmob.name
-/obj/item/device/mmi/digital/posibrain/attack_self(mob/user as mob)
- if(brainmob && !brainmob.key && searching == 0)
+/obj/item/device/mmi/digital/posibrain/attack_self(var/mob/user)
+ if(brainmob && !brainmob.key && !searching)
//Start the process of searching for a new user.
- user << "\blue You carefully locate the manual activation switch and start the positronic brain's boot process."
+ user << "You carefully locate the manual activation switch and start the positronic brain's boot process."
icon_state = "posibrain-searching"
- src.searching = 1
- src.request_player()
+ searching = 1
+ var/datum/ghosttrap/G = get_ghost_trap("positronic brain")
+ G.request_player(brainmob, "A [src.name] has been booted by \the [user] in [get_area(user)]. ")
spawn(600) reset_search()
-/obj/item/device/mmi/digital/posibrain/proc/request_player()
- for(var/mob/dead/observer/O in player_list)
- if(!O.MayRespawn())
- continue
- if(jobban_isbanned(O, "AI") && jobban_isbanned(O, "Cyborg"))
- continue
- if(O.client)
- if(O.client.prefs.be_special & BE_AI)
- question(O.client)
-
-/obj/item/device/mmi/digital/posibrain/proc/question(var/client/C)
- spawn(0)
- if(!C) return
- var/response = alert(C, "Someone is requesting a personality for a positronic brain. Would you like to play as one?", "Positronic brain request", "Yes", "No", "Never for this round")
- if(response == "Yes")
- response = alert(C, "Are you sure you want to play as a positronic brain?", "Positronic brain request", "Yes", "No")
- if(!C || brainmob.key || 0 == searching) return //handle logouts that happen whilst the alert is waiting for a response, and responses issued after a brain has been located.
- if(response == "Yes")
- transfer_personality(C.mob)
- else if (response == "Never for this round")
- C.prefs.be_special ^= BE_AI
-
+/obj/item/device/mmi/digital/posibrain/attack_ghost(var/mob/dead/observer/user)
+ var/datum/ghosttrap/G = get_ghost_trap("positronic brain")
+ if(!G.assess_candidate(user))
+ return
+ var/response = alert(user, "Are you sure you want to play as a positronic brain?", "Positronic brain request", "Yes", "No")
+ if(response == "Yes")
+ if(G.transfer_personality(user, brainmob))
+ var/turf/T = get_turf(src)
+ T.visible_message("\The [src] chimes quietly.")
+ searching = 0
+ name = "positronic brain ([brainmob.name])"
+ icon_state = "posibrain-occupied"
+ return
/obj/item/device/mmi/digital/posibrain/transfer_identity(var/mob/living/carbon/H)
..()
@@ -55,33 +49,13 @@
icon_state = "posibrain-occupied"
return
-/obj/item/device/mmi/digital/posibrain/proc/transfer_personality(var/mob/candidate)
- announce_ghost_joinleave(candidate, 0, "They are occupying a positronic brain now.")
- src.searching = 0
- src.brainmob.mind = candidate.mind
- src.brainmob.ckey = candidate.ckey
- src.name = "positronic brain ([src.brainmob.name])"
- src.brainmob << "You are a positronic brain, brought into existence on [station_name()]."
- src.brainmob << "As a synthetic intelligence, you answer to all crewmembers, as well as the AI."
- src.brainmob << "Remember, the purpose of your existence is to serve the crew and the station. Above all else, do no harm."
- src.brainmob << "Use say :b to speak to other artificial intelligences."
- src.brainmob.mind.assigned_role = "Positronic Brain"
-
- var/turf/T = get_turf_or_move(src.loc)
- for (var/mob/M in viewers(T))
- M.show_message("\blue The positronic brain chimes quietly.")
- icon_state = "posibrain-occupied"
-
-/obj/item/device/mmi/digital/posibrain/proc/reset_search() //We give the players sixty seconds to decide, then reset the timer.
-
- if(src.brainmob && src.brainmob.key) return
-
- src.searching = 0
+/obj/item/device/mmi/digital/posibrain/proc/reset_search()
+ if(!searching || (src.brainmob && src.brainmob.key))
+ return
+ searching = 0
icon_state = "posibrain"
-
- var/turf/T = get_turf_or_move(src.loc)
- for (var/mob/M in viewers(T))
- M.show_message("\blue The positronic brain buzzes quietly, and the golden lights fade away. Perhaps you could try again?")
+ var/turf/T = get_turf(src)
+ T.visible_message("\The [src] brain buzzes quietly, and the golden lights fade away. Perhaps you could try again?")
/obj/item/device/mmi/digital/posibrain/examine(mob/user)
if(!..(user))
@@ -115,7 +89,3 @@
src.brainmob.emp_damage += rand(0,10)
..()
-/obj/item/device/mmi/digital/posibrain/New()
- ..()
- src.brainmob.name = "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]"
- src.brainmob.real_name = src.brainmob.name
diff --git a/code/modules/mob/living/carbon/brain/robot.dm b/code/modules/mob/living/carbon/brain/robot.dm
index bc7a13c2c2..873b55d518 100644
--- a/code/modules/mob/living/carbon/brain/robot.dm
+++ b/code/modules/mob/living/carbon/brain/robot.dm
@@ -4,7 +4,7 @@
icon = 'icons/obj/module.dmi'
icon_state = "mainboard"
w_class = 3
- origin_tech = "engineering=4;materials=3;programming=4"
+ origin_tech = list(TECH_ENGINERING = 4, TECH_MATERIAL = 3, TECH_DATA = 4)
/obj/item/device/mmi/digital/robot/New()
..()
diff --git a/code/modules/mob/living/carbon/breathe.dm b/code/modules/mob/living/carbon/breathe.dm
index b467b88cd2..62f14da499 100644
--- a/code/modules/mob/living/carbon/breathe.dm
+++ b/code/modules/mob/living/carbon/breathe.dm
@@ -2,14 +2,14 @@
/mob/living/carbon/proc/breathe()
//if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) return
- if(species && (species.flags & NO_BREATHE || species.flags & IS_SYNTHETIC)) return
-
+ if(species && (species.flags & NO_BREATHE)) return
+
var/datum/gas_mixture/breath = null
-
+
//First, check if we can breathe at all
if(health < config.health_threshold_crit && !(CE_STABLE in chem_effects)) //crit aka circulatory shock
losebreath++
-
+
if(losebreath>0) //Suffocating so do not take a breath
losebreath--
if (prob(10)) //Gasp per 10 ticks? Sounds about right.
@@ -17,9 +17,9 @@
else
//Okay, we can breathe, now check if we can get air
breath = get_breath_from_internal() //First, check for air from internals
- if(!breath)
+ if(!breath)
breath = get_breath_from_environment() //No breath from internals so let's try to get air from our location
-
+
handle_breath(breath)
handle_post_breath(breath)
@@ -40,15 +40,15 @@
/mob/living/carbon/proc/get_breath_from_environment(var/volume_needed=BREATH_VOLUME)
var/datum/gas_mixture/breath = null
-
+
var/datum/gas_mixture/environment
if(loc)
environment = loc.return_air_for_internal_lifeform()
-
+
if(environment)
breath = environment.remove_volume(volume_needed)
handle_chemical_smoke(environment) //handle chemical smoke while we're at it
-
+
if(breath)
//handle mask filtering
if(istype(wear_mask, /obj/item/clothing/mask) && breath)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 72bd64453d..2162e3488a 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
@@ -249,7 +249,7 @@
var/mob/living/carbon/human/H = src
H.w_uniform.add_fingerprint(M)
- if(player_logged)
+ if(!client || !key || player_logged)
M.visible_message("[M] shakes [src] trying to wake [t_him] up!", \
"You shake [src], but they do not respond... Maybe they have S.S.D?")
else if(lying || src.sleeping)
diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm
index 52ba116d43..5f9527b93b 100644
--- a/code/modules/mob/living/carbon/human/appearance.dm
+++ b/code/modules/mob/living/carbon/human/appearance.dm
@@ -118,6 +118,7 @@
b_skin = blue
force_update_limbs()
+ update_body()
return 1
/mob/living/carbon/human/proc/change_skin_tone(var/tone)
@@ -127,6 +128,7 @@
s_tone = tone
force_update_limbs()
+ update_body()
return 1
/mob/living/carbon/human/proc/update_dna()
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index 78a47fc541..10b2a91477 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -21,15 +21,15 @@
switch(act)
if ("airguitar")
if (!src.restrained())
- message = "[src] is strumming the air and headbanging like a safari chimp."
+ message = "is strumming the air and headbanging like a safari chimp."
m_type = 1
if ("blink")
- message = "[src] blinks."
+ message = "blinks."
m_type = 1
if ("blink_r")
- message = "[src] blinks rapidly."
+ message = "blinks rapidly."
m_type = 1
if ("bow")
@@ -44,9 +44,9 @@
param = null
if (param)
- message = "[src] bows to [param]."
+ message = "bows to [param]."
else
- message = "[src] bows."
+ message = "bows."
m_type = 1
if ("custom")
@@ -94,73 +94,73 @@
param = null
if (param)
- message = "[src] salutes to [param]."
+ message = "salutes to [param]."
else
- message = "[src] salutes."
+ message = "salutes."
m_type = 1
if ("choke")
if(miming)
- message = "[src] clutches his throat desperately!"
+ message = "clutches his throat desperately!"
m_type = 1
else
if (!muzzled)
- message = "[src] chokes!"
+ message = "chokes!"
m_type = 2
else
- message = "[src] makes a strong noise."
+ message = "makes a strong noise."
m_type = 2
if ("clap")
if (!src.restrained())
- message = "[src] claps."
+ message = "claps."
m_type = 2
if(miming)
m_type = 1
if ("flap")
if (!src.restrained())
- message = "[src] flaps \his wings."
+ message = "flaps [get_visible_gender() == MALE ? "his" : get_visible_gender() == FEMALE ? "her" : "their"] wings."
m_type = 2
if(miming)
m_type = 1
if ("aflap")
if (!src.restrained())
- message = "[src] flaps \his wings ANGRILY!"
+ message = "flaps [get_visible_gender() == MALE ? "his" : get_visible_gender() == FEMALE ? "her" : "their"] wings ANGRILY!"
m_type = 2
if(miming)
m_type = 1
if ("drool")
- message = "[src] drools."
+ message = "drools."
m_type = 1
if ("eyebrow")
- message = "[src] raises an eyebrow."
+ message = "raises an eyebrow."
m_type = 1
if ("chuckle")
if(miming)
- message = "[src] appears to chuckle."
+ message = "appears to chuckle."
m_type = 1
else
if (!muzzled)
- message = "[src] chuckles."
+ message = "chuckles."
m_type = 2
else
- message = "[src] makes a noise."
+ message = "makes a noise."
m_type = 2
if ("twitch")
- message = "[src] twitches violently."
+ message = "twitches violently."
m_type = 1
if ("twitch_s")
- message = "[src] twitches."
+ message = "twitches."
m_type = 1
if ("faint")
- message = "[src] faints."
+ message = "faints."
if(src.sleeping)
return //Can't faint while asleep
src.sleeping += 10 //Short-short nap
@@ -168,58 +168,58 @@
if ("cough")
if(miming)
- message = "[src] appears to cough!"
+ message = "appears to cough!"
m_type = 1
else
if (!muzzled)
- message = "[src] coughs!"
+ message = "coughs!"
m_type = 2
else
- message = "[src] makes a strong noise."
+ message = "makes a strong noise."
m_type = 2
if ("frown")
- message = "[src] frowns."
+ message = "frowns."
m_type = 1
if ("nod")
- message = "[src] nods."
+ message = "nods."
m_type = 1
if ("blush")
- message = "[src] blushes."
+ message = "blushes."
m_type = 1
if ("wave")
- message = "[src] waves."
+ message = "waves."
m_type = 1
if ("gasp")
if(miming)
- message = "[src] appears to be gasping!"
+ message = "appears to be gasping!"
m_type = 1
else
if (!muzzled)
- message = "[src] gasps!"
+ message = "gasps!"
m_type = 2
else
- message = "[src] makes a weak noise."
+ message = "makes a weak noise."
m_type = 2
if ("deathgasp")
- message = "[src] [species.death_message]"
+ message = "[species.death_message]"
m_type = 1
if ("giggle")
if(miming)
- message = "[src] giggles silently!"
+ message = "giggles silently!"
m_type = 1
else
if (!muzzled)
- message = "[src] giggles."
+ message = "giggles."
m_type = 2
else
- message = "[src] makes a noise."
+ message = "makes a noise."
m_type = 2
if ("glare")
@@ -233,9 +233,9 @@
param = null
if (param)
- message = "[src] glares at [param]."
+ message = "glares at [param]."
else
- message = "[src] glares."
+ message = "glares."
if ("stare")
var/M = null
@@ -248,9 +248,9 @@
param = null
if (param)
- message = "[src] stares at [param]."
+ message = "stares at [param]."
else
- message = "[src] stares."
+ message = "stares."
if ("look")
var/M = null
@@ -264,86 +264,86 @@
param = null
if (param)
- message = "[src] looks at [param]."
+ message = "looks at [param]."
else
- message = "[src] looks."
+ message = "looks."
m_type = 1
if ("grin")
- message = "[src] grins."
+ message = "grins."
m_type = 1
if ("cry")
if(miming)
- message = "[src] cries."
+ message = "cries."
m_type = 1
else
if (!muzzled)
- message = "[src] cries."
+ message = "cries."
m_type = 2
else
- message = "[src] makes a weak noise. \He frowns."
+ message = "makes a weak noise. [get_visible_gender() == MALE ? "He" : get_visible_gender() == FEMALE ? "She" : "They"] [get_visible_gender() == NEUTER ? "frown" : "frowns"]."
m_type = 2
if ("sigh")
if(miming)
- message = "[src] sighs."
+ message = "sighs."
m_type = 1
else
if (!muzzled)
- message = "[src] sighs."
+ message = "sighs."
m_type = 2
else
- message = "[src] makes a weak noise."
+ message = "makes a weak noise."
m_type = 2
if ("laugh")
if(miming)
- message = "[src] acts out a laugh."
+ message = "acts out a laugh."
m_type = 1
else
if (!muzzled)
- message = "[src] laughs."
+ message = "laughs."
m_type = 2
else
- message = "[src] makes a noise."
+ message = "makes a noise."
m_type = 2
if ("mumble")
- message = "[src] mumbles!"
+ message = "mumbles!"
m_type = 2
if(miming)
m_type = 1
if ("grumble")
if(miming)
- message = "[src] grumbles!"
+ message = "grumbles!"
m_type = 1
if (!muzzled)
- message = "[src] grumbles!"
+ message = "grumbles!"
m_type = 2
else
- message = "[src] makes a noise."
+ message = "makes a noise."
m_type = 2
if ("groan")
if(miming)
- message = "[src] appears to groan!"
+ message = "appears to groan!"
m_type = 1
else
if (!muzzled)
- message = "[src] groans!"
+ message = "groans!"
m_type = 2
else
- message = "[src] makes a loud noise."
+ message = "makes a loud noise."
m_type = 2
if ("moan")
if(miming)
- message = "[src] appears to moan!"
+ message = "appears to moan!"
m_type = 1
else
- message = "[src] moans!"
+ message = "moans!"
m_type = 2
if ("johnny")
@@ -354,10 +354,10 @@
param = null
else
if(miming)
- message = "[src] takes a drag from a cigarette and blows \"[M]\" out in smoke."
+ message = "takes a drag from a cigarette and blows \"[M]\" out in smoke."
m_type = 1
else
- message = "[src] says, \"[M], please. He had a family.\" [src.name] takes a drag from a cigarette and blows his name out in smoke."
+ message = "says, \"[M], please. He had a family.\" [src.name] takes a drag from a cigarette and blows his name out in smoke."
m_type = 2
if ("point")
@@ -370,26 +370,26 @@
break
if (!M)
- message = "[src] points."
+ message = "points."
else
pointed(M)
if (M)
- message = "[src] points to [M]."
+ message = "points to [M]."
else
m_type = 1
if ("raise")
if (!src.restrained())
- message = "[src] raises a hand."
+ message = "raises a hand."
m_type = 1
if("shake")
- message = "[src] shakes \his head."
+ message = "shakes [get_visible_gender() == MALE ? "his" : get_visible_gender() == FEMALE ? "her" : "their"] head."
m_type = 1
if ("shrug")
- message = "[src] shrugs."
+ message = "shrugs."
m_type = 1
if ("signal")
@@ -397,85 +397,85 @@
var/t1 = round(text2num(param))
if (isnum(t1))
if (t1 <= 5 && (!src.r_hand || !src.l_hand))
- message = "[src] raises [t1] finger\s."
+ message = "raises [t1] finger\s."
else if (t1 <= 10 && (!src.r_hand && !src.l_hand))
- message = "[src] raises [t1] finger\s."
+ message = "raises [t1] finger\s."
m_type = 1
if ("smile")
- message = "[src] smiles."
+ message = "smiles."
m_type = 1
if ("shiver")
- message = "[src] shivers."
+ message = "shivers."
m_type = 2
if(miming)
m_type = 1
if ("pale")
- message = "[src] goes pale for a second."
+ message = "goes pale for a second."
m_type = 1
if ("tremble")
- message = "[src] trembles in fear!"
+ message = "trembles in fear!"
m_type = 1
if ("sneeze")
if (miming)
- message = "[src] sneezes."
+ message = "sneezes."
m_type = 1
else
if (!muzzled)
- message = "[src] sneezes."
+ message = "sneezes."
m_type = 2
else
- message = "[src] makes a strange noise."
+ message = "makes a strange noise."
m_type = 2
if ("sniff")
- message = "[src] sniffs."
+ message = "sniffs."
m_type = 2
if(miming)
m_type = 1
if ("snore")
if (miming)
- message = "[src] sleeps soundly."
+ message = "sleeps soundly."
m_type = 1
else
if (!muzzled)
- message = "[src] snores."
+ message = "snores."
m_type = 2
else
- message = "[src] makes a noise."
+ message = "makes a noise."
m_type = 2
if ("whimper")
if (miming)
- message = "[src] appears hurt."
+ message = "appears hurt."
m_type = 1
else
if (!muzzled)
- message = "[src] whimpers."
+ message = "whimpers."
m_type = 2
else
- message = "[src] makes a weak noise."
+ message = "makes a weak noise."
m_type = 2
if ("wink")
- message = "[src] winks."
+ message = "winks."
m_type = 1
if ("yawn")
if (!muzzled)
- message = "[src] yawns."
+ message = "yawns."
m_type = 2
if(miming)
m_type = 1
if ("collapse")
Paralyse(2)
- message = "[src] collapses!"
+ message = "collapses!"
m_type = 2
if(miming)
m_type = 1
@@ -493,9 +493,9 @@
M = null
if (M)
- message = "[src] hugs [M]."
+ message = "hugs [M]."
else
- message = "[src] hugs \himself."
+ message = "hugs [get_visible_gender() == MALE ? "himself" : get_visible_gender() == FEMALE ? "herself" : "themselves"]."
if ("handshake")
m_type = 1
@@ -511,9 +511,9 @@
if (M)
if (M.canmove && !M.r_hand && !M.restrained())
- message = "[src] shakes hands with [M]."
+ message = "shakes hands with [M]."
else
- message = "[src] holds out \his hand to [M]."
+ message = "holds out [get_visible_gender() == MALE ? "his" : get_visible_gender() == FEMALE ? "her" : "their"] hand to [M]."
if("dap")
m_type = 1
@@ -525,20 +525,20 @@
M = A
break
if (M)
- message = "[src] gives daps to [M]."
+ message = "gives daps to [M]."
else
- message = "[src] sadly can't find anybody to give daps to, and daps \himself. Shameful."
+ message = "sadly can't find anybody to give daps to, and daps [get_visible_gender() == MALE ? "himself" : get_visible_gender() == FEMALE ? "herself" : "themselves"]. Shameful."
if ("scream")
if (miming)
- message = "[src] acts out a scream!"
+ message = "acts out a scream!"
m_type = 1
else
if (!muzzled)
- message = "[src] screams!"
+ message = "screams!"
m_type = 2
else
- message = "[src] makes a very loud noise."
+ message = "makes a very loud noise."
m_type = 2
if("swish")
@@ -569,23 +569,7 @@ wink, yawn, swish, sway/wag, fastsway/qwag, stopsway/swag"}
if (message)
log_emote("[name]/[key] : [message]")
-
- //Hearing gasp and such every five seconds is not good emotes were not global for a reason.
- // Maybe some people are okay with that.
-
- for(var/mob/M in dead_mob_list)
- if(!M.client || istype(M, /mob/new_player))
- continue //skip monkeys, leavers and new players
- if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_GHOSTSIGHT) && !(M in viewers(src,null)))
- M.show_message(message)
-
-
- if (m_type & 1)
- for (var/mob/O in get_mobs_in_view(world.view,src))
- O.show_message(message, m_type)
- else if (m_type & 2)
- for (var/mob/O in (hearers(src.loc, null) | get_mobs_in_view(world.view,src)))
- O.show_message(message, m_type)
+ custom_emote(m_type,message)
/mob/living/carbon/human/verb/pose()
@@ -593,7 +577,7 @@ wink, yawn, swish, sway/wag, fastsway/qwag, stopsway/swag"}
set desc = "Sets a description which will be shown when someone examines you."
set category = "IC"
- pose = sanitize(input(usr, "This is [src]. \He is...", "Pose", null) as text)
+ pose = sanitize(input(usr, "This is [src]. [get_visible_gender() == MALE ? "He" : get_visible_gender() == FEMALE ? "She" : "They"] [get_visible_gender() == NEUTER ? "are" : "is"]...", "Pose", null) as text)
/mob/living/carbon/human/verb/set_flavor()
set name = "Set Flavour Text"
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index dad4e90244..88c90d4349 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -246,7 +246,7 @@
if(!key)
msg += "[t_He] [t_is] fast asleep. It doesn't look like they are waking up anytime soon.\n"
else if(!client)
- msg += "[t_He] [t_has] suddenly fallen asleep.\n"
+ msg += "[t_He] [t_is] fast asleep.\n"
var/list/wound_flavor_text = list()
var/list/is_destroyed = list()
@@ -256,7 +256,7 @@
var/list/organ_data = species.has_limbs[organ_tag]
var/organ_descriptor = organ_data["descriptor"]
- is_destroyed["[organ_data["descriptor"]]"] = 1
+ is_destroyed["organ_descriptor"] = 1
var/obj/item/organ/external/E = organs_by_name[organ_tag]
if(!E)
@@ -264,21 +264,21 @@
else if(E.is_stump())
wound_flavor_text["[organ_descriptor]"] = "[t_He] has a stump where [t_his] [organ_descriptor] should be.\n"
else
+ is_destroyed["organ_descriptor"] = 0
continue
for(var/obj/item/organ/external/temp in organs)
if(temp)
if(temp.status & ORGAN_ROBOT)
if(!(temp.brute_dam + temp.burn_dam))
- if(!species.flags & IS_SYNTHETIC)
- wound_flavor_text["[temp.name]"] = "[t_He] has a robot [temp.name]!\n"
- continue
+ wound_flavor_text["[temp.name]"] = "[t_He] has a robot [temp.name]!\n"
+ continue
else
wound_flavor_text["[temp.name]"] = "[t_He] has a robot [temp.name]. It has[temp.get_wounds_desc()]!\n"
else if(temp.wounds.len > 0 || temp.open)
wound_flavor_text["[temp.name]"] = "[t_He] has [temp.get_wounds_desc()] on [t_his] [temp.name].
"
if(temp.status & ORGAN_BLEEDING)
- is_bleeding["[temp.name]"] = 1
+ is_bleeding["[temp.name]"] = "[capitalize(t_his)] [temp.name] is bleeding!
"
else
wound_flavor_text["[temp.name]"] = ""
if(temp.dislocated == 2)
@@ -288,41 +288,56 @@
//Handles the text strings being added to the actual description.
//If they have something that covers the limb, and it is not missing, put flavortext. If it is covered but bleeding, add other flavortext.
+
+ // ***********************************************************************************
+ // THIS NEEDS TO BE ENTIRELY REWRITTEN. Commenting out for now, BADLY NEEDS REWRITING.
+ // ***********************************************************************************
+
+ /*
var/display_chest = 0
var/display_shoes = 0
var/display_gloves = 0
+
if(wound_flavor_text["head"] && (is_destroyed["head"] || (!skipmask && !(wear_mask && istype(wear_mask, /obj/item/clothing/mask/gas)))))
msg += wound_flavor_text["head"]
else if(is_bleeding["head"])
msg += "[src] has blood running down [t_his] face!\n"
+
if(wound_flavor_text["upper body"] && !w_uniform && !skipjumpsuit) //No need. A missing chest gibs you.
msg += wound_flavor_text["upper body"]
else if(is_bleeding["upper body"])
display_chest = 1
+
if(wound_flavor_text["left arm"] && (is_destroyed["left arm"] || (!w_uniform && !skipjumpsuit)))
msg += wound_flavor_text["left arm"]
else if(is_bleeding["left arm"])
display_chest = 1
+
if(wound_flavor_text["left hand"] && (is_destroyed["left hand"] || (!gloves && !skipgloves)))
msg += wound_flavor_text["left hand"]
else if(is_bleeding["left hand"])
display_gloves = 1
+
if(wound_flavor_text["right arm"] && (is_destroyed["right arm"] || (!w_uniform && !skipjumpsuit)))
msg += wound_flavor_text["right arm"]
else if(is_bleeding["right arm"])
display_chest = 1
+
if(wound_flavor_text["right hand"] && (is_destroyed["right hand"] || (!gloves && !skipgloves)))
msg += wound_flavor_text["right hand"]
else if(is_bleeding["right hand"])
display_gloves = 1
+
if(wound_flavor_text["lower body"] && (is_destroyed["lower body"] || (!w_uniform && !skipjumpsuit)))
msg += wound_flavor_text["lower body"]
else if(is_bleeding["lower body"])
display_chest = 1
+
if(wound_flavor_text["left leg"] && (is_destroyed["left leg"] || (!w_uniform && !skipjumpsuit)))
msg += wound_flavor_text["left leg"]
else if(is_bleeding["left leg"])
display_chest = 1
+
if(wound_flavor_text["left foot"]&& (is_destroyed["left foot"] || (!shoes && !skipshoes)))
msg += wound_flavor_text["left foot"]
else if(is_bleeding["left foot"])
@@ -335,19 +350,25 @@
msg += wound_flavor_text["right foot"]
else if(is_bleeding["right foot"])
display_shoes = 1
+
if(display_chest)
msg += "[src] has blood soaking through from under [t_his] clothing!\n"
if(display_shoes)
msg += "[src] has blood running from [t_his] shoes!\n"
if(display_gloves)
msg += "[src] has blood running from under [t_his] gloves!\n"
+ */
+ for(var/limb in wound_flavor_text)
+ msg += wound_flavor_text[limb]
+ is_bleeding[limb] = null
+ for(var/limb in is_bleeding)
+ msg += is_bleeding[limb]
for(var/implant in get_visible_implants(0))
msg += "[src] has \a [implant] sticking out of [t_his] flesh!\n"
if(digitalcamo)
msg += "[t_He] [t_is] repulsively uncanny!\n"
-
if(hasHUD(usr,"security"))
var/perpname = "wot"
var/criminal = "None"
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 3eacc54926..39c8eaf799 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -54,9 +54,6 @@
stat(null, "Intent: [a_intent]")
stat(null, "Move Mode: [m_intent]")
- if(ticker && ticker.mode && ticker.mode.name == "AI malfunction")
- if(malf.revealed)
- stat(null, "Time left: [max(malf.hack_time/(malf.hacked_apcs/3), 0)]")
if(emergency_shuttle)
var/eta_status = emergency_shuttle.get_status_panel_eta()
if(eta_status)
@@ -746,10 +743,17 @@
xylophone=0
return
+/mob/living/carbon/human/proc/check_has_mouth()
+ // Todo, check stomach organ when implemented.
+ var/obj/item/organ/external/head/H = get_organ("head")
+ if(!H || !H.can_intake_reagents)
+ return 0
+ return 1
+
/mob/living/carbon/human/proc/vomit()
- if(species.flags & IS_SYNTHETIC)
- return //Machines don't throw up.
+ if(!check_has_mouth())
+ return
if(!lastpuke)
lastpuke = 1
@@ -1026,7 +1030,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 +1065,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"] remain still 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)
@@ -1219,16 +1221,26 @@
else
target_zone = user.zone_sel.selecting
- switch(target_zone)
- if("head")
- if(head && head.flags & THICKMATERIAL)
- . = 0
- else
- if(wear_suit && wear_suit.flags & THICKMATERIAL)
- . = 0
+ var/obj/item/organ/external/affecting = get_organ(target_zone)
+ var/fail_msg
+ if(!affecting)
+ . = 0
+ fail_msg = "They are missing that limb."
+ else if (affecting.status & ORGAN_ROBOT)
+ . = 0
+ fail_msg = "That limb is robotic."
+ else
+ switch(target_zone)
+ if("head")
+ if(head && head.flags & THICKMATERIAL)
+ . = 0
+ else
+ if(wear_suit && wear_suit.flags & THICKMATERIAL)
+ . = 0
if(!. && error_msg && user)
- // Might need re-wording.
- user << "There is no exposed flesh or thin material [target_zone == "head" ? "on their head" : "on their body"] to inject into."
+ if(!fail_msg)
+ fail_msg = "There is no exposed flesh or thin material [target_zone == "head" ? "on their head" : "on their body"] to inject into."
+ user << "[fail_msg]"
/mob/living/carbon/human/print_flavor_text(var/shrink = 1)
var/list/equipment = list(src.head,src.wear_mask,src.glasses,src.w_uniform,src.wear_suit,src.gloves,src.shoes)
diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index 0deb593c84..21a386b5cf 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)
@@ -47,6 +48,12 @@
switch(M.a_intent)
if(I_HELP)
if(istype(H) && health < config.health_threshold_crit && health > config.health_threshold_dead)
+ if(!H.check_has_mouth())
+ H << "You don't have a mouth, you cannot perform CPR!"
+ return
+ if(!check_has_mouth())
+ H << "They don't have a mouth, you cannot perform CPR!"
+ return
if((H.head && (H.head.flags & HEADCOVERSMOUTH)) || (H.wear_mask && (H.wear_mask.flags & MASKCOVERSMOUTH)))
H << "Remove your mask!"
return 0
@@ -95,6 +102,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
@@ -176,8 +184,13 @@
miss_type = 2
// See what attack they use
+ var/possible_moves = list()
var/datum/unarmed_attack/attack = null
- for(var/datum/unarmed_attack/u_attack in H.species.unarmed_attacks)
+ for(var/part in list("l_hand","r_hand","l_foot","r_foot","head"))
+ var/obj/item/organ/external/E = H.get_organ(part)
+ possible_moves |= E.species.unarmed_attacks
+
+ for(var/datum/unarmed_attack/u_attack in possible_moves)
if(!u_attack.is_usable(H, src, hit_zone))
continue
else
@@ -186,6 +199,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 +234,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 +293,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_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm
index 04ca892225..e0aec4a6e6 100644
--- a/code/modules/mob/living/carbon/human/human_damage.dm
+++ b/code/modules/mob/living/carbon/human/human_damage.dm
@@ -142,12 +142,12 @@
..()
/mob/living/carbon/human/getCloneLoss()
- if(species.flags & (IS_SYNTHETIC | NO_SCAN))
+ if(species.flags & (NO_SCAN))
cloneloss = 0
return ..()
/mob/living/carbon/human/setCloneLoss(var/amount)
- if(species.flags & (IS_SYNTHETIC | NO_SCAN))
+ if(species.flags & (NO_SCAN))
cloneloss = 0
else
..()
@@ -155,7 +155,7 @@
/mob/living/carbon/human/adjustCloneLoss(var/amount)
..()
- if(species.flags & (IS_SYNTHETIC | NO_SCAN))
+ if(species.flags & (NO_SCAN))
cloneloss = 0
return
@@ -236,7 +236,7 @@
/mob/living/carbon/human/proc/get_damageable_organs()
var/list/obj/item/organ/external/parts = list()
for(var/obj/item/organ/external/O in organs)
- if(O.brute_dam + O.burn_dam < O.max_damage)
+ if(O.is_damageable())
parts += O
return parts
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index f409bee147..675d3c41df 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
@@ -179,12 +179,6 @@ emp_act
for(var/obj/O in src)
if(!O) continue
O.emp_act(severity)
- for(var/obj/item/organ/external/O in organs)
- if(O.status & ORGAN_DESTROYED) continue
- O.emp_act(severity)
- for(var/obj/item/organ/I in O.internal_organs)
- if(I.robotic == 0) continue
- I.emp_act(severity)
..()
diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm
index c962b8355b..f2c64fa52a 100644
--- a/code/modules/mob/living/carbon/human/human_organs.dm
+++ b/code/modules/mob/living/carbon/human/human_organs.dm
@@ -72,7 +72,18 @@
var/obj/item/organ/external/E = organs_by_name[limb_tag]
if(!E || (E.status & (ORGAN_DESTROYED|ORGAN_DEAD)))
stance_damage += 2 // let it fail even if just foot&leg
- else if (E.is_malfunctioning() || E.is_broken() || !E.is_usable())
+ else if (E.is_malfunctioning())
+ //malfunctioning only happens intermittently so treat it as a missing limb when it procs
+ stance_damage += 2
+ if(prob(10))
+ visible_message("\The [src]'s [E.name] [pick("twitches", "shudders")] and sparks!")
+ var/datum/effect/effect/system/spark_spread/spark_system = new ()
+ spark_system.set_up(5, 0, src)
+ spark_system.attach(src)
+ spark_system.start()
+ spawn(10)
+ qdel(spark_system)
+ else if (E.is_broken() || !E.is_usable())
stance_damage += 1
else if (E.is_dislocated())
stance_damage += 0.5
@@ -94,7 +105,27 @@
Weaken(5) //can't emote while weakened, apparently.
/mob/living/carbon/human/proc/handle_grasp()
+ if(!l_hand && !r_hand)
+ return
+ // You should not be able to pick anything up, but stranger things have happened.
+ if(l_hand)
+ for(var/limb_tag in list("l_hand","l_arm"))
+ var/obj/item/organ/external/E = get_organ(limb_tag)
+ if(!E)
+ visible_message("Lacking a functioning left hand, \the [src] drops \the [l_hand].")
+ drop_from_inventory(l_hand)
+ break
+
+ if(r_hand)
+ for(var/limb_tag in list("r_hand","r_arm"))
+ var/obj/item/organ/external/E = get_organ(limb_tag)
+ if(!E)
+ visible_message("Lacking a functioning right hand, \the [src] drops \the [r_hand].")
+ drop_from_inventory(r_hand)
+ break
+
+ // Check again...
if(!l_hand && !r_hand)
return
@@ -118,8 +149,12 @@
else if(E.is_malfunctioning())
if(E.body_part == HAND_LEFT)
+ if(!l_hand)
+ continue
drop_from_inventory(l_hand)
else
+ if(!r_hand)
+ continue
drop_from_inventory(r_hand)
emote("me", 1, "drops what they were holding, their [E.name] malfunctioning!")
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/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 84a6fb8290..89f071d482 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -258,9 +258,6 @@
proc/handle_mutations_and_radiation()
- if(species.flags & IS_SYNTHETIC) //Robots don't suffer from mutations or radloss.
- return
-
if(getFireLoss())
if((COLD_RESISTANCE in mutations) || (prob(1)))
heal_organ_damage(0,1)
@@ -709,9 +706,9 @@
*/
proc/stabilize_body_temperature()
- if (species.flags & IS_SYNTHETIC)
- bodytemperature += species.synth_temp_gain //just keep putting out heat.
- return
+
+ if (species.passive_temp_gain) // We produce heat naturally.
+ bodytemperature += species.passive_temp_gain
var/body_temperature_difference = species.body_temperature - bodytemperature
@@ -858,15 +855,16 @@
proc/handle_chemicals_in_body()
- if(reagents && !(species.flags & IS_SYNTHETIC)) //Synths don't process reagents.
+ if(reagents)
chem_effects.Cut()
analgesic = 0
var/alien = 0
if(species && species.reagent_tag)
alien = species.reagent_tag
touching.metabolize(alien, CHEM_TOUCH)
- ingested.metabolize(alien, CHEM_INGEST)
- reagents.metabolize(alien, CHEM_BLOOD)
+ if(!(species.flags & NO_BLOOD))
+ ingested.metabolize(alien, CHEM_INGEST)
+ reagents.metabolize(alien, CHEM_BLOOD)
if(CE_PAINKILLER in chem_effects)
analgesic = chem_effects[CE_PAINKILLER]
@@ -931,7 +929,8 @@
take_overall_damage(2,0)
traumatic_shock++
- if(!(species.flags & IS_SYNTHETIC)) handle_trace_chems()
+ // TODO: stomach and bloodstream organ.
+ handle_trace_chems()
updatehealth()
@@ -942,7 +941,7 @@
if(status_flags & GODMODE) return 0
//SSD check, if a logged player is awake put them back to sleep!
- if(player_logged && sleeping < 2)
+ if((!client || !key || player_logged) && sleeping < 2)
sleeping = 2
if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP
@@ -1133,7 +1132,7 @@
if(damageoverlay.overlays)
damageoverlay.overlays = list()
-
+
if(stat == UNCONSCIOUS)
//Critical damage passage overlay
if(health <= 0)
@@ -1268,7 +1267,7 @@
if(2) healths.icon_state = "health7"
else
//switch(health - halloss)
- switch(100 - ((species && species.flags & NO_PAIN & !IS_SYNTHETIC) ? 0 : traumatic_shock))
+ switch(100 - ((species.flags & NO_PAIN) ? 0 : traumatic_shock))
if(100 to INFINITY) healths.icon_state = "health0"
if(80 to 100) healths.icon_state = "health1"
if(60 to 80) healths.icon_state = "health2"
@@ -1363,11 +1362,11 @@
var/obj/item/clothing/glasses/welding/O = glasses
if(!O.up)
found_welder = 1
- else if(istype(head, /obj/item/clothing/head/welding))
+ if(!found_welder && istype(head, /obj/item/clothing/head/welding))
var/obj/item/clothing/head/welding/O = head
if(!O.up)
found_welder = 1
- else if(istype(back, /obj/item/weapon/rig))
+ if(!found_welder && istype(back, /obj/item/weapon/rig))
var/obj/item/weapon/rig/O = back
if(O.helmet && O.helmet == head && (O.helmet.body_parts_covered & EYES))
if((O.offline && O.offline_vision_restriction == 1) || (!O.offline && O.vision_restriction == 1))
@@ -1504,7 +1503,8 @@
if(life_tick % 5) return pulse //update pulse every 5 life ticks (~1 tick/sec, depending on server load)
- if(species && species.flags & NO_BLOOD) return PULSE_NONE //No blood, no pulse.
+ if(species && species.flags & NO_BLOOD)
+ return PULSE_NONE //No blood, no pulse.
if(stat == DEAD)
return PULSE_NONE //that's it, you're dead, nothing can influence your pulse
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index 10a2dca6aa..a4591b34d2 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -170,8 +170,9 @@
/mob/living/carbon/human/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name)
switch(message_mode)
if("intercom")
- for(var/obj/item/device/radio/intercom/I in view(1, null))
+ for(var/obj/item/device/radio/intercom/I in view(1))
I.talk_into(src, message, verb, speaking)
+ I.add_fingerprint(src)
used_radios += I
if("headset")
if(l_ear && istype(l_ear,/obj/item/device/radio))
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index 1bc6ca880a..1d81e88c8d 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -29,6 +29,7 @@
var/icon/icon_template // Used for mob icon generation for non-32x32 species.
var/is_small
var/show_ssd = 1
+ var/virus_immune
// Language/culture vars.
var/default_language = "Galactic Common" // Default language is used when 'say' is used without modifiers.
@@ -69,7 +70,7 @@
var/heat_level_1 = 360 // Heat damage level 1 above this point.
var/heat_level_2 = 400 // Heat damage level 2 above this point.
var/heat_level_3 = 1000 // Heat damage level 3 above this point.
- var/synth_temp_gain = 0 // IS_SYNTHETIC species will gain this much temperature every second
+ var/passive_temp_gain = 0 // Species will gain this much temperature every second
var/hazard_high_pressure = HAZARD_HIGH_PRESSURE // Dangerously high pressure.
var/warning_high_pressure = WARNING_HIGH_PRESSURE // High pressure warning.
var/warning_low_pressure = WARNING_LOW_PRESSURE // Low pressure warning.
@@ -213,14 +214,10 @@
for(var/obj/item/organ/external/O in H.organs)
O.owner = H
- if(flags & IS_SYNTHETIC)
- for(var/obj/item/organ/external/E in H.organs)
- if(E.status & ORGAN_CUT_AWAY || E.status & ORGAN_DESTROYED) continue
- E.robotize()
- for(var/obj/item/organ/I in H.internal_organs)
- I.robotize()
-
/datum/species/proc/hug(var/mob/living/carbon/human/H,var/mob/living/target)
+ if (target.holder_type && target.a_intent == "help" && H.a_intent == "help")
+ target.get_scooped(H)
+ return
var/t_him = "them"
switch(target.gender)
diff --git a/code/modules/mob/living/carbon/human/species/station/monkey.dm b/code/modules/mob/living/carbon/human/species/station/monkey.dm
index 64e12eadfa..92f6bb66fd 100644
--- a/code/modules/mob/living/carbon/human/species/station/monkey.dm
+++ b/code/modules/mob/living/carbon/human/species/station/monkey.dm
@@ -36,6 +36,7 @@
bump_flag = MONKEY
swap_flags = MONKEY|SLIME|SIMPLE_ANIMAL
push_flags = MONKEY|SLIME|SIMPLE_ANIMAL|ALIEN
+ var/holder_type = /obj/item/weapon/holder/monkey
/datum/species/monkey/handle_npc(var/mob/living/carbon/human/H)
if(H.stat != CONSCIOUS)
@@ -45,6 +46,10 @@
if(prob(1))
H.emote(pick("scratch","jump","roll","tail"))
+/datum/species/monkey/handle_post_spawn(var/mob/living/carbon/human/H)
+ ..()
+ H.holder_type = holder_type
+
/datum/species/monkey/get_random_name()
return "[lowertext(name)] ([rand(100,999)])"
@@ -60,6 +65,7 @@
flesh_color = "#AFA59E"
base_color = "#333333"
tail = "farwatail"
+ holder_type = /obj/item/weapon/holder/monkey/farwa
/datum/species/monkey/skrell
name = "Neara"
@@ -74,6 +80,7 @@
blood_color = "#1D2CBF"
reagent_tag = IS_SKRELL
tail = null
+ holder_type = /obj/item/weapon/holder/monkey/neaera
/datum/species/monkey/unathi
name = "Stok"
@@ -88,3 +95,4 @@
flesh_color = "#34AF10"
base_color = "#066000"
reagent_tag = IS_UNATHI
+ holder_type = /obj/item/weapon/holder/monkey/stok
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species/station/slime.dm b/code/modules/mob/living/carbon/human/species/station/slime.dm
index 6d5e918a95..46a7e9f5f5 100644
--- a/code/modules/mob/living/carbon/human/species/station/slime.dm
+++ b/code/modules/mob/living/carbon/human/species/station/slime.dm
@@ -8,7 +8,7 @@
language = "Sol Common" //todo?
unarmed_types = list(/datum/unarmed_attack/slime_glomp)
- flags = IS_RESTRICTED | NO_BLOOD | NO_SCAN | NO_SLIP | NO_BREATHE
+ flags = IS_RESTRICTED | NO_SCAN | NO_SLIP | NO_BREATHE
siemens_coefficient = 3
darksight = 3
@@ -30,17 +30,17 @@
push_flags = MONKEY|SLIME|SIMPLE_ANIMAL
has_limbs = list(
- "chest" = list("path" = /obj/item/organ/external/chest/slime),
- "groin" = list("path" = /obj/item/organ/external/groin/slime),
- "head" = list("path" = /obj/item/organ/external/head/slime),
- "l_arm" = list("path" = /obj/item/organ/external/arm/slime),
- "r_arm" = list("path" = /obj/item/organ/external/arm/right/slime),
- "l_leg" = list("path" = /obj/item/organ/external/leg/slime),
- "r_leg" = list("path" = /obj/item/organ/external/leg/right/slime),
- "l_hand" = list("path" = /obj/item/organ/external/hand/slime),
- "r_hand" = list("path" = /obj/item/organ/external/hand/right/slime),
- "l_foot" = list("path" = /obj/item/organ/external/foot/slime),
- "r_foot" = list("path" = /obj/item/organ/external/foot/right/slime)
+ "chest" = list("path" = /obj/item/organ/external/chest/unbreakable),
+ "groin" = list("path" = /obj/item/organ/external/groin/unbreakable),
+ "head" = list("path" = /obj/item/organ/external/head/unbreakable),
+ "l_arm" = list("path" = /obj/item/organ/external/arm/unbreakable),
+ "r_arm" = list("path" = /obj/item/organ/external/arm/right/unbreakable),
+ "l_leg" = list("path" = /obj/item/organ/external/leg/unbreakable),
+ "r_leg" = list("path" = /obj/item/organ/external/leg/right/unbreakable),
+ "l_hand" = list("path" = /obj/item/organ/external/hand/unbreakable),
+ "r_hand" = list("path" = /obj/item/organ/external/hand/right/unbreakable),
+ "l_foot" = list("path" = /obj/item/organ/external/foot/unbreakable),
+ "r_foot" = list("path" = /obj/item/organ/external/foot/right/unbreakable)
)
/datum/species/slime/handle_death(var/mob/living/carbon/human/H)
diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm
index 985a5dac09..c2ded0799d 100644
--- a/code/modules/mob/living/carbon/human/species/station/station.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station.dm
@@ -195,7 +195,7 @@
body_temperature = T0C + 15 //make the plant people have a bit lower body temperature, why not
- flags = CAN_JOIN | IS_WHITELISTED | NO_BREATHE | NO_SCAN | IS_PLANT | NO_BLOOD | NO_PAIN | NO_SLIP | REGENERATES_LIMBS
+ flags = CAN_JOIN | IS_WHITELISTED | NO_BREATHE | NO_SCAN | IS_PLANT | NO_BLOOD | NO_PAIN | NO_SLIP
blood_color = "#004400"
flesh_color = "#907E4A"
@@ -231,21 +231,28 @@
else
qdel(D)
- H.visible_message("\red[H] splits apart with a wet slithering noise!")
+ H.visible_message("[H] splits apart with a wet slithering noise!")
/datum/species/machine
name = "Machine"
name_plural = "machines"
+ blurb = "Positronic intelligence really took off in the 26th century, and it is not uncommon to see independant, free-willed \
+ robots on many human stations, particularly in fringe systems where standards are slightly lax and public opinion less relevant \
+ to corporate operations. IPCs (Integrated Positronic Chassis) are a loose category of self-willed robots with a humanoid form, \
+ generally self-owned after being 'born' into servitude; they are reliable and dedicated workers, albeit more than slightly \
+ inhuman in outlook and perspective."
+
icobase = 'icons/mob/human_races/r_machine.dmi'
deform = 'icons/mob/human_races/r_machine.dmi'
- language = "Tradeband"
+
+ language = "Encoded Audio Language"
unarmed_types = list(/datum/unarmed_attack/punch)
rarity_value = 2
eyes = "blank_eyes"
- brute_mod = 0.5
- burn_mod = 1
+ brute_mod = 2.5 // 100% * 2.5 * 0.6 (robolimbs) ~= 150%
+ burn_mod = 2.5 // So they take 50% extra damage from brute/burn overall.
warning_low_pressure = 50
hazard_low_pressure = 0
@@ -254,24 +261,41 @@
cold_level_2 = -1
cold_level_3 = -1
- heat_level_1 = 500 //gives them about 25 seconds in space before taking damage
+ heat_level_1 = 500 // Gives them about 25 seconds in space before taking damage
heat_level_2 = 1000
heat_level_3 = 2000
- synth_temp_gain = 10 //this should cause IPCs to stabilize at ~80 C in a 20 C environment.
+ passive_temp_gain = 10 // This should cause IPCs to stabilize at ~80 C in a 20 C environment.
+ siemens_coefficient = 0 // Insulated.
- flags = CAN_JOIN | IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | IS_SYNTHETIC
+ flags = CAN_JOIN | IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_POISON
blood_color = "#1F181F"
flesh_color = "#575757"
+ virus_immune = 1
+ reagent_tag = IS_MACHINE
- has_organ = list() //TODO: Positronic brain.
+ has_organ = list(
+ "brain" = /obj/item/organ/mmi_holder/posibrain,
+ "cell" = /obj/item/organ/cell
+ )
-/datum/species/machine/equip_survival_gear(var/mob/living/carbon/human/H)
+ has_limbs = list(
+ "chest" = list("path" = /obj/item/organ/external/chest/ipc),
+ "groin" = list("path" = /obj/item/organ/external/groin/ipc),
+ "head" = list("path" = /obj/item/organ/external/head/ipc),
+ "l_arm" = list("path" = /obj/item/organ/external/arm/ipc),
+ "r_arm" = list("path" = /obj/item/organ/external/arm/right/ipc),
+ "l_leg" = list("path" = /obj/item/organ/external/leg/ipc),
+ "r_leg" = list("path" = /obj/item/organ/external/leg/right/ipc),
+ "l_hand" = list("path" = /obj/item/organ/external/hand/ipc),
+ "r_hand" = list("path" = /obj/item/organ/external/hand/right/ipc),
+ "l_foot" = list("path" = /obj/item/organ/external/foot/ipc),
+ "r_foot" = list("path" = /obj/item/organ/external/foot/right/ipc)
+ )
/datum/species/machine/handle_death(var/mob/living/carbon/human/H)
..()
- if(flags & IS_SYNTHETIC)
- H.h_style = ""
- spawn(100)
- if(H) H.update_hair()
+ H.h_style = ""
+ spawn(100)
+ if(H) H.update_hair()
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/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 382ff909b3..8b13178adf 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -234,15 +234,13 @@ var/global/list/damage_icon_parts = list()
var/hulk = (HULK in src.mutations)
var/skeleton = (SKELETON in src.mutations)
- var/g = (gender == FEMALE ? "f" : "m")
-
//CACHING: Generate an index key from visible bodyparts.
//0 = destroyed, 1 = normal, 2 = robotic, 3 = necrotic.
//Create a new, blank icon for our mob to use.
if(stand_icon)
qdel(stand_icon)
stand_icon = new(species.icon_template ? species.icon_template : 'icons/mob/human.dmi',"blank")
- var/icon_key = "[species.race_key][g][s_tone][r_skin][g_skin][b_skin]"
+ var/icon_key = ""
var/obj/item/organ/eyes/eyes = internal_organs_by_name["eyes"]
if(eyes)
@@ -260,7 +258,12 @@ var/global/list/damage_icon_parts = list()
icon_key += "3"
else
icon_key += "1"
-
+ if(part)
+ icon_key += "[part.species.race_key]"
+ icon_key += "[part.dna.GetUIState(DNA_UI_GENDER)]"
+ icon_key += "[part.dna.GetUIValue(DNA_UI_SKIN_TONE)]"
+ if(part.s_col)
+ icon_key += "[rgb(part.s_col[1],part.s_col[2],part.s_col[3])]"
icon_key = "[icon_key][husk ? 1 : 0][fat ? 1 : 0][hulk ? 1 : 0][skeleton ? 1 : 0]"
var/icon/base_icon
@@ -894,22 +897,22 @@ var/global/list/damage_icon_parts = list()
/mob/living/carbon/human/proc/get_tail_icon()
var/icon_key = "[species.race_key][r_skin][g_skin][b_skin]"
-
+
var/icon/tail_icon = tail_icon_cache[icon_key]
- if(!tail_icon)
-
+ if(!tail_icon)
+
//generate a new one
tail_icon = new/icon(icon = (species.tail_animation? species.tail_animation : 'icons/effects/species.dmi'))
tail_icon.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD)
-
+
tail_icon_cache[icon_key] = tail_icon
-
+
return tail_icon
/mob/living/carbon/human/proc/set_tail_state(var/t_state)
var/image/tail_overlay = overlays_standing[TAIL_LAYER]
-
+
if(tail_overlay && species.tail_animation)
tail_overlay.icon_state = t_state
return tail_overlay
@@ -919,30 +922,30 @@ var/global/list/damage_icon_parts = list()
//Update this if the ability to flick() images or make looping animation start at the first frame is ever added.
/mob/living/carbon/human/proc/animate_tail_once(var/update_icons=1)
var/t_state = "[species.tail]_once"
-
+
var/image/tail_overlay = overlays_standing[TAIL_LAYER]
if(tail_overlay && tail_overlay.icon_state == t_state)
return //let the existing animation finish
-
+
tail_overlay = set_tail_state(t_state)
if(tail_overlay)
spawn(15)
//check that the animation hasn't changed in the meantime
if(overlays_standing[TAIL_LAYER] == tail_overlay && tail_overlay.icon_state == t_state)
animate_tail_stop()
-
+
if(update_icons)
update_icons()
/mob/living/carbon/human/proc/animate_tail_start(var/update_icons=1)
set_tail_state("[species.tail]_slow[rand(0,9)]")
-
+
if(update_icons)
update_icons()
/mob/living/carbon/human/proc/animate_tail_fast(var/update_icons=1)
set_tail_state("[species.tail]_loop[rand(0,9)]")
-
+
if(update_icons)
update_icons()
@@ -951,14 +954,14 @@ var/global/list/damage_icon_parts = list()
set_tail_state("[species.tail]_idle[rand(0,9)]")
else
set_tail_state("[species.tail]_static")
-
-
+
+
if(update_icons)
update_icons()
/mob/living/carbon/human/proc/animate_tail_stop(var/update_icons=1)
set_tail_state("[species.tail]_static")
-
+
if(update_icons)
update_icons()
diff --git a/code/modules/mob/living/carbon/metroid/items.dm b/code/modules/mob/living/carbon/metroid/items.dm
index 6739cb4e2b..d068e33e6c 100644
--- a/code/modules/mob/living/carbon/metroid/items.dm
+++ b/code/modules/mob/living/carbon/metroid/items.dm
@@ -8,7 +8,7 @@
throwforce = 0
throw_speed = 3
throw_range = 6
- origin_tech = "biotech=4"
+ origin_tech = list(TECH_BIO = 4)
var/Uses = 1 // uses before it goes inert
var/enhanced = 0 //has it been enhanced before?
@@ -295,7 +295,7 @@
throwforce = 1.0
throw_speed = 2
throw_range = 6
- origin_tech = "biotech=4"
+ origin_tech = list(TECH_BIO = 4)
var/POWERFLAG = 0 // sshhhhhhh
var/Flush = 30
var/Uses = 5 // uses before it goes inert
@@ -327,7 +327,7 @@
icon = 'icons/mob/mob.dmi'
icon_state = "slime egg-growing"
bitesize = 12
- origin_tech = "biotech=4"
+ origin_tech = list(TECH_BIO = 4)
var/grown = 0
/obj/item/weapon/reagent_containers/food/snacks/egg/slime/New()
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..3097d90659 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -777,20 +777,22 @@ 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
+/mob/living/touch_map_edge()
+
+ //check for nuke disks
+ if(client && stat != DEAD) //if they are clientless and dead don't bother, the parent will treat them as any other container
+ if(ticker && istype(ticker.mode, /datum/game_mode/nuclear)) //only really care if the game mode is nuclear
+ var/datum/game_mode/nuclear/G = ticker.mode
+ if(G.check_mob(src))
+ if(x <= TRANSITIONEDGE)
+ inertia_dir = 4
+ else if(x >= world.maxx -TRANSITIONEDGE)
+ inertia_dir = 8
+ else if(y <= TRANSITIONEDGE)
+ inertia_dir = 1
+ else if(y >= world.maxy -TRANSITIONEDGE)
+ inertia_dir = 2
+ src << "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/say.dm b/code/modules/mob/living/say.dm
index 8919ab0952..a126bccc87 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -238,17 +238,15 @@ proc/get_radio_key_from_channel(var/channel)
italics = 1
sound_vol *= 0.5 //muffle the sound a bit, so it's like we're actually talking through contact
- var/list/hear = hear(message_range, T)
+ var/list/hear = get_mobs_or_objects_in_view(message_range,src)
var/list/hearturfs = list()
for(var/I in hear)
- if(istype(I, /mob/))
+ if(ismob(I))
var/mob/M = I
listening += M
hearturfs += M.locs[1]
- for(var/obj/O in M.contents)
- listening_obj |= O
- else if(istype(I, /obj/))
+ else if(isobj(I))
var/obj/O = I
hearturfs += O.locs[1]
listening_obj |= O
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 558576e658..c0df651d4b 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -56,26 +56,30 @@ var/list/ai_verbs_default = list(
var/obj/item/device/multitool/aiMulti = null
var/obj/item/device/radio/headset/heads/ai_integrated/aiRadio = null
var/custom_sprite = 0 //For our custom sprites
-//Hud stuff
-
- //MALFUNCTION
- var/datum/AI_Module/module_picker/malf_picker
- var/processing_time = 100
- var/list/datum/AI_Module/current_modules = list()
- var/fire_res_on_core = 0
-
- var/control_disabled = 0 // Set to 1 to stop AI from interacting via Click() -- TLE
- var/malfhacking = 0 // More or less a copy of the above var, so that malf AIs can hack and still get new cyborgs -- NeoFite
-
- var/obj/machinery/power/apc/malfhack = null
- var/explosive = 0 //does the AI explode when it dies?
-
- var/mob/living/silicon/ai/parent = null
-
var/camera_light_on = 0 //Defines if the AI toggled the light on the camera it's looking through.
var/datum/trackable/track = null
var/last_announcement = ""
+ var/control_disabled = 0
var/datum/announcement/priority/announcement
+ var/obj/machinery/ai_powersupply/psupply = null // Backwards reference to AI's powersupply object.
+
+ //NEWMALF VARIABLES
+ var/malfunctioning = 0 // Master var that determines if AI is malfunctioning.
+ var/datum/malf_hardware/hardware = null // Installed piece of hardware.
+ var/datum/malf_research/research = null // Malfunction research datum.
+ var/obj/machinery/power/apc/hack = null // APC that is currently being hacked.
+ var/list/hacked_apcs = null // List of all hacked APCs
+ var/APU_power = 0 // If set to 1 AI runs on APU power
+ var/hacking = 0 // Set to 1 if AI is hacking APC, cyborg, other AI, or running system override.
+ var/system_override = 0 // Set to 1 if system override is initiated, 2 if succeeded.
+ var/hack_can_fail = 1 // If 0, all abilities have zero chance of failing.
+ var/hack_fails = 0 // This increments with each failed hack, and determines the warning message text.
+ var/errored = 0 // Set to 1 if runtime error occurs. Only way of this happening i can think of is admin fucking up with varedit.
+ var/bombing_core = 0 // Set to 1 if core auto-destruct is activated
+ var/bombing_station = 0 // Set to 1 if station nuke auto-destruct is activated
+ var/override_CPUStorage = 0 // Bonus/Penalty CPU Storage. For use by admins/testers.
+ var/override_CPURate = 0 // Bonus/Penalty CPU generation rate. For use by admins/testers.
+
/mob/living/silicon/ai/proc/add_ai_verbs()
src.verbs |= ai_verbs_default
@@ -203,17 +207,6 @@ var/list/ai_verbs_default = list(
set src = usr.contents
return 0
-/mob/living/silicon/ai/proc/system_integrity()
- return (health-config.health_threshold_dead)/2
-
-// this function shows the health of the pAI in the Status panel
-/mob/living/silicon/ai/show_system_integrity()
- // An AI doesn't become inoperable until -100% (or whatever config.health_threshold_dead is set to)
- if(!src.stat)
- stat(null, text("System integrity: [system_integrity()]%"))
- else
- stat(null, text("Systems nonfunctional"))
-
/mob/living/silicon/ai/SetName(pickedName as text)
..()
announcement.announcer = pickedName
@@ -240,6 +233,7 @@ var/list/ai_verbs_default = list(
/obj/machinery/ai_powersupply/New(var/mob/living/silicon/ai/ai=null)
powered_ai = ai
+ powered_ai.psupply = src
if(isnull(powered_ai))
qdel(src)
@@ -250,10 +244,17 @@ var/list/ai_verbs_default = list(
/obj/machinery/ai_powersupply/process()
if(!powered_ai || powered_ai.stat & DEAD)
+ qdel()
+ return
+ if(powered_ai.psupply != src) // For some reason, the AI has different powersupply object. Delete this one, it's no longer needed.
qdel(src)
+ if(powered_ai.APU_power)
+ use_power = 0
+ return
if(!powered_ai.anchored)
loc = powered_ai.loc
use_power = 0
+ use_power(50000) // Less optimalised but only called if AI is unwrenched. This prevents usage of wrenching as method to keep AI operational without power. Intellicard is for that.
if(powered_ai.anchored)
use_power = 2
@@ -277,7 +278,7 @@ var/list/ai_verbs_default = list(
if(Entry[1] == src.ckey && Entry[2] == src.real_name)
custom_sprite = 1 //They're in the list? Custom sprite time
- icon = 'icons/mob/custom-synthetic.dmi'
+ icon = CUSTOM_ITEM_SYNTH
//if(icon_state == initial(icon_state))
var/icontype = ""
@@ -312,14 +313,7 @@ var/list/ai_verbs_default = list(
if("Lonestar") icon_state = "ai-lonestar"
if("Nanotrasen") icon_state = "ai-nanotrasen"
else icon_state = "ai"
- //else
- //usr <<"You can only change your display once!"
- //return
-// displays the malf_ai information if the AI is the malf
-/mob/living/silicon/ai/show_malf_ai()
- if(malf && malf.hacked_apcs.len >= 3)
- stat(null, "Time until station control secured: [max(malf.hack_time/(malf.hacked_apcs/3), 0)] seconds")
// this verb lets the ai see the stations manifest
/mob/living/silicon/ai/proc/ai_roster()
@@ -420,11 +414,7 @@ var/list/ai_verbs_default = list(
/mob/living/silicon/ai/emp_act(severity)
if (prob(30))
- switch(pick(1,2))
- if(1)
- view_core()
- if(2)
- ai_call_shuttle()
+ view_core()
..()
/mob/living/silicon/ai/Topic(href, href_list)
@@ -545,13 +535,6 @@ var/list/ai_verbs_default = list(
src << "\blue Switched to [network] camera network."
//End of code by Mord_Sith
-
-/mob/living/silicon/ai/proc/choose_modules()
- set category = "Malfunction"
- set name = "Choose Module"
-
- malf_picker.use(src)
-
/mob/living/silicon/ai/proc/ai_statuschange()
set category = "AI Commands"
set name = "AI Status"
@@ -711,5 +694,153 @@ var/list/ai_verbs_default = list(
/mob/living/silicon/ai/proc/is_in_chassis()
return istype(loc, /turf)
+
+/mob/living/silicon/ai/ex_act(var/severity)
+ if(severity == 1.0)
+ qdel(src)
+ return
+ ..()
+
+// NEWMALF FUNCTIONS/PROCEDURES
+
+// Sets up malfunction-related variables, research system and such.
+/mob/living/silicon/ai/proc/setup_for_malf()
+ var/mob/living/silicon/ai/user = src
+ // Setup Variables
+ malfunctioning = 1
+ research = new/datum/malf_research()
+ research.owner = src
+ hacked_apcs = list()
+ recalc_cpu()
+
+ verbs += new/datum/game_mode/malfunction/verb/ai_select_hardware()
+ verbs += new/datum/game_mode/malfunction/verb/ai_select_research()
+ verbs += new/datum/game_mode/malfunction/verb/ai_help()
+
+ // And greet user with some OOC info.
+ user << "You are malfunctioning, you do not have to follow any laws."
+ user << "Use ai-help command to view relevant information about your abilities"
+
+// Safely remove malfunction status, fixing hacked APCs and resetting variables.
+/mob/living/silicon/ai/proc/stop_malf()
+ var/mob/living/silicon/ai/user = src
+ // Generic variables
+ malfunctioning = 0
+ sleep(10)
+ research = null
+ // Fix hacked APCs
+ if(hacked_apcs)
+ for(var/obj/machinery/power/apc/A in hacked_apcs)
+ A.hacker = null
+ hacked_apcs = null
+ // Reset our verbs
+ src.verbs = null
+ add_ai_verbs()
+ // Let them know.
+ user << "You are no longer malfunctioning. Your abilities have been removed."
+
+// Called every tick. Checks if AI is malfunctioning. If yes calls Process on research datum which handles all logic.
+/mob/living/silicon/ai/proc/malf_process()
+ if(!malfunctioning)
+ return
+ if(!research)
+ if(!errored)
+ errored = 1
+ error("malf_process() called on AI without research datum. Report this.")
+ message_admins("ERROR: malf_process() called on AI without research datum. If admin modified one of the AI's vars revert the change and don't modify variables directly, instead use ProcCall or admin panels.")
+ spawn(1200)
+ errored = 0
+ return
+ recalc_cpu()
+ if(APU_power || aiRestorePowerRoutine != 0)
+ research.process(1)
+ else
+ research.process(0)
+
+// Recalculates CPU time gain and storage capacities.
+/mob/living/silicon/ai/proc/recalc_cpu()
+ // AI Starts with these values.
+ var/cpu_gain = 0.01
+ var/cpu_storage = 10
+
+ // Off-Station APCs should not count towards CPU generation.
+ for(var/obj/machinery/power/apc/A in hacked_apcs)
+ if(A.z in config.station_levels)
+ cpu_gain += 0.002
+ cpu_storage += 10
+
+ research.max_cpu = cpu_storage + override_CPUStorage
+ if(hardware && istype(hardware, /datum/malf_hardware/dual_ram))
+ research.max_cpu = research.max_cpu * 1.5
+ research.stored_cpu = min(research.stored_cpu, research.max_cpu)
+
+ research.cpu_increase_per_tick = cpu_gain + override_CPURate
+ if(hardware && istype(hardware, /datum/malf_hardware/dual_cpu))
+ research.cpu_increase_per_tick = research.cpu_increase_per_tick * 2
+
+// Starts AI's APU generator
+/mob/living/silicon/ai/proc/start_apu(var/shutup = 0)
+ if(!hardware || !istype(hardware, /datum/malf_hardware/apu_gen))
+ if(!shutup)
+ src << "You do not have an APU generator and you shouldn't have this verb. Report this."
+ return
+ if(hardware_integrity() < 50)
+ if(!shutup)
+ src << "Starting APU... FAULT(System Damaged)"
+ return
+ if(!shutup)
+ src << "Starting APU... ONLINE"
+ APU_power = 1
+
+// Stops AI's APU generator
+/mob/living/silicon/ai/proc/stop_apu(var/shutup = 0)
+ if(!hardware || !istype(hardware, /datum/malf_hardware/apu_gen))
+ return
+
+ if(APU_power)
+ APU_power = 0
+ if(!shutup)
+ src << "Shutting down APU... DONE"
+
+// Returns percentage of AI's remaining backup capacitor charge (maxhealth - oxyloss).
+/mob/living/silicon/ai/proc/backup_capacitor()
+ return ((200 - getOxyLoss()) / 2)
+
+// Returns percentage of AI's remaining hardware integrity (maxhealth - (bruteloss + fireloss))
+/mob/living/silicon/ai/proc/hardware_integrity()
+ return (health-config.health_threshold_dead)/2
+
+// Shows capacitor charge and hardware integrity information to the AI in Status tab.
+/mob/living/silicon/ai/show_system_integrity()
+ if(!src.stat)
+ stat(null, text("Hardware integrity: [hardware_integrity()]%"))
+ stat(null, text("Internal capacitor: [backup_capacitor()]%"))
+ else
+ stat(null, text("Systems nonfunctional"))
+
+// Shows AI Malfunction related information to the AI.
+/mob/living/silicon/ai/show_malf_ai()
+ if(src.is_malf())
+ if(src.hacked_apcs)
+ stat(null, "Hacked APCs: [src.hacked_apcs.len]")
+ stat(null, "System Status: [src.hacking ? "Busy" : "Stand-By"]")
+ if(src.research)
+ stat(null, "Available CPU: [src.research.stored_cpu] TFlops")
+ stat(null, "Maximal CPU: [src.research.max_cpu] TFlops")
+ stat(null, "CPU generation rate: [src.research.cpu_increase_per_tick] TFlops/s")
+ stat(null, "Current research focus: [src.research.focus ? src.research.focus.name : "None"]")
+ if(src.research.focus)
+ stat(null, "Research completed: [round(src.research.focus.invested, 0.1)]/[round(src.research.focus.price)]")
+ if(system_override == 1)
+ stat(null, "SYSTEM OVERRIDE INITIATED")
+ else if(system_override == 2)
+ stat(null, "SYSTEM OVERRIDE COMPLETED")
+
+// Cleaner proc for creating powersupply for an AI.
+/mob/living/silicon/ai/proc/create_powersupply()
+ if(psupply)
+ del(psupply)
+ psupply = new/obj/machinery/ai_powersupply(src)
+
#undef AI_CHECK_WIRELESS
#undef AI_CHECK_RADIO
diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm
index 4a43103da8..5c453966fc 100644
--- a/code/modules/mob/living/silicon/ai/death.dm
+++ b/code/modules/mob/living/silicon/ai/death.dm
@@ -13,40 +13,6 @@
remove_ai_verbs(src)
- var/callshuttle = 0
- for(var/obj/machinery/computer/communications/commconsole in world)
- if(commconsole.z == 2)
- continue
- if(istype(commconsole.loc,/turf))
- break
- callshuttle++
-
- for(var/obj/item/weapon/circuitboard/communications/commboard in world)
- if(commboard.z == 2)
- continue
- if(istype(commboard.loc,/turf) || istype(commboard.loc,/obj/item/weapon/storage))
- break
- callshuttle++
-
- for(var/mob/living/silicon/ai/shuttlecaller in player_list)
- if(shuttlecaller.z == 2)
- continue
- if(!shuttlecaller.stat && shuttlecaller.client && istype(shuttlecaller.loc,/turf))
- break
- callshuttle++
-
- if(ticker.mode.name == "revolution" || ticker.mode.name == "AI malfunction")
- callshuttle = 0
-
- if(callshuttle == 3) //if all three conditions are met
- emergency_shuttle.call_evac()
- log_game("All the AIs, comm consoles and boards are destroyed. Shuttle called.")
- message_admins("All the AIs, comm consoles and boards are destroyed. Shuttle called.", 1)
-
- if(explosive)
- spawn(10)
- explosion(src.loc, 3, 6, 12, 15)
-
for(var/obj/machinery/ai_status_display/O in world)
spawn( 0 )
O.mode = 2
diff --git a/code/modules/mob/living/silicon/ai/examine.dm b/code/modules/mob/living/silicon/ai/examine.dm
index 286edc2ce0..45c6a3816b 100644
--- a/code/modules/mob/living/silicon/ai/examine.dm
+++ b/code/modules/mob/living/silicon/ai/examine.dm
@@ -17,15 +17,23 @@
msg += "It looks slightly charred.\n"
else
msg += "Its casing is melted and heat-warped!\n"
+ if (src.getOxyLoss())
+ if (src.getOxyLoss() > 175)
+ msg += "It seems to be running on backup power. Its display is blinking a \"BACKUP POWER CRITICAL\" warning.\n"
+ else if(src.getOxyLoss() > 100)
+ msg += "It seems to be running on backup power. Its display is blinking a \"BACKUP POWER LOW\" warning.\n"
+ else
+ msg += "It seems to be running on backup power.\n"
if (src.stat == UNCONSCIOUS)
msg += "It is non-responsive and displaying the text: \"RUNTIME: Sensory Overload, stack 26/3\".\n"
msg += ""
msg += "*---------*"
-
+ if(hardware && (hardware.owner == src))
+ msg += "
"
+ msg += hardware.get_examine_desc()
user << msg
user.showLaws(src)
-
return
/mob/proc/showLaws(var/mob/living/silicon/S)
diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm
index f57a96a088..5e0b0589c5 100644
--- a/code/modules/mob/living/silicon/ai/life.dm
+++ b/code/modules/mob/living/silicon/ai/life.dm
@@ -12,90 +12,71 @@
src.updatehealth()
- if (src.malfhack)
- if (src.malfhack.aidisabled)
- src << "\red ERROR: APC access disabled, hack attempt canceled."
- src.malfhacking = 0
- src.malfhack = null
-
-
- if (src.health <= config.health_threshold_dead)
+ if (!hardware_integrity() || !backup_capacitor())
death()
return
+ // If our powersupply object was destroyed somehow, create new one.
+ if(!psupply)
+ create_powersupply()
+
if (src.machine)
if (!( src.machine.check_eye(src) ))
src.reset_view(null)
// Handle power damage (oxy)
- if(src:aiRestorePowerRoutine != 0)
- // Lost power
+ if(aiRestorePowerRoutine != 0 && !APU_power)
+ // Lose power
adjustOxyLoss(1)
else
// Gain Power
+ aiRestorePowerRoutine = 0 // Necessary if AI activated it's APU AFTER losing primary power.
adjustOxyLoss(-1)
// Handle EMP-stun
handle_stunned()
- //stage = 1
- //if (istype(src, /mob/living/silicon/ai)) // Are we not sure what we are?
+ malf_process()
+
+ if(APU_power && (hardware_integrity() < 50))
+ src << "APU GENERATOR FAILURE! (System Damaged)"
+ stop_apu(1)
+
var/blind = 0
- //stage = 2
var/area/loc = null
if (istype(T, /turf))
- //stage = 3
loc = T.loc
if (istype(loc, /area))
- //stage = 4
- if (!loc.power_equip && !istype(src.loc,/obj/item))
- //stage = 5
+ if (!loc.power_equip && !istype(src.loc,/obj/item) && !APU_power)
blind = 1
- if (!blind) //lol? if(!blind) #if(src.blind.layer) <--something here is clearly wrong :P
- //I'll get back to this when I find out how this is -supposed- to work ~Carn //removed this shit since it was confusing as all hell --39kk9t
- //stage = 4.5
+ if (!blind)
src.sight |= SEE_TURFS
src.sight |= SEE_MOBS
src.sight |= SEE_OBJS
src.see_in_dark = 8
src.see_invisible = SEE_INVISIBLE_LIVING
-
- //Congratulations! You've found a way for AI's to run without using power!
- //Todo: Without snowflaking up master_controller procs find a way to make AI use_power but only when APC's clear the area usage the tick prior
- // since mobs are in master_controller before machinery. We also have to do it in a manner where we don't reset the entire area's need to update
- // the power usage.
- //
- // We can probably create a new machine that resides inside of the AI contents that uses power using the idle_usage of 1000 and nothing else and
- // be fine.
-/*
- var/area/home = get_area(src)
- if(!home) return//something to do with malf fucking things up I guess. <-- aisat is gone. is this still necessary? ~Carn
- if(home.powered(EQUIP))
- home.use_power(1000, EQUIP)
-*/
-
- if (src:aiRestorePowerRoutine==2)
+ if (aiRestorePowerRoutine==2)
src << "Alert cancelled. Power has been restored without our assistance."
- src:aiRestorePowerRoutine = 0
+ aiRestorePowerRoutine = 0
src.blind.layer = 0
return
- else if (src:aiRestorePowerRoutine==3)
+ else if (aiRestorePowerRoutine==3)
src << "Alert cancelled. Power has been restored."
- src:aiRestorePowerRoutine = 0
+ aiRestorePowerRoutine = 0
+ src.blind.layer = 0
+ return
+ else if (APU_power)
+ aiRestorePowerRoutine = 0
src.blind.layer = 0
return
else
-
- //stage = 6
-
var/area/current_area = get_area(src)
if (lacks_power())
- //If our area lacks equipment power, and is not magically powered (i.e. centcom), or if we are in space and not carded, lose power.
- if (src:aiRestorePowerRoutine==0)
- src:aiRestorePowerRoutine = 1
+ if (aiRestorePowerRoutine==0)
+ aiRestorePowerRoutine = 1
//Blind the AI
@@ -118,7 +99,7 @@
if (loc.power_equip)
if (!istype(T, /turf/space))
src << "Alert cancelled. Power has been restored without our assistance."
- src:aiRestorePowerRoutine = 0
+ aiRestorePowerRoutine = 0
src.blind.layer = 0
return
src << "Fault confirmed: missing external power. Shutting down main control system to save power."
@@ -127,7 +108,7 @@
sleep(50)
if (istype(T, /turf/space))
src << "Unable to verify! No power connection detected!"
- src:aiRestorePowerRoutine = 2
+ aiRestorePowerRoutine = 2
return
src << "Connection verified. Searching for APC in power network."
sleep(50)
@@ -148,7 +129,7 @@
if (loc.power_equip)
if (!istype(T, /turf/space))
src << "Alert cancelled. Power has been restored without our assistance."
- src:aiRestorePowerRoutine = 0
+ aiRestorePowerRoutine = 0
src.blind.layer = 0 //This, too, is a fix to issue 603
return
switch(PRP)
@@ -163,9 +144,9 @@
theAPC.operating = 1
theAPC.equipment = 3
theAPC.update()
- src:aiRestorePowerRoutine = 3
+ aiRestorePowerRoutine = 3
src << "Here are your current laws:"
- src.show_laws()
+ show_laws()
sleep(50)
theAPC = null
@@ -178,6 +159,8 @@
process_med_hud(src,0,src.eyeobj)
/mob/living/silicon/ai/proc/lacks_power()
+ if(APU_power)
+ return 0
var/turf/T = get_turf(src)
var/area/A = get_area(src)
return ((!A.power_equip) && A.requires_power == 1 || istype(T, /turf/space)) && !istype(src.loc,/obj/item)
@@ -186,11 +169,9 @@
if(status_flags & GODMODE)
health = 100
stat = CONSCIOUS
+ setOxyLoss(0)
else
- if(fire_res_on_core)
- health = 100 - getOxyLoss() - getToxLoss() - getBruteLoss()
- else
- health = 100 - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss()
+ health = 100 - getFireLoss() - getBruteLoss() // Oxyloss is not part of health as it represents AIs backup power. AI is immune against ToxLoss as it is machine.
/mob/living/silicon/ai/rejuvenate()
..()
diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm
deleted file mode 100644
index 62a75fad24..0000000000
--- a/code/modules/mob/living/silicon/ai/say.dm
+++ /dev/null
@@ -1,5 +0,0 @@
-/mob/living/silicon/ai/say(var/message)
- if(parent && istype(parent) && parent.stat != 2)
- return parent.say(message)
- //If there is a defined "parent" AI, it is actually an AI, and it is alive, anything the AI tries to say is said by the parent instead.
- return ..(message)
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index 834ae50527..a1c58b69a0 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -6,6 +6,7 @@
emote_type = 2 // pAIs emotes are heard, not seen, so they can be seen through a container (eg. person)
small = 1
pass_flags = 1
+ holder_type = /obj/item/weapon/holder/pai
var/network = "SS13"
var/obj/machinery/camera/current = null
@@ -380,7 +381,16 @@
src.client.perspective = EYE_PERSPECTIVE
src.client.eye = card
- //This seems redundant but not including the forced loc setting messes the behavior up.
+ // If we are being held, handle removing our holder from their inv.
+ var/obj/item/weapon/holder/H = loc
+ if(istype(H))
+ var/mob/living/M = H.loc
+ if(istype(M))
+ M.drop_from_inventory(H)
+ H.loc = get_turf(src)
+ src.loc = get_turf(H)
+
+ // Move us into the card and move the card to the ground.
src.loc = card
card.loc = get_turf(card)
src.forceMove(card)
@@ -402,4 +412,23 @@
// No binary for pAIs.
/mob/living/silicon/pai/binarycheck()
- return 0
\ No newline at end of file
+ return 0
+
+// Handle being picked up.
+/mob/living/silicon/pai/get_scooped(var/mob/living/carbon/grabber)
+ var/obj/item/weapon/holder/H = ..()
+ if(!istype(H))
+ return
+ H.icon_state = "pai-[icon_state]"
+ grabber.update_inv_l_hand()
+ grabber.update_inv_r_hand()
+ return H
+
+/mob/living/silicon/pai/MouseDrop(atom/over_object)
+ var/mob/living/carbon/H = over_object
+ if(!istype(H) || !Adjacent(H)) return ..()
+ if(H.a_intent == "help")
+ get_scooped(H)
+ return
+ else
+ return ..()
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/robot/analyzer.dm b/code/modules/mob/living/silicon/robot/analyzer.dm
index 75556cf304..a4d6f621d3 100644
--- a/code/modules/mob/living/silicon/robot/analyzer.dm
+++ b/code/modules/mob/living/silicon/robot/analyzer.dm
@@ -12,8 +12,8 @@
w_class = 2.0
throw_speed = 5
throw_range = 10
+ origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 1, TECH_ENGINERING = 2)
matter = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 200)
- origin_tech = "magnets=2;biotech=1;engineering=2"
var/mode = 1;
/obj/item/device/robotanalyzer/attack(mob/living/M as mob, mob/living/user as mob)
@@ -26,54 +26,70 @@
user.show_message("\blue Key: Suffocation/Toxin/Burns/Brute", 1)
user.show_message("\blue Body Temperature: ???", 1)
return
- if(!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
- user << "\red You don't have the dexterity to do this!"
- return
- if(!istype(M, /mob/living/silicon/robot) && !(ishuman(M) && (M:species.flags & IS_SYNTHETIC)))
+
+ var/scan_type
+ if(istype(M, /mob/living/silicon/robot))
+ scan_type = "robot"
+ else if(istype(M, /mob/living/carbon/human))
+ scan_type = "prosthetics"
+ else
user << "\red You can't analyze non-robotic things!"
return
- user.visible_message(" [user] has analyzed [M]'s components."," You have analyzed [M]'s components.")
- var/BU = M.getFireLoss() > 50 ? "[M.getFireLoss()]" : M.getFireLoss()
- var/BR = M.getBruteLoss() > 50 ? "[M.getBruteLoss()]" : M.getBruteLoss()
- user.show_message("\blue Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "fully disabled" : "[M.health - M.halloss]% functional"]")
- user.show_message("\t Key: Electronics/Brute", 1)
- user.show_message("\t Damage Specifics: [BU] - [BR]")
- if(M.tod && M.stat == DEAD)
- user.show_message("\blue Time of Disable: [M.tod]")
+ user.visible_message("\The [user] has analyzed [M]'s components.","You have analyzed [M]'s components.")
+ switch(scan_type)
+ if("robot")
+ var/BU = M.getFireLoss() > 50 ? "[M.getFireLoss()]" : M.getFireLoss()
+ var/BR = M.getBruteLoss() > 50 ? "[M.getBruteLoss()]" : M.getBruteLoss()
+ user.show_message("\blue Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "fully disabled" : "[M.health - M.halloss]% functional"]")
+ user.show_message("\t Key: Electronics/Brute", 1)
+ user.show_message("\t Damage Specifics: [BU] - [BR]")
+ if(M.tod && M.stat == DEAD)
+ user.show_message("\blue Time of Disable: [M.tod]")
+ var/mob/living/silicon/robot/H = M
+ var/list/damaged = H.get_damaged_components(1,1,1)
+ user.show_message("\blue Localized Damage:",1)
+ if(length(damaged)>0)
+ for(var/datum/robot_component/org in damaged)
+ user.show_message(text("\blue \t []: [][] - [] - [] - []", \
+ capitalize(org.name), \
+ (org.installed == -1) ? "DESTROYED " :"",\
+ (org.electronics_damage > 0) ? "[org.electronics_damage]" :0, \
+ (org.brute_damage > 0) ? "[org.brute_damage]" :0, \
+ (org.toggled) ? "Toggled ON" : "Toggled OFF",\
+ (org.powered) ? "Power ON" : "Power OFF"),1)
+ else
+ user.show_message("\blue \t Components are OK.",1)
+ if(H.emagged && prob(5))
+ user.show_message("\red \t ERROR: INTERNAL SYSTEMS COMPROMISED",1)
+ user.show_message("\blue Operating Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1)
- if (istype(M, /mob/living/silicon/robot))
- var/mob/living/silicon/robot/H = M
- var/list/damaged = H.get_damaged_components(1,1,1)
- user.show_message("\blue Localized Damage:",1)
- if(length(damaged)>0)
- for(var/datum/robot_component/org in damaged)
- user.show_message(text("\blue \t []: [][] - [] - [] - []", \
- capitalize(org.name), \
- (org.installed == -1) ? "DESTROYED " :"",\
- (org.electronics_damage > 0) ? "[org.electronics_damage]" :0, \
- (org.brute_damage > 0) ? "[org.brute_damage]" :0, \
- (org.toggled) ? "Toggled ON" : "Toggled OFF",\
- (org.powered) ? "Power ON" : "Power OFF"),1)
- else
- user.show_message("\blue \t Components are OK.",1)
- if(H.emagged && prob(5))
- user.show_message("\red \t ERROR: INTERNAL SYSTEMS COMPROMISED",1)
+ if("prosthetics")
+ var/mob/living/carbon/human/H = M
+ user << "Analyzing Results for \the [H]:"
+ user << "Key: Electronics/Brute"
- if (ishuman(M) && (M:species.flags & IS_SYNTHETIC))
- var/mob/living/carbon/human/H = M
- var/list/damaged = H.get_damaged_organs(1,1)
- user.show_message("\blue Localized Damage, Brute/Electronics:",1)
- if(length(damaged)>0)
- for(var/obj/item/organ/external/org in damaged)
- user.show_message(text("\blue \t []: [] - []", \
- capitalize(org.name), \
- (org.brute_dam > 0) ? "\red [org.brute_dam]" :0, \
- (org.burn_dam > 0) ? "[org.burn_dam]" :0),1)
- else
- user.show_message("\blue \t Components are OK.",1)
-
- user.show_message("\blue Operating Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1)
+ user << "External prosthetics:"
+ var/organ_found
+ if(H.internal_organs.len)
+ for(var/obj/item/organ/external/E in H.organs)
+ if(!(E.status & ORGAN_ROBOT))
+ continue
+ organ_found = 1
+ user << "[E.name]: [E.brute_dam] [E.burn_dam]"
+ if(!organ_found)
+ user << "No prosthetics located."
+ user << "
"
+ user << "Internal prosthetics:"
+ organ_found = null
+ if(H.internal_organs.len)
+ for(var/obj/item/organ/O in H.internal_organs)
+ if(!(O.status & ORGAN_ROBOT))
+ continue
+ organ_found = 1
+ user << "[O.name]: [O.damage]"
+ if(!organ_found)
+ user << "No prosthetics located."
src.add_fingerprint(user)
return
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm b/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm
index e5778ad4dc..0eaf1c8779 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm
@@ -21,9 +21,11 @@
return
-//Actual picking-up event.
-/mob/living/silicon/robot/drone/attack_hand(mob/living/carbon/human/M as mob)
-
- if(M.a_intent == I_HELP)
- get_scooped(M)
- ..()
\ No newline at end of file
+/mob/living/silicon/robot/drone/MouseDrop(atom/over_object)
+ var/mob/living/carbon/H = over_object
+ if(!istype(H) || !Adjacent(H)) return ..()
+ if(H.a_intent == "help")
+ get_scooped(H)
+ return
+ else
+ return ..()
\ No newline at end of file
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..84611ecb95 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)
@@ -194,7 +194,7 @@
wrapped = A.cell
A.cell.add_fingerprint(user)
- A.cell.updateicon()
+ A.cell.update_icon()
A.cell.loc = src
A.cell = null
@@ -211,7 +211,7 @@
wrapped = A.cell
A.cell.add_fingerprint(user)
- A.cell.updateicon()
+ A.cell.update_icon()
A.updateicon()
A.cell.loc = src
A.cell = null
@@ -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/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm
index 6bf18971ba..34df63d397 100644
--- a/code/modules/mob/living/silicon/robot/emote.dm
+++ b/code/modules/mob/living/silicon/robot/emote.dm
@@ -38,9 +38,9 @@
param = null
if (param)
- message = "[src] salutes to [param]."
+ message = "salutes to [param]."
else
- message = "[src] salutes."
+ message = "salutes."
m_type = 1
if ("bow")
if (!src.buckled)
@@ -54,39 +54,39 @@
param = null
if (param)
- message = "[src] bows to [param]."
+ message = "bows to [param]."
else
- message = "[src] bows."
+ message = "bows."
m_type = 1
if ("clap")
if (!src.restrained())
- message = "[src] claps."
+ message = "claps."
m_type = 2
if ("flap")
if (!src.restrained())
- message = "[src] flaps his wings."
+ message = "flaps his wings."
m_type = 2
if ("aflap")
if (!src.restrained())
- message = "[src] flaps his wings ANGRILY!"
+ message = "flaps his wings ANGRILY!"
m_type = 2
if ("twitch")
- message = "[src] twitches violently."
+ message = "twitches violently."
m_type = 1
if ("twitch_s")
- message = "[src] twitches."
+ message = "twitches."
m_type = 1
if ("nod")
- message = "[src] nods."
+ message = "nods."
m_type = 1
if ("deathgasp")
- message = "[src] shudders violently for a moment, then becomes motionless, its eyes slowly darkening."
+ message = "shudders violently for a moment, then becomes motionless, its eyes slowly darkening."
m_type = 1
if ("glare")
@@ -100,9 +100,9 @@
param = null
if (param)
- message = "[src] glares at [param]."
+ message = "glares at [param]."
else
- message = "[src] glares."
+ message = "glares."
if ("stare")
var/M = null
@@ -115,9 +115,9 @@
param = null
if (param)
- message = "[src] stares at [param]."
+ message = "stares at [param]."
else
- message = "[src] stares."
+ message = "stares."
if ("look")
var/M = null
@@ -131,9 +131,9 @@
param = null
if (param)
- message = "[src] looks at [param]."
+ message = "looks at [param]."
else
- message = "[src] looks."
+ message = "looks."
m_type = 1
if("beep")
@@ -147,9 +147,9 @@
param = null
if (param)
- message = "[src] beeps at [param]."
+ message = "beeps at [param]."
else
- message = "[src] beeps."
+ message = "beeps."
playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0)
m_type = 1
@@ -164,9 +164,9 @@
param = null
if (param)
- message = "[src] pings at [param]."
+ message = "pings at [param]."
else
- message = "[src] pings."
+ message = "pings."
playsound(src.loc, 'sound/machines/ping.ogg', 50, 0)
m_type = 1
@@ -181,15 +181,15 @@
param = null
if (param)
- message = "[src] buzzes at [param]."
+ message = "buzzes at [param]."
else
- message = "[src] buzzes."
+ message = "buzzes."
playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0)
m_type = 1
if("law")
if (istype(module,/obj/item/weapon/robot_module/security))
- message = "[src] shows its legal authorization barcode."
+ message = "shows its legal authorization barcode."
playsound(src.loc, 'sound/voice/biamthelaw.ogg', 50, 0)
m_type = 2
@@ -211,10 +211,6 @@
src << "\blue Unusable emote '[act]'. Say *help for a list."
if ((message && src.stat == 0))
- if (m_type & 1)
- for(var/mob/O in viewers(src, null))
- O.show_message(message, m_type)
- else
- for(var/mob/O in hearers(src, null))
- O.show_message(message, m_type)
+ custom_emote(m_type,message)
+
return
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 589af5a168..e71db5693d 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -317,7 +317,7 @@
if(Entry[1] == src.ckey && Entry[2] == src.real_name) //They're in the list? Custom sprite time, var and icon change required
custom_sprite = 1
- icon = 'icons/mob/custom-synthetic.dmi'
+ icon = CUSTOM_ITEM_SYNTH
if(icon_state == "robot")
icon_state = "[src.ckey]-Standard"
@@ -409,19 +409,6 @@
C.toggled = 1
src << "\red You enable [C.name]."
-// this function shows information about the malf_ai gameplay type in the status screen
-/mob/living/silicon/robot/show_malf_ai()
- ..()
- for (var/datum/mind/malfai in malf.current_antagonists)
- if(connected_ai)
- if(connected_ai.mind == malfai)
- if(malf.hacked_apcs >= 3)
- stat(null, "Time until station control secured: [max(malf.hack_time/(malf.hacked_apcs/3), 0)] seconds")
- else if(malf.revealed)
- stat(null, "Time left: [max(malf.hack_time/(malf.hacked_apcs.len/3), 0)]")
- return 0
-
-
// this function displays jetpack pressure in the stat panel
/mob/living/silicon/robot/proc/show_jetpack_pressure()
// if you have a jetpack, show the internal tank pressure
@@ -746,7 +733,7 @@
if(opened && !wiresexposed && (!istype(user, /mob/living/silicon)))
var/datum/robot_component/cell_component = components["power cell"]
if(cell)
- cell.updateicon()
+ cell.update_icon()
cell.add_fingerprint(user)
user.put_in_active_hand(cell)
user << "You remove \the [cell]."
@@ -1081,8 +1068,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..96514fa671 100644
--- a/code/modules/mob/living/silicon/robot/robot_items.dm
+++ b/code/modules/mob/living/silicon/robot/robot_items.dm
@@ -28,17 +28,16 @@
user << "You activate the analyzer's microlaser, analyzing \the [loaded_item] and breaking it down."
flick("portable_analyzer_scan", src)
playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
- if(loaded_item.reliability >= min_reliability)
- var/list/temp_tech = ConvertReqString2List(loaded_item.origin_tech)
- for(var/T in temp_tech)
- files.UpdateTech(T, temp_tech[T])
- user << "\The [loaded_item] had level [temp_tech[T]] in [T]."
- loaded_item = null
+ var/list/temp_tech = ConvertReqString2List(loaded_item.origin_tech)
+ for(var/T in temp_tech)
+ files.UpdateTech(T, temp_tech[T])
+ user << "\The [loaded_item] had level [temp_tech[T]] in [T]."
+ loaded_item = null
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
@@ -57,8 +56,6 @@
if(response == "Sync")
var/success = 0
for(var/obj/machinery/r_n_d/server/S in machines)
- if(S.disabled)
- continue
for(var/datum/tech/T in files.known_tech) //Uploading
S.files.AddTech2Known(T)
for(var/datum/tech/T in S.files.known_tech) //Downloading
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 1b15a3681f..527ce35df2 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
@@ -425,6 +425,9 @@ var/global/list/robot_modules = list(
T.update_icon()
else
T.charge_tick = 0
+ var/obj/item/weapon/melee/baton/robot/B = locate() in src.modules
+ if(B && B.bcell)
+ B.bcell.give(amount)
/obj/item/weapon/robot_module/janitor
name = "janitorial robot module"
@@ -484,8 +487,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 +679,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 +699,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 +707,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/constructs/soulstone.dm b/code/modules/mob/living/simple_animal/constructs/soulstone.dm
index 2fa81f08c8..1b5a42b0a3 100644
--- a/code/modules/mob/living/simple_animal/constructs/soulstone.dm
+++ b/code/modules/mob/living/simple_animal/constructs/soulstone.dm
@@ -9,7 +9,7 @@
desc = "A fragment of the legendary treasure known simply as the 'Soul Stone'. The shard still flickers with a fraction of the full artefacts power."
w_class = 1.0
slot_flags = SLOT_BELT
- origin_tech = "bluespace=4;materials=4"
+ origin_tech = list(TECH_BLUESPACE = 4, TECH_MATERIAL = 4)
var/imprinted = "empty"
//////////////////////////////Capturing////////////////////////////////////////////////////////
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/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm
index ad41fc28aa..e94462a20b 100644
--- a/code/modules/mob/living/simple_animal/friendly/mouse.dm
+++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm
@@ -28,6 +28,7 @@
maxbodytemp = 323 //Above 50 Degrees Celcius
universal_speak = 0
universal_understand = 1
+ holder_type = /obj/item/weapon/holder/mouse
mob_size = 1
/mob/living/simple_animal/mouse/Life()
@@ -62,6 +63,13 @@
if(!body_color)
body_color = pick( list("brown","gray","white") )
+ switch(body_color)
+ if("brown")
+ holder_type = /obj/item/weapon/holder/mouse/brown
+ if("gray")
+ holder_type = /obj/item/weapon/holder/mouse/gray
+ if("white")
+ holder_type = /obj/item/weapon/holder/mouse/white
icon_state = "mouse_[body_color]"
icon_living = "mouse_[body_color]"
icon_dead = "mouse_[body_color]_dead"
@@ -76,6 +84,22 @@
if(client)
client.time_died_as_mouse = world.time
+/mob/living/simple_animal/mouse/MouseDrop(atom/over_object)
+
+ var/mob/living/carbon/H = over_object
+ if(!istype(H) || !Adjacent(H)) return ..()
+
+ if(H.a_intent == "help")
+ get_scooped(H)
+ return
+ else
+ return ..()
+
+/mob/living/simple_animal/mouse/get_scooped(var/mob/living/carbon/grabber)
+ if (stat >= DEAD)
+ return
+ ..()
+
/mob/living/simple_animal/mouse/start_pulling(var/atom/movable/AM)//Prevents mouse from pulling things
src << "You are too small to pull anything."
return
@@ -101,14 +125,17 @@
/mob/living/simple_animal/mouse/white
body_color = "white"
icon_state = "mouse_white"
+ holder_type = /obj/item/weapon/holder/mouse/white
/mob/living/simple_animal/mouse/gray
body_color = "gray"
icon_state = "mouse_gray"
+ holder_type = /obj/item/weapon/holder/mouse/gray
/mob/living/simple_animal/mouse/brown
body_color = "brown"
icon_state = "mouse_brown"
+ holder_type = /obj/item/weapon/holder/mouse/brown
//TOM IS ALIVE! SQUEEEEEEEE~K :)
/mob/living/simple_animal/mouse/brown/Tom
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..c8ab89d905 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)
@@ -214,7 +214,7 @@
//spawn 1-4 boards of a random type
var/spawnees = 0
var/num_boards = rand(1,4)
- var/list/options = list(1,2,4,8,16,32,64,128,256, 512)
+ var/list/options = list(1,2,4,8,16,32,64,128,256,512)
for(var/i=0, i[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..c551d0a6b8 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -44,29 +44,30 @@
src << msg
return
-// Show a message to all mobs in sight of this one
+// Show a message to all mobs and objects in sight of this one
// This would be for visible actions by the src mob
// message is the message output to anyone who can see e.g. "[src] does something!"
// self_message (optional) is what the src mob sees e.g. "You do something!"
// blind_message (optional) is what blind people will hear e.g. "You hear something!"
/mob/visible_message(var/message, var/self_message, var/blind_message)
- for(var/mob/M in viewers(src))
- if(self_message && M==src)
- M.show_message(self_message, 1, blind_message, 2)
- else if(M.see_invisible < invisibility) // Cannot view the invisible, but you can hear it.
- if(blind_message)
- M.show_message(blind_message, 2)
- else
- M.show_message(message, 1, blind_message, 2)
-// Show a message to all mobs in sight of this atom
-// Use for objects performing visible actions
-// message is output to anyone who can see, e.g. "The [src] does something!"
-// blind_message (optional) is what blind people will hear e.g. "You hear something!"
-/atom/proc/visible_message(var/message, var/blind_message)
- for(var/mob/M in viewers(src))
- M.show_message( message, 1, blind_message, 2)
+ var/list/see = get_mobs_or_objects_in_view(world.view,src) | viewers(get_turf(src), null)
+
+ for(var/I in see)
+ if(isobj(I))
+ spawn(0)
+ if(I) //It's possible that it could be deleted in the meantime.
+ var/obj/O = I
+ O.show_message( message, 1, blind_message, 2)
+ else if(ismob(I))
+ var/mob/M = I
+ if(self_message && M==src)
+ M.show_message( self_message, 1, blind_message, 2)
+ if(M.see_invisible >= invisibility) // Cannot view the invisible
+ M.show_message( message, 1, blind_message, 2)
+ else if (blind_message)
+ M.show_message(blind_message, 2)
// Returns an amount of power drawn from the object (-1 if it's not viable).
// If drain_check is set it will not actually drain power, just return a value.
@@ -75,33 +76,31 @@
/atom/proc/drain_power(var/drain_check,var/surge, var/amount = 0)
return -1
-// Show a message to all mobs in earshot of this one
+// Show a message to all mobs and objects in earshot of this one
// This would be for audible actions by the src mob
// message is the message output to anyone who can hear.
// self_message (optional) is what the src mob hears.
// deaf_message (optional) is what deaf people will see.
// hearing_distance (optional) is the range, how many tiles away the message can be heard.
/mob/audible_message(var/message, var/deaf_message, var/hearing_distance, var/self_message)
- var/range = 7
- if(hearing_distance)
- range = hearing_distance
- var/msg = message
- for(var/mob/M in get_mobs_in_view(range, src))
- if(self_message && M==src)
- msg = self_message
- M.show_message( msg, 2, deaf_message, 1)
-// Show a message to all mobs in earshot of this atom
-// Use for objects performing audible actions
-// message is the message output to anyone who can hear.
-// deaf_message (optional) is what deaf people will see.
-// hearing_distance (optional) is the range, how many tiles away the message can be heard.
-/atom/proc/audible_message(var/message, var/deaf_message, var/hearing_distance)
- var/range = 7
+ var/range = world.view
if(hearing_distance)
range = hearing_distance
- for(var/mob/M in get_mobs_in_view(range, src))
- M.show_message( message, 2, deaf_message, 1)
+ var/list/hear = get_mobs_or_objects_in_view(range,src)
+
+ for(var/I in hear)
+ if(isobj(I))
+ spawn(0)
+ if(I) //It's possible that it could be deleted in the meantime.
+ var/obj/O = I
+ O.show_message( message, 2, deaf_message, 1)
+ else if(ismob(I))
+ var/mob/M = I
+ var/msg = message
+ if(self_message && M==src)
+ msg = self_message
+ M.show_message( msg, 2, deaf_message, 1)
/mob/proc/findname(msg)
@@ -137,8 +136,23 @@
client.eye = loc
return
-// This is not needed short of simple_animal and carbon/alien / carbon/human, who reimplement it.
+
/mob/proc/show_inv(mob/user as mob)
+ user.set_machine(src)
+ var/dat = {"
+
[name]
+
+
Head(Mask): [(wear_mask ? wear_mask : "Nothing")]
+
Left Hand: [(l_hand ? l_hand : "Nothing")]
+
Right Hand: [(r_hand ? r_hand : "Nothing")]
+
Back: [(back ? back : "Nothing")] [((istype(wear_mask, /obj/item/clothing/mask) && istype(back, /obj/item/weapon/tank) && !( internal )) ? text(" Set Internal", src) : "")]
+
[(internal ? text("Remove Internal") : "")]
+
Empty Pockets
+
Refresh
+
Close
+
"}
+ user << browse(dat, text("window=mob[];size=325x500", name))
+ onclose(user, "mob[name]")
return
//mob verbs are faster than object verbs. See http://www.byond.com/forum/?post=1326139&page=2#comment8198716 for why this isn't atom/verb/examine()
@@ -601,111 +615,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/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 17def087b3..79115b61b2 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -104,7 +104,11 @@
return 0
/mob/living/carbon/human/isSynthetic()
- return species.flags & IS_SYNTHETIC
+ // If they are 100% robotic, they count as synthetic.
+ for(var/obj/item/organ/external/E in organs)
+ if(!(E.status & ORGAN_ROBOT))
+ return 0
+ return 1
/mob/living/silicon/isSynthetic()
return 1
diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm
index 28f63329b1..dbabfc5917 100644
--- a/code/modules/mob/new_player/preferences_setup.dm
+++ b/code/modules/mob/new_player/preferences_setup.dm
@@ -208,7 +208,7 @@ datum/preferences
if(!dummy.mind)
dummy.mind = new
dummy.mind.role_alt_title = alt
- J.equip(dummy)
+ J.equip_preview(dummy)
break
dummy.update_eyes()
dummy.force_update_limbs()
diff --git a/code/modules/mob/typing_indicator.dm b/code/modules/mob/typing_indicator.dm
index 203159f3c6..147edb1afe 100644
--- a/code/modules/mob/typing_indicator.dm
+++ b/code/modules/mob/typing_indicator.dm
@@ -5,14 +5,17 @@ mob/var/typing
mob/var/last_typed
mob/var/last_typed_time
-var/global/image/typing_indicator
+mob/var/obj/effect/decal/typing_indicator
/mob/proc/set_typing_indicator(var/state)
if(!typing_indicator)
- typing_indicator = image('icons/mob/talk.dmi',null,"typing")
+ typing_indicator = new
+ typing_indicator.icon = 'icons/mob/talk.dmi'
+ typing_indicator.icon_state = "typing"
- if(client)
+ if(client && !stat)
+ typing_indicator.invisibility = invisibility
if(client.prefs.toggles & SHOW_TYPING)
overlays -= typing_indicator
else
diff --git a/code/modules/nano/interaction/inventory_deep.dm b/code/modules/nano/interaction/inventory_deep.dm
new file mode 100644
index 0000000000..9637c4df75
--- /dev/null
+++ b/code/modules/nano/interaction/inventory_deep.dm
@@ -0,0 +1,10 @@
+/*
+ This state checks if src_object is contained anywhere in the user's inventory, including bags, etc.
+*/
+/var/global/datum/topic_state/deep_inventory_state/deep_inventory_state = new()
+
+/datum/topic_state/deep_inventory_state/can_use_topic(var/src_object, var/mob/user)
+ if(!user.contains(src_object))
+ return STATUS_CLOSE
+
+ return user.shared_nano_interaction()
diff --git a/code/modules/nano/nanomanager.dm b/code/modules/nano/nanomanager.dm
index 2a89779e92..f6325fd4f7 100644
--- a/code/modules/nano/nanomanager.dm
+++ b/code/modules/nano/nanomanager.dm
@@ -55,8 +55,9 @@
ui.push_data(data)
return ui
else
- //testing("nanomanager/try_update_ui mob [user.name] [src_object:name] [ui_key] [force_open] - forcing opening of ui")
- ui.close()
+ ui.reinitialise(new_initial_data=data)
+ return ui
+
return null
/**
@@ -164,10 +165,10 @@
else if (isnull(open_uis[src_object_key][ui.ui_key]) || !istype(open_uis[src_object_key][ui.ui_key], /list))
open_uis[src_object_key][ui.ui_key] = list();
- ui.user.open_uis.Add(ui)
+ ui.user.open_uis |= ui
var/list/uis = open_uis[src_object_key][ui.ui_key]
- uis.Add(ui)
- processing_uis.Add(ui)
+ uis |= ui
+ processing_uis |= ui
//testing("nanomanager/ui_opened mob [ui.user.name] [ui.src_object:name] [ui.ui_key] - user.open_uis [ui.user.open_uis.len] | uis [uis.len] | processing_uis [processing_uis.len]")
/**
@@ -220,7 +221,7 @@
*/
/datum/nanomanager/proc/user_transferred(var/mob/oldMob, var/mob/newMob)
//testing("nanomanager/user_transferred from mob [oldMob.name] to mob [newMob.name]")
- if (!oldMob || isnull(oldMob.open_uis) || !istype(oldMob.open_uis, /list) || open_uis.len == 0)
+ if (!oldMob || isnull(oldMob.open_uis) || !istype(oldMob.open_uis, /list) || open_uis.len == 0)
//testing("nanomanager/user_transferred mob [oldMob.name] has no open uis")
return 0 // has no open uis
diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm
index f53fc98497..f134d5d93b 100644
--- a/code/modules/nano/nanoui.dm
+++ b/code/modules/nano/nanoui.dm
@@ -405,6 +405,18 @@ nanoui is used to open and update nano browser uis
//onclose(user, window_id)
nanomanager.ui_opened(src)
+ /**
+ * Reinitialise this UI, potentially with a different template and/or initial data
+ *
+ * @return nothing
+ */
+/datum/nanoui/proc/reinitialise(template, new_initial_data)
+ if(template)
+ add_template("main", template)
+ if(new_initial_data)
+ set_initial_data(new_initial_data)
+ open()
+
/**
* Close this UI
*
diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm
index 272f43b790..70c2281bb3 100644
--- a/code/modules/organs/blood.dm
+++ b/code/modules/organs/blood.dm
@@ -214,7 +214,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
//Transfers blood from reagents to vessel, respecting blood types compatability.
/mob/living/carbon/human/inject_blood(var/datum/reagent/blood/injected, var/amount)
- if(species && species.flags & NO_BLOOD)
+ if(species.flags & NO_BLOOD)
reagents.add_reagent("blood", amount, injected.data)
reagents.update_total()
return
diff --git a/code/modules/organs/misc.dm b/code/modules/organs/misc.dm
new file mode 100644
index 0000000000..a330e307a3
--- /dev/null
+++ b/code/modules/organs/misc.dm
@@ -0,0 +1,70 @@
+//CORTICAL BORER ORGANS.
+/obj/item/organ/borer/process()
+
+ // Borer husks regenerate health, feel no pain, and are resistant to stuns and brainloss.
+ for(var/chem in list("tricordrazine","tramadol","hyperzine","alkysine"))
+ if(owner.reagents.get_reagent_amount(chem) < 3)
+ owner.reagents.add_reagent(chem, 5)
+
+ // They're also super gross and ooze ichor.
+ if(prob(5))
+ var/mob/living/carbon/human/H = owner
+ if(!istype(H))
+ return
+
+ var/datum/reagent/blood/B = locate(/datum/reagent/blood) in H.vessel.reagent_list
+ blood_splatter(H,B,1)
+ var/obj/effect/decal/cleanable/blood/splatter/goo = locate() in get_turf(owner)
+ if(goo)
+ goo.name = "husk ichor"
+ goo.desc = "It's thick and stinks of decay."
+ goo.basecolor = "#412464"
+ goo.update_icon()
+
+/obj/item/organ/borer
+ name = "cortical borer"
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "borer"
+ organ_tag = "brain"
+ desc = "A disgusting space slug."
+ parent_organ = "head"
+ vital = 1
+
+/obj/item/organ/borer/removed(var/mob/living/user)
+
+ ..()
+
+ var/mob/living/simple_animal/borer/B = owner.has_brain_worms()
+ if(B)
+ B.leave_host()
+ B.ckey = owner.ckey
+
+ spawn(0)
+ qdel(src)
+
+//VOX ORGANS.
+/obj/item/organ/stack
+ name = "cortical stack"
+ parent_organ = "head"
+ robotic = 2
+ vital = 1
+ var/backup_time = 0
+ var/datum/mind/backup
+
+/obj/item/organ/stack/process()
+ if(owner && owner.stat != DEAD && !is_broken())
+ backup_time = world.time
+ if(owner.mind) backup = owner.mind
+
+/obj/item/organ/stack/vox
+
+/obj/item/organ/stack/vox/stack
+
+/obj/item/organ/stack
+ name = "cortical stack"
+ icon_state = "brain-prosthetic"
+ organ_tag = "stack"
+ robotic = 2
+
+/obj/item/organ/stack/vox
+ name = "vox cortical stack"
diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm
index 06dd521f64..3555a5985b 100644
--- a/code/modules/organs/organ.dm
+++ b/code/modules/organs/organ.dm
@@ -23,6 +23,8 @@ var/list/organ_cache = list()
var/list/trace_chemicals = list() // traces of chemicals in the organ,
// links chemical IDs to number of ticks for which they'll stay in the blood
germ_level = 0
+ var/datum/dna/dna
+ var/datum/species/species
/obj/item/organ/proc/update_health()
return
@@ -34,6 +36,12 @@ var/list/organ_cache = list()
max_damage = min_broken_damage * 2
if(istype(holder))
src.owner = holder
+ species = all_species["Human"]
+ if(holder.dna)
+ dna = holder.dna.Clone()
+ species = all_species[dna.species]
+ else
+ log_debug("[src] at [loc] spawned without a proper DNA.")
var/mob/living/carbon/human/H = holder
if(istype(H))
if(internal)
@@ -42,10 +50,10 @@ var/list/organ_cache = list()
if(E.internal_organs == null)
E.internal_organs = list()
E.internal_organs |= src
- if(H.dna)
+ if(dna)
if(!blood_DNA)
blood_DNA = list()
- blood_DNA[H.dna.unique_enzymes] = H.dna.b_type
+ blood_DNA[dna.unique_enzymes] = dna.b_type
if(internal)
holder.internal_organs |= src
@@ -53,16 +61,18 @@ var/list/organ_cache = list()
if(status & ORGAN_ROBOT)
return
damage = max_damage
+ status |= ORGAN_DEAD
processing_objects -= src
if(dead_icon)
icon_state = dead_icon
/obj/item/organ/process()
- // Don't process if we're in a freezer, an MMI or a stasis bag. //TODO: ambient temperature?
- if(istype(loc,/obj/item/device/mmi) || istype(loc,/obj/item/bodybag/cryobag) || istype(loc,/obj/structure/closet/crate/freezer))
+ // Don't process if we're in a freezer, an MMI or a stasis bag.or a freezer or something I dunno
+ if(istype(loc,/obj/item/device/mmi))
+ return
+ if(istype(loc,/obj/structure/closet/body_bag/cryobag) || istype(loc,/obj/structure/closet/crate/freezer) || istype(loc,/obj/item/weapon/storage/box/freezer))
return
-
//Process infections
if (robotic >= 2 || (owner && owner.species && (owner.species.flags & IS_PLANT)))
germ_level = 0
@@ -76,8 +86,10 @@ var/list/organ_cache = list()
if(B && prob(40))
reagents.remove_reagent("blood",0.1)
blood_splatter(src,B,1)
- damage += rand(1,3)
- if(damage >= max_damage)
+ germ_level += rand(2,6)
+ if(germ_level >= INFECTION_LEVEL_TWO)
+ germ_level += rand(2,6)
+ if(germ_level >= INFECTION_LEVEL_THREE)
die()
else if(owner.bodytemperature >= 170) //cryo stops germs from moving and doing their bad stuffs
@@ -86,6 +98,11 @@ var/list/organ_cache = list()
handle_rejection()
handle_germ_effects()
+/obj/item/organ/examine(mob/user)
+ ..(user)
+ if(status & ORGAN_DEAD)
+ user << "The decay has set in."
+
/obj/item/organ/proc/handle_germ_effects()
//** Handle the effects of infections
var/antibiotics = owner.reagents.get_reagent_amount("spaceacillin")
@@ -114,24 +131,23 @@ var/list/organ_cache = list()
/obj/item/organ/proc/handle_rejection()
// Process unsuitable transplants. TODO: consider some kind of
// immunosuppressant that changes transplant data to make it match.
- if(transplant_data)
- if(!rejecting && prob(20) && owner.dna && blood_incompatible(transplant_data["blood_type"],owner.dna.b_type,owner.species,transplant_data["species"]))
- rejecting = 1
+ if(dna)
+ if(!rejecting)
+ if(blood_incompatible(dna.b_type, owner.dna.b_type, species, owner.species))
+ rejecting = 1
else
rejecting++ //Rejection severity increases over time.
if(rejecting % 10 == 0) //Only fire every ten rejection ticks.
switch(rejecting)
if(1 to 50)
- take_damage(1)
+ germ_level++
if(51 to 200)
- owner.reagents.add_reagent("toxin", 1)
- take_damage(1)
+ germ_level += rand(1,2)
if(201 to 500)
- take_damage(rand(2,3))
- owner.reagents.add_reagent("toxin", 2)
+ germ_level += rand(2,3)
if(501 to INFINITY)
- take_damage(4)
- owner.reagents.add_reagent("toxin", rand(3,5))
+ germ_level += rand(3,5)
+ owner.reagents.add_reagent("toxin", rand(1,2))
/obj/item/organ/proc/receive_chem(chemical as obj)
return 0
@@ -175,15 +191,16 @@ var/list/organ_cache = list()
W.time_inflicted = world.time
/obj/item/organ/proc/take_damage(amount, var/silent=0)
- if(src.robotic == 2)
+ if(src.status & ORGAN_ROBOT)
src.damage += (amount * 0.8)
else
src.damage += amount
- if(owner && parent_organ)
- var/obj/item/organ/external/parent = owner.get_organ(parent_organ)
- if(parent && !silent)
- owner.custom_pain("Something inside your [parent.name] hurts a lot.", 1)
+ //only show this if the organ is not robotic
+ if(owner && parent_organ)
+ var/obj/item/organ/external/parent = owner.get_organ(parent_organ)
+ if(parent && !silent)
+ owner.custom_pain("Something inside your [parent.name] hurts a lot.", 1)
/obj/item/organ/proc/robotize() //Being used to make robutt hearts, etc
robotic = 2
@@ -204,31 +221,17 @@ var/list/organ_cache = list()
min_broken_damage = 35
/obj/item/organ/emp_act(severity)
- switch(robotic)
- if(0)
+ if(!(status & ORGAN_ROBOT))
+ return
+ switch (severity)
+ if (1.0)
+ take_damage(0,20)
return
- if(1)
- switch (severity)
- if (1.0)
- take_damage(20,0)
- return
- if (2.0)
- take_damage(7,0)
- return
- if(3.0)
- take_damage(3,0)
- return
- if(2)
- switch (severity)
- if (1.0)
- take_damage(40,0)
- return
- if (2.0)
- take_damage(15,0)
- return
- if(3.0)
- take_damage(10,0)
- return
+ if (2.0)
+ take_damage(0,7)
+ return
+ if(3.0)
+ take_damage(0,3)
/obj/item/organ/proc/removed(var/mob/living/user)
diff --git a/code/modules/organs/organ_alien.dm b/code/modules/organs/organ_alien.dm
deleted file mode 100644
index 0905a61266..0000000000
--- a/code/modules/organs/organ_alien.dm
+++ /dev/null
@@ -1,389 +0,0 @@
-/proc/spawn_diona_nymph_from_organ(var/obj/item/organ/organ)
- if(!istype(organ))
- return
-
- //This is a terrible hack and I should be ashamed.
- var/datum/seed/diona = plant_controller.seeds["diona"]
- if(!diona)
- qdel(src)
-
- spawn(1) // So it has time to be thrown about by the gib() proc.
- var/mob/living/carbon/alien/diona/D = new(get_turf(organ))
- diona.request_player(D)
- qdel(organ)
-
-/obj/item/organ/external/diona
- name = "tendril"
- cannot_break = 1
- amputation_point = "branch"
- joint = "structural ligament"
- dislocated = -1
-
-/obj/item/organ/external/diona/chest
- name = "core trunk"
- limb_name = "chest"
- icon_name = "torso"
- health = 200
- min_broken_damage = 50
- body_part = UPPER_TORSO
- vital = 1
- cannot_amputate = 1
- parent_organ = null
-
-/obj/item/organ/external/diona/groin
- name = "fork"
- limb_name = "groin"
- icon_name = "groin"
- health = 100
- min_broken_damage = 50
- body_part = LOWER_TORSO
- parent_organ = "chest"
-
-/obj/item/organ/external/diona/arm
- name = "left upper tendril"
- limb_name = "l_arm"
- icon_name = "l_arm"
- health = 35
- min_broken_damage = 20
- body_part = ARM_LEFT
- parent_organ = "chest"
- can_grasp = 1
-
-/obj/item/organ/external/diona/arm/right
- name = "right upper tendril"
- limb_name = "r_arm"
- icon_name = "r_arm"
- body_part = ARM_RIGHT
-
-/obj/item/organ/external/diona/leg
- name = "left lower tendril"
- limb_name = "l_leg"
- icon_name = "l_leg"
- health = 35
- min_broken_damage = 20
- body_part = LEG_LEFT
- icon_position = LEFT
- parent_organ = "groin"
- can_stand = 1
-
-/obj/item/organ/external/diona/leg/right
- name = "right lower tendril"
- limb_name = "r_leg"
- icon_name = "r_leg"
- body_part = LEG_RIGHT
- icon_position = RIGHT
-
-/obj/item/organ/external/diona/foot
- name = "left foot"
- limb_name = "l_foot"
- icon_name = "l_foot"
- health = 20
- min_broken_damage = 10
- body_part = FOOT_LEFT
- icon_position = LEFT
- parent_organ = "l_leg"
- can_stand = 1
-
-/obj/item/organ/external/diona/foot/right
- name = "right foot"
- limb_name = "r_foot"
- icon_name = "r_foot"
- body_part = FOOT_RIGHT
- icon_position = RIGHT
- parent_organ = "r_leg"
- joint = "right ankle"
- amputation_point = "right ankle"
-
-/obj/item/organ/external/diona/hand
- name = "left grasper"
- limb_name = "l_hand"
- icon_name = "l_hand"
- health = 30
- min_broken_damage = 15
- body_part = HAND_LEFT
- parent_organ = "l_arm"
- can_grasp = 1
-
-/obj/item/organ/external/diona/hand/right
- name = "right grasper"
- limb_name = "r_hand"
- icon_name = "r_hand"
- body_part = HAND_RIGHT
- parent_organ = "r_arm"
-
-/obj/item/organ/external/diona/head
- limb_name = "head"
- icon_name = "head"
- name = "head"
- health = 50
- min_broken_damage = 25
- body_part = HEAD
- parent_organ = "chest"
-
-/obj/item/organ/external/diona/head/removed()
- if(owner)
- owner.u_equip(owner.head)
- owner.u_equip(owner.l_ear)
- ..()
-
-//DIONA ORGANS.
-/obj/item/organ/external/diona/removed()
- ..()
- if(!istype(owner))
- qdel(src)
-
- if(!owner.organs.len)
- owner.death()
-
- if(prob(50))
- spawn_diona_nymph_from_organ(src)
-
-/obj/item/organ/diona/process()
- return
-
-/obj/item/organ/diona/strata
- name = "neural strata"
- parent_organ = "chest"
-
-/obj/item/organ/diona/bladder
- name = "gas bladder"
- parent_organ = "head"
-
-/obj/item/organ/diona/polyp
- name = "polyp segment"
- parent_organ = "groin"
-
-/obj/item/organ/diona/ligament
- name = "anchoring ligament"
- parent_organ = "groin"
-
-/obj/item/organ/diona/node
- name = "receptor node"
- parent_organ = "head"
-
-/obj/item/organ/diona/nutrients
- name = "nutrient vessel"
- parent_organ = "chest"
-
-/obj/item/organ/diona
- name = "diona nymph"
- icon = 'icons/obj/objects.dmi'
- icon_state = "nymph"
- organ_tag = "special" // Turns into a nymph instantly, no transplanting possible.
-
-/obj/item/organ/diona/removed(var/mob/living/user)
-
- ..()
- if(!istype(owner))
- qdel(src)
-
- if(!owner.internal_organs.len)
- owner.death()
-
- spawn_diona_nymph_from_organ(src)
-
-// These are different to the standard diona organs as they have a purpose in other
-// species (absorbing radiation and light respectively)
-/obj/item/organ/diona/nutrients
- name = "nutrient vessel"
- organ_tag = "nutrient vessel"
- icon = 'icons/mob/alien.dmi'
- icon_state = "claw"
-
-/obj/item/organ/diona/nutrients/removed()
- return
-
-/obj/item/organ/diona/node
- name = "receptor node"
- organ_tag = "receptor node"
- icon = 'icons/mob/alien.dmi'
- icon_state = "claw"
-
-/obj/item/organ/diona/node/removed()
- return
-
-//CORTICAL BORER ORGANS.
-/obj/item/organ/borer
- name = "cortical borer"
- parent_organ = "head"
- vital = 1
-
-/obj/item/organ/borer/process()
-
- // Borer husks regenerate health, feel no pain, and are resistant to stuns and brainloss.
- for(var/chem in list("tricordrazine","tramadol","hyperzine","alkysine"))
- if(owner.reagents.get_reagent_amount(chem) < 3)
- owner.reagents.add_reagent(chem, 5)
-
- // They're also super gross and ooze ichor.
- if(prob(5))
- var/mob/living/carbon/human/H = owner
- if(!istype(H))
- return
-
- var/datum/reagent/blood/B = locate(/datum/reagent/blood) in H.vessel.reagent_list
- blood_splatter(H,B,1)
- var/obj/effect/decal/cleanable/blood/splatter/goo = locate() in get_turf(owner)
- if(goo)
- goo.name = "husk ichor"
- goo.desc = "It's thick and stinks of decay."
- goo.basecolor = "#412464"
- goo.update_icon()
-
-/obj/item/organ/borer
- name = "cortical borer"
- icon = 'icons/obj/objects.dmi'
- icon_state = "borer"
- organ_tag = "brain"
- desc = "A disgusting space slug."
-
-/obj/item/organ/borer/removed(var/mob/living/user)
-
- ..()
-
- var/mob/living/simple_animal/borer/B = owner.has_brain_worms()
- if(B)
- B.leave_host()
- B.ckey = owner.ckey
-
- spawn(0)
- qdel(src)
-
-//XENOMORPH ORGANS
-/obj/item/organ/xenos/eggsac
- name = "egg sac"
- parent_organ = "groin"
-
-/obj/item/organ/xenos/plasmavessel
- name = "plasma vessel"
- parent_organ = "chest"
- var/stored_plasma = 0
- var/max_plasma = 500
-
-/obj/item/organ/xenos/plasmavessel/queen
- name = "bloated plasma vessel"
- stored_plasma = 200
- max_plasma = 500
-
-/obj/item/organ/xenos/plasmavessel/sentinel
- stored_plasma = 100
- max_plasma = 250
-
-/obj/item/organ/xenos/plasmavessel/hunter
- name = "tiny plasma vessel"
- stored_plasma = 100
- max_plasma = 150
-
-/obj/item/organ/xenos/acidgland
- name = "acid gland"
- parent_organ = "head"
-
-/obj/item/organ/xenos/hivenode
- name = "hive node"
- parent_organ = "chest"
-
-/obj/item/organ/xenos/resinspinner
- name = "resin spinner"
- parent_organ = "head"
-
-/obj/item/organ/xenos
- name = "xeno organ"
- icon = 'icons/effects/blood.dmi'
- desc = "It smells like an accident in a chemical factory."
-
-/obj/item/organ/xenos/eggsac
- name = "egg sac"
- icon_state = "xgibmid1"
- organ_tag = "egg sac"
-
-/obj/item/organ/xenos/plasmavessel
- name = "plasma vessel"
- icon_state = "xgibdown1"
- organ_tag = "plasma vessel"
-
-/obj/item/organ/xenos/acidgland
- name = "acid gland"
- icon_state = "xgibtorso"
- organ_tag = "acid gland"
-
-/obj/item/organ/xenos/hivenode
- name = "hive node"
- icon_state = "xgibmid2"
- organ_tag = "hive node"
-
-/obj/item/organ/xenos/resinspinner
- name = "hive node"
- icon_state = "xgibmid2"
- organ_tag = "resin spinner"
-
-//VOX ORGANS.
-/obj/item/organ/stack
- name = "cortical stack"
- parent_organ = "head"
- robotic = 2
- vital = 1
- var/backup_time = 0
- var/datum/mind/backup
-
-/obj/item/organ/stack/process()
- if(owner && owner.stat != 2 && !is_broken())
- backup_time = world.time
- if(owner.mind) backup = owner.mind
-
-/obj/item/organ/stack/vox
-
-/obj/item/organ/stack/vox/stack
-
-/obj/item/organ/stack
- name = "cortical stack"
- icon_state = "brain-prosthetic"
- organ_tag = "stack"
- robotic = 2
-
-/obj/item/organ/stack/vox
- name = "vox cortical stack"
-
-// Slime limbs.
-/obj/item/organ/external/chest/slime
- cannot_break = 1
- dislocated = -1
-
-/obj/item/organ/external/groin/slime
- cannot_break = 1
- dislocated = -1
-
-/obj/item/organ/external/arm/slime
- cannot_break = 1
- dislocated = -1
-
-/obj/item/organ/external/arm/right/slime
- cannot_break = 1
- dislocated = -1
-
-/obj/item/organ/external/leg/slime
- cannot_break = 1
- dislocated = -1
-
-/obj/item/organ/external/leg/right/slime
- cannot_break = 1
- dislocated = -1
-
-/obj/item/organ/external/foot/slime
- cannot_break = 1
- dislocated = -1
-
-/obj/item/organ/external/foot/right/slime
- cannot_break = 1
- dislocated = -1
-
-/obj/item/organ/external/hand/slime
- cannot_break = 1
- dislocated = -1
-
-/obj/item/organ/external/hand/right/slime
- cannot_break = 1
- dislocated = -1
-
-/obj/item/organ/external/head/slime
- cannot_break = 1
- dislocated = -1
diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm
index a539f5f421..2d4ca50d90 100644
--- a/code/modules/organs/organ_external.dm
+++ b/code/modules/organs/organ_external.dm
@@ -48,6 +48,36 @@
var/can_grasp
var/can_stand
+/obj/item/organ/external/attack_self(var/mob/user)
+ if(!contents.len)
+ return ..()
+ var/list/removable_objects = list()
+ for(var/obj/item/organ/external/E in (contents + src))
+ if(!istype(E))
+ continue
+ for(var/obj/item/I in E.contents)
+ if(istype(I,/obj/item/organ))
+ continue
+ removable_objects |= I
+ if(!removable_objects.len)
+ return ..()
+ var/obj/item/I = pick(removable_objects)
+ if(!istype(I))
+ return ..()
+ I.loc = get_turf(user)
+ if(!(user.l_hand && user.r_hand))
+ user.put_in_hands(I)
+ user.visible_message("\The [user] rips \the [I] out of \the [src]!")
+
+/obj/item/organ/external/examine()
+ ..()
+ if(in_range(usr, src) || istype(usr, /mob/dead/observer))
+ for(var/obj/item/I in contents)
+ if(istype(I, /obj/item/organ))
+ continue
+ usr << "There is \a [I] sticking out of it."
+ return
+
/obj/item/organ/external/attackby(obj/item/weapon/W as obj, mob/user as mob)
switch(stage)
if(0)
@@ -138,23 +168,17 @@
DAMAGE PROCS
****************************************************/
+/obj/item/organ/external/proc/is_damageable(var/additional_damage = 0)
+ return (vital || brute_dam + burn_dam + additional_damage < max_damage)
+
/obj/item/organ/external/take_damage(brute, burn, sharp, edge, used_weapon = null, list/forbidden_limbs = list())
if((brute <= 0) && (burn <= 0))
return 0
-
if(status & ORGAN_DESTROYED)
return 0
if(status & ORGAN_ROBOT )
-
var/brmod = 0.66
var/bumod = 0.66
-
- if(istype(owner,/mob/living/carbon/human))
- var/mob/living/carbon/human/H = owner
- if(H.species && H.species.flags & IS_SYNTHETIC)
- brmod = H.species.brute_mod
- bumod = H.species.burn_mod
-
brute *= brmod //~2/3 damage for ROBOLIMBS
burn *= bumod //~2/3 damage for ROBOLIMBS
@@ -177,7 +201,7 @@
// If the limbs can break, make sure we don't exceed the maximum damage a limb can take before breaking
// Non-vital organs are limited to max_damage. You can't kill someone by bludeonging their arm all the way to 200 -- you can
// push them faster into paincrit though, as the additional damage is converted into shock.
- if(vital || (brute_dam + burn_dam + brute + burn) < max_damage || !config.limbs_can_break)
+ if(is_damageable(brute + burn) || !config.limbs_can_break)
if(brute)
if(can_cut)
createwound( CUT, brute )
@@ -322,10 +346,14 @@ This function completely restores a damaged organ to perfect condition.
var/datum/wound/W = pick(compatible_wounds)
W.open_wound(damage)
if(prob(25))
- //maybe have a separate message for BRUISE type damage?
- owner.visible_message("\red The wound on [owner.name]'s [name] widens with a nasty ripping noise.",\
- "\red The wound on your [name] widens with a nasty ripping noise.",\
- "You hear a nasty ripping noise, as if flesh is being torn apart.")
+ if(status & ORGAN_ROBOT)
+ owner.visible_message("\red The damage to [owner.name]'s [name] worsens.",\
+ "\red The damage to your [name] worsens.",\
+ "You hear the screech of abused metal.")
+ else
+ owner.visible_message("\red The wound on [owner.name]'s [name] widens with a nasty ripping noise.",\
+ "\red The wound on your [name] widens with a nasty ripping noise.",\
+ "You hear a nasty ripping noise, as if flesh is being torn apart.")
return
//Creating wound
@@ -354,7 +382,7 @@ This function completely restores a damaged organ to perfect condition.
//Determines if we even need to process this organ.
/obj/item/organ/external/proc/need_process()
- if(status && status != ORGAN_ROBOT) // If it's robotic, that's fine it will have a status.
+ if(status & (ORGAN_CUT_AWAY|ORGAN_GAUZED|ORGAN_BLEEDING|ORGAN_BROKEN|ORGAN_DESTROYED|ORGAN_SPLINTED|ORGAN_DEAD|ORGAN_MUTATED))
return 1
if(brute_dam || burn_dam)
return 1
@@ -369,11 +397,6 @@ This function completely restores a damaged organ to perfect condition.
/obj/item/organ/external/process()
if(owner)
- //Dismemberment
- if(status & ORGAN_DESTROYED)
- if(config.limbs_can_break)
- droplimb(0,DROPLIMB_EDGE) //Might be worth removing this check since take_damage handles it.
- return
if(parent)
if(parent.status & ORGAN_DESTROYED)
status |= ORGAN_DESTROYED
@@ -694,6 +717,9 @@ Note that amputating the affected organ does in fact remove the infection from t
dir = 2
if(DROPLIMB_BURN)
new /obj/effect/decal/cleanable/ash(get_turf(victim))
+ for(var/obj/item/I in src)
+ if(I.w_class > 2 && !istype(I,/obj/item/organ))
+ I.loc = get_turf(src)
qdel(src)
if(DROPLIMB_BLUNT)
var/obj/effect/decal/cleanable/blood/gibs/gore = new owner.species.single_gib_type(get_turf(victim))
@@ -708,6 +734,14 @@ Note that amputating the affected organ does in fact remove the infection from t
I.removed()
if(istype(loc,/turf))
I.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),30)
+
+ for(var/obj/item/I in src)
+ if(I.w_class <= 2)
+ qdel(I)
+ continue
+ I.loc = get_turf(src)
+ I.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),30)
+
qdel(src)
/****************************************************
@@ -868,7 +902,7 @@ Note that amputating the affected organ does in fact remove the infection from t
W.add_blood(owner)
if(ismob(W.loc))
var/mob/living/H = W.loc
- H.drop_item()
+ H.drop_from_inventory(W)
W.loc = owner
/obj/item/organ/external/removed(var/mob/living/user, var/ignore_children)
@@ -883,8 +917,14 @@ Note that amputating the affected organ does in fact remove the infection from t
status |= ORGAN_DESTROYED
victim.bad_external_organs -= src
- for(var/implant in implants) //todo: check if this can be left alone
- qdel(implant)
+ for(var/obj/item/implant in implants)
+ if(!istype(implant))
+ return
+ if(implant.w_class <= 2)
+ qdel(implant)
+ else
+ implant.loc = src
+ implants.Cut()
// Attached organs also fly off.
if(!ignore_children)
@@ -892,6 +932,8 @@ Note that amputating the affected organ does in fact remove the infection from t
O.removed()
if(O)
O.loc = src
+ for(var/obj/item/I in O.contents)
+ I.loc = src
// Grab all the internal giblets too.
for(var/obj/item/organ/organ in internal_organs)
@@ -933,6 +975,9 @@ Note that amputating the affected organ does in fact remove the infection from t
/obj/item/organ/external/proc/get_wounds_desc()
. = ""
+ if(status & ORGAN_DESTROYED && !is_stump())
+ . += "tear at [amputation_point] so bad it barely hangs on few tendons"
+
if(status & ORGAN_ROBOT)
if(brute_dam)
switch(brute_dam)
@@ -983,165 +1028,3 @@ Note that amputating the affected organ does in fact remove the infection from t
if(6 to INFINITY)
flavor_text += "a ton of [wound]\s"
return english_list(flavor_text)
-/****************************************************
- ORGAN DEFINES
-****************************************************/
-
-/obj/item/organ/external/chest
- name = "upper body"
- limb_name = "chest"
- icon_name = "torso"
- health = 100
- min_broken_damage = 35
- body_part = UPPER_TORSO
- vital = 1
- amputation_point = "spine"
- joint = "neck"
- dislocated = -1
- gendered_icon = 1
- cannot_amputate = 1
- parent_organ = null
- encased = "ribcage"
-
-/obj/item/organ/external/groin
- name = "lower body"
- limb_name = "groin"
- icon_name = "groin"
- health = 100
- min_broken_damage = 35
- body_part = LOWER_TORSO
- vital = 1
- parent_organ = "chest"
- amputation_point = "lumbar"
- joint = "hip"
- dislocated = -1
- gendered_icon = 1
-
-/obj/item/organ/external/arm
- limb_name = "l_arm"
- name = "left arm"
- icon_name = "l_arm"
- health = 50
- min_broken_damage = 30
- body_part = ARM_LEFT
- parent_organ = "chest"
- joint = "left elbow"
- amputation_point = "left shoulder"
- can_grasp = 1
-
-/obj/item/organ/external/arm/right
- limb_name = "r_arm"
- name = "right arm"
- icon_name = "r_arm"
- body_part = ARM_RIGHT
- joint = "right elbow"
- amputation_point = "right shoulder"
-
-/obj/item/organ/external/leg
- limb_name = "l_leg"
- name = "left leg"
- icon_name = "l_leg"
- health = 50
- min_broken_damage = 30
- body_part = LEG_LEFT
- icon_position = LEFT
- parent_organ = "groin"
- joint = "left knee"
- amputation_point = "left hip"
- can_stand = 1
-
-/obj/item/organ/external/leg/right
- limb_name = "r_leg"
- name = "right leg"
- icon_name = "r_leg"
- body_part = LEG_RIGHT
- icon_position = RIGHT
- joint = "right knee"
- amputation_point = "right hip"
-
-/obj/item/organ/external/foot
- limb_name = "l_foot"
- name = "left foot"
- icon_name = "l_foot"
- health = 30
- min_broken_damage = 15
- body_part = FOOT_LEFT
- icon_position = LEFT
- parent_organ = "l_leg"
- joint = "left ankle"
- amputation_point = "left ankle"
- can_stand = 1
-
-/obj/item/organ/external/foot/removed()
- if(owner) owner.u_equip(owner.shoes)
- ..()
-
-/obj/item/organ/external/foot/right
- limb_name = "r_foot"
- name = "right foot"
- icon_name = "r_foot"
- body_part = FOOT_RIGHT
- icon_position = RIGHT
- parent_organ = "r_leg"
- joint = "right ankle"
- amputation_point = "right ankle"
-
-/obj/item/organ/external/hand
- limb_name = "l_hand"
- name = "left hand"
- icon_name = "l_hand"
- health = 30
- min_broken_damage = 15
- body_part = HAND_LEFT
- parent_organ = "l_arm"
- joint = "left wrist"
- amputation_point = "left wrist"
- can_grasp = 1
-
-/obj/item/organ/external/hand/removed()
- owner.u_equip(owner.gloves)
- ..()
-
-/obj/item/organ/external/hand/right
- limb_name = "r_hand"
- name = "right hand"
- icon_name = "r_hand"
- body_part = HAND_RIGHT
- parent_organ = "r_arm"
- joint = "right wrist"
- amputation_point = "right wrist"
-
-/obj/item/organ/external/head
- limb_name = "head"
- icon_name = "head"
- name = "head"
- health = 75
- min_broken_damage = 35
- body_part = HEAD
- vital = 1
- parent_organ = "chest"
- joint = "jaw"
- amputation_point = "neck"
- gendered_icon = 1
- encased = "skull"
-
-/obj/item/organ/external/head/removed()
- if(owner)
- name = "[owner.real_name]'s head"
- owner.u_equip(owner.glasses)
- owner.u_equip(owner.head)
- owner.u_equip(owner.l_ear)
- owner.u_equip(owner.r_ear)
- owner.u_equip(owner.wear_mask)
- spawn(1)
- owner.update_hair()
- ..()
-
-/obj/item/organ/external/head/take_damage(brute, burn, sharp, edge, used_weapon = null, list/forbidden_limbs = list())
- ..(brute, burn, sharp, edge, used_weapon, forbidden_limbs)
- if (!disfigured)
- if (brute_dam > 40)
- if (prob(50))
- disfigure("brute")
- if (burn_dam > 40)
- disfigure("burn")
diff --git a/code/modules/organs/organ_icon.dm b/code/modules/organs/organ_icon.dm
index 7036e7e725..281cd0c016 100644
--- a/code/modules/organs/organ_icon.dm
+++ b/code/modules/organs/organ_icon.dm
@@ -17,11 +17,23 @@ var/global/list/limb_icon_cache = list()
s_col = null
if(status & ORGAN_ROBOT)
return
+ if(species && human.species && species.name != human.species.name)
+ return
if(!isnull(human.s_tone) && (human.species.flags & HAS_SKIN_TONE))
s_tone = human.s_tone
if(human.species.flags & HAS_SKIN_COLOR)
s_col = list(human.r_skin, human.g_skin, human.b_skin)
+/obj/item/organ/external/proc/sync_colour_to_dna()
+ s_tone = null
+ s_col = null
+ if(status & ORGAN_ROBOT)
+ return
+ if(!isnull(dna.GetUIValue(DNA_UI_SKIN_TONE)) && (species.flags & HAS_SKIN_TONE))
+ s_tone = dna.GetUIValue(DNA_UI_SKIN_TONE)
+ if(species.flags & HAS_SKIN_COLOR)
+ s_col = list(dna.GetUIValue(DNA_UI_SKIN_R), dna.GetUIValue(DNA_UI_SKIN_G), dna.GetUIValue(DNA_UI_SKIN_B))
+
/obj/item/organ/external/head/sync_colour_to_human(var/mob/living/carbon/human/human)
..()
var/obj/item/organ/eyes/eyes = owner.internal_organs_by_name["eyes"]
@@ -35,10 +47,10 @@ var/global/list/limb_icon_cache = list()
..()
overlays.Cut()
- if(owner.species.has_organ["eyes"])
+ if(species.has_organ["eyes"])
var/obj/item/organ/eyes/eyes = owner.internal_organs_by_name["eyes"]
- if(owner.species.eyes)
- var/icon/eyes_icon = new/icon('icons/mob/human_face.dmi', owner.species.eyes)
+ if(species.eyes)
+ var/icon/eyes_icon = new/icon('icons/mob/human_face.dmi', species.eyes)
if(eyes)
eyes_icon.Blend(rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3]), ICON_ADD)
else
@@ -46,14 +58,14 @@ var/global/list/limb_icon_cache = list()
mob_icon.Blend(eyes_icon, ICON_OVERLAY)
overlays |= eyes_icon
- if(owner.lip_style && (owner.species && (owner.species.flags & HAS_LIPS)))
+ if(owner.lip_style && (species && (species.flags & HAS_LIPS)))
var/icon/lip_icon = new/icon('icons/mob/human_face.dmi', "lips_[owner.lip_style]_s")
overlays |= lip_icon
mob_icon.Blend(lip_icon, ICON_OVERLAY)
if(owner.f_style)
var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[owner.f_style]
- if(facial_hair_style && facial_hair_style.species_allowed && (owner.species.name in facial_hair_style.species_allowed))
+ if(facial_hair_style && facial_hair_style.species_allowed && (species.name in facial_hair_style.species_allowed))
var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s")
if(facial_hair_style.do_colouration)
facial_s.Blend(rgb(owner.r_facial, owner.g_facial, owner.b_facial), ICON_ADD)
@@ -61,7 +73,7 @@ var/global/list/limb_icon_cache = list()
if(owner.h_style && !(owner.head && (owner.head.flags & BLOCKHEADHAIR)))
var/datum/sprite_accessory/hair_style = hair_styles_list[owner.h_style]
- if(hair_style && (owner.species.name in hair_style.species_allowed))
+ if(hair_style && (species.name in hair_style.species_allowed))
var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
if(hair_style.do_colouration)
hair_s.Blend(rgb(owner.r_hair, owner.g_hair, owner.b_hair), ICON_ADD)
@@ -75,25 +87,25 @@ var/global/list/limb_icon_cache = list()
if(force_icon)
mob_icon = new /icon(force_icon, "[icon_name]")
else
- if(!owner)
+ if(!dna)
mob_icon = new /icon('icons/mob/human_races/r_human.dmi', "[icon_name][gendered_icon ? "_f" : ""]")
else
if(gendered_icon)
- if(owner.gender == FEMALE)
+ if(dna.GetUIState(DNA_UI_GENDER))
gender = "f"
else
gender = "m"
if(skeletal)
mob_icon = new /icon('icons/mob/human_races/r_skeleton.dmi', "[icon_name][gender ? "_[gender]" : ""]")
- else if ((status & ORGAN_ROBOT) && !(owner.species && owner.species.flags & IS_SYNTHETIC))
+ else if (status & ORGAN_ROBOT)
mob_icon = new /icon('icons/mob/human_races/robotic.dmi', "[icon_name][gender ? "_[gender]" : ""]")
else
if (status & ORGAN_MUTATED)
- mob_icon = new /icon(owner.species.deform, "[icon_name][gender ? "_[gender]" : ""]")
+ mob_icon = new /icon(species.deform, "[icon_name][gender ? "_[gender]" : ""]")
else
- mob_icon = new /icon(owner.species.icobase, "[icon_name][gender ? "_[gender]" : ""]")
+ mob_icon = new /icon(species.icobase, "[icon_name][gender ? "_[gender]" : ""]")
if(status & ORGAN_DEAD)
mob_icon.ColorTone(rgb(10,50,0))
diff --git a/code/modules/organs/organ_stump.dm b/code/modules/organs/organ_stump.dm
index 728f9cd1bc..68201c1413 100644
--- a/code/modules/organs/organ_stump.dm
+++ b/code/modules/organs/organ_stump.dm
@@ -2,7 +2,6 @@
name = "limb stump"
icon_name = ""
dislocated = -1
- cannot_amputate = 1
/obj/item/organ/external/stump/New(var/mob/living/carbon/holder, var/internal, var/obj/item/organ/external/limb)
if(istype(limb))
diff --git a/code/modules/organs/pain.dm b/code/modules/organs/pain.dm
index da3c289224..e4e024be10 100644
--- a/code/modules/organs/pain.dm
+++ b/code/modules/organs/pain.dm
@@ -8,7 +8,10 @@ mob/var/next_pain_time = 0
// partname is the name of a body part
// amount is a num from 1 to 100
mob/living/carbon/proc/pain(var/partname, var/amount, var/force, var/burning = 0)
- if(stat >= 2) return
+ if(stat >= 1)
+ return
+ if(species && (species.flags & NO_PAIN))
+ return
if(analgesic > 40)
return
if(world.time < next_pain_time && !force)
@@ -48,10 +51,10 @@ mob/living/carbon/proc/pain(var/partname, var/amount, var/force, var/burning = 0
// message is the custom message to be displayed
// flash_strength is 0 for weak pain flash, 1 for strong pain flash
mob/living/carbon/human/proc/custom_pain(var/message, var/flash_strength)
- if(stat >= 1) return
-
- if(species && species.flags & NO_PAIN) return
-
+ if(stat >= 1)
+ return
+ if(species.flags & NO_PAIN)
+ return
if(reagents.has_reagent("tramadol"))
return
if(reagents.has_reagent("oxycodone"))
@@ -71,7 +74,7 @@ mob/living/carbon/human/proc/custom_pain(var/message, var/flash_strength)
mob/living/carbon/human/proc/handle_pain()
// not when sleeping
- if(species && species.flags & NO_PAIN) return
+ if(species.flags & NO_PAIN) return
if(stat >= 2) return
if(analgesic > 70)
@@ -79,7 +82,7 @@ mob/living/carbon/human/proc/handle_pain()
var/maxdam = 0
var/obj/item/organ/external/damaged_organ = null
for(var/obj/item/organ/external/E in organs)
- if(E.status & ORGAN_DEAD) continue
+ if(E.status & (ORGAN_DEAD|ORGAN_ROBOT)) continue
var/dam = E.get_damage()
// make the choice of the organ depend on damage,
// but also sometimes use one of the less damaged ones
@@ -91,6 +94,7 @@ mob/living/carbon/human/proc/handle_pain()
// Damage to internal organs hurts a lot.
for(var/obj/item/organ/I in internal_organs)
+ if(I.status & (ORGAN_DEAD|ORGAN_ROBOT)) continue
if(I.damage > 2) if(prob(2))
var/obj/item/organ/external/parent = get_organ(I.parent_organ)
src.custom_pain("You feel a sharp pain in your [parent.name]", 1)
diff --git a/code/modules/organs/robolimbs.dm b/code/modules/organs/robolimbs.dm
index 8d19d60b49..87da7f0353 100644
--- a/code/modules/organs/robolimbs.dm
+++ b/code/modules/organs/robolimbs.dm
@@ -7,6 +7,7 @@ var/global/datum/robolimb/basic_robolimb
for(var/limb_type in typesof(/datum/robolimb))
var/datum/robolimb/R = new limb_type()
all_robolimbs[R.company] = R
+ world << "Adding [R.company] as [R], [R.type]"
if(!R.unavailable_at_chargen)
chargen_robolimbs[R.company] = R
@@ -35,3 +36,9 @@ var/global/datum/robolimb/basic_robolimb
company = "Xion Manufacturing Group"
desc = "This limb has a minimalist black and red casing."
icon = 'icons/mob/human_races/cyberlimbs/xion.dmi'
+
+/datum/robolimb/ipc
+ company = "Morpheus Cyberkinetics"
+ desc = "This limb is simple and functional; no effort has been made to make it look human."
+ icon = 'icons/mob/human_races/cyberlimbs/ipc.dmi'
+ unavailable_at_chargen = 1
diff --git a/code/modules/organs/subtypes/diona.dm b/code/modules/organs/subtypes/diona.dm
new file mode 100644
index 0000000000..873d2b4766
--- /dev/null
+++ b/code/modules/organs/subtypes/diona.dm
@@ -0,0 +1,202 @@
+/proc/spawn_diona_nymph_from_organ(var/obj/item/organ/organ)
+ if(!istype(organ))
+ return 0
+
+ //This is a terrible hack and I should be ashamed.
+ var/datum/seed/diona = plant_controller.seeds["diona"]
+ if(!diona)
+ return 0
+
+ spawn(1) // So it has time to be thrown about by the gib() proc.
+ var/mob/living/carbon/alien/diona/D = new(get_turf(organ))
+ var/datum/ghosttrap/plant/P = get_ghost_trap("living plant")
+ P.request_player(D, "A diona nymph has split off from its gestalt. ")
+ spawn(60)
+ if(D)
+ if(!D.ckey || !D.client)
+ D.death()
+ return 1
+
+/obj/item/organ/external/diona
+ name = "tendril"
+ cannot_break = 1
+ amputation_point = "branch"
+ joint = "structural ligament"
+ dislocated = -1
+
+/obj/item/organ/external/diona/chest
+ name = "core trunk"
+ limb_name = "chest"
+ icon_name = "torso"
+ health = 200
+ min_broken_damage = 50
+ body_part = UPPER_TORSO
+ vital = 1
+ cannot_amputate = 1
+ parent_organ = null
+
+/obj/item/organ/external/diona/groin
+ name = "fork"
+ limb_name = "groin"
+ icon_name = "groin"
+ health = 100
+ min_broken_damage = 50
+ body_part = LOWER_TORSO
+ parent_organ = "chest"
+
+/obj/item/organ/external/diona/arm
+ name = "left upper tendril"
+ limb_name = "l_arm"
+ icon_name = "l_arm"
+ health = 35
+ min_broken_damage = 20
+ body_part = ARM_LEFT
+ parent_organ = "chest"
+ can_grasp = 1
+
+/obj/item/organ/external/diona/arm/right
+ name = "right upper tendril"
+ limb_name = "r_arm"
+ icon_name = "r_arm"
+ body_part = ARM_RIGHT
+
+/obj/item/organ/external/diona/leg
+ name = "left lower tendril"
+ limb_name = "l_leg"
+ icon_name = "l_leg"
+ health = 35
+ min_broken_damage = 20
+ body_part = LEG_LEFT
+ icon_position = LEFT
+ parent_organ = "groin"
+ can_stand = 1
+
+/obj/item/organ/external/diona/leg/right
+ name = "right lower tendril"
+ limb_name = "r_leg"
+ icon_name = "r_leg"
+ body_part = LEG_RIGHT
+ icon_position = RIGHT
+
+/obj/item/organ/external/diona/foot
+ name = "left foot"
+ limb_name = "l_foot"
+ icon_name = "l_foot"
+ health = 20
+ min_broken_damage = 10
+ body_part = FOOT_LEFT
+ icon_position = LEFT
+ parent_organ = "l_leg"
+ can_stand = 1
+
+/obj/item/organ/external/diona/foot/right
+ name = "right foot"
+ limb_name = "r_foot"
+ icon_name = "r_foot"
+ body_part = FOOT_RIGHT
+ icon_position = RIGHT
+ parent_organ = "r_leg"
+ joint = "right ankle"
+ amputation_point = "right ankle"
+
+/obj/item/organ/external/diona/hand
+ name = "left grasper"
+ limb_name = "l_hand"
+ icon_name = "l_hand"
+ health = 30
+ min_broken_damage = 15
+ body_part = HAND_LEFT
+ parent_organ = "l_arm"
+ can_grasp = 1
+
+/obj/item/organ/external/diona/hand/right
+ name = "right grasper"
+ limb_name = "r_hand"
+ icon_name = "r_hand"
+ body_part = HAND_RIGHT
+ parent_organ = "r_arm"
+
+/obj/item/organ/external/diona/head
+ limb_name = "head"
+ icon_name = "head"
+ name = "head"
+ health = 50
+ min_broken_damage = 25
+ body_part = HEAD
+ parent_organ = "chest"
+
+/obj/item/organ/external/diona/head/removed()
+ if(owner)
+ owner.u_equip(owner.head)
+ owner.u_equip(owner.l_ear)
+ ..()
+
+//DIONA ORGANS.
+/obj/item/organ/external/diona/removed()
+ var/mob/living/carbon/human/H = owner
+ ..()
+ if(!istype(H) || !H.organs || !H.organs.len)
+ H.death()
+ if(prob(50) && spawn_diona_nymph_from_organ(src))
+ qdel(src)
+
+/obj/item/organ/diona/process()
+ return
+
+/obj/item/organ/diona/strata
+ name = "neural strata"
+ parent_organ = "chest"
+
+/obj/item/organ/diona/bladder
+ name = "gas bladder"
+ parent_organ = "head"
+
+/obj/item/organ/diona/polyp
+ name = "polyp segment"
+ parent_organ = "groin"
+
+/obj/item/organ/diona/ligament
+ name = "anchoring ligament"
+ parent_organ = "groin"
+
+/obj/item/organ/diona/node
+ name = "receptor node"
+ parent_organ = "head"
+
+/obj/item/organ/diona/nutrients
+ name = "nutrient vessel"
+ parent_organ = "chest"
+
+/obj/item/organ/diona
+ name = "diona nymph"
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "nymph"
+ organ_tag = "special" // Turns into a nymph instantly, no transplanting possible.
+
+/obj/item/organ/diona/removed(var/mob/living/user)
+ var/mob/living/carbon/human/H = owner
+ ..()
+ if(!istype(H) || !H.organs || !H.organs.len)
+ H.death()
+ if(prob(50) && spawn_diona_nymph_from_organ(src))
+ qdel(src)
+
+// These are different to the standard diona organs as they have a purpose in other
+// species (absorbing radiation and light respectively)
+/obj/item/organ/diona/nutrients
+ name = "nutrient vessel"
+ organ_tag = "nutrient vessel"
+ icon = 'icons/mob/alien.dmi'
+ icon_state = "claw"
+
+/obj/item/organ/diona/nutrients/removed()
+ return
+
+/obj/item/organ/diona/node
+ name = "receptor node"
+ organ_tag = "receptor node"
+ icon = 'icons/mob/alien.dmi'
+ icon_state = "claw"
+
+/obj/item/organ/diona/node/removed()
+ return
diff --git a/code/modules/organs/subtypes/machine.dm b/code/modules/organs/subtypes/machine.dm
new file mode 100644
index 0000000000..28c44bc41e
--- /dev/null
+++ b/code/modules/organs/subtypes/machine.dm
@@ -0,0 +1,141 @@
+// IPC limbs.
+/obj/item/organ/external/head/ipc
+ dislocated = -1
+ can_intake_reagents = 0
+ encased = null
+/obj/item/organ/external/head/ipc/New()
+ robotize("Morpheus Cyberkinetics")
+ ..()
+
+/obj/item/organ/external/chest/ipc
+ dislocated = -1
+ encased = null
+/obj/item/organ/external/chest/ipc/New()
+ robotize("Morpheus Cyberkinetics")
+ ..()
+
+/obj/item/organ/external/groin/ipc
+ dislocated = -1
+/obj/item/organ/external/groin/ipc/New()
+ robotize("Morpheus Cyberkinetics")
+ ..()
+
+/obj/item/organ/external/arm/ipc
+ dislocated = -1
+/obj/item/organ/external/arm/ipc/New()
+ robotize("Morpheus Cyberkinetics")
+ ..()
+
+/obj/item/organ/external/arm/right/ipc
+ dislocated = -1
+/obj/item/organ/external/arm/right/ipc/New()
+ robotize("Morpheus Cyberkinetics")
+ ..()
+
+/obj/item/organ/external/leg/ipc
+ dislocated = -1
+/obj/item/organ/external/leg/ipc/New()
+ robotize("Morpheus Cyberkinetics")
+ ..()
+
+/obj/item/organ/external/leg/right/ipc
+ dislocated = -1
+/obj/item/organ/external/leg/right/ipc/New()
+ robotize("Morpheus Cyberkinetics")
+ ..()
+
+/obj/item/organ/external/foot/ipc
+ dislocated = -1
+/obj/item/organ/external/foot/ipc/New()
+ robotize("Morpheus Cyberkinetics")
+ ..()
+
+/obj/item/organ/external/foot/right/ipc
+ dislocated = -1
+/obj/item/organ/external/foot/right/ipc/New()
+ robotize("Morpheus Cyberkinetics")
+ ..()
+
+/obj/item/organ/external/hand/ipc
+ dislocated = -1
+/obj/item/organ/external/hand/ipc/New()
+ robotize("Morpheus Cyberkinetics")
+ ..()
+
+/obj/item/organ/external/hand/right/ipc
+ dislocated = -1
+/obj/item/organ/external/hand/right/ipc/New()
+ robotize("Morpheus Cyberkinetics")
+ ..()
+
+/obj/item/organ/cell
+ name = "microbattery"
+ desc = "A small, powerful cell for use in fully prosthetic bodies."
+ icon = 'icons/obj/power.dmi'
+ icon_state = "scell"
+ organ_tag = "cell"
+ parent_organ = "chest"
+ vital = 1
+
+/obj/item/organ/cell/New()
+ robotize()
+ ..()
+
+/obj/item/organ/cell/replaced()
+ ..()
+ // This is very ghetto way of rebooting an IPC. TODO better way.
+ if(owner && owner.stat == DEAD)
+ owner.stat = 0
+ owner.visible_message("\The [owner] twitches visibly!")
+
+// Used for an MMI or posibrain being installed into a human.
+/obj/item/organ/mmi_holder
+ name = "brain"
+ organ_tag = "brain"
+ parent_organ = "head"
+ vital = 1
+ var/obj/item/device/mmi/stored_mmi
+
+/obj/item/organ/mmi_holder/proc/update_from_mmi()
+ if(!stored_mmi)
+ return
+ name = stored_mmi.name
+ desc = stored_mmi.desc
+ icon = stored_mmi.icon
+ icon_state = stored_mmi.icon_state
+
+/obj/item/organ/mmi_holder/removed(var/mob/living/user)
+
+ if(stored_mmi)
+ stored_mmi.loc = get_turf(src)
+ if(owner.mind)
+ owner.mind.transfer_to(stored_mmi.brainmob)
+ ..()
+
+ var/mob/living/holder_mob = loc
+ if(istype(holder_mob))
+ holder_mob.drop_from_inventory(src)
+ qdel(src)
+
+/obj/item/organ/mmi_holder/New()
+ ..()
+ // This is very ghetto way of rebooting an IPC. TODO better way.
+ spawn(1)
+ if(owner && owner.stat == DEAD)
+ owner.stat = 0
+ owner.visible_message("\The [owner] twitches visibly!")
+
+/obj/item/organ/mmi_holder/posibrain/New()
+ robotize()
+ stored_mmi = new /obj/item/device/mmi/digital/posibrain(src)
+ ..()
+ spawn(1)
+ if(owner)
+ stored_mmi.name = "positronic brain ([owner.name])"
+ stored_mmi.brainmob.real_name = owner.name
+ stored_mmi.brainmob.name = stored_mmi.brainmob.real_name
+ stored_mmi.icon_state = "posibrain-occupied"
+ update_from_mmi()
+ else
+ stored_mmi.loc = get_turf(src)
+ qdel(src)
\ No newline at end of file
diff --git a/code/modules/organs/subtypes/standard.dm b/code/modules/organs/subtypes/standard.dm
new file mode 100644
index 0000000000..3a7e18a9dc
--- /dev/null
+++ b/code/modules/organs/subtypes/standard.dm
@@ -0,0 +1,163 @@
+/****************************************************
+ ORGAN DEFINES
+****************************************************/
+
+/obj/item/organ/external/chest
+ name = "upper body"
+ limb_name = "chest"
+ icon_name = "torso"
+ health = 100
+ min_broken_damage = 35
+ body_part = UPPER_TORSO
+ vital = 1
+ amputation_point = "spine"
+ joint = "neck"
+ dislocated = -1
+ gendered_icon = 1
+ cannot_amputate = 1
+ parent_organ = null
+ encased = "ribcage"
+
+/obj/item/organ/external/groin
+ name = "lower body"
+ limb_name = "groin"
+ icon_name = "groin"
+ health = 100
+ min_broken_damage = 35
+ body_part = LOWER_TORSO
+ vital = 1
+ parent_organ = "chest"
+ amputation_point = "lumbar"
+ joint = "hip"
+ dislocated = -1
+ gendered_icon = 1
+
+/obj/item/organ/external/arm
+ limb_name = "l_arm"
+ name = "left arm"
+ icon_name = "l_arm"
+ health = 50
+ min_broken_damage = 30
+ body_part = ARM_LEFT
+ parent_organ = "chest"
+ joint = "left elbow"
+ amputation_point = "left shoulder"
+ can_grasp = 1
+
+/obj/item/organ/external/arm/right
+ limb_name = "r_arm"
+ name = "right arm"
+ icon_name = "r_arm"
+ body_part = ARM_RIGHT
+ joint = "right elbow"
+ amputation_point = "right shoulder"
+
+/obj/item/organ/external/leg
+ limb_name = "l_leg"
+ name = "left leg"
+ icon_name = "l_leg"
+ health = 50
+ min_broken_damage = 30
+ body_part = LEG_LEFT
+ icon_position = LEFT
+ parent_organ = "groin"
+ joint = "left knee"
+ amputation_point = "left hip"
+ can_stand = 1
+
+/obj/item/organ/external/leg/right
+ limb_name = "r_leg"
+ name = "right leg"
+ icon_name = "r_leg"
+ body_part = LEG_RIGHT
+ icon_position = RIGHT
+ joint = "right knee"
+ amputation_point = "right hip"
+
+/obj/item/organ/external/foot
+ limb_name = "l_foot"
+ name = "left foot"
+ icon_name = "l_foot"
+ health = 30
+ min_broken_damage = 15
+ body_part = FOOT_LEFT
+ icon_position = LEFT
+ parent_organ = "l_leg"
+ joint = "left ankle"
+ amputation_point = "left ankle"
+ can_stand = 1
+
+/obj/item/organ/external/foot/removed()
+ if(owner) owner.u_equip(owner.shoes)
+ ..()
+
+/obj/item/organ/external/foot/right
+ limb_name = "r_foot"
+ name = "right foot"
+ icon_name = "r_foot"
+ body_part = FOOT_RIGHT
+ icon_position = RIGHT
+ parent_organ = "r_leg"
+ joint = "right ankle"
+ amputation_point = "right ankle"
+
+/obj/item/organ/external/hand
+ limb_name = "l_hand"
+ name = "left hand"
+ icon_name = "l_hand"
+ health = 30
+ min_broken_damage = 15
+ body_part = HAND_LEFT
+ parent_organ = "l_arm"
+ joint = "left wrist"
+ amputation_point = "left wrist"
+ can_grasp = 1
+
+/obj/item/organ/external/hand/removed()
+ owner.u_equip(owner.gloves)
+ ..()
+
+/obj/item/organ/external/hand/right
+ limb_name = "r_hand"
+ name = "right hand"
+ icon_name = "r_hand"
+ body_part = HAND_RIGHT
+ parent_organ = "r_arm"
+ joint = "right wrist"
+ amputation_point = "right wrist"
+
+/obj/item/organ/external/head
+ limb_name = "head"
+ icon_name = "head"
+ name = "head"
+ health = 75
+ min_broken_damage = 35
+ body_part = HEAD
+ vital = 1
+ parent_organ = "chest"
+ joint = "jaw"
+ amputation_point = "neck"
+ gendered_icon = 1
+ encased = "skull"
+ var/can_intake_reagents = 1
+
+/obj/item/organ/external/head/removed()
+ if(owner)
+ name = "[owner.real_name]'s head"
+ owner.u_equip(owner.glasses)
+ owner.u_equip(owner.head)
+ owner.u_equip(owner.l_ear)
+ owner.u_equip(owner.r_ear)
+ owner.u_equip(owner.wear_mask)
+ spawn(1)
+ owner.update_hair()
+ ..()
+
+/obj/item/organ/external/head/take_damage(brute, burn, sharp, edge, used_weapon = null, list/forbidden_limbs = list())
+ ..(brute, burn, sharp, edge, used_weapon, forbidden_limbs)
+ if (!disfigured)
+ if (brute_dam > 40)
+ if (prob(50))
+ disfigure("brute")
+ if (burn_dam > 40)
+ disfigure("burn")
diff --git a/code/modules/organs/subtypes/unbreakable.dm b/code/modules/organs/subtypes/unbreakable.dm
new file mode 100644
index 0000000000..137249e747
--- /dev/null
+++ b/code/modules/organs/subtypes/unbreakable.dm
@@ -0,0 +1,44 @@
+// Slime limbs.
+/obj/item/organ/external/chest/unbreakable
+ cannot_break = 1
+ dislocated = -1
+
+/obj/item/organ/external/groin/unbreakable
+ cannot_break = 1
+ dislocated = -1
+
+/obj/item/organ/external/arm/unbreakable
+ cannot_break = 1
+ dislocated = -1
+
+/obj/item/organ/external/arm/right/unbreakable
+ cannot_break = 1
+ dislocated = -1
+
+/obj/item/organ/external/leg/unbreakable
+ cannot_break = 1
+ dislocated = -1
+
+/obj/item/organ/external/leg/right/unbreakable
+ cannot_break = 1
+ dislocated = -1
+
+/obj/item/organ/external/foot/unbreakable
+ cannot_break = 1
+ dislocated = -1
+
+/obj/item/organ/external/foot/right/unbreakable
+ cannot_break = 1
+ dislocated = -1
+
+/obj/item/organ/external/hand/unbreakable
+ cannot_break = 1
+ dislocated = -1
+
+/obj/item/organ/external/hand/right/unbreakable
+ cannot_break = 1
+ dislocated = -1
+
+/obj/item/organ/external/head/unbreakable
+ cannot_break = 1
+ dislocated = -1
diff --git a/code/modules/organs/subtypes/xenos.dm b/code/modules/organs/subtypes/xenos.dm
new file mode 100644
index 0000000000..0b1233085f
--- /dev/null
+++ b/code/modules/organs/subtypes/xenos.dm
@@ -0,0 +1,52 @@
+//XENOMORPH ORGANS
+/obj/item/organ/xenos
+ name = "xeno organ"
+ icon = 'icons/effects/blood.dmi'
+ desc = "It smells like an accident in a chemical factory."
+
+/obj/item/organ/xenos/eggsac
+ name = "egg sac"
+ parent_organ = "groin"
+ icon_state = "xgibmid1"
+ organ_tag = "egg sac"
+
+/obj/item/organ/xenos/plasmavessel
+ name = "plasma vessel"
+ parent_organ = "chest"
+ icon_state = "xgibdown1"
+ organ_tag = "plasma vessel"
+ var/stored_plasma = 0
+ var/max_plasma = 500
+
+/obj/item/organ/xenos/plasmavessel/queen
+ name = "bloated plasma vessel"
+ stored_plasma = 200
+ max_plasma = 500
+
+/obj/item/organ/xenos/plasmavessel/sentinel
+ stored_plasma = 100
+ max_plasma = 250
+
+/obj/item/organ/xenos/plasmavessel/hunter
+ name = "tiny plasma vessel"
+ stored_plasma = 100
+ max_plasma = 150
+
+/obj/item/organ/xenos/acidgland
+ name = "acid gland"
+ parent_organ = "head"
+ icon_state = "xgibtorso"
+ organ_tag = "acid gland"
+
+/obj/item/organ/xenos/hivenode
+ name = "hive node"
+ parent_organ = "chest"
+ icon_state = "xgibmid2"
+ organ_tag = "hive node"
+
+/obj/item/organ/xenos/resinspinner
+ name = "resin spinner"
+ parent_organ = "head"
+ icon_state = "xgibmid2"
+ organ_tag = "resin spinner"
+
diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm
index 0d052d9114..b7b34d8a8f 100644
--- a/code/modules/paperwork/pen.dm
+++ b/code/modules/paperwork/pen.dm
@@ -51,66 +51,55 @@
msg_admin_attack("[user.name] ([user.ckey]) Used the [name] to stab [M.name] ([M.ckey]) (JMP)")
return
+/*
+ * Reagent pens
+ */
+
+/obj/item/weapon/pen/reagent
+ flags = OPENCONTAINER
+ slot_flags = SLOT_BELT
+ origin_tech = list(TECH_MATERIAL = 2, TECH_ILLEGAL = 5)
+
+/obj/item/weapon/pen/reagent/New()
+ ..()
+ create_reagents(30)
+
+/obj/item/weapon/pen/reagent/attack(mob/living/M as mob, mob/user as mob)
+
+ if(!istype(M))
+ return
+
+ . = ..()
+
+ if(M.can_inject(user,1))
+ if(reagents.total_volume)
+ if(M.reagents)
+ var/contained_reagents = reagents.get_reagents()
+ var/trans = reagents.trans_to_mob(M, 30, CHEM_BLOOD)
+ admin_inject_log(user, M, src, contained_reagents, trans)
/*
* Sleepy Pens
*/
-/obj/item/weapon/pen/sleepypen
+/obj/item/weapon/pen/reagent/sleepy
desc = "It's a black ink pen with a sharp point and a carefully engraved \"Waffle Co.\""
- flags = OPENCONTAINER
- slot_flags = SLOT_BELT
- origin_tech = "materials=2;syndicate=5"
+ origin_tech = list(TECH_MATERIAL = 2, TECH_ILLEGAL = 5)
-
-/obj/item/weapon/pen/sleepypen/New()
- var/datum/reagents/R = new/datum/reagents(30) //Used to be 300
- reagents = R
- R.my_atom = src
- R.add_reagent("chloralhydrate", 22) //Used to be 100 sleep toxin//30 Chloral seems to be fatal, reducing it to 22./N
+/obj/item/weapon/pen/reagent/sleepy/New()
..()
- return
-
-
-/obj/item/weapon/pen/sleepypen/attack(mob/M as mob, mob/user as mob)
- if(!(istype(M,/mob)))
- return
- ..()
- if(reagents.total_volume)
- if(M.reagents) reagents.trans_to_mob(M, 50, CHEM_BLOOD) //used to be 150
- return
+ reagents.add_reagent("chloralhydrate", 22) //Used to be 100 sleep toxin//30 Chloral seems to be fatal, reducing it to 22./N
/*
* Parapens
*/
- /obj/item/weapon/pen/paralysis
- flags = OPENCONTAINER
- slot_flags = SLOT_BELT
+ /obj/item/weapon/pen/reagent/paralysis
origin_tech = "materials=2;syndicate=5"
-
-/obj/item/weapon/pen/paralysis/attack(mob/living/M as mob, mob/user as mob)
-
- if(!(istype(M,/mob)))
- return
-
+/obj/item/weapon/pen/reagent/paralysis/New()
..()
-
-
- if(M.can_inject(user,1))
- if(reagents.total_volume)
- if(M.reagents) reagents.trans_to_mob(M, 50, CHEM_BLOOD)
- return
-
-
-/obj/item/weapon/pen/paralysis/New()
- var/datum/reagents/R = new/datum/reagents(50)
- reagents = R
- R.my_atom = src
- R.add_reagent("zombiepowder", 10)
- R.add_reagent("cryptobiolin", 15)
- ..()
- return
+ reagents.add_reagent("zombiepowder", 10)
+ reagents.add_reagent("cryptobiolin", 15)
/*
* Chameleon pen
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 34f3525191..5409348af6 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -83,17 +83,13 @@
var/lastused_charging = 0
var/lastused_total = 0
var/main_status = 0
+ var/mob/living/silicon/ai/hacker = null // Malfunction var. If set AI hacked the APC and has full control.
var/wiresexposed = 0
powernet = 0 // set so that APCs aren't found as powernet nodes //Hackish, Horrible, was like this before I changed it :(
- var/malfhack = 0 //New var for my changes to AI malf. --NeoFite
- var/mob/living/silicon/ai/malfai = null //See above --NeoFite
var/debug= 0
var/autoflag= 0 // 0 = off, 1= eqp and lights off, 2 = eqp off, 3 = all on.
-// luminosity = 1
var/has_electronics = 0 // 0 - none, 1 - plugged in, 2 - secured by screwdriver
- var/overload = 1 //used for the Blackout malf module
var/beenhit = 0 // used for counting how many times it has been hit, used for Aliens at the moment
- var/mob/living/silicon/ai/occupier = null
var/longtermpower = 10
var/datum/wires/apc/wires = null
var/update_state = -1
@@ -156,22 +152,16 @@
init()
else
area = get_area(src)
- area.apc |= src
+ area.apc = src
opened = 1
operating = 0
name = "[area.name] APC"
stat |= MAINT
src.update_icon()
-/obj/machinery/power/apc/initialize()
- ..()
- src.update()
-
/obj/machinery/power/apc/Destroy()
- if(operating && malf && src.z in config.station_levels) //if (is_type_in_list(get_area(src), the_station_areas))
- malf.hacked_apcs -= src
-
- area.apc -= src
+ src.update()
+ area.apc = null
area.power_light = 0
area.power_equip = 0
area.power_environ = 0
@@ -185,6 +175,11 @@
if(terminal)
qdel(terminal)
terminal = null
+
+ // Malf AI, removes the APC from AI's hacked APCs list.
+ if((hacker) && (hacker.hacked_apcs) && (src in hacker.hacked_apcs))
+ hacker.hacked_apcs -= src
+
..()
/obj/machinery/power/apc/proc/make_terminal()
@@ -210,7 +205,7 @@
else
src.area = get_area_name(areastring)
name = "\improper [area.name] APC"
- area.apc |= src
+ area.apc = src
update_icon()
make_terminal()
@@ -237,8 +232,8 @@
else
if (stat & MAINT)
user << "The cover is closed. Something wrong with it: it doesn't work."
- else if (malfhack)
- user << "The cover is broken. It may be hard to force it open."
+ else if (hacker)
+ user << "The cover is locked."
else
user << "The cover is closed."
@@ -342,7 +337,7 @@
update_state |= UPSTATE_OPENED1
if(opened==2)
update_state |= UPSTATE_OPENED2
- else if(emagged || malfai)
+ else if(emagged || hacker)
update_state |= UPSTATE_BLUESCREEN
else if(wiresexposed)
update_state |= UPSTATE_WIREEXP
@@ -421,7 +416,7 @@
if(do_after(user, 50))
if (has_electronics==1)
has_electronics = 0
- if ((stat & BROKEN) || malfhack)
+ if ((stat & BROKEN))
user.visible_message(\
"[user.name] has broken the power control board inside [src.name]!",\
"You broke the charred power control board and remove the remains.",
@@ -435,7 +430,7 @@
else if (opened!=2) //cover isn't removed
opened = 0
update_icon()
- else if (istype(W, /obj/item/weapon/crowbar) && !((stat & BROKEN) || malfhack) )
+ else if (istype(W, /obj/item/weapon/crowbar) && !((stat & BROKEN) || hacker) )
if(coverlocked && !(stat & MAINT))
user << "The cover is locked and cannot be opened."
return
@@ -452,7 +447,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
@@ -497,6 +492,8 @@
user << "You must close the panel"
else if(stat & (BROKEN|MAINT))
user << "Nothing happens."
+ else if(hacker)
+ user << "Access denied."
else
if(src.allowed(usr) && !isWireCut(APC_WIRE_IDSCAN))
locked = !locked
@@ -504,7 +501,7 @@
update_icon()
else
user << "Access denied."
- else if (istype(W, /obj/item/weapon/card/emag) && !(emagged || malfhack)) // trying to unlock with an emag card
+ else if (istype(W, /obj/item/weapon/card/emag) && !(emagged || hacker)) // trying to unlock with an emag card
if(opened)
user << "You must close the cover to swipe an ID card."
else if(wiresexposed)
@@ -566,7 +563,7 @@
new /obj/item/stack/cable_coil(loc,10)
user << "You cut the cables and dismantle the power terminal."
qdel(terminal)
- else if (istype(W, /obj/item/weapon/module/power_control) && opened && has_electronics==0 && !((stat & BROKEN) || malfhack))
+ else if (istype(W, /obj/item/weapon/module/power_control) && opened && has_electronics==0 && !((stat & BROKEN)))
user.visible_message("[user.name] inserts the power control board into [src].", \
"You start to insert the power control board into the frame...")
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
@@ -575,7 +572,7 @@
has_electronics = 1
user << "You place the power control board inside the frame."
qdel(W)
- else if (istype(W, /obj/item/weapon/module/power_control) && opened && has_electronics==0 && ((stat & BROKEN) || malfhack))
+ else if (istype(W, /obj/item/weapon/module/power_control) && opened && has_electronics==0 && ((stat & BROKEN)))
user << "You cannot put the board inside, the frame is damaged."
return
else if (istype(W, /obj/item/weapon/weldingtool) && opened && has_electronics==0 && !terminal)
@@ -589,8 +586,8 @@
playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
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)
+ if (emagged || (stat & BROKEN) || opened==2)
+ 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.",\
@@ -612,7 +609,7 @@
"You replace the damaged APC frontal panel with a new one.")
qdel(W)
update_icon()
- else if (istype(W, /obj/item/apc_frame) && opened && ((stat & BROKEN) || malfhack))
+ else if (istype(W, /obj/item/apc_frame) && opened && ((stat & BROKEN) || hacker))
if (has_electronics)
user << "You cannot repair this APC until you remove the electronics still inside."
return
@@ -624,13 +621,14 @@
"You replace the damaged APC frame with new one.")
qdel(W)
stat &= ~BROKEN
- malfai = null
- malfhack = 0
+ // Malf AI, removes the APC from AI's hacked APCs list.
+ if(hacker && hacker.hacked_apcs && src in hacker.hacked_apcs)
+ hacker.hacked_apcs -= src
if (opened==2)
opened = 1
update_icon()
else
- if (((stat & BROKEN) || malfhack) \
+ if (((stat & BROKEN) || hacker) \
&& !opened \
&& W.force >= 5 \
&& W.w_class >= 3.0 \
@@ -664,34 +662,7 @@
if(istype(user,/mob/living/carbon/human))
var/mob/living/carbon/human/H = user
- if(H.species.flags & IS_SYNTHETIC && H.a_intent == I_GRAB)
- if(emagged || stat & BROKEN)
- var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
- s.set_up(3, 1, src)
- s.start()
- H << "\red The APC power currents surge eratically, damaging your chassis!"
- H.adjustFireLoss(10,0)
- else if(src.cell && src.cell.charge > 0)
- if(H.nutrition < 450)
-
- if(src.cell.charge >= 500)
- H.nutrition += 50
- src.cell.charge -= 500
- else
- H.nutrition += src.cell.charge/10
- src.cell.charge = 0
-
- user << "\blue You slot your fingers into the APC interface and siphon off some of the stored charge for your own use."
- if(src.cell.charge < 0) src.cell.charge = 0
- if(H.nutrition > 500) H.nutrition = 500
- src.charging = 1
-
- else
- user << "\blue You are already fully charged."
- else
- user << "There is no charge to draw from that APC."
- return
- else if(H.species.can_shred(H))
+ if(H.species.can_shred(H))
user.visible_message("\red [user.name] slashes at the [src.name]!", "\blue You slash at the [src.name]!")
playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1)
@@ -714,7 +685,7 @@
if(cell)
user.put_in_hands(cell)
cell.add_fingerprint(user)
- cell.updateicon()
+ cell.update_icon()
src.cell = null
user.visible_message("[user.name] removes the power cell from [src.name]!",\
@@ -743,21 +714,6 @@
return ui_interact(user)
-/obj/machinery/power/apc/proc/get_malf_status(mob/user)
- if (malf && (user.mind in malf.current_antagonists) && istype(user, /mob/living/silicon/ai))
- if (src.malfai == (user:parent ? user:parent : user))
- if (src.occupier == user)
- return 3 // 3 = User is shunted in this APC
- else if (istype(user.loc, /obj/machinery/power/apc))
- return 4 // 4 = User is shunted in another APC
- else
- return 2 // 2 = APC hacked by user, and user is in its core.
- else
- return 1 // 1 = APC not hacked.
- else
- return 0 // 0 = User is not a Malf AI
-
-
/obj/machinery/power/apc/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
if(!user)
return
@@ -773,7 +729,6 @@
"totalCharging" = round(lastused_charging),
"coverLocked" = coverlocked,
"siliconUser" = istype(user, /mob/living/silicon),
- "malfStatus" = get_malf_status(user),
"powerChannels" = list(
list(
@@ -863,23 +818,22 @@
return 0
autoflag = 5
if (istype(user, /mob/living/silicon))
+ var/permit = 0 // Malfunction variable. If AI hacks APC it can control it even without AI control wire.
var/mob/living/silicon/ai/AI = user
var/mob/living/silicon/robot/robot = user
- if ( \
- src.aidisabled || \
- malfhack && istype(malfai) && \
- ( \
- (istype(AI) && (malfai!=AI && malfai != AI.parent)) || \
- (istype(robot) && (robot in malfai.connected_robots)) \
- ) \
- )
+ if(hacker)
+ if(hacker == AI)
+ permit = 1
+ else if(istype(robot) && robot.connected_ai && robot.connected_ai == hacker) // Cyborgs can use APCs hacked by their AI
+ permit = 1
+
+ if(aidisabled && !permit)
if(!loud)
user << "\The [src] have AI control disabled!"
return 0
else
- if ((!in_range(src, user) || !istype(src.loc, /turf)))
+ if ((!in_range(src, user) || !istype(src.loc, /turf) || hacker)) // AI-hacked APCs cannot be controlled by other AIs, unlinked cyborgs or humans.
return 0
-
var/mob/living/carbon/human/H = user
if (istype(H))
if(H.getBrainLoss() >= 60)
@@ -936,28 +890,6 @@
if(istype(usr, /mob/living/silicon))
src.overload_lighting()
- else if (href_list["malfhack"])
- var/mob/living/silicon/ai/malfai = usr
- if(get_malf_status(malfai)==1)
- if (malfai.malfhacking)
- malfai << "You are already hacking an APC."
- return 1
- malfai << "Beginning override of APC systems. This takes some time, and you cannot perform other actions during the process."
- malfai.malfhack = src
- malfai.malfhacking = 1
- sleep(600)
- if(src)
- if (!src.aidisabled)
- malfai.malfhack = null
- malfai.malfhacking = 0
- locked = 1
- if(usr:parent)
- src.malfai = usr:parent
- else
- src.malfai = usr
- malfai << "Hack complete. The APC is now under your exclusive control."
- update_icon()
-
else if (href_list["toggleaccess"])
if(istype(usr, /mob/living/silicon))
if(emagged || (stat & (BROKEN|MAINT)))
@@ -974,25 +906,21 @@
update_icon()
/obj/machinery/power/apc/proc/ion_act()
- //intended to be exactly the same as an AI malf attack
- if(!src.malfhack && src.z in config.station_levels)
- if(prob(3))
- src.locked = 1
- if (src.cell.charge > 0)
-// world << "\red blew APC in [src.loc.loc]"
- src.cell.charge = 0
- cell.corrupt()
- src.malfhack = 1
- update_icon()
- var/datum/effect/effect/system/smoke_spread/smoke = new /datum/effect/effect/system/smoke_spread()
- smoke.set_up(3, 0, src.loc)
- smoke.attach(src)
- smoke.start()
- var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
- s.set_up(3, 1, src)
- s.start()
- visible_message("The [src.name] suddenly lets out a blast of smoke and some sparks!", \
- "You hear sizzling electronics.")
+ if(prob(3))
+ src.locked = 1
+ if (src.cell.charge > 0)
+ src.cell.charge = 0
+ cell.corrupt()
+ update_icon()
+ var/datum/effect/effect/system/smoke_spread/smoke = new /datum/effect/effect/system/smoke_spread()
+ smoke.set_up(3, 0, src.loc)
+ smoke.attach(src)
+ smoke.start()
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(3, 1, src)
+ s.start()
+ visible_message("The [src.name] suddenly lets out a blast of smoke and some sparks!", \
+ "You hear sizzling electronics.")
/obj/machinery/power/apc/surplus()
@@ -1195,8 +1123,6 @@ obj/machinery/power/apc/proc/autoset(var/val, var/on)
/obj/machinery/power/apc/emp_act(severity)
if(cell)
cell.emp_act(severity)
- if(occupier)
- occupier.emp_act(severity)
lighting = 0
equipment = 0
@@ -1273,4 +1199,14 @@ obj/machinery/power/apc/proc/autoset(var/val, var/on)
else
return 0
+// Malfunction: Transfers APC under AI's control
+/obj/machinery/power/apc/proc/ai_hack(var/mob/living/silicon/ai/A = null)
+ if(!A || !A.hacked_apcs || hacker || aidisabled || A.stat == DEAD)
+ return 0
+ src.hacker = A
+ A.hacked_apcs += src
+ locked = 1
+ update_icon()
+ return 1
+
#undef APC_UPDATE_ICON_COOLDOWN
diff --git a/code/modules/power/batteryrack.dm b/code/modules/power/batteryrack.dm
index ee6a0dfd9c..a70b19421e 100644
--- a/code/modules/power/batteryrack.dm
+++ b/code/modules/power/batteryrack.dm
@@ -87,8 +87,6 @@
M.state = 2
M.icon_state = "box_1"
for(var/obj/I in component_parts)
- if(I.reliability != 100 && crit_fail)
- I.crit_fail = 1
I.loc = src.loc
qdel(src)
return 1
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index e5be56b944..d883054b1b 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -519,14 +519,12 @@ obj/structure/cable/proc/cableColor(var/colorC)
if(!(S.status & ORGAN_ROBOT) || user.a_intent != "help")
return ..()
- if(H.species.flags & IS_SYNTHETIC)
- if(M == user)
- user << "\red You can't repair damage to your own body - it's against OH&S."
- return
-
if(S.burn_dam > 0 && use(1))
- S.heal_damage(0,15,0,1)
- user.visible_message("\red \The [user] repairs some burn damage on \the [M]'s [S.name] with \the [src].")
+ if(S.burn_dam < ROBOLIMB_SELF_REPAIR_CAP)
+ S.heal_damage(0,15,0,1)
+ user.visible_message("\red \The [user] repairs some burn damage on \the [M]'s [S.name] with \the [src].")
+ else
+ user << "\red The damage is far too severe to patch over externally."
return
else
user << "Nothing to fix!"
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index 6523e2f85f..ebae74cd27 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -8,9 +8,9 @@
/obj/item/weapon/cell/initialize()
..()
- updateicon()
+ update_icon()
-/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,11 +18,11 @@
if(charge <= 0)
return 0
- var/cell_amt = min((amount * CELLRATE), charge)
- use(cell_amt)
- return cell_amt / CELLRATE
+ var/cell_amt = power * CELLRATE
-/obj/item/weapon/cell/proc/updateicon()
+ return use(cell_amt) / CELLRATE
+
+/obj/item/weapon/cell/update_icon()
overlays.Cut()
if(charge < 0.01)
@@ -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)
@@ -54,12 +67,6 @@
if(maxcharge < amount) return 0
var/amount_used = min(maxcharge-charge,amount)
- if(crit_fail) return 0
- if(!prob(reliability))
- minor_fault++
- if(prob(minor_fault))
- crit_fail = 1
- return 0
charge += amount_used
return amount_used
@@ -72,8 +79,6 @@
user << "[desc]\nThe manufacturer's label states this cell has a power rating of [maxcharge], and that you should not swallow it.\nThe charge meter reads [round(src.percent() )]%."
else
user << "This power cell has an exciting chrome finish, as it is an uber-capacity cell type! It has a power rating of [maxcharge]!\nThe charge meter reads [round(src.percent() )]%."
- if(crit_fail)
- user << "\red This power cell seems to be faulty."
/obj/item/weapon/cell/attackby(obj/item/W, mob/user)
..()
@@ -134,8 +139,6 @@
charge -= maxcharge / severity
if (charge < 0)
charge = 0
- if(reliability != 100 && prob(50/severity))
- reliability -= 10 / severity
..()
/obj/item/weapon/cell/ex_act(severity)
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/pacman2.dm b/code/modules/power/pacman2.dm
index 0664c529d2..1060a466de 100644
--- a/code/modules/power/pacman2.dm
+++ b/code/modules/power/pacman2.dm
@@ -43,21 +43,16 @@
RefreshParts()
var/temp_rating = 0
- var/temp_reliability = 0
for(var/obj/item/weapon/stock_parts/SP in component_parts)
if(istype(SP, /obj/item/weapon/stock_parts/matter_bin))
//max_coins = SP.rating * SP.rating * 1000
else if(istype(SP, /obj/item/weapon/stock_parts/micro_laser) || istype(SP, /obj/item/weapon/stock_parts/capacitor))
temp_rating += SP.rating
- for(var/obj/item/weapon/CP in component_parts)
- temp_reliability += CP.reliability
- reliability = min(round(temp_reliability / 4), 100)
power_gen = round(initial(power_gen) * (max(2, temp_rating) / 2))
examine(mob/user)
..(user)
user << "\blue The generator has [P.air_contents.phoron] units of fuel left, producing [power_gen] per cycle."
- if(crit_fail) user << "\red The generator seems to have broken down."
handleInactive()
heat -= 2
@@ -108,8 +103,6 @@
else if(istype(O, /obj/item/weapon/crowbar) && !open)
var/obj/machinery/constructable_frame/machine_frame/new_frame = new /obj/machinery/constructable_frame/machine_frame(src.loc)
for(var/obj/item/I in component_parts)
- if(I.reliability < 100)
- I.crit_fail = 1
I.loc = src.loc
new_frame.state = 2
new_frame.icon_state = "box_1"
@@ -159,7 +152,7 @@
src.add_fingerprint(usr)
if(href_list["action"])
if(href_list["action"] == "enable")
- if(!active && HasFuel() && !crit_fail)
+ if(!active && HasFuel())
active = 1
icon_state = "portgen1"
src.updateUsrDialog()
diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm
index bd113ff268..a37c41a0aa 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -15,7 +15,7 @@
var/power_output = 1
/obj/machinery/power/port_gen/proc/IsBroken()
- return (crit_fail || (stat & (BROKEN|EMPED)))
+ return (stat & (BROKEN|EMPED))
/obj/machinery/power/port_gen/proc/HasFuel() //Placeholder for fuel check.
return 1
@@ -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"
/*
@@ -137,13 +137,6 @@
else if(istype(SP, /obj/item/weapon/stock_parts/micro_laser) || istype(SP, /obj/item/weapon/stock_parts/capacitor))
temp_rating += SP.rating
- var/temp_reliability = 0
- var/part_count = 0
- for(var/obj/item/weapon/CP in component_parts)
- temp_reliability += CP.reliability
- part_count++
-
- reliability = min(round(temp_reliability / part_count), 100)
power_gen = round(initial(power_gen) * (max(2, temp_rating) / 2))
/obj/machinery/power/port_gen/pacman/examine(mob/user)
@@ -162,19 +155,12 @@
//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
/obj/machinery/power/port_gen/pacman/UseFuel()
- //break down sometimes
- if (reliability < 100)
- if (prob(1) && prob(1) && prob(100 - reliability))
- stat |= BROKEN
- crit_fail = 1
- if (prob(100 - reliability))
- explode()
//how much material are we using this iteration?
var/needed_sheets = power_output / time_per_sheet
@@ -214,7 +200,11 @@
else if (temperature > upper_limit)
bias = max(round((temperature - average)/TEMPERATURE_DIVISOR, 1), -TEMPERATURE_CHANGE_MAX)
- temperature += rand(-7 + bias, 7 + bias)
+ //limit temperature increase so that it cannot raise temperature above upper_limit,
+ //or if it is already above upper_limit, limit the increase to 0.
+ var/inc_limit = max(upper_limit - temperature, 0)
+ var/dec_limit = min(temperature - lower_limit, 0)
+ temperature += between(dec_limit, rand(-7 + bias, 7 + bias), inc_limit)
if (temperature > max_temperature)
overheat()
@@ -403,7 +393,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 +420,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/powernet.dm b/code/modules/power/powernet.dm
index e8d42bd2bd..1d5711b4b3 100644
--- a/code/modules/power/powernet.dm
+++ b/code/modules/power/powernet.dm
@@ -149,7 +149,6 @@
return C
return null
+
/area/proc/get_apc()
- var/obj/machinery/power/apc/FINDME = locate() in src
- if (FINDME)
- return FINDME
+ return apc
diff --git a/code/modules/power/rust/circuits_and_design.dm b/code/modules/power/rust/circuits_and_design.dm
index 441da2e4aa..0b76e5eb41 100644
--- a/code/modules/power/rust/circuits_and_design.dm
+++ b/code/modules/power/rust/circuits_and_design.dm
@@ -1,20 +1,10 @@
-#define IMPRINTER 1 //For circuits. Uses glass/chemicals.
//////////////////////////////////////
// RUST Core Control computer
/obj/item/weapon/circuitboard/rust_core_control
name = "Circuit board (RUST core controller)"
build_path = "/obj/machinery/computer/rust_core_control"
- origin_tech = "programming=4;engineering=4"
-
-datum/design/rust_core_control
- name = "Circuit Design (RUST core controller)"
- desc = "Allows for the construction of circuit boards used to build a core control console for the RUST fusion engine."
- id = "rust_core_control"
- req_tech = list("programming" = 4, "engineering" = 4)
- build_type = IMPRINTER
- materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/rust_core_control"
+ origin_tech = list(TECH_DATA = 4, TECH_ENGINERING = 4)
//////////////////////////////////////
// RUST Fuel Control computer
@@ -22,16 +12,7 @@ datum/design/rust_core_control
/obj/item/weapon/circuitboard/rust_fuel_control
name = "Circuit board (RUST fuel controller)"
build_path = "/obj/machinery/computer/rust_fuel_control"
- origin_tech = "programming=4;engineering=4"
-
-datum/design/rust_fuel_control
- name = "Circuit Design (RUST fuel controller)"
- desc = "Allows for the construction of circuit boards used to build a fuel injector control console for the RUST fusion engine."
- id = "rust_fuel_control"
- req_tech = list("programming" = 4, "engineering" = 4)
- build_type = IMPRINTER
- materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/rust_fuel_control"
+ origin_tech = list(TECH_DATA = 4, TECH_ENGINERING = 4)
//////////////////////////////////////
// RUST Fuel Port board
@@ -39,16 +20,7 @@ datum/design/rust_fuel_control
/obj/item/weapon/module/rust_fuel_port
name = "Internal circuitry (RUST fuel port)"
icon_state = "card_mod"
- origin_tech = "engineering=4;materials=5"
-
-datum/design/rust_fuel_port
- name = "Internal circuitry (RUST fuel port)"
- desc = "Allows for the construction of circuit boards used to build a fuel injection port for the RUST fusion engine."
- id = "rust_fuel_port"
- req_tech = list("engineering" = 4, "materials" = 5)
- build_type = IMPRINTER
- materials = list("$glass" = 2000, "sacid" = 20, "$uranium" = 3000)
- build_path = "/obj/item/weapon/module/rust_fuel_port"
+ origin_tech = list(TECH_ENGINERING = 4, TECH_MATERIAL = 5)
//////////////////////////////////////
// RUST Fuel Compressor board
@@ -56,16 +28,7 @@ datum/design/rust_fuel_port
/obj/item/weapon/module/rust_fuel_compressor
name = "Internal circuitry (RUST fuel compressor)"
icon_state = "card_mod"
- origin_tech = "materials=6;phorontech=4"
-
-datum/design/rust_fuel_compressor
- name = "Circuit Design (RUST fuel compressor)"
- desc = "Allows for the construction of circuit boards used to build a fuel compressor of the RUST fusion engine."
- id = "rust_fuel_compressor"
- req_tech = list("materials" = 6, "phorontech" = 4)
- build_type = IMPRINTER
- materials = list("$glass" = 2000, "sacid" = 20, "$phoron" = 3000, "$diamond" = 1000)
- build_path = "/obj/item/weapon/module/rust_fuel_compressor"
+ origin_tech = list(TECH_MATERIAL = 6, TECH_PHORON = 4)
//////////////////////////////////////
// RUST Tokamak Core board
@@ -74,7 +37,7 @@ datum/design/rust_fuel_compressor
name = "Internal circuitry (RUST tokamak core)"
build_path = "/obj/machinery/power/rust_core"
board_type = "machine"
- origin_tech = "bluespace=3;phorontech=4;magnets=5;powerstorage=6"
+ origin_tech = list(TECH_BLUESPACE = 3, TECH_PHORON = 4, TECH_MAGNET = 5, TECH_POWER = 6)
req_components = list(
"/obj/item/weapon/stock_parts/manipulator/pico" = 2,
"/obj/item/weapon/stock_parts/micro_laser/ultra" = 1,
@@ -82,16 +45,6 @@ datum/design/rust_fuel_compressor
"/obj/item/weapon/stock_parts/console_screen" = 1,
"/obj/item/stack/cable_coil" = 5)
-datum/design/rust_core
- name = "Internal circuitry (RUST tokamak core)"
- desc = "The circuit board that for a RUST-pattern tokamak fusion core."
- id = "pacman"
- req_tech = list(bluespace = 3, phorontech = 4, magnets = 5, powerstorage = 6)
- build_type = IMPRINTER
- reliability_base = 79
- materials = list("$glass" = 2000, "sacid" = 20, "$phoron" = 3000, "$diamond" = 2000)
- build_path = "/obj/item/weapon/circuitboard/rust_core"
-
//////////////////////////////////////
// RUST Fuel Injector board
@@ -99,20 +52,10 @@ datum/design/rust_core
name = "Internal circuitry (RUST fuel injector)"
build_path = "/obj/machinery/power/rust_fuel_injector"
board_type = "machine"
- origin_tech = "powerstorage=3;engineering=4;phorontech=4;materials=6"
+ origin_tech = list(TECH_POWER = 3, TECH_ENGINERING = 4, TECH_PHORON = 4, TECH_MATERIAL = 6)
req_components = list(
"/obj/item/weapon/stock_parts/manipulator/pico" = 2,
"/obj/item/weapon/stock_parts/scanning_module/phasic" = 1,
"/obj/item/weapon/stock_parts/matter_bin/super" = 1,
"/obj/item/weapon/stock_parts/console_screen" = 1,
"/obj/item/stack/cable_coil" = 5)
-
-datum/design/rust_injector
- name = "Internal circuitry (RUST tokamak core)"
- desc = "The circuit board that for a RUST-pattern particle accelerator."
- id = "pacman"
- req_tech = list(powerstorage = 3, engineering = 4, phorontech = 4, materials = 6)
- build_type = IMPRINTER
- reliability_base = 79
- materials = list("$glass" = 2000, "sacid" = 20, "$phoron" = 3000, "$uranium" = 2000)
- build_path = "/obj/item/weapon/circuitboard/rust_core"
diff --git a/code/modules/power/smes_construction.dm b/code/modules/power/smes_construction.dm
index b2e584c136..94e628bad9 100644
--- a/code/modules/power/smes_construction.dm
+++ b/code/modules/power/smes_construction.dm
@@ -342,8 +342,6 @@
M.state = 2
M.icon_state = "box_1"
for(var/obj/I in component_parts)
- if(I.reliability != 100 && crit_fail)
- I.crit_fail = 1
I.loc = src.loc
qdel(src)
return
diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm
index 6bdef2c273..214c4867cb 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
@@ -545,6 +545,17 @@ var/list/solars_list = list()
broken()
src.density = 0
+// Used for mapping in solar array which automatically starts itself (telecomms, for example)
+/obj/machinery/power/solar_control/autostart
+ track = 2 // Auto tracking mode
+
+/obj/machinery/power/solar_control/autostart/New()
+ ..()
+ spawn(150) // Wait 15 seconds to ensure everything was set up properly (such as, powernets, solar panels, etc.
+ src.search_for_connected()
+ if(connected_tracker && track == 2)
+ connected_tracker.set_angle(sun.angle)
+ src.set_panels(cdir)
//
// MISC
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/ammunition/boxes.dm b/code/modules/projectiles/ammunition/boxes.dm
index 75b1680d0b..e909263d7b 100644
--- a/code/modules/projectiles/ammunition/boxes.dm
+++ b/code/modules/projectiles/ammunition/boxes.dm
@@ -51,7 +51,7 @@
/obj/item/ammo_magazine/mc9mm
name = "magazine (9mm)"
icon_state = "9x19p"
- origin_tech = "combat=2"
+ origin_tech = list(TECH_COMBAT = 2)
mag_type = MAGAZINE
matter = list(DEFAULT_WALL_MATERIAL = 600)
caliber = "9mm"
@@ -67,9 +67,9 @@
/obj/item/ammo_magazine/c9mm
name = "ammunition Box (9mm)"
- icon_state = "9mm"
- origin_tech = "combat=2"
- matter = list(DEFAULT_WALL_MATERIAL = 1800)
+ icon_state = "9mm"
+ origin_tech = list(TECH_COMBAT = 2)
+ matter = list(DEFAULT_WALL_MATERIAL = 1800)
caliber = "9mm"
ammo_type = /obj/item/ammo_casing/c9mm
max_ammo = 30
@@ -101,7 +101,7 @@
/obj/item/ammo_magazine/c45
name = "ammunition Box (.45)"
icon_state = "9mm"
- origin_tech = "combat=2"
+ origin_tech = list(TECH_COMBAT = 2)
caliber = ".45"
matter = list(DEFAULT_WALL_MATERIAL = 2250)
ammo_type = /obj/item/ammo_casing/c45
@@ -113,7 +113,7 @@
/obj/item/ammo_magazine/a12mm
name = "magazine (12mm)"
icon_state = "12mm"
- origin_tech = "combat=2"
+ origin_tech = list(TECH_COMBAT = 2)
mag_type = MAGAZINE
caliber = "12mm"
matter = list(DEFAULT_WALL_MATERIAL = 1500)
@@ -127,7 +127,7 @@
/obj/item/ammo_magazine/a556
name = "magazine (5.56mm)"
icon_state = "5.56"
- origin_tech = "combat=2"
+ origin_tech = list(TECH_COMBAT = 2)
mag_type = MAGAZINE
caliber = "a556"
matter = list(DEFAULT_WALL_MATERIAL = 1800)
@@ -145,7 +145,7 @@
/obj/item/ammo_magazine/a50
name = "magazine (.50)"
icon_state = "50ae"
- origin_tech = "combat=2"
+ origin_tech = list(TECH_COMBAT = 2)
mag_type = MAGAZINE
caliber = ".50"
matter = list(DEFAULT_WALL_MATERIAL = 1260)
@@ -171,7 +171,7 @@
/obj/item/ammo_magazine/a762
name = "magazine box (7.62mm)"
icon_state = "a762"
- origin_tech = "combat=2"
+ origin_tech = list(TECH_COMBAT = 2)
mag_type = MAGAZINE
caliber = "a762"
matter = list(DEFAULT_WALL_MATERIAL = 4500)
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index dc53d788f1..9e57640963 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -47,7 +47,7 @@
throw_speed = 4
throw_range = 5
force = 5
- origin_tech = "combat=1"
+ origin_tech = list(TECH_COMBAT = 1)
attack_verb = list("struck", "hit", "bashed")
zoomdevicename = "scope"
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/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index 3521b49a14..ba1340ea96 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -7,8 +7,8 @@
slot_flags = SLOT_BELT|SLOT_BACK
w_class = 3
force = 10
- matter = list(DEFAULT_WALL_MATERIAL = 2000)
- origin_tech = "combat=3;magnets=2"
+ origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 2)
+ matter = list(DEFAULT_WALL_MATERIAL = 2000)
projectile_type = /obj/item/projectile/beam
fire_delay = 1 //rapid fire
@@ -52,7 +52,7 @@ obj/item/weapon/gun/energy/retro
icon_state = "lasercannon"
item_state = null
fire_sound = 'sound/weapons/lasercannonfire.ogg'
- origin_tech = "combat=4;materials=3;powerstorage=3"
+ origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3, TECH_POWER = 3)
slot_flags = SLOT_BELT|SLOT_BACK
projectile_type = /obj/item/projectile/beam/heavylaser
charge_cost = 400
@@ -71,7 +71,7 @@ obj/item/weapon/gun/energy/retro
icon_state = "xray"
item_state = "xray"
fire_sound = 'sound/weapons/laser3.ogg'
- origin_tech = "combat=5;materials=3;magnets=2;syndicate=2"
+ origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 3, TECH_MAGNET = 2, TECH_ILLEGAL = 2)
projectile_type = /obj/item/projectile/beam/xray
charge_cost = 100
max_shots = 20
@@ -83,7 +83,7 @@ obj/item/weapon/gun/energy/retro
icon_state = "sniper"
item_state = "laser"
fire_sound = 'sound/weapons/marauder.ogg'
- origin_tech = "combat=6;materials=5;powerstorage=4"
+ origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 5, TECH_POWER = 4)
projectile_type = /obj/item/projectile/beam/sniper
slot_flags = SLOT_BACK
charge_cost = 400
@@ -107,7 +107,7 @@ obj/item/weapon/gun/energy/retro
name = "laser tag gun"
item_state = "laser"
desc = "Standard issue weapon of the Imperial Guard"
- origin_tech = "combat=1;magnets=2"
+ origin_tech = list(TECH_COMBAT = 1, TECH_MAGNET = 2)
self_recharge = 1
matter = list(DEFAULT_WALL_MATERIAL = 2000)
fire_sound = 'sound/weapons/Laser.ogg'
diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm
index adb2d7e517..fe209aeadc 100644
--- a/code/modules/projectiles/guns/energy/nuclear.dm
+++ b/code/modules/projectiles/guns/energy/nuclear.dm
@@ -7,7 +7,7 @@
max_shots = 10
projectile_type = /obj/item/projectile/beam/stun
- origin_tech = "combat=3;magnets=2"
+ origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 2)
modifystate = "energystun"
firemodes = list(
@@ -24,7 +24,7 @@
name = "advanced energy gun"
desc = "An energy gun with an experimental miniaturized reactor."
icon_state = "nucgun"
- origin_tech = "combat=3;materials=5;powerstorage=3"
+ origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 5, TECH_POWER = 3)
slot_flags = SLOT_BELT
force = 8 //looks heavier than a pistol
self_recharge = 1
@@ -44,46 +44,16 @@
charge_tick = 0
if(!power_supply) return 0
if((power_supply.charge / power_supply.maxcharge) != 1)
- if(!failcheck()) return 0
power_supply.give(charge_cost)
update_icon()
return 1
-/obj/item/weapon/gun/energy/gun/nuclear/proc/failcheck()
- lightfail = 0
- if (prob(src.reliability)) return 1 //No failure
- if (prob(src.reliability))
- for (var/mob/living/M in range(0,src)) //Only a minor failure, enjoy your radiation if you're in the same tile or carrying it
- if (src in M.contents)
- M << "Your gun feels pleasantly warm for a moment."
- else
- M << "You feel a warm sensation."
- M.apply_effect(rand(3,120), IRRADIATE)
- lightfail = 1
- else
- for (var/mob/living/M in range(rand(1,4),src)) //Big failure, TIME FOR RADIATION BITCHES
- if (src in M.contents)
- M << "Your gun's reactor overloads!"
- M << "You feel a wave of heat wash over you."
- M.apply_effect(300, IRRADIATE)
- crit_fail = 1 //break the gun so it stops recharging
- processing_objects.Remove(src)
- update_icon()
- return 0
-
-
/obj/item/weapon/gun/energy/gun/nuclear/proc/update_charge()
- if (crit_fail)
- overlays += "nucgun-whee"
- return
var/ratio = power_supply.charge / power_supply.maxcharge
ratio = round(ratio, 0.25) * 100
overlays += "nucgun-[ratio]"
/obj/item/weapon/gun/energy/gun/nuclear/proc/update_reactor()
- if(crit_fail)
- overlays += "nucgun-crit"
- return
if(lightfail)
overlays += "nucgun-medium"
else if ((power_supply.charge/power_supply.maxcharge) <= 0.5)
@@ -97,10 +67,6 @@
if("stun") overlays += "nucgun-stun"
if("lethal") overlays += "nucgun-kill"
-/obj/item/weapon/gun/energy/gun/nuclear/emp_act(severity)
- ..()
- reliability -= round(15/severity)
-
/obj/item/weapon/gun/energy/gun/nuclear/update_icon()
overlays.Cut()
update_charge()
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index d9ef1b9504..e5eadb0ae3 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -4,7 +4,7 @@
icon_state = "ionrifle"
item_state = "ionrifle"
fire_sound = 'sound/weapons/Laser.ogg'
- origin_tech = "combat=2;magnets=4"
+ origin_tech = list(TECH_COMBAT = 2, TECH_MAGNET = 4)
w_class = 4
force = 10
flags = CONDUCT
@@ -28,9 +28,9 @@
desc = "A gun that discharges high amounts of controlled radiation to slowly break a target into component elements."
icon_state = "decloner"
item_state = "decloner"
- fire_sound = 'sound/weapons/pulse3.ogg'
- origin_tech = "combat=5;materials=4;powerstorage=3"
- max_shots = 10
+ fire_sound = 'sound/weapons/pulse3.ogg'
+ origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 4, TECH_POWER = 3)
+ max_shots = 10
projectile_type = /obj/item/projectile/energy/declone
/obj/item/weapon/gun/energy/floragun
@@ -42,7 +42,7 @@
charge_cost = 100
max_shots = 10
projectile_type = /obj/item/projectile/energy/floramut
- origin_tech = "materials=2;biotech=3;powerstorage=3"
+ origin_tech = list(TECH_MATERIAL = 2, TECH_BIO = 3, TECH_POWER = 3)
modifystate = "floramut"
self_recharge = 1
@@ -95,7 +95,7 @@
icon_state = "toxgun"
fire_sound = 'sound/effects/stealthoff.ogg'
w_class = 3.0
- origin_tech = "combat=5;phorontech=4"
+ origin_tech = list(TECH_COMBAT = 5, TECH_PHORON = 4)
projectile_type = /obj/item/projectile/energy/phoron
/* Staves */
diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm
index cc40169fb5..7c8e7cf3dc 100644
--- a/code/modules/projectiles/guns/energy/stun.dm
+++ b/code/modules/projectiles/guns/energy/stun.dm
@@ -23,8 +23,8 @@
desc = "A high-tech revolver that fires stun cartridges. The stun cartridges can be recharged using a conventional energy weapon recharger."
icon_state = "stunrevolver"
item_state = "stunrevolver"
- fire_sound = 'sound/weapons/Gunshot.ogg'
- origin_tech = "combat=3;materials=3;powerstorage=2"
+ fire_sound = 'sound/weapons/Gunshot.ogg'
+ origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_POWER = 2)
projectile_type = /obj/item/projectile/energy/electrode/stunshot
max_shots = 8
@@ -35,8 +35,8 @@
icon_state = "crossbow"
w_class = 2.0
item_state = "crossbow"
- matter = list(DEFAULT_WALL_MATERIAL = 2000)
- origin_tech = "combat=2;magnets=2;syndicate=5"
+ origin_tech = list(TECH_COMBAT = 2, TECH_MAGNET = 2, TECH_ILLEGAL = 5)
+ matter = list(DEFAULT_WALL_MATERIAL = 2000)
slot_flags = SLOT_BELT
silenced = 1
fire_sound = 'sound/weapons/Genhit.ogg'
diff --git a/code/modules/projectiles/guns/energy/temperature.dm b/code/modules/projectiles/guns/energy/temperature.dm
index 47bc2cfc00..d4472e2488 100644
--- a/code/modules/projectiles/guns/energy/temperature.dm
+++ b/code/modules/projectiles/guns/energy/temperature.dm
@@ -6,7 +6,7 @@
var/temperature = T20C
var/current_temperature = T20C
charge_cost = 100
- origin_tech = "combat=3;materials=4;powerstorage=3;magnets=2"
+ origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 4, TECH_POWER = 3, TECH_MAGNET = 2)
slot_flags = SLOT_BELT|SLOT_BACK
projectile_type = /obj/item/projectile/temp
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/projectiles/guns/launcher/rocket.dm b/code/modules/projectiles/guns/launcher/rocket.dm
index fd86302fb8..9747922caf 100644
--- a/code/modules/projectiles/guns/launcher/rocket.dm
+++ b/code/modules/projectiles/guns/launcher/rocket.dm
@@ -9,7 +9,7 @@
force = 5.0
flags = CONDUCT | USEDELAY
slot_flags = 0
- origin_tech = "combat=8;materials=5"
+ origin_tech = list(TECH_COMBAT = 8, TECH_MATERIAL = 5)
fire_sound = 'sound/effects/bang.ogg'
release_force = 15
diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm
index 576488e774..2f48fcaf13 100644
--- a/code/modules/projectiles/guns/projectile.dm
+++ b/code/modules/projectiles/guns/projectile.dm
@@ -6,7 +6,7 @@
name = "gun"
desc = "A gun that fires bullets."
icon_state = "revolver"
- origin_tech = "combat=2;materials=2"
+ origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2)
w_class = 3
matter = list(DEFAULT_WALL_MATERIAL = 1000)
recoil = 1
diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm
index 2ad17537c2..bfbae584fa 100644
--- a/code/modules/projectiles/guns/projectile/automatic.dm
+++ b/code/modules/projectiles/guns/projectile/automatic.dm
@@ -6,7 +6,7 @@
load_method = SPEEDLOADER //yup. until someone sprites a magazine for it.
max_shells = 22
caliber = "9mm"
- origin_tech = "combat=4;materials=2"
+ origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 2)
slot_flags = SLOT_BELT
ammo_type = /obj/item/ammo_casing/c9mm
multi_aim = 1
@@ -25,7 +25,7 @@
load_method = SPEEDLOADER //yup. until someone sprites a magazine for it.
max_shells = 15
caliber = ".45"
- origin_tech = "combat=5;materials=2;syndicate=8"
+ origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2, TECH_ILLEGAL = 8)
ammo_type = /obj/item/ammo_casing/c45
/obj/item/weapon/gun/projectile/automatic/c20r
@@ -36,7 +36,7 @@
w_class = 3
force = 10
caliber = "12mm"
- origin_tech = "combat=5;materials=2;syndicate=8"
+ origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2, TECH_ILLEGAL = 8)
slot_flags = SLOT_BELT|SLOT_BACK
fire_sound = 'sound/weapons/Gunshot_smg.ogg'
load_method = MAGAZINE
@@ -60,7 +60,7 @@
w_class = 4
force = 10
caliber = "a762"
- origin_tech = "combat=6;materials=1;syndicate=4"
+ origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 1, TECH_ILLEGAL = 4)
slot_flags = SLOT_BACK
load_method = MAGAZINE
magazine_type = /obj/item/ammo_magazine/c762
@@ -83,7 +83,7 @@
item_state = "wt550"
w_class = 3
caliber = "9mm"
- origin_tech = "combat=5;materials=2"
+ origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2)
slot_flags = SLOT_BELT
ammo_type = "/obj/item/ammo_casing/c9mmr"
fire_sound = 'sound/weapons/Gunshot_smg.ogg'
@@ -109,7 +109,7 @@
w_class = 4
force = 10
caliber = "a556"
- origin_tech = "combat=8;materials=3"
+ origin_tech = list(TECH_COMBAT = 8, TECH_MATERIAL = 3)
ammo_type = "/obj/item/ammo_casing/a556"
fire_sound = 'sound/weapons/Gunshot.ogg'
slot_flags = SLOT_BACK
@@ -179,7 +179,7 @@
slot_flags = 0
max_shells = 50
caliber = "a762"
- origin_tech = "combat=6;materials=1;syndicate=2"
+ origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 1, TECH_ILLEGAL = 2)
slot_flags = SLOT_BACK
ammo_type = "/obj/item/ammo_casing/a762"
fire_sound = 'sound/weapons/Gunshot_smg.ogg'
diff --git a/code/modules/projectiles/guns/projectile/dartgun.dm b/code/modules/projectiles/guns/projectile/dartgun.dm
index db193a0f75..e484d95d70 100644
--- a/code/modules/projectiles/guns/projectile/dartgun.dm
+++ b/code/modules/projectiles/guns/projectile/dartgun.dm
@@ -34,7 +34,7 @@
desc = "A rack of hollow darts."
icon_state = "darts"
item_state = "rcdammo"
- origin_tech = "materials=2"
+ origin_tech = list(TECH_MATERIAL = 2)
mag_type = MAGAZINE
caliber = "dart"
ammo_type = /obj/item/ammo_casing/chemdart
diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm
index 2c116901ec..e121cbe8fe 100644
--- a/code/modules/projectiles/guns/projectile/pistol.dm
+++ b/code/modules/projectiles/guns/projectile/pistol.dm
@@ -4,7 +4,7 @@
magazine_type = /obj/item/ammo_magazine/c45m
icon_state = "colt"
caliber = ".45"
- origin_tech = "combat=2;materials=2"
+ origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2)
load_method = MAGAZINE
/obj/item/weapon/gun/projectile/colt/detective
@@ -35,7 +35,7 @@
icon_state = "secguncomp"
magazine_type = /obj/item/ammo_magazine/c45m/rubber
caliber = ".45"
- origin_tech = "combat=2;materials=2"
+ origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2)
load_method = MAGAZINE
/obj/item/weapon/gun/projectile/sec/flash
@@ -54,7 +54,7 @@
w_class = 3
caliber = ".45"
silenced = 1
- origin_tech = "combat=2;materials=2;syndicate=8"
+ origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2, TECH_ILLEGAL = 8)
load_method = MAGAZINE
magazine_type = /obj/item/ammo_magazine/c45m
@@ -89,7 +89,7 @@
max_shells = 8
caliber = "75"
fire_sound = 'sound/effects/Explosion1.ogg'
- origin_tech = "combat=3"
+ origin_tech = list(TECH_COMBAT = 3)
ammo_type = "/obj/item/ammo_casing/a75"
load_method = MAGAZINE
magazine_type = /obj/item/ammo_magazine/a75
@@ -111,7 +111,7 @@
w_class = 2
caliber = "9mm"
silenced = 0
- origin_tech = "combat=2;materials=2;syndicate=2"
+ origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2, TECH_ILLEGAL = 2)
load_method = MAGAZINE
magazine_type = /obj/item/ammo_magazine/mc9mm
diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm
index cb17710773..c036c985f7 100644
--- a/code/modules/projectiles/guns/projectile/revolver.dm
+++ b/code/modules/projectiles/guns/projectile/revolver.dm
@@ -4,7 +4,7 @@
icon_state = "revolver"
item_state = "revolver"
caliber = "357"
- origin_tech = "combat=2;materials=2"
+ origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2)
handle_casings = CYCLE_CASINGS
max_shells = 7
ammo_type = /obj/item/ammo_casing/a357
@@ -13,7 +13,7 @@
name = "mateba"
desc = "When you absolutely, positively need a 10mm hole in the other guy. Uses .357 ammo." //>10mm hole >.357
icon_state = "mateba"
- origin_tech = "combat=2;materials=2"
+ origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2)
/obj/item/weapon/gun/projectile/revolver/detective
name = "revolver"
@@ -21,7 +21,7 @@
icon_state = "detective"
max_shells = 6
caliber = "38"
- origin_tech = "combat=2;materials=2"
+ origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2)
ammo_type = /obj/item/ammo_casing/c38
/obj/item/weapon/gun/projectile/revolver/detective/verb/rename_gun()
diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm
index 1b3bb21451..21b074db7d 100644
--- a/code/modules/projectiles/guns/projectile/shotgun.dm
+++ b/code/modules/projectiles/guns/projectile/shotgun.dm
@@ -9,7 +9,7 @@
flags = CONDUCT
slot_flags = SLOT_BACK
caliber = "shotgun"
- origin_tech = "combat=4;materials=2"
+ origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 2)
load_method = SINGLE_CASING
ammo_type = /obj/item/ammo_casing/shotgun/beanbag
handle_casings = HOLD_CASINGS
@@ -43,7 +43,7 @@
name = "combat shotgun"
icon_state = "cshotgun"
item_state = "cshotgun"
- origin_tech = "combat=5;materials=2"
+ origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2)
max_shells = 7 //match the ammo box capacity, also it can hold a round in the chamber anyways, for a total of 8.
ammo_type = /obj/item/ammo_casing/shotgun
@@ -63,7 +63,7 @@
flags = CONDUCT
slot_flags = SLOT_BACK
caliber = "shotgun"
- origin_tech = "combat=3;materials=1"
+ origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 1)
ammo_type = /obj/item/ammo_casing/shotgun/beanbag
burst_delay = 0
diff --git a/code/modules/projectiles/guns/projectile/sniper.dm b/code/modules/projectiles/guns/projectile/sniper.dm
index 6c14edfaa5..b3a3c7580c 100644
--- a/code/modules/projectiles/guns/projectile/sniper.dm
+++ b/code/modules/projectiles/guns/projectile/sniper.dm
@@ -6,7 +6,7 @@
w_class = 4
force = 10
slot_flags = SLOT_BACK
- origin_tech = "combat=8;materials=2;syndicate=8"
+ origin_tech = list(TECH_COMBAT = 8, TECH_MATERIAL = 2, TECH_ILLEGAL = 8)
caliber = "14.5mm"
recoil = 2 //extra kickback
//fire_sound = 'sound/weapons/sniper.ogg'
diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm
index 775da2bbb3..84c8affc94 100644
--- a/code/modules/reagents/Chemistry-Holder.dm
+++ b/code/modules/reagents/Chemistry-Holder.dm
@@ -5,7 +5,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)
..()
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-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm
index 29482308d6..80658f4864 100644
--- a/code/modules/reagents/Chemistry-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents.dm
@@ -13,11 +13,11 @@
/datum/reagent
var/name = "Reagent"
var/id = "reagent"
- var/description = "A non-descript chemical."
+ var/description = "A non-descript chemical."
var/datum/reagents/holder = null
var/reagent_state = SOLID
var/list/data = null
- var/volume = 0
+ var/volume = 0
var/metabolism = REM // This would be 0.2 normally
var/ingest_met = 0
var/touch_met = 0
@@ -25,11 +25,11 @@
var/max_dose = 0
var/overdose = 0
var/scannable = 0 // Shows up on health analyzers.
- var/affects_dead = 0
+ var/affects_dead = 0
var/glass_icon_state = null
var/glass_name = null
var/glass_desc = null
- var/glass_center_of_mass = null
+ var/glass_center_of_mass = null
var/color = "#000000"
var/color_weight = 1
@@ -98,11 +98,11 @@
return data.Copy()
else if(data)
return data
- return null
+ return null
/datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references
..()
- holder = null
+ holder = null
/* DEPRECATED - TODO: REMOVE EVERYWHERE */
@@ -120,4 +120,4 @@
id = "woodpulp"
description = "A mass of wood fibers."
reagent_state = LIQUID
- color = "#B97A57"
+ color = "#B97A57"
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm
index d957e88a4c..c7afddee39 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm
@@ -57,6 +57,8 @@
M.adjustToxLoss(removed)
/datum/reagent/blood/affect_touch(var/mob/living/carbon/M, var/alien, var/removed)
+ if(alien == IS_MACHINE)
+ return
if(data && data["viruses"])
for(var/datum/disease/D in data["viruses"])
if(D.spread_type == SPECIAL || D.spread_type == NON_CONTAGIOUS)
@@ -181,6 +183,7 @@
description = "Required for welders. Flamable."
reagent_state = LIQUID
color = "#660000"
+ touch_met = 5
glass_icon_state = "dr_gibb_glass"
glass_name = "glass of welder fuel"
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm
index eac0f76cd2..a751b9df7e 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm
@@ -1,3 +1,31 @@
+/datum/reagent/acetone
+ name = "Acetone"
+ id = "acetone"
+ description = "A colorless liquid solvent used in chemical synthesis."
+ reagent_state = LIQUID
+ color = "#808080"
+ metabolism = REM * 0.2
+
+/datum/reagent/acetone/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ M.adjustToxLoss(removed * 3)
+
+/datum/reagent/acetone/touch_obj(var/obj/O) //I copied this wholesale from ethanol and could likely be converted into a shared proc. ~Techhead
+ if(istype(O, /obj/item/weapon/paper))
+ var/obj/item/weapon/paper/paperaffected = O
+ paperaffected.clearpaper()
+ usr << "The solution dissolves the ink on the paper."
+ return
+ if(istype(O, /obj/item/weapon/book))
+ if(volume < 5)
+ return
+ if(istype(O, /obj/item/weapon/book/tome))
+ usr << "The solution does nothing. Whatever this is, it isn't normal ink."
+ return
+ var/obj/item/weapon/book/affectedbook = O
+ affectedbook.dat = null
+ usr << "The solution dissolves the ink on the book."
+ return
+
/datum/reagent/aluminum
name = "Aluminum"
id = "aluminum"
@@ -5,6 +33,20 @@
reagent_state = SOLID
color = "#A8A8A8"
+/datum/reagent/ammonia
+ name = "Ammonia"
+ id = "ammonia"
+ description = "A caustic substance commonly used in fertilizer or household cleaners."
+ reagent_state = LIQUID
+ color = "#404030"
+ metabolism = REM * 0.5
+
+/datum/reagent/ammonia/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ if(alien == IS_VOX)
+ M.adjustOxyLoss(-removed * 10)
+ else if(alien != IS_DIONA)
+ M.adjustToxLoss(removed * 1.5)
+
/datum/reagent/carbon
name = "Carbon"
id = "carbon"
@@ -32,19 +74,6 @@
else
dirtoverlay.alpha = min(dirtoverlay.alpha + volume * 30, 255)
-/datum/reagent/chlorine
- name = "Chlorine"
- id = "chlorine"
- description = "A chemical element with a characteristic odour."
- reagent_state = GAS
- color = "#808080"
-
-/datum/reagent/chlorine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
- M.take_organ_damage(1*REM, 0)
-
-/datum/reagent/chlorine/affect_touch(var/mob/living/carbon/M, var/alien, var/removed)
- M.take_organ_damage(1*REM, 0)
-
/datum/reagent/copper
name = "Copper"
id = "copper"
@@ -57,6 +86,7 @@
description = "A well-known alcohol with a variety of applications."
reagent_state = LIQUID
color = "#404030"
+ touch_met = 5
var/nutriment_factor = 0
var/strength = 10 // This is, essentially, units between stages - the lower, the stronger. Less fine tuning, more clarity.
var/toxicity = 1
@@ -89,19 +119,19 @@
M.add_chemical_effect(CE_ALCOHOL, 1)
- if(dose / strength_mod >= strength) // Early warning
+ if(dose * strength_mod >= strength) // Early warning
M.make_dizzy(6) // It is decreased at the speed of 3 per tick
- if(dose / strength_mod >= strength * 2) // Slurring
+ if(dose * strength_mod >= strength * 2) // Slurring
M.slurring = max(M.slurring, 30)
- if(dose / strength_mod >= strength * 3) // Confusion - walking in random directions
+ if(dose * strength_mod >= strength * 3) // Confusion - walking in random directions
M.confused = max(M.confused, 20)
- if(dose / strength_mod >= strength * 4) // Blurry vision
+ if(dose * strength_mod >= strength * 4) // Blurry vision
M.eye_blurry = max(M.eye_blurry, 10)
- if(dose / strength_mod >= strength * 5) // Drowsyness - periodically falling asleep
+ if(dose * strength_mod >= strength * 5) // Drowsyness - periodically falling asleep
M.drowsyness = max(M.drowsyness, 20)
- if(dose / strength_mod >= strength * 6) // Toxic dose
+ if(dose * strength_mod >= strength * 6) // Toxic dose
M.add_chemical_effect(CE_ALCOHOL_TOXIC, toxicity)
- if(dose / strength_mod >= strength * 7) // Pass out
+ if(dose * strength_mod >= strength * 7) // Pass out
M.paralysis = max(M.paralysis, 20)
M.sleeping = max(M.sleeping, 30)
@@ -133,25 +163,26 @@
usr << "The solution dissolves the ink on the book."
return
-/datum/reagent/fluorine
- name = "Fluorine"
- id = "fluorine"
- description = "A highly-reactive chemical element."
- reagent_state = GAS
+/datum/reagent/hydrazine
+ name = "Hydrazine"
+ id = "hydrazine"
+ description = "A toxic, colorless, flammable liquid with a strong ammonia-like odor, in hydrate form."
+ reagent_state = LIQUID
color = "#808080"
+ metabolism = REM * 0.2
+ touch_met = 5
-/datum/reagent/fluorine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
- M.adjustToxLoss(removed)
+/datum/reagent/hydrazine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ M.adjustToxLoss(4 * removed)
-/datum/reagent/fluorine/affect_touch(var/mob/living/carbon/M, var/alien, var/removed)
- M.adjustToxLoss(removed)
+/datum/reagent/hydrazine/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) // Hydrazine is both toxic and flammable.
+ M.adjust_fire_stacks(removed / 12)
+ M.adjustToxLoss(0.2 * removed)
-/datum/reagent/hydrogen
- name = "Hydrogen"
- id = "hydrogen"
- description = "A colorless, odorless, nonmetallic, tasteless, highly combustible diatomic gas."
- reagent_state = GAS
- color = "#808080"
+/datum/reagent/hydrazine/touch_turf(var/turf/T)
+ new /obj/effect/decal/cleanable/liquid_fuel(T, volume)
+ remove_self(volume)
+ return
/datum/reagent/iron
name = "Iron"
@@ -193,28 +224,6 @@
M.emote(pick("twitch", "drool", "moan"))
M.adjustBrainLoss(2)
-/datum/reagent/nitrogen
- name = "Nitrogen"
- id = "nitrogen"
- description = "A colorless, odorless, tasteless gas."
- reagent_state = GAS
- color = "#808080"
-
-/datum/reagent/nitrogen/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
- if(alien == IS_VOX)
- M.adjustOxyLoss(-removed * 3)
-
-/datum/reagent/oxygen
- name = "Oxygen"
- id = "oxygen"
- description = "A colorless, odorless gas."
- reagent_state = GAS
- color = "#808080"
-
-/datum/reagent/oxygen/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
- if(alien == IS_VOX)
- M.adjustToxLoss(removed * 3)
-
/datum/reagent/phosphorus
name = "Phosphorus"
id = "phosphorus"
@@ -345,6 +354,15 @@
qdel(O)
remove_self(meltdose) // 10 units of acid will not melt EVERYTHING on the tile
+/datum/reagent/acid/hydrochloric //Like sulfuric, but less toxic and more acidic.
+ name = "Hydrochloric Acid"
+ id = "hclacid"
+ description = "A very corrosive mineral acid with the molecular formula HCl."
+ reagent_state = LIQUID
+ color = "#808080"
+ power = 3
+ meltdose = 8
+
/datum/reagent/silicon
name = "Silicon"
id = "silicon"
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm
index 97db6ceab5..2f9cc0f548 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm
@@ -226,11 +226,11 @@
M.adjustToxLoss(0.5 * removed)
/datum/reagent/capsaicin/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
- if(alien == IS_DIONA)
+ if(alien == IS_DIONA || alien == IS_MACHINE)
return
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(H.species && (H.species.flags & (NO_PAIN | IS_SYNTHETIC)))
+ if(H.species && (H.species.flags & (NO_PAIN)))
return
if(dose < 5 && (dose == metabolism || prob(5)))
M << "Your insides feel uncomfortably hot!"
@@ -307,7 +307,7 @@
/datum/reagent/condensedcapsaicin/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(H.species && (H.species.flags & (NO_PAIN | IS_SYNTHETIC)))
+ if(H.species && (H.species.flags & (NO_PAIN)))
return
if(dose == metabolism)
M << "You feel like your insides are burning!"
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm
index 0b57ef9372..51c86f1b52 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm
@@ -220,13 +220,6 @@
T.holy = 1
return
-/datum/reagent/ammonia
- name = "Ammonia"
- id = "ammonia"
- description = "A caustic substance commonly used in fertilizer or household cleaners."
- reagent_state = GAS
- color = "#404030"
-
/datum/reagent/diethylamine
name = "Diethylamine"
id = "diethylamine"
@@ -234,10 +227,10 @@
reagent_state = LIQUID
color = "#604030"
-/datum/reagent/fluorosurfactant // Foam precursor
- name = "Fluorosurfactant"
- id = "fluorosurfactant"
- description = "A perfluoronated sulfonic acid that forms a foam when mixed with water."
+/datum/reagent/surfactant // Foam precursor
+ name = "Azosurfactant"
+ id = "surfactant"
+ description = "A isocyanate liquid that forms a foam when mixed with water."
reagent_state = LIQUID
color = "#9E6B38"
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm
index 92b6b67796..9f8e05a20b 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm
@@ -44,10 +44,13 @@
reagent_state = LIQUID
color = "#9D14DB"
strength = 30
+ touch_met = 5
/datum/reagent/toxin/phoron/affect_touch(var/mob/living/carbon/M, var/alien, var/removed)
..()
M.adjust_fire_stacks(removed / 5)
+ if(prob(50))
+ M.pl_effects()
/datum/reagent/toxin/phoron/touch_turf(var/turf/simulated/T)
if(!istype(T))
@@ -226,6 +229,9 @@
affect_blood(M, alien, removed)
/datum/reagent/mutagen/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ var/mob/living/carbon/human/H = M
+ if(istype(H) && (H.species.flags & NO_SCAN))
+ return
if(M.dna)
if(prob(removed * 0.1)) // Approx. one mutation per 10 injected/20 ingested/30 touching units
randmuti(M)
diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm
index f6a0a19e95..ce9ea05717 100644
--- a/code/modules/reagents/Chemistry-Recipes.dm
+++ b/code/modules/reagents/Chemistry-Recipes.dm
@@ -24,7 +24,7 @@
//helper to define reaction rate in terms of half-life
//Ex.
//HALF_LIFE(0) -> Reaction completes immediately (default chems)
-//HALF_LIFE(1) -> Half of the reagents react immediately, the rest after 1 chemistry ticks
+//HALF_LIFE(1) -> Half of the reagents react immediately, the rest over the following ticks.
//HALF_LIFE(2) -> Half of the reagents are consumed after 2 chemistry ticks.
//HALF_LIFE(3) -> Half of the reagents are consumed after 3 chemistry ticks.
#define HALF_LIFE(ticks) (ticks? 1.0 - (0.5)**(1.0/(ticks*PROCESS_REACTION_ITER)) : 1.0)
@@ -149,21 +149,21 @@
name = "Inaprovaline"
id = "inaprovaline"
result = "inaprovaline"
- required_reagents = list("oxygen" = 1, "carbon" = 1, "sugar" = 1)
+ required_reagents = list("acetone" = 1, "carbon" = 1, "sugar" = 1)
result_amount = 3
/datum/chemical_reaction/dylovene
name = "Dylovene"
id = "anti_toxin"
result = "anti_toxin"
- required_reagents = list("silicon" = 1, "potassium" = 1, "nitrogen" = 1)
+ required_reagents = list("silicon" = 1, "potassium" = 1, "ammonia" = 1)
result_amount = 3
/datum/chemical_reaction/tramadol
name = "Tramadol"
id = "tramadol"
result = "tramadol"
- required_reagents = list("inaprovaline" = 1, "ethanol" = 1, "oxygen" = 1)
+ required_reagents = list("inaprovaline" = 1, "ethanol" = 1, "acetone" = 1)
result_amount = 3
/datum/chemical_reaction/paracetamol
@@ -185,35 +185,28 @@
name = "Sterilizine"
id = "sterilizine"
result = "sterilizine"
- required_reagents = list("ethanol" = 1, "anti_toxin" = 1, "chlorine" = 1)
+ required_reagents = list("ethanol" = 1, "anti_toxin" = 1, "hclacid" = 1)
result_amount = 3
/datum/chemical_reaction/silicate
name = "Silicate"
id = "silicate"
result = "silicate"
- required_reagents = list("aluminum" = 1, "silicon" = 1, "oxygen" = 1)
+ required_reagents = list("aluminum" = 1, "silicon" = 1, "acetone" = 1)
result_amount = 3
/datum/chemical_reaction/mutagen
name = "Unstable mutagen"
id = "mutagen"
result = "mutagen"
- required_reagents = list("radium" = 1, "phosphorus" = 1, "chlorine" = 1)
+ required_reagents = list("radium" = 1, "phosphorus" = 1, "hclacid" = 1)
result_amount = 3
-/datum/chemical_reaction/water
- name = "Water"
- id = "water"
- result = "water"
- required_reagents = list("oxygen" = 1, "hydrogen" = 2)
- result_amount = 1
-
/datum/chemical_reaction/thermite
name = "Thermite"
id = "thermite"
result = "thermite"
- required_reagents = list("aluminum" = 1, "iron" = 1, "oxygen" = 1)
+ required_reagents = list("aluminum" = 1, "iron" = 1, "acetone" = 1)
result_amount = 3
/datum/chemical_reaction/space_drugs
@@ -227,14 +220,14 @@
name = "Space Lube"
id = "lube"
result = "lube"
- required_reagents = list("water" = 1, "silicon" = 1, "oxygen" = 1)
+ required_reagents = list("water" = 1, "silicon" = 1, "acetone" = 1)
result_amount = 4
/datum/chemical_reaction/pacid
name = "Polytrinic acid"
id = "pacid"
result = "pacid"
- required_reagents = list("sacid" = 1, "chlorine" = 1, "potassium" = 1)
+ required_reagents = list("sacid" = 1, "hclacid" = 1, "potassium" = 1)
result_amount = 3
/datum/chemical_reaction/synaptizine
@@ -255,14 +248,14 @@
name = "Arithrazine"
id = "arithrazine"
result = "arithrazine"
- required_reagents = list("hyronalin" = 1, "hydrogen" = 1)
+ required_reagents = list("hyronalin" = 1, "hydrazine" = 1)
result_amount = 2
/datum/chemical_reaction/impedrezene
name = "Impedrezene"
id = "impedrezene"
result = "impedrezene"
- required_reagents = list("mercury" = 1, "oxygen" = 1, "sugar" = 1)
+ required_reagents = list("mercury" = 1, "acetone" = 1, "sugar" = 1)
result_amount = 2
/datum/chemical_reaction/kelotane
@@ -299,7 +292,7 @@
name = "Cryptobiolin"
id = "cryptobiolin"
result = "cryptobiolin"
- required_reagents = list("potassium" = 1, "oxygen" = 1, "sugar" = 1)
+ required_reagents = list("potassium" = 1, "acetone" = 1, "sugar" = 1)
result_amount = 3
/datum/chemical_reaction/tricordrazine
@@ -313,15 +306,15 @@
name = "Alkysine"
id = "alkysine"
result = "alkysine"
- required_reagents = list("chlorine" = 1, "nitrogen" = 1, "anti_toxin" = 1)
+ required_reagents = list("hclacid" = 1, "ammonia" = 1, "anti_toxin" = 1)
result_amount = 2
/datum/chemical_reaction/dexalin
name = "Dexalin"
id = "dexalin"
- result = "dexalin"
- required_reagents = list("oxygen" = 2, "phoron" = 0.1)
- catalysts = list("phoron" = 5)
+ result = "dexalin"
+ required_reagents = list("acetone" = 2, "phoron" = 0.1)
+ catalysts = list("phoron" = 1)
inhibitors = list("water" = 1) // Messes with cryox
result_amount = 1
@@ -329,7 +322,7 @@
name = "Dermaline"
id = "dermaline"
result = "dermaline"
- required_reagents = list("oxygen" = 1, "phosphorus" = 1, "kelotane" = 1)
+ required_reagents = list("acetone" = 1, "phosphorus" = 1, "kelotane" = 1)
result_amount = 3
/datum/chemical_reaction/dexalinp
@@ -365,7 +358,7 @@
name = "Cryoxadone"
id = "cryoxadone"
result = "cryoxadone"
- required_reagents = list("dexalin" = 1, "water" = 1, "oxygen" = 1)
+ required_reagents = list("dexalin" = 1, "water" = 1, "acetone" = 1)
result_amount = 3
/datum/chemical_reaction/clonexadone
@@ -387,14 +380,14 @@
name = "imidazoline"
id = "imidazoline"
result = "imidazoline"
- required_reagents = list("carbon" = 1, "hydrogen" = 1, "anti_toxin" = 1)
+ required_reagents = list("carbon" = 1, "hydrazine" = 1, "anti_toxin" = 1)
result_amount = 2
/datum/chemical_reaction/ethylredoxrazine
name = "Ethylredoxrazine"
id = "ethylredoxrazine"
result = "ethylredoxrazine"
- required_reagents = list("oxygen" = 1, "anti_toxin" = 1, "carbon" = 1)
+ required_reagents = list("acetone" = 1, "anti_toxin" = 1, "carbon" = 1)
result_amount = 3
/datum/chemical_reaction/soporific
@@ -409,7 +402,7 @@
name = "Chloral Hydrate"
id = "chloralhydrate"
result = "chloralhydrate"
- required_reagents = list("ethanol" = 1, "chlorine" = 3, "water" = 1)
+ required_reagents = list("ethanol" = 1, "hclacid" = 3, "water" = 1)
result_amount = 1
/datum/chemical_reaction/potassium_chloride
@@ -437,7 +430,7 @@
name = "Mindbreaker Toxin"
id = "mindbreaker"
result = "mindbreaker"
- required_reagents = list("silicon" = 1, "hydrogen" = 1, "anti_toxin" = 1)
+ required_reagents = list("silicon" = 1, "hydrazine" = 1, "anti_toxin" = 1)
result_amount = 3
/datum/chemical_reaction/lipozine
@@ -448,19 +441,12 @@
result_amount = 3
/datum/chemical_reaction/surfactant
- name = "Foam surfactant"
- id = "foam surfactant"
- result = "fluorosurfactant"
- required_reagents = list("fluorine" = 2, "carbon" = 2, "sacid" = 1)
+ name = "Azosurfactant"
+ id = "surfactant"
+ result = "surfactant"
+ required_reagents = list("hydrazine" = 2, "carbon" = 2, "sacid" = 1)
result_amount = 5
-/datum/chemical_reaction/ammonia
- name = "Ammonia"
- id = "ammonia"
- result = "ammonia"
- required_reagents = list("hydrogen" = 3, "nitrogen" = 1)
- result_amount = 3
-
/datum/chemical_reaction/diethylamine
name = "Diethylamine"
id = "diethylamine"
@@ -486,7 +472,7 @@
name = "Foaming Agent"
id = "foaming_agent"
result = "foaming_agent"
- required_reagents = list("lithium" = 1, "hydrogen" = 1)
+ required_reagents = list("lithium" = 1, "hydrazine" = 1)
result_amount = 1
/datum/chemical_reaction/glycerol
@@ -500,7 +486,7 @@
name = "Sodium Chloride"
id = "sodiumchloride"
result = "sodiumchloride"
- required_reagents = list("sodium" = 1, "chlorine" = 1)
+ required_reagents = list("sodium" = 1, "hclacid" = 1)
result_amount = 2
/datum/chemical_reaction/condensedcapsaicin
@@ -515,7 +501,7 @@
name = "Coolant"
id = "coolant"
result = "coolant"
- required_reagents = list("tungsten" = 1, "oxygen" = 1, "water" = 1)
+ required_reagents = list("tungsten" = 1, "acetone" = 1, "water" = 1)
result_amount = 3
/datum/chemical_reaction/rezadone
@@ -529,14 +515,14 @@
name = "Lexorin"
id = "lexorin"
result = "lexorin"
- required_reagents = list("phoron" = 1, "hydrogen" = 1, "nitrogen" = 1)
+ required_reagents = list("phoron" = 1, "hydrazine" = 1, "ammonia" = 1)
result_amount = 3
/datum/chemical_reaction/methylphenidate
name = "Methylphenidate"
id = "methylphenidate"
result = "methylphenidate"
- required_reagents = list("mindbreaker" = 1, "hydrogen" = 1)
+ required_reagents = list("mindbreaker" = 1, "hydrazine" = 1)
result_amount = 3
/datum/chemical_reaction/citalopram
@@ -551,7 +537,7 @@
name = "Paroxetine"
id = "paroxetine"
result = "paroxetine"
- required_reagents = list("mindbreaker" = 1, "oxygen" = 1, "inaprovaline" = 1)
+ required_reagents = list("mindbreaker" = 1, "acetone" = 1, "inaprovaline" = 1)
result_amount = 3
/* Solidification */
@@ -564,7 +550,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
@@ -575,7 +561,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 */
@@ -704,7 +690,7 @@
name = "Foam"
id = "foam"
result = null
- required_reagents = list("fluorosurfactant" = 1, "water" = 1)
+ required_reagents = list("surfactant" = 1, "water" = 1)
result_amount = 2
mix_message = "The solution violently bubbles!"
@@ -1009,7 +995,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
@@ -1059,10 +1045,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)
..()
@@ -1229,7 +1215,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)
@@ -1270,7 +1256,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"
@@ -1279,7 +1265,7 @@
result_amount = 1
required = /obj/item/slime_extract/black
-//Oil
+//Oil
/datum/chemical_reaction/slime/explosion
name = "Slime Explosion"
id = "m_explosion"
@@ -1292,7 +1278,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
@@ -1391,32 +1377,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
@@ -2047,7 +2033,7 @@ datum
name = "Lithium Sodium Tungstate"
id = "lithiumsodiumtungstate"
result = "lithiumsodiumtungstate"
- required_reagents = list("lithium" = 1, "sodium" = 2, "tungsten" = 1, "oxygen" = 4)
+ required_reagents = list("lithium" = 1, "sodium" = 2, "tungsten" = 1, "acetone" = 4)
result_amount = 8
density_separated_liquid
@@ -2066,4 +2052,4 @@ datum
required_reagents = list("density_separated_sample" = 5)
result_amount = 4
requires_heating = 1
-*/
+*/
diff --git a/code/modules/reagents/dispenser/cartridge_presets.dm b/code/modules/reagents/dispenser/cartridge_presets.dm
index 007660c1e9..3683a89af0 100644
--- a/code/modules/reagents/dispenser/cartridge_presets.dm
+++ b/code/modules/reagents/dispenser/cartridge_presets.dm
@@ -10,18 +10,17 @@
sugar spawn_reagent = "sugar"
// Chemistry
- hydrogen spawn_reagent = "hydrogen"
+ hydrazine spawn_reagent = "hydrazine"
lithium spawn_reagent = "lithium"
carbon spawn_reagent = "carbon"
- nitrogen spawn_reagent = "nitrogen"
- oxygen spawn_reagent = "oxygen"
- fluorine spawn_reagent = "fluorine"
+ ammonia spawn_reagent = "ammonia"
+ acetone spawn_reagent = "acetone"
sodium spawn_reagent = "sodium"
aluminum spawn_reagent = "aluminum"
silicon spawn_reagent = "silicon"
phosphorus spawn_reagent = "phosphorus"
sulfur spawn_reagent = "sulfur"
- chlorine spawn_reagent = "chlorine"
+ hclacid spawn_reagent = "hclacid"
potassium spawn_reagent = "potassium"
iron spawn_reagent = "iron"
copper spawn_reagent = "copper"
diff --git a/code/modules/reagents/dispenser/dispenser_presets.dm b/code/modules/reagents/dispenser/dispenser_presets.dm
index 60d3050692..01c92fcb66 100644
--- a/code/modules/reagents/dispenser/dispenser_presets.dm
+++ b/code/modules/reagents/dispenser/dispenser_presets.dm
@@ -1,17 +1,16 @@
/obj/machinery/chemical_dispenser/full
spawn_cartridges = list(
- /obj/item/weapon/reagent_containers/chem_disp_cartridge/hydrogen,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/hydrazine,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/lithium,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/carbon,
- /obj/item/weapon/reagent_containers/chem_disp_cartridge/nitrogen,
- /obj/item/weapon/reagent_containers/chem_disp_cartridge/oxygen,
- /obj/item/weapon/reagent_containers/chem_disp_cartridge/fluorine,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/ammonia,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/acetone,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/sodium,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/aluminum,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/silicon,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/phosphorus,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/sulfur,
- /obj/item/weapon/reagent_containers/chem_disp_cartridge/chlorine,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/hclacid,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/potassium,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/iron,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/copper,
diff --git a/code/modules/reagents/dispenser/supply.dm b/code/modules/reagents/dispenser/supply.dm
index f208991712..b413242fa4 100644
--- a/code/modules/reagents/dispenser/supply.dm
+++ b/code/modules/reagents/dispenser/supply.dm
@@ -31,18 +31,17 @@
/datum/supply_packs/reagents
name = "Chemistry dispenser refill"
contains = list(
- /obj/item/weapon/reagent_containers/chem_disp_cartridge/hydrogen,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/hydrazine,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/lithium,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/carbon,
- /obj/item/weapon/reagent_containers/chem_disp_cartridge/nitrogen,
- /obj/item/weapon/reagent_containers/chem_disp_cartridge/oxygen,
- /obj/item/weapon/reagent_containers/chem_disp_cartridge/fluorine,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/ammonia,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/acetone,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/sodium,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/aluminum,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/silicon,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/phosphorus,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/sulfur,
- /obj/item/weapon/reagent_containers/chem_disp_cartridge/chlorine,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/hclacid,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/potassium,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/iron,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/copper,
@@ -144,7 +143,7 @@
_tname {\
name = _name ;\
containername = _cname ;\
- containertype = /obj/structure/closet/crate/secure;\
+ containertype = /obj/structure/closet/crate;\
cost = _cost ;\
contains = list( _type , _type );\
group = "Reagent Cartridges"\
@@ -153,18 +152,17 @@
// Chemistry-restricted (raw reagents excluding sugar/water)
// Datum path Contents type Supply pack name Container name Cost Container access
-SEC_PACK(hydrogen, /obj/item/weapon/reagent_containers/chem_disp_cartridge/hydrogen, "Reagent refill - Hydrogen", "hydrogen reagent cartridge crate", 15, access_chemistry)
+SEC_PACK(hydrazine, /obj/item/weapon/reagent_containers/chem_disp_cartridge/hydrazine, "Reagent refill - Hydrazine", "hydrazine reagent cartridge crate", 15, access_chemistry)
SEC_PACK(lithium, /obj/item/weapon/reagent_containers/chem_disp_cartridge/lithium, "Reagent refill - Lithium", "lithium reagent cartridge crate", 15, access_chemistry)
SEC_PACK(carbon, /obj/item/weapon/reagent_containers/chem_disp_cartridge/carbon, "Reagent refill - Carbon", "carbon reagent cartridge crate", 15, access_chemistry)
-SEC_PACK(nitrogen, /obj/item/weapon/reagent_containers/chem_disp_cartridge/nitrogen, "Reagent refill - Nitrogen", "nitrogen reagent cartridge crate", 15, access_chemistry)
-SEC_PACK(oxygen, /obj/item/weapon/reagent_containers/chem_disp_cartridge/oxygen, "Reagent refill - Oxygen", "oxygen reagent cartridge crate", 15, access_chemistry)
-SEC_PACK(fluorine, /obj/item/weapon/reagent_containers/chem_disp_cartridge/fluorine, "Reagent refill - Fluorine", "fluorine reagent cartridge crate", 15, access_chemistry)
+SEC_PACK(ammonia, /obj/item/weapon/reagent_containers/chem_disp_cartridge/ammonia, "Reagent refill - Ammonia", "ammonia reagent cartridge crate", 15, access_chemistry)
+SEC_PACK(oxygen, /obj/item/weapon/reagent_containers/chem_disp_cartridge/acetone, "Reagent refill - Acetone", "acetone reagent cartridge crate", 15, access_chemistry)
SEC_PACK(sodium, /obj/item/weapon/reagent_containers/chem_disp_cartridge/sodium, "Reagent refill - Sodium", "sodium reagent cartridge crate", 15, access_chemistry)
SEC_PACK(aluminium, /obj/item/weapon/reagent_containers/chem_disp_cartridge/aluminum, "Reagent refill - Aluminum", "aluminum reagent cartridge crate", 15, access_chemistry)
SEC_PACK(silicon, /obj/item/weapon/reagent_containers/chem_disp_cartridge/silicon, "Reagent refill - Silicon", "silicon reagent cartridge crate", 15, access_chemistry)
SEC_PACK(phosphorus,/obj/item/weapon/reagent_containers/chem_disp_cartridge/phosphorus, "Reagent refill - Phosphorus", "phosphorus reagent cartridge crate", 15, access_chemistry)
SEC_PACK(sulfur, /obj/item/weapon/reagent_containers/chem_disp_cartridge/sulfur, "Reagent refill - Sulfur", "sulfur reagent cartridge crate", 15, access_chemistry)
-SEC_PACK(chlorine, /obj/item/weapon/reagent_containers/chem_disp_cartridge/chlorine, "Reagent refill - Chlorine", "chlorine reagent cartridge crate", 15, access_chemistry)
+SEC_PACK(hclacid, /obj/item/weapon/reagent_containers/chem_disp_cartridge/hclacid, "Reagent refill - Hydrochloric Acid", "hydrochloric acid reagent cartridge crate", 15, access_chemistry)
SEC_PACK(potassium, /obj/item/weapon/reagent_containers/chem_disp_cartridge/potassium, "Reagent refill - Potassium", "potassium reagent cartridge crate", 15, access_chemistry)
SEC_PACK(iron, /obj/item/weapon/reagent_containers/chem_disp_cartridge/iron, "Reagent refill - Iron", "iron reagent cartridge crate", 15, access_chemistry)
SEC_PACK(copper, /obj/item/weapon/reagent_containers/chem_disp_cartridge/copper, "Reagent refill - Copper", "copper reagent cartridge crate", 15, access_chemistry)
diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm
index 2d0a1469b5..17de69ae34 100644
--- a/code/modules/reagents/reagent_containers.dm
+++ b/code/modules/reagents/reagent_containers.dm
@@ -25,9 +25,9 @@
/obj/item/weapon/reagent_containers/attack_self(mob/user as mob)
return
-/obj/item/weapon/reagent_containers/attack(mob/M as mob, mob/user as mob, def_zone)
+/obj/item/weapon/reagent_containers/attack(mob/M as mob, mob/user as mob, def_zone)
if(can_operate(M))//Checks if mob is lying down on table for surgery
- if(do_surgery(M, user, src))
+ if(do_surgery(M, user, src))
return
/obj/item/weapon/reagent_containers/afterattack(obj/target, mob/user, flag)
@@ -98,10 +98,9 @@
if(target == user)
if(istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/H = user
- 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 1
-
+ if(!H.check_has_mouth())
+ user << "Where do you intend to put \the [src]? You don't have a mouth!"
+ return
var/obj/item/blocked = H.check_mouth_coverage()
if(blocked)
user << "\The [blocked] is in the way!"
@@ -114,10 +113,9 @@
else
if(istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/H = target
- if(H.species.flags & IS_SYNTHETIC)
- H << "They have a monitor for a head, where do you think you're going to put that?"
+ if(!H.check_has_mouth())
+ user << "Where do you intend to put \the [src]? \The [H] doesn't have a mouth!"
return
-
var/obj/item/blocked = H.check_mouth_coverage()
if(blocked)
user << "\The [blocked] is in the way!"
@@ -153,4 +151,4 @@
var/trans = reagents.trans_to(target, amount_per_transfer_from_this)
user << "You transfer [trans] units of the solution to [target]."
- return 1
+ return 1
diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm
index 985ed3d9d2..b57830e1d6 100644
--- a/code/modules/reagents/reagent_containers/borghydro.dm
+++ b/code/modules/reagents/reagent_containers/borghydro.dm
@@ -65,6 +65,16 @@
if (!istype(M))
return
+ var/mob/living/carbon/human/H = M
+ if(istype(H))
+ var/obj/item/organ/external/affected = H.get_organ(user.zone_sel.selecting)
+ if(!affected)
+ user << "\The [H] is missing that limb!"
+ return
+ else if(affected.status & ORGAN_ROBOT)
+ user << "You cannot inject a robotic limb."
+ return
+
if (R.total_volume && M.can_inject(user, 1))
user << "You inject [M] with the injector."
M << "You feel a tiny prick!"
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..b7e7f948d5 100644
--- a/code/modules/reagents/reagent_containers/food/snacks.dm
+++ b/code/modules/reagents/reagent_containers/food/snacks.dm
@@ -45,15 +45,14 @@
if(M == user) //If you're eating it yourself
if(istype(M,/mob/living/carbon/human))
var/mob/living/carbon/human/H = M
- if(H.species.flags & IS_SYNTHETIC)
- H << "You have a monitor for a head, where do you think you're going to put that?"
+ if(!H.check_has_mouth())
+ user << "Where do you intend to put \the [src]? You don't have a mouth!"
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)
@@ -68,10 +67,9 @@
else
if(istype(M,/mob/living/carbon/human))
var/mob/living/carbon/human/H = M
- if(H.species.flags & IS_SYNTHETIC)
- user << "They have a monitor for a head, where do you think you're going to put that?"
+ if(!H.check_has_mouth())
+ user << "Where do you intend to put \the [src]? \The [H] doesn't have a mouth!"
return
-
var/obj/item/blocked = H.check_mouth_coverage()
if(blocked)
user << "\The [blocked] is in the way!"
@@ -128,8 +126,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 +184,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()
@@ -2560,7 +2558,7 @@
slices_num = 6
New()
..()
- reagents.add_reagent("protein", 50)
+ reagents.add_reagent("protein", 44)
reagents.add_reagent("tomatojuice", 6)
bitesize = 2
@@ -2598,7 +2596,7 @@
slices_num = 6
New()
..()
- reagents.add_reagent("nutriment", 30)
+ reagents.add_reagent("nutriment", 25)
reagents.add_reagent("protein", 5)
reagents.add_reagent("tomatojuice", 6)
reagents.add_reagent("imidazoline", 12)
@@ -2819,7 +2817,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 +2962,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/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm
index c5153510d7..cfed0351fc 100644
--- a/code/modules/reagents/reagent_containers/hypospray.dm
+++ b/code/modules/reagents/reagent_containers/hypospray.dm
@@ -19,23 +19,30 @@
reagents.add_reagent("tricordrazine", 30)
return
-/obj/item/weapon/reagent_containers/hypospray/attack(mob/M as mob, mob/user as mob)
+/obj/item/weapon/reagent_containers/hypospray/attack(mob/living/M as mob, mob/user as mob)
if(!reagents.total_volume)
user << "[src] is empty."
return
if (!istype(M))
return
+
+ var/mob/living/carbon/human/H = M
+ if(istype(H))
+ var/obj/item/organ/external/affected = H.get_organ(user.zone_sel.selecting)
+ if(!affected)
+ user << "\The [H] is missing that limb!"
+ return
+ else if(affected.status & ORGAN_ROBOT)
+ user << "You cannot inject a robotic limb."
+ return
+
user << "You inject [M] with [src]."
M << "You feel a tiny prick!"
if(M.reagents)
-
var/contained = reagentlist()
- M.attack_log += text("\[[time_stamp()]\] Has been injected with [name] by [user.name] ([user.ckey]). Reagents: [contained]")
- user.attack_log += text("\[[time_stamp()]\] Used the [name] to inject [M.name] ([M.key]). Reagents: [contained]")
- msg_admin_attack("[user.name] ([user.ckey]) injected [M.name] ([M.key]) with [name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)]) (JMP)")
-
var/trans = reagents.trans_to_mob(M, amount_per_transfer_from_this, CHEM_BLOOD)
+ admin_inject_log(user, M, src, contained, trans)
user << "[trans] units injected. [reagents.total_volume] units remaining in \the [src]."
return
diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm
index bb405828ee..0891468cd1 100644
--- a/code/modules/reagents/reagent_containers/pill.dm
+++ b/code/modules/reagents/reagent_containers/pill.dm
@@ -21,10 +21,9 @@
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
- if(H.species.flags & IS_SYNTHETIC)
- H << "You have a monitor for a head, where do you think you're going to put that?"
+ if(!H.check_has_mouth())
+ user << "Where do you intend to put \the [src]? You don't have a mouth!"
return
-
var/obj/item/blocked = H.check_mouth_coverage()
if(blocked)
user << "\The [blocked] is in the way!"
@@ -40,12 +39,10 @@
else if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
- if(H.species.flags & IS_SYNTHETIC)
- H << "They have a monitor for a head, where do you think you're going to put that?"
+ if(!H.check_has_mouth())
+ user << "Where do you intend to put \the [src]? \The [H] doesn't have a mouth!"
return
-
var/obj/item/blocked = H.check_mouth_coverage()
-
if(blocked)
user << "\The [blocked] is in the way!"
return
diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm
index c041f529ee..79247f8252 100644
--- a/code/modules/reagents/reagent_containers/spray.dm
+++ b/code/modules/reagents/reagent_containers/spray.dm
@@ -156,7 +156,7 @@
w_class = 3.0
possible_transfer_amounts = null
volume = 600
- origin_tech = "combat=3;materials=3;engineering=3"
+ origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_ENGINERING = 3)
/obj/item/weapon/reagent_containers/spray/chemsprayer/Spray_at(atom/A as mob|obj)
var/direction = get_dir(src, A)
diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm
index c7f869802b..3a1cb76522 100644
--- a/code/modules/reagents/reagent_containers/syringes.dm
+++ b/code/modules/reagents/reagent_containers/syringes.dm
@@ -142,13 +142,21 @@
user << "[target] is full."
return
+ var/mob/living/carbon/human/H = target
+ if(istype(H))
+ var/obj/item/organ/external/affected = H.get_organ(user.zone_sel.selecting)
+ if(!affected)
+ user << "\The [H] is missing that limb!"
+ return
+ else if(affected.status & ORGAN_ROBOT)
+ user << "You cannot inject a robotic limb."
+ return
+
if(ismob(target) && target != user)
var/injtime = time //Injecting through a hardsuit takes longer due to needing to find a port.
- if(istype(target, /mob/living/carbon/human))
-
- var/mob/living/carbon/human/H = target
+ if(istype(H))
if(H.wear_suit)
if(istype(H.wear_suit, /obj/item/clothing/suit/space))
injtime = injtime * 2
@@ -171,16 +179,11 @@
user.visible_message("[user] injects [target] with the syringe!")
- if(istype(target, /mob/living))
- var/mob/living/M = target
- var/contained = reagentlist()
- M.attack_log += text("\[[time_stamp()]\] Has been injected with [name] by [user.name] ([user.ckey]). Reagents: [contained]")
- user.attack_log += text("\[[time_stamp()]\] Used the [name] to inject [M.name] ([M.key]). Reagents: [contained]")
- msg_admin_attack("[user.name] ([user.ckey]) injected [M.name] ([M.key]) with [name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)]) (JMP)")
-
var/trans
if(ismob(target))
+ var/contained = reagentlist()
trans = reagents.trans_to_mob(target, amount_per_transfer_from_this, CHEM_BLOOD)
+ admin_inject_log(user, target, src, contained, trans)
else
trans = reagents.trans_to(target, amount_per_transfer_from_this)
user << "You inject [trans] units of the solution. The syringe now contains [src.reagents.total_volume] units."
@@ -219,10 +222,6 @@
proc/syringestab(mob/living/carbon/target as mob, mob/living/carbon/user as mob)
- user.attack_log += "\[[time_stamp()]\] Attacked [target.name] ([target.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])"
- target.attack_log += "\[[time_stamp()]\] Attacked by [user.name] ([user.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])"
- msg_admin_attack("[user.name] ([user.ckey]) attacked [target.name] ([target.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (JMP)")
-
if(istype(target, /mob/living/carbon/human))
var/mob/living/carbon/human/H = target
@@ -244,6 +243,11 @@
O.show_message(text("\red [user] tries to stab [target] in \the [hit_area] with [src.name], but the attack is deflected by armor!"), 1)
user.remove_from_mob(src)
qdel(src)
+
+ user.attack_log += "\[[time_stamp()]\] Attacked [target.name] ([target.ckey]) with \the [src] (INTENT: HARM)."
+ target.attack_log += "\[[time_stamp()]\] Attacked by [user.name] ([user.ckey]) with [src.name] (INTENT: HARM)."
+ msg_admin_attack("[key_name_admin(user)] attacked [key_name_admin(target)] with [src.name] (INTENT: HARM) (JMP)")
+
return
user.visible_message("[user] stabs [target] in \the [hit_area] with [src.name]!")
@@ -255,8 +259,13 @@
user.visible_message("[user] stabs [target] with [src.name]!")
target.take_organ_damage(3)// 7 is the same as crowbar punch
+
+
var/syringestab_amount_transferred = rand(0, (reagents.total_volume - 5)) //nerfed by popular demand
- reagents.trans_to_mob(target, syringestab_amount_transferred, CHEM_BLOOD)
+ var/contained_reagents = reagents.get_reagents()
+ var/trans = reagents.trans_to_mob(target, syringestab_amount_transferred, CHEM_BLOOD)
+ if(isnull(trans)) trans = 0
+ admin_inject_log(user, target, src, contained_reagents, trans, violent=1)
break_syringe(target, user)
proc/break_syringe(mob/living/carbon/target, mob/living/carbon/user)
diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm
index 986f3a6291..57812535b6 100644
--- a/code/modules/research/circuitprinter.dm
+++ b/code/modules/research/circuitprinter.dm
@@ -1,20 +1,21 @@
/*///////////////Circuit Imprinter (By Darem)////////////////////////
Used to print new circuit boards (for computers and similar systems) and AI modules. Each circuit board pattern are stored in
a /datum/desgin on the linked R&D console. You can then print them out in a fasion similar to a regular lathe. However, instead of
-using metal and glass, it uses glass and reagents (usually sulfuric acis).
-
+using metal and glass, it uses glass and reagents (usually sulphuric acid).
*/
+
/obj/machinery/r_n_d/circuit_imprinter
name = "Circuit Imprinter"
icon_state = "circuit_imprinter"
flags = OPENCONTAINER
- var/g_amount = 0
- var/gold_amount = 0
- var/diamond_amount = 0
- var/uranium_amount = 0
- var/max_material_amount = 75000.0
+ var/list/materials = list("metal" = 0, "glass" = 0, "gold" = 0, "silver" = 0, "phoron" = 0, "uranium" = 0, "diamond" = 0)
+ var/list/datum/design/queue = list()
+ var/progress = 0
+
+ var/max_material_storage = 75000
var/mat_efficiency = 1
+ var/speed = 1
use_power = 1
idle_power_usage = 30
@@ -30,25 +31,51 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis).
component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(src)
RefreshParts()
+/obj/machinery/r_n_d/circuit_imprinter/process()
+ ..()
+ if(stat)
+ update_icon()
+ return
+ if(queue.len == 0)
+ busy = 0
+ update_icon()
+ return
+ var/datum/design/D = queue[1]
+ if(canBuild(D))
+ busy = 1
+ progress += speed
+ if(progress >= D.time)
+ build(D)
+ progress = 0
+ removeFromQueue(1)
+ if(linked_console)
+ linked_console.updateUsrDialog()
+ update_icon()
+ else
+ if(busy)
+ visible_message("\icon [src] flashes: insufficient materials: [getLackingMaterials(D)].")
+ busy = 0
+ update_icon()
+
/obj/machinery/r_n_d/circuit_imprinter/RefreshParts()
var/T = 0
for(var/obj/item/weapon/reagent_containers/glass/G in component_parts)
T += G.reagents.maximum_volume
- var/datum/reagents/R = new/datum/reagents(T) //Holder for the reagents used as materials.
- reagents = R
- R.my_atom = src
- T = 0
+ create_reagents(T)
+ max_material_storage = 0
for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts)
- T += M.rating
- max_material_amount = T * 75000.0
+ max_material_storage += M.rating * 75000
T = 0
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
T += M.rating
mat_efficiency = 1 - (T - 1) / 4
+ speed = T
/obj/machinery/r_n_d/circuit_imprinter/update_icon()
if(panel_open)
icon_state = "circuit_imprinter_t"
+ else if(busy)
+ icon_state = "circuit_imprinter_ani"
else
icon_state = "circuit_imprinter"
@@ -61,29 +88,27 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis).
return
/obj/machinery/r_n_d/circuit_imprinter/proc/TotalMaterials()
- return g_amount + gold_amount + diamond_amount + uranium_amount
+ var/t = 0
+ for(var/f in materials)
+ t += materials[f]
+ return t
/obj/machinery/r_n_d/circuit_imprinter/dismantle()
for(var/obj/I in component_parts)
- 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)
- 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)
- 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)
- 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)
- G.amount = round(uranium_amount / 2000)
+ if(istype(I, /obj/item/weapon/reagent_containers/glass/beaker))
+ reagents.trans_to_obj(I, reagents.total_volume)
+ for(var/f in materials)
+ if(materials[f] >= SHEET_MATERIAL_AMOUNT)
+ var/path = getMaterialType(f)
+ if(path)
+ var/obj/item/stack/S = new f(loc)
+ S.amount = round(materials[f] / SHEET_MATERIAL_AMOUNT)
..()
/obj/machinery/r_n_d/circuit_imprinter/attackby(var/obj/item/O as obj, var/mob/user as mob)
- if(shocked)
- shock(user, 50)
+ if(busy)
+ user << "\The [src] is busy. Please wait for completion of previous operation."
+ return 1
if(default_deconstruction_screwdriver(user, O))
if(linked_console)
linked_console.linked_imprinter = null
@@ -96,60 +121,91 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis).
if(panel_open)
user << "You can't load \the [src] while it's opened."
return 1
- if(disabled)
- user << "\The [src] appears to not be working!"
- return
if(!linked_console)
- user << "\The [src] must be linked to an R&D console first!"
+ user << "\The [src] must be linked to an R&D console first."
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))
-// user << "You cannot insert this item into \the [src]!"
-// return 1
+ if(O.is_open_container())
+ return 0
+ 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)
return 1
- if(busy)
- 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(TotalMaterials() + SHEET_MATERIAL_AMOUNT > 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
- 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
+ var/obj/item/stack/stack = O
- var/amount = round(input("How many sheets do you want to add?") as num)
- if(amount < 0)
- amount = 0
- if(amount == 0)
- return
- if(amount > stack.amount)
- amount = min(stack.amount, round((max_material_amount - TotalMaterials()) / stack.perunit))
+ var/amount = round(input("How many sheets do you want to add?") as num)
+ if(!O)
+ return
+ if(amount <= 0)//No negative numbers
+ return
+ if(amount > stack.get_amount())
+ amount = stack.get_amount()
+ if(max_material_storage - TotalMaterials() < (amount * SHEET_MATERIAL_AMOUNT)) //Can't overfill
+ amount = min(stack.get_amount(), round((max_material_storage - TotalMaterials()) / SHEET_MATERIAL_AMOUNT))
- busy = 1
- use_power(max(1000, (3750 * amount / 10)))
- var/stacktype = stack.type
- stack.use(amount)
- if(do_after(usr, 16))
- user << "You add [amount] sheets to \the [src]."
- switch(stacktype)
- if(/obj/item/stack/sheet/glass)
- g_amount += amount * 3750
- if(/obj/item/stack/sheet/mineral/gold)
- gold_amount += amount * 2000
- if(/obj/item/stack/sheet/mineral/diamond)
- diamond_amount += amount * 2000
- if(/obj/item/stack/sheet/mineral/uranium)
- uranium_amount += amount * 2000
- else
- new stacktype(loc, amount)
- busy = 0
- updateUsrDialog()
+ busy = 1
+ use_power(max(1000, (SHEET_MATERIAL_AMOUNT * amount / 10)))
+ var/stacktype = stack.type
+ var/t = getMaterialName(stacktype)
+ if(t)
+ if(do_after(usr, 16))
+ if(stack.use(amount))
+ user << "You add [amount] sheets to \the [src]."
+ materials[t] += amount * SHEET_MATERIAL_AMOUNT
+ busy = 0
+ updateUsrDialog()
- ..()
+/obj/machinery/r_n_d/circuit_imprinter/proc/addToQueue(var/datum/design/D)
+ queue += D
+ return
-//This is to stop these machines being hackable via clicking.
-/obj/machinery/r_n_d/circuit_imprinter/attack_hand(mob/user as mob)
- return
\ No newline at end of file
+/obj/machinery/r_n_d/circuit_imprinter/proc/removeFromQueue(var/index)
+ queue.Cut(index, index + 1)
+ return
+
+/obj/machinery/r_n_d/circuit_imprinter/proc/canBuild(var/datum/design/D)
+ for(var/M in D.materials)
+ if(materials[M] < D.materials[M])
+ return 0
+ for(var/C in D.chemicals)
+ if(!reagents.has_reagent(C, D.chemicals[C]))
+ return 0
+ return 1
+
+/obj/machinery/r_n_d/circuit_imprinter/proc/getLackingMaterials(var/datum/design/D)
+ var/ret = ""
+ for(var/M in D.materials)
+ if(materials[M] < D.materials[M])
+ if(ret != "")
+ ret += ", "
+ ret += "[D.materials[M] - materials[M]] [M]"
+ for(var/C in D.chemicals)
+ if(!reagents.has_reagent(C, D.chemicals[C]))
+ if(ret != "")
+ ret += ", "
+ ret += C
+ return ret
+
+/obj/machinery/r_n_d/circuit_imprinter/proc/build(var/datum/design/D)
+ var/power = active_power_usage
+ for(var/M in D.materials)
+ power += round(D.materials[M] / 5)
+ power = max(active_power_usage, power)
+ use_power(power)
+ for(var/M in D.materials)
+ materials[M] = max(0, materials[M] - D.materials[M] * mat_efficiency)
+ for(var/C in D.chemicals)
+ reagents.remove_reagent(C, D.chemicals[C] * mat_efficiency)
+
+ if(D.build_path)
+ var/obj/new_item = new D.build_path(src)
+ new_item.loc = loc
+ if(mat_efficiency != 1) // No matter out of nowhere
+ if(new_item.matter && new_item.matter.len > 0)
+ for(var/i in new_item.matter)
+ new_item.matter[i] = new_item.matter[i] * mat_efficiency
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index 9d0d547f94..65219eade8 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -1,5 +1,3 @@
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33
-
/***************************************************************
** Design Datums **
** All the data for building stuff and tracking reliability. **
@@ -7,1585 +5,1646 @@
/*
For the materials datum, it assumes you need reagents unless specified otherwise. To designate a material that isn't a reagent,
you use one of the material IDs below. These are NOT ids in the usual sense (they aren't defined in the object or part of a datum),
-they are simply references used as part of a "has materials?" type proc. They all start with a $ to denote that they aren't reagents.
+they are simply references used as part of a "has materials?" type proc. They all start with a to denote that they aren't reagents.
The currently supporting non-reagent materials:
-- $metal (/obj/item/stack/metal). One sheet = 3750 units.
-- $glass (/obj/item/stack/glass). One sheet = 3750 units.
-- $phoron (/obj/item/stack/phoron). One sheet = 3750 units.
-- $silver (/obj/item/stack/silver). One sheet = 3750 units.
-- $gold (/obj/item/stack/gold). One sheet = 3750 units.
-- $uranium (/obj/item/stack/uranium). One sheet = 3750 units.
-- $diamond (/obj/item/stack/diamond). One sheet = 3750 units.
-(Insert new ones here)
Don't add new keyword/IDs if they are made from an existing one (such as rods which are made from metal). Only add raw materials.
Design Guidlines
-- The reliability formula for all R&D built items is reliability_base (a fixed number) + total tech levels required to make it +
-reliability_mod (starts at 0, gets improved through experimentation). Example: PACMAN generator. 79 base reliablity + 6 tech
-(3 phorontech, 3 powerstorage) + 0 (since it's completely new) = 85% reliability. Reliability is the chance it works CORRECTLY.
- When adding new designs, check rdreadme.dm to see what kind of things have already been made and where new stuff is needed.
-- A single sheet of anything is 3750 units of material. Materials besides metal/glass require help from other jobs (mining for
+- A single sheet of anything is 2000 units of material. Materials besides metal/glass require help from other jobs (mining for
other types of metals and chemistry for reagents).
-- Add the AUTOLATHE tag to
-
*/
-#define IMPRINTER 1 //For circuits. Uses glass/chemicals.
-#define PROTOLATHE 2 //New stuff. Uses glass/metal/chemicals
-#define AUTOLATHE 4 //Uses glass/metal only.
-#define CRAFTLATHE 8 //Uses fuck if I know. For use eventually.
-#define MECHFAB 16 //Remember, objects utilising this flag should have construction_time and construction_cost vars.
-//Note: More then one of these can be added to a design but imprinter and lathe designs are incompatable.
+//Note: More then one of these can be added to a design.
-datum/design //Datum for object designs, used in construction
+/datum/design //Datum for object designs, used in construction
var/name = null //Name of the created object. If null it will be 'guessed' from build_path if possible.
var/desc = null //Description of the created object. If null it will use group_desc and name where applicable.
var/item_name = null //An item name before it is modified by various name-modifying procs
var/id = "id" //ID of the created object for easy refernece. Alphanumeric, lower-case, no symbols.
var/list/req_tech = list() //IDs of that techs the object originated from and the minimum level requirements.
- var/reliability_mod = 0 //Reliability modifier of the device at it's starting point.
- var/reliability_base = 100 //Base reliability of a device before modifiers.
- var/reliability = 100 //Reliability of the device.
var/build_type = null //Flag as to what kind machine the design is built in. See defines.
var/list/materials = list() //List of materials. Format: "id" = amount.
+ var/list/chemicals = list() //List of chemicals.
var/build_path = null //The path of the object that gets created.
- var/locked = 0 //If true it will spawn inside a lockbox with currently sec access.
+ var/time = 10 //How many ticks it requires to build
var/category = null //Primarily used for Mech Fabricators, but can be used for anything.
+ var/sort_string = "ZZZZZ" //Sorting order
-//A proc to calculate the reliability of a design based on tech levels and innate modifiers.
-//Input: A list of /datum/tech; Output: The new reliabilty.
-datum/design/proc/CalcReliability(var/list/temp_techs)
- var/new_reliability = reliability_mod + reliability_base
- for(var/datum/tech/T in temp_techs)
- if(T.id in req_tech)
- new_reliability += T.level
- new_reliability = between(reliability_base, new_reliability, 100)
- reliability = new_reliability
- return
-
-datum/design/New()
+/datum/design/New()
..()
item_name = name
AssembleDesignInfo()
//These procs are used in subtypes for assigning names and descriptions dynamically
-datum/design/proc/AssembleDesignInfo()
+/datum/design/proc/AssembleDesignInfo()
AssembleDesignName()
AssembleDesignDesc()
return
-datum/design/proc/AssembleDesignName()
+/datum/design/proc/AssembleDesignName()
if(!name && build_path) //Get name from build path if posible
var/atom/movable/A = build_path
name = initial(A.name)
item_name = name
return
-datum/design/proc/AssembleDesignDesc()
+/datum/design/proc/AssembleDesignDesc()
if(!desc) //Try to make up a nice description if we don't have one
desc = "Allows for the construction of \a [item_name]."
return
-///////////////////////////////////
-/////General Type Definitions//////
-///////////////////////////////////
-datum/design/circuit
- build_type = IMPRINTER
- req_tech = list("programming" = 2)
- materials = list("$glass" = 2000, "sacid" = 20)
-
-datum/design/circuit/AssembleDesignName()
- ..()
- name = "Circuit design ([item_name])"
-
-datum/design/circuit/AssembleDesignDesc()
- if(!desc)
- desc = "Allows for the construction of \a [item_name] circuit board."
-
-datum/design/item
+/datum/design/item
build_type = PROTOLATHE
-///////////////////////////////////
-//////////Computer Boards//////////
-///////////////////////////////////
-datum/design/circuit/seccamera
- name = "security camera monitor"
- id = "seccamera"
- build_path = /obj/item/weapon/circuitboard/security
-
-datum/design/circuit/aicore
- name = "AI core"
- id = "aicore"
- req_tech = list("programming" = 4, "biotech" = 3)
- build_path = /obj/item/weapon/circuitboard/aicore
-
-datum/design/circuit/aiupload
- name = "AI upload console"
- id = "aiupload"
- req_tech = list("programming" = 4)
- build_path = /obj/item/weapon/circuitboard/aiupload
-
-datum/design/circuit/borgupload
- name = "cyborg upload console"
- id = "borgupload"
- req_tech = list("programming" = 4)
- build_path = /obj/item/weapon/circuitboard/borgupload
-
-datum/design/circuit/operating
- name = "patient monitoring console"
- id = "operating"
- build_path = /obj/item/weapon/circuitboard/operating
-
-datum/design/circuit/pandemic
- name = "PanD.E.M.I.C. 2200"
- id = "pandemic"
- build_path = /obj/item/weapon/circuitboard/pandemic
-
-datum/design/circuit/scan_console
- name = "DNA machine"
- id = "scan_console"
- build_path = /obj/item/weapon/circuitboard/scan_consolenew
-
-datum/design/circuit/comconsole
- name = "communications console"
- id = "comconsole"
- build_path = /obj/item/weapon/circuitboard/communications
-
-datum/design/circuit/idcardconsole
- name = "ID card modification console"
- id = "idcardconsole"
- build_path = /obj/item/weapon/circuitboard/card
-
-datum/design/circuit/crewconsole
- name = "crew monitoring console"
- id = "crewconsole"
- req_tech = list("programming" = 3, "magnets" = 2, "biotech" = 2)
- build_path = /obj/item/weapon/circuitboard/crew
-
-datum/design/circuit/teleconsole
- name = "teleporter control console"
- id = "teleconsole"
- req_tech = list("programming" = 3, "bluespace" = 2)
-
-datum/design/circuit/emp_data
- name = "employment records console"
- id = "emp_data"
- build_path = /obj/item/weapon/circuitboard/skills
-
-datum/design/circuit/med_data
- name = "medical records console"
- id = "med_data"
- build_path = /obj/item/weapon/circuitboard/med_data
-
-datum/design/circuit/secdata
- name = "security records console"
- id = "sec_data"
- build_path = /obj/item/weapon/circuitboard/secure_data
-
-datum/design/circuit/atmosalerts
- name = "atmosphere alert console"
- id = "atmosalerts"
- build_path = /obj/item/weapon/circuitboard/atmos_alert
-
-datum/design/circuit/air_management
- name = "atmosphere monitoring console"
- id = "air_management"
- build_path = /obj/item/weapon/circuitboard/air_management
-
-datum/design/circuit/rcon_console
- name = "RCON remote control console"
- id = "rcon_console"
- req_tech = list("programming" = 4, "engineering" = 3, "powerstorage" = 5)
- build_path = /obj/item/weapon/circuitboard/rcon_console
-
-/* Uncomment if someone makes these buildable
-datum/design/circuit/general_alert
- name = "general alert console"
- id = "general_alert"
- build_path = /obj/item/weapon/circuitboard/general_alert
-*/
-
-datum/design/circuit/robocontrol
- name = "robotics control console"
- id = "robocontrol"
- req_tech = list("programming" = 4)
- build_path = /obj/item/weapon/circuitboard/robotics
-
-datum/design/circuit/dronecontrol
- name = "drone control console"
- id = "dronecontrol"
- req_tech = list("programming" = 4)
- build_path = /obj/item/weapon/circuitboard/drone_control
-
-datum/design/circuit/clonecontrol
- name = "cloning control console"
- id = "clonecontrol"
- req_tech = list("programming" = 3, "biotech" = 3)
- build_path = /obj/item/weapon/circuitboard/cloning
-
-datum/design/circuit/clonepod
- name = "clone pod"
- id = "clonepod"
- req_tech = list("programming" = 3, "biotech" = 3)
- build_path = /obj/item/weapon/circuitboard/clonepod
-
-datum/design/circuit/clonescanner
- name = "cloning scanner"
- id = "clonescanner"
- req_tech = list("programming" = 3, "biotech" = 3)
- build_path = /obj/item/weapon/circuitboard/clonescanner
-
-datum/design/circuit/arcademachine
- name = "arcade machine"
- id = "arcademachine"
- req_tech = list("programming" = 1)
- build_path = /obj/item/weapon/circuitboard/arcade
-
-datum/design/circuit/powermonitor
- name = "power monitoring console"
- id = "powermonitor"
- build_path = /obj/item/weapon/circuitboard/powermonitor
-
-datum/design/circuit/solarcontrol
- name = "solar control console"
- id = "solarcontrol"
- build_path = /obj/item/weapon/circuitboard/solar_control
-
-datum/design/circuit/prisonmanage
- name = "prisoner management console"
- id = "prisonmanage"
- build_path = /obj/item/weapon/circuitboard/prisoner
-
-datum/design/circuit/mechacontrol
- name = "exosuit control console"
- id = "mechacontrol"
- req_tech = list("programming" = 3)
- build_path = /obj/item/weapon/circuitboard/mecha_control
-
-datum/design/circuit/mechapower
- name = "mech bay power control console"
- id = "mechapower"
- build_path = /obj/item/weapon/circuitboard/mech_bay_power_console
-
-datum/design/circuit/rdconsole
- name = "R&D control console"
- id = "rdconsole"
- req_tech = list("programming" = 4)
- build_path = /obj/item/weapon/circuitboard/rdconsole
-
-datum/design/circuit/ordercomp
- name = "supply ordering console"
- id = "ordercomp"
- build_path = /obj/item/weapon/circuitboard/ordercomp
-
-datum/design/circuit/supplycomp
- name = "supply control console"
- id = "supplycomp"
- req_tech = list("programming" = 3)
- build_path = /obj/item/weapon/circuitboard/supplycomp
-
-datum/design/circuit/comm_monitor
- name = "telecommunications monitoring console"
- id = "comm_monitor"
- req_tech = list("programming" = 3)
- build_path = /obj/item/weapon/circuitboard/comm_monitor
-
-datum/design/circuit/comm_server
- name = "telecommunications server monitoring console"
- id = "comm_server"
- req_tech = list("programming" = 3)
- build_path = /obj/item/weapon/circuitboard/comm_server
-
-datum/design/circuit/message_monitor
- name = "messaging monitor console"
- id = "message_monitor"
- req_tech = list("programming" = 5)
- build_path = /obj/item/weapon/circuitboard/message_monitor
-
-datum/design/circuit/aifixer
- name = "AI integrity restorer"
- id = "aifixer"
- req_tech = list("programming" = 3, "biotech" = 2)
- build_path = /obj/item/weapon/circuitboard/aifixer
-
-///////////////////////////////////
-/////////Shield Generators/////////
-///////////////////////////////////
-datum/design/circuit/shield
- req_tech = list("bluespace" = 4, "phorontech" = 3)
- materials = list("$glass" = 2000, "sacid" = 20, "$phoron" = 10000, "$diamond" = 5000, "$gold" = 10000)
-
-datum/design/circuit/shield/AssembleDesignName()
- name = "Shield generator circuit design ([name])"
-datum/design/circuit/shield/AssembleDesignDesc()
- if(!desc)
- desc = "Allows for the construction of \a [name] shield generator."
-
-datum/design/circuit/shield/bubble
- name = "bubble"
- id = "shield_gen"
- build_path = /obj/item/weapon/circuitboard/shield_gen
-
-datum/design/circuit/shield/hull
- name = "hull"
- id = "shield_gen_ex"
- build_path = /obj/item/weapon/circuitboard/shield_gen_ex
-
-datum/design/circuit/shield/capacitor
- name = "capacitor"
- desc = "Allows for the construction of a shield capacitor circuit board."
- id = "shield_cap"
- req_tech = list("magnets" = 3, "powerstorage" = 4)
- build_path = /obj/item/weapon/circuitboard/shield_cap
-
-///////////////////////////////////
-//////////AI Module Disks//////////
-///////////////////////////////////
-datum/design/aimodule/
- build_type = IMPRINTER
- materials = list("$glass" = 2000, "sacid" = 20, "$gold" = 100)
-
-datum/design/aimodule/AssembleDesignName()
- name = "AI module design ([name])"
-datum/design/aimodule/AssembleDesignDesc()
- desc = "Allows for the construction of \a '[name]' AI module."
-
-datum/design/aimodule/safeguard
- name = "Safeguard"
- id = "safeguard"
- req_tech = list("programming" = 3, "materials" = 4)
- build_path = /obj/item/weapon/aiModule/safeguard
-
-datum/design/aimodule/onehuman
- name = "OneCrewMember"
- id = "onehuman"
- req_tech = list("programming" = 4, "materials" = 6)
- build_path = /obj/item/weapon/aiModule/oneHuman
-
-datum/design/aimodule/protectstation
- name = "ProtectStation"
- id = "protectstation"
- req_tech = list("programming" = 3, "materials" = 6)
- build_path = /obj/item/weapon/aiModule/protectStation
-
-datum/design/aimodule/notele
- name = "TeleporterOffline"
- id = "notele"
- req_tech = list("programming" = 3)
- build_path = /obj/item/weapon/aiModule/teleporterOffline
-
-datum/design/aimodule/quarantine
- name = "Quarantine"
- id = "quarantine"
- req_tech = list("programming" = 3, "biotech" = 2, "materials" = 4)
- build_path = /obj/item/weapon/aiModule/quarantine
-
-datum/design/aimodule/oxygen
- name = "OxygenIsToxicToHumans"
- id = "oxygen"
- req_tech = list("programming" = 3, "biotech" = 2, "materials" = 4)
- build_path = /obj/item/weapon/aiModule/oxygen
-
-datum/design/aimodule/freeform
- name = "Freeform"
- id = "freeform"
- req_tech = list("programming" = 4, "materials" = 4)
- build_path = /obj/item/weapon/aiModule/freeform
-
-datum/design/aimodule/reset
- name = "Reset"
- id = "reset"
- req_tech = list("programming" = 3, "materials" = 6)
- build_path = /obj/item/weapon/aiModule/reset
-
-datum/design/aimodule/purge
- name = "Purge"
- id = "purge"
- req_tech = list("programming" = 4, "materials" = 6)
- build_path = /obj/item/weapon/aiModule/purge
-
-// *** Core modules
-datum/design/aimodule/core
- req_tech = list("programming" = 4, "materials" = 6)
-
-datum/design/aimodule/core/AssembleDesignName()
- name = "AI core module design ([name])"
-datum/design/aimodule/core/AssembleDesignDesc()
- desc = "Allows for the construction of \a '[name]' AI core module."
-
-datum/design/aimodule/core/freeformcore
- name = "Freeform"
- id = "freeformcore"
- build_path = /obj/item/weapon/aiModule/freeformcore
-
-datum/design/aimodule/core/asimov
- name = "Asimov"
- id = "asimov"
- build_path = /obj/item/weapon/aiModule/asimov
-
-datum/design/aimodule/core/paladin
- name = "P.A.L.A.D.I.N."
- id = "paladin"
- build_path = /obj/item/weapon/aiModule/paladin
-
-datum/design/aimodule/core/tyrant
- name = "T.Y.R.A.N.T."
- id = "tyrant"
- req_tech = list("programming" = 4, "syndicate" = 2, "materials" = 6)
- build_path = /obj/item/weapon/aiModule/tyrant
-
-///////////////////////////////////
-////////Telecomms Machinery////////
-///////////////////////////////////
-datum/design/circuit/tcom
- req_tech = list("programming" = 4, "engineering" = 4)
-
-datum/design/circuit/tcom/AssembleDesignName()
- name = "Telecommunications machinery circuit design ([name])"
-datum/design/circuit/tcom/AssembleDesignDesc()
- desc = "Allows for the construction of a telecommunications [name] circuit board."
-
-
-datum/design/circuit/tcom/server
- name = "server mainframe"
- id = "tcom-server"
- build_path = /obj/item/weapon/circuitboard/telecomms/server
-
-datum/design/circuit/tcom/processor
- name = "processor unit"
- id = "tcom-processor"
- build_path = /obj/item/weapon/circuitboard/telecomms/processor
-
-datum/design/circuit/tcom/bus
- name = "bus mainframe"
- id = "tcom-bus"
- build_path = /obj/item/weapon/circuitboard/telecomms/bus
-
-datum/design/circuit/tcom/hub
- name = "hub mainframe"
- id = "tcom-hub"
- build_path = /obj/item/weapon/circuitboard/telecomms/hub
-
-datum/design/circuit/tcom/relay
- name = "relay mainframe"
- id = "tcom-relay"
- req_tech = list("programming" = 3, "engineering" = 4, "bluespace" = 3)
- build_path = /obj/item/weapon/circuitboard/telecomms/relay
-
-datum/design/circuit/tcom/broadcaster
- name = "subspace broadcaster"
- id = "tcom-broadcaster"
- req_tech = list("programming" = 4, "engineering" = 4, "bluespace" = 2)
- build_path = /obj/item/weapon/circuitboard/telecomms/broadcaster
-
-datum/design/circuit/tcom/receiver
- name = "subspace receiver"
- id = "tcom-receiver"
- req_tech = list("programming" = 4, "engineering" = 3, "bluespace" = 2)
- build_path = /obj/item/weapon/circuitboard/telecomms/receiver
-
-datum/design/circuit/tcom/bluespacerelay
- name = "emergency bluespace relay"
- id = "bluespace-relay"
- req_tech = list("programming" = 4, "bluespace" = 4)
- build_path = /obj/item/weapon/circuitboard/bluespacerelay
-
-///////////////////////////////////
-////////////Mecha Modules//////////
-///////////////////////////////////
-datum/design/circuit/mecha
- req_tech = list("programming" = 3)
-
-datum/design/circuit/mecha/AssembleDesignName()
- name = "Exosuit module circuit design ([name])"
-datum/design/circuit/mecha/AssembleDesignDesc()
- desc = "Allows for the construction of \a [name] module."
-
-
-datum/design/circuit/mecha/ripley_main
- name = "APLU 'Ripley' central control"
- id = "ripley_main"
- build_path = /obj/item/weapon/circuitboard/mecha/ripley/main
-
-datum/design/circuit/mecha/ripley_peri
- name = "APLU 'Ripley' peripherals control"
- id = "ripley_peri"
- build_path = /obj/item/weapon/circuitboard/mecha/ripley/peripherals
-
-datum/design/circuit/mecha/odysseus_main
- name = "'Odysseus' central control"
- id = "odysseus_main"
- req_tech = list("programming" = 3,"biotech" = 2)
- build_path = /obj/item/weapon/circuitboard/mecha/odysseus/main
-
-datum/design/circuit/mecha/odysseus_peri
- name = "'Odysseus' peripherals control"
- id = "odysseus_peri"
- req_tech = list("programming" = 3,"biotech" = 2)
- build_path = /obj/item/weapon/circuitboard/mecha/odysseus/peripherals
-
-datum/design/circuit/mecha/gygax_main
- name = "'Gygax' central control"
- id = "gygax_main"
- req_tech = list("programming" = 4)
- build_path = /obj/item/weapon/circuitboard/mecha/gygax/main
-
-datum/design/circuit/mecha/gygax_peri
- name = "'Gygax' peripherals control"
- id = "gygax_peri"
- req_tech = list("programming" = 4)
- build_path = /obj/item/weapon/circuitboard/mecha/gygax/peripherals
-
-datum/design/circuit/mecha/gygax_targ
- name = "'Gygax' weapon control and targeting"
- id = "gygax_targ"
- req_tech = list("programming" = 4, "combat" = 2)
- build_path = /obj/item/weapon/circuitboard/mecha/gygax/targeting
-
-datum/design/circuit/mecha/durand_main
- name = "'Durand' central control"
- id = "durand_main"
- req_tech = list("programming" = 4)
- build_path = /obj/item/weapon/circuitboard/mecha/durand/main
-
-datum/design/circuit/mecha/durand_peri
- name = "'Durand' peripherals control"
- id = "durand_peri"
- req_tech = list("programming" = 4)
- build_path = /obj/item/weapon/circuitboard/mecha/durand/peripherals
-
-datum/design/circuit/mecha/durand_targ
- name = "'Durand' weapon control and targeting"
- id = "durand_targ"
- req_tech = list("programming" = 4, "combat" = 2)
- build_path = /obj/item/weapon/circuitboard/mecha/durand/targeting
-
-datum/design/circuit/mecha/honker_main
- name = "'H.O.N.K' central control"
- id = "honker_main"
- build_path = /obj/item/weapon/circuitboard/mecha/honker/main
-
-datum/design/circuit/mecha/honker_peri
- name = "'H.O.N.K' peripherals control"
- id = "honker_peri"
- build_path = /obj/item/weapon/circuitboard/mecha/honker/peripherals
-
-datum/design/circuit/mecha/honker_targ
- name = "'H.O.N.K' weapon control and targeting"
- id = "honker_targ"
- build_path = /obj/item/weapon/circuitboard/mecha/honker/targeting
-
-////////////////////////////////////////
-/////////// Mecha Equpment /////////////
-////////////////////////////////////////
-
-datum/design/item/mecha
- build_type = MECHFAB
- req_tech = list("combat" = 3)
- category = "Exosuit Equipment"
-
-datum/design/item/mecha/AssembleDesignName()
- ..()
- name = "Exosuit module design ([item_name])"
-datum/design/item/mecha/weapon/AssembleDesignName()
- ..()
- name = "Exosuit weapon design ([item_name])"
-datum/design/item/mecha/AssembleDesignDesc()
- if(!desc)
- desc = "Allows for the construction of \a '[item_name]' exosuit module."
-
-// *** Weapon modules
-datum/design/item/mecha/weapon/scattershot
- id = "mech_scattershot"
- req_tech = list("combat" = 4)
- build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot
-
-datum/design/item/mecha/weapon/laser
- id = "mech_laser"
- req_tech = list("combat" = 3, "magnets" = 3)
- build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser
-
-datum/design/item/mecha/weapon/laser_rigged
- desc = "Allows for the construction of a welder-laser assembly package for non-combat exosuits."
- id = "mech_laser_rigged"
- req_tech = list("combat" = 2, "magnets" = 2)
- build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/riggedlaser
-
-datum/design/item/mecha/weapon/laser_heavy
- id = "mech_laser_heavy"
- req_tech = list("combat" = 4, "magnets" = 4)
- build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy
-
-datum/design/item/mecha/weapon/ion
- id = "mech_ion"
- req_tech = list("combat" = 4, "magnets" = 4)
- build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/ion
-
-datum/design/item/mecha/weapon/grenade_launcher
- id = "mech_grenade_launcher"
- req_tech = list("combat" = 3)
- build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang
-
-datum/design/item/mecha/weapon/clusterbang_launcher
- desc = "A weapon that violates the Geneva Convention at 6 rounds per minute."
- id = "clusterbang_launcher"
- req_tech = list("combat"= 5, "materials" = 5, "syndicate" = 3)
- build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang/limited
-
-// *** Nonweapon modules
-datum/design/item/mecha/wormhole_gen
- desc = "An exosuit module that can generate small quasi-stable wormholes."
- id = "mech_wormhole_gen"
- req_tech = list("bluespace" = 3, "magnets" = 2)
- build_path = /obj/item/mecha_parts/mecha_equipment/wormhole_generator
-
-datum/design/item/mecha/teleporter
- desc = "An exosuit module that allows teleportation to any position in view."
- id = "mech_teleporter"
- req_tech = list("bluespace" = 10, "magnets" = 5)
- build_path = /obj/item/mecha_parts/mecha_equipment/teleporter
-
-datum/design/item/mecha/rcd
- desc = "An exosuit-mounted rapid construction device."
- id = "mech_rcd"
- req_tech = list("materials" = 4, "bluespace" = 3, "magnets" = 4, "powerstorage"=4, "engineering" = 4)
- build_path = /obj/item/mecha_parts/mecha_equipment/tool/rcd
-
-datum/design/item/mecha/gravcatapult
- desc = "An exosuit-mounted gravitational catapult."
- id = "mech_gravcatapult"
- req_tech = list("bluespace" = 2, "magnets" = 3, "engineering" = 3)
- build_path = /obj/item/mecha_parts/mecha_equipment/gravcatapult
-
-datum/design/item/mecha/repair_droid
- desc = "Automated repair droid, exosuits' best companion. BEEP BOOP"
- id = "mech_repair_droid"
- req_tech = list("magnets" = 3, "programming" = 3, "engineering" = 3)
- build_path = /obj/item/mecha_parts/mecha_equipment/repair_droid
-
-datum/design/item/mecha/phoron_generator
- desc = "Exosuit-mounted phoron generator."
- id = "mech_phoron_generator"
- req_tech = list("phorontech" = 2, "powerstorage"= 2, "engineering" = 2)
- build_path = /obj/item/mecha_parts/mecha_equipment/generator
-
-datum/design/item/mecha/energy_relay
- id = "mech_energy_relay"
- req_tech = list("magnets" = 4, "powerstorage" = 3)
- build_path = /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay
-
-datum/design/item/mecha/ccw_armor
- desc = "Exosuit close-combat armor booster."
- id = "mech_ccw_armor"
- req_tech = list("materials" = 5, "combat" = 4)
- build_path = /obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster
-
-datum/design/item/mecha/proj_armor
- desc = "Exosuit projectile armor booster."
- id = "mech_proj_armor"
- req_tech = list("materials" = 5, "combat" = 5, "engineering"=3)
- build_path = /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster
-
-datum/design/item/mecha/syringe_gun
- desc = "Exosuit-mounted syringe gun and chemical synthesizer."
- id = "mech_syringe_gun"
- req_tech = list("materials" = 3, "biotech"=4, "magnets"=4, "programming"=3)
- build_path = /obj/item/mecha_parts/mecha_equipment/tool/syringe_gun
-
-datum/design/item/mecha/diamond_drill
- desc = "A diamond version of the exosuit drill. It's harder, better, faster, stronger."
- id = "mech_diamond_drill"
- req_tech = list("materials" = 4, "engineering" = 3)
- build_path = /obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill
-
-datum/design/item/mecha/generator_nuclear
- desc = "Exosuit-held nuclear reactor. Converts uranium and everyone's health to energy."
- id = "mech_generator_nuclear"
- req_tech = list("powerstorage"= 3, "engineering" = 3, "materials" = 3)
- build_path = /obj/item/mecha_parts/mecha_equipment/generator/nuclear
-
-
-////////////////////////////////////////
-//////////Disk Construction Disks///////
-////////////////////////////////////////
-datum/design/design_disk
+/datum/design/item/design_disk
name = "Design Storage Disk"
desc = "Produce additional disks for storing device designs."
id = "design_disk"
- req_tech = list("programming" = 1)
- build_type = PROTOLATHE | AUTOLATHE
- materials = list("$metal" = 30, "$glass" = 10)
+ req_tech = list(TECH_DATA = 1)
+ materials = list("metal" = 30, "glass" = 10)
build_path = /obj/item/weapon/disk/design_disk
+ sort_string = "GAAAA"
-datum/design/tech_disk
+/datum/design/item/tech_disk
name = "Technology Data Storage Disk"
desc = "Produce additional disks for storing technology data."
id = "tech_disk"
- req_tech = list("programming" = 1)
- build_type = PROTOLATHE | AUTOLATHE
- materials = list("$metal" = 30, "$glass" = 10)
+ req_tech = list(TECH_DATA = 1)
+ materials = list("metal" = 30, "glass" = 10)
build_path = /obj/item/weapon/disk/tech_disk
+ sort_string = "GAAAB"
-///////////////////////////////////
-/////Non-Board Computer Stuff//////
-///////////////////////////////////
-
-datum/design/item/intellicard
- name = "'intelliCard', AI preservation and transportation system"
- desc = "Allows for the construction of an intelliCard."
- id = "intellicard"
- req_tech = list("programming" = 4, "materials" = 4)
- materials = list("$glass" = 1000, "$gold" = 200)
- build_path = /obj/item/device/aicard
-
-datum/design/item/paicard
- name = "'pAI', personal artificial intelligence device"
- id = "paicard"
- req_tech = list("programming" = 2)
- materials = list("$glass" = 500, "$metal" = 500)
- build_path = /obj/item/device/paicard
-
-datum/design/item/posibrain
- id = "posibrain"
- req_tech = list("engineering" = 4, "materials" = 6, "bluespace" = 2, "programming" = 4)
- materials = list("$metal" = 2000, "$glass" = 1000, "$silver" = 1000, "$gold" = 500, "$phoron" = 500, "$diamond" = 100)
- build_path = /obj/item/device/mmi/digital/posibrain
-
-////////////////////////////////////////
-/////////////Stock Parts////////////////
-////////////////////////////////////////
-datum/design/item/stock_part
+/datum/design/item/stock_part
build_type = PROTOLATHE
-datum/design/item/stock_part/AssembleDesignName()
+/datum/design/item/stock_part/AssembleDesignName()
..()
name = "Component design ([item_name])"
-datum/design/item/stock_part/AssembleDesignDesc()
+/datum/design/item/stock_part/AssembleDesignDesc()
if(!desc)
desc = "A stock part used in the construction of various devices."
+/datum/design/item/stock_part/basic_capacitor
+ id = "basic_capacitor"
+ req_tech = list(TECH_POWER = 1)
+ materials = list("metal" = 50, "glass" = 50)
+ build_path = /obj/item/weapon/stock_parts/capacitor
+ sort_string = "CAAAA"
+
+/datum/design/item/stock_part/adv_capacitor
+ id = "adv_capacitor"
+ req_tech = list(TECH_POWER = 3)
+ materials = list("metal" = 50, "glass" = 50)
+ build_path = /obj/item/weapon/stock_parts/capacitor/adv
+ sort_string = "CAAAB"
+
+/datum/design/item/stock_part/super_capacitor
+ id = "super_capacitor"
+ req_tech = list(TECH_POWER = 5, TECH_MATERIAL = 4)
+ materials = list("metal" = 50, "glass" = 50, "gold" = 20)
+ build_path = /obj/item/weapon/stock_parts/capacitor/super
+ sort_string = "CAAAC"
+
+/datum/design/item/stock_part/micro_mani
+ id = "micro_mani"
+ req_tech = list(TECH_MATERIAL = 1, TECH_DATA = 1)
+ materials = list("metal" = 30)
+ build_path = /obj/item/weapon/stock_parts/manipulator
+ sort_string = "CAABA"
+
+/datum/design/item/stock_part/nano_mani
+ id = "nano_mani"
+ req_tech = list(TECH_MATERIAL = 3, TECH_DATA = 2)
+ materials = list("metal" = 30)
+ build_path = /obj/item/weapon/stock_parts/manipulator/nano
+ sort_string = "CAABB"
+
+/datum/design/item/stock_part/pico_mani
+ id = "pico_mani"
+ req_tech = list(TECH_MATERIAL = 5, TECH_DATA = 2)
+ materials = list("metal" = 30)
+ build_path = /obj/item/weapon/stock_parts/manipulator/pico
+ sort_string = "CAABC"
+
+/datum/design/item/stock_part/basic_matter_bin
+ id = "basic_matter_bin"
+ req_tech = list(TECH_MATERIAL = 1)
+ materials = list("metal" = 80)
+ build_path = /obj/item/weapon/stock_parts/matter_bin
+ sort_string = "CAACA"
+
+/datum/design/item/stock_part/adv_matter_bin
+ id = "adv_matter_bin"
+ req_tech = list(TECH_MATERIAL = 3)
+ materials = list("metal" = 80)
+ build_path = /obj/item/weapon/stock_parts/matter_bin/adv
+ sort_string = "CAACB"
+
+/datum/design/item/stock_part/super_matter_bin
+ id = "super_matter_bin"
+ req_tech = list(TECH_MATERIAL = 5)
+ materials = list("metal" = 80)
+ build_path = /obj/item/weapon/stock_parts/matter_bin/super
+ sort_string = "CAACC"
+
+/datum/design/item/stock_part/basic_micro_laser
+ id = "basic_micro_laser"
+ req_tech = list(TECH_MAGNET = 1)
+ materials = list("metal" = 10, "glass" = 20)
+ build_path = /obj/item/weapon/stock_parts/micro_laser
+ sort_string = "CAADA"
+
+/datum/design/item/stock_part/high_micro_laser
+ id = "high_micro_laser"
+ req_tech = list(TECH_MAGNET = 3)
+ materials = list("metal" = 10, "glass" = 20)
+ build_path = /obj/item/weapon/stock_parts/micro_laser/high
+ sort_string = "CAADB"
+
+/datum/design/item/stock_part/ultra_micro_laser
+ id = "ultra_micro_laser"
+ req_tech = list(TECH_MAGNET = 5, TECH_MATERIAL = 5)
+ materials = list("metal" = 10, "glass" = 20, "uranium" = 10)
+ build_path = /obj/item/weapon/stock_parts/micro_laser/ultra
+ sort_string = "CAADC"
+
+/datum/design/item/stock_part/basic_sensor
+ id = "basic_sensor"
+ req_tech = list(TECH_MAGNET = 1)
+ materials = list("metal" = 50, "glass" = 20)
+ build_path = /obj/item/weapon/stock_parts/scanning_module
+ sort_string = "CAAEA"
+
+/datum/design/item/stock_part/adv_sensor
+ id = "adv_sensor"
+ req_tech = list(TECH_MAGNET = 3)
+ materials = list("metal" = 50, "glass" = 20)
+ build_path = /obj/item/weapon/stock_parts/scanning_module/adv
+ sort_string = "CAAEB"
+
+/datum/design/item/stock_part/phasic_sensor
+ id = "phasic_sensor"
+ req_tech = list(TECH_MAGNET = 5, TECH_MATERIAL = 3)
+ materials = list("metal" = 50, "glass" = 20, "silver" = 10)
+ build_path = /obj/item/weapon/stock_parts/scanning_module/phasic
+ sort_string = "CAAEC"
+
/datum/design/item/stock_part/RPED
name = "Rapid Part Exchange Device"
desc = "Special mechanical module made to store, sort, and apply standard machine parts."
id = "rped"
- req_tech = list("engineering" = 3, "materials" = 3)
- materials = list("$metal" = 15000, "$glass" = 5000)
+ req_tech = list(TECH_ENGINERING = 3, TECH_MATERIAL = 3)
+ materials = list("metal" = 15000, "glass" = 5000)
build_path = /obj/item/weapon/storage/part_replacer
+ sort_string = "CBAAA"
-datum/design/item/stock_part/basic_capacitor
- build_type = PROTOLATHE | AUTOLATHE
- id = "basic_capacitor"
- req_tech = list("powerstorage" = 1)
- materials = list("$metal" = 50, "$glass" = 50)
- build_path = /obj/item/weapon/stock_parts/capacitor
-
-datum/design/item/stock_part/basic_sensor
- build_type = PROTOLATHE | AUTOLATHE
- id = "basic_sensor"
- req_tech = list("magnets" = 1)
- materials = list("$metal" = 50, "$glass" = 20)
- build_path = /obj/item/weapon/stock_parts/scanning_module
-
-datum/design/item/stock_part/micro_mani
- build_type = PROTOLATHE | AUTOLATHE
- id = "micro_mani"
- req_tech = list("materials" = 1, "programming" = 1)
- materials = list("$metal" = 30)
- build_path = /obj/item/weapon/stock_parts/manipulator
-
-datum/design/item/stock_part/basic_micro_laser
- build_type = PROTOLATHE | AUTOLATHE
- id = "basic_micro_laser"
- req_tech = list("magnets" = 1)
- materials = list("$metal" = 10, "$glass" = 20)
- build_path = /obj/item/weapon/stock_parts/micro_laser
-
-datum/design/item/stock_part/basic_matter_bin
- build_type = PROTOLATHE | AUTOLATHE
- id = "basic_matter_bin"
- req_tech = list("materials" = 1)
- materials = list("$metal" = 80)
- build_path = /obj/item/weapon/stock_parts/matter_bin
-
-datum/design/item/stock_part/adv_capacitor
- id = "adv_capacitor"
- req_tech = list("powerstorage" = 3)
- materials = list("$metal" = 50, "$glass" = 50)
- build_path = /obj/item/weapon/stock_parts/capacitor/adv
-
-datum/design/item/stock_part/adv_sensor
- id = "adv_sensor"
- req_tech = list("magnets" = 3)
- materials = list("$metal" = 50, "$glass" = 20)
- build_path = /obj/item/weapon/stock_parts/scanning_module/adv
-
-datum/design/item/stock_part/nano_mani
- id = "nano_mani"
- req_tech = list("materials" = 3, "programming" = 2)
- materials = list("$metal" = 30)
- build_path = /obj/item/weapon/stock_parts/manipulator/nano
-
-datum/design/item/stock_part/high_micro_laser
- id = "high_micro_laser"
- req_tech = list("magnets" = 3)
- materials = list("$metal" = 10, "$glass" = 20)
- build_path = /obj/item/weapon/stock_parts/micro_laser/high
-
-datum/design/item/stock_part/adv_matter_bin
- id = "adv_matter_bin"
- req_tech = list("materials" = 3)
- materials = list("$metal" = 80)
- build_path = /obj/item/weapon/stock_parts/matter_bin/adv
-
-datum/design/item/stock_part/super_capacitor
- id = "super_capacitor"
- req_tech = list("powerstorage" = 5, "materials" = 4)
- reliability_base = 71
- materials = list("$metal" = 50, "$glass" = 50, "$gold" = 20)
- build_path = /obj/item/weapon/stock_parts/capacitor/super
-
-datum/design/item/stock_part/phasic_sensor
- id = "phasic_sensor"
- req_tech = list("magnets" = 5, "materials" = 3)
- materials = list("$metal" = 50, "$glass" = 20, "$silver" = 10)
- reliability_base = 72
- build_path = /obj/item/weapon/stock_parts/scanning_module/phasic
-
-datum/design/item/stock_part/pico_mani
- id = "pico_mani"
- req_tech = list("materials" = 5, "programming" = 2)
- materials = list("$metal" = 30)
- reliability_base = 73
- build_path = /obj/item/weapon/stock_parts/manipulator/pico
-
-datum/design/item/stock_part/ultra_micro_laser
- id = "ultra_micro_laser"
- req_tech = list("magnets" = 5, "materials" = 5)
- materials = list("$metal" = 10, "$glass" = 20, "$uranium" = 10)
- reliability_base = 70
- build_path = /obj/item/weapon/stock_parts/micro_laser/ultra
-
-datum/design/item/stock_part/super_matter_bin
- id = "super_matter_bin"
- req_tech = list("materials" = 5)
- materials = list("$metal" = 80)
- reliability_base = 75
- build_path = /obj/item/weapon/stock_parts/matter_bin/super
-
-/////////////////////////////////////////
-//////////Tcommsat Stock Parts///////////
-/////////////////////////////////////////
-
-datum/design/item/stock_part/subspace_ansible
- id = "s-ansible"
- req_tech = list("programming" = 3, "magnets" = 4, "materials" = 4, "bluespace" = 2)
- materials = list("$metal" = 80, "$silver" = 20)
- build_path = /obj/item/weapon/stock_parts/subspace/ansible
-
-datum/design/item/stock_part/hyperwave_filter
- id = "s-filter"
- req_tech = list("programming" = 3, "magnets" = 3)
- materials = list("$metal" = 40, "$silver" = 10)
- build_path = /obj/item/weapon/stock_parts/subspace/filter
-
-datum/design/item/stock_part/subspace_amplifier
- id = "s-amplifier"
- req_tech = list("programming" = 3, "magnets" = 4, "materials" = 4, "bluespace" = 2)
- materials = list("$metal" = 10, "$gold" = 30, "$uranium" = 15)
- build_path = /obj/item/weapon/stock_parts/subspace/amplifier
-
-datum/design/item/stock_part/subspace_treatment
- id = "s-treatment"
- req_tech = list("programming" = 3, "magnets" = 2, "materials" = 4, "bluespace" = 2)
- materials = list("$metal" = 10, "$silver" = 20)
- build_path = /obj/item/weapon/stock_parts/subspace/treatment
-
-datum/design/item/stock_part/subspace_analyzer
- id = "s-analyzer"
- req_tech = list("programming" = 3, "magnets" = 4, "materials" = 4, "bluespace" = 2)
- materials = list("$metal" = 10, "$gold" = 15)
- build_path = /obj/item/weapon/stock_parts/subspace/analyzer
-
-datum/design/item/stock_part/subspace_crystal
- id = "s-crystal"
- req_tech = list("magnets" = 4, "materials" = 4, "bluespace" = 2)
- materials = list("$glass" = 1000, "$silver" = 20, "$gold" = 20)
- build_path = /obj/item/weapon/stock_parts/subspace/crystal
-
-datum/design/item/stock_part/subspace_transmitter
- id = "s-transmitter"
- req_tech = list("magnets" = 5, "materials" = 5, "bluespace" = 3)
- materials = list("$glass" = 100, "$silver" = 10, "$uranium" = 15)
- build_path = /obj/item/weapon/stock_parts/subspace/transmitter
-
-////////////////////////////////////////
-//////////Misc Circuit Boards///////////
-////////////////////////////////////////
-
-datum/design/circuit/destructive_analyzer
- name = "destructive analyzer"
- id = "destructive_analyzer"
- req_tech = list("programming" = 2, "magnets" = 2, "engineering" = 2)
- build_path = /obj/item/weapon/circuitboard/destructive_analyzer
-
-datum/design/circuit/protolathe
- name = "protolathe"
- id = "protolathe"
- req_tech = list("programming" = 2, "engineering" = 2)
- build_path = /obj/item/weapon/circuitboard/protolathe
-
-datum/design/circuit/circuit_imprinter
- name = "circuit imprinter"
- id = "circuit_imprinter"
- req_tech = list("programming" = 2, "engineering" = 2)
- build_path = /obj/item/weapon/circuitboard/circuit_imprinter
-
-datum/design/circuit/autolathe
- name = "autolathe board"
- id = "autolathe"
- req_tech = list("programming" = 2, "engineering" = 2)
- build_path = /obj/item/weapon/circuitboard/autolathe
-
-datum/design/circuit/rdservercontrol
- name = "R&D server control console"
- id = "rdservercontrol"
- req_tech = list("programming" = 3)
- build_path = /obj/item/weapon/circuitboard/rdservercontrol
-
-datum/design/circuit/rdserver
- name = "R&D server"
- id = "rdserver"
- req_tech = list("programming" = 3)
- build_path = /obj/item/weapon/circuitboard/rdserver
-
-datum/design/circuit/mechfab
- name = "exosuit fabricator"
- id = "mechfab"
- req_tech = list("programming" = 3, "engineering" = 3)
- build_path = /obj/item/weapon/circuitboard/mechfab
-
-datum/design/circuit/gas_heater
- name = "gas heating system"
- id = "gasheater"
- req_tech = list("powerstorage" = 2, "engineering" = 1)
- build_path = /obj/item/weapon/circuitboard/unary_atmos/heater
-
-datum/design/circuit/gas_cooler
- name = "gas cooling system"
- id = "gascooler"
- req_tech = list("magnets" = 2, "engineering" = 2)
- build_path = /obj/item/weapon/circuitboard/unary_atmos/cooler
-
-datum/design/circuit/secure_airlock
- name = "secure airlock electronics"
- desc = "Allows for the construction of a tamper-resistant airlock electronics."
- id = "securedoor"
- req_tech = list("programming" = 3)
- build_path = /obj/item/weapon/airlock_electronics/secure
-
-datum/design/circuit/biogenerator
- name = "biogenerator"
- id = "biogenerator"
- req_tech = list("programming" = 2)
- build_path = /obj/item/weapon/circuitboard/biogenerator
-
-datum/design/circuit/recharge_station
- name = "cyborg recharge station"
- id = "recharge_station"
- req_tech = list("programming" = 3, "engineering" = 2)
- build_path = /obj/item/weapon/circuitboard/recharge_station
-
-/////////////////////////////////////////
-////////Power Stuff Circuitboards////////
-/////////////////////////////////////////
-datum/design/circuit/pacman
- name = "PACMAN-type generator"
- id = "pacman"
- req_tech = list("programming" = 3, "phorontech" = 3, "powerstorage" = 3, "engineering" = 3)
- reliability_base = 79
- materials = list("$glass" = 2000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/pacman
-
-datum/design/circuit/superpacman
- name = "SUPERPACMAN-type generator"
- id = "superpacman"
- req_tech = list("programming" = 3, "powerstorage" = 4, "engineering" = 4)
- reliability_base = 76
- materials = list("$glass" = 2000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/pacman/super
-
-datum/design/circuit/mrspacman
- name = "MRSPACMAN-type generator"
- id = "mrspacman"
- req_tech = list("programming" = 3, "powerstorage" = 5, "engineering" = 5)
- reliability_base = 74
- materials = list("$glass" = 2000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/pacman/mrs
-
-datum/design/circuit/batteryrack
- name = "cell rack PSU"
- id = "batteryrack"
- req_tech = list("powerstorage" = 3, "engineering" = 2)
- materials = list("$glass" = 2000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/batteryrack
-
-datum/design/circuit/smes_cell
- name = "'SMES' superconductive magnetic energy storage"
- desc = "Allows for the construction of circuit boards used to build a SMES."
- id = "smes_cell"
- req_tech = list("powerstorage" = 7, "engineering" = 5)
- //A uniquely-priced board; probably not the best idea
- materials = list("$glass" = 2000, "sacid" = 20, "$gold" = 1000, "$silver" = 1000, "$diamond" = 500)
- build_path = /obj/item/weapon/circuitboard/smes
-
-////////////////////////////////////////
-///////////////Power Items//////////////
-////////////////////////////////////////
-datum/design/item/light_replacer
- name = "Light replacer"
- desc = "A device to automatically replace lights. Refill with working lightbulbs."
- id = "light_replacer"
- req_tech = list("magnets" = 3, "materials" = 4)
- materials = list("$metal" = 1500, "$silver" = 150, "$glass" = 3000)
- build_path = /obj/item/device/lightreplacer
-
-// *** Power cells
-datum/design/item/powercell
+/datum/design/item/powercell
build_type = PROTOLATHE | MECHFAB
-datum/design/item/powercell/AssembleDesignName()
+/datum/design/item/powercell/AssembleDesignName()
name = "Power cell model ([item_name])"
-datum/design/item/powercell/AssembleDesignDesc()
+/datum/design/item/powercell/AssembleDesignDesc()
if(build_path)
var/obj/item/weapon/cell/C = build_path
desc = "Allows the construction of power cells that can hold [initial(C.maxcharge)] units of energy."
-datum/design/item/powercell/basic
+/datum/design/item/powercell/basic
name = "basic"
- build_type = PROTOLATHE | AUTOLATHE | MECHFAB
+ build_type = PROTOLATHE | MECHFAB
id = "basic_cell"
- req_tech = list("powerstorage" = 1)
- materials = list("$metal" = 700, "$glass" = 50)
+ req_tech = list(TECH_POWER = 1)
+ materials = list("metal" = 700, "glass" = 50)
build_path = /obj/item/weapon/cell
category = "Misc"
+ sort_string = "DAAAA"
-datum/design/item/powercell/high
+/datum/design/item/powercell/high
name = "high-capacity"
- build_type = PROTOLATHE | AUTOLATHE | MECHFAB
+ build_type = PROTOLATHE | MECHFAB
id = "high_cell"
- req_tech = list("powerstorage" = 2)
- materials = list("$metal" = 700, "$glass" = 60)
+ req_tech = list(TECH_POWER = 2)
+ materials = list("metal" = 700, "glass" = 60)
build_path = /obj/item/weapon/cell/high
category = "Misc"
+ sort_string = "DAAAB"
-datum/design/item/powercell/super
+/datum/design/item/powercell/super
name = "super-capacity"
id = "super_cell"
- req_tech = list("powerstorage" = 3, "materials" = 2)
- reliability_base = 75
- materials = list("$metal" = 700, "$glass" = 70)
+ req_tech = list(TECH_POWER = 3, TECH_MATERIAL = 2)
+ materials = list("metal" = 700, "glass" = 70)
build_path = /obj/item/weapon/cell/super
category = "Misc"
+ sort_string = "DAAAC"
-datum/design/item/powercell/hyper
+/datum/design/item/powercell/hyper
name = "hyper-capacity"
id = "hyper_cell"
- req_tech = list("powerstorage" = 5, "materials" = 4)
- reliability_base = 70
- materials = list("$metal" = 400, "$gold" = 150, "$silver" = 150, "$glass" = 70)
+ req_tech = list(TECH_POWER = 5, TECH_MATERIAL = 4)
+ materials = list("metal" = 400, "gold" = 150, "silver" = 150, "glass" = 70)
build_path = /obj/item/weapon/cell/hyper
category = "Misc"
+ sort_string = "DAAAD"
-/////////////////////////////////////////
-////////////Medical Tools////////////////
-/////////////////////////////////////////
-datum/design/item/medical
- materials = list("$metal" = 30, "$glass" = 20)
+/datum/design/item/hud
+ materials = list("metal" = 50, "glass" = 50)
-datum/design/item/medical/AssembleDesignName()
+/datum/design/item/hud/AssembleDesignName()
+ ..()
+ name = "HUD glasses prototype ([item_name])"
+
+/datum/design/item/hud/AssembleDesignDesc()
+ desc = "Allows for the construction of \a [item_name] HUD glasses."
+
+/datum/design/item/hud/health
+ name = "health scanner"
+ id = "health_hud"
+ req_tech = list(TECH_BIO = 2, TECH_MAGNET = 3)
+ build_path = /obj/item/clothing/glasses/hud/health
+ sort_string = "GAAAA"
+
+/datum/design/item/hud/security
+ name = "security records"
+ id = "security_hud"
+ req_tech = list(TECH_MAGNET = 3, TECH_COMBAT = 2)
+ build_path = /obj/item/clothing/glasses/hud/security
+ sort_string = "GAAAB"
+
+/datum/design/item/mesons
+ name = "Optical meson scanners design"
+ desc = "Using the meson-scanning technology those glasses allow you to see through walls, floor or anything else."
+ id = "mesons"
+ req_tech = list(TECH_MAGNET = 2, TECH_ENGINERING = 2)
+ materials = list("metal" = 50, "glass" = 50)
+ build_path = /obj/item/clothing/glasses/meson
+ sort_string = "GAAAC"
+
+/datum/design/item/weapon/mining/AssembleDesignName()
+ ..()
+ name = "Mining equipment design ([item_name])"
+
+/datum/design/item/weapon/mining/jackhammer
+ id = "jackhammer"
+ req_tech = list(TECH_MATERIAL = 3, TECH_POWER = 2, TECH_ENGINERING = 2)
+ materials = list("metal" = 2000, "glass" = 500, "silver" = 500)
+ build_path = /obj/item/weapon/pickaxe/jackhammer
+ sort_string = "KAAAA"
+
+/datum/design/item/weapon/mining/drill
+ id = "drill"
+ req_tech = list(TECH_MATERIAL = 2, TECH_POWER = 3, TECH_ENGINERING = 2)
+ materials = list("metal" = 6000, "glass" = 1000) //expensive, but no need for miners.
+ build_path = /obj/item/weapon/pickaxe/drill
+ sort_string = "KAAAB"
+
+/datum/design/item/weapon/mining/plasmacutter
+ id = "plasmacutter"
+ req_tech = list(TECH_MATERIAL = 4, TECH_PHORON = 3, TECH_ENGINERING = 3)
+ materials = list("metal" = 1500, "glass" = 500, "gold" = 500, "phoron" = 500)
+ build_path = /obj/item/weapon/pickaxe/plasmacutter
+ sort_string = "KAAAC"
+
+/datum/design/item/weapon/mining/pick_diamond
+ id = "pick_diamond"
+ req_tech = list(TECH_MATERIAL = 6)
+ materials = list("diamond" = 3000)
+ build_path = /obj/item/weapon/pickaxe/diamond
+ sort_string = "KAAAD"
+
+/datum/design/item/weapon/mining/drill_diamond
+ id = "drill_diamond"
+ req_tech = list(TECH_MATERIAL = 6, TECH_POWER = 4, TECH_ENGINERING = 4)
+ materials = list("metal" = 3000, "glass" = 1000, "diamond" = 2000)
+ build_path = /obj/item/weapon/pickaxe/diamonddrill
+ sort_string = "KAAAE"
+
+/datum/design/item/medical
+ materials = list("metal" = 30, "glass" = 20)
+
+/datum/design/item/medical/AssembleDesignName()
..()
name = "Biotech device prototype ([item_name])"
-datum/design/item/medical/robot_scanner
+/datum/design/item/medical/robot_scanner
desc = "A hand-held scanner able to diagnose robotic injuries."
id = "robot_scanner"
- req_tech = list("magnets" = 3, "biotech" = 2, "engineering" = 3)
- materials = list("$metal" = 500, "$glass" = 200)
+ req_tech = list(TECH_MAGNET = 3, TECH_BIO = 2, TECH_ENGINERING = 3)
+ materials = list("metal" = 500, "glass" = 200)
build_path = /obj/item/device/robotanalyzer
+ sort_string = "MACFA"
-datum/design/item/medical/mass_spectrometer
+/datum/design/item/medical/mass_spectrometer
desc = "A device for analyzing chemicals in blood."
id = "mass_spectrometer"
- req_tech = list("biotech" = 2, "magnets" = 2)
- reliability_base = 76
+ req_tech = list(TECH_BIO = 2, TECH_MAGNET = 2)
build_path = /obj/item/device/mass_spectrometer
+ sort_string = "MACAA"
-datum/design/item/medical/adv_mass_spectrometer
+/datum/design/item/medical/adv_mass_spectrometer
desc = "A device for analyzing chemicals in blood and their quantities."
id = "adv_mass_spectrometer"
- req_tech = list("biotech" = 2, "magnets" = 4)
- reliability_base = 74
+ req_tech = list(TECH_BIO = 2, TECH_MAGNET = 4)
build_path = /obj/item/device/mass_spectrometer/adv
+ sort_string = "MACAB"
-datum/design/item/medical/reagent_scanner
+/datum/design/item/medical/reagent_scanner
desc = "A device for identifying chemicals."
id = "reagent_scanner"
- req_tech = list("biotech" = 2, "magnets" = 2)
- reliability_base = 76
+ req_tech = list(TECH_BIO = 2, TECH_MAGNET = 2)
build_path = /obj/item/device/reagent_scanner
+ sort_string = "MACBA"
-datum/design/item/medical/adv_reagent_scanner
+/datum/design/item/medical/adv_reagent_scanner
desc = "A device for identifying chemicals and their proportions."
id = "adv_reagent_scanner"
- req_tech = list("biotech" = 2, "magnets" = 4)
- reliability_base = 74
+ req_tech = list(TECH_BIO = 2, TECH_MAGNET = 4)
build_path = /obj/item/device/reagent_scanner/adv
+ sort_string = "MACBB"
-datum/design/item/medical/mmi
- id = "mmi"
- req_tech = list("programming" = 2, "biotech" = 3)
- build_type = PROTOLATHE | MECHFAB
- materials = list("$metal" = 1000, "$glass" = 500)
- reliability_base = 76
- build_path = /obj/item/device/mmi
- category = "Misc"
-
-datum/design/item/medical/mmi_radio
- id = "mmi_radio"
- req_tech = list("programming" = 2, "biotech" = 4)
- build_type = PROTOLATHE | MECHFAB
- materials = list("$metal" = 1200, "$glass" = 500)
- reliability_base = 74
- build_path = /obj/item/device/mmi/radio_enabled
- category = "Misc"
-
-datum/design/item/medical/synthetic_flash
- id = "sflash"
- req_tech = list("magnets" = 3, "combat" = 2)
- build_type = MECHFAB
- materials = list("$metal" = 750, "$glass" = 750)
- reliability_base = 76
- build_path = /obj/item/device/flash/synthetic
- category = "Misc"
-
-datum/design/item/medical/nanopaste
- desc = "A tube of paste containing swarms of repair nanites. Very effective in repairing robotic machinery."
- id = "nanopaste"
- req_tech = list("materials" = 4, "engineering" = 3)
- materials = list("$metal" = 7000, "$glass" = 7000)
- build_path = /obj/item/stack/nanopaste
-
-datum/design/item/scalpel_laser1
- name = "Basic Laser Scalpel"
- desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks basic and could be improved."
- id = "scalpel_laser1"
- req_tech = list("biotech" = 2, "materials" = 2, "magnets" = 2)
- materials = list("$metal" = 12500, "$glass" = 7500)
- build_path = /obj/item/weapon/scalpel/laser1
-
-datum/design/item/scalpel_laser2
- name = "Improved Laser Scalpel"
- desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks somewhat advanced."
- id = "scalpel_laser2"
- req_tech = list("biotech" = 3, "materials" = 4, "magnets" = 4)
- materials = list("$metal" = 12500, "$glass" = 7500, "$silver" = 2500)
- build_path = /obj/item/weapon/scalpel/laser2
-
-datum/design/item/scalpel_laser3
- name = "Advanced Laser Scalpel"
- desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks to be the pinnacle of precision energy cutlery!"
- id = "scalpel_laser3"
- req_tech = list("biotech" = 4, "materials" = 6, "magnets" = 5)
- materials = list("$metal" = 12500, "$glass" = 7500, "$silver" = 2000, "$gold" = 1500)
- build_path = /obj/item/weapon/scalpel/laser3
-
-datum/design/item/scalpel_manager
- name = "Incision Management System"
- desc = "A true extension of the surgeon's body, this marvel instantly and completely prepares an incision allowing for the immediate commencement of therapeutic steps."
- id = "scalpel_manager"
- req_tech = list("biotech" = 4, "materials" = 7, "magnets" = 5, "programming" = 4)
- materials = list ("$metal" = 12500, "$glass" = 7500, "$silver" = 1500, "$gold" = 1500, "$diamond" = 750)
- build_path = /obj/item/weapon/scalpel/manager
-
-// *** Beakers (not really a subtype of design/item/medical)
-datum/design/item/beaker/AssembleDesignName()
+/datum/design/item/beaker/AssembleDesignName()
name = "Beaker prototype ([item_name])"
-
-datum/design/item/beaker/bluespace
- name = "bluespace"
- desc = "A bluespace beaker, powered by experimental bluespace technology and Element Cuban combined with the Compound Pete. Can hold up to 300 units."
- id = "bluespacebeaker"
- req_tech = list("bluespace" = 2, "materials" = 6)
- materials = list("$metal" = 3000, "$phoron" = 3000, "$diamond" = 500)
- reliability_base = 76
- build_path = /obj/item/weapon/reagent_containers/glass/beaker/bluespace
-
-datum/design/item/beaker/noreact
+
+/datum/design/item/beaker/noreact
name = "cryostasis"
desc = "A cryostasis beaker that allows for chemical storage without reactions. Can hold up to 50 units."
id = "splitbeaker"
- req_tech = list("materials" = 2)
- materials = list("$metal" = 3000)
- reliability_base = 76
+ req_tech = list(TECH_MATERIAL = 2)
+ materials = list("metal" = 3000)
build_path = /obj/item/weapon/reagent_containers/glass/beaker/noreact
- category = "Misc"
+ sort_string = "MADAA"
-// *** Implants (not really a subtype of design/item/medical)
-datum/design/item/implant
- materials = list("$metal" = 50, "$glass" = 50)
+/datum/design/item/beaker/bluespace
+ name = TECH_BLUESPACE
+ desc = "A bluespace beaker, powered by experimental bluespace technology and Element Cuban combined with the Compound Pete. Can hold up to 300 units."
+ id = "bluespacebeaker"
+ req_tech = list(TECH_BLUESPACE = 2, TECH_MATERIAL = 6)
+ materials = list("metal" = 3000, "phoron" = 3000, "diamond" = 500)
+ build_path = /obj/item/weapon/reagent_containers/glass/beaker/bluespace
+ sort_string = "MADAB"
-datum/design/item/implant/AssembleDesignName()
+/datum/design/item/medical/nanopaste
+ desc = "A tube of paste containing swarms of repair nanites. Very effective in repairing robotic machinery."
+ id = "nanopaste"
+ req_tech = list(TECH_MATERIAL = 4, TECH_ENGINERING = 3)
+ materials = list("metal" = 7000, "glass" = 7000)
+ build_path = /obj/item/stack/nanopaste
+ sort_string = "MBAAA"
+
+/datum/design/item/scalpel_laser1
+ name = "Basic Laser Scalpel"
+ desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks basic and could be improved."
+ id = "scalpel_laser1"
+ req_tech = list(TECH_BIO = 2, TECH_MATERIAL = 2, TECH_MAGNET = 2)
+ materials = list("metal" = 12500, "glass" = 7500)
+ build_path = /obj/item/weapon/scalpel/laser1
+ sort_string = "MBBAA"
+
+/datum/design/item/scalpel_laser2
+ name = "Improved Laser Scalpel"
+ desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks somewhat advanced."
+ id = "scalpel_laser2"
+ req_tech = list(TECH_BIO = 3, TECH_MATERIAL = 4, TECH_MAGNET = 4)
+ materials = list("metal" = 12500, "glass" = 7500, "silver" = 2500)
+ build_path = /obj/item/weapon/scalpel/laser2
+ sort_string = "MBBAB"
+
+/datum/design/item/scalpel_laser3
+ name = "Advanced Laser Scalpel"
+ desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks to be the pinnacle of precision energy cutlery!"
+ id = "scalpel_laser3"
+ req_tech = list(TECH_BIO = 4, TECH_MATERIAL = 6, TECH_MAGNET = 5)
+ materials = list("metal" = 12500, "glass" = 7500, "silver" = 2000, "gold" = 1500)
+ build_path = /obj/item/weapon/scalpel/laser3
+ sort_string = "MBBAC"
+
+/datum/design/item/scalpel_manager
+ name = "Incision Management System"
+ desc = "A true extension of the surgeon's body, this marvel instantly and completely prepares an incision allowing for the immediate commencement of therapeutic steps."
+ id = "scalpel_manager"
+ req_tech = list(TECH_BIO = 4, TECH_MATERIAL = 7, TECH_MAGNET = 5, TECH_DATA = 4)
+ materials = list ("metal" = 12500, "glass" = 7500, "silver" = 1500, "gold" = 1500, "diamond" = 750)
+ build_path = /obj/item/weapon/scalpel/manager
+ sort_string = "MBBAD"
+
+/datum/design/item/implant
+ materials = list("metal" = 50, "glass" = 50)
+
+/datum/design/item/implant/AssembleDesignName()
..()
name = "Implantable biocircuit design ([item_name])"
-/* // Removal of loyalty implants. Can't think of a way to add this to the config option.
-datum/design/item/implant/loyalty
- name = "loyalty"
- id = "implant_loyal"
- req_tech = list("materials" = 2, "biotech" = 3)
- materials = list("$metal" = 7000, "$glass" = 7000)
- build_path = /obj/item/weapon/implantcase/loyalty"
-*/
-
-datum/design/item/implant/chemical
+/datum/design/item/implant/chemical
name = "chemical"
id = "implant_chem"
- req_tech = list("materials" = 2, "biotech" = 3)
+ req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 3)
build_path = /obj/item/weapon/implantcase/chem
+ sort_string = "MFAAA"
-datum/design/item/implant/freedom
+/datum/design/item/implant/freedom
name = "freedom"
id = "implant_free"
- req_tech = list("syndicate" = 2, "biotech" = 3)
+ req_tech = list(TECH_ILLEGAL = 2, TECH_BIO = 3)
build_path = /obj/item/weapon/implantcase/freedom
+ sort_string = "MFAAB"
-/////////////////////////////////////////
-/////////////////Weapons/////////////////
-/////////////////////////////////////////
-datum/design/item/weapon/AssembleDesignName()
+/datum/design/item/weapon/AssembleDesignName()
..()
name = "Weapon prototype ([item_name])"
-datum/design/item/weapon/AssembleDesignDesc()
+/datum/design/item/weapon/AssembleDesignDesc()
if(!desc)
if(build_path)
var/obj/item/I = build_path
desc = initial(I.desc)
..()
-datum/design/item/weapon/nuclear_gun
- id = "nuclear_gun"
- req_tech = list("combat" = 3, "materials" = 5, "powerstorage" = 3)
- materials = list("$metal" = 5000, "$glass" = 1000, "$uranium" = 500)
- reliability_base = 76
- build_path = /obj/item/weapon/gun/energy/gun/nuclear
- locked = 1
-
-datum/design/item/weapon/stunrevolver
+/datum/design/item/weapon/stunrevolver
id = "stunrevolver"
- req_tech = list("combat" = 3, "materials" = 3, "powerstorage" = 2)
- materials = list("$metal" = 4000)
+ req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_POWER = 2)
+ materials = list("metal" = 4000)
build_path = /obj/item/weapon/gun/energy/stunrevolver
- locked = 1
+ sort_string = "TAAAA"
-datum/design/item/weapon/lasercannon
+/datum/design/item/weapon/nuclear_gun
+ id = "nuclear_gun"
+ req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 5, TECH_POWER = 3)
+ materials = list("metal" = 5000, "glass" = 1000, "uranium" = 500)
+ build_path = /obj/item/weapon/gun/energy/gun/nuclear
+ sort_string = "TAAAB"
+
+/datum/design/item/weapon/lasercannon
desc = "The lasing medium of this prototype is enclosed in a tube lined with uranium-235 and subjected to high neutron flux in a nuclear reactor core."
id = "lasercannon"
- req_tech = list("combat" = 4, "materials" = 3, "powerstorage" = 3)
- materials = list("$metal" = 10000, "$glass" = 1000, "$diamond" = 2000)
+ req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3, TECH_POWER = 3)
+ materials = list("metal" = 10000, "glass" = 1000, "diamond" = 2000)
build_path = /obj/item/weapon/gun/energy/lasercannon
- locked = 1
+ sort_string = "TAAAC"
-datum/design/item/weapon/decloner
+/datum/design/item/weapon/phoronpistol
+ id = "ppistol"
+ req_tech = list(TECH_COMBAT = 5, TECH_PHORON = 4)
+ materials = list("metal" = 5000, "glass" = 1000, "phoron" = 3000)
+ build_path = /obj/item/weapon/gun/energy/toxgun
+ sort_string = "TAAAD"
+
+/datum/design/item/weapon/decloner
id = "decloner"
- req_tech = list("combat" = 8, "materials" = 7, "biotech" = 5, "powerstorage" = 6)
- materials = list("$gold" = 5000,"$uranium" = 10000, "mutagen" = 40)
+ req_tech = list(TECH_COMBAT = 8, TECH_MATERIAL = 7, TECH_BIO = 5, TECH_POWER = 6)
+ materials = list("gold" = 5000,"uranium" = 10000, "mutagen" = 40)
build_path = /obj/item/weapon/gun/energy/decloner
- locked = 1
+ sort_string = "TAAAE"
-datum/design/item/weapon/chemsprayer
- desc = "An advanced chem spraying device."
- id = "chemsprayer"
- req_tech = list("materials" = 3, "engineering" = 3, "biotech" = 2)
- materials = list("$metal" = 5000, "$glass" = 1000)
- reliability_base = 100
- build_path = /obj/item/weapon/reagent_containers/spray/chemsprayer
-
-datum/design/item/weapon/rapidsyringe
- id = "rapidsyringe"
- req_tech = list("combat" = 3, "materials" = 3, "engineering" = 3, "biotech" = 2)
- materials = list("$metal" = 5000, "$glass" = 1000)
- build_path = /obj/item/weapon/gun/launcher/syringe/rapid
-/*
-datum/design/item/weapon/largecrossbow
- name = "Energy Crossbow"
- desc = "A weapon favoured by syndicate infiltration teams."
- id = "largecrossbow"
- req_tech = list("combat" = 4, "materials" = 5, "engineering" = 3, "biotech" = 4, "syndicate" = 3)
- materials = list("$metal" = 5000, "$glass" = 1000, "$uranium" = 1000, "$silver" = 1000)
- build_path = /obj/item/weapon/gun/energy/crossbow/largecrossbow"
-*/
-datum/design/item/weapon/temp_gun
- desc = "A gun that shoots high-powered glass-encased energy temperature bullets."
- id = "temp_gun"
- req_tech = list("combat" = 3, "materials" = 4, "powerstorage" = 3, "magnets" = 2)
- materials = list("$metal" = 5000, "$glass" = 500, "$silver" = 3000)
- build_path = /obj/item/weapon/gun/energy/temperature
- locked = 1
-
-datum/design/item/weapon/flora_gun
- id = "flora_gun"
- req_tech = list("materials" = 2, "biotech" = 3, "powerstorage" = 3)
- materials = list("$metal" = 2000, "$glass" = 500, "$uranium" = 500)
- build_path = /obj/item/weapon/gun/energy/floragun
-
-datum/design/item/weapon/large_grenade
- id = "large_Grenade"
- req_tech = list("combat" = 3, "materials" = 2)
- materials = list("$metal" = 3000)
- reliability_base = 79
- build_path = /obj/item/weapon/grenade/chem_grenade/large
-
-datum/design/item/weapon/smg
+/datum/design/item/weapon/smg
id = "smg"
- req_tech = list("combat" = 4, "materials" = 3)
- materials = list("$metal" = 8000, "$silver" = 2000, "$diamond" = 1000)
+ req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3)
+ materials = list("metal" = 8000, "silver" = 2000, "diamond" = 1000)
build_path = /obj/item/weapon/gun/projectile/automatic
- locked = 1
+ sort_string = "TAABA"
-datum/design/item/weapon/ammo_9mm
+/datum/design/item/weapon/ammo_9mm
id = "ammo_9mm"
- req_tech = list("combat" = 4, "materials" = 3)
- materials = list("$metal" = 3750, "$silver" = 100)
+ req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3)
+ materials = list("metal" = 3750, "silver" = 100)
build_path = /obj/item/ammo_magazine/c9mm
+ sort_string = "TAACA"
-datum/design/item/weapon/stunshell
+/datum/design/item/weapon/stunshell
desc = "A stunning shell for a shotgun."
id = "stunshell"
- req_tech = list("combat" = 3, "materials" = 3)
- materials = list("$metal" = 4000)
+ req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3)
+ materials = list("metal" = 4000)
build_path = /obj/item/ammo_casing/shotgun/stunshell
+ sort_string = "TAACB"
-datum/design/item/weapon/phoronpistol
- id = "ppistol"
- req_tech = list("combat" = 5, "phorontech" = 4)
- materials = list("$metal" = 5000, "$glass" = 1000, "$phoron" = 3000)
- build_path = /obj/item/weapon/gun/energy/toxgun
+/datum/design/item/weapon/chemsprayer
+ desc = "An advanced chem spraying device."
+ id = "chemsprayer"
+ req_tech = list(TECH_MATERIAL = 3, TECH_ENGINERING = 3, TECH_BIO = 2)
+ materials = list("metal" = 5000, "glass" = 1000)
+ build_path = /obj/item/weapon/reagent_containers/spray/chemsprayer
+ sort_string = "TABAA"
-/////////////////////////////////////////
-/////////////////Mining//////////////////
-/////////////////////////////////////////
-//Subtype of item/weapon/, because we get the nice desc update
-datum/design/item/weapon/mining/AssembleDesignName()
- ..()
- name = "Mining equipment design ([item_name])"
+/datum/design/item/weapon/rapidsyringe
+ id = "rapidsyringe"
+ req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_ENGINERING = 3, TECH_BIO = 2)
+ materials = list("metal" = 5000, "glass" = 1000)
+ build_path = /obj/item/weapon/gun/launcher/syringe/rapid
+ sort_string = "TABAB"
-datum/design/item/weapon/mining/jackhammer
- id = "jackhammer"
- req_tech = list("materials" = 3, "powerstorage" = 2, "engineering" = 2)
- materials = list("$metal" = 2000, "$glass" = 500, "$silver" = 500)
- build_path = /obj/item/weapon/pickaxe/jackhammer
+/datum/design/item/weapon/temp_gun
+ desc = "A gun that shoots high-powered glass-encased energy temperature bullets."
+ id = "temp_gun"
+ req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 4, TECH_POWER = 3, TECH_MAGNET = 2)
+ materials = list("metal" = 5000, "glass" = 500, "silver" = 3000)
+ build_path = /obj/item/weapon/gun/energy/temperature
+ sort_string = "TABAC"
-datum/design/item/weapon/mining/drill
- id = "drill"
- req_tech = list("materials" = 2, "powerstorage" = 3, "engineering" = 2)
- materials = list("$metal" = 6000, "$glass" = 1000) //expensive, but no need for miners.
- build_path = /obj/item/weapon/pickaxe/drill
+/datum/design/item/weapon/large_grenade
+ id = "large_Grenade"
+ req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 2)
+ materials = list("metal" = 3000)
+ build_path = /obj/item/weapon/grenade/chem_grenade/large
+ sort_string = "TACAA"
-datum/design/item/weapon/mining/plasmacutter
- id = "plasmacutter"
- req_tech = list("materials" = 4, "phorontech" = 3, "engineering" = 3)
- materials = list("$metal" = 1500, "$glass" = 500, "$gold" = 500, "$phoron" = 500)
- reliability_base = 79
- build_path = /obj/item/weapon/pickaxe/plasmacutter
+/datum/design/item/weapon/flora_gun
+ id = "flora_gun"
+ req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 3, TECH_POWER = 3)
+ materials = list("metal" = 2000, "glass" = 500, "uranium" = 500)
+ build_path = /obj/item/weapon/gun/energy/floragun
+ sort_string = "TBAAA"
-datum/design/item/weapon/mining/pick_diamond
- id = "pick_diamond"
- req_tech = list("materials" = 6)
- materials = list("$diamond" = 3000)
- build_path = /obj/item/weapon/pickaxe/diamond
+/datum/design/item/stock_part/subspace_ansible
+ id = "s-ansible"
+ req_tech = list(TECH_DATA = 3, TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2)
+ materials = list("metal" = 80, "silver" = 20)
+ build_path = /obj/item/weapon/stock_parts/subspace/ansible
+ sort_string = "UAAAA"
-datum/design/item/weapon/mining/drill_diamond
- id = "drill_diamond"
- req_tech = list("materials" = 6, "powerstorage" = 4, "engineering" = 4)
- materials = list("$metal" = 3000, "$glass" = 1000, "$diamond" = 3750) //Yes, a whole diamond is needed.
- reliability_base = 79
- build_path = /obj/item/weapon/pickaxe/diamonddrill
+/datum/design/item/stock_part/hyperwave_filter
+ id = "s-filter"
+ req_tech = list(TECH_DATA = 3, TECH_MAGNET = 3)
+ materials = list("metal" = 40, "silver" = 10)
+ build_path = /obj/item/weapon/stock_parts/subspace/filter
+ sort_string = "UAAAB"
-/////////////////////////////////////////
-//////////////Blue Space/////////////////
-/////////////////////////////////////////
-datum/design/item/beacon
+/datum/design/item/stock_part/subspace_amplifier
+ id = "s-amplifier"
+ req_tech = list(TECH_DATA = 3, TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2)
+ materials = list("metal" = 10, "gold" = 30, "uranium" = 15)
+ build_path = /obj/item/weapon/stock_parts/subspace/amplifier
+ sort_string = "UAAAC"
+
+/datum/design/item/stock_part/subspace_treatment
+ id = "s-treatment"
+ req_tech = list(TECH_DATA = 3, TECH_MAGNET = 2, TECH_MATERIAL = 4, TECH_BLUESPACE = 2)
+ materials = list("metal" = 10, "silver" = 20)
+ build_path = /obj/item/weapon/stock_parts/subspace/treatment
+ sort_string = "UAAAD"
+
+/datum/design/item/stock_part/subspace_analyzer
+ id = "s-analyzer"
+ req_tech = list(TECH_DATA = 3, TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2)
+ materials = list("metal" = 10, "gold" = 15)
+ build_path = /obj/item/weapon/stock_parts/subspace/analyzer
+ sort_string = "UAAAE"
+
+/datum/design/item/stock_part/subspace_crystal
+ id = "s-crystal"
+ req_tech = list(TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2)
+ materials = list("glass" = 1000, "silver" = 20, "gold" = 20)
+ build_path = /obj/item/weapon/stock_parts/subspace/crystal
+ sort_string = "UAAAF"
+
+/datum/design/item/stock_part/subspace_transmitter
+ id = "s-transmitter"
+ req_tech = list(TECH_MAGNET = 5, TECH_MATERIAL = 5, TECH_BLUESPACE = 3)
+ materials = list("glass" = 100, "silver" = 10, "uranium" = 15)
+ build_path = /obj/item/weapon/stock_parts/subspace/transmitter
+ sort_string = "UAAAG"
+
+/datum/design/item/light_replacer
+ name = "Light replacer"
+ desc = "A device to automatically replace lights. Refill with working lightbulbs."
+ id = "light_replacer"
+ req_tech = list(TECH_MAGNET = 3, TECH_MATERIAL = 4)
+ materials = list("metal" = 1500, "silver" = 150, "glass" = 3000)
+ build_path = /obj/item/device/lightreplacer
+ sort_string = "VAAAH"
+
+/datum/design/item/paicard
+ name = "'pAI', personal artificial intelligence device"
+ id = "paicard"
+ req_tech = list(TECH_DATA = 2)
+ materials = list("glass" = 500, "metal" = 500)
+ build_path = /obj/item/device/paicard
+ sort_string = "VABAI"
+
+/datum/design/item/intellicard
+ name = "'intelliCard', AI preservation and transportation system"
+ desc = "Allows for the construction of an intelliCard."
+ id = "intellicard"
+ req_tech = list(TECH_DATA = 4, TECH_MATERIAL = 4)
+ materials = list("glass" = 1000, "gold" = 200)
+ build_path = /obj/item/device/aicard
+ sort_string = "VACAA"
+
+/datum/design/item/posibrain
+ id = "posibrain"
+ req_tech = list(TECH_ENGINERING = 4, TECH_MATERIAL = 6, TECH_BLUESPACE = 2, TECH_DATA = 4)
+ materials = list("metal" = 2000, "glass" = 1000, "silver" = 1000, "gold" = 500, "phoron" = 500, "diamond" = 100)
+ build_path = /obj/item/device/mmi/digital/posibrain
+ sort_string = "VACAB"
+
+/datum/design/item/medical/mmi
+ id = "mmi"
+ req_tech = list(TECH_DATA = 2, TECH_BIO = 3)
+ build_type = PROTOLATHE | MECHFAB
+ materials = list("metal" = 1000, "glass" = 500)
+ build_path = /obj/item/device/mmi
+ category = "Misc"
+ sort_string = "VACBA"
+
+/datum/design/item/medical/mmi_radio
+ id = "mmi_radio"
+ req_tech = list(TECH_DATA = 2, TECH_BIO = 4)
+ build_type = PROTOLATHE | MECHFAB
+ materials = list("metal" = 1200, "glass" = 500)
+ build_path = /obj/item/device/mmi/radio_enabled
+ category = "Misc"
+ sort_string = "VACBB"
+
+/datum/design/item/beacon
name = "Bluespace tracking beacon design"
id = "beacon"
- req_tech = list("bluespace" = 1)
- materials = list ("$metal" = 20, "$glass" = 10)
+ req_tech = list(TECH_BLUESPACE = 1)
+ materials = list ("metal" = 20, "glass" = 10)
build_path = /obj/item/device/radio/beacon
+ sort_string = "VADAA"
-datum/design/item/bag_holding
+/datum/design/item/bag_holding
name = "'Bag of Holding', an infinite capacity bag prototype"
desc = "Using localized pockets of bluespace this bag prototype offers incredible storage capacity with the contents weighting nothing. It's a shame the bag itself is pretty heavy."
id = "bag_holding"
- req_tech = list("bluespace" = 4, "materials" = 6)
- materials = list("$gold" = 3000, "$diamond" = 1500, "$uranium" = 250)
- reliability_base = 80
+ req_tech = list(TECH_BLUESPACE = 4, TECH_MATERIAL = 6)
+ materials = list("gold" = 3000, "diamond" = 1500, "uranium" = 250)
build_path = /obj/item/weapon/storage/backpack/holding
+ sort_string = "VAEAA"
+
+/datum/design/item/binaryencrypt
+ name = "Binary encryption key"
+ desc = "Allows for deciphering the binary channel on-the-fly."
+ id = "binaryencrypt"
+ req_tech = list(TECH_ILLEGAL = 2)
+ materials = list("metal" = 300, "glass" = 300)
+ build_path = /obj/item/device/encryptionkey/binary
+ sort_string = "VASAA"
+
+/datum/design/item/chameleon
+ name = "Holographic equipment kit"
+ desc = "A kit of dangerous, high-tech equipment with changeable looks."
+ id = "chameleon"
+ req_tech = list(TECH_ILLEGAL = 2)
+ materials = list("metal" = 500)
+ build_path = /obj/item/weapon/storage/box/syndie_kit/chameleon
+ sort_string = "VASBA"
/*
-datum/design/bluespace_crystal
- name = "Artificial bluespace crystal"
- desc = "A small blue crystal with mystical properties."
- id = "bluespace_crystal"
- req_tech = list("bluespace" = 5, "materials" = 7)
- build_type = PROTOLATHE
- materials = list("$gold" = 1500, "$diamond" = 3000, "$phoron" = 1500)
- reliability_base = 100
- build_path = /obj/item/bluespace_crystal/artificial"
+CIRCUITS BELOW
*/
-/////////////////////////////////////////
-/////////////////HUDs////////////////////
-/////////////////////////////////////////
-datum/design/item/hud
- materials = list("$metal" = 50, "$glass" = 50)
+/datum/design/circuit
+ build_type = IMPRINTER
+ req_tech = list(TECH_DATA = 2)
+ materials = list("glass" = 2000)
+ chemicals = list("sacid" = 20)
+ time = 5
-datum/design/item/hud/AssembleDesignName()
+/datum/design/circuit/AssembleDesignName()
..()
- name = "HUD glasses prototype ([item_name])"
+ if(build_path)
+ var/obj/item/weapon/circuitboard/C = new build_path()
+ if(C && istype(C))
+ if(C.board_type == "machine")
+ name = "Machine circuit design ([item_name])"
+ qdel(C)
+ return
+ else if(C.board_type == "computer")
+ name = "Computer circuit design ([item_name])"
+ qdel(C)
+ return
+ name = "Circuit design ([item_name])"
-datum/design/item/hud/AssembleDesignDesc()
- desc = "Allows for the construction of \a [item_name] HUD glasses."
+/datum/design/circuit/AssembleDesignDesc()
+ if(!desc)
+ desc = "Allows for the construction of \a [item_name] circuit board."
-datum/design/item/hud/health
- name = "health scanner"
- id = "health_hud"
- req_tech = list("biotech" = 2, "magnets" = 3)
- build_path = /obj/item/clothing/glasses/hud/health
+/datum/design/circuit/arcademachine
+ name = "arcade machine"
+ id = "arcademachine"
+ req_tech = list(TECH_DATA = 1)
+ build_path = /obj/item/weapon/circuitboard/arcade
+ sort_string = "MAAAA"
-datum/design/item/hud/security
- name = "security records"
- id = "security_hud"
- req_tech = list("magnets" = 3, "combat" = 2)
- build_path = /obj/item/clothing/glasses/hud/security
- locked = 1
+/datum/design/circuit/seccamera
+ name = "security camera monitor"
+ id = "seccamera"
+ build_path = /obj/item/weapon/circuitboard/security
+ sort_string = "DAAAA"
-/////////////////////////////////////////
-////////////////PDA Stuff////////////////
-/////////////////////////////////////////
-datum/design/item/pda
+/datum/design/circuit/secdata
+ name = "security records console"
+ id = "sec_data"
+ build_path = /obj/item/weapon/circuitboard/secure_data
+ sort_string = "DABAA"
+
+/datum/design/circuit/prisonmanage
+ name = "prisoner management console"
+ id = "prisonmanage"
+ build_path = /obj/item/weapon/circuitboard/prisoner
+ sort_string = "DACAA"
+
+/datum/design/circuit/med_data
+ name = "medical records console"
+ id = "med_data"
+ build_path = /obj/item/weapon/circuitboard/med_data
+ sort_string = "FAAAA"
+
+/datum/design/circuit/operating
+ name = "patient monitoring console"
+ id = "operating"
+ build_path = /obj/item/weapon/circuitboard/operating
+ sort_string = "FACAA"
+
+/datum/design/circuit/pandemic
+ name = "PanD.E.M.I.C. 2200"
+ id = "pandemic"
+ build_path = /obj/item/weapon/circuitboard/pandemic
+ sort_string = "FAEAA"
+
+/datum/design/circuit/scan_console
+ name = "DNA machine"
+ id = "scan_console"
+ build_path = /obj/item/weapon/circuitboard/scan_consolenew
+ sort_string = "FAGAA"
+
+/datum/design/circuit/clonecontrol
+ name = "cloning control console"
+ id = "clonecontrol"
+ req_tech = list(TECH_DATA = 3, TECH_BIO = 3)
+ build_path = /obj/item/weapon/circuitboard/cloning
+ sort_string = "FAGAC"
+
+/datum/design/circuit/clonepod
+ name = "clone pod"
+ id = "clonepod"
+ req_tech = list(TECH_DATA = 3, TECH_BIO = 3)
+ build_path = /obj/item/weapon/circuitboard/clonepod
+ sort_string = "FAGAE"
+
+/datum/design/circuit/clonescanner
+ name = "cloning scanner"
+ id = "clonescanner"
+ req_tech = list(TECH_DATA = 3, TECH_BIO = 3)
+ build_path = /obj/item/weapon/circuitboard/clonescanner
+ sort_string = "FAGAG"
+
+/datum/design/circuit/crewconsole
+ name = "crew monitoring console"
+ id = "crewconsole"
+ req_tech = list(TECH_DATA = 3, TECH_MAGNET = 2, TECH_BIO = 2)
+ build_path = /obj/item/weapon/circuitboard/crew
+ sort_string = "FAGAI"
+
+/datum/design/circuit/teleconsole
+ name = "teleporter control console"
+ id = "teleconsole"
+ req_tech = list(TECH_DATA = 3, TECH_BLUESPACE = 2)
+ build_path = /obj/item/weapon/circuitboard/teleporter
+ sort_string = "HAAAA"
+
+/datum/design/circuit/robocontrol
+ name = "robotics control console"
+ id = "robocontrol"
+ req_tech = list(TECH_DATA = 4)
+ build_path = /obj/item/weapon/circuitboard/robotics
+ sort_string = "HAAAB"
+
+/datum/design/circuit/mechacontrol
+ name = "exosuit control console"
+ id = "mechacontrol"
+ req_tech = list(TECH_DATA = 3)
+ build_path = /obj/item/weapon/circuitboard/mecha_control
+ sort_string = "HAAAC"
+
+/datum/design/circuit/mechapower
+ name = "mech bay power control console"
+ id = "mechapower"
+ build_path = /obj/item/weapon/circuitboard/mech_bay_power_console
+ sort_string = "HAAAD"
+
+/datum/design/circuit/rdconsole
+ name = "R&D control console"
+ id = "rdconsole"
+ req_tech = list(TECH_DATA = 4)
+ build_path = /obj/item/weapon/circuitboard/rdconsole
+ sort_string = "HAAAE"
+
+/datum/design/circuit/aifixer
+ name = "AI integrity restorer"
+ id = "aifixer"
+ req_tech = list(TECH_DATA = 3, TECH_BIO = 2)
+ build_path = /obj/item/weapon/circuitboard/aifixer
+ sort_string = "HAAAF"
+
+/datum/design/circuit/comm_monitor
+ name = "telecommunications monitoring console"
+ id = "comm_monitor"
+ req_tech = list(TECH_DATA = 3)
+ build_path = /obj/item/weapon/circuitboard/comm_monitor
+ sort_string = "HAACA"
+
+/datum/design/circuit/comm_server
+ name = "telecommunications server monitoring console"
+ id = "comm_server"
+ req_tech = list(TECH_DATA = 3)
+ build_path = /obj/item/weapon/circuitboard/comm_server
+ sort_string = "HAACB"
+
+/datum/design/circuit/message_monitor
+ name = "messaging monitor console"
+ id = "message_monitor"
+ req_tech = list(TECH_DATA = 5)
+ build_path = /obj/item/weapon/circuitboard/message_monitor
+ sort_string = "HAACC"
+
+/datum/design/circuit/aiupload
+ name = "AI upload console"
+ id = "aiupload"
+ req_tech = list(TECH_DATA = 4)
+ build_path = /obj/item/weapon/circuitboard/aiupload
+ sort_string = "HAABA"
+
+/datum/design/circuit/borgupload
+ name = "cyborg upload console"
+ id = "borgupload"
+ req_tech = list(TECH_DATA = 4)
+ build_path = /obj/item/weapon/circuitboard/borgupload
+ sort_string = "HAABB"
+
+/datum/design/circuit/destructive_analyzer
+ name = "destructive analyzer"
+ id = "destructive_analyzer"
+ req_tech = list(TECH_DATA = 2, TECH_MAGNET = 2, TECH_ENGINERING = 2)
+ build_path = /obj/item/weapon/circuitboard/destructive_analyzer
+ sort_string = "HABAA"
+
+/datum/design/circuit/protolathe
+ name = "protolathe"
+ id = "protolathe"
+ req_tech = list(TECH_DATA = 2, TECH_ENGINERING = 2)
+ build_path = /obj/item/weapon/circuitboard/protolathe
+ sort_string = "HABAB"
+
+/datum/design/circuit/circuit_imprinter
+ name = "circuit imprinter"
+ id = "circuit_imprinter"
+ req_tech = list(TECH_DATA = 2, TECH_ENGINERING = 2)
+ build_path = /obj/item/weapon/circuitboard/circuit_imprinter
+ sort_string = "HABAC"
+
+/datum/design/circuit/autolathe
+ name = "autolathe board"
+ id = "autolathe"
+ req_tech = list(TECH_DATA = 2, TECH_ENGINERING = 2)
+ build_path = /obj/item/weapon/circuitboard/autolathe
+ sort_string = "HABAD"
+
+/datum/design/circuit/rdservercontrol
+ name = "R&D server control console"
+ id = "rdservercontrol"
+ req_tech = list(TECH_DATA = 3)
+ build_path = /obj/item/weapon/circuitboard/rdservercontrol
+ sort_string = "HABBA"
+
+/datum/design/circuit/rdserver
+ name = "R&D server"
+ id = "rdserver"
+ req_tech = list(TECH_DATA = 3)
+ build_path = /obj/item/weapon/circuitboard/rdserver
+ sort_string = "HABBB"
+
+/datum/design/circuit/mechfab
+ name = "exosuit fabricator"
+ id = "mechfab"
+ req_tech = list(TECH_DATA = 3, TECH_ENGINERING = 3)
+ build_path = /obj/item/weapon/circuitboard/mechfab
+ sort_string = "HABAE"
+
+/datum/design/circuit/recharge_station
+ name = "cyborg recharge station"
+ id = "recharge_station"
+ req_tech = list(TECH_DATA = 3, TECH_ENGINERING = 2)
+ build_path = /obj/item/weapon/circuitboard/recharge_station
+ sort_string = "HACAA"
+
+/datum/design/circuit/atmosalerts
+ name = "atmosphere alert console"
+ id = "atmosalerts"
+ build_path = /obj/item/weapon/circuitboard/atmos_alert
+ sort_string = "JAAAA"
+
+/datum/design/circuit/air_management
+ name = "atmosphere monitoring console"
+ id = "air_management"
+ build_path = /obj/item/weapon/circuitboard/air_management
+ sort_string = "JAAAB"
+
+/datum/design/circuit/rcon_console
+ name = "RCON remote control console"
+ id = "rcon_console"
+ req_tech = list(TECH_DATA = 4, TECH_ENGINERING = 3, TECH_POWER = 5)
+ build_path = /obj/item/weapon/circuitboard/rcon_console
+ sort_string = "JAAAC"
+
+/datum/design/circuit/dronecontrol
+ name = "drone control console"
+ id = "dronecontrol"
+ req_tech = list(TECH_DATA = 4)
+ build_path = /obj/item/weapon/circuitboard/drone_control
+ sort_string = "JAAAD"
+
+/datum/design/circuit/powermonitor
+ name = "power monitoring console"
+ id = "powermonitor"
+ build_path = /obj/item/weapon/circuitboard/powermonitor
+ sort_string = "JAAAE"
+
+/datum/design/circuit/solarcontrol
+ name = "solar control console"
+ id = "solarcontrol"
+ build_path = /obj/item/weapon/circuitboard/solar_control
+ sort_string = "JAAAF"
+
+/datum/design/circuit/pacman
+ name = "PACMAN-type generator"
+ id = "pacman"
+ req_tech = list(TECH_DATA = 3, TECH_PHORON = 3, TECH_POWER = 3, TECH_ENGINERING = 3)
+ build_path = /obj/item/weapon/circuitboard/pacman
+ sort_string = "JBAAA"
+
+/datum/design/circuit/superpacman
+ name = "SUPERPACMAN-type generator"
+ id = "superpacman"
+ req_tech = list(TECH_DATA = 3, TECH_POWER = 4, TECH_ENGINERING = 4)
+ build_path = /obj/item/weapon/circuitboard/pacman/super
+ sort_string = "JBAAB"
+
+/datum/design/circuit/mrspacman
+ name = "MRSPACMAN-type generator"
+ id = "mrspacman"
+ req_tech = list(TECH_DATA = 3, TECH_POWER = 5, TECH_ENGINERING = 5)
+ build_path = /obj/item/weapon/circuitboard/pacman/mrs
+ sort_string = "JBAAC"
+
+/datum/design/circuit/batteryrack
+ name = "cell rack PSU"
+ id = "batteryrack"
+ req_tech = list(TECH_POWER = 3, TECH_ENGINERING = 2)
+ build_path = /obj/item/weapon/circuitboard/batteryrack
+ sort_string = "JBABA"
+
+/datum/design/circuit/smes_cell
+ name = "'SMES' superconductive magnetic energy storage"
+ desc = "Allows for the construction of circuit boards used to build a SMES."
+ id = "smes_cell"
+ req_tech = list(TECH_POWER = 7, TECH_ENGINERING = 5)
+ build_path = /obj/item/weapon/circuitboard/smes
+ sort_string = "JBABB"
+
+/datum/design/circuit/gas_heater
+ name = "gas heating system"
+ id = "gasheater"
+ req_tech = list(TECH_POWER = 2, TECH_ENGINERING = 1)
+ build_path = /obj/item/weapon/circuitboard/unary_atmos/heater
+ sort_string = "JCAAA"
+
+/datum/design/circuit/gas_cooler
+ name = "gas cooling system"
+ id = "gascooler"
+ req_tech = list(TECH_MAGNET = 2, TECH_ENGINERING = 2)
+ build_path = /obj/item/weapon/circuitboard/unary_atmos/cooler
+ sort_string = "JCAAB"
+
+/datum/design/circuit/secure_airlock
+ name = "secure airlock electronics"
+ desc = "Allows for the construction of a tamper-resistant airlock electronics."
+ id = "securedoor"
+ req_tech = list(TECH_DATA = 3)
+ build_path = /obj/item/weapon/airlock_electronics/secure
+ sort_string = "JDAAA"
+
+/datum/design/circuit/ordercomp
+ name = "supply ordering console"
+ id = "ordercomp"
+ build_path = /obj/item/weapon/circuitboard/ordercomp
+ sort_string = "KAAAA"
+
+/datum/design/circuit/supplycomp
+ name = "supply control console"
+ id = "supplycomp"
+ req_tech = list(TECH_DATA = 3)
+ build_path = /obj/item/weapon/circuitboard/supplycomp
+ sort_string = "KAAAB"
+
+/datum/design/circuit/biogenerator
+ name = "biogenerator"
+ id = "biogenerator"
+ req_tech = list(TECH_DATA = 2)
+ build_path = /obj/item/weapon/circuitboard/biogenerator
+ sort_string = "KBAAA"
+
+/datum/design/circuit/comconsole
+ name = "communications console"
+ id = "comconsole"
+ build_path = /obj/item/weapon/circuitboard/communications
+ sort_string = "LAAAA"
+
+/datum/design/circuit/idcardconsole
+ name = "ID card modification console"
+ id = "idcardconsole"
+ build_path = /obj/item/weapon/circuitboard/card
+ sort_string = "LAAAB"
+
+/datum/design/circuit/emp_data
+ name = "employment records console"
+ id = "emp_data"
+ build_path = /obj/item/weapon/circuitboard/skills
+ sort_string = "LAAAC"
+
+/datum/design/circuit/mecha
+ req_tech = list(TECH_DATA = 3)
+
+/datum/design/circuit/mecha/AssembleDesignName()
+ name = "Exosuit module circuit design ([name])"
+/datum/design/circuit/mecha/AssembleDesignDesc()
+ desc = "Allows for the construction of \a [name] module."
+
+/datum/design/circuit/mecha/ripley_main
+ name = "APLU 'Ripley' central control"
+ id = "ripley_main"
+ build_path = /obj/item/weapon/circuitboard/mecha/ripley/main
+ sort_string = "NAAAA"
+
+/datum/design/circuit/mecha/ripley_peri
+ name = "APLU 'Ripley' peripherals control"
+ id = "ripley_peri"
+ build_path = /obj/item/weapon/circuitboard/mecha/ripley/peripherals
+ sort_string = "NAAAB"
+
+/datum/design/circuit/mecha/odysseus_main
+ name = "'Odysseus' central control"
+ id = "odysseus_main"
+ req_tech = list(TECH_DATA = 3,TECH_BIO = 2)
+ build_path = /obj/item/weapon/circuitboard/mecha/odysseus/main
+ sort_string = "NAABA"
+
+/datum/design/circuit/mecha/odysseus_peri
+ name = "'Odysseus' peripherals control"
+ id = "odysseus_peri"
+ req_tech = list(TECH_DATA = 3,TECH_BIO = 2)
+ build_path = /obj/item/weapon/circuitboard/mecha/odysseus/peripherals
+ sort_string = "NAABB"
+
+/datum/design/circuit/mecha/gygax_main
+ name = "'Gygax' central control"
+ id = "gygax_main"
+ req_tech = list(TECH_DATA = 4)
+ build_path = /obj/item/weapon/circuitboard/mecha/gygax/main
+ sort_string = "NAACA"
+
+/datum/design/circuit/mecha/gygax_peri
+ name = "'Gygax' peripherals control"
+ id = "gygax_peri"
+ req_tech = list(TECH_DATA = 4)
+ build_path = /obj/item/weapon/circuitboard/mecha/gygax/peripherals
+ sort_string = "NAACB"
+
+/datum/design/circuit/mecha/gygax_targ
+ name = "'Gygax' weapon control and targeting"
+ id = "gygax_targ"
+ req_tech = list(TECH_DATA = 4, TECH_COMBAT = 2)
+ build_path = /obj/item/weapon/circuitboard/mecha/gygax/targeting
+ sort_string = "NAACC"
+
+/datum/design/circuit/mecha/durand_main
+ name = "'Durand' central control"
+ id = "durand_main"
+ req_tech = list(TECH_DATA = 4)
+ build_path = /obj/item/weapon/circuitboard/mecha/durand/main
+ sort_string = "NAADA"
+
+/datum/design/circuit/mecha/durand_peri
+ name = "'Durand' peripherals control"
+ id = "durand_peri"
+ req_tech = list(TECH_DATA = 4)
+ build_path = /obj/item/weapon/circuitboard/mecha/durand/peripherals
+ sort_string = "NAADB"
+
+/datum/design/circuit/mecha/durand_targ
+ name = "'Durand' weapon control and targeting"
+ id = "durand_targ"
+ req_tech = list(TECH_DATA = 4, TECH_COMBAT = 2)
+ build_path = /obj/item/weapon/circuitboard/mecha/durand/targeting
+ sort_string = "NAADC"
+
+/datum/design/circuit/tcom
+ req_tech = list(TECH_DATA = 4, TECH_ENGINERING = 4)
+
+/datum/design/circuit/tcom/AssembleDesignName()
+ name = "Telecommunications machinery circuit design ([name])"
+/datum/design/circuit/tcom/AssembleDesignDesc()
+ desc = "Allows for the construction of a telecommunications [name] circuit board."
+
+/datum/design/circuit/tcom/server
+ name = "server mainframe"
+ id = "tcom-server"
+ build_path = /obj/item/weapon/circuitboard/telecomms/server
+ sort_string = "PAAAA"
+
+/datum/design/circuit/tcom/processor
+ name = "processor unit"
+ id = "tcom-processor"
+ build_path = /obj/item/weapon/circuitboard/telecomms/processor
+ sort_string = "PAAAB"
+
+/datum/design/circuit/tcom/bus
+ name = "bus mainframe"
+ id = "tcom-bus"
+ build_path = /obj/item/weapon/circuitboard/telecomms/bus
+ sort_string = "PAAAC"
+
+/datum/design/circuit/tcom/hub
+ name = "hub mainframe"
+ id = "tcom-hub"
+ build_path = /obj/item/weapon/circuitboard/telecomms/hub
+ sort_string = "PAAAD"
+
+/datum/design/circuit/tcom/relay
+ name = "relay mainframe"
+ id = "tcom-relay"
+ req_tech = list(TECH_DATA = 3, TECH_ENGINERING = 4, TECH_BLUESPACE = 3)
+ build_path = /obj/item/weapon/circuitboard/telecomms/relay
+ sort_string = "PAAAE"
+
+/datum/design/circuit/tcom/broadcaster
+ name = "subspace broadcaster"
+ id = "tcom-broadcaster"
+ req_tech = list(TECH_DATA = 4, TECH_ENGINERING = 4, TECH_BLUESPACE = 2)
+ build_path = /obj/item/weapon/circuitboard/telecomms/broadcaster
+ sort_string = "PAAAF"
+
+/datum/design/circuit/tcom/receiver
+ name = "subspace receiver"
+ id = "tcom-receiver"
+ req_tech = list(TECH_DATA = 4, TECH_ENGINERING = 3, TECH_BLUESPACE = 2)
+ build_path = /obj/item/weapon/circuitboard/telecomms/receiver
+ sort_string = "PAAAG"
+
+/datum/design/circuit/shield
+ req_tech = list(TECH_BLUESPACE = 4, TECH_PHORON = 3)
+ materials = list("glass" = 2000, "gold" = 1000)
+
+/datum/design/circuit/shield/AssembleDesignName()
+ name = "Shield generator circuit design ([name])"
+/datum/design/circuit/shield/AssembleDesignDesc()
+ if(!desc)
+ desc = "Allows for the construction of \a [name] shield generator."
+
+/datum/design/circuit/shield/bubble
+ name = "bubble"
+ id = "shield_gen"
+ build_path = /obj/item/weapon/circuitboard/shield_gen
+ sort_string = "VAAAA"
+
+/datum/design/circuit/shield/hull
+ name = "hull"
+ id = "shield_gen_ex"
+ build_path = /obj/item/weapon/circuitboard/shield_gen_ex
+ sort_string = "VAAAB"
+
+/datum/design/circuit/shield/capacitor
+ name = "capacitor"
+ desc = "Allows for the construction of a shield capacitor circuit board."
+ id = "shield_cap"
+ req_tech = list(TECH_MAGNET = 3, TECH_POWER = 4)
+ build_path = /obj/item/weapon/circuitboard/shield_cap
+ sort_string = "VAAAC"
+
+/datum/design/circuit/aicore
+ name = "AI core"
+ id = "aicore"
+ req_tech = list(TECH_DATA = 4, TECH_BIO = 3)
+ build_path = /obj/item/weapon/circuitboard/aicore
+ sort_string = "XAAAA"
+
+/datum/design/aimodule
+ build_type = IMPRINTER
+ materials = list("glass" = 2000, "gold" = 100)
+
+/datum/design/aimodule/AssembleDesignName()
+ name = "AI module design ([name])"
+
+/datum/design/aimodule/AssembleDesignDesc()
+ desc = "Allows for the construction of \a '[name]' AI module."
+
+/datum/design/aimodule/safeguard
+ name = "Safeguard"
+ id = "safeguard"
+ req_tech = list(TECH_DATA = 3, TECH_MATERIAL = 4)
+ build_path = /obj/item/weapon/aiModule/safeguard
+ sort_string = "XABAA"
+
+/datum/design/aimodule/onehuman
+ name = "OneCrewMember"
+ id = "onehuman"
+ req_tech = list(TECH_DATA = 4, TECH_MATERIAL = 6)
+ build_path = /obj/item/weapon/aiModule/oneHuman
+ sort_string = "XABAB"
+
+/datum/design/aimodule/protectstation
+ name = "ProtectStation"
+ id = "protectstation"
+ req_tech = list(TECH_DATA = 3, TECH_MATERIAL = 6)
+ build_path = /obj/item/weapon/aiModule/protectStation
+ sort_string = "XABAC"
+
+/datum/design/aimodule/notele
+ name = "TeleporterOffline"
+ id = "notele"
+ req_tech = list(TECH_DATA = 3)
+ build_path = /obj/item/weapon/aiModule/teleporterOffline
+ sort_string = "XABAD"
+
+/datum/design/aimodule/quarantine
+ name = "Quarantine"
+ id = "quarantine"
+ req_tech = list(TECH_DATA = 3, TECH_BIO = 2, TECH_MATERIAL = 4)
+ build_path = /obj/item/weapon/aiModule/quarantine
+ sort_string = "XABAE"
+
+/datum/design/aimodule/oxygen
+ name = "OxygenIsToxicToHumans"
+ id = "oxygen"
+ req_tech = list(TECH_DATA = 3, TECH_BIO = 2, TECH_MATERIAL = 4)
+ build_path = /obj/item/weapon/aiModule/oxygen
+ sort_string = "XABAF"
+
+/datum/design/aimodule/freeform
+ name = "Freeform"
+ id = "freeform"
+ req_tech = list(TECH_DATA = 4, TECH_MATERIAL = 4)
+ build_path = /obj/item/weapon/aiModule/freeform
+ sort_string = "XABAG"
+
+/datum/design/aimodule/reset
+ name = "Reset"
+ id = "reset"
+ req_tech = list(TECH_DATA = 3, TECH_MATERIAL = 6)
+ build_path = /obj/item/weapon/aiModule/reset
+ sort_string = "XAAAA"
+
+/datum/design/aimodule/purge
+ name = "Purge"
+ id = "purge"
+ req_tech = list(TECH_DATA = 4, TECH_MATERIAL = 6)
+ build_path = /obj/item/weapon/aiModule/purge
+ sort_string = "XAAAB"
+
+// Core modules
+/datum/design/aimodule/core
+ req_tech = list(TECH_DATA = 4, TECH_MATERIAL = 6)
+
+/datum/design/aimodule/core/AssembleDesignName()
+ name = "AI core module design ([name])"
+
+/datum/design/aimodule/core/AssembleDesignDesc()
+ desc = "Allows for the construction of \a '[name]' AI core module."
+
+/datum/design/aimodule/core/freeformcore
+ name = "Freeform"
+ id = "freeformcore"
+ build_path = /obj/item/weapon/aiModule/freeformcore
+ sort_string = "XACAA"
+
+/datum/design/aimodule/core/asimov
+ name = "Asimov"
+ id = "asimov"
+ build_path = /obj/item/weapon/aiModule/asimov
+ sort_string = "XACAB"
+
+/datum/design/aimodule/core/paladin
+ name = "P.A.L.A.D.I.N."
+ id = "paladin"
+ build_path = /obj/item/weapon/aiModule/paladin
+ sort_string = "XACAC"
+
+/datum/design/aimodule/core/tyrant
+ name = "T.Y.R.A.N.T."
+ id = "tyrant"
+ req_tech = list(TECH_DATA = 4, TECH_ILLEGAL = 2, TECH_MATERIAL = 6)
+ build_path = /obj/item/weapon/aiModule/tyrant
+ sort_string = "XACAD"
+
+/datum/design/item/pda
name = "PDA design"
desc = "Cheaper than whiny non-digital assistants."
id = "pda"
- req_tech = list("engineering" = 2, "powerstorage" = 3)
- materials = list("$metal" = 50, "$glass" = 50)
+ req_tech = list(TECH_ENGINERING = 2, TECH_POWER = 3)
+ materials = list("metal" = 50, "glass" = 50)
build_path = /obj/item/device/pda
+ sort_string = "VAAAA"
-// *** Cartridges
-datum/design/item/pda_cartridge
- req_tech = list("engineering" = 2, "powerstorage" = 3)
- materials = list("$metal" = 50, "$glass" = 50)
+// Cartridges
+/datum/design/item/pda_cartridge
+ req_tech = list(TECH_ENGINERING = 2, TECH_POWER = 3)
+ materials = list("metal" = 50, "glass" = 50)
-datum/design/item/pda_cartridge/AssembleDesignName()
+/datum/design/item/pda_cartridge/AssembleDesignName()
..()
name = "PDA accessory ([item_name])"
-datum/design/item/pda_cartridge/cart_basic
+/datum/design/item/pda_cartridge/cart_basic
id = "cart_basic"
build_path = /obj/item/weapon/cartridge
-datum/design/item/pda_cartridge/engineering
+ sort_string = "VBAAA"
+
+/datum/design/item/pda_cartridge/engineering
id = "cart_engineering"
build_path = /obj/item/weapon/cartridge/engineering
-datum/design/item/pda_cartridge/atmos
+ sort_string = "VBAAB"
+
+/datum/design/item/pda_cartridge/atmos
id = "cart_atmos"
build_path = /obj/item/weapon/cartridge/atmos
-datum/design/item/pda_cartridge/medical
+ sort_string = "VBAAC"
+
+/datum/design/item/pda_cartridge/medical
id = "cart_medical"
build_path = /obj/item/weapon/cartridge/medical
-datum/design/item/pda_cartridge/chemistry
+ sort_string = "VBAAD"
+
+/datum/design/item/pda_cartridge/chemistry
id = "cart_chemistry"
build_path = /obj/item/weapon/cartridge/chemistry
-datum/design/item/pda_cartridge/security
+ sort_string = "VBAAE"
+
+/datum/design/item/pda_cartridge/security
id = "cart_security"
build_path = /obj/item/weapon/cartridge/security
- locked = 1
-datum/design/item/pda_cartridge/janitor
+ sort_string = "VBAAF"
+
+/datum/design/item/pda_cartridge/janitor
id = "cart_janitor"
build_path = /obj/item/weapon/cartridge/janitor
-/*
-datum/design/item/pda_cartridge/clown
- id = "cart_clown"
- build_path = /obj/item/weapon/cartridge/clown"
-datum/design/item/pda_cartridge/mime
- id = "cart_mime"
- build_path = /obj/item/weapon/cartridge/mime"
-*/
-datum/design/item/pda_cartridge/science
+ sort_string = "VBAAG"
+
+/datum/design/item/pda_cartridge/science
id = "cart_science"
build_path = /obj/item/weapon/cartridge/signal/science
-datum/design/item/pda_cartridge/quartermaster
+ sort_string = "VBAAH"
+
+/datum/design/item/pda_cartridge/quartermaster
id = "cart_quartermaster"
build_path = /obj/item/weapon/cartridge/quartermaster
- locked = 1
-datum/design/item/pda_cartridge/hop
+ sort_string = "VBAAI"
+
+/datum/design/item/pda_cartridge/hop
id = "cart_hop"
build_path = /obj/item/weapon/cartridge/hop
- locked = 1
-datum/design/item/pda_cartridge/hos
+ sort_string = "VBAAJ"
+
+/datum/design/item/pda_cartridge/hos
id = "cart_hos"
build_path = /obj/item/weapon/cartridge/hos
- locked = 1
-datum/design/item/pda_cartridge/ce
+ sort_string = "VBAAK"
+
+/datum/design/item/pda_cartridge/ce
id = "cart_ce"
build_path = /obj/item/weapon/cartridge/ce
- locked = 1
-datum/design/item/pda_cartridge/cmo
+ sort_string = "VBAAL"
+
+/datum/design/item/pda_cartridge/cmo
id = "cart_cmo"
build_path = /obj/item/weapon/cartridge/cmo
- locked = 1
-datum/design/item/pda_cartridge/rd
+ sort_string = "VBAAM"
+
+/datum/design/item/pda_cartridge/rd
id = "cart_rd"
build_path = /obj/item/weapon/cartridge/rd
- locked = 1
-datum/design/item/pda_cartridge/captain
+ sort_string = "VBAAN"
+
+/datum/design/item/pda_cartridge/captain
id = "cart_captain"
build_path = /obj/item/weapon/cartridge/captain
- locked = 1
+ sort_string = "VBAAO"
-/////////////////////////////////////////
-///////////////Misc Stuff////////////////
-/////////////////////////////////////////
-datum/design/item/borg_syndicate_module
+/*
+MECHAS BELOW
+*/
+
+/datum/design/item/mecha
+ build_type = MECHFAB
+ req_tech = list(TECH_COMBAT = 3)
+ category = "Exosuit Equipment"
+
+/datum/design/item/mecha/AssembleDesignName()
+ ..()
+ name = "Exosuit module design ([item_name])"
+
+/datum/design/item/mecha/weapon/AssembleDesignName()
+ ..()
+ name = "Exosuit weapon design ([item_name])"
+
+/datum/design/item/mecha/AssembleDesignDesc()
+ if(!desc)
+ desc = "Allows for the construction of \a '[item_name]' exosuit module."
+
+// *** Weapon modules
+/datum/design/item/mecha/weapon/scattershot
+ id = "mech_scattershot"
+ req_tech = list(TECH_COMBAT = 4)
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot
+
+/datum/design/item/mecha/weapon/laser
+ id = "mech_laser"
+ req_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 3)
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser
+
+/datum/design/item/mecha/weapon/laser_rigged
+ desc = "Allows for the construction of a welder-laser assembly package for non-combat exosuits."
+ id = "mech_laser_rigged"
+ req_tech = list(TECH_COMBAT = 2, TECH_MAGNET = 2)
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/riggedlaser
+
+/datum/design/item/mecha/weapon/laser_heavy
+ id = "mech_laser_heavy"
+ req_tech = list(TECH_COMBAT = 4, TECH_MAGNET = 4)
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy
+
+/datum/design/item/mecha/weapon/ion
+ id = "mech_ion"
+ req_tech = list(TECH_COMBAT = 4, TECH_MAGNET = 4)
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/ion
+
+/datum/design/item/mecha/weapon/grenade_launcher
+ id = "mech_grenade_launcher"
+ req_tech = list(TECH_COMBAT = 3)
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang
+
+/datum/design/item/mecha/weapon/clusterbang_launcher
+ desc = "A weapon that violates the Geneva Convention at 6 rounds per minute."
+ id = "clusterbang_launcher"
+ req_tech = list(TECH_COMBAT= 5, TECH_MATERIAL = 5, TECH_ILLEGAL = 3)
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang/limited
+
+// *** Nonweapon modules
+/datum/design/item/mecha/wormhole_gen
+ desc = "An exosuit module that can generate small quasi-stable wormholes."
+ id = "mech_wormhole_gen"
+ req_tech = list(TECH_BLUESPACE = 3, TECH_MAGNET = 2)
+ build_path = /obj/item/mecha_parts/mecha_equipment/wormhole_generator
+
+/datum/design/item/mecha/teleporter
+ desc = "An exosuit module that allows teleportation to any position in view."
+ id = "mech_teleporter"
+ req_tech = list(TECH_BLUESPACE = 10, TECH_MAGNET = 5)
+ build_path = /obj/item/mecha_parts/mecha_equipment/teleporter
+
+/datum/design/item/mecha/rcd
+ desc = "An exosuit-mounted rapid construction device."
+ id = "mech_rcd"
+ req_tech = list(TECH_MATERIAL = 4, TECH_BLUESPACE = 3, TECH_MAGNET = 4, TECH_POWER=4, TECH_ENGINERING = 4)
+ build_path = /obj/item/mecha_parts/mecha_equipment/tool/rcd
+
+/datum/design/item/mecha/gravcatapult
+ desc = "An exosuit-mounted gravitational catapult."
+ id = "mech_gravcatapult"
+ req_tech = list(TECH_BLUESPACE = 2, TECH_MAGNET = 3, TECH_ENGINERING = 3)
+ build_path = /obj/item/mecha_parts/mecha_equipment/gravcatapult
+
+/datum/design/item/mecha/repair_droid
+ desc = "Automated repair droid, exosuits' best companion. BEEP BOOP"
+ id = "mech_repair_droid"
+ req_tech = list(TECH_MAGNET = 3, TECH_DATA = 3, TECH_ENGINERING = 3)
+ build_path = /obj/item/mecha_parts/mecha_equipment/repair_droid
+
+/datum/design/item/mecha/phoron_generator
+ desc = "Exosuit-mounted phoron generator."
+ id = "mech_phoron_generator"
+ req_tech = list(TECH_PHORON = 2, TECH_POWER= 2, TECH_ENGINERING = 2)
+ build_path = /obj/item/mecha_parts/mecha_equipment/generator
+
+/datum/design/item/mecha/energy_relay
+ id = "mech_energy_relay"
+ req_tech = list(TECH_MAGNET = 4, TECH_POWER = 3)
+ build_path = /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay
+
+/datum/design/item/mecha/ccw_armor
+ desc = "Exosuit close-combat armor booster."
+ id = "mech_ccw_armor"
+ req_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 4)
+ build_path = /obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster
+
+/datum/design/item/mecha/proj_armor
+ desc = "Exosuit projectile armor booster."
+ id = "mech_proj_armor"
+ req_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 5, TECH_ENGINERING=3)
+ build_path = /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster
+
+/datum/design/item/mecha/syringe_gun
+ desc = "Exosuit-mounted syringe gun and chemical synthesizer."
+ id = "mech_syringe_gun"
+ req_tech = list(TECH_MATERIAL = 3, TECH_BIO=4, TECH_MAGNET=4, TECH_DATA=3)
+ build_path = /obj/item/mecha_parts/mecha_equipment/tool/syringe_gun
+
+/datum/design/item/mecha/diamond_drill
+ desc = "A diamond version of the exosuit drill. It's harder, better, faster, stronger."
+ id = "mech_diamond_drill"
+ req_tech = list(TECH_MATERIAL = 4, TECH_ENGINERING = 3)
+ build_path = /obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill
+
+/datum/design/item/mecha/generator_nuclear
+ desc = "Exosuit-held nuclear reactor. Converts uranium and everyone's health to energy."
+ id = "mech_generator_nuclear"
+ req_tech = list(TECH_POWER= 3, TECH_ENGINERING = 3, TECH_MATERIAL = 3)
+ build_path = /obj/item/mecha_parts/mecha_equipment/generator/nuclear
+
+/datum/design/item/synthetic_flash
+ id = "sflash"
+ req_tech = list(TECH_MAGNET = 3, TECH_COMBAT = 2)
+ build_type = MECHFAB
+ materials = list("metal" = 750, "glass" = 750)
+ build_path = /obj/item/device/flash/synthetic
+ category = "Misc"
+
+/datum/design/item/borg_syndicate_module
name = "Cyborg lethal weapons upgrade"
desc = "Allows for the construction of lethal upgrades for cyborgs."
id = "borg_syndicate_module"
build_type = MECHFAB
- req_tech = list("combat" = 4, "syndicate" = 3)
+ req_tech = list(TECH_COMBAT = 4, TECH_ILLEGAL = 3)
build_path = /obj/item/borg/upgrade/syndicate
category = "Cyborg Upgrade Modules"
-datum/design/item/mesons
- name = "Optical meson scanners design"
- desc = "Using the meson-scanning technology those glasses allow you to see through walls, floor or anything else."
- id = "mesons"
- req_tech = list("magnets" = 2, "engineering" = 2)
- materials = list("$metal" = 50, "$glass" = 50)
- build_path = /obj/item/clothing/glasses/meson
+/* Uncomment if someone makes these buildable
+/datum/design/circuit/general_alert
+ name = "general alert console"
+ id = "general_alert"
+ build_path = /obj/item/weapon/circuitboard/general_alert
-datum/design/item/binaryencrypt
- name = "Binary encryption key"
- desc = "Allows for deciphering the binary channel on-the-fly."
- id = "binaryencrypt"
- req_tech = list("syndicate" = 2)
- materials = list("$metal" = 300, "$glass" = 300)
- build_path = /obj/item/device/encryptionkey/binary
+// Removal of loyalty implants. Can't think of a way to add this to the config option.
+/datum/design/item/implant/loyalty
+ name = "loyalty"
+ id = "implant_loyal"
+ req_tech = list(TECH_MATERIAL = 2, TECH_BIO = 3)
+ materials = list("metal" = 7000, "glass" = 7000)
+ build_path = /obj/item/weapon/implantcase/loyalty"
-datum/design/item/chameleon
- name = "Holographic equipment kit"
- desc = "A kit of dangerous, high-tech equipment with changeable looks."
- id = "chameleon"
- req_tech = list("syndicate" = 2)
- materials = list("$metal" = 500)
- build_path = /obj/item/weapon/storage/box/syndie_kit/chameleon
+/datum/design/rust_core_control
+ name = "Circuit Design (RUST core controller)"
+ desc = "Allows for the construction of circuit boards used to build a core control console for the RUST fusion engine."
+ id = "rust_core_control"
+ req_tech = list("programming" = 4, "engineering" = 4)
+ build_type = IMPRINTER
+ materials = list("glass" = 2000, "sacid" = 20)
+ build_path = "/obj/item/weapon/circuitboard/rust_core_control"
+
+datum/design/rust_fuel_control
+ name = "Circuit Design (RUST fuel controller)"
+ desc = "Allows for the construction of circuit boards used to build a fuel injector control console for the RUST fusion engine."
+ id = "rust_fuel_control"
+ req_tech = list("programming" = 4, "engineering" = 4)
+ build_type = IMPRINTER
+ materials = list("glass" = 2000, "sacid" = 20)
+ build_path = "/obj/item/weapon/circuitboard/rust_fuel_control"
+
+datum/design/rust_fuel_port
+ name = "Internal circuitry (RUST fuel port)"
+ desc = "Allows for the construction of circuit boards used to build a fuel injection port for the RUST fusion engine."
+ id = "rust_fuel_port"
+ req_tech = list("engineering" = 4, "materials" = 5)
+ build_type = IMPRINTER
+ materials = list("glass" = 2000, "sacid" = 20, "uranium" = 3000)
+ build_path = "/obj/item/weapon/module/rust_fuel_port"
+
+datum/design/rust_fuel_compressor
+ name = "Circuit Design (RUST fuel compressor)"
+ desc = "Allows for the construction of circuit boards used to build a fuel compressor of the RUST fusion engine."
+ id = "rust_fuel_compressor"
+ req_tech = list("materials" = 6, "phorontech" = 4)
+ build_type = IMPRINTER
+ materials = list("glass" = 2000, "sacid" = 20, "phoron" = 3000, "diamond" = 1000)
+ build_path = "/obj/item/weapon/module/rust_fuel_compressor"
+
+datum/design/rust_core
+ name = "Internal circuitry (RUST tokamak core)"
+ desc = "The circuit board that for a RUST-pattern tokamak fusion core."
+ id = "pacman"
+ req_tech = list(bluespace = 3, phorontech = 4, magnets = 5, powerstorage = 6)
+ build_type = IMPRINTER
+ materials = list("glass" = 2000, "sacid" = 20, "phoron" = 3000, "diamond" = 2000)
+ build_path = "/obj/item/weapon/circuitboard/rust_core"
+
+datum/design/rust_injector
+ name = "Internal circuitry (RUST tokamak core)"
+ desc = "The circuit board that for a RUST-pattern particle accelerator."
+ id = "pacman"
+ req_tech = list(powerstorage = 3, engineering = 4, phorontech = 4, materials = 6)
+ build_type = IMPRINTER
+ materials = list("glass" = 2000, "sacid" = 20, "phoron" = 3000, "uranium" = 2000)
+ build_path = "/obj/item/weapon/circuitboard/rust_core"
+*/
diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm
index b8d0fca209..9b97fecd95 100644
--- a/code/modules/research/destructive_analyzer.dm
+++ b/code/modules/research/destructive_analyzer.dm
@@ -1,5 +1,3 @@
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33
-
/*
Destructive Analyzer
@@ -7,12 +5,12 @@ It is used to destroy hand-held objects and advance technological research. Cont
Note: Must be placed within 3 tiles of the R&D Console
*/
+
/obj/machinery/r_n_d/destructive_analyzer
name = "destructive analyzer"
icon_state = "d_analyzer"
- var/obj/item/weapon/loaded_item = null
- var/decon_mod = 1
- var/min_reliability = 90
+ var/obj/item/weapon/loaded_item = null
+ var/decon_mod = 0
use_power = 1
idle_power_usage = 30
@@ -32,7 +30,6 @@ Note: Must be placed within 3 tiles of the R&D Console
for(var/obj/item/weapon/stock_parts/S in src)
T += S.rating
decon_mod = T * 0.1
- min_reliability = 93 - T
/obj/machinery/r_n_d/destructive_analyzer/meteorhit()
qdel(src)
@@ -47,8 +44,12 @@ Note: Must be placed within 3 tiles of the R&D Console
icon_state = "d_analyzer"
/obj/machinery/r_n_d/destructive_analyzer/attackby(var/obj/O as obj, var/mob/user as mob)
- if(shocked)
- shock(user, 50)
+ if(busy)
+ user << "\The [src] is busy right now."
+ return
+ if(loaded_item)
+ user << "There is something already loaded into \the [src]."
+ return 1
if(default_deconstruction_screwdriver(user, O))
if(linked_console)
linked_console.linked_destroy = null
@@ -61,32 +62,23 @@ Note: Must be placed within 3 tiles of the R&D Console
if(panel_open)
user << "You can't load \the [src] while it's opened."
return 1
- if(disabled)
- return
if(!linked_console)
- user << "\The [src] must be linked to an R&D console first!"
- return
- if(busy)
- user << "\The [src] is busy right now."
+ user << "\The [src] must be linked to an R&D console first."
return
if(istype(O, /obj/item) && !loaded_item)
if(isrobot(user)) //Don't put your module items in there!
return
if(!O.origin_tech)
- user << "This doesn't seem to have a tech origin!"
+ user << "This doesn't seem to have a tech origin."
return
- var/list/temp_tech = ConvertReqString2List(O.origin_tech)
- if(temp_tech.len == 0)
- user << "You cannot deconstruct this item!"
- return
- if(O.reliability < min_reliability && O.crit_fail == 0)
- usr << "Item is neither reliable enough nor broken enough to learn from."
+ if(O.origin_tech.len == 0)
+ user << "You cannot deconstruct this item."
return
busy = 1
loaded_item = O
user.drop_item()
O.loc = src
- user << "You add \the [O] to \the [src]!"
+ user << "You add \the [O] to \the [src]."
flick("d_analyzer_la", src)
spawn(10)
update_icon()
diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm
index 086cd80c9b..5ff3d23c74 100644
--- a/code/modules/research/protolathe.dm
+++ b/code/modules/research/protolathe.dm
@@ -1,12 +1,3 @@
-/*
-Protolathe
-
-Similar to an autolathe, you load glass and metal sheets (but not other objects) into it to be used as raw materials for the stuff
-it creates. All the menus and other manipulation commands are in the R&D console.
-
-Note: Must be placed west/left of and R&D console to function.
-
-*/
/obj/machinery/r_n_d/protolathe
name = "Protolathe"
icon_state = "protolathe"
@@ -16,16 +7,14 @@ Note: Must be placed west/left of and R&D console to function.
idle_power_usage = 30
active_power_usage = 5000
- var/max_material_storage = 100000 //All this could probably be done better with a list but meh.
- var/m_amount = 0.0
- var/g_amount = 0.0
- var/gold_amount = 0.0
- var/silver_amount = 0.0
- var/phoron_amount = 0.0
- var/uranium_amount = 0.0
- var/diamond_amount = 0.0
+ var/max_material_storage = 100000
+ var/list/materials = list("metal" = 0, "glass" = 0, "gold" = 0, "silver" = 0, "phoron" = 0, "uranium" = 0, "diamond" = 0)
+
+ var/list/datum/design/queue = list()
+ var/progress = 0
var/mat_efficiency = 1
+ var/speed = 1
/obj/machinery/r_n_d/protolathe/New()
..()
@@ -39,61 +28,76 @@ Note: Must be placed west/left of and R&D console to function.
component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(src)
RefreshParts()
+/obj/machinery/r_n_d/protolathe/process()
+ ..()
+ if(stat)
+ update_icon()
+ return
+ if(queue.len == 0)
+ busy = 0
+ update_icon()
+ return
+ var/datum/design/D = queue[1]
+ if(canBuild(D))
+ busy = 1
+ progress += speed
+ if(progress >= D.time)
+ build(D)
+ progress = 0
+ removeFromQueue(1)
+ if(linked_console)
+ linked_console.updateUsrDialog()
+ update_icon()
+ else
+ if(busy)
+ visible_message("\icon [src] flashes: insufficient materials: [getLackingMaterials(D)].")
+ busy = 0
+ update_icon()
+
/obj/machinery/r_n_d/protolathe/proc/TotalMaterials() //returns the total of all the stored materials. Makes code neater.
- return m_amount + g_amount + gold_amount + silver_amount + phoron_amount + uranium_amount + diamond_amount
+ var/t = 0
+ for(var/f in materials)
+ t += materials[f]
+ return t
/obj/machinery/r_n_d/protolathe/RefreshParts()
var/T = 0
for(var/obj/item/weapon/reagent_containers/glass/G in component_parts)
T += G.reagents.maximum_volume
- var/datum/reagents/R = new/datum/reagents(T) //Holder for the reagents used as materials.
- reagents = R
- R.my_atom = src
- T = 0
+ create_reagents(T)
+ max_material_storage = 0
for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts)
- T += M.rating
- max_material_storage = T * 75000
+ max_material_storage += M.rating * 75000
T = 0
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
T += M.rating
mat_efficiency = 1 - (T - 2) / 8
+ speed = T / 2
/obj/machinery/r_n_d/protolathe/dismantle()
for(var/obj/I in component_parts)
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)
- 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)
- 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)
- 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)
- 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)
- 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)
- 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)
- G.amount = round(diamond_amount / G.perunit)
+ for(var/f in materials)
+ if(materials[f] >= SHEET_MATERIAL_AMOUNT)
+ var/path = getMaterialType(f)
+ if(path)
+ var/obj/item/stack/S = new f(loc)
+ S.amount = round(materials[f] / SHEET_MATERIAL_AMOUNT)
..()
/obj/machinery/r_n_d/protolathe/update_icon()
if(panel_open)
icon_state = "protolathe_t"
+ else if(busy)
+ icon_state = "protolathe_n"
else
icon_state = "protolathe"
/obj/machinery/r_n_d/protolathe/attackby(var/obj/item/O as obj, var/mob/user as mob)
- if(shocked)
- shock(user, 50)
+ if(busy)
+ user << "\The [src] is busy. Please wait for completion of previous operation."
+ return 1
if(default_deconstruction_screwdriver(user, O))
if(linked_console)
linked_console.linked_lathe = null
@@ -108,69 +112,93 @@ Note: Must be placed west/left of and R&D console to function.
if(panel_open)
user << "You can't load \the [src] while it's opened."
return 1
- if(disabled)
- return
if(!linked_console)
user << "\The [src] must be linked to an R&D console first!"
return 1
- if(busy)
- user << "\The [src] is busy. Please wait for completion of previous operation."
+ if(!istype(O, /obj/item/stack/material))
+ user << "You cannot insert this item into \the [src]!"
return 1
if(stat)
return 1
- if(istype(O,/obj/item/stack/sheet))
- var/obj/item/stack/sheet/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/amount = round(input("How many sheets do you want to add?") as num)//No decimals
- if(!O)
- return
- if(amount < 0)//No negative numbers
- amount = 0
- if(amount == 0)
- return
- if(amount > stack.get_amount())
- amount = stack.get_amount()
- if(max_material_storage - TotalMaterials() < (amount * stack.perunit))//Can't overfill
- amount = min(stack.amount, round((max_material_storage - TotalMaterials()) / stack.perunit))
+ if(TotalMaterials() + SHEET_MATERIAL_AMOUNT > max_material_storage)
+ user << "\The [src]'s material bin is full. Please remove material before adding more."
+ return 1
- overlays += "protolathe_[stack.name]"
- sleep(10)
- overlays -= "protolathe_[stack.name]"
-
- icon_state = "protolathe"
- busy = 1
- use_power(max(1000, (3750 * amount / 10)))
- var/stacktype = stack.type
- stack.use(amount)
- if(do_after(user, 16))
- user << "You add [amount] sheets to \the [src]."
- icon_state = "protolathe"
- switch(stacktype)
- if(/obj/item/stack/sheet/metal)
- m_amount += amount * 3750
- if(/obj/item/stack/sheet/glass)
- g_amount += amount * 3750
- if(/obj/item/stack/sheet/mineral/gold)
- gold_amount += amount * 2000
- if(/obj/item/stack/sheet/mineral/silver)
- silver_amount += amount * 2000
- if(/obj/item/stack/sheet/mineral/phoron)
- phoron_amount += amount * 2000
- if(/obj/item/stack/sheet/mineral/uranium)
- uranium_amount += amount * 2000
- if(/obj/item/stack/sheet/mineral/diamond)
- diamond_amount += amount * 2000
- else
- new stacktype(loc, amount)
- busy = 0
- updateUsrDialog()
+ 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
- ..()
+ if(amount <= 0)//No negative numbers
+ return
+ if(amount > stack.get_amount())
+ amount = stack.get_amount()
+ if(max_material_storage - TotalMaterials() < (amount * SHEET_MATERIAL_AMOUNT)) //Can't overfill
+ amount = min(stack.get_amount(), round((max_material_storage - TotalMaterials()) / SHEET_MATERIAL_AMOUNT))
-//This is to stop these machines being hackable via clicking.
-/obj/machinery/r_n_d/protolathe/attack_hand(mob/user as mob)
- return
\ No newline at end of file
+ var/stacktype = stack.type
+ var/t = getMaterialName(stacktype)
+ overlays += "protolathe_[t]"
+ spawn(10)
+ overlays -= "protolathe_[t]"
+
+ busy = 1
+ use_power(max(1000, (SHEET_MATERIAL_AMOUNT * amount / 10)))
+ if(t)
+ if(do_after(user, 16))
+ if(stack.use(amount))
+ user << "You add [amount] sheets to \the [src]."
+ materials[t] += amount * SHEET_MATERIAL_AMOUNT
+ busy = 0
+ updateUsrDialog()
+ return
+
+/obj/machinery/r_n_d/protolathe/proc/addToQueue(var/datum/design/D)
+ queue += D
+ return
+
+/obj/machinery/r_n_d/protolathe/proc/removeFromQueue(var/index)
+ queue.Cut(index, index + 1)
+ return
+
+/obj/machinery/r_n_d/protolathe/proc/canBuild(var/datum/design/D)
+ for(var/M in D.materials)
+ if(materials[M] < D.materials[M])
+ return 0
+ for(var/C in D.chemicals)
+ if(!reagents.has_reagent(C, D.chemicals[C]))
+ return 0
+ return 1
+
+/obj/machinery/r_n_d/protolathe/proc/getLackingMaterials(var/datum/design/D)
+ var/ret = ""
+ for(var/M in D.materials)
+ if(materials[M] < D.materials[M])
+ if(ret != "")
+ ret += ", "
+ ret += "[D.materials[M] - materials[M]] [M]"
+ for(var/C in D.chemicals)
+ if(!reagents.has_reagent(C, D.chemicals[C]))
+ if(ret != "")
+ ret += ", "
+ ret += C
+ return ret
+
+/obj/machinery/r_n_d/protolathe/proc/build(var/datum/design/D)
+ var/power = active_power_usage
+ for(var/M in D.materials)
+ power += round(D.materials[M] / 5)
+ power = max(active_power_usage, power)
+ use_power(power)
+ for(var/M in D.materials)
+ materials[M] = max(0, materials[M] - D.materials[M] * mat_efficiency)
+ for(var/C in D.chemicals)
+ reagents.remove_reagent(C, D.chemicals[C] * mat_efficiency)
+
+ if(D.build_path)
+ var/obj/new_item = new D.build_path(src)
+ new_item.loc = loc
+ if(mat_efficiency != 1) // No matter out of nowhere
+ if(new_item.matter && new_item.matter.len > 0)
+ for(var/i in new_item.matter)
+ new_item.matter[i] = new_item.matter[i] * mat_efficiency
diff --git a/code/modules/research/rd-readme.dm b/code/modules/research/rd-readme.dm
index 92e2c5b28e..0f98395145 100644
--- a/code/modules/research/rd-readme.dm
+++ b/code/modules/research/rd-readme.dm
@@ -3,7 +3,7 @@ Research and Development System. (Designed specifically for the /tg/station 13 (
///////////////Overview///////////////////
This system is a "tech tree" research and development system designed for SS13. It allows a "researcher" job (this document assumes
-the "scientist" job is given this role) the tools necessiary to research new and better technologies. In general, the system works
+the "scientist" job is given this role) the tools necessary to research new and better technologies. In general, the system works
by breaking existing technology and using what you learn from to advance your knowledge of SCIENCE! As your knowledge progresses,
you can build newer (and better?) devices (which you can also, eventually, deconstruct to advance your knowledge).
@@ -29,211 +29,4 @@ Each tech path should have at LEAST one item at every level (levels 1 - 20). Thi
researching. Existing tech (ie, anything you can find on the station or get from the quartermaster) shouldn't go higher then
level 5 or 7. Everything past that should be stuff you research.
-Below is a checklist to make sure every tree is filled. As new items get added to R&D, add them here if there is an empty slot.
-When thinking about new stuff, check here to see if there are any slots unfilled.
-
-//MATERIALS
-1 | Metal
-2 | Solid Phoron
-3 | Silver
-4 | Gold, Super Capacitor
-5 | Uranium, Nuclear Gun, SUPERPACMAN
-6 | Diamond, MRSPACMAN
-7 |
-8 |
-9 |
-10 |
-11 |
-12 |
-13 |
-14 |
-15 |
-16 |
-17 |
-18 |
-19 |
-20 |
-
-//PHORON TECH
-1 |
-2 | Solid Phoron
-3 | Pacman Generator
-4 |
-5 |
-6 |
-7 |
-8 |
-9 |
-10 |
-11 |
-12 |
-13 |
-14 |
-15 |
-16 |
-17 |
-18 |
-19 |
-20 |
-
-//POWER TECH
-1 | Basic Capacitor, Basic Cell
-2 | High-Capacity Cell (10,000)
-3 | Super-Capacity Cell (20,000), Powersink, PACMAN
-4 | SUPERPACMAN
-5 | MRSPACMAN, Super Capacitor
-6 | Hyper-Capacity Cell (30,000)
-7 |
-8 |
-9 |
-10 |
-11 |
-12 |
-13 |
-14 |
-15 |
-16 |
-17 |
-18 |
-19 |
-20 |
-
-//BLUE SPACE
-1 |
-2 | Teleporter Console Board
-3 | Teleport Gun, Hand Tele
-4 | Teleportation Scroll
-5 |
-6 |
-7 |
-8 |
-9 |
-10 |
-11 |
-12 |
-13 |
-14 |
-15 |
-16 |
-17 |
-18 |
-19 |
-20 |
-
-//BIOTECH
-1 | Bruise Pack, Scalpel
-2 | PANDEMIC Board, Mass Spectrometer
-3 | AI Core, Brains (MMI)
-4 | MMI+Radio
-5 |
-6 |
-7 |
-8 |
-9 |
-10 |
-11 |
-12 |
-13 |
-14 |
-15 |
-16 |
-17 |
-18 |
-19 |
-20 |
-
-//MAGNETS
-1 | Basic Sensor
-2 | Comm Console Board
-3 | Adv Sensor
-4 | Adv Mass Spectrometer, Chameleon Projector
-5 | Phasic Sensor
-6 |
-7 |
-8 |
-9 |
-10 |
-11 |
-12 |
-13 |
-14 |
-15 |
-16 |
-17 |
-18 |
-19 |
-20 |
-
-//PROGRAMMING
-1 | Arcade Board
-2 | Sec Camera
-3 | Cloning Machine Console Board
-4 | AI Core, Intellicard
-5 | Pico-Manipulator, Ultra-Micro-Laser
-6 |
-7 |
-8 |
-9 |
-10 |
-11 |
-12 |
-13 |
-14 |
-15 |
-16 |
-17 |
-18 |
-19 |
-20 |
-
-//SYNDICATE
-1 | Sleepypen
-2 | TYRANT Module, Emag
-3 | Cloaking Device, Power Sink
-4 |
-5 |
-6 |
-7 |
-8 |
-9 |
-10 |
-11 |
-12 |
-13 |
-14 |
-15 |
-16 |
-17 |
-18 |
-19 |
-20 |
-
-//COMBAT
-1 | Flashbang, Mousetrap, Nettle
-2 | Stun Baton
-3 | Power Axe, Death Nettle, Nuclear Gun
-4 |
-5 |
-6 |
-7 |
-8 |
-9 |
-10 |
-11 |
-12 |
-13 |
-14 |
-15 |
-16 |
-17 |
-18 |
-19 |
-20 |
-
-
-
-
-
-
-
*/
\ No newline at end of file
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index 8f1113043d..c82c00e4a0 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -43,7 +43,6 @@ won't update every console in existence) but it's more of a hassle to do. Also,
var/screen = 1.0 //Which screen is currently showing.
var/id = 0 //ID of the computer (for server restrictions).
var/sync = 1 //If sync = 0, it doesn't show up on Server Control Console
- var/errored = 0 //Errored during item construction.
req_access = list(access_research) //Data and setting manipulation requires scientist access.
@@ -58,43 +57,43 @@ won't update every console in existence) but it's more of a hassle to do. Also,
qdel(check_tech)
check_tech = null
break
-
return return_name
/obj/machinery/computer/rdconsole/proc/CallMaterialName(var/ID)
+ var/return_name = ID
+ switch(return_name)
+ if("metal")
+ return_name = "Metal"
+ if("glass")
+ return_name = "Glass"
+ if("gold")
+ return_name = "Gold"
+ if("silver")
+ return_name = "Silver"
+ if("phoron")
+ return_name = "Solid Phoron"
+ if("uranium")
+ return_name = "Uranium"
+ if("diamond")
+ return_name = "Diamond"
+ return return_name
+
+/obj/machinery/computer/rdconsole/proc/CallReagentName(var/ID)
+ var/return_name = ID
var/datum/reagent/temp_reagent
- var/return_name = null
- if (copytext(ID, 1, 2) == "$")
- return_name = copytext(ID, 2)
- switch(return_name)
- if(DEFAULT_WALL_MATERIAL)
- return_name = "Steel"
- if("glass")
- return_name = "Glass"
- if("gold")
- return_name = "Gold"
- if("silver")
- return_name = "Silver"
- if("phoron")
- return_name = "Solid Phoron"
- if("uranium")
- return_name = "Uranium"
- if("diamond")
- return_name = "Diamond"
- else
- for(var/R in typesof(/datum/reagent) - /datum/reagent)
+ for(var/R in (typesof(/datum/reagent) - /datum/reagent))
+ temp_reagent = null
+ temp_reagent = new R()
+ if(temp_reagent.id == ID)
+ return_name = temp_reagent.name
+ qdel(temp_reagent)
temp_reagent = null
- temp_reagent = new R()
- if(temp_reagent.id == ID)
- return_name = temp_reagent.name
- qdel(temp_reagent)
- temp_reagent = null
- break
+ break
return return_name
/obj/machinery/computer/rdconsole/proc/SyncRDevices() //Makes sure it is properly sync'ed up with the devices attached to it (if any).
- for(var/obj/machinery/r_n_d/D in oview(3,src))
- if(D.linked_console != null || D.disabled || D.panel_open)
+ for(var/obj/machinery/r_n_d/D in range(3, src))
+ if(D.linked_console != null || D.panel_open)
continue
if(istype(D, /obj/machinery/r_n_d/destructive_analyzer))
if(linked_destroy == null)
@@ -110,8 +109,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
D.linked_console = src
return
-//Have it automatically push research to the centcomm server so wild griffins can't fuck up R&D's work --NEO
-/obj/machinery/computer/rdconsole/proc/griefProtection()
+/obj/machinery/computer/rdconsole/proc/griefProtection() //Have it automatically push research to the centcomm server so wild griffins can't fuck up R&D's work
for(var/obj/machinery/r_n_d/server/centcom/C in machines)
for(var/datum/tech/T in files.known_tech)
C.files.AddTech2Known(T)
@@ -130,11 +128,6 @@ won't update every console in existence) but it's more of a hassle to do. Also,
/obj/machinery/computer/rdconsole/initialize()
SyncRDevices()
-/* Instead of calling this every tick, it is only being called when needed
-/obj/machinery/computer/rdconsole/process()
- griefProtection()
-*/
-
/obj/machinery/computer/rdconsole/attackby(var/obj/item/weapon/D as obj, var/mob/user as mob)
//Loading a disk into it.
if(istype(D, /obj/item/weapon/disk))
@@ -142,18 +135,20 @@ won't update every console in existence) but it's more of a hassle to do. Also,
user << "A disk is already loaded into the machine."
return
- if(istype(D, /obj/item/weapon/disk/tech_disk)) t_disk = D
- else if (istype(D, /obj/item/weapon/disk/design_disk)) d_disk = D
+ if(istype(D, /obj/item/weapon/disk/tech_disk))
+ t_disk = D
+ else if (istype(D, /obj/item/weapon/disk/design_disk))
+ d_disk = D
else
- user << "\red Machine cannot accept disks in that format."
+ user << "Machine cannot accept disks in that format."
return
user.drop_item()
D.loc = src
- user << "\blue You add the disk to the machine!"
+ user << "You add \the [D] to the machine."
else if(istype(D, /obj/item/weapon/card/emag) && !emagged)
playsound(src.loc, 'sound/effects/sparks4.ogg', 75, 1)
emagged = 1
- user << "\blue You you disable the security protocols"
+ user << "You you disable the security protocols."
else
//The construction/deconstruction of the console code.
..()
@@ -170,17 +165,11 @@ won't update every console in existence) but it's more of a hassle to do. Also,
usr.set_machine(src)
if(href_list["menu"]) //Switches menu screens. Converts a sent text string into a number. Saves a LOT of code.
var/temp_screen = text2num(href_list["menu"])
- if(temp_screen <= 1.1 || (3 <= temp_screen && 4.9 >= temp_screen) || src.allowed(usr) || emagged) //Unless you are making something, you need access.
+ if(temp_screen <= 1.1 || (3 <= temp_screen && 4.9 >= temp_screen) || allowed(usr) || emagged) //Unless you are making something, you need access.
screen = temp_screen
else
usr << "Unauthorized Access."
- else if(href_list["reset"])
- warning("RnD console has errored during protolathe operation. Resetting.")
- errored = 0
- screen = 1.0
- updateUsrDialog()
-
else if(href_list["updt_tech"]) //Update the research holder with information from the technology disk.
screen = 0.0
spawn(50)
@@ -193,7 +182,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
t_disk.stored = null
else if(href_list["eject_tech"]) //Eject the technology disk.
- t_disk:loc = src.loc
+ t_disk.loc = loc
t_disk = null
screen = 1.0
@@ -216,7 +205,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
d_disk.blueprint = null
else if(href_list["eject_design"]) //Eject the design disk.
- d_disk:loc = src.loc
+ d_disk.loc = loc
d_disk = null
screen = 1.0
@@ -230,7 +219,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
else if(href_list["eject_item"]) //Eject the item inside the destructive analyzer.
if(linked_destroy)
if(linked_destroy.busy)
- usr << "\red The destructive analyzer is busy at the moment."
+ usr << "The destructive analyzer is busy at the moment."
else if(linked_destroy.loaded_item)
linked_destroy.loaded_item.loc = linked_destroy.loc
@@ -241,9 +230,10 @@ won't update every console in existence) but it's more of a hassle to do. Also,
else if(href_list["deconstruct"]) //Deconstruct the item in the destructive analyzer and update the research holder.
if(linked_destroy)
if(linked_destroy.busy)
- usr << "\red The destructive analyzer is busy at the moment."
+ usr << "The destructive analyzer is busy at the moment."
else
- if(alert("Proceeding will destroy loaded item. Continue?", "Destructive analyzer confirmation", "Yes", "No") == "No" || !linked_destroy) return
+ if(alert("Proceeding will destroy loaded item. Continue?", "Destructive analyzer confirmation", "Yes", "No") == "No" || !linked_destroy)
+ return
linked_destroy.busy = 1
screen = 0.1
updateUsrDialog()
@@ -251,26 +241,24 @@ won't update every console in existence) but it's more of a hassle to do. Also,
spawn(24)
if(linked_destroy)
linked_destroy.busy = 0
- if(!linked_destroy.hacked)
- if(!linked_destroy.loaded_item)
- usr <<"\red The destructive analyzer appears to be empty."
- screen = 1.0
- return
- if(linked_destroy.loaded_item.reliability >= linked_destroy.min_reliability)
- var/list/temp_tech = ConvertReqString2List(linked_destroy.loaded_item.origin_tech)
- for(var/T in temp_tech)
- files.UpdateTech(T, temp_tech[T])
- if(linked_destroy.loaded_item.reliability < 100 && linked_destroy.loaded_item.crit_fail)
- files.UpdateDesign(linked_destroy.loaded_item.type)
- if(linked_lathe && linked_destroy.loaded_item.matter) //Also sends salvaged materials to a linked protolathe, if any.
- linked_lathe.m_amount += min((linked_lathe.max_material_storage - linked_lathe.TotalMaterials()), (linked_destroy.loaded_item.matter[DEFAULT_WALL_MATERIAL]*linked_destroy.decon_mod))
- linked_lathe.g_amount += min((linked_lathe.max_material_storage - linked_lathe.TotalMaterials()), (linked_destroy.loaded_item.matter["glass"]*linked_destroy.decon_mod))
- linked_destroy.loaded_item = null
+ if(!linked_destroy.loaded_item)
+ usr <<"The destructive analyzer appears to be empty."
+ screen = 1.0
+ return
+
+ for(var/T in linked_destroy.loaded_item.origin_tech)
+ files.UpdateTech(T, linked_destroy.loaded_item.origin_tech[T])
+ if(linked_lathe && linked_destroy.loaded_item.matter) // Also sends salvaged materials to a linked protolathe, if any.
+ for(var/t in linked_destroy.loaded_item.matter)
+ if(t in linked_lathe.materials)
+ linked_lathe.materials[t] += min(linked_lathe.max_material_storage - linked_lathe.TotalMaterials(), linked_destroy.loaded_item.matter[t] * linked_destroy.decon_mod)
+
+ linked_destroy.loaded_item = null
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
+ M.death()
+ 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
@@ -281,12 +269,13 @@ won't update every console in existence) but it's more of a hassle to do. Also,
if(!(I in linked_destroy.component_parts))
qdel(I)
linked_destroy.icon_state = "d_analyzer"
+
use_power(linked_destroy.active_power_usage)
screen = 1.0
updateUsrDialog()
else if(href_list["lock"]) //Lock the console from use by anyone without tox access.
- if(src.allowed(usr))
+ if(allowed(usr))
screen = text2num(href_list["lock"])
else
usr << "Unauthorized Access."
@@ -294,15 +283,13 @@ won't update every console in existence) but it's more of a hassle to do. Also,
else if(href_list["sync"]) //Sync the research holder with all the R&D consoles in the game that aren't sync protected.
screen = 0.0
if(!sync)
- usr << "\red You must connect to the network first!"
+ usr << "You must connect to the network first."
else
griefProtection() //Putting this here because I dont trust the sync process
spawn(30)
if(src)
for(var/obj/machinery/r_n_d/server/S in machines)
var/server_processed = 0
- if(S.disabled)
- continue
if((id in S.id_with_upload) || istype(S, /obj/machinery/r_n_d/server/centcom))
for(var/datum/tech/T in files.known_tech)
S.files.AddTech2Known(T)
@@ -310,7 +297,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
S.files.AddDesign2Known(D)
S.files.RefreshResearch()
server_processed = 1
- if(((id in S.id_with_download) && !istype(S, /obj/machinery/r_n_d/server/centcom)) || S.hacked)
+ if((id in S.id_with_download) && !istype(S, /obj/machinery/r_n_d/server/centcom))
for(var/datum/tech/T in S.files.known_tech)
files.AddTech2Known(T)
for(var/datum/design/D in S.files.known_designs)
@@ -333,57 +320,10 @@ won't update every console in existence) but it's more of a hassle to do. Also,
being_built = D
break
if(being_built)
- var/power = linked_lathe.active_power_usage
- for(var/M in being_built.materials)
- power += round(being_built.materials[M] / 5)
- power = max(linked_lathe.active_power_usage, power)
- screen = 0.3
- linked_lathe.busy = 1
- flick("protolathe_n",linked_lathe)
- var/key = usr.key //so we don't lose the info during the spawn delay
- spawn(16)
- use_power(power)
- spawn(16)
- errored = 1
- for(var/M in being_built.materials)
- switch(M)
- if("$metal")
- linked_lathe.m_amount = max(0, (linked_lathe.m_amount-being_built.materials[M]*linked_lathe.mat_efficiency))
- if("$glass")
- linked_lathe.g_amount = max(0, (linked_lathe.g_amount-being_built.materials[M]*linked_lathe.mat_efficiency))
- if("$gold")
- linked_lathe.gold_amount = max(0, (linked_lathe.gold_amount-being_built.materials[M]*linked_lathe.mat_efficiency))
- if("$silver")
- linked_lathe.silver_amount = max(0, (linked_lathe.silver_amount-being_built.materials[M]*linked_lathe.mat_efficiency))
- if("$phoron")
- linked_lathe.phoron_amount = max(0, (linked_lathe.phoron_amount-being_built.materials[M]*linked_lathe.mat_efficiency))
- if("$uranium")
- linked_lathe.uranium_amount = max(0, (linked_lathe.uranium_amount-being_built.materials[M]*linked_lathe.mat_efficiency))
- if("$diamond")
- linked_lathe.diamond_amount = max(0, (linked_lathe.diamond_amount-being_built.materials[M]*linked_lathe.mat_efficiency))
- else
- linked_lathe.reagents.remove_reagent(M, being_built.materials[M]*linked_lathe.mat_efficiency)
+ linked_lathe.addToQueue(being_built)
- if(being_built.build_path)
- var/obj/new_item = new being_built.build_path(src)
- if( new_item.type == /obj/item/weapon/storage/backpack/holding )
- new_item.investigate_log("built by [key]","singulo")
- new_item.reliability = being_built.reliability
- if(linked_lathe.hacked) being_built.reliability = max((reliability / 2), 0)
- /*if(being_built.locked)
- var/obj/item/weapon/storage/lockbox/L = new/obj/item/weapon/storage/lockbox(linked_lathe.loc)
- new_item.loc = L
- L.name += " ([new_item.name])"*/
- else
- new_item.loc = linked_lathe.loc
- if(linked_lathe.mat_efficiency != 1) // No matter out of nowhere
- if(new_item.matter && new_item.matter.len > 0)
- for(var/i in new_item.matter)
- new_item.matter[i] = new_item.matter[i] * linked_lathe.mat_efficiency
- linked_lathe.busy = 0
- screen = 3.1
- errored = 0
- updateUsrDialog()
+ screen = 3.1
+ updateUsrDialog()
else if(href_list["imprint"]) //Causes the Circuit Imprinter to build something.
if(linked_imprinter)
@@ -393,36 +333,9 @@ won't update every console in existence) but it's more of a hassle to do. Also,
being_built = D
break
if(being_built)
- var/power = linked_imprinter.active_power_usage
- for(var/M in being_built.materials)
- power += round(being_built.materials[M] / 5)
- power = max(linked_imprinter.active_power_usage, power)
- screen = 0.4
- linked_imprinter.busy = 1
- flick("circuit_imprinter_ani",linked_imprinter)
- spawn(16)
- errored = 1
- use_power(power)
- for(var/M in being_built.materials)
- switch(M)
- if("$glass")
- linked_imprinter.g_amount = max(0, (linked_imprinter.g_amount-being_built.materials[M]*linked_imprinter.mat_efficiency))
- if("$gold")
- linked_imprinter.gold_amount = max(0, (linked_imprinter.gold_amount-being_built.materials[M]*linked_imprinter.mat_efficiency))
- if("$diamond")
- linked_imprinter.diamond_amount = max(0, (linked_imprinter.diamond_amount-being_built.materials[M]*linked_imprinter.mat_efficiency))
- if("$uranium")
- linked_imprinter.uranium_amount = max(0, (linked_imprinter.uranium_amount-being_built.materials[M]*linked_imprinter.mat_efficiency))
- else
- linked_imprinter.reagents.remove_reagent(M, being_built.materials[M]*linked_imprinter.mat_efficiency)
- var/obj/new_item = new being_built.build_path(src)
- new_item.reliability = being_built.reliability
- if(linked_imprinter.hacked) being_built.reliability = max((reliability / 2), 0)
- new_item.loc = linked_imprinter.loc
- linked_imprinter.busy = 0
- screen = 4.1
- errored = 0
- updateUsrDialog()
+ linked_imprinter.addToQueue(being_built)
+ screen = 4.1
+ updateUsrDialog()
else if(href_list["disposeI"] && linked_imprinter) //Causes the circuit imprinter to dispose of a single reagent (all of it)
linked_imprinter.reagents.del_reagent(href_list["dispose"])
@@ -430,12 +343,18 @@ won't update every console in existence) but it's more of a hassle to do. Also,
else if(href_list["disposeallI"] && linked_imprinter) //Causes the circuit imprinter to dispose of all it's reagents.
linked_imprinter.reagents.clear_reagents()
+ else if(href_list["removeI"] && linked_lathe)
+ linked_imprinter.removeFromQueue(text2num(href_list["removeI"]))
+
else if(href_list["disposeP"] && linked_lathe) //Causes the protolathe to dispose of a single reagent (all of it)
linked_lathe.reagents.del_reagent(href_list["dispose"])
else if(href_list["disposeallP"] && linked_lathe) //Causes the protolathe to dispose of all it's reagents.
linked_lathe.reagents.clear_reagents()
+ else if(href_list["removeP"] && linked_lathe)
+ linked_lathe.removeFromQueue(text2num(href_list["removeP"]))
+
else if(href_list["lathe_ejectsheet"] && linked_lathe) //Causes the protolathe to eject a sheet of material
var/desired_num_sheets = text2num(href_list["amount"])
var/res_amount, type
@@ -460,11 +379,11 @@ 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)
+ if(available_num_sheets > 0)
sheet.amount = min(available_num_sheets, desired_num_sheets)
- linked_lathe.vars[res_amount] = max(0, (linked_lathe.vars[res_amount]-sheet.amount * sheet.perunit))
+ linked_lathe.vars[res_amount] = max(0, (linked_lathe.vars[res_amount] - sheet.amount * sheet.perunit))
else
qdel(sheet)
else if(href_list["imprinter_ejectsheet"] && linked_imprinter) //Causes the protolathe to eject a sheet of material
@@ -472,29 +391,29 @@ 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)
- linked_imprinter.vars[res_amount] = max(0, (linked_imprinter.vars[res_amount]-sheet.amount * sheet.perunit))
+ linked_imprinter.vars[res_amount] = max(0, (linked_imprinter.vars[res_amount] - sheet.amount * sheet.perunit))
else
qdel(sheet)
else if(href_list["find_device"]) //The R&D console looks for devices nearby to link up with.
screen = 0.0
- spawn(20)
+ spawn(10)
SyncRDevices()
screen = 1.7
updateUsrDialog()
@@ -548,6 +467,8 @@ won't update every console in existence) but it's more of a hassle to do. Also,
var/dat
dat += ""
for(var/datum/tech/T in files.known_tech)
+ if(T.level < 1)
+ continue
dat += "- "
dat += "[T.name]"
dat += "
"
@@ -587,17 +508,14 @@ won't update every console in existence) but it's more of a hassle to do. Also,
if(linked_imprinter == null)
screen = 4.0
- if(errored)
- dat += "An error has occured when constructing prototype. Try refreshing the console."
- dat += "
If problem persists submit bug report stating which item you tried to build."
- dat += "
RESET CONSOLE
"
-
switch(screen)
//////////////////////R&D CONSOLE SCREENS//////////////////
- if(0.0) dat += "Updating Database...."
+ if(0.0)
+ dat += "Updating Database..."
- if(0.1) dat += "Processing and Updating Database..."
+ if(0.1)
+ dat += "Processing and Updating Database..."
if(0.2)
dat += "SYSTEM LOCKED
"
@@ -676,11 +594,9 @@ won't update every console in existence) but it's more of a hassle to do. Also,
dat += "Load Design to Disk || "
else
dat += "Name: [d_disk.blueprint.name]
"
- dat += "Level: [between(0, (d_disk.blueprint.reliability + rand(-15,15)), 100)]
"
switch(d_disk.blueprint.build_type)
if(IMPRINTER) dat += "Lathe Type: Circuit Imprinter
"
if(PROTOLATHE) dat += "Lathe Type: Proto-lathe
"
- if(AUTOLATHE) dat += "Lathe Type: Auto-lathe
"
dat += "Required Materials:
"
for(var/M in d_disk.blueprint.materials)
if(copytext(M, 1, 2) == "$") dat += "* [copytext(M, 2)] x [d_disk.blueprint.materials[M]]
"
@@ -751,9 +667,8 @@ won't update every console in existence) but it's more of a hassle to do. Also,
dat += "Name: [linked_destroy.loaded_item.name]
"
dat += "Origin Tech:"
dat += ""
- var/list/temp_tech = ConvertReqString2List(linked_destroy.loaded_item.origin_tech)
- for(var/T in temp_tech)
- dat += "- [CallTechName(T)] [temp_tech[T]]"
+ for(var/T in linked_destroy.loaded_item.origin_tech)
+ dat += "
- [CallTechName(T)] [linked_destroy.loaded_item.origin_tech[T]]"
for(var/datum/tech/F in files.known_tech)
if(F.name == CallTechName(T))
dat += " (Current: [F.level])"
@@ -769,6 +684,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
if(3.1)
dat += "Main Menu || "
+ dat += "View Queue || "
dat += "Material Storage || "
dat += "Chemical Storage
"
dat += "Protolathe Menu:
"
@@ -779,35 +695,16 @@ won't update every console in existence) but it's more of a hassle to do. Also,
if(!D.build_path || !(D.build_type & PROTOLATHE))
continue
var/temp_dat
- var/check_materials = 1
for(var/M in D.materials)
- temp_dat += ", [D.materials[M]*linked_lathe.mat_efficiency] [CallMaterialName(M)]"
- if(copytext(M, 1, 2) == "$")
- switch(M)
- if("$glass")
- if(D.materials[M]*linked_lathe.mat_efficiency > linked_lathe.g_amount) check_materials = 0
- if("$metal")
- if(D.materials[M]*linked_lathe.mat_efficiency > linked_lathe.m_amount) check_materials = 0
- if("$gold")
- if(D.materials[M]*linked_lathe.mat_efficiency > linked_lathe.gold_amount) check_materials = 0
- if("$silver")
- if(D.materials[M]*linked_lathe.mat_efficiency > linked_lathe.silver_amount) check_materials = 0
- if("$phoron")
- if(D.materials[M]*linked_lathe.mat_efficiency > linked_lathe.phoron_amount) check_materials = 0
- if("$uranium")
- if(D.materials[M]*linked_lathe.mat_efficiency > linked_lathe.uranium_amount) check_materials = 0
- if("$diamond")
- if(D.materials[M]*linked_lathe.mat_efficiency > linked_lathe.diamond_amount) check_materials = 0
- else if (!linked_lathe.reagents.has_reagent(M, D.materials[M]*linked_lathe.mat_efficiency))
- check_materials = 0
+ temp_dat += ", [D.materials[M]] [CallMaterialName(M)]"
+ for(var/T in D.chemicals)
+ temp_dat += ", [D.chemicals[T]*linked_imprinter.mat_efficiency] [CallReagentName(T)]"
if(temp_dat)
- temp_dat = " \[[copytext(temp_dat,3)]\]"
- if(check_materials)
+ temp_dat = " \[[copytext(temp_dat, 3)]\]"
+ if(linked_lathe.canBuild(D))
dat += " - [D.name][temp_dat]"
else
dat += "
- [D.name][temp_dat]"
- if(D.reliability < 100)
- dat += " (Reliability: [D.reliability])"
dat += "
"
if(3.2) //Protolathe Material Storage Sub-menu
@@ -815,33 +712,13 @@ won't update every console in existence) but it's more of a hassle to do. Also,
dat += "Protolathe Menu
"
dat += "Material Storage
"
dat += ""
- for(var/M in list(DEFAULT_WALL_MATERIAL, "glass", "gold", "silver", "phoron", "uranium", "diamond"))
- var/amount
- var/sheetsize = 2000
- switch(M)
- if(DEFAULT_WALL_MATERIAL)
- amount = linked_lathe.m_amount
- sheetsize = 3750
- if("glass")
- amount = linked_lathe.g_amount
- sheetsize = 3750
- if("gold")
- amount = linked_lathe.gold_amount
- if("silver")
- amount = linked_lathe.silver_amount
- if("phoron")
- amount = linked_lathe.phoron_amount
- if("uranium")
- amount = linked_lathe.uranium_amount
- if("diamond")
- amount = linked_lathe.diamond_amount
- else
- continue
+ for(var/M in linked_lathe.materials)
+ var/amount = linked_lathe.materials[M]
dat += "- [capitalize(M)]: [amount] cm3"
- if(amount >= sheetsize)
+ if(amount >= SHEET_MATERIAL_AMOUNT)
dat += " || Eject "
- for (var/C in list(1,3,5,10,15,20,25,30,40))
- if(amount < C * sheetsize)
+ for (var/C in list(1, 3, 5, 10, 15, 20, 25, 30, 40))
+ if(amount < C * SHEET_MATERIAL_AMOUNT)
break
dat += "[C > 1 ? ", " : ""][C] "
@@ -858,6 +735,24 @@ won't update every console in existence) but it's more of a hassle to do. Also,
dat += "(Purge)
"
dat += "Disposal All Chemicals in Storage
"
+ if(3.4) // Protolathe queue
+ dat += "Main Menu || "
+ dat += "Protolathe Menu
"
+ dat += "Queue
"
+ if(!linked_lathe.queue.len)
+ dat += "Empty"
+ else
+ var/tmp = 1
+ for(var/datum/design/D in linked_lathe.queue)
+ if(tmp == 1)
+ if(linked_lathe.busy)
+ dat += "1: [D.name]
"
+ else
+ dat += "1: [D.name] (Awaiting materials) (Remove)
"
+ else
+ dat += "[tmp]: [D.name] (Remove)
"
+ ++tmp
+
///////////////////CIRCUIT IMPRINTER SCREENS////////////////////
if(4.0)
dat += "Main Menu
"
@@ -865,6 +760,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
if(4.1)
dat += "Main Menu || "
+ dat += "View Queue || "
dat += "Material Storage || "
dat += "Chemical Storage
"
dat += "Circuit Imprinter Menu:
"
@@ -875,29 +771,16 @@ won't update every console in existence) but it's more of a hassle to do. Also,
if(!D.build_path || !(D.build_type & IMPRINTER))
continue
var/temp_dat
- var/check_materials = 1
for(var/M in D.materials)
temp_dat += ", [D.materials[M]*linked_imprinter.mat_efficiency] [CallMaterialName(M)]"
- if(copytext(M, 1, 2) == "$")
- switch(M)
- if("$glass")
- if(D.materials[M]*linked_imprinter.mat_efficiency > linked_imprinter.g_amount) check_materials = 0
- if("$gold")
- if(D.materials[M]*linked_imprinter.mat_efficiency > linked_imprinter.gold_amount) check_materials = 0
- if("$diamond")
- if(D.materials[M]*linked_imprinter.mat_efficiency > linked_imprinter.diamond_amount) check_materials = 0
- if("$uranium")
- if(D.materials[M]*linked_imprinter.mat_efficiency > linked_imprinter.uranium_amount) check_materials = 0
- else if (!linked_imprinter.reagents.has_reagent(M, D.materials[M]*linked_imprinter.mat_efficiency))
- check_materials = 0
+ for(var/T in D.chemicals)
+ temp_dat += ", [D.chemicals[T]*linked_imprinter.mat_efficiency] [CallReagentName(T)]"
if(temp_dat)
temp_dat = " \[[copytext(temp_dat,3)]\]"
- if (check_materials)
+ if(linked_imprinter.canBuild(D))
dat += " - [D.name][temp_dat]"
else
dat += "
- [D.name][temp_dat]"
- if(D.reliability < 100)
- dat += " (Reliability: [D.reliability])"
dat += "
"
if(4.2)
@@ -914,24 +797,13 @@ won't update every console in existence) but it's more of a hassle to do. Also,
dat += "Circuit Imprinter Menu
"
dat += "Material Storage
"
dat += ""
- for(var/M in list("glass", "gold", "diamond", "uranium"))
- var/amount
- var/sheetsize = 2000
- switch(M)
- if("glass")
- amount = linked_imprinter.g_amount
- sheetsize = 3750
- if("gold")
- amount = linked_imprinter.gold_amount
- if("diamond")
- amount = linked_imprinter.diamond_amount
- if("uranium")
- amount = linked_imprinter.uranium_amount
+ for(var/M in linked_imprinter.materials)
+ var/amount = linked_imprinter.materials[M]
dat += "- [capitalize(M)]: [amount] cm3"
- if(amount >= sheetsize)
+ if(amount >= SHEET_MATERIAL_AMOUNT)
dat += " || Eject: "
- for (var/C in list(1,3,5,10,15,20,25,30,40))
- if(amount < C * sheetsize)
+ for (var/C in list(1, 3, 5, 10, 15, 20, 25, 30, 40))
+ if(amount < C * SHEET_MATERIAL_AMOUNT)
break
dat += "[C > 1 ? ", " : ""][C] "
@@ -939,6 +811,21 @@ won't update every console in existence) but it's more of a hassle to do. Also,
dat += ""
dat += "
"
+ if(4.4)
+ dat += "Main Menu || "
+ dat += "Circuit Imprinter Menu
"
+ dat += "Queue
"
+ if(linked_imprinter.queue.len == 0)
+ dat += "Empty"
+ else
+ var/tmp = 1
+ for(var/datum/design/D in linked_imprinter.queue)
+ if(tmp == 1)
+ dat += "1: [D.name]
"
+ else
+ dat += "[tmp]: [D.name] (Remove)
"
+ ++tmp
+
///////////////////Research Information Browser////////////////////
if(5.0)
dat += "Main Menu || "
diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm
index 4f0b81e531..3f73929aad 100644
--- a/code/modules/research/rdmachines.dm
+++ b/code/modules/research/rdmachines.dm
@@ -2,7 +2,6 @@
//All devices that link into the R&D console fall into thise type for easy identification and some shared procs.
-
/obj/machinery/r_n_d
name = "R&D Device"
icon = 'icons/obj/machines/research.dmi'
@@ -10,83 +9,42 @@
anchored = 1
use_power = 1
var/busy = 0
- var/hacked = 0
- var/disabled = 0
- var/shocked = 0
- var/list/wires = list()
- var/hack_wire
- var/disable_wire
- var/shock_wire
var/obj/machinery/computer/rdconsole/linked_console
-/obj/machinery/r_n_d/New()
- ..()
- wires["Red"] = 0
- wires["Blue"] = 0
- wires["Green"] = 0
- wires["Yellow"] = 0
- wires["Black"] = 0
- wires["White"] = 0
- var/list/w = list("Red","Blue","Green","Yellow","Black","White")
- src.hack_wire = pick(w)
- w -= src.hack_wire
- src.shock_wire = pick(w)
- w -= src.shock_wire
- src.disable_wire = pick(w)
- w -= src.disable_wire
-
/obj/machinery/r_n_d/attack_hand(mob/user as mob)
- if (shocked)
- shock(user,50)
- if(panel_open)
- var/dat as text
- dat += "[src.name] Wires:
"
- for(var/wire in src.wires)
- dat += text("[wire] Wire: [src.wires[wire] ? "Mend" : "Cut"] Pulse
")
-
- dat += text("The red light is [src.disabled ? "off" : "on"].
")
- dat += text("The green light is [src.shocked ? "off" : "on"].
")
- dat += text("The blue light is [src.hacked ? "off" : "on"].
")
- user << browse("[src.name] Hacking[dat]","window=hack_win")
return
+/obj/machinery/r_n_d/proc/getMaterialType(var/name)
+ switch(name)
+ if("metal")
+ return /obj/item/stack/material/steel
+ if("glass")
+ return /obj/item/stack/material/glass
+ if("gold")
+ return /obj/item/stack/material/gold
+ if("silver")
+ return /obj/item/stack/material/silver
+ if("phoron")
+ return /obj/item/stack/material/phoron
+ if("uranium")
+ return /obj/item/stack/material/uranium
+ if("diamond")
+ return /obj/item/stack/material/diamond
+ return null
-/obj/machinery/r_n_d/Topic(href, href_list)
- if(..())
- return
- usr.set_machine(src)
- src.add_fingerprint(usr)
- if(href_list["pulse"])
- var/temp_wire = href_list["wire"]
- if (!istype(usr.get_active_hand(), /obj/item/device/multitool))
- usr << "You need a multitool!"
- else
- if(src.wires[temp_wire])
- usr << "You can't pulse a cut wire."
- else
- if(src.hack_wire == href_list["wire"])
- src.hacked = !src.hacked
- spawn(100) src.hacked = !src.hacked
- if(src.disable_wire == href_list["wire"])
- src.disabled = !src.disabled
- src.shock(usr,50)
- spawn(100) src.disabled = !src.disabled
- if(src.shock_wire == href_list["wire"])
- src.shocked = !src.shocked
- src.shock(usr,50)
- spawn(100) src.shocked = !src.shocked
- if(href_list["cut"])
- if (!istype(usr.get_active_hand(), /obj/item/weapon/wirecutters))
- usr << "You need wirecutters!"
- else
- var/temp_wire = href_list["wire"]
- wires[temp_wire] = !wires[temp_wire]
- if(src.hack_wire == temp_wire)
- src.hacked = !src.hacked
- if(src.disable_wire == temp_wire)
- src.disabled = !src.disabled
- src.shock(usr,50)
- if(src.shock_wire == temp_wire)
- src.shocked = !src.shocked
- src.shock(usr,50)
- src.updateUsrDialog()
+/obj/machinery/r_n_d/proc/getMaterialName(var/type)
+ switch(type)
+ if(/obj/item/stack/material/steel)
+ return "metal"
+ if(/obj/item/stack/material/glass)
+ return "glass"
+ if(/obj/item/stack/material/gold)
+ return "gold"
+ if(/obj/item/stack/material/silver)
+ return "silver"
+ if(/obj/item/stack/material/phoron)
+ return "phoron"
+ if(/obj/item/stack/material/uranium)
+ return "uranium"
+ if(/obj/item/stack/material/diamond)
+ return "diamond"
\ No newline at end of file
diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm
index a397728b73..702b4d882f 100644
--- a/code/modules/research/research.dm
+++ b/code/modules/research/research.dm
@@ -45,16 +45,13 @@ research holder datum.
***************************************************************/
/datum/research //Holder for all the existing, archived, and known tech. Individual to console.
-
- //Datum/tech go here.
- var/list/possible_tech = list() //List of all tech in the game that players have access to (barring special events).
- var/list/known_tech = list() //List of locally known tech.
- var/list/possible_designs = list() //List of all designs (at base reliability).
- var/list/known_designs = list() //List of available designs (at base reliability).
+ var/list/known_tech = list() //List of locally known tech. Datum/tech go here.
+ var/list/possible_designs = list() //List of all designs.
+ var/list/known_designs = list() //List of available designs.
/datum/research/New() //Insert techs into possible_tech here. Known_tech automatically updated.
for(var/T in typesof(/datum/tech) - /datum/tech)
- possible_tech += new T(src)
+ known_tech += new T(src)
for(var/D in typesof(/datum/design) - /datum/design)
possible_designs += new D(src)
RefreshResearch()
@@ -63,59 +60,26 @@ research holder datum.
/datum/research/techonly/New()
for(var/T in typesof(/datum/tech) - /datum/tech)
- possible_tech += new T(src)
+ known_tech += new T(src)
RefreshResearch()
-
-//Checks to see if tech has all the required pre-reqs.
-//Input: datum/tech; Output: 0/1 (false/true)
-/datum/research/proc/TechHasReqs(var/datum/tech/T)
- if(T.req_tech.len == 0)
- return 1
- var/matches = 0
- for(var/req in T.req_tech)
- for(var/datum/tech/known in known_tech)
- if((req == known.id) && (known.level >= T.req_tech[req]))
- matches++
- break
- if(matches == T.req_tech.len)
- return 1
- else
- return 0
-
//Checks to see if design has all the required pre-reqs.
//Input: datum/design; Output: 0/1 (false/true)
/datum/research/proc/DesignHasReqs(var/datum/design/D)
if(D.req_tech.len == 0)
return 1
- var/matches = 0
+
var/list/k_tech = list()
+
for(var/datum/tech/known in known_tech)
k_tech[known.id] = known.level
+
for(var/req in D.req_tech)
- if(!isnull(k_tech[req]) && k_tech[req] >= D.req_tech[req])
- matches++
- if(matches == D.req_tech.len)
- return 1
- else
- return 0
-/*
-//Checks to see if design has all the required pre-reqs.
-//Input: datum/design; Output: 0/1 (false/true)
-/datum/research/proc/DesignHasReqs(var/datum/design/D)
- if(D.req_tech.len == 0)
- return 1
- var/matches = 0
- for(var/req in D.req_tech)
- for(var/datum/tech/known in known_tech)
- if((req == known.id) && (known.level >= D.req_tech[req]))
- matches++
- break
- if(matches == D.req_tech.len)
- return 1
- else
- return 0
-*/
+ if(isnull(k_tech[req]) || k_tech[req] < D.req_tech[req])
+ return 0
+
+ return 1
+
//Adds a tech to known_tech list. Checks to make sure there aren't duplicates and updates existing tech's levels if needed.
//Input: datum/tech; Output: Null
/datum/research/proc/AddTech2Known(var/datum/tech/T)
@@ -124,143 +88,107 @@ research holder datum.
if(T.level > known.level)
known.level = T.level
return
- known_tech += T
return
/datum/research/proc/AddDesign2Known(var/datum/design/D)
- for(var/datum/design/known in known_designs)
- if(D.id == known.id)
- if(D.reliability_mod > known.reliability_mod)
- known.reliability_mod = D.reliability_mod
+ if(!known_designs.len) // Special case
+ known_designs.Add(D)
+ return
+ for(var/i = 1 to known_designs.len)
+ var/datum/design/A = known_designs[i]
+ if(A.id == D.id) // We are guaranteed to reach this if the ids are the same, because sort_string will also be the same
return
- known_designs += D
+ if(A.sort_string > D.sort_string)
+ known_designs.Insert(i, D)
+ return
+ known_designs.Add(D)
return
-//Refreshes known_tech and known_designs list. Then updates the reliability vars of the designs in the known_designs list.
+//Refreshes known_tech and known_designs list
//Input/Output: n/a
/datum/research/proc/RefreshResearch()
- for(var/datum/tech/PT in possible_tech)
- if(TechHasReqs(PT))
- AddTech2Known(PT)
for(var/datum/design/PD in possible_designs)
if(DesignHasReqs(PD))
AddDesign2Known(PD)
for(var/datum/tech/T in known_tech)
- T = between(1,T.level,20)
- for(var/datum/design/D in known_designs)
- D.CalcReliability(known_tech)
+ T = between(0, T.level, 20)
return
//Refreshes the levels of a given tech.
//Input: Tech's ID and Level; Output: null
/datum/research/proc/UpdateTech(var/ID, var/level)
for(var/datum/tech/KT in known_tech)
- if(KT.id == ID)
- if(KT.level <= level) KT.level = max((KT.level + 1), (level - 1))
+ if(KT.id == ID && KT.level <= level)
+ KT.level = max(KT.level + 1, level - 1)
return
-/datum/research/proc/UpdateDesign(var/path)
- for(var/datum/design/KD in known_designs)
- if(KD.build_path == path)
- KD.reliability_mod += rand(1,2)
- break
- return
-
-
-
-
/***************************************************************
** Technology Datums **
** Includes all the various technoliges and what they make. **
***************************************************************/
-datum/tech //Datum of individual technologies.
+/datum/tech //Datum of individual technologies.
var/name = "name" //Name of the technology.
var/desc = "description" //General description of what it does and what it makes.
var/id = "id" //An easily referenced ID. Must be alphanumeric, lower-case, and no symbols.
var/level = 1 //A simple number scale of the research level. Level 0 = Secret tech.
- var/list/req_tech = list() //List of ids associated values of techs required to research this tech. "id" = #
-
-//Trunk Technologies (don't require any other techs and you start knowning them).
-
-datum/tech/materials
+/datum/tech/materials
name = "Materials Research"
desc = "Development of new and improved materials."
- id = "materials"
+ id = TECH_MATERIAL
-datum/tech/engineering
+/datum/tech/engineering
name = "Engineering Research"
desc = "Development of new and improved engineering parts."
- id = "engineering"
+ id = TECH_ENGINERING
-datum/tech/phorontech
+/datum/tech/phorontech
name = "Phoron Research"
desc = "Research into the mysterious substance colloqually known as 'phoron'."
- id = "phorontech"
+ id = TECH_PHORON
-datum/tech/powerstorage
+/datum/tech/powerstorage
name = "Power Manipulation Technology"
desc = "The various technologies behind the storage and generation of electicity."
- id = "powerstorage"
+ id = TECH_POWER
-datum/tech/bluespace
+/datum/tech/bluespace
name = "'Blue-space' Research"
desc = "Research into the sub-reality known as 'blue-space'"
- id = "bluespace"
+ id = TECH_BLUESPACE
-datum/tech/biotech
+/datum/tech/biotech
name = "Biological Technology"
desc = "Research into the deeper mysteries of life and organic substances."
- id = "biotech"
+ id = TECH_BIO
-datum/tech/combat
+/datum/tech/combat
name = "Combat Systems Research"
desc = "The development of offensive and defensive systems."
- id = "combat"
+ id = TECH_COMBAT
-datum/tech/magnets
+/datum/tech/magnets
name = "Electromagnetic Spectrum Research"
desc = "Research into the electromagnetic spectrum. No clue how they actually work, though."
- id = "magnets"
+ id = TECH_MAGNET
-datum/tech/programming
+/datum/tech/programming
name = "Data Theory Research"
desc = "The development of new computer and artificial intelligence and data storage systems."
- id = "programming"
+ id = TECH_DATA
-datum/tech/syndicate
+/datum/tech/syndicate
name = "Illegal Technologies Research"
desc = "The study of technologies that violate standard Nanotrasen regulations."
- id = "syndicate"
+ id = TECH_ILLEGAL
+ level = 0
-/*
-datum/tech/arcane
+/datum/tech/arcane
name = "Arcane Research"
desc = "Research into the occult and arcane field for use in practical science"
- id = "arcane"
- level = 0 //It didn't become "secret" as advertised.
-
-//Branch Techs
-datum/tech/explosives
- name = "Explosives Research"
- desc = "The creation and application of explosive materials."
- id = "explosives"
- req_tech = list("materials" = 3)
-
-datum/tech/generators
- name = "Power Generation Technology"
- desc = "Research into more powerful and more reliable sources."
- id = "generators"
- req_tech = list("powerstorage" = 2)
-
-datum/tech/robotics
- name = "Robotics Technology"
- desc = "The development of advanced automated, autonomous machines."
- id = "robotics"
- req_tech = list("materials" = 3, "programming" = 3)
-*/
-
+ id = TECH_ARCANE
+ level = 0
/obj/item/weapon/disk/tech_disk
name = "technology disk"
@@ -273,8 +201,8 @@ datum/tech/robotics
var/datum/tech/stored
/obj/item/weapon/disk/tech_disk/New()
- src.pixel_x = rand(-5.0, 5)
- src.pixel_y = rand(-5.0, 5)
+ pixel_x = rand(-5.0, 5)
+ pixel_y = rand(-5.0, 5)
/obj/item/weapon/disk/design_disk
name = "component design disk"
@@ -283,9 +211,9 @@ datum/tech/robotics
icon_state = "datadisk2"
item_state = "card-id"
w_class = 2.0
- matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 10)
+ matter = list(DEFAULT_WALL_MATERIAL = 30, "glass" = 10)
var/datum/design/blueprint
/obj/item/weapon/disk/design_disk/New()
- src.pixel_x = rand(-5.0, 5)
- src.pixel_y = rand(-5.0, 5)
+ pixel_x = rand(-5.0, 5)
+ pixel_y = rand(-5.0, 5)
diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm
index d57c995755..cca8f65b16 100644
--- a/code/modules/research/server.dm
+++ b/code/modules/research/server.dm
@@ -4,7 +4,7 @@
icon_state = "server"
var/datum/research/files
var/health = 100
- var/list/id_with_upload = list() //List of R&D consoles with upload to server access.
+ var/list/id_with_upload = list() //List of R&D consoles with upload to server access.
var/list/id_with_download = list() //List of R&D consoles with download from server access.
var/id_with_upload_string = "" //String versions for easy editing in map editor.
var/id_with_download_string = ""
@@ -22,7 +22,7 @@
component_parts += new /obj/item/stack/cable_coil(src)
component_parts += new /obj/item/stack/cable_coil(src)
RefreshParts()
- src.initialize(); //Agouri
+ initialize();
/obj/machinery/r_n_d/server/Destroy()
griefProtection()
@@ -35,7 +35,8 @@
idle_power_usage /= max(1, tot_rating)
/obj/machinery/r_n_d/server/initialize()
- if(!files) files = new /datum/research(src)
+ if(!files)
+ files = new /datum/research(src)
var/list/temp_list
if(!id_with_upload.len)
temp_list = list()
@@ -74,23 +75,18 @@
griefProtection()
..()
-
/obj/machinery/r_n_d/server/emp_act(severity)
griefProtection()
..()
-
/obj/machinery/r_n_d/server/ex_act(severity)
griefProtection()
..()
-
/obj/machinery/r_n_d/server/blob_act()
griefProtection()
..()
-
-
//Backup files to centcomm to help admins recover data after greifer attacks
/obj/machinery/r_n_d/server/proc/griefProtection()
for(var/obj/machinery/r_n_d/server/centcom/C in machines)
@@ -101,10 +97,10 @@
C.files.RefreshResearch()
/obj/machinery/r_n_d/server/proc/produce_heat()
- if (!produces_heat)
+ if(!produces_heat)
return
- if (!use_power)
+ if(!use_power)
return
if(!(stat & (NOPOWER|BROKEN))) //Blatently stolen from telecoms
@@ -124,43 +120,12 @@
env.merge(removed)
/obj/machinery/r_n_d/server/attackby(var/obj/item/O as obj, var/mob/user as mob)
- if (disabled)
+ if(default_deconstruction_screwdriver(user, O))
return
- if (shocked)
- shock(user,50)
- if (istype(O, /obj/item/weapon/screwdriver))
- if (!panel_open)
- panel_open = 1
- icon_state = "server_o"
- user << "You open the maintenance hatch of [src]."
- else
- panel_open = 0
- icon_state = "server"
- user << "You close the maintenance hatch of [src]."
+ if(default_deconstruction_crowbar(user, O))
+ return
+ if(default_part_replacement(user, O))
return
- if (panel_open)
- if(istype(O, /obj/item/weapon/crowbar))
- griefProtection()
- playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
- var/obj/machinery/constructable_frame/machine_frame/M = new /obj/machinery/constructable_frame/machine_frame(src.loc)
- M.state = 2
- M.icon_state = "box_1"
- for(var/obj/I in component_parts)
- if(I.reliability != 100 && crit_fail)
- I.crit_fail = 1
- I.loc = src.loc
- qdel(src)
- return 1
-
-/obj/machinery/r_n_d/server/attack_hand(mob/user as mob)
- if (disabled)
- return
- if (shocked)
- shock(user,50)
- return
-
-
-
/obj/machinery/r_n_d/server/centcom
name = "Centcom Central R&D Database"
@@ -190,8 +155,7 @@
no_id_servers -= S
/obj/machinery/r_n_d/server/centcom/process()
- return PROCESS_KILL //don't need process()
-
+ return PROCESS_KILL //don't need process()
/obj/machinery/computer/rdservercontrol
name = "R&D Server Controller"
@@ -210,8 +174,8 @@
add_fingerprint(usr)
usr.set_machine(src)
- if(!src.allowed(usr) && !emagged)
- usr << "\red You do not have the required access level"
+ if(!allowed(usr) && !emagged)
+ usr << "You do not have the required access level"
return
if(href_list["main"])
@@ -267,7 +231,6 @@
if(choice == "Continue")
for(var/datum/design/D in temp_server.files.known_designs)
if(D.id == href_list["reset_design"])
- D.reliability_mod = 0
temp_server.files.known_designs -= D
break
temp_server.files.RefreshResearch()
@@ -344,14 +307,12 @@
src.updateUsrDialog()
return ..()
-
/obj/machinery/r_n_d/server/robotics
name = "Robotics R&D Server"
id_with_upload_string = "1;2"
id_with_download_string = "1;2"
server_id = 2
-
/obj/machinery/r_n_d/server/core
name = "Core R&D Server"
id_with_upload_string = "1"
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..33cb2d52ff 100644
--- a/code/modules/research/xenoarchaeology/finds/finds.dm
+++ b/code/modules/research/xenoarchaeology/finds/finds.dm
@@ -30,7 +30,7 @@
icon_state = "strange"
var/obj/item/weapon/inside
var/method = 0// 0 = fire, 1 = brush, 2 = pick
- origin_tech = "materials=5"
+ origin_tech = list(TECH_MATERIAL = 5)
/obj/item/weapon/ore/strangerock/New(loc, var/inside_item_type = 0)
..(loc)
@@ -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)
@@ -254,7 +254,7 @@
if(prob(75))
new_item = new /obj/item/weapon/pen(src.loc)
else
- new_item = new /obj/item/weapon/pen/sleepypen(src.loc)
+ new_item = new /obj/item/weapon/pen/reagent/sleepy(src.loc)
if(prob(30))
apply_image_decorations = 1
if(16)
@@ -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/suspension_generator.dm b/code/modules/research/xenoarchaeology/tools/suspension_generator.dm
index b14c892cd0..7450dd0603 100644
--- a/code/modules/research/xenoarchaeology/tools/suspension_generator.dm
+++ b/code/modules/research/xenoarchaeology/tools/suspension_generator.dm
@@ -159,7 +159,7 @@
else if(cell)
cell.loc = loc
cell.add_fingerprint(user)
- cell.updateicon()
+ cell.update_icon()
icon_state = "suspension0"
cell = null
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/shieldgen/emergency_shield.dm b/code/modules/shieldgen/emergency_shield.dm
index 2400070ba3..15bfa973ed 100644
--- a/code/modules/shieldgen/emergency_shield.dm
+++ b/code/modules/shieldgen/emergency_shield.dm
@@ -12,6 +12,21 @@
var/shield_generate_power = 7500 //how much power we use when regenerating
var/shield_idle_power = 1500 //how much power we use when just being sustained.
+/obj/machinery/shield/malfai
+ name = "emergency forcefield"
+ desc = "A weak forcefield which seems to be projected by the station's emergency atmosphere containment field"
+ health = max_health/2 // Half health, it's not suposed to resist much.
+
+/obj/machinery/shield/malfai/process()
+ health -= 0.5 // Slowly lose integrity over time
+ check_failure()
+
+/obj/machinery/shield/proc/check_failure()
+ if (src.health <= 0)
+ visible_message("\The [src] dissipates!")
+ qdel(src)
+ return
+
/obj/machinery/shield/New()
src.set_dir(pick(1,2,3,4))
..()
@@ -38,12 +53,7 @@
//Play a fitting sound
playsound(src.loc, 'sound/effects/EMPulse.ogg', 75, 1)
-
- if (src.health <= 0)
- visible_message("\blue The [src] dissipates!")
- qdel(src)
- return
-
+ check_failure()
opacity = 1
spawn(20) if(src) opacity = 0
@@ -51,12 +61,7 @@
/obj/machinery/shield/meteorhit()
src.health -= max_health*0.75 //3/4 health as damage
-
- if(src.health <= 0)
- visible_message("\blue The [src] dissipates!")
- qdel(src)
- return
-
+ check_failure()
opacity = 1
spawn(20) if(src) opacity = 0
return
@@ -64,10 +69,7 @@
/obj/machinery/shield/bullet_act(var/obj/item/projectile/Proj)
health -= Proj.damage
..()
- if(health <=0)
- visible_message("\blue The [src] dissipates!")
- qdel(src)
- return
+ check_failure()
opacity = 1
spawn(20) if(src) opacity = 0
@@ -98,7 +100,7 @@
/obj/machinery/shield/hitby(AM as mob|obj)
//Let everyone know we've been hit!
- visible_message("\red [src] was hit by [AM].")
+ visible_message("\[src] was hit by [AM].")
//Super realistic, resource-intensive, real-time damage calculations.
var/tforce = 0
@@ -112,11 +114,7 @@
//This seemed to be the best sound for hitting a force field.
playsound(src.loc, 'sound/effects/EMPulse.ogg', 100, 1)
- //Handle the destruction of the shield
- if (src.health <= 0)
- visible_message("\blue The [src] dissipates!")
- qdel(src)
- return
+ check_failure()
//The shield becomes dense to absorb the blow.. purely asthetic.
opacity = 1
@@ -124,9 +122,6 @@
..()
return
-
-
-
/obj/machinery/shieldgen
name = "Emergency shield projector"
desc = "Used to seal minor hull breaches."
diff --git a/code/modules/shuttles/shuttle_emergency.dm b/code/modules/shuttles/shuttle_emergency.dm
index 5215400a4e..ea572e8fb4 100644
--- a/code/modules/shuttles/shuttle_emergency.dm
+++ b/code/modules/shuttles/shuttle_emergency.dm
@@ -62,7 +62,11 @@
if (istype(user, /obj/machinery/computer/shuttle_control/emergency)) //if we were given a command by an emergency shuttle console
if (emergency_shuttle.autopilot)
emergency_shuttle.autopilot = 0
- world << "\blue Alert: The shuttle autopilot has been overridden. Launch sequence initiated!"
+ world << "Alert: The shuttle autopilot has been overridden. Launch sequence initiated!"
+
+ if(usr)
+ log_admin("[key_name(usr)] has overridden the shuttle autopilot and activated launch sequence")
+ message_admins("[key_name_admin(usr)] has overridden the shuttle autopilot and activated launch sequence")
..(user)
@@ -72,7 +76,11 @@
if (istype(user, /obj/machinery/computer/shuttle_control/emergency)) //if we were given a command by an emergency shuttle console
if (emergency_shuttle.autopilot)
emergency_shuttle.autopilot = 0
- world << "\blue Alert: The shuttle autopilot has been overridden. Bluespace drive engaged!"
+ world << "Alert: The shuttle autopilot has been overridden. Bluespace drive engaged!"
+
+ if(usr)
+ log_admin("[key_name(usr)] has overridden the shuttle autopilot and forced immediate launch")
+ message_admins("[key_name_admin(usr)] has overridden the shuttle autopilot and forced immediate launch")
..(user)
@@ -82,7 +90,11 @@
if (istype(user, /obj/machinery/computer/shuttle_control/emergency)) //if we were given a command by an emergency shuttle console
if (emergency_shuttle.autopilot)
emergency_shuttle.autopilot = 0
- world << "\blue Alert: The shuttle autopilot has been overridden. Launch sequence aborted!"
+ world << "Alert: The shuttle autopilot has been overridden. Launch sequence aborted!"
+
+ if(usr)
+ log_admin("[key_name(usr)] has overridden the shuttle autopilot and cancelled launch sequence")
+ message_admins("[key_name_admin(usr)] has overridden the shuttle autopilot and cancelled launch sequence")
..(user)
@@ -102,8 +114,8 @@
authorized = initial(authorized)
//returns 1 if the ID was accepted and a new authorization was added, 0 otherwise
-/obj/machinery/computer/shuttle_control/emergency/proc/read_authorization(var/ident)
- if (!ident)
+/obj/machinery/computer/shuttle_control/emergency/proc/read_authorization(var/obj/item/ident)
+ if (!ident || !istype(ident))
return 0
if (authorized.len >= req_authorizations)
return 0 //don't need any more
@@ -112,33 +124,35 @@
var/auth_name
var/dna_hash
- if(istype(ident, /obj/item/weapon/card/id))
- var/obj/item/weapon/card/id/ID = ident
- access = ID.access
- auth_name = "[ID.registered_name] ([ID.assignment])"
- dna_hash = ID.dna_hash
+ var/obj/item/weapon/card/id/ID = ident.GetID()
- if(istype(ident, /obj/item/device/pda))
- var/obj/item/device/pda/PDA = ident
- access = PDA.id.access
- auth_name = "[PDA.id.registered_name] ([PDA.id.assignment])"
- dna_hash = PDA.id.dna_hash
+ if(!ID)
+ return
+
+ access = ID.access
+ auth_name = "[ID.registered_name] ([ID.assignment])"
+ dna_hash = ID.dna_hash
if (!access || !istype(access))
return 0 //not an ID
if (dna_hash in authorized)
- src.visible_message("[src] buzzes. That ID has already been scanned.")
+ src.visible_message("\The [src] buzzes. That ID has already been scanned.")
return 0
if (!(access_heads in access))
- src.visible_message("[src] buzzes, rejecting [ident].")
+ src.visible_message("\The [src] buzzes, rejecting [ident].")
return 0
- src.visible_message("[src] beeps as it scans [ident].")
+ src.visible_message("\The [src] beeps as it scans [ident].")
authorized[dna_hash] = auth_name
if (req_authorizations - authorized.len)
- world << "\blue Alert: [req_authorizations - authorized.len] authorization\s needed to override the shuttle autopilot."
+ world << "Alert: [req_authorizations - authorized.len] authorization\s needed to override the shuttle autopilot."
+
+ if(usr)
+ log_admin("[key_name(usr)] has inserted [ID] into the shuttle control computer - [req_authorizations - authorized.len] authorisation\s needed")
+ message_admins("[key_name_admin(usr)] has inserted [ID] into the shuttle control computer - [req_authorizations - authorized.len] authorisation\s needed")
+
return 1
@@ -146,7 +160,7 @@
/obj/machinery/computer/shuttle_control/emergency/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (istype(W, /obj/item/weapon/card/emag) && !emagged)
- user << "\blue You short out the [src]'s authorization protocols."
+ user << "You short out \the [src]'s authorization protocols."
emagged = 1
return
diff --git a/code/modules/supermatter/supermatter.dm b/code/modules/supermatter/supermatter.dm
index bf5d6957a6..c08f85b298 100644
--- a/code/modules/supermatter/supermatter.dm
+++ b/code/modules/supermatter/supermatter.dm
@@ -120,12 +120,17 @@
if(lum != light_range || clr != light_color)
set_light(lum, l_color = clr)
-/obj/machinery/power/supermatter/proc/announce_warning()
+/obj/machinery/power/supermatter/proc/get_integrity()
var/integrity = damage / explosion_point
integrity = round(100 - integrity * 100)
integrity = integrity < 0 ? 0 : integrity
+ return integrity
+
+
+/obj/machinery/power/supermatter/proc/announce_warning()
+ var/integrity = get_integrity()
var/alert_msg = " Integrity at [integrity]%"
-
+
if(damage > emergency_point)
alert_msg = emergency_alert + alert_msg
lastwarning = world.timeofday - WARNING_DELAY * 4
@@ -148,7 +153,20 @@
else if(safe_warned && public_alert)
radio.autosay(alert_msg, "Supermatter Monitor")
public_alert = 0
+
+
+/obj/machinery/power/supermatter/get_transit_zlevel()
+ //don't send it back to the station -- most of the time
+ if(prob(99))
+ var/list/candidates = accessible_z_levels.Copy()
+ for(var/zlevel in config.station_levels)
+ candidates.Remove("[zlevel]")
+ candidates.Remove("[src.z]")
+ if(candidates.len)
+ return text2num(pickweight(candidates))
+
+ return ..()
/obj/machinery/power/supermatter/process()
@@ -267,11 +285,11 @@
if(Adjacent(user))
return attack_hand(user)
else
- user << "You attempt to interface with the control circuits but find they are not connected to your network. Maybe in a future firmware update."
+ ui_interact(user)
return
/obj/machinery/power/supermatter/attack_ai(mob/user as mob)
- user << "You attempt to interface with the control circuits but find they are not connected to your network. Maybe in a future firmware update."
+ ui_interact(user)
/obj/machinery/power/supermatter/attack_hand(mob/user as mob)
user.visible_message("\The [user] reaches out and touches \the [src], inducing a resonance... \his body starts to glow and bursts into flames before flashing into ash.",\
@@ -280,6 +298,31 @@
Consume(user)
+// This is purely informational UI that may be accessed by AIs or robots
+/obj/machinery/power/supermatter/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ var/data[0]
+
+ data["integrity_percentage"] = round(get_integrity())
+ var/datum/gas_mixture/env = null
+ if(!istype(src.loc, /turf/space))
+ env = src.loc.return_air()
+
+ if(!env)
+ data["ambient_temp"] = 0
+ data["ambient_pressure"] = 0
+ else
+ data["ambient_temp"] = round(env.temperature)
+ data["ambient_pressure"] = round(env.return_pressure())
+ data["detonating"] = grav_pulling
+
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ if (!ui)
+ ui = new(user, src, ui_key, "supermatter_crystal.tmpl", "Supermatter Crystal", 500, 300)
+ ui.set_initial_data(data)
+ ui.open()
+ ui.set_auto_update(1)
+
+
/*
/obj/machinery/power/supermatter/proc/transfer_energy()
for(var/obj/machinery/power/rad_collector/R in rad_collectors)
diff --git a/code/modules/surgery/bones.dm b/code/modules/surgery/bones.dm
index b2ccbb1003..25addbd40a 100644
--- a/code/modules/surgery/bones.dm
+++ b/code/modules/surgery/bones.dm
@@ -18,7 +18,7 @@
if (!hasorgans(target))
return 0
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- return affected && affected.open >= 2 && affected.stage == 0
+ return affected && !(affected.status & ORGAN_ROBOT) && affected.open >= 2 && affected.stage == 0
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -52,7 +52,7 @@
if (!hasorgans(target))
return 0
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- return affected && affected.name != "head" && affected.open >= 2 && affected.stage == 1
+ return affected && affected.name != "head" && !(affected.status & ORGAN_ROBOT) && affected.open >= 2 && affected.stage == 1
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -91,7 +91,7 @@
if (!hasorgans(target))
return 0
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- return affected && affected.name == "head" && affected.open >= 2 && affected.stage == 1
+ return affected && affected.name == "head" && !(affected.status & ORGAN_ROBOT) && affected.open >= 2 && affected.stage == 1
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message("[user] is beginning to piece together [target]'s skull with \the [tool]." , \
@@ -127,7 +127,7 @@
if (!hasorgans(target))
return 0
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- return affected && affected.open >= 2 && affected.stage == 2
+ return affected && affected.open >= 2 && !(affected.status & ORGAN_ROBOT) && affected.stage == 2
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
diff --git a/code/modules/surgery/brainrepair.dm b/code/modules/surgery/brainrepair.dm
deleted file mode 100644
index 60fdffe31d..0000000000
--- a/code/modules/surgery/brainrepair.dm
+++ /dev/null
@@ -1,70 +0,0 @@
-//////////////////////////////////////////////////////////////////
-// BRAIN DAMAGE FIXING //
-//////////////////////////////////////////////////////////////////
-
-/datum/surgery_step/brain/bone_chips
- allowed_tools = list(
- /obj/item/weapon/hemostat = 100, \
- /obj/item/weapon/wirecutters = 75, \
- /obj/item/weapon/kitchen/utensil/fork = 20
- )
-
- priority = 3
- min_duration = 80
- max_duration = 100
-
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if(!affected) return
- var/obj/item/organ/brain/sponge = target.internal_organs_by_name["brain"]
- return (sponge && sponge.damage > 0 && sponge.damage <= 20) && affected.open == 3
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts taking bone chips out of [target]'s brain with \the [tool].", \
- "You start taking bone chips out of [target]'s brain with \the [tool].")
- ..()
-
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("\blue [user] takes out all the bone chips in [target]'s brain with \the [tool].", \
- "\blue You take out all the bone chips in [target]'s brain with \the [tool].")
- var/obj/item/organ/brain/sponge = target.internal_organs_by_name["brain"]
- if (sponge)
- sponge.damage = 0
-
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("\red [user]'s hand slips, jabbing \the [tool] in [target]'s brain!", \
- "\red Your hand slips, jabbing \the [tool] in [target]'s brain!")
- target.apply_damage(30, BRUTE, "head", 1, sharp=1)
-
-/datum/surgery_step/brain/hematoma
- allowed_tools = list(
- /obj/item/weapon/FixOVein = 100, \
- /obj/item/stack/cable_coil = 75
- )
-
- priority = 3
- min_duration = 90
- max_duration = 110
-
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if(!affected) return
- var/obj/item/organ/brain/sponge = target.internal_organs_by_name["brain"]
- return (sponge && sponge.damage > 20) && affected.open == 3
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts mending hematoma in [target]'s brain with \the [tool].", \
- "You start mending hematoma in [target]'s brain with \the [tool].")
- ..()
-
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("\blue [user] mends hematoma in [target]'s brain with \the [tool].", \
- "\blue You mend hematoma in [target]'s brain with \the [tool].")
- var/obj/item/organ/brain/sponge = target.internal_organs_by_name["brain"]
- if (sponge)
- sponge.damage = 20
-
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("\red [user]'s hand slips, bruising [target]'s brain with \the [tool]!", \
- "\red Your hand slips, bruising [target]'s brain with \the [tool]!")
- target.apply_damage(20, BRUTE, "head", 1, sharp=1)
\ No newline at end of file
diff --git a/code/modules/surgery/encased.dm b/code/modules/surgery/encased.dm
index fedf5bbc1c..1744cec3d7 100644
--- a/code/modules/surgery/encased.dm
+++ b/code/modules/surgery/encased.dm
@@ -12,13 +12,13 @@
return 0
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- return affected && affected.encased && affected.open >= 2
+ return affected && !(affected.status & ORGAN_ROBOT) && affected.encased && affected.open >= 2
/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
deleted file mode 100644
index edc1c54c67..0000000000
--- a/code/modules/surgery/eye.dm
+++ /dev/null
@@ -1,147 +0,0 @@
-//Procedures in this file: Eye mending surgery
-//////////////////////////////////////////////////////////////////
-// EYE SURGERY //
-//////////////////////////////////////////////////////////////////
-
-/datum/surgery_step/eye
- priority = 2
- can_infect = 1
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if (!hasorgans(target))
- return 0
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if (!affected)
- return 0
-
- var/obj/item/organ/eyes = target.internal_organs_by_name["eyes"]
-
- return target_zone == "eyes" && eyes
-
-/datum/surgery_step/eye/cut_open
- allowed_tools = list(
- /obj/item/weapon/scalpel = 100, \
- /obj/item/weapon/kitchenknife = 75, \
- /obj/item/weapon/shard = 50, \
- )
-
- min_duration = 90
- max_duration = 110
-
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return ..()
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts to separate the corneas on [target]'s eyes with \the [tool].", \
- "You start to separate the corneas on [target]'s eyes with \the [tool].")
- ..()
-
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("\blue [user] has separated the corneas on [target]'s eyes with \the [tool]." , \
- "\blue You have separated the corneas on [target]'s eyes with \the [tool].",)
- target.op_stage.eyes = 1
- target.blinded += 1.5
-
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/eyes/eyes = target.internal_organs_by_name["eyes"]
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("\red [user]'s hand slips, slicing [target]'s eyes wth \the [tool]!" , \
- "\red Your hand slips, slicing [target]'s eyes wth \the [tool]!" )
- affected.createwound(CUT, 10)
- eyes.take_damage(5, 0)
-
-/datum/surgery_step/eye/lift_eyes
- allowed_tools = list(
- /obj/item/weapon/retractor = 100, \
- /obj/item/weapon/kitchen/utensil/fork = 50
- )
-
- min_duration = 30
- max_duration = 40
-
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return ..() && target.op_stage.eyes == 1
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts lifting corneas from [target]'s eyes with \the [tool].", \
- "You start lifting corneas from [target]'s eyes with \the [tool].")
- ..()
-
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("\blue [user] has lifted the corneas from [target]'s eyes from with \the [tool]." , \
- "\blue You has lifted the corneas from [target]'s eyes from with \the [tool]." )
- target.op_stage.eyes = 2
-
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/eyes/eyes = target.internal_organs_by_name["eyes"]
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("\red [user]'s hand slips, damaging [target]'s eyes with \the [tool]!", \
- "\red Your hand slips, damaging [target]'s eyes with \the [tool]!")
- target.apply_damage(10, BRUTE, affected)
- eyes.take_damage(5, 0)
-
-/datum/surgery_step/eye/mend_eyes
- allowed_tools = list(
- /obj/item/weapon/hemostat = 100, \
- /obj/item/stack/cable_coil = 75, \
- /obj/item/device/assembly/mousetrap = 10 //I don't know. Don't ask me. But I'm leaving it because hilarity.
- )
-
- min_duration = 80
- max_duration = 100
-
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return ..() && target.op_stage.eyes == 2
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts mending the nerves and lenses in [target]'s eyes with \the [tool].", \
- "You start mending the nerves and lenses in [target]'s eyes with the [tool].")
- ..()
-
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("\blue [user] mends the nerves and lenses in [target]'s with \the [tool]." , \
- "\blue You mend the nerves and lenses in [target]'s with \the [tool].")
- target.op_stage.eyes = 3
-
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/eyes/eyes = target.internal_organs_by_name["eyes"]
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("\red [user]'s hand slips, stabbing \the [tool] into [target]'s eye!", \
- "\red Your hand slips, stabbing \the [tool] into [target]'s eye!")
- target.apply_damage(10, BRUTE, affected, sharp=1)
- eyes.take_damage(5, 0)
-
-/datum/surgery_step/eye/cauterize
- allowed_tools = list(
- /obj/item/weapon/cautery = 100, \
- /obj/item/clothing/mask/smokable/cigarette = 75, \
- /obj/item/weapon/flame/lighter = 50, \
- /obj/item/weapon/weldingtool = 25
- )
-
- min_duration = 70
- max_duration = 100
-
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return ..()
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] is beginning to cauterize the incision around [target]'s eyes with \the [tool]." , \
- "You are beginning to cauterize the incision around [target]'s eyes with \the [tool].")
-
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/eyes/eyes = target.internal_organs_by_name["eyes"]
- user.visible_message("\blue [user] cauterizes the incision around [target]'s eyes with \the [tool].", \
- "\blue You cauterize the incision around [target]'s eyes with \the [tool].")
- if (target.op_stage.eyes == 3)
- target.disabilities &= ~NEARSIGHTED
- target.sdisabilities &= ~BLIND
- eyes.damage = 0
- target.op_stage.eyes = 0
-
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/eyes/eyes = target.internal_organs_by_name["eyes"]
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("\red [user]'s hand slips, searing [target]'s eyes with \the [tool]!", \
- "\red Your hand slips, searing [target]'s eyes with \the [tool]!")
- target.apply_damage(5, BURN, affected)
- eyes.take_damage(5, 0)
\ No newline at end of file
diff --git a/code/modules/surgery/face.dm b/code/modules/surgery/face.dm
index e25291eba5..7272ecf49e 100644
--- a/code/modules/surgery/face.dm
+++ b/code/modules/surgery/face.dm
@@ -10,15 +10,15 @@
if (!hasorgans(target))
return 0
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if (!affected)
+ if (!affected || (affected.status & ORGAN_ROBOT))
return 0
return target_zone == "mouth"
/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..20bf10bd00 100644
--- a/code/modules/surgery/generic.dm
+++ b/code/modules/surgery/generic.dm
@@ -17,8 +17,6 @@
return 0
if (affected.status & ORGAN_DESTROYED)
return 0
- if (target_zone == "head" && target.species && (target.species.flags & IS_SYNTHETIC))
- return 1
if (affected.status & ORGAN_ROBOT)
return 0
return 1
@@ -110,8 +108,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 +183,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 +274,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/headreattach.dm b/code/modules/surgery/headreattach.dm
deleted file mode 100644
index ad47b14429..0000000000
--- a/code/modules/surgery/headreattach.dm
+++ /dev/null
@@ -1,33 +0,0 @@
-//This is an uguu head restoration surgery TOTALLY not yoinked from chinsky's limb reattacher
-/datum/surgery_step/attach_head/
- priority = 3 // Must be higher than /datum/surgery_step/internal
- allowed_tools = list(/obj/item/organ/external/head = 100)
- can_infect = 0
-
- min_duration = 80
- max_duration = 100
-
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/head = target.get_organ(target_zone)
- return isnull(head) && target_zone == "head" && !isnull(target.species.has_limbs["head"])
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts attaching [tool] to [target]'s neck.", \
- "You start attaching [tool] to [target]'s neck.")
-
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("\blue [user] has attached [target]'s head to the body.", \
- "\blue You have attached [target]'s head to the body.")
- var/obj/item/organ/external/head = tool
- user.drop_from_inventory(head)
- head.replaced(target)
- head.loc = target
- head.status = 0
- target.update_body()
- target.updatehealth()
- target.UpdateDamageIcon()
-
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("\red [user]'s hand slips, damaging [target]'s neck!", \
- "\red Your hand slips, damaging [target]'s neck!")
- target.apply_damage(10, BRUTE, null, sharp=1)
diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm
index f660061ccc..62cf65b2ce 100644
--- a/code/modules/surgery/implant.dm
+++ b/code/modules/surgery/implant.dm
@@ -32,6 +32,12 @@
return "abdominal"
return ""
+ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/chest/affected = target.get_organ(target_zone)
+ user.visible_message("\red [user]'s hand slips, scraping around inside [target]'s [affected.name] with \the [tool]!", \
+ "\red Your hand slips, scraping around inside [target]'s [affected.name] with \the [tool]!")
+ affected.createwound(CUT, 20)
+
/datum/surgery_step/cavity/make_space
allowed_tools = list(
/obj/item/weapon/surgicaldrill = 100, \
@@ -60,12 +66,6 @@
user.visible_message("\blue [user] makes some space inside [target]'s [get_cavity(affected)] cavity with \the [tool].", \
"\blue You make some space inside [target]'s [get_cavity(affected)] cavity with \the [tool]." )
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/chest/affected = target.get_organ(target_zone)
- user.visible_message("\red [user]'s hand slips, scraping tissue inside [target]'s [affected.name] with \the [tool]!", \
- "\red Your hand slips, scraping tissue inside [target]'s [affected.name] with \the [tool]!")
- affected.createwound(CUT, 20)
-
/datum/surgery_step/cavity/close_space
priority = 2
allowed_tools = list(
@@ -96,12 +96,6 @@
user.visible_message("\blue [user] mends [target]'s [get_cavity(affected)] cavity walls with \the [tool].", \
"\blue You mend [target]'s [get_cavity(affected)] cavity walls with \the [tool]." )
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/chest/affected = target.get_organ(target_zone)
- user.visible_message("\red [user]'s hand slips, scraping tissue inside [target]'s [affected.name] with \the [tool]!", \
- "\red Your hand slips, scraping tissue inside [target]'s [affected.name] with \the [tool]!")
- affected.createwound(CUT, 20)
-
/datum/surgery_step/cavity/place_item
priority = 0
allowed_tools = list(/obj/item = 100)
@@ -126,7 +120,7 @@
user.visible_message("\blue [user] puts \the [tool] inside [target]'s [get_cavity(affected)] cavity.", \
"\blue You put \the [tool] inside [target]'s [get_cavity(affected)] cavity." )
- if (tool.w_class > get_max_wclass(affected)/2 && prob(50))
+ if (tool.w_class > get_max_wclass(affected)/2 && prob(50) && !(affected.status & ORGAN_ROBOT))
user << "\red You tear some blood vessels trying to fit such a big object in this cavity."
var/datum/wound/internal_bleeding/I = new (10)
affected.wounds += I
@@ -136,12 +130,6 @@
tool.loc = target
affected.cavity = 0
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/chest/affected = target.get_organ(target_zone)
- user.visible_message("\red [user]'s hand slips, scraping tissue inside [target]'s [affected.name] with \the [tool]!", \
- "\red Your hand slips, scraping tissue inside [target]'s [affected.name] with \the [tool]!")
- affected.createwound(CUT, 20)
-
//////////////////////////////////////////////////////////////////
// IMPLANT/ITEM REMOVAL SURGERY //
//////////////////////////////////////////////////////////////////
@@ -150,7 +138,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
@@ -162,9 +150,9 @@
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] starts poking around inside the incision on [target]'s [affected.name] with \the [tool].", \
- "You start poking around inside the incision on [target]'s [affected.name] with \the [tool]" )
- target.custom_pain("The pain in your chest is living hell!",1)
+ user.visible_message("[user] starts poking around inside [target]'s [affected.name] with \the [tool].", \
+ "You start poking around inside [target]'s [affected.name] with \the [tool]" )
+ target.custom_pain("The pain in your [affected.name] is living hell!",1)
..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -209,8 +197,8 @@
user.visible_message("\blue [user] removes \the [tool] from [target]'s [affected.name].", \
"\blue There's something inside [target]'s [affected.name], but you just missed it this time." )
else if (affected.hidden)
- user.visible_message("\blue [user] takes something out of incision on [target]'s [affected.name] with \the [tool].", \
- "\blue You take something out of incision on [target]'s [affected.name]s with \the [tool]." )
+ user.visible_message("\blue [user] takes something out of [target]'s [affected.name] with \the [tool].", \
+ "\blue You take something out of [target]'s [affected.name]s with \the [tool]." )
affected.hidden.loc = get_turf(target)
if(!affected.hidden.blood_DNA)
affected.hidden.blood_DNA = list()
@@ -223,10 +211,8 @@
"\blue You could not find anything inside [target]'s [affected.name]." )
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ ..()
var/obj/item/organ/external/chest/affected = target.get_organ(target_zone)
- user.visible_message("\red [user]'s hand slips, scraping tissue inside [target]'s [affected.name] with \the [tool]!", \
- "\red Your hand slips, scraping tissue inside [target]'s [affected.name] with \the [tool]!")
- affected.createwound(CUT, 20)
if (affected.implants.len)
var/fail_prob = 10
fail_prob += 100 - tool_quality(tool)
diff --git a/code/modules/surgery/limb_reattach.dm b/code/modules/surgery/limb_reattach.dm
new file mode 100644
index 0000000000..aee13ede83
--- /dev/null
+++ b/code/modules/surgery/limb_reattach.dm
@@ -0,0 +1,129 @@
+//Procedures in this file: Robotic limbs attachment, meat limbs attachment
+//////////////////////////////////////////////////////////////////
+// LIMB SURGERY //
+//////////////////////////////////////////////////////////////////
+
+/datum/surgery_step/limb/
+ priority = 3 // Must be higher than /datum/surgery_step/internal
+ can_infect = 0
+ can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (!hasorgans(target))
+ return 0
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if (affected)
+ return 0
+ var/list/organ_data = target.species.has_limbs["[target_zone]"]
+ return !isnull(organ_data)
+
+/datum/surgery_step/limb/attach
+ allowed_tools = list(/obj/item/organ/external = 100)
+
+ min_duration = 50
+ max_duration = 70
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/E = tool
+ user.visible_message("[user] starts attaching [E.name] to [target]'s [E.amputation_point].", \
+ "You start attaching [E.name] to [target]'s [E.amputation_point].")
+
+ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/E = tool
+ user.visible_message("[user] has attached [target]'s [E.name] to the [E.amputation_point].>", \
+ "You have attached [target]'s [E.name] to the [E.amputation_point].")
+ user.drop_from_inventory(E)
+ E.replaced(target)
+ E.loc = target
+ target.update_body()
+ target.updatehealth()
+ target.UpdateDamageIcon()
+
+ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/E = tool
+ user.visible_message(" [user]'s hand slips, damaging [target]'s [E.amputation_point]!", \
+ " Your hand slips, damaging [target]'s [E.amputation_point]!")
+ target.apply_damage(10, BRUTE, null, sharp=1)
+
+/datum/surgery_step/limb/connect
+ allowed_tools = list(
+ /obj/item/weapon/hemostat = 100, \
+ /obj/item/stack/cable_coil = 75, \
+ /obj/item/device/assembly/mousetrap = 20
+ )
+ can_infect = 1
+
+ min_duration = 100
+ max_duration = 120
+
+ can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/E = target.get_organ(target_zone)
+ return E && !E.is_stump() && (E.status & ORGAN_DESTROYED)
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/E = target.get_organ(target_zone)
+ user.visible_message("[user] starts connecting tendons and muscles in [target]'s [E.amputation_point] with [tool].", \
+ "You start connecting tendons and muscle in [target]'s [E.amputation_point].")
+
+ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/E = target.get_organ(target_zone)
+ user.visible_message("[user] has connected tendons and muscles in [target]'s [E.amputation_point] with [tool].", \
+ "You have connected tendons and muscles in [target]'s [E.amputation_point] with [tool].")
+ E.status &= ~ORGAN_DESTROYED
+ if(E.children)
+ for(var/obj/item/organ/external/C in E.children)
+ C.status &= ~ORGAN_DESTROYED
+ target.update_body()
+ target.updatehealth()
+ target.UpdateDamageIcon()
+
+ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/E = tool
+ user.visible_message(" [user]'s hand slips, damaging [target]'s [E.amputation_point]!", \
+ " Your hand slips, damaging [target]'s [E.amputation_point]!")
+ target.apply_damage(10, BRUTE, null, sharp=1)
+
+/datum/surgery_step/limb/mechanize
+ allowed_tools = list(/obj/item/robot_parts = 100)
+
+ min_duration = 80
+ max_duration = 100
+
+ can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if(..())
+ var/obj/item/robot_parts/p = tool
+ if (p.part)
+ if (!(target_zone in p.part))
+ return 0
+ return isnull(target.get_organ(target_zone))
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] starts attaching \the [tool] to [target].", \
+ "You start attaching \the [tool] to [target].")
+
+ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/robot_parts/L = tool
+ user.visible_message("[user] has attached \the [tool] to [target].", \
+ "You have attached \the [tool] to [target].")
+
+ if(L.part)
+ for(var/part_name in L.part)
+ if(!isnull(target.get_organ(part_name)))
+ continue
+ var/list/organ_data = target.species.has_limbs["[part_name]"]
+ if(!organ_data)
+ continue
+ var/new_limb_type = organ_data["path"]
+ var/obj/item/organ/external/new_limb = new new_limb_type(target)
+ new_limb.robotize(L.model_info)
+ if(L.sabotaged)
+ new_limb.sabotaged = 1
+
+ target.update_body()
+ target.updatehealth()
+ target.UpdateDamageIcon()
+
+ qdel(tool)
+
+ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message(" [user]'s hand slips, damaging [target]'s flesh!", \
+ " Your hand slips, damaging [target]'s flesh!")
+ target.apply_damage(10, BRUTE, null, sharp=1)
diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm
index 182c3eac2a..d352c4aed4 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
@@ -138,81 +138,12 @@
if(I && I.damage > 0)
I.take_damage(dam_amt,0)
-/datum/surgery_step/internal/fix_organ_robotic //For artificial organs
- allowed_tools = list(
- /obj/item/stack/nanopaste = 100, \
- /obj/item/weapon/bonegel = 30, \
- /obj/item/weapon/screwdriver = 70, \
- )
-
- min_duration = 70
- max_duration = 90
-
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
-
- if (!hasorgans(target))
- return
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if(!affected) return
- var/is_organ_damaged = 0
- for(var/obj/item/organ/I in affected.internal_organs)
- if(I.damage > 0 && I.robotic >= 2)
- is_organ_damaged = 1
- break
- return ..() && is_organ_damaged
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
-
- if (!hasorgans(target))
- return
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
-
- for(var/obj/item/organ/I in affected.internal_organs)
- if(I && I.damage > 0)
- if(I.robotic >= 2)
- user.visible_message("[user] starts mending the damage to [target]'s [I.name]'s mechanisms.", \
- "You start mending the damage to [target]'s [I.name]'s mechanisms." )
-
- target.custom_pain("The pain in your [affected.name] is living hell!",1)
- ..()
-
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
-
- if (!hasorgans(target))
- return
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
-
- for(var/obj/item/organ/I in affected.internal_organs)
-
- if(I && I.damage > 0)
- if(I.robotic >= 2)
- user.visible_message("\blue [user] repairs [target]'s [I.name] with [tool].", \
- "\blue You repair [target]'s [I.name] with [tool]." )
- I.damage = 0
-
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
-
- if (!hasorgans(target))
- return
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
-
- user.visible_message("\red [user]'s hand slips, gumming up the mechanisms inside of [target]'s [affected.name] with \the [tool]!", \
- "\red Your hand slips, gumming up the mechanisms inside of [target]'s [affected.name] with \the [tool]!")
-
- target.adjustToxLoss(5)
- affected.createwound(CUT, 5)
-
- for(var/obj/item/organ/I in affected.internal_organs)
- if(I)
- I.take_damage(rand(3,5),0)
-
-
/datum/surgery_step/internal/detatch_organ
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
@@ -223,12 +154,17 @@
if (!..())
return 0
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+
+ if(!(affected && !(affected.status & ORGAN_ROBOT)))
+ return 0
+
target.op_stage.current_organ = null
var/list/attached_organs = list()
for(var/organ in target.internal_organs_by_name)
var/obj/item/organ/I = target.internal_organs_by_name[organ]
- if(I && !I.status && I.parent_organ == target_zone)
+ if(I && !(I.status & ORGAN_CUT_AWAY) && I.parent_organ == target_zone)
attached_organs |= organ
var/organ_to_remove = input(user, "Which organ do you want to prepare for removal?") as null|anything in attached_organs
@@ -267,7 +203,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
@@ -283,7 +219,7 @@
var/list/removable_organs = list()
for(var/organ in target.internal_organs_by_name)
var/obj/item/organ/I = target.internal_organs_by_name[organ]
- if(I.status & ORGAN_CUT_AWAY && I.parent_organ == target_zone)
+ if((I.status & ORGAN_CUT_AWAY) && I.parent_organ == target_zone)
removable_organs |= organ
var/organ_to_remove = input(user, "Which organ do you want to remove?") as null|anything in removable_organs
@@ -312,8 +248,8 @@
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("\red [user]'s hand slips, damaging the flesh in [target]'s [affected.name] with \the [tool]!", \
- "\red Your hand slips, damaging the flesh in [target]'s [affected.name] with \the [tool]!")
+ user.visible_message("\red [user]'s hand slips, damaging [target]'s [affected.name] with \the [tool]!", \
+ "\red Your hand slips, damaging [target]'s [affected.name] with \the [tool]!")
affected.createwound(BRUISE, 20)
/datum/surgery_step/internal/replace_organ
@@ -335,6 +271,10 @@
if(!istype(O))
return 0
+ if((affected.status & ORGAN_ROBOT) && !(O.status & ORGAN_ROBOT))
+ user << "You cannot install a naked organ into a robotic body."
+ return 2
+
if(!target.species)
user << "\red You have no idea what species this person is. Report this on the bug tracker."
return 2
@@ -410,7 +350,7 @@
var/list/removable_organs = list()
for(var/organ in target.internal_organs_by_name)
var/obj/item/organ/I = target.internal_organs_by_name[organ]
- if(I && I.status & ORGAN_CUT_AWAY && I.parent_organ == target_zone)
+ if(I && (I.status & ORGAN_CUT_AWAY) && !(I.status & ORGAN_ROBOT) && I.parent_organ == target_zone)
removable_organs |= organ
var/organ_to_replace = input(user, "Which organ do you want to reattach?") as null|anything in removable_organs
@@ -447,8 +387,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..ba9334d933 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
@@ -186,7 +186,7 @@
return 0
if(istype(tool,/obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/welder = tool
- if(!welder.isOn())
+ if(!welder.isOn() || !welder.remove_fuel(1,user))
return 0
return (target_zone == "chest") && istype(target.back, /obj/item/weapon/rig) && !(target.back.canremove)
diff --git a/code/modules/surgery/robolimbs.dm b/code/modules/surgery/robolimbs.dm
deleted file mode 100644
index d8214837bf..0000000000
--- a/code/modules/surgery/robolimbs.dm
+++ /dev/null
@@ -1,62 +0,0 @@
-//Procedures in this file: Robotic limbs attachment
-//////////////////////////////////////////////////////////////////
-// LIMB SURGERY //
-//////////////////////////////////////////////////////////////////
-
-/datum/surgery_step/limb/
- can_infect = 0
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if (!hasorgans(target))
- return 0
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if (affected)
- return 0
- var/list/organ_data = target.species.has_limbs["[target_zone]"]
- return !isnull(organ_data) && !(target_zone in list("head","groin","chest"))
-
-/datum/surgery_step/limb/attach
- allowed_tools = list(/obj/item/robot_parts = 100)
-
- min_duration = 80
- max_duration = 100
-
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if(..())
- var/obj/item/robot_parts/p = tool
- if (p.part)
- if (!(target_zone in p.part))
- return 0
- return isnull(target.get_organ(target_zone))
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts attaching \the [tool] to [target].", \
- "You start attaching \the [tool] to [target].")
-
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/robot_parts/L = tool
- user.visible_message("\blue [user] has attached \the [tool] to [target].", \
- "\blue You have attached \the [tool] to [target].")
-
- if(L.part)
- for(var/part_name in L.part)
- if(!isnull(target.get_organ(part_name)))
- continue
- var/list/organ_data = target.species.has_limbs["[part_name]"]
- if(!organ_data)
- continue
- var/new_limb_type = organ_data["path"]
- var/obj/item/organ/external/new_limb = new new_limb_type(target)
- new_limb.robotize(L.model_info)
- if(L.sabotaged)
- new_limb.sabotaged = 1
-
- target.update_body()
- target.updatehealth()
- target.UpdateDamageIcon()
-
- qdel(tool)
-
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("\red [user]'s hand slips, damaging [target]'s flesh!", \
- "\red Your hand slips, damaging [target]'s flesh!")
- target.apply_damage(10, BRUTE, null, sharp=1)
diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm
new file mode 100644
index 0000000000..11babd42e4
--- /dev/null
+++ b/code/modules/surgery/robotics.dm
@@ -0,0 +1,421 @@
+//Procedures in this file: Gneric surgery steps
+//////////////////////////////////////////////////////////////////
+// COMMON STEPS //
+//////////////////////////////////////////////////////////////////
+
+/datum/surgery_step/robotics/
+ can_infect = 0
+ can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (isslime(target))
+ return 0
+ if (target_zone == "eyes") //there are specific steps for eye surgery
+ return 0
+ if (!hasorgans(target))
+ return 0
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if (affected == null)
+ return 0
+ if (affected.status & ORGAN_DESTROYED)
+ return 0
+ if (!(affected.status & ORGAN_ROBOT))
+ return 0
+ return 1
+
+/datum/surgery_step/robotics/unscrew_hatch
+ allowed_tools = list(
+ /obj/item/weapon/screwdriver = 100,
+ /obj/item/weapon/coin = 50,
+ /obj/item/weapon/material/kitchen/utensil/knife = 50
+ )
+
+ min_duration = 90
+ max_duration = 110
+
+ can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if(..())
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ return affected && affected.open == 0 && target_zone != "mouth"
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] starts to unscrew the maintenance hatch on [target]'s [affected.name] with \the [tool].", \
+ "You start to unscrew the maintenance hatch on [target]'s [affected.name] with \the [tool].")
+ ..()
+
+ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\blue [user] has opened the maintenance hatch on [target]'s [affected.name] with \the [tool].", \
+ "\blue You have opened the maintenance hatch on [target]'s [affected.name] with \the [tool].",)
+ affected.open = 1
+
+ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\red [user]'s [tool.name] slips, failing to unscrew [target]'s [affected.name].", \
+ "\red Your [tool] slips, failing to unscrew [target]'s [affected.name].")
+
+/datum/surgery_step/robotics/open_hatch
+ allowed_tools = list(
+ /obj/item/weapon/retractor = 100,
+ /obj/item/weapon/crowbar = 100,
+ /obj/item/weapon/material/kitchen/utensil = 50
+ )
+
+ min_duration = 30
+ max_duration = 40
+
+ can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if(..())
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ return affected && affected.open == 1
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] starts to pry open the maintenance hatch on [target]'s [affected.name] with \the [tool].",
+ "You start to pry open the maintenance hatch on [target]'s [affected.name] with \the [tool].")
+ ..()
+
+ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\blue [user] open the maintenance hatch on [target]'s [affected.name] with \the [tool].", \
+ "\blue You open the maintenance hatch on [target]'s [affected.name] with \the [tool]." )
+ affected.open = 2
+
+ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\red [user]'s [tool.name] slips, failing to open the hatch on [target]'s [affected.name].",
+ "\red Your [tool] slips, failing to open the hatch on [target]'s [affected.name].")
+
+/datum/surgery_step/robotics/close_hatch
+ allowed_tools = list(
+ /obj/item/weapon/retractor = 100,
+ /obj/item/weapon/crowbar = 100,
+ /obj/item/weapon/material/kitchen/utensil = 50
+ )
+
+ min_duration = 70
+ max_duration = 100
+
+ can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if(..())
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ return affected && affected.open && target_zone != "mouth"
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] begins to close and secure the hatch on [target]'s [affected.name] with \the [tool]." , \
+ "You begin to close and secure the hatch on [target]'s [affected.name] with \the [tool].")
+ ..()
+
+ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\blue [user] closes and secures the hatch on [target]'s [affected.name] with \the [tool].", \
+ "\blue You close and secure the hatch on [target]'s [affected.name] with \the [tool].")
+ affected.open = 0
+ affected.germ_level = 0
+
+ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\red [user]'s [tool.name] slips, failing to close the hatch on [target]'s [affected.name].",
+ "\red Your [tool.name] slips, failing to close the hatch on [target]'s [affected.name].")
+
+/datum/surgery_step/robotics/repair_brute
+ allowed_tools = list(
+ /obj/item/weapon/weldingtool = 100,
+ /obj/item/weapon/pickaxe/plasmacutter = 50
+ )
+
+ min_duration = 50
+ max_duration = 60
+
+ can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if(..())
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(istype(tool,/obj/item/weapon/weldingtool))
+ var/obj/item/weapon/weldingtool/welder = tool
+ if(!welder.isOn() || !welder.remove_fuel(1,user))
+ return 0
+ return affected && affected.open && affected.brute_dam > 0 && target_zone != "mouth"
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] begins to patch damage to [target]'s [affected.name]'s support structure with \the [tool]." , \
+ "You begin to patch damage to [target]'s [affected.name]'s support structure with \the [tool].")
+ ..()
+
+ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\blue [user] finishes patching damage to [target]'s [affected.name] with \the [tool].", \
+ "\blue You finish patching damage to [target]'s [affected.name] with \the [tool].")
+ affected.heal_damage(rand(30,50),0)
+
+ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\red [user]'s [tool.name] slips, damaging the internal structure of [target]'s [affected.name].",
+ "\red Your [tool.name] slips, damaging the internal structure of [target]'s [affected.name].")
+ target.apply_damage(rand(5,10), BURN, affected)
+
+/datum/surgery_step/robotics/repair_burn
+ allowed_tools = list(
+ /obj/item/stack/cable_coil = 100
+ )
+
+ min_duration = 50
+ max_duration = 60
+
+ can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if(..())
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ return affected && affected.open && affected.burn_dam > 0 && target_zone != "mouth"
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] begins to splice new cabling into [target]'s [affected.name]." , \
+ "You begin to splice new cabling into [target]'s [affected.name].")
+ ..()
+
+ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\blue [user] finishes splicing cable into [target]'s [affected.name].", \
+ "\blue You finishes splicing new cable into [target]'s [affected.name].")
+ affected.heal_damage(0,rand(30,50))
+
+ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\red [user] causes a short circuit in [target]'s [affected.name]!",
+ "\red You cause a short circuit in [target]'s [affected.name]!")
+ target.apply_damage(rand(5,10), BURN, affected)
+
+/datum/surgery_step/robotics/fix_organ_robotic //For artificial organs
+ allowed_tools = list(
+ /obj/item/stack/nanopaste = 100, \
+ /obj/item/weapon/bonegel = 30, \
+ /obj/item/weapon/screwdriver = 70, \
+ )
+
+ min_duration = 70
+ max_duration = 90
+
+ can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+
+ if (!hasorgans(target))
+ return
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(!affected) return
+ var/is_organ_damaged = 0
+ for(var/obj/item/organ/I in affected.internal_organs)
+ if(I.damage > 0 && I.robotic >= 2)
+ is_organ_damaged = 1
+ break
+ return affected.open == 2 && is_organ_damaged
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+
+ if (!hasorgans(target))
+ return
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+
+ for(var/obj/item/organ/I in affected.internal_organs)
+ if(I && I.damage > 0)
+ if(I.robotic >= 2)
+ user.visible_message("[user] starts mending the damage to [target]'s [I.name]'s mechanisms.", \
+ "You start mending the damage to [target]'s [I.name]'s mechanisms." )
+
+ target.custom_pain("The pain in your [affected.name] is living hell!",1)
+ ..()
+
+ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+
+ if (!hasorgans(target))
+ return
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+
+ for(var/obj/item/organ/I in affected.internal_organs)
+
+ if(I && I.damage > 0)
+ if(I.robotic >= 2)
+ user.visible_message("\blue [user] repairs [target]'s [I.name] with [tool].", \
+ "\blue You repair [target]'s [I.name] with [tool]." )
+ I.damage = 0
+
+ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+
+ if (!hasorgans(target))
+ return
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+
+ user.visible_message("\red [user]'s hand slips, gumming up the mechanisms inside of [target]'s [affected.name] with \the [tool]!", \
+ "\red Your hand slips, gumming up the mechanisms inside of [target]'s [affected.name] with \the [tool]!")
+
+ target.adjustToxLoss(5)
+ affected.createwound(CUT, 5)
+
+ for(var/obj/item/organ/I in affected.internal_organs)
+ if(I)
+ I.take_damage(rand(3,5),0)
+
+/datum/surgery_step/robotics/detatch_organ_robotic
+
+ allowed_tools = list(
+ /obj/item/device/multitool = 100
+ )
+
+ min_duration = 90
+ max_duration = 110
+
+ can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(!(affected && (affected.status & ORGAN_ROBOT)))
+ return 0
+ if(affected.open != 2)
+ return 0
+
+ target.op_stage.current_organ = null
+
+ var/list/attached_organs = list()
+ for(var/organ in target.internal_organs_by_name)
+ var/obj/item/organ/I = target.internal_organs_by_name[organ]
+ if(I && !(I.status & ORGAN_CUT_AWAY) && I.parent_organ == target_zone)
+ attached_organs |= organ
+
+ var/organ_to_remove = input(user, "Which organ do you want to prepare for removal?") as null|anything in attached_organs
+ if(!organ_to_remove)
+ return 0
+
+ target.op_stage.current_organ = organ_to_remove
+
+ return ..() && organ_to_remove
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] starts to decouple [target]'s [target.op_stage.current_organ] with \the [tool].", \
+ "You start to decouple [target]'s [target.op_stage.current_organ] with \the [tool]." )
+ ..()
+
+ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("\blue [user] has decoupled [target]'s [target.op_stage.current_organ] with \the [tool]." , \
+ "\blue You have decoupled [target]'s [target.op_stage.current_organ] with \the [tool].")
+
+ var/obj/item/organ/I = target.internal_organs_by_name[target.op_stage.current_organ]
+ if(I && istype(I))
+ I.status |= ORGAN_CUT_AWAY
+
+ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("\red [user]'s hand slips, disconnecting \the [tool].", \
+ "\red Your hand slips, disconnecting \the [tool].")
+
+/datum/surgery_step/robotics/attach_organ_robotic
+ allowed_tools = list(
+ /obj/item/weapon/screwdriver = 100,
+ )
+
+ min_duration = 100
+ max_duration = 120
+
+ can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(!(affected && (affected.status & ORGAN_ROBOT)))
+ return 0
+ if(affected.open != 2)
+ return 0
+
+ target.op_stage.current_organ = null
+
+ var/list/removable_organs = list()
+ for(var/organ in target.internal_organs_by_name)
+ var/obj/item/organ/I = target.internal_organs_by_name[organ]
+ if(I && (I.status & ORGAN_CUT_AWAY) && (I.status & ORGAN_ROBOT) && I.parent_organ == target_zone)
+ removable_organs |= organ
+
+ var/organ_to_replace = input(user, "Which organ do you want to reattach?") as null|anything in removable_organs
+ if(!organ_to_replace)
+ return 0
+
+ target.op_stage.current_organ = organ_to_replace
+ return ..()
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] begins reattaching [target]'s [target.op_stage.current_organ] with \the [tool].", \
+ "You start reattaching [target]'s [target.op_stage.current_organ] with \the [tool].")
+ ..()
+
+ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("\blue [user] has reattached [target]'s [target.op_stage.current_organ] with \the [tool]." , \
+ "\blue You have reattached [target]'s [target.op_stage.current_organ] with \the [tool].")
+
+ var/obj/item/organ/I = target.internal_organs_by_name[target.op_stage.current_organ]
+ if(I && istype(I))
+ I.status &= ~ORGAN_CUT_AWAY
+
+ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("\red [user]'s hand slips, disconnecting \the [tool].", \
+ "\red Your hand slips, disconnecting \the [tool].")
+
+/datum/surgery_step/robotics/install_mmi
+ allowed_tools = list(
+ /obj/item/device/mmi = 100
+ )
+
+ min_duration = 60
+ max_duration = 80
+
+ can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+
+ if(target_zone != "head")
+ return
+
+ var/obj/item/device/mmi/M = tool
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(!(affected && affected.open == 2))
+ return 0
+
+ if(!istype(M))
+ return 0
+
+ if(!M.brainmob || !M.brainmob.client || !M.brainmob.ckey || M.brainmob.stat >= DEAD)
+ user << "That brain is not usable."
+ return 2
+
+ if(!(affected.status & ORGAN_ROBOT))
+ user << "You cannot install a computer brain into a meat skull."
+ return 2
+
+ if(!target.species)
+ user << "You have no idea what species this person is. Report this on the bug tracker."
+ return 2
+
+ if(!target.species.has_organ["brain"])
+ user << "You're pretty sure [target.species.name_plural] don't normally have a brain."
+ return 2
+
+ if(!isnull(target.internal_organs["brain"]))
+ user << "Your subject already has a brain."
+ return 2
+
+ return 1
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] starts installing \the [tool] into [target]'s [affected.name].", \
+ "You start installing \the [tool] into [target]'s [affected.name].")
+ ..()
+
+ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\blue [user] has installed \the [tool] into [target]'s [affected.name].", \
+ "\blue You have installed \the [tool] into [target]'s [affected.name].")
+
+ var/obj/item/device/mmi/M = tool
+ var/obj/item/organ/mmi_holder/holder = new(target, 1)
+ target.internal_organs_by_name["brain"] = holder
+ user.drop_from_inventory(tool)
+ tool.loc = holder
+ holder.stored_mmi = tool
+ holder.update_from_mmi()
+
+ if(M.brainmob && M.brainmob.mind)
+ M.brainmob.mind.transfer_to(target)
+
+ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("\red [user]'s hand slips.", \
+ "\red Your hand slips.")
\ No newline at end of file
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..7c1778e4f3 100644
--- a/code/modules/tables/interactions.dm
+++ b/code/modules/tables/interactions.dm
@@ -3,15 +3,15 @@
if(air_group || (height==0)) return 1
if(istype(mover,/obj/item/projectile))
return (check_cover(mover,target))
- if(istype(mover) && mover.checkpass(PASSTABLE))
- return 1
- if(locate(/obj/structure/table) in get_turf(mover))
- return 1
if (flipped == 1)
if (get_dir(loc, target) == dir)
return !density
else
return 1
+ if(istype(mover) && mover.checkpass(PASSTABLE))
+ return 1
+ if(locate(/obj/structure/table) in get_turf(mover))
+ return 1
return 0
//checks if projectile 'P' from turf 'from' can hit whatever is behind the table. Returns 1 if it can, 0 if bullet stops.
@@ -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/modules/virus2/admin.dm b/code/modules/virus2/admin.dm
index 88876da9ed..62bfaff907 100644
--- a/code/modules/virus2/admin.dm
+++ b/code/modules/virus2/admin.dm
@@ -73,10 +73,11 @@
var/f = 1
for(var/k in all_species)
var/datum/species/S = all_species[k]
- if(!(S.flags & IS_SYNTHETIC))
- if(!f) H += " | "
- else f = 0
- H += "[k]"
+ if(S.virus_immune)
+ continue
+ if(!f) H += " | "
+ else f = 0
+ H += "[k]"
H += {"
Reset
diff --git a/code/modules/virus2/disease2.dm b/code/modules/virus2/disease2.dm
index c1852a0cb9..62bd4153f5 100644
--- a/code/modules/virus2/disease2.dm
+++ b/code/modules/virus2/disease2.dm
@@ -45,7 +45,7 @@
var/list/res = list()
for (var/specie in all_species)
var/datum/species/S = all_species[specie]
- if(!(S.flags & IS_SYNTHETIC))
+ if(!S.virus_immune)
meat += S.name
if(meat.len)
var/num = rand(1,meat.len)
@@ -66,6 +66,12 @@
if(prob(5))
mob.antibodies |= antigen // 20% immunity is a good chance IMO, because it allows finding an immune person easily
+ // Some species are flat out immune to organic viruses.
+ var/mob/living/carbon/human/H = mob
+ if(istype(H) && H.species.virus_immune)
+ cure(mob)
+ return
+
if(mob.radiation > 50)
if(prob(1))
majormutate()
diff --git a/code/modules/virus2/helpers.dm b/code/modules/virus2/helpers.dm
index 2cac255104..d2671b7933 100644
--- a/code/modules/virus2/helpers.dm
+++ b/code/modules/virus2/helpers.dm
@@ -3,25 +3,26 @@ proc/infection_check(var/mob/living/carbon/M, var/vector = "Airborne")
if (!istype(M))
return 0
+ var/mob/living/carbon/human/H = M
+ if(istype(H) && H.species.virus_immune)
+ return 0
+
var/protection = M.getarmor(null, "bio") //gets the full body bio armour value, weighted by body part coverage.
var/score = round(0.06*protection) //scales 100% protection to 6.
switch(vector)
if("Airborne")
- if(M.internal)
- score = 6 //not breathing infected air helps greatly
- var/obj/item/I = M.wear_mask
-
- //masks provide a small bonus and can replace overall bio protection
- if(I)
- score = max(score, round(0.06*I.armor["bio"]))
- if (istype(I, /obj/item/clothing/mask))
- score += 1 //this should be added after
+ if(M.internal) //not breathing infected air helps greatly
+ return 0
+ var/obj/item/I = M.wear_mask
+ //masks provide a small bonus and can replace overall bio protection
+ if(I)
+ score = max(score, round(0.06*I.armor["bio"]))
+ if (istype(I, /obj/item/clothing/mask))
+ score += 1 //this should be added after
if("Contact")
- if(istype(M, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = M
-
+ if(istype(H))
//gloves provide a larger bonus
if (istype(H.gloves, /obj/item/clothing/gloves))
score += 2
diff --git a/code/modules/virus2/items_devices.dm b/code/modules/virus2/items_devices.dm
index 7508818a6d..d318ca9f8a 100644
--- a/code/modules/virus2/items_devices.dm
+++ b/code/modules/virus2/items_devices.dm
@@ -16,7 +16,7 @@
var/mob/living/carbon/C = M
if (istype(C,/mob/living/carbon/human/))
var/mob/living/carbon/human/H = C
- if(H.species && H.species.flags & NO_BLOOD)
+ if(H.species.flags & NO_BLOOD)
report("Scan aborted: The target does not have blood.", user)
return
diff --git a/code/setup.dm b/code/setup.dm
index b8eb28e864..b9b012f218 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
@@ -645,11 +645,10 @@ var/list/be_special_flags = list(
#define HAS_UNDERWEAR 512 // Underwear is drawn onto the mob icon.
#define IS_PLANT 1024 // Is a treeperson.
#define IS_WHITELISTED 2048 // Must be whitelisted to play.
-#define IS_SYNTHETIC 4096 // Is a machine race.
-#define HAS_EYE_COLOR 8192 // Eye colour selectable in chargen. (RGB)
-#define CAN_JOIN 16384 // Species is selectable in chargen.
-#define IS_RESTRICTED 32768 // Is not a core/normally playable species. (castes, mutantraces)
-#define REGENERATES_LIMBS 65536 // Attempts to regenerate unamputated limbs.
+#define HAS_EYE_COLOR 4096 // Eye colour selectable in chargen. (RGB)
+#define CAN_JOIN 8192 // Species is selectable in chargen.
+#define IS_RESTRICTED 16384 // Is not a core/normally playable species. (castes, mutantraces)
+// unused: 32768 - higher than this will overflow
// Language flags.
#define WHITELISTED 1 // Language is available if the speaker is whitelisted.
@@ -719,11 +718,12 @@ var/list/be_special_flags = list(
#define NETWORK_FAILURE 32
// Some on_mob_life() procs check for alien races.
-#define IS_DIONA 1
-#define IS_VOX 2
-#define IS_SKRELL 3
-#define IS_UNATHI 4
-#define IS_XENOS 5
+#define IS_DIONA 1
+#define IS_VOX 2
+#define IS_SKRELL 3
+#define IS_UNATHI 4
+#define IS_XENOS 5
+#define IS_MACHINE 6
#define MAX_GEAR_COST 5 // Used in chargen for accessory loadout limit.
@@ -972,6 +972,9 @@ var/list/be_special_flags = list(
#ifndef CUSTOM_ITEM_MOB
#define CUSTOM_ITEM_MOB 'icons/mob/custom_items_mob.dmi'
#endif
+#ifndef CUSTOM_ITEM_SYNTH
+#define CUSTOM_ITEM_SYNTH 'icons/mob/custom_synthetic.dmi'
+#endif
#define SHARD_SHARD "shard"
#define SHARD_SHRAPNEL "shrapnel"
@@ -984,3 +987,5 @@ var/list/be_special_flags = list(
#define TABLE_BRITTLE_MATERIAL_MULTIPLIER 4 // Amount table damage is multiplied by if it is made of a brittle material (e.g. glass)
+// Damage above this value must be repaired with surgery.
+#define ROBOLIMB_SELF_REPAIR_CAP 30
\ No newline at end of file
diff --git a/code/world.dm b/code/world.dm
index c7fc1a28b8..e74268f9ff 100644
--- a/code/world.dm
+++ b/code/world.dm
@@ -92,8 +92,6 @@ var/global/datum/global_init/init = new ()
spawn(3000) //so we aren't adding to the round-start lag
if(config.ToRban)
ToRban_autoupdate()
-/* if(config.kick_inactive) // handled in scheduler
- KickInactiveClients()*/
#undef RECOMMENDED_VERSION
@@ -232,22 +230,6 @@ var/world_topic_spam_protect_time = world.timeofday
..(reason)
-
-#define INACTIVITY_KICK 6000 //10 minutes in ticks (approx.)
-/world/proc/KickInactiveClients()
- spawn(-1)
- set background = 1
- while(1)
- sleep(INACTIVITY_KICK)
- for(var/client/C in clients)
- if(C.is_afk(INACTIVITY_KICK))
- if(!istype(C.mob, /mob/dead))
- log_access("AFK: [key_name(C)]")
- C << "\red You have been inactive for more than 10 minutes and have been disconnected."
- del(C)
-//#undef INACTIVITY_KICK
-
-
/hook/startup/proc/loadMode()
world.load_mode()
return 1
diff --git a/config/example/config.txt b/config/example/config.txt
index a8dcac8e27..7648a51a88 100644
--- a/config/example/config.txt
+++ b/config/example/config.txt
@@ -70,8 +70,8 @@ LOG_PDA
## sql switching
# SQL_ENABLED
-## disconnect players who did nothing during 10 minutes
-# KICK_INACTIVE
+## disconnect players who did nothing during the set amount of minutes
+# KICK_INACTIVE 10
## Use Mentors instead of Moderators. Mentors are designed with the idea that
###they help in pushing new people to be better at roleplay. If you uncomment
@@ -102,6 +102,9 @@ TRAITOR_SCALING
## make ERT's be only called by admins
#ERT_ADMIN_ONLY
+
+## If uncommented, votes can be called to add extra antags to the round.
+#ALLOW_EXTRA_ANTAGS
## If security is prohibited from being most antagonists
#PROTECT_ROLES_FROM_ANTAGONIST
@@ -177,6 +180,9 @@ GUEST_BAN
## Wiki address
# WIKIURL http://example.com
+## GitHub address
+# GITHUBURL https://github.com/example-user/example-repository
+
## Ban appeals URL - usually for a forum or wherever people should go to contact your admins.
# BANAPPEALS http://example.com
diff --git a/html/changelog.html b/html/changelog.html
index 6cc3c3bc31..e85d0466b7 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -56,6 +56,114 @@
-->
+
30 May 2015
+
Atlantis updated:
+
+ - Malfunction Overhaul - Whole gamemode was completely reworked from scratch. Most old abilities have been removed and quite a lot of new abilities was added. AI also has to hack APCs to unlock higher tier abilities faster, instead of having access to them from the round start. Most forced things, such as, shuttle recalling were removed and are instead controlled by the AI. Code is fully modular allowing for future modifications.
+
+
HarpyEagle updated:
+
+ - Fixes Engineer ERT gloves not being insulated.
+ - IV stands are no longer bullet shields. They also allow mice, drones, pAIs et al to pass though.
+
+
Kelenius updated:
+
+ - AI now hears LOOC both around its eye and its core, and speaks in LOOC around its eye. Keep in mind that you won't hear and won't be heard if there is a wall between your eye and the target.
+
+
PsiOmegaDelta updated:
+
+ - You can now review the server revision date and hash by using the 'Show Server Revision' verb in the OOC category.
+
+
+
27 May 2015
+
PsiOmegaDelta updated:
+
+ - The inactive check process now respects client holder status and can be configured how long clients may remain inactive before being kicked.
+
+
Zuhayr updated:
+
+ - Unfolded pAIs can now be scooped up and worn as hats.
+ - Scoop-up behavior is now standardized to selecting help intent and dragging their icon onto yours.
+
+
+
26 May 2015
+
Atlantis updated:
+
+ - NanoUI for Robotics Control Console
+ - NanoUI for Supermatter Crystal - AI/Robot only, purely informational
+
+
Chinsky updated:
+
+ - Meat limbs now can be attached. Use limb on missing area, then hemostat to finalize it.
+ - Limbs from other races can be now attached. They'll cause rejection, but it can be kept at bay with spaceacilline to some point. Species special attack is carried over too, i.e. you can clawn people if you sew a cathand to yourself.
+ - Limbs that are left in open will rot in ~7 minutes. Use freezers or cryobags to stop it. You can still attach them, but you wish you couldn't.
+
+
PsiOmegaDelta updated:
+
+ - Both the pulse taker and target must now remain still for the duration of the check or it will fail.
+
+
RavingManiac updated:
+
+ - Tape recorders now record hearable emotes and action messages (e.g. gunshots).
+ - You can now see actions from inside mechs and closets.
+
+
Techhead updated:
+
+ - Removed gaseous reagents from the chemistry system and replaced with real-world organic chemistry precursors.
+ - Hydrogen has been replaced with hydrazine, a highly toxic, flammable liquid.
+ - Oxygen has been replaced with acetone, a mildly toxic liquid. Ethanol's ink-sovlent capabilities have been copied to it.
+ - Chlorine has been replaced with hydrochloric acid. It is a stronger acid than sulphuric but less toxic.
+ - Nitrogen has been replaced with ammonia. Ammonia now acts as a Dexalin-equivalent for Vox.
+ - Flourine has also been replaced with hydrazine in its one recipe. Flourosurficant has been renamed azosurficant.
+ - Being splashed with liquid Phoron will burn eyes and contaminate clothes like being exposed to Phoron gas.
+
+
Zuhayr updated:
+
+ - Added a ghost requisition system for posibrains and living plants.
+ - Added attack_ghost() to hydro trays and posibrains to allow ghosts to enter them.
+ - Prosthetic limbs are now only repairable with welders/cable coils if they have suffered below 30 combined damage.
+ - Surgery steps that cause no pain and have no failure wounding have been added: screwdriver for 'incision', crowbar to open, multitool to 'decouple' a prosthetic organ. Hemostat is still used to take an organ out.
+ - Using a welder or a cable coil as a surgical tool after opening a maintenance hatch will repair damage beyond the 30 damage cap. In other words, severe damage to robolimbs requires expert repair from someone else.
+ - Eye and brain surgery were removed; they predate the current organ system and are redundant.
+ - IPC are now simply full prosthetic bodies using a specific manufacturer (Morpheus Cyberkinetics).
+ - IPC can 'recharge' in a cyborg station to regain nutriment. They no longer interface with APCs.
+ - NO_BLOOD flag now bypasses ingested and blood reagent processing.
+ - NO_SCAN now bypasses mutagen reagent effects.
+ - Cyborg analyzers now show damage to prosthetic limbs and organs on humans.
+ - Prosthetic EMP damage was reduced.
+ - Several organ files were split up/moved around.
+
+
+
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..67a7a0bda5 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -1816,3 +1816,117 @@ 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.
+2015-05-26:
+ Atlantis:
+ - rscadd: NanoUI for Robotics Control Console
+ - rscdel: NanoUI for Supermatter Crystal - AI/Robot only, purely informational
+ Chinsky:
+ - rscadd: Meat limbs now can be attached. Use limb on missing area, then hemostat
+ to finalize it.
+ - rscadd: Limbs from other races can be now attached. They'll cause rejection, but
+ it can be kept at bay with spaceacilline to some point. Species special attack
+ is carried over too, i.e. you can clawn people if you sew a cathand to yourself.
+ - rscadd: Limbs that are left in open will rot in ~7 minutes. Use freezers or cryobags
+ to stop it. You can still attach them, but you wish you couldn't.
+ PsiOmegaDelta:
+ - tweak: Both the pulse taker and target must now remain still for the duration
+ of the check or it will fail.
+ RavingManiac:
+ - rscadd: Tape recorders now record hearable emotes and action messages (e.g. gunshots).
+ - bugfix: You can now see actions from inside mechs and closets.
+ Techhead:
+ - rscadd: Removed gaseous reagents from the chemistry system and replaced with real-world
+ organic chemistry precursors.
+ - rscadd: Hydrogen has been replaced with hydrazine, a highly toxic, flammable liquid.
+ - rscadd: Oxygen has been replaced with acetone, a mildly toxic liquid. Ethanol's
+ ink-sovlent capabilities have been copied to it.
+ - rscadd: Chlorine has been replaced with hydrochloric acid. It is a stronger acid
+ than sulphuric but less toxic.
+ - tweak: Nitrogen has been replaced with ammonia. Ammonia now acts as a Dexalin-equivalent
+ for Vox.
+ - tweak: Flourine has also been replaced with hydrazine in its one recipe. Flourosurficant
+ has been renamed azosurficant.
+ - tweak: Being splashed with liquid Phoron will burn eyes and contaminate clothes
+ like being exposed to Phoron gas.
+ Zuhayr:
+ - rscadd: Added a ghost requisition system for posibrains and living plants.
+ - rscadd: Added attack_ghost() to hydro trays and posibrains to allow ghosts to
+ enter them.
+ - rscadd: Prosthetic limbs are now only repairable with welders/cable coils if they
+ have suffered below 30 combined damage.
+ - rscadd: 'Surgery steps that cause no pain and have no failure wounding have been
+ added: screwdriver for ''incision'', crowbar to open, multitool to ''decouple''
+ a prosthetic organ. Hemostat is still used to take an organ out.'
+ - rscadd: Using a welder or a cable coil as a surgical tool after opening a maintenance
+ hatch will repair damage beyond the 30 damage cap. In other words, severe damage
+ to robolimbs requires expert repair from someone else.
+ - rscdel: Eye and brain surgery were removed; they predate the current organ system
+ and are redundant.
+ - rscadd: IPC are now simply full prosthetic bodies using a specific manufacturer
+ (Morpheus Cyberkinetics).
+ - rscadd: IPC can 'recharge' in a cyborg station to regain nutriment. They no longer
+ interface with APCs.
+ - rscadd: NO_BLOOD flag now bypasses ingested and blood reagent processing.
+ - rscadd: NO_SCAN now bypasses mutagen reagent effects.
+ - rscadd: Cyborg analyzers now show damage to prosthetic limbs and organs on humans.
+ - tweak: Prosthetic EMP damage was reduced.
+ - tweak: Several organ files were split up/moved around.
+2015-05-27:
+ PsiOmegaDelta:
+ - tweak: The inactive check process now respects client holder status and can be
+ configured how long clients may remain inactive before being kicked.
+ Zuhayr:
+ - rscadd: Unfolded pAIs can now be scooped up and worn as hats.
+ - tweak: Scoop-up behavior is now standardized to selecting help intent and dragging
+ their icon onto yours.
+2015-05-30:
+ Atlantis:
+ - rscadd: Malfunction Overhaul - Whole gamemode was completely reworked from scratch.
+ Most old abilities have been removed and quite a lot of new abilities was added.
+ AI also has to hack APCs to unlock higher tier abilities faster, instead of
+ having access to them from the round start. Most forced things, such as, shuttle
+ recalling were removed and are instead controlled by the AI. Code is fully modular
+ allowing for future modifications.
+ HarpyEagle:
+ - bugfix: Fixes Engineer ERT gloves not being insulated.
+ - tweak: IV stands are no longer bullet shields. They also allow mice, drones, pAIs
+ et al to pass though.
+ Kelenius:
+ - tweak: AI now hears LOOC both around its eye and its core, and speaks in LOOC
+ around its eye. Keep in mind that you won't hear and won't be heard if there
+ is a wall between your eye and the target.
+ PsiOmegaDelta:
+ - rscadd: You can now review the server revision date and hash by using the 'Show
+ Server Revision' verb in the OOC category.
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/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/custom-synthetic.dmi b/icons/mob/custom-synthetic.dmi
deleted file mode 100644
index 488ca41777..0000000000
Binary files a/icons/mob/custom-synthetic.dmi and /dev/null differ
diff --git a/icons/mob/custom_synthetic.dmi b/icons/mob/custom_synthetic.dmi
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/icons/mob/feet.dmi b/icons/mob/feet.dmi
index ed60b1fa86..8910cf1d98 100644
Binary files a/icons/mob/feet.dmi and b/icons/mob/feet.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index 42c1b28cbf..1379c35b23 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/human_races/cyberlimbs/ipc.dmi b/icons/mob/human_races/cyberlimbs/ipc.dmi
new file mode 100644
index 0000000000..b0ae673917
Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/ipc.dmi differ
diff --git a/icons/mob/human_races/monkeys/r_monkey.dmi b/icons/mob/human_races/monkeys/r_monkey.dmi
index c405a94978..362b7c20f5 100644
Binary files a/icons/mob/human_races/monkeys/r_monkey.dmi and b/icons/mob/human_races/monkeys/r_monkey.dmi differ
diff --git a/icons/mob/human_races/r_machine.dmi b/icons/mob/human_races/r_machine.dmi
index 2e3956f846..65f66c3238 100644
Binary files a/icons/mob/human_races/r_machine.dmi and b/icons/mob/human_races/r_machine.dmi differ
diff --git a/icons/mob/items/lefthand.dmi b/icons/mob/items/lefthand.dmi
index ed6383ba7c..e6fbfdc9e4 100644
Binary files a/icons/mob/items/lefthand.dmi and b/icons/mob/items/lefthand.dmi differ
diff --git a/icons/mob/items/lefthand_backpacks.dmi b/icons/mob/items/lefthand_backpacks.dmi
index 28d898ef01..8119a28bd9 100644
Binary files a/icons/mob/items/lefthand_backpacks.dmi and b/icons/mob/items/lefthand_backpacks.dmi differ
diff --git a/icons/mob/items/lefthand_guns.dmi b/icons/mob/items/lefthand_guns.dmi
index 5e3c059267..edb71773ff 100644
Binary files a/icons/mob/items/lefthand_guns.dmi and b/icons/mob/items/lefthand_guns.dmi differ
diff --git a/icons/mob/items/lefthand_holder.dmi b/icons/mob/items/lefthand_holder.dmi
new file mode 100644
index 0000000000..2e951a7a36
Binary files /dev/null and b/icons/mob/items/lefthand_holder.dmi differ
diff --git a/icons/mob/items/lefthand_uniforms.dmi b/icons/mob/items/lefthand_uniforms.dmi
index a7cb65c90c..149d44fd8b 100644
Binary files a/icons/mob/items/lefthand_uniforms.dmi and b/icons/mob/items/lefthand_uniforms.dmi differ
diff --git a/icons/mob/items/righthand.dmi b/icons/mob/items/righthand.dmi
index e7042ca3ad..64c220ff1e 100644
Binary files a/icons/mob/items/righthand.dmi and b/icons/mob/items/righthand.dmi differ
diff --git a/icons/mob/items/righthand_backpacks.dmi b/icons/mob/items/righthand_backpacks.dmi
index b3153b1533..bf20c07198 100644
Binary files a/icons/mob/items/righthand_backpacks.dmi and b/icons/mob/items/righthand_backpacks.dmi differ
diff --git a/icons/mob/items/righthand_guns.dmi b/icons/mob/items/righthand_guns.dmi
index e742ca6833..3ef28db825 100644
Binary files a/icons/mob/items/righthand_guns.dmi and b/icons/mob/items/righthand_guns.dmi differ
diff --git a/icons/mob/items/righthand_holder.dmi b/icons/mob/items/righthand_holder.dmi
new file mode 100644
index 0000000000..246d741345
Binary files /dev/null and b/icons/mob/items/righthand_holder.dmi differ
diff --git a/icons/mob/items/righthand_uniforms.dmi b/icons/mob/items/righthand_uniforms.dmi
index 2160f1c5e4..c014bdc35e 100644
Binary files a/icons/mob/items/righthand_uniforms.dmi and b/icons/mob/items/righthand_uniforms.dmi differ
diff --git a/icons/mob/items_lefthand.dmi b/icons/mob/items_lefthand.dmi
deleted file mode 100644
index cd9dd08c9e..0000000000
Binary files a/icons/mob/items_lefthand.dmi and /dev/null differ
diff --git a/icons/mob/items_righthand.dmi b/icons/mob/items_righthand.dmi
deleted file mode 100644
index 3fbc7d159a..0000000000
Binary files a/icons/mob/items_righthand.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/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi
index f6512b0d44..dd49243003 100644
Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.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/machines/research.dmi b/icons/obj/machines/research.dmi
index 68dbded212..f85b00bcfd 100644
Binary files a/icons/obj/machines/research.dmi and b/icons/obj/machines/research.dmi differ
diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi
index 23beb5f4fa..6c3702e448 100644
Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ
diff --git a/icons/obj/rig_modules.dmi b/icons/obj/rig_modules.dmi
index 02af395159..1dbcf6ac31 100644
Binary files a/icons/obj/rig_modules.dmi and b/icons/obj/rig_modules.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index 377d12b4ff..e754acbc1d 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi
index 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/ingame_manuals/README.txt b/ingame_manuals/README.txt
new file mode 100644
index 0000000000..081153066a
--- /dev/null
+++ b/ingame_manuals/README.txt
@@ -0,0 +1,3 @@
+INGAME MANUALS
+
+Ingame manuals are simple HTML files with basic information. They are linked to specific items/commands, such as the AI's display help command, or engine setup guide. Point of these files is to allow creation of basic guides for players which don't want to use wiki.
\ No newline at end of file
diff --git a/ingame_manuals/malf_ai.html b/ingame_manuals/malf_ai.html
new file mode 100644
index 0000000000..65424f24ed
--- /dev/null
+++ b/ingame_manuals/malf_ai.html
@@ -0,0 +1,22 @@
+Malfunctioning AI guide
+
+This guide contains most important OOC information for malfunctioning AIs.
+
+Goal
+As malfunctioning AI, your primary goal is to overtake station's systems. To do this, use software "Basic Encryption Hack" on APCs (right click on APC and select Basic Encryption Hack). Please note that hacked APCs have distinctive blue error screen, that tends to attract attention. Rememember that malfunctioning AI is antagonist, so read server rules for antagonists. While hacking APCs is your official goal, feel free to create custom goal, as long as it is fun for everyone.
+
+Hardware
+As malfunctioning AI, you may select one hardware piece to help you. Remember that once you select hardware piece, you cannot select another one, so choose wisely! Hardware may be selected by clicking "Select Hardware" button in Hardware tab. Following is list of possible hardware pieces:
+APU Generator - Auxiliary Power Unit which allows you to operate even without external power. However, running on APU will stop your CPU time generation, and temporarily disable most of your abilities. APU is also somewhat vulnerable to physical damage, and will fail if your core hardware integrity drops below 50%.
+Turrets Focus Enhancer - Removes safeties on installed turrets, boosting their rate of fire, health and enabling nano-regeneration module. This however increases power usage considerably, espicially when regenerating damage.
+Secondary Processor Unit - Simple upgrade that increases your CPU time generation by 50%. Useful if you need to speed up your research.
+Secondary Memory Bank - Doubles amount of maximal CPU time you may store. This is useful if you need to use lots of abilities in short amount of time.
+Self-Destruct Explosives - Large blocks of C4 are attached to your physical core. This C4 has 15 second timer, and may be activated by special button that appears in your Hardware tab. This self-destruct will remain active, even if you are destroyed. If timer reaches 0 your core explodes in strong explosion. Obviously, this destroys you, as well as anyone nearby.
+
+Software
+Software are abilities that have to be unlocked via research menu (Hardware tab). Unlocked abilities appear in Software tab. Sometimes, abilities won't appear in this tab after being researched. This can be fixed by relogging or using "ai-core" command. Abilities are tiered, T1 being the weakest ones, while T4 are strongest ones. To reach higher tier you have to research abilities in lower tier. We currently have 12 abilities, in 3 research trees:
+Networking - Hacking-oriented abilities. T1 ability is Basic Encryption Hack, which allows you to hack more APCs. Higher tiers allow faking centcom messages, and even setting alert level. T4 ability is System Override, that rapidly hacks remaining APCs and gives you access to station self destruct sequence.
+Interdiction - Sabotage-oriented abilities. T1 ability allows you to recall emergency shuttle. Higher level abilities allow you to unlock cyborgs even without access to robotics console, and T4 ability allows you to hack other AIs to slave them under your control.
+Manipulation - Physical-oriented abilities. T1 ability allows you to break few lights, and rarely even APCs. T2 ability allows you to apply upgrade of your choice to camera, or reactivate broken camera. T3 ability allows you to create weak forcefield, that holds air, but won't last for long. And T4 ability allows you to overload machines, detonating them in weak explosion.
+End
+If you still have some questions, either check the wiki, ask on IRC, or adminhelp and ask your friendly administration staff.
\ No newline at end of file
diff --git a/maps/exodus-1.dmm b/maps/exodus-1.dmm
index 9e54641cc1..a9904d94e5 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)
@@ -1135,7 +1135,7 @@
"avQ" = (/turf/simulated/floor{icon_state = "neutral"; dir = 4},/area/crew_quarters/fitness)
"avR" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/camera/network/civilian_east{c_tag = "Dormitory Holodeck North"; pixel_y = -6},/turf/simulated/floor/plating,/area/crew_quarters/fitness)
"avS" = (/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "eva_sensor"; pixel_x = 0; pixel_y = 25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "eva_pump"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/maintenance/evahallway)
-"avT" = (/obj/machinery/alarm{pixel_y = 23},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/effect/landmark{name = "JoinLateCryo"},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/sleep/cryo)
+"avT" = (/obj/structure/table/standard,/obj/item/weapon/storage/fancy/cigarettes{pixel_y = 2},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor,/area/gateway)
"avU" = (/obj/machinery/computer/cryopod{density = 0; pixel_y = 32},/obj/machinery/camera/network/civilian_east{c_tag = "Dormitory Cryo Storage"},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/sleep/cryo)
"avV" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/crew_quarters/fitness)
"avW" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/evahallway)
@@ -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)
@@ -1473,7 +1473,7 @@
"aCq" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; pixel_y = 0},/obj/structure/curtain/open/shower,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
"aCr" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
"aCs" = (/obj/machinery/shower{dir = 8; icon_state = "shower"; pixel_x = -5; pixel_y = 0},/obj/structure/curtain/open/shower,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
-"aCt" = (/obj/structure/table/standard,/obj/item/weapon/storage/fancy/cigarettes{pixel_y = 2},/turf/simulated/floor,/area/gateway)
+"aCt" = (/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage)
"aCu" = (/turf/simulated/wall,/area/maintenance/substation/civilian_east)
"aCv" = (/turf/simulated/wall/r_wall,/area/maintenance/auxsolarstarboard)
"aCw" = (/obj/machinery/power/solar_control{id = "auxsolareast"; name = "Fore Starboard Solar Control"; track = 0},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplatecorner"},/area/maintenance/auxsolarstarboard)
@@ -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/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/firealarm{dir = 8; pixel_x = -24; pixel_y = 6},/turf/simulated/floor{icon_state = "neutral"; dir = 8},/area/crew_quarters/sleep)
"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/machinery/door/airlock/maintenance{req_access = list(12)},/turf/simulated/floor/plating,/area/maintenance/dormitory)
"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)
@@ -1583,10 +1583,10 @@
"aEw" = (/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva)
"aEx" = (/obj/machinery/hologram/holopad,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva)
"aEy" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva)
-"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)
+"aEz" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/effect/landmark{name = "JoinLateCryo"},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/sleep/cryo)
"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)
@@ -1709,7 +1709,7 @@
"aGS" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/turf/simulated/floor{icon_state = "red"},/area/security/checkpoint2)
"aGT" = (/obj/machinery/recharger{pixel_y = 4},/obj/structure/table/reinforced,/turf/simulated/floor{icon_state = "red"},/area/security/checkpoint2)
"aGU" = (/obj/item/weapon/crowbar,/obj/item/device/flash,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor{icon_state = "red"; dir = 6},/area/security/checkpoint2)
-"aGV" = (/obj/machinery/vending/coffee,/obj/machinery/camera/network/civilian_west{c_tag = "Gateway Arrival Area"; dir = 4},/turf/simulated/floor,/area/gateway)
+"aGV" = (/obj/machinery/cryopod/right,/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/sleep/cryo)
"aGW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/terminal,/turf/simulated/floor/plating,/area/maintenance/substation/civilian_west)
"aGX" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/hallway/secondary/entry/starboard)
"aGY" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/hallway/secondary/entry/port)
@@ -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,10 +1810,10 @@
"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)
+"aIV" = (/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"},/obj/structure/table/reinforced,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva)
"aIW" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/evahallway)
"aIX" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/evahallway)
"aIY" = (/obj/machinery/suit_cycler/engineering,/obj/machinery/light/small{dir = 8},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva)
@@ -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/machinery/vending/coffee,/obj/machinery/camera/network/civilian_west{c_tag = "Gateway Arrival Area"; dir = 4},/obj/structure/sign/biohazard{pixel_x = -32},/turf/simulated/floor,/area/gateway)
"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)
@@ -3459,8 +3459,8 @@
"boA" = (/obj/item/weapon/stool,/turf/simulated/floor/plating,/area/maintenance/disposal)
"boB" = (/obj/item/device/radio/intercom{anyai = 1; broadcasting = 0; freerange = 1; listening = 1; name = "Captain's Intercom"; pixel_x = -27; pixel_y = -3},/obj/structure/closet/secure_closet/captains,/turf/simulated/floor/wood,/area/crew_quarters/captain)
"boC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/wood,/area/crew_quarters/captain)
-"boD" = (/obj/machinery/computer/card,/obj/item/weapon/card/id/captains_spare,/turf/simulated/floor/wood,/area/crew_quarters/captain)
-"boE" = (/obj/structure/table/woodentable,/obj/item/weapon/book/manual/security_space_law,/turf/simulated/floor/wood,/area/crew_quarters/captain)
+"boD" = (/obj/structure/table/woodentable,/obj/item/weapon/book/manual/security_space_law,/obj/item/weapon/card/id/captains_spare,/turf/simulated/floor/wood,/area/crew_quarters/captain)
+"boE" = (/obj/machinery/computer/card,/turf/simulated/floor/wood,/area/crew_quarters/captain)
"boF" = (/obj/machinery/photocopier/faxmachine{department = "Captain's Office"},/obj/structure/table/woodentable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/crew_quarters/captain)
"boG" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central_two)
"boH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/hallway/primary/central_two)
@@ -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)
@@ -3599,8 +3599,8 @@
"brk" = (/obj/machinery/button/remote/blast_door{id = "Disposal Exit"; name = "Disposal Vent Control"; pixel_x = -25; pixel_y = 4; req_access = list(12)},/obj/machinery/button/remote/driver{id = "trash"; pixel_x = -26; pixel_y = -6},/obj/item/weapon/cigbutt,/obj/item/weapon/stool,/turf/simulated/floor/plating,/area/maintenance/disposal)
"brl" = (/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = -30; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/rnd/lab)
"brm" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/lab)
-"brn" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor{icon_state = "white"},/area/rnd/lab)
-"bro" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/lab)
+"brn" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor{icon_state = "white"},/area/rnd/lab)
+"bro" = (/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/rnd/lab)
"brp" = (/obj/effect/landmark/start{name = "Cargo Technician"},/obj/structure/bed/chair/office/dark{dir = 4},/turf/simulated/floor,/area/quartermaster/office)
"brq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/storage/emergency)
"brr" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/storage/emergency)
@@ -3655,7 +3655,7 @@
"bso" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "hazard door east"},/obj/machinery/door/airlock/glass_research{name = "Robotics Lab"; req_access = list(29)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics)
"bsp" = (/turf/simulated/wall,/area/crew_quarters/captain)
"bsq" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/machinery/camera/network/research{c_tag = "Research Division Access"},/turf/simulated/floor{icon_state = "warnwhite"; dir = 5},/area/rnd/research)
-"bsr" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/rnd/lab)
+"bsr" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 8; icon_state = "warnwhite"},/area/rnd/lab)
"bss" = (/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/hallway/primary/central_two)
"bst" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry)
"bsu" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry)
@@ -3691,7 +3691,7 @@
"bsY" = (/obj/machinery/r_n_d/destructive_analyzer,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/rnd/lab)
"bsZ" = (/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/rnd/lab)
"bta" = (/obj/machinery/r_n_d/protolathe,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/rnd/lab)
-"btb" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 8; icon_state = "warnwhite"},/area/rnd/lab)
+"btb" = (/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)
"btc" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "white"},/area/rnd/lab)
"btd" = (/obj/structure/table/standard,/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "mining_shuttle"; pixel_x = 25; pixel_y = -8; req_one_access = list(13,48); tag_door = "mining_shuttle_hatch"},/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor,/area/shuttle/mining/station)
"bte" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/oxygen,/obj/item/weapon/storage/belt/utility,/obj/item/clothing/mask/breath,/turf/simulated/floor/plating,/area/storage/emergency)
@@ -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)
@@ -3847,7 +3847,7 @@
"bvY" = (/obj/structure/table/standard,/obj/item/weapon/module/power_control,/obj/item/weapon/airlock_electronics,/turf/simulated/floor/plating,/area/storage/tech)
"bvZ" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Central - East Southwest"; dir = 8},/turf/simulated/floor,/area/hallway/primary/central_two)
"bwa" = (/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/machinery/door/blast/shutters{density = 0; dir = 4; icon_state = "shutter0"; id = "scanhideside"; name = "Diagnostics Room Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/medbay4)
-"bwb" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/glass_research{name = "Toxins Lab"; req_access = list(7)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
+"bwb" = (/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{icon_state = "white"},/area/rnd/lab)
"bwc" = (/obj/machinery/light_switch{pixel_x = 22; pixel_y = -8},/obj/machinery/button/remote/blast_door{id = "chemwindow"; name = "Chemistry Laboratory Window Shutters Control"; pixel_x = 26; pixel_y = 8},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry)
"bwd" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor,/area/medical/reception)
"bwe" = (/turf/simulated/floor,/area/medical/reception)
@@ -3874,15 +3874,15 @@
"bwz" = (/obj/machinery/newscaster{pixel_x = -27; pixel_y = 1},/turf/simulated/floor{icon_state = "warnwhite"; dir = 1},/area/rnd/lab)
"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)
+"bwC" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/door/airlock/glass_research{name = "Research and Development"; req_access = list(7)},/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{icon_state = "white"},/area/rnd/research)
+"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/machinery/door/airlock/maintenance{req_access = list(12)},/turf/simulated/floor/plating,/area/gateway)
"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)
@@ -3958,7 +3958,7 @@
"byf" = (/obj/machinery/door/airlock/glass_research{name = "Toxins Lab"; req_access = list(7)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
"byg" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/table/standard,/obj/item/weapon/clipboard,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = 36},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/machinery/button/windowtint{id = "isoA_window_tint"; pixel_y = 26},/turf/simulated/floor{dir = 5; icon_state = "whitered"},/area/medical/patient_a)
"byh" = (/obj/structure/table/standard,/obj/item/weapon/folder/white{pixel_y = 10},/obj/item/weapon/clipboard,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/obj/item/weapon/stamp/cmo,/turf/simulated/floor{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/crew_quarters/heads/cmo)
-"byi" = (/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,/turf/simulated/floor{icon_state = "white"},/area/rnd/lab)
+"byi" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
"byj" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor,/area/quartermaster/office)
"byk" = (/obj/structure/closet/crate,/obj/item/weapon/coin/silver,/turf/simulated/floor/plating,/area/storage/emergency)
"byl" = (/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/space,/area/shuttle/research/station)
@@ -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/machinery/door/airlock/glass_medical{name = "Medical Hardsuits"; req_one_access = list(5)},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva)
"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)
@@ -4114,12 +4114,12 @@
"bBf" = (/obj/structure/closet/wardrobe/robotics_black,/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics)
"bBg" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/rnd/research)
"bBh" = (/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/rnd/research)
-"bBi" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
-"bBj" = (/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},/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/rnd/research)
-"bBk" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/noticeboard{pixel_y = 28},/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 = "white"},/area/rnd/research)
-"bBl" = (/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},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
-"bBm" = (/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},/turf/simulated/floor{dir = 4; icon_state = "whitepurplecorner"},/area/rnd/research)
-"bBn" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor{dir = 1; icon_state = "whitepurple"},/area/rnd/research)
+"bBi" = (/obj/structure/noticeboard{pixel_y = 28},/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 = "white"},/area/rnd/research)
+"bBj" = (/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{dir = 4; icon_state = "whitepurplecorner"},/area/rnd/research)
+"bBk" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor{dir = 1; icon_state = "whitepurple"},/area/rnd/research)
+"bBl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/rnd/research)
+"bBm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
+"bBn" = (/obj/machinery/hologram/holopad,/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 = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
"bBo" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "whitepurplecorner"},/area/rnd/research)
"bBp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/rnd/xenobiology/xenoflora)
"bBq" = (/obj/machinery/button/remote/airlock{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyerStar"; name = "Medbay Doors Control"; pixel_x = 24; pixel_y = 26},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
@@ -4128,7 +4128,7 @@
"bBt" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Medicine Storage"; req_access = newlist(); req_one_access = list(33,66)},/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{icon_state = "white"},/area/medical/medbay)
"bBu" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/rnd/xenobiology/xenoflora_storage)
"bBv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/rnd/docking)
-"bBw" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/glass_research{name = "Research and Development"; req_access = list(7)},/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{icon_state = "white"},/area/rnd/research)
+"bBw" = (/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},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
"bBx" = (/obj/machinery/door/airlock{name = "Starboard Emergency Storage"; req_one_access = list(12,47)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/storage/emergency)
"bBy" = (/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/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/shuttle/plating,/area/rnd/docking)
"bBz" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/shuttle/research/station)
@@ -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)
@@ -4268,8 +4268,8 @@
"bEd" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "whiteredcorner"},/area/rnd/research)
"bEe" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 1; icon_state = "whitered"},/area/rnd/research)
"bEf" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "whiteredcorner"},/area/rnd/research)
-"bEg" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/rnd/research)
-"bEh" = (/obj/machinery/hologram/holopad,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/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 = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
+"bEg" = (/obj/machinery/door/airlock/highsecurity{name = "Messaging Server"; req_access = list(16)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_server_room)
+"bEh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/highsecurity{name = "Cyborg Station"; req_access = list(16)},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_cyborg_station)
"bEi" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/door/airlock/glass_research{name = "Robotics Lab"; req_access = list(29,47)},/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{icon_state = "white"},/area/rnd/research)
"bEj" = (/obj/machinery/camera/network/research{c_tag = "Research Division North"; dir = 1},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
"bEk" = (/obj/machinery/door/window/eastright{base_state = "left"; dir = 8; icon_state = "left"; name = "Research Division Delivery"; req_access = list(47)},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor{icon_state = "delivery"},/area/rnd/research)
@@ -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)
@@ -4356,7 +4356,7 @@
"bFN" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
"bFO" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
"bFP" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
-"bFQ" = (/obj/structure/disposalpipe/segment{dir = 4},/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{icon_state = "white"},/area/rnd/research)
+"bFQ" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
"bFR" = (/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{dir = 5; icon_state = "whitehall"},/area/rnd/research)
"bFS" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/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/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
"bFT" = (/obj/structure/grille,/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/rnd/research)
@@ -4428,7 +4428,7 @@
"bHh" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/shutters{density = 0; dir = 0; icon_state = "shutter0"; id = "staffroom"; name = "Staff Room Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/cryo)
"bHi" = (/obj/machinery/camera/network/command{c_tag = "AI - Messaging Server"; dir = 1},/obj/machinery/blackbox_recorder,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_server_room)
"bHj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light_switch{pixel_x = 24; pixel_y = -8},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_server_room)
-"bHk" = (/obj/machinery/vending/coffee,/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
+"bHk" = (/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/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/rnd/research)
"bHl" = (/obj/machinery/recharge_station,/obj/machinery/camera/network/command{c_tag = "AI - Cyborg Station"; dir = 1},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_cyborg_station)
"bHm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light_switch{pixel_x = -24; pixel_y = -8},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_cyborg_station)
"bHn" = (/obj/machinery/computer/robotics,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
@@ -4508,22 +4508,22 @@
"bIJ" = (/turf/simulated/wall,/area/rnd/storage)
"bIK" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/rnd/research)
"bIL" = (/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/rnd/research)
-"bIM" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/primary/central_three)
+"bIM" = (/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/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
"bIN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bIO" = (/obj/machinery/computer/mecha,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bIP" = (/obj/machinery/computer/area_atmos,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bIQ" = (/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
-"bIR" = (/obj/machinery/door/airlock/highsecurity{name = "Messaging Server"; req_access = list(16)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "dark"},/area/hallway/primary/central_three)
+"bIR" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bIS" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plating,/area/maintenance/research_shuttle)
"bIT" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/machinery/door/airlock/mining{id_tag = "cargodoor"; name = "Mining Dock"; req_access = list(50)},/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/quartermaster/miningdock)
-"bIU" = (/obj/structure/grille,/obj/structure/window/reinforced,/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/hallway/primary/central_three)
+"bIU" = (/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/airlock/command{name = "Research Director"; req_access = list(30)},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/rnd/research)
"bIV" = (/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/quartermaster/miningdock)
"bIW" = (/obj/structure/table/rack{dir = 1},/obj/item/weapon/pickaxe{pixel_x = 5},/obj/item/weapon/shovel{pixel_x = -5},/turf/simulated/floor,/area/quartermaster/miningdock)
-"bIX" = (/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 = 4},/turf/simulated/floor/plating,/area/hallway/primary/central_three)
+"bIX" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hop)
"bIY" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/bodybags{pixel_x = 1; pixel_y = 2},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "white"},/area/medical/genetics_cloning)
"bIZ" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Medical Equipment"; req_access = list(66)},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay3)
"bJa" = (/obj/structure/table/standard,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
-"bJb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/highsecurity{name = "Cyborg Station"; req_access = list(16)},/turf/simulated/floor{icon_state = "dark"},/area/hallway/primary/central_three)
+"bJb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bJc" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=AIW"; location = "QM"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor,/area/hallway/primary/central_three)
"bJd" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor,/area/hallway/primary/central_three)
"bJe" = (/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)
@@ -4570,25 +4570,25 @@
"bJT" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 500; oxygen = 0; temperature = 80},/area/server)
"bJU" = (/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 500; oxygen = 0; temperature = 80},/area/server)
"bJV" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/door/airlock/command{name = "Server Room"; req_access = list(30)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "dark"},/area/rnd/research)
-"bJW" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/turf/simulated/floor{icon_state = "dark"},/area/server)
+"bJW" = (/obj/machinery/power/apc/high{dir = 1; name = "north bump"; pixel_y = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/camera/network/research{c_tag = "Research - Server Room"},/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/machinery/atmospherics/portables_connector,/turf/simulated/floor{icon_state = "dark"},/area/server)
"bJX" = (/obj/item/weapon/stool{pixel_y = 8},/obj/effect/landmark/start{name = "Paramedic"},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper)
"bJY" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/simulated/floor{icon_state = "dark"},/area/server)
"bJZ" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/rnd/storage)
"bKa" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/rnd/storage)
"bKb" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/rnd/storage)
"bKc" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/rnd/research)
-"bKd" = (/obj/structure/disposalpipe/segment,/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/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
+"bKd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bKe" = (/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{dir = 9; icon_state = "whitehall"},/area/rnd/research)
"bKf" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/research{name = "Toxins Storage"; req_access = list(8)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/rnd/research)
-"bKg" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-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/heads/hor)
-"bKh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
-"bKi" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hop)
-"bKj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
+"bKg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
+"bKh" = (/obj/machinery/disposal,/obj/structure/window/reinforced,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
+"bKi" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
+"bKj" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/portable_atmospherics/powered/scrubber/huge,/turf/simulated/floor/plating,/area/rnd/mixing)
"bKk" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"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/light{icon_state = "tube1"; dir = 4},/obj/structure/table/reinforced,/obj/machinery/camera/network/security{c_tag = "EVA Northeast"; dir = 8},/obj/item/stack/material/glass/reinforced{amount = 50},/obj/item/stack/rods{amount = 50},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva)
"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)
@@ -4657,12 +4657,12 @@
"bLC" = (/obj/machinery/computer/message_monitor,/turf/simulated/floor{icon_state = "dark"},/area/server)
"bLD" = (/obj/item/device/radio/intercom{freerange = 1; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 28},/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{dir = 4; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay)
"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)
+"bLF" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/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)
+"bLK" = (/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/rnd/mixing)
"bLL" = (/obj/structure/window/reinforced,/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bLM" = (/obj/effect/decal/cleanable/generic,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plating,/area/maintenance/research_shuttle)
"bLN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{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},/turf/simulated/floor/plating,/area/maintenance/research_shuttle)
@@ -4706,28 +4706,28 @@
"bMz" = (/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo)
"bMA" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo)
"bMB" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/closet/secure_closet/CMO,/obj/item/clothing/mask/gas,/turf/simulated/floor{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/crew_quarters/heads/cmo)
-"bMC" = (/obj/machinery/power/apc/high{dir = 1; name = "north bump"; pixel_y = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/camera/network/research{c_tag = "Research - Server Room"},/turf/simulated/floor{icon_state = "dark"},/area/server)
+"bMC" = (/obj/structure/bed/chair/office/light,/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor{icon_state = "dark"},/area/server)
"bMD" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-j2"; dir = 2},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/machinery/light_switch{pixel_x = 22; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2)
"bME" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/medical/medbay2)
"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)
"bMQ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/mob/living/simple_animal/mouse/white,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/rnd/storage)
"bMR" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/rnd/storage)
"bMS" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/shuttle/plating,/area/rnd/docking)
-"bMT" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/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)
+"bMT" = (/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing)
"bMU" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/rnd/research)
"bMV" = (/turf/simulated/wall/r_wall,/area/rnd/mixing)
"bMW" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/portable_atmospherics/powered/scrubber/huge,/turf/simulated/floor/plating,/area/rnd/mixing)
-"bMX" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/disposalpipe/segment,/obj/machinery/portable_atmospherics/powered/scrubber/huge,/turf/simulated/floor/plating,/area/rnd/mixing)
+"bMX" = (/obj/machinery/door/airlock/glass_research{name = "Toxins Lab"; req_access = list(7)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
"bMY" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/portable_atmospherics/powered/scrubber/huge,/turf/simulated/floor/plating,/area/rnd/mixing)
"bMZ" = (/obj/structure/lattice,/obj/structure/grille,/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/space,/area/space)
"bNa" = (/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_shuttle)
@@ -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)
@@ -4783,8 +4783,8 @@
"bNY" = (/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/machinery/sleeper,/turf/simulated/floor{dir = 8; icon_state = "whitered"},/area/medical/sleeper)
"bNZ" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/window/westleft{dir = 8; name = "Server Room"; opacity = 1; req_access = list(30)},/obj/machinery/door/window/eastleft{name = "Server Room"},/turf/simulated/floor{icon_state = "dark"},/area/server)
"bOa" = (/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{icon_state = "white"},/area/medical/medbay)
-"bOb" = (/obj/structure/bed/chair/office/light,/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/server)
-"bOc" = (/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/airlock/command{name = "Research Director"; req_access = list(30)},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/rnd/research)
+"bOb" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/obj/machinery/meter,/turf/simulated/floor{icon_state = "dark"},/area/server)
+"bOc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing)
"bOd" = (/obj/structure/table/rack,/obj/item/weapon/extinguisher,/obj/item/weapon/storage/belt/utility,/obj/item/clothing/mask/gas,/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/research_shuttle)
"bOe" = (/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/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo)
"bOf" = (/obj/machinery/computer/security/mining,/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/machinery/camera/network/civilian_west{c_tag = "Cargo Mining Dock"; dir = 4},/turf/simulated/floor,/area/quartermaster/miningdock)
@@ -4805,12 +4805,12 @@
"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)
"bOB" = (/obj/machinery/light{dir = 8},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/rnd/research)
-"bOC" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
+"bOC" = (/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Waste to Scrubbers"},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing)
"bOD" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor,/area/hallway/primary/central_three)
"bOE" = (/obj/structure/table/rack,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/storage/toolbox/mechanical,/obj/machinery/vending/wallmed1{pixel_x = -32; pixel_y = 0},/obj/item/roller,/obj/item/roller,/obj/item/roller,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper)
"bOF" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper)
@@ -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)
@@ -4881,10 +4881,10 @@
"bPS" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/camera/network/security{c_tag = "Engineering - Technical Storage"},/turf/simulated/floor/plating,/area/storage/tech)
"bPT" = (/obj/item/weapon/cigbutt,/turf/simulated/floor{icon_state = "floorgrime"},/area/rnd/storage)
"bPU" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/rnd/storage)
-"bPV" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
-"bPW" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/rnd/research)
+"bPV" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing)
+"bPW" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table/reinforced,/obj/item/stack/material/plasteel{amount = 10},/obj/item/stack/material/plasteel,/obj/item/stack/material/plasteel,/obj/item/stack/material/plastic{amount = 20},/turf/simulated/floor,/area/engineering/workshop)
"bPX" = (/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/storage/box/lights/mixed,/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/camera/network/security{c_tag = "Custodial Closet"},/turf/simulated/floor,/area/janitor)
-"bPY" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing)
+"bPY" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/reinforced,/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel,/obj/item/stack/material/steel,/turf/simulated/floor,/area/engineering/workshop)
"bPZ" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/door/blast/shutters{density = 0; dir = 4; icon_state = "shutter0"; id = "chemcounter"; name = "Pharmacy Counter Shutters"; opacity = 0},/obj/structure/table/reinforced,/obj/machinery/door/window/westright{name = "Chemistry Desk"},/turf/simulated/floor{icon_state = "yellowfull"; dir = 8},/area/medical/chemistry)
"bQa" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay)
"bQb" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "CMO's Office"; req_access = list(40)},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo)
@@ -4906,7 +4906,7 @@
"bQr" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = -32},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor{dir = 10; icon_state = "brown"},/area/quartermaster/miningdock)
"bQs" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor,/area/quartermaster/miningdock)
"bQt" = (/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j1s"; sortType = "QM Office"; name = "QM Office"},/turf/simulated/floor,/area/quartermaster/miningdock)
-"bQu" = (/obj/structure/disposalpipe/segment,/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/rnd/mixing)
+"bQu" = (/obj/structure/window/reinforced{dir = 1},/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},/turf/simulated/floor,/area/engineering/workshop)
"bQv" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/cargo)
"bQw" = (/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j1s"; sortType = "HoP Office"; name = "HoP Office"},/turf/simulated/floor/plating,/area/maintenance/cargo)
"bQx" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/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/plating,/area/maintenance/cargo)
@@ -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)
@@ -5028,9 +5028,9 @@
"bSJ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/rnd/storage)
"bSK" = (/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/rnd/research)
"bSL" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
-"bSM" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing)
-"bSN" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Waste to Scrubbers"},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing)
-"bSO" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing)
+"bSM" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/portables_connector,/obj/machinery/door/window/brigdoor/westleft{name = "Engine Waste"; req_access = newlist(); req_one_access = list(10,24)},/turf/simulated/floor/plating{icon_state = "platebot"},/area/engineering/engine_waste)
+"bSN" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 9},/obj/machinery/door/window/brigdoor/westleft{name = "Engine Waste"; req_access = newlist(); req_one_access = list(10,24)},/turf/simulated/floor/plating{icon_state = "platebot"},/area/engineering/engine_waste)
+"bSO" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/binary/pump{dir = 8; name = "waste pump"},/obj/machinery/door/window/brigdoor/westleft{name = "Engine Waste"; req_access = newlist(); req_one_access = list(10,24)},/turf/simulated/floor/plating{icon_state = "platebot"},/area/engineering/engine_waste)
"bSP" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/floor{dir = 2; icon_state = "whitehall"},/area/rnd/mixing)
"bSQ" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold4w/visible,/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing)
"bSR" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/rnd/mixing)
@@ -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)
@@ -5688,8 +5688,8 @@
"cft" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/rnd/test_area)
"cfu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/research_starboard)
"cfv" = (/obj/machinery/light/small,/turf/simulated/floor/plating/airless,/area/rnd/test_area)
-"cfw" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/plating,/area/construction)
-"cfx" = (/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plating,/area/construction)
+"cfw" = (/obj/structure/table/reinforced,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/obj/item/stack/material/plasteel{amount = 10},/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva)
+"cfx" = (/obj/machinery/requests_console{department = "Cargo Bay"; departmentType = 2; pixel_x = -30; pixel_y = 0},/obj/machinery/camera/network/civilian_west{c_tag = "Cargo Office"; dir = 4},/obj/structure/table/plastic{name = "plastic table frame"},/obj/item/stack/material/glass{pixel_x = 3; pixel_y = 3},/obj/item/stack/material/steel,/obj/item/device/multitool,/turf/simulated/floor,/area/quartermaster/office)
"cfy" = (/obj/structure/table/standard,/obj/item/clothing/head/soft,/obj/item/weapon/stamp{pixel_x = -3; pixel_y = 3},/obj/item/clothing/head/soft,/turf/simulated/floor,/area/quartermaster/storage)
"cfz" = (/obj/structure/table/standard,/obj/machinery/cell_charger,/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/turf/simulated/floor,/area/quartermaster/storage)
"cfA" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/table/standard,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/lights/mixed,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/engineering/engine_smes)
@@ -5765,11 +5765,11 @@
"cgS" = (/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/construction)
"cgT" = (/turf/simulated/floor/plating,/area/construction)
"cgU" = (/turf/simulated/floor,/area/construction)
-"cgV" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/window/brigdoor{dir = 8; name = "Engine Waste"; req_access = newlist(); req_one_access = list(11,24)},/obj/machinery/atmospherics/portables_connector,/turf/simulated/floor/plating{icon_state = "platebot"},/area/engineering/engine_waste)
+"cgV" = (/obj/structure/table/plastic{name = "plastic table frame"},/obj/item/stack/material/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/stack/material/steel{amount = 50},/obj/item/clothing/glasses/welding,/turf/simulated/floor{dir = 1; icon_state = "whitepurple"},/area/rnd/lab)
"cgW" = (/obj/machinery/door/airlock/glass_medical{name = "Patient Ward"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay4)
"cgX" = (/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 = 2},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor/plating,/area/rnd/xenobiology/xenoflora)
-"cgY" = (/obj/machinery/door/window/brigdoor{dir = 8; name = "Engine Waste"; req_access = newlist(); req_one_access = list(11,24)},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 9},/turf/simulated/floor/plating{icon_state = "platebot"},/area/engineering/engine_waste)
-"cgZ" = (/obj/machinery/door/window/brigdoor{dir = 8; name = "Engine Waste"; req_access = newlist(); req_one_access = list(11,24)},/obj/structure/window/reinforced,/obj/machinery/atmospherics/binary/pump{dir = 8; name = "waste pump"},/turf/simulated/floor/plating{icon_state = "platebot"},/area/engineering/engine_waste)
+"cgY" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/table/plastic{name = "plastic table frame"},/obj/item/stack/material/plasteel{amount = 10},/obj/item/stack/cable_coil,/obj/item/device/flash,/obj/item/device/flash,/turf/simulated/floor,/area/assembly/robotics)
+"cgZ" = (/obj/structure/table/plastic{name = "plastic table frame"},/obj/item/stack/material/glass{amount = 20; pixel_x = -3; pixel_y = 3},/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/assembly/robotics)
"cha" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "toxin_test_pump"; tag_exterior_door = "toxin_test_outer"; frequency = 1379; id_tag = "toxin_test_airlock"; tag_interior_door = "toxin_test_inner"; pixel_x = 0; pixel_y = 25; req_access = list(13); tag_chamber_sensor = "toxin_test_sensor"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/research_starboard)
"chb" = (/obj/structure/table/standard,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/belt/utility,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = 3},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor,/area/engineering/workshop)
"chc" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/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/engineering/foyer)
@@ -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/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator)
"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/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/structure/sign/deathsposal{pixel_x = 32},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/incinerator)
"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,7 @@
"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)
+"csK" = (/obj/structure/bed/chair{dir = 4},/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
"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 +6408,17 @@
"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)
+"cto" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator)
"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)
+"ctu" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/meter,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/incinerator)
"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)
+"cty" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/incinerator)
"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)
@@ -6469,7 +6469,7 @@
"cuu" = (/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},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/engineering/workshop)
"cuv" = (/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{dir = 1},/turf/simulated/floor,/area/engineering/workshop)
"cuw" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/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 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/engineering/workshop)
-"cux" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/engineering/storage)
+"cux" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{dir = 2; icon_state = "floorgrimecaution"},/area/maintenance/incinerator)
"cuy" = (/obj/machinery/atmospherics/binary/pump{dir = 4; name = "O2 to Mixing"},/turf/simulated/floor,/area/engineering/atmos)
"cuz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plating,/area/engineering/storage)
"cuA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/engineering/storage)
@@ -6529,7 +6529,7 @@
"cvC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/engineering/workshop)
"cvD" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/engineering/workshop)
"cvE" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor,/area/engineering/atmos)
-"cvF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engineering/storage)
+"cvF" = (/obj/structure/sign/nosmoking_2{pixel_x = 0; pixel_y = -30},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/incinerator)
"cvG" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor,/area/engineering/atmos)
"cvH" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/purple{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"cvI" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/purple{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "warnwhite"},/area/medical/virology)
@@ -6570,8 +6570,8 @@
"cwr" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating/airless,/area/solar/port)
"cws" = (/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/turf/simulated/floor,/area/engineering/workshop)
"cwt" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/newscaster{pixel_x = 28; pixel_y = 3},/turf/simulated/floor,/area/engineering/workshop)
-"cwu" = (/obj/machinery/portable_atmospherics/canister/phoron,/turf/simulated/floor/plating,/area/engineering/storage)
-"cwv" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/plating,/area/engineering/storage)
+"cwu" = (/obj/structure/reagent_dispensers/fueltank,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/incinerator)
+"cwv" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/visible,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/incinerator)
"cww" = (/obj/machinery/shieldgen,/turf/simulated/floor/plating,/area/engineering/storage)
"cwx" = (/obj/machinery/shieldwallgen,/turf/simulated/floor/plating,/area/engineering/storage)
"cwy" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/purple,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor{dir = 1; icon_state = "green"},/area/medical/virology)
@@ -6584,13 +6584,13 @@
"cwF" = (/obj/machinery/atmospherics/pipe/manifold/hidden/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"cwG" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "solar_xeno_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access = list(11,13)},/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/starboardsolar)
"cwH" = (/obj/machinery/atmospherics/pipe/simple/visible/blue{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/engineering/atmos)
-"cwI" = (/obj/machinery/atmospherics/pipe/tank/phoron{dir = 2; volume = 3200},/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator)
-"cwJ" = (/obj/machinery/atmospherics/pipe/tank/oxygen{dir = 2; volume = 3200},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator)
+"cwI" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/incinerator)
+"cwJ" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/machinery/meter,/obj/machinery/button/remote/blast_door{id = "disvent"; name = "Incinerator Vent Control"; pixel_x = 0; pixel_y = -24; req_one_access = list(12,5)},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{dir = 1; icon_state = "warningcorner"; tag = "icon-warningcorner (WEST)"},/area/maintenance/incinerator)
"cwK" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator)
"cwL" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator)
"cwM" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/light_switch{pixel_x = 0; pixel_y = 27},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator)
"cwN" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator)
-"cwO" = (/obj/structure/closet/emcloset,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator)
+"cwO" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/engineering/storage)
"cwP" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/medbay)
"cwQ" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/medbay)
"cwR" = (/obj/structure/closet/l3closet/virology,/obj/item/clothing/mask/gas,/obj/machinery/embedded_controller/radio/airlock/access_controller{tag_exterior_door = "virology_airlock_exterior"; id_tag = "virology_airlock_control"; tag_interior_door = "virology_airlock_interior"; name = "Virology Access Console"; pixel_x = 8; pixel_y = 22},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "greencorner"},/area/medical/virology)
@@ -6630,7 +6630,7 @@
"cxz" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating/airless,/area/solar/port)
"cxA" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/engineering/workshop)
"cxB" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/engineering/workshop)
-"cxC" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor/plating,/area/engineering/storage)
+"cxC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/engineering/storage)
"cxD" = (/obj/structure/dispenser{oxygentanks = 0},/obj/machinery/light,/turf/simulated/floor/plating,/area/engineering/storage)
"cxE" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor/plating,/area/medical/virology)
"cxF" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/bed/chair,/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/camera/network/medbay{c_tag = "Virology Monkey Pen"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
@@ -6692,10 +6692,10 @@
"cyJ" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/engineering{name = "Engineering Hard Storage"; req_access = list(11)},/turf/simulated/floor,/area/engineering/storage)
"cyK" = (/obj/machinery/door/airlock/maintenance{name = "Incinerator Access"; req_one_access = list(5,12)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/maintenance/incinerator)
"cyL" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{req_one_access = list(12,5)},/obj/structure/sign/redcross{desc = "The Star of Life, a symbol of Medical Aid."; icon_state = "lifestar"; name = "Medbay"; pixel_x = 0; pixel_y = 32},/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/medical/virologyaccess)
-"cyM" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator)
+"cyM" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/engineering/storage)
"cyN" = (/obj/machinery/atmospherics/trinary/mixer,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator)
"cyO" = (/mob/living/simple_animal/mouse,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator)
-"cyP" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/structure/sign/deathsposal{pixel_x = 32},/turf/simulated/floor/plating,/area/maintenance/incinerator)
+"cyP" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/engineering/storage)
"cyQ" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/wall,/area/maintenance/medbay)
"cyR" = (/obj/machinery/door/airlock/medical{autoclose = 0; frequency = 1379; icon_state = "door_locked"; id_tag = "virology_airlock_interior"; locked = 1; name = "Virology Interior Airlock"; req_access = list(39)},/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"cyS" = (/obj/structure/table/standard,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor,/area/construction)
@@ -6712,7 +6712,7 @@
"czd" = (/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/rnd/xenobiology)
"cze" = (/obj/structure/table/standard,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor,/area/engineering/locker_room)
"czf" = (/obj/machinery/requests_console{announcementConsole = 0; department = "Engineering"; departmentType = 4; name = "Engineering RC"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor,/area/engineering/workshop)
-"czg" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
+"czg" = (/obj/structure/closet/emcloset,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator)
"czh" = (/obj/structure/bed/chair{dir = 8},/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/plating,/area/maintenance/engi_shuttle)
"czi" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating/airless,/area/solar/port)
"czj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 9},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
@@ -6750,8 +6750,8 @@
"czP" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator)
"czQ" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator)
"czR" = (/obj/machinery/atmospherics/tvalve/digital/bypass{dir = 1; icon_state = "map_tvalve0"; state = 0},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator)
-"czS" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/incinerator)
-"czT" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/incinerator)
+"czS" = (/obj/machinery/atmospherics/pipe/tank/phoron{dir = 2; volume = 3200},/obj/effect/decal/cleanable/cobweb,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator)
+"czT" = (/obj/machinery/atmospherics/pipe/tank/oxygen{dir = 2; volume = 3200},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator)
"czU" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/maintenance/medbay)
"czV" = (/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Port to Waste"},/turf/simulated/floor,/area/engineering/atmos)
"czW" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
@@ -6800,13 +6800,13 @@
"cAN" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
"cAO" = (/turf/simulated/wall,/area/maintenance/engi_shuttle)
"cAP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/engineering)
-"cAQ" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/incinerator)
-"cAR" = (/obj/structure/sign/nosmoking_2{pixel_x = 0; pixel_y = -30},/turf/simulated/floor/plating,/area/maintenance/incinerator)
+"cAQ" = (/obj/machinery/portable_atmospherics/canister/phoron,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/engineering/storage)
+"cAR" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/engineering/storage)
"cAS" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/turf/simulated/floor,/area/engineering)
-"cAT" = (/turf/simulated/floor{dir = 2; icon_state = "floorgrimecaution"},/area/maintenance/incinerator)
+"cAT" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/construction)
"cAU" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Virology Laboratory"; req_access = list(39)},/turf/simulated/floor{icon_state = "delivery"},/area/medical/virology)
"cAV" = (/turf/simulated/floor/plating,/area/maintenance/incinerator)
-"cAW" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/plating,/area/maintenance/incinerator)
+"cAW" = (/obj/machinery/light{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/construction)
"cAX" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "virology_pump"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/maintenance/medbay)
"cAY" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 6},/area/maintenance/medbay)
"cAZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
@@ -6912,7 +6912,7 @@
"cCV" = (/obj/machinery/light{dir = 1},/obj/effect/landmark{name = "JoinLateCyborg"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/engineering/drone_fabrication)
"cCW" = (/obj/machinery/ai_status_display{layer = 4; pixel_y = 32},/obj/machinery/light{dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/engineering/drone_fabrication)
"cCX" = (/turf/simulated/floor/plating/airless,/area/maintenance/medbay)
-"cCY" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/machinery/meter,/obj/machinery/button/remote/blast_door{id = "disvent"; name = "Incinerator Vent Control"; pixel_x = 0; pixel_y = -24; req_one_access = list(12,5)},/turf/simulated/floor{dir = 1; icon_state = "warningcorner"; tag = "icon-warningcorner (WEST)"},/area/maintenance/incinerator)
+"cCY" = (/obj/machinery/alarm{pixel_y = 23},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/construction)
"cCZ" = (/obj/structure/bed/chair,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engineering/drone_fabrication)
"cDa" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table/reinforced,/obj/machinery/button/remote/blast_door{id = "xenobio4"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access = list(55)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/rnd/xenobiology)
"cDb" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
@@ -7452,8 +7452,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaIaafcKrapgaavaaacKrapgaavaaacKrapgaavaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaadDadEacuadYadpadpadpadpadfadpaecadradaacQadvadHadIadJakEadLadUajtajtajtadVadPacradQadlabbadRaehaicabbaaLaaLaafaaaaafaaaaaLaafaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaIaafcKrapgaavaaacKrapgaavaafcKrapgaavaafaafaafaaaaafaafaaaaaaaaaaaaaaaadTadEacuacuaeqaeoaevaeuaezaexacuacuaeBacQadbaebaddadZaeaadyadUajtaebajtaetaedacradQaeeabbabbabbabbabbaaLaaaaaaaaaaaaaaaaaaaafaafaafaaaaaaaafaafaaLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaqaafcKrarDaavaaacKrarDaavaaacKrarDaavaafaaaaafaafaafaaaaaaaaaaaaaaaaaaadTaegacuacuacuacuacuacuaePacuacuacuarrarsartaelaemaenarwaepaeMarCasDarCafAaeTacradBafaabbaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaaaafaaaaaaaaaaafaafaafaaaaaaaafaafaaaaaaaafaafaaaaaaaaaaaaaaaaafaaaaewadEafeaeyarcaaTaeAafmaeCaeDaeEaeFaeGaeHaeIaeHaddadZaeJaeKaeLaeLafBaeLaeNaeOafyaeQafHabbaeSaeSaeSaeSaeSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauabgaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaIafIaamaamaamaamaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaafaafabfadEaeUaeVaeWaaTaeAaeAaeXaeYaeZaeFafLafbafcafdaddargaffafgacQacQafhacQafiafjacrafkageabbaggafnafoafoafpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaaaafaaaaaaaaaaafaafaafaaaaaaaafaafaaaaaaaafaafaaaaaaaaaaaaaaaaafaaaaewadEaeWaeyarcaaTaeAafmaeCaeDaeEaeFaeGaeHaeIaeHaddadZaeJaeKaeLaeLafBaeLaeNaeOafyaeQafHabbaeSaeSaeSaeSaeSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauabgaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaIafIaamaamaamaamaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaafaafabfadEaeUaeVafeaaTaeAaeAaeXaeYaeZaeFafLafbafcafdaddargaffafgacQacQafhacQafiafjacrafkageabbaggafnafoafoafpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaacaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfabfabfabfabfabfabfabfabfabfabfadEafqafrafsaaTaftafuafvafwafxagqafzafNafOafNafCaqLadxafEafFacQafhacQafGagragsafJafKagtadlaguaghagxafPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfafQafRafSabfafTafUafVafWafXafYafZafZafZafZafZafZagaagbagcagbaaTagHagdagfagKahiaeFagiagjagkaglagmarbagoagpahtahpahGahzahJagpagvagwahPabbadlagyafoafoagzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaabgaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaabfagAagBafZafZafZafYafYafZagCagDagDagDagDagDagDagDagDagDagDahRaaTagFagGahUagIagJaeFahNagLagLagLaddagMagNagOagPagQagRagQagPagSagvagTadlabbabbaeSaeSaeSaeSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -7464,99 +7464,99 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfajAabfabfajBajlagWagWajIagWagWakkagWagWagWakAagWagWajpajsakFantakRajuagWajvajwakWajyajqagWagWajzalealaagWagWagWagpajCagpagpagpagpagpagvahxabbajDajEaboaaaaafaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaaaafaaaaaqaaaaaaaaaaaaaaaaaaaaaaaaaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfagBafYajFafYajGajHalfajJajKajLajMajNajOajPajQajRajSajTajUajVajWajXajUajYajWajWajZakaakaakbakcakdahOakeajbakgajzakhakiakjalnaklakmaknakoakpalqakZakqabOaaaaaaaaaaaaaaaaaaaaaaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafabQaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaamaamaaIaamaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfadEagWagWagWagWagWagWaksaktakuakvakwakxakyakzalrakBakCakDakXalvakwakGakwakwakHakIakJakKakLakMalxakOakPakJakQalNakSakTakUalbalPalCakYakoalIabbalOabZactaaaaaaaaaaafaaaaaaaaaaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaIaaIaaIaaIaaaaaaaaaabpaaaaaaaaaaaIaaIaamaamaamaaaaaaaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaaaaaqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfadEagWalcaldalZalQagWalgalhahLalialjagWacTamoacTagWabVamsabUagWalpamuamtalsagDaltaluamxalwamyagWabTabSabSabRagWalBamcalDalEalFalGalHakoamAanQamDanQanQaaaaaaaafaafaaaaaaaaaaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqaaaaaaaafaafaafaaaaaaaoYaafaafaaaaafaafaaaaaaaamaaaaaaaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafabMaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafabfadEabWalMalMamHamFamMamJalRahKalSaljagWalTalUalValWalXalYamNamOahKambahKamPabYameameamfamgamhamiamjamkamlammakoamnamUampamqalDalDamrakoadQanQamvawKamwaaaaaaaaLaaaaaaaaaaafaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafanTanTanTanTanTaafalJaafanTanTanTanTanTaafaaIaaaaaaaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaaaaaqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfadEagWalcaldalZalQagWalgalhahLalialjagWacTamoacTagWabVamsabUagWalpamuamtalsagDaltaluamxalwamyagWabTabSabSabRagWalBamcalDalEahMalGalHakoamAanQamDanQanQaaaaaaaafaafaaaaaaaaaaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqaaaaaaaafaafaafaaaaaaaoYaafaafaaaaafaafaaaaaaaamaaaaaaaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafabMaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafabfadEabWalMalMamHamFamMamJalRahKalSaljagWalTalUalValWalXalYamNamOahKambahKamPabYameameamfamgamhamiamjamkamlammakoamnamUalFamqalDalDamrakoadQanQamvawKamwaaaaaaaaLaaaaaaaaaaafaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafanTanTanTanTanTaafalJaafanTanTanTanTanTaafaaIaaaaaaaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaamaaIaaIaaaaaaaaaaoXaaaaaaaaaaaIaaIaamaamaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfadEagWamWamBamCamZagWankalRaljanlamGagWamRamIanmalWamKamLannaiNaiSanPaiManaajkamgamgamfamgamTaoWamVanfamXanhakoaoeanWalDamqalDalDanbakoancandaneaocangaafaaLaafaafaaLaafaafaafakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafanianjanjanjanjanualJansanqanqanqanqanwaafaaIaaaaaaaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafaafaaaaaaaaaaoVaafaafaaaaafaafaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaofagWagWagWagWagWagWaqqaqXagWagWagWagWaoRaoSaoRalWaoTaoUapealWapfapiaplanzanAamgamgamfanBanCamianDanEamXanFanGanHanIanJanKanLanManNanGanOaoPapqanRanSaaaaaaaafaaaaafaaLaafaacakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafapIapIapIapIapIaafalJaafapIapIapIapIapIaafaaIaaaaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafaafaaaaaaaaaaoVaafaafaaaaafaafaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaofagWagWagWagWagWagWaqqaqXagWagWagWagWaoRaoSaoRalWaoTaoUapealWapfapiaplanzanAamgamgamfanBanCamiampanEamXanFanGanHanIanJanKanLanManNanGanOaoPapqanRanSaaaaaaaafaaaaafaaLaafaacakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafapIapIapIapIapIaafalJaafapIapIapIapIapIaafaaIaaaaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafanVanVanVanVanVaafalkaafanVanVanVanVanVaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanXanYanZaoaagDaekaoZagWaoCapdalKaogappaoiapDaokaolaonaonaooaonaopaoqaoGaoMaoOaiqamgamgaouaovaowamiaoxaqgamXaoyanGaozaoAaoBaoQaoDaoEaoFanGaqCanQanQanQanQaoIaoJaoHaoLaqJaaaaafaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafaaaaaaaafalJaaaaaaaaaaafaaaaaaaaaaamaaaaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaIaafalzalyalyalyalyalAalkallaivaivaivaivagEaafaaIaaaaaaaaaaaaaaaaaaaacaaaaaaaaaanXanXapaapbagDalMapcaqPaohaodanvanramSaomaosaosaotaojaonapmapnaoraonapoaonaoNapEapramgamfamgamTaraamYanEamXaptanGapuapvapwapxapyapzapAanGapBaoHapCapLapGapFapPaoHaoHarjaoHaoHaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafanTanTanTanTanTaafalJaafanTanTanTanTanTaafaaIaaaaaaaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafapJapJapJapJapJaafalkaafapJapJapJapJapJaafaaIaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaapKapaapbagDapUapMagWalgapNalKapOapVapQapRaokapSaqmaqcaqpapWapXapYapZaqaanUaqNaqdaovaqeaovaqfarnaqhaqiaqjaqkanGaqlaqWapyaqnaqoarlaqoaroaqraqsapFaqtaquapFailaoHaqwaqxaqyaoHaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafanianjanjanjanjanualJansanqanqanqanqanwaafaaIaaaaaaaaaaaaaaaaaaaihaihaihaihaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafaaaaaaaafalkaaaaaaaaaaafaaaaaaaaaaaqaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaqzaqAaqBagDagWagWagWarvalRagWalWalWalWahbaqEapkahCahDahMaonaqIagnaqKahaanyarMaqOaryaqQaqRaqSanxaqUaqVarQamVanGarzaqYaqZafDaflafMardanGarearfapFaqtaqtapFaifaoHarhariarFaoHaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafapIapIapIapIapIaafalJaafapIapIapIapIapIaafaaIaaaaaaaaaaaaabgaaaaihaihaihaihaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafapJapJapJapJapJaafalkaafapJapJapJapJapJaafaaIaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaapKapaapbagDapUapMagWalgapNalKapOapVapQapRaokapSaqmaqcaqpapWapXapYapZaqaanUaqNaqdaovaqeaovaqfarnaqhaqiaqjanDanGaqlaqWapyaqnaqoarlaqoaroaqraqsapFaqtaquapFailaoHaqwaqxaqyaoHaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafanianjanjanjanjanualJansanqanqanqanqanwaafaaIaaaaaaaaaaaaaaaaaaaihaihaihaihaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafaaaaaaaafalkaaaaaaaaaaafaaaaaaaaaaaqaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaqzaqAaqBagDagWagWagWarvalRagWalWalWalWahbaqEapkahCahDaqkaonaqIagnaqKahaanyarMaqOaryaqQaqRaqSanxaqUaqVarQamVanGarzaqYaqZafDaflafMardanGarearfapFaqtaqtapFaifaoHarhariarFaoHaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafapIapIapIapIapIaafalJaafapIapIapIapIapIaafaaIaaaaaaaaaaaaabgaaaaihaihaihaihaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafanVanVanVanVanVaafalkaafanVanVanVanVanVaafaaIaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaqzarkaqBagDaekarHagWarmarOalKaogarPaoiaokarparqaesaeRaeraonarualWarZarSarxalLasnarAasBamzasOarEasRarGasWamjanGanGarIanGanGanGanGanGanGarJarKarLasaasaapFarNaoHaoHasXaoHaoHaaaaaaakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafaaaaaaaaaalJaaaaaaaaaaafaaaaaaaaaaamaaaaaaaaaaaaaaaaaaaihaihaihaihaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLasYaaLaaaaaaaaaaaaaaaaaaaaaaaIaafalzalyalyalyalyalAalkallaivaivaivaivagEaafaaIaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaqzataaqBagDarRapcatiarTarUatIapharWaloaonaonarYasFasyasMaonascalWasdasealmasgasharAasiasjaskarEaoHaoHaoHaoHaoHaslatQatJasoasoaspaspasqasrassastastasuasvasvaswasxatXaszaqsaaaaafaafaafaaaaaaaafaafaafaafaaaaaaaafaafaafaaaaaaaaaaaaaaIaafanTanTanTanTanTaafalJaafanTanTanTanTanTaafaaIaaaaaaaaaaaaaaaaaaaihaihaihaihaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafasAauiasAaaaaaaaaaaaaaaaaaaaaaaaIaafapJapJapJapJapJaafalkaafapJapJapJapJapJaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasCasbapbagDapUapMagWaZtasEalKapOasPaoiasGasGasHasIaonasJaonasKalWasLatgaZuathauuarAasQauvasSarEasTasUasUasVauSasVavCavbasZasZasZasZasZasZasZasZasZasmavFatbatcaoKatdateatfaaaaafatPatratjatjatjatjavRatjatjatjatjatUaafaaaaaaaaaaaaaamaafanianjanjanjanjanualJansanqanqanqanqanwaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatkatlatmaaaatnatoatpaaaaafatqatWatqaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafaaaaaaaaaalkaaaaaaaaaaafaaaaaaaaaaamaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaanXatsattagDagDagDagWagWagWagWalWalWalWalWalWatuaonaoratvaqEatwalWalWalWatxatxatxarAatyatzatAarEatBasZasZasZasZatCatDatEatFatGatHavTavUatKatLatMatNatOatPatPatPatPatPatPatPatPatPatPatRatRatRatRatRatRatRatRatRatRaumaafaaaaaaaaaaaaaamaaaapIapIapIapIapIaafalJaafapIapIapIapIapIaaaaaqaaaaaaaaaaaaaaaaaaaaaaaaaaaaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafasAauiasAaaaaaaaaaaaaaaaaaaaaaaaIaafapJapJapJapJapJaafalkaafapJapJapJapJapJaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasCasbapbagDapUapMagWaZtasEalKapOasPaoiasGasGasHasIaonasJaonasKalWasLatgaZuathauuarAasQauvasSarEasTasUasUasVauSasVavCavbasZasZasZaDoasZasZasZasZasZasmavFatbatcaoKatdateatfaaaaafatPatratjatjatjatjavRatjatjatjatjatUaafaaaaaaaaaaaaaamaafanianjanjanjanjanualJansanqanqanqanqanwaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatkatlatmaaaatnatoatpaaaaafatqatWatqaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafaaaaaaaaaalkaaaaaaaaaaafaaaaaaaaaaamaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaanXatsattagDagDagDagWagWagWagWalWalWalWalWalWatuaonaoratvaqEatwalWalWalWatxatxatxarAatyatzatAarEatBasZasZasZasZatCatDatEatFatGatHaEzavUatKatLatMatNatOatPatPatPatPatPatPatPatPatPatPatRatRatRatRatRatRatRatRatRatRaumaafaaaaaaaaaaaaaamaaaapIapIapIapIapIaafalJaafapIapIapIapIapIaaaaaqaaaaaaaaaaaaaaaaaaaaaaaaaaaaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatSatTaLAatTatSatVaLBatVatSaafatqawvatYaaaaaaaaaaaaaaaaaaaaaaaIaafanVanVanVanVanVaafalkaafanVanVanVanVanVaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafatZauaanYaubaucanXaafaafalWaudaueaufaugauhawMaonapnaonasJaqEaujaukaulawRaunauKauparAauqaurausarEatBasZauLaxdauMatCauxauyatFatGauzauAauBauCauDatMatNauEauFauGauHauIauHauJauwauOauPaxsatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaamaaaaafaaaaafaafaaaaaabepaaaaaaaafaaaaaaaafaaaaaIaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauNatTavmatTauNatVavyatVauNauQauRaxuauTauUauUauVauQauQaafaaaaaIaafalzalyalyalyalyalAalkallaivaivaivaivagEaafaaIaaaaaaaaaaaaaaaaaaaaaaaaanXanXanXauWanXanXapbaucanXaaaaaaalWauXalWauYauZavaalWaZYavzaonavdaveaveavfavgaveavhaviavjarAavkauravlarEatBasZavAavoavJatCawravqatFatGauzauAavravsavtatMatNavuavvauGauHauHauHauJavwavQawfavVatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaamaamaaIaaaaaaaafaaaaaaabpaaaaafaafaafaafaaIaaIaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauNavBaxyavDauNavEaxAavGauNavHavIaxCavKavLavMavNavOauQaaaaaaaaqaaaapJapJapJapJapJaafbeSaafapJapJapJapJapJaaaaaIaaaaaaaaaaaaaaaaaaaaaaaaawkaxGavSayqaxOawoavWavXanXaaaaaaalWalWalWavYavZawaalWaYJaYNaYKaweawpaYHaukawhawxautawyawlarAawmaurayzarEatBasZawzawUawYaxaaxbawZatFatFatFawsawtawuatFatFatNayNawwauGauHauHauHauJawAavxawfaykatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaaaaafaafaaaaafaaaaaaaYxaaaaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauNawGawHawIauNawGawHawIauNawJavHavHavHavHavHavHavHasAaaaaaaaaIaaaaafaaaaafaafaaaaaaaZhaaaaaaaafaaaaaaaafaaaaaIaafaaaaaaaafaafaaaaaaaafawPaxGawQazgaxOawSaucawTanXaafaaLcqTatxatxatxatxatxatxatxatxatxatxatxatxatxatxatxatxatxatxarAawVaurawWarEatBasZawBaxjawCatCaxVavnazpaxcaxfaxeaxhaxgaxhaxiaxkaxlaxmaxnaxoaxoaxoaxnaxmavxawEawDatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaaaaaaaafaafaafaaaazoaYUazoaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaatSauNazFaxxatSauNazUaxxatSauNaAbauNauNauNauNauNavHatqaaaaaaaaIaaIaaIaaaaaaaafaaaaxBaZnaxBaafaafaafaafaaIaaIaaIaafanXanXanXanXaxDaxEaxEaxFanXanXanXanXaAvaucaucanXaxHaxIanXanXaxJaxKaxLaxMaxMaxMaxMaxMaxMaxMaxMaxNaxMaxMaxMaxMaxMaAHaxPaxQaxRaAHavpasZaxSawjcfSatCaxVaxXaxXaxXaxZaxYayaawLaxXavqaydayeayfaygayhayhayhayhawXavxawEawDatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaAuaBaaAuaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaynayoaypayoaBcayoayrayoaysaytayvayvayvayvaywauNawNatqaaaaafaafaaaaaaaaaaaaaafaaaayyaBkayAaafaaaaafaaaaaaaaaaaaaaaanXayBayCayDayCayCayCayCayEayCayCayFayGayDayHayIaxMaxMaxMaxMaxMaxMayJayKayLayLayLayLayMayLayLaZsayLayMayLayLayLarAaBEayPayQarEaAiasZcfSaycaxUatCayUayTayWaxpayYayXayYaxqayTazaazbazcazdazeazdazdazfaxraBOaxtaxTaxvatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaaaaaaaaaaafaafaBuaBvaZraBxaByaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazqazrazsaztazuazvazwazxazyazwazzazAazwazwaCeauNavHauRaafaafaaaaaaaaaaaaaaaaafazDazEbdHazGazHaaaaafaaaaaaaaaaaaaaaanXazIanXazJazKazLazLazLazMazLazLazLazNazJazOazPazPazPazPazPazPazPazQazRayLazSazTazTazVazWazXazYazZaAabeTazTaAcarAaAdayPayQarEaAiasZaybaAeauMatCaxWaxXaxXaxXaxXayiayjaAlaAmaAnaxkaAoaylaApaApaApaAqayVatPayZatPatPatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaCvaCwbfyaCyaCvaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauNatTavmatTauNatVavyatVauNauQauRaxuauTauUauUauVauQauQaafaaaaaIaafalzalyalyalyalyalAalkallaivaivaivaivagEaafaaIaaaaaaaaaaaaaaaaaaaaaaaaanXanXanXauWanXanXapbaucanXaaaaaaalWauXalWauYauZavaalWaZYavzaonavdaveaveavfavgaveavhaviavjarAavkauravlarEatBasZavAavoavJatCawravqatFatGaGVauAavravsavtatMatNavuavvauGauHauHauHauJavwavQawfavVatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaamaamaaIaaaaaaaafaaaaaaabpaaaaafaafaafaafaaIaaIaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauNavBaxyavDauNavEaxAavGauNavHavIaxCavKavLavMavNavOauQaaaaaaaaqaaaapJapJapJapJapJaafbeSaafapJapJapJapJapJaaaaaIaaaaaaaaaaaaaaaaaaaaaaaaawkaxGavSayqaxOawoavWavXanXaaaaaaalWalWalWavYavZawaalWaYJaYNawcaweawpaYHaukawhawxautawyawlarAawmaurayzarEatBasZawzawUawYaxaaxbawZatFatFatFawsawtawuatFatFatNayNawwauGauHauHauHauJawAavxawfaykatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaaaaafaafaaaaafaaaaaaaYxaaaaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauNawGawHawIauNawGawHawIauNawJavHavHavHavHavHavHavHasAaaaaaaaaIaaaaafaaaaafaafaaaaaaaZhaaaaaaaafaaaaaaaafaaaaaIaafaaaaaaaafaafaaaaaaaafawPaxGawQazgaxOawSaucawTanXaafaaLcqTatxatxatxatxatxatxatxatxatxatxatxatxatxatxatxatxatxatxarAawVaurawWarEatBasZawBaxjawCatCaxVavnazpaxcaxhaxeaxhaxgaxfaxiaxkaxlaxmaxnaxoaxoaxoaxnaxmavxawEawDatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaaaaaaaafaafaafaaaazoaYUazoaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaatSauNazFaxxatSauNazUaxxatSauNaAbauNauNauNauNauNavHatqaaaaaaaaIaaIaaIaaaaaaaafaaaaxBaZnaxBaafaafaafaafaaIaaIaaIaafanXanXanXanXaxDaxEaxEaxFanXanXanXanXaAvaucaucanXaxHaxIanXanXaxJaxKaxLaxMaxMaxMaxMaxMaxMaxMaxMaxNaxMaxMaxMaxMaxMaAHaxPaxQaxRaAHavpasZaxSawjcfSatCaCJaxXaxXawLaxZaxYayaaxpaxXavqaydayeayfaygayhayhayhayhawXavxawEawDatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaAuaBaaAuaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaynayoaypayoaBcayoayrayoaysaytayvayvayvayvaywauNawNatqaaaaafaafaaaaaaaaaaaaaafaaaayyaBkayAaafaaaaafaaaaaaaaaaaaaaaanXayBayCayDayCayCayCayCayEayCayCayFayGayDayHayIaxMaxMaxMaxMaxMaxMayJayKayLayLayLayLayMayLayLaZsayLayMayLayLayLarAaBEayPayQarEaAiasZcfSaycaxUatCayUayTayWaxqayYayXayYayiayTazaazbazcazdazeazdazdazfaxraBOaxtaxTaxvatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaaaaaaaaaaafaafaBuaBvaZraBxaByaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazqazrazsaztazuazvazwazxazyazwazzazAazwazwaCeauNavHauRaafaafaaaaaaaaaaaaaaaaafazDazEbdHazGazHaaaaafaaaaaaaaaaaaaaaanXazIanXazJazKazLazLazLazMazLazLazLazNazJazOazPazPazPazPazPazPazPazQazRayLazSazTbzzazVazWazXazYazZaAabeTazTaAcarAaAdayPayQarEaAiasZaybaAeauMatCaxWaxXaxXaxXaxXawLayjaAlaAmaAnaxkaAoaylaApaApaApaAqayVatPayZatPatPatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaCvaCwbfyaCyaCvaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafauNaAwaAxaAwaAyazsazsaAzaAwaAxaAwaAAaABaACaADauNavHauQauQaAEauUauUauUauUauVauQaAFaAGbfAaAIaAFanXanXaxHaAJaxIanXanXanXazIaAKazJaaaaafaaaaafaaaaafaaaaafaaaazJazOazPaALaAMaANaAOaAPazPazQaucayLaAQaAQaARaASaATaAUaAVaATaAWaAXazTaAcarAaAdayPaDdarEaAiasZawzaAgaAhaBbayRaBdaBeazhaBgaBhaBiaBjaBjaCLaBjatPaBlaBmaBnaBoaBpaBraxvazibguazjatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaacaaaaaaaafaaaaCvazlaDAaDBaCvaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaBzatSaBAawHaBBaBCaBDaDcaBFaBBawHaBGaBHaBIaBJaBKaBLavHavHavHavHavHavHavHavHaDnaBPaAFazmaBRaBSaAFaBTaBUayCayCayCayCayCaBVaBWaBXazJaafaBYaBYaBYaBYaBYaBYaBYaafazJazOazPaBZaCaaCbaCcaBZazPazQaCdayLayLayLayLaDxaCfaCgaChaCfaDyaCjazTaCkarAaAdayPaClarEaJCasZaznaAYazCatCaxWavqatEaBjaBjaBjaBjaBjaCqaCraCsaBjatPatPatPatPaDQatPatPaAfaAkaAjatRatRatRatRatRatRatRatRatRatRaumaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaCvaEXaEYaDYaCvaaaaaaaaaaafaafaaaaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazqaAxaCzaCAaCAaCAaCAaCBaAxazqaaaaBIaCCaxzaBLaCEaCEaCEaCEaCEaCEaCEavHaCFaCGaAFaEeaCIaAsaAFaCKaEvaCKaCKaCKaCKaCKaCKaCKaCKaCMaaaaBYaCNaCOaCPaCQaCRaBYaaaazJazOazPaBZaCSaCTaCUaBZazPazQanXayLaCVaCWaARaCXaCYaCZaDaaDbaECayLayLayLarAaAdayPayQarEaAiasZaAtaEMauMatCaDgavqatEaDhaDiaDjaDkaBjaCqaDlaCsaBjaDmaESbgIaDpaDqaGwaDsatPatPatPaAZatjatjatjatjaEVatjatjatjatjaBfaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaCvaCvbgHaGyaCvaDCaDDaDEaDCaDCaDCaDCaDCaDCaDCaDFaDGaDGaDGaDHaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaaaDIaDJaDKaDJaDJaDLaDMaDJaDJaDKaDNaDOaBIaDPaFEaBLaDRaDSaDTaDUaDVaDWaCEavHaDXauQaAFaAFbaNaDZaCMaEaaEbbcCbbTbbxbaCbafbacaEiaEjaCMaafaBYaEkaElaEmaEnaEoaBYaafazJazOazPaEpaEqaEraEsaEtazPazQaEuayLazSazTaFSaEwaCfaExaEyaATaEzaEAaEBaEBarAaAdayPayQarEaAiaCmaCmaCmaCmaCmaEHaEIatEaEJaEKaEKaELaFZaEKaENaEOaBjaEPaEQaERaGfaETaCnaDsaaaaafaafaafaaaaaaaafaafaafaafaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaDCaBsaBqaDCaBtaCpaGkaFdaFdaFdaFdaFeaFfaFgaFgaFgaFgaFgaFgaFgaGqaFiaFjaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaDIaDNaDJaFkawiaFlaFmbIraFoaFpbHfaFlawnaFraFsaFtaDPayuaBLaFvayxaBMaCxaBMaBNaGravHaFuaGxaFxaGHaFzaDfaGPaFJaFKaFLaFLaFLaDraFLaFLaFNaFOaCMaaaaBYaDtaElaFQaEnaFRaBYaaaazJazOazPaGVaFTaFUaFTaFVazPazQaFWayLayLayLayLaFXaCfaCgazTaCfaFYbcEazTaGaarAaGbaGcaGdarEaAiaDeaDvaDuaCoaDeaHJaDzaHYaGlaGmaBjaBjaBjaBjaBjaBjaGnaGoaGpaIcaDpaIkaIhaDsaDsaDsaDsaDsaDsaDsaDsaDsaFaaFbaDsaDsaFaaGtaDsaDsaaaaaaaDCaDCaDCaDCaDCaEZaEWaFdaFcaFwaDCaDCaDCaDCaDCaGDaGEaGFaGFaGFaGFaGFaGFaGGaGGaIlaGGaGGaGGaGGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaBzatSaBAawHaBBaBCaBDaDcaBFaBBawHaBGaBHaBIaBJaBKaBLavHavHavHavHavHavHavHavHaDnaBPaAFazmaBRaBSaAFaBTaBUayCayCayCayCayCaBVaBWaBXazJaafaBYaBYaBYaBYaBYaBYaBYaafazJazOazPaBZaCaaCbaCcaBZazPazQaCdayLayLayLayLaDxaCfaCgaChaCfbKoaCjazTaCkarAaAdayPaClarEaJCasZaznaAYazCatCaxWavqatEaBjaBjaBjaBjaBjaCqaCraCsaBjatPatPatPatPaDQatPatPaAfaAkaAjatRatRatRatRatRatRatRatRatRatRaumaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaCvaEXaEYaDYaCvaaaaaaaaaaafaafaaaaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazqaAxaCzaCAaCAaCAaCAaCBaAxazqaaaaBIaCCaxzaBLaCEaCEaCEaCEaCEaCEaCEavHaCFaCGaAFaEeaCIaAsaAFaCKaEvaCKaCKaCKaCKaCKaCKaCKaCKaCMaaaaBYaCNaCOaCPaCQaCRaBYaaaazJazOazPaBZaCSaCTaCUaBZazPazQanXayLaCVaCWaARaCXaCYaCZaDaaDbcfwayLayLayLarAaAdayPayQarEaAiasZaAtaEMauMatCaDgavqatEaDhaDiaDjaDkaBjaCqaDlaCsaBjaDmaESbgIaDpaDqaGwaDsatPatPatPaAZatjatjatjatjaEVatjatjatjatjaBfaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaCvaCvbgHaGyaCvaDCaDDaDEaDCaDCaDCaDCaDCaDCaDCaDFaDGaDGaDGaDHaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaaaDIaDJaDKaDJaDJaDLaDMaDJaDJaDKaDNaDOaBIaDPaFEaBLaDRaDSaDTaDUaDVaDWaCEavHaDXauQaAFaAFbaNaDZaCMaEaaEbbcCbbTbbxbaCbafbacaEiaEjaCMaafaBYaEkaElaEmaEnaEoaBYaafazJazOazPaEpaEqaEraEsaEtazPazQaEuayLazSazTaFSaEwaCfaExaEyaATaIVaEAaEBaEBarAaAdayPayQarEaAiaCmaCmaCmaCmaCmaEHaEIatEaEJaEKaEKaELaFZaEKaENaEOaBjaEPaEQaERaGfaETaCnaDsaaaaafaafaafaaaaaaaafaafaafaafaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaDCaBsaBqaDCaBtaCpaGkaFdaFdaFdaFdaFeaFfaFgaFgaFgaFgaFgaFgaFgaGqaFiaFjaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaDIaDNaDJaFkawiaFlaFmbIraFoaFpbHfaFlawnaFraFsaFtaDPayuaBLaFvayxaBMaCxaBMaBNaGravHaFuaGxaFxaGHaFzaDfaGPaFJaFKaFLaFLaFLaDraFLaFLaFNaFOaCMaaaaBYaDtaElaFQaEnaFRaBYaaaazJazOazPbopaFTaFUaFTaFVazPazQaFWayLayLayLayLaFXaCfaCgazTaCfaFYbcEazTaGaarAaGbaGcaGdarEaAiaDeaDvaDuaCoaDeaHJaDzaHYaGlaGmaBjaBjaBjaBjaBjaBjaGnaGoaGpaIcaDpaIkaIhaDsaDsaDsaDsaDsaDsaDsaDsaDsaFaaFbaDsaDsaFaaGtaDsaDsaaaaaaaDCaDCaDCaDCaDCaEZaEWaFdaFcaFwaDCaDCaDCaDCaDCaGDaGEaGFaGFaGFaGFaGFaGFaGGaGGaIlaGGaGGaGGaGGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaFraGIaFyaGKaFlaFMaFlaFMaFlaFMaFlaFMaFlaGMaGNaGOaDPayuaBLaInaFAaGRaGSaGTaGUaCEaFBaFDaFCaFCaFCbazaIzaFCbcTaFLaFLaFLaFLaFLaFLaFLaFNbcPaCMaafaBYaHeaHfaHgaHhaHiaBYaafazJazOazPaHjaFPaFUaHlaHmazPaHnaHoayLaHpazTaARaHqaATaHrazTaCfaFYaHsazTaHtarAaHuaHvaHwarEaGuaIDaEUaGvaDwaIIaGzaGjatEaHCaHDaBjaHEaBjaHFaBjaHGaBjaHHaGpaIZaDpaJsaJjaHLaHMaHMaHNaHOaHKaHKaHKaHKaHKaHPaHKaHKaHKaHQaHVaDsaDsaDsaDCaGBaGAaGCaGCaGLaGJaDCaDCaJwaDCaIdaIeaIfaIgaGFaJBaGFaIiaIjaJHaKjbinaKlaIoaIpaIqaKHaIsbjFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaIwaFlaFlaDKaFlaFMaFlaFMaIxaFMaIyaFMaFlaGMaGNaGOaDPaFFaIAaIAaKMaICaKPaICaIAaIAaIEaIFaFCaGQaFHaGWaHkaFCaCDaILaIMaFLaFLaHRaFLaIOaIPaCDaCMaaaaBYaBYaIQaHSaIQaBYaBYaaaazJazOazPbdzaITaIUaFTaIVazPaIWaIXayLaIYazTbdtaEwaCfaJaaEyaATaJbaJcazTaJdaJeaJfaJgaJhaMbaKVaCuaCuaCuaCuaCuaHUaHTaJlaJmaJnaBjaJoaBjaJpaBjaJqaBjaJraGpaKXaJtaGsaGsaDqaJvaDsaDsaKYaDsaDsaJxaDsaGsaJyaGsaGsaGsaJzaHZaHXaHWaIaaLcaIraIbaIbaIbaIRaINaIgaJIaJJaLdaJkaJMaJNaIgaJOaJPaGFaJQaJAaJSaJTbinaJUaIoaJVaLeaGGaGGaGGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaFraJXaFyaGKaFlaFMaFlaFMaFlaFMaFlaFMaFlaGMaGNaGOaDPaGYaGXaHaaGZaHbaHbaIBaLiaIHaIGaIJaLkaJZaJYaJGaKaaFCaCDaKmaKnaKoaCHaCDaKqaKraKsaKtaKuaaaaafaaaaKvaKwaKvaaaaafaaaaKuazOazPaCtaKyaKzaKAaKBazPaKCaKDayLaKEazTaARaKFaKGaHrazTaLmaKIaKJaKKaKLaJeaEDaKNaKOaLYaEEaKRaaaaaaaJlaKSaJKaMcaJlaJLaJnaJnaJnaKWaJnaJnaJnaBjaDpaMvaDpaDpaDpaDpaMwaDpaKZaLaaLbaMEaMVaMFaLfaLgaLhaLfaLfaLfaLfaLfaMXaLfaLfaLfaLfaLfaLfaLfaLfaJRaIgaLjaJWaLlaEFaKbaLoaIgaLpaKTaGFaLraLsaLtaJTbkuaJUaIoaJVaIoaKUaCiaLxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaIwaFlaFlaDKaFlaFMaFlaFMaIxaFMaIyaFMaFlaGMaGNaGOaDPaFFaIAaIAaKMaICaKPaICaIAaIAaIEaIFaFCaGQaFHaGWaHkaFCaCDaILaIMaFLaFLaHRaFLaIOaIPaCDaCMaaaaBYaBYaIQaHSaIQaBYaBYaaaazJazOazPbdzaITaIUaFTaFTbxxaIWaIXayLaIYazTbdtaEwaCfaJaaEyaATaJbaJcazTaJdaJeaJfaJgaJhaMbaKVaCuaCuaCuaCuaCuaHUaHTaJlaJmaJnaBjaJoaBjaJpaBjaJqaBjaJraGpaKXaJtaGsaGsaDqaJvaDsaDsaKYaDsaDsaJxaDsaGsaJyaGsaGsaGsaJzaHZaHXaHWaIaaLcaIraIbaIbaIbaIRaINaIgaJIaJJaLdaJkaJMaJNaIgaJOaJPaGFaJQaJAaJSaJTbinaJUaIoaJVaLeaGGaGGaGGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaFraJXaFyaGKaFlaFMaFlaFMaFlaFMaFlaFMaFlaGMaGNaGOaDPaGYaGXaHaaGZaHbaHbaIBaLiaIHaIGaIJaLkaJZaJYaJGaKaaFCaCDaKmaKnaKoaCHaCDaKqaKraKsaKtaKuaaaaafaaaaKvaKwaKvaaaaafaaaaKuazOazPavTaKyaKzaKAaKBazPaKCaKDayLaKEazTaARaKFaKGaHrazTaLmaKIaKJaKKaKLaJeaEDaKNaKOaLYaEEaKRaaaaaaaJlaKSaJKaMcaJlaJLaJnaJnaJnaKWaJnaJnaJnaBjaDpaMvaDpaDpaDpaDpaMwaDpaKZaLaaLbaMEaMVaMFaLfaLgaLhaLfaLfaLfaLfaLfaMXaLfaLfaLfaLfaLfaLfaLfaLfaJRaIgaLjaJWaLlaEFaKbaLoaIgaLpaKTaGFaLraLsaLtaJTbkuaJUaIoaJVaIoaKUaCiaLxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaLyaLzaDJaFkawiaFlaFlaFqaFlaFlaFnaFlawnaFraLCaLDaDPaLEaLFaLGaLHaLGaLGaLGaLGaLGaLIaLJaFCaFCaFCaFCaFCaFCaLLaLMaLNaLOaLOaLOaLOaLPaLQaLRaKuaLSaLTaLTaLUaLVaLWaLTaLTaLXaKuaNAaKuaKuaLZaMaaLZaJeaJeaMbaNGaJeaJeaJeaJeaMdaMeaBwaBQaMhaMiaJeaJeaJeaJeaMjaKNaMkaMkaMlaMmaMnaMoaJlaMpaLqaLnaJlaJlaJlaJlaJlaJlaJlaJlaBjaBjaMsaMtaMuaOiaOoaLvaMyaMfaKZaMAaMBaMCaMCaMDaLfaOpaOqaMGaMHaMIaMJaMKaMLaMMaMNaMHaMJaMIaMHaMOaLfaJRaIgaMPaMgaMRaMSaMqaMUaIgaOsaMWaOCaMYaMraNaaNbaGFaGGaOHaJVaIoaMxaAraNfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaaaLyaDJaDKaDJaDJaDLaDMaDJaDJaDKaLzaNgaBIaNhaLEaNiaMzaMzaNkaMzaNlaIAaNmaNnaLJaNoaNpaNqaNraNsaNtaNraNuaNraNraNraNvaNraNraNwaNxaNyaNzaNzaNBaOMaNCaNzaNzaNzaNzaNDaNEaNFaQcaNraNHaNIaNJaNKaNLaNMaNLaNNaNOaQdaNQaNQaNRaNSaNTaNSaNUaNVaNWaEGaNYaNZaOaaObaOcaMkaMkaMkaOdaOeaMTaMQaOhaQxaOjaOkaOlaOmaOnaJlaQAaQyaQEaOraOtaOtaOuaMZaOwaNdaKZaOyaOzaOAaOAaOBaLfaQJaODaOEaOEaOEaOEaOFaOGaQTaOIaOJaOKaOKaOLaRbaLfaJRaIgaONaOOaNjaOfaONaONaIgaORaOSaGFaOTaOUaOVaOWaGFaIoaIoaJVaIoaGGaGGaGGaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOXaOYaOZaPaaPaaPaaPaaPbaOYaOXaaaaBIaPcaPdaPeaOvaOgaPhaPhaOxaIAaPjaNnaPkaPlaPmaPnaPoaPpaPqaPqaPraPsaPsaPsaPtaPuaPuaPvaPwaNIaPqaPqaPxaPyaPzaPAaPBaPBaPCaPBaPDaPyaPyaPyaPEaPFaPGaPHaMkaPIaPJaPJaPJaPJaPJaPJaPJaPJaPKaPJaPLaPMaPNaPOaPPaPQaPRaPSaPTaPJaPUaPJaPVaPWaPXaPWaPWaPWaPWaPWaPWaPYaPZaRsaQbaQbaQbaRraQbaQbaRxaQeaQfaQgaKZaQhaMCaQiaQjaQkaLfaCJaQmaQnaQnaQnaQnaQnaQoaQpaOPaQraQnaQnaQsaQtaLfaJRaIgaQuaONaONaQvaONaQwaIgaGFaGFaGFaGFaGFaGFaSoaGFaIoaIoaJVaIoaStaOQaGGaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaafaBIawqaBIaQBaQCaGOaQDaSuaQFaQGaGOaQCaQHaQIaBIaSyaLEaPeaPfaQLaPhaPhaOxaIAaQMaNnaLJaQNaNpaQOaQPaNraNraQQaQRaQSaSEaNraQUaQVaQWaQVaQXaQYaQVaQVaQZaQVaQVaRaaSHaQVaRcaQVaRdaNraNraNraReaPFaPGaPHaMkaRfaMkaRgaRgaRgaRgaRgaRgaRgaRgaRhaRiaRgaRjaRgaRgaRkaRgaRgaRgaRgaRlaRmaRnaRoaRoaRoaRoaRoaRoaRoaRpaRqaRpaJlaImawOawOawOawOawOaItaRuaRvaRwaKZaKZaKZaKZaKZaSIaLfawcaQmaQnaRzaRAaRBaPgaRDaREaRFaQraRGaRHaRIaRJaLfaJRaIgaRKaRKaRLaRMaRNaRNaROaIgaRPaRQaRRaGGaRSaRTaRUaRVaRVaRWaRXaGGaRYaGGaRZaRZaRZaSaaSbaScaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaGeaGgaGgaGiaSUaGhaSdaOYaLDaDPaHxaHxaSfaLDaOYaLDaHyaHAaHzaLEaSkaPiaPiaNkaPiaNlaIAaSmaNnaSnaIAaLKaLKaSZaLKaLKaLKaLKaLKaLKaSpaSqaLKaLKaLKaLKaLKaLKaSraSsaSraLKaTPaLKaNraQPawbauoaSwaSxaNraReaUlaMbaMbaMkaSzaKOaSAaMnaMnaSBaSBaSBaSBaSCaJeasfasNarVarXarXavParXarXarVasNawFaJeaSJaSKaSKaSKaSKaSLaSLaSMaSNaRqaRpaJlaQqaQaaQaaQaaQaaQaaQaaSQaSRaSSaSTaUOaSVaSWaSXaSYaKZaKZaVeaTaaTbaTcaTdaTeaTeaTeaTfaTgaTfaTeaTeaTeaTeaJRaIgaThaONaRLaRMaONaONaTiaIgaTjaQzaTlaGGaIoaTmaTnaToaTpaTqaIoaTraQKaGGaTtaTuaRZaTvaTwaTxaafaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaVfaVraVkaVIazkaSgaSeaSiaShaSjaSiaTzaTyaTBaTAaTEaTCaTAaTFcozaTIaTJaTKaTLaTLaTLaTMaTLaTNaTOaIAaVLaTQaTRaTSaTTaTUaTVaTWaTXaTUaTYaTZaUaaUbaUcaUdaUeazBaUgaUhaUeaUiaLKaLKaWoaLKaLKaLKaLKaUkaWwaLKaUmaMbaUnaSzaKOaUoaaaaaaaaaaaaaaaaaaaaaaUpaUqaUraUsaUtaUvaUuaUxaUwaUzaUyaVUaUpaaaaaaaaaaaaaaaaaaaaaaUAaSNaRqaUBaUCaUDaUEaUFaUFaUFaUFaUGaUHaUIaUFaUFaUFaUJaUKaULaUMaUNaWFaUPaUQayOaySaUTaTfaUUaUVaRCaUXaUYaUZaVaaVbaTeaJRaIgaVcaVcaRLaRMaVdaVdaWKaIgaIgaXlaIgaGGaVgaVhaViaViaViaVjaXnaGGaGGaGGaVlaVmaVnaVoaVpaVqaafaafaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDawdcmVaXzaXCaDPaVsaVsaVtaVsaVsaVsaVDaVsaVsaVtaVsaVsaYEaWYaVuaVvaKdaKdaKdaKdaKdaVwaVxaVyaXGaIAaTQaTQaVAaTSaVBaTUaTUaTUaTUaTUaTYaVCaTUaTUaTUaUdaUeawgaVEaVFaUeaUiaVGaVHaKeaKcaVKaUmaXIaVMaVNaVOaxwaVQaMkaSzaKOaUoaaaaaaaaaaaaaUpaUpaUpaUpaVRaSlaVTaXEaVVaSDaVXaXFaVZaSOaWbaUpaUpaUpaUpaaaaaaaaaaaaaUAaSNaRqaRpaWcaSSaSPaWeaTkaSSaTsaUWaWiaVSaWkaVWaWmaWnaQbaXNaWpaWqaWraWsaWtaWtaWuaWvaXXaWaaWyaWdaWAaWBaWCaWDaWEaTeaJRaIgaThaONaRLaRMaONaONaONaYqaWGaONaWHaGGaWIaWJaToaToaToaTqaIoaYsaGGaWfaVoaLuaWQaVoaWRaWSaWTaWTaWUaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTGaGgaTHaGiaBIaBIaBIaWVaWWaWWaWWaWWaWWaWWaWWaWXaBIaBLcpSaWZaIAaXcaXbaXbaXbaYraXdaIAaIAaIAaIAaTQaXeaXfaTSaXgaTUaTUaWgaNXaHIaQlaWgaTUaTUaTUaYwaUeaRyaUfaSvaUeaUiaVGaXpaKfaXraXsaUmaXtaxwaURaXvaUjaXxaMkaSzaKOaMmaSCaMbaXyaUpaUpaVYaXAaYyaYAaXDaXDaXEaXFaYMaXEaXFaXDaXDaXHaYVaXJaXBaUpaUpaXyaJlaXLaXMaSNaRqaRpaJlaZgaSPaXOaTkaSSaXPaXQaSSaWhaXSaTkaSSaXTaOtaXUaXVaUQaXkaXiaXjaVPaYaaYbaYcaYdaYeaWjaYgaWBaYhaWDaYiaTeaJRaIgaYjaYjaRLaRMaWlaONaONaYlaONaWzaWxaGGaIoaXRaXhaToaYfaYkaZXaWLbaOaYmaWOaZcaVoaYvaUSbaBbanaYzaVzaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaafaYCaYDcpKaYFaWPaEfaEfaYIaKpaKQaYLbaPaKxaYOaYPaYQaYRaYSaTSaYTaTUaTUaWgaHIaIKaISaWgaTUaTUaYWaUdaUeaUeaUeaUeaUeaUiaVGaVGaVGaVGaVGaUmaYYaXvaYZaXvaXvaXxaMkaSzaKOaNSaNSaZaaZbaWNaUpaZdaYnaZfbaTbaSbaVbaUbaXbaWbaZbaYbbbbbabbcaZfaYoaZjaUpaWMaZbaZlaZmbbeaSNaRqaRpaWcaSSaSSaSSaSSaSSaXPaZoaSSaWhaZpaTkaSSaXTaOtaZqaXVaUQaNcaNeaNPaLwaYaaYpaZwaYdaYeaWjaYgaWBaYhaZxaZyaZzbbfaZzaZzaZzaZBaZCaZDaYtaOOaZFaZGaZHaZIaGGaZJaYXaYGaToaZeaYGaIoaIoaXaaZiaVoaYuaVoaZNaZOaZPaZQaWTaZRaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaZSaZTaZUbjnaZWaSFaXwaZkbaaaZvaXWbadbaeaXYaYObagbahbaibajaTSbakbalbambbhbaobapbaqbarbarbarbasbataTSbaubavbawbaxaKgbajbnZaKhbajbkZaUmbaDbaEbaFbaGbaHbaIaMkbaJbaKaMkbaLbaMbbDbcybbPbbLbaRbaQbbQaUpaUpaUpaUpaUpbcDaUpaUpaUpbbRbaQbbdbbSbbWbeobcabbibbjbbkbblbbmbbnaJlaUDaSPbboaTkaSSaZAaZEbbraZKaXOaTkaSSaXTbbtaULaXVbbubbvbbwaUQaUQaYaaXZbbybbzbbAbbBaYgaWBbbCaWDbcuaZzaZLbbFbbFbbGbbHbbIaRLaRLaRLaRLaRLaRLaRLaGGbbJaXRaXhaToaYfaXhaIobbKaGGbcBaVoaYuaVoaZNbbMbbNbbOaafaafaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOXaOYaOZaPaaPaaPaaPaaPbaOYaOXaaaaBIaPcaPdaPeaOvaOgaPhaPhaOxaIAaPjaNnaPkaPlaPmaPnaPoaPpaPqaPqaPraPsaPsaPsaPtaPuaPuaPvaPwaNIaPqaPqaPxaPyaPzaPAaPBaPBaPCaPBaPDaPyaPyaPyaPEaPFaPGaPHaMkaPIaPJaPJaPJaPJaPJaPJaPJaPJaPKaPJaPLaPMaPNaPOaPPaPQaPRaPSaPTaPJaPUaPJaPVaPWaPXaPWaPWaPWaPWaPWaPWaPYaPZaRsaQbaQbaQbaRraQbaQbaRxaQeaQfaDyaKZaQhaMCaQiaQjaQkaLfaEcaQmaQnaQnaQnaQnaQnaQoaQpaOPaQraQnaQnaQsaQtaLfaJRaIgaQuaONaONaQvaONaQwaIgaGFaGFaGFaGFaGFaGFaSoaGFaIoaIoaJVaIoaStaOQaGGaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaafaBIawqaBIaQBaQCaGOaQDaSuaQFaQGaGOaQCaQHaQIaBIaSyaLEaPeaPfaQLaPhaPhaOxaIAaQMaNnaLJaQNaNpaQOaQPaNraNraQQaQRaQSaSEaNraQUaQVaQWaQVaQXaQYaQVaQVaQZaQVaQVaRaaSHaQVaRcaQVaRdaNraNraNraReaPFaPGaPHaMkaRfaMkaRgaRgaRgaRgaRgaRgaRgaRgaRhaRiaRgaRjaRgaRgaRkaRgaRgaRgaRgaRlaRmaRnaRoaRoaRoaRoaRoaRoaRoaRpaRqaRpaJlaImawOawOawOawOawOaItaRuaRvaRwaKZaKZaKZaKZaKZaSIaLfaEdaQmaQnaRzaRAaRBaPgaRDaREaRFaQraRGaRHaRIaRJaLfaJRaIgaRKaRKaRLaRMaRNaRNaROaIgaRPaRQaRRaGGaRSaRTaRUaRVaRVaRWaRXaGGaRYaGGaRZaRZaRZaSaaSbaScaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaGeaGgaGgaGiaSUaGhaSdaOYaLDaDPaHxaHxaSfaLDaOYaLDaHyaHAaHzaLEaSkaPiaPiaNkaPiaNlaIAaSmaNnaSnaIAaLKaLKaSZaLKaLKaLKaLKaLKaLKaSpaSqaLKaLKaLKaLKaLKaLKaSraSsaSraLKaTPaLKaNraQPawbauoaSwaSxaNraReaUlaMbaMbaMkaSzaKOaSAaMnaMnaSBaSBaSBaSBaSCaJeasfasNarVarXarXavParXarXarVasNawFaJeaSJaSKaSKaSKaSKaSLaSLaSMaSNaRqaRpaJlaECaEfaEfaEfaEfaEfaEfaSQaSRaSSaSTaUOaHIaSWaSXaSYaKZaKZaVeaTaaTbaTcaTdaTeaTeaTeaTfaTgaTfaTeaTeaTeaTeaJRaIgaThaONaRLaRMaONaONaTiaIgaTjaQzaTlaGGaIoaTmaTnaToaTpaTqaIoaTraQKaGGaTtaTuaRZaTvaTwaTxaafaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaVfaVraVkaVIazkaSgaSeaSiaShaSjaSiaTzaTyaTBaTAaTEaTCaTAaTFcozaTIaTJaTKaTLaTLaTLaTMaTLaTNaTOaIAaIKaTQaTRaTSaTTaTUaTVaTWaTXaTUaTYaTZaUaaUbaUcaUdaUeazBaUgaUhaUeaUiaLKaLKaWoaLKaLKaLKaLKaUkaWwaLKaUmaMbaUnaSzaKOaUoaaaaaaaaaaaaaaaaaaaaaaUpaUqaUraUsaUtaUvaUuaUxaUwaUzaUyaVUaUpaaaaaaaaaaaaaaaaaaaaaaUAaSNaRqaUBaUCaUDaUEaUFaUFaUFaUFaUGaUHaUIaUFaUFaUFaISaUKaULaUMaUNaWFaUPaUQayOaySaUTaTfaUUaKpaKQaUXaUYaUZaVaaVbaTeaJRaIgaVcaVcaRLaRMaVdaVdaWKaIgaIgaXlaIgaGGaVgaVhaViaViaViaVjaXnaGGaGGaGGaVlaVmaVnaVoaVpaVqaafaafaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDawdcmVaXzaXCaDPaVsaVsaVtaVsaVsaVsaVDaVsaVsaVtaVsaVsaYEaWYaVuaVvaKdaKdaKdaKdaKdaVwaVxaVyaXGaIAaTQaTQaVAaTSaVBaTUaTUaTUaTUaTUaTYaVCaTUaTUaTUaUdaUeawgaVEaVFaUeaUiaVGaVHaKeaKcaVKaUmaXIaVMaVNaVOaxwaVQaMkaSzaKOaUoaaaaaaaaaaaaaUpaUpaUpaUpaVRaSlaVTaXEaVVaSDaVXaXFaVZaSOaWbaUpaUpaUpaUpaaaaaaaaaaaaaUAaSNaRqaRpaWcaSSaSPaWeaTkaSSaTsaUWaWiaVSaLwaVWaWmaNcaQbaXNaWpaWqaWraWsaWtaWtaWuaWvaXXaWaaNeaNPaWAaWBaWCaWDaWEaTeaJRaIgaThaONaRLaRMaONaONaONaYqaWGaONaWHaGGaWIaWJaToaToaToaTqaIoaYsaGGaWfaVoaLuaWQaVoaWRaWSaWTaWTaWUaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTGaGgaTHaGiaBIaBIaBIaWVaWWaWWaWWaWWaWWaWWaWWaWXaBIaBLcpSaWZaIAaXcaXbaXbaXbaYraXdaIAaIAaIAaIAaTQaXeaXfaTSaXgaTUaTUaWgaQaaNXaQgaWgaTUaTUaTUaYwaUeaRyaUfaSvaUeaUiaVGaXpaKfaXraXsaUmaXtaxwaURaXvaUjaXxaMkaSzaKOaMmaSCaMbaXyaUpaUpaVYaXAaYyaYAaXDaXDaXEaXFaYMaXEaXFaXDaXDaXHaYVaXJaXBaUpaUpaXyaJlaXLaXMaSNaRqaRpaJlaZgaSPaQlaTkaSSaXPaXQaSSaWhaXSaTkaSSaQqaOtaXUaXVaUQaRCaUJaSVaUVaYaaYbaYcaYdaKpaVLaYgaWBaYhaWDaYiaTeaJRaIgaYjaYjaRLaRMaWlaONaONaYlaONaWzaWxaGGaIoaWdaVPaToaWjaWkaZXaWLbaOaYmaWOaZcaVoaYvaUSbaBbanaYzaVzaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaafaYCaYDcpKaYFaWPaWnaWnaYIaWyaXhaYLbaPaKxaYOaYPaYQaYRaYSaTSaYTaTUaTUaWgaNXaXiaXjaWgaTUaTUaYWaUdaUeaUeaUeaUeaUeaUiaVGaVGaVGaVGaVGaUmaYYaXvaYZaXvaXvaXxaMkaSzaKOaNSaNSaZaaZbaWNaUpaZdaYnaZfbaTbaSbaVbaUbaXbaWbaZbaYbbbbbabbcaZfaYoaZjaUpaWMaZbaZlaZmbbeaSNaRqaRpaWcaSSaSSaSSaSSaSSaXPaZoaSSaWhaZpaTkaSSaQqaOtaZqaXVaUQaXkaXOaXwaXRaYaaYpaZwaYdaKpaVLaYgaWBaYhaZxaZyaZzbbfaZzaZzaZzaZBaZCaZDaYtaOOaZFaZGaZHaZIaGGaZJaXWaXTaToaYeaXTaIoaIoaXaaZiaVoaYuaVoaZNaZOaZPaZQaWTaZRaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaZSaZTaZUbjnaZWaSFaWnaZkbaaaZvaYfbadbaeaXYaYObagbahbaibajaTSbakbalbambbhbaobapbaqbarbarbarbasbataTSbaubavbawbaxaKgbajbnZaKhbajbkZaUmbaDbaEbaFbaGbaHbaIaMkbaJbaKaMkbaLbaMbbDbcybbPbbLbaRbaQbbQaUpaUpaUpaUpaUpbcDaUpaUpaUpbbRbaQbbdbbSbbWbeobcabbibbjbbkbblbbmbbnaJlaUDaSPbboaTkaSSaZAaZEbbraZKaQlaTkaSSaQqaYkaULaXVbbubbvbbwaUQaUQaYaaXZbbyaYKaYGbbBaYgaWBbbCaWDbcuaZzaZLbbFbbFbbGbbHbbIaRLaRLaRLaRLaRLaRLaRLaGGbbJaWdaVPaToaWjaVPaIobbKaGGbcBaVoaYuaVoaZNbbMbbNbbOaafaafaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaXubcFbcZaXmbbUaSFbaabaabaabaabaabbVbaaaXoaYObbXbbYbaibbZbbZbbZbbZbdKbbZbcbaTUbccbcdbcebcebcfbcgaTSaXebchbcibcjaKibdQblcaKkbcobcobcpbcpbcpbcpbcpbcqaMbbcrbcsbctbeabcvbcwbcxbbgaUpbczbcAbeeaUpaUpaaaaaaaafaafbekaaaaaaaUpaUpbezbcGbczaUpbbgbcxbcHbcIbcJbcKbcLaRpaWcaSSaSSaSSaSSaSSaGpbcMaSSbcNaSSbcObcObcObcObeBbcQbcRbcSaUQaUQaUQbeMbcUaTeaZMbcWbcXaYgaWBaYhaWDbcYaZzaZZbdabdbbdcbddbdebddbddbddbddbddbdfbdgbdhbdibdjbdkbdlbdmbdnbdobdpbdqbdraVoaYubdsaZNaVobeNbbOaafaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBbdubdvaZUbdwbdxaSFaEfbabbaaaZvaDobbVbaabdAaYObbpbdCbaibbZbdDbdEbdFbdGbbZaEgbdIbdJaTSbeRbdLbdMbdNaTSaXebdObdPbdPbeVbdPbdPbdPbdPbdRbdSbdSbdSbdTbdSbdUaMbbdVbdWbdXbdYbdYbdYbdYbdYbdYbdZbeWbdZbdYbebbebbebbebbebbecbebbebbebbedbedbfobedaUpaUpaUpaJiaJiaJibcKbcLaRpaJlbefbegaDmbehaSSbeibcMbejbfqbelbcObcObembenaZzaZzaZzbfwaSGaSGaSGaZzaZzaZzbeqberbesbetaWBaYhaYhbeuaZzbevbewbbqaZzbeybbsbeAaYtbfxbbEbeDbcmaONaGGaIobeFbeGbeHbeFbeIaIoaIoaGGbeJaVoaYuaVoaZNbeKbeLbbOaafaafaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaafbeObePbeQbfWaRtaEfaEdbeUaEcaDobbVbgNbgMaYObeXbeYbaibbZbbZbbZbeZbfabbZbfbbdIbfcaTSbeRbdLbdMbfdaTSaXebdObdPbfebffbfgbfgbfhbdPbfibcVbfkbflbfmbfmbfmaMbaMkbcsbctbdYbfnbgUbfpbgWbfrbfsbftbfubdYbebbfvbgXbfvbhebhCbfvbdybebbedbfCbfDbfEbfFbfGbfHbfIbfJaJibfKbfLbfMaJlaZzaZzaZzaZzbfNbfObfPbfQaZzaZzbfRaZzaZzaZzaZzbfSbfTbfUbfVbfVbfVbhJbfXaZzbfYbfZbgabgbbgcbgcbgcbgdaZzbevbewbdBaZzaZzaZzaZzaZzaZzaZzaZzaZzaZzaZzbgfbggbghbgibgjbgfbggaZzaRZbgkaVoaYuaVoaZNaZObglbgmaWTaZRaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaabgnbgobgpbgqaZUbgrbgrbgrbgrbgrbgrbgsbgtbgraYOaYOaYOaYOaYObhKaYOaYOaYObgvbgvbgwbbZbdDbgxbeZbgybbZbgzbgAbgzaTSbeRbdLbdMbfdaTSaXebdObdPbgBbgCbgDbfgbgDbdPbfibgEbgFbgGaFIaFGaFhaMbbgKbgLbctbhLbivbgObgPbexbexbgRbgSbgTbdYbebbmIbgVbhRbhNbfzbgYbhSbebbedbhabhbbhcbeCbhTbeEbhgbhhaJibhibhjaRpbhkbhlbhmbewbewbhnbewbhobewbewbewbewbhpbewbewbewbewbhqbewbewbewbewbewbewbhmbewbewbhrbhsbhsbhtbhsbhsbhubhvbewbhqbhwbhxbhpbewbhybewbewbewbhzbhAbhBbhUbewbhDbewbhEbewbewbhFbhGbhHaVoaYuaVobhIaHdbhXbhWbhMaHcaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBbdubdvaZUbdwbdxaSFaWnbabbaaaZvaYXbbVbaabdAaYObbpbdCbaibbZbdDbdEbdFbdGbbZaEgbdIbdJaTSbeRbdLbdMbdNaTSaXebdObdPbdPbeVbdPbdPbdPbdPbdRbdSbdSbdSbdTbdSbdUaMbbdVbdWbdXbdYbdYbdYbdYbdYbdYbdZbeWbdZbdYbebbebbebbebbebbecbebbebbebbedbedbfobedaUpaUpaUpaJiaJiaJibcKbcLaRpaJlbefbegaDmbehaSSbeibcMbejbfqbelbcObcObembenaZzaZzaZzbfwaSGaSGaSGaZzaZzaZzbeqberbesbetaWBaYhaYhbeuaZzbevbewbbqaZzbeybbsbeAaYtbfxbbEbeDbcmaONaGGaIobeFbeGbeHbeFbeIaIoaIoaGGbeJaVoaYuaVoaZNbeKbeLbbOaafaafaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaafbeObePbeQbfWaRtaWnaZebeUbbtaYXbbVbgNbgMaYObeXbeYbaibbZbbZbbZbeZbfabbZbfbbdIbfcaTSbeRbdLbdMbfdaTSaXebdObdPbbzbffbfgbfgbfhbdPbfibcVbfkbflbfmbfmbfmaMbaMkbcsbctbdYbfnbgUbfpbgWbfrbfsbftbfubdYbebbfvbgXbfvbhebhCbfvbdybebbedbfCbfDbfEbfFbfGbfHbfIbfJaJibfKbfLbfMaJlaZzaZzaZzaZzbfNbfObfPbfQaZzaZzbfRaZzaZzaZzaZzbfSbfTbfUbfVbfVbfVbhJbfXaZzbfYbfZbgabgbbgcbgcbgcbgdaZzbevbewbdBaZzaZzaZzaZzaZzaZzaZzaZzaZzaZzaZzbgfbggbghbgibgjbgfbggaZzaRZbgkaVoaYuaVoaZNaZObglbgmaWTaZRaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaabgnbgobgpbgqaZUbgrbgrbgrbgrbgrbgrbgsbgtbgraYOaYOaYOaYOaYObhKaYOaYOaYObgvbgvbgwbbZbdDbgxbeZbgybbZbgzbgAbgzaTSbeRbdLbdMbfdaTSaXebdObdPbgBbgCaCtbfgbgDbdPbfibgEbgFbgGaFIaFGaFhaMbbgKbgLbctbhLbivbgObgPbexbexbgRbgSbgTbdYbebbmIbgVbhRbhNbfzbgYbhSbebbedbhabhbbhcbeCbhTbeEbhgbhhaJibhibhjaRpbhkbhlbhmbewbewbhnbewbhobewbewbewbewbhpbewbewbewbewbhqbewbewbewbewbewbewbhmbewbewbhrbhsbhsbhtbhsbhsbhubhvbewbhqbhwbhxbhpbewbhybewbewbewbhzbhAbhBbhUbewbhDbewbhEbewbewbhFbhGbhHaVoaYuaVobhIaHdbhXbhWbhMaHcaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhOaaaaafbhPaYDbhQbitbiqbjubjqbjwbjvbjubjBbjGbjCbjObhYbhZbgwbbZbbZbbZbiabfabbZaTSaTSaTSaTSbeRbibbicbjQaTSbiebifbdPbigbihbiibgDbijbdPbfibikbgFbgGbgGbgGaEhaMbbimaSzbctbjVbiobipbfjbirbisbfBbiubjMbdYbebbiwbixbiybjYbiybgYbgebebbedbiAbiBbiCbgQbiEbgZbiGbiHaJibiIbiJbiKbiLbiMbiNbiObiObiPbiQbiRbiSbiSbiSbiTbiSbiSbiSbiSbiSbiUbiVbiVbiVbiWbiObiObiNbiObiObiXbiVbiVbiYbiSbiZbjabjbbiSbjcbiObiObiObiObiObiObiObiObiObiObiObiObiObjdbiTbjebiSbjfbjgbjhbjibjibjjbjkaZNaWRbjlaWTaWTaWUaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhObhOaZSaZTbjmbjnbjobgrbjpbjpbjZbjpbjpbjpbjrbajbajbajbajbaibbZbdDbjsbjtbgybbZbkZbkZbkZaTSaTSaTSaTSbkkaTSbjxbdObdPbjybjzbgDbjAbkxbdPbkAbfmbkHbgGbgGbgGbjDaMbbjEaSzbctbkKbkLbgObhdbjIbjJbhfbjLblybdYbjNbkMbjPbiybkNbiybgVbkPbjSbedbjTbjUbizbjWbjWbjWbjXbkVaJibkXbkabkbbkcbkdbkebbFbkfbkgbkhbkibkjbkYbklbkmbknbknbkobewbewbewbewbewbkpbkqbkrbewbksbktcsfbkvbewbkpbkwcLYbkybhFbewbewbkzbewbewbllbkBbewbkpbewbewbewbewbewbewbewbewbewbhqbewbewbhFbkCbkDbkEbkFbkGblmbkIbkJaafaaaaafaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhObhObQDblrblEbQLbkObgrblTbkQbkRbkRbkSbkTbkUbmdbmlbmlbmAbmxbbZbbZbbZbeZbmBbbZbajbajbajbajblaaXeaXeblbblcbldbleblfblgblhblibljblkbdPbmEbfmbmFbgGblnbgGbloblpblqaSzbctbdYbmHblsbltblublvblwblxbdYbdYbebblzblAbmUbmNblDblAbiDbebbedbedblFblGblHblIbiCblJblKaJiblLblMblNaJiblOblOblOblOblOblOaZzaZzblPblQbZNcdMblQblPaZzaZzaZzaZzaZzaZzaZzaZzaZzaZzbmVaZzaZzaZzaZzaZzaZzbmXaZzbewbewblVblWbiFblOblOblOblOblOblXblYblYblZblYbewblYblZbmablYbmbblObmcbmcbmcbnbaRZbmeaRZaRZaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhObhObdubdvbjmbjnbmfbgrbmgbjpbmhbmibjpbjpbjpbnsbmjbmkbmkbnwbbZbdDbmmbeZbmnbbZbmobmpbmqbmrbmsbmtbmtbmubmtbmtbmvbdPbmwbnNbfgbmybmzblfbnRbnPbnSbgGbgGbjHbmDbnUblqaSzbnVbmGbmGbmGbmGbmGbmGbmGbnWbmGaafbebbmIbmJbmKbmLbmKbmMbjKbebaafbedbmObnXbmQbmRbiCbiGbmSaJibcKaRqaRpaJibmTbohboibmWbojbmYbmZbPMbolbjRbndbnebjRbopbmCbnhbnibnjbmPboKbnmbnnbPLbnpbnqbnrboWbntbntbnubYfaVJblOblObpmblObZMbZMblObnzbPKbnBblObZtbpobZtblOblXblYbmbblObZnbprbZnblObnGbPJbnIbnJbnKbnLbnMaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhOaaaaaabnObpwbeQbnQbgrbpLbpBbpMbnTbpPbpNbjpbpSbpTbnYbnZbnwbbZbbZbbZbbZbbZbbZboabobbocbodboebdPbdPbdPbdPbdPbdPbdPbWqbdPbdPbdPbogbdPbfmbqcbnSbgGbgGbgGbokblpblqaSzbqgbmGbombonbncbOIbvGbotbosbotaafbebboubovbowboxboybozbnfbebaafbedboBboCboDboEbiCbiGboFaJiboGboHaRpbXHboJbngboLboMbnkbPZboPboQboRboRboSboTboUboUboVbnlboXboYboZbpabpbbnnbPGbpdbpebpfbpgbphbpfbpibYfaVJbpjbpkbplbOJbpnbnybppbnCbnDbpqbqxbptboobqyblOaZzbqBbpxblObPeboqbPEbqGbpCbpDbnIbpEbpFbpGbnMaaaaaaaaaaacaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaaaaaaaaaaaabgnbgobgpbgqbdvbpHbpHbpHbpIbpHbpJaZVbpKbqKbgrbqQbjpbrkbrcbpQbpRbrvbrubrwbrwbrwbrxbkWbpUbkWbkWbkWbkWbpVbpWbpWbpXbpYbdPcfycfocfzbrybqdbqebqfbrCbqhbqibqjbqkbqkbrDbrIbgGbgGbqmbfmaMbblqbqnbqoaJubqqbqrbqrbxqborbrPbxsbotaafbebbebbebbebbshbebbebbebbebaafbedbqzboCbqAbsjbqCbqDbqEaJibqFaRqaRpaJibskbqHbqIbqJaJDbqLboPbqNboUboUboUboUboUboUbqObqPbslboYbqRbqSboNbnnbqUbqVbqWbsnbpgbphbpfbqXbYfaVJbpjbqYbqZbqZbrabrbbsobrdbrdbrdbrebrdbrfboObrhbribrjbsqbnIbrlbpCbrmbrnbrobsrbnIbrqbpFbrrbnMaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaabrsbrtbsvbsBcaLbsHbsHbthbrzbrAbgrbtkbtlcaMbtmbjpbjpbjpbajbrEbrFbrGbrHbrGbrGbrGbrHbrGbajbajbdPbdPbdPbtBbdPbrJbrJbrJbrJbrJbrJbqfbrKbrLbrMbrNbrObtIbrQbrRbrSbrTbrUbrVbrWbrXbrYbrZaHBbsbbqvbsabYZcanbotbosbotaafbsibZibtKbtTbsmbtXbtKcaJbsiaafbedbspbuibspbedbedbedbujaJibssaRqaRpbXHboJbngbstbsubuobqLbswbqNcbQcdpcbdcbkceobsCbqObsDbnicevbsFcepcdGbnncdtbqVbpebpfbpgbphbpfbpibYfaVJbpjbsJbsKbsLbsMbplbsNceZbsPbsQbsRbsSbsTbsUbrhbsVbsWbsXbnIbsYbsZbtabtbbtccflbnIbrqbpFbtebnMaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaacaaaaaaaaaaaaaaaaaaaaabrsbtfbtgbuYbtibtibtibtjbtibtibgrbvabuZboAbvjbjpaaaaaaaaaaafaafbtnbtnbtnbtnbtnbtnbtnaaaaaabtobtpbtqbtrbtsbrJbrJbrJbrJbrJbrJbttbtubvqbtwbtxbtybtzbtAbfmbfmbvCbfmbfmbtCbtDbtEbtFbmGbtHbmGbmGbmGbmGbmGbvEbmGaafbtJbvFbtLbtMbtNbtMbtLbvIbtPaafbspbtQbtRbtSbvObtUbspbtVaJlbtWbbmbvZaJibtYbohbtZbuabwcbucbudbuebufbwgbWIbXnbwnbukbulbumbnibnnbunbpubVVbnnbuqburbusbutbuubuubuvbuwbYfaXqbpjbwxbplbplbsMbuybuzbVzbpvbuCbuDbuEbuFbVybrhbuHbuIbuJbnIbuKbuLbuMbtbbpCbVebnIbpEbpFbUAbnMaaaaaaaaaaaacHOaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeObSwbxmbuVbpHbuWbgnbgobuXbuWbgrbxpbjpbxvbvbbjpaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnaaaaaabvcbvdbrJbvebvfbvfbvfbvfbvfbvgbvhbvfbvibxzbvkbvlbvmbSlbSrbfmbvpbgGbxDbpzbvsbvtbvubvvbmGbmGbmGbRcbQMbvzbvAbvBbvwaafbpObRpbvHbvJbvKbvMbvNbRybpOaafbspbqMbvQbxnbedbvRbspbvSaJlbvTbcLbvUaJibvVbvWbvXbTTbxObucbyobxTbyKbwdbwebwebwfbyMcdWcdVbUqbwkbTWbwmbwkbwkbwkbwkbyQbwkbwkaXKaXKaXKaXKaVJbpjbsJbsKbsLbwobwpbwqbwrbwsbwsbwsbsSbwtbTsbwvbwwbyUbwybnIbwzbwAbwBbwCbpCbSEbnIbwEbwFbnMbnMaaaaaaaaaaaaaafbuPbuQbuRbuQbuRbuQbuSaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbwMbwNbwObwPbrJbwQbrJbwRbwRbwRbwSbwTbrKbrJbrJbrLbwUbwVbwWbwXbrpbzcbxabgGbgGbugbxcbvtbvubxdbxebxfbzrbzHbxibxjbxkbxlbvwaafbxrbzNbzJbzObyLbxobzPbzVbxraafbspbqwbAebuBbedbAibspbtVaJlbxwbcLaRpaJibDDbxybAobxAbxBbxCbAtbxEbxCbxFbxGbDIbxFbwkbAxbxJbwkbwkbxKbxLbxMbxNbAAbxPbxQbxRbxSaXKbaybvraXKaVJbpjbxXbqZbqZbxYbxZbppbDQbwsbwsbwsbsSbwtbEFbwwbvDbUabTQbwwbESbFbbEZbyibpCbFybnIbrqbykbnMaaaaaaaaaaaaaaaaafbwGbwHbrgcLebwJbFUbwGaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbAFbypbAFbyqbyrbwQbrJbrJbrJbysbrJbwTbrKbytbdPbdPbyubgGbrNbwXbyvbywbyxbyybyybyzbyAbyBbyCbyDbvsbyEbvPbyGbxkbyHbyIbyJbvwaafbxrbxrbxrbxrbALbxrbxrbxrbxraafbyNbyNbyNbyNbyNbyNbyNbAVaJibyPblMblNaJibCnbyRbyRbySbyTbxCbAXbyVbyWbCobyYbyZbzabwmbzbbBqbzdbzebzfbzgbzgbzhbzibzgbzjbzkbckbaAbwubclbBsbcnbCQbzsbztbzubzvbzwbppbCXbpqbpqbDBbsSbwtbCLbzAbzBbzCbzDbzAbzEbzFbzGbBwbzIbwwbwwbBxbnMbnMbzKbzLbzLbzLbzMbCJbylbymbrgbwJbrgbynbuRaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaacaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbBAbzQbBAbzRbrJbwQbrJbzSbzSbzSbzSbwTbrKbzTbzUbdPbCkbgGbrNbBJbzWbzXbzYbgGblnbgGbzZbAabAbbAcbAdbyEbwIbAfbxkbxkbxkbAgbvwbAhbAhbBKbAhbBRbBQbBSbAjbBUbAjbAjbyNbCcbCdbAmbAnbBXbApbAqaJibAraRqaRpaJibAlbAsbAubAvbAwbBtbAybAzbBabABbACbADbAEbBEbAGbAHbAIbAJbAKbAIbxtbAMbANbAObnvblUbsdbBGbsgbsfbaAbPObpjbxubxUbAYbAZbAZbppbAkbBbbBcbppbBdbBebBfbBgbBhbBibBjbBkbBlbBlbBmbBnbBobTHbCrbBrbCwbCAbTIbBvbCEbCIbCHbCKbwGbwJbrgbwJbwJbBNbwGaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbBCbwNbBDbCYbrJbwQbrJbrJbrJbrJbrJbwTbrKbzTbBFbdPbzzbgGbBHbBIbgGbCZbgFbgGbgGbyjbvsbvtbAbbAcbAdbyEbvwbBLbBMbzybBMbBObvwbDbbDabDdbDcbDfbDebDhbDgbDjbDibBVbyNbBWbzmbBYbBZbCabCabCbbDwbAraRqaRpaJibzxbCebCebySbCfbxCbCgbChbxCbCibCjbCjbyObwkbClbCmbwkbwkbwkbwkbwkbwkbyXbwkbwkbwmbDKaXKaXKaXKaXKbDYbpjbwwbzAbzAbzAbzAbzAbzAbzAbzAbzAbzIbEibCsbCtbBhbCubCvbEjbCxbCxbCxbCybCzbEkbCBbCCbCDbEpbTGbCGbErbCGbEsbEubBzbuQbuRbEwbuRbuQbBBaafaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbBAbzQbBAbCMbCNbCObrJbrJbrJbCNbrJbwTbrKbzTbCPbdPbNzbgGbrNbwXbgGbqlbCRbgGbgGbECbxcbvtbAbbCTbxcbCUbvwbCVbEKbOxbAWbxlbvwbEMbELbERbAhbEUbEUbEUbAjbEWbEVbEXbyNbDkbDlbDlbDmbDnbDobDpaJibDqbDrbDsaJibDtbEYbDvbMpbDxbDybDzbDAbyWbLWbFabCjbMybwmbDEbDFbwmbDGbDHbNsbDJbFobDLbDMbCpbDNbDObBTbNtbDRbCpbVLbVMbDUbVAbDWbDXbDXbFrbDZbEabEbbEcbEdbEebEfbEabEgbEhbCvbFVbFFbGfbwwbwwbwwbwwbwwbGhbGgbEnbzKbzMbCJbEobGibCJbzKbzLbzMbGjbCJbGkaafcHOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbGubExbGubEybEzbEAbEAbEAbEAbEAbEBbGAbEDbzTbEEbdPbKobEGbEHbEIbEJbGDbGCbGWbGEbGvbtCbENbAbbEObEPbyEbvwbEQbHabLHbBMbETbvwbBPbHibHjbAhaaaaaaaaabAjbHmbHlbFcbyNbFdbFebFfbFgbDnbDobFhaJibxwaRqaRpbHMbFjbFkbFlbFmbFnbHNbFpbFqbxCbxFbxFbIZbxFbwkbFsbFtbFubFvbFwbFxbDJbIYbDLbFzbFAbFBbDObFCbFDbFEbHPbVlbDXbHQbVAbFJbDXbDXbFKbFLbFMbFLbFLbFNbFObFPbFQbFRbFSbCvbHRbJrbJabFWbFXbFYbFZbGabGbbGcbGdaafaafbCJbGebHUbHUbHVbIfbHZbIobEvaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbGlbGmbGnbdPbdPbGobwNbwNbwNbGpbdPbdPbGqbGrbGsbdPbGtbGtbGtbITbGtbGvbGwbGxbGybGzbtCbvtbAbbIAbGBbtCbtGbtGbtGbtGbtGbIBbtGbtGbtGbIRbtGbIUbIMbIXbtGbJbbtGbtGbtGbtGbtGbtGbtGaJiaJiaJiaJibxwaRqaRpbHMbJqbFkbCSbGGbCWbGIbGJbGKbGLbGMbGNbCjbGObGPbGQbGRbGSbGTbGUbGVbIDbGXbGYbGZbJDbHbbHcbHdbHecLVbCpbUSbUfbwwbwwbwwbwwbwwbJVbwwbwwbwwbzAbKfbzAbzAbHkbBhbCubCvbHRbIvbKzbHnbHobHpbHqbGabGbbGcbHraaaaaabCJbHsbHtbEobCIbBybKBbKUbCJaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaaaafaaaaaaaaabHuaafaaaaaaaaaaaabGtbIubHwbHxbHybGvbHzbKVbHBbHCbtCbvtbAbbAcbAabHDbHEbHFbHGbHHbHIbHJbHKbHLbLabLxbLnbLzbAabAabLIbMhbLYbAabHTbAabzZbHHbKJbHWbHXbHYbMibxwaRqbDsaJlbDtbDubDtbDCbDPbxCbIbbIcbIdbIebMlbIgbIhbIibIjbIkbwmbIlbImbInbDJbDTbElbIpbIqcLUbFDbIsbItbHObCpbHSbIwbIxbIybUdbLybMqbICbMCbUcbIFbIGbIHbIIbIJbzAbIKbCubCvbMHbMFbINbIObIPbIQbHvbGabGbbISbEnbEnbEnbCJbCJbCJbMSbMPbCJbCJbBybCJaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaabMZaaaaaaaaaaaaaaaaaaaaaaaaaaabGtbuObEmbIVbIWbNdbuNbuGbuAbNfbtCbvtbJcbJdbJebJebJfbJgbJhbJibJjbJgbJfbJebJebNkbJkbJlbNqbJnbJobNBbJebJebJpbJgbJhbJibJjbJsbJtbJubJtbJvbJwbvUaJlbEtbEqbFHbGFbNLbGHbDzbHAbFibDVbxFbNQbCFbDSbDEbJGbwkbJHbJIbJJbDJbJKbJLbJMbJNbJObFDbJPbItbJObCpbJQbJRbIxbJSbJTbJUbNZbJWbObbJYbIFbJZbKabKbbKbbzAbKcbKdbKebOcbKgbKhbKibKjbKjbKkbGabGbbKlbEnbKmbOdbKnbEnaafaafaafaafaafaafaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbKpbKqbKqbKrbKsbKsbKtbKtbKtbKtbKuaafaafaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaaaaaaaabKvbKwbKxbKwbKyaaaaaaaaabGtbGtbOfbKAbIVbKAbOibKCbOnbKDbKEbtCbKFbvtbKGbKHbAabKIbAabzZbHHbKJbAabKKbKLbKMbKNbKObAcbAabKPbKQbHLbKRbHLbHLbKSbKTbODbOtbKWbKXbcLbKYaRpaRpaRpaJlbOEbFlbFnbOFbJmbOGbJybJxbFIbLgbLhbLibLjbHgbDEbIkbIabIzbHhbDJbDJbLobLobLobCpbLpbLqbLrbLsbLtbCpbLubLvbIxbLwbFGbLybOHbLAbLBbLCbIFbJCbLEbKbbKbbzAbRsbLFbCvbwwbLGbuTbuUbLJbLKbLLbGabLMbLNbLObLObLObLPbGdaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafbLQbLRbLSbLRbKsbKtbKtbLTbLUbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLVbsObLXbtdbLVbLZbMabMbbGtbMcbMdbMebMfbMgbOLbOKbMjbMjbMkbtCbtCbtCbOMbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbMmbMnbMobtCbtCbtCbtCbtCbONbtCbtCbtCaJlaJlbOQaJlaKSaMpbMraJlbKZbJXbORbGFbLdbxCbDzbLDbxCbtvbMzbMAbMBbwkbOTbMDbMEbOUbMGbPubMIbMJbMKbMLbItbJObFDbFDbMMbJObCpbMNbMObMObMObMObMObMObMObMObMObMObPvbMQbMRbMRbzAbPAbMTbMUbwwbMVbMVbMVbMWbMXbMYbMVbMVbMVbMVbMVbMVbNabNbaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymbPCbLRbLRbNebKtbKtbLTbLTbPDbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabKxbNgbMsbNgbKxbNibNjbPFbNlbNmbNnbKAbNobNpbGvbPHbNrbubbtObGvbNubNvbNwbNxaaaaaaaaaaaabNybuhbNAbPSbNDbNCbNEbNFbNGbNHbNIbNFbNJbNKbPXbNMbNNbNObNPbqsbNRbNSbNTbNUbNUbNUbNUbDtbDtbDtbDtbMtbMtbxCbQabOabQbbMzbMvbMubOebQcbOgbOhbQdbOjbMxbMwbOmbNhbMKbOobFDbFDbNVbJObJObOobCpbMNbMObOqbOrbOsbQebOubOvbOwbupbMObOybOzbOAbOAbzAbOBbOCbCvbzIbQgbQpbQjbQBbQubRdbQXbRvbRebRxbVFbMVbuxbEnbOObOObOObOObOOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabOPbKtbPCbKtbKtbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLVbNgbNgbNgbRAbRzbKAbOSbRDbRBbKAbRFbOVbOWbGvbGvbGvbGvbGvbGvbOXbOYbOZbPaaaabPbbPcbPcbPdbvYbPfbPgbPhbPfbPibNFbPjbPkbPlbNFbPmbNXbPobPpbPqbPrbPsbPtbPtbNSbRWbRJbPwbPxbPybDtbNYbLbbScbGFbGFbSgbDzbSibxCbSnbwZbwYbwlbwkbSubPIbwkbOkbwDbwKbOlbPNbMKbCpbCpbCpbCpbCpbCpbCpbCpbPObMObPPbQYbPRbOsbOsbOsbOsbwjbMObPTbLEbPUbPUbzAbBhbPVbPWbwbbPYbPYbSMbSObSNbSQbSPbSSbSRbSSbSVbMVbQfbSWbOObQhbTgbOpbQkaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKsbKtbQlbQmbQmbLTbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabKxbMsbMsbMsbKxbQnbQobTAbQqbQrbKAbKAbQsbQtbTObQvbQvbQvbQvbQvbQvbQwbQxbQyaaabQzbQAbUbbQCbxbbPfbQEbQGbQFbPfbNFbQIbQJbQKbNFbxxbxhbQNbQObQPbQQbQRbPtbQSbPxbQTbNUbPxbPxbQUbDtbPnbGFbQVbUkbGFbPzbDzbLebRCbQZbPBbUobyhbRGbDEbIkbSpbOkbwKbwKbOlbRfbMKbRgbRhbygbRjbRkbRlbybbRnbPObMObOsbOsbRobOsbOsbOsbOsbyabMObRqbLEbRrbRrbzAbRsbRtbRubyfbRwbUGbUwbUPbUObUWbURbVkbVjbVvbVmbxIbREbVGbxHbRHbRIbQibRKaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabKtbKtbRLbLTbLTbLTbLTbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhObhOaZSaZTbjmbjnbjobgrbjpbjpbjZbjpbjpbjpbjrbajbajbajbajbaibbZbdDbjsbjtbgybbZbkZbkZbkZaTSaTSaTSaTSbkkaTSbjxbdObdPbjybjzbgDbfgbkxbdPbkAbfmbkHbgGbgGbgGbjDaMbbjEaSzbctbkKbkLbgObhdbjIbjJbhfbjLblybdYbjNbkMbjPbiybkNbiybgVbkPbjSbedbjTbjUbizbjWbjWbjWbjXbkVaJibkXbkabkbbkcbkdbkebbFbkfbkgbkhbkibkjbkYbklbkmbknbknbkobewbewbewbewbewbkpbkqbkrbewbksbktcsfbkvbewbkpbkwcLYbkybhFbewbewbkzbewbewbllbkBbewbkpbewbewbewbewbewbewbewbewbewbhqbewbewbhFbkCbkDbkEbkFbkGblmbkIbkJaafaaaaafaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhObhObQDblrblEbQLbkObgrblTbkQbkRbkRbkSbkTbkUbmdbmlbmlbmAbmxbbZbbZbbZbeZbmBbbZbajbajbajbajblaaXeaXeblbblcbldbleblfblgblhblibljblkbdPbmEbfmbmFbgGblnbgGbbAblpblqaSzbctbdYbmHblsbltblublvblwblxbdYbdYbebblzblAbmUbmNblDblAbiDbebbedbedblFblGblHblIbiCblJblKaJiblLblMblNaJiblOblOblOblOblOblOaZzaZzblPblQbZNcdMblQblPaZzaZzaZzaZzaZzaZzaZzaZzaZzaZzbmVaZzaZzaZzaZzaZzaZzbmXaZzbewbewblVblWbiFblOblOblOblOblOblXblYblYblZblYbewblYblZbmablYbmbblObmcbmcbmcbnbaRZbmeaRZaRZaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhObhObdubdvbjmbjnbmfbgrbmgbjpbmhbmibjpbjpbjpbnsbmjbmkbmkbnwbbZbdDbmmbeZbmnbbZbfebmpbmqbmrbmsbmtbmtbmubmtbmtbmvbdPbmwbnNbfgbmybmzblfbnRbnPbnSbgGbgGbjHbilbnUblqaSzbnVbmGbmGbmGbmGbmGbmGbmGbnWbmGaafbebbmIbmJbmKbmLbmKbmMbjKbebaafbedbmObnXbmQbmRbiCbiGbmSaJibcKaRqaRpaJibmTbohboibjAbojbmYbmZbjRblBblobndbneblobmobmCbnhbnibnjbmPboKbnmbnnbPLbnpbnqbnrboWbntbntbnubYfaVJblOblObpmblObZMbZMblObnzbmDbnBblObZtbpobZtblOblXblYbmbblObZnbmWbZnblObnGbPJbnIbnJbnKbnLbnMaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhOaaaaaabnObpwbeQbnQbgrbpLbpBbpMbnTbpPbpNbjpbpSbnlbnYbnZbnwbbZbbZbbZbbZbbZbbZboabobbocbodboebdPbdPbdPbdPbdPbdPbdPbWqbdPbdPbdPbogbdPbfmbqcbnSbgGbgGbgGbokblpblqaSzbqgbmGbombonbncbOIbvGbotbosbotaafbebboubovbowboxboybozbnfbebaafbedboBboCboEboDbiCbiGboFaJiboGboHaRpbXHboJbngboLboMbnkbPZboPboQboRboRboSboTboUboUboVbolboXboYboZbpabpbbnnbPGbpdbpebpfbpgbphbpfbpibYfaVJbpjbpkbplbOJbpnbnybppbnCbnDbpqbqxbptboobqyblOaZzbqBbpxblOcgVboqbprbqGbpCbpDbnIbpEbpFbpGbnMaaaaaaaaaaacaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaaaaaaaaaaaabgnbgobgpbgqbdvbpHbpHbpHbpIbpHbpJaZVbpKbqKbgrbqQbjpbrkbrcbpQbpRbrvbrubrwbrwbrwbrxbkWbpUbkWbkWbkWbkWbpVbpWbpWbpXbpYbdPcfycfocfzbrybqdbqebqfbrCbqhbqibqjbqkbqkbrDbrIbgGbgGbqmbfmaMbblqbqnbqoaJubqqbqrbqrbxqborbrPbxsbotaafbebbebbebbebbshbebbebbebbebaafbedbqzboCbqAbsjbqCbqDbqEaJibqFaRqaRpaJibskbqHbqIbqJaJDbqLboPbqNboUboUboUboUboUboUbqObqPbslboYbqRbqSboNbnnbqUbqVbqWbsnbpgbphbpfbqXbYfaVJbpjbqYbqZbqZbrabrbbsobrdbrdbrdbrebrdbrfboObrhbribrjbsqbnIbrlbpCbrmbrnbpCbrobnIbrqbpFbrrbnMaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaabrsbrtbsvbsBcaLbsHbsHbthbrzbrAbgrbtkbtlcaMbpTbjpbjpbjpbajbrEbrFbrGbrHbrGbrGbrGbrHbrGbajbajbdPbdPbdPbtBbdPbrJbrJbrJbrJbrJbrJbqfbrKbrLbrMbrNbrObtIbrQbrRbrSbrTbrUbrVbrWbrXbrYbrZaHBbsbbqvbsabYZcanbotbosbotaafbsibZibtKbtTbsmbtXbtKcaJbsiaafbedbspbuibspbedbedbedbujaJibssaRqaRpbXHboJbngbstbsubuobqLbswbqNbupbtmbuGbuAbuNbsCbqObsDbnibwDbsFbwKbxhbnncdtbqVbpebpfbpgbphbpfbpibYfaVJbpjbsJbsKbsLbsMbplbsNcgZbsPbsQbsRbsSbsTbsUbrhbsVbsWbsXbnIbsYbsZbtabsrbtccflbnIbrqbpFbtebnMaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaacaaaaaaaaaaaaaaaaaaaaabrsbtfbtgbuYbtibtibtibtjbtibtibgrbvabuZboAbvjbjpaaaaaaaaaaafaafbtnbtnbtnbtnbtnbtnbtnaaaaaabtobtpbtqbtrbtsbrJbrJbrJbrJbrJbrJbttbtubvqbtwbtxbtybtzbtAbfmbfmbvCbfmbfmbtCbtDbtEbtFbmGbtHbmGbmGbmGbmGbmGbvEbmGaafbtJbvFbtLbtMbtNbtMbtLbvIbtPaafbspbtQbtRbtSbvObtUbspbtVaJlbtWbbmbvZaJibtYbohbtZbuabwcbucbudbuebufbwgbzrbzcbwnbukbulbumbnibnnbunbpubzybnnbuqburbusbutbuubuubuvbuwbYfaXqbpjbwxbplbplbsMbuybuzcgYbpvbuCbuDbuEbuFbVybrhbuHbuIbuJbnIbuKbuLbuMbsrbpCbVebnIbpEbpFbUAbnMaaaaaaaaaaaacHOaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeObSwbxmbuVbpHbuWbgnbgobuXbuWbgrbxpbjpbxvbvbbjpaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnaaaaaabvcbvdbrJbvebvfbvfbvfbvfbvfbvgbvhbvfbvibxzbvkbvlbvmbSlbSrbfmbvpbgGbxDbpzbvsbvtbvubvvbmGbmGbmGbRcbQMbvzbvAbvBbvwaafbpObRpbvHbvJbvKbvMbvNbRybpOaafbspbqMbvQbxnbedbvRbspbvSaJlbvTbcLbvUaJibvVbvWbvXbTTbxObucbyobxTbyKbwdbwebwebwfbyMcdWcdVbUqbwkbTWbwmbwkbwkbwkbwkbyQbwkbwkaXKaXKaXKaXKaVJbpjbsJbsKbsLbwobwpbwqbwrbwsbwsbwsbsSbwtbTsbwvbwwbyUbwybnIbwzbwAbwBbtbbpCbSEbnIbwEbwFbnMbnMaaaaaaaaaaaaaafbuPbuQbuRbuQbuRbuQbuSaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbwMbwNbwObwPbrJbwQbrJbwRbwRbwRbwSbwTbrKbrJbrJbrLbwUbwVbwWbwXbrpbCkbxabgGbgGbugbxcbvtbvubxdbxebxfbEYbzHbxibxjbxkbxlbvwaafbxrbzNbzJbzObyLbxobzPbzVbxraafbspbqwbAebuBbedbAibspbtVaJlbxwbcLaRpaJibDDbxybAobxAbxBbxCbAtbxEbxCbxFbxGbDIbxFbwkbAxbxJbwkbwkbxKbxLbxMbxNbAAbxPbxQbxRbxSaXKbaybvraXKaVJbpjbxXbqZbqZbxYbxZbppbDQbwsbwsbwsbsSbwtbEFbwwbvDbUabTQbwwbESbFbbEZbwbbpCbFybnIbrqbykbnMaaaaaaaaaaaaaaaaafbwGbwHbrgcLebwJbFUbwGaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbAFbypbAFbyqbyrbwQbrJbrJbrJbysbrJbwTbrKbytbdPbdPbyubgGbrNbwXbyvbywbyxbyybyybyzbyAbyBbyCbyDbvsbyEbvPbyGbxkbyHbyIbyJbvwaafbxrbxrbxrbxrbALbxrbxrbxrbxraafbyNbyNbyNbyNbyNbyNbyNbAVaJibyPblMblNaJibCnbyRbyRbySbyTbxCbAXbyVbyWbCobyYbyZbzabwmbzbbBqbzdbzebzfbzgbzgbzhbzibzgbzjbzkbckbaAbwubclbBsbcnbCQbzsbztbzubzvbzwbppbCXbpqbpqbDBbsSbwtbCLbzAbzBbzCbzDbzAbzEbzFbzGbwCbzIbwwbwwbBxbnMbnMbzKbzLbzLbzLbzMbCJbylbymbrgbwJbrgbynbuRaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaacaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbBAbzQbBAbzRbrJbwQbrJbzSbzSbzSbzSbwTbrKbzTbzUbdPcfxbgGbrNbBJbzWbzXbzYbgGblnbgGbzZbAabAbbAcbAdbyEbwIbAfbxkbxkbxkbAgbvwbAhbAhbBKbAhbBRbBQbBSbAjbBUbAjbAjbyNbCcbCdbAmbAnbBXbApbAqaJibAraRqaRpaJibAlbAsbAubAvbAwbBtbAybAzbBabABbACbADbAEbBEbAGbAHbAIbAJbAKbAIbxtbAMbANbAObnvblUbsdbBGbsgbsfbaAbPObpjbxubxUbAYbAZbAZbppbAkbBbbBcbppbBdbBebBfbBgbBhbyibKebBibYrbYrbBjbBkbBobTHbCrbBrbCwbCAbTIbBvbCEbCIbCHbCKbwGbwJbrgbwJbwJbBNbwGaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbBCbwNbBDbCYbrJbwQbrJbrJbrJbrJbrJbwTbrKbzTbBFbdPbLpbgGbBHbBIbgGbCZbgFbgGbgGbyjbvsbvtbAbbAcbAdbyEbvwbBLbBMbLrbBMbBObvwbDbbDabDdbDcbDfbDebDhbDgbDjbDibBVbyNbBWbzmbBYbBZbCabCabCbbDwbAraRqaRpaJibzxbCebCebySbCfbxCbCgbChbxCbCibCjbCjbyObwkbClbCmbwkbwkbwkbwkbwkbwkbyXbwkbwkbwmbDKaXKaXKaXKaXKbDYbpjbwwbzAbzAbzAbzAbzAbzAbzAbzAbzAbzIbEibCsbCtbBhbWXbCvbEjbCxbCxbCxbCybCzbEkbCBbCCbCDbEpbTGbCGbErbCGbEsbEubBzbuQbuRbEwbuRbuQbBBaafaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbBAbzQbBAbCMbCNbCObrJbrJbrJbCNbrJbwTbrKbzTbCPbdPbLHbgGbrNbwXbgGbqlbCRbgGbgGbECbxcbvtbAbbCTbxcbCUbvwbCVbEKbMIbAWbxlbvwbEMbELbERbAhbEUbEUbEUbAjbEWbEVbEXbyNbDkbDlbDlbDmbDnbDobDpaJibDqbDrbDsaJibDtbMMbDvbMpbDxbDybDzbDAbyWbLWbFabCjbMybwmbDEbDFbwmbDGbDHbNsbDJbFobDLbDMbCpbDNbDObBTbNtbDRbCpbVLbVMbDUbVAbDWbDXbDXbFrbDZbEabEbbEcbEdbEebEfbBmbBlbBnbCvbFVbFFbGfbwwbwwbwwbwwbwwbGhbGgbEnbzKbzMbCJbEobGibCJbzKbzLbzMbGjbCJbGkaafcHOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbGubExbGubEybEzbEAbEAbEAbEAbEAbEBbGAbEDbzTbEEbdPbNzbEGbEHbEIbEJbGDbGCbGWbGEbGvbtCbENbAbbEObEPbyEbvwbEQbHabOxbBMbETbvwbBPbHibHjbAhaaaaaaaaabAjbHmbHlbFcbyNbFdbFebFfbFgbDnbDobFhaJibxwaRqaRpbHMbFjbFkbFlbFmbFnbHNbFpbFqbxCbxFbxFbIZbxFbwkbFsbFtbFubFvbFwbFxbDJbIYbDLbFzbFAbFBbDObFCbFDbFEbHPbVlbDXbHQbVAbFJbDXbDXbFKbFLbFMbFLbFLbFNbFObFPbBwbFRbFSbCvbHRbJrbJabFWbFXbFYbFZbGabGbbGcbGdaafaafbCJbGebHUbHUbHVbIfbHZbIobEvaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbGlbGmbGnbdPbdPbGobwNbwNbwNbGpbdPbdPbGqbGrbGsbdPbGtbGtbGtbITbGtbGvbGwbGxbGybGzbtCbvtbAbbIAbGBbtCbtGbtGbtGbtGbtGbIBbtGbtGbtGbEgbtGbtGbtGbtGbtGbEhbtGbtGbtGbtGbtGbtGbtGaJiaJiaJiaJibxwaRqaRpbHMbJqbFkbCSbGGbCWbGIbGJbGKbGLbGMbGNbCjbGObGPbGQbGRbGSbGTbGUbGVbIDbGXbGYbGZbJDbHbbHcbHdbHecLVbCpbUSbUfbwwbwwbwwbwwbwwbJVbwwbwwbwwbzAbKfbzAbzAbFQbBhbCubCvbHRbIvbKzbHnbHobHpbHqbGabGbbGcbHraaaaaabCJbHsbHtbEobCIbBybKBbKUbCJaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaaaafaaaaaaaaabHuaafaaaaaaaaaaaabGtbIubHwbHxbHybGvbHzbKVbHBbHCbtCbvtbAbbAcbAabHDbHEbHFbHGbHHbHIbHJbHKbHLbLabLxbLnbLzbAabAabLIbMhbLYbAabHTbAabzZbHHbKJbHWbHXbHYbMibxwaRqbDsaJlbDtbDubDtbDCbDPbxCbIbbIcbIdbIebMlbIgbIhbIibIjbIkbwmbIlbImbInbDJbDTbElbIpbIqcLUbFDbIsbItbHObCpbHSbIwbIxbIybUdbLybMqbICbJWbUcbIFbIGbIHbIIbIJbzAbIKbCubCvbMHbMFbINbIObIPbIQbHvbGabGbbISbEnbEnbEnbCJbCJbCJbMSbMPbCJbCJbBybCJaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaabMZaaaaaaaaaaaaaaaaaaaaaaaaaaabGtbuObEmbIVbIWbNdbPebPKbPEbNfbtCbvtbJcbJdbJebJebJfbJgbJhbJibJjbJgbJfbJebJebNkbJkbJlbNqbJnbJobNBbJebJebJpbJgbJhbJibJjbJsbJtbJubJtbJvbJwbvUaJlbEtbEqbFHbGFbNLbGHbDzbHAbFibDVbxFbNQbCFbDSbDEbJGbwkbJHbJIbJJbDJbJKbJLbJMbJNbJObFDbJPbItbJObCpbJQbJRbIxbJSbJTbJUbNZbObbMCbJYbIFbJZbKabKbbKbbzAbKcbIMbHkbIUbIRbJbbIXbKgbKdbKkbGabGbbKlbEnbKmbOdbKnbEnaafaafaafaafaafaafaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbKpbKqbKqbKrbKsbKsbKtbKtbKtbKtbKuaafaafaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaaaaaaaabKvbKwbKxbKwbKyaaaaaaaaabGtbGtbOfbKAbIVbKAbOibKCbOnbKDbKEbtCbKFbvtbKGbKHbAabKIbAabzZbHHbKJbAabKKbKLbKMbKNbKObAcbAabKPbKQbHLbKRbHLbHLbKSbKTbODbOtbKWbKXbcLbKYaRpaRpaRpaJlbOEbFlbFnbOFbJmbOGbJybJxbFIbLgbLhbLibLjbHgbDEbIkbIabIzbHhbDJbDJbLobLobLobCpbPMbLqbQPbLsbLtbCpbLubLvbIxbLwbFGbLybOHbLAbLBbLCbIFbJCbLEbKbbKbbzAbRsbSLbCvbwwbLGbuTbuUbLJbKhbLLbGabLMbLNbLObLObLObLPbGdaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafbLQbLRbLSbLRbKsbKtbKtbLTbLUbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLVbsObLXbtdbLVbLZbMabMbbGtbMcbMdbMebMfbMgbOLbOKbMjbMjbMkbtCbtCbtCbOMbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbMmbMnbMobtCbtCbtCbtCbtCbONbtCbtCbtCaJlaJlbOQaJlaKSaMpbMraJlbKZbJXbORbGFbLdbxCbDzbLDbxCbtvbMzbMAbMBbwkbOTbMDbMEbOUbMGbPubVzbMJbMKbMLbItbJObFDbFDbVVbJObCpbMNbMObMObMObMObMObMObMObMObMObMObPvbMQbMRbMRbzAbPAbKibMUbwwbMVbMVbMVbMWbKjbMYbMVbMVbMVbMVbMVbMVbNabNbaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymbPCbLRbLRbNebKtbKtbLTbLTbPDbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabKxbNgbMsbNgbKxbNibNjbPFbNlbNmbNnbKAbNobNpbGvbPHbNrbubbtObGvbNubNvbNwbNxaaaaaaaaaaaabNybuhbNAbPSbNDbNCbNEbNFbNGbNHbNIbNFbNJbNKbPXbNMbNNbNObNPbqsbNRbNSbNTbNUbNUbNUbNUbDtbDtbDtbDtbMtbMtbxCbQabOabQbbMzbMvbMubOebQcbOgbOhbQdbOjbMxbMwbOmbNhbMKbOobFDbFDbNVbJObJObOobCpbMNbMObOqbOrbOsbQebOubOvbOwbWIbMObOybOzbOAbOAbzAbOBbLFbCvbzIbQgbQpbQjbQBbLKbRdbQXbRvbRebRxbVFbMVbuxbEnbOObOObOObOObOOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabOPbKtbPCbKtbKtbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLVbNgbNgbNgbRAbRzbKAbOSbRDbRBbKAbRFbOVbOWbGvbGvbGvbGvbGvbGvbOXbOYbOZbPaaaabPbbPcbPcbPdbvYbPfbPgbPhbPfbPibNFbPjbPkbPlbNFbPmbNXbPobPpbPqbPrbPsbPtbPtbNSbRWbRJbPwbPxbPybDtbNYbLbbScbGFbGFbSgbDzbSibxCbSnbwZbwYbwlbwkbSubPIbwkbOkcbdbXnbOlbPNbMKbCpbCpbCpbCpbCpbCpbCpbCpbPObMObPPbQYbPRbOsbOsbOsbOsbwjbMObPTbLEbPUbPUbzAbBhbSLbCvbMXbMTbMTbOcbPVbOCbSQbSPbSSbSRbSSbSVbMVbQfbSWbOObQhbTgbOpbQkaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKsbKtbQlbQmbQmbLTbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabKxbMsbMsbMsbKxbQnbQobTAbQqbQrbKAbKAbQsbQtbTObQvbQvbQvbQvbQvbQvbQwbQxbQyaaabQzbQAbUbbQCbxbbPfbQEbQGbQFbPfbNFbQIbQJbQKbNFcbQcbkbQNbQOcdpbQQbQRbPtbQSbPxbQTbNUbPxbPxbQUbDtbPnbGFbQVbUkbGFbPzbDzbLebRCbQZbPBbUobyhbRGbDEbIkbSpbOkbXnbXnbOlbRfbMKbRgbRhbygbRjbRkbRlbybbRnbPObMObOsbOsbRobOsbOsbOsbOsbyabMObRqbLEbRrbRrbzAbRsbRtbRubyfbRwbUGbUwbUPbUObUWbURbVkbVjbVvbVmbxIbREbVGbxHbRHbRIbQibRKaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabKtbKtbRLbLTbLTbLTbLTbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaabLVbRMbRNbRObLVbRPbMabMbbGtbGtbRQbRQbRQbGtbGtbNxbRRbRRbRSbRSbRSbRSbNwbQyaaabRTbRUbRVbVObRXbRYbRZbSabSbbSbbWgbSdbSebWibNFbPtbPtbPtbPtbPtbWkbPtbPtbShbWobSjbNUbPxbSkbvnbDtbQHbLbbQVbSmbWMbPzbSobJAbJBbSqbRabSsbStbJzbFsbSvbIEbSxbRibRbbSAbSBbMKbRmbSDbWVbRjbSfbSGbXabRnbPObMObMObMObRobOsbOsbOsbMObMObMObSIbSJbRrbRrbzAbSKbSLbCvbzIbXcbXfbXebSQbXibXqbXpbXvbXubYabXxbMVbQfbYobOObSXbSYbSybTaaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKtbLTbLTbLTbLTbLTbLTbTbbLTbTcbLTbLTbLTbLTbLTbKtbKtaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabTdbKwbTebKwbTfbYtaafaaaaaabGtbThbTibTjbGtaaabNxbTkbTlbTmbTnbTnbTnbTobQyaaabQzbTpbTqbTrbvobPfbTtbTvbTubTwbNFbSzbTybTzbYwbTBbTBbTBbTCbTCbTDbTEbULbPxbPxbTFbNUbNUbNUbNUbDtbDtbLfbLkbLcbDtbTJbTKbTLbJFbJEbTJbQbbLlbLmbTRbTSbTJbMKbMKbMKbMKbMKbMKbvLbTUbTVbRjbvybTXbTYbRnbPObMObTZbQWbPQbYHbYzbNWbNcbTZbUgbUhbUibIIbIJbzAbIKbSLbUjbwwbMVbMVbYMbYSbMVbMVbMVbMVbYYbSCbVFbMVbvxbUnbOObUpbZbbUrbOOaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabKtbUsbUsbUsbUsbUsbUsbUtbLTbUubUsbTcbLTbLTbLTbLTbKtaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMZaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbUvbNxbNxbNxbNxbRSbZcbNwbUxaaabUybPcbPcbUzblCbPfbPfbUBbPfbSFbNFbUDbSHbSTbNFbSUbSUbSUbSUbSUbSUbSUbSUbUHbUIbUJbUKbUKbUMbNUbDtbUNbSZbTxbUQbZebwabUTbUUbTMbilbTNbUTbUYbUZbVabVbbUebTPbVdblBbVgbVhbVibUlbZrbUmbRjbUCbZsbUCbRnbPObMObVnbUFbVpbVqbVrbVsbVtbVubUgbzAbZubzAbzAbVwbCxbSLbCxbVxaafbnxbZvbZzblSbVBbZBbZLbZCbZObUVbMVbVHbVIbOObVJbVKbVKbwhaaLaaLaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwibLRbLRbLRbLRbLRbLRbLRbVNbLUbLTbLTbLTbLTbZPbLUbKuaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabMZaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbUvbNxbNxbNxbNxbRSbZcbNwbUxaaabUybPcbPcbUzblCbPfbPfbUBbPfbSFbNFbUDbSHbSTbNFbSUbSUbSUbSUbSUbSUbSUbSUbUHbUIbUJbUKbUKbUMbNUbDtbUNbSZbTxbUQbZebwabUTbUUbTMcdGbTNbUTbUYbUZbVabVbbUebTPbVdceobVgbVhbVibUlbZrbUmbRjbUCbZsbUCbRnbPObMObVnbUFbVpbVqbVrbVsbVtbVubUgbzAbZubzAbzAbVwbCxbSLbCxbVxaafbnxbZvbZzblSbVBbZBbZLbZCbZObUVbMVbVHbVIbOObVJbVKbVKbwhaaLaaLaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwibLRbLRbLRbLRbLRbLRbLRbVNbLUbLTbLTbLTbLTbZPbLUbKuaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabVPbVQbVQbVRbVSbNxbVTbRSbVUbNxaaaaaaaaaaaabNybpcbVWbVXbVZbVYbPfbNFbWabWbbNIbNFbSUbUXbVfbVcbVDbVCbVEbSUcaqcaqcaqcaqcaqbTFbWjbZSbWlbWcbWdbZUbWpbxgbWrbWsbWtbWubWtbWvbWtbWwbWxbWybWzbWAbWBbWAbWCbWDbWEbWFbWGbWebnHbWfbWKbWLbZVbxVbMObxWcaabzlbWSbWTbWhbWSbWSbnAbWWbWXbWYbWZbCxbCxbSLbCxbFTaafbnxcaxcaxbXbbnabXdbnocaWbXgbXhbMVbVHcbebOObOObOObOObOOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabKtbQmbQmbQmbQmbQmbQmbXkbLTbQlbQmbXlbLTbLTbLTbLTbKtaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabXmcbfbWmcbgbRScbibXrbRSbXsbNxaaKaaaaaaaaabNybNybNybNybNybNybNybNFbUDbUEbXtbNFbSUbWnbWJbWHbWHbWJbWRbSUbhVbWUbWUbXocaqbXBbDtbDtbXCbXDbXEbXFbXGblRbXIbXJbXKbXLbXMbXNbXObXPbXQbXRbXSbXTbXUbznbzpbzobAPbzqbARbAQbATbAScbjbAUbYfbYgbIwbYhbVobCqbWObWNbWPbYmbYnbgJbYpbYqbYrbYscbmbYrbYubYvbILaafbnxcbncbrbrBbVBcbtcbAcbycbDbYAbMVbVHbYBbYCbUnaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKtbLTbLTbLTbLTbLTbLTbTbbLTbXlbLTbLTbLTbLTbLTbKtbKtaafaaaaaaaaaaaaabgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYDbVQbVQbVRbYEbYFbYGbNxcbJbNxbYIbYJbYKbYIbYIbYLcbLbYNbYObYPcbObXwbXzbXybYebXAbYjbWJbYybYxbYRbYQbYTbidbYVbYUbYXbYWcaqbZhbNScbWbZjbZkbZlbZlbZmbnEbZobZpbTJbTJbZqcccbTJbTJccncceccrcaIcctbWQbZxbZyccubZybZAbZaccvbZabZAccEbYfbMNbIwbZEbXWbXVbZdccGbZJbZKbMObMObwwbwwbwwbwwbwwboIbnFbofbwwbMVbMVbMVbMVbMVbMVbMVbMVbMVbMVbMVbMVccJbZQbZRbUnaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabKtbKtbRLbLTbLTbLTbLTbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamccMaamaamaamaamaamaaaaaaaaaaaaaaaaaaaafaafaaabZfbZgbZgbZgbZHbZgbZgbZTbZIbYIbZYbZZbYIccQcabccScadbZWcafccYbZXcaecaccahcagcaibWJbYycajcakbYQcalbSUcaqcaqcaqcaqcaqcarbNSbDtcascatcdjcamcawcdmcaycazbTJcaocaBcaCcaDcaEcaFcaGcaHcaIbZxbWQcapbZycaKbsEbZAbsGcaNcaObZAbXXbYfbPObIwbXYbsAbXZbXYbXYbIwbIwbIwcaRcaScaTcaUcaVbwwbwwcdBbwwbwwcaXcaYcaucaAcavcdNcaZcbacbccdUcdTcdZcdYcbhbUnbUnbUnaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKsbKtbUubUsbUsbLTbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcbbceccebcblcedceicefcbpcbobYIcelcbsbYIbYIcercbucbvcbwcbxceucbqbXzbXybYecbzbsIbWJbWJcbBcbCbWJcexbSUcbFcbGcaqcbHcaqbTFcbIcbIcbIcbIcbIcbIcbIbTJceCcbEbTJcbKcbMcbNceHcaEcbPceIceKcaIbZxbWQcbRbZycbScbTbZAcbUcbVcfebZAccqbYfbYbbYdbYcbYiccsccAbYccfibYkbYlcktbZDbZwbZFcktcfjbZGccCccBcfkccDccPccFcfscfmcfGcfucfmcfIcfMcfLcfRccwccxccycczbUnbUnbUnbUnaaaaafaaaaaaaaaaahaahaahaafaaaaaaaafaaaaaaaafaaaaaabOPbKtbPCbKtbKtbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcbbceccebcblcedceicefcbpcbobYIcelcbsbYIbYIcercbucbvcbwcbxceucbqbXzbXybYecbzbsIbWJbWJcbBcbCbWJcexbSUcbFcbGcaqcbHcaqbTFcbIcbIcbIcbIcbIcbIcbIbTJceCcbEbTJcbKcbMcbNceHcaEcbPceIceKcaIbZxbWQcbRbZycbScbTbZAcbUcbVcfebZAccqbYfbYbbYdbYcbYiccsccAbYccepbYkbYlcktbZDbZwbZFcktcfjbZGccCccBcfkccDccPccFcfscfmcfGcfucfmcfIcfMcfLcfRccwccxccycczbUnbUnbUnbUnaaaaafaaaaaaaaaaahaahaahaafaaaaaaaafaaaaaaaafaaaaaabOPbKtbPCbKtbKtbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafccRccRcebccTcfZceiccUccWccVbYIcgeccHccIcgfccKccLcgmccNccOcgoccXcdaccZcdecdbbqTcdycdQcdFcekceecembsccdccddaJEcdfcaqbTFcbIcdgcdhcdicgOcdkcdlcgRcdncdocgWcdqcdrcdsbqtcaEcducdvcdwcaIbZxbWQcenbZycdxbqbbZAcdzcdAbqabZAcaPbYfbYfcaQbYccbYcbXcbZbYcchBccacjfcdLcdLbyFbBucdLcdOcdPceqcdRcdOcdSbBpbyebydcdScdScdScdScgXbyebydcdScdSbXjcdXbpZbpAceachabpybpsbycbycbycbycbycbycbycbycbycbycbycbycbycbycbycbycchicegcegcehbKtbKtbLTbLTchnbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacejcejcejcejcejcejcejcetcesbYIbYIbYIbYIbYIchpchuchqchqchqchzcewbXzbXybYeceybYjceEceTceSceWceUceXbSUcezaJFceYaJFcaqbTFcbIceDcfacfacfaceFceGbTJchPchLbTJcbKcbNceJceHcaEchSceLceMcaIbZxbWQceNbZyceOcePbZAbZAbZAbZAbZAccbceRbYfcaQbYcccdbszbYcbYcchBcifcjfcdLbsycfbcfbcfccdOcfdciycffcdOcfgcfhcfhcfhciCciLciKbsxciPcfnbsecfpcdScfqcfrciQbUnbUnbUnbUnaaaaafaaaaaaaaaaahaahaahaafaaaaaaaafaaaaaaaafaafaafcftcfBcfvbNebKsbKtbKtbLTbLUbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcejcfwcfxcvbcvccwfcejcfDcfCcfFcfEcfHciVcjacjacfKcfJcfJcjlcjpcbqbXzbXybYecfNcaicfOcfQcfPcvtcwecggbSUaJFaJFcaqceBcaqbTFcbIcfVcfWcfWcfWcfXcbIcfYcjtcgacfYcgbcgccgdcjvcaEcjCceLcgicaIcghccfcwEbZycgkcglbZycjIbLvbVicgnccgcchbYfccjcciccicckcclcclcclcclccmcdLckncgycgycgzcgActscgrcgpcgucgtcgGcgGcgGcgxcgIcgIcgJckocgLcgDcgMcdScgNcwDcgPcgNaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcgQbKqbKqbKrbKsbKsbKtbKtbKtbKtbKuaafaafaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaafaafcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEaaaaaacgScgTcgTcgTcgUcsdcejcgHcgFckFcgKckQckNclgclfcluclpclCchcchfchechhchgchjclGbSUbSUbSUbSUbSUbSUbSUbSUcmgclVcaqcmkcaqbTFcbIcbIctpctqctrcbIcbIcsnchschtcfYcaEcaEcaEcaEcaEcaIchkchlcaIchwcsZchwbZyctGctbbZychAchBbVichCbVichDbYfccobYfbYfccpcdCcdCcdCcdDbYfcdLchIchJchJchKcmschMchochOcmwchQckLckLckLckLcuOctUckLcmGckLchEcCqcdSchZciachGcgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacgEchHcmPchHcgEchNcmQchNcgEchRcmRchRcgEaaaaaaciicgTcgTcgUcgUcyScejchUchTchWchVcmXchXcidciccnecieciecigciecbqbXzcihbYecikcimcilciocinciocipcirciqciqciAciAciAciAbTFciGciHciIciIciJcnfcngciMciXciOcnucnhciRciSciSciTciUcaIcaIcaIcnwcdEckqbZybZybZybZychBchBbViciYbViciZbYfccobYfaaaaaaaaaaaaaaaaaaaaacdLcjgcisciucitcjjcjkcivcjmcjncjociwcjocjocixcyVcyUcgIcnEcgIciWcyTcdScnFcjwcjxcgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcejcAWcCYcvbcvccwfcejcfDcfCcfFcfEcfHciVcjacjacfKcfJcfJcjlcjpcbqbXzbXybYecfNcaicfOcfQcfPcvtcwecggbSUaJFaJFcaqceBcaqbTFcbIcfVcfWcfWcfWcfXcbIcfYcjtcgacfYcgbcgccgdcjvcaEcjCceLcgicaIcghccfcwEbZycgkcglbZycjIbLvbVicgnccgcchbYfccjcciccicckcclcclcclcclccmcdLckncgycgycgzcgActscgrcgpcgucgtcgGcgGcgGcgxcgIcgIcgJckocgLcgDcgMcdScgNcwDcgPcgNaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcgQbKqbKqbKrbKsbKsbKtbKtbKtbKtbKuaafaafaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaafaafcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEaaaaaacgScATcgTcgTcgUcsdcejcgHcgFckFcgKckQckNclgclfcluclpclCchcchfchechhchgchjclGbSUbSUbSUbSUbSUbSUbSUbSUcmgclVcaqcmkcaqbTFcbIcbIctpctqctrcbIcbIcsnchschtcfYcaEcaEcaEcaEcaEcaIchkchlcaIchwcsZchwbZyctGctbbZychAchBbVichCbVichDbYfccobYfbYfccpcdCcdCcdCcdDbYfcdLchIchJchJchKcmschMchochOcmwchQckLckLckLckLcuOctUckLcmGckLchEcCqcdSchZciachGcgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacgEchHcmPchHcgEchNcmQchNcgEchRcmRchRcgEaaaaaaciicATcgTcgUcgUcyScejchUchTchWchVcmXchXcidciccnecieciecigciecbqbXzcihbYecikcimcilciocinciocipcirciqciqciAciAciAciAbTFciGciHciIciIciJcnfcngciMciXciOcnucnhciRciSciSciTciUcaIcaIcaIcnwcdEckqbZybZybZybZychBchBbViciYbViciZbYfccobYfaaaaaaaaaaaaaaaaaaaaacdLcjgcisciucitcjjcjkcivcjmcjncjociwcjocjocixcyVcyUcgIcnEcgIciWcyTcdScnFcjwcjxcgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacgEchHcjbchHcgEchNcjcchNcgEchRcjdchRcgEaaaaaaciicgTcgUcgUcgUcjBcnIcjhcjechWcjicnLcnKcnPcnNcjzcjycjDcjAcjEcbqbXzcjFchjcjGcnQcjHcjJcjJcjJcjKcjMcjLcjNcolcjOceAciAbTFciGcxnciIckbckccxecubcxJckgckhctQcxwckkcklciScywciUconcoqcxYcjQcjPcdHcyLcdIcdIcdJcdIcdKbVibVibVibVibYfccobYfaaaaaaaaaaaaaaaaaaaaacdLcorcjRcjTcjSckEcdOcotcdOckGckHcjXcjUcjUcjYcgIcgIckecjZcjUckickOcdSckPcwGckRcgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacgEckrckuckscgEckzckBckAcgEckDckJckIcgEaaaaafciiclbcgTcgUcgUcgUcejckMckKchWchWcoAchWchWchWchWckTcieckWckYcbqclackZcldclccoBcleclhclhclhclicljcljclkciAcllcgqclwclxciGcDdciIclzclAclBcoCclDclEclFcoFclHclIclJciScDcciUcoJcoLclNclnclmclQclNclRclSclTbYfceQcdIcdIcdIcdIcdIcltbYfaaaaaaaaaaaaaaaaaaaaacdLcmacmbcmccmdcdOcmecmfcpdcdScmhcmicmicmiclvcpfcmlclPclOcmicmicmncdScmocDFcmqcmraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafaafcgEclXcmmcmjcgEcmtcmmcEgcgEcmtcmmcEgcgEaaaaafcmzcgTcgTcgUcgUcmAcejcmvcmucmxcpocprcmycmCcmCcmEcmDcmCcmFcyXcbqcmIcmHcmKcmJcimcmLcmLcmMcljcmNczJczeczeciAcibceVcCgcqgciGcClciIcnccndcpCciGcmSciNcmWcfYcpGcnicnjciScCOciUclLclMclNcnlcpHcnlclNaaaaaaaaabYfbYfbYfcnnclSclSclTbYfbYfaaaaaaaaaaaacdOcdOcdOcdOcdOcdOcdOcdOcdOcnocnpcnqcdScdScnrcnscntcdScdScdScdScpIcnscntcdScdScnvcpNcnvaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccMaafaafaafaaaaafcnxaafcnxaafcKAaafcpOaafcKAaafcpOaafaafaaacejcnAcnBcgUcgUcnCcnDcpRcpPcnycnmcpUcnzcnzcqecnzcnGcqrcnHcnGcnJcjscDXcEjcnMcnOcnOcnOcnOcqIcqDcnRcnRcnRcgscgscgscgscnSciGcKCcJpcnccEZcnWciGcmSciNcEXciUcnYcEJcnjcEBcEqciUclLclMclNcoccodcoeclNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaacdOcofcogcohcwlcojcokcqLcomcqNcopcoocdOaaLaafaafaafaafaaaaaaaaacqOaaaaaaaaaaafcoscKGcosaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafcoucrvcracoxcovcowcrzcoxcrQcrUcrzcoDcrVcrXcoEcnycnycnycnycnycnycnycnycoHcoGcrZcoIcsacoKcoNcoMcoOcnGcoQcoPcoRcnGcoTcoScoUcnOcoWcoVcoYcoXcpacoZcpjcpbcpbcpkcpncpncpjcsbciGciGcpccscciGciGciGcpeciNcDIciUciUciUcsecphciUciUclLcpiclNcvmcpscvmclNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaafcdOcplcpmcplcsgcLZcppcpqcomcomcsicomcdOcdOaaaaaaaaaaafaafaaaaacaaaaaaaaaaaaaafaaacDLaaaaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaaaaaaaaaafcptcsDcpucpxcpwcpFcsLcsMcpzcsWcsQcpEcpDcsXcpFcpLcpJcsYcnTcnbcnkcnUcpTcpWcpVcpYcpXcqacpZcqccqbctccqdcticqfctkcqzcoTcqJcqKcnOcpacpacpacpacpacqMcpjcqPcqPcqPcpncpncpjbTFcrYciGcqhcqicqjcqkciGcqlciNcmOciUcqncqocqpcqqciUctmclLcpiclNctxcqQcquclNaaaaaaaaaaaaaaaaaacqvcqwcqxcqycqvaafaaaaaaaaaaaacdOcplcplcplcoictBcqBcqCctIcqEcqFcqGcqHcdOaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaaacmZaaaaafaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaaaaaaaaaafcptcsDcpucpxcpwcpFcsLcsMcpzcsWcsQcpEcpDcsXcpFcpLcpJcsYcnTcevcnkceZcpTcpWcpVcpYcpXcqacpZcqccqbctccqdcticqfctkcqzcoTcqJcqKcnOcpacpacpacpacpacqMcpjcqPcqPcqPcpncpncpjbTFcrYciGcqhcqicqjcqkciGcqlciNcmOciUcqncqocqpcqqciUctmclLcpiclNctxcqQcquclNaaaaaaaaaaaaaaaaaacqvcqwcqxcqycqvaafaaaaaaaaaaaacdOcplcplcplcoictBcqBcqCctIcqEcqFcqGcqHcdOaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaaacmZaaaaafaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafcqRcqYcqScqVcqUcpFcqXcpFcvWcqYcqXcpFcvWcqYcpFcpFcpFcpFcpFcqZcpFcpFcpFcrbctOcrdcrcctScpZcrfcrecrhcrgcrjcricrlcrkcoTcqJcrmcnOcrncpacpacrocpacrpcpjcrIcrKcrJcrKcrLcpjbTFcrqciGcrrcrscrtcructTcrwcrxcryctVcrAcrBcrCcrDciUcrEcrFcrGcrHcqvcuacqvcrHaaaaaaaafaaaaaaaaacqvcrRcrTcrScqvaafaafaaaaaaaaacdOcomcomcomcomcrMcppcrNcrNcrNcnpcrNcrOcdOaaaaaaaaaaaaaaacrPcrPcrPccMaafaafaafaafcnaaafaafaafaafaafaaqcrPcrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaafaafcptcpFcrccpFcrccpFcqXcpFcuecxacufcxaculcxacxacuycurcpFcpFcuLcuEcuEcuEcuYcuUcvkcvkcvlcpZcvncshcsjcnGcsmcskcvscnGcspcsocsrcsqcstcsscsvcsucpacswcpjcsxcrKcsycrKcsKcpjbTFcizciGcszcsAcsBcsCciGcfYcoacfYciUcsEcsFcsGcsHciUcsIcrGcrGcqvcsJcsNcvvcqvcqvcqvcqvcqvcqvcqvcqvctMctDctNcqvcqvcqvcrHaaaaaacdOcofcogcohcslcsRcqBcrNcrNcrNcnpcrNcsScdOaaaaaaaaaaaaaaacrPaaaaafaaaaafaaaaaaaaackxaaaaafaafaaaaaaaaaaaacrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaafaaaaaacptcpFcrccpFcsOcsTcvEcsVcsUcvGcufcxacvOcxacxacvXcvRcwmcwacwzctacwUcwHcwHcwWcrccrccthctgctjcwXcnzcnGcwYcnGcnGcnGcwZctlcsrctncttctoctyctucpacxdcpjcxocrKcsycrKcxpcpjctvctwciGciGcxqciGciGciGciBctzctAciUciUciUcxrciUciUcsIcrGaaacqvctCctZctEctFcnZctHcxsctJctKctLcqvcuVcxtcuVcqvcxFctPcqvaafaafcdOcplcplcplcxHcLZctRcuccnXcnVcudcrNctWcdOcdOcdOcdOaaaaaacrPaaactXctXctXctXctXaafckxaafctXctXctXctXctXaaacrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacptcpFcsOcsTcsTcsTcvEcsTcsTcsTcvEcsTcsTcsTcsTcsTcxVcyacsTcybcsTcyccsTcsTcsTcuhcugcuicpvcpFcujcygcukcuncumcupcuocumcuqcuscyhcuucutcutcuvcutcuwcyicuxcuAcuzcuBcuBcpjcuCcuDcymcuFcuFcuGcuHcuIcuJcuJcuJcuJcuJcuJcuJcuJcuKcrFcrGaaactFcypcuPcuNctFcpycuRcuQcuQcvdcvacuQcuQcvhcuQcuVcuXcuQcqvaaaaaacdOcplcplcplcslcyrcuZcvicpBcpAcvjcrNcrNcvecvfcvgcdOaafaafcrPaafckVckSckSckSckSckyckxckwckvckvckvckvckUaafcrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacptcpFcpFcpFcpFcpFcqXcpFcpFcpFcqXcpFcpFcpFcpFcpFcvWcpFcpFctScpFcyucpFcyEcyzcvpcvocvrcvqcyFcvqcyHcvucvxcvwcvycvucvucvzcvAcqIcvBcpacvDcvCcpacpacyJcrKcrKcvFcuBcuBcpjbPxcAscvNcvNcvNcvNcyKcvNcvNcvNcvNclMcvPcrGcrGcrGcrGcrGcrGaaactFctFcyRctFctFcobcvScvTcvUcvVcvHcvJcvIcvLcvKcyZcwbcwccqvaaaaaacdOcomcomcomcomcwdcppcvicpgcoycvQcrNcrNcwhcrNcwicdOaaaaaacrPaafcwjcwjcwjcwjcwjaaackxaaacwjcwjcwjcwjcwjaafcrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaccMaaaaaaaaaaaacptcpFcpFcpFcpFcpFcqXcpFcpFcpFcqXcpFcpFcpFcpFcpFcvWcpFcpFctScpFczncpFcpFczncznczocpFcpFcvZcvYcwgcwgcwgcwgczqcwkcoTcwocwpcsqcwqcpacwscvCcpacwtcpjcwucrKcwvcwxcwwcpjczrcvMcvNcwIcwJcwKcwLcwMcwNcwOcvNcwPcwQcrGaaaaaaaaaaaaaaaaaacqvcwRcwycwAczBcwCcwBcqWcqAcqtcwFcwTcwScwVczFcuWcuQcqmcqvaaaaaacdOcofcogcohckXcsRcuZcxgcxhcxhcxicxjcxkczLcxmcqscdOaaaaaacrPaaaaafaaaaafaafaafaaackxaaaaafaaaaafaaaaafaaacrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacptcpFcpFcpFcpFcpFczMcpFcpFcpFczMcpFcpFcpFcpFcpFcvWcpFcpFczXczVcAhctdctdcAhcAtcAhcxlcAvcAwctdcAAcAxcAHcADcAJcwkcoTcxucoTcxvcpQcpacpacxAcpacxBcpjcxCcxCcxDcwxcwwcpjbPxcvMcvNcxKcxLcxMcxNcxOcxNcxPcvNcxQcxRcrGaaaaaaaaaaaaaaaaaacqvcxScxTcxUcAUcxWcxXcpMcxZcuTcBkcuScxEcuTcBmcqvcqvcqvcqvaaaaaacdOcplcpmcplcBncLZcppcrNcrNcyecyfcrNcBqcomcomcomcdOaaaaaacrPaaactXctXctXctXctXaafckxaafctXctXctXctXctXaafcrPaaacBsaaaaaacBsaaaaaaaaacBsaaaaaaaaaaaaaaacBsaaaaaaaaacBsaaaaaacBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaaaaaaaaacptcpFczmcrWcrWczpcxGcrWczpcrWcxIcBucuEcuEcBzcuEcBAcuEcuEcuYcBDczncpFcpFcyjcylcykcyncBEcyocpFcBHcyqcyscyscBIcytcoTcxucyvcnOchbcpacyxcpacBKcyycpjcpjcpjcpjcpjcpjcpjbPxcvMcvNcyMcyNcxLcyOcxLcxNcyPcvNcyQcBLcrGaaaaaaaaaaaaaaaaaacqvcuVcBOctFctFchdcyAchmcyWctMctDctNcyBctMcvhcyYcqvaaaaaaaaaaaacdOcplcplcplckXcBRczacrNcrNcrNcyfcrNczbcrNczccrNczdaafaafcrPaafckVckSckSckSckSckyckxckwckvckvckvckvckUaafcrPaaacBscBscBscBsaaaaaaaaacBscBscBscBscBscBscBsaaaaaaaaacBscBscBscBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaaaaaaaaacptcpFcqXcpFcpFcpFczMcpFcpFcpFczMcpFcpFcpFcyCcpFcvWcpFcpFcpFcyDczncpFcpFcBScAtctfcyGcwgcCccwgcwgcyqcCecyIcCfcytcoTcxucoTcnOcijchYchychvczfcpacnOczgchrchrczhcCicjqczNczOcvNcxNczPczQcxNczRczSczTcvNczUcCncrGaaaaaaaaaaaaaaaaaacqvczWcuMcCBcuVczYczZcAactFcAbcAccsPcyBczWczjcAecqvaaaaaaaaaaaackEcdOcAfcAgcAgczkcAicAjcAkcAlcAmcAncAocApcAqcokcAraaaaaacrPaafcwjcwjcwjcwjcwjaaackxaafcwjcwjcwjcwjcwjaaacrPaaacBscBscBscBsaaaaaacBscBscBscBscBscBscBscBscBsaaaaaacBscBscBscBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaIaaaaaaczlcpFcqXcpFcCFcxacufcxacCJcxacufcxacCJcxacxccxacxbcCKctectdcCNctfczsczucztczwczvczxcwgczzczycwgcwgcwgcwgcwgczAcjscjrcjscnOcnOcnOcnOcnOcnOcnOcnOczDchrchrczEcANcAObPxcAPcvNcAQcARcCQcATcCYcAVcAWcvNcAXcAYcrGaaaaaaaaaaaaaaaaaacqvcuQcAZcAectFcBacBbcBcctFcBdcBeczHczGczIcBeczKcqvaafaafaaaaaaaaaaaabquaaacdOcBlcDmcDacBocBpcDmcDpcBrcBpcDmcDtcdOaaaaaaccMaaaaafaaaaafaaaaafaaackxaaaaafaaaaafaafaafaafcrPaaacBscBscBscBsaaaaaacBscBscBscBscBscBscBscBscBsaaaaaacBscBscBscBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaafaafcptcpFcrccpFcrccpFcqXcpFcuecxacufcxaculcxacxacuycurcpFcpFcuLcuEcuEcuEcuYcuUcvkcvkcvlcpZcvncshcsjcnGcsmcskcvscnGcspcsocsrcsqcstcsscsvcsucpacswcpjcsxcrKcsycrKcficpjbTFcizciGcszcsAcsBcsCciGcfYcoacfYciUcsEcsFcsGcsHciUcsIcrGcrGcqvcsJcsNcvvcqvcqvcqvcqvcqvcqvcqvcqvctMctDctNcqvcqvcqvcrHaaaaaacdOcofcogcohcslcsRcqBcrNcrNcrNcnpcrNcsScdOaaaaaaaaaaaaaaacrPaaaaafaaaaafaaaaaaaaackxaaaaafaafaaaaaaaaaaaacrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaafaaaaaacptcpFcrccpFcsOcsTcvEcsVcsUcvGcufcxacvOcxacxacvXcvRcwmcwacwzctacwUcwHcwHcwWcrccrccthctgctjcwXcnzcnGcwYcnGcnGcnGcwZctlcsrctncttbPWbQubPYcpacxdcpjcxocrKcsycrKcxpcpjctvctwciGciGcxqciGciGciGciBctzctAciUciUciUcxrciUciUcsIcrGaaacqvctCctZctEctFcnZctHcxsctJctKctLcqvcuVcxtcuVcqvcxFctPcqvaafaafcdOcplcplcplcxHcLZctRcuccnXcnVcudcrNctWcdOcdOcdOcdOaaaaaacrPaaactXctXctXctXctXaafckxaafctXctXctXctXctXaaacrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacptcpFcsOcsTcsTcsTcvEcsTcsTcsTcvEcsTcsTcsTcsTcsTcxVcyacsTcybcsTcyccsTcsTcsTcuhcugcuicpvcpFcujcygcukcuncumcupcuocumcuqcuscyhcuucutcutcuvcutcuwcyicyMcuAcuzcuBcuBcpjcuCcuDcymcuFcuFcuGcuHcuIcuJcuJcuJcuJcuJcuJcuJcuJcuKcrFcrGaaactFcypcuPcuNctFcpycuRcuQcuQcvdcvacuQcuQcvhcuQcuVcuXcuQcqvaaaaaacdOcplcplcplcslcyrcuZcvicpBcpAcvjcrNcrNcvecvfcvgcdOaafaafcrPaafckVckSckSckSckSckyckxckwckvckvckvckvckUaafcrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacptcpFcpFcpFcpFcpFcqXcpFcpFcpFcqXcpFcpFcpFcpFcpFcvWcpFcpFctScpFcyucpFcyEcyzcvpcvocvrcvqcyFcvqcyHcvucvxcvwcvycvucvucvzcvAcqIcvBcpacvDcvCcpacpacyJcwOcwOcxCcuBcuBcpjbPxcAscvNcvNcvNcvNcyKcvNcvNcvNcvNclMcvPcrGcrGcrGcrGcrGcrGaaactFctFcyRctFctFcobcvScvTcvUcvVcvHcvJcvIcvLcvKcyZcwbcwccqvaaaaaacdOcomcomcomcomcwdcppcvicpgcoycvQcrNcrNcwhcrNcwicdOaaaaaacrPaafcwjcwjcwjcwjcwjaaackxaaacwjcwjcwjcwjcwjaafcrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaccMaaaaaaaaaaaacptcpFcpFcpFcpFcpFcqXcpFcpFcpFcqXcpFcpFcpFcpFcpFcvWcpFcpFctScpFczncpFcpFczncznczocpFcpFcvZcvYcwgcwgcwgcwgczqcwkcoTcwocwpcsqcwqcpacwscvCcpacwtcpjcAQcwOcARcwxcwwcpjczrcvMcvNczSczTcwKcwLcwMcwNczgcvNcwPcwQcrGaaaaaaaaaaaaaaaaaacqvcwRcwycwAczBcwCcwBcqWcqAcqtcwFcwTcwScwVczFcuWcuQcqmcqvaaaaaacdOcofcogcohckXcsRcuZcxgcxhcxhcxicxjcxkczLcxmcqscdOaaaaaacrPaaaaafaaaaafaafaafaaackxaaaaafaaaaafaaaaafaaacrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacptcpFcpFcpFcpFcpFczMcpFcpFcpFczMcpFcpFcpFcpFcpFcvWcpFcpFczXczVcAhctdctdcAhcAtcAhcxlcAvcAwctdcAAcAxcAHcADcAJcwkcoTcxucoTcxvcpQcpacpacxAcpacxBcpjcyPcyPcxDcwxcwwcpjbPxcvMcvNcxKcxLcxMcxNcxOcxNcxPcvNcxQcxRcrGaaaaaaaaaaaaaaaaaacqvcxScxTcxUcAUcxWcxXcpMcxZcuTcBkcuScxEcuTcBmcqvcqvcqvcqvaaaaaacdOcplcpmcplcBncLZcppcrNcrNcyecyfcrNcBqcomcomcomcdOaaaaaacrPaaactXctXctXctXctXaafckxaafctXctXctXctXctXaafcrPaaacBsaaaaaacBsaaaaaaaaacBsaaaaaaaaaaaaaaacBsaaaaaaaaacBsaaaaaacBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaaaaaaaaacptcpFczmcrWcrWczpcxGcrWczpcrWcxIcBucuEcuEcBzcuEcBAcuEcuEcuYcBDczncpFcpFcyjcylcykcyncBEcyocpFcBHcyqcyscyscBIcytcoTcxucyvcnOchbcpacyxcpacBKcyycpjcpjcpjcpjcpjcpjcpjbPxcvMcvNcnbcyNcxLcyOcxLcxNcnUcvNcyQcBLcrGaaaaaaaaaaaaaaaaaacqvcuVcBOctFctFchdcyAchmcyWctMctDctNcyBctMcvhcyYcqvaaaaaaaaaaaacdOcplcplcplckXcBRczacrNcrNcrNcyfcrNczbcrNczccrNczdaafaafcrPaafckVckSckSckSckSckyckxckwckvckvckvckvckUaafcrPaaacBscBscBscBsaaaaaaaaacBscBscBscBscBscBscBsaaaaaaaaacBscBscBscBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaaaaaaaaacptcpFcqXcpFcpFcpFczMcpFcpFcpFczMcpFcpFcpFcyCcpFcvWcpFcpFcpFcyDczncpFcpFcBScAtctfcyGcwgcCccwgcwgcyqcCecyIcCfcytcoTcxucoTcnOcijchYchychvczfcpacnOcsKchrchrczhcCicjqczNczOcvNctoczPczQcxNczRctuctycvNczUcCncrGaaaaaaaaaaaaaaaaaacqvczWcuMcCBcuVczYczZcAactFcAbcAccsPcyBczWczjcAecqvaaaaaaaaaaaackEcdOcAfcAgcAgczkcAicAjcAkcAlcAmcAncAocApcAqcokcAraaaaaacrPaafcwjcwjcwjcwjcwjaaackxaafcwjcwjcwjcwjcwjaaacrPaaacBscBscBscBsaaaaaacBscBscBscBscBscBscBscBscBsaaaaaacBscBscBscBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaIaaaaaaczlcpFcqXcpFcCFcxacufcxacCJcxacufcxacCJcxacxccxacxbcCKctectdcCNctfczsczucztczwczvczxcwgczzczycwgcwgcwgcwgcwgczAcjscjrcjscnOcnOcnOcnOcnOcnOcnOcnOczDchrchrczEcANcAObPxcAPcvNcwucvFcCQcuxcwJcwIcwvcvNcAXcAYcrGaaaaaaaaaaaaaaaaaacqvcuQcAZcAectFcBacBbcBcctFcBdcBeczHczGczIcBeczKcqvaafaafaaaaaaaaaaaabquaaacdOcBlcDmcDacBocBpcDmcDpcBrcBpcDmcDtcdOaaaaaaccMaaaaafaaaaafaaaaafaaackxaaaaafaaaaafaafaafaafcrPaaacBscBscBscBsaaaaaacBscBscBscBscBscBscBscBscBsaaaaaacBscBscBscBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccMaaaaaaaaaaaIaaaaaacAdcpFcqXcpFcDxcylcqXcpFcDNcylcqXcpFcAucylcpFcpFcDOcpFcDUcylcEccAzcAycABcEicErcACcAEcwgcEycAFcjucAIcAKcumcAMcALcumcAScumcBfcuocBgcBicBhcBhcBjckacBVcBWcBWcBXcBYcAObPxcBZcvNcvNcCacCbcFecCbcCacCdcvNcrGcFgcrGaaaaaaaaaaaaaaaaaacqvctFcFrcuVctFckdcChcFCctFcCjcCkcqycgvcBtcCkcCocrHaaaaaaaaaaaaaaaaaacgwaafcdOchFcFEclUcomclscFFclqcomclocFKclWcdOaaaaaacrPaaactXctXctXctXctXaafckxaafctXctXctXctXctXaafcrPaaacBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaafaafaafaaIaafaafcAdcpFcFLcBycBxcFVcFUcBCcBBcGgcFWcBGcBFcGhcpFcBvcGocGucBJcBMcGvcnycnycnycnycnycnycnycnycGAcBNczAcBPcBQcoTcGEcoTcoTcxucoTcoTcGMcoTcBQcBTcCpcBUcCrcGOcHjcHacCPcHCcAObPwcCRcCScCTcCacAGcAVcBwcCacCtcCscCucHVcCXaaaaaaaaaaaaaaaaaacqvcCvctDcuQcIAcDbcuQckfckjcDeaafaaachxcCxcCwcCyaaaaaaaaaaacaaaaaaaaaaaaaaacdOcDhcplcplcomcDicplcplcomcDicplcplcdOaafaafcrPaafckVckSckSckSckSckyckxckwckvckvckvckvckUaafcrPaaacBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPcCzaaaaaaaaIaaaaaacCAcCCcIMcCEcCDcCGcIRcCHcCDcCGcIRcCHcCDcCGcCIcCIcITcCHcCDcCGcIZcnyaaacCMcCLcCVcCUcCZcCWcDjcDgcDkcDkcJhcDlcDocDncDqcJlcDncDqcDocDrckmcDscDrczAczAcAOcJAcJzcDPcDQcAObNUcDRcDScDTcCacCbcJBcCbcCacDvcDucDfaafaaaaaaaaaaaaaaaaaaaaacqvcCvcDVcDwckpckpcDwcsPcDYcqvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdOcDZcplcplcomcEacplcplcomcEacplcplcdOaaaaaacrPaafcwjcwjcwjcwjcwjaaackxaaacwjcwjcwjcwjcwjaaacrPaaacBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -7567,9 +7567,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaIaafaafaaacgEcFscKTcFscgEcFucKUcFucgEcFwcKVcFwcgEaafcgEcFwcKWcFwcgEaafaafaafcFYcFXcGacFZcGccGbcGdcDEcDkcGecKXcGfcDJcGicGmcGkcKYcGncDJcGpcGrcGqcDraaacLacKZcLccLbcLWcLdcLfcGFcGGcGHbNUaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacqvcCmcqxcqxcqxcCocqvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPcrPcrPcrPcrPaaaaaaaaaaaaaaaaaacBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccMaaaaaacgEcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEaaacGscgEcgEcgEcgEaaaaaaaaaaaacBNcBNcBNcBNcBNcLgcGtcGtcGtcGtcLhcGtcGwcGycGxcGycGzcGtcGtcgBcGtcGtcGtcLacKZcLkcLjcLmcLlcLnaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaaaaaaaafaafaaaaafaafaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaafaaacGQcGRcGRcGRcGScGBcGDcGCcGIcLocGKcGJcgCcGLcLqcGNcGTcGPcGVcGUcGXcGWcGZcGYcHbcLrcGYcGtcLacKZcLtcLscLXcLucLvaafaaacGQcHccGQcHccGQcHcaafcHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacBscBscBscBscBscBscBscBscBscBscBscBscBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafcHncjVcHpaaacHncjVcHpaaacHncjVcHpaafaafaaaaafaafaafaafaafcHqcGRcGRcGRcGScGBcHfcHecHhcHgcgVcHicHlcHkcHocHmcHscHrcHucHtcHucHucHucHvcHucHwcHxcGtcLxcKOcKOcKOcKOcKOcLyaafaafcHycHycHycHycHycHyaafcHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaabgaaacBscBscBscBscBscBscBscBscBscBscBscBscBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaacHncjWcHpaaacHncjWcHpaaacHncjWcHpaafaafaaaaafaaaaaacHKaafcGQcGRcGRcGRcGScGBcHfcHzcHBcHAcgYcHicHEcHDcHFcHbcHbcHbcHHcHGcHIcHbcHbcHDcHLcHJcHMcGtcGtcGtcHNaaaaaaaaaaaacHOaaacHPcHPcHPcHPcHPcHPaafcHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacBscBscBscBscBscBscBscBscBscBscBscBscBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafcHncjWcHpaaacHncjWcHpaafcHncjWcHpaafaaaaaaaafaafcIcaaaaafcHqcGRcGRcGRcGScGBcHRcHQcHTcHScgZcHUcHXcHWcHZcHYcHYcHYcIbcIacIdcHYcHYcIecIgcIfcIicIhcIkcIjcImcIlcIlcIlcIlcIlcIlcIncIocIncIocIncHyaafcHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacBscBscBscBscBscBscBscBscBscBscBscBscBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafcHncjVcHpaaacHncjVcHpaaacHncjVcHpaafaafaaaaafaafaafaafaafcHqcGRcGRcGRcGScGBcHfcHecHhcHgbSMcHicHlcHkcHocHmcHscHrcHucHtcHucHucHucHvcHucHwcHxcGtcLxcKOcKOcKOcKOcKOcLyaafaafcHycHycHycHycHycHyaafcHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaabgaaacBscBscBscBscBscBscBscBscBscBscBscBscBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaacHncjWcHpaaacHncjWcHpaaacHncjWcHpaafaafaaaaafaaaaaacHKaafcGQcGRcGRcGRcGScGBcHfcHzcHBcHAbSNcHicHEcHDcHFcHbcHbcHbcHHcHGcHIcHbcHbcHDcHLcHJcHMcGtcGtcGtcHNaaaaaaaaaaaacHOaaacHPcHPcHPcHPcHPcHPaafcHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacBscBscBscBscBscBscBscBscBscBscBscBscBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafcHncjWcHpaaacHncjWcHpaafcHncjWcHpaafaaaaaaaafaafcIcaaaaafcHqcGRcGRcGRcGScGBcHRcHQcHTcHSbSOcHUcHXcHWcHZcHYcHYcHYcIbcIacIdcHYcHYcIecIgcIfcIicIhcIkcIjcImcIlcIlcIlcIlcIlcIlcIncIocIncIocIncHyaafcHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacBscBscBscBscBscBscBscBscBscBscBscBscBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaacHncjWcHpaafcHncjWcHpaaacHncjWcHpaaaaaaaaaaaaaafaafaaaaafaaaaaaaaaaaaaafcIpcIrcIqcItcIscIucGJcIvcHbcHbcHbcIxcIwcIzcIycIBcLBcIDcICcIFcIEcIHcIGcINcIIcImcIOcIPcIOcIPcIOcIPcIOcIPcIOcIPcIOcHyaafcHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacBscBscBscBscBscBscBscBscBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaIaafaaacHncjWcHpaafcHncjWcHpaaacHncjWcHpaafaaaaaaaaaaaaaafaafcIJcIKcIKcIKcIKcILcILcILcILcILcLCcILcGtcIQcHbcHbcHbcLDcGtcLEcIScLFcGtcLGcJdcJicIfcJkcJjcLHcGtaaacHPcHPcHPcHPcJmcHPcHPcHPcHPcHPcHPcHPaafcHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacBscBscBscBscBscBscBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaaaaafaafczCaafaafaafczCaafaaaaafczCaafaaaaaaaaaaaaaaacIUcIVcIWcIXcIYcJncJacJbcJcciFcJecJfcJgcJecGtcLIcJocHbcHbcJrcJqcJtcJscJucJqcJwcJvcIgcIfcJycJxcJLcGtaafcHycHycHycHycHycHycHycHycHycHycHycHyaafaanaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/maps/exodus-2.dmm b/maps/exodus-2.dmm
index 54f5f95db4..fde4aa252b 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/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)
"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/item/stack/material/steel{amount = 50},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom)
"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/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)
"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/stack/material/glass{amount = 15},/obj/item/weapon/cell{charge = 100; maxcharge = 15000},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start)
"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/standard,/obj/item/seeds/potatoseed,/obj/item/seeds/potatoseed,/obj/item/seeds/ambrosiavulgarisseed,/obj/item/weapon/material/minihoe,/obj/item/weapon/beartrap,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station)
"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/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)
"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/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)
"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/gun/launcher/crossbow,/obj/item/stack/rods{amount = 10},/obj/machinery/light/small{dir = 8},/obj/item/weapon/beartrap,/obj/item/weapon/beartrap,/obj/item/weapon/beartrap,/obj/item/weapon/beartrap,/obj/item/weapon/beartrap,/obj/item/weapon/beartrap,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/skipjack/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/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)
"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/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)
"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/item/weapon/material/knife/ritual,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/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 = 1; 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/material/knife/ritual,/turf/unsimulated/floor{dir = 4; icon_state = "chapel"},/area/wizard_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/simple_door/iron,/turf/unsimulated/floor{icon_state = "engine"},/area/wizard_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/simple_door/wood{tag = "icon-wood"; icon_state = "wood"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_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)
@@ -2148,7 +2148,7 @@
"Pp" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "vox_west_vent"; tag_exterior_door = "vox_northwest_lock"; frequency = 1331; id_tag = "vox_west_control"; tag_interior_door = "vox_southwest_lock"; pixel_x = 24; req_access = list(150); tag_chamber_sensor = "vox_west_sensor"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1331; id_tag = "vox_west_vent"},/obj/machinery/light/small,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station)
"Pq" = (/obj/structure/reagent_dispensers/watertank,/obj/machinery/light/small{dir = 4},/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station)
"Pr" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/syndicate/black/engie,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/syndicate/black/engie,/obj/machinery/light/small{dir = 8},/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station)
-"Ps" = (/obj/structure/table/rack,/obj/item/weapon/gun/launcher/crossbow,/obj/item/stack/rods{amount = 10},/obj/machinery/light/small{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/skipjack/station)
+"Ps" = (/obj/structure/simple_door/wood{tag = "icon-wood"; icon_state = "wood"},/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station)
"Pt" = (/obj/machinery/floodlight,/turf/simulated/shuttle/plating,/area/shuttle/skipjack/station)
"Pu" = (/obj/structure/table/rack,/obj/item/weapon/grenade/empgrenade,/obj/item/weapon/grenade/flashbang,/obj/item/weapon/grenade/spawnergrenade,/obj/machinery/light/small{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/skipjack/station)
"Pv" = (/obj/machinery/status_display{pixel_y = -30},/obj/machinery/light,/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom)
@@ -2261,7 +2261,7 @@ aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMmumumumumuaMaMaMaMaMaMaMaMaMnvnHnInJninLnnnHnzaMndnenmnmnenenenenCnonononpihihihihihmumumumumumumumumumu
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMmumumumuaMaMaMaMaMaMaMaMaMnHnQnRnRnSnRnRnLnHaMndnqnrnsntneneneihnonononuihbOkQbTihmumumumumumumumumumu
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumuaMaMaMaMaMaMaMaMaMaMnHDgnRnRnRnRoaDqnHaMndnenAnAnenenepaihnKnonDnEihbLkQmkihmumumumumumumumumumu
-aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHofnRnRLqnRnRohnHaMndnenenenenenenMihihihihihihbPkQnGihmumumumumumumumumumu
+aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHsDnRnRLqnRnRohnHaMndnenenenenenenMihihihihihihbPkQnGihmumumumumumumumumumu
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMomnHonnHnHnHnHnHooaMnTnananUihkdkdkdihkTkTnVnWihcikQrcihmumumumumumumumumumu
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHoCoyNpounFnHaMaMaMaMaMaMobkdkdkdoclalaododihcikQrcihmumumumumumumumumumu
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHoBoAoanRornHaMaMaMaMaMaMoikdkdkdihojlaihihihokolokihihihihmumumumumumumu
@@ -2271,10 +2271,10 @@ aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMmumuaMaMaMaMphoWpjoWnHnHnHpbnHnHpfoOplpooZpmpLpmkdkdkdkdihoqopkQkQkQkQkQkQkQkQoMihmumumumumumu
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMmumumuaMaMaMaMnHnHphpknHnHMYnRMUnHnHpzptpznHoIoIihoPnanUihihihihowovkQkQkQozozoeihihmumumumumumu
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMnHpxnRnRpHnHnRnRnRnHrbsoOZpInHmBaMmBaMaMaMaMmumuihihihokpcokihihihihmumumumumumumu
-aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUoVoVoVpdpepepepepApApepepepepgoVoVoVoVoNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMnHpynRnRnRpCnRnRnRpJnRnRnRoXnHmKmKmKmKaMaMaMaMmumumuihoEkQoEihmumumumumumumumumumu
+aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUoVoVoVpdpepepepepApApepepepepgoVoVoVoVoNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMnHofnRnRnRpCnRnRnRpJnRnRnRoXnHmKmKmKmKaMaMaMaMmumumuihoEkQoEihmumumumumumumumumumu
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUoVoVpdpppqprpspeqbpupepvpwpepepepgoVoVoNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumumumumuaMaMaMaMnHqCnRnRnRqcnRnRnRqpnRnRnRqFnHaMaMaMaMaMaMaMaMaMmumuihoEkQoEihmumumumumumumumumumu
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUoVpdpepBpBpBpBpeqDqDpepBpBpDpEpepepgoVpFpFpFpFpFaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMnvnHnHnHnHnHnHnRnRnRnHnHnHnHnHnHnzaMaMaMaMaMmAaMmBmumuihoEkQoEihmumumumumumumumumumu
-aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUpdpepepMpNpOpPpepBpBpQpBpBpBpBpRpSpeoVpFpTpUpVpFpFpFpFpFpWpXpXpYpFpFaMaMaMaMaMaMaMaMpZpZpZpZpZpZpZpZpZpZpZaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMnHqZrasesrqEnHqanRqdnHsurfrfrgscnHaMaMaMaMaMmAmBmumumuihoEkQoEihmumumumumumumumumumu
+aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUpdpepepMpNpOpPpepBpBpQpBpBpBpBpRpypeoVpFpTpUpVpFpFpFpFpFpWpXpXpYpFpFaMaMaMaMaMaMaMaMpZpZpZpZpZpZpZpZpZpZpZaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumumumuaMaMaMaMnHqZrasesrqEnHqanRqdnHsurfrfrgscnHaMaMaMaMaMmAmBmumumuihoEkQoEihmumumumumumumumumumu
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUqeqfqgpBqhqhqhpepBpBpeqiqjqkqlqmqnpeoVpFqopUpUqIqqqrqsqtquqsqvqwqxpFpFpFpFpFpFpFpFpFpFqyqzqzqzqzqzqzqzqAqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumumuaMaMaMaMaMnxrjrjrjrjrjnHnRnRnRnHrenRnRnRrknwaMaMaMaMaMmPaMmumumuihihyxihihmumumumumumumumumumu
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUqGqfpBpBpBpBpBpQpBpBpepepepepepepeqHrdpFpFpFpFpFqqqvqsqJOaqsqvqvqvqLqMqMqMqMqMqMqMqMqNqyqOqPqPqPqPqPqQqAqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMmumuaMaMaMaMaMaMnhrCrDrjrjrjrinRnRnRrqnRnRnRrGrHmiaMaMaMaMaMmAmBmBmumumuihihihmumumumumumumumumumumu
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUqRpeqSpBqSpBqSpepBpBpBqTqUoVoVoVoVoVqVqWqMqMqMqLqvqvqvqvqvqvqvqvqvqLqMqMqMqMqMqMqMqMqNqyqXqYqYqYqYqYqXqAqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnyrjrjrjrjrjrtnRnRnRrAnRnRnRnRrSnBaMaMaMaMaMmAaMaMmBmumumumumumumumumumumumumumumumu
@@ -2283,7 +2283,7 @@ aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUqeqfrJrJrJrJrJpQpBpBpepepepepepepepgoVpFpTpUpVpFqvqvqsqJrKqsqvqqqqpFrLrLrLrLpFrMrxrNpZqzqXqYqYqYqYqYsdpZqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHvUrjsfslnHnHnRsJsKnHnHnHsGnRLxnHaMaMaMaMaMaMaMmAmBmBmumumumumumumumumumumumumumumu
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUqGqfrUrJrJrJrJpepBpBpBpBpBpepBrVrWpeoVpFqopUpUqIqvqvqvqvqvqvqvqvqvpFrLrXrYrYpFpFsqpFpZqzqXqYqYqYqYsvqXpZqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHsWsXsYnHaMnHsZsZsZnHaMnHnLtatbnHaMaMaMaMaMaMaMmAaMmBaMmumumumumumumumumumumumumumu
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUqRpepesgshshshpepBpNsipNpBpQpBsjskpeoVpFpFpFpFpFpFpFswpFpFpFqvqvqvsmrLsnsnrLrLrLrLrYpZqzqXqYqYqYqYqYsdpZqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMnHsZsZsZnHaMomtmtntoooaMnHsZsZsZnHaMaMaMaMaMaMaMmAmBmBmBmBmBmumumumumumumumumumumumu
-aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUoVqRperJrJrJrJpepBsipNsipBpeqSpepeqHoVpFsxsyszpFsAsBsBsBsCpFqvqvqvqvrLrLrLrLsDrLrLrYpZqzqXqYqYqYqYsEsFpZqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMmumuaMaMaMomtmtntoooaMaMaMaMaMaMaMomtmtntoooaMaMaMaMaMaMaMmAaMmBaMmBaMaMmumumumumumumumumumumu
+aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUoVqRperJrJrJrJpepBsipNsipBpeqSpepeqHoVpFsxsyszpFsAsBsBsBsCpFqvqvqvqvrLrLrLrLpSrLrLrYpZqzqXqYqYqYqYsEsFpZqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMmumuaMaMaMomtmtntoooaMaMaMaMaMaMaMomtmtntoooaMaMaMaMaMaMaMmAaMmBaMmBaMaMmumumumumumumumumumumu
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUoVoVqRpesLsMsIpepBpBpBpBpBpepepeqHoVoVpFsOsPsQsRsBsBsBsBsSpFqvqvqvsmsTrLrLrLsUrLrLsVpZqzqXnZqYqYqYogqXpZqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMmumumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumumumu
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUoVoVoVqRpepepepepepepepepepeqHoVoVoVoVpFpFtctdpFpFpFtctetdpFqvqvqvpFtftgtgtgtgtgthpFpZqztitjqYqYqYtktlqAqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMmumuaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumumumu
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMoToUoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVpFtptptptptptptptptppFpFsNpFpFtptptptptptptppFpZqztrtstttttttstuqAqBaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMmumumumumumumumumumumu
@@ -2319,7 +2319,7 @@ mumuAnFYFYFYFYAnAnmumuAnJAJBJAEpASASASASASASASASASASAKJDJCJEDUJrmumumumumumuaMmt
mumuJIFYFYFYFYJJAnmumuISJKJAJAEpASASASASASASASASASASAKAnAnAnAnAnmumumumumumuaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAVAWBWBXJLBZBBCaCaCaCaCaCaCbCcAYAWAWCNCJCICKCPCPCNCQCLCRDCDCDCDCDDDCDCCSDCDCCTCVCmCVJNADADADOJCWADADOJADADCrACaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
mumuJOJVJUFYJWFYFYmumuHmJXJYAoArArArArArArILArDIEpDUDEILArArArArArArAsmumuaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAVAWAWBWBmCsBWBmBmBoBpBqBmCtBsAYAWAWCNCYCXDbCPCPDcDCDDDCDCDCDCDCDDDCDCDCDCDCCTDdCGCHAtOpADCrCCBuADCrCCBuADOuAtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
mumuJZFYKaFYJUFYFYmumuAnAnAnAKASASASASASASAKKbKcKcKcKdAKASASASASASASAKmuaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAVAWAWAWAWAWAWAWAWAWAWAWAWAWAXAYAWAWCNDrDpDFCPCPDcDCDDDCDCDCDCDMDLCGEcDCDCECEdCNaMaMCCBuADCrCMBuADCrCMBuADCrCCaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
-mumuAnFYKjFYOQFYFYmumuaMaMmuAKASAZASASASASHmKcKcKuKcKcHmASASASASAZASAKmuaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNCNCNCNCNCNCNCNCNCNCNCNCNCNCNCNCNCNCNEDCOCOCPCPCNEKEEEXDCEYDCCyFlDyFxDCCTGOFGCNaMaMCMBuADCrCMBuNcCrCMBuADCrCMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
+mumuAnFYKjFYOQFYFYmumuaMaMmuAKASAZASASASASHmKcKcKuKcKcHmASASASASAZASAKmuaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNCNCNCNCNCNCNCNCNCNCNCNCNCNCNCNCNCNCNIqImImCPCPCNEKEEEXDCEYDCCyFlDyFxDCCTGOFGCNaMaMCMBuADCrCMBuNcCrCMBuADCrCMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
mumuAnKxKwFYFYKyFYmumuaMaMmuAKASASASASASASEpKcKcKzKcKcEpASASASASASASAKmuaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNGTGRGRGRHfCZDaCPCPCPHQCPCPCPCPCPCPCPCPCPCPNyCPCNDyCxIKDCDCDCCFCECGJMDCDCKvKiCNaMaMDfBuADCrCMBuADCrCMBuADCrDfaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
mumuAnAnFYFYFYFYAnmumumAaMaMAKASASISKAKCKBISKcKLKDKcKcISKAKCKBISASASAKaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNMSMSMSMSMSDhDiDjDkDlCPDmDnDoDlCPCPCPCPCPCPCPCPCNDyCxMTDCDCDCDCDDDCDCDCDCDCCTDdCGCHAtPxADCrDfBuADCrDfBuADPwAtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
mumuAnAnAnAnKMKNAnmumBmAaMaMHmASASHmaMaMaMDWDIKAKCKBDUJraMaMaMHmASASHmaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNMSMVMSMSMSDsDiDtDuDlCPDmDvDwDlCPCPDxDxDxDxDxDxCNDyDzDADBDCDCDCDDDCDCDCDCDCCTCVCmCVKOADADPvADADADADADPvADCrACaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
@@ -2331,10 +2331,10 @@ mumumumumumuaMaMaMaMaMaMaMaMMHLfMLMHaMaMaMLgMOMIMIMIMJLkaMaMaMMHNnLmMHaMaMaMaMmt
mumumumumumuaMaMaMaMaMaMaMaMLsMpMwLsaMaMKYLsLrMmMnMoLrLsKZaMaMLsMGMFLsaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNMSMSMSNWNXEZEZEZEZEZEHFaFbFcFdFeFfFgFbFaEHCNCNCNCNCNCNOmFiNqFkERESCNaMaMaMaMaMaMaMaMaMaMETATEUEUEUATEWaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
mumumumumumuaMaMaMaMaMaMaMaMLsOoPpLsaMaMLgMfPoOhOROhPnMeLkaMaMLsPmOgLsaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNPbMSNWNXEZEZEZEZEZEZEHFbFmFnFdFeFfFnFoFbEHFpFqFrFsFtCNDVFhFkDVDVEwFuaMaMaMaMaMaMaMaMaMaMaMETEVEVEVEWaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
mumumumumumuaMaMaMaMaMaMaMaMLyOeLpLoLpLpLXOdMaMaMaMaMaOcLyLpLpLoLpNBLXaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNMSNWNXEZEZEZEZEZEZEZEHFvFbFvFdFeFfFvFbFvEHFwDVDVDVDVMqDVDVDVDVDVFyFzaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
-mumumumumumuaMaMaMaMaMaMaMaMLsMsMrMuMtMvLsOLMaMaMaMaMaOLLsMyMxMBMzMsLsaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNNWNXEZEZEZEZEZEZEZEZEHFAFbFbFdFeFfFbFbFBEHFCFDFEFFMCCNDVDVDVDVDVFHFIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
+mumumumumumuaMaMaMaMaMaMaMaMLsMsEDMuCOMvLsOLMaMaMaMaMaOLLsMyMxGLMzMsLsaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMCNNWNXEZEZEZEZEZEZEZEZEHFAFbFbFdFeFfFbFbFBEHFCFDFEFFMCCNDVDVDVDVDVFHFIaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
mumumuaMaMaMaMaMaMaMaMaMaMaMLsMsMDMDMDPqLsOwOGOHMbOwOGOHLsPrMDMDMKMsLsaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMAHCNCNCNCNCNCNCNCNCNCNCNEHFJFKFKFdFeFfFLFLFMEHFNFOFPFQFRCNFSFTFUFVFWFXCNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
mumumuaMaMaMaMaMaMaMaMaMaMaMLwMsMDMDMDMDMbMaMaMaMaMaMaMaMbMDMDMMMDMsLwaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFeFeFeFeFeFeFeFeFeFeFeEHEHMNEHEHFeEHEHMNEHEHEHEHEHEHEHCNCNCNCNCNCNCNCNaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
-mumumumuaMaMaMaMaMaMaMaMaMaMLWNbMDPtMDMDLsPsMaMaMaMaMaPuLsMDNMMDNUMsLWaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFeEHEHEHEHNZEHEHEHFeFeFeFeFeFeEHFeEHFeFeFeFeFeFeFeFeEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
+mumumumuaMaMaMaMaMaMaMaMaMaMLWNbMDPtMDMDLsHjMaMaMaMaMaPuLsMDNMMDNUMsLWaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFeEHEHEHEHNZEHEHEHFeFeFeFeFeFeEHFeEHFeFeFeFeFeFeFeFeEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
mumumumuaMaMaMaMaMaMaMaMaMaMLeNbMDMDLgLlLoLpLkLjLiLhLgLpLoLlLkOjOiOkLeaMaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFeEHGaGbGbGbGbGcEHEHEHEHEHEHEHEHGdEHEHEHEHEHEHEHEHFeEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
mumumumuaMaMaMaMaMaMaMaMaMKYLsOPOlOlLsOnPhOnLwLjLtLhLwOqOOOrLsOtOsOMLsKZaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFeEHGaGbGbGbGbGcEHGeGfGgGfGhGiGiGiGiGiGhGiGhGiGjEHFeEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
mumumumuaMaMaMaMmumuaMaMaMOvLdKsKsLYLXOnOnOnLWLjLiLhLWOrOrOxLyLZKsKsLdOyaMaMaMmtaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMEHFeEHGkGbGbGbGbGlEHGiGmGmGmGmGmGiGiGiGmGmGmGmGnGoEHFeEHEHEHEHEHEHEHaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
@@ -2391,20 +2391,20 @@ aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYHYHYHYHYHYHYHYHYHYHYHYHYHZHYHYHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIaIbIcIdIeIfHYIgIhIiHYIjIkIlHYHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
-aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcIcIcIcIcIcImInIoIpIqIkIkIrHYHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
+aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcIcIcIcIcIcMBInIoIpMtIkIkIrHYHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIsIsIcIcIcItHYIuIvIwHYHYHYHYHYHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcIcIcIcIcIxHYIyIyIzHYIAIBICIDHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
-aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIEIEIcIcIcIFHYIyIyIyIGIyIyIyIHHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
+aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIEIEIcIcIcIFHYIyIyIyPsIyIyIyIHHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcIcIcIcIcOUHYIMINIOHYIPIQIRIDHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVaMaMaMOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcIcIcIcIcItHYHYHYHYHYHYHYHYHYHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
-aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcJdJeJfJgIcJhJiJjJhJkGLJmJnHjHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVaMaMOVaMaMOVOVOVOVOVOVOVaMaMOVaMaMOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
+aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcJdJeJfJgIcJhJiJjJhJkKKJmJnMrHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVaMaMOVaMaMOVOVOVOVOVOVOVaMaMOVaMaMOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcJdJsJtJgIcJuJuJuJuJvJwJxJwJxHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVaMOVOVOVOVOVOVOVOVOVaMOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcJdJGOWJgIcJuJuJuJuJuJuJuJuJuHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVaMOVOVOVOVOVOVOVOVOVaMOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcJdJPJQJgIcJuJuJuJuJuJuJRJSJTHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVaMOVOVOVOVOVOVOVOVOVaMOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYIcIcIcIcIcIcJuJuJuJuJuJuJuJuJuHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYKeKfKfKgKfKfKfKgKfKfKfKgKfKfKhHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYKkKlKlJkKmKoKnJkKpKpKqJkKrOXKtHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
-aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYKlKEKkJvKGLvLuJvKHKIKpJvKJKtKKHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
+aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYKlKEKkJvKGLvLuJvKHKIKpJvKJKtIGHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
aMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMOVOVOVOVaMaMOVOVOVOVOVOVOVaMaMOVOVOVOVaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaM
diff --git a/maps/exodus-3.dmm b/maps/exodus-3.dmm
index caf3272970..4a2ecd8688 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)
@@ -101,11 +101,11 @@
"bW" = (/obj/structure/table/standard,/obj/item/weapon/screwdriver,/obj/machinery/light,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
"bX" = (/obj/structure/table/standard,/obj/item/device/radio/off,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship)
"bY" = (/obj/structure/lattice,/obj/structure/grille,/turf/space,/area/space)
-"bZ" = (/obj/machinery/power/solar/fake,/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/space)
+"bZ" = (/obj/machinery/power/solar,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/space)
"ca" = (/turf/simulated/floor/plating/airless,/area/space)
"cb" = (/obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh{name = "Cuban Pete-Meat"},/obj/item/weapon/spacecash/c1,/turf/simulated/floor/engine,/area/tcommsat/computer)
"cc" = (/obj/structure/table/standard,/obj/item/weapon/folder/yellow,/obj/item/weapon/folder/yellow,/obj/machinery/light{dir = 1},/obj/machinery/camera/network/telecom{c_tag = "Telecoms Main Computer Room"},/turf/simulated/floor,/area/tcommsat/computer)
-"cd" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/space)
+"cd" = (/obj/machinery/power/solar,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/space)
"ce" = (/turf/simulated/wall/r_wall,/area/space)
"cf" = (/turf/simulated/wall/r_wall,/area/turret_protected/tcomsat)
"cg" = (/turf/simulated/wall/r_wall,/area/tcommsat/computer)
@@ -132,7 +132,7 @@
"cB" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/tank/air{dir = 8},/turf/simulated/floor/plating,/area/turret_protected/tcomsat)
"cC" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 8},/turf/space,/area/turret_protected/tcomsat)
"cD" = (/obj/structure/filingcabinet,/turf/simulated/floor,/area/tcommsat/computer)
-"cE" = (/obj/machinery/camera/network/telecom{c_tag = "Telecoms West Solars"; dir = 8},/turf/space,/area/space)
+"cE" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/space)
"cF" = (/obj/structure/table/standard,/obj/item/weapon/paper_bin,/obj/item/weapon/pen/blue{pixel_x = -3; pixel_y = 2},/turf/simulated/floor,/area/tcommsat/computer)
"cG" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp,/turf/simulated/floor,/area/tcommsat/computer)
"cH" = (/obj/structure/table/standard,/obj/item/weapon/storage/fancy/cigarettes,/turf/simulated/floor,/area/tcommsat/computer)
@@ -171,7 +171,7 @@
"do" = (/obj/structure/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/turret_protected/tcomsat)
"dp" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/turret_protected/tcomsat)
"dq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/airlock/hatch{name = "Telecoms Control Room"; req_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/tcommsat/computer)
-"dr" = (/obj/structure/lattice,/obj/structure/grille/broken,/turf/space,/area/space)
+"dr" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating/airless,/area/space)
"ds" = (/obj/machinery/atmospherics/unary/freezer{dir = 2; icon_state = "freezer_1"; set_temperature = 73; use_power = 1},/turf/simulated/floor,/area/tcommsat/computer)
"dt" = (/obj/machinery/light{dir = 8},/obj/structure/table/standard,/obj/item/device/multitool,/obj/structure/sign/electricshock{pixel_x = -32},/turf/simulated/floor,/area/tcommsat/computer)
"du" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor,/area/tcommsat/computer)
@@ -185,7 +185,7 @@
"dC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/tcommsat/computer)
"dD" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/tcommsat/computer)
"dE" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/space)
-"dF" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/space)
+"dF" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating/airless,/area/space)
"dG" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating/airless,/area/space)
"dH" = (/obj/structure/disposaloutlet{dir = 4},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plating/airless,/area/space)
"dI" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/turret_protected/tcomsat)
@@ -236,7 +236,7 @@
"eB" = (/obj/machinery/airlock_sensor/airlock_interior{frequency = 1381; id_tag = "server_access_in_sensor"; name = "interior sensor"; pixel_y = 25},/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = 32},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber)
"eC" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/turret_protected/tcomsat)
"eD" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/micro_laser,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/micro_laser/high,/obj/item/weapon/stock_parts/micro_laser/high,/obj/item/weapon/stock_parts/micro_laser/high,/obj/item/weapon/stock_parts/micro_laser/high,/turf/simulated/floor,/area/turret_protected/tcomsat)
-"eE" = (/obj/machinery/camera/network/telecom{c_tag = "Telecoms East Solars"; dir = 4},/turf/space,/area/space)
+"eE" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating/airless,/area/space)
"eF" = (/obj/structure/table/rack,/obj/item/weapon/circuitboard/telecomms/processor,/obj/item/weapon/circuitboard/telecomms/processor,/obj/item/weapon/circuitboard/telecomms/receiver,/obj/item/weapon/circuitboard/telecomms/server,/obj/item/weapon/circuitboard/telecomms/server,/obj/item/weapon/circuitboard/telecomms/bus,/obj/item/weapon/circuitboard/telecomms/bus,/obj/item/weapon/circuitboard/telecomms/broadcaster,/turf/simulated/floor,/area/turret_protected/tcomsat)
"eG" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light{dir = 1},/obj/machinery/camera/network/telecom{c_tag = "Telecoms Central Compartment North"},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber)
"eH" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/camera/network/telecom{c_tag = "Telecoms Storage"},/turf/simulated/floor,/area/turret_protected/tcomsat)
@@ -249,8 +249,8 @@
"eO" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/treatment,/obj/item/weapon/stock_parts/subspace/treatment,/obj/item/weapon/stock_parts/subspace/treatment,/turf/simulated/floor,/area/turret_protected/tcomsat)
"eP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/turret_protected/tcomsat)
"eQ" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/analyzer,/obj/item/weapon/stock_parts/subspace/analyzer,/obj/item/weapon/stock_parts/subspace/analyzer,/turf/simulated/floor,/area/turret_protected/tcomsat)
-"eR" = (/obj/machinery/camera/network/telecom{c_tag = "Telecoms North Solars"; dir = 8},/turf/space,/area/space)
-"eS" = (/turf/simulated/floor/plating,/area/space)
+"eR" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating/airless,/area/space)
+"eS" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/space)
"eT" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 8},/obj/machinery/light{dir = 4},/turf/space,/area/turret_protected/tcomsat)
"eU" = (/obj/structure/sign/nosmoking_2{pixel_x = -32; pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber)
"eV" = (/obj/machinery/telecomms/processor/preset_two,/turf/simulated/floor{dir = 1; icon_state = "vault"; name = "Mainframe floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber)
@@ -292,7 +292,7 @@
"fF" = (/obj/machinery/telecomms/server/presets/security,/turf/simulated/floor{dir = 4; icon_state = "vault"; name = "Mainframe floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber)
"fG" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/turret_protected/tcomsat)
"fH" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 140; external_pressure_bound_default = 140; icon_state = "map_vent_out"; use_power = 1; pressure_checks = 0; pressure_checks_default = 0},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber)
-"fI" = (/obj/machinery/camera/network/telecom{c_tag = "Telecoms South Solars"; dir = 4},/turf/space,/area/space)
+"fI" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating/airless,/area/space)
"fJ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; external_pressure_bound_default = 0; icon_state = "map_vent_in"; initialize_directions = 1; internal_pressure_bound = 4000; internal_pressure_bound_default = 4000; use_power = 1; pressure_checks = 2; pressure_checks_default = 2; pump_direction = 0},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber)
"fK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/wall/r_wall,/area/tcommsat/chamber)
"fL" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/space,/area/turret_protected/tcomsat)
@@ -314,9 +314,9 @@
"gb" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 10},/turf/simulated/floor/plating,/area/tcommsat/chamber)
"gc" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 4},/turf/simulated/floor/plating,/area/tcommsat/chamber)
"gd" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/turret_protected/tcomsat)
-"ge" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{icon_state = "warningcorner"; dir = 4},/area/tcommsat/entrance)
+"ge" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/camera/network/telecom{c_tag = "Telecoms - Solar North"; dir = 1},/turf/simulated/floor/plating/airless,/area/space)
"gf" = (/obj/machinery/camera/network/telecom{c_tag = "Telecoms Entrance North"},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/tcommsat/entrance)
-"gg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/light/small{dir = 1},/obj/machinery/camera/network/telecom{c_tag = "Telecoms Power Room East"},/turf/simulated/floor,/area/tcommsat/entrance)
+"gg" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating/airless,/area/space)
"gh" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/lattice,/turf/space,/area/turret_protected/tcomsat)
"gi" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'LETHAL TURRETS'. Enter at your own risk!"; name = "LETHAL TURRETS"; pixel_x = -32; pixel_y = 0},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/turret_protected/tcomfoyer)
"gj" = (/obj/machinery/light/small,/turf/simulated/floor{icon_state = "warningcorner"; dir = 1},/area/turret_protected/tcomfoyer)
@@ -327,7 +327,7 @@
"go" = (/turf/simulated/wall/r_wall,/area/tcommsat/entrance)
"gp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/hatch{name = "Telecoms Satellite"; req_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/turret_protected/tcomfoyer)
"gq" = (/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/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/tcommsat/entrance)
-"gr" = (/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/tcommsat/entrance)
+"gr" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/space)
"gs" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 6},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber)
"gt" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 9},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber)
"gu" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 5},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber)
@@ -336,13 +336,13 @@
"gx" = (/turf/simulated/floor,/area/tcommsat/entrance)
"gy" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 10},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber)
"gz" = (/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/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/tcommsat/entrance)
-"gA" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/fractal_reactor{mapped_in = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor,/area/tcommsat/entrance)
-"gB" = (/obj/machinery/power/breakerbox/activated{RCon_tag = "Telecommunications Main Breaker"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/tcommsat/entrance)
-"gC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/light/small{dir = 1},/obj/machinery/camera/network/telecom{c_tag = "Telecoms Power Room West"},/turf/simulated/floor,/area/tcommsat/entrance)
+"gA" = (/obj/machinery/power/solar,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/space)
+"gB" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating/airless,/area/space)
+"gC" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating/airless,/area/space)
"gD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/tcommsat/entrance)
-"gE" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/tcommsat/entrance)
+"gE" = (/obj/machinery/power/solar,/obj/structure/cable/yellow,/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/space)
"gF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light,/obj/machinery/camera/network/telecom{c_tag = "Telecoms Central Compartment South"; dir = 1},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber)
-"gG" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor,/area/tcommsat/entrance)
+"gG" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating/airless,/area/space)
"gH" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/tcommsat/entrance)
"gI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/hatch{name = "Telecoms Satellite"; req_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/tcommsat/entrance)
"gJ" = (/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/tcommsat/entrance)
@@ -352,23 +352,23 @@
"gN" = (/turf/simulated/floor{icon_state = "warningcorner"; dir = 8},/area/tcommsat/entrance)
"gO" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/tcommsat/entrance)
"gP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/tcommsat/entrance)
-"gQ" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor,/area/tcommsat/entrance)
+"gQ" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/camera/network/telecom{c_tag = "Telecoms - Solar West"; dir = 8},/turf/simulated/floor/plating/airless,/area/space)
"gR" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor,/area/tcommsat/entrance)
-"gS" = (/obj/structure/sign/vacuum,/turf/simulated/wall/r_wall,/area/tcommsat/entrance)
-"gT" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/tcommsat/entrance)
+"gS" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/space)
+"gT" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/camera/network/telecom{c_tag = "Telecoms - Solar East"; dir = 4},/turf/simulated/floor/plating/airless,/area/space)
"gU" = (/obj/item/weapon/cell,/turf/simulated/floor,/area/tcommsat/entrance)
"gV" = (/obj/structure/closet/malf/suits,/turf/simulated/floor,/area/tcommsat/entrance)
-"gW" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1381; master_tag = "telecoms_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = 25; req_access = list(13)},/turf/simulated/floor/plating/airless,/area/space)
-"gX" = (/obj/machinery/door/airlock/external{frequency = 1381; icon_state = "door_locked"; id_tag = "telecoms_outer"; locked = 1; name = "External Access"; req_access = list(10,13)},/turf/simulated/floor/plating,/area/tcommsat/entrance)
+"gW" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating/airless,/area/space)
+"gX" = (/obj/machinery/light/small{dir = 1},/obj/machinery/camera/network/telecom{c_tag = "Telecoms Power Room West"},/turf/simulated/floor,/area/tcommsat/entrance)
"gY" = (/obj/machinery/camera/network/telecom{c_tag = "Telecoms West Wing South"; dir = 4},/turf/space,/area/turret_protected/tcomsat)
-"gZ" = (/obj/machinery/door/airlock/external{frequency = 1381; icon_state = "door_locked"; id_tag = "telecoms_inner"; locked = 1; name = "External Access"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plating,/area/tcommsat/entrance)
-"ha" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1381; master_tag = "telecoms_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/tcommsat/entrance)
-"hb" = (/obj/machinery/bluespace_beacon,/turf/simulated/floor,/area/tcommsat/entrance)
+"gZ" = (/obj/machinery/light/small{dir = 1},/obj/machinery/camera/network/telecom{c_tag = "Telecoms Power Room East"},/turf/simulated/floor,/area/tcommsat/entrance)
+"ha" = (/turf/simulated/wall/r_wall,/area/tcommsat/powercontrol)
+"hb" = (/obj/structure/sign/vacuum,/turf/simulated/wall/r_wall,/area/tcommsat/powercontrol)
"hc" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 29; pixel_y = 0},/turf/simulated/floor,/area/tcommsat/entrance)
-"hd" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating/airless,/area/space)
+"hd" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/obj/machinery/camera/network/telecom{c_tag = "Telecoms - Airlock"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/tcommsat/powercontrol)
"he" = (/obj/structure/closet/crate,/obj/item/clothing/glasses/night,/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/tcommsat/entrance)
"hf" = (/turf/simulated/floor{icon_state = "warningcorner"; dir = 1},/area/tcommsat/entrance)
-"hg" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1381; id_tag = "telecoms_pump"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "telecoms_pump"; tag_exterior_door = "telecoms_outer"; frequency = 1381; id_tag = "telecoms_airlock"; tag_interior_door = "telecoms_inner"; pixel_x = 0; pixel_y = -25; req_access = list(13); tag_chamber_sensor = "telecoms_sensor"},/obj/machinery/airlock_sensor{frequency = 1381; id_tag = "telecoms_sensor"; pixel_x = 12; pixel_y = -25},/obj/machinery/camera/network/telecom{c_tag = "Telecoms - Airlock"},/turf/simulated/floor/plating,/area/tcommsat/entrance)
+"hg" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1381; id_tag = "telecoms_pump"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/tcommsat/powercontrol)
"hh" = (/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/tcommsat/entrance)
"hi" = (/obj/machinery/light{dir = 4},/obj/structure/closet/emcloset,/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/tcommsat/entrance)
"hj" = (/obj/machinery/computer/teleporter,/turf/simulated/floor/plating,/area/tcommsat/entrance)
@@ -380,12 +380,12 @@
"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)
"hw" = (/obj/item/weapon/cell,/turf/simulated/floor/plating/airless,/area/AIsattele)
-"hx" = (/obj/structure/sign/electricshock,/turf/simulated/wall/r_wall,/area/tcommsat/entrance)
+"hx" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1381; master_tag = "telecoms_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access = list(13)},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/tcommsat/powercontrol)
"hy" = (/turf/space,/area/AIsattele)
"hz" = (/obj/structure/table,/turf/simulated/floor/plating/airless,/area/AIsattele)
"hA" = (/obj/structure/lattice,/turf/space,/area/AIsattele)
@@ -393,13 +393,44 @@
"hC" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless,/area/AIsattele)
"hD" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor,/area/tcommsat/entrance)
"hE" = (/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/turf/simulated/floor/plating/airless,/area/AIsattele)
-"hF" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/machinery/computer/power_monitor{name = "telecoms power monitoring"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/sensor{long_range = 1; name = "Powernet Sensor - Telecommunications Grid"; name_tag = "Telecommunications Grid"},/turf/simulated/floor{icon_state = "bot"},/area/tcommsat/entrance)
+"hF" = (/obj/machinery/door/airlock/external{frequency = 1381; icon_state = "door_locked"; id_tag = "telecoms_inner"; locked = 1; name = "External Access"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/tcommsat/powercontrol)
"hG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor,/area/turret_protected/tcomfoyer)
"hH" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/turret_protected/tcomsat)
"hI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/turret_protected/tcomfoyer)
"hJ" = (/obj/machinery/door/airlock/hatch{name = "Telecoms East Wing"; req_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/turret_protected/tcomfoyer)
"hK" = (/obj/structure/grille/broken,/turf/simulated/floor/plating/airless,/area/AIsattele)
"hL" = (/obj/structure/grille/broken,/turf/space,/area/AIsattele)
+"hM" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/camera/network/telecom{c_tag = "Telecoms - Solar Control"},/turf/simulated/floor/plating,/area/tcommsat/powercontrol)
+"hN" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plating,/area/tcommsat/powercontrol)
+"hO" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/plating,/area/tcommsat/powercontrol)
+"hP" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1381; id_tag = "telecoms_pump"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "telecoms_pump"; tag_exterior_door = "telecoms_outer"; frequency = 1381; id_tag = "telecoms_airlock"; tag_interior_door = "telecoms_inner"; pixel_x = 0; pixel_y = -25; req_access = list(13); tag_chamber_sensor = "telecoms_sensor"},/obj/machinery/airlock_sensor{frequency = 1381; id_tag = "telecoms_sensor"; pixel_x = 12; pixel_y = -25},/turf/simulated/floor/plating,/area/tcommsat/powercontrol)
+"hQ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/tcommsat/powercontrol)
+"hR" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/tcommsat/powercontrol)
+"hS" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/tcommsat/powercontrol)
+"hT" = (/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/power/solar_control/autostart,/obj/machinery/light{dir = 4},/turf/simulated/floor/plating,/area/tcommsat/powercontrol)
+"hU" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/tcommsat/entrance)
+"hV" = (/obj/machinery/door/airlock/external{frequency = 1381; icon_state = "door_locked"; id_tag = "telecoms_outer"; locked = 1; name = "External Access"; req_access = list(10,13)},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/tcommsat/powercontrol)
+"hW" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/table/standard,/obj/item/stack/material/glass{amount = 50},/obj/item/stack/cable_coil/random,/obj/item/stack/cable_coil/random,/turf/simulated/floor/plating,/area/tcommsat/powercontrol)
+"hX" = (/turf/simulated/floor/plating,/area/tcommsat/powercontrol)
+"hY" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/machinery/power/sensor{long_range = 1; name_tag = "Telecommunications"},/turf/simulated/floor/plating,/area/tcommsat/powercontrol)
+"hZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/tcommsat/entrance)
+"ia" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light{dir = 1},/turf/simulated/floor/plating/airless,/area/tcommsat/powercontrol)
+"ib" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plating/airless,/area/tcommsat/powercontrol)
+"ic" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1381; master_tag = "telecoms_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = 25; req_access = list(13)},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/tcommsat/powercontrol)
+"id" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light{dir = 8},/turf/simulated/floor/plating,/area/tcommsat/powercontrol)
+"ie" = (/obj/machinery/door/airlock/hatch{name = "Power Control"; req_access = list(61)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/tcommsat/powercontrol)
+"if" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/tcommsat/powercontrol)
+"ig" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/tcommsat/entrance)
+"ih" = (/obj/machinery/bluespace_beacon,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor,/area/tcommsat/entrance)
+"ii" = (/obj/machinery/power/terminal{dir = 4},/obj/structure/cable/yellow,/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/tcommsat/powercontrol)
+"ij" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/table/standard,/obj/machinery/recharger,/turf/simulated/floor/plating,/area/tcommsat/powercontrol)
+"ik" = (/obj/machinery/power/smes/buildable{charge = 2.5e+006; input_attempt = 1; input_level = 250000; inputting = 1; output_level = 250000; RCon_tag = "Telecommunications Satellite"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/tcommsat/powercontrol)
+"il" = (/obj/structure/sign/electricshock,/turf/simulated/wall/r_wall,/area/tcommsat/powercontrol)
+"im" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/table/standard,/obj/machinery/cell_charger,/turf/simulated/floor/plating,/area/tcommsat/powercontrol)
+"in" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/power/tracker,/turf/simulated/floor/plating/airless,/area/space)
+"io" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating/airless,/area/space)
+"ip" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/camera/network/telecom{c_tag = "Telecoms - Solar South"},/turf/simulated/floor/plating/airless,/area/space)
+"iq" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/space)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -492,83 +523,83 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYbYbYbYbYbYbYbYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaUaaaaaaaaaaaUaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaUaUaUbZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaadraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaUaUaUbZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadraabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZeRbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaUaUcacacacacacacaaUaUbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaUaaaacaaaaaaUaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYbYbYbYbYbYbYbYbYbYbYcdbYbYbYbYbYbYbYbYbYbYbYbYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYcececececececececececececececececececececececececececebYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYcececfcfcfcfcfcfcfcfcfcecececececececececgcgcgcgcgcgcgcgcebYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcececfchcictckclcmcncocfcgcgcgcgcgcgcgcgdYcgdXdWdVdSdRcvcgcecebYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcecfchchchcwcxcyczcAcBcCcgdQcDcccFcvcGcgcQcgdPcvcvcvcvcvcgcecebYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcecfcichcicJcKcLcMcNcOcPcgdddgdfcTcRcScgcQcgcIcvcvcvcvcvcgceceaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcecfcichcicicUcVcWcXcYcZdadbdccvcvcqdecgcbcgcpcjcscrcHcucgcecebYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcecfcichcicJdmdndodpdpdpdqdMdvdNdvdudwdwdwcgdydxdCdBdAdzdDdEdEdFdGdHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYbYbYbYbYbYdrbYbYbYbYbYbYbYbYbYbYbYcecfcichcicJdIdJdKdLdLdLcgdtdsdOcvdhdjdidkcgcgcgdlcgcgcgcgcecebYbYbYbYbYbYbYbYbYbYbYbYbYbYbYbYbYdrbYbYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUbYcecfchdTchdUdIcCdwdwdwdwdwfefBfAgcgbdwdwfDdwdwdUebfCchdTchcfcebYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaUbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZaaaabYcecfcichcicJedeedwefefefegekeieGefdZeLeBeleodwdUebcPcichcicfcebYbYaaaUbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaacacacacacacacacacacacacacacacacacaaabYcecfcichcicJemendwefelelelecelepelecelelelefdwdUebcPeqerescfcecebYaUcacacacacacacacacacacacacacacacacaaUbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZcaaabYcecfcichcicJeteudwefevewelecelexeleceleyezefdweAgdcPeCeDeHeFcfcebYaacabZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaaaaaaaaaUaaaaaaaaaUaaaaaaaaaacacEbYcecfcichcicJebejdwefeleleleceIexeJecelelelefdweKeheMeNeOePeQcfcebYeEcaaaaaaaaaaaaUaaaaaaaaaUaaaaaaaaaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaaaaaaaaaUaaaaaaaaaUaaaaaaaaaacaeScdcecfchchchdUdIeTdweUeVeWeXdZefeYefdZeZfafbfcdwfdeadnfffgfhficfcecdeScaaaaaaaaaaaaUaaaaaaaaaUaaaaaaaaaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaaaaaaaaaUaaaaaaaaaUaaaaaaaaaacaaabYcecfcichcicJdIcPdweffjfkflecfmexfnecflfofpefdwcJebfqfrfsftfucfcebYaacaaaaaaaaaaaaUaaaaaaaaaUaaaaaaaaaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZcaaabYcecfcichcicJebcPdwefelelelecelexelecelelelefdwcJebcPeCfvfwfxcfcebYaacabZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaacacacacacacacacacacacacacacacacacaaabYcecfcichcicJdIcPdweffyfzgsgtelepelgugyfEfFefdwcJebcPfGerescfcecebYaUcacacacacacacacacacacacacacacacacaaUbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaUbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZaaaabYcecfcichcicJdIcPdwefefeffHefefgFefeffJefefefdwcJebcPcichcicfcebYbYaaaUbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYcecfchdTchdUebcCdwdwdwdwdwdwdwfKdwdwdwdwdwdwdwdUebcCchdTchcfcebYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYbYbYbYbYbYbYbYbYdrbYbYbYbYbYbYbYbYcecfcichcicJebfLfMcZcZfNfOfPfQgLfSfTfUfNcZcZfVfWebcPcichcicfcebYbYbYbYbYbYbYdrbYbYbYbYbYbYbYbYbYbYdrbYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcecfcichcicJfXdndndndnfYfZgagahGgagahIhJdndndndnhHcPcichhmcfcebYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcecfgYchcicidLdLghdLdLfNgigjgkglgkgmgnfNdLdLdLdLdLcicichcicfcebYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcecfcichcicicicichcigofNfNfNfNgpfNfNfNfNgocicicicicicichcicfcebYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcecfchchchchchchchchgqgAgBhxhDgvgwhxgxhFgzchchchchchchchchcfcebYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcececfchcicicicicicfgogrgegCgDgEgDgggDgGgocfcicicicicichcfcecebYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYcececfcfcfcfcfcfcfgogogogogHgIgHgogogogocfcfcfcfcfcfcfcecebYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYcececececececececececegogJgKgfgocececececececececececebYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYbYbYbYbYbYbYbYgogogMgvgNgogobYbYbYbYbYbYbYbYbYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcacabYbYgogogOgPgQgDgRgogobYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacagogogSgTgUgxgxgxgxgVgobYaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacagWgXhggZhagxgxhbgxgxhcgobYaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacahdgHgogohehfgxgxgxgxgVgobYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYcacabYbYgogofRhhhhhhhigogobYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYbYbYgogohjhkhlgogobYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYgogogogogobYbYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYaabYbYbYcdbYbYbYaabYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaUaaaacaaaaaaUaaaaaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaUcacacacacacacaaUaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYfIbZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadraabZcabZaUaUaUbZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaUaUaUbZcabZaadraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcabZaaaaaabZcabZaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaUaaaaaaaaaaaUaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYbYbYbYdrbYbYbYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYbYbYbYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaaaaaaaaaaaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcEcdaaaaaabZcEcdaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaUbZcEcdaUaUaUbZcEcdaUbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcEcdaaaUaabZcEcdaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcEcdaaaUaabZcEcdaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcEcdaaaUaabZcEcdaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcEcdaaaUaabZcEcdaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcEcdaaaUaabZcEcdaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcEcdaaaUaabZcEcdaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaUbZcEcdaUaUaUbZcEcdaUbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZcEcdaaaUaabZcEcdaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYbYbYbYbYbYaaaaaaaadFdrdreEdrdreRaaaaaaaabYbYbYbYbYbYbYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYaaaaaaaaaaaaaUaaaaaaaaaaaUaaaaeSaaaaaUaaaaaaaaaaaUaaaaaaaaaaaabYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYaaaafIdrdrdrdrdrdrdrdrdrdrdrdrdrgedrdrdrdrdrdrdrdrdrdrdrdrdrggaaaabYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaafIeRcececececececececececececececececececececececececececedFggaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaafIeRcececfcfcfcfcfcfcfcfcfcecececececececececgcgcgcgcgcgcgcgcedFggaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaeScececfchcictckclcmcncocfcgcgcgcgcgcgcgcgdYcgdXdWdVdSdRcvcgceceeSaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaeScecfchchchcwcxcyczcAcBcCcgdQcDcccFcvcGcgcQcgdPcvcvcvcvcvcgceceeSaUbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaUeScecfcichcicJcKcLcMcNcOcPcgdddgdfcTcRcScgcQcgcIcvcvcvcvcvcgceceeSaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaeScecfcichcicicUcVcWcXcYcZdadbdccvcvcqdecgcbcgcpcjcscrcHcucgceceeSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeScecfcichcicJdmdndodpdpdpdqdMdvdNdvdudwdwdwcgdydxdCdBdAdzdDdEdEgrdGdHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYbYbYbYbYbYbYaaaaeScecfcichcicJdIdJdKdLdLdLcgdtdsdOcvdhdjdidkcgcgcgdlcgcgcgcgceceeSaaaaaabYbYbYbYbYbYbYbYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaaaaaaaaaaaaaUaaaaaaeScecfchdTchdUdIcCdwdwdwdwdwfefBfAgcgbdwdwfDdwdwdUebfCchdTchcfceeSaaaaaaaaaUaaaaaaaaaaaaaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaagAgAgAgAgAgAgAgAgAgAaaaaeScecfcichcicJedeedwefefefegekeieGefdZeLeBeleodwdUebcPcichcicfcedFggaaaagAgAgAgAgAgAgAgAgAgAaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaUgBgBgBgBgBgBgBgBgBgBggaUeScecfcichcicJemendwefelelelecelepelecelelelefdwdUebcPeqerescfceceeSaUfIgCgCgCgCgCgCgCgCgCgCaUbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaagEgEgEgEgEgEgEgEgEgEeSaaeScecfcichcicJeteudwefevewelecelexeleceleyezefdweAgdcPeCeDeHeFcfceeSaaeSgEgEgEgEgEgEgEgEgEgEaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaUaaaaaaaaaaaaaUaaeSaaeScecfcichcicJebejdwefeleleleceIexeJecelelelefdweKeheMeNeOePeQcfceeSaaeSaaaUaaaaaaaaaaaaaUaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaUaUaUaUaUaUaUaUaUgGgSgQcecfchchchdUdIeTdweUeVeWeXdZefeYefdZeZfafbfcdwfdeadnfffgfhficfcegTgSgWaUaUaUaUaUaUaUaUaUaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaaaUaaaaaaaaaaaaaUaaeSaaeScecfcichcicJdIcPdweffjfkflecfmexfnecflfofpefdwcJebfqfrfsftfucfceeSaaeSaaaUaaaaaaaaaaaaaUaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaagAgAgAgAgAgAgAgAgAgAeSaaeScecfcichcicJebcPdwefelelelecelexelecelelelefdwcJebcPeCfvfwfxcfceeSaaeSgAgAgAgAgAgAgAgAgAgAaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaUgBgBgBgBgBgBgBgBgBgBeRaUeScecfcichcicJdIcPdweffyfzgsgtelepelgugyfEfFefdwcJebcPfGerescfceceeSaUdFgCgCgCgCgCgCgCgCgCgCaUbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaagEgEgEgEgEgEgEgEgEgEaaaaeScecfcichcicJdIcPdwefefeffHefefgFefeffJefefefdwcJebcPcichcicfcefIeRaaaagEgEgEgEgEgEgEgEgEgEaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaaaaaaaaaaaaaUaaaaaaeScecfchdTchdUebcCdwdwdwdwdwdwdwfKdwdwdwdwdwdwdwdUebcCchdTchcfceeSaaaaaaaaaUaaaaaaaaaaaaaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYbYbYbYbYbYbYaaaaeScecfcichcicJebfLfMcZcZfNfOfPfQgLfSfTfUfNcZcZfVfWebcPcichcicfceeSaaaaaabYbYbYbYbYbYbYbYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeScecfcichcicJfXdndndndnfYfZgagahGgagahIhJdndndndnhHcPcichhmcfceeSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaeScecfgYchcicidLdLghdLdLfNgigjgkglgkgmgnfNdLdLdLdLdLcicichcicfceeSaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaUeScecfcichcicicicichcigofNfNfNfNgpfNfNfNfNgocicicicicicichcicfceeSaUbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaeScecfchchchchchchchchgqgxgxgohDgvgwgogxgxgzchchchchchchchchcfceeSaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaeScececfchcicicicicicfgogxgxgXgxgvgxgZgxgxgocfcicicicicichcfceceeSaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaadFggcececfcfcfcfcfcfcfgogogogogHgIgHgogogogocfcfcfcfcfcfcfcecefIeRaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaaaadFggcehahbhahahahahahahagogogJgKgfgogogocececececececececefIeRaaaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYaaaadFgghahghdhFhxhNhMhOhagogogMgvgNgogogofIdrdrdrdrdrdrdrdreRaaaabYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYaaaaeShahQhPhahRhShShThagogOgPhUgDgRgogoeSaaaaaaaaaaaaaaaUaaaabYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYaaeShahVhahahWhXhXhYhagJgUgxhZgxgxgVgoeSaabYbYbYbYbYbYbYbYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaadFiaicibhaidhXhXifieiggDgDihgxgxhcgoeSaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaUcacaeScahaiiikijimilhehfgxgxgxgxgVgoeSaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaacacaeScahahahahahahagofRhhhhhhhigogoeSaUbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaindriodrdrdrdrdrdrgggogohjhkhlgogofIeRaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaaaaaaaUaaaadFgggogogogogofIeRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYbYbYbYaaaadFdrdripdrdreRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaaaaeSaaaaaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafIdrdriodrdrggaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZiqcdaaaUaabZiqcdaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaUbZiqcdaUaUaUbZiqcdaUbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZiqcdaaaUaabZiqcdaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZiqcdaaaUaabZiqcdaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZiqcdaaaUaabZiqcdaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZiqcdaaaUaabZiqcdaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZiqcdaaaUaabZiqcdaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZiqcdaaaUaabZiqcdaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaUbZiqcdaUaUaUbZiqcdaUbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYaabZiqcdaaaaaabZiqcdaabYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaUaaaaaaaaaaaUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabYbYbYbYbYbYbYbYbYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
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..7f0a04754a 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,21 +755,21 @@
"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)
+"oO" = (/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Isolation Cell A"; dir = 8},/obj/machinery/light{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_a)
"oP" = (/obj/machinery/artifact_analyser,/turf/simulated/floor/bluegrid,/area/outpost/research/isolation_a)
"oQ" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_c)
-"oR" = (/obj/machinery/artifact_scanpad,/obj/machinery/light,/turf/simulated/floor/bluegrid,/area/outpost/research/isolation_b)
+"oR" = (/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Isolation Cell B"; dir = 8},/obj/machinery/light{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_b)
"oS" = (/obj/machinery/artifact_analyser,/turf/simulated/floor/bluegrid,/area/outpost/research/isolation_b)
"oT" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/structure/sign/securearea{desc = "A warning sign which reads 'MOVING PARTS'."; name = "\improper MOVING PARTS"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplatecorner"},/area/outpost/research/power)
"oU" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor,/area/outpost/research/power)
@@ -784,7 +785,7 @@
"pe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 4},/area/mine/explored)
"pf" = (/turf/simulated/wall/r_wall,/area/outpost/research/isolation_b)
"pg" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 2},/area/mine/explored)
-"ph" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp,/obj/machinery/light,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_c)
+"ph" = (/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Isolation Cell C"; dir = 8},/obj/machinery/light{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_c)
"pi" = (/obj/structure/girder,/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/outpost/abandoned)
"pj" = (/obj/structure/window/reinforced,/obj/structure/lattice,/turf/space,/area/mine/explored)
"pk" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/disposalpipe/segment,/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/outpost/research/eva)
@@ -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)
@@ -1009,7 +1010,7 @@
"tv" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/outpost/engineering/hallway)
"tw" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "edock_inner"; locked = 1; name = "Engineering Dock Airlock"},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway)
"tx" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 4},/obj/machinery/light,/turf/space,/area/mine/explored)
-"ty" = (/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Isolation Cell A"; dir = 8},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_a)
+"ty" = (/obj/machinery/light,/turf/simulated/floor/bluegrid,/area/outpost/research/isolation_a)
"tz" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/outpost/engineering/meeting)
"tA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/outpost/engineering/hallway)
"tB" = (/obj/structure/disposalpipe/trunk,/obj/structure/disposaloutlet{dir = 1},/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/explored)
@@ -1036,7 +1037,7 @@
"tW" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 10},/turf/simulated/floor,/area/outpost/engineering/atmospherics)
"tX" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor,/area/outpost/engineering/atmospherics)
"tY" = (/obj/machinery/light,/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_x = -6; pixel_y = -28},/turf/simulated/floor,/area/outpost/engineering/hallway)
-"tZ" = (/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Isolation Cell B"; dir = 8},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_b)
+"tZ" = (/obj/machinery/artifact_scanpad,/turf/simulated/floor/bluegrid,/area/outpost/research/isolation_b)
"ua" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (NORTH)"; icon_state = "intact"; dir = 1},/obj/machinery/atmospherics/pipe/simple/visible/blue{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/outpost/engineering/atmospherics)
"ub" = (/obj/machinery/atmospherics/pipe/simple/visible/blue{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/outpost/engineering/atmospherics)
"uc" = (/obj/machinery/atmospherics/omni/mixer{tag_east = 1; tag_east_con = 0.79; tag_south = 1; tag_south_con = 0.21; tag_west = 2},/turf/simulated/floor,/area/outpost/engineering/atmospherics)
@@ -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)
@@ -1085,7 +1086,7 @@
"uT" = (/turf/simulated/wall,/area/outpost/engineering/storage)
"uU" = (/obj/machinery/floodlight,/turf/simulated/floor/wood,/area/outpost/engineering/meeting)
"uV" = (/obj/structure/cable/blue{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/wood,/area/outpost/engineering/meeting)
-"uW" = (/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Isolation Cell C"; dir = 8},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_c)
+"uW" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_c)
"uX" = (/obj/structure/sign/science{desc = "A warning sign which reads 'ANOMALOUS MATERIALS'"; name = "\improper ANOMALOUS MATERIALS"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored)
"uY" = (/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},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor,/area/outpost/engineering/hallway)
"uZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/outpost/engineering/storage)
@@ -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
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLaaaaaaaaaaqLababababababababababababababcrkPkPkPkPkPkPkPkPkPkPkPcriWeUiFeUiEcradababababababababababababababababababababababababababababalgygygygyqMqNgygygygygygygygyrWqPqPqPqPqPqPqPqPrWgygygygygygykBtlrUkGkBpFrigygygypmpXkTkTkUpWpOoOkUpRuSoRlbpNpKphlbababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababcrcrcrcrcrcrcrcrcrcrcrcrcrcrmjrOoLcrcradababababababababababababababababababababababababababababalgygygygygygygygygygygygygyqwqCrdrerererererereqwqCgygygygygyuXpBrSpCvcpcpeoVoVoVxVoUsyoZkUpbtyoPkUoWtZoSlboQuWpalbabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
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
diff --git a/nano/images/nanomap_z1.png b/nano/images/nanomap_z1.png
index 079c4379b7..ea35b7f06d 100644
Binary files a/nano/images/nanomap_z1.png and b/nano/images/nanomap_z1.png differ
diff --git a/nano/templates/aicard.tmpl b/nano/templates/aicard.tmpl
new file mode 100644
index 0000000000..be860a52ac
--- /dev/null
+++ b/nano/templates/aicard.tmpl
@@ -0,0 +1,103 @@
+
+
+
+
+{{if data.has_ai}}
+
+
+ Hardware Integrity:
+
+
+ {{:data.hardware_integrity}}%
+
+
+ Backup Capacitor:
+
+
+ {{:data.backup_capacitor}}%
+
+
+
+ {{if data.has_laws}}
+
+ | Index | Law |
+
+
+ Laws:
+
+ {{for data.laws}}
+ | {{:value.index}}. | {{:value.law}} |
+ {{/for}}
+
+ {{else}}
+ No laws found.
+ {{/if}}
+
+ {{if data.operational}}
+
+
+ | Radio Subspace Transceiver |
+ {{:helper.link("Enabled", null, {'radio' : 0}, data.radio ? 'selected' : null)}} |
+ {{:helper.link("Disabled", null, {'radio' : 1}, data.radio ? null : 'redButton' )}} |
+
+ | Wireless Interface |
+ {{:helper.link("Enabled", null, {'wireless' : 0}, data.wireless ? 'selected' : null)}} |
+ {{:helper.link("Disabled", null, {'wireless' : 1}, data.wireless ? null : 'redButton' )}} |
+
+ {{if data.flushing}}
+ | AI wipe in progress... |
+ {{else}}
+
+ | Wipe AI |
+ {{:helper.link("Wipe", 'radiation', {'wipe' : 1}, null, 'redButton')}} |
+
+ {{/if}}
+
+ {{/if}}
+{{else}}
+ Stored AI: No AI detected.
+{{/if}}
diff --git a/nano/templates/robot_control.tmpl b/nano/templates/robot_control.tmpl
new file mode 100644
index 0000000000..57bbebd490
--- /dev/null
+++ b/nano/templates/robot_control.tmpl
@@ -0,0 +1,83 @@
+{{if !data.is_ai}}
+
+
+ Emergency Self-Destruct:
+
+
+ {{if data.safety}}
+ {{:helper.link('ARM', 'unlocked', {'arm' : 1})}}
+ {{:helper.link('DETONATE', 'radiation', {'nuke' : 1}, 'disabled')}}
+ {{else}}
+ {{:helper.link('DISARM', 'locked', {'arm' : 1})}}
+ {{:helper.link('DETONATE', 'radiation', {'nuke' : 1}, null, 'redButton')}}
+ {{/if}}
+
+
+
+{{/if}}
+{{for data.robots}}
+
+
+
{{:value.name}}
+ Information
+
+ Status:
+
+
+ {{:value.status}}
+
+
+ Master AI:
+
+
+ {{:value.master_ai}}
+
+
+ Module:
+
+
+ {{:value.module}}
+
+
+ {{if value.hackable}}
+
+ Safeties:
+
+
+ ENABLED
+
+ {{else value.hacked}}
+
+ Safeties:
+
+
+ DISABLED
+
+ {{/if}}
+ Power Cell
+ {{if value.cell}}
+
+ Rating :
+
+
+ {{:value.cell_capacity}}
+
+ {{:helper.displayBar(value.cell_percentage, 0, 100, (value.cell_percentage >= 50) ? 'good' : (value.cell_percentage >= 25) ? 'average' : 'bad')}}
+ {{:value.cell_percentage}} %
+ {{else}}
+ Not Installed
+ {{:helper.displayBar(100, 0, 100, 'bad')}}
+ N/A %
+ {{/if}}
+ Actions
+ {{if value.status == "Operational"}}
+ {{:helper.link('Lockdown', 'locked', {'lockdown' : value.name})}}
+ {{else}}
+ {{:helper.link('Unlock', 'unlocked', {'lockdown' : value.name})}}
+ {{/if}}
+ {{:helper.link('Self-Destruct', 'radiation', {'detonate' : value.name}, null, 'redButton')}}
+ {{if value.hackable}}
+ {{:helper.link('Hack', 'calculator', {'hack' : value.name}, null, 'redButton')}}
+ {{/if}}
+
+{{/for}}
\ No newline at end of file
diff --git a/nano/templates/supermatter_crystal.tmpl b/nano/templates/supermatter_crystal.tmpl
new file mode 100644
index 0000000000..b06aaae746
--- /dev/null
+++ b/nano/templates/supermatter_crystal.tmpl
@@ -0,0 +1,25 @@
+{{if data.detonating}}
+
+
CRYSTAL DELAMINATING
+
Evacuate area immediately
+
+
+{{else}}
+ Crystal Integrity
+ {{:helper.displayBar(data.integrity_percentage, 0, 100, (data.integrity_percentage >= 90) ? 'good' : (data.integrity_percentage >= 25) ? 'average' : 'bad')}}
+ {{:data.integrity_percentage}} %
+ Environment
+
+ Temperature:
+
+
+ {{:helper.displayBar(data.ambient_temp, 0, 10000, (data.ambient_temp >= 5000) ? 'bad' : (data.ambient_temp >= 4000) ? 'average' : 'good')}}
+ {{:data.ambient_temp}} K
+
+
+ Pressure:
+
+
+ {{:data.ambient_pressure}} kPa
+
+{{/if}}
\ No newline at end of file
diff --git a/sound/machines/airlock_creaking.ogg b/sound/machines/airlock_creaking.ogg
new file mode 100644
index 0000000000..e69ebc275f
Binary files /dev/null and b/sound/machines/airlock_creaking.ogg differ
diff --git a/tools/AddToChangelog/AddToChangelog.sln b/tools/AddToChangelog/AddToChangelog.sln
deleted file mode 100644
index d402865fa5..0000000000
--- a/tools/AddToChangelog/AddToChangelog.sln
+++ /dev/null
@@ -1,20 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 11.00
-# Visual C# Express 2010
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AddToChangelog", "AddToChangelog\AddToChangelog.csproj", "{838EA2DE-A108-4213-8409-7F562F1009BE}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|x86 = Debug|x86
- Release|x86 = Release|x86
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {838EA2DE-A108-4213-8409-7F562F1009BE}.Debug|x86.ActiveCfg = Debug|x86
- {838EA2DE-A108-4213-8409-7F562F1009BE}.Debug|x86.Build.0 = Debug|x86
- {838EA2DE-A108-4213-8409-7F562F1009BE}.Release|x86.ActiveCfg = Release|x86
- {838EA2DE-A108-4213-8409-7F562F1009BE}.Release|x86.Build.0 = Release|x86
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
diff --git a/tools/AddToChangelog/AddToChangelog/AddToChangelog.csproj b/tools/AddToChangelog/AddToChangelog/AddToChangelog.csproj
deleted file mode 100644
index cb18329318..0000000000
--- a/tools/AddToChangelog/AddToChangelog/AddToChangelog.csproj
+++ /dev/null
@@ -1,140 +0,0 @@
-
-
-
- Debug
- x86
- 8.0.30703
- 2.0
- {838EA2DE-A108-4213-8409-7F562F1009BE}
- WinExe
- Properties
- AddToChangelog
- AddToChangelog
- v4.0
- Client
- 512
- publish\
- true
- Disk
- false
- Foreground
- 7
- Days
- false
- false
- true
- 0
- 1.0.0.%2a
- false
- false
- true
-
-
- x86
- true
- full
- false
- bin\Debug\
- DEBUG;TRACE
- prompt
- 4
-
-
- x86
- pdbonly
- true
- bin\Release\
- TRACE
- prompt
- 4
-
-
- changelog.ico
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Form
-
-
- Form1.cs
-
-
-
-
- Form1.cs
-
-
- ResXFileCodeGenerator
- Resources.Designer.cs
- Designer
-
-
- True
- Resources.resx
-
-
- SettingsSingleFileGenerator
- Settings.Designer.cs
-
-
- True
- Settings.settings
- True
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- False
- Microsoft .NET Framework 4 Client Profile %28x86 and x64%29
- true
-
-
- False
- .NET Framework 3.5 SP1 Client Profile
- false
-
-
- False
- .NET Framework 3.5 SP1
- false
-
-
- False
- Windows Installer 3.1
- true
-
-
-
-
-
\ No newline at end of file
diff --git a/tools/AddToChangelog/AddToChangelog/Form1.Designer.cs b/tools/AddToChangelog/AddToChangelog/Form1.Designer.cs
deleted file mode 100644
index 63b3b0771d..0000000000
--- a/tools/AddToChangelog/AddToChangelog/Form1.Designer.cs
+++ /dev/null
@@ -1,263 +0,0 @@
-namespace AddToChangelog
-{
- partial class MainForm
- {
- ///
- /// Required designer variable.
- ///
- private System.ComponentModel.IContainer components = null;
-
- ///
- /// Clean up any resources being used.
- ///
- /// true if managed resources should be disposed; otherwise, false.
- protected override void Dispose(bool disposing)
- {
- if (disposing && (components != null))
- {
- components.Dispose();
- }
- base.Dispose(disposing);
- }
-
- #region Windows Form Designer generated code
-
- ///
- /// Required method for Designer support - do not modify
- /// the contents of this method with the code editor.
- ///
- private void InitializeComponent()
- {
- System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
- this.label1 = new System.Windows.Forms.Label();
- this.label2 = new System.Windows.Forms.Label();
- this.authorBox = new System.Windows.Forms.TextBox();
- this.label3 = new System.Windows.Forms.Label();
- this.dateBox = new System.Windows.Forms.MaskedTextBox();
- this.dropdownBox = new System.Windows.Forms.ComboBox();
- this.getButton = new System.Windows.Forms.Button();
- this.addButton = new System.Windows.Forms.Button();
- this.resultsBox = new System.Windows.Forms.TextBox();
- this.addLineButton = new System.Windows.Forms.Button();
- this.addLineBox = new System.Windows.Forms.TextBox();
- this.listBox = new System.Windows.Forms.TextBox();
- this.saveButton = new System.Windows.Forms.Button();
- this.editBox = new System.Windows.Forms.TextBox();
- this.reloadButton = new System.Windows.Forms.Button();
- this.pictureBox = new System.Windows.Forms.PictureBox();
- ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).BeginInit();
- this.SuspendLayout();
- //
- // label1
- //
- this.label1.AutoSize = true;
- this.label1.Location = new System.Drawing.Point(20, 46);
- this.label1.Name = "label1";
- this.label1.Size = new System.Drawing.Size(33, 13);
- this.label1.TabIndex = 10;
- this.label1.Text = "Date:";
- //
- // label2
- //
- this.label2.AutoSize = true;
- this.label2.Location = new System.Drawing.Point(20, 21);
- this.label2.Name = "label2";
- this.label2.Size = new System.Drawing.Size(41, 13);
- this.label2.TabIndex = 11;
- this.label2.Text = "Author:";
- //
- // authorBox
- //
- this.authorBox.Location = new System.Drawing.Point(67, 18);
- this.authorBox.Name = "authorBox";
- this.authorBox.Size = new System.Drawing.Size(154, 20);
- this.authorBox.TabIndex = 1;
- //
- // label3
- //
- this.label3.AutoSize = true;
- this.label3.Location = new System.Drawing.Point(330, 21);
- this.label3.Name = "label3";
- this.label3.Size = new System.Drawing.Size(68, 13);
- this.label3.TabIndex = 12;
- this.label3.Text = "Add change:";
- //
- // dateBox
- //
- this.dateBox.Location = new System.Drawing.Point(67, 43);
- this.dateBox.Mask = "00/00/0000";
- this.dateBox.Name = "dateBox";
- this.dateBox.Size = new System.Drawing.Size(79, 20);
- this.dateBox.TabIndex = 2;
- this.dateBox.ValidatingType = typeof(System.DateTime);
- //
- // dropdownBox
- //
- this.dropdownBox.DisplayMember = "\"";
- this.dropdownBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.dropdownBox.FormattingEnabled = true;
- this.dropdownBox.Items.AddRange(new object[] {
- "Added feature",
- "Removed feature",
- "Bugfix",
- "Work in progress",
- "Tweak",
- "Experimental feature",
- "Added icon",
- "Removed icon",
- "Added sound",
- "Removed sound"});
- this.dropdownBox.Location = new System.Drawing.Point(856, 17);
- this.dropdownBox.MaxDropDownItems = 10;
- this.dropdownBox.Name = "dropdownBox";
- this.dropdownBox.Size = new System.Drawing.Size(121, 21);
- this.dropdownBox.TabIndex = 7;
- this.dropdownBox.SelectedIndexChanged += new System.EventHandler(this.dropdownBox_SelectedIndexChanged);
- //
- // getButton
- //
- this.getButton.Location = new System.Drawing.Point(17, 70);
- this.getButton.Name = "getButton";
- this.getButton.Size = new System.Drawing.Size(69, 21);
- this.getButton.TabIndex = 3;
- this.getButton.Text = "Get HTML";
- this.getButton.UseVisualStyleBackColor = true;
- this.getButton.Click += new System.EventHandler(this.getButton_Click);
- //
- // addButton
- //
- this.addButton.Location = new System.Drawing.Point(92, 70);
- this.addButton.Name = "addButton";
- this.addButton.Size = new System.Drawing.Size(69, 21);
- this.addButton.TabIndex = 4;
- this.addButton.Text = "Lazy Add";
- this.addButton.UseVisualStyleBackColor = true;
- this.addButton.Click += new System.EventHandler(this.addButton_Click);
- //
- // resultsBox
- //
- this.resultsBox.Location = new System.Drawing.Point(11, 101);
- this.resultsBox.Multiline = true;
- this.resultsBox.Name = "resultsBox";
- this.resultsBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
- this.resultsBox.Size = new System.Drawing.Size(318, 356);
- this.resultsBox.TabIndex = 10;
- //
- // addLineButton
- //
- this.addLineButton.Location = new System.Drawing.Point(983, 17);
- this.addLineButton.Name = "addLineButton";
- this.addLineButton.Size = new System.Drawing.Size(21, 21);
- this.addLineButton.TabIndex = 8;
- this.addLineButton.Text = "+";
- this.addLineButton.UseVisualStyleBackColor = true;
- this.addLineButton.Click += new System.EventHandler(this.addLineButton_Click);
- //
- // addLineBox
- //
- this.addLineBox.Location = new System.Drawing.Point(404, 18);
- this.addLineBox.Name = "addLineBox";
- this.addLineBox.Size = new System.Drawing.Size(415, 20);
- this.addLineBox.TabIndex = 6;
- //
- // listBox
- //
- this.listBox.Location = new System.Drawing.Point(335, 46);
- this.listBox.Multiline = true;
- this.listBox.Name = "listBox";
- this.listBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
- this.listBox.Size = new System.Drawing.Size(669, 49);
- this.listBox.TabIndex = 9;
- //
- // saveButton
- //
- this.saveButton.Location = new System.Drawing.Point(260, 70);
- this.saveButton.Name = "saveButton";
- this.saveButton.Size = new System.Drawing.Size(69, 21);
- this.saveButton.TabIndex = 5;
- this.saveButton.Text = "Save";
- this.saveButton.UseVisualStyleBackColor = true;
- this.saveButton.Click += new System.EventHandler(this.saveButton_Click);
- //
- // editBox
- //
- this.editBox.Location = new System.Drawing.Point(335, 101);
- this.editBox.MaxLength = 9999999;
- this.editBox.Multiline = true;
- this.editBox.Name = "editBox";
- this.editBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
- this.editBox.Size = new System.Drawing.Size(669, 356);
- this.editBox.TabIndex = 13;
- //
- // reloadButton
- //
- this.reloadButton.Location = new System.Drawing.Point(185, 70);
- this.reloadButton.Name = "reloadButton";
- this.reloadButton.Size = new System.Drawing.Size(69, 21);
- this.reloadButton.TabIndex = 14;
- this.reloadButton.Text = "Reload";
- this.reloadButton.UseVisualStyleBackColor = true;
- this.reloadButton.Click += new System.EventHandler(this.reloadButton_Click);
- //
- // pictureBox
- //
- this.pictureBox.Location = new System.Drawing.Point(834, 20);
- this.pictureBox.Name = "pictureBox";
- this.pictureBox.Size = new System.Drawing.Size(16, 16);
- this.pictureBox.TabIndex = 15;
- this.pictureBox.TabStop = false;
- //
- // MainForm
- //
- this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.BackColor = System.Drawing.SystemColors.ControlLightLight;
- this.ClientSize = new System.Drawing.Size(1016, 469);
- this.Controls.Add(this.pictureBox);
- this.Controls.Add(this.reloadButton);
- this.Controls.Add(this.editBox);
- this.Controls.Add(this.saveButton);
- this.Controls.Add(this.listBox);
- this.Controls.Add(this.addLineBox);
- this.Controls.Add(this.addLineButton);
- this.Controls.Add(this.resultsBox);
- this.Controls.Add(this.addButton);
- this.Controls.Add(this.getButton);
- this.Controls.Add(this.dropdownBox);
- this.Controls.Add(this.dateBox);
- this.Controls.Add(this.label3);
- this.Controls.Add(this.authorBox);
- this.Controls.Add(this.label2);
- this.Controls.Add(this.label1);
- this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
- this.Name = "MainForm";
- this.Text = "Add To Changelog";
- this.Load += new System.EventHandler(this.MainForm_Load);
- this.Shown += new System.EventHandler(this.MainForm_Shown);
- ((System.ComponentModel.ISupportInitialize)(this.pictureBox)).EndInit();
- this.ResumeLayout(false);
- this.PerformLayout();
-
- }
-
- #endregion
-
- private System.Windows.Forms.Label label1;
- private System.Windows.Forms.Label label2;
- private System.Windows.Forms.TextBox authorBox;
- private System.Windows.Forms.Label label3;
- private System.Windows.Forms.MaskedTextBox dateBox;
- private System.Windows.Forms.ComboBox dropdownBox;
- private System.Windows.Forms.Button getButton;
- private System.Windows.Forms.Button addButton;
- private System.Windows.Forms.TextBox resultsBox;
- private System.Windows.Forms.Button addLineButton;
- private System.Windows.Forms.TextBox addLineBox;
- private System.Windows.Forms.TextBox listBox;
- private System.Windows.Forms.Button saveButton;
- private System.Windows.Forms.TextBox editBox;
- private System.Windows.Forms.Button reloadButton;
- private System.Windows.Forms.PictureBox pictureBox;
- }
-}
-
diff --git a/tools/AddToChangelog/AddToChangelog/Form1.cs b/tools/AddToChangelog/AddToChangelog/Form1.cs
deleted file mode 100644
index 567c1fb3e5..0000000000
--- a/tools/AddToChangelog/AddToChangelog/Form1.cs
+++ /dev/null
@@ -1,268 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Data;
-using System.Drawing;
-using System.Linq;
-using System.Text;
-using System.Text.RegularExpressions;
-using System.Windows.Forms;
-using System.IO;
-using System.Reflection;
-
-namespace AddToChangelog
-{
- public partial class MainForm : Form
- {
-
- public string changelogPath = "changelog.html";
- public string changelogMarker = "#ADDTOCHANGELOGMARKER#";
- public string longDateFormat = "d MMMM yyyy";
- public string shortDateFormat = "ddMMyyyy";
-
- public Dictionary ItemList = new Dictionary()
- {
- { "Added feature", "rscadd" },
- { "Removed feature", "rscdel" },
- { "Bugfix", "bugfix" },
- { "Work in progress", "wip" },
- { "Tweak", "tweak" },
- { "Experimental feature", "experiment" },
- { "Added icon", "imageadd" },
- { "Removed icon", "imagedel" },
- { "Added sound", "soundadd" },
- { "Removed sound", "sounddel" }
- };
-
- public Dictionary ImageList = new Dictionary();
-
- public MainForm()
- {
- InitializeComponent();
- this.dropdownBox.SelectedIndex = 0;
- this.dateBox.Text = DateTime.Now.ToString(shortDateFormat);
- this.listBox.Text = "# Enter your logs in the text box above and it'll be parsed into here. You can use 'Get HTML' to format it for the changelog. You can also use Lazy Add to automatically add the logs to the changelog, no effort needed (just remember to save)! Below is the changelog, you can edit and save it from here to easily fix mistakes. Save will save the changelog below, reload will undo any unsaved changes.";
- }
-
- public void SaveChangelog()
- {
- DialogResult dialogResult = MessageBox.Show("Are you sure?", "Confirm", MessageBoxButtons.YesNo);
- if (dialogResult == DialogResult.Yes)
- {
- try
- {
- File.WriteAllText(changelogPath, editBox.Text);
- }
- catch
- {
- MessageBox.Show("Could not find '" + changelogPath + "'. Please place me on the same folder as " + changelogPath + ".");
- }
- }
- }
-
- public void ScrollToMarker()
- {
- int selection = editBox.Text.IndexOf(changelogMarker);
- if (selection > 0)
- {
- // Hacky way to scroll the edit text box to the beginning of the changelog entries
- this.ActiveControl = editBox;
- this.Refresh();
- editBox.SelectionStart = editBox.Text.Length - 1;
- editBox.SelectionLength = 0;
- editBox.ScrollToCaret();
- editBox.SelectionStart = selection - 2;
- editBox.ScrollToCaret();
- }
- }
-
- // Load up the changelog
-
- public void ReadChangelog()
- {
- try
- {
- string changelog = File.ReadAllText(changelogPath);
- editBox.Text = changelog;
- ScrollToMarker();
- }
- catch (Exception e)
- {
- MessageBox.Show("Could not find '" + changelogPath + "'. Please place me on the same folder as " + changelogPath + "." + e);
- }
- }
-
- // Get the log notes
-
- public string GetHTMLLines()
- {
- StringReader stringReader = new StringReader(listBox.Text);
- string html = "";
- string aLine = "";
-
- do
- {
- aLine = stringReader.ReadLine();
- if (aLine != null)
- {
- // remove < and >
- if (aLine.StartsWith("<") && aLine.Contains(">"))
- {
- string tag = aLine.Substring(1, aLine.IndexOf(">") - 1); // extract the tag
- aLine = aLine.Substring(aLine.IndexOf(">") + 1); // now remove the tag from the line
- aLine = "\t\t- " + aLine + "
\r\n"; // give html
- }
- else
- {
- aLine = "\t\t- " + aLine + "
\r\n";
- }
-
- html += aLine;
- }
-
- } while (aLine != null);
-
- return html;
- }
-
- private void addLineButton_Click(object sender, EventArgs e)
- {
- if (addLineBox.Text == "")
- {
- return;
- }
-
- string textAdd = this.addLineBox.Text;
- string listItem = this.dropdownBox.SelectedItem.ToString();
- string itemClass = ItemList[listItem];
-
- if (itemClass == null)
- {
- return;
- }
-
- if (listBox.Text.StartsWith("#"))
- {
- listBox.Text = "";
- }
-
- listBox.Text += "<" + itemClass + ">" + textAdd + "\r\n";
- addLineBox.Text = "";
-
- }
-
- private void getButton_Click(object sender, EventArgs e)
- {
- if (listBox.Text != "")
- {
- DateTime dateTime;
- if (!DateTime.TryParse(dateBox.Text, out dateTime))
- {
- MessageBox.Show("Invalid date time.");
- return;
- }
-
- resultsBox.Text = "\r\n";
- resultsBox.Text += "\t
" + dateTime.ToString(longDateFormat) + "
\r\n";
- resultsBox.Text += "\t
" + authorBox.Text + " updated:
\r\n";
- resultsBox.Text += "\t
\r\n";
- resultsBox.Text += GetHTMLLines();
- resultsBox.Text += "\t
\r\n";
- resultsBox.Text += "
";
- }
- }
-
- // Automatically add to changelog
-
- private void addButton_Click(object sender, EventArgs e)
- {
- if (resultsBox.Text == "")
- {
- getButton_Click(this, EventArgs.Empty);
- }
-
- if (resultsBox.Text == "")
- {
- return;
- }
-
- string html = resultsBox.Text;
-
- string[] changelogFile = null;
-
- changelogFile = Regex.Split(editBox.Text, "\r\n");
-
- if (changelogFile != null)
- {
- bool foundMarker = false;
- for (int i = 0; i < changelogFile.Length; i++)
- {
- if (foundMarker == false)
- {
- string line = changelogFile[i];
- if (line.Contains(changelogMarker))
- {
- line += "\r\n\r\n";
- line += resultsBox.Text;
- line += "\r\n";
- changelogFile[i] = line;
- foundMarker = true;
- break;
- }
- }
- }
-
- if (foundMarker == false)
- {
- MessageBox.Show("Could not find '#ADDTOCHANGELOGMARKER#' in '" + changelogPath + "'. Please place one above where the changelog entries start, inside a comment.");
- }
- else
- {
- editBox.Text = String.Join("\r\n", changelogFile);
- ScrollToMarker();
- }
-
- }
- }
-
- private void saveButton_Click(object sender, EventArgs e)
- {
- SaveChangelog();
- }
-
- private void reloadButton_Click(object sender, EventArgs e)
- {
- ReadChangelog();
- }
-
- private void MainForm_Shown(object sender, EventArgs e)
- {
- ReadChangelog();
- }
-
- private void dropdownBox_SelectedIndexChanged(object sender, EventArgs e)
- {
- // Change the image to reflect the drop down box selection
- if (ImageList.Count > 0)
- {
- string value = ItemList[dropdownBox.SelectedItem.ToString()];
- pictureBox.Image = ImageList[value];
- }
- }
-
- private void MainForm_Load(object sender, EventArgs e)
- {
- // Get our embedded images. Use our dictionaries to help.
- foreach (string value in ItemList.Values)
- {
- Assembly myAssembly = Assembly.GetExecutingAssembly();
- Stream myStream = myAssembly.GetManifestResourceStream("AddToChangelog." + value + ".png");
- Bitmap image = new Bitmap(myStream);
-
- ImageList.Add(value, image);
- }
-
- pictureBox.Image = ImageList["rscadd"];
- }
- }
-}
diff --git a/tools/AddToChangelog/AddToChangelog/Form1.resx b/tools/AddToChangelog/AddToChangelog/Form1.resx
deleted file mode 100644
index 56c5b62284..0000000000
--- a/tools/AddToChangelog/AddToChangelog/Form1.resx
+++ /dev/null
@@ -1,1906 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
-
-
- AAABAAYAgIAAAAEAIAAoCAEAZgAAAEhIAAABACAAiFQAAI4IAQAwMAAAAQAgAKglAAAWXQEAICAAAAEA
- IACoEAAAvoIBABgYAAABACAAiAkAAGaTAQAQEAAAAQAgAGgEAADunAEAKAAAAIAAAAAAAQAAAQAgAAAA
- AAAACAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAACAAA
- AA4AAAARAAAAEwAAABYAAAAaAAAAHQAAACEAAAAiAAAAJQAAACgAAAAqAAAALAAAAC4AAAAwAAAAMgAA
- ADQAAAA1AAAANgAAADcAAAA4AAAAOQAAADoAAAA6AAAAOwAAADwAAAA8AAAAPQAAAD0AAAA+AAAAPgAA
- AD4AAAA+AAAAPgAAAD4AAAA+AAAAPQAAAD0AAAA8AAAAPAAAADsAAAA6AAAAOgAAADkAAAA4AAAANwAA
- ADYAAAA1AAAANAAAADEAAAAwAAAALQAAACwAAAApAAAAJwAAACUAAAAiAAAAIAAAAB0AAAAZAAAAFQAA
- ABMAAAARAAAADQAAAAcAAAADAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAADAAAACQAAABEAAAAWAAAAGgAAAB0AAAAgAAAAIgAAACUAAAAoAAAAKgAA
- ACwAAAAvAAAAMgAAADUAAAA3AAAAOAAAADkAAAA7AAAAPAAAADwAAAA+AAAAPwAAAEAAAABBAAAAQgAA
- AEMAAABEAAAARQAAAEYAAABHAAAARwAAAEgAAABJAAAASQAAAEkAAABJAAAASwAAAE0AAABLAAAASQAA
- AEcAAABFAAAARAAAAEMAAABCAAAAQQAAAEAAAAA/AAAAPgAAADwAAAA8AAAAOgAAADkAAAA4AAAANwAA
- ADQAAAAxAAAALwAAACwAAAAqAAAAJwAAACQAAAAhAAAAHwAAAB0AAAAZAAAAFgAAABAAAAAIAAAAAgAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAACgAA
- ABAAAAAVAAAAGAAAABsAAAAeAAAAIQAAACQAAAAnAAAAKQAAACsAAAAuAAAAMAAAADMAAAA0AAAANgAA
- ADgAAAA4AAAAOQAAADsAAAA8AAAAPgAAAEAAAABDAAAAQwAAAEIAAABCAAAAQgAAAEMAAABEAAAARAAA
- AEUAAABFAAAARgAAAE0AAABbAAAAYwAAAGEAAABcAAAAVgAAAFEAAABMAAAARwAAAEIAAABAAAAAPQAA
- ADwAAAA7AAAAOQAAADgAAAA3AAAANgAAADQAAAAyAAAAMAAAAC0AAAArAAAAKQAAACYAAAAjAAAAIQAA
- AB0AAAAaAAAAGAAAABUAAAAPAAAACgAAAAQAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAABAAAAAgAA
- AAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAA
- AAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAA
- AAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAwAAAAQAAAAGAAAACQAAAA4AAAARAAAAEwAA
- ABQAAAAWAAAAGAAAABsAAAAeAAAAIgAAACUAAAAmAAAAKAAAACoAAAAsAAAAMAAAADYAAABAAAAASgAA
- AFIAAABRAAAAQgAAADYAAAA0AAAAMwAAADMAAAA0AAAANAAAADQAAAA6AAAAVAwMDHoxMTGULi4ukBoa
- GoYGBgZ6AAAAcQAAAGYAAABaAAAAUAAAAEYAAAA5AAAALwAAACsAAAApAAAAKAAAACYAAAAkAAAAIgAA
- AB8AAAAbAAAAGAAAABYAAAAUAAAAEgAAABEAAAAPAAAACgAAAAYAAAAEAAAAAgAAAAEAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAEAAAACAAAABAAAAAUAAAAGAAAABwAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAA
- AAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAA
- AAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAA
- AAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAJAAAACgAAAAwAAAAPAAAAEQAA
- ABIAAAATAAAAGwAAACgAAAA2AAAASAcHB1sXFxdyJCQkghkZGXkAAABPAAAAKgAAABYAAAATAAAAEgAA
- ABEAAAASAAAAEwAAACcAAABXaGhoqaysrOKqqqrhn5+f2ZKSks6AgIC+ZmZmqUZGRpEnJyd7FhYWZwAA
- AEgAAAAmAAAAEAAAAAsAAAALAAAACgAAAAoAAAAJAAAABwAAAAQAAAACAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAYAAAAKAAAADQAA
- ABAAAAASAAAAEwAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAA
- ABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAA
- ABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAA
- ABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAVAAAAGwAAACgAAAA9AAAAVRgYGG5CQkKPbm5ur5iY
- mM2xsbHkkpKSyBwcHHEAAAA2AAAADgAAAAYAAAADAAAAAQAAAAAAAAABAAAAIRsbG2WgoKDNzs7O/8/P
- z//Pz8//zs7O/srKyvrFxcX1vr6+7q+vr9yUlJTANDQ0eQAAADIAAAAHAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAIAAAAGAAAADAAAABQAAAAbAAAAIQAAACUAAAAnAAAAKAAAACgAAAAoAAAAKAAA
- ACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAA
- ACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAA
- ACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKQAA
- ADoAAABTCwsLbTMzM4xpaWmxlpaW0rW1tevGxsb5ysrK/MvLy/6/v7/zZmZmrQcHB14AAAAnAAAAEAAA
- AAkAAAAEAAAAAgAAAAkAAAA2TU1Niry8vOrQ0ND/09PT/9TU1P/U1NT/1NTU/9TU1P/T09P/0NDQ/cbG
- xvVfX1+ZBAQEPQAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAkAAAAUAAAAIAAA
- ACwAAAA1AAAAPAAAAD4AAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAA
- AEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAA
- AEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAA
- AEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABIAAAAaigoKJh5eXnHrKys6MXFxfjMzMz+y8vL/8nJ
- yf/Kysr/ysrK/8zMzP6jo6PgLi4ukQAAAE4AAAAjAAAAEgAAAA0AAAAJAAAAFhEREVKGhoa0y8vL+dLS
- 0v/U1NT/1dXV/9bW1v/W1tb/19fX/9jY2P/W1tb/ycnJ+WNjY50EBAQ/AAAACgAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAEAAAAFAAAADQAAABsAAAAsAAAAPAAAAEoAAABS////////////////////////
- ////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////
- /////////////////////////////////////////////////////////////////////////////+zs
- 7P+xsbH/p6en/8jIyP/Kysr/ycnJ/8jIyP/IyMj/ycnJ/8rKyv/Ly8v/zMzM/8vLy/+pqan/h4eH2x8f
- H1kAAAA4AAAAMwAAADIAAAA8NDQ0dbKyst3Pz8/+1NTU/9XV1f/W1tb/19fX/9jY2P/Z2dn/2dnZ/9jY
- 2P/Kysr5ZGRkngMDA0AAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAMAAAACAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAYAAAAQAAAAIQAA
- ADYAAABKAAAAWwAAAGX/////+Pj4//f39//4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/5+fn/+fn5//n5
- +f/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+/v7//v7+//7+/v/+/v7//v7+//7+/v//Pz8//z8
- /P/8/Pz//Pz8//z8/P/8/Pz//f39//39/f/9/f3//f39//39/f/9/f3//f39//7+/v/+/v7//v7+//7+
- /v/+/v7//v7+//7+/v/+/v7//f39//z8/P/7+/v/6enp/7CwsP+oqKj/ysrK/8jIyP/Hx8f/yMjI/8nJ
- yf/Kysr/y8vL/8vLy//MzMz/z8/P/7y8vP+VlZX/iYmJ+TU1NZEmJiaBKysrfy8vL4FycnKqxsbG9NLS
- 0v/V1dX/1tbW/9fX1//Y2Nj/2NjY/9ra2v/a2tr/2NjY/8vLy/lqamqhCwsLQQAAAAoAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAsAAAAdAAAALAAAACcAAAASAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAACAAAABwAAABIAAAAlAAAAPAAAAFIAAABlAAAAcP/////29vb/9vb2//f3
- 9//39/f/9/f3//j4+P/4+Pj/+Pj4//n5+f/5+fn/+fn5//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//v7
- +//7+/v/+/v7//v7+//7+/v/+/v7//v7+//8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/9/f3//f39//39
- /f/9/f3//f39//39/f/9/f3//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/9/f3//Pz8//v7
- +//x8fH/u7u7/6Wlpf/IyMj/ysrK/8nJyf/Kysr/ysrK/8vLy//MzMz/zc3N/83Nzf/Pz8//zc3N/7S0
- tP+qqqr/ra2t/q6urumzs7Pltra25sPDw/HS0tL/1dXV/9fX1//Y2Nj/2NjY/9nZ2f/a2tr/29vb/9vb
- 2//a2tr/zMzM+W5ubqILCwtBAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAKQwMDFNKSkp/Ly8vcAMD
- A0MAAAAdAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAHAAAAEwAA
- ACcAAAA/AAAAVgAAAGoAAAB2//////b29v/29vb/9/f3//f39//39/f/+Pj4//j4+P/4+Pj/+fn5//n5
- +f/5+fn/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//z8
- /P/8/Pz//Pz8//z8/P/8/Pz//Pz8//39/f/9/f3//f39//39/f/9/f3//f39//39/f/+/v7//v7+//7+
- /v/+/v7//v7+//7+/v/+/v7//f39//39/f/8/Pz/+/v7//X19f/Gxsb/oaGh/8bGxv/MzMz/ysrK/8rK
- yv/Ly8v/zMzM/83Nzf/Ozs7/zs7O/8/Pz//Q0ND/0dHR/9HR0f/S0tL/0tLS/9LS0v/T09P/09PT/9TU
- 1P/X19f/2NjY/9nZ2f/Z2dn/2tra/9vb2//c3Nz/3Nzc/9ra2v/MzMz5e3t7rA4ODlYAAAAwAAAAFgAA
- AAgAAAADAAAADwAAADIhISFidnZ2qLW1teCjo6PPXl5ekQwMDFMAAAApAAAACwAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAAAUAAAAKAAAAEAAAABYAAAAbAAAAHj/////9vb2//b2
- 9v/39/f/9/f3//f39//4+Pj/+Pj4//j4+P/5+fn/+fn5//n5+f/6+vr/+vr6//r6+v/6+vr/+vr6//r6
- +v/7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//f39//39
- /f/9/f3//f39//39/f/9/f3//f39//7+/v/+/v7//v7+//n5+f/7+/v//v7+//7+/v/9/f3//f39//z8
- /P/7+/v/9vb2/8/Pz/+enp7/xMTE/83Nzf/Ly8v/zMzM/8zMzP/Nzc3/zs7O/8/Pz//Pz8//0NDQ/9HR
- 0f/S0tL/09PT/9PT0//U1NT/1dXV/9XV1f/W1tb/19fX/9jY2P/Z2dn/2tra/9ra2v/b29v/3Nzc/93d
- 3f/e3t7/29vb/9LS0v2ysrLbeXl5pjw8PHcDAwNQAAAAMQAAACYAAAA8KSkpb5KSkrrFxcXv1tbW/9XV
- 1f27u7vlgYGBqhUVFWEAAAAxAAAADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAA
- ABQAAAAoAAAAQAAAAFgAAABsAAAAeP/////29vb/9/f2//f39//39/f/9/f3//j4+P/4+Pj/+Pj4//n5
- +f/5+fn/+fn5//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7
- +//8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//v7+//j4
- +P/n5+f/0tLS/9XV1f/p6en/9/f3//39/f/8/Pz//Pz8//v7+//09PT/0NDQ/5ubm//AwMD/zs7O/8zM
- zP/Nzc3/zc3N/87Ozv/Pz8//0NDQ/9DQ0P/R0dH/0tLS/9PT0//U1NT/1NTU/9XV1f/W1tb/19fX/9fX
- 1//Y2Nj/2dnZ/9ra2v/b29v/29vb/9zc3P/d3d3/3t7e/97e3v/e3t7/2tra/9bW1v7MzMz2srKy24GB
- ga9AQEB6DQ0NX0lJSYOcnJzIzc3N99vb2/7l5eX/5OTk/9ra2v7Hx8fwiIiItTExMW0AAAA1AAAADwAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAFAAAACgAAABAAAAAWAAAAGwAAAB4//////b2
- 9v/39/b/9/f3//f39//39/f/+Pj4//j4+P/4+Pj/+fn5//n5+f/5+fn/+vr6//r6+v/6+vr/+vr6//r6
- +v/6+vr/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//39
- /f/9/f3//f39//39/f/9/f3//f39//7+/v/6+vr/4eHh/7e3t/+hoaH/oqKi/7Gxsf/S0tL/7e3t//n5
- +f/8/Pz/7Ozs/9LS0v+vr6//nJyc/8PDw//R0dH/zs7O/87Ozv/Pz8//z8/P/9DQ0P/R0dH/0tLS/9PT
- 0//T09P/1NTU/9XV1f/V1dX/1tbW/9fX1//Y2Nj/2dnZ/9ra2v/a2tr/29vb/9zc3P/d3d3/3t7e/97e
- 3v/f39//4ODg/+Hh4f/h4eH/4ODg/93d3f/Y2Nj/z8/P+bOzs9yTk5O8sLCw2dTU1P3f39//5+fn/+rq
- 6v/r6+v/6enp/9/f3//Pz8/3m5ubwzAwMHMAAAA4AAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA
- AAgAAAAUAAAAKAAAAEAAAABYAAAAbAAAAHj/////9vb2//f39v/39/f/9/f3//f39//4+Pj/+Pj4//j4
- +P/5+fn/+fn5//n5+f/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/7+/v/+/v7//v7+//7+/v/+/v7//v7
- +//7+/v//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//f39//39/f/9/f3//f39//39/f/9/f3/+/v7/+Tk
- 5P+3t7f/pKSk/7y8vP+9vb3/qamp/6SkpP+5ubn/2NjY/+Pj4//CwsL/pKSk/6Wlpf++vr7/0dHR/9DQ
- 0P/Ozs7/z8/P/8/Pz//Q0ND/0dHR/9LS0v/S0tL/09PT/9TU1P/V1dX/1tbW/9fX1//Y2Nj/2NjY/9nZ
- 2f/a2tr/29vb/9vb2//c3Nz/3d3d/93d3f/e3t7/39/f/+Dg4P/h4eH/4uLi/+Li4v/j4+P/5OTk/+Tk
- 5P/f39//2dnZ/dLS0vrX19f94uLi/+np6f/q6ur/6+vr/+zs7P/s7Oz/6+vr/+Hh4f7Pz8/3nZ2dxjw8
- PHYAAAA4AAAADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAAABQAAAAoAAAAQAAAAFgAAABsAAAAeP//
- ///29vb/9/f2//f39//5+fn/5OTk/97e3v/39/f/+Pj4//n5+f/5+fn/+fn5//r6+v/6+vr/+vr6//r6
- +v/6+vr/+vr6//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//8/Pz//Pz8//z8/P/8/Pz//Pz8//z8
- /P/9/f3//f39//39/f/9/f3//f39//39/f/p6en/ubm5/6SkpP++vr7/0tLS/9HR0f/Pz8//urq6/6Sk
- pP+kpKT/q6ur/56env+wsLD/zMzM/9HR0f/Pz8//z8/P/8/Pz//Pz8//0NDQ/9HR0f/S0tL/09PT/9PT
- 0//V1dX/1dXV/9bW1v/X19f/2NjY/9jY2P/Z2dn/2tra/9ra2v/c3Nz/3Nzc/93d3f/e3t7/3t7e/+Dg
- 4P/g4OD/4eHh/+Li4v/j4+P/4+Pj/+Tk5P/l5eX/5ubm/+bm5v/l5eX/4+Pj/+Xl5f/q6ur/6urq/+vr
- 6//s7Oz/7e3t/+3t7f/u7u7/7u7u/+Pj4/7U1NT8lZWVvRsbG14AAAAbAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAIAAAAIAAAAFAAAACgAAABAAAAAWAAAAGwAAAB4//////b29v/39/b/9/f3/9TU1P+Ojo7/oKCg/8LC
- wv/39/f/+fn5//n5+f/5+fn/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+/v7//v7+//7+/v/+/v7//v7
- +//7+/v/+/v7//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//39/f/9/f3//f39//39/f/8/Pz/6+vr/8DA
- wP+jo6P/vr6+/9DQ0P/Kysr/yMjI/8zMzP/Pz8//ycnJ/7S0tP+rq6v/vr6+/9HR0f/Q0ND/z8/P/8/P
- z//Pz8//0NDQ/9HR0f/S0tL/09PT/9PT0//U1NT/1dXV/9bW1v/W1tb/19fX/9jY2P/Z2dn/2tra/9ra
- 2v/b29v/3Nzc/93d3f/d3d3/3t7e/9/f3//g4OD/4eHh/+Hh4f/i4uL/4+Pj/+Tk5P/l5eX/5eXl/+bm
- 5v/n5+f/6Ojo/+jo6P/p6en/6urq/+vr6//s7Oz/7Ozs/+3t7f/u7u7/7+/v/+/v7//w8PD/6urq/9fX
- 1/2enp7EICAgXwAAABsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAAAUAAAAKAAAAEAAAABYAAAAbAAA
- AHj/////9vb2//f39v/39/f/s7Oz/3x8fP+Ojo7/paWl//Ly8v/5+fn/+fn5//n5+f/6+vr/+vr6//r6
- +v/6+vr/+vr6//r6+v/7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v//Pz8//z8/P/8/Pz//Pz8//z8
- /P/8/Pz//f39//39/f/9/f3//f39//Dw8P/Hx8f/oqKi/7a2tv/R0dH/y8vL/8fHx//Hx8f/ycnJ/8vL
- y//Pz8//09PT/9TU1P/T09P/0NDQ/87Ozv/Pz8//0NDQ/9DQ0P/R0dH/0tLS/9PT0//T09P/1NTU/9XV
- 1f/W1tb/19fX/9fX1//Y2Nj/2tra/9vb2//d3d3/3d3d/9/f3//f39//4ODg/+Dg4P/h4eH/4eHh/+Hh
- 4f/i4uL/4uLi/+Pj4//k5OT/5eXl/+Xl5f/m5ub/5+fn/+jo6P/p6en/6enp/+rq6v/r6+v/7Ozs/+3t
- 7f/t7e3/7u7u/+/v7//w8PD/8PDw//Dw8P/i4uL/xcXF62NjY5IAAAA/AAAADwAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAACAAAACAAAABQAAAAoAAAAQAAAAFgAAABsAAAAeP/////29vb/9vb2//f39//h4eH/hYWF/4KC
- gv/BwcH/9fX1//n5+f/5+fn/+fn5//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//v7+//7+/v/+/v7//v7
- +//7+/v/+/v7//v7+//8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/9/f3//f39//39/f/5+fn/1NTU/6Ki
- ov+zs7P/0dHR/8zMzP/IyMj/yMjI/8nJyf/Kysr/ysrK/8vLy//Ozs7/0dHR/8/Pz//Pz8//z8/P/9DQ
- 0P/R0dH/0tLS/9LS0v/T09P/1NTU/9XV1f/V1dX/1tbW/9fX1//a2tr/3t7e/+Pj4//n5+f/6urq/+zs
- 7P/s7Oz/7u7u/+3t7f/s7Oz/7Ozs/+vr6//p6en/6Ojo/+fn5//l5eX/5eXl/+Xl5f/m5ub/5+fn/+jo
- 6P/o6Oj/6enp/+rq6v/r6+v/7Ozs/+zs7P/t7e3/7u7u/+/v7//w8PD/8PDw//Hx8f/x8fH/6urq/9bW
- 1vqTk5O8ICAgXgAAAB8AAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAFAAAACgAAABAAAAAWAAA
- AGwAAAB4//////b29v/29vb/9/f3//f39//v7+//7Ozs//X19f/4+Pj/+fn5//n5+f/5+fn/+vr6//r6
- +v/6+vr/+vr6//r6+v/6+vr/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//z8/P/8/Pz//Pz8//z8
- /P/8/Pz//Pz8//39/f/9/f3//Pz8/+Tk5P+wsLD/qKio/83Nzf/Pz8//yMjI/8jIyP/Jycn/ysrK/8vL
- y//Ly8v/zMzM/83Nzf/Ozs7/z8/P/9DQ0P/Q0ND/0dHR/9LS0v/S0tL/09PT/9TU1P/V1dX/1tbW/9jY
- 2P/d3d3/5OTk/+vr6//v7+//8fDw/+zp5//q6OX/6Ofm/+bk4//j4uD/4+Hg/+Ti4f/l5OP/5+bm/+no
- 6P/t7ez/7+/v/+3t7f/r6+v/6urq/+jo6P/o6Oj/6enp/+np6f/q6ur/6+vr/+vr6//t7e3/7e3t/+7u
- 7v/v7+//8PDw//Dw8P/x8fH/8vLy//Dw8P/h4eH+vb294UhISIIAAAA3AAAACgAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAgAAAAgAAAAUAAAAKAAAAEAAAABYAAAAbAAAAHj/////9vb2//b29v/39/f/9/f3//f3
- 9//4+Pj/+Pj4//j4+P/5+fn/+fn5//n5+f/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/7+/v/+/v7//v7
- +//7+/v/+/v7//v7+//7+/v//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//f39//39/f/6+vr/z8/P/6Sk
- pP/ExMT/0tLS/8rKyv/Jycn/ysrK/8rKyv/Ly8v/zMzM/83Nzf/Nzc3/zs7O/8/Pz//Q0ND/0NDQ/9HR
- 0f/S0tL/09PT/9TU1P/U1NT/1dXV/9fX1//e3t7/6Ojo//Hx8f/z8/P/7erp/9fMwP/Fsp//uKeV/7Gk
- lv+upZz/q6Ob/6ujmv+ropr/qqGa/6uim/+vqKH/uLKs/8bCvv/T0M3/4N/e/+7t7f/v7+//7e3t/+zs
- 7P/r6+v/6+vr/+vr6//s7Oz/7e3t/+7u7v/u7u7/7+/v//Dw8P/w8PD/8fHx//Ly8v/z8/P/6Ojo/9TU
- 1PiIiIivBgYGUwAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAAABQAAAAoAAAAQAAA
- AFgAAABsAAAAeP/////29vb/9vb2//f39//39/f/9/f3//j4+P/4+Pj/+Pj4//n5+f/5+fn/+fn5//r6
- +v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/7+/v/+/v7//v7+//7+/v/+/v7//v7+//8/Pz//Pz8//z8
- /P/8/Pz//Pz8//z8/P/9/f3//f39//r6+v/Pz8//pKSk/8HBwf/S0tL/zMzM/8rKyv/Kysr/y8vL/8zM
- zP/Nzc3/zc3N/87Ozv/Pz8//0NDQ/9HR0f/S0tL/0tLS/9PT0//U1NT/1dXV/9bW1v/c3Nz/5+fn//Ly
- 8v/y8fD/49vU/8Oumf+kgl//kmlB/5V1Vf+pmIj/tayi/7qxqf+8tKz/vbat/721rf+8s6v/ubCp/7Wt
- pf+vpp7/qJ+W/6Wbkv+up5//v7m0/9TSz//o5+b/7+/v/+/v7//t7e3/7e3t/+3t7f/t7e3/7u7u/+/v
- 7//w8PD/8fHx//Ly8v/z8/P/8/Pz//Pz8//j4+P/xMTE6VhYWJAAAABGAAAAEgAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAIAAAAIAAAAFAAAACgAAABAAAAAWAAAAGwAAAB4//////b29v/29vb/9/f3//f3
- 9//39/f/+Pj4//j4+P/4+Pj/+fn5//n5+f/5+fn/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//v7
- +//7+/v/+/v7//v7+//7+/v/+/v7//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/9/f3/+/v7/+Hh
- 4f+wsLD/pqam/8jIyP/S0tL/zMzM/8zMzP/MzMz/zc3N/87Ozv/Pz8//z8/P/9DQ0P/R0dH/0tLS/9PT
- 0//T09P/1NTU/9XV1f/X19f/4+Pj//Ly8v/4+Pj/6uTe/7+nkv+UaT7/gUkS/41eL/+rknn/wrmv/8zE
- vf/TzMX/2NHL/9nUzv/b1c//2tTP/9jQyv/PwbP/xrKd/7yhh/+yknP/qIZl/6GCY/+cgmj/n4t3/7Gk
- l//Rzcj/7ezs//Hx8f/x8fH/7+/v/+/v7//w8PD/8fHx//Hx8f/y8vL/8/Pz//T09P/09PT/9fX1/+vr
- 6//Y2Nj7mpqavhISEmIAAAAoAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAAAUAAAAKAAA
- AEAAAABYAAAAbAAAAHj/////9vb2//b29v/39/f/9/f3//f39//4+Pj/+Pj4//j4+P/5+fn/+fn5//n5
- +f/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+/v7//v7+//7+/v/+/v7//v7+//7+/v//Pz8//z8
- /P/8/Pz//Pz8//z8/P/8/Pz//Pz8//39/f/9/f3/+fn5/9zc3P+rq6v/q6ur/8/Pz//S0tL/zc3N/87O
- zv/Ozs7/z8/P/9DQ0P/Q0ND/0dHR/9LS0v/T09P/1NTU/9TU1P/V1dX/2tra/+jo6P/4+Pj/9PLv/868
- q/+ackn/f0YN/4RGCf+fcUX/wK2a/9HKwv/b1c//4NvW/+Tg3P/p5eH/6+fj/+fe1f/YwKj/xppt/7d7
- P/+sZR7/pVgL/6JUB/+eUgb/mlAG/5NNB/+OTg//ilYi/5FpQ/+wmYP/2tLM//Hx8P/y8vL/8PDw//Hx
- 8f/x8fH/8vLy//Pz8//09PT/9fX1//X19f/29vb/9fX1/+fn5/7Nzc3venp6pg8PD1AAAAAXAAAAAwAA
- AAIAAAAEAAAACwAAAA8AAAAPAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAACAAAACAAAABQAAAAoAAAAQAAAAFgAAABsAAAAeP/////29vb/9vb2//f3
- 9v/39/f/9/f3//j4+P/4+Pj/+Pj4//n5+f/5+fn/+fn5//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6
- +v/7+/v/+/v7//v7+//7+/v/+/v7//v7+//8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//f39//39
- /f/9/f3/9/f3/9bW1v+mpqb/sLCw/9LS0v/S0tL/z8/P/8/Pz//Q0ND/0dHR/9HR0f/S0tL/09PT/9TU
- 1P/V1dX/1dXV/9vb2//r6+v/+Pj4/+vm4P+1mHz/g04Z/38/AP+MSQj/rIJY/87Asv/c1tH/4t7a/+jl
- 4v/t6+n/8e/u//Pw7f/m0bz/y5hk/7VrH/+tWAL/q1UA/6tUAP+qVAD/qFQA/6dTAP+kUgD/oU8A/5tM
- AP+SSAD/iEMA/4FECf+TaUD/wrCd/+7t6//z8/P/8/Pz//Pz8//z8/P/9PT0//X19f/19fX/9vb2//f3
- 9//4+Pj/9fX1/+Pj4/68vLzgUVFRhAAAADoAAAAiAAAAKAAAADEAAAA8AAAARgAAAEUAAAApAAAACwAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAFAAA
- ACgAAABAAAAAWAAAAGwAAAB4//////b29v/29vb/9/f2//j4+P/w8PD/6urq//r6+v/4+Pj/+fn4//n5
- +f/5+fn/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7
- +//8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/9/f3//f39//39/f/9/f3/8fHx/8bGxv+jo6P/vLy8/9jY
- 2P/S0tL/0NDQ/9HR0f/S0tL/09PT/9TU1P/U1NT/1dXV/9bW1v/b29v/7Ozs//j4+P/g1sz/o35b/4FI
- D/+EQQD/kUoF/69/UP/Sw7X/4d3Z/+jl4//u7ev/8/Lx//f19f/07+r/3b2d/8KCQv+1aBr/tGQV/7Rk
- Ff+zYhL/sl8O/7BcCf+uWQT/rVcB/6xVAP+pVAD/plIA/6JQAP+aTAD/j0cA/4RCAv+JVSD/t52C/+rl
- 4P/19fX/9PT0//X19f/19fX/9vb2//f39//4+Pj/+Pj4//n5+f/6+vr/8vLy/93d3fudnZ3BJiYmcR0d
- HWdBQUF4Xl5einR0dJ2GhoaucHBwnxMTE1wAAAAhAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAAAUAAAAKAAAAEAAAABYAAAAbAAAAHj/////9vb2//b2
- 9v/39/b/4ODg/5SUlP+jo6P/ysrK//j4+P/4+Pj/+fn5//n5+f/5+fn/+vr6//r6+v/6+vr/+vr6//r6
- +v/6+vr/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//39
- /f/9/f3//f39//39/f/5+fn/09PT/6Ojo/+3t7f/2dnZ/9PT0//R0dH/0tLS/9PT0//U1NT/1dXV/9XV
- 1f/W1tb/2tra/+np6f/29vb/2MzB/5x0Tv97PgL/h0MA/5RKAP+vekX/1MW3/+Xi3//s6ur/8fHw//X1
- 9f/29vb/8uzm/9m0kP+9dzL/t2oe/7htIv+5byX/unIp/7pyKv+6cCf/uGwh/7VnGf+yYhH/sF0K/65Z
- BP+tVgH/q1QA/6ZTAP+fTwD/lEkA/4ZCAP+BRw7/ro9w/+fh2//29vb/9vb2//b29v/39/f/+Pj4//n5
- +f/5+fn/+vr6//v7+//6+vr/6+vr/9PT0/S2trbZt7e32cHBwePKysrr1dXV89zc3PvIyMjqYGBgkgQE
- BDwAAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAA
- ABQAAAAoAAAAQAAAAFgAAABsAAAAeP/////29vb/9vb2//f39v+0tLT/f39//5GRkf+mpqb/8/Pz//j4
- +P/5+fn/+fn5//n5+f/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/7+/v/wMDA/7CwsP/t7e3/rq6u/729
- vf/z8/P/s7Oz/8PDw//p6en/oqKi/8LCwv/8/Pz/s7Oz/9XV1f/29vb/sLCw//Dw8P9+fn7/oqKi/8rK
- yv/W1tb/0tLS/9LS0v/T09P/1NTU/9XV1f/W1tb/19fX/9nZ2f/m5ub/8/Pz/9vQxv+ZcUr/fkIG/4pE
- AP+WSgD/qGgo/9G6pf/n5eP/7e3s//Hx8f/z8/P/8/Pz//Lv7P/Uq4T/uGwi/7NiEf+0YxT/tWYX/7Vo
- G/+3ax//uG4j/7pwJ/+7cyv/u3Iq/7lvJf+3ah7/tGUW/7JgD/+wXAj/rloF/6tWA/+jUgD/lkoA/4hD
- AP+FTBP/sZN0/+3o5P/4+Pj/+fn5//n5+f/5+fn/+vr6//v7+//7+/v//Pz8//39/f/4+Pj/6enp/+Li
- 4v7m5ub+6enp/+3t7f/w8PD/7u7u/93d3fuhoaHFGBgYXAAAABwAAAACAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAFAAAACgAAABAAAAAWAAAAGwAAAB4//////b2
- 9v/29vb/9vb2/9fX1/92dnb/f39//7a2tv/09PT/+Pj4//n5+f/5+fn/+fn5//r6+v/6+vr/+vr6//r6
- +v/6+vr/+vr6//r6+v+wsLD/+vr6/8jIyP+rq6v/9/f3/8HBwf+srKz//Pz8/8bGxv+xsbH/7u7u/8LC
- wv+2trb/5OTk/8/Pz/+YmJj/z8/P/3V1df+srKz/19fX/9TU1P/T09P/09PT/9XV1f/V1dX/1tbW/9fX
- 1//Y2Nj/4uLi//Ly8v/j3Nf/o4Jf/3s/A/+JRAD/lksA/6NYDf/Fn3n/5uPg/+3t7f/v7+//8PDw//Hx
- 8f/w7uz/272g/7dtI/+vWgX/sFwH/7BdCv+xYA3/smIS/7RmF/+2aRz/uG0i/7pyKf+8dS//vXgz/713
- Mv+7cyv/uG4j/7VpG/+0ZBT/smEQ/69eDP+nVgf/mEwC/4hEAP+CSA//vKKI//X08v/6+vr/+vr6//r6
- +v/7+/v//Pz8//z8/P/9/f3//f39//z8/P/5+fn/9/f3//n5+f/6+vr/+fn5//n5+f/39/f/6Ojo/sjI
- yOhLS0uAAAAALwAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA
- AAgAAAAUAAAAKAAAAEAAAABYAAAAbAAAAHj/////9vb2//b29v/29vb/9vb2/+Xl5f/Z2dn/8fHx//j4
- +P/4+Pj/+fn5//n5+f/5+fn/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6/83Nzf/k5OT/8/Pz/5mZ
- mf/5+fn/9PT0/5+fn//6+vr/+fn5/6Ghof/x8fH/y8vL/6ampv/s7Oz/zs7O/5iYmP+jo6P/h4eH/8nJ
- yf/Y2Nj/09PT/9TU1P/V1dX/1tbW/9bW1v/X19f/2NjY/93d3f/s7Oz/7uzr/6qNcf98Qwr/h0IA/5ZK
- AP+fTwD/uH9H/+DVyv/r6ur/7Ozs/+7u7v/u7u7/8PDw/+XWx/+/fz//rlcB/65XAP+uVwH/rlgD/7Bb
- B/+xXw3/s2MT/7VnGf+3ax//unAm/7x0Lf++eTT/wH06/8B+O/++ezf/vHYw/7pxJ/+3bCD/tmkc/7Rm
- Gv+rXhL/mVEI/4ZDAP+MWCX/yrek//r5+f/7+/v/+/v7//z8/P/9/f3//f39//39/f/8/Pz//Pz8//v7
- +//6+vr/+fn5//n5+f/4+Pj/9/f3//f39//u7u7/2dnZ+IaGhqsAAABIAAAAEQAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAAABQAAAAoAAAAQAAAAFgAAABsAAAAeP//
- ///29vX/9vb2//b29v/39/f/9/f3//f39//4+Pj/+Pj4//j4+P/5+fn/+fn5//n5+f/6+vr/+vr6//r6
- +v/6+vr/+vr6//r6+v/6+vr/+vr6/83Nzf/Jycn/pKSk/+fn5//7+/v/4+Pj//v7+//5+fn/0dHR/5iY
- mP+Kior/f39//7CwsP+vr6//j4+P/5ubm/+cnJz/2dnZ/9bW1v/U1NT/1dXV/9XV1f/W1tb/19fX/9jY
- 2P/a2tr/5eXl/+/u7v/Juan/gk4c/4NAAP+TSQD/n08A/6pdEf/QspT/6Ojn/+rq6v/r6+v/7Ozs/+3t
- 7f/t6+n/0KZ+/7BcCP+uVwD/rlcC/69ZBP+vWgb/sF0J/7FfDP+zYhH/tWYX/7ZpHP+5biP/u3Mr/713
- Mv+/fDj/wYA//8KDRP/CgUH/v3w4/7x1Lv+5byX/uGsg/7ZpHv+rYRj/llEM/4RFBf+YbEH/5dzT//z8
- /P/8/Pz//f39//39/f/9/f3//Pz8//v7+//7+/v/+vr6//r6+v/5+fn/+Pj4//f39//39/f/9vb2//Pz
- 8//i4uL+rq6uzSMjI2QAAAAdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAIAAAAIAAAAFAAAACgAAABAAAAAWAAAAGwAAAB4//////b29f/29vb/9vb2//f39v/39/f/9/f3//j4
- 9//4+Pj/+Pj4//n5+P/5+fn/+fn5//n5+f/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/7+/v/+/v7//v7
- +//Z2dn/0NDQ//v7+//u7u7/y8vL/+3t7f+5ubn/o6Oj/7S0tP+3t7f/t7e3/7e3t/+4uLj/vb29/9TU
- 1P/a2tr/1dXV/9XV1f/W1tb/19fX/9jY2P/Z2dn/2dnZ/9/f3//t7e3/497Z/5x3Uv98PgD/jkYA/51O
- AP+lUwH/u3w//+DVy//n5+f/6enp/+rq6v/r6+v/7Ozs/+TYzP+8ejj/rlgB/69ZBP+wWwf/sV4K/7Ff
- Df+yYQ//s2MS/7RkFf+1Zhj/tmkc/7htIf+6cSj/vHUu/714M/+/fDj/wX8//8KCQv/BgUD/v3s3/7t0
- LP+4bCH/tWga/7JlF/+mXRX/klAN/4BFCf+3mn3/+ff2//39/f/9/f3//Pz8//z8/P/7+/v/+vr6//r6
- +v/5+fn/+Pj4//f39//39/f/9vb2//b29v/19fX/9PT0/+jo6P/Ly8voUFBQhQAAADIAAAAHAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAAAUAAAAKAAAAEAAAABYAAAAbAAA
- AHj/////9vb1//b29v/29vb/9/f2//f39//39/f/9/f3//j4+P/4+Pj/+Pj4//n5+f/5+fn/+fn5//r6
- +v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/7+/v/8PDw/7i4uP+5ubn/+/v7//v7+//7+/v/39/f/6ur
- q/+9vb3/29vb/9nZ2f/Y2Nj/2NjY/9nZ2f/Y2Nj/29vb/9fX1//W1tb/1tbW/9fX1//Y2Nj/2dnZ/9nZ
- 2f/b29v/5ubm/+zr6/+4oYv/e0IL/4dDAP+YTAD/o1EA/6xbCf/MpX//5OHf/+bm5v/o6Oj/6enp/+rq
- 6v/q6ej/2b6j/7NkFf+vWwf/sV0K/7FfDf+zYhD/s2MT/7RlFv+1Zxn/tmkc/7dqHv+3ax//t2sg/7hs
- If+4biP/uXAn/7tzLP+9dzH/vns3/8B9O//Afjv/vXgz/7lwJ/+2aRv/s2MU/61fEf+eVg//ikoK/49e
- Lf/bzsL/+/v7//z8/P/7+/v/+/v7//r6+v/5+fn/+fn5//j4+P/39/f/9/f3//b29v/19fX/9fX1//T0
- 9P/z8/P/7e3t/9vb2/h6enqjCwsLRAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAACAAAACAAAABQAAAAoAAAAQAAAAFgAAABsAAAAeP/////29vX/9vb2//b29v/29vb/9/f3//f3
- 9//39/f/+Pj4//j4+P/4+Pj/+fn5//n5+f/5+fn/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//v7
- +//7+/v/+/v7//n5+f/7+/v/+/v7//f39//S0tL/oaGh/8zMzP/Z2dn/09PT/9PT0//U1NT/1dXV/9XV
- 1f/W1tb/1tbW/9fX1//X19f/2NjY/9nZ2f/a2tr/2tra/9/f3//q6ur/3NXP/5NpQf99PgD/kUcA/59P
- AP+oUwD/s2cc/9fEsf/k5OT/5eXl/+bm5v/o6Oj/6enp/+fk4P/Nonf/smEQ/7FfDP+yYRD/s2MT/7Rl
- Fv+1Zxn/tmkc/7dqHv+3ax//t2sf/7dqHf+2aBv/tmca/7ZnGf+2aBv/t2sf/7lvJP+7cyr/vHYw/756
- Nv++ejb/u3Qt/7dsIP+zZBT/sF8N/6ZYCv+UTgj/hEkN/7GSdP/z8e7/+vr6//r6+v/6+vr/+fn5//n5
- +f/4+Pj/9/f3//f39//29vb/9fX1//X19f/09PT/8/Pz//Ly8v/s7Oz/3t7e/J2dnb4eHh5cAAAAHgAA
- AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAFAAAACgAAABAAAAAWAAA
- AGwAAAB4//////b29f/29vb/9vb2//b29v/39/f/9/f3//f39//4+Pj/+Pj4//j4+P/5+fn/+fn5//n5
- +f/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+/v7//v7+//7+/v/+/v7//v7+//7+/v/9fX1/8XF
- xf+ioqL/1dXV/9fX1//S0tL/09PT/9TU1P/V1dX/1dXV/9bW1v/X19f/2NjY/9jY2P/Z2dn/2tra/9vb
- 2//c3Nz/4+Pj/+np6P+/rpz/f0kU/4ZDAP+ZSwD/pVEA/6xVAP+8fT//3NPK/+Pj4//k5OT/5eXl/+bm
- 5v/o6Oj/5uDb/8SOWP+zYxL/s2IS/7RlFf+1Zxn/tmkc/7dqHv+3ax//t2oe/7dpHP+2aBr/tWcY/7Rl
- Fv+0ZBT/tGMT/7NjEv+zYxP/tGYX/7ZqHf+4biP/unIq/712MP+9dzH/unAn/7VnGf+xXw3/q1gG/5xQ
- BP+IRgP/kF4u/+DWzP/5+fn/+fn5//n5+f/4+Pj/9/f3//f39//29vb/9vb2//X19f/09PT/9PT0//Pz
- 8//w8PD/6+vr/+Pj4/3Q0NDuhISEqxUVFVMAAAAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAgAAAAgAAAAUAAAAKAAAAEAAAABYAAAAbAAAAHj/////9fX1//b29f/29vb/9vb2//j4
- 9//19fX/+fn5//j49//4+Pj/+Pj4//n5+P/5+fn/+fn5//n5+f/6+vr/+vr6//r6+v/6+vr/+vr6//r6
- +v/6+vr/+/v7//v7+//7+/v/+/v7//v7+//y8vL/ubm5/62trf/Z2dn/1tbW/9PT0//U1NT/1dXV/9XV
- 1f/W1tb/19fX/9jY2P/Z2dn/2dnZ/9ra2v/b29v/3Nzc/97e3v/m5ub/4+Hf/5x7WP97PgH/jkcA/6BP
- AP+pVAD/rVYA/8OQXv/f29j/4uLi/+Pj4//l5eX/5ubm/+fn5//k39n/wYZL/7RlFv+0Zhf/tmgb/7dq
- Hv+3ax//t2sf/7dpHP+2aBr/tWcY/7VlFv+0ZBT/s2IS/7JhEP+yYA//sV8N/7FeC/+xXgz/s2EQ/7Rl
- F/+3ah7/uW4k/7tzK/+7cyv/t2wg/7NjEv+tWQb/oVEA/49IAP+DRgv/v6eP//f39//4+Pj/+Pj4//f3
- 9//39/f/9vb2//X19f/19fX/9PT0//Pz8//y8vL/7e3t/+bm5v7Y2Nj1tLS003V1dZwaGhpgAAAALwAA
- AAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAAABQAAAAoAAAAQAAA
- AFgAAABsAAAAeP/////19fX/9vb1//b29v/n5+f/nZ2d/6ampv/W1tb/9/f3//j4+P/4+Pj/+Pj4//n5
- +f/5+fn/+fn5//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/7+/v/+/v7//v7+//7+/v/+/v7/+jo
- 6P+urq7/ubm5/9nZ2f/V1dX/1NTU/9XV1f/W1tb/19fX/9jY2P/Y2Nj/2dnZ/9ra2v/b29v/29vb/9zc
- 3P/d3d3/4ODg/+fn5//RyMD/iFot/4FAAP+WSgD/pVIA/6xWAP+uWQP/x592/9/f3//h4eH/4uLi/+Tk
- 5P/l5eX/5ubm/+Te2f/CiE7/tmkb/7dpHP+3ah//t2sf/7ZpHf+2aBv/tWYZ/7RlFv+0ZBT/s2IS/7Jh
- EP+xXw7/sV4M/7BdCv+wXAj/r1sG/69aBf+vWgX/sF0K/7JhEf+1Zxn/uG0h/7pyKf+5cSf/tmkb/7Fg
- Dv+nVQP/l0sA/4RBAP+lf1r/7urn//f39//39/f/9vb2//b29v/19fX/9PT0//T09P/z8/P/8PDw/+jo
- 6P/g4OD7wsLC3oeHh6o8PDxyBwcHRQAAACIAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAIAAAAIAAAAFAAAACgAAABAAAAAWAAAAGwAAAB4//////X19f/29vX/9vb2/7a2
- tv+CgoL/lJSU/6qqqv/z8/P/+Pj4//j4+P/4+Pj/+fn5//n5+f/5+fn/+vr6//r6+v/6+vr/+vr6//r6
- +v/6+vr/+vr6//v7+//7+/v/+/v7//v7+//7+/v/39/f/6Wlpf/CwsL/3Nzc/9XV1f/V1dX/1tbW/9fX
- 1//Y2Nj/2dnZ/9nZ2f/a2tr/29vb/9zc3P/d3d3/3d3d/97e3v/i4uL/5ubm/7ilkv97RA3/h0MA/5tO
- AP+pVAD/rVYA/69dCv/KqIX/39/f/+Dg4P/i4uL/4+Pj/+Xl5f/m5ub/5N/a/8eUYP+4bCH/uGwg/7dq
- Hv+2aRz/tmcZ/7VmF/+0ZBX/s2MS/7JiEP+yYA7/sV8M/7BdCv+wXAj/r1sG/69aBP+uWAL/rlcA/65X
- AP+uWAL/r1sH/7JhEf+1aBr/uG0j/7pyKf+5byX/tWYY/6xbCv+cTwH/ikQA/49eLf/az8X/9fX1//b2
- 9v/19fX/9fX1//T09P/09PT/8/Pz//Ly8v/t7e3/4uLi/rGxsc9NTU2BBgYGTgAAACsAAAASAAAAAQAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAAAUAAAAKAAA
- AEAAAABYAAAAbAAAAHj/////9fX1//X19f/29vb/zs7O/3Jycv+CgoL/r6+v//Ly8v/4+Pj/+Pj4//j4
- +P/5+fj/+fn5//n5+f/5+fn/+vr6//r6+v/6+vr/+vr6//n5+f/l5eX/8PDw//v7+//7+/v/+/v7//v7
- +//Y2Nj/pKSk/8rKyv/d3d3/1tbW/9bW1v/X19f/2NjY/9nZ2f/a2tr/2tra/9vb2//c3Nz/3d3d/97e
- 3v/e3t7/39/f/+Pj4//j4+L/qY5z/3g7AP+MRQD/oFAA/6tVAP+tVgD/sWAQ/8yuj//e3t7/39/f/+Hh
- 4f/j4+P/5OTk/+Xl5f/k4d7/zqd//7lvJf+3ah7/tmgb/7VnGf+0ZRb/tGQU/7NiEv+yYQ//sV8N/7Fe
- C/+wXQn/r1sG/69ZBP+uWAL/rlcB/65XAP+uVwD/rlcA/65XAP+uWAL/sF0J/7NjE/+2aRz/uW8l/7py
- Kv+4bCL/sGIT/6FTBv+PRgD/gUYL/8q3pf/09PP/9PT0//X19f/09PT/8/Pz//Ly8v/y8vL/8fHx/+3t
- 7f/h4eH5g4ODqQAAAEoAAAAdAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAACAAAACAAAABQAAAAoAAAAQAAAAFgAAABsAAAAeP/////19fX/9fX1//b2
- 9f/z8/P/09PT/8PDw//r6+v/9/f3//j49//4+Pj/+Pj4//j4+P/5+fn/+fn5//n5+f/6+vr/+vr6//r6
- +v/6+vr/3d3d/6ysrP/Q0ND/zs7O/+fn5//7+/v/2dnZ/6CgoP+Li4v/zMzM/97e3v/X19f/19fX/9jY
- 2P/Z2dn/2tra/9ra2v/b29v/3Nzc/93d3f/e3t7/3t7e/9/f3//g4OD/4+Pj/93a1/+belr/ezwA/5FH
- AP+kUQD/rVYA/65XAP+yYhP/zbCT/93d3f/f39//4ODg/+Li4v/j4+P/5eXl/+Xk4//XvqT/unIq/7Zo
- G/+1Zhj/tGUW/7NjE/+zYhH/smAO/7FfDP+wXQn/sFsH/69aBf+uWAL/rlcB/65XAP+uVwD/rlcA/65X
- AP+uVwD/rlcA/65XAP+uWQP/sV8M/7RlFf+3ax//unEo/7pxKP+0aBz/plkN/5RKAv+BQQT/vKSM//Dv
- 7v/z8/P/9PT0//Pz8//y8vL/8vLy//Hx8f/w8PD/7u7u/+Tk5P6QkJCyBgYGSQAAABAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAFAAA
- ACgAAABAAAAAWAAAAGwAAAB4//////X19f/19fX/9vb1//b29v/29vb/9vb2//f39//39/f/9/f3//j4
- +P/4+Pj/+Pj4//n5+f/5+fn/+fn5//r6+v/6+vr/+vr6//r6+v/s7Oz/tra2//r6+v/7+/v/y8vL/+vr
- 6/+tra3/0NDQ/6SkpP+8vLz/3t7e/+Dg4P/d3d3/29vb/9vb2//b29v/3Nzc/93d3f/d3d3/3t7e/9/f
- 3//g4OD/4eHh/+Hh4f/i4uL/1tHM/49nQP9+PgD/lEkA/6dTAP+tVgD/rlcB/7JjFP/MrpD/3Nzc/9/f
- 3//g4OD/4eHh/+Pj4//k5OT/5eXl/97Sxv/Ag0b/tWYY/7RkFf+zYxP/smEQ/7JfDf+xXgv/sFwI/69a
- Bv+uWQT/rlcB/65XAP+uVwD/rlcA/65XAP+uVwD/rlcA/65XAP+uVwD/rlcA/65XAP+vWgX/smAP/7Vm
- GP+4bSL/unIq/7duJP+qXxX/mE8H/4RDA/+sjGz/6ufl//Ly8v/z8/P/8vLy//Hx8f/x8fH/8PDw/+/v
- 7//u7u7/5eXl/6CgoL0YGBhTAAAAEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAAAUAAAAKAAAAEAAAABYAAAAbAAAAHj/////9fX1//X1
- 9f/29vX/9vb2//b29v/29vb/9/f3//f39//39/f/+Pj4//j4+P/4+Pj/+fn4//n5+f/5+fn/+fn5//r6
- +v/6+vr/+vr6//r6+v+pqan/+vr6//r6+v/09PT/t7e3/8fHx/++vr7/s7Oz/4WFhf+kpKT/u7u7/9XV
- 1f/e3t7/39/f/97e3v/d3d3/3t7e/97e3v/f39//4ODg/+Hh4f/h4eH/4uLi/+Li4v/RysP/g1Yp/4A/
- AP+WSgD/qVQA/65XAf+vWQT/smIS/8qpiP/c3Nz/3t7e/9/f3//h4eH/4uLi/+Pj4//j4+P/4+De/8yj
- e/+1Zxr/s2MS/7JhEP+xXw3/sV0K/7BcCP+vWgb/rlkD/65YAf+uVwD/rlcA/65XAP+uVwD/rlcA/65X
- AP+uVwD/rlcA/65XAP+uVwD/rlcA/65YAv+wXQn/s2MT/7ZpHf+5cCf/uXEp/6xlHf+bVA7/hkUE/6B6
- Vf/m49//8fHx//Ly8v/x8fH/8PDw//Dw8P/v7+//7u7u/+3t7f/m5ub/qKiowx8fH1gAAAAWAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAA
- ABQAAAAoAAAAQAAAAFgAAABsAAAAeP/////19fT/9fX1//X19f/29vX/9vb2//b29v/39/b/9/f3//f3
- 9//4+Pf/+Pj4//j4+P/4+Pj/+fn5//n5+f/5+fn/+vr6//r6+v/6+vr/4ODg/6mpqf/4+Pj/+vr6//Dw
- 8P+srKz/+/v7/8/Pz/+bm5v/lpaW/6+vr/+VlZX/nJyc/7CwsP/Jycn/4+Pj/+Dg4P/f39//39/f/+Dg
- 4P/h4eH/4uLi/+Li4v/i4uL/4eHh/83Fvf99Th3/gUAA/5dLAP+qVQD/rlgD/7BbB/+yXw7/yKB6/9vb
- 2//d3d3/39/f/+Hh4f/h4eH/4uLi/+Li4v/j4+P/2ci3/719Pf+yYRD/smAN/7FdCv+wXAj/r1oG/65Y
- A/+uVwD/rlcA/65XAP+uVwD/rlcA/65XAP+uVwD/rlcA/65XAP+uVwD/rlcA/65XAP+uVwD/rlcA/65a
- Bf+yYA7/tWYY/7htI/+5cir/rmgi/51YE/+JSAj/mnJJ/+Tf2//v7+//8fHx//Dw8P/v7+//7+/v/+7u
- 7v/u7u7/7Ozs/+fn5/+tra3GHh4eYwAAACkAAAANAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAFAAAACgAAABAAAAAWAAAAGwAAAB4//////X1
- 9P/19fX/9fX1//b29f/29vb/9vb2//b29v/39/f/9/f3//f39//4+Pj/+Pj4//j4+P/5+fn/+fn5//n5
- +f/6+vr/+vr6//r6+v/MzMz/t7e3/+Hh4f/b29v/qqqq/9/f3//7+/v/+/v7//n5+f/09PT/6Ojo/9XV
- 1f+/v7//qamp/6Wlpf/b29v/4uLi/+Dg4P/g4OD/4eHh/+Li4v/j4+P/5OTk/+Pj4//f39//y8K6/3tJ
- GP+CQAD/mEwA/6tXA/+vWwb/sF0K/7JgD//DlGb/2dbT/9zc3P/e3t7/39/f/+Dg4P/g4OD/4eHh/+Li
- 4v/g3dr/zqyJ/7VqHv+xXQr/sFwI/69aBf+uWAP/rlcA/65XAP+uVwD/rlcA/65XAP+uVwD/rlcA/65X
- AP+uVwD/rlcA/65XAP+uVwD/rlcA/65XAP+uVwD/rlgB/7BdCf+zYxT/tmoe/7hwJ/+vayb/nlwZ/4tL
- Df+ZcUj/4t7Z/+7u7v/w8PD/7+/v/+7u7v/u7u7/7e3t/+zs7P/r6+v/5+fn/8fHx+BkZGSVHBwcYgMD
- A0MAAAAsAAAAFwAAAAkAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA
- AAgAAAAUAAAAKAAAAEAAAABYAAAAbAAAAHj/////9fX0//X19f/19fX/9vb1//b29v/29vb/9vb2//f3
- 9//39/f/9/f3//j49//4+Pj/+Pj4//j4+P/5+fn/+fn5//n5+f/6+vr/+vr6//r6+v/19fX/4ODg/+Dg
- 4P/09PT/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+Pj4/+3t7f/Jycn/o6Oj/9HR0f/j4+P/4eHh/+Hh
- 4f/i4uL/4+Pj/+Tk5P/l5eX/5OTk/9/f3//Lw7v/fU0d/4FAAP+YTQH/q1gG/7BdCf+xXw3/s2IS/76F
- TP/Wzsb/3Nzc/93d3f/e3t7/3t7e/9/f3//g4OD/4ODg/+Hg4P/e19H/xJFf/7FfDP+vWgX/rlgD/65X
- AP+uVwD/rlcA/65XAP+uVwD/rlcA/65XAP+uVwD/rlcA/65XAP+uVwD/rlcA/65XAP+uVwD/rlcA/65X
- AP+uVwD/r1oF/7JgD/+1Zxr/tm0j/65rJ/+fXx7/jE4R/5x1T//i3dn/7Ozs/+/v7//v7+//7u7u/+3t
- 7f/t7e3/7Ozs/+vr6//o6Oj/5eXl/dHR0eivr6/Kenp6oD8/P3gVFRVVAAAAOAAAABkAAAADAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAAABQAAAAoAAAAQAAAAFgAAABsAAAAeP//
- ///09PT/9fX0//X19f/19fX/+fn4//r6+v/39/f/9/f2//f39//39/f/9/f3//j4+P/4+Pj/+Pj4//n5
- +f/5+fn/+fn5//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+/v7//v7+//7+/v/+/v7//v7
- +//7+/v/+fn5/9XV1f+mpqb/0dHR/+Tk5P/i4uL/4uLi/+Pj4//k5OT/5eXl/+bm5v/l5eX/3t7e/8zG
- vv+CVyv/fz8A/5dOBP+rWgj/sV4M/7JhEP+0ZBX/unUx/9PCsv/b29r/3Nzc/9zc3P/d3d3/3d3d/97e
- 3v/f39//39/f/+Dg4P/ZzL7/xJJf/7ZqHf+2aBv/t2od/7drH/+3bCD/t2oe/7ZoG/+1Zhf/s2MT/7Ff
- DP+vWgX/rlcA/65XAP+uVwD/rlcA/65XAP+uVwD/rlcA/65XAP+uWAP/sV4M/7RlFv+zaR//q2kl/59g
- If+MURX/ooBe/+Le2//r6+v/7u7u/+3t7f/t7e3/7Ozs/+zs7P/r6+v/6urq/+np6f/o6Oj/5ubm/uTk
- 5Pzc3Nz0yMjI36SkpLxnZ2eKAAAAPwAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAIAAAAIAAAAFAAAACgAAABAAAAAWAAAAGwAAAB4//////T09P/19fT/9fX1/+/v7/+urq7/rq6u/+Dg
- 4P/29vb/9/f3//f39//39/f/+Pj4//j4+P/4+Pj/+fn4//n5+f/5+fn/+fn5//r6+v/6+vr/+vr6//r6
- +v/6+vr/+vr6//r6+v/7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/2dnZ/6ioqP/Nzc3/5eXl/+Pj
- 4//k5OT/5eXl/+Xl5f/m5ub/5+fn/+bm5v/e3t7/z8rG/4xmQf99PgH/lU0F/6laCv+xYA7/s2MT/7Vl
- F/+3bSP/y6qK/9nX1f/b29v/29vb/9zc3P/d3d3/3t7e/+Dg4P/i4uL/5eXl/+bm5v/i18z/0amA/8iQ
- V//IjlT/yY9W/8mQV//IjlX/x4xR/8aJTf/Ehkf/wYA//756Nv+7cyv/t2of/7JhEP+vWwb/rlgC/65X
- AP+uVwD/rlcA/65XAf+wXAn/s2IT/7BmG/+oZSP/nWAj/4xSGv+vlHn/5OLg/+vr6//t7e3/7e3t/+zs
- 7P/r6+v/6+vr/+rq6v/p6en/6enp/+jo6P/n5+f/5+fn/+bm5v7n5+f+5+fn/qysrMcGBgZVAAAAFgAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAAAUAAAAKAAAAEAAAABYAAAAbAAA
- AHj/////9PT0//X19P/19fX/ubm5/4WFhf+Xl5f/rq6u//T09P/39/b/9/f3//f39//39/f/+Pj4//j4
- +P/4+Pj/+fn5//n5+f/5+fn/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/7+/v/+/v7//v7
- +//7+/v/+/v7//r6+v/c3Nz/qqqq/8fHx//m5ub/5OTk/+Xl5f/m5ub/5ubm/+fn5//o6Oj/5+fn/9/f
- 3//T0c//mXpc/3o+A/+RTAf/p1oM/7JiEf+0ZBX/tWca/7drIP/BjFb/1c3G/9nZ2f/a2tr/3Nzc/+Dg
- 4P/j4+P/5eXl/+fn5//o6Oj/6enp/+rq6v/m4Nr/28Cm/8+fcP/LlV7/y5Ve/8uUXf/Lk1z/ypJa/8mQ
- WP/Jj1X/x41S/8aKTv/EhUj/wYA//714Mv+4bCD/smAO/65YAv+uVwD/rlcA/69aBv+xYBD/rGMY/6Ri
- H/+aXiP/iVMd/7yok//l5eT/6urq/+zs7P/s7Oz/6+vr/+rq6v/q6ur/6enp/+jo6P/o6Oj/5+fn/+bm
- 5v/l5eX/5eXl/+Xl5f/m5ub9pqamwgAAAFMAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAACAAAACAAAABQAAAAoAAAAQAAAAFgAAABsAAAAeP/////09PT/9PT0//X19P/ExMT/cnJy/4WF
- hf+oqKj/8fHx//b29v/39/f/9/f3//f39//4+Pj/+Pj4//j4+P/5+fj/+fn5//n5+f/5+fn/+vr6//r6
- +v/6+vr/+vr6//r6+v/6+vr/+vr6//v7+//7+/v/+/v7//v7+//4+Pj/5+fn/8bGxv+goKD/wMDA/+jo
- 6P/l5eX/5ubm/+fn5//o6Oj/6Ojo/+np6f/q6ur/4eHh/9bW1f+iinL/dT0F/4xKCP+jWQ7/sWIT/7Vm
- F/+2aRz/t2sf/7p1MP/Ot5//2tra/9/f3//i4uL/4+Pj/+Xl5f/m5ub/5+fn/+jo6P/p6en/6urq/+vq
- 6v/p5uT/4tHA/9ezj//Om2j/zZhk/8yXYv/LlV//y5Rc/8qSWv/JkFb/x41S/8aLT//FiEv/xIRG/8KB
- QP++eTT/uG0h/7JhD/+vWAP/r1kE/65eDf+oXxX/oF4c/5ZcIf+MXCz/xrip/+Xl5f/p6en/6+vr/+vr
- 6//q6ur/6enp/+np6f/o6Oj/5+fn/+fn5//m5ub/5eXl/+Xl5f/k5OT/5OTk/+Tk5Pqampq1AAAASwAA
- ABIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAFAAAACgAAABAAAAAWAAA
- AGwAAAB4//////T09P/09PT/9fX0//Dw8P+9vb3/r6+u/+Dg4P/29vb/9vb2//f39v/39/f/9/f3//j4
- 9//4+Pj/+Pj4//j4+P/5+fn/+fn5//n5+f/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//v7
- +//7+/v/7+/v/9nZ2f+4uLj/pKSk/7Kysv/Y2Nj/6Ojo/+fn5//n5+f/6Ojo/+np6f/p6en/6urq/+vr
- 6//j4+P/19fX/7Khkf95Rxb/hkcJ/55XD/+uYRX/tWca/7dqHv+4bCD/unEo/8mgdf/c2dX/4eHh/+Li
- 4v/j4+P/5OTk/+Xl5f/m5ub/5+fn/+jo6P/p6en/6+vr/+zs7P/s7Oz/593T/9Wthf/PnGr/zpto/82Z
- Zf/Ml2H/y5Re/8qSWv/Jj1X/x4xR/8aJTf/Fhkj/w4ND/8GAPv+/fDn/vHYv/7dpHf+xXgz/q1sM/6Nb
- E/+bWxr/klkf/5hxSf/RycL/5eXl/+np6f/q6ur/6urq/+np6f/o6Oj/6Ojo/+fn5//m5ub/5ubm/+Xl
- 5f/k5OT/5OTk/+Pj4//k5OT/4ODg9oiIiKQAAABBAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAgAAAAgAAAAUAAAAKAAAAEAAAABYAAAAbAAAAHj/////9PT0//T09P/09PT/9fX0//X1
- 9f/19fX/9vb1//b29v/29vb/9/f2//f39//39/f/9/f3//j4+P/4+Pj/+Pj4//n5+P/5+fn/+fn5//n5
- +f/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/9fX1/+Li4v/BwcH/qamp/6qqqv/Hx8f/4eHh/+jo
- 6P/o6Oj/6Ojo/+jo6P/p6en/6urq/+rq6v/r6+v/7Ozs/+jo6P/Y2Nj/xb+4/4VeNf+ARQr/mFQQ/6lf
- Ff+0Zxv/t2wg/7t0LP/Afz3/x49X/9bBrP/f3t3/4eHh/+Li4v/j4+P/5eXl/+bm5v/n5+f/6Ojo/+np
- 6f/r6+v/7Ozs/+3t7f/s6ef/3cKn/9Ghcv/Qnmz/z5tp/82ZZf/MlmH/y5Rc/8mQV//IjVL/xolN/8WG
- Sf/Dg0T/wYA+/798Of++eTT/vHQt/7VrIf+pYBX/n1kT/5dYGP+NVh//qIxv/97c2//l5eX/6urq/+np
- 6f/p6en/6Ojo/+fn5//n5+f/5ubm/+bm5v/l5eX/5OTk/+Pj4//j4+P/4uLi/+Tk5P/c3NzybW1tkAAA
- ADYAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAAABQAAAAoAAAAQAAA
- AFgAAABsAAAAeP/////09PP/9PT0//T09P/19fT/9fX1//X19f/29vX/9vb2//b29v/29vb/9/f2//f3
- 9//39/f/+Pj3//j4+P/4+Pj/+Pj4//n5+f/5+fn/+fn5//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6
- +v/k5OT/tLS0/6Wlpf+7u7v/3Nzc/+jo6P/o6Oj/6Ojo/+jo6P/o6Oj/6enp/+rq6v/r6+v/6+vr/+zs
- 7P/t7e3/7Ozs/9zc3P/Qz83/mHxg/3pEDf+PTxD/o10X/7FmHv+6cyz/wH89/8ODRf/Ehkj/zKF2/9rP
- xv/g4OD/4eHh/+Li4v/k5OT/5eXl/+bm5v/n5+f/6enp/+rq6v/r6+v/7Ozs/+3t7f/l2Mr/1Kl+/9Gg
- cP/PnWv/zppm/8yXYv/LlF3/yZFY/8iNUv/GiU3/xIZI/8OCQ//Bfz3/v3s3/754Mv+7dC3/s24o/6hm
- I/+cWxr/klUX/4xaJ/+8qpn/4eHh/+bm5v/p6en/6enp/+jo6P/n5+f/5+fn/+bm5v/l5eX/5eXl/+Tk
- 5P/j4+P/4+Pj/+Li4v/i4uL/5eXl/9XV1elGRkZ7AAAAKwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAIAAAAIAAAAFAAAACgAAABAAAAAWAAAAGwAAAB4//////T08//09PT/9PT0//X1
- 9P/19fT/9fX1//X19f/29vX/9vb2//b29v/39/b/9/f3//f39//39/f/+Pj4//j4+P/4+Pj/+fn4//n5
- +f/5+fn/+fn5//r6+v/6+vr/+vr6//r6+v/6+vr/9vb2/9DQ0P+hoaH/y8vL/+fn5//o6Oj/5+fn/+jo
- 6P/o6Oj/6enp/+rq6v/q6ur/6+vr/+zs7P/t7e3/7e3t/+7u7v/u7u7/5OTk/9PS0v+1p5r/e0we/4dK
- EP+cWRf/rWgk/7t5N//BgD//woFB/8ODQ//FiU3/0K+O/93Z1P/f39//4eHh/+Li4v/k5OT/5eXl/+bm
- 5v/n5+f/6enp/+rq6v/r6+v/7e3t/+rk4P/auJb/0aBw/8+da//NmWX/zJZg/8qSW//Ij1X/x4tQ/8WH
- Sv/DhEX/wYFA/8B9Ov++eTX/vHYw/7dwKf+taCT/o2Qj/5ZbH/+MUxr/lm1F/9HKw//h4eH/5+fn/+jo
- 6P/o6Oj/5+fn/+bm5v/m5ub/5eXl/+Tk5P/k5OT/4+Pj/+Li4v/i4uL/4eHh/+Hh4f/l5eX9w8PD1yws
- LGcAAAAfAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAAAUAAAAKAAA
- AEAAAABYAAAAbAAAAHj/////8/Pz//T08//09PT/9PT0//X19P/19fX/9fX1//b29f/29vb/9vb2//b2
- 9v/39/b/9/f3//f39//4+Pf/+Pj4//j4+P/4+Pj/+fn5//n5+f/5+fn/+fn5//r6+v/6+vr/+vr6//r6
- +v/29vb/z8/P/6Ghof/Q0ND/6urq/+fn5//n5+f/6Ojo/+np6f/q6ur/6+vr/+vr6//s7Oz/7e3t/+7u
- 7v/u7u7/7+/v//Dw8P/s7Oz/2NjY/8jFwf+MbEv/fEUP/5JVGP+lZij/tXU1/757Ov/Afj3/woA//8OC
- Q//Fi1H/0raa/93a2P/f39//4eHh/+Li4v/j4+P/5eXl/+bm5v/o6Oj/6enp/+rq6v/r6+v/6+rq/97G
- rv/Qn27/zZpm/8yXYf/Kk1z/yZBX/8eMUf/FiUz/xIVG/8KBQf/Afjz/vno3/713Mf+5civ/sGok/6Zi
- H/+bXR//jFQc/4RSIf+ul4H/2tnY/+Li4v/o6Oj/6Ojo/+fn5//m5ub/5eXl/+Xl5f/k5OT/5OTk/+Xl
- 5f/k5OT/5OTk/+Pj4//i4uL/4+Pj/+bm5vujo6O6GxsbUwAAABIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAACAAAACAAAABQAAAAoAAAAQAAAAFgAAABsAAAAeP/////z8/P/9PTz//T0
- 9P/09PT/9fX0//X19P/19fX/9fX1//b29f/29vb/9vb2//b29v/39/f/9/f3//f39//4+Pj/+Pj4//j4
- +P/4+Pj/+fn5//n5+f/5+fn/+vr6//r6+v/6+vr/+vr6//r6+v/i4uL/rKys/7+/v//r6+v/6Ojo/+jo
- 6P/p6en/6urq/+vr6//s7Oz/7Ozs/+3t7f/u7u7/7+/v/+/v7//w8PD/8fHx//Hx8f/h4eH/0NDQ/6ub
- i/96TB//hE0X/5ddJP+qay7/tnQz/7x6N//AfTv/wX89/8KBQP/GkFr/0rmf/9za1//f39//4ODg/+Hh
- 4f/j4+P/5OTk/+bm5v/n5+f/6Ojo/+np6f/q6ur/4tXI/9Chc//LlF7/yZJa/8iPVf/HjFD/xYlL/8SF
- Rv/CgUH/wH48/797N/+9dzL/unMs/7JsJv+oYx//nlwb/5BVGf+BTBf/jWdC/8jAuP/d3d3/5eXl/+fn
- 5//n5+f/5ubm/+Xl5f/k5OT/5OTk/+Tk5P/p6en/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/5eXl9nV1
- dZwEBAQ/AAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAFAAA
- ACgAAABAAAAAWAAAAGwAAAB4//////Pz8//09PP/9PTz//T09P/29vb/+Pj3//X19f/19fX/9vb1//b2
- 9v/29vb/9vb2//f39v/39/f/9/f3//f39//4+Pj/+Pj4//j4+P/5+fn/+fn5//n5+f/5+fn/+vr6//r6
- +v/6+vr/+vr6/+zs7P+6urr/sbGx/+Xl5f/q6ur/6enp/+rq6v/r6+v/7Ozs/+3t7f/t7e3/7u7u/+/v
- 7//w8PD/8PDw//Hx8f/y8vL/8/Pz/+3t7f/X19f/x8TB/5R4Xf91RBT/h1Ec/5xgJf+rayv/tnIw/7x4
- NP+/ezf/wH05/8F+PP/Ei1L/0bac/9vW0f/e3t7/39/f/+Hh4f/i4uL/4+Pj/+Tk5P/l5eX/5ubm/+fn
- 5//k39r/0ah//8iOVf/Hi1D/xYlN/8SHSP/Dg0T/wYA//799Ov++ejb/vXcx/7lyK/+yayX/qWQe/59c
- Gf+TVBX/hUwU/35NHv+umob/2djX/+Dg4P/m5ub/5ubm/+bm5v/l5eX/5OTk/+Pj4//j4+P/5eXl/+np
- 6fu4uLjOjY2NrYqKiquKioqrioqKq4qKiquEhISiKioqZwAAACgAAAAEAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAAAUAAAAKAAAAEAAAABYAAAAbAAAAHj/////8/Pz//Pz
- 8//09PP/8/Pz/7+/v/++vr7/6urp//b29v/19fX/9vb1//b29v/29vb/9vb2//f39//39/f/9/f3//j4
- 9//4+Pj/+Pj4//j4+P/5+fn/+fn5//n5+f/5+fn/+vr6//r6+v/6+vr/9vb2/87Ozv+np6f/1dXV/+zs
- 7P/r6+v/7Ozs/+zs7P/t7e3/7u7u/+7u7v/v7+//8PDw//Hx8f/y8vL/8/Pz//Pz8//09PT/9PT0/+Xl
- 5f/Pz8//tauh/35ZNv93RBP/i1Mb/51fIv+raSf/tG8s/7l1L/+9dzL/vnk0/756Nv/Chkv/zKmF/9jP
- xf/c3Nz/3t7e/9/f3//g4OD/4eHh/+Lg3//g2dL/3tDD/9nCrP/NnnD/xYhM/8OERv/CgkL/wYA+/799
- Ov++ejb/vXcy/7x0Lf+4cCj/sWkj/6hiHP+fWxf/lFMS/4ZLD/97RRD/mXpc/83Hwv/b29v/4+Pj/+bm
- 5v/l5eX/5eXl/+Tk5P/j4+P/4+Pj/+Li4v/n5+f/19fX519fX4sAAABOAAAAQwAAAEIAAABCAAAAQgAA
- AD4AAAApAAAADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAA
- ABQAAAAoAAAAQAAAAFgAAABsAAAAeP/////z8/L/8/Pz//T08//AwMD/iIiI/5qamv+zs7P/9PT0//X1
- 9f/29vX/9vb2//b29v/29vb/9/f2//f39//39/f/9/f3//j4+P/4+Pj/+Pj4//j4+P/5+fn/+fn5//n5
- +f/6+vr/+vr6//r6+v/5+fn/39/f/6enp/+/v7//6urq/+zs7P/s7Oz/7e3t/+7u7v/v7+//8PDw//Dw
- 8P/x8fH/8vLy//Pz8//09PT/9PT0//X19f/29vb/8vLy/9ra2v/Ix8b/oI17/3RJH/97RhL/jVIY/51d
- Hf+oZSL/sGsm/7ZwKf+6cyv/vHUt/7x2L/++fDj/xpZm/9G7pf/Y0sv/2dHJ/9bFtf/St5z/z6mF/8uc
- bv/Gjlf/w4VH/8KBQP/Afjz/wH06/797N/++eTT/vXcw/7t0Lf+5cCj/tWwk/69mH/+mXxn/nVkU/5NR
- D/+GSQr/ekEK/4deN/+/tav/19fX/+Dg4P/l5eX/5eXl/+Tk5P/k5OT/4+Pj/+Li4v/i4uL/4+Pj/+np
- 6f2urq7FGxsbXgAAACIAAAAOAAAADgAAAA4AAAAOAAAADAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAFAAAACgAAABAAAAAWAAAAGwAAAB4//////Pz
- 8v/z8/P/8/Pz/7u7u/92dnb/iIiI/6ampv/w8O//9fX1//X19f/29vX/9vb2//b29v/29vb/9/f3//f3
- 9//39/f/+Pj3//j4+P/4+Pj/+Pj4//n5+f/5+fn/+fn5//n5+f/6+vr/+vr6//r6+v/v7+//vb29/6ur
- q//j4+P/7u7u/+7u7v/u7u7/7+/v//Dw8P/x8fH/8fHx//Ly8v/z8/P/9PT0//X19f/19fX/9vb2//f3
- 9//4+Pj/7e3t/9TU1P/HxcT/mIJs/24/Ef98RRD/jFAT/5lZGP+lYBz/q2Ue/7JpIP+2bSP/uG4k/7lw
- Jv+6cSj/vX08/8KNV//BiVD/v4FC/758Ov++eDP/vnk0/754M/+9eDP/vXgy/7x2MP+8dS7/u3Ms/7py
- Kf+5byX/tWwi/7BnHf+qYRn/olsU/5tWEP+STwz/hUYH/3k+BP98TR//rpyL/9bW1v/c3Nz/5OTk/+Xl
- 5f/k5OT/5OTk/+Pj4//i4uL/4eHh/+Hh4f/n5+f+3Nzc73FxcZYAAAA/AAAADQAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA
- AAgAAAAUAAAAKAAAAEAAAABYAAAAbAAAAHj/////8/Py//Pz8v/z8/P/7Ozs/6enp/+enp7/1NTU//T0
- 8//19fX/9fX1//X19f/29vX/9vb2//b29v/39/b/9/f3//f39//39/f/+Pj3//j4+P/4+Pj/+Pj4//n5
- +f/5+fn/+fn5//n5+f/6+vr/+vr6//f39//S0tL/paWl/87Ozv/t7e3/7+/v/+/v7//u7u7/7e3t/+zs
- 7P/s7Oz/8fHx//T09P/19fX/9vb2//b29v/39/f/+Pj4//n5+f/5+fn/6enp/9DQ0P++urX/kXdd/3FC
- FP97Qw3/iUsQ/5VTEv+fWRT/pV4W/6thF/+wZBn/s2cb/7VpHP+2ah3/t2wh/7htIv+5biT/uW8l/7lv
- Jv+6cCb/unAm/7lvJv+5byX/uG4j/7htIf+2ayD/tGgd/7BlGv+qYBb/pFsS/55WD/+XUQv/jksH/4ND
- BP93PAL/fEwd/6qWgv/Qzsz/2dnZ/+Li4v/l5eX/5OTk/+Pj4//j4+P/4uLi/+Hh4f/h4eH/4+Pj/+rq
- 6vyxsbHJJycnZQAAACMAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAAABQAAAAoAAAAQAAAAFgAAABsAAAAeP//
- ///z8/L/8/Py//Pz8//z8/P/8/Py//Hx8f/09PT/9PT0//X19P/19fX/9fX1//b29f/29vb/9vb2//b2
- 9v/39/b/9/f3//f39//39/f/+Pj4//j4+P/4+Pj/+Pj4//n5+f/5+fn/+fn5//r6+v/6+vr/+vr6/+fn
- 5/+0tLT/s7Oz/+Li4v/i4uL/3t7e/9bW1v/Jycn/vb29/8rKyv/t7e3/8/Pz//b29v/39/f/9/f3//j4
- +P/5+fn/+vr6//v7+//5+fn/5OTk/83NzP/AvLj/kXdd/24/EP94QQv/hEcM/45NDP+XUg3/nlUN/6JY
- Dv+nWxD/ql0Q/61fEP+xYhP/s2MV/7RlF/+0Zhj/tWYZ/7VnGf+1Zhn/tGYY/7NmGP+xZBb/rmIV/6tf
- Ev+nXBD/o1gO/55VC/+YUAj/kksF/4lGAv9+PwH/dDoA/3lKG/+kjnj/0M7N/9bW1v/g4OD/5OTk/+Tk
- 5P/j4+P/4+Pj/+Li4v/h4eH/4ODg/+Hh4f/n5+f/6enp+Xt7e6QAAABHAAAAEwAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAIAAAAIAAAAFAAAACgAAABAAAAAWAAAAGwAAAB4//////Ly8v/z8/L/8/Py//Pz8//z8/P/9PTz//T0
- 9P/09PT/9fX0//X19f/19fX/9fX1//b29f/29vb/9vb2//b29v/39/f/9/f3//f39//39/f/+Pj4//j4
- +P/4+Pj/+fn4//n5+f/5+fn/+fn5//r6+v/6+vr/9PT0/9DQ0P+lpaX/p6en/4aGhv+kpKT/pKSk/6qq
- qv+rq6v/oKCg/83Nzf/w8PD/9vb2//j4+P/5+fn/+fn5//r6+v/7+/v//Pz8//39/f/5+fn/5eXl/8zM
- zP+8uLT/mIJt/3RIHf90Pgn/fkMI/4dHCP+PSwf/lU4H/5pQBv+dUQX/oFMF/6NVB/+mVwj/qFkK/6la
- C/+qWwz/qVsM/6lbDP+oWgv/p1kK/6RXCf+hVQj/nlMG/5pQBf+WTQP/kUoC/4tFAf+CQAD/eTwA/3I6
- Av+BVy7/rp2M/83Myv/V1dX/3t7e/+Tk5P/j4+P/4+Pj/+Li4v/i4uL/4eHh/+Dg4P/f39//39/f/+Tk
- 5P/r6+v7rKyswycnJ2YAAAArAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAAAUAAAAKAAAAEAAAABYAAAAbAAA
- AHj/////8vLy//Pz8v/z8/L/8/Pz//Pz8//09PP/9PTz//T09P/09PT/9fX0//X19f/19fX/9fX1//b2
- 9f/29vb/9vb2//f39v/39/f/9/f3//f39//4+Pf/+Pj4//j4+P/4+Pj/+fn5//n5+f/5+fn/+fn5//r6
- +v/6+vr/7+/v/9LS0v/BwcH/iYmJ/87Ozv/X19f/39/f/9vb2/+0tLT/r6+v/9/f3//z8/P/+Pj4//r6
- +v/6+vr/+/v7//z8/P/9/f3//v7+//39/f/5+fn/4+Pj/87Ozv/DwcD/oI99/31aNv9wPQv/dz4G/35C
- Bv+GRQX/jEcD/5FIAf+USQD/l0sA/5lMAP+bTQH/nE4B/51PAv+dTwL/nE8C/5tOAf+ZTQH/l0wB/5VL
- AP+SSQD/j0cA/4pEAP+DQQD/ez0A/3Q5AP91QQ7/jmxL/7aroP/Ozs3/1dXV/97e3v/k5OT/4+Pj/+Pj
- 4//i4uL/4eHh/+Hh4f/g4OD/39/f/97e3v/e3t7/3t7e/+fn5/7l5eXzi4uLqgsLC1YAAAAgAAAABAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAACAAAACAAAABQAAAAoAAAAQAAAAFgAAABsAAAAeP/////y8vL/8vLy//Pz8v/z8/L/8/Pz//Pz
- 8//09PP/9PT0//T09P/09PT/9fX0//X19f/19fX/9vb1//b29v/29vb/9vb2//f39v/39/f/vr6+/66u
- rv/p6en/zMzM/729vf/u7u7/n5+f/8fHx//l5eX/o6Oj/9TU1P/g4OD/sLCw/8bGxv++vr7/vb29/9HR
- 0f/f39//9fX1/5iYmP+IiIj/tra2/+rq6v/39/f/+/v7//v7+//8/Pz//f39//39/f/9/f3//Pz8//v7
- +//4+Pj/6Ojo/9LS0v/DwsL/saif/5B2Xv9zSB3/bzoF/3Y8BP98PwP/gUAB/4VCAP+KRQD/jUYA/49H
- AP+RSAD/kkkA/5JJAP+RSAD/kEgA/49HAP+MRQD/iUQA/4VCAP9/PwD/ejwA/3Q5AP9wOQP/gVgv/6ON
- eP/Bu7X/zc3N/9bW1v/f39//5OTk/+Pj4//i4uL/4uLi/+Hh4f/g4OD/4ODg/9/f3//e3t7/3t7e/93d
- 3f/c3Nz/3t7e/+jo6P/b29vofHx8mgYGBkoAAAAZAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAFAAAACgAAABAAAAAWAAA
- AGwAAAB4//////Ly8f/y8vL/8vLy//Pz8v/z8/P/8/Pz//T08//09PP/9PT0//T09P/19fT/9fX1//X1
- 9f/19fX/9vb1//b29v/29vb/9vb2//f39v+urq7/9vb2/7+/v/+np6f/8vLy/7m5uf+6urr/5eXl/7i4
- uP/MzMz/3t7e/7+/v//Q0ND/7e3t/7e3t//Ozs7/+vr6/76+vv/19fX/p6en/8vLy/+EhIT/yMjI//Hx
- 8f/5+fn//Pz8//39/f/9/f3//Pz8//z8/P/7+/v/+vr6//n5+f/4+Pj/7e3t/9fX1//Jycn/v727/6ea
- jf+LblH/dksg/3E9C/9yOQL/dToA/3g8AP97PQD/fz8A/4FAAP+DQQD/g0EA/4JBAP+BQAD/fz8A/3s9
- AP94OwD/dDkA/3E5Av9zPw3/f1Us/5qAZv+4r6b/ysnJ/9DQ0P/Y2Nj/4eHh/+Pj4//j4+P/4uLi/+Hh
- 4f/h4eH/4ODg/9/f3//f39//3t7e/93d3f/d3d3/3Nzc/9vb2//b29v/3t7e/+rq6v7Ozs7bYmJiiQAA
- AEEAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAgAAAAgAAAAUAAAAKAAAAEAAAABYAAAAbAAAAHj/////8vLx//Ly8f/y8vL/8/Py//Pz
- 8//09PT/8/Pz//T08//09PP/9PT0//T09P/19fT/9fX1//X19f/19fX/9vb1//b29v/29vb/9vb2/8vL
- y//g4OD/8fHx/5aWlv/29vb/8PDw/6SkpP/4+Pj/y8vL/729vf/5+fn/yMjI/7a2tv/6+vr/1NTU/6ys
- rP/6+vr/u7u7/+bm5v+qqqr/3t7e/6Ghof+lpaX/7Ozs//n5+f/9/f3//Pz8//z8/P/7+/v/+/v7//r6
- +v/5+fn/+fn5//j4+P/39/f/8/Pz/+Tk5P/S0tL/x8fH/7+9u/+wpp3/l4Fr/4JfPP94SyD/bz0K/202
- AP9vNwD/cDcA/3E4AP9xOAD/cTgA/3A3AP9uNgD/bjcC/3JAEP98Uij/imlI/6WSgP+7s63/x8bF/83N
- zf/V1dX/3t7e/+Pj4//j4+P/4uLi/+Li4v/h4eH/4ODg/+Dg4P/f39//3t7e/97e3v/d3d3/3Nzc/9zc
- 3P/b29v/2tra/9nZ2f/Z2dn/4ODg/+/v7/6zs7PGEhISXgAAABsAAAABAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAAABQAAAAoAAAAQAAA
- AFgAAABsAAAAeP/////y8vH/8vLx//Ly8v/19fX/0dHR/83Nzf/x8fH/8/Pz//T08//09PT/9PT0//T0
- 9P/19fT/9fX1//X19f/29vX/9vb2//b29v/29vb/9vb1/8rKyv/Hx8f/r6+v/+Hh4f/4+Pj/4+Pj/8bG
- xv/BwcD/rKys//n5+f/09PT/5eXl//r6+v/29vb/n5+f/8HBwf+xsbH/+Pj4/9ra2v/Ly8v/paWl/8zM
- zP/09PT/+/v7//39/f/8/Pz/+/v7//r6+v/6+vr/+fn5//j4+P/4+Pj/9/f3//f39//29vb/9PT0/+7u
- 7v/g4OD/0tLS/8nJyP/DwsL/vbm2/6+km/+fjXv/l39m/5BzWP+JaEn/hGE//4JeO/+GY0H/jGxN/5R4
- Xf+bhG3/ppWE/7ewqP/CwL7/x8fG/8zMzP/U1NT/3Nzc/+Li4v/j4+P/4+Pj/+Li4v/i4uL/4eHh/+Dg
- 4P/f39//39/f/97e3v/d3d3/3d3d/9zc3P/c3Nz/29vb/9ra2v/Z2dn/2dnZ/9nZ2f/i4uL/6urq+KSk
- pLoRERFXAAAAGAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAIAAAAIAAAAFAAAACgAAABAAAAAWAAAAGwAAAB4//////Hx8f/y8vH/8vLx/8jI
- yP+Li4v/nZ2d/7q6uv/z8/P/9PTz//T08//09PT/9PT0//X19P/19fT/9fX1//X19f/29vX/9vb2//b2
- 9v/29vb/9/f2//f39//39/f/9/f3//j49//4+Pj/+Pj4//j4+P+srKz/+fn5//n5+f/T09P/5eXl/83N
- zf+/v7//+vr6//r6+v/5+fn/0NDQ/5CQkP+7u7v/8PDw//n5+f/8/Pz/+/v7//v7+//6+vr/+fn5//n5
- +f/4+Pj/9/f3//f39//29vb/9fX1//T09P/09PT/8/Pz//Ly8v/u7u7/5eXl/9nZ2f/Ozs7/ysrK/8fH
- x//ExMP/wb++/767uP+8uLX/u7ez/725tf+/vLr/wsHA/8bFxf/IyMj/ysrK/8/Pz//Y2Nj/39/f/+Pj
- 4//k5OT/4+Pj/+Li4v/i4uL/4eHh/+Hh4f/g4OD/39/f/9/f3//e3t7/3t7e/93d3f/c3Nz/29vb/9ra
- 2v/a2tr/2dnZ/9jY2P/Y2Nj/39/f/+vr6/3FxcXUT09PegAAADMAAAAJAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAAAUAAAAKAAA
- AEAAAABYAAAAbAAAAHj/////8fHx//Hx8f/y8vH/tra2/3h4eP+Li4v/paWl/+/v7//z8/P/9PTz//T0
- 8//09PT/9PT0//X19P/19fX/9fX1//X19f/29vX/9vb2//b29v/29vb/9/f2//f39//39/f/9/f3//j4
- 9//4+Pj/1dXV/6CgoP/s7Ov/+fn5//n5+f/19fX/+fn5//r6+v/6+vr/+vr6/+7u7v/CwsL/p6en/97e
- 3v/39/f/+/v7//v7+//7+/v/+vr6//n5+f/4+Pj/+Pj4//f39//39/f/9vb2//X19f/19fX/9PT0//Pz
- 8//y8vL/8vLy//Hx8f/w8PD/7u7u/+vr6//l5eX/3t7e/9nZ2f/V1dX/0tLS/9LS0v/R0dH/0dHR/9PT
- 0//U1NT/19fX/9vb2//g4OD/4+Pj/+Tk5P/k5OT/4+Pj/+Pj4//i4uL/4uLi/+Hh4f/g4OD/4ODg/9/f
- 3//e3t7/3t7e/+Dg4P/n5+f/6enp/+Hh4f/b29v/2tra/9nZ2f/Y2Nj/2NjY/9zc3P/q6ur+19fX4m5u
- bo8DAwNDAAAAFQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAACAAAACAAAABQAAAAoAAAAQAAAAFgAAABsAAAAeP/////x8fD/8fHx//Ly
- 8f/n5+b/lZWV/5CQkP/Ly8v/8vLx//Pz8//z8/P/9PTz//T09P/09PT/9PT0//X19P/19fX/9fX1//X1
- 9f/29vX/9vb2//b29v/29vb/9/f2//f39//39/f/9/f3//j49//4+Pj/+Pj4//b29v/5+fj/+fn5//n5
- +f/5+fn/+fn5//r6+v/5+fn/29vb/6ampv+/v7//8/Pz//r6+v/7+/v/+/v7//r6+v/5+fn/+fn5//j4
- +P/39/f/9vb2//b29v/19fX/9PT0//T09P/z8/P/8vLy//Ly8v/x8fH/8PDw//Dw8P/v7+//7u7u/+7u
- 7v/t7e3/7Ozs/+rq6v/o6Oj/5+fn/+bm5v/m5ub/5ubm/+fn5//n5+f/5ubm/+Xl5f/l5eX/5OTk/+Tk
- 5P/j4+P/4uLi/+Li4v/h4eH/4ODg/9/f3//f39//3t7e/97e3v/i4uL/6+vr/+zs7P/m5ub/7u7u/+bm
- 5v/d3d3/2NjY/9jY2P/b29v/6enp/97e3uuEhISiCQkJTwAAABsAAAACAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAFAAA
- ACgAAABAAAAAWAAAAGwAAAB4//////Hx8P/x8fH/8fHx//Ly8f/v7+7/7e3t//Ly8v/z8/L/8/Py//Pz
- 8//z8/P/9PTz//T09P/09PT/9PT0//X19P/19fX/9fX1//b29f/29vX/9vb2//b29v/29vb/9/f3//f3
- 9//39/f/9/f3//j4+P/4+Pj/+Pj4//j4+P/5+fj/+fn5//n5+f/5+fn/+fn5//X19f/Kysr/q6ur/9/f
- 3//39/f/+vr6//r6+v/5+fn/+fn5//j4+P/39/f/9vb2//b29v/19fX/9fX1//T09P/z8/P/8/Pz//Ly
- 8v/x8fH/8PDw//Dw8P/v7+//7+/v/+7u7v/t7e3/7e3t/+zs7P/r6+v/6urq/+rq6v/p6en/6enp/+jo
- 6P/n5+f/5+fn/+bm5v/l5eX/5OTk/+Tk5P/j4+P/4uLi/+Li4v/h4eH/4eHh/+Dg4P/f39//3t7e/97e
- 3v/f39//5eXl/+7u7v/g4OD/tbW1/6urq//ExMT/5ubm/+7u7v/j4+P/3d3d/+jo6P7j4+PwkpKSryMj
- I1wAAAAiAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAAAUAAAAKAAAAEAAAABYAAAAbAAAAHj/////8fHw//Hx
- 8P/x8fH/8fHx//Ly8f/y8vH/8vLy//Pz8v/z8/L/8/Pz//Pz8//09PP/9PTz//T09P/09PT/9fX0//X1
- 9P/19fX/9fX1//b29f/29vb/9vb2//b29v/29vb/9/f3//f39//39/f/9/f3//j4+P/4+Pj/+Pj4//j4
- +P/5+fj/+fn5//n5+f/5+fn/9vb2/9HR0f+kpKT/x8fH//Ly8v/4+Pj/+fn5//n5+f/4+Pj/9/f3//f3
- 9//29vb/9fX1//X19f/19fX/9fX1//Pz8//y8vL/8fHx//Dw8P/w8PD/7+/v/+7u7v/u7u7/7e3t/+3t
- 7f/s7Oz/6+vr/+vr6//q6ur/6enp/+jo6P/o6Oj/5+fn/+bm5v/m5ub/5eXl/+Tk5P/k5OT/4+Pj/+Li
- 4v/i4uL/4eHh/+Dg4P/g4OD/39/f/97e3v/e3t7/4+Pj/+vr6//t7e3/0tLS/6+vr/+pqan/tbW1/6Wl
- pf+wsLD/z8/P/+vr6//v7+/+5ubm8pmZmbgWFhZkAAAAKwAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAA
- ABQAAAAoAAAAQAAAAFgAAABsAAAAeP/////w8PD/8fHw//Hx8P/x8fH/8vLx//Ly8f/y8vL/8vLy//Pz
- 8v/z8/L/8/Pz//Pz8//09PP/9PTz//T09P/09PT/9fX0//X19P/19fX/9fX1//b29f/29vb/9vb2//b2
- 9v/29vb/9/f3//f39//39/f/9/f3//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+fn5//n5+f/5+fn/5ubm/7y8
- vP+pqan/yMjI//Ly8v/4+Pj/9/f3//f39//29vb/9vb2//X19f/19fX/9vb2//b29v/z8/P/9fX1//Pz
- 8//x8fH/8PDw/+/v7//u7u7/7u7u/+3t7f/s7Oz/6+vr/+vr6//q6ur/6urq/+np6f/o6Oj/6Ojo/+fn
- 5//m5ub/5eXl/+Xl5f/k5OT/4+Pj/+Pj4//i4uL/4uLi/+Hh4f/g4OD/39/f/9/f3//e3t7/3d3d/+Hh
- 4f/v7+//6urq/7y8vP+pqan/t7e3/9zc3P/n5+f/2dnZ/7q6uv+pqan/t7e3/7e3t9yJiYm8JiYmbwAA
- ADQAAAANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAFAAAACgAAABAAAAAWAAAAGwAAAB4//////Dw
- 8P/x8fD/8fHw//Hx8P/x8fH/8vLx//Ly8f/y8vL/8vLy//Pz8v/z8/L/8/Pz//Pz8//09PP/9PTz//T0
- 9P/09PT/9fX0//X19f/19fX/9fX1//b29f/29vb/9vb2//b29v/29vb/9/f3//f39//39/f/9/f3//j4
- 9//4+Pj/+Pj4//j4+P/4+Pj/+fn5//n5+f/4+Pj/5OTk/729vf+kpKT/yMjI/+/v7//39/f/9vb2//X1
- 9f/19fX/9vb2//b29v/k5OT/wcHB/7q6uv/Y2Nj/7+/v//Pz8//y8vL/8PDw/+7u7v/t7e3/7Ozs/+vr
- 6//r6+v/6urq/+np6f/p6en/6Ojo/+fn5//n5+f/5ubm/+Xl5f/l5eX/5OTk/+Pj4//j4+P/4uLi/+Hh
- 4f/h4eH/4ODg/9/f3//f39//3t7e/93d3f/d3d3/4+Pj/+7u7v/Dw8P/oqKi/8fHx//m5ub/+vr6//z8
- /P/6+vr/6urq/9HR0f+zs7P/Hh4ejQoKCnEAAAA9AAAAFQAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA
- AAgAAAAUAAAAKAAAAEAAAABYAAAAbAAAAHj/////8PDv//Dw8P/x8fD/8fHw//Hx8f/x8fH/8vLx//Ly
- 8f/y8vL/8vLy//Pz8v/z8/L/8/Pz//Pz8//09PP/9PT0//T09P/09PT/9fX0//X19f/w8PD/9PT0//b2
- 9f/29vb/9vb2//b29v/29vb/9/f3//f39//39/f/9/f3//j49//4+Pj/6+vr/83Nzf/u7u7/+fn5//n5
- +f/4+Pj/5ubm/8HBwf+np6f/vr6+/+vr6//39/f/9vb2//b29v/39/f/2dnZ/6+vr/+np6f/rq6u/6am
- pv+3t7f/1dXV/+3t7f/19fX/8fHx/+zs7P/r6+v/6urq/+np6f/p6en/6Ojo/+jo6P/n5+f/5ubm/+bm
- 5v/l5eX/5OTk/+Pj4//j4+P/4uLi/+Li4v/h4eH/4ODg/9/f3//f39//3t7e/93d3f/d3d3/3Nzc/9zc
- 3P/g4OD/7e3t/8HBwf+vr6//4uLi//r6+v/8/Pz//Pz8//z8/P/8/Pz/9vb2/+np6f8AAABZAAAAPQAA
- ABsAAAAIAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAAABQAAAAoAAAAQAAAAFgAAABsAAAAeP//
- ///w8O//8PDw//Dw8P/x8fD/8fHw//Hx8f/y8vH/8vLx//Ly8f/y8vL/8/Py//Pz8v/z8/P/8/Pz//Pz
- 8//09PP/9PT0//T09P/09PT/0tLR/6ysrP/BwcH/2NjY/9DQz/+/v7//xMTE/+Xl5f/29vb/vb29/+Tk
- 5P/39/f/1dXV/7Cwr//W1tb/ysrK/7W1tf/r6+v/qamp/8XFxf/Nzc3/4uLi/4SEhP+EhIT/paWl/+Hh
- 4f/09PT/8PDw/87Ozv+EhIT/i4uL/6+vr//d3d3/j4+P/4SEhP+YmJj/mpqa/9zc3P/19fX/7Ozs/+rq
- 6v/p6en/6enp/+jo6P/n5+f/5+fn/+bm5v/l5eX/5ubm/+Xl5f/l5eX/5eXl/+Tk5P/l5eX/5+fn/+bm
- 5v/h4eH/3t7e/97e3v/d3d3/3d3d/9zc3P/b29v/29vb/93d3f/u7u7/zMzM/6mpqf/i4uL/+/v7//z8
- /P/8/Pz//Pz8//z8/P/7+/v//////wAAAEEAAAAoAAAAFAAAAAgAAAACAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAIAAAAIAAAAFAAAACgAAABAAAAAWAAAAGwAAAB4//////Dw7//w8O//8PDw//T08//k5OP/3Nzc//T0
- 9P/y8vH/8vLx//Ly8v/y8vL/8/Py//Pz8v/z8/P/8/Pz//Pz8//09PP/9PT0//T09P+wsLD/7+/u//X1
- 9f/b29v/n5+f//b29f/19fX/sbGx//b29v/BwcH/ubm5//f39/+8vLz/5+fn/8vLyv/c3Nz/qKio/8bG
- xv+xsbH/3d3c//Dw8P+5ubn/uLi4/9PT0/+pqan/l5eX/7+/v//Hx8f/mpqa/3t7e//CwsL/8fHx/8XF
- xf+ioqL/5+fn/8DAwP90dHT/zc3N//X19f/r6+v/6enp/+jo6P/o6Oj/5+fn/+bm5v/m5ub/5eXl/+jo
- 6P/w8PD/8/Pz//T09P/19fX/9fX1//T09P/y8vL/9vb2/+np6f/e3t7/3d3d/9zc3P/c3Nz/29vb/9ra
- 2v/a2tr/2tra/+3t7f/X19f/paWl/9vb2//6+vr/+/v7//v7+//7+/v/+/v7//v7+///////AAAAQAAA
- ACgAAAAUAAAACAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAAAUAAAAKAAAAEAAAABYAAAAbAAA
- AHj/////8PDv//Dw7//w8O//09PT/46Ojv+goKD/wcHB//Ly8v/y8vH/8vLx//Ly8v/y8vL/8/Py//Pz
- 8v/z8/P/8/Pz//T08//09PP/9PT0/8jIyP/c3Nz/9PTz//Hx8f+rq6v/zs7O//b29f+np6f/ycnJ/7W1
- tf/IyMj/1tbW/7S0tP/v7+//7e3t/6ampv/w8PD/0NDQ/6ysrP/e3t7/wMDA/+vr6/+oqKj/9PT0/9bW
- 1v+xsbH/bW1t/6ioqP+/v7//nJyc/+jo6P+2trb/9/f3/56env/19fX/39/f/4SEhP/IyMj/9fX1/+rq
- 6v/o6Oj/5+fn/+fn5//m5ub/5eXl/+Xl5f/k5OT/7e3t//Ly8v/X19f/zs7O/8rKyv/FxcX/vb29/7y8
- vP/d3d3/8fHx/+Hh4f/c3Nz/29vb/9vb2//a2tr/2dnZ/9nZ2f/Y2Nj/6urq/+Dg4P+pqan/0tLS//n5
- +f/7+/v/+/v7//v7+//7+/v/+/v7//////8AAABAAAAAKAAAABQAAAAIAAAAAgAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAACAAAACAAAABQAAAAoAAAAQAAAAFgAAABsAAAAeP/////v7+//8PDv//Dw7/+zs7P/fHx8/46O
- jv+lpaX/7u7u//Hx8f/y8vH/8vLx//Ly8v/y8vL/8/Py//Pz8v/z8/P/8/Pz//T08//09PP/9PT0/8rK
- yv/ExMT/z8/O//T09P/Nzc3/qamp/8DAwP/19fX/2tra/+Xl5f/MzMz/q6ur//f39//39/f/ubm5/9jY
- 2P/4+Pf/0tLS/87Ozv/Dw8P/+Pj4/+Hh4f/Nzc3/s7Oz/9fX1/+Pj4//wMDA/9HR0f/S0tL/y8vL/76+
- vv/r6+v/sLCw/8vLy//IyMj/kJCQ/8bGxv/19fX/6urq/+jo6P/n5+f/5ubm/+bm5v/l5eX/5OTk/+Xl
- 5f/y8vL/ycnJ/5OTk/+rq6v/q6ur/6urq/+urq7/pKSk/7e3t//v7+//6enp/9zc3P/a2tr/2tra/9nZ
- 2f/Z2dn/2NjY/9ra2v/r6+v/6Ojo/66urv/Jycn/9vb2//v7+//7+/v/+/v7//v7+//7+/v//////wAA
- AEAAAAAoAAAAFAAAAAgAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAFAAAACgAAABAAAAAWAAA
- AGwAAAB4/////+/v7v/v7+//8PDv/97e3v+FhYX/goKC/8DAwP/v7+7/8fHx//Hx8f/y8vH/8vLx//Ly
- 8v/y8vL/8/Py//Pz8v/z8/P/8/Pz//T08//09PP/9PT0//T09P/09PT/9fX0//X19f/09PT/9fX1//b2
- 9f/29vX/9vb2//b29v/29vb/9/f2//f39//39/f/9/f3//f39//4+Pf/+Pj4//j4+P/4+Pj/+Pj4//j4
- +P/5+fn/9PT0/8vLy/+7u7v/6urq/+np6f/6+vr/+vr6//j4+P/e3t7/rq6u/9bW1v+hoaH/y8vL//X1
- 9f/p6en/5ubm/+Xl5f/l5eX/5OTk/+Tk5P/j4+P/6urq//Ly8v+5ubn/sLCw/9XV1f/i4uL/5eXl/+fn
- 5//R0dH/pqam/8vLy//y8vL/4ODg/9ra2v/Z2dn/2dnZ/9zc3P/k5OT/7Ozs//T09P/a2tr/p6en/8rK
- yv/29vb/+/v7//v7+//7+/v/+/v7//v7+///////AAAAQAAAACgAAAAUAAAACAAAAAIAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAgAAAAgAAAAUAAAAKAAAAEAAAABYAAAAbAAAAHj/////7+/u/+/v7v/v7+//8PDv/+rq
- 6f/o6Oj/7u7u//Hx8P/x8fD/8fHx//Hx8f/y8vH/8vLx//Ly8v/y8vL/8/Py//Pz8v/z8/P/8/Pz//T0
- 8//09PP/9PT0//T09P/09PT/9fX0//X19f/19fX/9fX1//b29f/29vX/9vb2//b29v/29vb/9/f2//f3
- 9//39/f/9/f3//f39//39/f/+Pj4//j4+P/4+Pj/+Pj4//j4+P/5+fj/+fn5/+Xl5f/5+fn/+fn5//n5
- +f/6+vr/+vr6//r6+v/m5ub/5OTk/62trf/Ly8v/9/f3/+rq6v/n5+f/5eXl/+Tk5P/k5OT/4+Pj/+Pj
- 4//v7+//5eXl/6ampv/IyMj/8fHx//v7+//7+/v/+/v7/+3t7f+8vLz/rq6u/+Xl5f/s7Oz/4ODg/+Pj
- 4//r6+v/8PDw/+/v7//f39//wcHB/6qqqv+wsLD/3d3d//r6+v/7+/v/+/v7//v7+//7+/v/+/v7////
- //8AAABAAAAAKAAAABQAAAAIAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAAABQAAAAoAAAAQAAA
- AFgAAABsAAAAeP/////v7+7/7+/u/+/v7//w8O//8PDv//Dw7//w8PD/8fHw//Hx8P/x8fD/8fHx//Hx
- 8f/y8vH/8vLx//Ly8v/y8vL/8/Py//Pz8v/z8/P/8/Pz//T08//09PP/9PT0//T09P/09PT/9fX0//X1
- 9f/19fX/9fX1//X19f/29vX/9vb2//b29v/29vb/9vb2//f39v/39/f/9/f3//f39//39/f/+Pj3//j4
- +P/4+Pj/+Pj4//j4+P/4+Pj/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+vr6//r6+v/l5eX/sLCw/8XF
- xf/6+vr/9/f3//Pz8//u7u7/6urq/+jo6P/m5ub/6Ojo//b29v/MzMz/qqqq/97e3v/5+fn/+vr6//r6
- +v/6+vr/9/f3/9zc3P+srKz/xMTE//f39//39/f/8vLy/+Li4v/Kysr/tLS0/6enp/+vr6//xsbG/+Hh
- 4f/19fX/+/v7//v7+//7+/v/+/v7//v7+//7+/v//////wAAAEAAAAAoAAAAFAAAAAgAAAACAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAIAAAAIAAAAFAAAACgAAABAAAAAWAAAAGwAAAB4/////+/v7v/v7+7/7+/u/+/v
- 7//w8O//8PDv//Dw7//w8PD/8fHw//Hx8P/x8fD/8fHx//Ly8f/y8vH/8vLx//Ly8v/y8vL/8/Py//Pz
- 8v/z8/P/8/Pz//T08//09PP/9PT0//T09P/09PT/9fX0//X19P/19fX/9fX1//X19f/29vX/9vb2//b2
- 9v/29vb/9vb2//f39v/39/f/9/f3//f39//39/f/9/f3//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//n5
- +f/5+fn/+fn5//n5+f/5+fn/+fn5/+zs7P/AwMD/qamp/7y8vP/Ly8v/39/f/+zs7P/x8fH/8fHx//Ly
- 8v/09PT/9fX1/7a2tv+7u7v/7e3t//r6+v/6+vr/+vr6//r6+v/6+vr/8PDw/8XFxf+kpKT/xMTE/8TE
- xP+0tLT/qamp/6ampv+4uLj/zc3N/+Li4v/y8vL/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6
- +v//////AAAAQAAAACgAAAAUAAAACAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAAAUAAAAKAAA
- AEAAAABYAAAAbAAAAHj/////7u7u/+/v7v/v7+7/7+/u/+/v7//w8O//8PDv//Dw7//w8PD/8fHw//Hx
- 8P/x8fD/8fHx//Ly8f/y8vH/8vLx//Ly8v/y8vL/8/Py//Pz8v/z8/P/8/Pz//T08//09PP/9PT0//T0
- 9P/09PT/9fX0//X19P/19fX/9fX1//X19f/29vX/9vb2//b29v/29vb/9vb2//b29v/39/f/9/f3//f3
- 9//39/f/9/f3//j49//4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/5+fn/+fn5//n5+f/5+fn/9/f3/+Pj
- 4//Gxsb/tLS0/62trf+lpaX/pKSk/62trf+8vLz/xsbG/87Ozv/ExMT/q6ur/9PT0//39/f/+vr6//r6
- +v/6+vr/+vr6//r6+v/6+vr/5ubm/7y8vP+srKz/r6+v/7q6uv/Ozs7/3t7e/+3t7f/29vb/+vr6//r6
- +v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//////8AAABAAAAAKAAAABQAAAAIAAAAAgAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAACAAAACAAAABQAAAAoAAAAQAAAAFgAAABsAAAAeP/////u7u3/7u7u/+/v
- 7v/v7+7/7+/u/+/v7//w8O//8PDv//Dw7//w8PD/8fHw//Hx8P/x8fD/8fHx//Ly8f/y8vH/8vLx//Ly
- 8v/y8vL/8/Py//Pz8v/z8/P/8/Pz//Pz8//09PP/9PT0//T09P/09PT/9fX0//X19P/19fX/9fX1//X1
- 9f/29vX/9vb1//b29v/29vb/9vb2//b29v/39/b/9/f3//f39//39/f/9/f3//f39//4+Pf/+Pj4//j4
- +P/4+Pj/+Pj4//j4+P/4+Pj/+fn5//n5+f/5+fn/+Pj4//Hx8f/p6en/4eHh/9TU1P/IyMj/wMDA/7e3
- t/+urq7/qKio/6qqqv/ExMT/6+vr//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/4+Pj/6+vr/+Hh
- 4f/g4OD/7Ozs//b29v/5+fn/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6
- +v/6+vr//////wAAAEAAAAAoAAAAFAAAAAgAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAFAAA
- ACgAAABAAAAAWAAAAGwAAAB4/////+7u7f/u7u3/7u7u/+/v7v/v7+7/7+/u/+/v7//w8O//8PDv//Dw
- 7//w8PD/8fHw//Hx8P/x8fD/8fHx//Ly8f/y8vH/8vLx//Ly8v/y8vL/8/Py//Pz8v/z8/P/8/Pz//Pz
- 8//09PP/9PTz//T09P/09PT/9PT0//X19P/19fX/9fX1//X19f/19fX/9vb1//b29v/29vb/9vb2//b2
- 9v/29vb/9/f2//f39//39/f/9/f3//f39//39/f/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//n5
- +f/5+fn/+fn5//n5+f/5+fn/9/f3//T09P/y8vL/8PDw/+np6f/i4uL/4+Pj//Dw8P/6+vr/+vr6//r6
- +v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//b29v/6+vr/+vr6//r6+v/6+vr/+vr6//r6
- +v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v//////AAAAQAAAACgAAAAUAAAACAAA
- AAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAAAUAAAAKAAAAEAAAABYAAAAbAAAAHj/////7u7t/+7u
- 7f/u7u3/8fHw/+3t7f/n5+f/9PT0/+/v7//w8O//8PDv//Dw7//w8PD/8fHw//Hx8P/x8fD/8fHx//Ly
- 8f/y8vH/8vLx//Ly8v/y8vL/8/Py//Pz8v/z8/P/8/Pz//Pz8//09PP/9PTz//T09P/09PT/9PT0//X1
- 9P/19fT/9fX1//X19f/19fX/9vb1//b29f/29vb/9vb2//b29v/29vb/9/f2/9bW1v/W1tb/9/f3//f3
- 9//39/f/9/f3//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/5+fj/+fn5//n5+f/5+fn/+fn5//n5
- +f/5+fn/+fn5//n5+f/5+fn/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/09PT/vb29//j4
- +P/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6
- +v/6+vr/+vr6//////8AAABAAAAAKAAAABQAAAAIAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAA
- ABQAAAAoAAAAQAAAAFgAAABsAAAAeP/////u7u3/7u7t/+7u7f/c3Nv/lJSU/6Ojo//Kysr/8fHw/+/v
- 7//w8O//8PDv//Dw7//w8PD/8fHw//Hx8P/x8fD/8fHx//Ly8f/y8vH/vLy7/62trf/m5ub/q6ur/7m5
- uf/q6ur/srKy/8rKyv/Hx8b/9PTz/+3t7f+ioqL/xcXF/9XV1P+8vLz/xcXF/+Li4v/19fX/qamp/+/v
- 7//29vb/9vb2//b29v/29vb/wsLC/8LCwf/Y2Nj/0NDQ/7m5uf/S0tL/2NjY/6Wlpf/MzMv/+Pj4//j4
- +P/s7Oz/oKCg/8zMzP/v7+//sLCw/97e3v/e3t7/wsLC//Dw8P+urq7/+fn5/9HR0f+vr6//4ODg/6mp
- qf/CwsL/ysrK//T09P+wsLD/ubm5/+Xl5f+1tbX/6Ojo//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6
- +v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr//////wAAAEAAAAAoAAAAFAAA
- AAgAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAFAAAACgAAABAAAAAWAAAAGwAAAB4/////+3t
- 7P/u7u3/7u7t/7Ozs/9+fn7/kZGR/6enp//u7u7/7+/v/+/v7//w8O//8PDv//Dw7//w8PD/8fHw//Hx
- 8P/x8fD/8fHx//Hx8f+traz/8fHw/8PDw/+oqKj/7+/u/7Gxsf+7u7v/8/Pz/8zMzP/W1tX/3t7d/76+
- vv/q6ur/nZ2d//Hx8f/19fT/r6+v//X19f+zs7P/y8vL//b29f/29vX/9vb2//b29v/29vb/q6ur/8XF
- xf/CwsL/4ODg/9/f3/+ysrL/2dnZ/+3t7f/39/f/+Pj3/97e3v/Hx8f/3t7e/7m5uf/IyMj/1NTU/8vL
- y/+goKD/9fX1/5+fn//e3t7/yMjI/93d3f++vr7/paWl/9jY2P/z8/P/xMTE/6ampv/5+fn/7u7u//n5
- +f/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6
- +v/6+vr/+vr6//r6+v//////AAAAQAAAACgAAAAUAAAACAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA
- AAgAAAAUAAAAKAAAAEAAAABYAAAAbAAAAHj/////7e3s/+3t7f/u7u3/1NTU/3Z2dv9+fn7/tra2/+3t
- 7P/v7+7/7+/v/+/v7//w8O//8PDv//Dw7//w8PD/8fHw//Hx8P/x8fD/8fHx/8fHx//d3dz/6+vq/5iY
- mP/w8PD/5+fm/5ubm//v7+7/29vb/6enp//ExMT/qamp//T08/+xsbH/xcXF//T09P+qqqr/x8fH/7Cw
- sP/ExMT/3t7e//Pz8//29vX/9vb1/+np6f+1tbX/8vLy/7a2tv/Jycn/9/f2/7q6uv/Dw8P/9/f3//f3
- 9//39/f/8vLy/7u7uv/4+Pj/wcHB/8TExP/4+Pj/x8fH/7S0tP/Q0ND/rq6u/8nJyf/Q0ND/ysrK//Hx
- 8f+dnZ3/6enp/7a2tv/29vb/np6e//X19f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5
- +f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//////8AAABAAAAAKAAA
- ABQAAAAIAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAAABQAAAAoAAAAQAAAAFgAAABsAAAAeP//
- ///t7ez/7e3s/+3t7f/u7u3/4eHh/9fX1//q6ur/7+/u/+/v7v/v7+7/7+/v/+/v7//w8O//8PDv//Dw
- 7//w8PD/8fHw//Hx8P/x8fD/8PDw/8fHx//ExMP/oqKi/9/f3//y8vL/4uLi/76+vf+goKD/4+Pj//Pz
- 8/+pqan/9PTz//T08//Ozs7/q6ur/7u7u//y8vL/3t7e/+Pj4v/Pz8//rq6u//X19f/19fX/7e3s/6Sk
- pP/29vb/6+vr/+fn5//09PT/z8/P/6qqqf/Z2dn/2tra//Pz8//39/f/3t7e/8jIyP+9vb3/vb28//j4
- +P/w8PD/1dXV/+Tk5P+ioqL/9PT0/7W1tf/MzMz/+Pj4/97e3v/Kysr/vLy8/+rq6v+wsLD/ysrK/9vb
- 2//k5OT/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5
- +f/5+fn/+fn5//n5+f/5+fn//////wAAAEAAAAAoAAAAFAAAAAgAAAACAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAIAAAAIAAAAFAAAACgAAABAAAAAWAAAAGwAAAB4/////+3t7P/t7ez/7e3s/+3t7f/u7u3/7u7t/+7u
- 7f/u7u7/7+/u/+/v7v/v7+7/7+/u/+/v7//w8O//8PDv//Dw7//w8PD/8fHw//Hx8P/x8fD/8fHx//Hx
- 8f/T09L/ysrJ//Ly8f/y8vL/8fHx//Pz8v/z8/L/8/Py/7CwsP/u7u7/8/Pz//T08//z8/L/9PT0//T0
- 9P/09PT/9fX0//X19P/19fX/9fX1//X19f/19fX/9fX1//b29f/29vb/ysrK/+np6f/r6+v/pqam/+Hh
- 4f/m5uX/8PDw//f39//39/f/9/f3//f39//39/f/9/f3//f39//4+Pf/+Pj4//j4+P/4+Pj/+Pj4//j4
- +P/4+Pj/+Pj4//j4+P/4+Pj/9vb2/9zc3P+urq7/6enp/+bm5f/5+fj/+fn5//n5+f/5+fn/+fn5//n5
- +f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+P//////AAAAQAAA
- ACgAAAAUAAAACAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAAAUAAAAKAAAAEAAAABYAAAAbAAA
- AHj/////7Ozs/+3t7P/t7ez/7e3s/+3t7f/u7u3/7u7t/+7u7f/u7u7/7+/u/+/v7v/v7+7/7+/u/+/v
- 7//w8O//8PDv//Dw7//w8PD/8fHw//Hx8P/x8fD/5+fn/7S0tP+1tbX/8vLx//Ly8f/y8vL/8vLy//Pz
- 8v/d3d3/pqal/9ra2v/z8/P/8/Pz//T08//09PP/9PT0//T09P/09PT/9PT0//X19P/19fT/9fX1//X1
- 9f/19fX/9fX1//b29f/29vX/8vLy//b29v/t7e3/7Ozs//b29v/29vb/9vb2//f39v/39/f/9/f3//f3
- 9//39/f/9/f3//f39//39/f/9/f3//j49//4+Pf/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4/+Tk
- 5P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4
- +P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//////8AAABAAAAAKAAAABQAAAAIAAAAAgAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAACAAAACAAAABQAAAAoAAAAQAAAAFgAAABsAAAAeP/////s7Ov/7e3s/+3t7P/t7ez/7e3s/+3t
- 7f/u7u3/7u7t/+7u7f/u7u7/7+/u/+/v7v/v7+7/7+/u/+/v7//w8O//8PDv//Dw7//w8PD/8PDw//Hx
- 8P/x8fD/8fHw/+/v7//x8fH/8vLx//Ly8f/y8vL/8vLy//Hx8f/z8/L/8vLx//Pz8v/z8/P/8/Pz//Pz
- 8//09PP/9PTz//T09P/09PT/9PT0//T09P/19fT/9fX0//X19f/19fX/9fX1//X19f/19fX/9vb1//b2
- 9f/29vb/9vb2//b29v/29vb/9vb2//b29v/39/b/9/f2//f39//39/f/9/f3//f39//39/f/9/f3//f3
- 9//39/f/9/f3//f39//4+Pf/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4
- +P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj//////wAA
- AEAAAAAoAAAAFAAAAAgAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAFAAAACgAAABAAAAAWAAA
- AGwAAAB4/////+zs6//s7Ov/7e3s/+3t7P/t7ez/7e3s/+3t7f/u7u3/7u7t/+7u7f/u7u7/7+/u/+/v
- 7v/v7+7/7+/u/+/v7//w8O//8PDv//Dw7//w8PD/8PDw//Hx8P/x8fD/8fHw//Hx8f/x8fH/8vLx//Ly
- 8f/y8vH/8vLy//Ly8v/z8/L/8/Py//Pz8v/z8/P/8/Pz//Pz8//09PP/9PTz//T08//09PT/9PT0//T0
- 9P/09PT/9fX0//X19P/19fX/9fX1//X19f/19fX/9fX1//b29f/29vX/9vb2//b29v/29vb/9vb2//b2
- 9v/29vb/9vb2//f39v/39/b/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f3
- 9//39/f/9/f3//j49//4+Pf/+Pj3//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4
- +P/4+Pj/+Pj4//j4+P/4+Pj/+Pj3//j49///////AAAAQAAAACgAAAAUAAAACAAAAAIAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAgAAAAgAAAAUAAAAKAAAAEAAAABYAAAAbAAAAHj/////7Ozr/+zs6//s7Ov/7e3s/+3t
- 7P/t7ez/7e3s/+3t7f/u7u3/7u7t/+7u7f/u7u3/7+/u/+/v7v/v7+7/7+/u/+/v7//w8O//8PDv//Dw
- 7//w8PD/8PDw//Hx8P/x8fD/8fHw//Hx8f/x8fH/8vLx//Ly8f/y8vH/8vLy//Ly8v/y8vL/8/Py//Pz
- 8v/z8/L/8/Pz//Pz8//z8/P/9PTz//T08//09PT/9PT0//T09P/09PT/9PT0//X19P/19fT/9fX1//X1
- 9f/19fX/9fX1//X19f/29vX/9vb1//b29f/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//f3
- 9v/39/b/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f3
- 9//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3////
- //8AAABAAAAAKAAAABQAAAAIAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAAABQAAAAoAAAAQAAA
- AFgAAABsAAAAeP/////s7Ov/7Ozr/+zs6//t7ez/8/Py//Hx8f/y8vH/7e3s/+3t7f/u7u3/7u7t/+7u
- 7f/u7u3/7+/u/+/v7v/v7+7/7+/u/+/v7//w8O//8PDv//Dw7//w8O//8PDw//Hx8P/x8fD/8fHw//Hx
- 8P/x8fH/8fHx//Ly8f/y8vH/8vLx//Ly8v/y8vL/8/Py//Pz8v/z8/L/8/Pz//Pz8//z8/P/8/Pz//T0
- 8//09PP/9PT0//T09P/09PT/9PT0//T09P/y8vH/7e3s//X19f/19fX/9fX1//X19f/19fX/9fX1//b2
- 9f/29vX/9vb1//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//f39v/39/b/9/f2//f3
- 9//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f3
- 9//39/f/9/f3//f39//39/f/9/f3//f39//39/f//////wAAAEAAAAAoAAAAFAAAAAgAAAACAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAIAAAAIAAAAFAAAACgAAABAAAAAWAAAAGwAAAB4/////+vr6v/s7Ov/7Ozr/+Tk
- 5P+cnJz/pqam/9XV1f/v7+7/7e3s/+3t7f/u7u3/7u7t/+7u7f/u7u3/7u7u/+/v7v/v7+7/7+/u/+/v
- 7//v7+//8PDv//Dw7//w8O//8PDw//Dw8P/x8fD/8fHw//Hx8P/x8fH/8fHx//Ly8f/y8vH/8vLx//Ly
- 8v/y8vL/8vLy//Pz8v/z8/L/8/Py//Pz8//z8/P/8/Pz//Pz8//09PP/9PTz//T09P/09PT/9PT0/+Hh
- 4f+8vLz/9fX0//X19P/19fT/9fX1//X19f/19fX/9fX1//X19f/19fX/9vb1//b29f/29vX/9vb2//b2
- 9v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9/f2//f39v/39/b/9/f2//f3
- 9v/39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/b/9/f2//f3
- 9v//////AAAAQAAAACgAAAAUAAAACAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAAAUAAAAKAAA
- AEAAAABYAAAAbAAAAHj/////6+vq/+vr6v/s7Ov/tra2/4KCgv+Tk5P/qamp/+3t7P/t7ez/7e3s/+3t
- 7P/u7u3/7u7t/+7u7f/u7u3/7u7u/+/v7v/v7+7/7+/u/+/v7v/v7+//8PDv//Dw7//w8O//8PDw//Dw
- 8P/x8fD/8fHw//Hx8P/x8fD/8fHx//Hx8f/y8vH/8vLx//Ly8f/y8vL/8vLy//Ly8v/z8/L/8/Py//Pz
- 8v/z8/P/8/Pz//Pz8//z8/P/9PTz//T08//09PP/8PDw/66urv/09PT/9PT0//X19P/e3t3/zs7N//Hx
- 8f/19fX/9fX1//X19f/19fX/9fX1//X19f/29vX/9vb1//b29f/29vX/9vb2//b29v/29vb/9vb2//b2
- 9v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b2
- 9v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//////8AAABAAAAAKAAAABQAAAAIAAAAAgAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAACAAAACAAAABQAAAAoAAAAQAAAAFgAAABsAAAAeP/////r6+r/6+vq/+vr
- 6v/Nzc3/cnJy/4KCgv+urq7/6+vr/+3t7P/t7ez/7e3s/+3t7P/u7u3/7u7t/+7u7f/u7u3/7u7u/+/v
- 7v/v7+7/y8vK/6Wlpf++vr7/ysrK/+Hh4P+zs7L/xsbF/9HR0f/w8PD/urq6/9jY2P/x8fD/8fHx/7S0
- tP+8vLv/wsLB/+Xl5P/MzMv/zMzM/9vb2/+4uLj/8/Py/8DAv/+xsbH/5ubm//Pz8//z8/P/v7+//76+
- vf/a2tn/pKSk/8zMzP/Ly8v/7Ozs/8vLy//Ly8v/v7++/9/f3v+np6f/1NTU/+Hh4f+urq7/4eHh/7Oz
- s//o6Oj/wsLC/9bW1v/29vX/q6ur/7+/v//z8/L/9vb1//b29v/29vb/9vb2//b29v/29vb/9vb2//b2
- 9v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b2
- 9v/29vb//////wAAAEAAAAAoAAAAFAAAAAgAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAFAAA
- ACgAAABAAAAAWAAAAGwAAAB4/////+rq6f/r6+r/6+vq/+np6P/S0tL/wcHB/+Tk5P/s7Ov/7Ozs/+3t
- 7P/t7ez/7e3s/+3t7P/u7u3/7u7t/+7u7f/u7u3/7u7u/+/v7v/Ly8r/yMjH/+/v7v/v7+//v7+//9bW
- 1f/w8O//tra2/+jo6P/IyMj/srKx//Hx8P/x8fD/mpqa/83Nzf/r6+v/ysrJ/8XFxP+pqan/7Ozr/5ub
- m//i4uL/tra1/+bm5v/CwsH/8fHw//Pz8/+wsLD/7u7u/9HR0f+pqan/7e3s//Hx8P+4uLj/9PT0/8HB
- wf+0tLT/z8/P/8vLy//a2tn/t7e2/9vb2//IyMf/s7Oz/8bGxv/T09P/qKio//Ly8v+qqqr/7+/v/8bG
- xv/19fX/9fX1//b29f/29vX/9vb1//b29f/29vX/9vb1//b29f/29vX/9vb2//b29v/29vb/9vb2//b2
- 9v/29vb/9vb2//b29v/29vb/9vb2//b29f/29vX/9vb1//b29f//////AAAAQAAAACgAAAAUAAAACAAA
- AAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAAAUAAAAKAAAAEAAAABYAAAAbAAAAHj/////6urp/+rq
- 6f/r6+r/6+vq/+vr6v/s7Ov/7Ozr/+zs6//s7Ov/7Ozr/+3t7P/t7ez/7e3s/+3t7P/t7e3/7u7t/+7u
- 7f/u7u3/7u7t/97e3v+2trX/7+/u/+/v7v/X19b/s7Oz//Dw7/+/v77/tra2/7i4uP+0tLT/zc3N//Dw
- 7/+rq6v/5eXk/7CwsP/r6+v/ubm5/7y8vP/Q0M//rKyr/8DAwP/Dw8P/09PT/+vr6v/Pz87/8/Py/8HB
- wP/b29v/8/Pz/6ysrP/T09P/8/Pz/6ampv/09PP/qamo//T09P/Hx8f/sLCw//T09P+xsbH/09PT//Pz
- 8/+qqqr/zc3M/9TU0/+1tbT/xMTE/62trf/x8fH/2tra/+Pj4//19fX/9fX1//X19f/19fX/9fX1//X1
- 9f/19fX/9fX1//X19f/19fX/9fX1//X19f/19fX/9vb1//b29f/19fX/9fX1//X19f/19fX/9fX1//X1
- 9f/19fX/9fX1//////8AAABAAAAAKAAAABQAAAAIAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAA
- ABQAAAAoAAAAQAAAAFgAAABsAAAAeP/////q6un/6urp/+rq6f/r6+r/6+vq/+vr6v/s7Ov/7Ozr/+zs
- 6//s7Ov/7Ozr/+3t7P/t7ez/7e3s/+3t7P/t7e3/7u7t/+7u7f/u7u3/7e3s/6ampv/v7+7/7+/u/+/v
- 7v/U1NP/s7Oz/6qqqv/q6un/5+fm/9LS0f/a2tr/pKSk/+Dg3//BwcH/ubm4/+jo5//i4uL/2NjY/9bW
- 1v+pqan/7Ozr/6qqqf/U1NT/8vLy//Ly8v/y8vL/5OTj/+vr6v/z8/L/19fW/6enp/+1tbX/xMTE//Pz
- 8/+ioqL/6+vq//T08//BwcD/9PT0/97e3v/Hx8f/9PT0/9XV1f/o6Oj/w8PD/76+vv/i4uH/oqKh/+7u
- 7f/19fT/9PTz//X19f/19fX/9fX1//X19f/19fX/9fX1//X19f/19fX/9fX1//X19f/19fX/9fX1//X1
- 9f/19fX/9fX1//X19f/19fX/9fX1//X19f/19fX/9fX1//X19f/19fX//////wAAAEAAAAAoAAAAFAAA
- AAgAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAFAAAACgAAABAAAAAWAAAAGwAAAB4/////+rp
- 6P/q6un/6urp/+rq6f/r6+r/6+vq/+vr6v/s7Ov/7Ozr/+zs6//s7Ov/7Ozr/+3t7P/t7ez/7e3s/+3t
- 7P/t7ez/7u7t/+7u7f/u7u3/paWl/+3t7f/v7+7/7+/u/+/v7v/u7u3/7+/u/+/v7//w8O//8PDv//Dw
- 7//w8O//8PDw//Dw8P/x8fD/8fHw//Hx8P/x8fD/8fHx//Hx8f/x8fH/8vLx//Ly8f/y8vH/8vLx//Ly
- 8v/y8vL/wMDA/+bm5f/CwsH/zMzM//Pz8v/z8/P/8/Pz//Pz8//z8/P/8/Pz//T08//09PP/9PTz//T0
- 8//09PP/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9fX0//X19P/19fT/9fX0//X1
- 9P/19fT/9fX0//X19P/19fT/9fX0//X19P/19fX/9fX1//X19f/19fX/9fX1//X19f/19fT/9fX0//X1
- 9P/19fT/9fX0//X19P//////AAAAQAAAACgAAAAUAAAACAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA
- AAgAAAAUAAAAKAAAAEAAAABYAAAAbAAAAHj/////6eno/+rp6P/q6un/6urp/+rq6f/r6+r/6+vq/+vr
- 6v/s7Ov/7Ozr/+zs6//s7Ov/7Ozr/+3t7P/t7ez/7e3s/+3t7P/t7ez/7u7t/+7u7f/GxsX/6Ojn/+7u
- 7f/u7u7/7+/u/+/v7v/v7+7/7+/u/+/v7//v7+//8PDv//Dw7//w8O//8PDv//Dw8P/w8PD/8fHw//Hx
- 8P/x8fD/8fHw//Hx8f/x8fH/8fHx//Ly8f/y8vH/8vLx//Ly8f/y8vL/7u7u//Ly8v/z8/L/8/Py//Pz
- 8v/z8/L/8/Py//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//T08//09PP/9PTz//T08//09PP/9PT0//T0
- 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9fX0//X1
- 9P/19fT/9fX0//X19P/19fT/9fX0//X19P/09PT/9PT0//T09P/09PT/9PT0//////8AAABAAAAAKAAA
- ABQAAAAIAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAAABQAAAAoAAAAQAAAAFgAAABsAAAAeP//
- ///p6ej/6eno/+rp6P/q6un/6urp/+rq6f/r6+r/6+vq/+vr6v/r6+r/7Ozr/+zs6//s7Ov/7Ozr/+zs
- 7P/t7ez/7e3s/+3t7P/t7ez/7e3t/+7u7f/u7u3/7u7t/+7u7f/u7u7/7+/u/+/v7v/v7+7/7+/u/+/v
- 7v/v7+//8PDv//Dw7//w8O//8PDv//Dw7//w8PD/8PDw//Hx8P/x8fD/8fHw//Hx8P/x8fH/8fHx//Hx
- 8f/y8vH/8vLx//Ly8f/y8vH/8vLy//Ly8v/y8vL/8vLy//Pz8v/z8/L/8/Py//Pz8v/z8/L/8/Pz//Pz
- 8//z8/P/8/Pz//Pz8//z8/P/8/Pz//T08//09PP/9PTz//T08//09PP/9PTz//T08//09PT/9PT0//T0
- 9P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T0
- 9P/09PT/9PT0//T09P/09PT//////wAAAEAAAAAoAAAAFAAAAAgAAAACAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAIAAAAIAAAAFAAAACgAAABAAAAAWAAAAGwAAAB4/////+no5//p6ej/6eno/+np6P/x8fD/8/Pz/+3t
- 7P/r6un/6+vq/+vr6v/r6+r/7Ozr/+zs6//s7Ov/7Ozr/+zs6//t7ez/7e3s/+3t7P/t7ez/7e3s/+7u
- 7f/u7u3/7u7t/+7u7f/u7u3/7u7u/+/v7v/v7+7/7+/u/+/v7v/v7+//7+/v//Dw7//w8O//8PDv//Dw
- 7//w8PD/8PDw//Dw8P/x8fD/8fHw//Hx8P/x8fD/8fHx//Hx8f/x8fH/8vLx//Ly8f/y8vH/8vLx//Ly
- 8f/y8vL/8vLy//Ly8v/y8vL/8/Py//Pz8v/z8/L/8/Py//Pz8v/z8/L/8/Pz//Pz8//z8/P/8/Pz//Pz
- 8//z8/P/8/Pz//Pz8//09PP/9PTz//T08//09PP/9PTz//T08//09PP/9PTz//T08//09PP/9PTz//T0
- 8//09PP/9PTz//T08//09PP/9PTz//T08//09PP/9PTz//T08//09PP/9PTz//T08///////AAAAQAAA
- ACgAAAAUAAAACAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAAAUAAAAKAAAAEAAAABYAAAAbAAA
- AHj/////6Ojn/+no5//p6ej/6urp/62trf+tra3/39/f/+zs6//r6un/6+vq/+vr6v/r6+r/7Ozr/+zs
- 6//s7Ov/7Ozr/+zs6//t7ez/7e3s/+3t7P/t7ez/7e3s/+3t7f/u7u3/7u7t/+7u7f/u7u3/7u7u/+/v
- 7v/v7+7/7+/u/+/v7v/v7+7/7+/v/+/v7//w8O//8PDv//Dw7//w8O//8PDw//Dw8P/w8PD/8fHw//Hx
- 8P/x8fD/8fHw//Hx8f/x8fH/8fHx//Hx8f/y8vH/8vLx//Ly8f/y8vH/8vLx//Ly8v/y8vL/8vLy//Ly
- 8v/y8vL/8/Py//Pz8v/z8/L/8/Py//Pz8v/z8/L/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz
- 8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//09PP/9PTz//T08//09PP/9PTz//T08//09PP/9PTz//T0
- 8//09PP/8/Pz//Pz8//z8/P/8/Pz//////8AAABAAAAAKAAAABQAAAAIAAAAAgAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAACAAAACAAAABQAAAAoAAAAQAAAAFgAAABsAAAAeP/////o6Of/6Ojn/+no5/+6urr/hISE/5eX
- l/+urq7/7Ozs/+rq6f/q6un/6+vq/+vr6v/r6+r/7Ozr/+zs6//s7Ov/7Ozr/+zs6//s7Oz/7e3s/+3t
- 7P/t7ez/7e3s/+3t7P/u7u3/7u7t/+7u7f/u7u3/7u7t/+7u7v/v7+7/7+/u/+/v7v/v7+7/7+/u/+/v
- 7//v7+//8PDv//Dw7//w8O//8PDv//Dw7//w8PD/8PDw//Hx8P/x8fD/8fHw//Hx8P/x8fD/8fHx//Hx
- 8f/x8fH/8vLx//Ly8f/y8vH/8vLx//Ly8f/y8vH/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8/Py//Pz
- 8v/z8/L/8/Py//Pz8v/z8/L/8/Py//Pz8v/z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz
- 8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P//////wAA
- AEAAAAAoAAAAFAAAAAgAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAFAAAACgAAABAAAAAWAAA
- AGwAAAB4/////+jn5v/o6Of/6Ojn/8PDw/9ycnL/hISE/6mpqf/p6Of/6urp/+rq6f/q6un/6+vq/+vr
- 6v/r6+r/6+vq/+zs6//s7Ov/7Ozr/+zs6//s7Ov/7e3s/+3t7P/t7ez/7e3s/+3t7P/t7e3/7u7t/+7u
- 7f/u7u3/7u7t/+7u7f/u7u7/7+/u/+/v7v/v7+7/7+/u/+/v7v/v7+//7+/v//Dw7//w8O//8PDv//Dw
- 7//w8O//8PDw//Dw8P/x8fD/8fHw//Hx8P/x8fD/8fHw//Hx8P/x8fH/8fHx//Hx8f/y8vH/8vLx//Ly
- 8f/y8vH/8vLx//Ly8f/y8vH/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Pz8v/z8/L/8/Py//Pz
- 8v/z8/L/8/Py//Pz8v/z8/L/8/Py//Pz8v/z8/L/8/Py//Pz8v/z8/L/8/Py//Pz8v/z8/L/8/Py//Pz
- 8v/z8/L/8/Py//Pz8v/z8/L/8/Py//Pz8v//////AAAAQAAAACgAAAAUAAAACAAAAAIAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAgAAAAgAAAAUAAAAKAAAAEAAAABYAAAAbAAAAHj/////5+fm/+jn5v/o6Of/5eXl/729
- vf+vr6//29vb/+np6P/q6ej/6urp/+rq6f/q6un/6+rp/+vr6v/r6+r/6+vq/+zs6//s7Ov/7Ozr/+zs
- 6//s7Ov/7Ozs/+3t7P/t7ez/7e3s/+3t7P/t7ez/7u7t/+7u7f/u7u3/7u7t/+7u7f/u7u3/7u7u/+/v
- 7v/v7+7/7+/u/+/v7v/v7+7/7+/v/+/v7//w8O//8PDv//Dw7//w8O//8PDv//Dw8P/w8PD/8PDw//Hx
- 8P/x8fD/8fHw//Hx8P/x8fD/8fHw//Hx8f/x8fH/8fHx//Hx8f/y8vH/8vLx//Ly8f/y8vH/8vLx//Ly
- 8f/y8vH/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Pz8v/z8/L/8/Py//Pz
- 8v/z8/L/8/Py//Pz8v/z8/L/8/Py//Pz8v/z8/L/8/Py//Pz8v/z8/L/8/Py//Pz8v/z8/L/8/Py////
- //8AAABAAAAAKAAAABQAAAAIAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAACAAAABQAAAAoAAAAQAAA
- AFgAAABsAAAAeP/////n5+b/5+fm/+jn5v/o6Of/6Ojn/+jo5//p6Of/6eno/+np6P/p6ej/6urp/+rq
- 6f/q6un/6+rp/+vr6v/r6+r/6+vq/+vr6v/s7Ov/7Ozr/+zs6//s7Ov/7Ozr/+3t7P/t7ez/7e3s/+3t
- 7P/t7ez/7e3t/+7u7f/u7u3/7u7t/+7u7f/u7u3/7u7u/+7u7v/v7+7/7+/u/+/v7v/v7+7/7+/u/+/v
- 7//v7+//8PDv//Dw7//w8O//8PDv//Dw7//w8O//8PDw//Dw8P/w8PD/8fHw//Hx8P/x8fD/8fHw//Hx
- 8P/x8fD/8fHx//Hx8f/x8fH/8fHx//Hx8f/y8vH/8vLx//Ly8f/y8vH/8vLx//Ly8f/y8vH/8vLx//Ly
- 8f/y8vH/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly
- 8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL//////wAAAEAAAAAoAAAAFAAAAAgAAAACAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAIAAAAIAAAAFAAAACgAAABAAAAAWAAAAGwAAAB4/////+fm5f/n5+b/5+fm/+jn
- 5v/o5+b/6Ojn/+jo5//p6Of/6eno/+np6P/p6ej/6uno/+rq6f/q6un/6urp/+vr6v/r6+r/6+vq/+vr
- 6v/s7Ov/7Ozr/+zs6//s7Ov/7Ozr/+zs7P/t7ez/7e3s/+3t7P/t7ez/7e3s/+3t7f/u7u3/7u7t/+7u
- 7f/u7u3/7u7t/+7u7v/u7u7/7+/u/+/v7v/v7+7/7+/u/+/v7v/v7+//7+/v/+/v7//w8O//8PDv//Dw
- 7//w8O//8PDv//Dw8P/w8PD/8PDw//Dw8P/x8fD/8fHw//Hx8P/x8fD/8fHw//Hx8P/x8fD/8fHx//Hx
- 8f/x8fH/8fHx//Hx8f/x8fH/8vLx//Ly8f/y8vH/8vLx//Ly8f/y8vH/8vLx//Ly8f/y8vH/8vLx//Ly
- 8f/y8vH/8vLx//Ly8f/y8vH/8vLx//Ly8f/y8vH/8vLx//Ly8f/y8vH/8vLx//Ly8f/y8vH/8vLx//Ly
- 8f//////AAAAQAAAACgAAAAUAAAACAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAAAUAAAAKAAA
- AEAAAABYAAAAbAAAAHj/////5ubl/+fm5f/n5+b/5+fm/+jn5v/o5+b/6Ojn/+jo5//p6Of/6eno/+np
- 6P/p6ej/6uno/+rq6f/q6un/6urp/+vq6f/r6+r/6+vq/+vr6v/s7Ov/7Ozr/+zs6//s7Ov/7Ozr/+zs
- 6//t7ez/7e3s/+3t7P/t7ez/7e3s/+3t7P/t7e3/7u7t/+7u7f/u7u3/7u7t/+7u7f/u7u7/7u7u/+/v
- 7v/v7+7/7+/u/+/v7v/v7+7/7+/u/+/v7//v7+//8PDv//Dw7//w8O//8PDv//Dw7//w8O//8PDv//Dw
- 8P/w8PD/8PDw//Hx8P/x8fD/8fHw//Hx8P/x8fD/8fHw//Hx8P/x8fD/8fHw//Hx8f/x8fH/8fHx//Hx
- 8f/x8fH/8fHx//Hx8f/x8fH/8vLx//Ly8f/y8vH/8vLx//Ly8f/y8vH/8vLx//Ly8f/y8vH/8vLx//Ly
- 8f/y8vH/8vLx//Ly8f/y8vH/8vLx//Ly8f/y8vH/8vLx//////8AAABAAAAAKAAAABQAAAAIAAAAAgAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAACAAAACAAAABQAAAAoAAAAQAAAAFgAAABsAAAAeP/////m5uX/5ubl/+fm
- 5f/n5uX/5+fm/+fn5v/o5+b/6Ojn/+jo5//p6Of/6ejn/+np6P/p6ej/6eno/+rq6f/q6un/6urp/+rq
- 6f/r6+r/6+vq/+vr6v/r6+r/7Ozr/+zs6//s7Ov/7Ozr/+zs6//s7Ov/7e3s/+3t7P/t7ez/7e3s/+3t
- 7P/t7ez/7e3t/+7u7f/u7u3/7u7t/+7u7f/u7u3/7u7t/+7u7v/v7+7/7+/u/+/v7v/v7+7/7+/u/+/v
- 7v/v7+//7+/v/+/v7//w8O//8PDv//Dw7//w8O//8PDv//Dw7//w8O//8PDw//Dw8P/w8PD/8PDw//Hx
- 8P/x8fD/8fHw//Hx8P/x8fD/8fHw//Hx8P/x8fD/8fHw//Hx8P/x8fD/8fHx//Hx8f/x8fH/8fHx//Hx
- 8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx
- 8f/x8fH//////wAAAEAAAAAoAAAAFAAAAAgAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAIAAAAFAAA
- ACgAAABAAAAAWAAAAGwAAAB4/////+bl5P/m5uX/5ubl/+fm5f/n5uX/5+fm/+fn5v/o5+b/6Ojn/+jo
- 5//o6Of/6ejn/+np6P/p6ej/6eno/+rp6P/q6un/6urp/+rq6f/r6un/6+vq/+vr6v/r6+r/6+vq/+zs
- 6//s7Ov/7Ozr/+zs6//s7Ov/7Ozr/+3t7P/t7ez/7e3s/+3t7P/t7ez/7e3s/+3t7f/u7u3/7u7t/+7u
- 7f/u7u3/7u7t/+7u7f/u7u7/7+/u/+/v7v/v7+7/7+/u/+/v7v/v7+7/7+/u/+/v7//v7+//7+/v//Dw
- 7//w8O//8PDv//Dw7//w8O//8PDv//Dw7//w8O//8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fD/8fHw//Hx
- 8P/x8fD/8fHw//Hx8P/x8fD/8fHw//Hx8P/x8fD/8fHw//Hx8P/x8fD/8fHw//Hx8P/x8fD/8fHw//Hx
- 8P/x8fD/8fHw//Hx8P/x8fD/8fHw//Hx8P/x8fD/8fHw//Hx8P//////AAAAQAAAACgAAAAUAAAACAAA
- AAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAgAAAAUAAAAKAAAAEAAAABYAAAAbAAAAHj/////5uXk/+bl
- 5P/m5eT/5ubl/+fm5f/n5uX/5+fm/+fn5v/o5+b/6Ofm/+jo5//o6Of/6ejn/+np6P/p6ej/6eno/+rp
- 6P/q6un/6urp/+rq6f/q6un/6+vq/+vr6v/r6+r/6+vq/+zs6//s7Ov/7Ozr/+zs6//s7Ov/7Ozr/+zs
- 7P/t7ez/7e3s/+3t7P/t7ez/7e3s/+3t7P/t7e3/7u7t/+7u7f/u7u3/7u7t/+7u7f/u7u3/7u7u/+7u
- 7v/v7+7/7+/u/+/v7v/v7+7/7+/u/+/v7v/v7+7/7+/v/+/v7//v7+//7+/v//Dw7//w8O//8PDv//Dw
- 7//w8O//8PDv//Dw7//w8O//8PDv//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/x8fD/8fHw//Hx
- 8P/x8fD/8fHw//Hx8P/x8fD/8fHw//Hx8P/x8fD/8fHw//Hx8P/x8fD/8fHw//Hx8P/x8fD/8fHw//Hx
- 8P/x8fD/8fHw//////8AAABAAAAAKAAAABQAAAAIAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABwAA
- ABMAAAAnAAAAPwAAAFYAAABqAAAAdv/////r6+r/5eXk/+bl5P/m5eT/5ubl/+fm5f/n5uX/5+fm/+fn
- 5v/o5+b/6Ofm/+jo5//o6Of/6Ojn/+no5//p6ej/6eno/+np6P/q6ej/6urp/+rq6f/q6un/6+rp/+vr
- 6v/r6+r/6+vq/+vr6v/s7Ov/7Ozr/+zs6//s7Ov/7Ozr/+zs6//s7Oz/7e3s/+3t7P/t7ez/7e3s/+3t
- 7P/t7ez/7e3t/+7u7f/u7u3/7u7t/+7u7f/u7u3/7u7t/+7u7f/u7u7/7u7u/+/v7v/v7+7/7+/u/+/v
- 7v/v7+7/7+/u/+/v7v/v7+7/7+/v/+/v7//v7+//7+/v//Dw7//w8O//8PDv//Dw7//w8O//8PDv//Dw
- 7//w8O//8PDv//Dw7//w8O//8PDv//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw
- 8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/w8PD/8PDw//Dw8P/z8/P//////wAAAD8AAAAnAAAAEwAA
- AAcAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAHAAAAEgAAACUAAAA8AAAAUgAAAGUAAABw////////
- ////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////
- ////////////////////////AAAAPAAAACUAAAASAAAABwAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA
- AAYAAAAQAAAAIQAAADYAAABKAAAAWwAAAGUAAABqAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAA
- AGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAA
- AGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAA
- AGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAA
- AGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAA
- AGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAA
- AGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGwAAABsAAAAbAAAAGoAAABlAAAAWwAAAEoAAAA2AAAAIQAA
- ABAAAAAGAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABQAAAA0AAAAbAAAALAAAADwAAABKAAAAUgAA
- AFYAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAA
- AFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAA
- AFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAA
- AFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAA
- AFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAA
- AFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAA
- AFgAAABYAAAAVgAAAFIAAABKAAAAPAAAACwAAAAbAAAADQAAAAUAAAABAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAEAAAAEAAAACQAAABQAAAAgAAAALAAAADUAAAA8AAAAPgAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAA
- AEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAA
- AEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAA
- AEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAA
- AEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAA
- AEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAA
- AEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAA+AAAAPAAAADUAAAAsAAAAIAAA
- ABQAAAAJAAAABAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAGAAAADAAAABQAAAAbAAAAIQAA
- ACUAAAAnAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAA
- ACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAA
- ACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAA
- ACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAA
- ACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAA
- ACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAA
- ACgAAAAoAAAAKAAAACcAAAAlAAAAIQAAABsAAAAUAAAADAAAAAYAAAACAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAQAAAAMAAAAGAAAACgAAAA0AAAAQAAAAEgAAABMAAAAUAAAAFAAAABQAAAAUAAAAFAAA
- ABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAA
- ABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAA
- ABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAA
- ABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAA
- ABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAA
- ABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAEwAAABIAAAAQAAAADQAA
- AAoAAAAGAAAAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIAAAAEAAAABQAA
- AAYAAAAHAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAA
- AAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAA
- AAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAA
- AAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAA
- AAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAA
- AAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAA
- AAgAAAAIAAAACAAAAAgAAAAIAAAABwAAAAYAAAAFAAAABAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAABAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAA
- AAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAA
- AAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAA
- AAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAA
- AAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAA
- AAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAA
- AAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAA
- AAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////////gAAAAAAAAAAD/////////
- wAAAAAAAAAAAf////////8AAAAAAAAAAAH//4AAAAAAAAAAAAAAAAAP//8AAAAAAAAAAAAAAAA////+A
- AAAAAAAAAAAQAA//////gAAAAAAAAAAAAAAP/////wAAAAAAAAAAAAAAD/////8AAAAAAAAAAAAAAA/H
- ////AAAAAAAAAAAAAAAPgf///wAAAAAAAAAAAAAADwD///8AAAAAAAAAAAAAAAAAf///AAAAAAAAAAAA
- AAAAAD///wAAAAAAAAAAAAAAAAAf//8AAAAAAAAAAAAAAAAAD///AAAAAAAAAAAAAAAAAAf//wAAAAAA
- AAAAAAAAAAAH//8AAAAAAAAAAAAAAAAAB///AAAAAAAAAAAAAAAAAAf//wAAAAAAAAAAAAAAAAAH//8A
- AAAAAAAAAAAAAAAAD///AAAAAAAAAAAAAAAAAB///wAAAAAAAAAAAAAAAAAf//8AAAAAAAAAAAAAAAAA
- D///AAAAAAAAAAAAAAAAAAAf/wAAAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAAf/AAAAAAAAAAAA
- AAAAAAAH/wAAAAAAAAAAAAAAAAAAA/8AAAAAAAAAAAAAAAAAAAP/AAAAAAAAAAAAAAAAAAAD/wAAAAAA
- AAAAAAAAAAAAA/8AAAAAAAAAAAAAAAAAAAH/AAAAAAAAAAAAAAAAAAAB/wAAAAAAAAAAAAAAAAAAAP8A
- AAAAAAAAAAAAAAAAAAH/AAAAAAAAAAAAAAAAAAAB/wAAAAAAAAAAAAAAAAAAA/8AAAAAAAAAAAAAAAAA
- AAf/AAAAAAAAAAAAAAAAAAAf/wAAAAAAAAAAAAAAAAAAP/8AAAAAAAAAAAAAAAAAAD//AAAAAAAAAAAA
- AAAAAAA//wAAAAAAAAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAAH/AAAAAAAAAAAAAAAAAAAA/wAAAAAA
- AAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAP8A
- AAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAA
- AAD/AAAAAAAAAAAAAAAAAAAB/wAAAAAAAAAAAAAAAAAAAf8AAAAAAAAAAAAAAAAAAAH/AAAAAAAAAAAA
- AAAAAAAD/wAAAAAAAAAAAAAAAAAAB/8AAAAAAAAAAAAAAAAAAf//AAAAAAAAAAAAAAAAAAH//wAAAAAA
- AAAAAAAAAAAD//8AAAAAAAAAAAAAAAAAAf//AAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAf/8A
- AAAAAAAAAAAAAAAAAH//AAAAAAAAAAAAAAAAAAA//wAAAAAAAAAAAAAAAAAAP/8AAAAAAAAAAAAAAAAA
- AH//AAAAAAAAAAAAAAAAAAB//wAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAf//AAAAAAAAAAAA
- AAAAAAP//wAAAAAAAAAAAAAAAAAH//8AAAAAAAAAAAAAAAAAB///AAAAAAAAAAAAAAAAAAf//wAAAAAA
- AAAAAAAAAAAH//8AAAAAAAAAAAAAAAAAB///AAAAAAAAAAAAAAAAAAf//wAAAAAAAAAAAAAAAAAH//8A
- AAAAAAAAAAAAAAAAB///AAAAAAAAAAAAAAAAAAf//wAAAAAAAAAAAAAAAAAH//8AAAAAAAAAAAAAAAAA
- B///AAAAAAAAAAAAAAAAAAf//wAAAAAAAAAAAAAAAAAH//8AAAAAAAAAAAAAAAAAB///AAAAAAAAAAAA
- AAAAAAf//wAAAAAAAAAAAAAAAAAH//8AAAAAAAAAAAAAAAAAB///AAAAAAAAAAAAAAAAAAf//wAAAAAA
- AAAAAAAAAAAH//8AAAAAAAAAAAAAAAAAB///AAAAAAAAAAAAAAAAAAf//wAAAAAAAAAAAAAAAAAH//8A
- AAAAAAAAAAAAAAAAB///AAAAAAAAAAAAAAAAAAf//wAAAAAAAAAAAAAAAAAH//8AAAAAAAAAAAAAAAAA
- B///AAAAAAAAAAAAAAAAAAf//wAAAAAAAAAAAAAAAAAH//8AAAAAAAAAAAAAAAAAB///AAAAAAAAAAAA
- AAAAAAf//wAAAAAAAAAAAAAAAAAH//8AAAAAAAAAAAAAAAAAB///AAAAAAAAAAAAAAAAAAf//wAAAAAA
- AAAAAAAAAAAH//8AAAAAAAAAAAAAAAAAB///AAAAAAAAAAAAAAAAAAf//wAAAAAAAAAAAAAAAAAH//8A
- AAAAAAAAAAAAAAAAB///AAAAAAAAAAAAAAAAAAf//wAAAAAAAAAAAAAAAAAH//8AAAAAAAAAAAAAAAAA
- B///AAAAAAAAAAAAAAAAAAf//wAAAAAAAAAAAAAAAAAH//8AAAAAAAAAAAAAAAAAB///AAAAAAAAAAAA
- AAAAAAf//wAAAAAAAAAAAAAAAAAH//8AAAAAAAAAAAAAAAAAB///AAAAAAAAAAAAAAAAAAf//wAAAAAA
- AAAAAAAAAAAH//8AAAAAAAAAAAAAAAAAB///gAAAAAAAAAAAAAAAAA///4AAAAAAAAAAAAAAAAAP///A
- AAAAAAAAAAAAAAAAH///4AAAAAAAAAAAAAAAAD///////////////////////ygAAABIAAAAkAAAAAEA
- IAAAAAAAYFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAkAAAARAAAAFwAAABwAAAAiAAAAJgAAACsAAAAvAAAAMgAA
- ADUAAAA4AAAAOgAAADsAAAA9AAAAPgAAAEAAAABBAAAAQgAAAEMAAABDAAAARAAAAEMAAABBAAAAPwAA
- AD0AAAA8AAAAOgAAADgAAAA2AAAAMwAAAC8AAAArAAAAJwAAACIAAAAcAAAAGAAAABIAAAAKAAAAAgAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAgAAAAcAAAAOAAAAFAAAABoAAAAfAAAAIgAAACcAAAAsAAAALwAAADIAAAA0AAAAOQAA
- AEAAAABGAAAAQwAAAD4AAAA+AAAAPwAAAEAAAABLDAwMaRAQEGsDAwNfAAAAVAAAAEkAAAA/AAAAOAAA
- ADQAAAAyAAAALwAAACsAAAAnAAAAIwAAAB4AAAAaAAAAFAAAAA8AAAAIAAAAAgAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAABQAAAAcAAAAJAAAACQAAAAkAAAAJAAAACQAA
- AAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAA
- AAkAAAAJAAAACgAAAAwAAAAMAAAADQAAAA8AAAASAAAAFgAAABwAAAAuEBAQSTMzM21ISEiFHh4eXQAA
- ACQAAAAXAAAAFQAAABkPDw9KhoaGvJ2dndKOjo7EeHh4rFpaWo4xMTFkBAQEKQAAABAAAAAOAAAADQAA
- AAoAAAAGAAAABAAAAAMAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAIAAAAKAAAAFQAAAB4AAAAhAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAA
- ACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAAACIAAAAiAAAAIgAA
- ACIAAAAiAAAAIgAAACIAAAAiAgICMxwcHFdUVFSJjIyMvLCwsOG8vLzueXl5qQYGBjcAAAALAAAAAwEB
- AQtERERlwcHB7tHR0f/R0dH+z8/P+8jIyPSZmZnAHx8fNgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAYAAAAYAAAAMQAAAETNzc2g0NDQpNDQ0KTQ0NCk0NDQpNDQ0KTQ0NCk0NDQpNDQ0KTQ0NCk0NDQpNDQ
- 0KTQ0NCk0NDQpNDQ0KTQ0NCk0NDQpNDQ0KTQ0NCk0NDQpNDQ0KTQ0NCk0NDQpNDQ0KTQ0NCk0NDQpNDQ
- 0KTIyMimhoaGvJ+fn+DDw8P4ycnJ/snJyf/Kysr+ubm58HNzc68YGBg4AAAAIQwMDC+Ghoalz8/P/dTU
- 1P/W1tb/19fX/9fX1/+rq6vUJiYmPAAAAAIAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAjAAAASAAA
- AGP4+Pj59/f3//f39//4+Pj/+Pj4//n5+f/5+fn/+vr6//r6+v/6+vr/+vr6//v7+//7+/v/+/v7//z8
- /P/8/Pz//Pz8//z8/P/9/f3//f39//39/f/9/f3//v7+//7+/v/+/v7//f39//z8/P/19fX/uLi4/7+/
- v//IyMj/ycnJ/8rKyv/Ly8v/zMzM/6+vr/6KiorbcXFxpnx8fKi5ubnj1NTU/tbW1v/Y2Nj/2dnZ/9nZ
- 2f+urq7VLCwsPgAAAAMAAAAAAAAAAgQEBB4mJiZCEBAQKgAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAAoAAAAUQAAAHD39/f69vb2//f3
- 9//39/f/+Pj4//j4+P/5+fn/+vr6//r6+v/6+vr/+vr6//v7+//7+/v/+/v7//v7+//8/Pz//Pz8//z8
- /P/9/f3//f39//39/f/9/f3//v7+//z8/P/9/f3//f39//z8/P/4+Pj/wcHB/7y8vP/Kysr/ysrK/8zM
- zP/Nzc3/zs7O/87Ozv/Ly8v+zc3N+8/Pz/vT09P+19fX/9nZ2f/a2tr/29vb/9vb2/+4uLjfS0tLZw8P
- DygAAAAPDg4OKmxsbISsrKzNi4uLpC4uLkkBAQEOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAApAAAAUgAAAHL39/f69vb2//f39//39/f/+Pj4//j4
- +P/5+fn/+vr6//r6+v/6+vr/+vr6//v7+//7+/v/+/v7//v7+//8/Pz//Pz8//z8/P/9/f3//f39//39
- /f/8/Pz/7+/v/9jY2P/n5+f/+Pj4//v7+//19fX/wsLC/7i4uP/MzMz/zMzM/87Ozv/Pz8//0NDQ/9LS
- 0v/T09P/1dXV/9bW1v/X19f/2dnZ/9ra2v/b29v/3d3d/93d3f/U1NT6uLi42YeHh6BERERleXl5lcfH
- x+ne3t791dXV9qCgoL49PT1TBgYGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAsAAAApAAAAUgAAAHL39/f69vb2//b29v/29vb/9/f3//j4+P/5+fn/+vr6//r6
- +v/6+vr/+vr6//v7+//7+/v/+/v7//v7+//8/Pz//Pz8//z8/P/9/f3//f39//z8/P/v7+//urq6/7Gx
- sf+wsLD/yMjI/+fn5//Hx8f/rq6u/8TExP/Ozs7/zs7O/8/Pz//R0dH/0tLS/9TU1P/V1dX/19fX/9jY
- 2P/a2tr/29vb/9zc3P/d3d3/39/f/+Hh4f/h4eH/4ODg/9jY2PvDw8Pn0tLS9eXl5f7q6ur/6urq/9/f
- 3/yrq6vLQUFBWQEBARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAsAAAApAAAAUgAAAHL39/f69vb2/+Xl5f/BwcH/6urq//j4+P/5+fn/+vr6//r6+v/6+vr/+vr6//v7
- +//7+/v/+/v7//v7+//8/Pz//Pz8//z8/P/9/f3//Pz8//Ly8v++vr7/urq6/83Nzf/Ly8v/uLi4/6ur
- q/+zs7P/zMzM/8/Pz//Pz8//0NDQ/9LS0v/T09P/1NTU/9bW1v/X19f/2dnZ/9ra2v/b29v/3Nzc/97e
- 3v/g4OD/4eHh/+Pj4//k5OT/5eXl/+bm5v/m5ub/6Ojo/+vr6//s7Oz/7e3t/+7u7v/f39/9kZGRqxIS
- EikAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAApAAAAUgAA
- AHL39/f69vb2/8jIyP+JiYn/0NDQ//j4+P/5+fn/+vr6//r6+v/6+vr/+vr6//v7+//7+/v/+/v7//v7
- +//8/Pz//Pz8//z8/P/9/f3/9vb2/8fHx/+2trb/y8vL/8fHx//Jycn/zMzM/83Nzf/Pz8//zs7O/8/P
- z//Q0ND/0tLS/9PT0//V1dX/19fX/9ra2v/e3t7/4eHh/+Li4v/j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Tk
- 5P/l5eX/5+fn/+jo6P/q6ur/6+vr/+3t7f/u7u7/7+/v/+/v7//S0tLwaWlpfAQEBBcAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAApAAAAUgAAAHL39/f69vb2/+/v
- 7//Y2Nj/8PDw//j4+P/5+fn/+vr6//r6+v/6+vr/+vr6//v7+//7+/v/+/v7//v7+//8/Pz//Pz8//z8
- /P/8/Pz/2dnZ/7Ozs//Ly8v/yMjI/8nJyf/Kysr/y8vL/87Ozv/Pz8//0NDQ/9HR0f/S0tL/1NTU/9jY
- 2P/f39//5uXl/+Xh3v/f2tX/3NnW/9nX1P/Z1tT/29jX/+De3f/m5uX/6enp/+np6f/o6Oj/6enp/+rq
- 6v/s7Oz/7e3t/+/v7//w8PD/8fHx/+bm5v2fn5+6JCQkNgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAApAAAAUgAAAHL39/f69vb2//f39//39/f/+Pj4//j4
- +P/5+fn/+vr6//r6+v/6+vr/+vr6//v7+//7+/v/+/v7//v7+//8/Pz//Pz8//z8/P/7+/v/ycnJ/7u7
- u//Nzc3/ycnJ/8vLy//MzMz/zc3N/8/Pz//Q0ND/0dHR/9PT0//V1dX/3t7e/+no5//g18//wauV/6uQ
- df+ypJX/t66m/7iwqP+3rqf/tKuj/7Oqof+3r6f/ysXA/+De3P/s6+v/7Ozs/+zs7P/t7e3/7+/v//Dw
- 8P/y8vL/8fHx/9fX1/ZcXFyAAQEBFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAsAAAApAAAAUgAAAHL39/f69vb2//f39//39/f/+Pj4//j4+P/5+fn/+vr6//r6
- +v/6+vr/+vr6//v7+//7+/v/+/v7//v7+//8/Pz//Pz8//z8/P/8/Pz/5OTk/7Ozs//Hx8f/zc3N/83N
- zf/Ozs7/z8/P/9HR0f/S0tL/09PT/9jY2P/o6Oj/6uXg/7WYe/+QXi3/o39b/8e8sf/Y0sz/4NvW/+DY
- 0P/RuqT/vZNo/654Qv+iazT/mWc1/5lzTf+6p5T/5eDd//Dw8P/w8PD/8fHx//Ly8v/09PT/9PT0/+fn
- 5/2dnZ24IiIiOQAAAAUAAAABAAAABgAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAsAAAApAAAAUgAAAHL39/f69vb2//b29v/z8/P/+Pj4//j4+P/5+fn/+vr6//r6+v/6+vr/+vr6//v7
- +//7+/v/+/v7//v7+//8/Pz//Pz8//z8/P/8/Pz/+/v7/97e3v+wsLD/zs7O/9DQ0P/Q0ND/0dHR/9PT
- 0//U1NT/2dnZ/+vq6f/ZzL//lmc4/41PEv+3lnX/3NTO/+jm4//w7ez/5dK//8eQWP+yZBb/rloI/6tW
- A/+oVAD/o1EA/5pNAf+NSAb/mGo9/9DBsv/x8fD/8/Pz//T09P/19fX/9/f3//f39/7b29v0eHh4jRgY
- GEE4ODhNT09PZDc3N1YGBgYXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAApAAAAUgAA
- AHL39/f69vb2/9fX1v+lpaX/3d3d//j4+P/5+fn/+fn5//r6+v/6+vr/+vr6/+7u7v/v7+//5+fn//Hx
- 8f/t7e3/6urq//T09P/s7Oz/8/Pz/+fn5/+srKz/ycnJ/9LS0v/S0tL/09PT/9XV1f/Z2dn/6Ofn/828
- q/+PWib/kEsG/72Xcv/i3Nb/7+7t//Pz8v/hx67/v307/7dqHv+3bCH/uG0j/7ZqHv+zYxT/r1wJ/6xW
- A/+jUgH/k0oB/5BYIf/JtaH/9PPz//b29v/4+Pj/+fn5//r6+v/09PT+z8/P6Lu7u9PIyMjf1dXV7K6u
- rsg4ODhHAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAApAAAAUgAAAHL39/f69vb2/9DQ
- 0P+Pj4//1dXV//j4+P/5+fn/+fn5//r6+v/6+vr/+vr6/9HR0f/Z2dn/xsbG/8jIyP/Z2dn/v7+//9ra
- 2v/Gxsb/ycnJ/7a2tv+bm5v/09PT/9PT0//U1NT/1dXV/9fX1//l5eX/0sW4/5FfLf+PSAH/sHY8/+La
- 0v/t7e3/8PDv/+XVxv+6ciz/sF0K/7FgDv+0ZRf/t2sg/7pyKv+7dC7/uXAo/7VpG/+yYRD/qloK/5dN
- Bf+QWSL/2Mq8//n4+P/6+vr/+/v7//z8/P/8/Pz/9PT0/vLy8v719fX/9fX1/9ra2vJwcHB+AAAAEQAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAApAAAAUgAAAHL39/b69vb1//X19f/t7e3/9vb2//j4
- +P/5+fj/+fn5//r6+v/6+vr/+vr6/+rq6v/X19f/xcXF/+Xl5f/u7u7/z8/P/6+vr/+np6f/sbGx/5qa
- mv+7u7v/1dXV/9TU1P/V1dX/19fX/97e3v/j3tr/lmk+/4xGAf+jVwz/1b2m/+rp6f/s7Oz/6+bh/8WN
- Vv+uVwH/rlgD/69bCP+yYRD/tWga/7lwJv+9dzL/wH47/799PP+7dS7/t2wh/7BkGf+XUQv/mGk6/+3m
- 4f/7+/v//Pz8//z8/P/7+/v/+vr6//n5+f/39/f/9vb2/+rq6v2jo6O1ERERKgAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAsAAAApAAAAUgAAAHL39/b69vb1//b29v/39/f/9/f3//j4+P/4+Pj/+fn5//r6
- +v/6+vr/+vr6//r6+v/19fX/x8fH//T09P/m5ub/wsLC/7u7u//Gxsb/xsbG/8rKyv/X19f/1dXV/9bW
- 1v/Y2Nj/2tra/+fn5/+1m4L/h0cG/51OAP+6fED/5ODc/+jo6P/q6ur/3sq3/7JjFP+wWwf/sV8N/7Ji
- Ef+0ZRf/tmgb/7hsIf+6cSn/vHcx/799Ov/Afjv/u3Qt/7VpHP+rXxP/jk0L/7yghP/49/X/+/v7//v7
- +//5+fn/+Pj4//f39//19fX/9fX1//Dw8P/Hx8fdPDw8UAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAsAAAApAAAAUgAAAHL39/b69vb1//b29v/39/f/9/f3//j4+P/4+Pj/+fn5//r6+v/6+vr/+vr6//r6
- +v/5+fn/8vLy//r6+v/u7u7/tbW1/9PT0//T09P/1NTU/9XV1f/W1tb/19fX/9jY2P/a2tr/39/f/97Y
- 0/+MWij/k0gA/6hWBf/KpH7/5OTj/+bm5v/o5+b/0a2J/7FgD/+yYhL/tGYX/7VoG/+2aR3/tmkc/7Vn
- Gf+1Zhj/tmkc/7hvJP+7dS//vHcx/7htI/+wYBD/nlMI/5VhLv/i2M//+fn5//n5+f/4+Pj/9vb2//X1
- 9f/09PT/8/Pz/+3t7f7Q0NDpV1dXbAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAApAAAAUgAA
- AHL29vb69fX1//Hx8f/l5eX/9PT0//f39//4+Pj/+fn5//n5+f/6+vr/+vr6//r6+v/6+vr/+/v7//v7
- +//m5ub/tra2/9bW1v/T09P/1NTU/9bW1v/X19f/2dnZ/9ra2v/c3Nz/4uLh/72ql/+FRQb/n08A/69e
- Dv/Tvaf/4uLi/+Xl5f/m5OP/y59z/7RlFv+2aBv/tmod/7ZpHP+1Zxj/tGQV/7JhEf+xYA7/sV4M/7Jg
- Dv+1Zxn/uW4l/7pxKP+0Zhf/p1YE/41JBv/Apoz/9/b2//f39//29vb/9fX1//T09P/w8PD+5ubm+sfH
- x92KioqYJiYmOwAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAApAAAAUgAAAHL29vb69fX1/8zM
- zP+VlZX/1dXV//f39//4+Pj/+fn4//n5+f/5+fn/+vr6//n5+f/5+fn/+/v7//v7+//a2tr/u7u7/9fX
- 1//V1dX/1tbW/9jY2P/Z2dn/29vb/9zc3P/e3t7/4N7c/515Vv+NRgD/p1MA/7JlGP/WyLr/4eHh/+Pj
- 4//l5OL/zaR8/7dqHv+2aR3/tWca/7RlFv+yYhH/sWAO/7BdCv+vWwf/rlkD/65YAf+vWwb/s2QU/7ht
- Iv+4biP/r18O/5RKAf+jeVD/7uzp//X19f/09PT/8/Pz//Hx8f/m5ub8qqqqv0tLS2AREREkAAAABgAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAApAAAAUgAAAHL29vb69fX1/93d3f+mpqb/4ODg//f3
- 9//4+Pj/+Pj4//n5+f/5+fn/+vr6/+np6f/V1dX/6enp//Pz8/+8vLz/vLy8/9nZ2f/W1tb/2NjY/9nZ
- 2f/b29v/3d3d/97e3v/g4OD/2dTQ/4tcLv+VSQD/q1UA/7RqIP/Wy8D/39/f/+Li4v/k5OP/1bqe/7ds
- If+1Zhj/s2MU/7JhEP+wXgv/sFsH/65ZA/+uVwH/rlcA/65XAP+uVwD/r1wH/7RmF/+5byb/tWoe/55S
- B/+TXCb/49vU//T09P/z8/P/8fHx//Dw8P/j4+P4ZGRkfgAAABIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAsAAAApAAAAUgAAAHL29vb69fX1//X19f/z8/P/9vb2//f39//4+Pj/+Pj4//n5
- +f/5+fn/+vr6/+np6f/c3Nz/6+vr/8zMzP+8vLz/q6ur/8zMzP/a2tr/3Nzc/9zc3P/d3d3/3t7e/+Dg
- 4P/h4eH/z8e//4ROGf+bTAD/rFYA/7RrIf/Vyb3/39/f/+Hh4f/j4+P/3dLG/7x4Nv+zYxP/sWAO/7Bd
- Cv+vWgX/rlcB/65XAP+uVwD/rlcA/65XAP+uVwD/rlcB/7FeC/+2aRz/uHAn/6VbE/+QVRr/1cm8//Ly
- 8v/x8fH/8PDw/+7u7v/m5ub7e3t7jAgICBEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAsAAAApAAAAUgAAAHL29vb69fX0//X19f/29vb/9vb2//f39//39/f/+Pj4//n5+f/5+fn/+vr6/97e
- 3v/X19f/5+fn/9LS0v/X19f/s7Oz/7S0tP+xsbH/ycnJ/9/f3//f39//4ODg/+Li4v/h4eH/yb+0/39G
- Df+dTgD/rlgE/7RoHP/TwrP/3d3d/+Dg4P/h4eH/4d7c/8ukff+yYxP/sFwJ/69aBf+uVwH/rlcA/65X
- AP+uVwD/rlcA/65XAP+uVwD/rlcA/65aBP+zYxT/uG4l/6hjHf+RVRr/zb6v//Dw8P/v7+//7u7u/+3t
- 7f/m5ub8i4uLoBISEi8AAAAPAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAApAAAAUgAA
- AHL29vb69PT0//X19f/29vb/9vb2//f39v/39/f/+Pj4//j4+P/5+fn/+fn5/+7u7v/j4+P/4ODg//T0
- 9P/6+vr/+Pj4//Hx8f/U1NT/tra2/97e3v/g4OD/4uLi/+Tk5P/i4uL/x72z/39FDf+eUAL/r1wJ/7Rm
- Gf/Ns5r/3Nzc/97e3v/f39//4ODg/9zUzP+9f0L/sF0K/69aBf+vWQT/r1kE/65YA/+uWAH/rlcA/65X
- AP+uVwD/rlcA/65XAf+xXgz/tWoe/6hmIv+TWiH/zb6v/+3t7f/u7u7/7e3t/+vr6//o6Oj+z8/P5JmZ
- madiYmJvMDAwOgAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAApAAAAUgAAAHL29vb69PT0/+vr
- 6//MzMz/7u7u//b29v/39/f/9/f3//j4+P/4+Pj/+fn5//r6+v/6+vr/+vr6//r6+v/6+vr/+/v7//v7
- +//s7Oz/ubm5/97e3v/j4+P/5OTk/+Xl5f/k5OT/ysK6/4JOGv+cUQb/sF8O/7RlF//GmnD/2tnY/9vb
- 2//d3d3/39/f/+Li4v/cz8H/x5Jd/8GAP//BgUD/wH49/756Nv+6cyv/tmkc/7JgD/+uWQT/rlcA/65X
- AP+vWgf/smUY/6VkIv+WYi3/0se8/+zs7P/s7Oz/6+vr/+rq6v/p6en/5+fn/uTk5Pza2trwpaWlswIC
- Ai0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAApAAAAUgAAAHL29vb69PT0/8PDw/+JiYn/zMzM//b2
- 9v/39/f/9/f3//j4+P/4+Pj/+fn5//n5+f/6+vr/+vr6//r6+v/6+vr/+/v7//r6+v/k5OT/tLS0/9zc
- 3P/l5eX/5ubm/+fn5//m5ub/0c3J/4hcMP+WUAn/sGES/7VnGv+8fDv/1c3F/9zc3P/h4eH/5eXl/+fn
- 5//p6en/5t/Z/9m6nP/Nm2n/y5Vf/8qSW//JkFf/xotQ/8OFR/++ejb/tmkd/7BcCP+uWQT/rWAS/59f
- Hv+ZbD7/2tTO/+rq6v/r6+v/6enp/+jo6P/n5+f/5ubm/+Tk5P/k5OT+tLS0wwAAAC8AAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAsAAAApAAAAUgAAAHL29vb69PT0/+jo6P/Dw8P/6urq//b29v/39/b/9/f3//j4
- +P/4+Pj/+fn4//n5+f/6+vr/+vr6//r6+v/5+fn/8vLy/9bW1v+3t7f/xcXF/+Pj4//n5+f/6Ojo/+np
- 6f/p6en/19XT/5Z2Vv+OTQz/rGAV/7ZqHf+7dS7/0Laa/+Df3v/i4uL/5OTk/+bm5v/o6Oj/6urq/+rn
- 5P/cwKX/zpxq/82YZP/LlF7/yY9W/8aKTv/EhEb/wH47/7t0Lf+zZBb/plsQ/5dZG/+mhGH/4N3b/+np
- 6f/p6en/5+fn/+bm5v/l5eX/5OTk/+Pj4//i4uL8pqamrwAAACEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAsAAAApAAAAUgAAAHL29vX69PTz//T09P/19fT/9fX1//b29f/29vb/9/f3//f39//4+Pj/+Pj4//n5
- +f/5+fn/+vr6//r6+v/09PT/xsbG/7q6uv/X19f/5ubm/+jo6P/o6Oj/6urq/+vr6//s7Oz/39/f/7Gh
- kf+ESxL/pF0Y/7dwKv/BgD//yJRg/9rPxf/g4OD/4+Pj/+Xl5f/n5+f/6urq/+vr6//m3NH/0qV4/86b
- af/MlmH/yZBY/8aKTv/DhEX/wH47/713Mv+0bif/oV8c/5FYH/+6pZH/5OTk/+jo6P/n5+f/5ubm/+Xl
- 5f/k5OT/4uLi/+Hh4f/g4OD5jIyMkwAAABUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAApAAAAUgAA
- AHL19fX68/Pz//T09P/19fT/9fX1//X19f/29vb/9vb2//f39//39/f/+Pj4//j4+P/5+fn/+vr6//r6
- +v/u7u7/tbW1/9zc3P/n5+f/6Ojo/+np6f/q6ur/7Ozs/+3t7f/u7u7/6ejo/8vHw/+GWzD/l1ga/7Ny
- Mf+/fT3/woJD/82lff/b1c//4ODg/+Pj4//l5eX/6Ojo/+rq6v/q5+X/1rGM/82ZZf/Kk1z/x41T/8SH
- Sf/BgED/vno2/7lzLP+rZiL/lloe/5NoPf/Px7//5eXl/+fn5//l5eX/5eXl/+Tk5P/k5OT/4+Pj/+Li
- 4v/a2trva2trcgAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAApAAAAUgAAAHL19fX68/Pz//T0
- 9P/29vX/9fX1//X19f/29vb/9vb2//f39//39/f/+Pj4//j4+P/5+fn/+fn5//r6+v/19fX/xMTE/9HR
- 0f/o6Oj/6enp/+vr6//s7Oz/7u7u/+/v7//w8PD/8PDw/9zc3P+mkn//g1Ae/59iJ/+1czH/vns4/8GB
- Qf/Lo3v/29TO/9/f3//i4uL/5OTk/+bm5v/n5+b/2sCn/8mRWf/Gi1D/xIZI/8GAP/++ejb/uXMt/65o
- Iv+bWhn/hU4Y/66ZhP/d3Nv/5ubm/+Xl5f/k5OT/4+Pj/+Tk5PnJycnawcHB0sHBwdKtra26MjIyRQAA
- AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAApAAAAUgAAAHL19fX68/Py/93d3P+ysrL/5OTk//X1
- 9f/29vX/9vb2//f39v/39/f/9/f3//j4+P/4+Pj/+fn5//n5+f/5+fn/2dnZ/7y8vP/q6ur/6+vr/+3t
- 7f/u7u7/7+/v//Hx8f/z8/P/9PT0/+7u7v/JxsP/i2pL/4ROGf+gYSH/sm4q/7p1L/+9ejf/xpZl/9TF
- tf/c2db/3NTN/9rLvP/Wu6D/zaBz/8OERv/Afz7/vns3/7x2MP+3byj/q2Qe/5tYFP+HSw//km1I/9HN
- yf/i4uL/5OTk/+Tk5P/i4uL/5OTk/sjIyNY2NjZXFxcXMxcXFzMUFBQsBAQEDgAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAsAAAApAAAAUgAAAHL19fX68/Py/8rKyv+Ojo7/0dHR//T09P/19fX/9vb1//b2
- 9v/39/b/9/f3//j49//4+Pj/+fn5//n5+f/5+fn/7Ozs/7W1tf/i4uL/7e3t/+7u7v/v7+//8PDw//Pz
- 8//09PT/9fX1//f39//l5eX/urKq/4ReOf+ESxL/nFoY/6tkHf+zaiH/t28l/7x7Of/CjVf/wIVK/79+
- Pf++ejb/vHcx/7t0Lf+6cir/t20k/7BnHf+lXRb/l1IO/4VHCP+FWCv/wbeu/97e3v/k5OT/4+Pj/+Li
- 4v/h4eH/4eHh9pOTk5oEBAQeAAAAAgAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAsAAAApAAAAUgAAAHL19fX68vLy/+7u7v/b29r/7u7u//T09P/19fX/9fX1//b29v/29vb/9/f3//f3
- 9//4+Pj/+Pj4//n5+P/5+fn/9vb2/8nJyf/Hx8f/2tra/9bW1v/Ly8v/29vb//Pz8//29vb/9/f3//n5
- +f/4+Pj/3d3c/7Sqn/+AWDD/gUcO/5NQDv+fVw//p1wR/6xfEv+xYxX/s2YZ/7RnGv+0Zxr/s2Ya/7Bk
- F/+sYBT/pVsQ/5xUC/+QSgb/gEIE/4JUJv+2qJr/2dnZ/+Pj4//j4+P/4uLi/+Dg4P/i4uL/1dXV5VJS
- UmYAAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAApAAAAUgAA
- AHL19fX68vLy//Pz8v/z8/P/9PTz//T09P/09PT/9fX1//b29f/29vb/9vb2//X19f/29vb/9vb2//f3
- 9//39/f/9/f3/+vr6/+8vLz/n5+f/8HBwf/Hx8f/sbGx/+fn5//39/f/+fn5//v7+//8/Pz/+Pj4/93d
- 3f+4sar/hWNB/3lCDP+ERQb/j0kE/5ZMAv+cTwL/n1EE/6FTBf+hUwX/n1IE/5tPA/+WTAL/jkcB/4RC
- AP95PgX/i2U//7uwpf/X19f/4uLi/+Li4v/h4eH/4ODg/97e3v/f39//4ODg9JKSkpsLCwspAAAAAQAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAApAAAAUgAAAHL19fX68vLx//Ly
- 8v/z8/P/9PTz//T08//09PT/9fX1//X19f/29vX/9vb2/8zMzP/R0dH/x8fH/8bGxv/Ly8v/wsLC/9TU
- 1P/Jycn/wcHB/9fX1//i4uL/oqKi/7W1tf/w8PD/+/v7//z8/P/8/Pz/+/v7//f39//j4+P/xMG//52J
- dv99VCv/dz8J/3w9AP+CQQD/h0MA/4pFAP+KRAD/iEMA/4NAAP99PQD/dz4G/35QI/+kjnn/yMTB/9nZ
- 2f/i4uL/4uLi/+Hh4f/f39//3t7e/93d3f/c3Nz/3t7e/9vb2+x2dnaDAAAAGgAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAApAAAAUgAAAHL19fT68vLx//Hx8f/o6Oj/8/Py//Pz
- 8//09PT/9PT0//X19f/19fX/9vb2/9/f3//Z2dn/xcXF/9nZ2f/V1dX/xMTE/+Pj4//b29v/0dHR/8/P
- z//W1tb/xsbG/6qqqv/l5eX/+/v7//v7+//6+vr/+fn5//j4+P/29vb/6+vr/9TT0/++uLP/o5KB/41t
- Tv9+Uyj/e0ob/3lGFP95RhT/e0oa/39TKP+NbEz/ppOA/7+5s//S0dD/3t7e/+Li4v/h4eH/4ODg/9/f
- 3//e3t7/3d3d/9vb2//a2tr/2dnZ/+Dg4P3CwsLNDAwMOgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAsAAAApAAAAUgAAAHL19fT68fHx/8/Pz/+goKD/2NjY//Pz8//09PP/9PT0//X1
- 9P/19fX/9fX1//T09P/s7Ov/7Ozs//X19f/s7Oz/xcXF//f39//l5eX/2dnZ/+Hh4f/v7+//ubm5/8vL
- y//19fX/+/v7//r6+v/5+fn/9/f3//b29v/19fX/9PT0//Dw8P/n5+f/2tnZ/8zKyf/BvLf/ubGq/7Sq
- of+0qZ//ubGp/8G8t//KyMb/1dXU/93d3f/i4uL/4uLi/+Hh4f/g4OD/3t7e/9/f3//f39//29vb/9ra
- 2v/Y2Nj/2tra/t7e3vOTk5OYBQUFIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAsAAAApAAAAUgAAAHL09PT68fHw/9LS0v+VlZX/19fW//Ly8v/z8/P/9PTz//T09P/09PT/9fX1//b2
- 9f/29vb/9vb2//f39//09PT/4eHh//X19f/4+Pj/+Pj4//n5+f/n5+f/tLS0/+zs7P/6+vr/+vr6//n5
- +f/39/f/9vb2//X19f/09PT/8vLy//Hx8f/w8PD/7u7u/+vr6//m5ub/4uLi/9/f3//e3t7/39/f/+Hh
- 4f/j4+P/5OTk/+Pj4//i4uL/4eHh/9/f3//e3t7/39/f/+Xl5f/k5OT/4uLi/9ra2v/Z2dn+4eHh+bKy
- srcnJyc9AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAApAAAAUgAA
- AHL09PT68fHw//Hx8P/w8O//8vLy//Pz8v/z8/P/9PTz//T09P/09PT/9fX0//X19f/29vb/9vb2//b2
- 9v/39/f/9/f3//j4+P/4+Pj/+fn4//j4+P/b29v/u7u7//Pz8//5+fn/+Pj4//f39//19fX/9fX1//T0
- 9P/y8vL/8fHx/+/v7//u7u7/7e3t/+zs7P/r6+v/6enp/+jo6P/n5+f/5ubm/+Xl5f/j4+P/4uLi/+Hh
- 4f/g4OD/39/f/97e3v/j4+P/5OTk/7+/v/+wsLD/xcXF/+Li4v/m5ub7s7OzwTo6Ok4AAAAIAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAApAAAAUgAAAHL09PT68PDw//Hx
- 8P/x8fH/8vLx//Ly8v/z8/L/8/Pz//T08//09PP/9PT0//X19f/19fX/9vb2//b29v/29vb/9/f3//f3
- 9//4+Pf/+Pj4//j4+P/v7+//vr6+/8nJyf/x8fH/9vb2//X19f/19fX/6+vr/+Dg4P/u7u7/8fHx/+/v
- 7//t7e3/6+vr/+rq6v/p6en/6Ojo/+fn5//m5ub/5OTk/+Pj4//i4uL/4eHh/+Dg4P/e3t7/3d3d/+Li
- 4v/g4OD/tbW1/9HR0f/o6Oj/0dHR/7m5uf+FhYW1NDQ0WAEBAREAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAApAAAAUgAAAHL09PT68PDv//Dw8P/x8fD/8vLx//Ly
- 8f/y8vL/8/Py//Pz8//z8/P/9PT0/+vr6//j4+P/7Ozs/+fn5//w8PD/7e3t//T09P/q6un/4ODg/9/f
- 3//p6en/39/f/7q6uv+5ubn/6enp//T09P/c3Nz/sLCw/7W1tf+urq7/z8/P/+3t7f/t7e3/6urq/+np
- 6f/n5+f/5ubm/+Xl5f/k5OT/4+Pj/+Pj4//i4uL/39/f/97e3v/d3d3/3Nzc/+Dg4P/S0tL/w8PD//f3
- 9//7+/v/+fn5/+vr6/8dHR1VAAAAHAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAsAAAApAAAAUgAAAHL09PT68PDv/+vr6//b29v/7u7u//Ly8f/y8vH/8vLy//Pz
- 8v/z8/P/9PTz/9HR0P/f39//x8fH/9/f3v/S0tL/zs7O/97e3v/MzMz/0tLS/8HBwf++vr7/2trZ/7+/
- v/+2trb/srKy/8nJyf+dnZ3/uLi4/8vLy/+4uLj/np6e/9jY2P/s7Oz/6Ojo/+fn5//m5ub/5ubm/+vr
- 6//q6ur/6enp/+fn5//q6ur/4eHh/9zc3P/b29v/2tra/93d3f/b29v/v7+///j4+P/7+/v/+/v7//39
- /f8lJSU9AAAAEwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAsAAAApAAAAUgAAAHL09PT67+/u/8TExP+Pj4//zs7O//Hx8P/x8fH/8vLx//Ly8v/z8/L/8/Pz/+Tk
- 5P/W1tb/2tra/83Nzf/FxcX/1dXV/9XV1f/Nzc3/4ODg/9bW1v/S0tL/zc3N/+Dg4P/U1NT/vr6+/56e
- nv/ExMT/zMzM/9bW1v/Hx8f/sLCw/9PT0//r6+v/5+fn/+bm5v/k5OT/6Ojo/9jY2P+2trb/uLi4/7Oz
- s//Kysr/5+fn/9vb2//Z2dn/2dnZ/9zc3P/j4+P/u7u7//X19f/7+/v/+/v7//39/f8lJSU9AAAAEwAA
- AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAApAAAAUgAA
- AHL09PP67+/u/+Dg4P+zs7P/4eHh//Dw8P/x8fH/8vLx//Ly8v/y8vL/8/Py//Pz8//09PP/9PT0//T0
- 9P/19fT/9fX1//b29f/29vb/9vb2//f39//39/f/9/f3//j4+P/4+Pj/9PT0/9bW1v/v7+//+Pj4//f3
- 9//W1tb/wsLC/9jY2P/r6+v/5eXl/+Tk5P/j4+P/6urq/8LCwv/T09P/7u7u/+np6f+8vLz/3Nzc/+Dg
- 4P/f39//5eXl/+Xl5f/MzMz/vb29//b29v/7+/v/+/v7//39/f8lJSU9AAAAEwAAAAMAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAApAAAAUgAAAHL09PP67+/u/+/v
- 7v/v7+7/8PDv//Dw8P/x8fD/8fHx//Ly8f/y8vH/8vLy//Pz8v/z8/P/9PTz//T09P/09PT/9fX0//X1
- 9f/19fX/9vb2//b29v/39/b/9/f3//f39//39/f/+Pj4//f39//4+Pj/+fn5//n5+f/39/f/z8/P/8vL
- y//o6Oj/6+vr/+rq6v/q6ur/5ubm/729vf/v7+//+vr6//j4+P/Z2dn/v7+//+Tk5P/Y2Nj/w8PD/7u7
- u//Ly8v/6urq//r6+v/6+vr/+vr6//39/f8lJSU9AAAAEwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAApAAAAUgAAAHLz8/P67u7t/+/v7v/v7+7/8PDv//Dw
- 7//w8PD/8fHw//Hx8f/y8vH/8vLx//Ly8v/z8/L/8/Pz//Pz8//09PT/9PT0//X19P/19fX/9fX1//b2
- 9f/29vb/9vb2//f39v/39/f/9/f3//j49//4+Pj/+Pj4//j4+P/4+Pj/6urq/8fHx/++vr7/vLy8/8PD
- w//MzMz/w8PD/8/Pz//4+Pj/+vr6//r6+v/z8/P/ysrK/729vf/Hx8f/2dnZ/+vr6//29vb/+vr6//r6
- +v/6+vr/+vr6//z8/P8lJSU9AAAAEwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAsAAAApAAAAUgAAAHLz8/P67u7t/+7u7v/u7u3/7+/v/+/v7//w8O//8PDw//Hx
- 8P/x8fD/8vLx//Ly8f/y8vL/8/Py//Pz8//z8/P/9PTz//T09P/09PT/9fX0//X19f/29vX/9vb2//b2
- 9v/29vb/9fX0//f39//39/f/9/f3//j4+P/4+Pj/+Pj4//X19f/v7+//5eXl/93d3f/S0tL/1NTU/+/v
- 7//6+vr/+vr6//r6+v/4+Pj/9PT0/+/v7//29vb/+fn5//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//z8
- /P8lJSU9AAAAEwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAsAAAApAAAAUgAAAHLz8/P67u7t/+Hh4f/CwsL/5ubm/+/v7//w8O//8PDv//Hx8P/x8fD/8fHx/9zc
- 2//e3t7/0NDQ/+Hh4f/a2tr/7Ozr/9ra2v/e3t3/2tra/+jo6P/e3t7/9PT0//b29v/s7Oz/zs7O/+Tk
- 5P/c3Nz/3t7e/97e3v/39/f/3t7e/+bm5v/f39//6Ojo/+np6f/i4uL/4eHh/+Dg4P/X19f/6+vr/9fX
- 1//c3Nz/39/f//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//z8/P8lJSU9AAAAEwAA
- AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAApAAAAUgAA
- AHLz8/L67e3s/8PDw/+Ghob/zMzM/+7u7v/v7+//8PDv//Dw7//w8PD/8fHw/8/Pzv/Y2Nf/xcXE/8HB
- wf/a2tr/y8vK/8PDwv/Ozs7/29vb/8rKyv/FxcX/2tra//T09P/09PP/yMjI/8nJyf/b29v/xMTE/+fn
- 5//29vb/1NTU/9XV1f/Kysr/zs7O/8rKyv+7u7v/z8/P/8vLy//Gxsb/2dnZ/8TExP/z8/P/9/f3//n5
- +f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//z8/P8lJSU9AAAAEwAAAAMAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAApAAAAUgAAAHLz8/L67e3s/+fn
- 5v/S0tH/6Ojn/+7u7v/v7+7/7+/u//Dw7//w8O//8PDw/+jo6P/U1NT/w8PD/+fn5v/R0dD/1tbW/8jI
- yP/s7Ov/1tbV/87Ozv/j4+P/39/f/9zc3P/z8/P/09PT/+zs7P/j4+P/zMzM/9HR0f/s7Oz/6+vr/9fX
- 1//X19f/7e3t/+Dg4P/R0dH/1NTU/+np6f/a2tr/3Nzc/8LCwv/e3t7/8/Pz//n5+f/5+fn/+fn5//n5
- +f/5+fn/+fn5//n5+f/5+fn/+fn4//z8/P8lJSU9AAAAEwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAApAAAAUgAAAHLz8/L67Ozr/+3t7P/t7ez/7u7t/+7u
- 7f/u7u7/7+/u/+/v7v/v7+//8PDv//Dw8P/r6+v/xMTE/+7u7f/x8fH/8fHw/8rKyv/n5+f/8/Py//Pz
- 8//09PP/9PT0//T09P/09PT/9fX0//X19f/s7Ov/6urq/+bm5v/z8/P/9vb2//b29v/39/b/9/f3//f3
- 9//39/f/9/f3//f39//39/f/9/f3/+fn5//t7e3/9vb2//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4
- +P/4+Pj/+Pj4//v7+/8lJSU9AAAAEwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAsAAAApAAAAUgAAAHLy8vL67Ozr/+zs6//t7ez/7e3s/+3t7f/u7u3/7u7t/+/v
- 7v/v7+7/7+/v//Dw7//w8PD/8PDv//Hx8P/x8fH/8fHx//Ly8f/y8vH/8vLy//Pz8v/z8/P/8/Pz//T0
- 8//09PT/9PT0//T09P/19fT/9fX1//X19f/19fX/9vb1//b29f/29vb/9vb2//b29v/29vb/9/f2//f3
- 9//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//v7
- +/8lJSU9AAAAEwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAsAAAApAAAAUgAAAHLy8vL67Ozr/+3t7P/v7+7/7u7t/+3t7P/u7u3/7u7t/+/v7v/v7+7/7+/u//Dw
- 7//w8O//8PDw//Hx8P/x8fD/8fHx//Ly8f/y8vH/8vLy//Pz8v/z8/L/8/Pz//Pz8//09PP/9PT0//T0
- 9P/09PP/8vLy//X19f/19fX/9fX1//X19f/29vX/9vb2//b29v/29vb/9vb2//b29v/39/b/9/f2//f3
- 9//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//v7+/8lJSU9AAAAEwAA
- AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAApAAAAUgAA
- AHLy8vL66+vq/9PT0/+mpqb/29va/+3t7P/t7ez/7u7t/+7u7f/u7u3/7+/u/+/v7v/v7+//8PDv//Dw
- 7//w8PD/8fHw//Hx8P/x8fH/8vLx//Ly8f/y8vL/8/Py//Pz8v/z8/P/8/Pz//T08//v7+7/09PT//T0
- 9P/w8O//7e3t//X19P/19fX/9fX1//X19f/29vX/9vb1//b29v/29vb/9vb2//b29v/29vb/9vb2//b2
- 9v/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//v7+v8lJSU9AAAAEwAAAAMAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAApAAAAUgAAAHLy8vL66+vq/8vL
- y/+RkZH/0NDQ/+zs6//t7ez/7e3s/+7u7f/u7u3/7u7t/9fX1v/Ly8r/29vb/8/Pzv/a2tn/1tbW/+Tk
- 4//b29v/zMzL/9zc2//Q0ND/0tLS/97e3f/Pz8//7e3s/9vb2//X19b/vr6+/93d3f/b29v/yMjI/9PT
- 0v/W1tb/0dHR/8/Pz//b29v/3d3c/8/Pz//i4uL/9fX1//X19f/29vX/9vb1//b29f/29vX/9vb2//b2
- 9v/29vb/9vb2//b29v/29vX/9vb1//r6+v8lJSU9AAAAEwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAApAAAAUgAAAHLy8vH66urp/+np6P/e3t7/6urp/+zs
- 6//s7Ov/7e3s/+3t7P/t7ez/7u7t/9nZ2f/b29r/4ODf/9LS0f/IyMj/w8PD/8nJyf/Pz8//zMzM/9PT
- 0v+8vLz/wcHA/8XFxf/U1NT/4ODf/9XV1f/j4+P/wsLC/97e3f/V1dX/xcXF/8fHx//U1NT/zc3M/8fH
- x//Nzc3/wMDA/8LCwv/g4OD/7+/v//X19f/19fX/9fX1//X19f/19fX/9fX1//X19f/19fX/9fX1//X1
- 9f/19fX/9fX1//r6+v8lJSU9AAAAEwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAsAAAApAAAAUgAAAHLy8fH66uno/+rq6f/r6+r/6+vq/+zs6//s7Ov/7Ozr/+3t
- 7P/t7ez/7e3s/+Li4f/R0dH/7+/u/93d3P/W1tX/6urp/+Pj4//Y2Nf/2tra/+bm5f/m5ub/2tra/+Hh
- 4P/i4uL/8vLx/+7u7v/e3t7/y8vK/8/Pzv/o6Oj/3d3c/+rq6f/s7Ov/5OTk/+zs6//m5ub/39/f/9vb
- 2v/z8/L/9PTz//X19P/19fT/9fX0//X19P/19fT/9fX0//X19f/19fX/9fX1//X19P/19fT/9fX0//r6
- +v8lJSU9AAAAEwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAsAAAApAAAAUgAAAHLx8fH66eno/+rp6P/q6un/6+vq/+vr6v/r6+r/7Ozr/+zs6//s7Oz/7e3s/+np
- 6P/h4eD/7u7t/+7u7f/u7u7/7+/u/+/v7v/v7+//8PDv//Dw7//w8PD/8fHw//Hx8P/x8fD/8fHx//Ly
- 8f/v7+7/7+/v//Ly8f/y8vL/8/Py//Pz8v/z8/L/8/Pz//Pz8//z8/P/8/Pz//T08//09PP/9PTz//T0
- 8//09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/09PT/9PT0//n5+f8lJSU9AAAAEwAA
- AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAApAAAAUgAA
- AHLx8fD66ejn/+fn5v/e3t3/6eno/+vq6f/r6+r/6+vq/+zs6//s7Ov/7Ozr/+3t7P/t7ez/7e3t/+7u
- 7f/u7u3/7u7u/+/v7v/v7+7/7+/u/+/v7//w8O//8PDv//Dw8P/w8PD/8fHw//Hx8P/x8fH/8fHx//Ly
- 8f/y8vH/8vLx//Ly8v/y8vL/8vLy//Pz8v/z8/L/8/Py//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz
- 8//z8/P/9PTz//T08//09PP/9PTz//T08//z8/P/8/Pz//n5+f8lJSU9AAAAEwAAAAMAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAApAAAAUgAAAHLx8fD66Ojn/8jI
- yP+Xl5f/0tLS/+rq6f/q6un/6+vq/+vr6v/r6+r/7Ozr/+zs6//t7ez/7e3s/+3t7P/t7e3/7u7t/+7u
- 7f/u7u3/7+/u/+/v7v/v7+7/7+/v//Dw7//w8O//8PDv//Dw8P/x8fD/8fHw//Hx8P/x8fH/8fHx//Ly
- 8f/y8vH/8vLx//Ly8f/y8vL/8vLy//Ly8v/y8vL/8/Py//Pz8v/z8/L/8/Py//Pz8v/z8/L/8/Py//Pz
- 8v/z8/L/8/Py//Pz8v/z8/L/8/Py//n5+f8lJSU9AAAAEwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAApAAAAUgAAAHLx8PD65+fm/9PT0/+hoaH/19fW/+np
- 6P/q6un/6urp/+vq6f/r6+r/6+vq/+zs6//s7Ov/7Ozr/+3t7P/t7ez/7e3s/+7u7f/u7u3/7u7t/+7u
- 7v/v7+7/7+/u/+/v7v/v7+//8PDv//Dw7//w8O//8PDv//Dw8P/x8fD/8fHw//Hx8P/x8fD/8fHx//Hx
- 8f/x8fH/8vLx//Ly8f/y8vH/8vLx//Ly8f/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly
- 8v/y8vL/8vLy//n5+f8lJSU9AAAAEwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAsAAAApAAAAUgAAAHLw8PD65+bl/+fn5v/o5+b/6Ojn/+no5//p6ej/6uno/+rq
- 6f/q6un/6+vq/+vr6v/s7Ov/7Ozr/+zs6//t7ez/7e3s/+3t7P/t7e3/7u7t/+7u7f/u7u7/7+/u/+/v
- 7v/v7+7/7+/v/+/v7//w8O//8PDv//Dw7//w8PD/8PDw//Hx8P/x8fD/8fHw//Hx8P/x8fH/8fHx//Hx
- 8f/y8vH/8vLx//Ly8f/y8vH/8vLx//Ly8f/y8vH/8vLx//Ly8f/y8vH/8vLx//Ly8f/y8vH/8vLx//n5
- +P8lJSU9AAAAEwAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAsAAAApAAAAUgAAAHLw8PD65ubl/+fm5f/n5+b/6Ofm/+jo5//p6Of/6eno/+np6P/q6un/6urp/+vr
- 6v/r6+r/7Ozr/+zs6//s7Ov/7Ozr/+3t7P/t7ez/7e3s/+3t7f/u7u3/7u7t/+7u7f/u7u7/7+/u/+/v
- 7v/v7+7/7+/v/+/v7//w8O//8PDv//Dw7//w8O//8PDw//Dw8P/x8fD/8fHw//Hx8P/x8fD/8fHw//Hx
- 8P/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//j4+P8lJSU9AAAAEwAA
- AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAApAAAAUgAA
- AHLw8O/65uXk/+bl5P/n5uX/5+fm/+jn5v/o6Of/6Ojn/+np6P/p6ej/6urp/+rq6f/q6un/6+vq/+vr
- 6v/s7Ov/7Ozr/+zs6//s7Ov/7e3s/+3t7P/t7ez/7e3t/+7u7f/u7u3/7u7t/+7u7v/u7u7/7+/u/+/v
- 7v/v7+7/7+/v/+/v7//v7+//8PDv//Dw7//w8O//8PDv//Dw7//w8PD/8PDw//Dw8P/w8PD/8fHw//Hx
- 8P/x8fD/8fHw//Hx8P/x8fD/8fHw//Hx8P/x8fD/8fHw//j4+P8lJSU9AAAAEwAAAAMAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAAoAAAAUQAAAHDy8vH65+fm/+fn
- 5v/o5+b/6Ojn/+no5//p6ej/6eno/+rp6f/q6un/6+rp/+vr6v/r6+r/7Ozr/+zs6//s7Ov/7e3s/+3t
- 7P/t7ez/7e3t/+7u7f/u7u3/7u7t/+7u7v/v7+7/7+/u/+/v7v/v7+7/7+/v//Dw7//w8O//8PDv//Dw
- 7//w8PD/8PDw//Dw8P/x8fD/8fHw//Hx8P/x8fD/8fHw//Hx8P/x8fD/8fHx//Hx8f/x8fH/8fHx//Hx
- 8f/x8fH/8fHx//Hx8f/x8fH/8fHx//n5+f8lJSU8AAAAEgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAkAAAASQAAAGWqqqqura2tsa2trbGtra2xra2tsa2t
- rbGtra2xra2tsa2trbGtra2xra2tsa2trbGtra2xra2tsa2trbGtra2xra2tsa2trbGtra2xra2tsa2t
- rbGtra2xra2tsa2trbGtra2xra2tsa2trbGtra2xra2tsa2trbGtra2xra2tsa2trbGtra2xra2tsa2t
- rbGtra2xra2tsa2trbGtra2xra2tsa2trbGtra2xra2tsa2trbGtra2xra2tsa2trbGtra2xra2tsa2t
- rbGtra2xsLCwrbu7u6MUFBQzAAAAEAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAYAAAAZAAAAMwAAAEYAAABOAAAATwAAAE8AAABPAAAATwAAAE8AAABPAAAATwAA
- AE8AAABPAAAATwAAAE8AAABPAAAATwAAAE8AAABPAAAATwAAAE8AAABPAAAATwAAAE8AAABPAAAATwAA
- AE8AAABPAAAATwAAAE8AAABPAAAATwAAAE8AAABPAAAATwAAAE8AAABPAAAATwAAAE8AAABPAAAATwAA
- AE8AAABPAAAATwAAAE8AAABPAAAATwAAAE8AAABPAAAATwAAAE8AAABPAAAATwAAAE8AAABPAAAASgAA
- ADwAAAAiAAAACwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAMAAAAMAAAAGAAAACEAAAAlAAAAJgAAACYAAAAmAAAAJgAAACYAAAAmAAAAJgAAACYAAAAmAAAAJgAA
- ACYAAAAmAAAAJgAAACYAAAAmAAAAJgAAACYAAAAmAAAAJgAAACYAAAAmAAAAJgAAACYAAAAmAAAAJgAA
- ACYAAAAmAAAAJgAAACYAAAAmAAAAJgAAACYAAAAmAAAAJgAAACYAAAAmAAAAJgAAACYAAAAmAAAAJgAA
- ACYAAAAmAAAAJgAAACYAAAAmAAAAJgAAACYAAAAmAAAAJgAAACYAAAAlAAAAIwAAABwAAAAQAAAABQAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAABgAA
- AAkAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAA
- AAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAA
- AAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAA
- AAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACQAAAAcAAAAEAAAAAQAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAD////wAAAAAA8AAAD////wAAAAAA8AAAD8AAAAAAAAAH8AAAD4AAAAAAAAf/8AAAD4AAAAAAAAd/8A
- AAD4AAAAAAAAQf8AAAD4AAAAAAAAAP8AAAD4AAAAAAAAAH8AAAD4AAAAAAAAAD8AAAD4AAAAAAAAAD8A
- AAD4AAAAAAAAAD8AAAD4AAAAAAAAAD8AAAD4AAAAAAAAAH8AAAD4AAAAAAAAAAcAAAD4AAAAAAAAAAMA
- AAD4AAAAAAAAAAEAAAD4AAAAAAAAAAEAAAD4AAAAAAAAAAEAAAD4AAAAAAAAAAAAAAD4AAAAAAAAAAAA
- AAD4AAAAAAAAAAAAAAD4AAAAAAAAAAEAAAD4AAAAAAAAAAcAAAD4AAAAAAAAAAcAAAD4AAAAAAAAAAEA
- AAD4AAAAAAAAAAAAAAD4AAAAAAAAAAAAAAD4AAAAAAAAAAAAAAD4AAAAAAAAAAAAAAD4AAAAAAAAAAAA
- AAD4AAAAAAAAAAAAAAD4AAAAAAAAAAAAAAD4AAAAAAAAAAEAAAD4AAAAAAAAAAMAAAD4AAAAAAAAAB8A
- AAD4AAAAAAAAAA8AAAD4AAAAAAAAAA8AAAD4AAAAAAAAAAcAAAD4AAAAAAAAAA8AAAD4AAAAAAAAAA8A
- AAD4AAAAAAAAAB8AAAD4AAAAAAAAAD8AAAD4AAAAAAAAAD8AAAD4AAAAAAAAAD8AAAD4AAAAAAAAAD8A
- AAD4AAAAAAAAAD8AAAD4AAAAAAAAAD8AAAD4AAAAAAAAAD8AAAD4AAAAAAAAAD8AAAD4AAAAAAAAAD8A
- AAD4AAAAAAAAAD8AAAD4AAAAAAAAAD8AAAD4AAAAAAAAAD8AAAD4AAAAAAAAAD8AAAD4AAAAAAAAAD8A
- AAD4AAAAAAAAAD8AAAD4AAAAAAAAAD8AAAD4AAAAAAAAAD8AAAD4AAAAAAAAAD8AAAD4AAAAAAAAAD8A
- AAD4AAAAAAAAAD8AAAD4AAAAAAAAAD8AAAD4AAAAAAAAAD8AAAD4AAAAAAAAAD8AAAD4AAAAAAAAAD8A
- AAD4AAAAAAAAAD8AAAD4AAAAAAAAAD8AAAD4AAAAAAAAAD8AAAD4AAAAAAAAAD8AAAD4AAAAAAAAAH8A
- AAD8AAAAAAAAAH8AAAD///////////8AAAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAARAAAAGQAAACIAAAAnAAAALgAAADIAAAA3AAAAOwAA
- AD8AAAA/AAAAQAAAAEEBAQFJBgYGUAAAAEkAAABCAAAAOwAAADcAAAAzAAAALwAAACgAAAAiAAAAGQAA
- ABIAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAEAAAABgAAAAYAAAAGAAAABgAA
- AAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAcAAAALAAAADwAAABIAAAAVAAAAGwAA
- ACEEBAQ2ICAgVS8vL2YKCgo5AAAAIwAAACQ8PDxneXl5qm1tbZtQUFB+Hh4eSQEBASIAAAAZAAAAFgAA
- ABAAAAAMAAAACQAAAAUAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAABMAAAAmkZGRTJOT
- k02Tk5NNk5OTTZOTk02Tk5NNk5OTTZOTk02Tk5NNk5OTTZOTk02Tk5NNk5OTTZOTk02Tk5NNk5OTTZOT
- k02Tk5NNeXl5VGFhYXiTk5O6srKy4rS0tOJubm5/DQ0NFQYGBhOTk5Oizs7O+tLS0v3Ozs75j4+Plx8f
- HxQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAA
- ACoAAABQ7e3t3e3t7eDu7u7g7u7u4O/v7+Dv7+/g7+/v4PDw8ODw8PDg8fHx4PHx8eDx8fHg8vLy4PLy
- 8uDy8vLg8vLy4PLy8uDx8fHg1NTU47GxsfDHx8f9ycnJ/snJyf2tra3rd3d3lmtra326urre1NTU/tfX
- 1//Y2Nj/nJycoiYmJhYAAAAAAwMDDSAgICYMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAABwAAADUAAABm9vb2+/b29v/39/f/+Pj4//n5+f/6+vr/+vr6//r6+v/7+/v/+/v7//z8
- /P/8/Pz//f39//39/f/7+/v/8vLy//f39//7+/v/5eXl/7y8vP/Kysr/zMzM/87Ozv/Pz8//zs7O/dDQ
- 0PzV1dX+2NjY/9ra2v/b29v/s7OzyW9vb2RCQkI3iYmJiLi4uNOKioqKKysrGgYGBgEAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAADYAAABn9vb2+/b29v/29vb/9/f3//n5+f/6+vr/+vr6//r6
- +v/7+/v/+/v7//z8/P/8/Pz//f39//z8/P/m5ub/wsLC/8nJyf/m5ub/y8vL/7y8vP/Nzc3/zs7O/9DQ
- 0P/S0tL/1dXV/9fX1//Z2dn/29vb/93d3f/f39//2dnZ+cnJyeOysrLE0tLS6+Xl5f3V1dXuiYmJgi0t
- LRwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAADYAAABn9vb2++Tk5P+/v7//8PDw//n5
- +f/6+vr/+vr6//r6+v/7+/v/+/v7//z8/P/8/Pz/+/v7/+vr6/+8vLz/x8fH/8bGxv+5ubn/wcHB/87O
- zv/Pz8//0dHR/9TU1P/W1tb/2tra/9zc3P/d3d3/39/f/+Hh4f/i4uL/5OTk/+bm5v/n5+f/6urq/+3t
- 7f/u7u7/xsbG2WFhYUsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAADYAAABn9vb2++jo
- 6P/Kysr/8fHx//n5+f/6+vr/+vr6//r6+v/7+/v/+/v7//z8/P/8/Pz/8/Pz/8fHx//FxcX/yMjI/8rK
- yv/MzMz/z8/P/9DQ0P/S0tL/1dXV/93d3f/h393/3tvY/9za2P/c2tn/397d/+Xl5f/n5+f/5+fn/+np
- 6f/r6+v/7e3t/+/v7//r6+v+oqKioTo6OiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAA
- ADYAAABn9vb2+/b29v/39/f/+Pj4//n5+f/6+vr/+vr6//r6+v/7+/v/+/v7//z8/P/8/Pz/7e3t/8DA
- wP/Kysr/y8vL/83Nzf/Pz8//0dHR/9PT0//d3dz/29PM/8Cokf+1nYb/wLas/8W9tf+8rZ7/s5yF/7Oc
- hv/Ds6P/4NrW/+zr6//u7u7/8PDw//Ly8v/j4+P6bGxsbREREQwAAAAAAAAAAQAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAABwAAADYAAABn9vb2+/b29v/19fX/+Pj4//n5+f/6+vr/+vr6//r6+v/7+/v/+/v7//z8
- /P/8/Pz/+fn5/9vb2/+/v7//zs7O/8/Pz//R0dH/1NTU/+Df3//Pvq3/onVI/7SUdf/WzcT/5t7Y/9a3
- l/+5ejv/rmUd/6NaEf+bWRf/o3VJ/8y7qv/x8fD/8/Pz//X19f/z8/P+tra2u0RERENAQEA5Pj4+PgYG
- BgoAAAAAAAAAAAAAAAAAAAAAAAAABwAAADYAAABn9vb2+9/f3/+xsbH/7u7u//n5+f/5+fn/+vr6/+vr
- 6//j4+P/4ODg/+Li4v/m5ub/4eHh/9vb2/+ysrL/0NDQ/9PT0//V1dX/3tzb/8axnf+SVRn/uZFp/+jm
- 4//u6ub/y5dl/7ZqHv+2ah//t2wi/7RmGf+wXg3/o1QF/5VSEf/HsJn/8vDv//n5+f/6+vr/7u7u+dPT
- 0+bb29vsysrK305OTj4AAAACAAAAAAAAAAAAAAAAAAAABwAAADYAAABn9vb1++3t7P/X19f/8/Pz//n5
- +P/5+fn/+vr6/+np6f/R0dH/09PT/93d3f/BwcH/s7Oz/6qqqv+8vLz/09PT/9XV1f/Z2dn/0MK1/5dh
- LP+rbTH/3c/B/+zr6v/Zu57/sF0M/69bCP+zZBX/uG4j/7x3Mv+8dzL/tmsg/6tfFP+cZS7/2su8//v7
- +//7+/v/+vr6/vf39/729vb/6urq+4mJiXcODg4LAAAAAAAAAAAAAAAAAAAABwAAADYAAABn9vb1+/b2
- 9f/39/f/9/f3//j4+P/5+fn/+vr6//r6+v/r6+v/6+vr/9ra2v/BwcH/ysrK/8zMzP/W1tb/1tbW/9nZ
- 2f/h397/nXBE/5lNAv/LpoL/5uXk/+Tb0/+/gUT/sV4M/7JjE/+1Zxn/tmkd/7huJf+7di//vXk0/7dt
- I/+kWQ//pXZI//Px7v/6+vr/+Pj4//b29v/09PT/8PDw/rS0tLM9PT0iAAAAAAAAAAAAAAAAAAAABwAA
- ADYAAABn9fX1+/Pz8//u7u7/9vb2//j4+P/5+fn/+vr6//r6+v/5+fn/+fn5/9fX1//Kysr/09PT/9XV
- 1f/X19f/2dnZ/93d3P/Qxrz/jUwL/6ZWB//Ww7H/5OTk/97PwP+7eDX/tGYZ/7VoG/+1Zhj/s2MU/7Jh
- Ef+zYxP/t20j/7lwJ/+tXw//llIO/9rMvv/39/f/9vb2//T09P/v7+/93Nzc7pWVlZA0NDQdAAAAAAAA
- AAAAAAAAAAAABwAAADYAAABn9fX1+93d3f+vr6//7Ozs//j4+P/4+Pj/+fn5//X19f/v7+//9/f3/8nJ
- yf/Ozs7/1dXV/9fX1//a2tr/3Nzc/97d3P+uk3j/l0sA/69gEf/Z0Mj/4eHh/93RxP+/gEH/tWca/7Nk
- Ff+xXw3/r1wI/65ZA/+uVwH/r1wH/7RnGf+1ah7/n1QI/7eWd//x7+7/8/Pz//Hx8f/R0dHfcnJyZw8P
- DxEAAAABAAAAAAAAAAAAAAAAAAAABwAAADYAAABn9fX1++/v7//g4OD/9PT0//j4+P/4+Pj/+fn5/+7u
- 7v/f39//3t7e/7i4uP/FxcX/2dnZ/9ra2v/c3Nz/3t7e/9vZ1/+felb/n04A/7FjFf/Y0Mj/4ODg/+Da
- 1P/FkFz/s2MT/7FfDf+vWgX/rlcB/65XAP+uVwD/rlcA/7BdCv+3bCD/qV8W/6l/Vf/q5uP/8fHx/+/v
- 7//MzMzTXV1dOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAADYAAABn9fX1+/T09P/29vb/9vb2//f3
- 9//4+Pj/+fn5/+rq6v/e3t7/39/f/9ra2v/IyMj/vr6+/9XV1f/f39//4uLi/9nV0v+XbUT/olIC/7Ji
- E//Ux7v/3t7e/+Df3//Wwq7/s2ca/69aBv+uVwH/rlcB/65XAP+uVwD/rlcA/65YAf+zZRf/rWYg/6V5
- Tf/j3tn/7u7u/+zs7P/V1dXliIiIdkZGRiYfHx8JAAAAAAAAAAAAAAAAAAAABwAAADYAAABn9fX1+/Dw
- 8P/h4eH/9PT0//f39//39/f/+Pj4//f39//y8vL/9fX1//r6+v/4+Pj/1dXV/9HR0f/i4uL/5OTk/9rX
- 1P+Zckv/olUH/7JiE//OtJz/29vb/97e3v/f3tz/y6N6/7x3Mv+6cyv/uW8m/7VnGf+xXwz/rlcB/65X
- AP+wXw7/qmUf/6iAWP/i3tr/7Ozs/+rq6v/l5eX71tbW5re3t7FkZGREAAAAAAAAAAAAAAAAAAAABwAA
- ADYAAABn9fX1+9vb2/+vr6//6+vr//f39v/39/f/+Pj4//n5+P/6+vr/+vr6//n5+f/x8fH/y8vL/9LS
- 0v/m5ub/5+fn/+Df3v+kiGz/nFQM/7NlGP/DkmH/2dXP/+Li4v/l5eX/6Obl/+HRwv/QonT/y5Vf/8iP
- Vv/FiEz/vXg0/7VoGv+uXQz/oV0Z/7KUd//l4+H/6enp/+fn5//l5eX/5OTk/9XV1ed5eXlbAAAAAAAA
- AAAAAAAAAAAABwAAADYAAABn9fX0+/Hx8f/o6Oj/9PTz//b29v/39/f/+Pj4//j4+P/5+fn/+vr6/+rq
- 6v/Jycn/0dHR/+Li4v/o6Oj/6urq/+bl5f+5q5z/kVES/7FoIP/Ch0z/1sKv/+Hh4f/k5OT/6Ojo/+rp
- 6f/cwqj/zpxr/8qTXf/Hi1H/woJB/714M/+uZh7/mFob/8OxoP/m5uX/5+fn/+Xl5f/j4+P/4uLi/87O
- ztpxcXFEAAAAAAAAAAAAAAAAAAAABwAAADYAAABn9PT0+/Pz8//19fT/9fX1//b29v/29vb/9/f3//j4
- +P/5+fn/+fn5/97e3v/Ozs7/5+fn/+np6f/r6+v/7e3t/+3t7f/Z19X/kGU6/6JkJ/+9ezv/xpBb/9jM
- v//g39//5OTk/+fn5//j1sr/z6By/8eOVf/Ehkj/vns5/7dyLP+eXR3/mGxB/9nV0v/l5eX/5OTk/+Tk
- 5P3a2trx2NjY77i4uLRRUVEmAAAAAAAAAAAAAAAAAAAABwAAADYAAABn9PT0++np6P/T09P/8fHx//b2
- 9f/29vb/9/f3//f39//4+Pj/+fn5/+vr6//IyMj/6enp/+vr6//t7e3/7+/v//Ly8v/r6+v/q5iG/4tY
- J/+rain/unYy/8WTYf/Uwa//3tvY/97Vzf/Yv6b/yZNf/8GBQf++ezf/tm8p/6ZhHP+NVh7/sp2J/+Hh
- 4f/k5OT/4uLi/tjY2OuIiIh5iYmJZ25ubkciIiILAAAAAAAAAAAAAAAAAAAABwAAADYAAABn9PTz+9/f
- 3/+4uLj/6+vr//X19f/19fX/9vb2//f39//4+Pj/+Pj4//X19f/MzMz/3d3d/+bm5v/k5OT/7+/v//X1
- 9f/39/f/3t3b/6SPev+IUBn/nVoW/65lHP+0bif/vH0+/7t3NP+6civ/t28m/7NqIP+rYhn/mVMO/4dL
- D/+mjXT/2NXT/+Pj4//h4eH/4ODg+q2trasDAwMQAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAA
- ADYAAABn8/Pz+/Hx8f/t7ez/8/Pz//T09P/19fX/9vb2//X19f/29vb/9/f3//f39//n5+f/u7u7/8DA
- wP/FxcX/3Nzc//f39//5+fn/9vb2/9nX1f+agGb/gk0Y/5BMCP+bUQf/o1YJ/6ZZC/+mWQv/o1YK/5pQ
- B/+PSQT/gkkS/51+YP/Sz8z/4eHh/+Hh4f/f39//3t7e+aysrKsJCQkUAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAABwAAADYAAABn8/Pz+/Hx8f/w8PD/8/Py//T09P/09PT/9fX1/97e3v/Pz8//ysrK/8rK
- yv/R0dH/zMzM/8/Pz//Ozs7/sLCw//Hx8f/7+/v/+vr6//j4+P/h4OD/urCn/45sS/+DUSH/gUYL/4NF
- B/+ERAf/gkYL/4NRIP+Pakb/vLGn/9fW1v/h4eH/4ODg/97e3v/c3Nz/29vb/9zc3PaIiIh0BgYGDAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAADYAAABn8/Py++Li4f/FxcX/7Ozs//T08//09PT/9fX1/+/v
- 7//j4+P/5+fn/9nZ2f/h4eH/3d3d/9nZ2f/Y2Nj/v7+///Pz8//6+vr/+Pj4//f39//z8/P/6unp/9PQ
- zf+8sqn/qJWD/6GKdP+hinP/qJWC/7qwpv/Oy8f/3d3d/+Hh4f/f39//3t7e/93d3f/a2tr/2NjY/tzc
- 3PmVlZV+CAgIDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAADYAAABn8vLy++Pj4v/CwsH/7Ozr//Pz
- 8//09PP/9PT0//X19P/29vb/9vb2//Dw8P/x8fH/+Pj4//j4+P/U1NT/29vb//n5+f/4+Pj/9vb2//X1
- 9f/y8vL/8PDw/+7u7v/s7Oz/5ubm/+Li4v/h4eH/4uLi/+Pj4//i4uL/4ODg/9/f3//g4OD/29vb/9TU
- 1P/b29v/2tra9bW1ta8jIyMdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAADYAAABn8vLy+/Dw
- 8P/x8fD/8vLx//Pz8v/z8/P/9PTz//T09P/19fX/9vb2//b29v/39/f/+Pj3//j4+P/Z2dn/zs7O//T0
- 9P/29vb/8vLy/+np6f/v7+//7+/v/+zs7P/r6+v/6enp/+fn5//l5eX/5OTk/+Li4v/g4OD/3t7e/9/f
- 3//X19f/yMjI/9LS0v/IyMj/oKCgsVlZWUEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAA
- ADYAAABn8vLy++7u7v/r6+v/8fHw//Ly8f/y8vL/8/Pz/+jo5//g4OD/4uLi/+Tk5P/p6en/3t7d/9fX
- 1//b29v/xsbG/8LCwv/g4OD/wMDA/7m5uf+1tbX/2NjY/+vr6//o6Oj/5ubm/+bm5v/l5eX/5OTk/+Pj
- 4//e3t7/29vb/93d3f/Ozs7/5eXl//r6+v/z8/P/GhoaOwAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAABwAAADYAAABn8vLy+9vb2v+4uLj/6eno//Hx8f/y8vH/8/Py/+Tk5P/X19f/09PS/8zM
- zP/W1tb/0dHR/9PT0//Nzc3/09PT/8TExP+wsLD/u7u7/83Nzf+6urr/xsbG/+rq6v/m5ub/5eXl/+Hh
- 4f/Hx8f/xcXF/9ra2v/e3t7/2dnZ/9vb2//U1NT/4uLi//v7+//8/Pz/ICAgLwAAAAgAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAADYAAABn8vLx++jo5//R0dH/7Ozs//Hx8P/x8fH/8vLx//Ly
- 8v/z8/P/9PTz//T09P/19fT/9fX1//b29v/39/b/9/f3//b29v/n5+f/9PT0//f39//Y2Nj/z8/P/+np
- 6f/m5ub/5ubm/83Nzf/j4+P/7+/v/8nJyf/c3Nz/29vb/9fX1//Ly8v/6Ojo//r6+v/8/Pz/ICAgLwAA
- AAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAADYAAABn8fHx++7u7f/v7+7/8PDv//Dw
- 8P/x8fD/8vLx//Ly8f/z8/L/8/Pz//T09P/09PT/9fX1//X19f/29vb/9vb2//f39//39/f/+Pj4//j4
- +P/w8PD/0NDQ/8vLy//Ozs7/09PT/8rKyv/29vb/+fn5/97e3v/IyMj/zs7O/9fX1//r6+v/+Pj4//r6
- +v/7+/v/ICAgLwAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAADYAAABn8fHw++vr
- 6v/j4+P/7e3t//Dw7//w8O//8fHw/+zs7P/p6en/6+vq/+zs7P/t7ez/7Ozr/+/v7v/w8O//9fX1/+/v
- 7v/t7e3/7u7u/+/v7//09PT/7+/v/+jo6P/i4uL/19fX/+Tk5P/w8PD/8PDw/+7u7v/w8PD/+Pj4//n5
- +f/6+vr/+vr6//r6+v/7+/v/ICAgLwAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAA
- ADYAAABn8fHw+9fX1/+tra3/5eXl/+/v7//w8O//8PDw/93d3P/U1NP/ysrK/9jY2P/Ozs3/1dXV/9bW
- 1v/U1NT/7u7u/+Tk4//Pz8//1tbW/9zc3P/s7Oz/2dnZ/9LS0v/V1dX/zMzM/9LS0v/S0tL/0dHR/+zs
- 7P/19fX/+fn5//n5+f/5+fn/+fn5//n5+f/7+/v/ICAgLwAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAABwAAADYAAABn8PDv++rq6f/g4N//7Ozs/+7u7v/v7+7/7+/v/+zs7P/T09P/3Nzb/9zc
- 3P/Q0ND/5ubm/9zc2//n5+f/5OTk/+zs7P/p6en/4ODg/9fX1//u7u7/5eXl/+bm5v/q6ur/3t7e/+np
- 6f/k5OT/1dXV/+jo6P/39/f/+Pj4//j4+P/4+Pj/+Pj4//j4+P/6+vr/ICAgLwAAAAgAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAADYAAABn8PDv++zs6//t7ez/7e3s/+7u7f/u7u3/7+/u/+/v
- 7//q6un/6+vq//Hx8P/o6Oj/7+/v//Ly8v/z8/P/8/Pz//T09P/09PT/8fHx//Dw8P/09PT/9vb1//b2
- 9v/29vb/9vb2//f39v/39/f/8/Pz//T09P/39/f/9/f3//f39//39/f/9/f3//f39//5+fn/ICAgLwAA
- AAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAADYAAABn7+/v++bm5f/c3Nv/6+vq/+3t
- 7P/u7u3/7u7t/+/v7v/v7+//8PDv//Dw8P/x8fD/8fHx//Ly8f/y8vL/8/Py//Pz8//z8/P/7u7u//Dw
- 8P/y8vL/9PTz//X19f/19fX/9vb1//b29f/29vb/9vb2//b29v/29vb/9vb2//b29v/29vb/9vb2//b2
- 9v/5+fn/ICAgLwAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAADYAAABn7+/v+9fX
- 1/+rq6v/5OTj/+3t7P/t7ez/7u7t/+Tk4//a2tr/3Nzb/+Dg3//l5eT/39/e/9/f3v/b29v/4uLh/+Hh
- 4f/n5+b/1tbV/9ra2v/d3d3/2tra/9/f3//c3Nz/5OTj/9/f3v/s7Oz/9fX1//b29f/29vX/9vb1//b2
- 9v/29vb/9vb2//b29f/4+Pj/ICAgLwAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAA
- ADYAAABn7+7u++np6P/l5eT/6+vq/+zs6//s7Ov/7e3s/+Hh4f/c3Nv/2trZ/83Nzf/R0dH/0dHR/9bW
- 1f/Jycn/zMzM/93d3P/g4N//19fX/9LS0f/W1tb/0NDQ/9nZ2f/T09P/0dHR/8rKyv/p6en/8/Pz//X1
- 9P/19fT/9fX0//X19P/19fX/9fX0//X19P/4+Pj/ICAgLwAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAABwAAADYAAABn7u7t++np6P/q6un/6+vq/+vr6v/s7Ov/7Ozs/+jo5//h4eH/6urp/+jo
- 5//r6+v/5+fn/+vr6v/r6+v/6urq/+3t7f/w8PD/5+fm/+Xl5P/t7e3/7u7t/+/v7//v7+//7e3t/+vr
- 6//z8/L/9PTz//T09P/09PT/9PT0//T09P/09PT/9PT0//T09P/39/f/ICAgLwAAAAgAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAADYAAABn7u3s++Dg3//Pz87/5+fm/+rq6f/r6+r/6+vq/+zs
- 6//t7ez/7e3s/+3t7f/u7u3/7u7t/+/v7v/v7+7/7+/v//Dw7//w8O//8fHw//Hx8P/x8fH/8fHx//Ly
- 8f/y8vH/8vLy//Ly8v/y8vL/8/Py//Pz8v/z8/L/8/Py//Pz8v/z8/L/8/Py//Pz8v/29vb/ICAgLwAA
- AAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAADYAAABn7e3s+9fX1/+wsK//4uLh/+rq
- 6f/q6un/6+vq/+vr6v/s7Ov/7Ozr/+3t7P/t7ez/7u7t/+7u7f/v7+7/7+/u/+/v7//w8O//8PDv//Dw
- 7//x8fD/8fHw//Hx8P/x8fH/8fHx//Ly8f/y8vH/8vLx//Ly8v/y8vL/8vLy//Ly8v/y8vL/8vLy//Ly
- 8v/29vb/ICAgLwAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAADYAAABn7Ozs++bm
- 5f/n5+b/6Ofm/+no5//p6ej/6urp/+rq6f/r6+r/7Ozr/+zs6//s7Ov/7e3s/+3t7P/u7u3/7u7t/+7u
- 7v/v7+7/7+/u/+/v7//w8O//8PDv//Dw7//w8PD/8fHw//Hx8P/x8fD/8fHw//Hx8f/x8fH/8fHx//Hx
- 8f/x8fH/8fHx//Hx8f/29vX/ICAgLwAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAA
- ADYAAABn7Ozr++bl5P/n5uX/5+fm/+jo5//o6Of/6eno/+rq6f/q6un/6+vq/+zs6//s7Ov/7Ozr/+3t
- 7P/t7ez/7e3t/+7u7f/u7u3/7u7u/+/v7v/v7+7/7+/v/+/v7//w8O//8PDv//Dw7//w8PD/8PDw//Dw
- 8P/x8fD/8fHw//Hx8P/x8fD/8fHw//Hx8P/19fX/ICAgLwAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAABgAAADMAAABi3Nzc4tjY1+TY2Nfk2djY5NnZ2OTa2dnk2trZ5Nva2uTb29rk29vb5Nzc
- 2+Tc3Nvk3Nzc5N3d3OTd3dzk3d3d5N3d3eTd3d3k3d3d5N7e3eTe3t3k3t7d5N7e3uTe3t7k39/e5N/f
- 3uTf397k39/e5N/f3uTf39/k39/f5N/f3+Tf39/k39/f5N/f3+Tm5ubhGxsbKwAAAAcAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAACYAAABIWlpabltbW29bW1tvW1tbb1tbW29bW1tvW1tbb1tb
- W29bW1tvW1tbb1tbW29bW1tvW1tbb1tbW29bW1tvW1tbb1tbW29bW1tvW1tbb1tbW29bW1tvW1tbb1tb
- W29bW1tvW1tbb1tbW29bW1tvW1tbb1tbW29bW1tvW1tbb1tbW29bW1tvW1tbb1xcXG5nZ2diBwcHHgAA
- AAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAsAAAAWAAAAHAAAABwAAAAcAAAAHAAA
- ABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAA
- ABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAA
- ABsAAAAWAAAACQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAwAA
- AAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAA
- AAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAA
- AAMAAAADAAAAAwAAAAMAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAA///gAAAHAADwAAAAAAcAAOAA
- AAAD/wAA4AAAAAI/AADgAAAAAA8AAOAAAAAADwAA4AAAAAAPAADgAAAAAA8AAOAAAAAACwAA4AAAAAAB
- AADgAAAAAAAAAOAAAAAAAAAA4AAAAAAAAADgAAAAAAAAAOAAAAAAAAAA4AAAAAADAADgAAAAAAAAAOAA
- AAAAAAAA4AAAAAAAAADgAAAAAAAAAOAAAAAAAAAA4AAAAAAAAADgAAAAAAMAAOAAAAAABwAA4AAAAAAD
- AADgAAAAAAMAAOAAAAAABwAA4AAAAAAHAADgAAAAAA8AAOAAAAAADwAA4AAAAAAPAADgAAAAAA8AAOAA
- AAAADwAA4AAAAAAPAADgAAAAAA8AAOAAAAAADwAA4AAAAAAPAADgAAAAAA8AAOAAAAAADwAA4AAAAAAP
- AADgAAAAAA8AAOAAAAAADwAA4AAAAAAPAADgAAAAAA8AAOAAAAAADwAA4AAAAAAPAADgAAAAAA8AAPAA
- AAAAHwAAKAAAACAAAABAAAAAAQAgAAAAAACAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAANAAAAGQAAACMAAAAsAAAANQkJ
- CUMDAwNAAAAAOwoKCkkmJiZhGBgYUQQEBDsAAAAvAAAAKAAAAB8AAAAVAAAACAAAAAAAAAAAAAAAAAAA
- AAAAAAAEAAAAGIqKijWKioo2ioqKNoqKijaKioo2ioqKNoqKijaKioo2ioqKNoqKijaIiIg3h4eHOGNj
- Y0R3d3d/n5+fv3Nzc38HBwcUeXl5ab6+vuq4uLjcbm5uYQAAAAUAAAADAAAAAQAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAAAAAAA8AAABN8PDw6PHx8ery8vLq8/Pz6vPz8+r09PTq9PT06vX19er29vbq9vb26vb2
- 9ur19fXqzc3N7sLCwvvKysr+vr6+9Z2dnbK5ubnT1tbW/tnZ2f6QkJCDCgoKCmlpaT1iYmI3AQEBAgAA
- AAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAAAFv29vb89vb2//j4+P/5+fn/+vr6//v7+//7+/v//Pz8//z8
- /P/x8fH/z8/P/+fn5//Ly8v/x8fH/87Ozv/R0dH+1NTU/tfX1/7a2tr/3d3d/s3NzeWoqKioz8/P4c7O
- zuFycnJOAQEBAgAAAAAAAAAAAAAAAAAAAAAAAAASAAAAW/Pz8/zFxcX/8vLy//n5+f/6+vr/+/v7//v7
- +//8/Pz/9fX1/8bGxv/IyMj/wcHB/8jIyP/Pz8//09PT/9jX1//c29v/3t3d/+Dg4P/j4+P/5eXl/ujo
- 6P7s7Oz/7e3t/rCwsKoMDAwJAAAAAAAAAAAAAAAAAAAAAAAAABIAAABb9vb2/PHx8f/39/f/+fn5//r6
- +v/7+/v/+/v7//z8/P/i4uL/w8PD/8rKyv/Nzc3/0NDQ/9fX1//VzcX/xrWl/8vDvP/IvrX/wbGi/8zB
- tf/l4uD/7e3t//Dw8P/p6en8cHBwWQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAEgAAAFv19fX85OTk//b2
- 9v/5+fn/+fn5//b29v/29vb/9/f3//Hx8f/FxcX/z8/P/9HR0f/Z2Nf/xa+Y/62FXv/Zz8X/28Oq/71/
- Qf+uZBr/o1kQ/6ZzQf/b0MT/9PT0//X19f6+vr62l5eXbYCAgFYjIyMEAAAAAAAAAAAAAAASAAAAW/T0
- 8/zR0dH/9PTz//n5+f/39/f/2NjY/9nZ2f/Nzc3/vb29/7W1tf/T09P/19fX/8e1o/+fYyj/3M7B/+PU
- xf+0ZRj/s2MU/7lvJv+5cir/r2IW/6RsNP/p4tv/+/v7/vb29v3x8fH7z8/P01RUVBsAAAAAAAAAAAAA
- ABIAAABb9vb1/PX19f/39/f/+fn5//n5+f/z8/P/7e3t/8bGxv/Nzc3/1NTU/9fX1//d29n/l10j/8CQ
- YP/m5uX/yJdm/7JhEf+0Zhj/tmgc/7lwJv+7dC7/rGAU/7iTbf/39vX/9/f3//T09P7h4eHwcnJyQwAA
- AAAAAAAAAAAAEgAAAFvy8vL8y8vL//Ly8v/4+Pj/+fn5//T09P/t7e3/ysrK/9XV1f/Y2Nj/3Nzc/8S1
- pf+bTgP/y6qJ/+Pj4v/Fkl7/tWca/7JjEv+wXQr/r1oF/7NjEv+1aRz/oGEj/+nk3v/z8/P/4+Pj8Jqa
- mnc/Pz8RAAAAAAAAAAAAAAASAAAAW/T09Pzq6ur/9fX1//j4+P/39/f/4ODg/9TU1P+9vb3/0dHR/93d
- 3f/g4OD/r5R5/6VTBP/LrY7/4ODg/9CwkP+xYBD/r1oF/65XAP+uVwD/rlgC/7RmGP+iXhr/2s7C/+/v
- 7/7Z2dnkWlpaLQAAAAAAAAAAAAAAAAAAABIAAABb9PT0/Ovr6//19fX/9/f3//j4+P/t7e3/8vLy//Dw
- 8P/MzMz/4ODg/+Pj4/+rjnL/p1gJ/8addv/c3Nz/3trW/8CGTP+2ah7/tGYY/7BdCv+uVwD/sF0L/6Ni
- If/Vyb3/7Ozs/uXl5fnCwsK9fX19SwAAAAAAAAAAAAAAEgAAAFvx8fH8x8fH//Dw8P/39/f/+Pj4//n5
- +f/5+fn/6+vr/8rKyv/k5OT/5+fn/7mol/+hWRH/voJG/9zW0f/k5OT/5+Th/9i4mP/LlWD/xotQ/714
- M/+wYhT/oGct/9zW0P/o6Oj/5eXl/uPj4/6goKB9AAAAAAAAAAAAAAASAAAAW/T08/z09PT/9fX1//b2
- 9v/39/f/+Pj4//f39//Kysr/5eXl/+rq6v/s7Oz/2dXS/5VeKf+6eTn/z66N/+De3P/m5ub/5NrP/82b
- af/Fik7/vns4/6pnI/+ohGD/4uHg/+Xl5f7g4OD42dnZ8IiIiFIAAAAAAAAAAAAAABIAAABb8fHw/MvL
- y//w8PD/9vb1//f39//4+Pj/+Pj4/9HR0f/p6en/7e3t//Hx8f/w8PD/rZiE/5leI/+2dDH/yKB2/9S+
- qP/QrYn/woVI/7t2Mf+qZB//k10n/8m/tf/j4+P/39/f96Kion2EhIRDR0dHEAAAAAAAAAAAAAAAEgAA
- AFvy8vL85eXl//Ly8v/19fX/9vb2//b29v/39/f/5+fn/8TExP/Nzc3/6Ojo//j4+P/p5+b/oohu/4xP
- E/+fVg7/ql8U/6xgE/+nWxD/mVIK/4lSG/+5qZn/4ODf/+Dg4P/X19fpY2NjNwAAAAAAAAAAAAAAAAAA
- AAAAAAASAAAAW/Ly8vzq6ur/8vLy//T09P/y8vL/1dXU/9HR0f/R0dH/0NDQ/9HR0f/Gxsb/+fn5//n5
- +f/s7Oz/vLGm/5NvTf+HVCH/h1Ab/4lZKv+bfWD/zMbB/+Dg4P/f39//3Nzc/9vb2/23t7ekBwcHCQAA
- AAAAAAAAAAAAAAAAABIAAABb7+/v/MXFxf/u7u3/9PTz//T09P/z8/P/8/Pz/+rq6v/v7+//39/f/+Dg
- 4P/5+fn/9vb2//Pz8//v7+//5OTk/9fV0//Sz8z/19bU/9/e3v/h4eH/39/f/9ra2v/a2tr/1tbW7piY
- mGIEBAQCAAAAAAAAAAAAAAAAAAAAEgAAAFvx8fH88fHw//Ly8f/z8/L/8/Pz//Dw8P/y8vL/9PT0//Hx
- 8f/j4+P/0tLS//Hx8f/h4eH/29vb/+zs7P/q6ur/5+fn/+Xl5f/j4+P/4ODg/93d3f/Y2Nj/19fX/9jY
- 2P6CgoJ0IyMjCQAAAAAAAAAAAAAAAAAAAAAAAAASAAAAW+/v7vzNzc3/7e3t//Ly8f/w8PD/2dnZ/9TU
- 0//X19f/09PT/87Ozv/Ly8v/vLy8/7y8vP++vr7/1NTU/+fn5//l5eX/19fX/9PT0//f39//2tra/9bW
- 1v/r6+v/+vr6/hsbGyUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAABb8PDv/N/f3//u7u7/8fHx//Ly
- 8f/z8/L/9PTz//X19P/19fX/9vb2//f39//w8PD/9vb2/+fn5//W1tb/4+Pj/9/f3//b29v/5ubm/9TU
- 1P/W1tb/0tLS//Hx8f/7+/v+GxsbIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAAAFvv7+/86Ojo/+/v
- 7v/w8O//8fHw/+3t7P/t7e3/8PDv/+/v7//y8vL/9fX1//Dw8P/x8fH/8/Pz/+Li4v/X19f/1NTU/+3t
- 7f/y8vL/4uLi/+zs7P/39/f/+vr6//r6+v4bGxsjAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAASAAAAW+3t
- 7PzExMT/6urq/+/v7v/t7e3/1NTU/9LS0v/Q0ND/2dnZ/9bW1v/r6+v/19fX/9bW1v/n5+f/2NjY/9ra
- 2v/Q0ND/1tbW/9bW1v/z8/P/+fn5//n5+f/5+fn/+vr6/hsbGyMAAAABAAAAAAAAAAAAAAAAAAAAAAAA
- ABIAAABb7u7u/Ovr6v/t7ez/7u7t/+/v7v/n5+f/6eno/+Xl5f/t7e3/8PDw//Ly8f/y8vL/7Ozs//Dw
- 8P/z8/L/9PT0//Pz8v/09PT/7u7u//b29v/39/f/9/f3//f39//5+fn+GxsbIwAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAAAEgAAAFvs7Oz809PS/+rq6f/u7u3/7u7t/+zs6//t7ez/7u7u/+7u7v/v7+7/7+/v//Hx
- 8f/n5+f/7+/v//Dw8P/x8fH/8vLy//Pz8//29vb/9vb2//b29v/29vb/9vb2//j4+P4bGxsjAAAAAAAA
- AAAAAAAAAAAAAAAAAAAAAAASAAAAW+zs6/zV1dT/6eno/+zs6//r6+r/2NjY/9XV1f/U1NT/0tLS/9DQ
- 0P/S0tL/4eHg/9HR0f/X19f/09PT/9PT0//T09L/39/f//T09P/19fT/9fX0//X19f/19fX/9/f3/hsb
- GyMAAAABAAAAAAAAAAAAAAAAAAAAAAAAABIAAABb7Ozr/Ojn5v/r6un/6+vq/+zs6//m5uX/6urp/+zs
- 6//q6ur/7e3s/+zs7P/w8O//6enp/+3t7P/w8O//8PDw/+/v7v/x8fH/8/Pz//Pz8//09PP/9PTz//T0
- 8//29vb+GxsbIwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAEgAAAFvp6Oj8vb29/+Xl5P/q6un/6+vq/+zs
- 6//s7Oz/7e3s/+7u7f/u7u7/7+/u//Dw7//w8O//8PDw//Hx8P/x8fH/8fHx//Ly8f/y8vH/8vLy//Ly
- 8v/y8vL/8vLy//X19f4bGxsjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAAAAW+rq6fzn5uX/6Ofm/+np
- 6P/q6un/6+vq/+zs6//s7Ov/7e3s/+3t7f/u7u3/7u7u/+/v7v/v7+//8PDv//Dw7//w8PD/8fHw//Hx
- 8P/x8fD/8fHw//Hx8P/x8fD/9PT0/hsbGyMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEAAABY4ODf693d
- 3O3e3t3t397e7eDf3u3g4N/t4eHg7eHh4e3i4uHt4uLi7ePj4u3j4+Pt4+Pj7eTk4+3k5OTt5OTk7eXl
- 5O3l5eTt5eXk7eXl5e3l5eXt5eXl7eXl5e3q6unrGRkZIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAA
- ADRNTU1WTk5OV05OTldOTk5XTk5OV05OTldOTk5XTk5OV05OTldOTk5XTk5OV05OTldOTk5XTk5OV05O
- TldOTk5XTk5OV05OTldOTk5XTk5OV05OTldOTk5XTk5OVlZWVk4FBQUSAAAAAAAAAAAAAAAAAAAAAAAA
- AAAAAAABAAAABgAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAA
- AAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAABwAAAAIAAAAAAAAAAAAA
- AAD/8AADwAAAD8AAAAfAAAADwAAAA8AAAAPAAAAAwAAAAMAAAADAAAAAwAAAAcAAAADAAAAAwAAAAMAA
- AADAAAADwAAAAcAAAAHAAAADwAAAB8AAAAfAAAADwAAAA8AAAAfAAAAHwAAAA8AAAAPAAAAHwAAAB8AA
- AAfAAAAHwAAABygAAAAYAAAAMAAAAAEAIAAAAAAAYAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- AAEAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAAFAAAAEQAAABwAAAAnCwsLPxMTE0gAAAAyQEBAakBA
- QGkKCgo3AAAAJAAAABkAAAAOAAAAAgAAAAAAAAAAAAAAAQAAAC3W1taV19fXl9fX15fY2NiX2NjYl9nZ
- 2ZfZ2dmX2tral9nZ2ZeoqKiouLi45q2trdJkZGRPwMDA3tTU1P2IiIhYAwMDAxsbGwwAAAAAAAAAAAAA
- AAAAAAAAAAAAAwAAAE729vb99/f3//n5+f/6+vr/+/v7//z8/P/8/Pz/5eXl/+jo6P/Kysr/zMzM/9DQ
- 0P/S0tL+2NjY/tzc3P+9vb3Cq6urm8bGxtJsbGwuAAAAAAAAAAAAAAAAAAAAAwAAAE7u7u7929vb//n5
- +f/6+vr/+/v7//z8/P/o6Oj/xMTE/8XFxf/Ly8v/0tLS/9rZ2f/c29r/3t3d/+Tk5P/m5ub/6+vr/+3t
- 7f6hoaF5AAAAAAAAAAAAAAAAAAAAAwAAAE729vb99/f3//n5+f/6+vr/+/v7//z8/P/g4OD/yMjI/8/P
- z//W1tb/yrmn/8CqlP/QwrT/tYpf/62AVP/Pva3/8PDw/+/v7/2Hh4dePT09HgYGBgIAAAAAAAAAAwAA
- AE7u7u792tra//n5+f/y8vL/2tra/9nZ2f/Gxsb/xMTE/9XV1f/CrJb/tYhd/+fd1P+4byb/tmoe/7ds
- Iv+mXBL/zLSd//r6+v/t7e334uLi8W1tbTEAAAAAAAAAAwAAAE719fX99PT0//j4+P/6+vr/8vLy/8/P
- z//Pz8//19fX/9rX1P+aWBb/282//8+pg/+zZBX/tWYZ/7ZqHv+5cSj/o2Ad/+/r5//29vb/7Ozs+pSU
- lGEAAAAAAAAAAwAAAE7u7u793Nzc//j4+P/19fX/6enp/8XFxf/Y2Nj/3Nzc/8KxoP+lVwn/3djU/9Cv
- jf+zYxP/r1sH/65XAf+wXgv/rWIX/867p//x8fH/tLS0lA4ODgQAAAAAAAAAAwAAAE7z8/P98PDw//f3
- 9//09PT/6enp/+Xl5f/Ozs7/4uLi/7mjjf+qWwz/183E/93X0v+6dzP/tGQV/7BdCf+uVwD/r2QZ/8Wt
- lv/s7Oz/z8/Pz5CQkEkAAAAAAAAAAwAAAE7t7e393d3d//f39v/4+Pj/+fn5/+fn5//U1NT/5+fn/8m+
- s/+kXRb/zayL/+Pj4//n4t7/0aV5/8eNVP+8djH/pV4X/9DEt//n5+f/5OTk/7m5uZgAAAAAAAAAAwAA
- AE7x8fH96+vr//b29v/39/f/+fn5/9fX1//p6en/7e3t/+no6P+abkT/uns8/9TAq//i39z/1bKQ/8KE
- Rf+0byr/nW9C/+Hg3//h4eH5v7+/sJSUlEsAAAAAAAAAAwAAAE7u7u794eHg//X19f/29vb/9/f3/+jo
- 6P/Pz8//3d3d//f39//Vzsj/kF0r/6NcFP+waSH/rmQa/6JZEf+QWST/zMS9/+Hh4f/KysrSBgYGCQAA
- AAAAAAAAAAAAAwAAAE7u7u795eXl//T09P/u7u7/2dnZ/9XV1f/U1NT/xcXF//b29v/4+Pj/3tvZ/6iQ
- eP+Ta0L/lGpC/6eNdf/U0c//4ODg/9zc3P/b29v7gYGBQwAAAAAAAAAAAAAAAwAAAE7u7u395OTj//Pz
- 8//09PT/9fX1//Pz8//4+Pf/1dXV//f39//x8fH/8PDw/+zs7P/m5ub/4+Pj/+Li4v/f39//1tbW/9LS
- 0v+0tLSlICAgCAAAAAAAAAAAAAAAAwAAAE7r6+v939/f//Ly8f/s7Oz/29vb/9zc3P/W1tb/0NDQ/8bG
- xv/AwMD/w8PD/+np6f/l5eX/1dXV/97e3v/b29v/2tra//n5+f8YGBgfAAAAAAAAAAAAAAAAAAAAAwAA
- AE7u7u395+fm//Hx8P/y8vH/8/Pz//T09P/19fX/9vb2//Pz8//39/f/2tra/9ra2v/U1NT/8PDw/9PT
- 0//W1tb/5ubm//v7+/8bGxsbAAAAAAAAAAAAAAAAAAAAAwAAAE7p6ej92dnZ//Dw7//q6ur/3Nzc/+Dg
- 3//h4eH/6urq/+Tk4//j4+P/6urq/9zc3P/W1tb/4eHh//Dw8P/5+fn/+fn5//r6+v8bGxsbAAAAAAAA
- AAAAAAAAAAAAAwAAAE7t7ez96eno/+7u7f/u7u7/4eHg/+Hh4f/p6ej/7Ozs/+/v7//m5ub/7+/v/+/v
- 7//t7e3/6enp//Ly8v/39/f/9/f3//n5+P8bGxsbAAAAAAAAAAAAAAAAAAAAAwAAAE7n5+b91dXV/+3t
- 7P/s7Ov/5eXl/+np6f/o6Oj/6Ojo/+zs6//j4+P/5+fn/+np6f/r6+v/8/Pz//b29f/29vb/9vb2//f3
- 9/8bGxsbAAAAAAAAAAAAAAAAAAAAAwAAAE7s6+v96eno/+zs6//p6ej/4ODf/9zc3P/e3t7/29va/+fn
- 5v/d3d3/4ODg/+Pj4v/d3d3/8fHw//T09P/09PT/9PT0//b29v8bGxsbAAAAAAAAAAAAAAAAAAAAAwAA
- AE7k5OT90tLR/+rq6f/r6+r/7Ozr/+3t7P/u7u3/7+/u//Dw7//w8PD/8fHw//Hx8f/y8vH/8vLx//Ly
- 8v/y8vL/8vLy//T09P8bGxsbAAAAAAAAAAAAAAAAAAAAAwAAAE7p6ej95+fm/+jo5//q6un/6+vq/+zs
- 6//t7ez/7e3t/+7u7f/v7+7/7+/v//Dw7//w8O//8PDw//Hx8P/x8fD/8fHw//Pz8/8bGxsbAAAAAAAA
- AAAAAAAAAAAAAgAAAEGwsLCpr6+vqrCwr6qxsLCqsbGxqrKysaqysrKqsrKyqrOzsqqzs7Oqs7OzqrOz
- s6q0tLOqtLSzqrS0tKq0tLSqtLS0qrq6uqUQEBAVAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAPAAAADwAA
- AA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAA
- AA0AAAACAAAAAAAAAADAAAEAgAAHAIAAAwCAAAMAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAA
- AQCAAAEAgAABAIAAAwCAAAMAgAADAIAAAwCAAAMAgAADAIAAAwCAAAMAgAADAMAAAwAoAAAAEAAAACAA
- AAABACAAAAAAAEAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeIiIgbiIiIG4iIiBuIiIgbeHh4H1dX
- VytLS0tJZmZmcDQ0NECPj4+eNDQ0NAAAABMAAAAHAAAAAAAAAAAAAAAy8/Pz8/b29vT39/f0+Pj49Pb2
- 9vTo6Oj0yMjI+srKyvzExMTg2tra/q6uroe5ubmNbGxsFAAAAAAAAAAAAAAAN+jo6P339/f/+vr6//v7
- +//Y2Nj/yMjI/9DQ0P/Ry8X/087K/9TNxv/o5+f+7e3t/pSUlEMAAAAAAAAAAAAAADfn5+f99/f3/+/v
- 7//l5eX/ysrK/9PT0//BqI//0b6q/8CDRv+xZx//tYRU//Px8P7a2trHrq6uUgAAAAAAAAA36urq/ff3
- 9//29vb/2tra/9TU1P/V0cz/r3lE/9a8o/+zZBX/s2QU/7NoHP/Os5n/8PDw+7e3t28AAAAAAAAAN+/v
- 7/329vb/7+/v/93d3f/W1tb/x7mr/7d9RP/b0sn/tmsg/7BcCP+wXAn/vZZv/+fn5/ahoaFNAAAAAAAA
- ADfo6Oj99fX1//j4+P/p6en/39/f/9nUz/+rbS7/3NLI/+LXzP/JkVr/tW8p/8Goj//k5OT9ycnJrwAA
- AAAAAAA35eXl/fPz8//39/f/6urq/9ra2v/w8PD/tJl//6puMv+/ilb/r2ol/6BvPv/b2Nb/xsbGpXd3
- dxUAAAAAAAAAN+Tk5P3y8vL/6+vr/+Dg4P/c3Nz/5ubm//T09P/JvbH/rpJ3/7eij//b2dj/3Nzc/8nJ
- ybwGBgYDAAAAAAAAADfn5+f98fHw/+vr6//k5OT/3d3d/9PT0//Ozs7/5OTk/+Li4v/d3d3/2dnZ/+Xl
- 5f5kZGQpAAAAAAAAAAAAAAA36urp/fDw7//w8PD/8fHx//Pz8//z8/P/8PDw/9zc3P/f39//5OTk/+Pj
- 4//4+Pj+GxsbEgAAAAAAAAAAAAAAN+Li4v3t7ez/5ubm/9zc3P/j4+P/6enp/+bm5v/m5ub/4+Pj/+vr
- 6//4+Pj/+fn5/hsbGxIAAAAAAAAAAAAAADfg4N/96+vq/+fn5v/h4eH/4ODf/+Xl5P/g4N//4uLh/+bm
- 5v/19fX/9fX1//b29v4bGxsSAAAAAAAAAAAAAAA33t7e/enp6P/q6un/7Ozr/+3t7P/v7+7/7u7t//Dw
- 8P/x8fD/8/Py//Pz8v/09PT+GxsbEgAAAAAAAAAAAAAANuTj4/Xk4+L25eXk9ufn5vbo6Of26eno9urq
- 6fbq6ur26+vq9uvr6/br6+v27e3t9RoaGhEAAAAAAAAAAAAAABFGRkYvR0dHL0dHRy9HR0cvR0dHL0dH
- Ry9HR0cvR0dHL0dHRy9HR0cvR0dHL0pKSi0EBAQFAAAAAIABAACAAQAAgAEAAIAAAACAAAAAgAAAAIAA
- AACAAAAAgAAAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAAA=
-
-
-
\ No newline at end of file
diff --git a/tools/AddToChangelog/AddToChangelog/Program.cs b/tools/AddToChangelog/AddToChangelog/Program.cs
deleted file mode 100644
index 5ab64361f6..0000000000
--- a/tools/AddToChangelog/AddToChangelog/Program.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Windows.Forms;
-
-namespace AddToChangelog
-{
- static class Program
- {
- ///
- /// The main entry point for the application.
- ///
- [STAThread]
- static void Main()
- {
- Application.EnableVisualStyles();
- Application.SetCompatibleTextRenderingDefault(false);
- Application.Run(new MainForm());
- }
- }
-}
diff --git a/tools/AddToChangelog/AddToChangelog/Properties/AssemblyInfo.cs b/tools/AddToChangelog/AddToChangelog/Properties/AssemblyInfo.cs
deleted file mode 100644
index 5857e24764..0000000000
--- a/tools/AddToChangelog/AddToChangelog/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("AddToChangelog")]
-[assembly: AssemblyDescription("An open source application designed to allow the /tg/station open source project to easily add changelog notes to the changelog.html file.")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("Nanotrasen")]
-[assembly: AssemblyProduct("AddToChangelog")]
-[assembly: AssemblyCopyright("Copyright © 2013")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// Setting ComVisible to false makes the types in this assembly not visible
-// to COM components. If you need to access a type in this assembly from
-// COM, set the ComVisible attribute to true on that type.
-[assembly: ComVisible(false)]
-
-// The following GUID is for the ID of the typelib if this project is exposed to COM
-[assembly: Guid("3f069aeb-901f-4fc0-8104-29da028252dc")]
-
-// Version information for an assembly consists of the following four values:
-//
-// Major Version
-// Minor Version
-// Build Number
-// Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/tools/AddToChangelog/AddToChangelog/Properties/Resources.Designer.cs b/tools/AddToChangelog/AddToChangelog/Properties/Resources.Designer.cs
deleted file mode 100644
index b3b35d3f32..0000000000
--- a/tools/AddToChangelog/AddToChangelog/Properties/Resources.Designer.cs
+++ /dev/null
@@ -1,71 +0,0 @@
-//------------------------------------------------------------------------------
-//
-// This code was generated by a tool.
-// Runtime Version:4.0.30319.296
-//
-// Changes to this file may cause incorrect behavior and will be lost if
-// the code is regenerated.
-//
-//------------------------------------------------------------------------------
-
-namespace AddToChangelog.Properties
-{
-
-
- ///
- /// A strongly-typed resource class, for looking up localized strings, etc.
- ///
- // This class was auto-generated by the StronglyTypedResourceBuilder
- // class via a tool like ResGen or Visual Studio.
- // To add or remove a member, edit your .ResX file then rerun ResGen
- // with the /str option, or rebuild your VS project.
- [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
- internal class Resources
- {
-
- private static global::System.Resources.ResourceManager resourceMan;
-
- private static global::System.Globalization.CultureInfo resourceCulture;
-
- [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
- internal Resources()
- {
- }
-
- ///
- /// Returns the cached ResourceManager instance used by this class.
- ///
- [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
- internal static global::System.Resources.ResourceManager ResourceManager
- {
- get
- {
- if ((resourceMan == null))
- {
- global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("AddToChangelog.Properties.Resources", typeof(Resources).Assembly);
- resourceMan = temp;
- }
- return resourceMan;
- }
- }
-
- ///
- /// Overrides the current thread's CurrentUICulture property for all
- /// resource lookups using this strongly typed resource class.
- ///
- [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
- internal static global::System.Globalization.CultureInfo Culture
- {
- get
- {
- return resourceCulture;
- }
- set
- {
- resourceCulture = value;
- }
- }
- }
-}
diff --git a/tools/AddToChangelog/AddToChangelog/Properties/Resources.resx b/tools/AddToChangelog/AddToChangelog/Properties/Resources.resx
deleted file mode 100644
index af7dbebbac..0000000000
--- a/tools/AddToChangelog/AddToChangelog/Properties/Resources.resx
+++ /dev/null
@@ -1,117 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- text/microsoft-resx
-
-
- 2.0
-
-
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
-
\ No newline at end of file
diff --git a/tools/AddToChangelog/AddToChangelog/Properties/Settings.Designer.cs b/tools/AddToChangelog/AddToChangelog/Properties/Settings.Designer.cs
deleted file mode 100644
index 5165895d5a..0000000000
--- a/tools/AddToChangelog/AddToChangelog/Properties/Settings.Designer.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-//------------------------------------------------------------------------------
-//
-// This code was generated by a tool.
-// Runtime Version:4.0.30319.296
-//
-// Changes to this file may cause incorrect behavior and will be lost if
-// the code is regenerated.
-//
-//------------------------------------------------------------------------------
-
-namespace AddToChangelog.Properties
-{
-
-
- [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
- [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
- internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
- {
-
- private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
-
- public static Settings Default
- {
- get
- {
- return defaultInstance;
- }
- }
- }
-}
diff --git a/tools/AddToChangelog/AddToChangelog/Properties/Settings.settings b/tools/AddToChangelog/AddToChangelog/Properties/Settings.settings
deleted file mode 100644
index 39645652af..0000000000
--- a/tools/AddToChangelog/AddToChangelog/Properties/Settings.settings
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
diff --git a/tools/AddToChangelog/AddToChangelog/Thumbs.db b/tools/AddToChangelog/AddToChangelog/Thumbs.db
deleted file mode 100644
index 18cb6ca03e..0000000000
Binary files a/tools/AddToChangelog/AddToChangelog/Thumbs.db and /dev/null differ
diff --git a/tools/AddToChangelog/AddToChangelog/bugfix.png b/tools/AddToChangelog/AddToChangelog/bugfix.png
deleted file mode 100644
index 9934db406b..0000000000
Binary files a/tools/AddToChangelog/AddToChangelog/bugfix.png and /dev/null differ
diff --git a/tools/AddToChangelog/AddToChangelog/changelog.ico b/tools/AddToChangelog/AddToChangelog/changelog.ico
deleted file mode 100644
index 34cc7b4d40..0000000000
Binary files a/tools/AddToChangelog/AddToChangelog/changelog.ico and /dev/null differ
diff --git a/tools/AddToChangelog/AddToChangelog/experiment.png b/tools/AddToChangelog/AddToChangelog/experiment.png
deleted file mode 100644
index b2a4f670a8..0000000000
Binary files a/tools/AddToChangelog/AddToChangelog/experiment.png and /dev/null differ
diff --git a/tools/AddToChangelog/AddToChangelog/imageadd.png b/tools/AddToChangelog/AddToChangelog/imageadd.png
deleted file mode 100644
index 308c1ae0a2..0000000000
Binary files a/tools/AddToChangelog/AddToChangelog/imageadd.png and /dev/null differ
diff --git a/tools/AddToChangelog/AddToChangelog/imagedel.png b/tools/AddToChangelog/AddToChangelog/imagedel.png
deleted file mode 100644
index b2bac2c45a..0000000000
Binary files a/tools/AddToChangelog/AddToChangelog/imagedel.png and /dev/null differ
diff --git a/tools/AddToChangelog/AddToChangelog/rscadd.png b/tools/AddToChangelog/AddToChangelog/rscadd.png
deleted file mode 100644
index bcc4dc24b2..0000000000
Binary files a/tools/AddToChangelog/AddToChangelog/rscadd.png and /dev/null differ
diff --git a/tools/AddToChangelog/AddToChangelog/rscdel.png b/tools/AddToChangelog/AddToChangelog/rscdel.png
deleted file mode 100644
index e6f2d3228b..0000000000
Binary files a/tools/AddToChangelog/AddToChangelog/rscdel.png and /dev/null differ
diff --git a/tools/AddToChangelog/AddToChangelog/soundadd.png b/tools/AddToChangelog/AddToChangelog/soundadd.png
deleted file mode 100644
index ea7f36c6ba..0000000000
Binary files a/tools/AddToChangelog/AddToChangelog/soundadd.png and /dev/null differ
diff --git a/tools/AddToChangelog/AddToChangelog/sounddel.png b/tools/AddToChangelog/AddToChangelog/sounddel.png
deleted file mode 100644
index 1b9478f43e..0000000000
Binary files a/tools/AddToChangelog/AddToChangelog/sounddel.png and /dev/null differ
diff --git a/tools/AddToChangelog/AddToChangelog/tweak.png b/tools/AddToChangelog/AddToChangelog/tweak.png
deleted file mode 100644
index 1a59de688d..0000000000
Binary files a/tools/AddToChangelog/AddToChangelog/tweak.png and /dev/null differ
diff --git a/tools/AddToChangelog/AddToChangelog/wip.png b/tools/AddToChangelog/AddToChangelog/wip.png
deleted file mode 100644
index e22eb61b8f..0000000000
Binary files a/tools/AddToChangelog/AddToChangelog/wip.png and /dev/null differ
diff --git a/tools/AddToChangelog/icon.png b/tools/AddToChangelog/icon.png
deleted file mode 100644
index 3c60e6745c..0000000000
Binary files a/tools/AddToChangelog/icon.png and /dev/null differ