diff --git a/baystation12.dme b/baystation12.dme
index 7c4e4f1554..85449749da 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -325,6 +325,7 @@
#include "code\game\machinery\newscaster.dm"
#include "code\game\machinery\OpTable.dm"
#include "code\game\machinery\overview.dm"
+#include "code\game\machinery\portable_tag_turret.dm"
#include "code\game\machinery\portable_turret.dm"
#include "code\game\machinery\recharger.dm"
#include "code\game\machinery\rechargestation.dm"
@@ -848,6 +849,7 @@
#include "code\modules\events\disease_outbreak.dm"
#include "code\modules\events\electrical_storm.dm"
#include "code\modules\events\event.dm"
+#include "code\modules\events\event_container.dm"
#include "code\modules\events\event_dynamic.dm"
#include "code\modules\events\event_manager.dm"
#include "code\modules\events\grid_check.dm"
@@ -980,7 +982,6 @@
#include "code\modules\mob\living\carbon\human\examine.dm"
#include "code\modules\mob\living\carbon\human\human.dm"
#include "code\modules\mob\living\carbon\human\human_attackhand.dm"
-#include "code\modules\mob\living\carbon\human\human_attackpaw.dm"
#include "code\modules\mob\living\carbon\human\human_damage.dm"
#include "code\modules\mob\living\carbon\human\human_defense.dm"
#include "code\modules\mob\living\carbon\human\human_defines.dm"
diff --git a/baystation12.int b/baystation12.int
index b82874fded..ec374c2cd5 100644
--- a/baystation12.int
+++ b/baystation12.int
@@ -1,6 +1,11 @@
// BEGIN_INTERNALS
/*
MAP_ICON_TYPE: 0
+WINDOW: icons\obj\clothing\suits.dmi;code\modules\clothing\suits\storage.dm;code\modules\customitems\item_defines.dm
+LAST_COMPILE_VERSION: 506.1247
+DIR: code code\datums code\datums\diseases code\game code\game\jobs code\game\jobs\job code\game\objects code\game\objects\effects code\game\objects\structures code\game\objects\structures\crates_lockers code\game\objects\structures\crates_lockers\closets code\modules code\modules\clothing code\modules\clothing\suits code\modules\customitems icons icons\obj icons\obj\clothing
+FILE: code\modules\customitems\item_defines.dm
+LAST_COMPILE_TIME: 1415835747
AUTO_FILE_DIR: OFF
*/
// END_INTERNALS
diff --git a/code/ATMOSPHERICS/components/tvalve.dm b/code/ATMOSPHERICS/components/tvalve.dm
index a3555f5322..39ca1e25fd 100644
--- a/code/ATMOSPHERICS/components/tvalve.dm
+++ b/code/ATMOSPHERICS/components/tvalve.dm
@@ -172,9 +172,6 @@
/obj/machinery/atmospherics/tvalve/attack_ai(mob/user as mob)
return
-/obj/machinery/atmospherics/tvalve/attack_paw(mob/user as mob)
- return attack_hand(user)
-
/obj/machinery/atmospherics/tvalve/attack_hand(mob/user as mob)
src.add_fingerprint(usr)
update_icon(1)
diff --git a/code/ATMOSPHERICS/components/unary/cold_sink.dm b/code/ATMOSPHERICS/components/unary/cold_sink.dm
index b48e1c5cbe..a567cf5cd6 100644
--- a/code/ATMOSPHERICS/components/unary/cold_sink.dm
+++ b/code/ATMOSPHERICS/components/unary/cold_sink.dm
@@ -65,9 +65,6 @@
/obj/machinery/atmospherics/unary/freezer/attack_ai(mob/user as mob)
src.ui_interact(user)
-/obj/machinery/atmospherics/unary/freezer/attack_paw(mob/user as mob)
- src.ui_interact(user)
-
/obj/machinery/atmospherics/unary/freezer/attack_hand(mob/user as mob)
src.ui_interact(user)
diff --git a/code/ATMOSPHERICS/components/unary/heat_source.dm b/code/ATMOSPHERICS/components/unary/heat_source.dm
index db193cc2dd..6b25753ec8 100644
--- a/code/ATMOSPHERICS/components/unary/heat_source.dm
+++ b/code/ATMOSPHERICS/components/unary/heat_source.dm
@@ -18,7 +18,7 @@
use_power = 0
idle_power_usage = 5 //5 Watts for thermostat related circuitry
active_power_usage //50 kW. The power rating of the heater
-
+
var/max_power_usage = 20000 //power rating when the usage is turned up to 100
var/power_setting = 100
@@ -35,7 +35,7 @@
component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
component_parts += new /obj/item/weapon/stock_parts/capacitor(src)
component_parts += new /obj/item/weapon/stock_parts/capacitor(src)
-
+
active_power_usage = max_power_usage * (power_setting/100)
/obj/machinery/atmospherics/unary/heater/initialize()
@@ -86,9 +86,6 @@
/obj/machinery/atmospherics/unary/heater/attack_ai(mob/user as mob)
src.ui_interact(user)
-/obj/machinery/atmospherics/unary/heater/attack_paw(mob/user as mob)
- src.ui_interact(user)
-
/obj/machinery/atmospherics/unary/heater/attack_hand(mob/user as mob)
src.ui_interact(user)
@@ -164,10 +161,10 @@
/obj/machinery/atmospherics/unary/heater/proc/set_power_level(var/new_power_setting)
power_setting = new_power_setting
-
+
var/old_power_usage = active_power_usage
active_power_usage = max_power_usage * (power_setting/100)
-
+
if (use_power >= 2 && old_power_usage != active_power_usage)
force_power_update()
diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm
index fdae89d97e..6c71e72e27 100644
--- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm
+++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm
@@ -1,6 +1,6 @@
/obj/machinery/atmospherics/unary/vent_scrubber
icon = 'icons/atmos/vent_scrubber.dmi'
- icon_state = "map_scrubber"
+ icon_state = "map_scrubber_off"
name = "Air Scrubber"
desc = "Has a valve and pump attached to it"
@@ -30,6 +30,7 @@
/obj/machinery/atmospherics/unary/vent_scrubber/on
on = 1
+ icon_state = "map_scrubber_on"
/obj/machinery/atmospherics/unary/vent_scrubber/New()
..()
diff --git a/code/ATMOSPHERICS/components/valve.dm b/code/ATMOSPHERICS/components/valve.dm
index a57458d2e0..bce38d0654 100644
--- a/code/ATMOSPHERICS/components/valve.dm
+++ b/code/ATMOSPHERICS/components/valve.dm
@@ -130,9 +130,6 @@
/obj/machinery/atmospherics/valve/attack_ai(mob/user as mob)
return
-/obj/machinery/atmospherics/valve/attack_paw(mob/user as mob)
- return attack_hand(user)
-
/obj/machinery/atmospherics/valve/attack_hand(mob/user as mob)
src.add_fingerprint(usr)
update_icon(1)
diff --git a/code/TriDimension/Structures.dm b/code/TriDimension/Structures.dm
index dd97676115..fa91ccd5bb 100644
--- a/code/TriDimension/Structures.dm
+++ b/code/TriDimension/Structures.dm
@@ -55,9 +55,6 @@
del target
return ..()
- attack_paw(var/mob/M)
- return attack_hand(M)
-
attackby(obj/item/C as obj, mob/user as mob)
(..)
diff --git a/code/WorkInProgress/Cael_Aislinn/Jungle/jungle_animals.dm b/code/WorkInProgress/Cael_Aislinn/Jungle/jungle_animals.dm
index a2e1f1c4b9..4c95b5be1c 100644
--- a/code/WorkInProgress/Cael_Aislinn/Jungle/jungle_animals.dm
+++ b/code/WorkInProgress/Cael_Aislinn/Jungle/jungle_animals.dm
@@ -68,7 +68,7 @@
harm_intent_damage = 8
melee_damage_lower = 15
melee_damage_upper = 15
- attacktext = "slashes"
+ attacktext = "slashed"
attack_sound = 'sound/weapons/bite.ogg'
layer = 3.1 //so they can stay hidde under the /obj/structure/bush
@@ -126,7 +126,7 @@
harm_intent_damage = 2
melee_damage_lower = 3
melee_damage_upper = 10
- attacktext = "bites"
+ attacktext = "bitten"
attack_sound = 'sound/weapons/bite.ogg'
layer = 3.1 //so they can stay hidde under the /obj/structure/bush
diff --git a/code/WorkInProgress/Chinsky/guestpass.dm b/code/WorkInProgress/Chinsky/guestpass.dm
index 2fc9c700bc..7b524fe989 100644
--- a/code/WorkInProgress/Chinsky/guestpass.dm
+++ b/code/WorkInProgress/Chinsky/guestpass.dm
@@ -71,9 +71,6 @@
/obj/machinery/computer/guestpass/attack_ai(var/mob/user as mob)
return attack_hand(user)
-/obj/machinery/computer/guestpass/attack_paw(var/mob/user as mob)
- return attack_hand(user)
-
/obj/machinery/computer/guestpass/attack_hand(var/mob/user as mob)
if(..())
return
diff --git a/code/WorkInProgress/Mini/atmos_control.dm b/code/WorkInProgress/Mini/atmos_control.dm
index 2c83a77fd3..38dee770cd 100644
--- a/code/WorkInProgress/Mini/atmos_control.dm
+++ b/code/WorkInProgress/Mini/atmos_control.dm
@@ -34,9 +34,6 @@
/obj/machinery/computer/atmoscontrol/attack_ai(var/mob/user as mob)
return interact(user)
-/obj/machinery/computer/atmoscontrol/attack_paw(var/mob/user as mob)
- return interact(user)
-
/obj/machinery/computer/atmoscontrol/attack_hand(mob/user)
if(..())
return
diff --git a/code/WorkInProgress/Ported/policetape.dm b/code/WorkInProgress/Ported/policetape.dm
index f331f8401b..a4d2c31bdc 100644
--- a/code/WorkInProgress/Ported/policetape.dm
+++ b/code/WorkInProgress/Ported/policetape.dm
@@ -135,8 +135,7 @@
else
breaktape(null, user)
-/obj/item/tape/attack_paw(mob/user as mob)
- breaktape(/obj/item/weapon/wirecutters,user)
+
/obj/item/tape/proc/breaktape(obj/item/weapon/W as obj, mob/user as mob)
if(user.a_intent == "help" && ((!can_puncture(W) && src.allowed(user))))
diff --git a/code/WorkInProgress/Sigyn/Softcurity/secure_closet.dm b/code/WorkInProgress/Sigyn/Softcurity/secure_closet.dm
index e74c6fce6c..1f65f9f8d2 100644
--- a/code/WorkInProgress/Sigyn/Softcurity/secure_closet.dm
+++ b/code/WorkInProgress/Sigyn/Softcurity/secure_closet.dm
@@ -9,7 +9,6 @@
icon_off = "capsecureoff"
New()
- sleep(2)
if(prob(50))
new /obj/item/weapon/storage/backpack/captain(src)
else
@@ -40,7 +39,6 @@
icon_off = "hopsecureoff"
New()
- sleep(2)
new /obj/item/clothing/under/rank/head_of_personnel(src)
new /obj/item/clothing/suit/armor/vest(src)
new /obj/item/clothing/head/helmet(src)
@@ -66,7 +64,6 @@
icon_off = "hossecureoff"
New()
- sleep(2)
new /obj/item/weapon/storage/backpack/satchel_sec(src)
new /obj/item/weapon/cartridge/hos(src)
new /obj/item/device/radio/headset/heads/hos(src)
@@ -93,7 +90,6 @@
New()
- sleep(2)
new /obj/item/weapon/storage/backpack/satchel_sec(src)
new /obj/item/clothing/under/rank/advisor(src)
new /obj/item/device/radio/headset/headset_sec(src)
@@ -118,7 +114,6 @@
icon_off = "secoff"
New()
- sleep(2)
new /obj/item/weapon/storage/backpack/satchel_sec(src)
new /obj/item/device/radio/headset/headset_sec(src)
new /obj/item/weapon/storage/belt/security(src)
@@ -141,7 +136,6 @@
icon_off = "cabinetdetective_broken"
New()
- sleep(2)
new /obj/item/clothing/under/det(src)
new /obj/item/clothing/suit/armor/det_suit(src)
new /obj/item/clothing/suit/det_suit(src)
@@ -173,7 +167,6 @@
New()
- sleep(2)
new /obj/item/weapon/reagent_containers/ld50_syringe/choral(src)
new /obj/item/weapon/reagent_containers/ld50_syringe/choral(src)
return
@@ -197,7 +190,6 @@
req_access = list(access_court)
New()
- sleep(2)
new /obj/item/clothing/shoes/brown(src)
new /obj/item/weapon/paper/Court (src)
new /obj/item/weapon/paper/Court (src)
diff --git a/code/WorkInProgress/kilakk/fax.dm b/code/WorkInProgress/kilakk/fax.dm
index 2c34229620..8be1e9679d 100644
--- a/code/WorkInProgress/kilakk/fax.dm
+++ b/code/WorkInProgress/kilakk/fax.dm
@@ -38,9 +38,6 @@ var/list/alldepartments = list("Central Command")
/obj/machinery/faxmachine/attack_ai(mob/user as mob)
return attack_hand(user)
-/obj/machinery/faxmachine/attack_paw(mob/user as mob)
- return attack_hand(user)
-
/obj/machinery/faxmachine/attack_hand(mob/user as mob)
user.set_machine(src)
diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm
index 7220783038..9743988875 100644
--- a/code/__HELPERS/game.dm
+++ b/code/__HELPERS/game.dm
@@ -489,3 +489,6 @@ datum/projectile_data
rstats[i] = environment.vars[stats[i]]
temps[direction] = rstats
return temps
+
+/proc/MinutesToTicks(var/minutes as num)
+ return minutes * 60 * 10
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index 586b262259..a50bdce685 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -154,7 +154,6 @@
/mob/proc/DblClickOn(var/atom/A, var/params)
ClickOn(A,params)
-
/*
Translates into attack_hand, etc.
@@ -168,6 +167,21 @@
/mob/proc/UnarmedAttack(var/atom/A, var/proximity_flag)
return
+/mob/living/UnarmedAttack(var/atom/A, var/proximity_flag)
+
+ if(!ticker)
+ src << "You cannot attack people before the game has started."
+ return 0
+
+ if (istype(get_area(src), /area/start))
+ src << "No attacking people at spawn, you jackass."
+ return 0
+
+ if(stat)
+ return 0
+
+ return 1
+
/*
Ranged unarmed attack:
diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm
index 3c1cb43727..4f4224b04b 100644
--- a/code/_onclick/other_mobs.dm
+++ b/code/_onclick/other_mobs.dm
@@ -1,3 +1,7 @@
+// Generic damage proc (slimes and monkeys).
+/atom/proc/attack_generic(mob/user as mob)
+ return 0
+
/*
Humans:
Adds an exception for gloves, to allow special glove types like the ninja ones.
@@ -5,15 +9,19 @@
Otherwise pretty standard.
*/
/mob/living/carbon/human/UnarmedAttack(var/atom/A, var/proximity)
- var/obj/item/clothing/gloves/G = gloves // not typecast specifically enough in defines
+
+ if(!..())
+ return
// Special glove functions:
// If the gloves do anything, have them return 1 to stop
// normal attack_hand() here.
- if(proximity && istype(G) && G.Touch(A,1))
+ var/obj/item/clothing/gloves/G = gloves // not typecast specifically enough in defines
+ if(istype(G) && G.Touch(A,1))
return
A.attack_hand(src)
+
/atom/proc/attack_hand(mob/user as mob)
return
@@ -41,23 +49,20 @@
return
A.attack_tk(src)
-/*
- Animals & All Unspecified
-*/
-/mob/living/UnarmedAttack(var/atom/A)
- A.attack_animal(src)
-/atom/proc/attack_animal(mob/user as mob)
- return
/mob/living/RestrainedClickOn(var/atom/A)
return
/*
Monkeys
*/
-/mob/living/carbon/monkey/UnarmedAttack(var/atom/A)
- A.attack_paw(src)
-/atom/proc/attack_paw(mob/user as mob)
- return
+
+
+/mob/living/carbon/monkey/UnarmedAttack(var/atom/A, var/proximity)
+
+ if(!..())
+ return
+
+ A.attack_hand(src)
/*
Monkey RestrainedClickOn() was apparently the
@@ -88,26 +93,91 @@
/*
Aliens
- Defaults to same as monkey in most places
*/
/mob/living/carbon/alien/RestrainedClickOn(var/atom/A)
return
+/mob/living/carbon/alien/UnarmedAttack(var/atom/A, var/proximity)
+
+ if(!..())
+ return 0
+
+ A.attack_generic(src,rand(5,6),"bitten")
+
/*
Slimes
Nothing happening here
*/
-/mob/living/carbon/slime/UnarmedAttack(var/atom/A)
- A.attack_slime(src)
-/atom/proc/attack_slime(mob/user as mob)
- return
+
/mob/living/carbon/slime/RestrainedClickOn(var/atom/A)
return
+/mob/living/carbon/slime/UnarmedAttack(var/atom/A, var/proximity)
+
+ if(!..())
+ return
+
+ // Eating
+ if(Victim)
+ return
+
+ // Basic attack.
+ A.attack_generic(src, (is_adult ? rand(20,40) : rand(5,25)), "glomped")
+
+ // Handle mob shocks.
+ var/mob/living/M = A
+ if(istype(M) && powerlevel > 0 && !istype(A,/mob/living/carbon/slime))
+
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(H.species.flags & IS_SYNTHETIC || H.species.insulated)
+ return
+
+ var/power = max(0,min(10,(powerlevel+rand(0,3))))
+
+ var/stunprob = 10
+ switch(power*10)
+ if(1 to 2) stunprob = 20
+ if(3 to 4) stunprob = 30
+ if(5 to 6) stunprob = 40
+ if(7 to 8) stunprob = 60
+ if(9) stunprob = 70
+ if(10) stunprob = 95
+
+ if(prob(stunprob))
+ powerlevel = max(0,powerlevel-3)
+ src.visible_message("\red The [name] has shocked [M]!")
+ M.Weaken(power)
+ M.Stun(power)
+ if (M.stuttering < power) M.stuttering = power
+
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(5, 1, M)
+ s.start()
+
+ if(prob(stunprob) && powerlevel >= 8)
+ M.adjustFireLoss(powerlevel * rand(6,10))
+ M.updatehealth()
/*
New Players:
Have no reason to click on anything at all.
*/
/mob/new_player/ClickOn()
return
+
+/*
+ Animals
+*/
+/mob/living/simple_animal/UnarmedAttack(var/atom/A, var/proximity)
+
+ if(!..())
+ return
+
+ if(melee_damage_upper == 0 && istype(A,/mob/living))
+ custom_emote(1,"[friendly] [src]!")
+ return
+
+ var/damage = rand(melee_damage_lower, melee_damage_upper)
+ if(A.attack_generic(src,damage,attacktext,wall_smash) && loc && attack_sound)
+ playsound(loc, attack_sound, 50, 1, 1)
\ No newline at end of file
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index 49063999a0..098786f59b 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -156,9 +156,8 @@
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/const/minutes_to_ticks = 60 * 10
// Event settings
- var/expected_round_length = 60 * 3 * minutes_to_ticks // 3 hours
+ var/expected_round_length = 3 * 60 * 60 * 10 // 3 hours
// If the first delay has a custom start time
// No custom time, no custom time, between 80 to 100 minutes respectively.
var/list/event_first_run = list(EVENT_LEVEL_MUNDANE = null, EVENT_LEVEL_MODERATE = null, EVENT_LEVEL_MAJOR = list("lower" = 48000, "upper" = 60000))
@@ -543,31 +542,31 @@
config.player_levels = text2numlist(value, ";")
if("expected_round_length")
- config.expected_round_length = text2num(value) * minutes_to_ticks
+ config.expected_round_length = MinutesToTicks(text2num(value))
if("event_custom_start_mundane")
var/values = text2numlist(value, ";")
- config.event_first_run[EVENT_LEVEL_MUNDANE] = list("lower" = values[1] * minutes_to_ticks, "upper" = values[2] * minutes_to_ticks)
+ config.event_first_run[EVENT_LEVEL_MUNDANE] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2]))
if("event_custom_start_moderate")
var/values = text2numlist(value, ";")
- config.event_first_run[EVENT_LEVEL_MODERATE] = list("lower" = values[1] * minutes_to_ticks, "upper" = values[2] * minutes_to_ticks)
+ config.event_first_run[EVENT_LEVEL_MODERATE] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2]))
if("event_custom_start_major")
var/values = text2numlist(value, ";")
- config.event_first_run[EVENT_LEVEL_MAJOR] = list("lower" = values[1] * minutes_to_ticks, "upper" = values[2] * minutes_to_ticks)
+ config.event_first_run[EVENT_LEVEL_MAJOR] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2]))
if("event_delay_lower")
var/values = text2numlist(value, ";")
- config.event_delay_lower[EVENT_LEVEL_MUNDANE] = values[1] * minutes_to_ticks
- config.event_delay_lower[EVENT_LEVEL_MODERATE] = values[2] * minutes_to_ticks
- config.event_delay_lower[EVENT_LEVEL_MAJOR] = values[3] * minutes_to_ticks
+ config.event_delay_lower[EVENT_LEVEL_MUNDANE] = MinutesToTicks(values[1])
+ config.event_delay_lower[EVENT_LEVEL_MODERATE] = MinutesToTicks(values[2])
+ config.event_delay_lower[EVENT_LEVEL_MAJOR] = MinutesToTicks(values[3])
if("event_delay_upper")
var/values = text2numlist(value, ";")
- config.event_delay_upper[EVENT_LEVEL_MUNDANE] = values[1] * minutes_to_ticks
- config.event_delay_upper[EVENT_LEVEL_MODERATE] = values[2] * minutes_to_ticks
- config.event_delay_upper[EVENT_LEVEL_MAJOR] = values[3] * minutes_to_ticks
+ config.event_delay_upper[EVENT_LEVEL_MUNDANE] = MinutesToTicks(values[1])
+ config.event_delay_upper[EVENT_LEVEL_MODERATE] = MinutesToTicks(values[2])
+ config.event_delay_upper[EVENT_LEVEL_MAJOR] = MinutesToTicks(values[3])
else
log_misc("Unknown setting in configuration: '[name]'")
diff --git a/code/defines/procs/admin.dm b/code/defines/procs/admin.dm
index 5943ada459..44d79a3893 100644
--- a/code/defines/procs/admin.dm
+++ b/code/defines/procs/admin.dm
@@ -1,3 +1,7 @@
proc/log_and_message_admins(var/message as text)
log_admin("[usr]([usr.ckey]) " + message)
message_admins("[usr]([usr.ckey]) " + message)
+
+proc/admin_log_and_message_admins(var/message as text)
+ log_admin("[key_name(usr)] " + message)
+ message_admins("[key_name_admin(usr)] " + message, 1)
\ No newline at end of file
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index 8279cde6a4..e90ca9e096 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -65,7 +65,7 @@
//Check all the alarms before lowering atmosalm. Raising is perfectly fine.
for (var/area/RA in related)
for (var/obj/machinery/alarm/AA in RA)
- if ( !(AA.stat & (NOPOWER|BROKEN)) && !AA.shorted)
+ if (!(AA.stat & (NOPOWER|BROKEN)) && !AA.shorted && AA.report_danger_level)
danger_level = max(danger_level, AA.danger_level)
if(danger_level != atmosalm)
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index de6b84d655..82c7eb3016 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -193,11 +193,6 @@
return src.master.attackby(a, b)
return
-/atom/movable/overlay/attack_paw(a, b, c)
- if (src.master)
- return src.master.attack_paw(a, b, c)
- return
-
/atom/movable/overlay/attack_hand(a, b, c)
if (src.master)
return src.master.attack_hand(a, b, c)
diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm
index d1398402fc..01ef334ce7 100644
--- a/code/game/dna/dna_modifier.dm
+++ b/code/game/dna/dna_modifier.dm
@@ -324,8 +324,6 @@
return
return
*/
-/obj/machinery/computer/scan_consolenew/attack_paw(user as mob)
- ui_interact(user)
/obj/machinery/computer/scan_consolenew/attack_ai(user as mob)
src.add_hiddenprint(user)
@@ -424,15 +422,15 @@
if (connected.beaker.reagents && connected.beaker.reagents.reagent_list.len)
for(var/datum/reagent/R in connected.beaker.reagents.reagent_list)
data["beakerVolume"] += R.volume
-
+
// update the ui if it exists, returns null if no ui is passed/found
- ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
ui = new(user, src, ui_key, "dna_modifier.tmpl", "DNA Modifier Console", 660, 700)
// when the ui is first opened this is the data it will use
- ui.set_initial_data(data)
+ ui.set_initial_data(data)
// open the new ui window
ui.open()
// auto update every Master Controller tick
diff --git a/code/game/gamemodes/blob/blobs/factory.dm b/code/game/gamemodes/blob/blobs/factory.dm
index b388396639..bb8de8184e 100644
--- a/code/game/gamemodes/blob/blobs/factory.dm
+++ b/code/game/gamemodes/blob/blobs/factory.dm
@@ -34,7 +34,7 @@
maxHealth = 20
melee_damage_lower = 4
melee_damage_upper = 8
- attacktext = "hits"
+ attacktext = "hit"
attack_sound = 'sound/weapons/genhit1.ogg'
var/obj/effect/blob/factory/factory = null
faction = "blob"
diff --git a/code/game/gamemodes/calamity/calamity.dm b/code/game/gamemodes/calamity/calamity.dm
index d22b8fad01..6ddd3d70a5 100644
--- a/code/game/gamemodes/calamity/calamity.dm
+++ b/code/game/gamemodes/calamity/calamity.dm
@@ -82,13 +82,16 @@
return 1
/datum/game_mode/calamity/post_setup()
+ event_manager.report_at_round_end = 1
// Reduce the interval between moderate/major events
- event_manager.delay_modifier[EVENT_LEVEL_MODERATE] = 0.5
- event_manager.delay_modifier[EVENT_LEVEL_MAJOR] = 0.75
+ var/datum/event_container/EModerate = event_manager.event_containers[EVENT_LEVEL_MODERATE]
+ var/datum/event_container/EMajor = event_manager.event_containers[EVENT_LEVEL_MAJOR]
+ EModerate.delay_modifier = 0.5
+ EMajor.delay_modifier = 0.75
// Add the cortical borer event
- var/list/moderate_event_list = event_manager.available_events[EVENT_LEVEL_MODERATE]
- var/event = new /datum/event_meta(EVENT_LEVEL_MODERATE, "Borer Infestation", /datum/event/borer_infestation, 400)
+ var/list/moderate_event_list = EModerate.available_events
+ var/event = new /datum/event_meta(EVENT_LEVEL_MODERATE, "Borer Infestation", /datum/event/borer_infestation, 400, one_shot = 1)
moderate_event_list.Add(event)
if(chosen_atypes)
diff --git a/code/game/gamemodes/events/biomass.dm b/code/game/gamemodes/events/biomass.dm
index 3b48b971f0..b758c85019 100644
--- a/code/game/gamemodes/events/biomass.dm
+++ b/code/game/gamemodes/events/biomass.dm
@@ -29,6 +29,7 @@
if(/obj/item/weapon/twohanded/fireaxe) del src
if(/obj/item/weapon/hatchet) del src
if(/obj/item/weapon/melee/energy) del src
+ if(/obj/item/weapon/pickaxe/plasmacutter) del src
//less effective weapons
if(/obj/item/weapon/wirecutters)
diff --git a/code/game/gamemodes/events/ninja_equipment.dm b/code/game/gamemodes/events/ninja_equipment.dm
index 99b127ec1b..bb62f3c8e0 100644
--- a/code/game/gamemodes/events/ninja_equipment.dm
+++ b/code/game/gamemodes/events/ninja_equipment.dm
@@ -1473,9 +1473,6 @@ It is possible to destroy the net by the occupant or someone else.
healthcheck()
return
- attack_paw()
- return attack_hand()
-
attackby(obj/item/weapon/W as obj, mob/user as mob)
var/aforce = W.force
health = max(0, health - aforce)
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 2b1e13ee29..17e85c9fb1 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -213,7 +213,7 @@
/datum/game_mode/proc/send_intercept()
var/intercepttext = "Cent. Com. Update Requested status information:
"
- intercepttext += " In case you have misplaced your copy, attached is a list of personnel whom reliable sources™ suspect may be affiliated with criminal organisations or hostile foreign entities:
"
+ intercepttext += " In case you have misplaced your copy, attached is a list of personnel whom reliable sources™ suspect may be affiliated with subversive elements:
"
var/list/suspects = list()
diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm
index 9293092ddf..d4d14c9120 100644
--- a/code/game/gamemodes/gameticker.dm
+++ b/code/game/gamemodes/gameticker.dm
@@ -441,6 +441,9 @@ var/global/datum/controller/gameticker/ticker
if (findtext("[handler]","auto_declare_completion_"))
call(mode, handler)()
+ //Ask the event manager to print round end information
+ event_manager.RoundEnd()
+
//Print a list of antagonists to the server log
var/list/total_antagonists = list()
//Look into all mobs in world, dead or alive
diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm
index 4ab5961323..cc57ccd855 100644
--- a/code/game/gamemodes/nuclear/nuclearbomb.dm
+++ b/code/game/gamemodes/nuclear/nuclearbomb.dm
@@ -165,9 +165,6 @@ var/bomb_set
return
..()
-/obj/machinery/nuclearbomb/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
/obj/machinery/nuclearbomb/attack_hand(mob/user as mob)
if (src.extended)
if (!ishuman(user))
diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm
index 8441ab790b..0dc946aa16 100644
--- a/code/game/jobs/access.dm
+++ b/code/game/jobs/access.dm
@@ -417,76 +417,20 @@
/proc/get_all_centcom_jobs()
return list("VIP Guest","Custodian","Thunderdome Overseer","Intel Officer","Medical Officer","Death Commando","Research Officer","BlackOps Commander","Supreme Commander")
-//gets the actual job rank (ignoring alt titles)
-//this is used solely for sechuds
-/obj/proc/GetJobRealName()
- if (!istype(src, /obj/item/device/pda) && !istype(src,/obj/item/weapon/card/id))
- return
-
- var/rank
- var/assignment
- if(istype(src, /obj/item/device/pda))
- if(src:id)
- rank = src:id:rank
- assignment = src:id:assignment
- else if(istype(src, /obj/item/weapon/card/id))
- rank = src:rank
- assignment = src:assignment
-
- if( rank in joblist )
- return rank
-
- if( assignment in joblist )
- return assignment
-
- return "Unknown"
-
-//gets the alt title, failing that the actual job rank
-//this is unused
-/obj/proc/sdsdsd() //GetJobDisplayName
- if (!istype(src, /obj/item/device/pda) && !istype(src,/obj/item/weapon/card/id))
- return
-
- var/assignment
- if(istype(src, /obj/item/device/pda))
- if(src:id)
- assignment = src:id:assignment
- else if(istype(src, /obj/item/weapon/card/id))
- assignment = src:assignment
-
- if(assignment)
- return assignment
-
- return "Unknown"
+proc/GetIdCard(var/mob/living/carbon/human/H)
+ if(H.wear_id)
+ var/id = H.wear_id.GetID()
+ if(id)
+ return id
+ if(H.get_active_hand())
+ var/obj/item/I = H.get_active_hand()
+ return I.GetID()
proc/FindNameFromID(var/mob/living/carbon/human/H)
ASSERT(istype(H))
- var/obj/item/weapon/card/id/C = H.get_active_hand()
- if( istype(C) || istype(C, /obj/item/device/pda) )
- var/obj/item/weapon/card/id/ID = C
-
- if( istype(C, /obj/item/device/pda) )
- var/obj/item/device/pda/pda = C
- ID = pda.id
- if(!istype(ID))
- ID = null
-
- if(ID)
- return ID.registered_name
-
- C = H.wear_id
-
- if( istype(C) || istype(C, /obj/item/device/pda) )
- var/obj/item/weapon/card/id/ID = C
-
- if( istype(C, /obj/item/device/pda) )
- var/obj/item/device/pda/pda = C
- ID = pda.id
- if(!istype(ID))
- ID = null
-
- if(ID)
- return ID.registered_name
+ var/obj/item/weapon/card/id/C = GetIdCard(H)
+ if(C)
+ return C.registered_name
proc/get_all_job_icons() //For all existing HUD icons
return joblist + list("Prisoner")
diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm
index 949ff1660e..a43056fa96 100644
--- a/code/game/jobs/job/captain.dm
+++ b/code/game/jobs/job/captain.dm
@@ -34,7 +34,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H), slot_r_hand)
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)
diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm
index 3e1925d7fb..085ca17a80 100644
--- a/code/game/jobs/job/medical.dm
+++ b/code/game/jobs/job/medical.dm
@@ -72,11 +72,9 @@
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/virologist(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(H), slot_wear_mask)
switch(H.backbag)
- if(1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/virology(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_vir(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/weapon/storage/box/survival(H.back), slot_in_backpack)
if("Medical Doctor")
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit)
diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm
index 641e9473ad..b01b0bbda6 100644
--- a/code/game/machinery/OpTable.dm
+++ b/code/game/machinery/OpTable.dm
@@ -45,19 +45,6 @@
if(prob(75))
del(src)
-/obj/machinery/optable/attack_paw(mob/user as mob)
- if ((HULK in usr.mutations))
- usr << text("\blue You destroy the operating table.")
- visible_message("\red [usr] destroys the operating table!")
- src.density = 0
- del(src)
- if (!( locate(/obj/machinery/optable, user.loc) ))
- step(user, get_dir(user, src))
- if (user.loc == src.loc)
- user.layer = TURF_LAYER
- visible_message("The monkey hides under the table!")
- return
-
/obj/machinery/optable/attack_hand(mob/user as mob)
if (HULK in usr.mutations)
usr << text("\blue You destroy the table.")
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index 047012edcb..026195252e 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -10,7 +10,7 @@
anchored = 1 //About time someone fixed this.
density = 1
var/orient = "LEFT" // "RIGHT" changes the dir suffix to "-r"
-
+
use_power = 1
idle_power_usage = 40
@@ -50,9 +50,6 @@
/obj/machinery/sleep_console/attack_ai(mob/user as mob)
return src.attack_hand(user)
-/obj/machinery/sleep_console/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
/obj/machinery/sleep_console/attack_hand(mob/user as mob)
if(..())
return
@@ -166,7 +163,7 @@
var/amounts = list(5, 10)
var/obj/item/weapon/reagent_containers/glass/beaker = null
var/filtering = 0
-
+
use_power = 1
idle_power_usage = 15
active_power_usage = 200 //builtin health analyzer, dialysis machine, injectors.
@@ -188,7 +185,7 @@
process()
if (stat & (NOPOWER|BROKEN))
return
-
+
if(filtering > 0)
if(beaker)
if(beaker.reagents.total_volume < beaker.reagents.maximum_volume)
@@ -338,7 +335,7 @@
proc/inject_chemical(mob/living/user as mob, chemical, amount)
if (stat & (BROKEN|NOPOWER))
return
-
+
if(src.occupant && src.occupant.reagents)
if(src.occupant.reagents.get_reagent_amount(chemical) + amount <= 20)
use_power(amount * CHEM_SYNTH_ENERGY)
diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm
index 963b07df0f..97e61e5707 100644
--- a/code/game/machinery/adv_med.dm
+++ b/code/game/machinery/adv_med.dm
@@ -211,10 +211,6 @@
*/
-
-/obj/machinery/body_scanconsole/attack_paw(user as mob)
- return src.attack_hand(user)
-
/obj/machinery/body_scanconsole/attack_ai(user as mob)
return src.attack_hand(user)
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index 49a13e87b7..c74f03db43 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -78,13 +78,11 @@
var/temperature_dangerlevel = 0
var/other_dangerlevel = 0
- var/apply_danger_level = 1
- var/post_alert = 1
+ var/report_danger_level = 1
/obj/machinery/alarm/monitor
- apply_danger_level = 0
+ report_danger_level = 0
breach_detection = 0
- post_alert = 0
/obj/machinery/alarm/server/New()
..()
@@ -432,15 +430,12 @@
send_signal(device_id, list("power"= 0) )
/obj/machinery/alarm/proc/apply_danger_level(var/new_danger_level)
- if (apply_danger_level && alarm_area.atmosalert(new_danger_level))
+ if (report_danger_level && alarm_area.atmosalert(new_danger_level))
post_alert(new_danger_level)
update_icon()
/obj/machinery/alarm/proc/post_alert(alert_level)
- if(!post_alert)
- return
-
var/datum/radio_frequency/frequency = radio_controller.return_frequency(alarm_frequency)
if(!frequency)
return
@@ -1094,9 +1089,6 @@ FIRE ALARM
/obj/machinery/firealarm/bullet_act(BLAH)
return src.alarm()
-/obj/machinery/firealarm/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
/obj/machinery/firealarm/emp_act(severity)
if(prob(50/severity)) alarm()
..()
@@ -1379,9 +1371,6 @@ Code shamelessly copied from apc_frame
idle_power_usage = 2
active_power_usage = 6
-/obj/machinery/partyalarm/attack_paw(mob/user as mob)
- return attack_hand(user)
-
/obj/machinery/partyalarm/attack_hand(mob/user as mob)
if(user.stat || stat & (NOPOWER|BROKEN))
return
diff --git a/code/game/machinery/atmoalter/area_atmos_computer.dm b/code/game/machinery/atmoalter/area_atmos_computer.dm
index 20347eefe6..935feae3e2 100644
--- a/code/game/machinery/atmoalter/area_atmos_computer.dm
+++ b/code/game/machinery/atmoalter/area_atmos_computer.dm
@@ -21,9 +21,6 @@
attack_ai(var/mob/user as mob)
return src.attack_hand(user)
- attack_paw(var/mob/user as mob)
- return
-
attack_hand(var/mob/user as mob)
if(..(user))
return
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index 40e04f0928..1e75aa119d 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -11,8 +11,8 @@
var/canister_color = "yellow"
var/can_label = 1
- var/filled = 0.5
- pressure_resistance = 7*ONE_ATMOSPHERE
+ start_pressure = 45 * ONE_ATMOSPHERE
+ pressure_resistance = 7 * ONE_ATMOSPHERE
var/temperature_resistance = 1000 + T0C
volume = 1000
use_power = 0
@@ -24,33 +24,44 @@
icon_state = "redws"
canister_color = "redws"
can_label = 0
+
/obj/machinery/portable_atmospherics/canister/nitrogen
name = "Canister: \[N2\]"
icon_state = "red"
canister_color = "red"
can_label = 0
+
/obj/machinery/portable_atmospherics/canister/oxygen
name = "Canister: \[O2\]"
icon_state = "blue"
canister_color = "blue"
can_label = 0
+
/obj/machinery/portable_atmospherics/canister/phoron
name = "Canister \[Phoron\]"
icon_state = "orange"
canister_color = "orange"
can_label = 0
+
/obj/machinery/portable_atmospherics/canister/carbon_dioxide
name = "Canister \[CO2\]"
icon_state = "black"
canister_color = "black"
can_label = 0
+
/obj/machinery/portable_atmospherics/canister/air
name = "Canister \[Air\]"
icon_state = "grey"
canister_color = "grey"
can_label = 0
+
/obj/machinery/portable_atmospherics/canister/air/airlock
- filled = 0.05
+ start_pressure = 3 * ONE_ATMOSPHERE
+
+/obj/machinery/portable_atmospherics/canister/empty/
+ start_pressure = 0
+ can_label = 1
+
/obj/machinery/portable_atmospherics/canister/empty/oxygen
name = "Canister: \[O2\]"
icon_state = "blue"
@@ -243,9 +254,6 @@ update_flag
/obj/machinery/portable_atmospherics/canister/attack_ai(var/mob/user as mob)
return src.attack_hand(user)
-/obj/machinery/portable_atmospherics/canister/attack_paw(var/mob/user as mob)
- return src.attack_hand(user)
-
/obj/machinery/portable_atmospherics/canister/attack_hand(var/mob/user as mob)
return src.ui_interact(user)
@@ -345,28 +353,23 @@ update_flag
return 1
/obj/machinery/portable_atmospherics/canister/phoron/New()
-
..()
- src.air_contents.adjust_gas("phoron", (src.maximum_pressure*filled)*air_contents.volume/(R_IDEAL_GAS_EQUATION*air_contents.temperature))
-
+ src.air_contents.adjust_gas("phoron", MolesForPressure())
src.update_icon()
return 1
/obj/machinery/portable_atmospherics/canister/oxygen/New()
-
..()
- src.air_contents.adjust_gas("oxygen", (src.maximum_pressure*filled)*air_contents.volume/(R_IDEAL_GAS_EQUATION*air_contents.temperature))
+ src.air_contents.adjust_gas("oxygen", MolesForPressure())
src.update_icon()
return 1
/obj/machinery/portable_atmospherics/canister/sleeping_agent/New()
-
..()
- air_contents.adjust_gas("sleeping_agent", (src.maximum_pressure*filled)*air_contents.volume/(R_IDEAL_GAS_EQUATION*air_contents.temperature))
-
+ air_contents.adjust_gas("sleeping_agent", MolesForPressure())
src.update_icon()
return 1
@@ -387,22 +390,21 @@ update_flag
..()
- src.air_contents.adjust_gas("nitrogen", (src.maximum_pressure*filled)*air_contents.volume/(R_IDEAL_GAS_EQUATION*air_contents.temperature))
-
+ src.air_contents.adjust_gas("nitrogen", MolesForPressure())
src.update_icon()
return 1
/obj/machinery/portable_atmospherics/canister/carbon_dioxide/New()
-
..()
- src.air_contents.adjust_gas("carbon_dioxide", (src.maximum_pressure*filled)*air_contents.volume/(R_IDEAL_GAS_EQUATION*air_contents.temperature))
+ src.air_contents.adjust_gas("carbon_dioxide", MolesForPressure())
+ src.update_icon()
return 1
/obj/machinery/portable_atmospherics/canister/air/New()
-
..()
- src.air_contents.adjust_multi("oxygen", (O2STANDARD*src.maximum_pressure*filled)*air_contents.volume/(R_IDEAL_GAS_EQUATION*air_contents.temperature), "nitrogen", (N2STANDARD*src.maximum_pressure*filled)*air_contents.volume/(R_IDEAL_GAS_EQUATION*air_contents.temperature))
+ var/list/air_mix = StandardAirMix()
+ src.air_contents.adjust_multi("oxygen", air_mix["oxygen"], "nitrogen", air_mix["nitrogen"])
src.update_icon()
return 1
diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm
index 615bf17359..9ed28cc125 100644
--- a/code/game/machinery/atmoalter/portable_atmospherics.dm
+++ b/code/game/machinery/atmoalter/portable_atmospherics.dm
@@ -9,7 +9,8 @@
var/volume = 0
var/destroyed = 0
- var/maximum_pressure = 90*ONE_ATMOSPHERE
+ var/start_pressure = ONE_ATMOSPHERE
+ var/maximum_pressure = 90 * ONE_ATMOSPHERE
/obj/machinery/portable_atmospherics/New()
..()
@@ -39,6 +40,14 @@
..()
+/obj/machinery/portable_atmospherics/proc/StandardAirMix()
+ return list(
+ "oxygen" = O2STANDARD * MolesForPressure(),
+ "nitrogen" = N2STANDARD * MolesForPressure())
+
+/obj/machinery/portable_atmospherics/proc/MolesForPressure(var/target_pressure = start_pressure)
+ return (target_pressure * air_contents.volume) / (R_IDEAL_GAS_EQUATION * air_contents.temperature)
+
/obj/machinery/portable_atmospherics/update_icon()
return null
diff --git a/code/game/machinery/atmoalter/pump.dm b/code/game/machinery/atmoalter/pump.dm
index 718ffcb6b3..9f2c4023b2 100644
--- a/code/game/machinery/atmoalter/pump.dm
+++ b/code/game/machinery/atmoalter/pump.dm
@@ -10,14 +10,20 @@
var/target_pressure = 100
volume = 1000
-
+
power_rating = 7500 //7500 W ~ 10 HP
power_losses = 150
+/obj/machinery/portable_atmospherics/powered/pump/filled
+ start_pressure = 90 * ONE_ATMOSPHERE
+
/obj/machinery/portable_atmospherics/powered/pump/New()
..()
cell = new/obj/item/weapon/cell(src)
+ var/list/air_mix = StandardAirMix()
+ src.air_contents.adjust_multi("oxygen", air_mix["oxygen"], "nitrogen", air_mix["nitrogen"])
+
/obj/machinery/portable_atmospherics/powered/pump/update_icon()
src.overlays = 0
@@ -53,16 +59,16 @@
/obj/machinery/portable_atmospherics/powered/pump/process()
..()
var/power_draw = -1
-
+
if(on && cell && cell.charge)
var/datum/gas_mixture/environment
if(holding)
environment = holding.air_contents
else
environment = loc.return_air()
-
+
var/pressure_delta
- var/output_volume
+ var/output_volume
var/air_temperature
if(direction_out)
pressure_delta = target_pressure - environment.return_pressure()
@@ -72,15 +78,15 @@
pressure_delta = target_pressure - air_contents.return_pressure()
output_volume = air_contents.volume * air_contents.group_multiplier
air_temperature = air_contents.temperature? air_contents.temperature : environment.temperature
-
+
var/transfer_moles = pressure_delta*output_volume/(air_temperature * R_IDEAL_GAS_EQUATION)
-
+
if (pressure_delta > 0.01)
if (direction_out)
power_draw = pump_gas(src, air_contents, environment, transfer_moles, power_rating)
else
power_draw = pump_gas(src, environment, air_contents, transfer_moles, power_rating)
-
+
if (power_draw < 0)
last_flow_rate = 0
last_power_draw = 0
@@ -88,13 +94,13 @@
power_draw = max(power_draw, power_losses)
cell.use(power_draw * CELLRATE)
last_power_draw = power_draw
-
+
update_connected_network()
-
+
//ran out of charge
if (!cell.charge)
update_icon()
-
+
src.updateDialog()
/obj/machinery/portable_atmospherics/powered/pump/return_air()
@@ -103,9 +109,6 @@
/obj/machinery/portable_atmospherics/powered/pump/attack_ai(var/mob/user as mob)
return src.attack_hand(user)
-/obj/machinery/portable_atmospherics/powered/pump/attack_paw(var/mob/user as mob)
- return src.attack_hand(user)
-
/obj/machinery/portable_atmospherics/powered/pump/attack_hand(var/mob/user as mob)
user.set_machine(src)
diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm
index af0a452efe..9e8c508148 100644
--- a/code/game/machinery/atmoalter/scrubber.dm
+++ b/code/game/machinery/atmoalter/scrubber.dm
@@ -9,7 +9,7 @@
var/volume_rate = 800
volume = 750
-
+
power_rating = 7500 //7500 W ~ 10 HP
power_losses = 150
@@ -48,7 +48,7 @@
/obj/machinery/portable_atmospherics/powered/scrubber/process()
..()
-
+
var/power_draw = -1
if(on && cell && cell.charge)
@@ -57,11 +57,11 @@
environment = holding.air_contents
else
environment = loc.return_air()
-
+
var/transfer_moles = min(1, volume_rate/environment.volume)*environment.total_moles
-
+
power_draw = scrub_gas(src, scrubbing_gas, environment, air_contents, transfer_moles, power_rating)
-
+
if (power_draw < 0)
last_flow_rate = 0
last_power_draw = 0
@@ -69,13 +69,13 @@
power_draw = max(power_draw, power_losses)
cell.use(power_draw * CELLRATE)
last_power_draw = power_draw
-
+
update_connected_network()
-
+
//ran out of charge
if (!cell.charge)
update_icon()
-
+
//src.update_icon()
src.updateDialog()
@@ -85,9 +85,6 @@
/obj/machinery/portable_atmospherics/powered/scrubber/attack_ai(var/mob/user as mob)
return src.attack_hand(user)
-/obj/machinery/portable_atmospherics/powered/scrubber/attack_paw(var/mob/user as mob)
- return src.attack_hand(user)
-
/obj/machinery/portable_atmospherics/powered/scrubber/attack_hand(var/mob/user as mob)
user.set_machine(src)
@@ -156,14 +153,14 @@ Flow Rate Regulator: - - - S.perunit)
S.amount = round(stored_material[mat] / S.perunit)
- S.loc = loc
+ S.loc = loc
diff --git a/code/game/machinery/bots/bots.dm b/code/game/machinery/bots/bots.dm
index d41405aed3..9f98f89dee 100644
--- a/code/game/machinery/bots/bots.dm
+++ b/code/game/machinery/bots/bots.dm
@@ -52,18 +52,6 @@
user << "[src]'s parts look very loose!"
return
-/obj/machinery/bot/attack_animal(var/mob/living/simple_animal/M as mob)
- if(M.melee_damage_upper == 0) return
- src.health -= M.melee_damage_upper
- src.visible_message("\red [M] has [M.attacktext] [src]!")
- M.attack_log += text("\[[time_stamp()]\] attacked [src.name]")
- if(prob(10))
- new /obj/effect/decal/cleanable/blood/oil(src.loc)
- healthcheck()
-
-
-
-
/obj/machinery/bot/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/screwdriver))
if(!locked)
diff --git a/code/game/machinery/bots/medbot.dm b/code/game/machinery/bots/medbot.dm
index 5a0e424e15..c7381a5cd1 100644
--- a/code/game/machinery/bots/medbot.dm
+++ b/code/game/machinery/bots/medbot.dm
@@ -96,9 +96,6 @@
src.icon_state = "medibot[src.on]"
src.updateUsrDialog()
-/obj/machinery/bot/medbot/attack_paw(mob/user as mob)
- return attack_hand(user)
-
/obj/machinery/bot/medbot/attack_hand(mob/user as mob)
. = ..()
if (.)
diff --git a/code/game/machinery/bots/secbot.dm b/code/game/machinery/bots/secbot.dm
index f6140d9102..84f3efb167 100644
--- a/code/game/machinery/bots/secbot.dm
+++ b/code/game/machinery/bots/secbot.dm
@@ -260,6 +260,12 @@ Auto Patrol: []"},
src.mode = 0
walk_to(src,0)
+ // We re-assess human targets, before bashing their head in, in case their credentials change
+ if(target && istype(target, /mob/living/carbon/human))
+ var/threat = src.assess_perp(target, idcheck, check_records)
+ if(threat < 4)
+ target = null
+
if(target) // make sure target exists
if(!lasercolor && Adjacent(target)) // If right next to perp. Lasertag bots do not arrest anyone, just patrol and shoot and whatnot
if(istype(src.target,/mob/living/carbon))
@@ -643,7 +649,7 @@ Auto Patrol: []"},
continue
if(istype(C, /mob/living/carbon/human))
- src.threatlevel = src.assess_perp(C, idcheck, check_records, lasercolor)
+ src.threatlevel = src.assess_perp(C, idcheck, check_records)
else if(istype(M, /mob/living/simple_animal/hostile))
if(M.stat == DEAD)
@@ -669,6 +675,40 @@ Auto Patrol: []"},
else
continue
+/obj/machinery/bot/secbot/on_assess_perp(mob/living/carbon/human/perp)
+ if(lasercolor)
+ return laser_check(perp, lasercolor)
+
+ var/threat = 0
+ threat -= laser_check(perp, "b")
+ threat -= laser_check(perp, "r")
+
+ return threat
+
+/obj/machinery/bot/secbot/proc/laser_check(mob/living/carbon/human/perp, var/lasercolor)
+ var/target_suit
+ var/target_weapon
+ var/threat = 0
+ //Lasertag turrets target the opposing team, how great is that? -Sieve
+ switch(lasercolor)
+ if("b")
+ target_suit = /obj/item/clothing/suit/redtag
+ target_weapon = /obj/item/weapon/gun/energy/laser/redtag
+ if("r")
+ target_suit = /obj/item/clothing/suit/bluetag
+ target_weapon = /obj/item/weapon/gun/energy/laser/bluetag
+
+ if((istype(perp.r_hand, target_weapon)) || (istype(perp.l_hand, target_weapon)))
+ threat += 4
+
+ if(istype(perp, /mob/living/carbon/human))
+ if(istype(perp.wear_suit, target_suit))
+ threat += 4
+ if(istype(perp.belt, target_weapon))
+ threat += 2
+
+ return threat
+
/obj/machinery/bot/secbot/is_assess_emagged()
return emagged == 2
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index dc1ee050aa..aa5d7a02f1 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -121,8 +121,7 @@
/obj/machinery/clonepod/attack_ai(mob/user as mob)
src.add_hiddenprint(user)
return attack_hand(user)
-/obj/machinery/clonepod/attack_paw(mob/user as mob)
- return attack_hand(user)
+
/obj/machinery/clonepod/attack_hand(mob/user as mob)
if ((isnull(src.occupant)) || (stat & NOPOWER))
return
diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm
index 3c153b58d1..9ebc550119 100644
--- a/code/game/machinery/computer/HolodeckControl.dm
+++ b/code/game/machinery/computer/HolodeckControl.dm
@@ -43,9 +43,6 @@ var/global/list/holodeck_programs = list(
attack_ai(var/mob/user as mob)
return src.attack_hand(user)
- attack_paw(var/mob/user as mob)
- return
-
attack_hand(var/mob/user as mob)
if(..())
@@ -316,15 +313,6 @@ var/global/list/holodeck_programs = list(
return
// HOLOFLOOR DOES NOT GIVE A FUCK
-
-
-
-
-
-
-
-
-
/obj/structure/table/holotable
name = "table"
desc = "A square piece of metal standing on four metal legs. It can not move."
@@ -335,13 +323,6 @@ var/global/list/holodeck_programs = list(
layer = 2.8
throwpass = 1 //You can throw objects over this, despite it's density.
-
-/obj/structure/table/holotable/attack_paw(mob/user as mob)
- return attack_hand(user)
-
-/obj/structure/table/holotable/attack_animal(mob/living/user as mob) //Removed code for larva since it doesn't work. Previous code is now a larva ability. /N
- return attack_hand(user)
-
/obj/structure/table/holotable/attack_hand(mob/user as mob)
return // HOLOTABLE DOES NOT GIVE A FUCK
@@ -529,10 +510,6 @@ var/global/list/holodeck_programs = list(
user << "The station AI is not to interact with these devices!"
return
-/obj/machinery/readybutton/attack_paw(mob/user as mob)
- user << "You are too primitive to use this device."
- return
-
/obj/machinery/readybutton/New()
..()
@@ -541,10 +518,14 @@ var/global/list/holodeck_programs = list(
user << "The device is a solid button, there's nothing you can do with it!"
/obj/machinery/readybutton/attack_hand(mob/user as mob)
+
if(user.stat || stat & (NOPOWER|BROKEN))
user << "This device is not powered."
return
+ if(!user.IsAdvancedToolUser())
+ return 0
+
currentarea = get_area(src.loc)
if(!currentarea)
del(src)
diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm
index 5c628354d1..77e5dc977c 100644
--- a/code/game/machinery/computer/aifixer.dm
+++ b/code/game/machinery/computer/aifixer.dm
@@ -24,9 +24,6 @@
/obj/machinery/computer/aifixer/attack_ai(var/mob/user as mob)
return attack_hand(user)
-/obj/machinery/computer/aifixer/attack_paw(var/mob/user as mob)
- return attack_hand(user)
-
/obj/machinery/computer/aifixer/attack_hand(var/mob/user as mob)
if(..())
return
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index 11bebd70b6..2915bf0761 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -56,9 +56,6 @@
/obj/machinery/computer/arcade/attack_ai(mob/user as mob)
return src.attack_hand(user)
-/obj/machinery/computer/arcade/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
/obj/machinery/computer/arcade/attack_hand(mob/user as mob)
if(..())
return
diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm
index c57ab0de54..14c7847c6a 100644
--- a/code/game/machinery/computer/camera.dm
+++ b/code/game/machinery/computer/camera.dm
@@ -15,11 +15,6 @@
attack_ai(var/mob/user as mob)
return attack_hand(user)
-
- attack_paw(var/mob/user as mob)
- return attack_hand(user)
-
-
check_eye(var/mob/user as mob)
if (user.stat || ((get_dist(user, src) > 1 || !( user.canmove ) || user.blinded) && !istype(user, /mob/living/silicon))) //user can't see - not sure why canmove is here.
return null
diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm
index 9341aca674..4342778f9a 100644
--- a/code/game/machinery/computer/card.dm
+++ b/code/game/machinery/computer/card.dm
@@ -72,9 +72,6 @@
/obj/machinery/computer/card/attack_ai(var/mob/user as mob)
return attack_hand(user)
-/obj/machinery/computer/card/attack_paw(var/mob/user as mob)
- return attack_hand(user)
-
/obj/machinery/computer/card/attack_hand(mob/user as mob)
if(..()) return
if(stat & (NOPOWER|BROKEN)) return
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index adb4d24b54..dadda5cfd7 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -69,9 +69,6 @@
..()
return
-/obj/machinery/computer/cloning/attack_paw(mob/user as mob)
- return attack_hand(user)
-
/obj/machinery/computer/cloning/attack_ai(mob/user as mob)
return attack_hand(user)
@@ -137,7 +134,7 @@
dat += "Current records
"
dat += "Back
"
for(var/datum/dna2/record/R in src.records)
- dat += "[R.dna.real_name]"
+ dat += "[R.dna.real_name]"
if(3)
dat += "Selected Record
"
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index a6047cf534..0af60a14c7 100644
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -276,11 +276,6 @@
/obj/machinery/computer/communications/attack_ai(var/mob/user as mob)
return src.attack_hand(user)
-
-/obj/machinery/computer/communications/attack_paw(var/mob/user as mob)
- return src.attack_hand(user)
-
-
/obj/machinery/computer/communications/attack_hand(var/mob/user as mob)
if(..())
return
diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm
index a23c717a7b..f21322a3e2 100644
--- a/code/game/machinery/computer/medical.dm
+++ b/code/game/machinery/computer/medical.dm
@@ -44,9 +44,6 @@
/obj/machinery/computer/med_data/attack_ai(user as mob)
return src.attack_hand(user)
-/obj/machinery/computer/med_data/attack_paw(user as mob)
- return src.attack_hand(user)
-
/obj/machinery/computer/med_data/attack_hand(mob/user as mob)
if(..())
return
diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm
index 5a33b62cb8..042555fe00 100644
--- a/code/game/machinery/computer/pod.dm
+++ b/code/game/machinery/computer/pod.dm
@@ -110,11 +110,6 @@
/obj/machinery/computer/pod/attack_ai(var/mob/user as mob)
return attack_hand(user)
-
-/obj/machinery/computer/pod/attack_paw(var/mob/user as mob)
- return attack_hand(user)
-
-
/obj/machinery/computer/pod/attack_hand(var/mob/user as mob)
if(..())
return
diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm
index 3bd94c747a..56f093276a 100644
--- a/code/game/machinery/computer/prisoner.dm
+++ b/code/game/machinery/computer/prisoner.dm
@@ -17,11 +17,6 @@
attack_ai(var/mob/user as mob)
return src.attack_hand(user)
-
- attack_paw(var/mob/user as mob)
- return
-
-
attack_hand(var/mob/user as mob)
if(..())
return
diff --git a/code/game/machinery/computer/prisonshuttle.dm b/code/game/machinery/computer/prisonshuttle.dm
index 25607ab66f..f1c57104cc 100644
--- a/code/game/machinery/computer/prisonshuttle.dm
+++ b/code/game/machinery/computer/prisonshuttle.dm
@@ -21,19 +21,9 @@ var/prison_shuttle_timeleft = 0
var/allowedtocall = 0
var/prison_break = 0
-
- attackby(I as obj, user as mob)
- return src.attack_hand(user)
-
-
attack_ai(var/mob/user as mob)
return src.attack_hand(user)
-
- attack_paw(var/mob/user as mob)
- return src.attack_hand(user)
-
-
attackby(I as obj, user as mob)
if(istype(I, /obj/item/weapon/screwdriver))
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm
index f8029b0e96..43e65b1273 100644
--- a/code/game/machinery/computer/robot.dm
+++ b/code/game/machinery/computer/robot.dm
@@ -20,11 +20,6 @@
/obj/machinery/computer/robotics/attack_ai(var/mob/user as mob)
return src.attack_hand(user)
-/obj/machinery/computer/robotics/attack_paw(var/mob/user as mob)
-
- return src.attack_hand(user)
- return
-
/obj/machinery/computer/robotics/attack_hand(var/mob/user as mob)
if(..())
return
@@ -197,10 +192,10 @@
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))
diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm
index fde49fb7e3..f1f866864a 100644
--- a/code/game/machinery/computer/security.dm
+++ b/code/game/machinery/computer/security.dm
@@ -50,9 +50,6 @@
/obj/machinery/computer/secure_data/attack_ai(mob/user as mob)
return attack_hand(user)
-/obj/machinery/computer/secure_data/attack_paw(mob/user as mob)
- return attack_hand(user)
-
//Someone needs to break down the dat += into chunks instead of long ass lines.
/obj/machinery/computer/secure_data/attack_hand(mob/user as mob)
if(..())
diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm
index 6d2a4857c5..21d584fe8b 100644
--- a/code/game/machinery/computer/skills.dm
+++ b/code/game/machinery/computer/skills.dm
@@ -33,9 +33,6 @@
/obj/machinery/computer/skills/attack_ai(mob/user as mob)
return attack_hand(user)
-/obj/machinery/computer/skills/attack_paw(mob/user as mob)
- return attack_hand(user)
-
//Someone needs to break down the dat += into chunks instead of long ass lines.
/obj/machinery/computer/skills/attack_hand(mob/user as mob)
if(..())
diff --git a/code/game/machinery/computer/specops_shuttle.dm b/code/game/machinery/computer/specops_shuttle.dm
index bc050c6d1d..ba44553b16 100644
--- a/code/game/machinery/computer/specops_shuttle.dm
+++ b/code/game/machinery/computer/specops_shuttle.dm
@@ -248,9 +248,6 @@ var/specops_shuttle_timeleft = 0
/obj/machinery/computer/specops_shuttle/attack_ai(var/mob/user as mob)
return attack_hand(user)
-/obj/machinery/computer/specops_shuttle/attack_paw(var/mob/user as mob)
- return attack_hand(user)
-
/obj/machinery/computer/specops_shuttle/attackby(I as obj, user as mob)
if(istype(I,/obj/item/weapon/card/emag))
user << "\blue The electronic systems in this console are far too advanced for your primitive hacking peripherals."
diff --git a/code/game/machinery/computer/syndicate_specops_shuttle.dm b/code/game/machinery/computer/syndicate_specops_shuttle.dm
index 7ba21efbcf..970a68b64a 100644
--- a/code/game/machinery/computer/syndicate_specops_shuttle.dm
+++ b/code/game/machinery/computer/syndicate_specops_shuttle.dm
@@ -184,9 +184,6 @@ var/syndicate_elite_shuttle_timeleft = 0
/obj/machinery/computer/syndicate_elite_shuttle/attack_ai(var/mob/user as mob)
return attack_hand(user)
-/obj/machinery/computer/syndicate_elite_shuttle/attack_paw(var/mob/user as mob)
- return attack_hand(user)
-
/obj/machinery/computer/syndicate_elite_shuttle/attackby(I as obj, user as mob)
if(istype(I,/obj/item/weapon/card/emag))
user << "\blue The electronic systems in this console are far too advanced for your primitive hacking peripherals."
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index 48321f9fc8..dd94a88bc6 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -20,9 +20,6 @@ var/global/list/frozen_items = list()
circuit = "/obj/item/weapon/circuitboard/cryopodcontrol"
var/mode = null
-/obj/machinery/computer/cryopod/attack_paw()
- src.attack_hand()
-
/obj/machinery/computer/cryopod/attack_ai()
src.attack_hand()
diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm
index 496c55ecb6..57de93c0b8 100644
--- a/code/game/machinery/door_control.dm
+++ b/code/game/machinery/door_control.dm
@@ -10,7 +10,6 @@
desc = "A remote control-switch for a door."
power_channel = ENVIRON
var/id = null
- var/range = 10
var/normaldoorcontrol = CONTROL_POD_DOORS
var/desiredstate = 0 // Zero is closed, 1 is open.
var/specialfunctions = 1
@@ -41,9 +40,6 @@
else
user << "Error, no route to host."
-/obj/machinery/door_control/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
/obj/machinery/door_control/attackby(obj/item/weapon/W, mob/user as mob)
/* For later implementation
if (istype(W, /obj/item/weapon/screwdriver))
@@ -68,7 +64,7 @@
return src.attack_hand(user)
/obj/machinery/door_control/proc/handle_door()
- for(var/obj/machinery/door/airlock/D in range(range))
+ for(var/obj/machinery/door/airlock/D in world)
if(D.id_tag == src.id)
if(specialfunctions & OPEN)
if (D.density)
@@ -112,7 +108,7 @@
return
/obj/machinery/door_control/proc/handle_emitters(mob/user as mob)
- for(var/obj/machinery/power/emitter/E in range(range))
+ for(var/obj/machinery/power/emitter/E in world)
if(E.id == src.id)
spawn(0)
E.activate(user)
@@ -155,9 +151,6 @@
/obj/machinery/driver_button/attack_ai(mob/user as mob)
return src.attack_hand(user)
-/obj/machinery/driver_button/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
/obj/machinery/driver_button/attackby(obj/item/weapon/W, mob/user as mob)
if(istype(W, /obj/item/device/detective_scanner))
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 65a1010089..4f015975fe 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -606,8 +606,6 @@ About the new airlock wires panel:
s.set_up(5, 1, src)
s.start()
return ..()
-/obj/machinery/door/airlock/attack_paw(mob/user as mob)
- return src.attack_hand(user)
/obj/machinery/door/airlock/attack_hand(mob/user as mob)
if(!istype(usr, /mob/living/silicon))
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 07353f3151..ce29b60898 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -23,7 +23,7 @@
var/normalspeed = 1
var/heat_proof = 0 // For glass airlocks/opacity firedoors
var/air_properties_vary_with_direction = 0
- var/maxhealth = 500
+ var/maxhealth = 300
var/health
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
@@ -127,9 +127,14 @@
return
/obj/machinery/door/bullet_act(var/obj/item/projectile/Proj)
- if(Proj.damage)
- take_damage(round(Proj.damage * 4))
..()
+
+ //Tasers and the like should not damage doors.
+ if(Proj.damage_type == HALLOSS)
+ return
+
+ if(Proj.damage)
+ take_damage(Proj.damage)
/obj/machinery/door/hitby(AM as mob|obj)
@@ -148,11 +153,6 @@
/obj/machinery/door/attack_ai(mob/user as mob)
return src.attack_hand(user)
-
-/obj/machinery/door/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
-
/obj/machinery/door/attack_hand(mob/user as mob)
return src.attackby(user, user)
diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm
index ec41175380..84fa419265 100644
--- a/code/game/machinery/embedded_controller/embedded_controller_base.dm
+++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm
@@ -3,7 +3,7 @@
name = "Embedded Controller"
anchored = 1
-
+
use_power = 1
idle_power_usage = 10
@@ -29,11 +29,11 @@
/obj/machinery/embedded_controller/attack_ai(mob/user as mob)
src.ui_interact(user)
-/obj/machinery/embedded_controller/attack_paw(mob/user as mob)
- user << "You do not have the dexterity to use this."
- return
-
/obj/machinery/embedded_controller/attack_hand(mob/user as mob)
+
+ if(!user.IsAdvancedToolUser())
+ return 0
+
src.ui_interact(user)
/obj/machinery/embedded_controller/ui_interact()
@@ -44,7 +44,7 @@
icon_state = "airlock_control_standby"
power_channel = ENVIRON
density = 0
-
+
var/id_tag
//var/radio_power_use = 50 //power used to xmit signals
diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm
index 345d9f44d5..632fee8215 100644
--- a/code/game/machinery/flasher.dm
+++ b/code/game/machinery/flasher.dm
@@ -122,9 +122,6 @@
/obj/machinery/flasher_button/attack_ai(mob/user as mob)
return src.attack_hand(user)
-/obj/machinery/flasher_button/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
/obj/machinery/flasher_button/attackby(obj/item/weapon/W, mob/user as mob)
return src.attack_hand(user)
diff --git a/code/game/machinery/holosign.dm b/code/game/machinery/holosign.dm
index 073973cdee..a4bd1456cf 100644
--- a/code/game/machinery/holosign.dm
+++ b/code/game/machinery/holosign.dm
@@ -47,8 +47,6 @@
/obj/machinery/holosign_switch/attack_ai(mob/user as mob)
return src.attack_hand(user)
/
-obj/machinery/holosign_switch/attack_paw(mob/user as mob)
- return src.attack_hand(user)
/obj/machinery/holosign_switch/attackby(obj/item/weapon/W, mob/user as mob)
if(istype(W, /obj/item/device/detective_scanner))
diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm
index dcc67a5af2..500c2cf061 100755
--- a/code/game/machinery/igniter.dm
+++ b/code/game/machinery/igniter.dm
@@ -13,9 +13,6 @@
/obj/machinery/igniter/attack_ai(mob/user as mob)
return src.attack_hand(user)
-/obj/machinery/igniter/attack_paw(mob/user as mob)
- return
-
/obj/machinery/igniter/attack_hand(mob/user as mob)
if(..())
return
@@ -63,7 +60,7 @@
/obj/machinery/sparker/power_change()
..()
if ( !(stat & NOPOWER) && disable == 0 )
-
+
icon_state = "[base_state]"
// src.sd_SetLuminosity(2)
else
@@ -121,9 +118,6 @@
/obj/machinery/ignition_switch/attack_ai(mob/user as mob)
return src.attack_hand(user)
-/obj/machinery/ignition_switch/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
/obj/machinery/ignition_switch/attackby(obj/item/weapon/W, mob/user as mob)
return src.attack_hand(user)
diff --git a/code/game/machinery/kitchen/gibber.dm b/code/game/machinery/kitchen/gibber.dm
index b74d3a587a..a005d0e9d4 100644
--- a/code/game/machinery/kitchen/gibber.dm
+++ b/code/game/machinery/kitchen/gibber.dm
@@ -62,9 +62,6 @@
else
src.overlays += image('icons/obj/kitchen.dmi', "gridle")
-/obj/machinery/gibber/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
/obj/machinery/gibber/relaymove(mob/user as mob)
src.go_out()
return
diff --git a/code/game/machinery/kitchen/juicer.dm b/code/game/machinery/kitchen/juicer.dm
index dc62b875ee..a5a15fb876 100644
--- a/code/game/machinery/kitchen/juicer.dm
+++ b/code/game/machinery/kitchen/juicer.dm
@@ -53,9 +53,6 @@
src.updateUsrDialog()
return 0
-/obj/machinery/juicer/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
/obj/machinery/juicer/attack_ai(mob/user as mob)
return 0
diff --git a/code/game/machinery/kitchen/microwave.dm b/code/game/machinery/kitchen/microwave.dm
index 0ade94a93f..4af48a539b 100644
--- a/code/game/machinery/kitchen/microwave.dm
+++ b/code/game/machinery/kitchen/microwave.dm
@@ -138,9 +138,6 @@
return 1
src.updateUsrDialog()
-/obj/machinery/microwave/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
/obj/machinery/microwave/attack_ai(mob/user as mob)
return 0
diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm
index 2350b8120c..52ca3debd9 100644
--- a/code/game/machinery/kitchen/smartfridge.dm
+++ b/code/game/machinery/kitchen/smartfridge.dm
@@ -218,9 +218,6 @@
..()
-/obj/machinery/smartfridge/attack_paw(mob/user as mob)
- return attack_hand(user)
-
/obj/machinery/smartfridge/attack_ai(mob/user as mob)
return 0
diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm
index f7c1bcfa8f..1c9a9bd21d 100644
--- a/code/game/machinery/lightswitch.dm
+++ b/code/game/machinery/lightswitch.dm
@@ -41,10 +41,6 @@
if(..(user, 1))
user << "A light switch. It is [on? "on" : "off"]."
-
-/obj/machinery/light_switch/attack_paw(mob/user)
- src.attack_hand(user)
-
/obj/machinery/light_switch/attack_hand(mob/user)
on = !on
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 3f08862d9a..1d9a9aecda 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -232,9 +232,6 @@ Class Procs:
else
return src.attack_hand(user)
-/obj/machinery/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
/obj/machinery/attack_hand(mob/user as mob)
if(inoperable(MAINT))
return 1
@@ -316,7 +313,7 @@ Class Procs:
/obj/machinery/proc/is_assess_emagged()
return emagged
-/obj/machinery/proc/assess_perp(mob/living/carbon/human/perp, var/auth_weapons, var/check_records, var/lasercolor)
+/obj/machinery/proc/assess_perp(mob/living/carbon/human/perp, var/auth_weapons, var/check_records)
var/threatcount = 0 //the integer returned
if(is_assess_emagged())
@@ -326,56 +323,27 @@ Class Procs:
if(threatcount >= 10)
return threatcount
+ //Agent cards lower threatlevel.
+ var/obj/item/weapon/card/id/id = GetIdCard(perp)
+ if(id && istype(id, /obj/item/weapon/card/id/syndicate))
+ threatcount -= 2
+
if(auth_weapons && !src.allowed(perp))
if(istype(perp.l_hand, /obj/item/weapon/gun) || istype(perp.l_hand, /obj/item/weapon/melee))
- if(!istype(perp.l_hand, /obj/item/weapon/gun/energy/laser/bluetag) \
- && !istype(perp.l_hand, /obj/item/weapon/gun/energy/laser/redtag) \
- && !istype(perp.l_hand, /obj/item/weapon/gun/energy/laser/practice))
- threatcount += 4
+ threatcount += 4
if(istype(perp.r_hand, /obj/item/weapon/gun) || istype(perp.r_hand, /obj/item/weapon/melee))
- if(!istype(perp.r_hand, /obj/item/weapon/gun/energy/laser/bluetag) \
- && !istype(perp.r_hand, /obj/item/weapon/gun/energy/laser/redtag) \
- && !istype(perp.r_hand, /obj/item/weapon/gun/energy/laser/practice))
- threatcount += 4
+ threatcount += 4
if(istype(perp.belt, /obj/item/weapon/gun) || istype(perp.belt, /obj/item/weapon/melee))
- if(!istype(perp.belt, /obj/item/weapon/gun/energy/laser/bluetag) \
- && !istype(perp.belt, /obj/item/weapon/gun/energy/laser/redtag) \
- && !istype(perp.belt, /obj/item/weapon/gun/energy/laser/practice))
- threatcount += 2
+ threatcount += 2
if(perp.dna && perp.dna.mutantrace && perp.dna.mutantrace != "none")
threatcount += 2
-
- //Agent cards lower threatlevel.
- if(perp.wear_id && istype(perp.wear_id.GetID(), /obj/item/weapon/card/id/syndicate))
- threatcount -= 2
-
- if(lasercolor == "b")//Lasertag turrets target the opposing team, how great is that? -Sieve
- threatcount = 0//They will not, however shoot at people who have guns, because it gets really fucking annoying
- if(istype(perp.wear_suit, /obj/item/clothing/suit/redtag))
- threatcount += 4
- if((istype(perp.r_hand,/obj/item/weapon/gun/energy/laser/redtag)) || (istype(perp.l_hand,/obj/item/weapon/gun/energy/laser/redtag)))
- threatcount += 4
- if(istype(perp.belt, /obj/item/weapon/gun/energy/laser/redtag))
- threatcount += 2
-
- if(lasercolor == "r")
- threatcount = 0
- if(istype(perp.wear_suit, /obj/item/clothing/suit/bluetag))
- threatcount += 4
- if((istype(perp.r_hand,/obj/item/weapon/gun/energy/laser/bluetag)) || (istype(perp.l_hand,/obj/item/weapon/gun/energy/laser/bluetag)))
- threatcount += 4
- if(istype(perp.belt, /obj/item/weapon/gun/energy/laser/bluetag))
- threatcount += 2
-
if(check_records)
var/perpname = perp.name
- if(perp.wear_id)
- var/obj/item/weapon/card/id/id = perp.wear_id.GetID()
- if(id)
- perpname = id.registered_name
+ if(id)
+ perpname = id.registered_name
var/datum/data/record/R = find_record("name", perpname, data_core.security)
if(!R || (R.fields["criminal"] == "*Arrest*"))
diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm
index 71f450e70f..16e1cc032d 100644
--- a/code/game/machinery/navbeacon.dm
+++ b/code/game/machinery/navbeacon.dm
@@ -126,10 +126,11 @@
attack_ai(var/mob/user)
interact(user, 1)
- attack_paw()
- return
-
attack_hand(var/mob/user)
+
+ if(!user.IsAdvancedToolUser())
+ return 0
+
interact(user, 0)
interact(var/mob/user, var/ai = 0)
diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm
index c9a1ddb657..5e278bf2f5 100644
--- a/code/game/machinery/newscaster.dm
+++ b/code/game/machinery/newscaster.dm
@@ -243,8 +243,13 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
return src.attack_hand(user)
/obj/machinery/newscaster/attack_hand(mob/user as mob) //########### THE MAIN BEEF IS HERE! And in the proc below this...############
+
if(!src.ispowered || src.isbroken)
return
+
+ if(!user.IsAdvancedToolUser())
+ return 0
+
if(istype(user, /mob/living/carbon/human) || istype(user,/mob/living/silicon) )
var/mob/living/human_or_robot_user = user
var/dat
@@ -773,11 +778,6 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
/obj/machinery/newscaster/attack_ai(mob/user as mob)
return src.attack_hand(user) //or maybe it'll have some special functions? No idea.
-
-/obj/machinery/newscaster/attack_paw(mob/user as mob)
- user << "The newscaster controls are far too complicated for your tiny brain!"
- return
-
/datum/news_photo
var/is_synth = 0
var/obj/item/weapon/photo/photo = null
diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm
index e57ccfe1ed..49f566af57 100644
--- a/code/game/machinery/pipe/pipe_dispenser.dm
+++ b/code/game/machinery/pipe/pipe_dispenser.dm
@@ -7,9 +7,6 @@
var/unwrenched = 0
var/wait = 0
-/obj/machinery/pipedispenser/attack_paw(user as mob)
- return src.attack_hand(user)
-
/obj/machinery/pipedispenser/attack_hand(user as mob)
if(..())
return
diff --git a/code/game/machinery/portable_tag_turret.dm b/code/game/machinery/portable_tag_turret.dm
new file mode 100644
index 0000000000..fa4e75bfc5
--- /dev/null
+++ b/code/game/machinery/portable_tag_turret.dm
@@ -0,0 +1,128 @@
+#define TURRET_PRIORITY_TARGET 2
+#define TURRET_SECONDARY_TARGET 1
+#define TURRET_NOT_TARGET 0
+
+/obj/machinery/porta_turret/tag
+ // Reasonable defaults, in case someone manually spawns us
+ var/lasercolor = "r" //Something to do with lasertag turrets, blame Sieve for not adding a comment.
+ installation = /obj/item/weapon/gun/energy/laser/redtag
+
+/obj/machinery/porta_turret/tag/red
+
+/obj/machinery/porta_turret/tag/blue
+ lasercolor = "b"
+ installation = /obj/item/weapon/gun/energy/laser/bluetag
+
+/obj/machinery/porta_turret/tag/New()
+ ..()
+ icon_state = "[lasercolor]grey_target_prism"
+
+/obj/machinery/porta_turret/tag/weapon_setup(var/obj/item/weapon/gun/energy/E)
+ switch(E.type)
+ if(/obj/item/weapon/gun/energy/laser/bluetag)
+ eprojectile = /obj/item/weapon/gun/energy/laser/bluetag
+ lasercolor = "b"
+ req_access = list(access_maint_tunnels, access_theatre)
+ check_records = 0
+ auth_weapons = 1
+ stun_all = 0
+ check_anomalies = 0
+ shot_delay = 30
+
+ if(/obj/item/weapon/gun/energy/laser/redtag)
+ eprojectile = /obj/item/weapon/gun/energy/laser/redtag
+ lasercolor = "r"
+ req_access = list(access_maint_tunnels, access_theatre)
+ check_records = 0
+ auth_weapons = 1
+ stun_all = 0
+ check_anomalies = 0
+ shot_delay = 30
+ iconholder = 1
+
+/obj/machinery/porta_turret/tag/interact(mob/user)
+ var/dat
+
+ if(istype(user,/mob/living/carbon/human))
+ var/mob/living/carbon/human/H = user
+ if(lasercolor == "b" && istype(H.wear_suit, /obj/item/clothing/suit/redtag))
+ return
+ if(lasercolor == "r" && istype(H.wear_suit, /obj/item/clothing/suit/bluetag))
+ return
+ dat += text({"
+ Automatic Portable Turret Installation
+ Status: []
"},
+
+ "[on ? "On" : "Off"]" )
+
+
+ user << browse("Automatic Portable Turret Installation[dat]", "window=autosec")
+ onclose(user, "autosec")
+ return
+
+/obj/machinery/porta_turret/tag/update_icon()
+ if(!anchored)
+ icon_state = "turretCover"
+ return
+ if(stat & BROKEN)
+ icon_state = "[lasercolor]destroyed_target_prism"
+ else
+ if(powered())
+ if(on)
+ if(iconholder)
+ //lasers have a orange icon
+ icon_state = "[lasercolor]orange_target_prism"
+ else
+ //almost everything has a blue icon
+ icon_state = "[lasercolor]target_prism"
+ else
+ icon_state = "[lasercolor]grey_target_prism"
+ else
+ icon_state = "[lasercolor]grey_target_prism"
+
+/obj/machinery/porta_turret/tag/bullet_act(obj/item/projectile/Proj)
+ ..()
+
+ if(lasercolor == "b" && disabled == 0)
+ if(istype(Proj, /obj/item/weapon/gun/energy/laser/redtag))
+ disabled = 1
+ del(Proj) // qdel
+ sleep(100)
+ disabled = 0
+ if(lasercolor == "r" && disabled == 0)
+ if(istype(Proj, /obj/item/weapon/gun/energy/laser/bluetag))
+ disabled = 1
+ del(Proj) // qdel
+ sleep(100)
+ disabled = 0
+
+/obj/machinery/porta_turret/tag/assess_living(var/mob/living/L)
+ if(!L)
+ return TURRET_NOT_TARGET
+
+ if(L.lying)
+ return TURRET_NOT_TARGET
+
+ var/target_suit
+ var/target_weapon
+ switch(lasercolor)
+ if("b")
+ target_suit = /obj/item/clothing/suit/redtag
+ target_weapon = /obj/item/weapon/gun/energy/laser/redtag
+ if("r")
+ target_suit = /obj/item/clothing/suit/bluetag
+ target_weapon = /obj/item/weapon/gun/energy/laser/bluetag
+
+
+ if(target_suit)//Lasertag turrets target the opposing team, how great is that? -Sieve
+ if((istype(L.r_hand, target_weapon)) || (istype(L.l_hand, target_weapon)))
+ return TURRET_PRIORITY_TARGET
+
+ if(istype(L, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = L
+ if(istype(H.wear_suit, target_suit))
+ return TURRET_PRIORITY_TARGET
+ if(istype(H.belt, target_weapon))
+ return TURRET_SECONDARY_TARGET
+
+ return TURRET_NOT_TARGET
\ No newline at end of file
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index 4701669b24..692d4da481 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -3,10 +3,6 @@
This code is slightly more documented than normal, as requested by XSI on IRC.
*/
-#define TURRET_PRIORITY_TARGET 2
-#define TURRET_SECONDARY_TARGET 1
-#define TURRET_NOT_TARGET 0
-
/obj/machinery/porta_turret
name = "turret"
icon = 'icons/obj/turrets.dmi'
@@ -22,7 +18,6 @@
req_one_access = list(access_security, access_heads)
power_channel = EQUIP //drains power from the EQUIPMENT channel
- var/lasercolor = "" //Something to do with lasertag turrets, blame Sieve for not adding a comment.
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
@@ -51,6 +46,7 @@
var/attacked = 0 //if set to 1, the turret gets pissed off and shoots at people nearby (unless they have sec access!)
var/on = 1 //determines if the turret is on
+ var/lethal = 0 //whether in lethal or stun mode
var/disabled = 0
var/shot_sound //what sound should play when the turret fires
@@ -58,9 +54,13 @@
var/datum/effect/effect/system/spark_spread/spark_system //the spark system, used for generating... sparks?
+/obj/machinery/porta_turret/stationary
+ lethal = 1
+ installation = /obj/item/weapon/gun/energy/laser
+
/obj/machinery/porta_turret/New()
..()
- icon_state = "[lasercolor]grey_target_prism"
+ icon_state = "grey_target_prism"
//Sets up a spark system
spark_system = new /datum/effect/effect/system/spark_spread
spark_system.set_up(5, 0, src)
@@ -71,7 +71,6 @@
setup()
/obj/machinery/porta_turret/proc/setup()
-
var/obj/item/weapon/gun/energy/E = new installation //All energy-based weapons are applicable
//var/obj/item/ammo_casing/shottype = E.projectile_type
@@ -80,134 +79,140 @@
shot_sound = E.fire_sound
eshot_sound = shot_sound
- switch(E.type)
- if(/obj/item/weapon/gun/energy/laser/bluetag)
- eprojectile = /obj/item/weapon/gun/energy/laser/bluetag
- lasercolor = "b"
- req_access = list(access_maint_tunnels, access_theatre)
- check_records = 0
- auth_weapons = 1
- stun_all = 0
- check_anomalies = 0
- shot_delay = 30
+ weapon_setup(E)
- if(/obj/item/weapon/gun/energy/laser/redtag)
- eprojectile = /obj/item/weapon/gun/energy/laser/redtag
- lasercolor = "r"
- req_access = list(access_maint_tunnels, access_theatre)
- check_records = 0
- auth_weapons = 1
- stun_all = 0
- check_anomalies = 0
- shot_delay = 30
- iconholder = 1
-
- if(/obj/item/weapon/gun/energy/laser/practice)
- iconholder = 1
- eprojectile = /obj/item/projectile/beam
+/obj/machinery/porta_turret/proc/weapon_setup(var/obj/item/weapon/gun/energy/E)
+ if(/obj/item/weapon/gun/energy/laser/practice)
+ iconholder = 1
+ eprojectile = /obj/item/projectile/beam
// if(/obj/item/weapon/gun/energy/laser/practice/sc_laser)
// iconholder = 1
// eprojectile = /obj/item/projectile/beam
- if(/obj/item/weapon/gun/energy/laser/retro)
- iconholder = 1
+ if(/obj/item/weapon/gun/energy/laser/retro)
+ iconholder = 1
// if(/obj/item/weapon/gun/energy/laser/retro/sc_retro)
// iconholder = 1
- if(/obj/item/weapon/gun/energy/laser/captain)
- iconholder = 1
+ if(/obj/item/weapon/gun/energy/laser/captain)
+ iconholder = 1
- if(/obj/item/weapon/gun/energy/lasercannon)
- iconholder = 1
+ if(/obj/item/weapon/gun/energy/lasercannon)
+ iconholder = 1
- if(/obj/item/weapon/gun/energy/taser)
- eprojectile = /obj/item/projectile/beam
- eshot_sound = 'sound/weapons/Laser.ogg'
+ if(/obj/item/weapon/gun/energy/taser)
+ eprojectile = /obj/item/projectile/beam
+ eshot_sound = 'sound/weapons/Laser.ogg'
- if(/obj/item/weapon/gun/energy/stunrevolver)
- eprojectile = /obj/item/projectile/beam
- eshot_sound = 'sound/weapons/Laser.ogg'
+ if(/obj/item/weapon/gun/energy/stunrevolver)
+ eprojectile = /obj/item/projectile/beam
+ eshot_sound = 'sound/weapons/Laser.ogg'
- if(/obj/item/weapon/gun/energy/gun)
- eprojectile = /obj/item/projectile/beam //If it has, going to kill mode
- eshot_sound = 'sound/weapons/Laser.ogg'
- egun = 1
+ if(/obj/item/weapon/gun/energy/gun)
+ eprojectile = /obj/item/projectile/beam //If it has, going to kill mode
+ eshot_sound = 'sound/weapons/Laser.ogg'
+ egun = 1
- if(/obj/item/weapon/gun/energy/gun/nuclear)
- eprojectile = /obj/item/projectile/beam //If it has, going to kill mode
- eshot_sound = 'sound/weapons/Laser.ogg'
- egun = 1
+ if(/obj/item/weapon/gun/energy/gun/nuclear)
+ eprojectile = /obj/item/projectile/beam //If it has, going to kill mode
+ eshot_sound = 'sound/weapons/Laser.ogg'
+ egun = 1
+/obj/machinery/porta_turret/update_icon()
+ if(!anchored)
+ icon_state = "turretCover"
+ return
+ if(stat & BROKEN)
+ icon_state = "destroyed_target_prism"
+ else
+ if(powered())
+ if(on)
+ if(iconholder)
+ //lasers have a orange icon
+ icon_state = "orange_target_prism"
+ else
+ //almost everything has a blue icon
+ icon_state = "target_prism"
+ else
+ icon_state = "grey_target_prism"
+ else
+ icon_state = "grey_target_prism"
/obj/machinery/porta_turret/Del()
//deletes its own cover with it
del(cover) // qdel
..()
+/obj/machinery/porta_turret/proc/can_use(mob/user)
+ if(ailock && issilicon(user))
+ user << "There seems to be a firewall preventing you from accessing this device."
+ return 0
+
+ if(locked && !issilicon(user))
+ user << "Access denied."
+ return 0
+
+ return 1
/obj/machinery/porta_turret/attack_ai(mob/user)
- if(!ailock)
- return attack_hand(user)
- else
- user << "There seems to be a firewall preventing you from accessing this device."
-
+ return attack_hand(user)
/obj/machinery/porta_turret/attack_hand(mob/user)
- . = ..()
- if(.)
- return
- var/dat
+ if(..())
+ return 1
+ if(!can_use(user))
+ return 1
+ interact(user)
- //The browse() text, similar to ED-209s and beepskies.
- if(!lasercolor) //Lasertag turrets have less options
- dat += text({"
- Automatic Portable Turret Installation
- Status: []
- Behaviour controls are [locked ? "locked" : "unlocked"]"},
+/obj/machinery/porta_turret/interact(mob/user)
+ var/dat = text({"
+ Automatic Portable Turret Installation
+ Status: []
+ Behaviour controls are [locked ? "locked" : "unlocked"]"},
- "[on ? "On" : "Off"]" )
+ "[on ? "On" : "Off"]" )
- if(!locked || issilicon(user))
- dat += text({"
- Neutralize All Non-Synthetics: []
- Check for Weapon Authorization: []
- Check Security Records: []
- Neutralize All Non-Authorized Personnel: []
- Neutralize All Unidentified Life Signs: []
"},
+ if(!locked || issilicon(user))
+ dat += text({"
+ Lethal Mode: []
+ Neutralize All Non-Synthetics: []
"},
- "[ai ? "Yes" : "No"]",
- "[auth_weapons ? "Yes" : "No"]",
- "[check_records ? "Yes" : "No"]",
- "[stun_all ? "Yes" : "No"]",
- "[check_anomalies ? "Yes" : "No"]" )
- else
- if(istype(user,/mob/living/carbon/human))
- var/mob/living/carbon/human/H = user
- if(lasercolor == "b" && istype(H.wear_suit, /obj/item/clothing/suit/redtag))
- return
- if(lasercolor == "r" && istype(H.wear_suit, /obj/item/clothing/suit/bluetag))
- return
- dat += text({"
- Automatic Portable Turret Installation
- Status: []
"},
-
- "[on ? "On" : "Off"]" )
+ "[lethal ? "Enabled" : "Disabled"]",
+ "[ai ? "Yes" : "No"]")
+ if(!ai)
+ dat += text({"Check for Weapon Authorization: []
+ Check Security Records: []
+ Neutralize All Non-Authorized Personnel: []
+ Neutralize All Unidentified Life Signs: []
"},
+ "[auth_weapons ? "Yes" : "No"]",
+ "[check_records ? "Yes" : "No"]",
+ "[stun_all ? "Yes" : "No"]",
+ "[check_anomalies ? "Yes" : "No"]" )
user << browse("Automatic Portable Turret Installation[dat]", "window=autosec")
onclose(user, "autosec")
return
+/obj/machinery/porta_turret/proc/HasController()
+ var/area/A = get_area(src)
+ return A && A.turret_controls.len > 0
+
/obj/machinery/porta_turret/Topic(href, href_list)
if(..())
- return
+ return 1
+ if(!can_use(usr))
+ return 1
+
usr.set_machine(src)
- add_fingerprint(usr)
- if(href_list["power"] && (!locked || issilicon(usr)))
+ if(href_list["power"])
if(anchored) //you can't turn a turret on/off if it's not anchored/secured
- on = !on //toggle on/off
+ if(HasController())
+ usr << "Turrets can only be [on ? "disabled" : "enabled"] using the assigned turret controller."
+ else
+ on = !on //toggle on/off
else
usr << "It has to be secured first!"
@@ -215,6 +220,12 @@
return
switch(href_list["operation"]) //toggles customizable behavioural protocols
+ if("togglelethal")
+ if(!controllock)
+ if(HasController())
+ usr << "Weapon mode can only be altered using the assigned turret controller."
+ else
+ lethal = !lethal
if("toggleai")
ai = !ai
if("authweapon")
@@ -223,33 +234,19 @@
check_records = !check_records
if("shootall")
stun_all = !stun_all
+ if("checkxenos")
+ check_anomalies = !check_anomalies
updateUsrDialog()
/obj/machinery/porta_turret/power_change()
-
- if(!anchored)
- icon_state = "turretCover"
- return
- if(stat & BROKEN)
- icon_state = "[lasercolor]destroyed_target_prism"
+ if(powered())
+ stat &= ~NOPOWER
+ update_icon()
else
- if(powered())
- if(on)
- if(iconholder)
- //lasers have a orange icon
- icon_state = "[lasercolor]orange_target_prism"
- else
- //almost everything has a blue icon
- icon_state = "[lasercolor]target_prism"
- else
- icon_state = "[lasercolor]grey_target_prism"
- stat &= ~NOPOWER
- else
- spawn(rand(0, 15))
- icon_state = "[lasercolor]grey_target_prism"
- stat |= NOPOWER
-
+ spawn(rand(0, 15))
+ stat |= NOPOWER
+ update_icon()
/obj/machinery/porta_turret/attackby(obj/item/I, mob/user)
@@ -258,21 +255,20 @@
//If the turret is destroyed, you can remove it with a crowbar to
//try and salvage its components
user << "You begin prying the metal coverings off."
- sleep(20)
- if(prob(70))
- user << "You remove the turret and salvage some components."
- if(installation)
- var/obj/item/weapon/gun/energy/Gun = new installation(loc)
- Gun.power_supply.charge = gun_charge
- Gun.update_icon()
- lasercolor = null
- if(prob(50))
- new /obj/item/stack/sheet/metal(loc, rand(1,4))
- if(prob(50))
- new /obj/item/device/assembly/prox_sensor(loc)
- else
- user << "You remove the turret but did not manage to salvage anything."
- del(src) // qdel
+ if(do_after(user, 20))
+ if(prob(70))
+ user << "You remove the turret and salvage some components."
+ if(installation)
+ var/obj/item/weapon/gun/energy/Gun = new installation(loc)
+ Gun.power_supply.charge = gun_charge
+ Gun.update_icon()
+ if(prob(50))
+ new /obj/item/stack/sheet/metal(loc, rand(1,4))
+ if(prob(50))
+ new /obj/item/device/assembly/prox_sensor(loc)
+ else
+ user << "You remove the turret but did not manage to salvage anything."
+ del(src) // qdel
if(istype(I, /obj/item/weapon/card/emag) && !emagged)
//Emagging the turret makes it go bonkers and stun everyone. It also makes
@@ -288,20 +284,24 @@
else if((istype(I, /obj/item/weapon/wrench)) && (!on))
if(raised) return
- //This code handles moving the turret around. After all, it's a portable turret!
- if(!anchored && !isinspace())
- anchored = 1
- invisibility = INVISIBILITY_LEVEL_TWO
- icon_state = "[lasercolor]grey_target_prism"
- user << "You secure the exterior bolts on the turret."
- cover = new /obj/machinery/porta_turret_cover(loc) //create a new turret. While this is handled in process(), this is to workaround a bug where the turret becomes invisible for a split second
- cover.Parent_Turret = src //make the cover's parent src
- else if(anchored)
- anchored = 0
- user << "You unsecure the exterior bolts on the turret."
- icon_state = "turretCover"
- invisibility = 0
- del(cover) //deletes the cover, and the turret instance itself becomes its own cover. - qdel
+
+ if(do_after(user, 50))
+ //This code handles moving the turret around. After all, it's a portable turret!
+ if(!anchored && !isinspace())
+ playsound(loc, 'sound/items/Ratchet.ogg', 100, 1)
+ anchored = 1
+ invisibility = INVISIBILITY_LEVEL_TWO
+ update_icon()
+ user << "You secure the exterior bolts on the turret."
+ cover = new /obj/machinery/porta_turret_cover(loc) //create a new turret. While this is handled in process(), this is to workaround a bug where the turret becomes invisible for a split second
+ cover.Parent_Turret = src //make the cover's parent src
+ else if(anchored)
+ playsound(loc, 'sound/items/Ratchet.ogg', 100, 1)
+ anchored = 0
+ user << "You unsecure the exterior bolts on the turret."
+ invisibility = 0
+ update_icon()
+ del(cover) //deletes the cover, and the turret instance itself becomes its own cover. - qdel
else if(istype(I, /obj/item/weapon/card/id)||istype(I, /obj/item/device/pda))
//Behavior lock/unlock mangement
@@ -345,20 +345,6 @@
if(health <= 0)
die() //the death process :(
- if(lasercolor == "b" && disabled == 0)
- if(istype(Proj, /obj/item/weapon/gun/energy/laser/redtag))
- disabled = 1
- del(Proj) // qdel
- sleep(100)
- disabled = 0
- if(lasercolor == "r" && disabled == 0)
- if(istype(Proj, /obj/item/weapon/gun/energy/laser/bluetag))
- disabled = 1
- del(Proj) // qdel
- sleep(100)
- disabled = 0
-
-
/obj/machinery/porta_turret/emp_act(severity)
if(on)
//if the turret is on, the EMP no matter how severe disables the turret for a while
@@ -386,10 +372,10 @@
health = 0
density = 0
stat |= BROKEN //enables the BROKEN bit
- icon_state = "[lasercolor]destroyed_target_prism"
invisibility = 0
spark_system.start() //creates some sparks because they look cool
density = 1
+ update_icon()
del(cover) //deletes the cover - no need on keeping it there! - del
@@ -445,8 +431,9 @@
if(!L)
return TURRET_NOT_TARGET
- if(emagged && !isAI(L)) //if emagged, target everything (except the AI, otherwise lethal-set turrets attempt to fire at it in the core)
- return TURRET_PRIORITY_TARGET
+ // If emagged not even the dead get a rest
+ if(emagged)
+ return L.stat ? TURRET_SECONDARY_TARGET : TURRET_PRIORITY_TARGET
if(issilicon(L)) // Don't target silica
return TURRET_NOT_TARGET
@@ -460,26 +447,20 @@
if(ai) //If it's set to attack all non-silicons, target them!
if(L.lying)
- if(lasercolor)
- return TURRET_NOT_TARGET
- else
- return TURRET_SECONDARY_TARGET
- else
- return TURRET_PRIORITY_TARGET
+ return TURRET_SECONDARY_TARGET
+ return TURRET_PRIORITY_TARGET
if(iscuffed(L)) // If the target is handcuffed, leave it alone
return TURRET_NOT_TARGET
- if(isanimal(L)) // Animals are not so dangerous
+ if(isanimal(L) || ismonkey(L)) // Animals are not so dangerous
return check_anomalies ? TURRET_SECONDARY_TARGET : TURRET_NOT_TARGET
if(isxenomorph(L) || isalien(L)) // Xenos are dangerous
return check_anomalies ? TURRET_PRIORITY_TARGET : TURRET_NOT_TARGET
if(ishuman(L)) //if the target is a human, analyze threat level
- if(assess_perp(L, auth_weapons, check_records, lasercolor) < 4)
+ if(assess_perp(L, auth_weapons, check_records) < 4)
return TURRET_NOT_TARGET //if threat level < 4, keep going
- else if(ismonkey(L))
- return TURRET_NOT_TARGET //Don't target monkeys or borgs/AIs
if(L.lying) //if the perp is lying down, it's still a target but a less-important target
return TURRET_SECONDARY_TARGET
@@ -509,6 +490,7 @@
cover.icon_state = "openTurretCover"
raised = 1
layer = 4
+ update_icon()
/obj/machinery/porta_turret/proc/popDown() //pops the turret down
if(disabled)
@@ -525,7 +507,7 @@
cover.icon_state = "turretCover"
raised = 0
invisibility = 2
- icon_state = "[lasercolor]grey_target_prism"
+ update_icon()
/obj/machinery/porta_turret/on_assess_perp(mob/living/carbon/human/perp)
@@ -549,7 +531,8 @@
return
/obj/machinery/porta_turret/proc/shootAt(var/mob/living/target)
- if(!emagged) //if it hasn't been emagged, it has to obey a cooldown rate
+ //any emagged turrets will shoot extremely fast! This not only is deadly, but drains a lot power!
+ if(!(emagged || lethal)) //if it hasn't been emagged, it has to obey a cooldown rate
if(last_fired || !raised) //prevents rapid-fire shooting, unless it's been emagged
return
last_fired = 1
@@ -565,20 +548,17 @@
if(!raised) //the turret has to be raised in order to fire - makes sense, right?
return
- //any emagged turrets will shoot extremely fast! This not only is deadly, but drains a lot power!
- if(iconholder)
- icon_state = "[lasercolor]orange_target_prism"
- else
- icon_state = "[lasercolor]target_prism"
+
+ update_icon()
var/obj/item/projectile/A
- if(emagged)
+ if(emagged || lethal)
A = new eprojectile(loc)
playsound(loc, eshot_sound, 75, 1)
else
A = new projectile(loc)
playsound(loc, shot_sound, 75, 1)
A.original = target
- if(!emagged)
+ if(!(emagged || lethal))
use_power(reqpower)
else
use_power(reqpower * 2)
@@ -589,12 +569,12 @@
spawn(1)
A.process()
-/obj/machinery/porta_turret/proc/setState(var/on, var/emagged)
+/obj/machinery/porta_turret/proc/setState(var/on, var/lethal)
if(controllock)
return
src.on = on
- src.emagged = emagged
- src.iconholder = emagged
+ src.lethal = lethal
+ src.iconholder = lethal
src.power_change()
/*
@@ -607,6 +587,7 @@
icon = 'icons/obj/turrets.dmi'
icon_state = "turret_frame"
density=1
+ var/target_type = /obj/machinery/porta_turret // The type we intend to build
var/build_step = 0 //the current step in the building process
var/finish_name="turret" //the name applied to the product turret
var/installation = null //the gun type installed
@@ -686,6 +667,12 @@
installation = I.type //installation becomes I.type
gun_charge = E.power_supply.charge //the gun's charge is stored in gun_charge
user << "You add [I] to the turret."
+
+ if(istype(installation, /obj/item/weapon/gun/energy/laser/bluetag) || istype(installation, /obj/item/weapon/gun/energy/laser/redtag))
+ target_type = /obj/machinery/porta_turret/tag
+ else
+ target_type = /obj/machinery/porta_turret
+
build_step = 4
del(I) //delete the gun :( qdel
return
@@ -748,10 +735,11 @@
user << "You weld the turret's armor down."
//The final step: create a full turret
- var/obj/machinery/porta_turret/Turret = new/obj/machinery/porta_turret(loc)
+ var/obj/machinery/porta_turret/Turret = new target_type(loc)
Turret.name = finish_name
Turret.installation = installation
Turret.gun_charge = gun_charge
+ Turret.on = 0
Turret.setup()
// Turret.cover=new/obj/machinery/porta_turret_cover(loc)
@@ -821,136 +809,14 @@
//I'm not fixing it because i'm fucking bored of this code already, but someone should just reroute these to the parent turret's procs.
/obj/machinery/porta_turret_cover/attack_ai(mob/user)
- if(!Parent_Turret.ailock)
- return attack_hand(user)
- else
- user << "There seems to be a firewall preventing you from accessing this device."
+ return attack_hand(user)
/obj/machinery/porta_turret_cover/attack_hand(mob/user)
- . = ..()
- if(.)
- return
- var/dat
- if(!Parent_Turret.lasercolor)
- dat += text({"
- Automatic Portable Turret Installation
- Status: []
- Behaviour controls are [Parent_Turret.locked ? "locked" : "unlocked"]"},
-
- "[Parent_Turret.on ? "On" : "Off"]" )
-
- if(!src.Parent_Turret.locked || issilicon(user))
- dat += text({"
- Neutralize All Non-Synthetics: []
- Check for Weapon Authorization: []
- Check Security Records: []
- Neutralize All Non-Authorized Personnel: []
- Neutralize All Unidentified Life Signs: []
"},
-
- "[Parent_Turret.ai ? "Yes" : "No"]",
- "[Parent_Turret.auth_weapons ? "Yes" : "No"]",
- "[Parent_Turret.check_records ? "Yes" : "No"]",
- "[Parent_Turret.stun_all ? "Yes" : "No"]" ,
- "[Parent_Turret.check_anomalies ? "Yes" : "No"]" )
- else
- if(istype(user,/mob/living/carbon/human))
- var/mob/living/carbon/human/H = user
- if(Parent_Turret.lasercolor == "b" && istype(H.wear_suit, /obj/item/clothing/suit/redtag))
- return
- if(Parent_Turret.lasercolor == "r" && istype(H.wear_suit, /obj/item/clothing/suit/bluetag))
- return
- dat += text({"
- Automatic Portable Turret Installation
- Status: []
"},
-
- "[Parent_Turret.on ? "On" : "Off"]" )
-
- user << browse("Automatic Portable Turret Installation[dat]", "window=autosec")
- onclose(user, "autosec")
-
+ return Parent_Turret.attack_hand(user)
/obj/machinery/porta_turret_cover/Topic(href, href_list)
- if(..())
- return
- usr.set_machine(src)
- Parent_Turret.add_fingerprint(usr)
- add_fingerprint(usr)
- if(href_list["power"] && (!src.Parent_Turret.locked || issilicon(usr)))
- if(Parent_Turret.anchored)
- if(Parent_Turret.on)
- Parent_Turret.on = 0
- else
- Parent_Turret.on = 1
- else
- usr << "It has to be secured first!"
-
- updateUsrDialog()
- return
-
- switch(href_list["operation"])
- if("toggleai")
- Parent_Turret.ai = !Parent_Turret.ai
- if("authweapon")
- Parent_Turret.auth_weapons = !Parent_Turret.auth_weapons
- if("checkrecords")
- Parent_Turret.check_records = !Parent_Turret.check_records
- if("shootall")
- Parent_Turret.stun_all = !Parent_Turret.stun_all
- if("checkxenos")
- Parent_Turret.check_anomalies = !Parent_Turret.check_anomalies
-
+ Parent_Turret.Topic(href, href_list, 1) // Calling another object's Topic requires that we claim to not have a window, otherwise BYOND's base proc will runtime.
updateUsrDialog()
-
/obj/machinery/porta_turret_cover/attackby(obj/item/I, mob/user)
- if(istype(I, /obj/item/weapon/card/emag) && !Parent_Turret.emagged)
- user << "You short out [Parent_Turret]'s threat assessment circuits."
- visible_message("[Parent_Turret] hums oddly...")
- Parent_Turret.emagged = 1
- Parent_Turret.on = 0
- sleep(40)
- Parent_Turret.on = 1
-
- else if(istype(I, /obj/item/weapon/wrench) && !Parent_Turret.on)
- if(Parent_Turret.raised) return
-
- if(!Parent_Turret.anchored)
- Parent_Turret.anchored = 1
- Parent_Turret.invisibility = INVISIBILITY_LEVEL_TWO
- Parent_Turret.icon_state = "grey_target_prism"
- user << "You secure the exterior bolts on the turret."
- else
- Parent_Turret.anchored = 0
- user << "You unsecure the exterior bolts on the turret."
- Parent_Turret.icon_state = "turretCover"
- Parent_Turret.invisibility = 0
- del(src) // qdel
-
- else if(istype(I, /obj/item/weapon/card/id)||istype(I, /obj/item/device/pda))
- if(Parent_Turret.allowed(user))
- Parent_Turret.locked = !Parent_Turret.locked
- user << "Controls are now [Parent_Turret.locked ? "locked" : "unlocked"]."
- updateUsrDialog()
- else
- user << "Access denied."
-
- else
- user.changeNext_move(CLICK_CD_MELEE)
- Parent_Turret.health -= I.force * 0.5
- if(Parent_Turret.health <= 0)
- Parent_Turret.die()
- if(I.force * 0.5 > 2)
- if(!Parent_Turret.attacked && !Parent_Turret.emagged)
- Parent_Turret.attacked = 1
- spawn()
- sleep(30)
- Parent_Turret.attacked = 0
- ..()
-
-
-/obj/machinery/porta_turret/stationary
- emagged = 1
-
- New()
- installation = /obj/item/weapon/gun/energy/laser
- ..()
+ Parent_Turret.attackby(I, user)
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index 6cdedefe7f..8a949f7272 100644
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -65,9 +65,6 @@ obj/machinery/recharger/attack_hand(mob/user as mob)
charging = null
update_icon()
-obj/machinery/recharger/attack_paw(mob/user as mob)
- return attack_hand(user)
-
obj/machinery/recharger/process()
if(stat & (NOPOWER|BROKEN) || !anchored)
update_use_power(0)
diff --git a/code/game/machinery/robot_fabricator.dm b/code/game/machinery/robot_fabricator.dm
index 085f455deb..0c3ae56115 100644
--- a/code/game/machinery/robot_fabricator.dm
+++ b/code/game/machinery/robot_fabricator.dm
@@ -32,9 +32,6 @@
else
user << "The robot part maker is full. Please remove metal from the robot part maker in order to insert more."
-/obj/machinery/robotic_fabricator/attack_paw(user as mob)
- return src.attack_hand(user)
-
/obj/machinery/robotic_fabricator/attack_hand(user as mob)
var/dat
if (..())
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index bee250fd29..68da5f0ef1 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -94,6 +94,8 @@
return
if(stat & NOPOWER)
return
+ if(!user.IsAdvancedToolUser())
+ return 0
if(src.panelopen) //The maintenance panel is open. Time for some shady stuff
dat+= "Suit storage unit: Maintenance panel"
dat+= "Maintenance panel controls
"
@@ -559,12 +561,6 @@
/obj/machinery/suit_storage_unit/attack_ai(mob/user as mob)
return src.attack_hand(user)
-
-/obj/machinery/suit_storage_unit/attack_paw(mob/user as mob)
- user << "The console controls are far too complicated for your tiny brain!"
- return
-
-
//////////////////////////////REMINDER: Make it lock once you place some fucker inside.
//God this entire file is fucking awful
@@ -657,10 +653,6 @@
/obj/machinery/suit_cycler/attack_ai(mob/user as mob)
return src.attack_hand(user)
-/obj/machinery/suit_cycler/attack_paw(mob/user as mob)
- user << "\blue The console controls are far too complicated for your tiny brain!"
- return
-
/obj/machinery/suit_cycler/attackby(obj/item/I as obj, mob/user as mob)
if(electrified != 0)
@@ -786,6 +778,9 @@
if(..() || stat & (BROKEN|NOPOWER))
return
+ if(!user.IsAdvancedToolUser())
+ return 0
+
if(electrified != 0)
if(src.shock(user, 100))
return
diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm
index b247f17919..acd89ee17c 100644
--- a/code/game/machinery/teleporter.dm
+++ b/code/game/machinery/teleporter.dm
@@ -77,9 +77,6 @@
return
-/obj/machinery/computer/teleporter/attack_paw()
- src.attack_hand()
-
/obj/machinery/teleport/station/attack_ai()
src.attack_hand()
@@ -311,9 +308,6 @@
/obj/machinery/teleport/station/attackby(var/obj/item/weapon/W)
src.attack_hand()
-/obj/machinery/teleport/station/attack_paw()
- src.attack_hand()
-
/obj/machinery/teleport/station/attack_ai()
src.attack_hand()
diff --git a/code/game/machinery/turret_control.dm b/code/game/machinery/turret_control.dm
index f203186eb9..b28d0a6e7f 100644
--- a/code/game/machinery/turret_control.dm
+++ b/code/game/machinery/turret_control.dm
@@ -2,6 +2,10 @@
//Turret Control Panel//
////////////////////////
+/area
+ // Turrets use this list to see if individual power/lethal settings are allowed
+ var/list/turret_controls = list()
+
/obj/machinery/turretid
name = "turret control panel"
desc = "Used to control a room's automated defenses."
@@ -25,6 +29,13 @@
lethal = 1
icon_state = "control_kill"
+/obj/machinery/turretid/Del()
+ if(control_area)
+ var/area/A = control_area
+ if(A && istype(A))
+ A.turret_controls -= src
+ ..()
+
/obj/machinery/turretid/initialize()
if(!control_area)
var/area/CA = get_area(src)
@@ -39,8 +50,25 @@
break
power_change() //Checks power and initial settings
//don't have to check if control_area is path, since get_area_all_atoms can take path.
+
+ if(control_area)
+ var/area/A = control_area
+ if(A && istype(A))
+ A.turret_controls += src
return
+/obj/machinery/turretid/proc/can_use(mob/user)
+ if (get_dist(src, user) > 0 && !issilicon(user))
+ user << "You are too far away."
+ user.unset_machine()
+ user << browse(null, "window=turretid")
+ return 0
+
+ if(ailock && issilicon(user))
+ user << "There seems to be a firewall preventing you from accessing this device."
+ return 0
+ return 1
+
/obj/machinery/turretid/attackby(obj/item/weapon/W, mob/user)
if(stat & BROKEN) return
if (istype(user, /mob/living/silicon))
@@ -74,16 +102,10 @@
user << "Access denied."
/obj/machinery/turretid/attack_ai(mob/user as mob)
- if(!ailock)
- return attack_hand(user)
- else
- user << "There seems to be a firewall preventing you from accessing this device."
+ return attack_hand(user)
/obj/machinery/turretid/attack_hand(mob/user as mob)
- if (get_dist(src, user) > 0 && !issilicon(user))
- user << "You are too far away."
- user.unset_machine()
- user << browse(null, "window=turretid")
+ if(!can_use(user))
return
user.set_machine(src)
@@ -106,7 +128,7 @@
//user << browse(t, "window=turretid")
//onclose(user, "turretid")
- var/datum/browser/popup = new(user, "turretid", "Turret Control Panel ([area.name])")
+ var/datum/browser/popup = new(user, "turretid", "Turret Control Panel ([area.name])", 500, 200)
popup.set_content(t)
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
popup.open()
@@ -115,14 +137,9 @@
if(..())
return 1
- if(ailock)
- usr << "There seems to be a firewall preventing you from accessing this device."
+ if(!can_use(usr))
return 1
- if (src.locked)
- if (!istype(usr, /mob/living/silicon))
- usr << "Control panel is locked!"
- return 1
if (href_list["toggleOn"])
src.enabled = !src.enabled
src.updateTurrets()
@@ -131,7 +148,7 @@
src.updateTurrets()
if(!nowindow)
- updateDialog()
+ attack_hand(usr)
/obj/machinery/turretid/updateDialog()
if (stat & (BROKEN|MAINT))
diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm
index f9e8a94747..567afc0d6d 100644
--- a/code/game/machinery/turrets.dm
+++ b/code/game/machinery/turrets.dm
@@ -338,18 +338,18 @@
spawn(13)
del(src)
-/obj/machinery/turret/attack_animal(mob/living/M as mob)
- if(M.melee_damage_upper == 0) return
- if(!(stat & BROKEN))
- visible_message("\red [M] [M.attacktext] [src]!")
- M.attack_log += text("\[[time_stamp()]\] attacked [src.name]")
- //src.attack_log += text("\[[time_stamp()]\] was attacked by [M.name] ([M.ckey])")
- src.health -= M.melee_damage_upper
- if (src.health <= 0)
- src.die()
- else
- M << "\red That object is useless to you."
- return
+/obj/machinery/turret/attack_generic(var/mob/user, var/damage, var/attack_message)
+ if(!damage)
+ return 0
+ if(stat & BROKEN)
+ user << "That object is useless to you."
+ return 0
+ visible_message("[user] [attack_message] the [src]!")
+ user.attack_log += text("\[[time_stamp()]\] attacked [src.name]")
+ src.health -= damage
+ if (src.health <= 0)
+ src.die()
+ return 1
/obj/structure/turret/gun_turret
name = "Gun Turret"
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index aaf8283a00..ab931c46d3 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -274,10 +274,6 @@
else
usr << "\icon[src]Error: Unable to access your account. Please contact technical support if problem persists."
-
-/obj/machinery/vending/attack_paw(mob/user as mob)
- return attack_hand(user)
-
/obj/machinery/vending/attack_ai(mob/user as mob)
return attack_hand(user)
@@ -657,7 +653,7 @@
vend_power_usage = 85000 //85 kJ to heat a 250 mL cup of coffee
products = list(/obj/item/weapon/reagent_containers/food/drinks/coffee = 25,/obj/item/weapon/reagent_containers/food/drinks/tea = 25,/obj/item/weapon/reagent_containers/food/drinks/h_chocolate = 25)
contraband = list(/obj/item/weapon/reagent_containers/food/drinks/ice = 10)
- prices = list(/obj/item/weapon/reagent_containers/food/drinks/coffee = 25, /obj/item/weapon/reagent_containers/food/drinks/tea = 25, /obj/item/weapon/reagent_containers/food/drinks/h_chocolate = 25)
+ prices = list(/obj/item/weapon/reagent_containers/food/drinks/coffee = 3, /obj/item/weapon/reagent_containers/food/drinks/tea = 3, /obj/item/weapon/reagent_containers/food/drinks/h_chocolate = 3)
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 2a33539bc8..558d1d6076 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -444,28 +444,6 @@
src.log_append_to_last("Armor saved.")
return
-/obj/mecha/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
-/obj/mecha/attack_animal(mob/living/user as mob)
- src.log_message("Attack by simple animal. Attacker - [user].",1)
- if(user.melee_damage_upper == 0)
- user.emote("[user.friendly] [src]")
- else
- if(!prob(src.deflect_chance))
- var/damage = rand(user.melee_damage_lower, user.melee_damage_upper)
- src.take_damage(damage)
- src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
- visible_message("\red [user] [user.attacktext] [src]!")
- user.attack_log += text("\[[time_stamp()]\] attacked [src.name]")
- else
- src.log_append_to_last("Armor saved.")
- playsound(src.loc, 'sound/weapons/slash.ogg', 50, 1, -1)
- src.occupant_message("\blue The [user]'s attack is stopped by the armor.")
- visible_message("\blue The [user] rebounds off [src.name]'s armor!")
- user.attack_log += text("\[[time_stamp()]\] attacked [src.name]")
- return
-
/obj/mecha/hitby(atom/movable/A as mob|obj) //wrapper
..()
src.log_message("Hit by [A].",1)
@@ -1725,6 +1703,27 @@
icon_state = initial(icon_state)
return icon_state
+/obj/mecha/attack_generic(var/mob/user, var/damage, var/attack_message)
+
+ if(!damage)
+ return 0
+
+ src.log_message("Attack by an animal. Attacker - [user].",1)
+
+ 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))
+ visible_message("\red [user] [attack_message] [src]!")
+ user.attack_log += text("\[[time_stamp()]\] attacked [src.name]")
+ else
+ src.log_append_to_last("Armor saved.")
+ playsound(src.loc, 'sound/weapons/slash.ogg', 50, 1, -1)
+ src.occupant_message("\blue The [user]'s attack is stopped by the armor.")
+ visible_message("\blue The [user] rebounds off [src.name]'s armor!")
+ user.attack_log += text("\[[time_stamp()]\] attacked [src.name]")
+ return 1
+
+
//////////////////////////////////////////
//////// Mecha global iterators ////////
//////////////////////////////////////////
diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm
index da461662f8..051f2e8129 100644
--- a/code/game/mecha/mecha_control_console.dm
+++ b/code/game/mecha/mecha_control_console.dm
@@ -11,9 +11,6 @@
attack_ai(var/mob/user as mob)
return src.attack_hand(user)
- attack_paw(var/mob/user as mob)
- return src.attack_hand(user)
-
attack_hand(var/mob/user as mob)
if(..())
return
diff --git a/code/game/objects/closets/ert.dm b/code/game/objects/closets/ert.dm
index 341c76e64b..fa49001c45 100644
--- a/code/game/objects/closets/ert.dm
+++ b/code/game/objects/closets/ert.dm
@@ -10,7 +10,6 @@
New()
..()
- sleep(2)
new /obj/item/clothing/head/helmet/space/ert/commander(src)
new /obj/item/clothing/suit/space/ert/commander(src)
new /obj/item/weapon/plastique(src)
@@ -34,7 +33,6 @@
New()
..()
- sleep(2)
new /obj/item/clothing/head/helmet/space/ert/security(src)
new /obj/item/clothing/suit/space/ert/security(src)
new /obj/item/weapon/plastique(src)
@@ -57,7 +55,6 @@
New()
..()
- sleep(2)
new /obj/item/clothing/head/helmet/space/ert/engineer(src)
new /obj/item/clothing/suit/space/ert/engineer(src)
new /obj/item/weapon/gun/energy/taser(src)
@@ -79,7 +76,6 @@
New()
..()
- sleep(2)
new /obj/item/clothing/head/helmet/space/ert/medical(src)
new /obj/item/clothing/suit/space/ert/medical(src)
new /obj/item/weapon/gun/energy/taser(src)
diff --git a/code/game/objects/closets/secure/civilian.dm b/code/game/objects/closets/secure/civilian.dm
index 5952bd0ebf..5dbcd966a5 100644
--- a/code/game/objects/closets/secure/civilian.dm
+++ b/code/game/objects/closets/secure/civilian.dm
@@ -5,7 +5,6 @@
New()
..()
- sleep(2)
new /obj/item/wardrobe/chef(src)
//
var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src)
@@ -20,7 +19,6 @@
New()
..()
- sleep(2)
new /obj/item/weapon/reagent_containers/food/drinks/beer( src )
new /obj/item/weapon/reagent_containers/food/drinks/beer( src )
new /obj/item/weapon/reagent_containers/food/drinks/beer( src )
@@ -39,7 +37,6 @@
New()
..()
- sleep(2)
new /obj/item/wardrobe/bartender(src)
//
var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src)
@@ -57,7 +54,6 @@
New()
..()
- sleep(2)
new /obj/item/wardrobe/hydro
//
var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src)
@@ -72,7 +68,6 @@
New()
..()
- sleep(2)
new /obj/item/wardrobe/janitor(src)
//
var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src)
@@ -86,7 +81,6 @@
New()
..()
- sleep(2)
new /obj/item/wardrobe/lawyer(src)
//
var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src)
@@ -102,7 +96,6 @@
New()
..()
- sleep(2)
new /obj/item/wardrobe/librarian(src)
//
var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src)
@@ -116,7 +109,6 @@
New()
..()
- sleep(2)
new /obj/item/wardrobe/chaplain(src)
//
new /obj/item/weapon/storage/backpack/cultpack (src)
diff --git a/code/game/objects/closets/secure/research.dm b/code/game/objects/closets/secure/research.dm
index dc4081a3d0..3bbd5899f4 100755
--- a/code/game/objects/closets/secure/research.dm
+++ b/code/game/objects/closets/secure/research.dm
@@ -10,7 +10,6 @@
New()
..()
- sleep(2)
new /obj/item/wardrobe/scientist(src)
//
var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src)
@@ -35,7 +34,6 @@
New()
..()
- sleep(2)
new /obj/item/wardrobe/rd(src)
//
var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src)
diff --git a/code/game/objects/effects/aliens.dm b/code/game/objects/effects/aliens.dm
index 0ee04f0230..56e5327079 100644
--- a/code/game/objects/effects/aliens.dm
+++ b/code/game/objects/effects/aliens.dm
@@ -127,9 +127,6 @@
healthcheck()
return
-/obj/effect/alien/resin/attack_paw()
- return attack_hand()
-
/obj/effect/alien/resin/attackby(obj/item/weapon/W as obj, mob/user as mob)
var/aforce = W.force
diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm
index ee82396788..e67288a52b 100644
--- a/code/game/objects/effects/effect_system.dm
+++ b/code/game/objects/effects/effect_system.dm
@@ -653,10 +653,6 @@ steam.start() -- spawns the effect
if(metal==1 || prob(50))
del(src)
- attack_paw(var/mob/user)
- attack_hand(user)
- return
-
attack_hand(var/mob/user)
if ((HULK in user.mutations) || (prob(75 - metal*25)))
user << "\blue You smash through the metal foam wall."
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 33b6159a8c..4544156923 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -152,30 +152,6 @@
user.put_in_active_hand(src)
return
-
-/obj/item/attack_paw(mob/user as mob)
-
- if (istype(src.loc, /obj/item/weapon/storage))
- for(var/mob/M in range(1, src.loc))
- if (M.s_active == src.loc)
- if (M.client)
- M.client.screen -= src
- src.throwing = 0
- if (src.loc == user)
- //canremove==0 means that object may not be removed. You can still wear it. This only applies to clothing. /N
- if(istype(src, /obj/item/clothing) && !src:canremove)
- return
- else
- user.u_equip(src)
- else
- if(istype(src.loc, /mob/living))
- return
- src.pickup(user)
- user.next_move = max(user.next_move+2,world.time + 2)
-
- user.put_in_active_hand(src)
- return
-
// Due to storage type consolidation this should get used more now.
// I have cleaned it up a little, but it could probably use more. -Sayu
/obj/item/attackby(obj/item/weapon/W as obj, mob/user as mob)
diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm
index 574bfd1905..b1b46654bc 100644
--- a/code/game/objects/items/bodybag.dm
+++ b/code/game/objects/items/bodybag.dm
@@ -40,54 +40,60 @@
var/item_path = /obj/item/bodybag
density = 0
storage_capacity = (mob_size * 2) - 1
+ var/contains_body = 0
- attackby(W as obj, mob/user as mob)
- if (istype(W, /obj/item/weapon/pen))
- var/t = input(user, "What would you like the label to be?", text("[]", src.name), null) as text
- if (user.get_active_hand() != W)
- return
- if (!in_range(src, user) && src.loc != user)
- return
- t = copytext(sanitize(t),1,MAX_MESSAGE_LEN)
- if (t)
- src.name = "body bag - "
- src.name += t
- src.overlays += image(src.icon, "bodybag_label")
- else
- src.name = "body bag"
- //..() //Doesn't need to run the parent. Since when can fucking bodybags be welded shut? -Agouri
+/obj/structure/closet/body_bag/attackby(W as obj, mob/user as mob)
+ if (istype(W, /obj/item/weapon/pen))
+ var/t = input(user, "What would you like the label to be?", text("[]", src.name), null) as text
+ if (user.get_active_hand() != W)
return
- else if(istype(W, /obj/item/weapon/wirecutters))
- user << "You cut the tag off the bodybag"
+ if (!in_range(src, user) && src.loc != user)
+ return
+ t = copytext(sanitize(t),1,MAX_MESSAGE_LEN)
+ if (t)
+ src.name = "body bag - "
+ src.name += t
+ src.overlays += image(src.icon, "bodybag_label")
+ else
src.name = "body bag"
- src.overlays.Cut()
- return
+ //..() //Doesn't need to run the parent. Since when can fucking bodybags be welded shut? -Agouri
+ return
+ else if(istype(W, /obj/item/weapon/wirecutters))
+ user << "You cut the tag off the bodybag"
+ src.name = "body bag"
+ src.overlays.Cut()
+ return
+/obj/structure/closet/body_bag/store_mobs(var/stored_units)
+ contains_body = ..()
+ return contains_body
- close()
- if(..())
- density = 0
- return 1
- return 0
+/obj/structure/closet/body_bag/close()
+ if(..())
+ density = 0
+ return 1
+ return 0
+/obj/structure/closet/body_bag/MouseDrop(over_object, src_location, over_location)
+ ..()
+ if((over_object == usr && (in_range(src, usr) || usr.contents.Find(src))))
+ if(!ishuman(usr)) return
+ if(opened) return 0
+ if(contents.len) return 0
+ visible_message("[usr] folds up the [src.name]")
+ new item_path(get_turf(src))
+ spawn(0)
+ del(src)
+ return
- MouseDrop(over_object, src_location, over_location)
- ..()
- if((over_object == usr && (in_range(src, usr) || usr.contents.Find(src))))
- if(!ishuman(usr)) return
- if(opened) return 0
- if(contents.len) return 0
- visible_message("[usr] folds up the [src.name]")
- new item_path(get_turf(src))
- spawn(0)
- del(src)
- return
-
-/obj/structure/closet/bodybag/update_icon()
- if(!opened)
- icon_state = icon_closed
- else
+/obj/structure/closet/body_bag/update_icon()
+ if(opened)
icon_state = icon_opened
+ else
+ if(contains_body > 0)
+ icon_state = "bodybag_closed1"
+ else
+ icon_state = icon_closed
/obj/item/bodybag/cryobag
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index b43035509a..eae3c09592 100755
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -144,6 +144,12 @@ var/global/list/obj/item/device/pda/PDAs = list()
detonate = 0
//toff = 1
+/obj/item/device/pda/ert
+ default_cartridge = /obj/item/weapon/cartridge/captain
+ icon_state = "pda-h"
+ detonate = 0
+ hidden = 1
+
/obj/item/device/pda/cargo
default_cartridge = /obj/item/weapon/cartridge/quartermaster
icon_state = "pda-cargo"
diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm
index 72e39b7063..106316dc87 100644
--- a/code/game/objects/items/devices/powersink.dm
+++ b/code/game/objects/items/devices/powersink.dm
@@ -58,11 +58,6 @@
else
..()
-
-
- attack_paw()
- return
-
attack_ai()
return
diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm
index 28646e2105..22976e9cb5 100644
--- a/code/game/objects/items/devices/radio/intercom.dm
+++ b/code/game/objects/items/devices/radio/intercom.dm
@@ -24,10 +24,6 @@
spawn (0)
attack_self(user)
-/obj/item/device/radio/intercom/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
-
/obj/item/device/radio/intercom/attack_hand(mob/user as mob)
src.add_fingerprint(user)
spawn (0)
diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm
index c1126464f5..f65442e462 100644
--- a/code/game/objects/items/stacks/sheets/glass.dm
+++ b/code/game/objects/items/stacks/sheets/glass.dm
@@ -64,7 +64,6 @@
if(!user || !src) return 0
if(!istype(user.loc,/turf)) return 0
if(!user.IsAdvancedToolUser())
- user << "\red You don't have the dexterity to do this!"
return 0
var/title = "Sheet-Glass"
title += " ([src.amount] sheet\s left)"
@@ -145,7 +144,6 @@
if(!user || !src) return 0
if(!istype(user.loc,/turf)) return 0
if(!user.IsAdvancedToolUser())
- user << "\red You don't have the dexterity to do this!"
return 0
var/title = "Sheet Reinf. Glass"
title += " ([src.amount] sheet\s left)"
diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm
index 95cf77dd21..e41b29364e 100644
--- a/code/game/objects/items/weapons/dna_injector.dm
+++ b/code/game/objects/items/weapons/dna_injector.dm
@@ -28,9 +28,6 @@
SetValue(src.value)
//testing("[name]: DNA2 SE blocks after SetValue: [english_list(buf.dna.SE)]")
-/obj/item/weapon/dnainjector/attack_paw(mob/user as mob)
- return attack_hand(user)
-
/obj/item/weapon/dnainjector/proc/GetRealBlock(var/selblock)
if(selblock==0)
return block
diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm
index c7df55f3e0..2ff3114423 100644
--- a/code/game/objects/items/weapons/grenades/grenade.dm
+++ b/code/game/objects/items/weapons/grenades/grenade.dm
@@ -108,7 +108,4 @@
/obj/item/weapon/grenade/attack_hand()
walk(src, null, null)
..()
- return
-
-/obj/item/weapon/grenade/attack_paw(mob/user as mob)
- return attack_hand(user)
+ return
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index be98962411..5b6a0ddc4b 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -24,7 +24,8 @@
"/obj/item/stack/cable_coil",
"/obj/item/device/t_scanner",
"/obj/item/device/analyzer",
- "/obj/item/taperoll/engineering")
+ "/obj/item/taperoll/engineering",
+ "/obj/item/device/robotanalyzer")
/obj/item/weapon/storage/belt/utility/full/New()
@@ -82,7 +83,7 @@
max_w_class = 3
max_combined_w_class = 21
can_hold = list(
- "/obj/item/weapon/grenade/flashbang",
+ "/obj/item/weapon/grenade",
"/obj/item/weapon/reagent_containers/spray/pepper",
"/obj/item/weapon/handcuffs",
"/obj/item/device/flash",
@@ -140,4 +141,4 @@
item_state = "swatbelt"
storage_slots = 9
max_w_class = 3
- max_combined_w_class = 21
+ max_combined_w_class = 21
diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm
index 079b0c9fb2..b3e94bf4d9 100644
--- a/code/game/objects/items/weapons/storage/secure.dm
+++ b/code/game/objects/items/weapons/storage/secure.dm
@@ -31,9 +31,6 @@
if(..(user, 1))
user << text("The service panel is [src.open ? "open" : "closed"].")
- attack_paw(mob/user as mob)
- return attack_hand(user)
-
attackby(obj/item/weapon/W as obj, mob/user as mob)
if(locked)
if ( (istype(W, /obj/item/weapon/card/emag)||istype(W, /obj/item/weapon/melee/energy/blade)) && (!src.emagged))
diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm
index bed3cb9de0..a4c9a2bc85 100644
--- a/code/game/objects/structures.dm
+++ b/code/game/objects/structures.dm
@@ -1,5 +1,6 @@
/obj/structure
icon = 'icons/obj/structures.dmi'
+
var/climbable
var/breakable
var/parts
@@ -14,22 +15,12 @@
if(breakable)
if(HULK in user.mutations)
user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
- visible_message("[user] smashes the [src] apart!")
- destroy()
+ attack_generic(user,1,"smashes")
else if(istype(user,/mob/living/carbon/human))
var/mob/living/carbon/human/H = user
if(H.species.can_shred(user))
- visible_message("[H] slices [src] apart!")
- destroy()
-
-/obj/structure/attack_animal(mob/living/user)
- if(breakable)
- if(user.wall_smash)
- visible_message("[user] smashes [src] apart!")
- destroy()
-
-/obj/structure/attack_paw(mob/user)
- if(breakable) attack_hand(user)
+ attack_generic(user,1,"slices")
+ return
/obj/structure/blob_act()
if(prob(50))
@@ -175,4 +166,11 @@
if (issilicon(user))
user << "You need hands for this."
return 0
+ return 1
+
+/obj/structure/attack_generic(var/mob/user, var/damage, var/attack_verb, var/wallbreaker)
+ if(!breakable || !damage || !wallbreaker)
+ return 0
+ visible_message("[user] [attack_verb] the [src] apart!")
+ spawn(1) destroy()
return 1
\ No newline at end of file
diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm
index 3e6348d5ec..8a3cccae46 100644
--- a/code/game/objects/structures/bedsheet_bin.dm
+++ b/code/game/objects/structures/bedsheet_bin.dm
@@ -108,7 +108,7 @@ LINEN BINS
/obj/structure/bedsheetbin/examine(mob/user)
..(user)
-
+
if(amount < 1)
user << "There are no bed sheets in the bin."
return
@@ -138,12 +138,6 @@ LINEN BINS
hidden = I
user << "You hide [I] among the sheets."
-
-
-/obj/structure/bedsheetbin/attack_paw(mob/user as mob)
- return attack_hand(user)
-
-
/obj/structure/bedsheetbin/attack_hand(mob/user as mob)
if(amount >= 1)
amount--
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 637b762706..44c2c3b900 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -23,13 +23,11 @@
var/const/mob_size = 15
-/obj/structure/closet/New()
- ..()
- spawn(1)
- if(!opened) // if closed, any item at the crate's loc is put in the contents
- for(var/obj/item/I in src.loc)
- if(I.density || I.anchored || I == src) continue
- I.loc = src
+/obj/structure/closet/initialize()
+ if(!opened) // if closed, any item at the crate's loc is put in the contents
+ for(var/obj/item/I in src.loc)
+ if(I.density || I.anchored || I == src) continue
+ I.loc = src
/obj/structure/closet/alter_health()
return get_turf(src)
@@ -87,11 +85,11 @@
var/stored_units = 0
if(store_misc)
- stored_units = store_misc(stored_units)
+ stored_units += store_misc(stored_units)
if(store_items)
- stored_units = store_items(stored_units)
+ stored_units += store_items(stored_units)
if(store_mobs)
- stored_units = store_mobs(stored_units)
+ stored_units += store_mobs(stored_units)
src.icon_state = src.icon_closed
src.opened = 0
@@ -102,26 +100,29 @@
//Cham Projector Exception
/obj/structure/closet/proc/store_misc(var/stored_units)
+ var/added_units = 0
for(var/obj/effect/dummy/chameleon/AD in src.loc)
- if(stored_units > storage_capacity)
+ if((stored_units + added_units) > storage_capacity)
break
AD.loc = src
- stored_units++
- return stored_units
+ added_units++
+ return added_units
/obj/structure/closet/proc/store_items(var/stored_units)
+ var/added_units = 0
for(var/obj/item/I in src.loc)
var/item_size = Ceiling(I.w_class / 2)
- if(stored_units + item_size > storage_capacity)
+ if(stored_units + added_units + item_size > storage_capacity)
continue
if(!I.anchored)
I.loc = src
- stored_units += item_size
- return stored_units
+ added_units += item_size
+ return added_units
/obj/structure/closet/proc/store_mobs(var/stored_units)
+ var/added_units = 0
for(var/mob/M in src.loc)
- if(stored_units + mob_size > storage_capacity)
+ if(stored_units + added_units + mob_size > storage_capacity)
break
if(istype (M, /mob/dead/observer))
continue
@@ -133,13 +134,14 @@
M.client.eye = src
M.loc = src
- stored_units += mob_size
- return stored_units
+ added_units += mob_size
+ return added_units
/obj/structure/closet/proc/toggle(mob/user as mob)
if(!(src.opened ? src.close() : src.open()))
user << "It won't budge!"
- return
+ return
+ update_icon()
// this should probably use dump_contents()
/obj/structure/closet/ex_act(severity)
@@ -172,13 +174,6 @@
return
-/obj/structure/closet/attack_animal(mob/living/user as mob)
- if(user.wall_smash)
- visible_message("\red [user] destroys the [src]. ")
- for(var/atom/movable/A as mob|obj in src)
- A.loc = src.loc
- del(src)
-
// this should probably use dump_contents()
/obj/structure/closet/blob_act()
if(prob(75))
@@ -265,10 +260,6 @@
spawn(30)
lastbang = 0
-
-/obj/structure/closet/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
/obj/structure/closet/attack_hand(mob/user as mob)
src.add_fingerprint(user)
src.toggle(user)
@@ -306,4 +297,12 @@
for (var/atom/A in src)
if(istype(A,/obj/))
var/obj/O = A
- O.hear_talk(M, text)
\ No newline at end of file
+ O.hear_talk(M, text)
+
+/obj/structure/closet/attack_generic(var/mob/user, var/damage, var/attack_message = "destroys", var/wallbreaker)
+ if(!damage || !wallbreaker)
+ return
+ visible_message("[user] [attack_message] the [src]!")
+ dump_contents()
+ spawn(1) del(src)
+ return 1
\ No newline at end of file
diff --git a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
index 87eb2cb811..5ce93c76a4 100644
--- a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
+++ b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
@@ -181,10 +181,6 @@
usr << "\blue The [src.name] is closed."
update_icon()
- attack_paw(mob/user as mob)
- attack_hand(user)
- return
-
attack_ai(mob/user as mob)
if(src.smashed)
user << "\red The security of the cabinet is compromised."
diff --git a/code/game/objects/structures/crates_lockers/closets/fitness.dm b/code/game/objects/structures/crates_lockers/closets/fitness.dm
index 59ddcf57c9..6536e065e5 100644
--- a/code/game/objects/structures/crates_lockers/closets/fitness.dm
+++ b/code/game/objects/structures/crates_lockers/closets/fitness.dm
@@ -6,7 +6,6 @@
/obj/structure/closet/athletic_mixed/New()
..()
- sleep(2)
new /obj/item/clothing/under/shorts/grey(src)
new /obj/item/clothing/under/shorts/black(src)
new /obj/item/clothing/under/shorts/red(src)
@@ -30,7 +29,6 @@
/obj/structure/closet/boxinggloves/New()
..()
- sleep(2)
new /obj/item/clothing/gloves/boxing/blue(src)
new /obj/item/clothing/gloves/boxing/green(src)
new /obj/item/clothing/gloves/boxing/yellow(src)
@@ -43,7 +41,6 @@
/obj/structure/closet/masks/New()
..()
- sleep(2)
new /obj/item/clothing/mask/luchador(src)
new /obj/item/clothing/mask/luchador/rudos(src)
new /obj/item/clothing/mask/luchador/tecnicos(src)
@@ -57,7 +54,6 @@
/obj/structure/closet/lasertag/red/New()
..()
- sleep(2)
new /obj/item/weapon/gun/energy/laser/redtag(src)
new /obj/item/weapon/gun/energy/laser/redtag(src)
new /obj/item/clothing/suit/redtag(src)
@@ -72,7 +68,6 @@
/obj/structure/closet/lasertag/blue/New()
..()
- sleep(2)
new /obj/item/weapon/gun/energy/laser/bluetag(src)
new /obj/item/weapon/gun/energy/laser/bluetag(src)
new /obj/item/clothing/suit/bluetag(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/gimmick.dm b/code/game/objects/structures/crates_lockers/closets/gimmick.dm
index 86d0f1825b..62412f1093 100644
--- a/code/game/objects/structures/crates_lockers/closets/gimmick.dm
+++ b/code/game/objects/structures/crates_lockers/closets/gimmick.dm
@@ -36,7 +36,6 @@
/obj/structure/closet/gimmick/russian/New()
..()
- sleep(2)
new /obj/item/clothing/head/ushanka(src)
new /obj/item/clothing/head/ushanka(src)
new /obj/item/clothing/head/ushanka(src)
@@ -58,7 +57,6 @@
/obj/structure/closet/gimmick/tacticool/New()
..()
- sleep(2)
new /obj/item/clothing/glasses/eyepatch(src)
new /obj/item/clothing/glasses/sunglasses(src)
new /obj/item/clothing/gloves/swat(src)
@@ -85,14 +83,12 @@
/obj/structure/closet/thunderdome/New()
..()
- sleep(2)
/obj/structure/closet/thunderdome/tdred
name = "red-team Thunderdome closet"
/obj/structure/closet/thunderdome/tdred/New()
..()
- sleep(2)
new /obj/item/clothing/suit/armor/tdome/red(src)
new /obj/item/clothing/suit/armor/tdome/red(src)
new /obj/item/clothing/suit/armor/tdome/red(src)
@@ -120,7 +116,6 @@
/obj/structure/closet/thunderdome/tdgreen/New()
..()
- sleep(2)
new /obj/item/clothing/suit/armor/tdome/green(src)
new /obj/item/clothing/suit/armor/tdome/green(src)
new /obj/item/clothing/suit/armor/tdome/green(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
index becfa9d7fd..821fd8ef9a 100644
--- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
@@ -16,7 +16,6 @@
/obj/structure/closet/gmcloset/New()
..()
- sleep(2)
new /obj/item/clothing/head/that(src)
new /obj/item/clothing/head/that(src)
new /obj/item/device/radio/headset/headset_service(src)
@@ -43,7 +42,6 @@
/obj/structure/closet/chefcloset/New()
..()
- sleep(2)
new /obj/item/clothing/under/sundress(src)
new /obj/item/clothing/under/waiter(src)
new /obj/item/clothing/under/waiter(src)
@@ -65,7 +63,6 @@
/obj/structure/closet/jcloset/New()
..()
- sleep(2)
new /obj/item/clothing/under/rank/janitor(src)
new /obj/item/device/radio/headset/headset_service(src)
new /obj/item/weapon/cartridge/janitor(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/l3closet.dm b/code/game/objects/structures/crates_lockers/closets/l3closet.dm
index 97062911dd..a6890430ef 100644
--- a/code/game/objects/structures/crates_lockers/closets/l3closet.dm
+++ b/code/game/objects/structures/crates_lockers/closets/l3closet.dm
@@ -7,7 +7,6 @@
/obj/structure/closet/l3closet/New()
..()
- sleep(2)
new /obj/item/clothing/suit/bio_suit/general( src )
new /obj/item/clothing/head/bio_hood/general( src )
@@ -19,7 +18,6 @@
/obj/structure/closet/l3closet/general/New()
..()
- sleep(2)
contents = list()
new /obj/item/clothing/suit/bio_suit/general( src )
new /obj/item/clothing/head/bio_hood/general( src )
@@ -32,7 +30,6 @@
/obj/structure/closet/l3closet/virology/New()
..()
- sleep(2)
contents = list()
new /obj/item/clothing/suit/bio_suit/virology( src )
new /obj/item/clothing/head/bio_hood/virology( src )
@@ -47,7 +44,6 @@
/obj/structure/closet/l3closet/security/New()
..()
- sleep(2)
contents = list()
new /obj/item/clothing/suit/bio_suit/security( src )
new /obj/item/clothing/head/bio_hood/security( src )
@@ -60,7 +56,6 @@
/obj/structure/closet/l3closet/janitor/New()
..()
- sleep(2)
contents = list()
new /obj/item/clothing/suit/bio_suit/janitor( src )
new /obj/item/clothing/head/bio_hood/janitor( src )
@@ -73,7 +68,6 @@
/obj/structure/closet/l3closet/scientist/New()
..()
- sleep(2)
contents = list()
new /obj/item/clothing/suit/bio_suit/scientist( src )
new /obj/item/clothing/head/bio_hood/scientist( src )
\ No newline at end of file
diff --git a/code/game/objects/structures/crates_lockers/closets/malfunction.dm b/code/game/objects/structures/crates_lockers/closets/malfunction.dm
index 7cfb4f18e2..9c01b2687e 100644
--- a/code/game/objects/structures/crates_lockers/closets/malfunction.dm
+++ b/code/game/objects/structures/crates_lockers/closets/malfunction.dm
@@ -7,7 +7,6 @@
/obj/structure/closet/malf/suits/New()
..()
- sleep(2)
new /obj/item/weapon/tank/jetpack/void(src)
new /obj/item/clothing/mask/breath(src)
new /obj/item/clothing/head/helmet/space/nasavoid(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/bar.dm b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm
index 95ac7f0c94..42759e3380 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/bar.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/bar.dm
@@ -11,7 +11,6 @@
New()
..()
- sleep(2)
new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src )
new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src )
new /obj/item/weapon/reagent_containers/food/drinks/cans/beer( src )
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
index 14fd16914c..f7e3a25bb3 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
@@ -10,7 +10,6 @@
New()
..()
- sleep(2)
new /obj/item/clothing/under/rank/cargotech(src)
new /obj/item/clothing/shoes/black(src)
new /obj/item/device/radio/headset/headset_cargo(src)
@@ -31,7 +30,6 @@
New()
..()
- sleep(2)
new /obj/item/clothing/under/rank/cargo(src)
new /obj/item/clothing/shoes/brown(src)
new /obj/item/device/radio/headset/headset_cargo(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
index cef66a61c6..76528200fe 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
@@ -11,7 +11,6 @@
New()
..()
- sleep(2)
if(prob(50))
new /obj/item/weapon/storage/backpack/industrial(src)
else
@@ -51,7 +50,6 @@
New()
..()
- sleep(2)
new /obj/item/clothing/gloves/yellow(src)
new /obj/item/clothing/gloves/yellow(src)
new /obj/item/weapon/storage/toolbox/electrical(src)
@@ -80,7 +78,6 @@
New()
..()
- sleep(2)
new /obj/item/clothing/head/welding(src)
new /obj/item/clothing/head/welding(src)
new /obj/item/clothing/head/welding(src)
@@ -107,7 +104,6 @@
New()
..()
- sleep(2)
if(prob(50))
new /obj/item/weapon/storage/backpack/industrial(src)
else
@@ -137,7 +133,6 @@
New()
..()
- sleep(2)
if(prob(50))
new /obj/item/weapon/storage/backpack/industrial(src)
else
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm
index eb5ca2cf7d..4f326f0fb8 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm
@@ -18,7 +18,6 @@
New()
..()
- sleep(2)
for(var/i = 0, i < 6, i++)
new /obj/item/weapon/reagent_containers/food/snacks/flour(src)
new /obj/item/weapon/reagent_containers/food/condiment/sugar(src)
@@ -44,7 +43,6 @@
New()
..()
- sleep(2)
for(var/i = 0, i < 4, i++)
new /obj/item/weapon/reagent_containers/food/snacks/meat/monkey(src)
return
@@ -63,7 +61,6 @@
New()
..()
- sleep(2)
for(var/i = 0, i < 5, i++)
new /obj/item/weapon/reagent_containers/food/drinks/milk(src)
for(var/i = 0, i < 3, i++)
@@ -87,7 +84,6 @@
New()
..()
- sleep(2)
for(var/i = 0, i < 3, i++)
new /obj/item/weapon/spacecash/c1000(src)
for(var/i = 0, i < 5, i++)
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 4f5b9a9adf..3f7d24542e 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm
@@ -11,7 +11,6 @@
New()
..()
- sleep(2)
switch(rand(1,2))
if(1)
new /obj/item/clothing/suit/apron(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
index 0260bb0b0a..0ee184429a 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
@@ -12,7 +12,6 @@
New()
..()
- sleep(2)
new /obj/item/weapon/storage/box/autoinjectors(src)
new /obj/item/weapon/storage/box/syringes(src)
new /obj/item/weapon/reagent_containers/dropper(src)
@@ -41,7 +40,6 @@
New()
..()
- sleep(2)
new /obj/item/weapon/tank/anesthetic(src)
new /obj/item/weapon/tank/anesthetic(src)
new /obj/item/weapon/tank/anesthetic(src)
@@ -64,7 +62,6 @@
New()
..()
- sleep(2)
if(prob(50))
new /obj/item/weapon/storage/backpack/medic(src)
else
@@ -115,7 +112,6 @@
New()
..()
- sleep(2)
if(prob(50))
new /obj/item/weapon/storage/backpack/medic(src)
else
@@ -153,7 +149,6 @@
New()
..()
- sleep(2)
new /obj/item/device/assembly/signaler(src)
new /obj/item/device/radio/electropack(src)
new /obj/item/device/radio/electropack(src)
@@ -176,7 +171,6 @@
New()
..()
- sleep(2)
new /obj/item/weapon/storage/box/pillbottles(src)
new /obj/item/weapon/storage/box/pillbottles(src)
return
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
index 2b657241c9..5d6e7c3a0e 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
@@ -10,7 +10,6 @@
New()
..()
- sleep(2)
new /obj/item/clothing/under/rank/scientist(src)
//new /obj/item/clothing/suit/labcoat/science(src)
new /obj/item/clothing/suit/storage/toggle/labcoat(src)
@@ -35,7 +34,6 @@
New()
..()
- sleep(2)
new /obj/item/clothing/suit/bio_suit/scientist(src)
new /obj/item/clothing/head/bio_hood/scientist(src)
new /obj/item/clothing/under/rank/research_director(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
index f6ce5d6d81..479fdcb262 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
@@ -104,9 +104,6 @@
else
src.toggle(user)
-/obj/structure/closet/secure_closet/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
/obj/structure/closet/secure_closet/verb/verb_togglelock()
set src in oview(1) // One square distance
set category = "Object"
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index 088b120555..b772f95e9a 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -10,7 +10,6 @@
New()
..()
- sleep(2)
if(prob(50))
new /obj/item/weapon/storage/backpack/captain(src)
else
@@ -47,7 +46,6 @@
New()
..()
- sleep(2)
new /obj/item/clothing/glasses/sunglasses(src)
new /obj/item/clothing/suit/armor/vest(src)
new /obj/item/clothing/head/helmet(src)
@@ -71,7 +69,6 @@
New()
..()
- sleep(2)
new /obj/item/clothing/under/rank/head_of_personnel(src)
new /obj/item/clothing/under/dress/dress_hop(src)
new /obj/item/clothing/under/dress/dress_hr(src)
@@ -101,7 +98,6 @@
New()
..()
- sleep(2)
if(prob(50))
new /obj/item/weapon/storage/backpack/security(src)
else
@@ -143,7 +139,6 @@
New()
..()
- sleep(2)
if(prob(50))
new /obj/item/weapon/storage/backpack/security(src)
else
@@ -180,7 +175,6 @@
New()
..()
- sleep(2)
if(prob(50))
new /obj/item/weapon/storage/backpack/security(src)
else
@@ -249,7 +243,6 @@
New()
..()
- sleep(2)
new /obj/item/clothing/under/det(src)
new /obj/item/clothing/under/det/black(src)
new /obj/item/clothing/under/det/slob(src)
@@ -291,7 +284,6 @@
New()
..()
- sleep(2)
new /obj/item/weapon/reagent_containers/ld50_syringe/choral(src)
new /obj/item/weapon/reagent_containers/ld50_syringe/choral(src)
return
@@ -318,7 +310,6 @@
New()
..()
- sleep(2)
new /obj/item/clothing/shoes/brown(src)
new /obj/item/weapon/paper/Court (src)
new /obj/item/weapon/paper/Court (src)
diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm
index c62ea02d92..c7991115ad 100644
--- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm
+++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm
@@ -11,7 +11,6 @@
/obj/structure/closet/syndicate/personal/New()
..()
- sleep(2)
new /obj/item/weapon/tank/jetpack/oxygen(src)
new /obj/item/clothing/mask/gas/syndicate(src)
new /obj/item/clothing/under/syndicate(src)
@@ -30,7 +29,6 @@
/obj/structure/closet/syndicate/suit/New()
..()
- sleep(2)
new /obj/item/weapon/tank/jetpack/oxygen(src)
new /obj/item/clothing/shoes/magboots(src)
new /obj/item/clothing/suit/space/rig/syndi(src)
@@ -43,7 +41,7 @@
/obj/structure/closet/syndicate/nuclear/New()
..()
- sleep(2)
+
new /obj/item/ammo_magazine/a12mm(src)
new /obj/item/ammo_magazine/a12mm(src)
new /obj/item/ammo_magazine/a12mm(src)
@@ -77,7 +75,6 @@
var/rare_max = 20 //Maximum HONK HONK HONK in the HONK for HONK rare HONK
- sleep(2)
var/pickednum = rand(1, 50)
@@ -141,7 +138,6 @@
/obj/item/stack/rods
)
- sleep(2)
for(var/i = 0, i<2, i++)
for(var/res in resources)
diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
index 550c5aa499..090b2c8145 100644
--- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
@@ -171,7 +171,6 @@
/obj/structure/closet/bombcloset/New()
..()
- sleep(2)
new /obj/item/clothing/suit/bomb_suit( src )
new /obj/item/clothing/under/color/black( src )
new /obj/item/clothing/shoes/black( src )
@@ -187,7 +186,6 @@
/obj/structure/closet/bombclosetsecurity/New()
..()
- sleep(2)
new /obj/item/clothing/suit/bomb_suit/security( src )
new /obj/item/clothing/under/rank/security( src )
new /obj/item/clothing/shoes/brown( src )
@@ -208,7 +206,6 @@
/obj/structure/closet/hydrant/New()
..()
- sleep(2)
new /obj/item/clothing/suit/fire/firefighter(src)
new /obj/item/clothing/mask/gas(src)
new /obj/item/device/flashlight(src)
diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm
index c6cf316b2b..f30e0e2545 100644
--- a/code/game/objects/structures/displaycase.dm
+++ b/code/game/objects/structures/displaycase.dm
@@ -76,9 +76,6 @@
..()
return
-/obj/structure/displaycase/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
/obj/structure/displaycase/attack_hand(mob/user as mob)
if (src.destroyed && src.occupied)
new /obj/item/weapon/gun/energy/laser/captain( src.loc )
diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm
index 3ba3c79a37..cf61e68b50 100644
--- a/code/game/objects/structures/extinguisher.dm
+++ b/code/game/objects/structures/extinguisher.dm
@@ -54,11 +54,6 @@
opened = !opened
update_icon()
-/obj/structure/extinguisher_cabinet/attack_paw(mob/user)
- attack_hand(user)
- return
-
-
/obj/structure/extinguisher_cabinet/update_icon()
if(!opened)
icon_state = "extinguisher_closed"
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index 93f4777adb..e3ae4353dd 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -6,200 +6,199 @@
var/state = 0
var/health = 200
+/obj/structure/girder/attack_generic(var/mob/user, var/damage, var/attack_message = "smashes apart", var/wallbreaker)
+ if(!damage || !wallbreaker)
+ return 0
+ visible_message("[user] [attack_message] the [src]!")
+ spawn(1) dismantle()
+ return 1
- bullet_act(var/obj/item/projectile/Proj)
- if(istype(Proj, /obj/item/projectile/beam))
- health -= Proj.damage
- ..()
- if(health <= 0)
- new /obj/item/stack/sheet/metal(get_turf(src))
- del(src)
+/obj/structure/girder/bullet_act(var/obj/item/projectile/Proj)
+ if(istype(Proj, /obj/item/projectile/beam))
+ health -= Proj.damage
+ ..()
+ if(health <= 0)
+ new /obj/item/stack/sheet/metal(get_turf(src))
+ del(src)
- return
+ return
- attackby(obj/item/W as obj, mob/user as mob)
- if(istype(W, /obj/item/weapon/wrench) && state == 0)
- if(anchored && !istype(src,/obj/structure/girder/displaced))
- playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
- user << "\blue Now disassembling the girder"
- if(do_after(user,40))
- if(!src) return
- user << "\blue You dissasembled the girder!"
- dismantle()
- else if(!anchored)
- playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
- user << "\blue Now securing the girder"
- if(get_turf(user, 40))
- user << "\blue You secured the girder!"
- new/obj/structure/girder( src.loc )
- del(src)
-
- else if(istype(W, /obj/item/weapon/pickaxe/plasmacutter))
- user << "\blue Now slicing apart the girder"
- if(do_after(user,30))
+/obj/structure/girder/attackby(obj/item/W as obj, mob/user as mob)
+ if(istype(W, /obj/item/weapon/wrench) && state == 0)
+ if(anchored && !istype(src,/obj/structure/girder/displaced))
+ playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
+ user << "\blue Now disassembling the girder"
+ if(do_after(user,40))
if(!src) return
- user << "\blue You slice apart the girder!"
+ user << "\blue You dissasembled the girder!"
dismantle()
-
- else if(istype(W, /obj/item/weapon/pickaxe/diamonddrill))
- user << "\blue You drill through the girder!"
- dismantle()
-
- else if(istype(W, /obj/item/weapon/screwdriver) && state == 2 && istype(src,/obj/structure/girder/reinforced))
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
- user << "\blue Now unsecuring support struts"
- if(do_after(user,40))
- if(!src) return
- user << "\blue You unsecured the support struts!"
- state = 1
-
- else if(istype(W, /obj/item/weapon/wirecutters) && istype(src,/obj/structure/girder/reinforced) && state == 1)
- playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
- user << "\blue Now removing support struts"
- if(do_after(user,40))
- if(!src) return
- user << "\blue You removed the support struts!"
+ else if(!anchored)
+ playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
+ user << "\blue Now securing the girder"
+ if(get_turf(user, 40))
+ user << "\blue You secured the girder!"
new/obj/structure/girder( src.loc )
del(src)
- else if(istype(W, /obj/item/weapon/crowbar) && state == 0 && anchored )
- playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1)
- user << "\blue Now dislodging the girder"
- if(do_after(user, 40))
- if(!src) return
- user << "\blue You dislodged the girder!"
- new/obj/structure/girder/displaced( src.loc )
- del(src)
+ else if(istype(W, /obj/item/weapon/pickaxe/plasmacutter))
+ user << "\blue Now slicing apart the girder"
+ if(do_after(user,30))
+ if(!src) return
+ user << "\blue You slice apart the girder!"
+ dismantle()
- else if(istype(W, /obj/item/stack/sheet))
+ else if(istype(W, /obj/item/weapon/pickaxe/diamonddrill))
+ user << "\blue You drill through the girder!"
+ dismantle()
- var/obj/item/stack/sheet/S = W
- switch(S.type)
+ else if(istype(W, /obj/item/weapon/screwdriver) && state == 2 && istype(src,/obj/structure/girder/reinforced))
+ playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
+ user << "\blue Now unsecuring support struts"
+ if(do_after(user,40))
+ if(!src) return
+ user << "\blue You unsecured the support struts!"
+ state = 1
- if(/obj/item/stack/sheet/metal, /obj/item/stack/sheet/metal/cyborg)
- if(!anchored)
- if(S.use(2))
- user << "You create a false wall! Push on it to open or close the passage."
- new /obj/structure/falsewall (src.loc)
+ else if(istype(W, /obj/item/weapon/wirecutters) && istype(src,/obj/structure/girder/reinforced) && state == 1)
+ playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
+ user << "\blue Now removing support struts"
+ if(do_after(user,40))
+ if(!src) return
+ user << "\blue You removed the support struts!"
+ new/obj/structure/girder( src.loc )
+ del(src)
+
+ else if(istype(W, /obj/item/weapon/crowbar) && state == 0 && anchored )
+ playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1)
+ user << "\blue Now dislodging the girder"
+ if(do_after(user, 40))
+ if(!src) return
+ user << "\blue You dislodged the girder!"
+ new/obj/structure/girder/displaced( src.loc )
+ del(src)
+
+ else if(istype(W, /obj/item/stack/sheet))
+
+ var/obj/item/stack/sheet/S = W
+ switch(S.type)
+
+ if(/obj/item/stack/sheet/metal, /obj/item/stack/sheet/metal/cyborg)
+ if(!anchored)
+ if(S.use(2))
+ user << "You create a false wall! Push on it to open or close the passage."
+ new /obj/structure/falsewall (src.loc)
+ del(src)
+ else
+ if(S.get_amount() < 2) return ..()
+ user << "Now adding plating..."
+ if (do_after(user,40))
+ if (S.use(2))
+ user << "You added the plating!"
+ var/turf/Tsrc = get_turf(src)
+ Tsrc.ChangeTurf(/turf/simulated/wall)
+ for(var/turf/simulated/wall/X in Tsrc.loc)
+ if(X) X.add_hiddenprint(usr)
del(src)
- else
- if(S.get_amount() < 2) return ..()
- user << "Now adding plating..."
- if (do_after(user,40))
- if (S.use(2))
- user << "You added the plating!"
+ return
+
+ if(/obj/item/stack/sheet/plasteel)
+ if(!anchored)
+ if(S.use(2))
+ user << "\blue You create a false wall! Push on it to open or close the passage."
+ new /obj/structure/falserwall (src.loc)
+ del(src)
+ else
+ if (src.icon_state == "reinforced") //I cant believe someone would actually write this line of code...
+ if(S.get_amount() < 1) return ..()
+ user << "Now finalising reinforced wall."
+ if(do_after(user, 50))
+ if (S.use(1))
+ user << "Wall fully reinforced!"
var/turf/Tsrc = get_turf(src)
- Tsrc.ChangeTurf(/turf/simulated/wall)
- for(var/turf/simulated/wall/X in Tsrc.loc)
+ Tsrc.ChangeTurf(/turf/simulated/wall/r_wall)
+ for(var/turf/simulated/wall/r_wall/X in Tsrc.loc)
if(X) X.add_hiddenprint(usr)
del(src)
return
-
- if(/obj/item/stack/sheet/plasteel)
- if(!anchored)
- if(S.use(2))
- user << "\blue You create a false wall! Push on it to open or close the passage."
- new /obj/structure/falserwall (src.loc)
- del(src)
else
- if (src.icon_state == "reinforced") //I cant believe someone would actually write this line of code...
- if(S.get_amount() < 1) return ..()
- user << "Now finalising reinforced wall."
- if(do_after(user, 50))
- if (S.use(1))
- user << "Wall fully reinforced!"
- var/turf/Tsrc = get_turf(src)
- Tsrc.ChangeTurf(/turf/simulated/wall/r_wall)
- for(var/turf/simulated/wall/r_wall/X in Tsrc.loc)
- if(X) X.add_hiddenprint(usr)
- del(src)
- return
- else
- if(S.get_amount() < 1) return ..()
- user << "Now reinforcing girders..."
- if (do_after(user,60))
- if(S.use(1))
- user << "Girders reinforced!"
- new/obj/structure/girder/reinforced( src.loc )
- del(src)
- return
+ if(S.get_amount() < 1) return ..()
+ user << "Now reinforcing girders..."
+ if (do_after(user,60))
+ if(S.use(1))
+ user << "Girders reinforced!"
+ new/obj/structure/girder/reinforced( src.loc )
+ del(src)
+ return
- if(S.sheettype)
- var/M = S.sheettype
- if(!anchored)
- if(S.amount < 2) return
+ if(S.sheettype)
+ var/M = S.sheettype
+ if(!anchored)
+ if(S.amount < 2) return
+ S.use(2)
+ user << "\blue You create a false wall! Push on it to open or close the passage."
+ var/F = text2path("/obj/structure/falsewall/[M]")
+ new F (src.loc)
+ del(src)
+ else
+ if(S.amount < 2) return ..()
+ user << "\blue Now adding plating..."
+ if (do_after(user,40))
+ if(!src || !S || S.amount < 2) return
S.use(2)
- user << "\blue You create a false wall! Push on it to open or close the passage."
- var/F = text2path("/obj/structure/falsewall/[M]")
- new F (src.loc)
+ user << "\blue You added the plating!"
+ var/turf/Tsrc = get_turf(src)
+ Tsrc.ChangeTurf(text2path("/turf/simulated/wall/mineral/[M]"))
+ for(var/turf/simulated/wall/mineral/X in Tsrc.loc)
+ if(X) X.add_hiddenprint(usr)
del(src)
- else
- if(S.amount < 2) return ..()
- user << "\blue Now adding plating..."
- if (do_after(user,40))
- if(!src || !S || S.amount < 2) return
- S.use(2)
- user << "\blue You added the plating!"
- var/turf/Tsrc = get_turf(src)
- Tsrc.ChangeTurf(text2path("/turf/simulated/wall/mineral/[M]"))
- for(var/turf/simulated/wall/mineral/X in Tsrc.loc)
- if(X) X.add_hiddenprint(usr)
- del(src)
- return
+ return
- add_hiddenprint(usr)
+ add_hiddenprint(usr)
- else if(istype(W, /obj/item/pipe))
- var/obj/item/pipe/P = W
- if (P.pipe_type in list(0, 1, 5)) //simple pipes, simple bends, and simple manifolds.
- user.drop_item()
- P.loc = src.loc
- user << "\blue You fit the pipe into the [src]!"
- else
- ..()
+ else if(istype(W, /obj/item/pipe))
+ var/obj/item/pipe/P = W
+ if (P.pipe_type in list(0, 1, 5)) //simple pipes, simple bends, and simple manifolds.
+ user.drop_item()
+ P.loc = src.loc
+ user << "\blue You fit the pipe into the [src]!"
+ else
+ ..()
- proc/dismantle()
- new /obj/item/stack/sheet/metal(get_turf(src))
+/obj/structure/girder/proc/dismantle()
+ new /obj/item/stack/sheet/metal(get_turf(src))
+ del(src)
+
+/obj/structure/girder/attack_hand(mob/user as mob)
+ if (HULK in user.mutations)
+ visible_message("[user] smashes [src] apart!")
+ dismantle()
+ return
+ return ..()
+
+/obj/structure/girder/blob_act()
+ if(prob(40))
del(src)
- attack_hand(mob/user as mob)
- if (HULK in user.mutations)
- visible_message("[user] smashes [src] apart!")
- dismantle()
- return
- return ..()
- attack_animal(mob/living/simple_animal/user)
- if(user.wall_smash)
- visible_message("[user] smashes [src] apart!")
- dismantle()
- return
- return ..()
-
- blob_act()
- if(prob(40))
+/obj/structure/girder/ex_act(severity)
+ switch(severity)
+ if(1.0)
del(src)
-
-
- ex_act(severity)
- switch(severity)
- if(1.0)
+ return
+ if(2.0)
+ if (prob(30))
+ var/remains = pick(/obj/item/stack/rods,/obj/item/stack/sheet/metal)
+ new remains(loc)
del(src)
- return
- if(2.0)
- if (prob(30))
- var/remains = pick(/obj/item/stack/rods,/obj/item/stack/sheet/metal)
- new remains(loc)
- del(src)
- return
- if(3.0)
- if (prob(5))
- var/remains = pick(/obj/item/stack/rods,/obj/item/stack/sheet/metal)
- new remains(loc)
- del(src)
- return
- else
- return
+ return
+ if(3.0)
+ if (prob(5))
+ var/remains = pick(/obj/item/stack/rods,/obj/item/stack/sheet/metal)
+ new remains(loc)
+ del(src)
+ return
+ else
+ return
/obj/structure/girder/displaced
icon_state = "displaced"
@@ -219,54 +218,54 @@
layer = 2
var/health = 250
- attackby(obj/item/W as obj, mob/user as mob)
- if(istype(W, /obj/item/weapon/wrench))
- playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
- user << "\blue Now disassembling the girder"
- if(do_after(user,40))
- user << "\blue You dissasembled the girder!"
- new /obj/effect/decal/remains/human(get_turf(src))
- del(src)
-
- else if(istype(W, /obj/item/weapon/pickaxe/plasmacutter))
- user << "\blue Now slicing apart the girder"
- if(do_after(user,30))
- user << "\blue You slice apart the girder!"
+/obj/structure/cultgirder/attackby(obj/item/W as obj, mob/user as mob)
+ if(istype(W, /obj/item/weapon/wrench))
+ playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
+ user << "\blue Now disassembling the girder"
+ if(do_after(user,40))
+ user << "\blue You dissasembled the girder!"
new /obj/effect/decal/remains/human(get_turf(src))
del(src)
- else if(istype(W, /obj/item/weapon/pickaxe/diamonddrill))
- user << "\blue You drill through the girder!"
- new /obj/effect/decal/remains/human(get_turf(src))
+ else if(istype(W, /obj/item/weapon/pickaxe/plasmacutter))
+ user << "\blue Now slicing apart the girder"
+ if(do_after(user,30))
+ user << "\blue You slice apart the girder!"
+ new /obj/effect/decal/remains/human(get_turf(src))
+ del(src)
+
+ else if(istype(W, /obj/item/weapon/pickaxe/diamonddrill))
+ user << "\blue You drill through the girder!"
+ new /obj/effect/decal/remains/human(get_turf(src))
+ del(src)
+
+/obj/structure/cultgirder/blob_act()
+ if(prob(40))
+ del(src)
+
+/obj/structure/cultgirder/bullet_act(var/obj/item/projectile/Proj) //No beam check- How else will you destroy the cult girder with silver bullets?????
+ health -= Proj.damage
+ ..()
+ if(health <= 0)
+ new /obj/item/stack/sheet/metal(get_turf(src))
+ del(src)
+
+ return
+
+/obj/structure/cultgirder/ex_act(severity)
+ switch(severity)
+ if(1.0)
del(src)
-
- blob_act()
- if(prob(40))
- del(src)
-
- bullet_act(var/obj/item/projectile/Proj) //No beam check- How else will you destroy the cult girder with silver bullets?????
- health -= Proj.damage
- ..()
- if(health <= 0)
- new /obj/item/stack/sheet/metal(get_turf(src))
- del(src)
-
- return
-
- ex_act(severity)
- switch(severity)
- if(1.0)
+ return
+ if(2.0)
+ if (prob(30))
+ new /obj/effect/decal/remains/human(loc)
del(src)
- return
- if(2.0)
- if (prob(30))
- new /obj/effect/decal/remains/human(loc)
- del(src)
- return
- if(3.0)
- if (prob(5))
- new /obj/effect/decal/remains/human(loc)
- del(src)
- return
- else
- return
\ No newline at end of file
+ return
+ if(3.0)
+ if (prob(5))
+ new /obj/effect/decal/remains/human(loc)
+ del(src)
+ return
+ else
+ return
\ No newline at end of file
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index e1f0804c0e..716fca4503 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -26,27 +26,17 @@
/obj/structure/grille/Bumped(atom/user)
if(ismob(user)) shock(user, 70)
-
-/obj/structure/grille/attack_paw(mob/user as mob)
- attack_hand(user)
-
/obj/structure/grille/attack_hand(mob/user as mob)
playsound(loc, 'sound/effects/grillehit.ogg', 80, 1)
- var/damage_dealt
+ var/damage_dealt = 1
+ var/attack_message = "kicks"
if(istype(user,/mob/living/carbon/human))
var/mob/living/carbon/human/H = user
if(H.species.can_shred(H))
+ attack_message = "mangles"
damage_dealt = 5
- user.visible_message("[user] mangles [src].", \
- "You mangle [src].", \
- "You hear twisting metal.")
-
- if(!damage_dealt)
- user.visible_message("[user] kicks [src].", \
- "You kick [src].", \
- "You hear twisting metal.")
if(shock(user, 70))
return
@@ -56,35 +46,7 @@
else
damage_dealt += 1
- health -= damage_dealt
- healthcheck()
-
-/obj/structure/grille/attack_slime(mob/user as mob)
- var/mob/living/carbon/slime/S = user
- if (!S.is_adult)
- return
-
- playsound(loc, 'sound/effects/grillehit.ogg', 80, 1)
- user.visible_message("[user] smashes against [src].", \
- "You smash against [src].", \
- "You hear twisting metal.")
-
- health -= rand(2,3)
- healthcheck()
- return
-
-/obj/structure/grille/attack_animal(var/mob/living/simple_animal/M as mob)
- if(M.melee_damage_upper == 0) return
-
- playsound(loc, 'sound/effects/grillehit.ogg', 80, 1)
- M.visible_message("[M] smashes against [src].", \
- "You smash against [src].", \
- "You hear twisting metal.")
-
- health -= M.melee_damage_upper
- healthcheck()
- return
-
+ attack_generic(user,damage_dealt,attack_message)
/obj/structure/grille/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
if(air_group || (height==0)) return 1
@@ -226,3 +188,9 @@
health -= 1
healthcheck()
..()
+
+/obj/structure/grille/attack_generic(var/mob/user, var/damage, var/attack_verb)
+ visible_message("[user] [attack_verb] the [src]!")
+ health -= damage
+ spawn(1) healthcheck()
+ return 1
\ No newline at end of file
diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm
index 8b586c9461..7d4700abb9 100644
--- a/code/game/objects/structures/inflatable.dm
+++ b/code/game/objects/structures/inflatable.dm
@@ -26,128 +26,104 @@
var/health = 50.0
- New(location)
- ..()
- update_nearby_tiles(need_rebuild=1)
+/obj/structure/inflatable/New(location)
+ ..()
+ update_nearby_tiles(need_rebuild=1)
- Del()
- update_nearby_tiles()
- ..()
+/obj/structure/inflatable/Del()
+ update_nearby_tiles()
+ ..()
- proc/update_nearby_tiles(need_rebuild) //Copypasta from airlock code
- if(!air_master)
- return 0
- air_master.mark_for_update(get_turf(src))
- return 1
-
-
-
- CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
+/obj/structure/inflatable/proc/update_nearby_tiles(need_rebuild) //Copypasta from airlock code
+ if(!air_master)
return 0
+ air_master.mark_for_update(get_turf(src))
+ return 1
- bullet_act(var/obj/item/projectile/Proj)
- health -= Proj.damage
- ..()
- if(health <= 0)
+/obj/structure/inflatable/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
+ return 0
+
+/obj/structure/inflatable/bullet_act(var/obj/item/projectile/Proj)
+ health -= Proj.damage
+ ..()
+ if(health <= 0)
+ deflate(1)
+ return
+
+/obj/structure/inflatable/ex_act(severity)
+ switch(severity)
+ if(1.0)
+ del(src)
+ return
+ if(2.0)
deflate(1)
- return
-
-
- ex_act(severity)
- switch(severity)
- if(1.0)
- del(src)
- return
- if(2.0)
+ return
+ if(3.0)
+ if(prob(50))
deflate(1)
return
- if(3.0)
- if(prob(50))
- deflate(1)
- return
+/obj/structure/inflatable/blob_act()
+ deflate(1)
- blob_act()
- deflate(1)
+/obj/structure/inflatable/meteorhit()
+ deflate(1)
-
- meteorhit()
- //world << "glass at [x],[y],[z] Mhit"
- deflate(1)
-
- attack_paw(mob/user as mob)
- return attack_generic(user, 15)
-
- attack_hand(mob/user as mob)
+/obj/structure/inflatable/attack_hand(mob/user as mob)
add_fingerprint(user)
return
+/obj/structure/inflatable/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(!istype(W)) return
- proc/attack_generic(mob/user as mob, damage = 0) //used by attack_animal and attack_slime
- health -= damage
- if(health <= 0)
- user.visible_message("[user] tears open [src]!")
- deflate(1)
- else //for nicer text~
- user.visible_message("[user] tears at [src]!")
+ if (can_puncture(W))
+ visible_message("\red [user] pierces [src] with [W]!")
+ deflate(1)
+ if(W.damtype == BRUTE || W.damtype == BURN)
+ hit(W.force)
+ ..()
+ return
- attack_animal(mob/user as mob)
- if(!isanimal(user)) return
- var/mob/living/simple_animal/M = user
- if(M.melee_damage_upper <= 0) return
- attack_generic(M, M.melee_damage_upper)
+/obj/structure/inflatable/proc/hit(var/damage, var/sound_effect = 1)
+ health = max(0, health - damage)
+ if(sound_effect)
+ playsound(loc, 'sound/effects/Glasshit.ogg', 75, 1)
+ if(health <= 0)
+ deflate(1)
-
- attack_slime(mob/user as mob)
- var/mob/living/carbon/slime/S = user
- if (!S.is_adult)
- return
- attack_generic(user, rand(10, 15))
-
-
- attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(!istype(W)) return
-
- if (can_puncture(W))
- visible_message("\red [user] pierces [src] with [W]!")
- deflate(1)
- if(W.damtype == BRUTE || W.damtype == BURN)
- hit(W.force)
- ..()
- return
-
- proc/hit(var/damage, var/sound_effect = 1)
- health = max(0, health - damage)
- if(sound_effect)
- playsound(loc, 'sound/effects/Glasshit.ogg', 75, 1)
- if(health <= 0)
- deflate(1)
-
-
- proc/deflate(var/violent=0)
- playsound(loc, 'sound/machines/hiss.ogg', 75, 1)
- if(violent)
- visible_message("[src] rapidly deflates!")
- var/obj/item/inflatable/torn/R = new /obj/item/inflatable/torn(loc)
+/obj/structure/inflatable/proc/deflate(var/violent=0)
+ playsound(loc, 'sound/machines/hiss.ogg', 75, 1)
+ if(violent)
+ visible_message("[src] rapidly deflates!")
+ var/obj/item/inflatable/torn/R = new /obj/item/inflatable/torn(loc)
+ src.transfer_fingerprints_to(R)
+ del(src)
+ else
+ //user << "\blue You slowly deflate the inflatable wall."
+ visible_message("[src] slowly deflates.")
+ spawn(50)
+ var/obj/item/inflatable/R = new /obj/item/inflatable(loc)
src.transfer_fingerprints_to(R)
del(src)
- else
- //user << "\blue You slowly deflate the inflatable wall."
- visible_message("[src] slowly deflates.")
- spawn(50)
- var/obj/item/inflatable/R = new /obj/item/inflatable(loc)
- src.transfer_fingerprints_to(R)
- del(src)
- verb/hand_deflate()
- set name = "Deflate"
- set category = "Object"
- set src in oview(1)
+/obj/structure/inflatable/verb/hand_deflate()
+ set name = "Deflate"
+ set category = "Object"
+ set src in oview(1)
- if(isobserver(usr)) //to stop ghosts from deflating
- return
+ if(isobserver(usr)) //to stop ghosts from deflating
+ return
- deflate()
+ deflate()
+
+/obj/structure/inflatable/attack_generic(var/mob/user, var/damage, var/attack_verb)
+ health -= damage
+ if(health <= 0)
+ user.visible_message("[user] [attack_verb] open the [src]!")
+ spawn(1) deflate(1)
+ else
+ user.visible_message("[user] [attack_verb] at [src]!")
+ return 1
/obj/item/inflatable/door/
name = "inflatable door"
@@ -175,97 +151,84 @@
var/state = 0 //closed, 1 == open
var/isSwitchingStates = 0
- //Bumped(atom/user)
- // ..()
- // if(!state)
- // return TryToSwitchState(user)
- // return
+/obj/structure/inflatable/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)
- 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/inflatable/door/attack_hand(mob/user as mob)
+ return TryToSwitchState(user)
- attack_paw(mob/user as mob)
- return TryToSwitchState(user)
+/obj/structure/inflatable/door/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
+ if(air_group)
+ return state
+ if(istype(mover, /obj/effect/beam))
+ return !opacity
+ return !density
- attack_hand(mob/user as mob)
- return TryToSwitchState(user)
-
- CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
- if(air_group)
- return state
- 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
+/obj/structure/inflatable/door/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 if(istype(user, /obj/mecha))
- SwitchState()
+ else
+ SwitchState()
+ else if(istype(user, /obj/mecha))
+ SwitchState()
- proc/SwitchState()
- if(state)
- Close()
- else
- Open()
- update_nearby_tiles()
-
- proc/Open()
- isSwitchingStates = 1
- //playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 100, 1)
- flick("door_opening",src)
- sleep(10)
- density = 0
- opacity = 0
- state = 1
- update_icon()
- isSwitchingStates = 0
-
- proc/Close()
- isSwitchingStates = 1
- //playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 100, 1)
- flick("door_closing",src)
- sleep(10)
- density = 1
- opacity = 0
- state = 0
- update_icon()
- isSwitchingStates = 0
+/obj/structure/inflatable/door/proc/SwitchState()
+ if(state)
+ Close()
+ else
+ Open()
+ update_nearby_tiles()
+/obj/structure/inflatable/door/proc/Open()
+ isSwitchingStates = 1
+ flick("door_opening",src)
+ sleep(10)
+ density = 0
+ opacity = 0
+ state = 1
update_icon()
- if(state)
- icon_state = "door_open"
- else
- icon_state = "door_closed"
+ isSwitchingStates = 0
- deflate(var/violent=0)
- playsound(loc, 'sound/machines/hiss.ogg', 75, 1)
- if(violent)
- visible_message("[src] rapidly deflates!")
- var/obj/item/inflatable/door/torn/R = new /obj/item/inflatable/door/torn(loc)
+/obj/structure/inflatable/door/proc/Close()
+ isSwitchingStates = 1
+ flick("door_closing",src)
+ sleep(10)
+ density = 1
+ opacity = 0
+ state = 0
+ update_icon()
+ isSwitchingStates = 0
+
+/obj/structure/inflatable/door/update_icon()
+ if(state)
+ icon_state = "door_open"
+ else
+ icon_state = "door_closed"
+
+/obj/structure/inflatable/door/deflate(var/violent=0)
+ playsound(loc, 'sound/machines/hiss.ogg', 75, 1)
+ if(violent)
+ visible_message("[src] rapidly deflates!")
+ var/obj/item/inflatable/door/torn/R = new /obj/item/inflatable/door/torn(loc)
+ src.transfer_fingerprints_to(R)
+ del(src)
+ else
+ visible_message("[src] slowly deflates.")
+ spawn(50)
+ var/obj/item/inflatable/door/R = new /obj/item/inflatable/door(loc)
src.transfer_fingerprints_to(R)
del(src)
- else
- //user << "\blue You slowly deflate the inflatable wall."
- visible_message("[src] slowly deflates.")
- spawn(50)
- var/obj/item/inflatable/door/R = new /obj/item/inflatable/door(loc)
- src.transfer_fingerprints_to(R)
- del(src)
-
/obj/item/inflatable/torn
name = "torn inflatable wall"
diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm
index f0060dfe93..40becb871f 100644
--- a/code/game/objects/structures/kitchen_spike.dm
+++ b/code/game/objects/structures/kitchen_spike.dm
@@ -12,8 +12,6 @@
var/meattype = 0 // 0 - Nothing, 1 - Monkey, 2 - Xeno
/obj/structure/kitchenspike
- attack_paw(mob/user as mob)
- return src.attack_hand(usr)
attackby(obj/item/weapon/grab/G as obj, mob/user as mob)
if(!istype(G, /obj/item/weapon/grab))
diff --git a/code/game/objects/structures/ladders.dm b/code/game/objects/structures/ladders.dm
index a10448cfcc..cce8a064c0 100644
--- a/code/game/objects/structures/ladders.dm
+++ b/code/game/objects/structures/ladders.dm
@@ -66,8 +66,5 @@
add_fingerprint(user)
-/obj/structure/ladder/attack_paw(mob/user as mob)
- return attack_hand(user)
-
/obj/structure/ladder/attackby(obj/item/weapon/W, mob/user as mob)
return attack_hand(user)
\ No newline at end of file
diff --git a/code/game/objects/structures/lamarr_cage.dm b/code/game/objects/structures/lamarr_cage.dm
index 83df96a728..14377992bb 100644
--- a/code/game/objects/structures/lamarr_cage.dm
+++ b/code/game/objects/structures/lamarr_cage.dm
@@ -72,9 +72,6 @@
..()
return
-/obj/structure/lamarr/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
/obj/structure/lamarr/attack_hand(mob/user as mob)
if (src.destroyed)
return
diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm
index aa07d1621a..5db0947e9b 100644
--- a/code/game/objects/structures/mineral_doors.dm
+++ b/code/game/objects/structures/mineral_doors.dm
@@ -39,9 +39,6 @@
if(get_dist(user,src) <= 1) //not remotely though
return TryToSwitchState(user)
- attack_paw(mob/user as mob)
- return TryToSwitchState(user)
-
attack_hand(mob/user as mob)
return TryToSwitchState(user)
diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm
index 99df613ace..b82a3495df 100644
--- a/code/game/objects/structures/mirror.dm
+++ b/code/game/objects/structures/mirror.dm
@@ -8,7 +8,6 @@
anchored = 1
var/shattered = 0
-
/obj/structure/mirror/attack_hand(mob/user as mob)
if(shattered) return
@@ -17,14 +16,10 @@
var/mob/living/carbon/human/H = user
if(H.a_intent == "hurt")
- if(shattered)
- playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
- return
if(prob(30) || H.species.can_shred(H))
- user.visible_message("[user] smashes [src]!")
- shatter()
+ attack_generic(user,1)
else
- user.visible_message("[user] hits [src] and bounces off!")
+ attack_generic(user)
return
var/userloc = H.loc
@@ -82,7 +77,6 @@
playsound(src, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
..()
-
/obj/structure/mirror/attackby(obj/item/I as obj, mob/user as mob)
if(shattered)
playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
@@ -95,23 +89,15 @@
visible_message("[user] hits [src] with [I]!")
playsound(src.loc, 'sound/effects/Glasshit.ogg', 70, 1)
-/obj/structure/mirror/attack_animal(mob/user as mob)
- if(!isanimal(user)) return
- var/mob/living/simple_animal/M = user
- if(M.melee_damage_upper <= 0) return
+/obj/structure/mirror/attack_generic(var/mob/user, var/damage)
+
if(shattered)
playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
- return
- user.visible_message("[user] smashes [src]!")
- shatter()
+ return 0
-
-/obj/structure/mirror/attack_slime(mob/user as mob)
- var/mob/living/carbon/slime/S = user
- if (!S.is_adult)
- return
- if(shattered)
- playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 70, 1)
- return
- user.visible_message("[user] smashes [src]!")
- shatter()
\ No newline at end of file
+ if(damage)
+ user.visible_message("[user] smashes [src]!")
+ shatter()
+ else
+ user.visible_message("[user] hits [src] and bounces off!")
+ return 1
\ No newline at end of file
diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm
index eea0358763..538149688c 100644
--- a/code/game/objects/structures/morgue.dm
+++ b/code/game/objects/structures/morgue.dm
@@ -57,9 +57,6 @@
/obj/structure/morgue/alter_health()
return src.loc
-/obj/structure/morgue/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
/obj/structure/morgue/attack_hand(mob/user as mob)
if (src.connected)
for(var/atom/movable/A as mob|obj in src.connected.loc)
@@ -137,9 +134,6 @@
anchored = 1
throwpass = 1
-/obj/structure/m_tray/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
/obj/structure/m_tray/attack_hand(mob/user as mob)
if (src.connected)
for(var/atom/movable/A as mob|obj in src.loc)
@@ -222,9 +216,6 @@
/obj/structure/crematorium/alter_health()
return src.loc
-/obj/structure/crematorium/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
/obj/structure/crematorium/attack_hand(mob/user as mob)
// if (cremating) AWW MAN! THIS WOULD BE SO MUCH MORE FUN ... TO WATCH
// user.show_message("\red Uh-oh, that was a bad idea.", 1)
@@ -353,9 +344,6 @@
anchored = 1
throwpass = 1
-/obj/structure/c_tray/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
/obj/structure/c_tray/attack_hand(mob/user as mob)
if (src.connected)
for(var/atom/movable/A as mob|obj in src.loc)
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 d4f9356c56..a3f99324b7 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm
@@ -29,9 +29,6 @@
..()
return
-/obj/structure/stool/bed/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
/obj/structure/stool/bed/attack_hand(mob/user as mob)
manual_unbuckle(user)
return
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 4db3ed1078..4df313fe91 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -150,28 +150,12 @@
"You hear a knocking sound.")
return
-
-/obj/structure/window/attack_paw(mob/user as mob)
- return attack_hand(user)
-
-
-/obj/structure/window/proc/attack_generic(mob/user as mob, damage = 0) //used by attack_animal and attack_slime
+/obj/structure/window/attack_generic(var/mob/user, var/damage)
+ if(!damage)
+ return
user.visible_message("[user] smashes into [src]!")
take_damage(damage)
-
-/obj/structure/window/attack_animal(mob/user as mob)
- if(!isanimal(user)) return
- var/mob/living/simple_animal/M = user
- if(M.melee_damage_upper <= 0) return
- attack_generic(M, M.melee_damage_upper)
-
-
-/obj/structure/window/attack_slime(mob/user as mob)
- var/mob/living/carbon/slime/S = user
- if (!S.is_adult)
- return
- attack_generic(user, rand(10, 15))
-
+ return 1
/obj/structure/window/attackby(obj/item/W as obj, mob/user as mob)
if(!istype(W)) return//I really wish I did not need this
diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm
index 80850522f4..349be88f5d 100644
--- a/code/game/supplyshuttle.dm
+++ b/code/game/supplyshuttle.dm
@@ -294,19 +294,12 @@ var/list/mechtoys = list(
/obj/item/weapon/paper/manifest
name = "Supply Manifest"
-
/obj/machinery/computer/ordercomp/attack_ai(var/mob/user as mob)
return attack_hand(user)
-/obj/machinery/computer/ordercomp/attack_paw(var/mob/user as mob)
- return attack_hand(user)
-
/obj/machinery/computer/supplycomp/attack_ai(var/mob/user as mob)
return attack_hand(user)
-/obj/machinery/computer/supplycomp/attack_paw(var/mob/user as mob)
- return attack_hand(user)
-
/obj/machinery/computer/ordercomp/attack_hand(var/mob/user as mob)
if(..())
return
diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm
index 5a74c80b6f..f3dc6f5eb1 100644
--- a/code/game/turfs/simulated/floor.dm
+++ b/code/game/turfs/simulated/floor.dm
@@ -192,10 +192,6 @@ turf/simulated/floor/proc/update_icon()
else
return 0
-
-/turf/simulated/floor/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
/turf/simulated/floor/attack_hand(mob/user as mob)
if (is_light_floor())
var/obj/item/stack/tile/light/T = floor_tile
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index 91f96113cb..b1a0966dad 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -226,40 +226,6 @@
return 0
//Interactions
-
-/turf/simulated/wall/attack_paw(mob/user as mob)
- if ((HULK in user.mutations))
- if (prob(40))
- usr << text("\blue You smash through the wall.")
- usr.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
- dismantle_wall(1)
- return
- else
- usr << text("\blue You punch the wall.")
- take_damage(rand(25, 75))
- return
-
- return src.attack_hand(user)
-
-
-/turf/simulated/wall/attack_animal(mob/living/M as mob)
- if(M.wall_smash)
- if (istype(src, /turf/simulated/wall/r_wall) && !rotting)
- M << text("\blue This wall is far too strong for you to destroy.")
- return
- else
- if (prob(40) || rotting)
- M << text("\blue You smash through the wall.")
- dismantle_wall(1)
- return
- else
- M << text("\blue You smash against the wall.")
- take_damage(rand(25, 75))
- return
-
- M << "\blue You push the wall but nothing happens!"
- return
-
/turf/simulated/wall/attack_hand(mob/user as mob)
if (HULK in user.mutations)
if (prob(40) || rotting)
@@ -282,6 +248,23 @@
src.add_fingerprint(user)
return
+/turf/simulated/wall/attack_generic(var/mob/user, var/damage, var/attack_message, var/wallbreaker)
+
+ if(!damage || !wallbreaker)
+ user << "You push the wall but nothing happens."
+ return
+
+ if(istype(src,/turf/simulated/wall/r_wall) && !rotting)
+ user << "This wall is far too strong for you to destroy."
+
+ if(rotting || prob(40))
+ user << "You smash through the wall!"
+ spawn(1) dismantle_wall(1)
+ else
+ user << "You smash against the wall."
+ take_damage(rand(25,75))
+ return 1
+
/turf/simulated/wall/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm
index 7b1a17abac..0dcd0dd8a7 100644
--- a/code/game/turfs/space/space.dm
+++ b/code/game/turfs/space/space.dm
@@ -11,9 +11,6 @@
if(!istype(src, /turf/space/transit))
icon_state = "[((x + y) ^ ~(x * y) + z) % 25]"
-/turf/space/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
/turf/space/attack_hand(mob/user as mob)
if ((user.restrained() || !( user.pulling )))
return
diff --git a/code/game/turfs/unsimulated/floor.dm b/code/game/turfs/unsimulated/floor.dm
index 1d391eee1c..68ac083f15 100644
--- a/code/game/turfs/unsimulated/floor.dm
+++ b/code/game/turfs/unsimulated/floor.dm
@@ -3,9 +3,6 @@
icon = 'icons/turf/floors.dmi'
icon_state = "Floor3"
-/turf/unsimulated/floor/attack_paw(user as mob)
- return src.attack_hand(user)
-
/turf/unsimulated/floor/attack_hand(var/mob/user as mob)
if ((!( user.canmove ) || user.restrained() || !( user.pulling )))
return
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index ce2d677da5..1556b01ddc 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -82,7 +82,11 @@
icon_state = "swathelm"
item_state = "helmet"
flags = FPRINT|TABLEPASS|HEADCOVERSEYES
-
+ sprite_sheets = list(
+ "Tajara" = 'icons/mob/species/tajaran/helmet.dmi',
+ "Unathi" = 'icons/mob/species/unathi/helmet.dmi',
+ )
+
armor = list(melee = 62, bullet = 50, laser = 50,energy = 35, bomb = 10, bio = 2, rad = 0)
flags_inv = HIDEEARS
siemens_coefficient = 0.7
diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm
index 0a3b8e08b7..eeaf55c557 100644
--- a/code/modules/clothing/masks/boxing.dm
+++ b/code/modules/clothing/masks/boxing.dm
@@ -7,6 +7,10 @@
flags_inv = HIDEFACE
body_parts_covered = FACE
w_class = 2
+ sprite_sheets = list(
+ "Tajara" = 'icons/mob/species/tajaran/helmet.dmi',
+ "Unathi" = 'icons/mob/species/unathi/helmet.dmi',
+ )
/obj/item/clothing/mask/balaclava/tactical
name = "green balaclava"
@@ -16,6 +20,10 @@
flags = FPRINT|TABLEPASS|BLOCKHAIR
flags_inv = HIDEFACE
w_class = 2
+ sprite_sheets = list(
+ "Tajara" = 'icons/mob/species/tajaran/helmet.dmi',
+ "Unathi" = 'icons/mob/species/unathi/helmet.dmi',
+ )
/obj/item/clothing/mask/luchador
name = "Luchador Mask"
diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm
index 8cc12fb172..3f3094c794 100644
--- a/code/modules/clothing/masks/miscellaneous.dm
+++ b/code/modules/clothing/masks/miscellaneous.dm
@@ -8,14 +8,11 @@
w_class = 2
gas_transfer_coefficient = 0.90
-//Monkeys can not take the muzzle off of themself! Call PETA!
-/obj/item/clothing/mask/muzzle/attack_paw(mob/user as mob)
- if (src == user.wear_mask)
- return
- else
- ..()
- return
-
+// Clumsy folks can't take the mask off themselves.
+/obj/item/clothing/mask/muzzle/attack_hand(mob/user as mob)
+ if(user.wear_mask == src && !user.IsAdvancedToolUser())
+ return 0
+ ..()
/obj/item/clothing/mask/surgical
name = "sterile mask"
diff --git a/code/modules/clothing/spacesuits/ert.dm b/code/modules/clothing/spacesuits/ert.dm
index ab2f48c182..0568dacf6a 100644
--- a/code/modules/clothing/spacesuits/ert.dm
+++ b/code/modules/clothing/spacesuits/ert.dm
@@ -27,13 +27,9 @@
icon_state = "ert_commander"
item_state = "suit-command"
w_class = 3
- allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/handcuffs,/obj/item/weapon/tank/emergency_oxygen)
slowdown = 1
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 100)
- allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank, /obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/weapon/crowbar, \
- /obj/item/weapon/screwdriver, /obj/item/weapon/weldingtool, /obj/item/weapon/wirecutters, /obj/item/weapon/wrench, /obj/item/device/multitool, \
- /obj/item/device/radio, /obj/item/device/analyzer, /obj/item/weapon/gun/energy/laser, /obj/item/weapon/gun/energy/pulse_rifle, \
- /obj/item/weapon/gun/energy/taser, /obj/item/weapon/melee/baton, /obj/item/weapon/gun/energy/gun)
+ allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank, /obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/weapon/crowbar, /obj/item/weapon/screwdriver, /obj/item/weapon/weldingtool, /obj/item/weapon/wirecutters, /obj/item/weapon/wrench, /obj/item/device/multitool, /obj/item/device/radio, /obj/item/device/analyzer, /obj/item/weapon/melee/baton, /obj/item/weapon/gun, /obj/item/ammo_magazine, /obj/item/ammo_casing, /obj/item/weapon/handcuffs, /obj/item/weapon/storage/briefcase/inflatable)
siemens_coefficient = 0.6
//Commander
diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm
index d176574757..eb701fe41c 100644
--- a/code/modules/clothing/suits/labcoat.dm
+++ b/code/modules/clothing/suits/labcoat.dm
@@ -11,8 +11,7 @@
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 50, rad = 0)
sprite_sheets = list("Vox" = 'icons/mob/species/vox/suit.dmi')
-/obj/item/clothing/suit/storage/toggle/labcoat/red
- name = "red labcoat"
+/obj/item/clothing/suit/storage/toggle/labcoat/red name = "red labcoat"
desc = "A suit that protects against minor chemical spills. This one is red."
icon_state = "red_labcoat_open"
item_state = "red_labcoat"
diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm
index 73d15e31ed..776fb186b9 100644
--- a/code/modules/customitems/item_defines.dm
+++ b/code/modules/customitems/item_defines.dm
@@ -865,6 +865,15 @@
icon_state = "mitlabcoat"
item_state = "mitlabcoat"
+/obj/item/clothing/suit/storage/toggle/labcoat/fluff/epsilon //Devildabeast: Looping Song
+ name = "e UMi labcoat"
+ desc = "A suit that protects against minor chemical spills. Has a black stripe on the shoulder. The abbreviation \"e UMi\" is written on the back in bold text."
+ icon = 'icons/obj/custom_items.dmi'
+ icon_state = "labcoat_black_open"
+ icon_open = "labcoat_black_open"
+ icon_closed = "labcoat_black"
+ item_state = "labcoat_black"
+
/obj/item/clothing/suit/storage/det_suit/fluff/leatherjack //atomicdog92: Seth Sealis
name = "leather jacket"
desc = "A black leather coat, popular amongst punks, greasers, and other galactic scum."
@@ -1266,6 +1275,14 @@
icon_state = "digiboots"
species_restricted = null
+/obj/item/clothing/shoes/jackboots/fluff/harmony_singh_1 //Bromuzl: Harmony Singh
+ name = "Springjacks"
+ desc = "A pair of highly modified jackboots in medical white, with some type of spring assembly on the ankle and heels, painted orange."
+ icon = 'icons/obj/custom_items.dmi'
+ icon_state = "springjacks"
+ item_state = "springjacks"
+ slowdown = SHOES_SLOWDOWN+1 //Slowing down because of her injured foot, these are for ease of pain so she can get off painkillers.
+ siemens_coefficient = 0.7 //copied from Jackboots under code/modules/clothing/shoes/miscellaneous.dm
//////////// Sets ////////////
diff --git a/code/modules/economy/Events.dm b/code/modules/economy/Events.dm
index 2600150185..dc78e1e06d 100644
--- a/code/modules/economy/Events.dm
+++ b/code/modules/economy/Events.dm
@@ -1,6 +1,5 @@
/datum/event/economic_event
- name = "Economic event"
endWhen = 50 //this will be set randomly, later
announceWhen = 15
var/event_type = 0
diff --git a/code/modules/economy/Events_Mundane.dm b/code/modules/economy/Events_Mundane.dm
index 39318aead5..3f9fec7bb0 100644
--- a/code/modules/economy/Events_Mundane.dm
+++ b/code/modules/economy/Events_Mundane.dm
@@ -1,6 +1,5 @@
/datum/event/mundane_news
- name = "Mundande news"
endWhen = 10
/datum/event/mundane_news/announce()
@@ -126,7 +125,6 @@
news_network.SubmitArticle(body, author, channel, null, 1)
/datum/event/trivial_news
- name = "Trivial news"
endWhen = 10
/datum/event/trivial_news/announce()
diff --git a/code/modules/events/alien_infestation.dm b/code/modules/events/alien_infestation.dm
index a84a4fefda..7fd20efa61 100644
--- a/code/modules/events/alien_infestation.dm
+++ b/code/modules/events/alien_infestation.dm
@@ -1,9 +1,7 @@
/var/global/sent_aliens_to_station = 0
/datum/event/alien_infestation
- name = "Alien Infestation"
announceWhen = 400
- oneShot = 1
var/spawncount = 1
var/successSpawn = 0 //So we don't make a command report if nothing gets spawned.
diff --git a/code/modules/events/blob.dm b/code/modules/events/blob.dm
index adb4e0c4db..0b1b1dbbfd 100644
--- a/code/modules/events/blob.dm
+++ b/code/modules/events/blob.dm
@@ -1,5 +1,4 @@
/datum/event/blob
- name = "Blob"
announceWhen = 12
endWhen = 120
diff --git a/code/modules/events/borers.dm b/code/modules/events/borers.dm
index 54c16deaed..4109a66d85 100644
--- a/code/modules/events/borers.dm
+++ b/code/modules/events/borers.dm
@@ -1,9 +1,4 @@
//Cortical borer spawn event - care of RobRichards1997 with minor editing by Zuhayr.
-
-/datum/event/borer_infestation
- name = "Borer Infestation"
- oneShot = 1
-
/datum/event/borer_infestation
announceWhen = 400
diff --git a/code/modules/events/brand_intelligence.dm b/code/modules/events/brand_intelligence.dm
index 0f9412527b..1d25ac3cbf 100644
--- a/code/modules/events/brand_intelligence.dm
+++ b/code/modules/events/brand_intelligence.dm
@@ -1,8 +1,6 @@
/datum/event/brand_intelligence
- name = "Brand Intelligence"
announceWhen = 21
endWhen = 1000 //Ends when all vending machines are subverted anyway.
- oneShot = 1
var/list/obj/machinery/vending/vendingMachines = list()
var/list/obj/machinery/vending/infectedVendingMachines = list()
diff --git a/code/modules/events/carp_migration.dm b/code/modules/events/carp_migration.dm
index 94ca69c9a5..e7c9f5a402 100644
--- a/code/modules/events/carp_migration.dm
+++ b/code/modules/events/carp_migration.dm
@@ -1,7 +1,5 @@
/datum/event/carp_migration
- name = "Carp Migration"
announceWhen = 50
- oneShot = 1
endWhen = 900
var/list/spawned_carp = list()
diff --git a/code/modules/events/communications_blackout.dm b/code/modules/events/communications_blackout.dm
index 3c920f6a10..181f66d9c0 100644
--- a/code/modules/events/communications_blackout.dm
+++ b/code/modules/events/communications_blackout.dm
@@ -1,6 +1,3 @@
-/datum/event/communications_blackout
- name = "Communications Blackout"
-
/datum/event/communications_blackout/announce()
var/alert = pick( "Ionospheric anomalies detected. Temporary telecommunication failure imminent. Please contact you*%fj00)`5vc-BZZT", \
"Ionospheric anomalies detected. Temporary telecommunication failu*3mga;b4;'1v¬-BZZZT", \
diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm
index 65f56391c3..c2f478d493 100644
--- a/code/modules/events/disease_outbreak.dm
+++ b/code/modules/events/disease_outbreak.dm
@@ -1,7 +1,5 @@
/datum/event/disease_outbreak
- name = "Disease Outbreak"
announceWhen = 15
- oneShot = 1
/datum/event/disease_outbreak/announce()
diff --git a/code/modules/events/electrical_storm.dm b/code/modules/events/electrical_storm.dm
index ce35ab92e9..4a53cc696d 100644
--- a/code/modules/events/electrical_storm.dm
+++ b/code/modules/events/electrical_storm.dm
@@ -1,5 +1,4 @@
/datum/event/electrical_storm
- name = "Electrical Storm"
var/lightsoutAmount = 1
var/lightsoutRange = 25
diff --git a/code/modules/events/event.dm b/code/modules/events/event.dm
index 4fc288ab6d..e9134ea709 100644
--- a/code/modules/events/event.dm
+++ b/code/modules/events/event.dm
@@ -1,29 +1,37 @@
/datum/event_meta
- var/name = ""
- var/weight = 1
- var/min_weight = 1
- var/max_weight = 1
- var/severity = 0
- var/has_fired = 0
+ var/name = ""
+ var/enabled = 1 // Whether or not the event is available for random selection at all
+ var/weight = 0 // The base weight of this event. A zero means it may never fire, but see get_weight()
+ var/min_weight = 0 // The minimum weight that this event will have. Only used if non-zero.
+ var/max_weight = 0 // The maximum weight that this event will have. Only use if non-zero.
+ var/severity = 0 // The current severity of this event
+ var/one_shot = 0 //If true, then the event will not be re-added to the list of available events
var/list/role_weights = list()
var/datum/event/event_type
-/datum/event_meta/New(var/event_severity, var/event_name, var/datum/event/type, var/event_weight, var/list/job_weights, var/min_event_weight, var/max_event_weight)
+/datum/event_meta/New(var/event_severity, var/event_name, var/datum/event/type, var/event_weight, var/list/job_weights, var/is_one_shot = 0, var/min_event_weight = 0, var/max_event_weight = 0)
name = event_name
severity = event_severity
event_type = type
+ one_shot = is_one_shot
weight = event_weight
+ min_weight = min_event_weight
+ max_weight = max_event_weight
if(job_weights)
role_weights = job_weights
/datum/event_meta/proc/get_weight(var/list/active_with_role)
+ if(!enabled)
+ return 0
+
var/job_weight = 0
for(var/role in role_weights)
- job_weight = active_with_role[role] * role_weights[role]
+ if(role in active_with_role)
+ job_weight += active_with_role[role] * role_weights[role]
var/total_weight = weight + job_weight
- // Only min/max the weight if the values are set
+ // Only min/max the weight if the values are non-zero
if(min_weight && total_weight < min_weight) total_weight = min_weight
if(max_weight && total_weight > max_weight) total_weight = max_weight
@@ -40,19 +48,18 @@
return 0
/datum/event //NOTE: Times are measured in master controller ticks!
- var/name = ""//Name of the event
var/startWhen = 0 //When in the lifetime to call start().
var/announceWhen = 0 //When in the lifetime to call announce().
var/endWhen = 0 //When in the lifetime the event should end.
- var/oneShot = 0 //If true, then the event removes itself from the list of potential events on creation.
var/severity = 0 //Severity. Lower means less severe, higher means more severe. Does not have to be supported. Is set on New().
var/activeFor = 0 //How long the event has existed. You don't need to change this.
var/isRunning = 1 //If this event is currently running. You should not change this.
+ var/startedAt = 0 //When this event started.
+ var/endedAt = 0 //When this event ended.
var/datum/event_meta/event_meta = null
/datum/event/nothing
- name = "Nothing"
//Called first before processing.
//Allows you to setup your event, such as randomly
@@ -89,6 +96,9 @@
/datum/event/proc/end()
return
+//Returns the latest point of event processing.
+/datum/event/proc/lastProcessAt()
+ return max(startWhen, max(announceWhen, endWhen))
//Do not override this proc, instead use the appropiate procs.
//This proc will handle the calls to the appropiate procs.
@@ -108,7 +118,7 @@
end()
// Everything is done, let's clean up.
- if(activeFor >= endWhen && activeFor >= announceWhen && activeFor >= startWhen)
+ if(activeFor >= lastProcessAt())
kill()
activeFor++
@@ -120,6 +130,7 @@
isRunning = 0
end()
+ endedAt = world.time
event_manager.active_events -= src
event_manager.event_complete(src)
@@ -132,5 +143,7 @@
if(severity < EVENT_LEVEL_MUNDANE) severity = EVENT_LEVEL_MUNDANE
if(severity > EVENT_LEVEL_MAJOR) severity = EVENT_LEVEL_MAJOR
+ startedAt = world.time
+
setup()
..()
diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm
new file mode 100644
index 0000000000..5470f1ba7a
--- /dev/null
+++ b/code/modules/events/event_container.dm
@@ -0,0 +1,179 @@
+#define ASSIGNMENT_ANY "Any"
+#define ASSIGNMENT_AI "AI"
+#define ASSIGNMENT_CYBORG "Cyborg"
+#define ASSIGNMENT_ENGINEER "Engineer"
+#define ASSIGNMENT_GARDENER "Gardener"
+#define ASSIGNMENT_JANITOR "Janitor"
+#define ASSIGNMENT_MEDICAL "Medical"
+#define ASSIGNMENT_SCIENTIST "Scientist"
+#define ASSIGNMENT_SECURITY "Security"
+
+var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT_LEVEL_MODERATE = "Moderate", EVENT_LEVEL_MAJOR = "Major")
+
+/datum/event_container
+ var/severity = -1
+ var/delayed = 0
+ var/delay_modifier = 1
+ var/next_event_time = 0
+ var/list/available_events
+ var/list/last_event_time = list()
+ var/datum/event_meta/next_event = null
+
+ var/last_world_time = 0
+
+/datum/event_container/proc/process()
+ if(!next_event_time)
+ set_event_delay()
+
+ if(delayed)
+ next_event_time += (world.time - last_world_time)
+ else if(world.time > next_event_time)
+ start_event()
+
+ last_world_time = world.time
+
+/datum/event_container/proc/start_event()
+ if(!next_event) // If non-one has explicitly set an event, randomly pick one
+ next_event = acquire_event()
+
+ // Has an event been acquired?
+ if(next_event)
+ // Set when the event of this type was last fired, and prepare the next event start
+ last_event_time[next_event] = world.time
+ set_event_delay()
+ next_event.enabled = !next_event.one_shot // This event will no longer be available in the random rotation if one shot
+
+ new next_event.event_type(next_event) // Events are added and removed from the processing queue in their New/kill procs
+
+ log_debug("Starting event '[next_event.name]' of severity [severity_to_string[severity]].")
+ next_event = null // When set to null, a random event will be selected next time
+ else
+ // If not, wait for one minute, instead of one tick, before checking again.
+ next_event_time += (60 * 10)
+
+
+/datum/event_container/proc/acquire_event()
+ if(available_events.len == 0)
+ return
+ var/active_with_role = number_active_with_role()
+
+ var/list/possible_events = list()
+ for(var/datum/event_meta/EM in available_events)
+ var/event_weight = EM.get_weight(active_with_role)
+ if(EM.enabled && event_weight)
+ possible_events[EM] = event_weight
+
+ for(var/event_meta in last_event_time) if(possible_events[event_meta])
+ var/time_passed = world.time - event_last_fired[event_meta]
+ var/weight_modifier = max(0, (config.expected_round_length - time_passed) / 300)
+ var/new_weight = max(possible_events[event_meta] - weight_modifier, 0)
+
+ if(new_weight)
+ possible_events[event_meta] = new_weight
+ else
+ possible_events -= event_meta
+
+ if(possible_events.len == 0)
+ return null
+
+ // Select an event and remove it from the pool of available events
+ var/picked_event = pickweight(possible_events)
+ available_events -= picked_event
+ return picked_event
+
+/datum/event_container/proc/set_event_delay()
+ // If the next event time has not yet been set and we have a custom first time start
+ if(next_event_time == 0 && config.event_first_run[severity])
+ var/lower = config.event_first_run[severity]["lower"]
+ var/upper = config.event_first_run[severity]["upper"]
+ var/event_delay = rand(lower, upper)
+ next_event_time = world.time + event_delay
+ // Otherwise, follow the standard setup process
+ else
+ var/playercount_modifier = 1
+ switch(player_list.len)
+ if(0 to 10)
+ playercount_modifier = 1.2
+ if(11 to 15)
+ playercount_modifier = 1.1
+ if(16 to 25)
+ playercount_modifier = 1
+ if(26 to 35)
+ playercount_modifier = 0.9
+ if(36 to 100000)
+ playercount_modifier = 0.8
+ playercount_modifier = playercount_modifier * delay_modifier
+
+ var/event_delay = rand(config.event_delay_lower[severity], config.event_delay_upper[severity]) * playercount_modifier
+ next_event_time = world.time + event_delay
+
+ log_debug("Next event of severity [severity_to_string[severity]] in [(next_event_time - world.time)/600] minutes.")
+
+/datum/event_container/proc/SelectEvent()
+ var/datum/event_meta/EM = input("Select an event to queue up.", "Event Selection", null) as null|anything in available_events
+ if(!EM)
+ return
+ if(next_event)
+ available_events += next_event
+ available_events -= EM
+ next_event = EM
+ return EM
+
+/datum/event_container/mundane
+ severity = EVENT_LEVEL_MUNDANE
+ available_events = list(
+ // Severity level, event name, even type, base weight, role weights, one shot, min weight, max weight. Last two only used if set and non-zero
+ new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Nothing", /datum/event/nothing, 100),
+ new /datum/event_meta(EVENT_LEVEL_MUNDANE, "PDA Spam", /datum/event/pda_spam, 0, list(ASSIGNMENT_ANY = 4), 0, 25, 50),
+ new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Money Lotto", /datum/event/money_lotto, 0, list(ASSIGNMENT_ANY = 1), 1, 5, 15),
+ new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Money Hacker", /datum/event/money_hacker, 0, list(ASSIGNMENT_ANY = 4), 1, 10, 25),
+ new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Economic News", /datum/event/economic_event, 300),
+ new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Trivial News", /datum/event/trivial_news, 400),
+ new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Mundane News", /datum/event/mundane_news, 300),
+ new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Lost Carp", /datum/event/carp_migration, 20, list(ASSIGNMENT_SECURITY = 10), 1),
+ new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Brand Intelligence",/datum/event/brand_intelligence,20, list(ASSIGNMENT_JANITOR = 25), 1),
+ new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Vermin Infestation",/datum/event/infestation, 100, list(ASSIGNMENT_JANITOR = 100)),
+ new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Wallrot", /datum/event/wallrot, 0, list(ASSIGNMENT_ENGINEER = 30, ASSIGNMENT_GARDENER = 50)),
+ )
+
+/datum/event_container/moderate
+ severity = EVENT_LEVEL_MODERATE
+ available_events = list(
+ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Nothing", /datum/event/nothing, 10),
+ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Carp School", /datum/event/carp_migration, 20, list(ASSIGNMENT_SECURITY = 10), 1),
+ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Rogue Drones", /datum/event/rogue_drone, 5, list(ASSIGNMENT_ENGINEER = 25, ASSIGNMENT_SECURITY = 25)),
+ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Space vines", /datum/event/spacevine, 10, list(ASSIGNMENT_ENGINEER = 5)),
+ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Meteor Shower", /datum/event/meteor_shower, 0, list(ASSIGNMENT_ENGINEER = 10)),
+ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Communication Blackout", /datum/event/communications_blackout, 50, list(ASSIGNMENT_AI = 25, ASSIGNMENT_SECURITY = 25)),
+ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Prison Break", /datum/event/prison_break, 0, list(ASSIGNMENT_SECURITY = 50)),
+ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grid Check", /datum/event/grid_check, 25, list(ASSIGNMENT_ENGINEER = 10)),
+ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Electrical Storm", /datum/event/electrical_storm, 15, list(ASSIGNMENT_ENGINEER = 5, ASSIGNMENT_JANITOR = 15)),
+ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Radiation Storm", /datum/event/radiation_storm, 0, list(ASSIGNMENT_MEDICAL = 10), 1),
+ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Appendicitis", /datum/event/spontaneous_appendicitis, 0, list(ASSIGNMENT_MEDICAL = 10), 1),
+ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Viral Infection", /datum/event/viral_infection, 0, list(ASSIGNMENT_MEDICAL = 10)),
+ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Spider Infestation", /datum/event/spider_infestation, 5, list(ASSIGNMENT_SECURITY = 5), 1),
+ new /datum/event_meta/alien(EVENT_LEVEL_MODERATE, "Alien Infestation", /datum/event/alien_infestation, 2.5,list(ASSIGNMENT_SECURITY = 1), 1, 0, 5),
+ new /datum/event_meta/ninja(EVENT_LEVEL_MODERATE, "Space Ninja", /datum/event/space_ninja, 0, list(ASSIGNMENT_SECURITY = 1), 1, 0, 5),
+ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Ion Storm", /datum/event/ionstorm, 0, list(ASSIGNMENT_AI = 25, ASSIGNMENT_CYBORG = 25, ASSIGNMENT_ENGINEER = 10, ASSIGNMENT_SCIENTIST = 5)),
+ )
+
+/datum/event_container/major
+ severity = EVENT_LEVEL_MAJOR
+ available_events = list(
+ new /datum/event_meta(EVENT_LEVEL_MAJOR, "Nothing", /datum/event/nothing, 50),
+ new /datum/event_meta(EVENT_LEVEL_MAJOR, "Carp Migration", /datum/event/carp_migration, 0, list(ASSIGNMENT_SECURITY = 10), 1),
+ new /datum/event_meta(EVENT_LEVEL_MAJOR, "Viral Infection", /datum/event/viral_infection, 0, list(ASSIGNMENT_MEDICAL = 10), 1),
+ new /datum/event_meta(EVENT_LEVEL_MAJOR, "Blob", /datum/event/blob, 0, list(ASSIGNMENT_ENGINEER = 10), 1),
+ new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Wave", /datum/event/meteor_wave, 0, list(ASSIGNMENT_ENGINEER = 10), 1),
+ )
+
+
+#undef ASSIGNMENT_ANY
+#undef ASSIGNMENT_AI
+#undef ASSIGNMENT_CYBORG
+#undef ASSIGNMENT_ENGINEER
+#undef ASSIGNMENT_GARDENER
+#undef ASSIGNMENT_JANITOR
+#undef ASSIGNMENT_MEDICAL
+#undef ASSIGNMENT_SCIENTIST
+#undef ASSIGNMENT_SECURITY
diff --git a/code/modules/events/event_manager.dm b/code/modules/events/event_manager.dm
index c74e302b46..bc42d7c19f 100644
--- a/code/modules/events/event_manager.dm
+++ b/code/modules/events/event_manager.dm
@@ -1,72 +1,24 @@
-#define ASSIGNMENT_ANY "Any"
-#define ASSIGNMENT_AI "AI"
-#define ASSIGNMENT_CYBORG "Cyborg"
-#define ASSIGNMENT_ENGINEER "Engineer"
-#define ASSIGNMENT_GARDENER "Gardener"
-#define ASSIGNMENT_JANITOR "Janitor"
-#define ASSIGNMENT_MEDICAL "Medical"
-#define ASSIGNMENT_SCIENTIST "Scientist"
-#define ASSIGNMENT_SECURITY "Security"
-
-var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT_LEVEL_MODERATE = "Moderate", EVENT_LEVEL_MAJOR = "Major")
-
/datum/event_manager
- var/list/available_events = list(
- EVENT_LEVEL_MUNDANE = list(
- // Severity level, event name, even type, base weight, role weights, min weight, max weight. Last two only used if set and non-zero
- new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Nothing", /datum/event/nothing, 100),
- new /datum/event_meta(EVENT_LEVEL_MUNDANE, "PDA Spam", /datum/event/pda_spam, 0, list(ASSIGNMENT_ANY = 4), 25, 200),
- new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Money Lotto", /datum/event/money_lotto, 0, list(ASSIGNMENT_ANY = 1), 5, 50),
- new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Money Hacker", /datum/event/money_hacker, 0, list(ASSIGNMENT_ANY = 4), 25, 200),
- new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Economic News", /datum/event/economic_event, 300),
- new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Trivial News", /datum/event/trivial_news, 400),
- new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Mundane News", /datum/event/mundane_news, 300),
- new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Carp", /datum/event/carp_migration, 20, list(ASSIGNMENT_SECURITY = 10)),
- new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Wall root", /datum/event/wallrot, 0, list(ASSIGNMENT_ENGINEER = 30, ASSIGNMENT_GARDENER = 50)),
- new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Brand Intelligence", /datum/event/brand_intelligence, 20, list(ASSIGNMENT_JANITOR = 25)),
- new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Vermin Infestation", /datum/event/infestation, 100, list(ASSIGNMENT_JANITOR = 100)),
- ),
- EVENT_LEVEL_MODERATE = list(
- new /datum/event_meta(EVENT_LEVEL_MODERATE, "Nothing", /datum/event/nothing, 10),
- new /datum/event_meta(EVENT_LEVEL_MODERATE, "Carp Infestation", /datum/event/carp_migration, 20, list(ASSIGNMENT_SECURITY = 10)),
- new /datum/event_meta(EVENT_LEVEL_MODERATE, "Rogue Drones", /datum/event/rogue_drone, 5, list(ASSIGNMENT_ENGINEER = 25, ASSIGNMENT_SECURITY = 25)),
- new /datum/event_meta(EVENT_LEVEL_MODERATE, "Space vines", /datum/event/spacevine, 10, list(ASSIGNMENT_ENGINEER = 5)),
- new /datum/event_meta(EVENT_LEVEL_MODERATE, "Meteor Shower", /datum/event/meteor_shower, 0, list(ASSIGNMENT_ENGINEER = 10)),
- new /datum/event_meta(EVENT_LEVEL_MODERATE, "Communication Blackout", /datum/event/communications_blackout, 50, list(ASSIGNMENT_AI = 25, ASSIGNMENT_SECURITY = 25)),
- new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grid Check", /datum/event/grid_check, 25, list(ASSIGNMENT_ENGINEER = 10)),
- new /datum/event_meta(EVENT_LEVEL_MODERATE, "Electrical Storm", /datum/event/electrical_storm, 15, list(ASSIGNMENT_ENGINEER = 5, ASSIGNMENT_JANITOR = 15)),
- new /datum/event_meta(EVENT_LEVEL_MODERATE, "Radiation Storm", /datum/event/radiation_storm, 0, list(ASSIGNMENT_MEDICAL = 10)),
- new /datum/event_meta(EVENT_LEVEL_MODERATE, "Appendicitis", /datum/event/spontaneous_appendicitis, 0, list(ASSIGNMENT_MEDICAL = 10)),
- new /datum/event_meta(EVENT_LEVEL_MODERATE, "Viral Infection", /datum/event/viral_infection, 0, list(ASSIGNMENT_MEDICAL = 10)),
- new /datum/event_meta(EVENT_LEVEL_MODERATE, "Spider Infestation",/datum/event/spider_infestation, 5, list(ASSIGNMENT_SECURITY = 5)),
- new /datum/event_meta/alien(EVENT_LEVEL_MODERATE, "Alien Infestation", /datum/event/alien_infestation, 2.5,list(ASSIGNMENT_SECURITY = 1), max_event_weight = 5),
- new /datum/event_meta/ninja(EVENT_LEVEL_MODERATE, "Space Ninja", /datum/event/space_ninja, 0, list(ASSIGNMENT_SECURITY = 1), max_event_weight = 5),
- new /datum/event_meta(EVENT_LEVEL_MODERATE, "Ion Storm", /datum/event/ionstorm, 0, list(ASSIGNMENT_AI = 25, ASSIGNMENT_CYBORG = 25, ASSIGNMENT_ENGINEER = 10, ASSIGNMENT_SCIENTIST = 5)),
- ),
- EVENT_LEVEL_MAJOR = list(
- new /datum/event_meta(EVENT_LEVEL_MAJOR, "Nothing", /datum/event/nothing, 100),
- new /datum/event_meta(EVENT_LEVEL_MAJOR, "Carp Migration", /datum/event/carp_migration, 0, list(ASSIGNMENT_SECURITY = 10)),
- new /datum/event_meta(EVENT_LEVEL_MAJOR, "Viral Infection", /datum/event/viral_infection, 0, list(ASSIGNMENT_MEDICAL = 10)),
- new /datum/event_meta(EVENT_LEVEL_MAJOR, "Blob", /datum/event/blob, 0, list(ASSIGNMENT_ENGINEER = 10)),
- new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Wave", /datum/event/meteor_wave, 0, list(ASSIGNMENT_ENGINEER = 10)),
- )
- )
-
- var/window_x = 370
- var/window_y = 530
+ var/window_x = 700
+ var/window_y = 600
+ var/report_at_round_end = 0
var/table_options = " align='center'"
var/row_options1 = " width='85px'"
var/row_options2 = " width='260px'"
+ var/row_options3 = " width='150px'"
+ var/datum/event_container/selected_event_container = null
var/list/datum/event/active_events = list()
var/list/datum/event/finished_events = list()
var/list/datum/event/allEvents
+ var/list/datum/event_container/event_containers = list(
+ EVENT_LEVEL_MUNDANE = new/datum/event_container/mundane,
+ EVENT_LEVEL_MODERATE = new/datum/event_container/moderate,
+ EVENT_LEVEL_MAJOR = new/datum/event_container/major
+ )
- var/list/last_event_time = list()
- var/list/next_event = list(EVENT_LEVEL_MUNDANE = null, EVENT_LEVEL_MODERATE = null, EVENT_LEVEL_MAJOR = null)
- var/list/next_event_time = list(EVENT_LEVEL_MUNDANE = 0, EVENT_LEVEL_MODERATE = 0, EVENT_LEVEL_MAJOR = 0)
- var/list/delay_modifier = list(EVENT_LEVEL_MUNDANE = 1, EVENT_LEVEL_MODERATE = 1, EVENT_LEVEL_MAJOR = 1)
+ var/datum/event_meta/new_event = new
/datum/event_manager/New()
allEvents = typesof(/datum/event) - /datum/event
@@ -76,99 +28,22 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT
E.process()
for(var/i = EVENT_LEVEL_MUNDANE to EVENT_LEVEL_MAJOR)
- // Is it time to fire a new event of this severity level?
- if(world.timeofday > next_event_time[i])
- process_event_start(i)
-
-/datum/event_manager/proc/process_event_start(var/severity)
- var/event = next_event[severity]
- if(event)
- start_event(event)
-
- // Attempt to select a new event
- next_event[severity] = acquire_event(available_events[severity])
- if(next_event[severity]) // If we got an event, set the next delay proper
- set_event_delay(severity)
- else // Otherwise, wait for one minute (rather than next process tick) before checking again
- next_event_time[severity] += (60 * 10)
-
-/datum/event_manager/proc/start_event(var/datum/event_meta/EM)
- // Set when the event of this type was last fired
- last_event_time[EM] = world.timeofday
-
- log_debug("Starting event of severity [EM.severity].")
- new EM.event_type(EM) // Events are added and removed from the processing queue in New/Del
-
-/datum/event_manager/proc/acquire_event(var/list/events)
- if(events.len == 0)
- return
- var/active_with_role = number_active_with_role()
-
- var/list/possible_events = list()
- for(var/datum/event_meta/EM in events)
- var/event_weight = EM.get_weight(active_with_role)
- if(event_weight)
- possible_events[EM] = event_weight
-
- for(var/event_meta in last_event_time) if(possible_events[event_meta])
- var/time_passed = world.timeofday - event_last_fired[event_meta]
- var/weight_modifier = max(0, (config.expected_round_length - time_passed) / 300)
- var/new_weight = max(possible_events[event_meta] - weight_modifier, 0)
-
- if(new_weight)
- possible_events[event_meta] = new_weight
- else
- possible_events -= event_meta
-
- if(possible_events.len == 0)
- return null
-
- // Select an event and remove it from the pool of available events
- var/picked_event = pickweight(possible_events)
- events -= picked_event
- return picked_event
-
-/datum/event_manager/proc/set_event_delay(var/severity)
- // If the next event time has not yet been set and we have a custom first time start
- if(next_event_time[severity] == 0 && config.event_first_run[severity])
- var/lower = config.event_first_run[severity]["lower"]
- var/upper = config.event_first_run[severity]["upper"]
- var/event_delay = rand(lower, upper)
- next_event_time[severity] = world.timeofday + event_delay
- // Otherwise, follow the standard setup process
- else
- var/playercount_modifier = 1
- switch(player_list.len)
- if(0 to 10)
- playercount_modifier = 1.2
- if(11 to 15)
- playercount_modifier = 1.1
- if(16 to 25)
- playercount_modifier = 1
- if(26 to 35)
- playercount_modifier = 0.9
- if(36 to 100000)
- playercount_modifier = 0.8
- playercount_modifier = playercount_modifier * delay_modifier[severity]
-
- var/event_delay = rand(config.event_delay_lower[severity], config.event_delay_upper[severity]) * playercount_modifier
- next_event_time[severity] = world.timeofday + event_delay
-
- log_debug("Next event of severity [severity] in [(next_event_time[severity] - world.timeofday)/600] minutes.")
+ var/list/datum/event_container/EC = event_containers[i]
+ EC.process()
/datum/event_manager/proc/event_complete(var/datum/event/E)
- if(!E.event_meta) // datum/event is used here and there for random reasons
+ if(!E.event_meta) // datum/event is used here and there for random reasons, maintaining "backwards compatibility"
log_debug("Event of '[E.type]' with missing meta-data has completed.")
return
finished_events += E
- // Add the event back to the list of available events, unless it's a oneShot
- if(!E.oneShot)
- var/list/datum/event_meta/AE = available_events[E.event_meta.severity]
- AE.Add(E.event_meta)
- log_debug("Event '[E.name]' has completed.")
+ // Add the event back to the list of available events
+ var/datum/event_container/EC = event_containers[E.severity]
+ var/datum/event_meta/EM = E.event_meta
+ EC.available_events += EM
+ log_debug("Event '[EM.name]' has completed at [worldtime2text()].")
/datum/event_manager/proc/Interact(var/mob/living/user)
@@ -178,40 +53,130 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT
popup.set_content(html)
popup.open()
+/datum/event_manager/proc/RoundEnd()
+ if(!report_at_round_end)
+ return
+
+ world << "
Random Events This Round:"
+ for(var/datum/event/E in active_events|finished_events)
+ var/datum/event_meta/EM = E.event_meta
+ if(EM.name == "Nothing")
+ continue
+ var/message = "'[EM.name]' began at [worldtime2text(E.startedAt)] "
+ if(E.isRunning)
+ message += "and is still running."
+ else
+ if(E.endedAt - E.startedAt > MinutesToTicks(5)) // Only mention end time if the entire duration was more than 5 minutes
+ message += "and ended at [worldtime2text(E.endedAt)]."
+ else
+ message += "and ran to completion."
+
+ world << message
+
/datum/event_manager/proc/GetInteractWindow()
- var html = "Refresh
"
+ var/html = "Refresh"
- html += ""
- html += "
Event Start
"
- html += "
"
- html += "| Severity | Until start | Adjust start |
"
- for(var/severity = EVENT_LEVEL_MUNDANE to EVENT_LEVEL_MAJOR)
- var/event_time = max(0, next_event_time[severity] - world.timeofday)
- html += ""
- html += "| [severity_to_string[severity]] | "
- html += "[event_time / 600] | "
- html += ""
- html += "--"
- html += "-"
- html += "+"
- html += "++"
- html += " | "
- html += "
"
- html += "
"
- html += "
"
+ if(selected_event_container)
+ var/event_time = max(0, selected_event_container.next_event_time - world.time)
+ html += "Back
"
+ html += "Time till start: [round(event_time / 600, 0.1)]
"
+ html += ""
+ html += "
Available [severity_to_string[selected_event_container.severity]] Events (queued & running events will not be displayed)
"
+ html += "
"
+ html += "| Name | Weight | MinWeight | MaxWeight | OneShot | Enabled | CurrWeight | Remove |
"
+ for(var/datum/event_meta/EM in selected_event_container.available_events)
+ html += ""
+ html += "| [EM.name] | "
+ html += "[EM.weight] | "
+ html += "[EM.min_weight] | "
+ html += "[EM.max_weight] | "
+ html += "[EM.one_shot] | "
+ html += "[EM.enabled] | "
+ html += "[EM.get_weight()] | "
+ html += "Remove | "
+ html += "
"
+ html += "
"
+ html += "
"
- html += ""
- html += "
Next Event
"
- html += "
"
- html += "| Severity | Name |
"
- for(var/severity = EVENT_LEVEL_MUNDANE to EVENT_LEVEL_MAJOR)
- var/datum/event_meta/EM = next_event[severity]
+ html += ""
+ html += "
Add Event
"
+ html += "
"
- html += "
"
+ html += "
"
+ html += "
Add"
+ html += "
"
+ else
+ html += "Round End Report: [report_at_round_end ? "On": "Off"]
"
+ html += ""
+ html += "
Event Start
"
+
+ html += "
"
+ html += "| Severity | Starts At | Starts In | Adjust Start | Pause | Interval Mod |
"
+ for(var/severity = EVENT_LEVEL_MUNDANE to EVENT_LEVEL_MAJOR)
+ var/datum/event_container/EC = event_containers[severity]
+ var/next_event_at = max(0, EC.next_event_time - world.time)
+ html += ""
+ html += "| [severity_to_string[severity]] | "
+ html += "[worldtime2text(max(EC.next_event_time, world.time))] | "
+ html += "[round(next_event_at / 600, 0.1)] | "
+ html += ""
+ html += "--"
+ html += "-"
+ html += "+"
+ html += "++"
+ html += " | "
+ html += ""
+ html += "[EC.delayed ? "Resume" : "Pause"]"
+ html += " | "
+ html += ""
+ html += "[EC.delay_modifier]"
+ html += " | "
+ html += "
"
+ html += "
"
+ html += "
"
+
+ html += ""
+ html += "
Next Event
"
+ html += "
"
+ html += "| Severity | Name | Event Rotation | Clear |
"
+ for(var/severity = EVENT_LEVEL_MUNDANE to EVENT_LEVEL_MAJOR)
+ var/datum/event_container/EC = event_containers[severity]
+ var/datum/event_meta/EM = EC.next_event
+ html += ""
+ html += "| [severity_to_string[severity]] | "
+ html += "[EM ? EM.name : "Random"] | "
+ html += "View | "
+ html += "Clear | "
+ html += "
"
+ html += "
"
+ html += "
"
+
+ html += ""
+ html += "
Running Events
"
+ html += "Estimated times, affected by master controller delays."
+ html += "
"
+ html += "| Severity | Name | Ends At | Ends In | Stop |
"
+ for(var/datum/event/E in active_events)
+ if(!E.event_meta)
+ continue
+ var/datum/event_meta/EM = E.event_meta
+ var/ends_at = E.startedAt + (E.lastProcessAt() * master_controller.minimum_ticks) // A best estimate
+ var/ends_in = max(0, round((ends_at - world.time) / 600, 0.1))
+ html += ""
+ html += "| [severity_to_string[EM.severity]] | "
+ html += "[EM.name] | "
+ html += "[worldtime2text(ends_at)] | "
+ html += "[ends_in] | "
+ html += "Stop | "
+ html += "
"
+ html += "
"
+ html += "
"
return html
@@ -219,28 +184,95 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT
if(..())
return
- var/severity = text2num(href_list["severity"])
- if(href_list["dec_timer"])
- next_event_time[severity] -= (60 * RaiseToPower(10, text2num(href_list["dec_timer"])))
+
+ if(href_list["toggle_report"])
+ report_at_round_end = !report_at_round_end
+ admin_log_and_message_admins("has [report_at_round_end ? "enabled" : "disabled"] the round end event report.")
+ else if(href_list["dec_timer"])
+ var/datum/event_container/EC = locate(href_list["event"])
+ var/decrease = (60 * RaiseToPower(10, text2num(href_list["dec_timer"])))
+ EC.next_event_time -= decrease
+ admin_log_and_message_admins("decreased timer for [severity_to_string[EC.severity]] events by [decrease/600] minute(s).")
else if(href_list["inc_timer"])
- next_event_time[severity] += (60 * RaiseToPower(10, text2num(href_list["inc_timer"])))
+ var/datum/event_container/EC = locate(href_list["event"])
+ var/increase = (60 * RaiseToPower(10, text2num(href_list["inc_timer"])))
+ EC.next_event_time += increase
+ admin_log_and_message_admins("increased timer for [severity_to_string[EC.severity]] events by [increase/600] minute(s).")
else if(href_list["select_event"])
- SelectEvent(severity)
+ var/datum/event_container/EC = locate(href_list["select_event"])
+ var/datum/event_meta/EM = EC.SelectEvent()
+ if(EM)
+ admin_log_and_message_admins("has queued the [severity_to_string[EC.severity]] event '[EM.name]'.")
+ else if(href_list["pause"])
+ var/datum/event_container/EC = locate(href_list["pause"])
+ EC.delayed = !EC.delayed
+ admin_log_and_message_admins("has [EC.delayed ? "paused" : "resumed"] countdown for [severity_to_string[EC.severity]] events.")
+ else if(href_list["interval"])
+ var/delay = input("Enter delay modifier. A value less than one means events fire more often, higher than one less often.", "Set Interval Modifier") as num|null
+ if(delay && delay > 0)
+ var/datum/event_container/EC = locate(href_list["interval"])
+ EC.delay_modifier = delay
+ admin_log_and_message_admins("has set the interval modifier for [severity_to_string[EC.severity]] events to [EC.delay_modifier].")
+ else if(href_list["stop"])
+ if(alert("Stopping an event may have unintended side-effects. Continue?","Stopping Event!","Yes","No") != "Yes")
+ return
+ var/datum/event/E = locate(href_list["stop"])
+ var/datum/event_meta/EM = E.event_meta
+ admin_log_and_message_admins("has stopped the [severity_to_string[EM.severity]] event '[EM.name]'.")
+ E.kill()
+ else if(href_list["view_events"])
+ selected_event_container = locate(href_list["view_events"])
+ else if(href_list["back"])
+ selected_event_container = null
+ else if(href_list["set_name"])
+ var/name = input("Enter event name.", "Set Name") as text|null
+ if(name)
+ var/datum/event_meta/EM = locate(href_list["set_name"])
+ EM.name = name
+ else if(href_list["set_type"])
+ var/type = input("Select event type.", "Select") as null|anything in allEvents
+ if(type)
+ var/datum/event_meta/EM = locate(href_list["set_type"])
+ EM.event_type = type
+ else if(href_list["set_weight"])
+ var/weight = input("Enter weight. A higher value means higher chance for the event of being selected.", "Set Weight") as num|null
+ if(weight && weight > 0)
+ var/datum/event_meta/EM = locate(href_list["set_weight"])
+ EM.weight = weight
+ if(EM != new_event)
+ admin_log_and_message_admins("has changed the weight of the [severity_to_string[EM.severity]] event '[EM.name]' to [EM.weight].")
+ else if(href_list["toggle_oneshot"])
+ var/datum/event_meta/EM = locate(href_list["toggle_oneshot"])
+ EM.one_shot = !EM.one_shot
+ if(EM != new_event)
+ admin_log_and_message_admins("has [EM.one_shot ? "set" : "unset"] the oneshot flag for the [severity_to_string[EM.severity]] event '[EM.name]'.")
+ else if(href_list["toggle_enabled"])
+ var/datum/event_meta/EM = locate(href_list["toggle_enabled"])
+ EM.enabled = !EM.enabled
+ admin_log_and_message_admins("has [EM.enabled ? "enabled" : "disabled"] the [severity_to_string[EM.severity]] event '[EM.name]'.")
+ else if(href_list["remove"])
+ if(alert("This will remove the event from rotation. Continue?","Removing Event!","Yes","No") != "Yes")
+ return
+ var/datum/event_meta/EM = locate(href_list["remove"])
+ var/datum/event_container/EC = locate(href_list["EC"])
+ EC.available_events -= EM
+ admin_log_and_message_admins("has removed the [severity_to_string[EM.severity]] event '[EM.name]'.")
+ else if(href_list["add"])
+ if(!new_event.name || !new_event.event_type)
+ return
+ if(alert("This will add a new event to the rotation. Continue?","Add Event!","Yes","No") != "Yes")
+ return
+ selected_event_container.available_events += new_event
+ admin_log_and_message_admins("has added \a [severity_to_string[new_event.severity]] event '[new_event.name]' of type [new_event.event_type] with weight [new_event.weight].")
+ new_event = new
+ else if(href_list["clear"])
+ var/datum/event_container/EC = locate(href_list["clear"])
+ if(EC.next_event)
+ admin_log_and_message_admins("has unqueued the [severity_to_string[EC.severity]] event '[EC.next_event.name]'.")
+ EC.next_event = null
Interact(usr)
-/datum/event_manager/proc/SelectEvent(var/severity)
- var/datum/event_meta/EM = input("Select an event to queue up.", "Event Selection", null) as null|anything in available_events[severity]
- if(!EM)
- return
- if(next_event[severity])
- available_events[severity] += next_event[severity]
- available_events[severity] -= EM
- next_event[severity] = EM
-
-/proc/debugStartEvent(var/severity)
- event_manager.start_event(severity)
-
/client/proc/forceEvent(var/type in event_manager.allEvents)
set name = "Trigger Event (Debug Only)"
set category = "Debug"
@@ -259,13 +291,3 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT
event_manager.Interact(usr)
feedback_add_details("admin_verb","EMP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
-
-#undef ASSIGNMENT_ANY
-#undef ASSIGNMENT_AI
-#undef ASSIGNMENT_CYBORG
-#undef ASSIGNMENT_ENGINEER
-#undef ASSIGNMENT_GARDENER
-#undef ASSIGNMENT_JANITOR
-#undef ASSIGNMENT_MEDICAL
-#undef ASSIGNMENT_SCIENTIST
-#undef ASSIGNMENT_SECURITY
\ No newline at end of file
diff --git a/code/modules/events/grid_check.dm b/code/modules/events/grid_check.dm
index 6b04bd9ad7..c485827efb 100644
--- a/code/modules/events/grid_check.dm
+++ b/code/modules/events/grid_check.dm
@@ -1,5 +1,4 @@
/datum/event/grid_check //NOTE: Times are measured in master controller ticks!
- name = "Grid Check"
announceWhen = 5
/datum/event/grid_check/setup()
diff --git a/code/modules/events/infestation.dm b/code/modules/events/infestation.dm
index a78f98ba8e..d587c51269 100644
--- a/code/modules/events/infestation.dm
+++ b/code/modules/events/infestation.dm
@@ -14,7 +14,6 @@
#define VERM_SPIDERS 2
/datum/event/infestation
- name = "Vermin Infestation"
announceWhen = 10
endWhen = 11
var/location
diff --git a/code/modules/events/ion_storm.dm b/code/modules/events/ion_storm.dm
index 67b0f41720..c880955817 100644
--- a/code/modules/events/ion_storm.dm
+++ b/code/modules/events/ion_storm.dm
@@ -1,7 +1,6 @@
//This file was auto-corrected by findeclaration.exe on 29/05/2012 15:03:04
/datum/event/ionstorm
- name = "Ion Storm"
var/botEmagChance = 0.5
var/list/players = list()
diff --git a/code/modules/events/meteors.dm b/code/modules/events/meteors.dm
index f887403ba2..791f44ab34 100644
--- a/code/modules/events/meteors.dm
+++ b/code/modules/events/meteors.dm
@@ -2,7 +2,6 @@
//meteor storms are much heavier
/datum/event/meteor_wave
- name = "Meteor Wave"
startWhen = 6
endWhen = 33
@@ -21,7 +20,6 @@
//
/datum/event/meteor_shower
- name = "Meteor Shower"
startWhen = 5
endWhen = 7
var/next_meteor = 6
diff --git a/code/modules/events/money_hacker.dm b/code/modules/events/money_hacker.dm
index 16b16a342c..5fbc323a29 100644
--- a/code/modules/events/money_hacker.dm
+++ b/code/modules/events/money_hacker.dm
@@ -1,7 +1,6 @@
/var/global/account_hack_attempted = 0
/datum/event/money_hacker
- name = "Money Hacker"
var/datum/money_account/affected_account
endWhen = 100
var/end_time
diff --git a/code/modules/events/money_lotto.dm b/code/modules/events/money_lotto.dm
index ff3375ebe1..1be8b5ce04 100644
--- a/code/modules/events/money_lotto.dm
+++ b/code/modules/events/money_lotto.dm
@@ -1,5 +1,4 @@
/datum/event/money_lotto
- name = "Money Lotto"
var/winner_name = "John Smith"
var/winner_sum = 0
var/deposit_success = 0
diff --git a/code/modules/events/money_spam.dm b/code/modules/events/money_spam.dm
index aafce8afe2..acb6e7f00a 100644
--- a/code/modules/events/money_spam.dm
+++ b/code/modules/events/money_spam.dm
@@ -1,5 +1,4 @@
/datum/event/pda_spam
- name = "PDA Spam"
endWhen = 36000
var/last_spam_time = 0
var/obj/machinery/message_server/useMS
diff --git a/code/modules/events/prison_break.dm b/code/modules/events/prison_break.dm
index b1eed0fc03..8eb3bc5390 100644
--- a/code/modules/events/prison_break.dm
+++ b/code/modules/events/prison_break.dm
@@ -1,7 +1,5 @@
/datum/event/prison_break
- name = "Prison Break"
announceWhen = 50
- oneShot = 1
var/releaseWhen = 25
var/list/area/prisonAreas = list()
diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm
index 3e7249b368..c44957f9ad 100644
--- a/code/modules/events/radiation_storm.dm
+++ b/code/modules/events/radiation_storm.dm
@@ -1,11 +1,9 @@
/datum/event/radiation_storm
- name = "Radiation Storm"
var/const/enterBelt = 60
var/const/leaveBelt = 170
var/const/revokeAccess = 230
endWhen = revokeAccess
- oneShot = 1
var/postStartTicks
diff --git a/code/modules/events/rogue_drones.dm b/code/modules/events/rogue_drones.dm
index 92d19230d0..597dc28594 100644
--- a/code/modules/events/rogue_drones.dm
+++ b/code/modules/events/rogue_drones.dm
@@ -1,6 +1,4 @@
/datum/event/rogue_drone
- name = "Rogue Drones"
- startWhen = 10
endWhen = 1000
var/list/drones_list = list()
diff --git a/code/modules/events/space_ninja.dm b/code/modules/events/space_ninja.dm
index e5b2e3038b..c9e3272ce1 100644
--- a/code/modules/events/space_ninja.dm
+++ b/code/modules/events/space_ninja.dm
@@ -1,5 +1 @@
-/datum/event/space_ninja
- name = "Space Ninja"
-
/datum/event/space_ninja/setup()
- space_ninja_arrival()
diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm
index c8f270fe13..6bbd20f0d2 100644
--- a/code/modules/events/spacevine.dm
+++ b/code/modules/events/spacevine.dm
@@ -1,9 +1,5 @@
/var/global/spacevines_spawned = 0
-/datum/event/spacevine
- name = "Space Vines"
- oneShot = 1
-
/datum/event/spacevine/start()
//biomass is basically just a resprited version of space vines
if(prob(50))
diff --git a/code/modules/events/spider_infestation.dm b/code/modules/events/spider_infestation.dm
index 6f256e0b8c..d96e4fb54c 100644
--- a/code/modules/events/spider_infestation.dm
+++ b/code/modules/events/spider_infestation.dm
@@ -1,9 +1,7 @@
/var/global/sent_spiders_to_station = 0
/datum/event/spider_infestation
- name = "Large Spider Infestation"
announceWhen = 400
- oneShot = 1
var/spawncount = 1
diff --git a/code/modules/events/spontaneous_appendicitis.dm b/code/modules/events/spontaneous_appendicitis.dm
index bd7612243a..1bba7866bf 100644
--- a/code/modules/events/spontaneous_appendicitis.dm
+++ b/code/modules/events/spontaneous_appendicitis.dm
@@ -1,6 +1,3 @@
-/datum/event/spontaneous_appendicitis
- name = "Communicatinos Blackout"
-
/datum/event/spontaneous_appendicitis/start()
for(var/mob/living/carbon/human/H in shuffle(living_mob_list)) if(H.client && H.stat != DEAD)
var/foundAlready = 0 //don't infect someone that already has the virus
diff --git a/code/modules/events/viral_infection.dm b/code/modules/events/viral_infection.dm
index af306f876b..6e40d38d33 100644
--- a/code/modules/events/viral_infection.dm
+++ b/code/modules/events/viral_infection.dm
@@ -1,5 +1,4 @@
datum/event/viral_infection/setup()
- name = "Viral Outbreak"
announceWhen = rand(0, 3000)
endWhen = announceWhen + 1
diff --git a/code/modules/events/wallrot.dm b/code/modules/events/wallrot.dm
index d54aa7c4ac..b36f7f9376 100644
--- a/code/modules/events/wallrot.dm
+++ b/code/modules/events/wallrot.dm
@@ -1,5 +1,4 @@
datum/event/wallrot/setup()
- name = "Wallroot"
announceWhen = rand(0, 300)
endWhen = announceWhen + 1
diff --git a/code/modules/hydroponics/seed_machines.dm b/code/modules/hydroponics/seed_machines.dm
index 0ca5fe74b6..8b4295d72b 100644
--- a/code/modules/hydroponics/seed_machines.dm
+++ b/code/modules/hydroponics/seed_machines.dm
@@ -58,9 +58,6 @@
if(world.time > last_action + action_time)
finished_task()
-/obj/machinery/botany/attack_paw(mob/user as mob)
- return attack_hand(user)
-
/obj/machinery/botany/attack_ai(mob/user as mob)
return attack_hand(user)
diff --git a/code/modules/hydroponics/vines.dm b/code/modules/hydroponics/vines.dm
index 70265984f3..b25c03080e 100644
--- a/code/modules/hydroponics/vines.dm
+++ b/code/modules/hydroponics/vines.dm
@@ -41,6 +41,7 @@
if(/obj/item/weapon/twohanded/fireaxe) del src
if(/obj/item/weapon/hatchet) del src
if(/obj/item/weapon/melee/energy) del src
+ if(/obj/item/weapon/pickaxe/plasmacutter) del src
// Less effective weapons
if(/obj/item/weapon/wirecutters)
@@ -72,10 +73,6 @@
manual_unbuckle(user)
-
-/obj/effect/plantsegment/attack_paw(mob/user as mob)
- manual_unbuckle(user)
-
/obj/effect/plantsegment/proc/unbuckle()
if(buckled_mob)
if(buckled_mob.buckled == src) //this is probably unneccesary, but it doesn't hurt
diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm
index 5d48ec1f3c..1e1748e1cc 100644
--- a/code/modules/mob/living/carbon/alien/alien.dm
+++ b/code/modules/mob/living/carbon/alien/alien.dm
@@ -5,12 +5,6 @@
icon = 'icons/mob/alien.dmi'
icon_state = "alien"
pass_flags = PASSTABLE
- melee_damage_lower = 1
- melee_damage_upper = 3
- attacktext = "bites"
- attack_sound = null
- friendly = "nuzzles"
- wall_smash = 0
health = 100
maxHealth = 100
diff --git a/code/modules/mob/living/carbon/alien/alien_attacks.dm b/code/modules/mob/living/carbon/alien/alien_attacks.dm
index 45a486adf7..4957a2d95f 100644
--- a/code/modules/mob/living/carbon/alien/alien_attacks.dm
+++ b/code/modules/mob/living/carbon/alien/alien_attacks.dm
@@ -14,128 +14,14 @@
updatehealth()
return
-/mob/living/carbon/alien/attack_animal(mob/living/M as mob)
+/mob/living/carbon/alien/attack_hand(mob/living/carbon/M as mob)
- if(istype(M,/mob/living/simple_animal))
- var/mob/living/simple_animal/S = M
- if(S.melee_damage_upper == 0)
- S.emote("[S.friendly] [src]")
- else
- for(var/mob/O in viewers(src, null))
- O.show_message("\red [S] [S.attacktext] [src]!", 1)
- var/damage = rand(S.melee_damage_lower, S.melee_damage_upper)
- adjustBruteLoss(damage)
- S.attack_log += text("\[[time_stamp()]\] attacked [src.name] ([src.ckey])")
- src.attack_log += text("\[[time_stamp()]\] was attacked by [S.name] ([S.ckey])")
- updatehealth()
-
-/mob/living/carbon/alien/attack_paw(mob/living/carbon/monkey/M as mob)
- if(!(istype(M, /mob/living/carbon/monkey))) return//Fix for aliens receiving double messages when attacking other aliens.
-
- if (!ticker)
- M << "You cannot attack people before the game has started."
- return
-
- if (istype(loc, /turf) && istype(loc.loc, /area/start))
- M << "No attacking people at spawn, you jackass."
- return
..()
switch(M.a_intent)
if ("help")
help_shake_act(M)
- else
- if (istype(wear_mask, /obj/item/clothing/mask/muzzle))
- return
- if (health > 0)
- playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1)
- for(var/mob/O in viewers(src, null))
- if ((O.client && !( O.blinded )))
- O.show_message(text("\red [M.name] has bit [src]!"), 1)
- adjustBruteLoss(rand(1, 3))
- updatehealth()
- return
-
-
-/mob/living/carbon/alien/attack_slime(mob/living/carbon/slime/M as mob)
- if (!ticker)
- M << "You cannot attack people before the game has started."
- return
-
- if(M.Victim) return // can't attack while eating!
-
- if (health > -100)
-
- for(var/mob/O in viewers(src, null))
- if ((O.client && !( O.blinded )))
- O.show_message(text("\red The [M.name] glomps []!", src), 1)
-
- var/damage = rand(1, 3)
-
- if(M.is_adult)
- damage = rand(20, 40)
- else
- damage = rand(5, 35)
-
- adjustBruteLoss(damage)
-
-
- updatehealth()
-
- return
-
-/mob/living/carbon/alien/attack_hand(mob/living/carbon/human/M as mob)
- if (!ticker)
- M << "You cannot attack people before the game has started."
- return
-
- if (istype(loc, /turf) && istype(loc.loc, /area/start))
- M << "No attacking people at spawn, you jackass."
- return
-
- ..()
-
- if(M.gloves && istype(M.gloves,/obj/item/clothing/gloves))
- var/obj/item/clothing/gloves/G = M.gloves
- if(G.cell)
- if(M.a_intent == "hurt")//Stungloves. Any contact will stun the alien.
- if(G.cell.charge >= 2500)
- G.cell.use(2500)
-
- Weaken(5)
- if (stuttering < 5)
- stuttering = 5
- Stun(5)
-
- for(var/mob/O in viewers(src, null))
- if ((O.client && !( O.blinded )))
- O.show_message("\red [src] has been touched with the stun gloves by [M]!", 1, "\red You hear someone fall.", 2)
- return
- else
- M << "\red Not enough charge! "
- return
-
- switch(M.a_intent)
-
- if ("help")
- if (health > 0)
- help_shake_act(M)
- else
- if (M.health >= -75.0)
- if ((M.head && M.head.flags & 4) || (M.wear_mask && !( M.wear_mask.flags & 32 )) )
- M << "\blue Remove that mask!"
- return
- var/obj/effect/equip_e/human/O = new /obj/effect/equip_e/human( )
- O.source = M
- O.target = src
- O.s_loc = M.loc
- O.t_loc = loc
- O.place = "CPR"
- requests += O
- spawn( 0 )
- O.process()
- return
if ("grab")
if (M == src)
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 108333bf86..82f7a78902 100644
--- a/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm
+++ b/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm
@@ -1,14 +1,15 @@
/mob/living/carbon/alien/diona/attack_hand(mob/living/carbon/human/M as mob)
- //Let people pick the little buggers up.
- if(M.a_intent == "help")
- if(M.species && M.species.name == "Diona")
- M << "You feel your being twine with that of [src] as it merges with your biomass."
- src << "You feel your being twine with that of [M] as you merge with its biomass."
- src.verbs += /mob/living/carbon/alien/diona/proc/split
- src.verbs -= /mob/living/carbon/alien/diona/proc/merge
- src.loc = M
- else
- get_scooped(M)
+ if(istype(M))
+ //Let people pick the little buggers up.
+ if(M.a_intent == "help")
+ if(M.species && M.species.name == "Diona")
+ M << "You feel your being twine with that of [src] as it merges with your biomass."
+ src << "You feel your being twine with that of [M] as you merge with its biomass."
+ src.verbs += /mob/living/carbon/alien/diona/proc/split
+ src.verbs -= /mob/living/carbon/alien/diona/proc/merge
+ src.loc = M
+ else
+ get_scooped(M)
..()
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm
index 4e71095ca0..8dd64654b7 100644
--- a/code/modules/mob/living/carbon/alien/larva/larva.dm
+++ b/code/modules/mob/living/carbon/alien/larva/larva.dm
@@ -5,8 +5,6 @@
speak_emote = list("hisses")
icon_state = "larva"
language = "Hivemind"
- melee_damage_lower = 3
- melee_damage_upper = 6
amount_grown = 0
max_grown = 200
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index c529cc9154..c915b6f7b5 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -83,22 +83,6 @@
return
-
-/mob/living/carbon/attack_paw(mob/M as mob)
- if(!istype(M, /mob/living/carbon)) return
-
- for(var/datum/disease/D in viruses)
-
- if(D.spread_by_touch())
- M.contract_disease(D, 0, 1, CONTACT_HANDS)
-
- for(var/datum/disease/D in M.viruses)
-
- if(D.spread_by_touch())
- contract_disease(D, 0, 1, CONTACT_HANDS)
-
- return
-
/mob/living/carbon/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0, var/def_zone = null)
if(status_flags & GODMODE) return 0 //godmode
shock_damage *= siemens_coeff
diff --git a/code/modules/mob/living/carbon/human/alien/alien_facehugger.dm b/code/modules/mob/living/carbon/human/alien/alien_facehugger.dm
index 58831c870e..b3c855f290 100644
--- a/code/modules/mob/living/carbon/human/alien/alien_facehugger.dm
+++ b/code/modules/mob/living/carbon/human/alien/alien_facehugger.dm
@@ -24,10 +24,6 @@ var/const/MAX_ACTIVE_TIME = 400
var/strength = 5
var/attached = 0
-/obj/item/clothing/mask/facehugger/attack_paw(user as mob) //can be picked up by aliens
- attack_hand(user)
- return
-
/obj/item/clothing/mask/facehugger/attack_hand(user as mob)
if((stat == CONSCIOUS && !sterile))
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 19683fc36c..834d988608 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -64,56 +64,56 @@
tie_msg += " with \icon[U.hastie] \a [U.hastie]"
if(w_uniform.blood_DNA)
- msg += "[t_He] [t_is] wearing \icon[w_uniform] [w_uniform.gender==PLURAL?"some":"a"] blood-stained [w_uniform.name][tie_msg]!\n"
+ msg += "[t_He] [t_is] wearing \icon[w_uniform] [w_uniform.gender==PLURAL?"some":"a"] [(w_uniform.blood_color != "#030303") ? "blood" : "oil"]-stained [w_uniform.name][tie_msg]!\n"
else
msg += "[t_He] [t_is] wearing \icon[w_uniform] \a [w_uniform][tie_msg].\n"
//head
if(head)
if(head.blood_DNA)
- msg += "[t_He] [t_is] wearing \icon[head] [head.gender==PLURAL?"some":"a"] blood-stained [head.name] on [t_his] head!\n"
+ msg += "[t_He] [t_is] wearing \icon[head] [head.gender==PLURAL?"some":"a"] [(head.blood_color != "#030303") ? "blood" : "oil"]-stained [head.name] on [t_his] head!\n"
else
msg += "[t_He] [t_is] wearing \icon[head] \a [head] on [t_his] head.\n"
//suit/armour
if(wear_suit)
if(wear_suit.blood_DNA)
- msg += "[t_He] [t_is] wearing \icon[wear_suit] [wear_suit.gender==PLURAL?"some":"a"] blood-stained [wear_suit.name]!\n"
+ msg += "[t_He] [t_is] wearing \icon[wear_suit] [wear_suit.gender==PLURAL?"some":"a"] [(wear_suit.blood_color != "#030303") ? "blood" : "oil"]-stained [wear_suit.name]!\n"
else
msg += "[t_He] [t_is] wearing \icon[wear_suit] \a [wear_suit].\n"
//suit/armour storage
if(s_store && !skipsuitstorage)
if(s_store.blood_DNA)
- msg += "[t_He] [t_is] carrying \icon[s_store] [s_store.gender==PLURAL?"some":"a"] blood-stained [s_store.name] on [t_his] [wear_suit.name]!\n"
+ msg += "[t_He] [t_is] carrying \icon[s_store] [s_store.gender==PLURAL?"some":"a"] [(s_store.blood_color != "#030303") ? "blood" : "oil"]-stained [s_store.name] on [t_his] [wear_suit.name]!\n"
else
msg += "[t_He] [t_is] carrying \icon[s_store] \a [s_store] on [t_his] [wear_suit.name].\n"
//back
if(back)
if(back.blood_DNA)
- msg += "[t_He] [t_has] \icon[back] [back.gender==PLURAL?"some":"a"] blood-stained [back] on [t_his] back.\n"
+ msg += "[t_He] [t_has] \icon[back] [back.gender==PLURAL?"some":"a"] [(back.blood_color != "#030303") ? "blood" : "oil"]-stained [back] on [t_his] back.\n"
else
msg += "[t_He] [t_has] \icon[back] \a [back] on [t_his] back.\n"
//left hand
if(l_hand)
if(l_hand.blood_DNA)
- msg += "[t_He] [t_is] holding \icon[l_hand] [l_hand.gender==PLURAL?"some":"a"] blood-stained [l_hand.name] in [t_his] left hand!\n"
+ msg += "[t_He] [t_is] holding \icon[l_hand] [l_hand.gender==PLURAL?"some":"a"] [(l_hand.blood_color != "#030303") ? "blood" : "oil"]-stained [l_hand.name] in [t_his] left hand!\n"
else
msg += "[t_He] [t_is] holding \icon[l_hand] \a [l_hand] in [t_his] left hand.\n"
//right hand
if(r_hand)
if(r_hand.blood_DNA)
- msg += "[t_He] [t_is] holding \icon[r_hand] [r_hand.gender==PLURAL?"some":"a"] blood-stained [r_hand.name] in [t_his] right hand!\n"
+ msg += "[t_He] [t_is] holding \icon[r_hand] [r_hand.gender==PLURAL?"some":"a"] [(r_hand.blood_color != "#030303") ? "blood" : "oil"]-stained [r_hand.name] in [t_his] right hand!\n"
else
msg += "[t_He] [t_is] holding \icon[r_hand] \a [r_hand] in [t_his] right hand.\n"
//gloves
if(gloves && !skipgloves)
if(gloves.blood_DNA)
- msg += "[t_He] [t_has] \icon[gloves] [gloves.gender==PLURAL?"some":"a"] blood-stained [gloves.name] on [t_his] hands!\n"
+ msg += "[t_He] [t_has] \icon[gloves] [gloves.gender==PLURAL?"some":"a"] [(gloves.blood_color != "#030303") ? "blood" : "oil"]-stained [gloves.name] on [t_his] hands!\n"
else
msg += "[t_He] [t_has] \icon[gloves] \a [gloves] on [t_his] hands.\n"
else if(blood_DNA)
@@ -131,14 +131,14 @@
//belt
if(belt)
if(belt.blood_DNA)
- msg += "[t_He] [t_has] \icon[belt] [belt.gender==PLURAL?"some":"a"] blood-stained [belt.name] about [t_his] waist!\n"
+ msg += "[t_He] [t_has] \icon[belt] [belt.gender==PLURAL?"some":"a"] [(belt.blood_color != "#030303") ? "blood" : "oil"]-stained [belt.name] about [t_his] waist!\n"
else
msg += "[t_He] [t_has] \icon[belt] \a [belt] about [t_his] waist.\n"
//shoes
if(shoes && !skipshoes)
if(shoes.blood_DNA)
- msg += "[t_He] [t_is] wearing \icon[shoes] [shoes.gender==PLURAL?"some":"a"] blood-stained [shoes.name] on [t_his] feet!\n"
+ msg += "[t_He] [t_is] wearing \icon[shoes] [shoes.gender==PLURAL?"some":"a"] [(shoes.blood_color != "#030303") ? "blood" : "oil"]-stained [shoes.name] on [t_his] feet!\n"
else
msg += "[t_He] [t_is] wearing \icon[shoes] \a [shoes] on [t_his] feet.\n"
else if(feet_blood_DNA)
@@ -147,14 +147,14 @@
//mask
if(wear_mask && !skipmask)
if(wear_mask.blood_DNA)
- msg += "[t_He] [t_has] \icon[wear_mask] [wear_mask.gender==PLURAL?"some":"a"] blood-stained [wear_mask.name] on [t_his] face!\n"
+ msg += "[t_He] [t_has] \icon[wear_mask] [wear_mask.gender==PLURAL?"some":"a"] [(wear_mask.blood_color != "#030303") ? "blood" : "oil"]-stained [wear_mask.name] on [t_his] face!\n"
else
msg += "[t_He] [t_has] \icon[wear_mask] \a [wear_mask] on [t_his] face.\n"
//eyes
if(glasses && !skipeyes)
if(glasses.blood_DNA)
- msg += "[t_He] [t_has] \icon[glasses] [glasses.gender==PLURAL?"some":"a"] blood-stained [glasses] covering [t_his] eyes!\n"
+ msg += "[t_He] [t_has] \icon[glasses] [glasses.gender==PLURAL?"some":"a"] [(glasses.blood_color != "#030303") ? "blood" : "oil"]-stained [glasses] covering [t_his] eyes!\n"
else
msg += "[t_He] [t_has] \icon[glasses] \a [glasses] covering [t_his] eyes.\n"
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index abc5c9b683..2b6ec75ac0 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -186,25 +186,6 @@
updatehealth()
return
-
-/mob/living/carbon/human/attack_animal(mob/living/M as mob)
- if(M.melee_damage_upper == 0)
- M.emote("[M.friendly] [src]")
- else
- if(M.attack_sound)
- playsound(loc, M.attack_sound, 50, 1, 1)
- for(var/mob/O in viewers(src, null))
- O.show_message("\red [M] [M.attacktext] [src]!", 1)
- M.attack_log += text("\[[time_stamp()]\] attacked [src.name] ([src.ckey])")
- src.attack_log += text("\[[time_stamp()]\] was attacked by [M.name] ([M.ckey])")
- var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
- var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
- var/datum/organ/external/affecting = get_organ(ran_zone(dam_zone))
- var/armor = run_armor_check(affecting, "melee")
- apply_damage(damage, BRUTE, affecting, armor)
- if(armor >= 2) return
-
-
/mob/living/carbon/human/proc/implant_loyalty(mob/living/carbon/human/M, override = FALSE) // Won't override by default.
if(!config.use_loyalty_implants && !override) return // Nuh-uh.
@@ -223,69 +204,6 @@
return 1
return 0
-/mob/living/carbon/human/attack_slime(mob/living/carbon/slime/M as mob)
- if(M.Victim) return // can't attack while eating!
-
- if (health > -100)
-
- for(var/mob/O in viewers(src, null))
- if ((O.client && !( O.blinded )))
- O.show_message(text("\red The [M.name] glomps []!", src), 1)
-
- var/damage = rand(1, 3)
-
- if(M.is_adult)
- damage = rand(10, 35)
- else
- damage = rand(5, 25)
-
-
- var/dam_zone = pick("head", "chest", "l_arm", "r_arm", "l_leg", "r_leg", "groin")
-
- var/datum/organ/external/affecting = get_organ(ran_zone(dam_zone))
- var/armor_block = run_armor_check(affecting, "melee")
- apply_damage(damage, BRUTE, affecting, armor_block)
-
-
- if(M.powerlevel > 0)
- var/stunprob = 10
- var/power = M.powerlevel + rand(0,3)
-
- switch(M.powerlevel)
- if(1 to 2) stunprob = 20
- if(3 to 4) stunprob = 30
- if(5 to 6) stunprob = 40
- if(7 to 8) stunprob = 60
- if(9) stunprob = 70
- if(10) stunprob = 95
-
- if(prob(stunprob))
- M.powerlevel -= 3
- if(M.powerlevel < 0)
- M.powerlevel = 0
-
- for(var/mob/O in viewers(src, null))
- if ((O.client && !( O.blinded )))
- O.show_message(text("\red The [M.name] has shocked []!", src), 1)
-
- Weaken(power)
- if (stuttering < power)
- stuttering = power
- Stun(power)
-
- var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
- s.set_up(5, 1, src)
- s.start()
-
- if (prob(stunprob) && M.powerlevel >= 8)
- adjustFireLoss(M.powerlevel * rand(6,10))
-
-
- updatehealth()
-
- return
-
-
/mob/living/carbon/human/restrained()
if (handcuffed)
return 1
@@ -293,8 +211,6 @@
return 1
return 0
-
-
/mob/living/carbon/human/var/co2overloadtime = null
/mob/living/carbon/human/var/temperature_resistance = T0C+75
@@ -775,9 +691,12 @@
return number
-/mob/living/carbon/human/IsAdvancedToolUser()
- return species.has_fine_manipulation
-
+/mob/living/carbon/human/IsAdvancedToolUser(var/silent)
+ if(species.has_fine_manipulation)
+ return 1
+ if(!silent)
+ src << "You don't have the dexterity to use [src]!"
+ return 0
/mob/living/carbon/human/abiotic(var/full_body = 0)
if(full_body && ((src.l_hand && !( src.l_hand.abstract )) || (src.r_hand && !( src.r_hand.abstract )) || (src.back || src.wear_mask || src.head || src.shoes || src.w_uniform || src.wear_suit || src.glasses || src.l_ear || src.r_ear || src.gloves)))
diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index b8030886c3..f7dd2cefac 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand.dm
@@ -1,93 +1,72 @@
-/mob/living/carbon/human/attack_hand(mob/living/carbon/human/M as mob)
- if (istype(loc, /turf) && istype(loc.loc, /area/start))
- M << "No attacking people at spawn, you jackass."
- return
+/mob/living/carbon/human/attack_hand(mob/living/carbon/M as mob)
- var/datum/organ/external/temp = M:organs_by_name["r_hand"]
- if (M.hand)
- temp = M:organs_by_name["l_hand"]
- if(temp && !temp.is_usable())
- M << "\red You can't use your [temp.display_name]."
- return
+ var/mob/living/carbon/human/H = M
+ if(istype(H))
+ var/datum/organ/external/temp = H.organs_by_name["r_hand"]
+ if(H.hand)
+ temp = H.organs_by_name["l_hand"]
+ if(temp && !temp.is_usable())
+ H << "\red You can't use your [temp.display_name]."
+ return
..()
- if((M != src) && check_shields(0, M.name))
- visible_message("\red [M] attempted to touch [src]!")
- return 0
+ // Should this all be in Touch()?
+ if(istype(H))
+ if((H != src) && check_shields(0, H.name))
+ visible_message("\red [H] attempted to touch [src]!")
+ return 0
-
- if(M.gloves && istype(M.gloves,/obj/item/clothing/gloves))
- var/obj/item/clothing/gloves/G = M.gloves
- if(G.cell)
- if(M.a_intent == "hurt")//Stungloves. Any contact will stun the alien.
- if(G.cell.charge >= 2500)
- G.cell.use(2500)
- visible_message("\red [src] has been touched with the stun gloves by [M]!")
- M.attack_log += text("\[[time_stamp()]\] Stungloved [src.name] ([src.ckey])")
- src.attack_log += text("\[[time_stamp()]\] Has been stungloved by [M.name] ([M.ckey])")
-
- msg_admin_attack("[M.name] ([M.ckey]) stungloved [src.name] ([src.ckey]) (JMP)")
-
- var/armorblock = run_armor_check(M.zone_sel.selecting, "energy")
- apply_effects(5,5,0,0,5,0,0,armorblock)
- return 1
- else
- M << "\red Not enough charge! "
- visible_message("\red [src] has been touched with the stun gloves by [M]!")
- return
-
- if(istype(M.gloves , /obj/item/clothing/gloves/boxing/hologlove))
+ if(istype(H.gloves, /obj/item/clothing/gloves/boxing/hologlove))
var/damage = rand(0, 9)
if(!damage)
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
- visible_message("\red [M] has attempted to punch [src]!")
+ visible_message("\red [H] has attempted to punch [src]!")
return 0
- var/datum/organ/external/affecting = get_organ(ran_zone(M.zone_sel.selecting))
+ var/datum/organ/external/affecting = get_organ(ran_zone(H.zone_sel.selecting))
var/armor_block = run_armor_check(affecting, "melee")
- if(HULK in M.mutations) damage += 5
+ if(HULK in H.mutations)
+ damage += 5
playsound(loc, "punch", 25, 1, -1)
- visible_message("\red [M] has punched [src]!")
+ visible_message("\red [H] has punched [src]!")
apply_damage(damage, HALLOSS, affecting, armor_block)
if(damage >= 9)
- visible_message("\red [M] has weakened [src]!")
+ visible_message("\red [H] has weakened [src]!")
apply_effect(4, WEAKEN, armor_block)
return
- else
- if(istype(M,/mob/living/carbon))
-// log_debug("No gloves, [M] is truing to infect [src]")
- M.spread_disease_to(src, "Contact")
+ if(istype(M,/mob/living/carbon))
+ M.spread_disease_to(src, "Contact")
switch(M.a_intent)
if("help")
- if(health >= config.health_threshold_crit)
+
+ if(istype(H) && health < config.health_threshold_crit)
+
+ if((H.head && (H.head.flags & HEADCOVERSMOUTH)) || (H.wear_mask && (H.wear_mask.flags & MASKCOVERSMOUTH)))
+ H << "\blue Remove your mask!"
+ return 0
+ if((head && (head.flags & HEADCOVERSMOUTH)) || (wear_mask && (wear_mask.flags & MASKCOVERSMOUTH)))
+ H << "\blue Remove [src]'s mask!"
+ return 0
+
+ var/obj/effect/equip_e/human/O = new /obj/effect/equip_e/human()
+ O.source = M
+ O.target = src
+ O.s_loc = M.loc
+ O.t_loc = loc
+ O.place = "CPR"
+ requests += O
+ spawn(0)
+ O.process()
+ else
help_shake_act(M)
- return 1
-// if(M.health < -75) return 0
-
- if((M.head && (M.head.flags & HEADCOVERSMOUTH)) || (M.wear_mask && (M.wear_mask.flags & MASKCOVERSMOUTH)))
- M << "\blue Remove your mask!"
- return 0
- if((head && (head.flags & HEADCOVERSMOUTH)) || (wear_mask && (wear_mask.flags & MASKCOVERSMOUTH)))
- M << "\blue Remove his mask!"
- return 0
-
- var/obj/effect/equip_e/human/O = new /obj/effect/equip_e/human()
- O.source = M
- O.target = src
- O.s_loc = M.loc
- O.t_loc = loc
- O.place = "CPR"
- requests += O
- spawn(0)
- O.process()
return 1
if("grab")
@@ -111,42 +90,43 @@
if("hurt")
+ if(!istype(H))
+ attack_generic(H,rand(1,3),"punched")
+ return
+
// See if they can attack, and which attacks to use.
- var/datum/unarmed_attack/attack = M.species.unarmed
- if(!attack.is_usable(M))
- attack = M.species.secondary_unarmed
- if(!attack.is_usable(M))
+ var/datum/unarmed_attack/attack = H.species.unarmed
+ if(!attack.is_usable(H))
+ attack = H.species.secondary_unarmed
+ if(!attack.is_usable(H))
return 0
- M.attack_log += text("\[[time_stamp()]\] [pick(attack.attack_verb)]ed [src.name] ([src.ckey])")
- src.attack_log += text("\[[time_stamp()]\] Has been [pick(attack.attack_verb)]ed by [M.name] ([M.ckey])")
- msg_admin_attack("[key_name(M)] [pick(attack.attack_verb)]ed [key_name(src)]")
+ H.attack_log += text("\[[time_stamp()]\] [pick(attack.attack_verb)]ed [src.name] ([src.ckey])")
+ src.attack_log += text("\[[time_stamp()]\] Has been [pick(attack.attack_verb)]ed by [H.name] ([M.ckey])")
+ msg_admin_attack("[key_name(H)] [pick(attack.attack_verb)]ed [key_name(src)]")
var/damage = rand(0, 5)//BS12 EDIT
if(!damage)
playsound(loc, attack.miss_sound, 25, 1, -1)
- visible_message("\red [M] tried to [pick(attack.attack_verb)] [src]!")
+ visible_message("\red [H] tried to [pick(attack.attack_verb)] [src]!")
return 0
-
- var/datum/organ/external/affecting = get_organ(ran_zone(M.zone_sel.selecting))
+ var/datum/organ/external/affecting = get_organ(ran_zone(H.zone_sel.selecting))
var/armor_block = run_armor_check(affecting, "melee")
- if(HULK in M.mutations) damage += 5
-
+ if(HULK in H.mutations) damage += 5
playsound(loc, attack.attack_sound, 25, 1, -1)
- visible_message("\red [M] [pick(attack.attack_verb)]ed [src]!")
+ visible_message("\red [H] [pick(attack.attack_verb)]ed [src]!")
//Rearranged, so claws don't increase weaken chance.
if(damage >= 5 && prob(50))
- visible_message("\red [M] has weakened [src]!")
+ visible_message("\red [H] has weakened [src]!")
apply_effect(3, WEAKEN, armor_block)
damage += attack.damage
apply_damage(damage, BRUTE, affecting, armor_block, sharp=attack.sharp, edge=attack.edge)
-
if("disarm")
M.attack_log += text("\[[time_stamp()]\] Disarmed [src.name] ([src.ckey])")
src.attack_log += text("\[[time_stamp()]\] Has been disarmed by [M.name] ([M.ckey])")
@@ -222,4 +202,20 @@
return
/mob/living/carbon/human/proc/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, inrange, params)
- return
\ No newline at end of file
+ return
+
+/mob/living/carbon/human/attack_generic(var/mob/user, var/damage, var/attack_message)
+
+ if(!damage)
+ return
+
+ 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]!")
+
+ var/dam_zone = pick("head", "chest", "l_arm", "r_arm", "l_leg", "r_leg", "groin")
+ var/datum/organ/external/affecting = get_organ(ran_zone(dam_zone))
+ var/armor_block = run_armor_check(affecting, "melee")
+ apply_damage(damage, BRUTE, affecting, armor_block)
+ updatehealth()
+ return 1
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/human_attackpaw.dm b/code/modules/mob/living/carbon/human/human_attackpaw.dm
deleted file mode 100644
index 8d01ca3e8f..0000000000
--- a/code/modules/mob/living/carbon/human/human_attackpaw.dm
+++ /dev/null
@@ -1,23 +0,0 @@
-/mob/living/carbon/human/attack_paw(mob/M as mob)
- ..()
- if (M.a_intent == "help")
- help_shake_act(M)
- else
- if (istype(wear_mask, /obj/item/clothing/mask/muzzle))
- return
-
- for(var/mob/O in viewers(src, null))
- O.show_message(text("\red [M.name] has bit []!", src), 1)
-
- var/damage = rand(1, 3)
- var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
- var/datum/organ/external/affecting = get_organ(ran_zone(dam_zone))
- apply_damage(damage, BRUTE, affecting, run_armor_check(affecting, "melee"))
-
- for(var/datum/disease/D in M.viruses)
- if(istype(D, /datum/disease/jungle_fever))
- var/mob/living/carbon/human/H = src
- src = null
- src = H.monkeyize()
- contract_disease(D,1,0)
- return
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index 30c883becb..c72574495d 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -55,6 +55,9 @@
if (bodytemperature < 283.222)
tally += (283.222 - bodytemperature) / 10 * 1.75
+ if(can_stand <= 1)
+ tally += 5 //hopping around on one foot is slow
+
if(mRun in mutations)
tally = 0
diff --git a/code/modules/mob/living/carbon/metroid/life.dm b/code/modules/mob/living/carbon/metroid/life.dm
index 7820e2a416..0552892025 100644
--- a/code/modules/mob/living/carbon/metroid/life.dm
+++ b/code/modules/mob/living/carbon/metroid/life.dm
@@ -83,7 +83,7 @@
Atkcool = 0
if(Target.Adjacent(src))
- Target.attack_slime(src)
+ UnarmedAttack(Target)
return
if(!Target.lying && prob(80))
@@ -94,7 +94,7 @@
Atkcool = 0
if(Target.Adjacent(src))
- Target.attack_slime(src)
+ UnarmedAttack(Target)
else
if(!Atkcool && Target.Adjacent(src))
diff --git a/code/modules/mob/living/carbon/metroid/metroid.dm b/code/modules/mob/living/carbon/metroid/metroid.dm
index df9d22c5dc..b5f9cf970f 100644
--- a/code/modules/mob/living/carbon/metroid/metroid.dm
+++ b/code/modules/mob/living/carbon/metroid/metroid.dm
@@ -119,7 +119,7 @@
if(istype(AM, /obj/structure/window) || istype(AM, /obj/structure/grille))
if(nutrition <= get_hunger_nutrition() && !Atkcool)
if (is_adult || prob(5))
- AM.attack_slime(src)
+ UnarmedAttack(AM)
spawn()
Atkcool = 1
sleep(45)
@@ -253,84 +253,7 @@
updatehealth()
return
-/mob/living/carbon/slime/attack_slime(mob/living/carbon/slime/M as mob)
- if (!ticker)
- M << "You cannot attack people before the game has started."
- return
-
- if (Victim) return // can't attack while eating!
-
- if (health > -100)
-
- visible_message(" The [M.name] has glomped [src]!", \
- " The [M.name] has glomped [src]!")
- var/damage = rand(1, 3)
- attacked += 5
-
- if(M.is_adult)
- damage = rand(1, 6)
- else
- damage = rand(1, 3)
-
- adjustBruteLoss(damage)
-
- updatehealth()
- return
-
-/mob/living/carbon/slime/attack_animal(mob/living/M as mob)
- if(M.melee_damage_upper == 0)
- M.emote("[M.friendly] [src]")
- else
- if(M.attack_sound)
- playsound(loc, M.attack_sound, 50, 1, 1)
- visible_message("[M] [M.attacktext] [src]!", \
- "[M] [M.attacktext] [src]!")
- M.attack_log += text("\[[time_stamp()]\] attacked [src.name] ([src.ckey])")
- src.attack_log += text("\[[time_stamp()]\] was attacked by [M.name] ([M.ckey])")
- var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
- attacked += 10
- adjustBruteLoss(damage)
- updatehealth()
-
-/mob/living/carbon/slime/attack_paw(mob/living/carbon/monkey/M as mob)
- if(!(istype(M, /mob/living/carbon/monkey)))
- return // Fix for aliens receiving double messages when attacking other aliens.
-
- if (!ticker)
- M << "You cannot attack people before the game has started."
- return
-
- if (istype(loc, /turf) && istype(loc.loc, /area/start))
- M << "No attacking people at spawn, you jackass."
- return
-
- ..()
-
- switch(M.a_intent)
-
- if ("help")
- help_shake_act(M)
- else
- if (istype(wear_mask, /obj/item/clothing/mask/muzzle))
- return
- if (health > 0)
- attacked += 10
- //playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1)
- visible_message("[M.name] has attacked [src]!", \
- "[M.name] has attacked [src]!")
- adjustBruteLoss(rand(1, 3))
- updatehealth()
- return
-
-
/mob/living/carbon/slime/attack_hand(mob/living/carbon/human/M as mob)
- if (!ticker)
- M << "You cannot attack people before the game has started."
- return
-
- if (istype(loc, /turf) && istype(loc.loc, /area/start))
- M << "No attacking people at spawn, you jackass."
- return
..()
@@ -387,18 +310,6 @@
return
- if(M.gloves && istype(M.gloves,/obj/item/clothing/gloves))
- var/obj/item/clothing/gloves/G = M.gloves
- if(G.cell)
- if(M.a_intent == "hurt")//Stungloves. Any contact will stun the alien.
- if(G.cell.charge >= 2500)
- G.cell.use(2500)
- visible_message("[src] has been touched with the stun gloves by [M]!")
- return
- else
- M << "\red Not enough charge! "
- return
-
switch(M.a_intent)
if ("help")
diff --git a/code/modules/mob/living/carbon/metroid/say.dm b/code/modules/mob/living/carbon/metroid/say.dm
index 89708595da..f4de10ceb7 100644
--- a/code/modules/mob/living/carbon/metroid/say.dm
+++ b/code/modules/mob/living/carbon/metroid/say.dm
@@ -21,3 +21,16 @@
return 1
return ..()
+/mob/living/carbon/slime/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "", var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol)
+ if (speaker in Friends)
+ speech_buffer = list()
+ speech_buffer.Add(speaker)
+ speech_buffer.Add(lowertext(html_decode(message)))
+ ..()
+
+/mob/living/carbon/slime/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/mob/speaker = null, var/hard_to_hear = 0, var/vname ="")
+ if (speaker in Friends)
+ speech_buffer = list()
+ speech_buffer.Add(speaker)
+ speech_buffer.Add(lowertext(html_decode(message)))
+ ..()
diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm
index 4371c68f8f..9e337e5f80 100644
--- a/code/modules/mob/living/carbon/monkey/monkey.dm
+++ b/code/modules/mob/living/carbon/monkey/monkey.dm
@@ -143,58 +143,7 @@
health = 100 - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss()
return
-//mob/living/carbon/monkey/bullet_act(var/obj/item/projectile/Proj)taken care of in living
-
-
-/mob/living/carbon/monkey/attack_paw(mob/M as mob)
- ..()
-
- if (M.a_intent == "help")
- help_shake_act(M)
- else
- if ((M.a_intent == "hurt" && !( istype(wear_mask, /obj/item/clothing/mask/muzzle) )))
- if ((prob(75) && health > 0))
- playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1)
- for(var/mob/O in viewers(src, null))
- O.show_message("\red [M.name] has bit [name]!", 1)
- var/damage = rand(1, 5)
- adjustBruteLoss(damage)
- health = 100 - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss()
- for(var/datum/disease/D in M.viruses)
- if(istype(D, /datum/disease/jungle_fever))
- contract_disease(D,1,0)
- else
- for(var/mob/O in viewers(src, null))
- O.show_message("\red [M.name] has attempted to bite [name]!", 1)
- return
-
/mob/living/carbon/monkey/attack_hand(mob/living/carbon/human/M as mob)
- if (!ticker)
- M << "You cannot attack people before the game has started."
- return
-
- if (istype(loc, /turf) && istype(loc.loc, /area/start))
- M << "No attacking people at spawn, you jackass."
- return
-
- if(M.gloves && istype(M.gloves,/obj/item/clothing/gloves))
- var/obj/item/clothing/gloves/G = M.gloves
- if(G.cell)
- if(M.a_intent == "hurt")//Stungloves. Any contact will stun the alien.
- if(G.cell.charge >= 2500)
- G.cell.use(2500)
- Weaken(5)
- if (stuttering < 5)
- stuttering = 5
- Stun(5)
-
- for(var/mob/O in viewers(src, null))
- if (O.client)
- O.show_message("\red [src] has been touched with the stun gloves by [M]!", 1, "\red You hear someone fall", 2)
- return
- else
- M << "\red Not enough charge! "
- return
if (M.a_intent == "help")
help_shake_act(M)
@@ -254,82 +203,6 @@
O.show_message(text("\red [] has disarmed [name]!", M), 1)
return
-/mob/living/carbon/monkey/attack_animal(mob/living/M as mob)
-
- if(M.melee_damage_upper == 0)
- M.emote("[M.friendly] [src]")
- else
- if(M.attack_sound)
- playsound(loc, M.attack_sound, 50, 1, 1)
- for(var/mob/O in viewers(src, null))
- O.show_message("\red [M] [M.attacktext] [src]!", 1)
- M.attack_log += text("\[[time_stamp()]\] attacked [src.name] ([src.ckey])")
- src.attack_log += text("\[[time_stamp()]\] was attacked by [M.name] ([M.ckey])")
- var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
- adjustBruteLoss(damage)
- updatehealth()
-
-
-/mob/living/carbon/monkey/attack_slime(mob/living/carbon/slime/M as mob)
- if (!ticker)
- M << "You cannot attack people before the game has started."
- return
-
- if(M.Victim) return // can't attack while eating!
-
- if (health > -100)
-
- for(var/mob/O in viewers(src, null))
- if ((O.client && !( O.blinded )))
- O.show_message(text("\red The [M.name] glomps []!", src), 1)
-
- var/damage = rand(1, 3)
-
- if(M.is_adult)
- damage = rand(20, 40)
- else
- damage = rand(5, 35)
-
- adjustBruteLoss(damage)
-
- if(M.powerlevel > 0)
- var/stunprob = 10
- var/power = M.powerlevel + rand(0,3)
-
- switch(M.powerlevel)
- if(1 to 2) stunprob = 20
- if(3 to 4) stunprob = 30
- if(5 to 6) stunprob = 40
- if(7 to 8) stunprob = 60
- if(9) stunprob = 70
- if(10) stunprob = 95
-
- if(prob(stunprob))
- M.powerlevel -= 3
- if(M.powerlevel < 0)
- M.powerlevel = 0
-
- for(var/mob/O in viewers(src, null))
- if ((O.client && !( O.blinded )))
- O.show_message(text("\red The [M.name] has shocked []!", src), 1)
-
- Weaken(power)
- if (stuttering < power)
- stuttering = power
- Stun(power)
-
- var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
- s.set_up(5, 1, src)
- s.start()
-
- if (prob(stunprob) && M.powerlevel >= 8)
- adjustFireLoss(M.powerlevel * rand(6,10))
-
-
- updatehealth()
-
- return
-
/mob/living/carbon/monkey/Stat()
..()
statpanel("Status")
@@ -393,8 +266,10 @@
del(src)
return
-
-/mob/living/carbon/monkey/IsAdvancedToolUser()//Unless its monkey mode monkeys cant use advanced tools
+//Unless its monkey mode monkeys cant use advanced tools
+/mob/living/carbon/monkey/IsAdvancedToolUser(var/silent)
+ if(!silent)
+ src << "You don't have the dexterity to use [src]!"
return 0
/mob/living/carbon/monkey/say(var/message, var/datum/language/speaking = null, var/verb="says", var/alt_name="", var/italics=0, var/message_range = world.view, var/list/used_radios = list())
@@ -412,4 +287,4 @@
message = capitalize(trim_left(message))
- ..(message, speaking, verb, alt_name, italics, message_range, used_radios)
+ ..(message, speaking, verb, alt_name, italics, message_range, used_radios)
\ No newline at end of file
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 3e895c73c2..4ac03cdf5f 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -179,3 +179,15 @@
return 0
// End BS12 momentum-transfer code.
+
+/mob/living/attack_generic(var/mob/user, var/damage, var/attack_message)
+
+ if(!damage)
+ return
+
+ adjustBruteLoss(damage)
+ 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]!")
+ spawn(1) updatehealth()
+ return 1
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index 1ac5faa11f..3c1c8a935c 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -37,12 +37,4 @@
var/tod = null // Time of death
var/update_slimes = 1
- var/silent = null //Can't talk. Value goes down every life proc.
-
- // Putting these here for attack_animal().
- var/melee_damage_lower = 0
- var/melee_damage_upper = 0
- var/attacktext = "attacks"
- var/attack_sound = null
- var/friendly = "nuzzles"
- var/wall_smash = 0
\ No newline at end of file
+ var/silent = null //Can't talk. Value goes down every life proc.
\ No newline at end of file
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 2623af1a04..4ff66b3403 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -117,12 +117,6 @@ proc/get_radio_key_from_channel(var/channel)
hearturfs += M.locs[1]
for(var/obj/O in M.contents)
listening_obj |= O
- if (isslime(I))
- var/mob/living/carbon/slime/S = I
- if (src in S.Friends)
- S.speech_buffer = list()
- S.speech_buffer.Add(src)
- S.speech_buffer.Add(lowertext(html_decode(message)))
else if(istype(I, /obj/))
var/obj/O = I
hearturfs += O.locs[1]
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 5f815a3451..ded0990e20 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -542,20 +542,6 @@ var/list/ai_verbs_default = list(
updatehealth()
return 2
-/mob/living/silicon/ai/attack_animal(mob/living/M as mob)
- if(M.melee_damage_upper == 0)
- M.emote("[M.friendly] [src]")
- else
- if(M.attack_sound)
- playsound(loc, M.attack_sound, 50, 1, 1)
- for(var/mob/O in viewers(src, null))
- O.show_message("\red [M] [M.attacktext] [src]!", 1)
- M.attack_log += text("\[[time_stamp()]\] attacked [src.name] ([src.ckey])")
- src.attack_log += text("\[[time_stamp()]\] was attacked by [M.name] ([M.ckey])")
- var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
- adjustBruteLoss(damage)
- updatehealth()
-
/mob/living/silicon/ai/reset_view(atom/A)
if(camera)
camera.SetLuminosity(0)
diff --git a/code/modules/mob/living/silicon/robot/analyzer.dm b/code/modules/mob/living/silicon/robot/analyzer.dm
index 98d7da00ea..eaef5607cb 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
- matter = list("metal" = 200)
- origin_tech = "magnets=1;biotech=1"
+ matter = list("metal" = 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)
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_console.dm b/code/modules/mob/living/silicon/robot/drone/drone_console.dm
index 82ee8c50a2..749d9fea05 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone_console.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_console.dm
@@ -14,11 +14,6 @@
/obj/machinery/computer/drone_control/attack_ai(var/mob/user as mob)
return src.attack_hand(user)
-/obj/machinery/computer/drone_control/attack_paw(var/mob/user as mob)
-
- return src.attack_hand(user)
- return
-
/obj/machinery/computer/drone_control/attack_hand(var/mob/user as mob)
if(..())
return
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index caf76cbf0b..c7abbb3d5a 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -871,81 +871,6 @@ var/list/robot_verbs_default = list(
spark_system.start()
return ..()
-
-
-/mob/living/silicon/robot/attack_slime(mob/living/carbon/slime/M as mob)
- if (!ticker)
- M << "You cannot attack people before the game has started."
- return
-
- if(M.Victim) return // can't attack while eating!
-
- if (health > -100)
-
- for(var/mob/O in viewers(src, null))
- if ((O.client && !( O.blinded )))
- O.show_message(text("\red The [M.name] glomps []!", src), 1)
-
- var/damage = rand(1, 3)
-
- if(M.is_adult)
- damage = rand(20, 40)
- else
- damage = rand(5, 35)
-
- damage = round(damage / 2) // borgs recieve half damage
- adjustBruteLoss(damage)
-
-
- if(M.powerlevel > 0)
- var/stunprob = 10
-
- switch(M.powerlevel)
- if(1 to 2) stunprob = 20
- if(3 to 4) stunprob = 30
- if(5 to 6) stunprob = 40
- if(7 to 8) stunprob = 60
- if(9) stunprob = 70
- if(10) stunprob = 95
-
- if(prob(stunprob))
- M.powerlevel -= 3
- if(M.powerlevel < 0)
- M.powerlevel = 0
-
- for(var/mob/O in viewers(src, null))
- if ((O.client && !( O.blinded )))
- O.show_message(text("\red The [M.name] has electrified []!", src), 1)
-
- flick("noise", flash)
-
- var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
- s.set_up(5, 1, src)
- s.start()
-
- if (prob(stunprob) && M.powerlevel >= 8)
- adjustBruteLoss(M.powerlevel * rand(6,10))
-
-
- updatehealth()
-
- return
-
-/mob/living/silicon/robot/attack_animal(mob/living/M as mob)
- if(M.melee_damage_upper == 0)
- M.emote("[M.friendly] [src]")
- else
- if(M.attack_sound)
- playsound(loc, M.attack_sound, 50, 1, 1)
- for(var/mob/O in viewers(src, null))
- O.show_message("\red [M] [M.attacktext] [src]!", 1)
- M.attack_log += text("\[[time_stamp()]\] attacked [src.name] ([src.ckey])")
- src.attack_log += text("\[[time_stamp()]\] was attacked by [M.name] ([M.ckey])")
- var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
- adjustBruteLoss(damage)
- updatehealth()
-
-
/mob/living/silicon/robot/attack_hand(mob/user)
add_fingerprint(user)
@@ -967,6 +892,10 @@ var/list/robot_verbs_default = list(
user << "You remove \the [broken_device]."
user.put_in_active_hand(broken_device)
+//Robots take half damage from basic attacks.
+/mob/living/silicon/robot/attack_generic(var/mob/user, var/damage, var/attack_message)
+ return ..(user,Floor(damage/2),attack_message)
+
/mob/living/silicon/robot/proc/allowed(mob/M)
//check if it doesn't require any access at all
if(check_access(null))
diff --git a/code/modules/mob/living/simple_animal/borer/borer.dm b/code/modules/mob/living/simple_animal/borer/borer.dm
index 36d57d1225..593c41b742 100644
--- a/code/modules/mob/living/simple_animal/borer/borer.dm
+++ b/code/modules/mob/living/simple_animal/borer/borer.dm
@@ -16,7 +16,7 @@
a_intent = "harm"
stop_automated_movement = 1
status_flags = CANPUSH
- attacktext = "nips"
+ attacktext = "nipped"
friendly = "prods"
wander = 0
pass_flags = PASSTABLE
diff --git a/code/modules/mob/living/simple_animal/borer/borer_powers.dm b/code/modules/mob/living/simple_animal/borer/borer_powers.dm
index c07a105cbb..39b2cadf1d 100644
--- a/code/modules/mob/living/simple_animal/borer/borer_powers.dm
+++ b/code/modules/mob/living/simple_animal/borer/borer_powers.dm
@@ -214,9 +214,9 @@
if(chemicals < 50)
src << "You don't have enough chemicals!"
- var/chem = input("Select a chemical to secrete.", "Chemicals") in list("bicaridine","tramadol","hyperzine","alkysine")
+ var/chem = input("Select a chemical to secrete.", "Chemicals") as null|anything in list("alkysine","bicaridine","hyperzine","tramadol")
- if(chemicals < 50 || !host || controlling || !src || stat) //Sanity check.
+ if(!chem || chemicals < 50 || !host || controlling || !src || stat) //Sanity check.
return
src << "\red You squirt a measure of [chem] from your reservoirs into [host]'s bloodstream."
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index 21a731b041..ffcc48bd40 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -86,25 +86,6 @@
step(AM, t)
now_pushing = null
-
-/mob/living/simple_animal/construct/attack_animal(mob/living/M as mob)
- if(istype(M, /mob/living/simple_animal/construct/builder))
- health += 5
- M.emote("mends some of \the [src]'s wounds.")
- else
- if(M.melee_damage_upper <= 0)
- M.emote("[M.friendly] \the [src]")
- else
- if(M.attack_sound)
- playsound(loc, M.attack_sound, 50, 1, 1)
- for(var/mob/O in viewers(src, null))
- O.show_message("\The [M] [M.attacktext] \the [src]!", 1)
- M.attack_log += text("\[[time_stamp()]\] attacked [src.name] ([src.ckey])")
- src.attack_log += text("\[[time_stamp()]\] was attacked by [M.name] ([M.ckey])")
-
- var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
- adjustBruteLoss(damage)
-
/mob/living/simple_animal/construct/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(O.force)
var/damage = O.force
@@ -139,7 +120,7 @@
harm_intent_damage = 0
melee_damage_lower = 30
melee_damage_upper = 30
- attacktext = "smashes their armoured gauntlet into"
+ attacktext = "smashed their armoured gauntlet into"
speed = 3
wall_smash = 1
attack_sound = 'sound/weapons/punch3.ogg'
@@ -214,7 +195,7 @@
health = 75
melee_damage_lower = 25
melee_damage_upper = 25
- attacktext = "slashes"
+ attacktext = "slashed"
speed = -1
see_in_dark = 7
attack_sound = 'sound/weapons/bladeslice.ogg'
@@ -239,7 +220,7 @@
harm_intent_damage = 5
melee_damage_lower = 5
melee_damage_upper = 5
- attacktext = "rams"
+ attacktext = "rammed"
speed = 0
wall_smash = 1
attack_sound = 'sound/weapons/punch2.ogg'
@@ -266,7 +247,7 @@
harm_intent_damage = 0
melee_damage_lower = 50
melee_damage_upper = 50
- attacktext = "brutally crushes"
+ attacktext = "brutally crushed"
speed = 5
wall_smash = 1
attack_sound = 'sound/weapons/punch4.ogg'
diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm
index 8c98daaa87..a7b7cbc622 100644
--- a/code/modules/mob/living/simple_animal/friendly/corgi.dm
+++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm
@@ -308,10 +308,9 @@
dir = SOUTH
if(isturf(movement_target.loc) )
- movement_target.attack_animal(src)
- else if(ishuman(movement_target.loc) )
- if(prob(20))
- emote("stares at the [movement_target] that [movement_target.loc] has with a sad puppy-face")
+ UnarmedAttack(movement_target)
+ else if(ishuman(movement_target.loc) && prob(20))
+ custom_emote(1,"stares at the [movement_target] that [movement_target.loc] has with sad puppy eyes.")
if(prob(1))
emote(pick("dances around","chases its tail"))
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 3fa82adfcf..ef9731bb0b 100644
--- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
@@ -18,7 +18,7 @@
response_disarm = "gently pushes aside the"
response_harm = "kicks the"
faction = "goat"
- attacktext = "kicks"
+ attacktext = "kicked"
health = 40
melee_damage_lower = 1
melee_damage_upper = 5
@@ -102,7 +102,7 @@
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "kicks the"
- attacktext = "kicks"
+ attacktext = "kicked"
health = 50
var/datum/reagents/udder = null
@@ -163,7 +163,7 @@
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "kicks the"
- attacktext = "kicks"
+ attacktext = "kicked"
health = 1
var/amount_grown = 0
pass_flags = PASSTABLE | PASSGRILLE
@@ -204,7 +204,7 @@ var/global/chicken_count = 0
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "kicks the"
- attacktext = "kicks"
+ attacktext = "kicked"
health = 10
var/eggsleft = 0
var/body_color
diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm
index 171e96fc62..d4677ef5d3 100644
--- a/code/modules/mob/living/simple_animal/friendly/lizard.dm
+++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm
@@ -9,8 +9,7 @@
speak_emote = list("hisses")
health = 5
maxHealth = 5
- attacktext = "bites"
- attacktext = "bites"
+ attacktext = "bitten"
melee_damage_lower = 1
melee_damage_upper = 2
response_help = "pets"
diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
index 3027819403..bf64e9265b 100644
--- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
+++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
@@ -26,8 +26,7 @@
health = 10
maxHealth = 10
- attacktext = "shocks"
- attacktext = "shocks"
+ attacktext = "shocked"
melee_damage_lower = 1
melee_damage_upper = 3
diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm
index b46cdb58a7..ab6874276a 100644
--- a/code/modules/mob/living/simple_animal/hostile/alien.dm
+++ b/code/modules/mob/living/simple_animal/hostile/alien.dm
@@ -16,7 +16,7 @@
harm_intent_damage = 5
melee_damage_lower = 25
melee_damage_upper = 25
- attacktext = "slashes"
+ attacktext = "slashed"
a_intent = "harm"
attack_sound = 'sound/weapons/bladeslice.ogg'
min_oxy = 0
diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm
index 0036d3c153..15786b6751 100644
--- a/code/modules/mob/living/simple_animal/hostile/bear.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bear.dm
@@ -141,10 +141,10 @@
var/mob/living/L = target_mob
L.adjustBruteLoss(damage)
return L
- else if(istype(target_mob,/obj/mecha))
- var/obj/mecha/M = target_mob
- M.attack_animal(src)
- return M
+ //else if(istype(target_mob,/obj/mecha))
+ //var/obj/mecha/M = target_mob
+ //M.attack_animal(src)
+ //return M
diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm
index 7fb6ee9854..8708b1009e 100644
--- a/code/modules/mob/living/simple_animal/hostile/carp.dm
+++ b/code/modules/mob/living/simple_animal/hostile/carp.dm
@@ -20,7 +20,7 @@
harm_intent_damage = 8
melee_damage_lower = 15
melee_damage_upper = 15
- attacktext = "bites"
+ attacktext = "bitten"
attack_sound = 'sound/weapons/bite.ogg'
//Space carp aren't affected by atmos.
diff --git a/code/modules/mob/living/simple_animal/hostile/creature.dm b/code/modules/mob/living/simple_animal/hostile/creature.dm
index 45464bf895..07ad06619a 100644
--- a/code/modules/mob/living/simple_animal/hostile/creature.dm
+++ b/code/modules/mob/living/simple_animal/hostile/creature.dm
@@ -10,7 +10,7 @@
maxHealth = 80
melee_damage_lower = 25
melee_damage_upper = 50
- attacktext = "chomps"
+ attacktext = "chomped"
attack_sound = 'sound/weapons/bite.ogg'
faction = "creature"
speed = 4
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm
index 5613c21ac3..d69ac01012 100644
--- a/code/modules/mob/living/simple_animal/hostile/faithless.dm
+++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm
@@ -16,7 +16,7 @@
harm_intent_damage = 10
melee_damage_lower = 15
melee_damage_upper = 15
- attacktext = "grips"
+ attacktext = "gripped"
attack_sound = 'sound/hallucinations/growl1.ogg'
min_oxy = 0
diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm
index b0b02f656f..26d69933e8 100644
--- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm
@@ -13,7 +13,7 @@
maxHealth = 15
melee_damage_lower = 2
melee_damage_upper = 3
- attacktext = "claws"
+ attacktext = "clawed"
projectilesound = 'sound/weapons/Gunshot.ogg'
projectiletype = /obj/item/projectile/hivebotbullet
faction = "hivebot"
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index 3aaaf8ec97..4e281e4be6 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -89,17 +89,17 @@
/mob/living/simple_animal/hostile/proc/AttackingTarget()
if(!Adjacent(target_mob))
return
- if(isliving(target_mob))
- var/mob/living/L = target_mob
- L.attack_animal(src)
- return L
- if(istype(target_mob,/obj/mecha))
- var/obj/mecha/M = target_mob
- M.attack_animal(src)
- return M
- if(istype(target_mob,/obj/machinery/bot))
- var/obj/machinery/bot/B = target_mob
- B.attack_animal(src)
+ //if(isliving(target_mob))
+ //var/mob/living/L = target_mob
+ //L.attack_animal(src)
+ //return L
+ //if(istype(target_mob,/obj/mecha))
+ //var/obj/mecha/M = target_mob
+ //M.attack_animal(src)
+ //return M
+ //if(istype(target_mob,/obj/machinery/bot))
+ //var/obj/machinery/bot/B = target_mob
+ //B.attack_animal(src)
/mob/living/simple_animal/hostile/proc/LoseTarget()
stance = HOSTILE_STANCE_IDLE
@@ -193,10 +193,10 @@
/mob/living/simple_animal/hostile/proc/DestroySurroundings()
if(prob(break_stuff_probability))
for(var/dir in cardinal) // North, South, East, West
- for(var/obj/structure/window/obstacle in get_step(src, dir))
- if(obstacle.dir == reverse_dir[dir]) // So that windows get smashed in the right order
- obstacle.attack_animal(src)
- return
- var/obj/structure/obstacle = locate(/obj/structure, get_step(src, dir))
- if(istype(obstacle, /obj/structure/window) || istype(obstacle, /obj/structure/closet) || istype(obstacle, /obj/structure/table) || istype(obstacle, /obj/structure/grille))
- obstacle.attack_animal(src)
+ //for(var/obj/structure/window/obstacle in get_step(src, dir))
+ //if(obstacle.dir == reverse_dir[dir]) // So that windows get smashed in the right order
+ //obstacle.attack_animal(src)
+ //return
+ //var/obj/structure/obstacle = locate(/obj/structure, get_step(src, dir))
+ //if(istype(obstacle, /obj/structure/window) || istype(obstacle, /obj/structure/closet) || istype(obstacle, /obj/structure/table) || istype(obstacle, /obj/structure/grille))
+ //obstacle.attack_animal(src)
diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm
index d239e88c6d..6e43df9378 100644
--- a/code/modules/mob/living/simple_animal/hostile/mimic.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm
@@ -20,7 +20,7 @@
harm_intent_damage = 5
melee_damage_lower = 8
melee_damage_upper = 12
- attacktext = "attacks"
+ attacktext = "attacked"
attack_sound = 'sound/weapons/bite.ogg'
min_oxy = 0
@@ -56,7 +56,7 @@
// Aggro when you try to open them. Will also pickup loot when spawns and drop it when dies.
/mob/living/simple_animal/hostile/mimic/crate
- attacktext = "bites"
+ attacktext = "bitten"
stop_automated_movement = 1
wander = 0
diff --git a/code/modules/mob/living/simple_animal/hostile/pirate.dm b/code/modules/mob/living/simple_animal/hostile/pirate.dm
index 0e0e50c07e..2ccf788893 100644
--- a/code/modules/mob/living/simple_animal/hostile/pirate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/pirate.dm
@@ -17,7 +17,7 @@
harm_intent_damage = 5
melee_damage_lower = 30
melee_damage_upper = 30
- attacktext = "slashes"
+ attacktext = "slashed"
attack_sound = 'sound/weapons/bladeslice.ogg'
min_oxy = 5
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
index 68d0e3c5cd..2bb2610f66 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
@@ -21,7 +21,7 @@
harm_intent_damage = 8
melee_damage_lower = 10
melee_damage_upper = 10
- attacktext = "attacks"
+ attacktext = "attacked"
attack_sound = 'sound/items/bikehorn.ogg'
min_oxy = 5
diff --git a/code/modules/mob/living/simple_animal/hostile/russian.dm b/code/modules/mob/living/simple_animal/hostile/russian.dm
index d89db259b3..8c2a470dcd 100644
--- a/code/modules/mob/living/simple_animal/hostile/russian.dm
+++ b/code/modules/mob/living/simple_animal/hostile/russian.dm
@@ -17,7 +17,7 @@
harm_intent_damage = 5
melee_damage_lower = 15
melee_damage_upper = 15
- attacktext = "punches"
+ attacktext = "punched"
a_intent = "harm"
var/corpse = /obj/effect/landmark/mobcorpse/russian
var/weapon1 = /obj/item/weapon/kitchenknife
diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
index ff9aba71a4..11a81284f2 100644
--- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
@@ -17,7 +17,7 @@
harm_intent_damage = 5
melee_damage_lower = 10
melee_damage_upper = 10
- attacktext = "punches"
+ attacktext = "punched"
a_intent = "harm"
var/corpse = /obj/effect/landmark/mobcorpse/syndicatesoldier
var/weapon1
@@ -55,7 +55,7 @@
icon_living = "syndicatemelee"
weapon1 = /obj/item/weapon/melee/energy/sword/red
weapon2 = /obj/item/weapon/shield/energy
- attacktext = "slashes"
+ attacktext = "slashed"
status_flags = 0
/mob/living/simple_animal/hostile/syndicate/melee/attackby(var/obj/item/O as obj, var/mob/user as mob)
@@ -144,7 +144,7 @@
maxHealth = 15
melee_damage_lower = 15
melee_damage_upper = 15
- attacktext = "cuts"
+ attacktext = "cut"
attack_sound = 'sound/weapons/bladeslice.ogg'
faction = "syndicate"
min_oxy = 0
diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm
index 7f44f8a9b1..b263cd2112 100644
--- a/code/modules/mob/living/simple_animal/hostile/tree.dm
+++ b/code/modules/mob/living/simple_animal/hostile/tree.dm
@@ -21,7 +21,7 @@
harm_intent_damage = 5
melee_damage_lower = 8
melee_damage_upper = 12
- attacktext = "bites"
+ attacktext = "bitten"
attack_sound = 'sound/weapons/bite.ogg'
//Space carp aren't affected by atmos.
diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm
index 000b125673..21833161ad 100644
--- a/code/modules/mob/living/simple_animal/parrot.dm
+++ b/code/modules/mob/living/simple_animal/parrot.dm
@@ -232,22 +232,6 @@
drop_held_item(0)
return
-/mob/living/simple_animal/parrot/attack_paw(mob/living/carbon/monkey/M as mob)
- attack_hand(M)
-
-//Simple animals
-/mob/living/simple_animal/parrot/attack_animal(mob/living/M as mob)
- if(client) return
-
-
- if(parrot_state == PARROT_PERCH)
- parrot_sleep_dur = parrot_sleep_max //Reset it's sleep timer if it was perched
-
- if(M.melee_damage_upper > 0)
- parrot_interest = M
- parrot_state = PARROT_SWOOP | PARROT_ATTACK //Attack other animals regardless
- icon_state = "parrot_fly"
-
//Mobs with objects
/mob/living/simple_animal/parrot/attackby(var/obj/item/O as obj, var/mob/user as mob)
..()
@@ -753,3 +737,21 @@
if(!message || stat)
return
speech_buffer.Add(message)
+
+/mob/living/simple_animal/parrot/attack_generic(var/mob/user, var/damage, var/attack_message)
+
+ var/success = ..()
+
+ if(client)
+ return success
+
+ if(parrot_state == PARROT_PERCH)
+ parrot_sleep_dur = parrot_sleep_max //Reset it's sleep timer if it was perched
+
+ if(!success)
+ return 0
+
+ parrot_interest = user
+ parrot_state = PARROT_SWOOP | PARROT_ATTACK //Attack other animals regardless
+ icon_state = "parrot_fly"
+ return success
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm
index ae0fc99e5d..ed5f35d55b 100644
--- a/code/modules/mob/living/simple_animal/shade.dm
+++ b/code/modules/mob/living/simple_animal/shade.dm
@@ -16,7 +16,7 @@
response_harm = "punches the"
melee_damage_lower = 5
melee_damage_upper = 15
- attacktext = "drains the life from"
+ attacktext = "drained the life from"
minbodytemp = 0
maxbodytemp = 4000
min_oxy = 0
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index e06d1af938..078159c12d 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -47,11 +47,12 @@
var/speed = 0 //LETS SEE IF I CAN SET SPEEDS FOR SIMPLE MOBS WITHOUT DESTROYING EVERYTHING. Higher speed is slower, negative speed is faster
//LETTING SIMPLE ANIMALS ATTACK? WHAT COULD GO WRONG. Defaults to zero so Ian can still be cuddly
- melee_damage_lower = 0
- melee_damage_upper = 0
- attacktext = "attacks"
- attack_sound = null
- friendly = "nuzzles" //If the mob does no damage with it's attack
+ var/melee_damage_lower = 0
+ var/melee_damage_upper = 0
+ var/attacktext = "attacked"
+ var/attack_sound = null
+ var/friendly = "nuzzles"
+ var/wall_smash = 0
/mob/living/simple_animal/New()
..()
@@ -209,19 +210,6 @@
if(act == "scream") act = "whimper" //ugly hack to stop animals screaming when crushed :P
..(act, type, desc)
-/mob/living/simple_animal/attack_animal(mob/living/M as mob)
- if(M.melee_damage_upper == 0)
- M.emote("[M.friendly] [src]")
- else
- if(M.attack_sound)
- playsound(loc, M.attack_sound, 50, 1, 1)
- for(var/mob/O in viewers(src, null))
- O.show_message("\red [M] [M.attacktext] [src]!", 1)
- M.attack_log += text("\[[time_stamp()]\] attacked [src.name] ([src.ckey])")
- src.attack_log += text("\[[time_stamp()]\] was attacked by [M.name] ([M.ckey])")
- var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
- adjustBruteLoss(damage)
-
/mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj)
if(!Proj || Proj.nodamage)
return
@@ -266,29 +254,6 @@
return
-
-/mob/living/simple_animal/attack_slime(mob/living/carbon/slime/M as mob)
- if (!ticker)
- M << "You cannot attack people before the game has started."
- return
-
- if(M.Victim) return // can't attack while eating!
-
- visible_message("\red The [M.name] glomps [src]!")
-
- var/damage = rand(1, 3)
-
- if(M.is_adult)
- damage = rand(20, 40)
- else
- damage = rand(5, 35)
-
- adjustBruteLoss(damage)
-
-
- return
-
-
/mob/living/simple_animal/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri
if(istype(O, /obj/item/stack/medical))
diff --git a/code/modules/mob/living/simple_animal/worm.dm b/code/modules/mob/living/simple_animal/worm.dm
index 387ac33bf2..6dad3655e3 100644
--- a/code/modules/mob/living/simple_animal/worm.dm
+++ b/code/modules/mob/living/simple_animal/worm.dm
@@ -57,7 +57,7 @@
melee_damage_lower = 10
melee_damage_upper = 15
- attacktext = "bites"
+ attacktext = "bitten"
animate_movement = SLIDE_STEPS
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 8362e34c89..1233923ca5 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -847,17 +847,18 @@ note dizziness decrements automatically in the mob's Life() proc.
lying = 0
canmove = 1
pixel_y = V.mob_offset_y
- else if(buckled && (!buckled.movable))
- anchored = 1
- canmove = 0
- if(istype(buckled,/obj/structure/stool/bed/chair) )
- lying = 0
+ else if(buckled)
+ if (!buckled.movable)
+ anchored = 1
+ canmove = 0
+ if(istype(buckled,/obj/structure/stool/bed/chair) )
+ lying = 0
+ else
+ lying = 1
else
- lying = 1
- else if (buckled && (buckled.movable))
- anchored = 0
- canmove = 1
- lying = 0
+ anchored = 0
+ canmove = 1
+ lying = 0
else if( stat || weakened || paralysis || resting || sleeping || (status_flags & FAKEDEATH))
lying = 1
canmove = 0
@@ -867,9 +868,9 @@ note dizziness decrements automatically in the mob's Life() proc.
anchored = 1
canmove = 0
lying = 0
- else if (!buckled)
- lying = !can_stand
- canmove = has_limbs
+ else
+ lying = 0
+ canmove = 1
if(lying)
density = 0
@@ -920,10 +921,10 @@ note dizziness decrements automatically in the mob's Life() proc.
return facedir(SOUTH)
-/mob/proc/IsAdvancedToolUser()//This might need a rename but it should replace the can this mob use things check
+//This might need a rename but it should replace the can this mob use things check
+/mob/proc/IsAdvancedToolUser()
return 0
-
/mob/proc/Stun(amount)
if(status_flags & CANSTUN)
stunned = max(max(stunned,amount),0) //can't go below 0, getting a low amount of stun doesn't lower your current stun
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index 08e01d2b88..d037b6fd31 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -213,11 +213,10 @@
var/universal_speak = 0 // Set to 1 to enable the mob to speak to everyone -- TLE
var/universal_understand = 0 // Set to 1 to enable the mob to understand everyone, not necessarily speak
- var/has_limbs = 1 //Whether this mob have any limbs he can move with
- var/can_stand = 1 //Whether this mob have ability to stand
+ var/can_stand = 2 //Whether this mob have ability to stand
var/immune_to_ssd = 0
var/turf/listed_turf = null //the current turf being examined in the stat panel
- var/list/active_genes=list()
\ No newline at end of file
+ var/list/active_genes=list()
diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm
index a69ee36c7d..72af3d913a 100644
--- a/code/modules/organs/organ.dm
+++ b/code/modules/organs/organ.dm
@@ -60,7 +60,6 @@
/mob/living/carbon/human/proc/handle_organs()
number_wounds = 0
- var/leg_tally = 2
var/force_process = 0
var/damage_this_tick = getBruteLoss() + getFireLoss() + getToxLoss()
if(damage_this_tick > last_dam)
@@ -75,6 +74,9 @@
for(var/datum/organ/internal/I in internal_organs)
I.process()
+ //losing a limb stops it from processing, so this has to be done separately
+ handle_stance()
+
if(!force_process && !bad_external_organs.len)
return
@@ -101,23 +103,17 @@
if (W.infection_check())
W.germ_level += 1
- if(E.name in list("l_leg","l_foot","r_leg","r_foot") && !lying)
- if (!E.is_usable() || E.is_malfunctioning() || (E.is_broken() && !(E.status & ORGAN_SPLINTED)))
- leg_tally-- // let it fail even if just foot&leg
+/mob/living/carbon/human/proc/handle_stance()
+ can_stand = 2
+ for (var/organ in list("l_leg","l_foot","r_leg","r_foot"))
+ var/datum/organ/external/E = organs_by_name[organ]
+ if ((E.status & ORGAN_DESTROYED) || E.is_malfunctioning() || (E.is_broken() && !(E.status & ORGAN_SPLINTED)) || !E.is_usable())
+ can_stand-- // let it fail even if just foot&leg
// standing is poor
- if(leg_tally <= 0 && !paralysis && !(lying || resting) && prob(5))
- if(species && species.flags & NO_PAIN)
- emote("scream")
- emote("collapse")
- paralysis = 10
-
- //Check arms and legs for existence
- can_stand = 2 //can stand on both legs
- var/datum/organ/external/E = organs_by_name["l_foot"]
- if(E.status & ORGAN_DESTROYED)
- can_stand--
-
- E = organs_by_name["r_foot"]
- if(E.status & ORGAN_DESTROYED)
- can_stand--
+ if(can_stand <= 0)
+ Weaken(10)
+ if (!(lying || resting))
+ if(species && !(species.flags & NO_PAIN))
+ emote("scream")
+ emote("collapse")
\ No newline at end of file
diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm
index 8f0f71a0ab..43ed04b0d0 100644
--- a/code/modules/paperwork/paperbin.dm
+++ b/code/modules/paperwork/paperbin.dm
@@ -21,11 +21,6 @@
return
-
-/obj/item/weapon/paper_bin/attack_paw(mob/user as mob)
- return attack_hand(user)
-
-
/obj/item/weapon/paper_bin/attack_hand(mob/user as mob)
if (hasorgans(user))
var/datum/organ/external/temp = user:organs_by_name["r_hand"]
diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm
index fc4668ec25..ce867e818a 100644
--- a/code/modules/paperwork/photocopier.dm
+++ b/code/modules/paperwork/photocopier.dm
@@ -18,9 +18,6 @@
attack_ai(mob/user as mob)
return attack_hand(user)
- attack_paw(mob/user as mob)
- return attack_hand(user)
-
attack_hand(mob/user as mob)
user.set_machine(src)
diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm
index 1717560c56..51ec0002dd 100644
--- a/code/modules/paperwork/stamps.dm
+++ b/code/modules/paperwork/stamps.dm
@@ -64,12 +64,7 @@
icon_state = "stamp-cent"
item_color = "centcomm"
-
-/obj/item/weapon/stamp/attack_paw(mob/user as mob)
- return attack_hand(user)
-
// Syndicate stamp to forge documents.
-
/obj/item/weapon/stamp/chameleon/attack_self(mob/user as mob)
var/list/stamp_types = typesof(/obj/item/weapon/stamp) - src.type // Get all stamp types except our own
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 12b16a54ef..e906bf99b0 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -819,7 +819,6 @@
if(inoperable())
return 0
if(!user.IsAdvancedToolUser())
- user << "You don't have the dexterity to use [src]!"
return 0
if(user.restrained())
user << "You must have free hands to use [src]."
diff --git a/code/modules/power/engine.dm b/code/modules/power/engine.dm
index 59227bf7cb..c0f761254e 100644
--- a/code/modules/power/engine.dm
+++ b/code/modules/power/engine.dm
@@ -1,6 +1,3 @@
-/turf/simulated/floor/engine/attack_paw(var/mob/user as mob)
- return src.attack_hand(user)
-
/turf/simulated/floor/engine/attack_hand(var/mob/user as mob)
if ((!( user.canmove ) || user.restrained() || !( user.pulling )))
return
diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm
index 73a0fce4ec..53599073b2 100644
--- a/code/modules/power/gravitygenerator.dm
+++ b/code/modules/power/gravitygenerator.dm
@@ -63,10 +63,6 @@
break
return foundgenerator
-
-/obj/machinery/computer/gravity_control_computer/attack_paw(mob/user as mob)
- return attack_hand(user)
-
/obj/machinery/computer/gravity_control_computer/attack_ai(mob/user as mob)
return attack_hand(user)
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index 0cc94399b3..f6cfe8f3ca 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -87,7 +87,7 @@
/obj/machinery/light_construct/examine(mob/user)
if(!..(user, 2))
return
-
+
switch(src.stage)
if(1)
user << "It's an empty frame."
@@ -307,6 +307,17 @@
if(on != on_gs)
on_gs = on
+/obj/machinery/light/attack_generic(var/mob/user, var/damage)
+ if(!damage)
+ return
+ if(status == LIGHT_EMPTY||status == LIGHT_BROKEN)
+ user << "That object is useless to you."
+ return
+ if(!(status == LIGHT_OK||status == LIGHT_BURNED))
+ return
+ visible_message("[user] smashes the light!")
+ broken()
+ return 1
// attempt to set the light's on/off status
// will not switch on if broken/burned/empty
@@ -452,19 +463,8 @@
src.flicker(1)
return
-/obj/machinery/light/attack_animal(mob/living/M)
- if(M.melee_damage_upper == 0) return
- if(status == LIGHT_EMPTY||status == LIGHT_BROKEN)
- M << "\red That object is useless to you."
- return
- else if (status == LIGHT_OK||status == LIGHT_BURNED)
- for(var/mob/O in viewers(src))
- O.show_message("\red [M.name] smashed the light!", 3, "You hear a tinkle of breaking glass", 2)
- broken()
- return
// attack with hand - remove tube/bulb
// if hands aren't protected and the light is on, burn the player
-
/obj/machinery/light/attack_hand(mob/user)
add_fingerprint(user)
diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm
index edcb764de4..0799900909 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -266,9 +266,6 @@ display round(lastgen) and phorontank amount
/obj/machinery/power/port_gen/pacman/attack_ai(mob/user as mob)
interact(user)
-/obj/machinery/power/port_gen/pacman/attack_paw(mob/user as mob)
- interact(user)
-
/obj/machinery/power/port_gen/pacman/interact(mob/user)
if (get_dist(src, user) > 1 )
if (!istype(user, /mob/living/silicon/ai))
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 3d4ea67c3b..c7a62e7f5c 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -74,7 +74,6 @@
return
if (!user.IsAdvancedToolUser())
- user << "\red You don't have the dexterity to do this!"
return
if(istype(user, /mob/living))
var/mob/living/M = user
diff --git a/code/modules/projectiles/guns/projectile/launcher.dm b/code/modules/projectiles/guns/projectile/launcher.dm
index c367780a5e..5f9d9fdfde 100644
--- a/code/modules/projectiles/guns/projectile/launcher.dm
+++ b/code/modules/projectiles/guns/projectile/launcher.dm
@@ -39,7 +39,6 @@
/obj/item/weapon/gun/launcher/Fire(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, params, reflex = 0)
if (!user.IsAdvancedToolUser())
- user << "\red You don't have the dexterity to do this!"
return 0
add_fingerprint(user)
diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm
index 4c6b26f19e..0e02c10ad4 100644
--- a/code/modules/reagents/Chemistry-Machinery.dm
+++ b/code/modules/reagents/Chemistry-Machinery.dm
@@ -172,9 +172,6 @@
/obj/machinery/chem_dispenser/attack_ai(mob/user as mob)
return src.attack_hand(user)
-/obj/machinery/chem_dispenser/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
/obj/machinery/chem_dispenser/attack_hand(mob/user as mob)
if(stat & BROKEN)
return
@@ -230,6 +227,24 @@
dispensable_reagents -= list("goldschlager","patron","watermelonjuice","berryjuice")
hackedcheck = 0
return
+
+/obj/machinery/chem_dispenser/meds
+ name = "chem dispenser magic"
+ density = 1
+ anchored = 1
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "dispenser"
+ use_power = 0
+ idle_power_usage = 40
+ ui_title = "Chem Dispenser 9000"
+ energy = 100
+ max_energy = 100
+ amount = 30
+ accept_glass = 0 //At 0 ONLY accepts glass containers. Kinda misleading varname.
+ beaker = null
+ recharged = 0
+ hackedcheck = 0
+ dispensable_reagents = list("inaprovaline","ryetalyn","paracetamol","tramadol","oxycodone","sterilizine","leporazine","kelotane","dermaline","dexalin","dexalinp","tricordrazine","anti_toxin","synaptizine","hyronalin","arithrazine","alkysine","imidazoline","peridaxon","bicaridine","hyperzine","rezadone","spaceacillin","ethylredoxrazine","stoxin","chloralhydrate","cryoxadone","clonexadone")
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -460,9 +475,6 @@
/obj/machinery/chem_master/attack_ai(mob/user as mob)
return src.attack_hand(user)
-/obj/machinery/chem_master/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
/obj/machinery/chem_master/attack_hand(mob/user as mob)
if(stat & BROKEN)
return
@@ -686,9 +698,6 @@
/obj/machinery/computer/pandemic/attack_ai(mob/user as mob)
return src.attack_hand(user)
-/obj/machinery/computer/pandemic/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
/obj/machinery/computer/pandemic/attack_hand(mob/user as mob)
if(stat & (NOPOWER|BROKEN))
return
@@ -922,9 +931,6 @@
src.updateUsrDialog()
return 0
-/obj/machinery/reagentgrinder/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
/obj/machinery/reagentgrinder/attack_ai(mob/user as mob)
return 0
diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm
index 6df07ba2e3..2054095660 100644
--- a/code/modules/reagents/Chemistry-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents.dm
@@ -103,7 +103,7 @@ datum
id = "blood"
reagent_state = LIQUID
color = "#C80000" // rgb: 200, 0, 0
-
+
glass_icon_state = "glass_red"
glass_name = "glass of tomato juice"
glass_desc = "Are you sure this is tomato juice?"
@@ -200,24 +200,24 @@ datum
reagent_state = LIQUID
color = "#0064C8" // rgb: 0, 100, 200
custom_metabolism = 0.01
-
+
glass_icon_state = "glass_clear"
glass_name = "glass of water"
glass_desc = "The father of all refreshments."
reaction_turf(var/turf/simulated/T, var/volume)
if (!istype(T)) return
-
+
//If the turf is hot enough, remove some heat
var/datum/gas_mixture/environment = T.return_air()
var/min_temperature = T0C + 100 //100C, the boiling point of water
-
+
if (environment && environment.temperature > min_temperature) //abstracted as steam or something
var/removed_heat = between(0, volume*WATER_LATENT_HEAT, -environment.get_thermal_energy_change(min_temperature))
environment.add_thermal_energy(-removed_heat)
if (prob(5))
T.visible_message("\red The water sizzles as it lands on \the [T]!")
-
+
else //otherwise, the turf gets wet
if(volume >= 3)
if(T.wet >= 1) return
@@ -236,7 +236,7 @@ datum
if(T.wet_overlay)
T.overlays -= T.wet_overlay
T.wet_overlay = null
-
+
//Put out fires.
var/hotspot = (locate(/obj/fire) in T)
if(hotspot)
@@ -268,7 +268,7 @@ datum
id = "holywater"
description = "An ashen-obsidian-water mix, this solution will alter certain sections of the brain's rationality."
color = "#E0E8EF" // rgb: 224, 232, 239
-
+
glass_icon_state = "glass_clear"
glass_name = "glass of holy water"
glass_desc = "An ashen-obsidian-water mix, this solution will alter certain sections of the brain's rationality."
@@ -637,7 +637,7 @@ datum
description = "The organic compound commonly known as table sugar and sometimes called saccharose. This white, odorless, crystalline powder has a pleasing, sweet taste."
reagent_state = SOLID
color = "#FFFFFF" // rgb: 255, 255, 255
-
+
glass_icon_state = "iceglass"
glass_name = "glass of sugar"
glass_desc = "The organic compound commonly known as table sugar and sometimes called saccharose. This white, odorless, crystalline powder has a pleasing, sweet taste."
@@ -1154,7 +1154,7 @@ datum
description = "It's magic. We don't have to explain it."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
-
+
glass_icon_state = "golden_cup"
glass_name = "golden cup"
glass_desc = "It's magic. We don't have to explain it."
@@ -1895,7 +1895,7 @@ datum
color = "#664300" // rgb: 102, 67, 0
custom_metabolism = 0.15 // Sleep toxins should always be consumed pretty fast
overdose = REAGENTS_OVERDOSE/2
-
+
glass_icon_state = "beerglass"
glass_name = "glass of beer"
glass_desc = "A freezing pint of beer"
@@ -2253,7 +2253,7 @@ datum
reagent_state = LIQUID
nutriment_factor = 2 * REAGENTS_METABOLISM
color = "#403010" // rgb: 64, 48, 16
-
+
glass_icon_state = "chocolateglass"
glass_name = "glass of hot chocolate"
glass_desc = "Made with love! And cocoa beans."
@@ -2511,7 +2511,7 @@ datum
glass_icon_state = "glass_orange"
glass_name = "glass of orange juice"
glass_desc = "Vitamins! Yay!"
-
+
on_mob_life(var/mob/living/M as mob)
..()
if(M.getOxyLoss() && prob(30)) M.adjustOxyLoss(-1)
@@ -2526,7 +2526,7 @@ datum
glass_icon_state = "glass_red"
glass_name = "glass of tomato juice"
glass_desc = "Are you sure this is tomato juice?"
-
+
on_mob_life(var/mob/living/M as mob)
..()
if(M.getFireLoss() && prob(20)) M.heal_organ_damage(0,1)
@@ -2537,11 +2537,11 @@ datum
id = "limejuice"
description = "The sweet-sour juice of limes."
color = "#365E30" // rgb: 54, 94, 48
-
+
glass_icon_state = "glass_green"
glass_name = "glass of lime juice"
glass_desc = "A glass of sweet-sour lime juice"
-
+
on_mob_life(var/mob/living/M as mob)
..()
if(M.getToxLoss() && prob(20)) M.adjustToxLoss(-1*REM)
@@ -2556,7 +2556,7 @@ datum
glass_icon_state = "carrotjuice"
glass_name = "glass of carrot juice"
glass_desc = "It is just like a carrot but without crunching."
-
+
on_mob_life(var/mob/living/M as mob)
..()
M.eye_blurry = max(M.eye_blurry-1 , 0)
@@ -2580,13 +2580,13 @@ datum
glass_icon_state = "berryjuice"
glass_name = "glass of berry juice"
glass_desc = "Berry juice. Or maybe it's jam. Who cares?"
-
+
drink/grapejuice
name = "Grape Juice"
id = "grapejuice"
description = "It's grrrrrape!"
color = "#863333" // rgb: 134, 51, 51
-
+
glass_icon_state = "grapejuice"
glass_name = "glass of grape juice"
glass_desc = "It's grrrrrape!"
@@ -2597,9 +2597,9 @@ datum
description = "Grapes made into a fine drank."
color = "#421C52" // rgb: 98, 57, 53
adj_drowsy = -3
-
- glass_icon_state = "grapesoda"
- glass_name = "can of grape soda"
+
+ glass_icon_state = "gsodaglass"
+ glass_name = "glass of grape soda"
glass_desc = "Looks like a delicious drink!"
drink/poisonberryjuice
@@ -2611,7 +2611,7 @@ datum
glass_icon_state = "poisonberryjuice"
glass_name = "glass of poison berry juice"
glass_desc = "A glass of deadly juice."
-
+
on_mob_life(var/mob/living/M as mob)
..()
M.adjustToxLoss(1)
@@ -2622,11 +2622,11 @@ datum
id = "watermelonjuice"
description = "Delicious juice made from watermelon."
color = "#863333" // rgb: 134, 51, 51
-
+
glass_icon_state = "glass_red"
glass_name = "glass of watermelon juice"
glass_desc = "Delicious juice made from watermelon."
-
+
drink/lemonjuice
name = "Lemon Juice"
id = "lemonjuice"
@@ -2636,13 +2636,13 @@ datum
glass_icon_state = "lemonjuice"
glass_name = "glass of lemon juice"
glass_desc = "Sour..."
-
+
drink/banana
name = "Banana Juice"
id = "banana"
description = "The raw essence of a banana."
color = "#863333" // rgb: 175, 175, 0
-
+
glass_icon_state = "banana"
glass_name = "glass of banana juice"
glass_desc = "The raw essence of a banana. HONK!"
@@ -2651,7 +2651,7 @@ datum
name = "Nothing"
id = "nothing"
description = "Absolutely nothing."
-
+
glass_icon_state = "nothing"
glass_name = "glass of nothing"
glass_desc = "Absolutely nothing."
@@ -2666,13 +2666,13 @@ datum
glass_icon_state = "glass_brown"
glass_name = "glass of potato juice"
glass_desc = "Juice from a potato. Bleh."
-
+
drink/milk
name = "Milk"
id = "milk"
description = "An opaque white liquid produced by the mammary glands of mammals."
color = "#DFDFDF" // rgb: 223, 223, 223
-
+
glass_icon_state = "glass_white"
glass_name = "glass of milk"
glass_desc = "White and nutritious goodness!"
@@ -2688,7 +2688,7 @@ datum
id = "soymilk"
description = "An opaque white liquid made from soybeans."
color = "#DFDFC7" // rgb: 223, 223, 199
-
+
glass_icon_state = "glass_white"
glass_name = "glass of soy milk"
glass_desc = "White and nutritious soy goodness!"
@@ -2698,7 +2698,7 @@ datum
id = "cream"
description = "The fatty, still liquid part of milk. Why don't you mix this with sum scotch, eh?"
color = "#DFD7AF" // rgb: 223, 215, 175
-
+
glass_icon_state = "glass_white"
glass_name = "glass of cream"
glass_desc = "Ewwww..."
@@ -2708,7 +2708,7 @@ datum
id = "grenadine"
description = "Made in the modern day with proper pomegranate substitute. Who uses real fruit, anyways?"
color = "#FF004F" // rgb: 255, 0, 79
-
+
glass_icon_state = "grenadineglass"
glass_name = "glass of grenadine syrup"
glass_desc = "Sweet and tangy, a bar syrup used to add color or flavor to drinks."
@@ -2721,7 +2721,7 @@ datum
nutriment_factor = 2 * FOOD_METABOLISM
color = "#403010" // rgb: 64, 48, 16
adj_temp = 5
-
+
glass_icon_state = "chocolateglass"
glass_name = "glass of hot chocolate"
glass_desc = "Made with love! And cocoa beans."
@@ -2735,9 +2735,9 @@ datum
adj_drowsy = -3
adj_sleepy = -2
adj_temp = 25
-
- glass_icon_state = "glass_brown"
- glass_name = "glass of coffee"
+
+ glass_icon_state = "hot_coffee"
+ glass_name = "cup of coffee"
glass_desc = "Don't drop it, or you'll send scalding liquid and glass shards everywhere."
on_mob_life(var/mob/living/M as mob)
@@ -2754,7 +2754,7 @@ datum
description = "Coffee and ice, refreshing and cool."
color = "#102838" // rgb: 16, 40, 56
adj_temp = -5
-
+
glass_icon_state = "icedcoffeeglass"
glass_name = "glass of iced coffee"
glass_desc = "A drink to perk you up and refresh you!"
@@ -2766,7 +2766,7 @@ datum
color = "#664300" // rgb: 102, 67, 0
adj_sleepy = 0
adj_temp = 5
-
+
glass_icon_state = "soy_latte"
glass_name = "glass of soy latte"
glass_desc = "A nice and refrshing beverage while you are reading."
@@ -2785,7 +2785,7 @@ datum
color = "#664300" // rgb: 102, 67, 0
adj_sleepy = 0
adj_temp = 5
-
+
glass_icon_state = "cafe_latte"
glass_name = "glass of cafe latte"
glass_desc = "A nice, strong and refreshing beverage while you are reading."
@@ -2806,9 +2806,9 @@ datum
adj_drowsy = -1
adj_sleepy = -3
adj_temp = 20
-
- glass_icon_state = "glass_brown"
- glass_name = "glass of tea"
+
+ glass_icon_state = "bigteacup"
+ glass_name = "cup of tea"
glass_desc = "Tasty black tea, it has antioxidants, it's good for you!"
on_mob_life(var/mob/living/M as mob)
@@ -2823,7 +2823,7 @@ datum
description = "No relation to a certain rap artist/ actor."
color = "#104038" // rgb: 16, 64, 56
adj_temp = -5
-
+
glass_icon_state = "icedteaglass"
glass_name = "glass of iced tea"
glass_desc = "No relation to a certain rap artist/ actor."
@@ -2841,7 +2841,7 @@ datum
adj_dizzy = -5
adj_drowsy = -3
adj_sleepy = -2
-
+
glass_icon_state = "glass_clear"
glass_name = "glass of tonic water"
glass_desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away."
@@ -2853,7 +2853,7 @@ datum
color = "#619494" // rgb: 97, 148, 148
adj_dizzy = -5
adj_drowsy = -3
-
+
glass_icon_state = "glass_clear"
glass_name = "glass of soda water"
glass_desc = "Soda water. Why not make a scotch and soda?"
@@ -2864,7 +2864,7 @@ datum
description = "Frozen water, your dentist wouldn't like you chewing this."
reagent_state = SOLID
color = "#619494" // rgb: 97, 148, 148
-
+
glass_icon_state = "iceglass"
glass_name = "glass of ice"
glass_desc = "Generally, you're supposed to put something else in there too..."
@@ -2876,7 +2876,7 @@ datum
reagent_state = LIQUID
color = "#100800" // rgb: 16, 8, 0
adj_drowsy = -3
-
+
glass_icon_state = "glass_brown"
glass_name = "glass of Space Cola"
glass_desc = "A glass of refreshing Space Cola"
@@ -2887,7 +2887,7 @@ datum
description = "Cola, cola never changes."
color = "#100800" // rgb: 16, 8, 0
adj_sleepy = -2
-
+
glass_icon_state = "nuka_colaglass"
glass_name = "glass of Nuka-Cola"
glass_desc = "Don't cry, Don't raise your eye, It's only nuclear wasteland"
@@ -2908,7 +2908,7 @@ datum
color = "#102000" // rgb: 16, 32, 0
adj_drowsy = -7
adj_sleepy = -1
-
+
glass_icon_state = "Space_mountain_wind_glass"
glass_name = "glass of Space Mountain Wind"
glass_desc = "Space Mountain Wind. As you know, there are no mountains in space, only wind."
@@ -2919,7 +2919,7 @@ datum
description = "A delicious blend of 42 different flavours"
color = "#102000" // rgb: 16, 32, 0
adj_drowsy = -6
-
+
glass_icon_state = "dr_gibb_glass"
glass_name = "glass of Dr. Gibb"
glass_desc = "Dr. Gibb. Not as dangerous as the name might imply."
@@ -2930,7 +2930,7 @@ datum
description = "Tastes like a hull breach in your mouth."
color = "#202800" // rgb: 32, 40, 0
adj_temp = -8
-
+
glass_icon_state = "space-up_glass"
glass_name = "glass of Space-up"
glass_desc = "Space-up. It helps keep your cool."
@@ -2941,9 +2941,9 @@ datum
id = "lemon_lime"
color = "#878F00" // rgb: 135, 40, 0
adj_temp = -8
-
- glass_icon_state = "glass_yellow"
- glass_name = "glass of lemon lime"
+
+ glass_icon_state = "lemonlime"
+ glass_name = "glass of lemon lime soda"
glass_desc = "A tangy substance made of 0.5% natural citrus!"
drink/cold/lemonade
@@ -2951,7 +2951,7 @@ datum
description = "Oh the nostalgia..."
id = "lemonade"
color = "#FFFF00" // rgb: 255, 255, 0
-
+
glass_icon_state = "lemonadeglass"
glass_name = "glass of lemonade"
glass_desc = "Oh the nostalgia..."
@@ -2966,14 +2966,14 @@ datum
glass_name = "glass of Kira Special"
glass_desc = "Long live the guy who everyone had mistaken for a girl. Baka!"
glass_center_of_mass = list("x"=16, "y"=12)
-
+
drink/cold/brownstar
name = "Brown Star"
description = "It's not what it sounds like..."
id = "brownstar"
color = "#9F3400" // rgb: 159, 052, 000
adj_temp = - 2
-
+
glass_icon_state = "brownstar"
glass_name = "glass of Brown Star"
glass_desc = "It's not what it sounds like..."
@@ -2984,7 +2984,7 @@ datum
id = "milkshake"
color = "#AEE5E4" // rgb" 174, 229, 228
adj_temp = -9
-
+
glass_icon_state = "milkshake"
glass_name = "glass of milkshake"
glass_desc = "Glorious brainfreezing mixture."
@@ -3013,7 +3013,7 @@ datum
glass_name = "glass of Rewriter"
glass_desc = "The secret of the sanctuary of the Libarian..."
glass_center_of_mass = list("x"=16, "y"=9)
-
+
on_mob_life(var/mob/living/M as mob)
..()
M.make_jittery(5)
@@ -3027,7 +3027,7 @@ datum
reagent_state = LIQUID
color = "#FF8CFF" // rgb: 255, 140, 255
nutriment_factor = 1 * FOOD_METABOLISM
-
+
glass_icon_state = "doctorsdelightglass"
glass_name = "glass of The Doctor's Delight"
glass_desc = "A healthy mixture of juices, guaranteed to keep you healthy until the next toolboxing takes place."
@@ -3054,7 +3054,7 @@ datum
description = "Nuclear proliferation never tasted so good."
reagent_state = LIQUID
color = "#666300" // rgb: 102, 99, 0
-
+
glass_icon_state = "atomicbombglass"
glass_name = "glass of Atomic Bomb"
glass_desc = "Nanotrasen cannot take legal responsibility for your actions after imbibing."
@@ -3083,7 +3083,7 @@ datum
description = "Whoah, this stuff looks volatile!"
reagent_state = LIQUID
color = "#664300" // rgb: 102, 67, 0
-
+
glass_icon_state = "gargleblasterglass"
glass_name = "glass of Pan-Galactic Gargle Blaster"
glass_desc = "Does... does this mean that Arthur and Ford are on the station? Oh joy."
@@ -3111,7 +3111,7 @@ datum
description = "A strong neurotoxin that puts the subject into a death-like state."
reagent_state = LIQUID
color = "#2E2E61" // rgb: 46, 46, 97
-
+
glass_icon_state = "neurotoxinglass"
glass_name = "glass of Neurotoxin"
glass_desc = "A drink that is guaranteed to knock you silly."
@@ -3141,7 +3141,7 @@ datum
description = "You just don't get it maaaan."
reagent_state = LIQUID
color = "#664300" // rgb: 102, 67, 0
-
+
glass_icon_state = "hippiesdelightglass"
glass_name = "glass of Hippie's Delight"
glass_desc = "A drink enjoyed by people during the 1960's."
@@ -3205,7 +3205,7 @@ datum
var/confused_start = 150 //amount absorbed after which mob starts confusing directions
var/blur_start = 300 //amount absorbed after which mob starts getting blurred vision
var/pass_out = 400 //amount absorbed after which mob starts passing out
-
+
glass_icon_state = "glass_clear"
glass_name = "glass of ethanol"
glass_desc = "A well-known alcohol with a variety of applications."
@@ -3277,7 +3277,7 @@ datum
color = "#664300" // rgb: 102, 67, 0
boozepwr = 1
nutriment_factor = 1 * FOOD_METABOLISM
-
+
glass_icon_state = "beerglass"
glass_name = "glass of beer"
glass_desc = "A freezing pint of beer"
@@ -3297,7 +3297,7 @@ datum
dizzy_adj = -5
adj_drowsy = -3
adj_sleepy = -2
-
+
glass_icon_state = "kahluaglass"
glass_name = "glass of RR coffee liquor"
glass_desc = "DAMN, THIS THING LOOKS ROBUST"
@@ -3315,7 +3315,7 @@ datum
color = "#664300" // rgb: 102, 67, 0
boozepwr = 2
dizzy_adj = 4
-
+
glass_icon_state = "whiskeyglass"
glass_name = "glass of whiskey"
glass_desc = "The silky, smokey whiskey goodness inside the glass makes the drink look very classy."
@@ -3329,7 +3329,7 @@ datum
boozepwr = 2
dizzy_adj = 4
slur_start = 30 //amount absorbed after which mob starts slurring
-
+
glass_icon_state = "whiskeyglass"
glass_name = "glass of special blend whiskey"
glass_desc = "Just when you thought regular station whiskey was good... This silky, amber goodness has to come along and ruin everything."
@@ -3342,7 +3342,7 @@ datum
color = "#102000" // rgb: 16, 32, 0
boozepwr = 2
nutriment_factor = 1 * FOOD_METABOLISM
-
+
glass_icon_state = "thirteen_loko_glass"
glass_name = "glass of Thirteen Loko"
glass_desc = "This is a glass of Thirteen Loko, it appears to be of the highest quality. The drink, not the glass."
@@ -3361,7 +3361,7 @@ datum
description = "Number one drink AND fueling choice for Russians worldwide."
color = "#0064C8" // rgb: 0, 100, 200
boozepwr = 2
-
+
glass_icon_state = "ginvodkaglass"
glass_name = "glass of vodka"
glass_desc = "The glass contain wodka. Xynta."
@@ -3379,7 +3379,7 @@ datum
color = "#895C4C" // rgb: 137, 92, 76
boozepwr = 1
nutriment_factor = 2 * FOOD_METABOLISM
-
+
glass_icon_state = "glass_brown"
glass_name = "glass of bilk"
glass_desc = "A brew of milk and beer. For those alcoholics who fear osteoporosis."
@@ -3390,7 +3390,7 @@ datum
description = "Made for a woman, strong enough for a man."
color = "#666340" // rgb: 102, 99, 64
boozepwr = 5
-
+
glass_icon_state = "threemileislandglass"
glass_name = "glass of Three Mile Island iced tea"
glass_desc = "A glass of this is sure to prevent a meltdown."
@@ -3408,7 +3408,7 @@ datum
color = "#664300" // rgb: 102, 67, 0
boozepwr = 1
dizzy_adj = 3
-
+
glass_icon_state = "ginvodkaglass"
glass_name = "glass of gin"
glass_desc = "A crystal clear glass of Griffeater gin."
@@ -3420,7 +3420,7 @@ datum
description = "A strong and mildly flavoured, mexican produced spirit. Feeling thirsty hombre?"
color = "#FFFF91" // rgb: 255, 255, 145
boozepwr = 2
-
+
glass_icon_state = "tequillaglass"
glass_name = "glass of Tequilla"
glass_desc = "Now all that's missing is the weird colored shades!"
@@ -3432,7 +3432,7 @@ datum
description = "You suddenly feel a craving for a martini..."
color = "#91FF91" // rgb: 145, 255, 145
boozepwr = 1.5
-
+
glass_icon_state = "vermouthglass"
glass_name = "glass of vermouth"
glass_desc = "You wonder why you're even drinking this straight."
@@ -3447,7 +3447,7 @@ datum
dizzy_adj = 2
slur_start = 65 //amount absorbed after which mob starts slurring
confused_start = 145 //amount absorbed after which mob starts confusing directions
-
+
glass_icon_state = "wineglass"
glass_name = "glass of wine"
glass_desc = "A very classy looking drink."
@@ -3461,7 +3461,7 @@ datum
boozepwr = 1.5
dizzy_adj = 4
confused_start = 115 //amount absorbed after which mob starts confusing directions
-
+
glass_icon_state = "cognacglass"
glass_name = "glass of cognac"
glass_desc = "Damn, you feel like some kind of French aristocrat just by holding this."
@@ -3477,7 +3477,7 @@ datum
slurr_adj = 5
slur_start = 35 //amount absorbed after which mob starts slurring
confused_start = 90 //amount absorbed after which mob starts confusing directions
-
+
glass_icon_state = "glass_brown2"
glass_name = "glass of Hooch"
glass_desc = "You've really hit rock bottom now... your liver packed its bags and left last night."
@@ -3488,7 +3488,7 @@ datum
description = "A dark alchoholic beverage made by malted barley and yeast."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 1
-
+
glass_icon_state = "aleglass"
glass_name = "glass of ale"
glass_desc = "A freezing pint of delicious ale"
@@ -3503,7 +3503,7 @@ datum
dizzy_adj = 5
slur_start = 15
confused_start = 30
-
+
glass_icon_state = "absintheglass"
glass_name = "glass of absinthe"
glass_desc = "Wormwood, anise, oh my."
@@ -3518,7 +3518,7 @@ datum
dizzy_adj = 1
slur_start = 1
confused_start = 1
-
+
glass_icon_state = "pwineglass"
glass_name = "glass of ???"
glass_desc = "A black ichor with an oily purple sheer on top. Are you sure you should drink this?"
@@ -3577,19 +3577,19 @@ datum
description = "Yohoho and all that."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 1.5
-
+
glass_icon_state = "rumglass"
glass_name = "glass of rum"
glass_desc = "Now you want to Pray for a pirate suit, don't you?"
glass_center_of_mass = list("x"=16, "y"=12)
-
+
ethanol/deadrum
name = "Deadrum"
id = "rum" // duplicate ids?
description = "Popular with the sailors. Not very popular with everyone else."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 1
-
+
glass_icon_state = "rumglass"
glass_name = "glass of rum"
glass_desc = "Now you want to Pray for a pirate suit, don't you?"
@@ -3621,7 +3621,7 @@ datum
description = "100 proof cinnamon schnapps, made for alcoholic teen girls on spring break."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 3
-
+
glass_icon_state = "ginvodkaglass"
glass_name = "glass of Goldschlager"
glass_desc = "100 proof that teen girls will drink anything with gold in it."
@@ -3633,7 +3633,7 @@ datum
description = "Tequila with silver in it, a favorite of alcoholic women in the club scene."
color = "#585840" // rgb: 88, 88, 64
boozepwr = 1.5
-
+
glass_icon_state = "patronglass"
glass_name = "glass of Patron"
glass_desc = "Drinking patron in the bar, with all the subpar ladies."
@@ -3645,7 +3645,7 @@ datum
description = "An all time classic, mild cocktail."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 1
-
+
glass_icon_state = "gintonicglass"
glass_name = "glass of gin and tonic"
glass_desc = "A mild but still great cocktail. Drink up, like a true Englishman."
@@ -3657,7 +3657,7 @@ datum
description = "Rum, mixed with cola. Viva la revolucion."
color = "#3E1B00" // rgb: 62, 27, 0
boozepwr = 1.5
-
+
glass_icon_state = "cubalibreglass"
glass_name = "glass of Cuba Libre"
glass_desc = "A classic mix of rum and cola."
@@ -3669,7 +3669,7 @@ datum
description = "Whiskey, mixed with cola. Surprisingly refreshing."
color = "#3E1B00" // rgb: 62, 27, 0
boozepwr = 2
-
+
glass_icon_state = "whiskeycolaglass"
glass_name = "glass of whiskey cola"
glass_desc = "An innocent-looking mixture of cola and Whiskey. Delicious."
@@ -3681,7 +3681,7 @@ datum
description = "Vermouth with Gin. Not quite how 007 enjoyed it, but still delicious."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 2
-
+
glass_icon_state = "martiniglass"
glass_name = "glass of classic martini"
glass_desc = "Damn, the bartender even stirred it, not shook it."
@@ -3693,7 +3693,7 @@ datum
description = "Vodka with Gin. Not quite how 007 enjoyed it, but still delicious."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 4
-
+
glass_icon_state = "martiniglass"
glass_name = "glass of vodka martini"
glass_desc ="A bastardisation of the classic martini. Still great."
@@ -3705,7 +3705,7 @@ datum
description = "That's just, like, your opinion, man..."
color = "#A68340" // rgb: 166, 131, 64
boozepwr = 3
-
+
glass_icon_state = "whiterussianglass"
glass_name = "glass of White Russian"
glass_desc = "A very nice looking drink. But that's just, like, your opinion, man."
@@ -3717,7 +3717,7 @@ datum
description = "Vodka, mixed with plain ol' orange juice. The result is surprisingly delicious."
color = "#A68310" // rgb: 166, 131, 16
boozepwr = 3
-
+
glass_icon_state = "screwdriverglass"
glass_name = "glass of Screwdriver"
glass_desc = "A simple, yet superb mixture of Vodka and orange juice. Just the thing for the tired engineer."
@@ -3729,7 +3729,7 @@ datum
description = "Ewww..."
color = "#8CFF8C" // rgb: 140, 255, 140
boozepwr = 1.5
-
+
glass_icon_state = "booger"
glass_name = "glass of Booger"
glass_desc = "Ewww..."
@@ -3740,7 +3740,7 @@ datum
description = "A strange yet pleasurable mixture made of vodka, tomato and lime juice. Or at least you THINK the red stuff is tomato juice."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 3
-
+
glass_icon_state = "bloodymaryglass"
glass_name = "glass of Bloody Mary"
glass_desc = "Tomato juice, mixed with Vodka and a lil' bit of lime. Tastes like liquid murder."
@@ -3751,7 +3751,7 @@ datum
description = "It's just as effective as Dutch-Courage!"
color = "#664300" // rgb: 102, 67, 0
boozepwr = 3
-
+
glass_icon_state = "bravebullglass"
glass_name = "glass of Brave Bull"
glass_desc = "Tequilla and coffee liquor, brought together in a mouthwatering mixture. Drink up."
@@ -3763,7 +3763,7 @@ datum
description = "Tequila and orange juice. Much like a Screwdriver, only Mexican~"
color = "#FFE48C" // rgb: 255, 228, 140
boozepwr = 2
-
+
glass_icon_state = "tequillasunriseglass"
glass_name = "glass of Tequilla Sunrise"
glass_desc = "Oh great, now you feel nostalgic about sunrises back on Terra..."
@@ -3775,7 +3775,7 @@ datum
reagent_state = LIQUID
color = "#664300" // rgb: 102, 67, 0
boozepwr = 5
-
+
glass_icon_state = "toxinsspecialglass"
glass_name = "glass of Toxins Special"
glass_desc = "Whoah, this thing is on FIRE"
@@ -3793,7 +3793,7 @@ datum
reagent_state = LIQUID
color = "#664300" // rgb: 102, 67, 0
boozepwr = 4
-
+
glass_icon_state = "beepskysmashglass"
glass_name = "Beepsky Smash"
glass_desc = "Heavy, hot and strong. Just like the Iron fist of the LAW."
@@ -3810,7 +3810,7 @@ datum
description = "Whiskey-imbued cream, what else would you expect from the Irish."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 2
-
+
glass_icon_state = "irishcreamglass"
glass_name = "glass of Irish cream"
glass_desc = "It's cream, mixed with whiskey. What else would you expect from the Irish?"
@@ -3822,7 +3822,7 @@ datum
description = "Beer and Ale, brought together in a delicious mix. Intended for true men only."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 2
-
+
glass_icon_state = "manlydorfglass"
glass_name = "glass of The Manly Dorf"
glass_desc = "A manly concotion made from Ale and Beer. Intended for true men only."
@@ -3833,7 +3833,7 @@ datum
description = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 4
-
+
glass_icon_state = "longislandicedteaglass"
glass_name = "glass of Long Island iced tea"
glass_desc = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only."
@@ -3845,7 +3845,7 @@ datum
description = "You've really hit rock bottom now... your liver packed its bags and left last night."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 4
-
+
glass_icon_state = "glass_clear"
glass_name = "glass of moonshine"
glass_desc = "You've really hit rock bottom now... your liver packed its bags and left last night."
@@ -3856,7 +3856,7 @@ datum
description = "Coffee, Irish Cream, and cognac. You will get bombed."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 4
-
+
glass_icon_state = "b52glass"
glass_name = "glass of B-52"
glass_desc = "Kahlua, Irish cream, and congac. You will get bombed."
@@ -3867,7 +3867,7 @@ datum
description = "Coffee, and alcohol. More fun than a Mimosa to drink in the morning."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 3
-
+
glass_icon_state = "irishcoffeeglass"
glass_name = "glass of Irish coffee"
glass_desc = "Coffee and alcohol. More fun than a Mimosa to drink in the morning."
@@ -3879,7 +3879,7 @@ datum
description = "On the rocks with salt on the rim. Arriba~!"
color = "#8CFF8C" // rgb: 140, 255, 140
boozepwr = 3
-
+
glass_icon_state = "margaritaglass"
glass_name = "glass of margarita"
glass_desc = "On the rocks with salt on the rim. Arriba~!"
@@ -3891,7 +3891,7 @@ datum
description = "For the lactose-intolerant. Still as classy as a White Russian."
color = "#360000" // rgb: 54, 0, 0
boozepwr = 3
-
+
glass_icon_state = "blackrussianglass"
glass_name = "glass of Black Russian"
glass_desc = "For the lactose-intolerant. Still as classy as a White Russian."
@@ -3903,7 +3903,7 @@ datum
description = "The Detective's undercover drink of choice. He never could stomach gin..."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 3
-
+
glass_icon_state = "manhattanglass"
glass_name = "glass of Manhattan"
glass_desc = "The Detective's undercover drink of choice. He never could stomach gin..."
@@ -3915,7 +3915,7 @@ datum
description = "A scientist's drink of choice, for pondering ways to blow up the station."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 5
-
+
glass_icon_state = "proj_manhattanglass"
glass_name = "glass of Manhattan Project"
glass_desc = "A scienitst drink of choice, for thinking how to blow up the station."
@@ -3932,7 +3932,7 @@ datum
description = "For the more refined griffon."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 3
-
+
glass_icon_state = "whiskeysodaglass2"
glass_name = "glass of whiskey soda"
glass_desc = "Ultimate refreshment."
@@ -3944,7 +3944,7 @@ datum
description = "Ultimate refreshment."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 4
-
+
glass_icon_state = "antifreeze"
glass_name = "glass of Anti-freeze"
glass_desc = "The ultimate refreshment."
@@ -3962,7 +3962,7 @@ datum
description = "Barefoot and pregnant"
color = "#664300" // rgb: 102, 67, 0
boozepwr = 1.5
-
+
glass_icon_state = "b&p"
glass_name = "glass of Barefoot"
glass_desc = "Barefoot and pregnant"
@@ -3974,7 +3974,7 @@ datum
description = "A cold refreshment"
color = "#FFFFFF" // rgb: 255, 255, 255
boozepwr = 1.5
-
+
glass_icon_state = "snowwhite"
glass_name = "glass of Snow White"
glass_desc = "A cold refreshment."
@@ -3986,7 +3986,7 @@ datum
description = "A relatively sweet and fruity 46 proof liquor."
color = "#138808" // rgb: 19, 136, 8
boozepwr = 1
-
+
glass_icon_state = "emeraldglass"
glass_name = "glass of melon liquor"
glass_desc = "A relatively sweet and fruity 46 proof liquor."
@@ -3998,7 +3998,7 @@ datum
description = "Exotically blue, fruity drink, distilled from oranges."
color = "#0000CD" // rgb: 0, 0, 205
boozepwr = 1.5
-
+
glass_icon_state = "curacaoglass"
glass_name = "glass of blue curacao"
glass_desc = "Exotically blue, fruity drink, distilled from oranges."
@@ -4010,7 +4010,7 @@ datum
description = "Comprised of: White soda, blue curacao, melon liquor."
color = "#00A86B" // rgb: 0, 168, 107
boozepwr = 0.5
-
+
glass_icon_state = "sdreamglass"
glass_name = "glass of Sui Dream"
glass_desc = "A froofy, fruity, and sweet mixed drink. Understanding the name only brings shame."
@@ -4022,12 +4022,12 @@ datum
description = "AHHHH!!!!"
color = "#820000" // rgb: 130, 0, 0
boozepwr = 3
-
+
glass_icon_state = "demonsblood"
glass_name = "glass of Demons' Blood"
glass_desc = "Just looking at this thing makes the hair at the back of your neck stand up."
glass_center_of_mass = list("x"=16, "y"=2)
-
+
ethanol/vodkatonic
name = "Vodka and Tonic"
id = "vodkatonic"
@@ -4036,7 +4036,7 @@ datum
boozepwr = 3
dizzy_adj = 4
slurr_adj = 3
-
+
glass_icon_state = "vodkatonicglass"
glass_name = "glass of vodka and tonic"
glass_desc = "For when a gin and tonic isn't Russian enough."
@@ -4050,7 +4050,7 @@ datum
boozepwr = 1.5
dizzy_adj = 4
slurr_adj = 3
-
+
glass_icon_state = "ginfizzglass"
glass_name = "glass of gin fizz"
glass_desc = "Refreshingly lemony, deliciously dry."
@@ -4062,7 +4062,7 @@ datum
description = "Tropical cocktail."
color = "#FF7F3B" // rgb: 255, 127, 59
boozepwr = 2
-
+
glass_icon_state = "bahama_mama"
glass_name = "glass of Bahama Mama"
glass_desc = "Tropical cocktail"
@@ -4076,7 +4076,7 @@ datum
boozepwr = 5
dizzy_adj = 15
slurr_adj = 15
-
+
glass_icon_state = "singulo"
glass_name = "glass of Singulo"
glass_desc = "A blue-space beverage."
@@ -4088,12 +4088,12 @@ datum
description = "A spicy Vodka! Might be a little hot for the little guys!"
color = "#664300" // rgb: 102, 67, 0
boozepwr = 3
-
+
glass_icon_state = "sbitenglass"
glass_name = "glass of Sbiten"
glass_desc = "A spicy mix of Vodka and Spice. Very hot."
glass_center_of_mass = list("x"=17, "y"=8)
-
+
on_mob_life(var/mob/living/M as mob)
if (M.bodytemperature < 360)
M.bodytemperature = min(360, M.bodytemperature + (50 * TEMPERATURE_DAMAGE_COEFFICIENT)) //310 is the normal bodytemp. 310.055
@@ -4106,7 +4106,7 @@ datum
description = "Creepy time!"
color = "#A68310" // rgb: 166, 131, 16
boozepwr = 3
-
+
glass_icon_state = "devilskiss"
glass_name = "glass of Devil's Kiss"
glass_desc = "Creepy time!"
@@ -4118,7 +4118,7 @@ datum
description = "The true Viking's drink! Even though it has a strange red color."
color = "#C73C00" // rgb: 199, 60, 0
boozepwr = 1.5
-
+
glass_icon_state = "red_meadglass"
glass_name = "glass of red mead"
glass_desc = "A true Viking's beverage, though its color is strange."
@@ -4132,7 +4132,7 @@ datum
color = "#664300" // rgb: 102, 67, 0
boozepwr = 1.5
nutriment_factor = 1 * FOOD_METABOLISM
-
+
glass_icon_state = "meadglass"
glass_name = "glass of mead"
glass_desc = "A Viking's beverage, though a cheap one."
@@ -4144,7 +4144,7 @@ datum
description = "A beer which is so cold the air around it freezes."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 1
-
+
glass_icon_state = "iced_beerglass"
glass_name = "glass of iced beer"
glass_desc = "A beer so frosty, the air around it freezes."
@@ -4163,7 +4163,7 @@ datum
reagent_state = LIQUID
color = "#664300" // rgb: 102, 67, 0
boozepwr = 0.5
-
+
glass_icon_state = "grogglass"
glass_name = "glass of grog"
glass_desc = "A fine and cepa drink for Space."
@@ -4174,7 +4174,7 @@ datum
description = "So very, very, very good."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 3
-
+
glass_icon_state = "aloe"
glass_name = "glass of Aloe"
glass_desc = "Very, very, very good."
@@ -4186,7 +4186,7 @@ datum
description = "A nice, strangely named drink."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 3
-
+
glass_icon_state = "andalusia"
glass_name = "glass of Andalusia"
glass_desc = "A nice, strange named drink."
@@ -4198,7 +4198,7 @@ datum
description = "A drink made from your allies, not as sweet as when made from your enemies."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 2
-
+
glass_icon_state = "alliescocktail"
glass_name = "glass of Allies cocktail"
glass_desc = "A drink made from your allies."
@@ -4211,7 +4211,7 @@ datum
reagent_state = LIQUID
color = "#365000" // rgb: 54, 80, 0
boozepwr = 1.5
-
+
glass_icon_state = "acidspitglass"
glass_name = "glass of Acid Spit"
glass_desc = "A drink from Nanotrasen. Made from live aliens."
@@ -4224,7 +4224,7 @@ datum
reagent_state = LIQUID
color = "#664300" // rgb: 102, 67, 0
boozepwr = 2
-
+
glass_icon_state = "amasecglass"
glass_name = "glass of Amasec"
glass_desc = "Always handy before COMBAT!!!"
@@ -4236,7 +4236,7 @@ datum
description = "You take a tiny sip and feel a burning sensation..."
color = "#2E6671" // rgb: 46, 102, 113
boozepwr = 5
-
+
glass_icon_state = "changelingsting"
glass_name = "glass of Changeling Sting"
glass_desc = "A stingy drink."
@@ -4248,7 +4248,7 @@ datum
color = "#2E6671" // rgb: 46, 102, 113
boozepwr = 3
dizzy_adj = 5
-
+
glass_icon_state = "irishcarbomb"
glass_name = "glass of Irish Car Bomb"
glass_desc = "An irish car bomb."
@@ -4260,7 +4260,7 @@ datum
description = "Tastes like terrorism!"
color = "#2E6671" // rgb: 46, 102, 113
boozepwr = 5
-
+
glass_icon_state = "syndicatebomb"
glass_name = "glass of Syndicate Bomb"
glass_desc = "Tastes like terrorism!"
@@ -4272,7 +4272,7 @@ datum
description = "The surprise is it's green!"
color = "#2E6671" // rgb: 46, 102, 113
boozepwr = 3
-
+
glass_icon_state = "erikasurprise"
glass_name = "glass of Erika Surprise"
glass_desc = "The surprise is, it's green!"
@@ -4285,7 +4285,7 @@ datum
nutriment_factor = 1 * FOOD_METABOLISM
color = "#2E6671" // rgb: 46, 102, 113
boozepwr = 4
-
+
glass_icon_state = "driestmartiniglass"
glass_name = "glass of Driest Martini"
glass_desc = "Only for the experienced. You think you see sand floating in the glass."
@@ -4298,7 +4298,7 @@ datum
nutriment_factor = 1 * REAGENTS_METABOLISM
color = "#FFFF91" // rgb: 255, 255, 140
boozepwr = 4
-
+
glass_icon_state = "bananahonkglass"
glass_name = "glass of Banana Honk"
glass_desc = "A drink from Banana Heaven."
@@ -4311,7 +4311,7 @@ datum
nutriment_factor = 1 * FOOD_METABOLISM
color = "#664300" // rgb: 102, 67, 0
boozepwr = 4
-
+
glass_icon_state = "silencerglass"
glass_name = "glass of Silencer"
glass_desc = "A drink from mime Heaven."
diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm
index 63944b8157..3735aed0cf 100644
--- a/code/modules/reagents/reagent_containers/food/snacks.dm
+++ b/code/modules/reagents/reagent_containers/food/snacks.dm
@@ -127,7 +127,7 @@
if(istype(W,/obj/item/weapon/storage))
..() // -> item/attackby()
return
-
+
// Eating with forks
if(istype(W,/obj/item/weapon/kitchen/utensil))
var/obj/item/weapon/kitchen/utensil/U = W
@@ -156,16 +156,16 @@
if (reagents.total_volume <= 0)
del(src)
return
-
+
if (is_sliceable())
//these are used to allow hiding edge items in food that is not on a table/tray
var/can_slice_here = isturf(src.loc) && ((locate(/obj/structure/table) in src.loc) || (locate(/obj/machinery/optable) in src.loc) || (locate(/obj/item/weapon/tray) in src.loc))
var/hide_item = !has_edge(W) || !can_slice_here
-
+
if (hide_item)
if (W.w_class >= src.w_class || W.is_robot_module())
return
-
+
user << "\red You slip [W] inside [src]."
user.u_equip(W)
if ((user.client && user.s_active != src))
@@ -174,19 +174,19 @@
add_fingerprint(user)
contents += W
return
-
+
if (has_edge(W))
if (!can_slice_here)
user << "\red You cannot slice [src] here! You need a table or at least a tray to do it."
return
-
+
var/slices_lost = 0
if (W.w_class > 3)
user.visible_message("\blue [user] crudely slices \the [src] with [W]!", "\blue You crudely slice \the [src] with your [W]!")
slices_lost = rand(1,min(1,round(slices_num/2)))
else
user.visible_message("\blue [user] slices \the [src]!", "\blue You slice \the [src]!")
-
+
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)
@@ -195,7 +195,7 @@
return
/obj/item/weapon/reagent_containers/food/snacks/proc/is_sliceable()
- return (slices_num <= 0 || !slices_num || !slice_path)
+ return (slices_num <= 0 || !slices_num || !slice_path)
/obj/item/weapon/reagent_containers/food/snacks/Del()
if(contents)
@@ -203,38 +203,27 @@
something.loc = get_turf(src)
..()
-/obj/item/weapon/reagent_containers/food/snacks/attack_animal(var/mob/M)
- if(isanimal(M))
- if(iscorgi(M))
- if(bitecount == 0 || prob(50))
- M.emote("nibbles away at the [src]")
- bitecount++
- if(bitecount >= 5)
- var/sattisfaction_text = pick("burps from enjoyment", "yaps for more", "woofs twice", "looks at the area where the [src] was")
- if(sattisfaction_text)
- M.emote("[sattisfaction_text]")
- del(src)
- if(ismouse(M))
- var/mob/living/simple_animal/mouse/N = M
- N << text("\blue You nibble away at [src].")
- if(prob(50))
- N.visible_message("[N] nibbles away at [src].", "")
- //N.emote("nibbles away at the [src]")
- N.health = min(N.health + 1, N.maxHealth)
-
////////////////////////////////////////////////////////////////////////////////
/// FOOD END
////////////////////////////////////////////////////////////////////////////////
+/obj/item/weapon/reagent_containers/food/snacks/attack_generic(var/mob/living/user)
+ if(isanimal(user) || isalien(user))
+ if(bitecount == 0 || prob(50))
+ user.custom_emote(1,"nibbles away at the [src]")
+ bitecount++
+ if(reagents && user.reagents)
+ reagents.trans_to_ingest(user, bitesize)
+ spawn(5)
+ if(!src && !user.client)
+ user.custom_emote(1,"[pick("burps", "cries for more", "burps twice", "looks at the area where the food was")]")
+ del(src)
-
-
-
-
+ On_Consume(user)
//////////////////////////////////////////////////
////////////////////////////////////////////Snacks
diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm
index 810b523078..49348a22a0 100644
--- a/code/modules/reagents/reagent_containers/hypospray.dm
+++ b/code/modules/reagents/reagent_containers/hypospray.dm
@@ -14,10 +14,6 @@
flags = FPRINT | TABLEPASS | OPENCONTAINER
slot_flags = SLOT_BELT
-/obj/item/weapon/reagent_containers/hypospray/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
-
/obj/item/weapon/reagent_containers/hypospray/New() //comment this to make hypos start off empty
..()
reagents.add_reagent("tricordrazine", 30)
diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm
index 5617a3802e..744e212e78 100644
--- a/code/modules/reagents/reagent_containers/syringes.dm
+++ b/code/modules/reagents/reagent_containers/syringes.dm
@@ -45,9 +45,6 @@
..()
update_icon()
- attack_paw()
- return attack_hand()
-
attackby(obj/item/I as obj, mob/user as mob)
return
@@ -308,9 +305,6 @@
..()
update_icon()
- attack_paw()
- return attack_hand()
-
attackby(obj/item/I as obj, mob/user as mob)
return
diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm
index 035c16e70e..bf77c47d59 100644
--- a/code/modules/recycling/disposal.dm
+++ b/code/modules/recycling/disposal.dm
@@ -204,31 +204,27 @@
update()
return
-
-// monkeys can only pull the flush lever
-/obj/machinery/disposal/attack_paw(mob/user as mob)
- if(stat & BROKEN)
- return
-
- flush = !flush
- update()
- return
-
// ai as human but can't flush
/obj/machinery/disposal/attack_ai(mob/user as mob)
interact(user, 1)
// human interact with machine
/obj/machinery/disposal/attack_hand(mob/user as mob)
+
+ if(stat & BROKEN)
+ return
+
if(user && user.loc == src)
usr << "\red You cannot reach the controls from inside."
return
- /*
- if(mode==-1)
- usr << "\red The disposal units power is disabled."
- return
- */
- interact(user, 0)
+
+ // Clumsy folks can only flush it.
+ if(user.IsAdvancedToolUser(1))
+ interact(user, 0)
+ else
+ flush = !flush
+ update()
+ return
// user interaction
/obj/machinery/disposal/interact(mob/user, var/ai=0)
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index aac3b1c24a..801088bb71 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -48,7 +48,7 @@ datum/design //Datum for object designs, used in construction
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/build_path = "" //The file path of the object that gets created
+ 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/category = null //Primarily used for Mech Fabricators, but can be used for anything
@@ -74,7 +74,7 @@ datum/design/seccamera
req_tech = list("programming" = 2)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/security"
+ build_path = /obj/item/weapon/circuitboard/security
datum/design/aicore
name = "Circuit Design (AI Core)"
@@ -83,7 +83,7 @@ datum/design/aicore
req_tech = list("programming" = 4, "biotech" = 3)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/aicore"
+ build_path = /obj/item/weapon/circuitboard/aicore
datum/design/aiupload
name = "Circuit Design (AI Upload)"
@@ -92,7 +92,7 @@ datum/design/aiupload
req_tech = list("programming" = 4)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/aiupload"
+ build_path = /obj/item/weapon/circuitboard/aiupload
datum/design/borgupload
name = "Circuit Design (Cyborg Upload)"
@@ -101,7 +101,7 @@ datum/design/borgupload
req_tech = list("programming" = 4)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/borgupload"
+ build_path = /obj/item/weapon/circuitboard/borgupload
datum/design/med_data
name = "Circuit Design (Medical Records)"
@@ -110,7 +110,7 @@ datum/design/med_data
req_tech = list("programming" = 2)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/med_data"
+ build_path = /obj/item/weapon/circuitboard/med_data
datum/design/operating
name = "Circuit Design (Operating Computer)"
@@ -119,7 +119,7 @@ datum/design/operating
req_tech = list("programming" = 2, "biotech" = 2)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/operating"
+ build_path = /obj/item/weapon/circuitboard/operating
datum/design/pandemic
name = "Circuit Design (PanD.E.M.I.C. 2200)"
@@ -128,7 +128,7 @@ datum/design/pandemic
req_tech = list("programming" = 2, "biotech" = 2)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/pandemic"
+ build_path = /obj/item/weapon/circuitboard/pandemic
datum/design/scan_console
name = "Circuit Design (DNA Machine)"
@@ -137,7 +137,7 @@ datum/design/scan_console
req_tech = list("programming" = 2, "biotech" = 3)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/scan_consolenew"
+ build_path = /obj/item/weapon/circuitboard/scan_consolenew
datum/design/comconsole
name = "Circuit Design (Communications)"
@@ -146,7 +146,7 @@ datum/design/comconsole
req_tech = list("programming" = 2, "magnets" = 2)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/communications"
+ build_path = /obj/item/weapon/circuitboard/communications
datum/design/idcardconsole
name = "Circuit Design (ID Computer)"
@@ -155,7 +155,7 @@ datum/design/idcardconsole
req_tech = list("programming" = 2)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/card"
+ build_path = /obj/item/weapon/circuitboard/card
datum/design/crewconsole
name = "Circuit Design (Crew monitoring computer)"
@@ -164,7 +164,7 @@ datum/design/crewconsole
req_tech = list("programming" = 3, "magnets" = 2, "biotech" = 2)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/crew"
+ build_path = /obj/item/weapon/circuitboard/crew
datum/design/teleconsole
name = "Circuit Design (Teleporter Console)"
@@ -173,7 +173,7 @@ datum/design/teleconsole
req_tech = list("programming" = 3, "bluespace" = 2)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/teleporter"
+ build_path = /obj/item/weapon/circuitboard/teleporter
datum/design/secdata
name = "Circuit Design (Security Records Console)"
@@ -182,7 +182,7 @@ datum/design/secdata
req_tech = list("programming" = 2)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/secure_data"
+ build_path = /obj/item/weapon/circuitboard/secure_data
datum/design/atmosalerts
name = "Circuit Design (Atmosphere Alert)"
@@ -191,7 +191,7 @@ datum/design/atmosalerts
req_tech = list("programming" = 2)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/atmos_alert"
+ build_path = /obj/item/weapon/circuitboard/atmos_alert
datum/design/air_management
name = "Circuit Design (Atmospheric Monitor)"
@@ -200,7 +200,7 @@ datum/design/air_management
req_tech = list("programming" = 2)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/air_management"
+ build_path = /obj/item/weapon/circuitboard/air_management
/* Uncomment if someone makes these buildable
datum/design/general_alert
@@ -210,7 +210,7 @@ datum/design/general_alert
req_tech = list("programming" = 2)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/general_alert"
+ build_path = /obj/item/weapon/circuitboard/general_alert"
*/
datum/design/robocontrol
@@ -220,7 +220,7 @@ datum/design/robocontrol
req_tech = list("programming" = 4)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/robotics"
+ build_path = /obj/item/weapon/circuitboard/robotics
datum/design/dronecontrol
name = "Circuit Design (Drone Control Console)"
@@ -229,7 +229,7 @@ datum/design/dronecontrol
req_tech = list("programming" = 4)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/drone_control"
+ build_path = /obj/item/weapon/circuitboard/drone_control
datum/design/clonecontrol
name = "Circuit Design (Cloning Machine Console)"
@@ -238,7 +238,7 @@ datum/design/clonecontrol
req_tech = list("programming" = 3, "biotech" = 3)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/cloning"
+ build_path = /obj/item/weapon/circuitboard/cloning
datum/design/clonepod
name = "Circuit Design (Clone Pod)"
@@ -247,7 +247,7 @@ datum/design/clonepod
req_tech = list("programming" = 3, "biotech" = 3)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/clonepod"
+ build_path = /obj/item/weapon/circuitboard/clonepod
datum/design/clonescanner
name = "Circuit Design (Cloning Scanner)"
@@ -256,7 +256,7 @@ datum/design/clonescanner
req_tech = list("programming" = 3, "biotech" = 3)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/clonescanner"
+ build_path = /obj/item/weapon/circuitboard/clonescanner
datum/design/arcademachine
name = "Circuit Design (Arcade Machine)"
@@ -265,7 +265,7 @@ datum/design/arcademachine
req_tech = list("programming" = 1)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/arcade"
+ build_path = /obj/item/weapon/circuitboard/arcade
datum/design/powermonitor
name = "Circuit Design (Power Monitor)"
@@ -274,7 +274,7 @@ datum/design/powermonitor
req_tech = list("programming" = 2)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/powermonitor"
+ build_path = /obj/item/weapon/circuitboard/powermonitor
datum/design/solarcontrol
name = "Circuit Design (Solar Control)"
@@ -283,7 +283,7 @@ datum/design/solarcontrol
req_tech = list("programming" = 2, "powerstorage" = 2)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/solar_control"
+ build_path = /obj/item/weapon/circuitboard/solar_control
datum/design/prisonmanage
name = "Circuit Design (Prisoner Management Console)"
@@ -292,7 +292,7 @@ datum/design/prisonmanage
req_tech = list("programming" = 2)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/prisoner"
+ build_path = /obj/item/weapon/circuitboard/prisoner
datum/design/mechacontrol
name = "Circuit Design (Exosuit Control Console)"
@@ -301,7 +301,7 @@ datum/design/mechacontrol
req_tech = list("programming" = 3)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/mecha_control"
+ build_path = /obj/item/weapon/circuitboard/mecha_control
datum/design/mechapower
name = "Circuit Design (Mech Bay Power Control Console)"
@@ -310,7 +310,7 @@ datum/design/mechapower
req_tech = list("programming" = 2, "powerstorage" = 3)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/mech_bay_power_console"
+ build_path = /obj/item/weapon/circuitboard/mech_bay_power_console
datum/design/rdconsole
name = "Circuit Design (R&D Console)"
@@ -319,7 +319,7 @@ datum/design/rdconsole
req_tech = list("programming" = 4)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/rdconsole"
+ build_path = /obj/item/weapon/circuitboard/rdconsole
datum/design/ordercomp
name = "Circuit Design (Supply ordering console)"
@@ -328,7 +328,7 @@ datum/design/ordercomp
req_tech = list("programming" = 2)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/ordercomp"
+ build_path = /obj/item/weapon/circuitboard/ordercomp
datum/design/supplycomp
name = "Circuit Design (Supply shuttle console)"
@@ -337,7 +337,7 @@ datum/design/supplycomp
req_tech = list("programming" = 3)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/supplycomp"
+ build_path = /obj/item/weapon/circuitboard/supplycomp
datum/design/comm_monitor
name = "Circuit Design (Telecommunications Monitoring Console)"
@@ -346,7 +346,7 @@ datum/design/comm_monitor
req_tech = list("programming" = 3)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/comm_monitor"
+ build_path = /obj/item/weapon/circuitboard/comm_monitor
datum/design/comm_server
name = "Circuit Design (Telecommunications Server Monitoring Console)"
@@ -355,7 +355,7 @@ datum/design/comm_server
req_tech = list("programming" = 3)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/comm_server"
+ build_path = /obj/item/weapon/circuitboard/comm_server
datum/design/message_monitor
name = "Circuit Design (Messaging Monitor Console)"
@@ -364,7 +364,7 @@ datum/design/message_monitor
req_tech = list("programming" = 5)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/message_monitor"
+ build_path = /obj/item/weapon/circuitboard/message_monitor
datum/design/aifixer
name = "Circuit Design (AI Integrity Restorer)"
@@ -373,7 +373,7 @@ datum/design/aifixer
req_tech = list("programming" = 3, "biotech" = 2)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/aifixer"
+ build_path = /obj/item/weapon/circuitboard/aifixer
// VERY VERY EXPENSIVE (needs diamonds and stuff)
datum/design/smes_cell
@@ -383,7 +383,7 @@ datum/design/smes_cell
req_tech = list("powerstorage" = 7, "engineering" = 5) // Higher than obtained by deconstructing existing boards. Needs more RnD effor to make
build_type = IMPRINTER
materials = list("$glass" = 4000, "sacid" = 40, "$gold" = 1000, "$silver" = 1000, "$diamond" = 500)
- build_path = "/obj/item/weapon/circuitboard/smes"
+ build_path = /obj/item/weapon/circuitboard/smes
///////////////////////////////////
//////////AI Module Disks//////////
@@ -395,7 +395,7 @@ datum/design/safeguard_module
req_tech = list("programming" = 3, "materials" = 4)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20, "$gold" = 100)
- build_path = "/obj/item/weapon/aiModule/safeguard"
+ build_path = /obj/item/weapon/aiModule/safeguard
datum/design/onehuman_module
name = "Module Design (OneHuman)"
@@ -404,7 +404,7 @@ datum/design/onehuman_module
req_tech = list("programming" = 4, "materials" = 6)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20, "$diamond" = 100)
- build_path = "/obj/item/weapon/aiModule/oneHuman"
+ build_path = /obj/item/weapon/aiModule/oneHuman
datum/design/protectstation_module
name = "Module Design (ProtectStation)"
@@ -413,7 +413,7 @@ datum/design/protectstation_module
req_tech = list("programming" = 3, "materials" = 6)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20, "$gold" = 100)
- build_path = "/obj/item/weapon/aiModule/protectStation"
+ build_path = /obj/item/weapon/aiModule/protectStation
datum/design/notele_module
name = "Module Design (TeleporterOffline Module)"
@@ -422,7 +422,7 @@ datum/design/notele_module
req_tech = list("programming" = 3)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20, "$gold" = 100)
- build_path = "/obj/item/weapon/aiModule/teleporterOffline"
+ build_path = /obj/item/weapon/aiModule/teleporterOffline
datum/design/quarantine_module
name = "Module Design (Quarantine)"
@@ -431,7 +431,7 @@ datum/design/quarantine_module
req_tech = list("programming" = 3, "biotech" = 2, "materials" = 4)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20, "$gold" = 100)
- build_path = "/obj/item/weapon/aiModule/quarantine"
+ build_path = /obj/item/weapon/aiModule/quarantine
datum/design/oxygen_module
name = "Module Design (OxygenIsToxicToHumans)"
@@ -440,7 +440,7 @@ datum/design/oxygen_module
req_tech = list("programming" = 3, "biotech" = 2, "materials" = 4)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20, "$gold" = 100)
- build_path = "/obj/item/weapon/aiModule/oxygen"
+ build_path = /obj/item/weapon/aiModule/oxygen
datum/design/freeform_module
name = "Module Design (Freeform)"
@@ -449,7 +449,7 @@ datum/design/freeform_module
req_tech = list("programming" = 4, "materials" = 4)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20, "$gold" = 100)
- build_path = "/obj/item/weapon/aiModule/freeform"
+ build_path = /obj/item/weapon/aiModule/freeform
datum/design/reset_module
name = "Module Design (Reset)"
@@ -458,7 +458,7 @@ datum/design/reset_module
req_tech = list("programming" = 3, "materials" = 6)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20, "$gold" = 100)
- build_path = "/obj/item/weapon/aiModule/reset"
+ build_path = /obj/item/weapon/aiModule/reset
datum/design/purge_module
name = "Module Design (Purge)"
@@ -467,7 +467,7 @@ datum/design/purge_module
req_tech = list("programming" = 4, "materials" = 6)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20, "$diamond" = 100)
- build_path = "/obj/item/weapon/aiModule/purge"
+ build_path = /obj/item/weapon/aiModule/purge
datum/design/freeformcore_module
name = "Core Module Design (Freeform)"
@@ -476,7 +476,7 @@ datum/design/freeformcore_module
req_tech = list("programming" = 4, "materials" = 6)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20, "$diamond" = 100)
- build_path = "/obj/item/weapon/aiModule/freeformcore"
+ build_path = /obj/item/weapon/aiModule/freeformcore
datum/design/asimov
name = "Core Module Design (Asimov)"
@@ -485,7 +485,7 @@ datum/design/asimov
req_tech = list("programming" = 3, "materials" = 6)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20, "$diamond" = 100)
- build_path = "/obj/item/weapon/aiModule/asimov"
+ build_path = /obj/item/weapon/aiModule/asimov
datum/design/paladin_module
name = "Core Module Design (P.A.L.A.D.I.N.)"
@@ -494,7 +494,7 @@ datum/design/paladin_module
req_tech = list("programming" = 4, "materials" = 6)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20, "$diamond" = 100)
- build_path = "/obj/item/weapon/aiModule/paladin"
+ build_path = /obj/item/weapon/aiModule/paladin
datum/design/tyrant_module
name = "Core Module Design (T.Y.R.A.N.T.)"
@@ -503,7 +503,7 @@ datum/design/tyrant_module
req_tech = list("programming" = 4, "syndicate" = 2, "materials" = 6)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20, "$diamond" = 100)
- build_path = "/obj/item/weapon/aiModule/tyrant"
+ build_path = /obj/item/weapon/aiModule/tyrant
@@ -517,7 +517,7 @@ datum/design/subspace_receiver
req_tech = list("programming" = 4, "engineering" = 3, "bluespace" = 2)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/telecomms/receiver"
+ build_path = /obj/item/weapon/circuitboard/telecomms/receiver
datum/design/telecomms_bus
name = "Circuit Design (Bus Mainframe)"
@@ -526,7 +526,7 @@ datum/design/telecomms_bus
req_tech = list("programming" = 4, "engineering" = 4)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/telecomms/bus"
+ build_path = /obj/item/weapon/circuitboard/telecomms/bus
datum/design/telecomms_hub
name = "Circuit Design (Hub Mainframe)"
@@ -535,7 +535,7 @@ datum/design/telecomms_hub
req_tech = list("programming" = 4, "engineering" = 4)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/telecomms/hub"
+ build_path = /obj/item/weapon/circuitboard/telecomms/hub
datum/design/telecomms_relay
name = "Circuit Design (Relay Mainframe)"
@@ -544,7 +544,7 @@ datum/design/telecomms_relay
req_tech = list("programming" = 3, "engineering" = 4, "bluespace" = 3)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/telecomms/relay"
+ build_path = /obj/item/weapon/circuitboard/telecomms/relay
datum/design/telecomms_processor
name = "Circuit Design (Processor Unit)"
@@ -553,7 +553,7 @@ datum/design/telecomms_processor
req_tech = list("programming" = 4, "engineering" = 4)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/telecomms/processor"
+ build_path = /obj/item/weapon/circuitboard/telecomms/processor
datum/design/telecomms_server
name = "Circuit Design (Server Mainframe)"
@@ -562,7 +562,7 @@ datum/design/telecomms_server
req_tech = list("programming" = 4, "engineering" = 4)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/telecomms/server"
+ build_path = /obj/item/weapon/circuitboard/telecomms/server
datum/design/subspace_broadcaster
name = "Circuit Design (Subspace Broadcaster)"
@@ -571,7 +571,7 @@ datum/design/subspace_broadcaster
req_tech = list("programming" = 4, "engineering" = 4, "bluespace" = 2)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/telecomms/broadcaster"
+ build_path = /obj/item/weapon/circuitboard/telecomms/broadcaster
///////////////////////////////////
@@ -585,7 +585,7 @@ datum/design/intellicard
req_tech = list("programming" = 4, "materials" = 4)
build_type = PROTOLATHE
materials = list("$glass" = 1000, "$gold" = 200)
- build_path = "/obj/item/device/aicard"
+ build_path = /obj/item/device/aicard
datum/design/paicard
name = "Personal Artificial Intelligence Card"
@@ -594,7 +594,7 @@ datum/design/paicard
req_tech = list("programming" = 2)
build_type = PROTOLATHE
materials = list("$glass" = 500, "$metal" = 500)
- build_path = "/obj/item/device/paicard"
+ build_path = /obj/item/device/paicard
datum/design/posibrain
name = "Positronic Brain"
@@ -604,7 +604,7 @@ datum/design/posibrain
build_type = PROTOLATHE
materials = list("$metal" = 2000, "$glass" = 1000, "$silver" = 1000, "$gold" = 500, "$phoron" = 500, "$diamond" = 100)
- build_path = "/obj/item/device/mmi/posibrain"
+ build_path = /obj/item/device/mmi/posibrain
///////////////////////////////////
//////////Mecha Module Disks///////
@@ -617,7 +617,7 @@ datum/design/ripley_main
req_tech = list("programming" = 3)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/mecha/ripley/main"
+ build_path = /obj/item/weapon/circuitboard/mecha/ripley/main
datum/design/ripley_peri
name = "Circuit Design (APLU \"Ripley\" Peripherals Control module)"
@@ -626,7 +626,7 @@ datum/design/ripley_peri
req_tech = list("programming" = 3)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/mecha/ripley/peripherals"
+ build_path = /obj/item/weapon/circuitboard/mecha/ripley/peripherals
datum/design/odysseus_main
name = "Circuit Design (\"Odysseus\" Central Control module)"
@@ -635,7 +635,7 @@ datum/design/odysseus_main
req_tech = list("programming" = 3,"biotech" = 2)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/mecha/odysseus/main"
+ build_path = /obj/item/weapon/circuitboard/mecha/odysseus/main
datum/design/odysseus_peri
name = "Circuit Design (\"Odysseus\" Peripherals Control module)"
@@ -644,7 +644,7 @@ datum/design/odysseus_peri
req_tech = list("programming" = 3,"biotech" = 2)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/mecha/odysseus/peripherals"
+ build_path = /obj/item/weapon/circuitboard/mecha/odysseus/peripherals
datum/design/gygax_main
name = "Circuit Design (\"Gygax\" Central Control module)"
@@ -653,7 +653,7 @@ datum/design/gygax_main
req_tech = list("programming" = 4)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/mecha/gygax/main"
+ build_path = /obj/item/weapon/circuitboard/mecha/gygax/main
datum/design/gygax_peri
name = "Circuit Design (\"Gygax\" Peripherals Control module)"
@@ -662,7 +662,7 @@ datum/design/gygax_peri
req_tech = list("programming" = 4)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/mecha/gygax/peripherals"
+ build_path = /obj/item/weapon/circuitboard/mecha/gygax/peripherals
datum/design/gygax_targ
name = "Circuit Design (\"Gygax\" Weapons & Targeting Control module)"
@@ -671,7 +671,7 @@ datum/design/gygax_targ
req_tech = list("programming" = 4, "combat" = 2)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/mecha/gygax/targeting"
+ build_path = /obj/item/weapon/circuitboard/mecha/gygax/targeting
datum/design/durand_main
name = "Circuit Design (\"Durand\" Central Control module)"
@@ -680,7 +680,7 @@ datum/design/durand_main
req_tech = list("programming" = 4)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/mecha/durand/main"
+ build_path = /obj/item/weapon/circuitboard/mecha/durand/main
datum/design/durand_peri
name = "Circuit Design (\"Durand\" Peripherals Control module)"
@@ -689,7 +689,7 @@ datum/design/durand_peri
req_tech = list("programming" = 4)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/mecha/durand/peripherals"
+ build_path = /obj/item/weapon/circuitboard/mecha/durand/peripherals
datum/design/durand_targ
name = "Circuit Design (\"Durand\" Weapons & Targeting Control module)"
@@ -698,7 +698,7 @@ datum/design/durand_targ
req_tech = list("programming" = 4, "combat" = 2)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/mecha/durand/targeting"
+ build_path = /obj/item/weapon/circuitboard/mecha/durand/targeting
datum/design/honker_main
name = "Circuit Design (\"H.O.N.K\" Central Control module)"
@@ -707,7 +707,7 @@ datum/design/honker_main
req_tech = list("programming" = 3)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/mecha/honker/main"
+ build_path = /obj/item/weapon/circuitboard/mecha/honker/main
datum/design/honker_peri
name = "Circuit Design (\"H.O.N.K\" Peripherals Control module)"
@@ -716,7 +716,7 @@ datum/design/honker_peri
req_tech = list("programming" = 3)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/mecha/honker/peripherals"
+ build_path = /obj/item/weapon/circuitboard/mecha/honker/peripherals
datum/design/honker_targ
name = "Circuit Design (\"H.O.N.K\" Weapons & Targeting Control module)"
@@ -725,7 +725,7 @@ datum/design/honker_targ
req_tech = list("programming" = 3)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/mecha/honker/targeting"
+ build_path = /obj/item/weapon/circuitboard/mecha/honker/targeting
////////////////////////////////////////
/////////// Mecha Equpment /////////////
@@ -737,7 +737,7 @@ datum/design/mech_scattershot
id = "mech_scattershot"
build_type = MECHFAB
req_tech = list("combat" = 4)
- build_path = "/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot"
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot
category = "Exosuit Equipment"
datum/design/mech_laser
@@ -746,7 +746,7 @@ datum/design/mech_laser
id = "mech_laser"
build_type = MECHFAB
req_tech = list("combat" = 3, "magnets" = 3)
- build_path = "/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser"
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser
category = "Exosuit Equipment"
datum/design/mech_laser_rigged
@@ -755,7 +755,7 @@ datum/design/mech_laser_rigged
id = "mech_laser_rigged"
build_type = MECHFAB
req_tech = list("combat" = 2, "magnets" = 2)
- build_path = "/obj/item/mecha_parts/mecha_equipment/weapon/energy/riggedlaser"
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/riggedlaser
category = "Exosuit Equipment"
datum/design/mech_laser_heavy
@@ -764,7 +764,7 @@ datum/design/mech_laser_heavy
id = "mech_laser_heavy"
build_type = MECHFAB
req_tech = list("combat" = 4, "magnets" = 4)
- build_path = "/obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy"
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/laser/heavy
category = "Exosuit Equipment"
datum/design/mech_ion
@@ -773,7 +773,7 @@ datum/design/mech_ion
id = "mech_ion"
build_type = MECHFAB
req_tech = list("combat" = 4, "magnets" = 4)
- build_path = "/obj/item/mecha_parts/mecha_equipment/weapon/energy/ion"
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/ion
category = "Exosuit Equipment"
datum/design/mech_grenade_launcher
@@ -782,7 +782,7 @@ datum/design/mech_grenade_launcher
id = "mech_grenade_launcher"
build_type = MECHFAB
req_tech = list("combat" = 3)
- build_path = "/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang"
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang
category = "Exosuit Equipment"
datum/design/clusterbang_launcher
@@ -791,7 +791,7 @@ datum/design/clusterbang_launcher
id = "clusterbang_launcher"
build_type = MECHFAB
req_tech = list("combat"= 5, "materials" = 5, "syndicate" = 3)
- build_path = "/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang/limited"
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang/limited
category = "Exosuit Equipment"
datum/design/mech_wormhole_gen
@@ -800,7 +800,7 @@ datum/design/mech_wormhole_gen
id = "mech_wormhole_gen"
build_type = MECHFAB
req_tech = list("bluespace" = 3, "magnets" = 2)
- build_path = "/obj/item/mecha_parts/mecha_equipment/wormhole_generator"
+ build_path = /obj/item/mecha_parts/mecha_equipment/wormhole_generator
category = "Exosuit Equipment"
datum/design/mech_teleporter
@@ -809,7 +809,7 @@ datum/design/mech_teleporter
id = "mech_teleporter"
build_type = MECHFAB
req_tech = list("bluespace" = 10, "magnets" = 5)
- build_path = "/obj/item/mecha_parts/mecha_equipment/teleporter"
+ build_path = /obj/item/mecha_parts/mecha_equipment/teleporter
category = "Exosuit Equipment"
datum/design/mech_rcd
@@ -818,7 +818,7 @@ datum/design/mech_rcd
id = "mech_rcd"
build_type = MECHFAB
req_tech = list("materials" = 4, "bluespace" = 3, "magnets" = 4, "powerstorage"=4, "engineering" = 4)
- build_path = "/obj/item/mecha_parts/mecha_equipment/tool/rcd"
+ build_path = /obj/item/mecha_parts/mecha_equipment/tool/rcd
category = "Exosuit Equipment"
datum/design/mech_gravcatapult
@@ -827,7 +827,7 @@ datum/design/mech_gravcatapult
id = "mech_gravcatapult"
build_type = MECHFAB
req_tech = list("bluespace" = 2, "magnets" = 3, "engineering" = 3)
- build_path = "/obj/item/mecha_parts/mecha_equipment/gravcatapult"
+ build_path = /obj/item/mecha_parts/mecha_equipment/gravcatapult
category = "Exosuit Equipment"
datum/design/mech_repair_droid
@@ -836,7 +836,7 @@ datum/design/mech_repair_droid
id = "mech_repair_droid"
build_type = MECHFAB
req_tech = list("magnets" = 3, "programming" = 3, "engineering" = 3)
- build_path = "/obj/item/mecha_parts/mecha_equipment/repair_droid"
+ build_path = /obj/item/mecha_parts/mecha_equipment/repair_droid
category = "Exosuit Equipment"
datum/design/mech_phoron_generator
@@ -845,7 +845,7 @@ datum/design/mech_phoron_generator
id = "mech_phoron_generator"
build_type = MECHFAB
req_tech = list("phorontech" = 2, "powerstorage"= 2, "engineering" = 2)
- build_path = "/obj/item/mecha_parts/mecha_equipment/phoron_generator"
+ build_path = /obj/item/mecha_parts/mecha_equipment/generator
category = "Exosuit Equipment"
datum/design/mech_energy_relay
@@ -854,7 +854,7 @@ datum/design/mech_energy_relay
id = "mech_energy_relay"
build_type = MECHFAB
req_tech = list("magnets" = 4, "powerstorage" = 3)
- build_path = "/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay"
+ build_path = /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay
category = "Exosuit Equipment"
datum/design/mech_ccw_armor
@@ -863,7 +863,7 @@ datum/design/mech_ccw_armor
id = "mech_ccw_armor"
build_type = MECHFAB
req_tech = list("materials" = 5, "combat" = 4)
- build_path = "/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster"
+ build_path = /obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster
category = "Exosuit Equipment"
datum/design/mech_proj_armor
@@ -872,7 +872,7 @@ datum/design/mech_proj_armor
id = "mech_proj_armor"
build_type = MECHFAB
req_tech = list("materials" = 5, "combat" = 5, "engineering"=3)
- build_path = "/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster"
+ build_path = /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster
category = "Exosuit Equipment"
datum/design/mech_syringe_gun
@@ -881,7 +881,7 @@ datum/design/mech_syringe_gun
id = "mech_syringe_gun"
build_type = MECHFAB
req_tech = list("materials" = 3, "biotech"=4, "magnets"=4, "programming"=3)
- build_path = "/obj/item/mecha_parts/mecha_equipment/tool/syringe_gun"
+ build_path = /obj/item/mecha_parts/mecha_equipment/tool/syringe_gun
category = "Exosuit Equipment"
datum/design/mech_diamond_drill
@@ -890,7 +890,7 @@ datum/design/mech_diamond_drill
id = "mech_diamond_drill"
build_type = MECHFAB
req_tech = list("materials" = 4, "engineering" = 3)
- build_path = "/obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill"
+ build_path = /obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill
category = "Exosuit Equipment"
datum/design/mech_generator_nuclear
@@ -899,7 +899,7 @@ datum/design/mech_generator_nuclear
id = "mech_generator_nuclear"
build_type = MECHFAB
req_tech = list("powerstorage"= 3, "engineering" = 3, "materials" = 3)
- build_path = "/obj/item/mecha_parts/mecha_equipment/generator/nuclear"
+ build_path = /obj/item/mecha_parts/mecha_equipment/generator/nuclear
category = "Exosuit Equipment"
@@ -913,7 +913,7 @@ datum/design/design_disk
req_tech = list("programming" = 1)
build_type = PROTOLATHE | AUTOLATHE
materials = list("$metal" = 30, "$glass" = 10)
- build_path = "/obj/item/weapon/disk/design_disk"
+ build_path = /obj/item/weapon/disk/design_disk
datum/design/tech_disk
name = "Technology Data Storage Disk"
@@ -922,7 +922,7 @@ datum/design/tech_disk
req_tech = list("programming" = 1)
build_type = PROTOLATHE | AUTOLATHE
materials = list("$metal" = 30, "$glass" = 10)
- build_path = "/obj/item/weapon/disk/tech_disk"
+ build_path = /obj/item/weapon/disk/tech_disk
////////////////////////////////////////
/////////////Stock Parts////////////////
@@ -935,7 +935,7 @@ datum/design/basic_capacitor
req_tech = list("powerstorage" = 1)
build_type = PROTOLATHE | AUTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
- build_path = "/obj/item/weapon/stock_parts/capacitor"
+ build_path = /obj/item/weapon/stock_parts/capacitor
datum/design/basic_sensor
name = "Basic Sensor Module"
@@ -944,7 +944,7 @@ datum/design/basic_sensor
req_tech = list("magnets" = 1)
build_type = PROTOLATHE | AUTOLATHE
materials = list("$metal" = 50, "$glass" = 20)
- build_path = "/obj/item/weapon/stock_parts/scanning_module"
+ build_path = /obj/item/weapon/stock_parts/scanning_module
datum/design/micro_mani
name = "Micro Manipulator"
@@ -953,7 +953,7 @@ datum/design/micro_mani
req_tech = list("materials" = 1, "programming" = 1)
build_type = PROTOLATHE | AUTOLATHE
materials = list("$metal" = 30)
- build_path = "/obj/item/weapon/stock_parts/manipulator"
+ build_path = /obj/item/weapon/stock_parts/manipulator
datum/design/basic_micro_laser
name = "Basic Micro-Laser"
@@ -962,7 +962,7 @@ datum/design/basic_micro_laser
req_tech = list("magnets" = 1)
build_type = PROTOLATHE | AUTOLATHE
materials = list("$metal" = 10, "$glass" = 20)
- build_path = "/obj/item/weapon/stock_parts/micro_laser"
+ build_path = /obj/item/weapon/stock_parts/micro_laser
datum/design/basic_matter_bin
name = "Basic Matter Bin"
@@ -971,7 +971,7 @@ datum/design/basic_matter_bin
req_tech = list("materials" = 1)
build_type = PROTOLATHE | AUTOLATHE
materials = list("$metal" = 80)
- build_path = "/obj/item/weapon/stock_parts/matter_bin"
+ build_path = /obj/item/weapon/stock_parts/matter_bin
datum/design/adv_capacitor
name = "Advanced Capacitor"
@@ -980,7 +980,7 @@ datum/design/adv_capacitor
req_tech = list("powerstorage" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
- build_path = "/obj/item/weapon/stock_parts/capacitor/adv"
+ build_path = /obj/item/weapon/stock_parts/capacitor/adv
datum/design/adv_sensor
name = "Advanced Sensor Module"
@@ -989,7 +989,7 @@ datum/design/adv_sensor
req_tech = list("magnets" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 20)
- build_path = "/obj/item/weapon/stock_parts/scanning_module/adv"
+ build_path = /obj/item/weapon/stock_parts/scanning_module/adv
datum/design/nano_mani
name = "Nano Manipulator"
@@ -998,7 +998,7 @@ datum/design/nano_mani
req_tech = list("materials" = 3, "programming" = 2)
build_type = PROTOLATHE
materials = list("$metal" = 30)
- build_path = "/obj/item/weapon/stock_parts/manipulator/nano"
+ build_path = /obj/item/weapon/stock_parts/manipulator/nano
datum/design/high_micro_laser
name = "High-Power Micro-Laser"
@@ -1007,7 +1007,7 @@ datum/design/high_micro_laser
req_tech = list("magnets" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 10, "$glass" = 20)
- build_path = "/obj/item/weapon/stock_parts/micro_laser/high"
+ build_path = /obj/item/weapon/stock_parts/micro_laser/high
datum/design/adv_matter_bin
name = "Advanced Matter Bin"
@@ -1016,7 +1016,7 @@ datum/design/adv_matter_bin
req_tech = list("materials" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 80)
- build_path = "/obj/item/weapon/stock_parts/matter_bin/adv"
+ build_path = /obj/item/weapon/stock_parts/matter_bin/adv
datum/design/super_capacitor
name = "Super Capacitor"
@@ -1026,7 +1026,7 @@ datum/design/super_capacitor
build_type = PROTOLATHE
reliability_base = 71
materials = list("$metal" = 50, "$glass" = 50, "$gold" = 20)
- build_path = "/obj/item/weapon/stock_parts/capacitor/super"
+ build_path = /obj/item/weapon/stock_parts/capacitor/super
datum/design/phasic_sensor
name = "Phasic Sensor Module"
@@ -1036,7 +1036,7 @@ datum/design/phasic_sensor
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 20, "$silver" = 10)
reliability_base = 72
- build_path = "/obj/item/weapon/stock_parts/scanning_module/phasic"
+ build_path = /obj/item/weapon/stock_parts/scanning_module/phasic
datum/design/pico_mani
name = "Pico Manipulator"
@@ -1046,7 +1046,7 @@ datum/design/pico_mani
build_type = PROTOLATHE
materials = list("$metal" = 30)
reliability_base = 73
- build_path = "/obj/item/weapon/stock_parts/manipulator/pico"
+ build_path = /obj/item/weapon/stock_parts/manipulator/pico
datum/design/ultra_micro_laser
name = "Ultra-High-Power Micro-Laser"
@@ -1056,7 +1056,7 @@ datum/design/ultra_micro_laser
build_type = PROTOLATHE
materials = list("$metal" = 10, "$glass" = 20, "$uranium" = 10)
reliability_base = 70
- build_path = "/obj/item/weapon/stock_parts/micro_laser/ultra"
+ build_path = /obj/item/weapon/stock_parts/micro_laser/ultra
datum/design/super_matter_bin
name = "Super Matter Bin"
@@ -1066,7 +1066,7 @@ datum/design/super_matter_bin
build_type = PROTOLATHE
materials = list("$metal" = 80)
reliability_base = 75
- build_path = "/obj/item/weapon/stock_parts/matter_bin/super"
+ build_path = /obj/item/weapon/stock_parts/matter_bin/super
@@ -1077,7 +1077,7 @@ datum/design/subspace_ansible
req_tech = list("programming" = 3, "magnets" = 4, "materials" = 4, "bluespace" = 2)
build_type = PROTOLATHE
materials = list("$metal" = 80, "$silver" = 20)
- build_path = "/obj/item/weapon/stock_parts/subspace/ansible"
+ build_path = /obj/item/weapon/stock_parts/subspace/ansible
datum/design/hyperwave_filter
name = "Hyperwave Filter"
@@ -1086,7 +1086,7 @@ datum/design/hyperwave_filter
req_tech = list("programming" = 3, "magnets" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 40, "$silver" = 10)
- build_path = "/obj/item/weapon/stock_parts/subspace/filter"
+ build_path = /obj/item/weapon/stock_parts/subspace/filter
datum/design/subspace_amplifier
name = "Subspace Amplifier"
@@ -1095,7 +1095,7 @@ datum/design/subspace_amplifier
req_tech = list("programming" = 3, "magnets" = 4, "materials" = 4, "bluespace" = 2)
build_type = PROTOLATHE
materials = list("$metal" = 10, "$gold" = 30, "$uranium" = 15)
- build_path = "/obj/item/weapon/stock_parts/subspace/amplifier"
+ build_path = /obj/item/weapon/stock_parts/subspace/amplifier
datum/design/subspace_treatment
name = "Subspace Treatment Disk"
@@ -1104,7 +1104,7 @@ datum/design/subspace_treatment
req_tech = list("programming" = 3, "magnets" = 2, "materials" = 4, "bluespace" = 2)
build_type = PROTOLATHE
materials = list("$metal" = 10, "$silver" = 20)
- build_path = "/obj/item/weapon/stock_parts/subspace/treatment"
+ build_path = /obj/item/weapon/stock_parts/subspace/treatment
datum/design/subspace_analyzer
name = "Subspace Analyzer"
@@ -1113,7 +1113,7 @@ datum/design/subspace_analyzer
req_tech = list("programming" = 3, "magnets" = 4, "materials" = 4, "bluespace" = 2)
build_type = PROTOLATHE
materials = list("$metal" = 10, "$gold" = 15)
- build_path = "/obj/item/weapon/stock_parts/subspace/analyzer"
+ build_path = /obj/item/weapon/stock_parts/subspace/analyzer
datum/design/subspace_crystal
name = "Ansible Crystal"
@@ -1122,7 +1122,7 @@ datum/design/subspace_crystal
req_tech = list("magnets" = 4, "materials" = 4, "bluespace" = 2)
build_type = PROTOLATHE
materials = list("$glass" = 1000, "$silver" = 20, "$gold" = 20)
- build_path = "/obj/item/weapon/stock_parts/subspace/crystal"
+ build_path = /obj/item/weapon/stock_parts/subspace/crystal
datum/design/subspace_transmitter
name = "Subspace Transmitter"
@@ -1131,7 +1131,7 @@ datum/design/subspace_transmitter
req_tech = list("magnets" = 5, "materials" = 5, "bluespace" = 3)
build_type = PROTOLATHE
materials = list("$glass" = 100, "$silver" = 10, "$uranium" = 15)
- build_path = "/obj/item/weapon/stock_parts/subspace/transmitter"
+ build_path = /obj/item/weapon/stock_parts/subspace/transmitter
////////////////////////////////////////
//////////////////Power/////////////////
@@ -1144,7 +1144,7 @@ datum/design/basic_cell
req_tech = list("powerstorage" = 1)
build_type = PROTOLATHE | AUTOLATHE |MECHFAB
materials = list("$metal" = 700, "$glass" = 50)
- build_path = "/obj/item/weapon/cell"
+ build_path = /obj/item/weapon/cell
category = "Misc"
datum/design/high_cell
@@ -1154,7 +1154,7 @@ datum/design/high_cell
req_tech = list("powerstorage" = 2)
build_type = PROTOLATHE | AUTOLATHE | MECHFAB
materials = list("$metal" = 700, "$glass" = 60)
- build_path = "/obj/item/weapon/cell/high"
+ build_path = /obj/item/weapon/cell/high
category = "Misc"
datum/design/super_cell
@@ -1165,7 +1165,7 @@ datum/design/super_cell
reliability_base = 75
build_type = PROTOLATHE | MECHFAB
materials = list("$metal" = 700, "$glass" = 70)
- build_path = "/obj/item/weapon/cell/super"
+ build_path = /obj/item/weapon/cell/super
category = "Misc"
datum/design/hyper_cell
@@ -1176,7 +1176,7 @@ datum/design/hyper_cell
reliability_base = 70
build_type = PROTOLATHE | MECHFAB
materials = list("$metal" = 400, "$gold" = 150, "$silver" = 150, "$glass" = 70)
- build_path = "/obj/item/weapon/cell/hyper"
+ build_path = /obj/item/weapon/cell/hyper
category = "Misc"
datum/design/light_replacer
@@ -1186,7 +1186,7 @@ datum/design/light_replacer
req_tech = list("magnets" = 3, "materials" = 4)
build_type = PROTOLATHE
materials = list("$metal" = 1500, "$silver" = 150, "$glass" = 3000)
- build_path = "/obj/item/device/lightreplacer"
+ build_path = /obj/item/device/lightreplacer
////////////////////////////////////////
//////////////MISC Boards///////////////
@@ -1199,7 +1199,7 @@ datum/design/destructive_analyzer
req_tech = list("programming" = 2, "magnets" = 2, "engineering" = 2)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/destructive_analyzer"
+ build_path = /obj/item/weapon/circuitboard/destructive_analyzer
datum/design/protolathe
name = "Protolathe Board"
@@ -1208,7 +1208,7 @@ datum/design/protolathe
req_tech = list("programming" = 2, "engineering" = 2)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/protolathe"
+ build_path = /obj/item/weapon/circuitboard/protolathe
datum/design/circuit_imprinter
name = "Circuit Imprinter Board"
@@ -1217,7 +1217,7 @@ datum/design/circuit_imprinter
req_tech = list("programming" = 2, "engineering" = 2)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/circuit_imprinter"
+ build_path = /obj/item/weapon/circuitboard/circuit_imprinter
datum/design/autolathe
name = "Autolathe Board"
@@ -1226,7 +1226,7 @@ datum/design/autolathe
req_tech = list("programming" = 2, "engineering" = 2)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/autolathe"
+ build_path = /obj/item/weapon/circuitboard/autolathe
datum/design/rdservercontrol
name = "R&D Server Control Console Board"
@@ -1235,7 +1235,7 @@ datum/design/rdservercontrol
req_tech = list("programming" = 3)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/rdservercontrol"
+ build_path = /obj/item/weapon/circuitboard/rdservercontrol
datum/design/rdserver
name = "R&D Server Board"
@@ -1244,7 +1244,7 @@ datum/design/rdserver
req_tech = list("programming" = 3)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/rdserver"
+ build_path = /obj/item/weapon/circuitboard/rdserver
datum/design/mechfab
name = "Exosuit Fabricator Board"
@@ -1253,7 +1253,7 @@ datum/design/mechfab
req_tech = list("programming" = 3, "engineering" = 3)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/mechfab"
+ build_path = /obj/item/weapon/circuitboard/mechfab
datum/design/gas_heater
name = "Gas Heating System Board"
@@ -1262,7 +1262,7 @@ datum/design/gas_heater
req_tech = list("powerstorage" = 2, "engineering" = 1)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/unary_atmos/heater"
+ build_path = /obj/item/weapon/circuitboard/unary_atmos/heater
datum/design/gas_cooler
name = "Gas Cooling System Board"
@@ -1271,7 +1271,7 @@ datum/design/gas_cooler
req_tech = list("magnets" = 2, "engineering" = 2)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/unary_atmos/cooler"
+ build_path = /obj/item/weapon/circuitboard/unary_atmos/cooler
/////////////////////////////////////////
////////////Power Stuff//////////////////
@@ -1285,7 +1285,7 @@ datum/design/pacman
build_type = IMPRINTER
reliability_base = 79
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/pacman"
+ build_path = /obj/item/weapon/circuitboard/pacman
datum/design/superpacman
name = "SUPERPACMAN-type Generator Board"
@@ -1295,7 +1295,7 @@ datum/design/superpacman
build_type = IMPRINTER
reliability_base = 76
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/pacman/super"
+ build_path = /obj/item/weapon/circuitboard/pacman/super
datum/design/mrspacman
name = "MRSPACMAN-type Generator Board"
@@ -1305,7 +1305,7 @@ datum/design/mrspacman
build_type = IMPRINTER
reliability_base = 74
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/pacman/mrs"
+ build_path = /obj/item/weapon/circuitboard/pacman/mrs
datum/design/batteryrack
name = "Cell rack PSU Board"
@@ -1314,13 +1314,22 @@ datum/design/batteryrack
req_tech = list("powerstorage" = 3, "engineering" = 2)
build_type = IMPRINTER
materials = list("$glass" = 2000, "sacid" = 20)
- build_path = "/obj/item/weapon/circuitboard/batteryrack"
+ build_path = /obj/item/weapon/circuitboard/batteryrack
/////////////////////////////////////////
////////////Medical Tools////////////////
/////////////////////////////////////////
+datum/design/robot_scanner
+ name = "Cyborg Analyzer"
+ desc = "A hand-held scanner able to diagnose robotic injuries. "
+ id = "robot_scanner"
+ req_tech = list("magnets" = 3, "biotech" = 2, "engineering" = 3)
+ build_type = PROTOLATHE
+ materials = list("$metal" = 500, "$glass" = 200)
+ build_path = "/obj/item/device/robotanalyzer"
+
datum/design/mass_spectrometer
name = "Mass-Spectrometer"
desc = "A device for analyzing chemicals in the blood."
@@ -1329,7 +1338,7 @@ datum/design/mass_spectrometer
build_type = PROTOLATHE
materials = list("$metal" = 30, "$glass" = 20)
reliability_base = 76
- build_path = "/obj/item/device/mass_spectrometer"
+ build_path = /obj/item/device/mass_spectrometer
datum/design/adv_mass_spectrometer
name = "Advanced Mass-Spectrometer"
@@ -1339,7 +1348,7 @@ datum/design/adv_mass_spectrometer
build_type = PROTOLATHE
materials = list("$metal" = 30, "$glass" = 20)
reliability_base = 74
- build_path = "/obj/item/device/mass_spectrometer/adv"
+ build_path = /obj/item/device/mass_spectrometer/adv
datum/design/reagent_scanner
name = "Reagent Scanner"
@@ -1349,7 +1358,7 @@ datum/design/reagent_scanner
build_type = PROTOLATHE
materials = list("$metal" = 30, "$glass" = 20)
reliability_base = 76
- build_path = "/obj/item/device/reagent_scanner"
+ build_path = /obj/item/device/reagent_scanner
datum/design/adv_reagent_scanner
name = "Advanced Reagent Scanner"
@@ -1359,7 +1368,7 @@ datum/design/adv_reagent_scanner
build_type = PROTOLATHE
materials = list("$metal" = 30, "$glass" = 20)
reliability_base = 74
- build_path = "/obj/item/device/reagent_scanner/adv"
+ build_path = /obj/item/device/reagent_scanner/adv
datum/design/mmi
name = "Man-Machine Interface"
@@ -1369,7 +1378,7 @@ datum/design/mmi
build_type = PROTOLATHE | MECHFAB
materials = list("$metal" = 1000, "$glass" = 500)
reliability_base = 76
- build_path = "/obj/item/device/mmi"
+ build_path = /obj/item/device/mmi
category = "Misc"
datum/design/mmi_radio
@@ -1380,7 +1389,7 @@ datum/design/mmi_radio
build_type = PROTOLATHE | MECHFAB
materials = list("$metal" = 1200, "$glass" = 500)
reliability_base = 74
- build_path = "/obj/item/device/mmi/radio_enabled"
+ build_path = /obj/item/device/mmi/radio_enabled
category = "Misc"
datum/design/synthetic_flash
@@ -1391,7 +1400,7 @@ datum/design/synthetic_flash
build_type = MECHFAB
materials = list("$metal" = 750, "$glass" = 750)
reliability_base = 76
- build_path = "/obj/item/device/flash/synthetic"
+ build_path = /obj/item/device/flash/synthetic
category = "Misc"
datum/design/nanopaste
@@ -1401,7 +1410,7 @@ datum/design/nanopaste
req_tech = list("materials" = 4, "engineering" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 7000, "$glass" = 7000)
- build_path = "/obj/item/stack/nanopaste"
+ build_path = /obj/item/stack/nanopaste
/* // Removal of loyalty implants. Can't think of a way to add this to the config option.
datum/design/implant_loyal
@@ -1411,7 +1420,7 @@ datum/design/implant_loyal
req_tech = list("materials" = 2, "biotech" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 7000, "$glass" = 7000)
- build_path = "/obj/item/weapon/implant/loyalty"
+ build_path = /obj/item/weapon/implant/loyalty"
*/
datum/design/implant_chem
@@ -1421,7 +1430,7 @@ datum/design/implant_chem
req_tech = list("materials" = 2, "biotech" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
- build_path = "/obj/item/weapon/implant/chem"
+ build_path = /obj/item/weapon/implant/chem
datum/design/implant_free
name = "freedom implant"
@@ -1430,7 +1439,7 @@ datum/design/implant_free
req_tech = list("syndicate" = 2, "biotech" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
- build_path = "/obj/item/weapon/implant/freedom"
+ build_path = /obj/item/weapon/implant/freedom
datum/design/chameleon
name = "Chameleon Kit"
@@ -1439,7 +1448,7 @@ datum/design/chameleon
req_tech = list("syndicate" = 2)
build_type = PROTOLATHE
materials = list("$metal" = 500)
- build_path = "/obj/item/weapon/storage/box/syndie_kit/chameleon"
+ build_path = /obj/item/weapon/storage/box/syndie_kit/chameleon
datum/design/bluespacebeaker
@@ -1450,7 +1459,7 @@ datum/design/bluespacebeaker
build_type = PROTOLATHE
materials = list("$metal" = 3000, "$phoron" = 3000, "$diamond" = 500)
reliability_base = 76
- build_path = "/obj/item/weapon/reagent_containers/glass/beaker/bluespace"
+ build_path = /obj/item/weapon/reagent_containers/glass/beaker/bluespace
datum/design/noreactbeaker
name = "cryostasis beaker"
@@ -1460,7 +1469,7 @@ datum/design/noreactbeaker
build_type = PROTOLATHE
materials = list("$metal" = 3000)
reliability_base = 76
- build_path = "/obj/item/weapon/reagent_containers/glass/beaker/noreact"
+ build_path = /obj/item/weapon/reagent_containers/glass/beaker/noreact
category = "Misc"
datum/design/scalpel_laser1
@@ -1470,7 +1479,7 @@ datum/design/scalpel_laser1
req_tech = list("biotech" = 2, "materials" = 2, "magnets" = 2)
build_type = PROTOLATHE
materials = list("$metal" = 12500, "$glass" = 7500)
- build_path = "/obj/item/weapon/scalpel/laser1"
+ build_path = /obj/item/weapon/scalpel/laser1
datum/design/scalpel_laser2
name = "Improved Laser Scalpel"
@@ -1479,7 +1488,7 @@ datum/design/scalpel_laser2
req_tech = list("biotech" = 3, "materials" = 4, "magnets" = 4)
build_type = PROTOLATHE
materials = list("$metal" = 12500, "$glass" = 7500, "$silver" = 2500)
- build_path = "/obj/item/weapon/scalpel/laser2"
+ build_path = /obj/item/weapon/scalpel/laser2
datum/design/scalpel_laser3
name = "Advanced Laser Scalpel"
@@ -1488,7 +1497,7 @@ datum/design/scalpel_laser3
req_tech = list("biotech" = 4, "materials" = 6, "magnets" = 5)
build_type = PROTOLATHE
materials = list("$metal" = 12500, "$glass" = 7500, "$silver" = 2000, "$gold" = 1500)
- build_path = "/obj/item/weapon/scalpel/laser3"
+ build_path = /obj/item/weapon/scalpel/laser3
datum/design/scalpel_manager
name = "Incision Management System"
@@ -1497,7 +1506,7 @@ datum/design/scalpel_manager
req_tech = list("biotech" = 4, "materials" = 7, "magnets" = 5, "programming" = 4)
build_type = PROTOLATHE
materials = list ("$metal" = 12500, "$glass" = 7500, "$silver" = 1500, "$gold" = 1500, "$diamond" = 750)
- build_path = "/obj/item/weapon/scalpel/manager"
+ build_path = /obj/item/weapon/scalpel/manager
/////////////////////////////////////////
/////////////////Weapons/////////////////
@@ -1511,7 +1520,7 @@ datum/design/nuclear_gun
build_type = PROTOLATHE
materials = list("$metal" = 5000, "$glass" = 1000, "$uranium" = 500)
reliability_base = 76
- build_path = "/obj/item/weapon/gun/energy/gun/nuclear"
+ build_path = /obj/item/weapon/gun/energy/gun/nuclear
locked = 1
datum/design/stunrevolver
@@ -1521,7 +1530,7 @@ datum/design/stunrevolver
req_tech = list("combat" = 3, "materials" = 3, "powerstorage" = 2)
build_type = PROTOLATHE
materials = list("$metal" = 4000)
- build_path = "/obj/item/weapon/gun/energy/stunrevolver"
+ build_path = /obj/item/weapon/gun/energy/stunrevolver
locked = 1
datum/design/lasercannon
@@ -1531,7 +1540,7 @@ datum/design/lasercannon
req_tech = list("combat" = 4, "materials" = 3, "powerstorage" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 10000, "$glass" = 1000, "$diamond" = 2000)
- build_path = "/obj/item/weapon/gun/energy/lasercannon"
+ build_path = /obj/item/weapon/gun/energy/lasercannon
locked = 1
datum/design/decloner
@@ -1541,7 +1550,7 @@ datum/design/decloner
req_tech = list("combat" = 8, "materials" = 7, "biotech" = 5, "powerstorage" = 6)
build_type = PROTOLATHE
materials = list("$gold" = 5000,"$uranium" = 10000, "mutagen" = 40)
- build_path = "/obj/item/weapon/gun/energy/decloner"
+ build_path = /obj/item/weapon/gun/energy/decloner
locked = 1
datum/design/chemsprayer
@@ -1552,7 +1561,7 @@ datum/design/chemsprayer
build_type = PROTOLATHE
materials = list("$metal" = 5000, "$glass" = 1000)
reliability_base = 100
- build_path = "/obj/item/weapon/reagent_containers/spray/chemsprayer"
+ build_path = /obj/item/weapon/reagent_containers/spray/chemsprayer
datum/design/rapidsyringe
name = "Rapid Syringe Gun"
@@ -1561,7 +1570,7 @@ datum/design/rapidsyringe
req_tech = list("combat" = 3, "materials" = 3, "engineering" = 3, "biotech" = 2)
build_type = PROTOLATHE
materials = list("$metal" = 5000, "$glass" = 1000)
- build_path = "/obj/item/weapon/gun/syringe/rapidsyringe"
+ build_path = /obj/item/weapon/gun/syringe/rapidsyringe
/*
datum/design/largecrossbow
name = "Energy Crossbow"
@@ -1570,7 +1579,7 @@ datum/design/largecrossbow
req_tech = list("combat" = 4, "materials" = 5, "engineering" = 3, "biotech" = 4, "syndicate" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 5000, "$glass" = 1000, "$uranium" = 1000, "$silver" = 1000)
- build_path = "/obj/item/weapon/gun/energy/crossbow/largecrossbow"
+ build_path = /obj/item/weapon/gun/energy/crossbow/largecrossbow"
*/
datum/design/temp_gun
name = "Temperature Gun"
@@ -1579,7 +1588,7 @@ datum/design/temp_gun
req_tech = list("combat" = 3, "materials" = 4, "powerstorage" = 3, "magnets" = 2)
build_type = PROTOLATHE
materials = list("$metal" = 5000, "$glass" = 500, "$silver" = 3000)
- build_path = "/obj/item/weapon/gun/energy/temperature"
+ build_path = /obj/item/weapon/gun/energy/temperature
locked = 1
datum/design/flora_gun
@@ -1589,7 +1598,7 @@ datum/design/flora_gun
req_tech = list("materials" = 2, "biotech" = 3, "powerstorage" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 2000, "$glass" = 500, "$uranium" = 500)
- build_path = "/obj/item/weapon/gun/energy/floragun"
+ build_path = /obj/item/weapon/gun/energy/floragun
datum/design/large_grenade
name = "Large Grenade"
@@ -1599,7 +1608,7 @@ datum/design/large_grenade
build_type = PROTOLATHE
materials = list("$metal" = 3000)
reliability_base = 79
- build_path = "/obj/item/weapon/grenade/chem_grenade/large"
+ build_path = /obj/item/weapon/grenade/chem_grenade/large
datum/design/smg
name = "Submachine Gun"
@@ -1608,7 +1617,7 @@ datum/design/smg
req_tech = list("combat" = 4, "materials" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 8000, "$silver" = 2000, "$diamond" = 1000)
- build_path = "/obj/item/weapon/gun/projectile/automatic"
+ build_path = /obj/item/weapon/gun/projectile/automatic
locked = 1
datum/design/ammo_9mm
@@ -1618,7 +1627,7 @@ datum/design/ammo_9mm
req_tech = list("combat" = 4, "materials" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 3750, "$silver" = 100)
- build_path = "/obj/item/ammo_magazine/c9mm"
+ build_path = /obj/item/ammo_magazine/c9mm
datum/design/stunshell
name = "Stun Shell"
@@ -1627,7 +1636,7 @@ datum/design/stunshell
req_tech = list("combat" = 3, "materials" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 4000)
- build_path = "/obj/item/ammo_casing/shotgun/stunshell"
+ build_path = /obj/item/ammo_casing/shotgun/stunshell
datum/design/phoronpistol
name = "phoron pistol"
@@ -1636,7 +1645,7 @@ datum/design/phoronpistol
req_tech = list("combat" = 5, "phorontech" = 4)
build_type = PROTOLATHE
materials = list("$metal" = 5000, "$glass" = 1000, "$phoron" = 3000)
- build_path = "/obj/item/weapon/gun/energy/toxgun"
+ build_path = /obj/item/weapon/gun/energy/toxgun
/////////////////////////////////////////
/////////////////Mining//////////////////
/////////////////////////////////////////
@@ -1648,7 +1657,7 @@ datum/design/jackhammer
req_tech = list("materials" = 3, "powerstorage" = 2, "engineering" = 2)
build_type = PROTOLATHE
materials = list("$metal" = 2000, "$glass" = 500, "$silver" = 500)
- build_path = "/obj/item/weapon/pickaxe/jackhammer"
+ build_path = /obj/item/weapon/pickaxe/jackhammer
datum/design/drill
name = "Mining Drill"
@@ -1657,7 +1666,7 @@ datum/design/drill
req_tech = list("materials" = 2, "powerstorage" = 3, "engineering" = 2)
build_type = PROTOLATHE
materials = list("$metal" = 6000, "$glass" = 1000) //expensive, but no need for miners.
- build_path = "/obj/item/weapon/pickaxe/drill"
+ build_path = /obj/item/weapon/pickaxe/drill
datum/design/plasmacutter
name = "Plasma Cutter"
@@ -1667,7 +1676,7 @@ datum/design/plasmacutter
build_type = PROTOLATHE
materials = list("$metal" = 1500, "$glass" = 500, "$gold" = 500, "$phoron" = 500)
reliability_base = 79
- build_path = "/obj/item/weapon/pickaxe/plasmacutter"
+ build_path = /obj/item/weapon/pickaxe/plasmacutter
datum/design/pick_diamond
name = "Diamond Pickaxe"
@@ -1676,7 +1685,7 @@ datum/design/pick_diamond
req_tech = list("materials" = 6)
build_type = PROTOLATHE
materials = list("$diamond" = 3000)
- build_path = "/obj/item/weapon/pickaxe/diamond"
+ build_path = /obj/item/weapon/pickaxe/diamond
datum/design/drill_diamond
name = "Diamond Mining Drill"
@@ -1686,7 +1695,7 @@ datum/design/drill_diamond
build_type = PROTOLATHE
materials = list("$metal" = 3000, "$glass" = 1000, "$diamond" = 3750) //Yes, a whole diamond is needed.
reliability_base = 79
- build_path = "/obj/item/weapon/pickaxe/diamonddrill"
+ build_path = /obj/item/weapon/pickaxe/diamonddrill
datum/design/mesons
name = "Optical Meson Scanners"
@@ -1695,7 +1704,7 @@ datum/design/mesons
req_tech = list("magnets" = 2, "engineering" = 2)
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
- build_path = "/obj/item/clothing/glasses/meson"
+ build_path = /obj/item/clothing/glasses/meson
/////////////////////////////////////////
//////////////Blue Space/////////////////
@@ -1708,7 +1717,7 @@ datum/design/beacon
req_tech = list("bluespace" = 1)
build_type = PROTOLATHE
materials = list ("$metal" = 20, "$glass" = 10)
- build_path = "/obj/item/device/radio/beacon"
+ build_path = /obj/item/device/radio/beacon
datum/design/bag_holding
name = "Bag of Holding"
@@ -1718,8 +1727,9 @@ datum/design/bag_holding
build_type = PROTOLATHE
materials = list("$gold" = 3000, "$diamond" = 1500, "$uranium" = 250)
reliability_base = 80
- build_path = "/obj/item/weapon/storage/backpack/holding"
+ build_path = /obj/item/weapon/storage/backpack/holding
+/*
datum/design/bluespace_crystal
name = "Artificial Bluespace Crystal"
desc = "A small blue crystal with mystical properties."
@@ -1728,7 +1738,8 @@ datum/design/bluespace_crystal
build_type = PROTOLATHE
materials = list("$gold" = 1500, "$diamond" = 3000, "$phoron" = 1500)
reliability_base = 100
- build_path = "/obj/item/bluespace_crystal/artificial"
+ build_path = /obj/item/bluespace_crystal/artificial"
+*/
/////////////////////////////////////////
/////////////////HUDs////////////////////
@@ -1741,7 +1752,7 @@ datum/design/health_hud
req_tech = list("biotech" = 2, "magnets" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
- build_path = "/obj/item/clothing/glasses/hud/health"
+ build_path = /obj/item/clothing/glasses/hud/health
datum/design/security_hud
name = "Security HUD"
@@ -1750,7 +1761,7 @@ datum/design/security_hud
req_tech = list("magnets" = 3, "combat" = 2)
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
- build_path = "/obj/item/clothing/glasses/hud/security"
+ build_path = /obj/item/clothing/glasses/hud/security
locked = 1
/////////////////////////////////////////
@@ -1764,7 +1775,7 @@ datum/design/security_hud
build_type = PROTOLATHE
req_tech = list("materials" = 1)
materials = list("$gold" = 3000, "iron" = 15, "copper" = 10, "$silver" = 2500)
- build_path = "/obj/item/weapon/banhammer" */
+ build_path = /obj/item/weapon/banhammer" */
////////////////////////////////////////
//Disks for transporting design datums//
@@ -1794,7 +1805,7 @@ datum/design/borg_syndicate_module
id = "borg_syndicate_module"
build_type = MECHFAB
req_tech = list("combat" = 4, "syndicate" = 3)
- build_path = "/obj/item/borg/upgrade/syndicate"
+ build_path = /obj/item/borg/upgrade/syndicate
category = "Cyborg Upgrade Modules"
/////////////////////////////////////////
@@ -1807,7 +1818,7 @@ datum/design/binaryencrypt
req_tech = list("syndicate" = 2)
build_type = PROTOLATHE
materials = list("$metal" = 300, "$glass" = 300)
- build_path = "/obj/item/device/encryptionkey/binary"
+ build_path = /obj/item/device/encryptionkey/binary
datum/design/pda
name = "PDA"
desc = "A portable microcomputer by Thinktronic Systems, LTD. Functionality determined by a preprogrammed ROM cartridge."
@@ -1815,7 +1826,7 @@ datum/design/pda
req_tech = list("engineering" = 2, "powerstorage" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
- build_path = "/obj/item/device/pda"
+ build_path = /obj/item/device/pda
datum/design/cart_basic
name = "Generic Cartridge"
desc = "A data cartridge for portable microcomputers."
@@ -1823,7 +1834,7 @@ datum/design/cart_basic
req_tech = list("engineering" = 2, "powerstorage" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
- build_path = "/obj/item/weapon/cartridge"
+ build_path = /obj/item/weapon/cartridge
datum/design/cart_engineering
name = "Power-ON Cartridge"
desc = "A data cartridge for portable microcomputers."
@@ -1831,7 +1842,7 @@ datum/design/cart_engineering
req_tech = list("engineering" = 2, "powerstorage" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
- build_path = "/obj/item/weapon/cartridge/engineering"
+ build_path = /obj/item/weapon/cartridge/engineering
datum/design/cart_atmos
name = "BreatheDeep Cartridge"
desc = "A data cartridge for portable microcomputers."
@@ -1839,7 +1850,7 @@ datum/design/cart_atmos
req_tech = list("engineering" = 2, "powerstorage" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
- build_path = "/obj/item/weapon/cartridge/atmos"
+ build_path = /obj/item/weapon/cartridge/atmos
datum/design/cart_medical
name = "Med-U Cartridge"
desc = "A data cartridge for portable microcomputers."
@@ -1847,7 +1858,7 @@ datum/design/cart_medical
req_tech = list("engineering" = 2, "powerstorage" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
- build_path = "/obj/item/weapon/cartridge/medical"
+ build_path = /obj/item/weapon/cartridge/medical
datum/design/cart_chemistry
name = "ChemWhiz Cartridge"
desc = "A data cartridge for portable microcomputers."
@@ -1855,7 +1866,7 @@ datum/design/cart_chemistry
req_tech = list("engineering" = 2, "powerstorage" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
- build_path = "/obj/item/weapon/cartridge/chemistry"
+ build_path = /obj/item/weapon/cartridge/chemistry
datum/design/cart_security
name = "R.O.B.U.S.T. Cartridge"
desc = "A data cartridge for portable microcomputers."
@@ -1863,7 +1874,7 @@ datum/design/cart_security
req_tech = list("engineering" = 2, "powerstorage" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
- build_path = "/obj/item/weapon/cartridge/security"
+ build_path = /obj/item/weapon/cartridge/security
locked = 1
datum/design/cart_janitor
name = "CustodiPRO Cartridge"
@@ -1872,7 +1883,7 @@ datum/design/cart_janitor
req_tech = list("engineering" = 2, "powerstorage" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
- build_path = "/obj/item/weapon/cartridge/janitor"
+ build_path = /obj/item/weapon/cartridge/janitor
/*
datum/design/cart_clown
@@ -1882,7 +1893,7 @@ datum/design/cart_clown
req_tech = list("engineering" = 2, "powerstorage" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
- build_path = "/obj/item/weapon/cartridge/clown"
+ build_path = /obj/item/weapon/cartridge/clown"
datum/design/cart_mime
name = "Gestur-O 1000 Cartridge"
desc = "A data cartridge for portable microcomputers."
@@ -1890,7 +1901,7 @@ datum/design/cart_mime
req_tech = list("engineering" = 2, "powerstorage" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
- build_path = "/obj/item/weapon/cartridge/mime"
+ build_path = /obj/item/weapon/cartridge/mime"
*/
datum/design/cart_science
@@ -1900,7 +1911,7 @@ datum/design/cart_science
req_tech = list("engineering" = 2, "powerstorage" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
- build_path = "/obj/item/weapon/cartridge/science"
+ build_path = /obj/item/weapon/cartridge/signal/science
datum/design/cart_quartermaster
name = "Space Parts & Space Vendors Cartridge"
desc = "A data cartridge for portable microcomputers."
@@ -1908,7 +1919,7 @@ datum/design/cart_quartermaster
req_tech = list("engineering" = 2, "powerstorage" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
- build_path = "/obj/item/weapon/cartridge/quartermaster"
+ build_path = /obj/item/weapon/cartridge/quartermaster
locked = 1
datum/design/cart_hop
name = "Human Resources 9001 Cartridge"
@@ -1917,7 +1928,7 @@ datum/design/cart_hop
req_tech = list("engineering" = 2, "powerstorage" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
- build_path = "/obj/item/weapon/cartridge/hop"
+ build_path = /obj/item/weapon/cartridge/hop
locked = 1
datum/design/cart_hos
name = "R.O.B.U.S.T. DELUXE Cartridge"
@@ -1926,7 +1937,7 @@ datum/design/cart_hos
req_tech = list("engineering" = 2, "powerstorage" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
- build_path = "/obj/item/weapon/cartridge/hos"
+ build_path = /obj/item/weapon/cartridge/hos
locked = 1
datum/design/cart_ce
name = "Power-On DELUXE Cartridge"
@@ -1935,7 +1946,7 @@ datum/design/cart_ce
req_tech = list("engineering" = 2, "powerstorage" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
- build_path = "/obj/item/weapon/cartridge/ce"
+ build_path = /obj/item/weapon/cartridge/ce
locked = 1
datum/design/cart_cmo
name = "Med-U DELUXE Cartridge"
@@ -1944,7 +1955,7 @@ datum/design/cart_cmo
req_tech = list("engineering" = 2, "powerstorage" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
- build_path = "/obj/item/weapon/cartridge/cmo"
+ build_path = /obj/item/weapon/cartridge/cmo
locked = 1
datum/design/cart_rd
name = "Signal Ace DELUXE Cartridge"
@@ -1953,7 +1964,7 @@ datum/design/cart_rd
req_tech = list("engineering" = 2, "powerstorage" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
- build_path = "/obj/item/weapon/cartridge/rd"
+ build_path = /obj/item/weapon/cartridge/rd
locked = 1
datum/design/cart_captain
name = "Value-PAK Cartridge"
@@ -1962,5 +1973,5 @@ datum/design/cart_captain
req_tech = list("engineering" = 2, "powerstorage" = 3)
build_type = PROTOLATHE
materials = list("$metal" = 50, "$glass" = 50)
- build_path = "/obj/item/weapon/cartridge/captain"
+ build_path = /obj/item/weapon/cartridge/captain
locked = 1
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index c740beebba..7299f801be 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -46,10 +46,13 @@ 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.
+
+
/obj/machinery/computer/rdconsole/proc/CallTechName(var/ID) //A simple helper proc to find the name of a tech with a given ID.
var/datum/tech/check_tech
var/return_name = null
@@ -179,6 +182,12 @@ won't update every console in existence) but it's more of a hassle to do. Also,
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)
@@ -343,6 +352,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
spawn(16)
use_power(power)
spawn(16)
+ errored = 1
for(var/M in being_built.materials)
switch(M)
if("$metal")
@@ -376,7 +386,8 @@ won't update every console in existence) but it's more of a hassle to do. Also,
new_item.loc = linked_lathe.loc
linked_lathe.busy = 0
screen = 3.1
- updateUsrDialog()
+ errored = 0
+ updateUsrDialog()
else if(href_list["imprint"]) //Causes the Circuit Imprinter to build something.
if(linked_imprinter)
@@ -394,6 +405,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
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)
@@ -413,6 +425,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
new_item.loc = linked_imprinter.loc
linked_imprinter.busy = 0
screen = 4.1
+ errored = 0
updateUsrDialog()
else if(href_list["disposeI"] && linked_imprinter) //Causes the circuit imprinter to dispose of a single reagent (all of it)
@@ -540,6 +553,11 @@ 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//////////////////
diff --git a/code/modules/research/xenoarchaeology/areas.dm b/code/modules/research/xenoarchaeology/areas.dm
index dbd0ce91f1..e772ce380b 100644
--- a/code/modules/research/xenoarchaeology/areas.dm
+++ b/code/modules/research/xenoarchaeology/areas.dm
@@ -5,7 +5,7 @@
/area/research_outpost/hallway
name = "Research Outpost Hallway"
- icon_state = "hallC"
+ icon_state = "anohallway"
/area/research_outpost/gearstore
name = "Expedition Preparation"
@@ -69,7 +69,7 @@
/area/research_outpost/entry
name = "Research Outpost Shuttle Dock"
- icon_state = "entry"
+ icon_state = "anoentry"
/area/research_outpost/longtermstorage
name = "Long-Term Storage"
diff --git a/code/modules/research/xenoarchaeology/genetics/prehistoric_animals.dm b/code/modules/research/xenoarchaeology/genetics/prehistoric_animals.dm
index c9022726a6..df2ff6d852 100644
--- a/code/modules/research/xenoarchaeology/genetics/prehistoric_animals.dm
+++ b/code/modules/research/xenoarchaeology/genetics/prehistoric_animals.dm
@@ -12,7 +12,7 @@
speed = 2
melee_damage_lower = 5
melee_damage_upper = 15
- attacktext = "mauls"
+ attacktext = "mauled"
cold_damage_per_tick = 0
speak_chance = 5
speak = list("Hruuugh!","Hrunnph")
@@ -33,7 +33,7 @@
speed = 1
melee_damage_lower = 1
melee_damage_upper = 8
- attacktext = "gouges"
+ attacktext = "gouged"
cold_damage_per_tick = 0
speak_chance = 5
speak = list("Awrr?","Aowrl!","Worrl")
@@ -54,7 +54,7 @@
speed = 1
melee_damage_lower = 3
melee_damage_upper = 12
- attacktext = "gouges"
+ attacktext = "gouged"
cold_damage_per_tick = 0
speak_chance = 5
speak = list("Shuhn","Shrunnph?","Shunpf")
diff --git a/code/modules/security levels/keycard authentication.dm b/code/modules/security levels/keycard authentication.dm
index 33f40e4193..87514a5473 100644
--- a/code/modules/security levels/keycard authentication.dm
+++ b/code/modules/security levels/keycard authentication.dm
@@ -24,10 +24,6 @@
user << "The station AI is not to interact with these devices."
return
-/obj/machinery/keycard_auth/attack_paw(mob/user as mob)
- user << "You are too primitive to use this device."
- return
-
/obj/machinery/keycard_auth/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(stat & (NOPOWER|BROKEN))
user << "This device is not powered."
@@ -53,6 +49,8 @@
if(user.stat || stat & (NOPOWER|BROKEN))
user << "This device is not powered."
return
+ if(!user.IsAdvancedToolUser())
+ return 0
if(busy)
user << "This device is busy."
return
diff --git a/code/modules/shieldgen/shield_capacitor.dm b/code/modules/shieldgen/shield_capacitor.dm
index ed68d6ce81..2893f11b89 100644
--- a/code/modules/shieldgen/shield_capacitor.dm
+++ b/code/modules/shieldgen/shield_capacitor.dm
@@ -64,12 +64,6 @@
else
..()
-/obj/machinery/shield_capacitor/attack_paw(user as mob)
- return src.attack_hand(user)
-
-/obj/machinery/shield_capacitor/attack_ai(user as mob)
- return src.attack_hand(user)
-
/obj/machinery/shield_capacitor/attack_hand(mob/user)
if(stat & (BROKEN))
return
diff --git a/code/modules/shieldgen/shield_gen.dm b/code/modules/shieldgen/shield_gen.dm
index b330b7cac9..0573770dc7 100644
--- a/code/modules/shieldgen/shield_gen.dm
+++ b/code/modules/shieldgen/shield_gen.dm
@@ -80,9 +80,6 @@
else
..()
-/obj/machinery/shield_gen/attack_paw(user as mob)
- return src.attack_hand(user)
-
/obj/machinery/shield_gen/attack_ai(user as mob)
return src.attack_hand(user)
@@ -146,16 +143,16 @@
//figure out how much energy we need to draw from the capacitor
if(active && owned_capacitor && owned_capacitor.active)
var/target_renwick_increase = min(target_field_strength - average_field_strength, strengthen_rate) + renwick_upkeep_per_field //per field tile
-
+
var/required_energy = field.len * target_renwick_increase / energy_conversion_rate
var/assumed_charge = min(owned_capacitor.stored_charge, required_energy)
total_renwick_increase = assumed_charge * energy_conversion_rate
owned_capacitor.stored_charge -= assumed_charge
else
renwick_upkeep_per_field = max(renwick_upkeep_per_field, 0.5)
-
+
var/renwick_increase_per_field = total_renwick_increase/field.len //per field tile
-
+
average_field_strength = 0 //recalculate the average field strength
for(var/obj/effect/energy_field/E in field)
var/amount_to_strengthen = renwick_increase_per_field - renwick_upkeep_per_field
@@ -164,7 +161,7 @@
E.ticks_recovering -= 1
else
E.Strengthen(amount_to_strengthen)
-
+
average_field_strength += E.strength
average_field_strength /= field.len
@@ -190,7 +187,7 @@
strengthen_rate = between(0, strengthen_rate + text2num(href_list["strengthen_rate"]), max_strengthen_rate)
else if( href_list["target_field_strength"] )
target_field_strength = between(1, target_field_strength + text2num(href_list["target_field_strength"]), max_field_strength)
-
+
updateDialog()
/obj/machinery/shield_gen/ex_act(var/severity)
@@ -236,24 +233,24 @@
//grab the border tiles in a circle around this machine
/obj/machinery/shield_gen/proc/get_shielded_turfs()
var/list/out = list()
-
+
var/turf/gen_turf = get_turf(src)
if (!gen_turf)
return
-
+
var/turf/T
for (var/x_offset = -field_radius; x_offset <= field_radius; x_offset++)
T = locate(gen_turf.x + x_offset, gen_turf.y - field_radius, gen_turf.z)
if (T) out += T
-
+
T = locate(gen_turf.x + x_offset, gen_turf.y + field_radius, gen_turf.z)
if (T) out += T
-
+
for (var/y_offset = -field_radius+1; y_offset < field_radius; y_offset++)
T = locate(gen_turf.x - field_radius, gen_turf.y + y_offset, gen_turf.z)
if (T) out += T
-
+
T = locate(gen_turf.x + field_radius, gen_turf.y + y_offset, gen_turf.z)
if (T) out += T
-
+
return out
diff --git a/code/modules/supermatter/supermatter.dm b/code/modules/supermatter/supermatter.dm
index 9260c44346..8e74323d6e 100644
--- a/code/modules/supermatter/supermatter.dm
+++ b/code/modules/supermatter/supermatter.dm
@@ -7,10 +7,10 @@
/*
How to tweak the SM
-
+
POWER_FACTOR directly controls how much power the SM puts out at a given level of excitation (power var). Making this lower means you have to work the SM harder to get the same amount of power.
CRITICAL_TEMPERATURE The temperature at which the SM starts taking damage.
-
+
CHARGING_FACTOR Controls how much emitter shots excite the SM.
DAMAGE_RATE_LIMIT Controls the maximum rate at which the SM will take damage due to high temperatures.
*/
@@ -77,7 +77,7 @@
var/config_hallucination_power = 0.1
var/obj/item/device/radio/radio
-
+
var/debug = 0
shard //Small subtype, less efficient and more sensitive, but less boom.
@@ -203,7 +203,7 @@
//If chain reacting at oxygen == 1, we want the power at 800 K to stabilize at a power level of 250
equilibrium_power = 250
icon_state = base_icon_state
-
+
temp_factor = ( (equilibrium_power/DECAY_FACTOR)**3 )/800
power = max( (removed.temperature * temp_factor) * oxygen + power, 0)
@@ -216,13 +216,13 @@
var/heat_capacity = removed.heat_capacity()
removed.adjust_multi("phoron", max(device_energy / PHORON_RELEASE_MODIFIER, 0), \
"oxygen", max((device_energy + removed.temperature - T0C) / OXYGEN_RELEASE_MODIFIER, 0))
-
+
var/thermal_power = THERMAL_RELEASE_MODIFIER * device_energy
if (debug)
var/heat_capacity_new = removed.heat_capacity()
visible_message("[src]: Releasing [round(thermal_power)] W.")
visible_message("[src]: Releasing additional [round((heat_capacity_new - heat_capacity)*removed.temperature)] W with exhaust gasses.")
-
+
removed.add_thermal_energy(thermal_power)
removed.temperature = between(0, removed.temperature, 10000)
@@ -255,11 +255,6 @@
damage += Proj.damage * config_bullet_energy
return 0
-
-/obj/machinery/power/supermatter/attack_paw(mob/user as mob)
- return attack_hand(user)
-
-
/obj/machinery/power/supermatter/attack_robot(mob/user as mob)
if(Adjacent(user))
return attack_hand(user)
@@ -282,7 +277,7 @@
var/distance = get_dist(R, src)
if(distance <= 15)
//for collectors using standard phoron tanks at 1013 kPa, the actual power generated will be this power*POWER_FACTOR*20*29 = power*POWER_FACTOR*580
- R.receive_pulse(power * POWER_FACTOR * (min(3/distance, 1))**2)
+ R.receive_pulse(power * POWER_FACTOR * (min(3/distance, 1))**2)
return
/obj/machinery/power/supermatter/attackby(obj/item/weapon/W as obj, mob/living/user as mob)
diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm
index c15c587efd..5b40c9e5fc 100644
--- a/code/modules/vehicles/vehicle.dm
+++ b/code/modules/vehicles/vehicle.dm
@@ -100,15 +100,6 @@
else
..()
-/obj/vehicle/attack_animal(var/mob/living/simple_animal/M as mob)
- if(M.melee_damage_upper == 0) return
- health -= M.melee_damage_upper
- src.visible_message("\red [M] has [M.attacktext] [src]!")
- M.attack_log += text("\[[time_stamp()]\] attacked [src.name]")
- if(prob(10))
- new /obj/effect/decal/cleanable/blood/oil(src.loc)
- healthcheck()
-
/obj/vehicle/bullet_act(var/obj/item/projectile/Proj)
health -= Proj.damage
..()
@@ -355,4 +346,15 @@
// Stat update procs
//-------------------------------------------------------
/obj/vehicle/proc/update_stats()
- return
\ No newline at end of file
+ return
+
+/obj/vehicle/attack_generic(var/mob/user, var/damage, var/attack_message)
+ if(!damage)
+ return
+ visible_message("[user] [attack_message] the [src]!")
+ user.attack_log += text("\[[time_stamp()]\] attacked [src.name]")
+ src.health -= damage
+ if(prob(10))
+ new /obj/effect/decal/cleanable/blood/oil(src.loc)
+ spawn(1) healthcheck()
+ return 1
\ No newline at end of file
diff --git a/code/modules/virus2/curer.dm b/code/modules/virus2/curer.dm
index 44a0fd348b..d87f579d31 100644
--- a/code/modules/virus2/curer.dm
+++ b/code/modules/virus2/curer.dm
@@ -32,16 +32,11 @@
state("The [src.name] Buzzes", "blue")
return
..()
- return
+ return
/obj/machinery/computer/curer/attack_ai(var/mob/user as mob)
return src.attack_hand(user)
-/obj/machinery/computer/curer/attack_paw(var/mob/user as mob)
-
- return src.attack_hand(user)
- return
-
/obj/machinery/computer/curer/attack_hand(var/mob/user as mob)
if(..())
return
diff --git a/code/modules/virus2/diseasesplicer.dm b/code/modules/virus2/diseasesplicer.dm
index 47a4402ab4..cbab5f5f7d 100644
--- a/code/modules/virus2/diseasesplicer.dm
+++ b/code/modules/virus2/diseasesplicer.dm
@@ -36,9 +36,6 @@
/obj/machinery/computer/diseasesplicer/attack_ai(var/mob/user as mob)
return src.attack_hand(user)
-/obj/machinery/computer/diseasesplicer/attack_paw(var/mob/user as mob)
- return src.attack_hand(user)
-
/obj/machinery/computer/diseasesplicer/attack_hand(var/mob/user as mob)
if(..()) return
ui_interact(user)
diff --git a/icons/atmos/vent_scrubber.dmi b/icons/atmos/vent_scrubber.dmi
index e8e7f91640..5a40660157 100644
Binary files a/icons/atmos/vent_scrubber.dmi and b/icons/atmos/vent_scrubber.dmi differ
diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi
index 4e21b4ef9c..f160af9933 100644
Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ
diff --git a/icons/mob/custom-synthetic.dmi b/icons/mob/custom-synthetic.dmi
index fe65135750..f45b26ae19 100644
Binary files a/icons/mob/custom-synthetic.dmi and b/icons/mob/custom-synthetic.dmi differ
diff --git a/icons/mob/feet.dmi b/icons/mob/feet.dmi
index 78a2bf55bc..167be048e5 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 0f5c3a5604..56fbb33331 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/species/tajaran/helmet.dmi b/icons/mob/species/tajaran/helmet.dmi
index 988512b58c..81a64acdf4 100644
Binary files a/icons/mob/species/tajaran/helmet.dmi and b/icons/mob/species/tajaran/helmet.dmi differ
diff --git a/icons/mob/species/tajaran/mask.dmi b/icons/mob/species/tajaran/mask.dmi
new file mode 100644
index 0000000000..cf3be6425f
Binary files /dev/null and b/icons/mob/species/tajaran/mask.dmi differ
diff --git a/icons/mob/species/unathi/helmet.dmi b/icons/mob/species/unathi/helmet.dmi
index b3d6db3032..0f04946724 100644
Binary files a/icons/mob/species/unathi/helmet.dmi and b/icons/mob/species/unathi/helmet.dmi differ
diff --git a/icons/mob/species/unathi/mask.dmi b/icons/mob/species/unathi/mask.dmi
new file mode 100644
index 0000000000..cf3be6425f
Binary files /dev/null and b/icons/mob/species/unathi/mask.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index 127de82364..be8b3c2b63 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/obj/custom_items.dmi b/icons/obj/custom_items.dmi
index d640e6c860..beae558e4c 100644
Binary files a/icons/obj/custom_items.dmi and b/icons/obj/custom_items.dmi differ
diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi
index 8ae9ced1f9..93f244071a 100644
Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ
diff --git a/icons/turf/areas.dmi b/icons/turf/areas.dmi
index 606ff72de7..a163bb2ffd 100755
Binary files a/icons/turf/areas.dmi and b/icons/turf/areas.dmi differ
diff --git a/interface/interface.dm b/interface/interface.dm
index 9dd939142b..47b8067875 100644
--- a/interface/interface.dm
+++ b/interface/interface.dm
@@ -46,8 +46,9 @@ Hotkey-Mode: (hotkey-mode must be on)
\te = equip
\tr = throw
\tt = say
+\ty = emote
\tx = swap-hand
-\tz = activate held object (or y)
+\tz = activate held object
\tf = cycle-intents-left
\tg = cycle-intents-right
\t1 = help-intent
@@ -73,6 +74,10 @@ Any-Mode: (hotkey doesn't need to be on)
\tCtrl+2 = disarm-intent
\tCtrl+3 = grab-intent
\tCtrl+4 = harm-intent
+\tF1 = adminhelp
+\tF2 = ooc
+\tF3 = say
+\tF4 = emote
\tDEL = pull
\tINS = cycle-intents-right
\tHOME = drop
diff --git a/interface/skin.dmf b/interface/skin.dmf
index 9205508d66..88e08960fe 100644
--- a/interface/skin.dmf
+++ b/interface/skin.dmf
@@ -367,7 +367,7 @@ macro "hotkeymode"
is-disabled = false
elem
name = "Y"
- command = "Activate-Held-Object"
+ command = "me"
is-disabled = false
elem
name = "CTRL+Y"
diff --git a/maps/tgstation2.dmm b/maps/tgstation2.dmm
index a789754ec9..b6b6540eac 100644
--- a/maps/tgstation2.dmm
+++ b/maps/tgstation2.dmm
@@ -59,7 +59,7 @@
"abg" = (/turf/simulated/floor{icon_state = "freezerfloor"},/area/security/prison)
"abh" = (/turf/simulated/floor/plating,/area/security/brig)
"abi" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id = "Prison Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/airlock/atmos{name = "Atmospherics Maintenance"; req_access_txt = "12;24"},/turf/simulated/floor/plating,/area/security/brig)
-"abj" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = -32; pixel_y = 0},/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/air{filled = 0.05},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplatecorner"},/area/maintenance/foresolar)
+"abj" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = -32; pixel_y = 0},/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/plating{dir = 1; icon_state = "warnplatecorner"},/area/maintenance/foresolar)
"abk" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/machinery/power/smes/buildable{charge = 0},/turf/simulated/floor/plating,/area/maintenance/foresolar)
"abl" = (/obj/effect/decal/cleanable/ash,/obj/structure/closet/emcloset,/turf/simulated/floor/plating{dir = 1; icon_state = "warnplatecorner"},/area/maintenance/security_port)
"abm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/maintenance/security_starboard)
@@ -442,7 +442,7 @@
"aiz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/security/brig)
"aiA" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "cult"; dir = 2},/area/lawoffice)
"aiB" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/window/southright{base_state = "left"; dir = 4; icon_state = "left"},/obj/structure/table/reinforced,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor,/area/security/lobby)
-"aiC" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/obj/machinery/door_control{desc = "A remote control switch for the brig foyer."; id = "BrigFoyer"; name = "Brig Foyer Doors"; normaldoorcontrol = 1; pixel_x = 28; pixel_y = -15; range = 10},/turf/simulated/floor,/area/security/brig)
+"aiC" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/obj/machinery/door_control{desc = "A remote control switch for the brig foyer."; id = "BrigFoyer"; name = "Brig Foyer Doors"; normaldoorcontrol = 1; pixel_x = 28; pixel_y = -15},/turf/simulated/floor,/area/security/brig)
"aiD" = (/turf/simulated/floor{icon_state = "redcorner"; dir = 1},/area/security/lobby)
"aiE" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light/small{dir = 1},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plating,/area/maintenance/substation/security)
"aiF" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/wall,/area/maintenance/substation/security)
@@ -1142,7 +1142,7 @@
"avX" = (/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"avY" = (/turf/simulated/floor/beach/water{tag = "icon-seadeep"; icon_state = "seadeep"},/area/crew_quarters/fitness)
"avZ" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/machinery/camera{c_tag = "Dormitory Bedroom 1"},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/carpet{tag = "icon-carpet2-0"; icon_state = "carpet2-0"},/area/crew_quarters/sleep/bedrooms/one)
-"awa" = (/obj/machinery/light/small{dir = 8},/obj/structure/stool/bed,/obj/machinery/alarm{pixel_y = 23},/obj/item/weapon/bedsheet/mime,/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms/one)
+"awa" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/mime,/obj/machinery/light/small{dir = 4},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms/one)
"awb" = (/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)
"awc" = (/obj/machinery/computer/HolodeckControl,/turf/simulated/floor,/area/crew_quarters/fitness)
"awd" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor,/area/crew_quarters/fitness)
@@ -1237,7 +1237,7 @@
"axO" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/crew_quarters/fitness)
"axP" = (/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/maintenance/auxsolarstarboard)
"axQ" = (/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},/turf/simulated/floor/plating,/area/hallway/primary/port)
-"axR" = (/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/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air{filled = 0.1},/turf/simulated/floor/plating{dir = 4; icon_state = "warnplatecorner"},/area/maintenance/arrivals)
+"axR" = (/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/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/plating{dir = 4; icon_state = "warnplatecorner"},/area/maintenance/arrivals)
"axS" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/airless/catwalk{icon_state = "catwalk3"},/area/solar/auxport)
"axT" = (/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)
"axU" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "eva_airlock"; name = "EVA Airlock Console"; pixel_y = 25; req_access_txt = "0"; req_one_access_txt = "1;5;11;18;24"; tag_airpump = "eva_pump"; tag_chamber_sensor = "eva_sensor"; tag_exterior_door = "eva_outer"; tag_interior_door = "eva_inner"},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4; icon_state = "map"; tag = "icon-manifold-f (EAST)"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/maintenance/evahallway)
@@ -1277,7 +1277,7 @@
"ayC" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/primary/central_one)
"ayD" = (/obj/machinery/camera{c_tag = "Dormitory Toilets"; dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
"ayE" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/mime,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms/one)
-"ayF" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/mime,/obj/machinery/firealarm{dir = 4; layer = 3.3; pixel_x = 26},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms/one)
+"ayF" = (/obj/machinery/light_switch{pixel_x = 22; pixel_y = 10},/obj/structure/closet/secure_closet/personal,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms/one)
"ayG" = (/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 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/ai_monitored/storage/eva)
"ayH" = (/obj/structure/reagent_dispensers/fueltank,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva)
"ayI" = (/turf/simulated/floor{icon_state = "neutral"; dir = 6},/area/crew_quarters/sleep)
@@ -1379,7 +1379,7 @@
"aAA" = (/turf/simulated/wall/r_wall,/area/maintenance/auxsolarstarboard)
"aAB" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor,/area/hallway/primary/port)
"aAC" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/hallway/primary/port)
-"aAD" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air{filled = 0.05},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
+"aAD" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
"aAE" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/maintenance/evahallway)
"aAF" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/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/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/fore)
"aAG" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/junction{icon_state = "pipe-j2"; dir = 4},/turf/simulated/floor,/area/hallway/primary/fore)
@@ -1396,7 +1396,7 @@
"aAR" = (/turf/simulated/wall/r_wall,/area/storage/primary)
"aAS" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/mime,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms/one)
"aAT" = (/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/hallway/primary/port)
-"aAU" = (/obj/machinery/light_switch{pixel_x = 22; pixel_y = 10},/obj/structure/closet/secure_closet/personal,/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms/one)
+"aAU" = (/obj/machinery/light/small{dir = 8},/obj/structure/stool/bed,/obj/item/weapon/bedsheet/mime,/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms/one)
"aAV" = (/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/hallway/primary/port)
"aAW" = (/obj/machinery/computer/secure_data/detective_computer,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/security/nuke_storage)
"aAX" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/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/hallway/primary/port)
@@ -1733,7 +1733,7 @@
"aHq" = (/obj/structure/table/woodentable,/obj/item/device/paicard,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/crew_quarters/sleep)
"aHr" = (/turf/simulated/wall,/area/crew_quarters/sleep)
"aHs" = (/obj/structure/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"},/turf/simulated/floor,/area/crew_quarters/sleep)
-"aHt" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/air{filled = 0.1},/turf/simulated/floor/plating,/area/maintenance/locker)
+"aHt" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/plating,/area/maintenance/locker)
"aHu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "neutral"; dir = 4},/area/crew_quarters/sleep)
"aHv" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/mirror{pixel_x = 28},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet)
"aHw" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/crew_quarters/fitness)
@@ -2086,7 +2086,7 @@
"aOf" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "solar_chapel_airlock"; name = "interior access button"; pixel_x = 25; pixel_y = 25; req_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/obj/effect/decal/cleanable/dirt,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplate"; nitrogen = 0.01; oxygen = 0.01},/area/maintenance/auxsolarstarboard)
"aOg" = (/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)
"aOh" = (/obj/machinery/camera{c_tag = "Bridge Center"; dir = 1},/obj/machinery/requests_console{announcementConsole = 1; department = "Bridge"; departmentType = 5; name = "Bridge RC"; pixel_y = -30},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/bridge)
-"aOi" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air{filled = 0.05},/turf/simulated/floor/plating{dir = 4; icon_state = "warnplatecorner"},/area/maintenance/auxsolarstarboard)
+"aOi" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/plating{dir = 4; icon_state = "warnplatecorner"},/area/maintenance/auxsolarstarboard)
"aOj" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/secondary/entry/fore)
"aOk" = (/obj/machinery/light,/obj/machinery/newscaster{pixel_y = -28},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/bridge)
"aOl" = (/obj/machinery/door_control{id = "bridge blast"; name = "Bridge Blast Door Control"; pixel_x = -1; pixel_y = -24; req_access_txt = "19"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/bridge)
@@ -2345,7 +2345,7 @@
"aTe" = (/turf/simulated/floor{icon_state = "whitehall"; dir = 1},/area/bridge)
"aTf" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/arrivals)
"aTg" = (/turf/simulated/floor{icon_state = "whitehall"; dir = 5},/area/bridge)
-"aTh" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/mime,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/crew_quarters/sleep/bedrooms)
+"aTh" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/mime,/obj/machinery/light/small{dir = 1},/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/wood,/area/crew_quarters/sleep/bedrooms/three)
"aTi" = (/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "escape_dock_north_sensor"; pixel_x = 0; pixel_y = -25},/turf/simulated/floor/plating,/area/hallway/secondary/exit)
"aTj" = (/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)
"aTk" = (/obj/structure/stool/bed/chair/wood/wings{icon_state = "wooden_chair_wings"; dir = 8},/turf/simulated/floor/wood,/area/crew_quarters/bar)
@@ -2550,7 +2550,7 @@
"aXb" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/evahallway)
"aXc" = (/turf/simulated/wall,/area/hallway/primary/fore)
"aXd" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 6},/turf/simulated/wall,/area/maintenance/evahallway)
-"aXe" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air{filled = 0.15},/turf/simulated/floor/plating,/area/maintenance/evahallway)
+"aXe" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/plating,/area/maintenance/evahallway)
"aXf" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/floor/plating,/area/maintenance/arrivals)
"aXg" = (/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon{codes_txt = "delivery;dir=2"; freq = 1400; location = "Kitchen"},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/maintenance/bar)
"aXh" = (/turf/simulated/floor{icon_state = "neutral"; dir = 1},/area/crew_quarters/fitness)
@@ -3226,7 +3226,7 @@
"bkb" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/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{icon_state = "warnplate"; dir = 4},/area/maintenance/locker)
"bkc" = (/obj/machinery/light/small{dir = 4},/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/evahallway)
"bkd" = (/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_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/cargo)
-"bke" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air{filled = 0.15},/turf/simulated/floor/plating,/area/storage/emergency)
+"bke" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/plating,/area/storage/emergency)
"bkf" = (/obj/structure/window/shuttle,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/escape_pod5/station)
"bkg" = (/turf/simulated/floor/plating,/area/maintenance/cargo)
"bkh" = (/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/cargo)
@@ -3317,7 +3317,7 @@
"blO" = (/obj/structure/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)
"blP" = (/obj/machinery/alarm{pixel_y = 23},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/crew_quarters/heads/chief)
"blQ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/hallway/primary/aft)
-"blR" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air{filled = 0.15},/turf/simulated/floor/plating,/area/maintenance/cargo)
+"blR" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/plating,/area/maintenance/cargo)
"blS" = (/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/research_starboard)
"blT" = (/turf/simulated/wall,/area/rnd/storage)
"blU" = (/turf/simulated/wall,/area/rnd/misc_lab)
@@ -3866,7 +3866,7 @@
"bwr" = (/obj/structure/disposalpipe/segment,/obj/machinery/firealarm{dir = 4; layer = 3.3; pixel_x = 26},/turf/simulated/floor,/area/crew_quarters/heads/chief)
"bws" = (/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},/obj/structure/cable/green,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/hallway/primary/aft)
"bwt" = (/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)
-"bwu" = (/obj/machinery/keycard_auth{pixel_x = -24; pixel_y = 0},/obj/machinery/door_control{desc = "A remote control-switch for secure storage."; id = "EngineVent"; name = "Engine Ventillatory Control"; pixel_x = -24; pixel_y = 10; req_access_txt = "10"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/crew_quarters/heads/chief)
+"bwu" = (/obj/machinery/keycard_auth{pixel_x = -24; pixel_y = 0},/obj/machinery/door_control{desc = "A remote control-switch for engine core."; id = "EngineVent"; name = "Engine Ventillatory Control"; pixel_x = -24; pixel_y = 10; req_access_txt = "10"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door_control{desc = "A remote control-switch for the engine core airlock hatch bolts."; id = "engine_access_hatch"; name = "Engine Hatch Bolt Control"; normaldoorcontrol = 1; pixel_x = -24; pixel_y = -10; req_access_txt = "10"; specialfunctions = 4},/turf/simulated/floor,/area/crew_quarters/heads/chief)
"bwv" = (/obj/structure/table/reinforced,/obj/machinery/faxmachine{department = "Chief Engineer's Office"},/turf/simulated/floor,/area/crew_quarters/heads/chief)
"bww" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/clothing/glasses/meson{pixel_y = 4},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/clothing/glasses/welding/superior,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/book/manual/supermatter_engine,/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/heads/chief)
"bwx" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/hallway/primary/central_two)
@@ -4405,7 +4405,7 @@
"bGK" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/rnd/research)
"bGL" = (/obj/machinery/door/airlock/glass_research{name = "Toxins Lab"; req_access_txt = "8"},/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)
"bGM" = (/obj/machinery/portable_atmospherics/powered/scrubber,/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 2; icon_state = "whitepurple"},/area/rnd/mixing)
-"bGN" = (/obj/structure/stool/bed/chair/office/dark{dir = 1},/obj/effect/landmark/start{name = "Chief Medical Officer"},/obj/machinery/door_control{desc = "A remote control-switch for shutters."; id = "cmooffice"; name = "CMO Privacy Shutters"; pixel_x = 38; pixel_y = 21},/obj/machinery/door_control{desc = "A remote control switch for the CMO's office."; id = "cmodoor"; name = "CMO Office Door Control"; normaldoorcontrol = 1; pixel_x = 28; pixel_y = 21; range = 6},/obj/machinery/door_control{desc = "A remote control-switch for shutters."; id = "virologyquar"; name = "Virology Emergency Lockdown Control"; pixel_x = -15; pixel_y = 38; req_access_txt = "5"},/obj/machinery/door_control{desc = "A remote control-switch for shutters."; id = "medbayquar"; name = "Medbay Emergency Lockdown Control"; pixel_x = -15; pixel_y = 30; req_access_txt = "5"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo)
+"bGN" = (/obj/structure/stool/bed/chair/office/dark{dir = 1},/obj/effect/landmark/start{name = "Chief Medical Officer"},/obj/machinery/door_control{desc = "A remote control-switch for shutters."; id = "cmooffice"; name = "CMO Privacy Shutters"; pixel_x = 38; pixel_y = 21},/obj/machinery/door_control{desc = "A remote control switch for the CMO's office."; id = "cmodoor"; name = "CMO Office Door Control"; normaldoorcontrol = 1; pixel_x = 28; pixel_y = 21},/obj/machinery/door_control{desc = "A remote control-switch for shutters."; id = "virologyquar"; name = "Virology Emergency Lockdown Control"; pixel_x = -15; pixel_y = 38; req_access_txt = "5"},/obj/machinery/door_control{desc = "A remote control-switch for shutters."; id = "medbayquar"; name = "Medbay Emergency Lockdown Control"; pixel_x = -15; pixel_y = 30; req_access_txt = "5"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo)
"bGO" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/light{dir = 1},/turf/simulated/floor/engine,/area/rnd/misc_lab)
"bGP" = (/mob/living/simple_animal/cat/Runtime,/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo)
"bGQ" = (/turf/simulated/floor{tag = "icon-whiteblue (WEST)"; icon_state = "whiteblue"; dir = 8},/area/crew_quarters/heads/cmo)
@@ -4570,12 +4570,12 @@
"bJT" = (/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/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/turf/simulated/floor/plating,/area/server)
"bJU" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 500; oxygen = 0; temperature = 80},/area/server)
"bJV" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/simulated/floor{icon_state = "dark"},/area/server)
-"bJW" = (/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyerPort"; name = "Medbay Doors Control"; normaldoorcontrol = 1; pixel_x = -24; pixel_y = 26; range = 3; req_access_txt = null},/obj/machinery/computer/guestpass{pixel_x = -28},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/medical/medbay)
+"bJW" = (/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyerStar"; name = "Medbay Doors Control"; normaldoorcontrol = 1; 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)
"bJX" = (/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/office)
"bJY" = (/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = 30; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing)
"bJZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "bot"},/area/quartermaster/office)
"bKa" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/quartermaster/office)
-"bKb" = (/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyerStar"; name = "Medbay Doors Control"; normaldoorcontrol = 1; pixel_x = 24; pixel_y = 26; range = 6},/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)
+"bKb" = (/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyerPort"; name = "Medbay Doors Control"; normaldoorcontrol = 1; pixel_x = -24; pixel_y = 26; req_access_txt = null},/obj/machinery/computer/guestpass{pixel_x = -28},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/medical/medbay)
"bKc" = (/obj/structure/table,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/device/flashlight/pen,/obj/item/device/flashlight/pen,/obj/item/device/flashlight/pen,/obj/item/device/flashlight/pen,/obj/item/device/flashlight/pen,/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{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/medical/medbay3)
"bKd" = (/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)
"bKe" = (/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)
@@ -5047,7 +5047,7 @@
"bTc" = (/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)
"bTd" = (/turf/simulated/floor{icon_state = "white_1"},/area/medical/medbay)
"bTe" = (/obj/structure/grille,/turf/simulated/wall/r_wall,/area/atmos)
-"bTf" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air{filled = 0.2},/turf/simulated/floor{dir = 8; icon_state = "brown"},/area/quartermaster/miningdock)
+"bTf" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor{dir = 8; icon_state = "brown"},/area/quartermaster/miningdock)
"bTg" = (/obj/structure/table,/obj/item/weapon/storage/belt/utility,/obj/item/clothing/gloves/latex,/turf/simulated/floor{icon_state = "white"},/area/rnd/lab)
"bTh" = (/obj/machinery/autolathe,/turf/simulated/floor{icon_state = "white"},/area/rnd/lab)
"bTi" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/wall,/area/quartermaster/office)
@@ -5375,7 +5375,7 @@
"bZs" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/reception)
"bZt" = (/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)
"bZu" = (/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},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry)
-"bZv" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air{filled = 0.15},/turf/simulated/floor{icon_state = "white"},/area/rnd/docking)
+"bZv" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor{icon_state = "white"},/area/rnd/docking)
"bZw" = (/obj/machinery/computer/shuttle_control/research,/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/rnd/docking)
"bZx" = (/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "research_dock_pump"},/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "research_dock_airlock"; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; req_one_access_txt = "13;65"; tag_airpump = "research_dock_pump"; tag_chamber_sensor = "research_dock_sensor"; tag_exterior_door = "research_dock_outer"; tag_interior_door = "research_dock_inner"},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/rnd/docking)
"bZy" = (/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},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/turf/simulated/shuttle/plating,/area/rnd/docking)
@@ -6704,7 +6704,7 @@
"cyV" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor{icon_state = "blue"; dir = 6},/area/medical/surgeryobs)
"cyW" = (/turf/simulated/floor/engine/nitrogen{dir = 4; icon_state = "warnplate"; name = "plating"},/area/engine/engine_room)
"cyX" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engine/engine_room)
-"cyY" = (/obj/machinery/door_control{desc = "A remote control-switch for Surgery."; id = "Surgery"; name = "Surgery"; normaldoorcontrol = 1; pixel_x = -24; pixel_y = 8; range = 3},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 9; icon_state = "blue"},/area/medical/surgeryprep)
+"cyY" = (/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyerStar"; name = "Medbay Doors Control"; normaldoorcontrol = 1; pixel_x = 6; pixel_y = 28},/obj/structure/stool/bed/chair/office/dark{dir = 1},/obj/effect/landmark/start{name = "Medical Doctor"},/turf/simulated/floor{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/medical/reception)
"cyZ" = (/turf/simulated/floor/holofloor{dir = 10; icon_state = "green"},/area/holodeck/source_basketball)
"cza" = (/obj/structure/holohoop{dir = 1},/turf/simulated/floor/holofloor{dir = 2; icon_state = "green"},/area/holodeck/source_basketball)
"czb" = (/turf/simulated/floor/holofloor{dir = 6; icon_state = "green"},/area/holodeck/source_basketball)
@@ -7229,8 +7229,8 @@
"cJa" = (/obj/structure/table,/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/weapon/hand_labeler,/turf/simulated/floor{tag = "icon-whitegreen (NORTHWEST)"; icon_state = "whitegreen"; dir = 9},/area/rnd/xenobiology/xenoflora_storage)
"cJb" = (/obj/item/device/radio/intercom{broadcasting = 1; dir = 1; frequency = 1441; listening = 0; name = "Spec Ops Intercom"; pixel_y = 28},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
"cJc" = (/obj/structure/rack,/obj/item/weapon/gun/energy/ionrifle,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
-"cJd" = (/obj/structure/stool/bed,/turf/unsimulated/floor{icon_state = "floorscorched1"},/area/prison/solitary)
-"cJe" = (/obj/effect/decal/cleanable/cobweb2,/turf/unsimulated/floor{icon_state = "platingdmg1"},/area/prison/solitary)
+"cJd" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/donut_box,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom)
+"cJe" = (/obj/machinery/autolathe{desc = "Your typical Autolathe. It appears to have much more options than your regular one, however..."; hacked = 1; name = "Unlocked Autolathe"},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom)
"cJf" = (/obj/structure/stool/bed,/turf/unsimulated/floor{name = "plating"},/area/prison/solitary)
"cJg" = (/turf/unsimulated/floor{icon_state = "panelscorched"},/area/prison/solitary)
"cJh" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/wall,/area/prison/solitary)
@@ -7259,12 +7259,12 @@
"cJE" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom)
"cJF" = (/turf/simulated/floor/engine/nitrogen,/area/engine/engine_room)
"cJG" = (/obj/effect/landmark{name = "prisonwarp"},/turf/unsimulated/floor{name = "plating"},/area/prison/solitary)
-"cJH" = (/turf/unsimulated/floor{icon_state = "floorgrime"},/area/prison/solitary)
+"cJH" = (/obj/machinery/shieldwallgen,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
"cJI" = (/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/control)
"cJJ" = (/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control)
"cJK" = (/turf/unsimulated/wall,/area/centcom/test)
"cJL" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/research_port)
-"cJM" = (/obj/structure/rack,/obj/item/ammo_magazine/c9mm,/obj/item/ammo_magazine/c9mm,/obj/item/ammo_magazine/c9mm,/obj/item/ammo_magazine/c9mm,/obj/item/ammo_magazine/c9mm,/obj/item/ammo_magazine/c9mm,/obj/item/weapon/gun/projectile/automatic,/obj/item/weapon/gun/projectile/automatic,/obj/item/weapon/gun/projectile/automatic,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
+"cJM" = (/turf/space,/area/centcom)
"cJN" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control)
"cJO" = (/obj/structure/table,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control)
"cJP" = (/obj/structure/closet/secure_closet/security,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control)
@@ -7274,7 +7274,7 @@
"cJT" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 9},/area/centcom/specops)
"cJU" = (/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"},/turf/simulated/floor/plating,/area/maintenance/substation/engineering)
"cJV" = (/obj/structure/rack,/obj/item/weapon/gun/grenadelauncher,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
-"cJW" = (/obj/structure/stool/bed,/turf/unsimulated/floor{icon_state = "platingdmg3"},/area/prison/solitary)
+"cJW" = (/obj/structure/table/reinforced,/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay,/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay,/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay,/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay,/obj/item/mecha_parts/mecha_equipment/repair_droid,/obj/item/mecha_parts/mecha_equipment/repair_droid,/obj/item/mecha_parts/mecha_equipment/repair_droid,/obj/item/mecha_parts/mecha_equipment/repair_droid,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
"cJX" = (/turf/unsimulated/floor{icon_state = "platingdmg1"},/area/prison/solitary)
"cJY" = (/obj/structure/stool/bed,/turf/unsimulated/floor{icon_state = "panelscorched"},/area/prison/solitary)
"cJZ" = (/obj/structure/stool/bed,/obj/effect/decal/cleanable/cobweb,/turf/unsimulated/floor{name = "plating"},/area/prison/solitary)
@@ -7296,7 +7296,7 @@
"cKp" = (/obj/machinery/door/window/northleft,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control)
"cKq" = (/obj/mecha/working/ripley/firefighter,/turf/unsimulated/floor{icon_state = "delivery"; dir = 6},/area/centcom/specops)
"cKr" = (/obj/machinery/power/supermatter{layer = 4},/obj/machinery/mass_driver{id = "enginecore"},/turf/simulated/floor/engine/nitrogen{icon_state = "gcircuit"; name = "floor"},/area/engine/engine_room)
-"cKs" = (/turf/unsimulated/floor{icon_state = "floorscorched1"},/area/prison/solitary)
+"cKs" = (/obj/machinery/door/airlock/centcom{name = "Special Operations Command"; opacity = 1; req_access_txt = "103"},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom)
"cKt" = (/turf/unsimulated/floor{icon_state = "floorscorched2"},/area/prison/solitary)
"cKu" = (/obj/machinery/door/airlock/centcom{name = "Maintenance Access"; opacity = 1; req_access_txt = "106"},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/control)
"cKv" = (/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/control)
@@ -7311,9 +7311,9 @@
"cKE" = (/obj/structure/table/woodentable,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control)
"cKF" = (/obj/structure/table/woodentable,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control)
"cKG" = (/obj/structure/stool/bed/chair{dir = 8},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control)
-"cKH" = (/obj/machinery/door/poddoor{icon_state = "pdoor1"; id = "ASSAULT1"; name = "Launch Bay #1"; p_open = 0},/turf/unsimulated/floor{name = "plating"},/area/centcom/specops)
-"cKI" = (/obj/machinery/mass_driver{dir = 8; id = "ASSAULT1"; name = "gravpult"},/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/specops)
-"cKJ" = (/obj/structure/rack,/obj/item/weapon/storage/box/flashbangs,/obj/item/weapon/storage/box/flashbangs,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
+"cKH" = (/obj/machinery/door/poddoor{icon_state = "pdoor1"; id = "ASSAULT0"; name = "Launch Bay #0"; p_open = 0},/turf/unsimulated/floor{name = "plating"},/area/centcom)
+"cKI" = (/obj/machinery/door/airlock/centcom{name = "Special Operations Mechbay "; opacity = 1; req_access_txt = "103"},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom)
+"cKJ" = (/obj/machinery/camera{c_tag = "Assault Armor South"; dir = 1; network = list("ERT")},/turf/unsimulated/floor{icon_state = "loadingarea"; dir = 8},/area/centcom)
"cKK" = (/turf/unsimulated/floor{icon_state = "greencorner"},/area/centcom/control)
"cKL" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 8},/area/centcom/control)
"cKM" = (/obj/machinery/door/airlock/centcom{name = "Research Facility"; opacity = 1; req_access_txt = "104"},/turf/unsimulated/floor{icon_state = "delivery"},/area/centcom/test)
@@ -7325,7 +7325,7 @@
"cKS" = (/obj/machinery/vending/tool,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
"cKT" = (/obj/machinery/vending/engivend,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
"cKU" = (/obj/machinery/vending/engineering,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
-"cKV" = (/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/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,/obj/item/weapon/storage/briefcase/inflatable,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom)
+"cKV" = (/obj/machinery/mass_driver{dir = 8; id = "ASSAULT0"; name = "gravpult"},/turf/unsimulated/floor{icon_state = "bot"},/area/centcom)
"cKW" = (/obj/machinery/power/smes/buildable{charge = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/maintenance/substation/engineering)
"cKX" = (/turf/unsimulated/floor{icon_state = "dark"},/area/centcom)
"cKY" = (/obj/machinery/power/smes/buildable{charge = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/substation/engineering)
@@ -7343,9 +7343,9 @@
"cLk" = (/obj/machinery/sleep_console,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/test)
"cLl" = (/obj/structure/stool/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control)
"cLm" = (/obj/structure/table/woodentable,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control)
-"cLn" = (/obj/machinery/door/poddoor{icon_state = "pdoor1"; id = "ASSAULT0"; name = "Launch Bay #0"; p_open = 0},/turf/unsimulated/floor{name = "plating"},/area/centcom/specops)
-"cLo" = (/obj/machinery/mass_driver{dir = 8; id = "ASSAULT0"; name = "gravpult"},/turf/unsimulated/floor{icon_state = "bot"},/area/centcom/specops)
-"cLp" = (/obj/machinery/camera{c_tag = "Assault Armor South"; dir = 1; network = list("ERT")},/turf/unsimulated/floor{icon_state = "loadingarea"; dir = 8},/area/centcom/specops)
+"cLn" = (/obj/effect/landmark{name = "Marauder Exit"},/turf/unsimulated/floor{name = "plating"},/area/centcom)
+"cLo" = (/obj/machinery/porta_turret,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
+"cLp" = (/obj/structure/table/reinforced,/obj/item/device/pda/ert,/obj/item/device/pda/ert,/obj/item/device/pda/ert,/obj/item/device/pda/ert,/obj/item/device/pda/ert,/obj/item/device/pda/ert,/obj/item/device/pda/ert,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
"cLq" = (/obj/machinery/door/window{dir = 1; name = "Cell"; req_access_txt = "150"},/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/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start)
"cLr" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 9},/area/centcom)
"cLs" = (/obj/machinery/camera{c_tag = "Virology Access Fore"; dir = 4; network = list("SS13","Research")},/turf/simulated/floor,/area/medical/virologyaccess)
@@ -7459,7 +7459,7 @@
"cNw" = (/obj/structure/stool/bed/chair{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control)
"cNx" = (/obj/structure/stool/bed/chair{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control)
"cNy" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor,/area/centcom/control)
-"cNz" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/flashbangs,/obj/item/weapon/handcuffs,/obj/item/device/flash,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/storage/belt/security,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops)
+"cNz" = (/obj/machinery/chem_master,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom)
"cNA" = (/obj/item/device/radio/intercom{broadcasting = 1; dir = 8; listening = 0; name = "Station Intercom (General)"; pixel_x = -28},/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/creed)
"cNB" = (/obj/structure/closet/secure_closet/injection,/turf/unsimulated/floor{icon_state = "white"},/area/centcom/control)
"cNC" = (/obj/structure/stool/bed/chair{dir = 1},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/control)
@@ -7467,8 +7467,8 @@
"cNE" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Operating Theatre 1"; req_access_txt = "45"},/turf/simulated/floor,/area/medical/surgeryprep)
"cNF" = (/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/medical/surgeryprep)
"cNG" = (/turf/simulated/floor/plating,/area/maintenance/research_port)
-"cNH" = (/obj/structure/table/reinforced,/obj/item/device/flash,/obj/item/device/flash,/obj/item/weapon/reagent_containers/spray/cleaner{pixel_x = 6; pixel_y = 3},/obj/item/weapon/reagent_containers/spray/cleaner{pixel_x = 6; pixel_y = 3},/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/weapon/reagent_containers/spray/plantbgone,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
-"cNI" = (/obj/structure/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/head/helmet/space/rig/ert/medical,/obj/item/clothing/suit/space/rig/ert/medical,/obj/item/clothing/tie/storage/black_vest,/obj/item/clothing/shoes/magboots,/obj/item/clothing/head/helmet/space/rig/ert/medical,/obj/item/clothing/suit/space/rig/ert/medical,/obj/item/clothing/tie/storage/black_vest,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops)
+"cNH" = (/obj/machinery/chem_dispenser/meds,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom)
+"cNI" = (/obj/structure/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/head/helmet/space/rig/ert/medical,/obj/item/clothing/suit/space/rig/ert/medical,/obj/item/clothing/tie/storage/black_vest,/obj/item/clothing/shoes/magboots,/obj/item/clothing/head/helmet/space/rig/ert/medical,/obj/item/clothing/suit/space/rig/ert/medical,/obj/item/clothing/tie/storage/black_vest,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
"cNJ" = (/obj/item/weapon/mop,/obj/structure/mopbucket,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
"cNK" = (/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/reagent_containers/glass/bucket{amount_per_transfer_from_this = 50},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
"cNL" = (/obj/machinery/telecomms/relay/preset/centcom,/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/creed)
@@ -7500,15 +7500,15 @@
"cOl" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 8},/turf/unsimulated/floor,/area/shuttle/specops/centcom)
"cOm" = (/obj/structure/table/reinforced,/obj/item/device/radio/intercom{broadcasting = 0; dir = 1; frequency = 1443; listening = 1; name = "Spec Ops Intercom"; pixel_y = 28},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom)
"cOn" = (/obj/structure/lattice,/obj/structure/grille,/obj/structure/lattice,/turf/space,/area/space)
-"cOo" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/belt/security,/obj/item/weapon/storage/belt/security,/obj/item/weapon/storage/belt/security,/obj/item/weapon/storage/belt/security,/obj/item/device/flash,/obj/item/device/flash,/obj/item/device/flash,/obj/item/device/flash,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/baton/loaded,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
+"cOo" = (/obj/structure/rack,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
"cOp" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom)
"cOq" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom)
"cOr" = (/obj/machinery/computer/operating,/turf/unsimulated/floor{dir = 1; icon_state = "whitehall"; tag = "icon-whitehall (SOUTHEAST)"},/area/centcom/holding)
"cOs" = (/turf/unsimulated/floor{tag = "icon-escapecorner (EAST)"; icon_state = "escapecorner"; dir = 4},/area/centcom/holding)
"cOt" = (/turf/unsimulated/floor{icon_state = "white"},/area/centcom/holding)
"cOu" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/simulated/shuttle/plating,/area/centcom/holding)
-"cOv" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/computer/security/telescreen{desc = ""; name = "Spec. Ops. Monitor"; network = list("ERT"); pixel_y = 30},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom)
-"cOw" = (/obj/structure/table/reinforced,/obj/item/weapon/gun/energy/gun/nuclear,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
+"cOv" = (/obj/structure/table/reinforced,/obj/item/device/pda/ert,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom)
+"cOw" = (/obj/structure/table/reinforced,/obj/item/mecha_parts/mecha_equipment/tool/extinguisher,/obj/item/mecha_parts/mecha_equipment/tool/rcd,/obj/item/weapon/pickaxe/diamonddrill,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
"cOx" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/maintenance{name = "Engine Waste Handling"; req_one_access_txt = "10;24"},/turf/simulated/floor/plating,/area/maintenance/engi_engine)
"cOy" = (/turf/unsimulated/wall,/area/centcom/ferry)
"cOz" = (/obj/structure/table,/obj/item/weapon/storage/box/gloves{pixel_x = 3; pixel_y = 4},/obj/item/weapon/storage/box/masks{pixel_x = 0; pixel_y = 0},/turf/unsimulated/floor{dir = 4; icon_state = "whitegreen"},/area/centcom/holding)
@@ -7523,7 +7523,7 @@
"cOI" = (/turf/space,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/specops/centcom)
"cOJ" = (/obj/structure/closet/secure_closet/medical2,/turf/unsimulated/floor{tag = "icon-escapecorner (EAST)"; icon_state = "escapecorner"; dir = 4},/area/centcom/holding)
"cOK" = (/turf/unsimulated/beach/sand{tag = "icon-seashallow"; icon_state = "seashallow"},/area/centcom/ferry)
-"cOL" = (/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{pixel_x = -1; pixel_y = -3},/obj/item/clothing/glasses/sunglasses/sechud{pixel_y = 3},/obj/item/clothing/glasses/sunglasses/sechud{pixel_y = 3},/obj/item/clothing/glasses/sunglasses/sechud{pixel_y = 3},/obj/item/clothing/glasses/sunglasses/sechud{pixel_y = 3},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
+"cOL" = (/obj/structure/table/reinforced,/obj/item/device/aicard,/obj/item/weapon/pinpointer/advpinpointer,/obj/item/weapon/stamp/centcomm,/turf/unsimulated/floor{icon_state = "blue"},/area/centcom)
"cOM" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom)
"cON" = (/obj/structure/reagent_dispensers/fueltank,/obj/effect/decal/cleanable/blood/oil{amount = 0},/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/research_port)
"cOO" = (/turf/unsimulated/beach/sand{tag = "icon-beachcorner"; icon_state = "beachcorner"},/area/centcom/ferry)
@@ -7538,7 +7538,7 @@
"cOX" = (/turf/simulated/wall,/area/maintenance/engi_engine)
"cOY" = (/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom)
"cOZ" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom)
-"cPa" = (/obj/machinery/door/airlock/hatch{icon_state = "door_locked"; locked = 1; req_access_txt = "10"},/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor/plating,/area/engine/engine_room)
+"cPa" = (/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyerPort"; name = "Medbay Doors Control"; normaldoorcontrol = 1; pixel_x = -16; pixel_y = 28; req_access_txt = null},/obj/structure/stool/bed/chair/office/dark{dir = 1},/obj/effect/landmark/start{name = "Medical Doctor"},/turf/simulated/floor{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/medical/reception)
"cPb" = (/turf/unsimulated/beach/sand{tag = "icon-desert"; icon_state = "desert"},/area/centcom/ferry)
"cPc" = (/turf/unsimulated/floor{tag = "icon-whitehall (EAST)"; icon_state = "whitehall"; dir = 4},/area/centcom/holding)
"cPd" = (/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/engi_engine)
@@ -7623,7 +7623,7 @@
"cQE" = (/obj/structure/table/woodentable{dir = 5},/obj/machinery/chem_dispenser/beer,/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/holding)
"cQF" = (/obj/structure/table/woodentable{dir = 5},/obj/item/weapon/book/manual/barman_recipes,/obj/item/weapon/reagent_containers/glass/rag,/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/holding)
"cQG" = (/obj/structure/table/woodentable{dir = 5},/obj/machinery/chem_dispenser/soda,/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/holding)
-"cQH" = (/obj/machinery/door/airlock/hatch{icon_state = "door_locked"; locked = 1; req_access_txt = "10"},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/plating,/area/engine/engine_room)
+"cQH" = (/obj/machinery/door_control{desc = "A remote control-switch for Surgery."; id = "Surgery"; name = "Surgery"; normaldoorcontrol = 1; pixel_x = -24; pixel_y = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 9; icon_state = "blue"},/area/medical/surgeryprep)
"cQI" = (/turf/unsimulated/floor{dir = 8; icon_state = "whitegreen"},/area/centcom/holding)
"cQJ" = (/obj/machinery/atmospherics/tvalve/digital/bypass{dir = 1; icon_state = "map_tvalve0"; state = 0},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator)
"cQK" = (/obj/machinery/power/terminal,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/substation/engineering)
@@ -8502,7 +8502,7 @@
"dhz" = (/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_txt = "10;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)
"dhA" = (/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/mine/west_outpost)
"dhB" = (/obj/machinery/power/solar_control{id = "starboardsolar"; name = "Aft Starboard Solar Control"; track = 0},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplatecorner"},/area/maintenance/starboardsolar)
-"dhC" = (/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/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air{filled = 0.1},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplatecorner"},/area/maintenance/starboardsolar)
+"dhC" = (/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/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/plating{dir = 1; icon_state = "warnplatecorner"},/area/maintenance/starboardsolar)
"dhD" = (/obj/structure/table,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/stack/medical/advanced/bruise_pack,/obj/item/weapon/retractor,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
"dhE" = (/obj/structure/table,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/item/stack/medical/advanced/bruise_pack,/obj/item/weapon/retractor,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery2)
"dhF" = (/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 = 1; icon_state = "warnplatecorner"},/area/maintenance/engineering)
@@ -8575,7 +8575,7 @@
"diU" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "centcom_shuttle_bay"; name = "shuttle bay controller"; pixel_x = 0; pixel_y = 25; req_access_txt = "0"; req_one_access_txt = "0"; tag_door = "centcom_shuttle_bay_door"},/turf/unsimulated/floor{name = "plating"},/area/centcom/ferry)
"diV" = (/obj/machinery/door/airlock/external{frequency = 1380; glass = 1380; icon_state = "door_locked"; id_tag = "centcom_shuttle_bay_door"; locked = 1; name = "Transport Airlock"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/ferry)
"diW" = (/obj/machinery/computer/shuttle_control{req_access = null; req_access_txt = "101"; shuttle_tag = "Centcom"},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom)
-"diX" = (/obj/machinery/camera{c_tag = "Spec. Ops. Shuttle"; dir = 2; network = list("ERT")},/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "specops_shuttle_port"; name = "port docking hatch controller"; pixel_x = 0; pixel_y = 25; req_access_txt = "0"; req_one_access_txt = "0"; tag_door = "specops_shuttle_port_hatch"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom)
+"diX" = (/obj/structure/table/reinforced,/obj/item/device/megaphone,/obj/item/clothing/glasses/sunglasses/sechud,/obj/item/weapon/storage/box/trackimp,/obj/item/weapon/storage/box/cdeathalarm_kit,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops)
"diY" = (/obj/machinery/computer/shuttle_control/specops,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom)
"diZ" = (/obj/machinery/computer/shuttle_control/emergency,/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom)
"dja" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "specops_shuttle_fore_hatch"; locked = 1; name = "Forward Docking Hatch"; req_access_txt = "13"},/turf/simulated/shuttle/plating,/area/shuttle/specops/centcom)
@@ -8710,7 +8710,7 @@
"dlz" = (/turf/space/transit/east/shuttlespace_ew15,/area/space)
"dlA" = (/obj/machinery/door/airlock/maintenance_hatch,/turf/simulated/floor/plating/airless,/area/constructionsite/hallway/aft)
"dlB" = (/turf/space/transit/east/shuttlespace_ew1,/area/space)
-"dlC" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/air{filled = 0.05},/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/tcommsat/entrance)
+"dlC" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/tcommsat/entrance)
"dlD" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/djstation)
"dlE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplate"; nitrogen = 0.01; oxygen = 0.01},/area/maintenance/research_port)
"dlF" = (/obj/machinery/door/airlock/maintenance_hatch,/turf/simulated/wall,/area/constructionsite/hallway/aft)
@@ -8725,7 +8725,7 @@
"dlO" = (/obj/machinery/computer/mech_bay_power_console,/turf/simulated/floor/plating,/area/djstation)
"dlP" = (/turf/simulated/floor/mech_bay_recharge_floor,/area/djstation)
"dlQ" = (/turf/space/transit/east/shuttlespace_ew12,/area/space)
-"dlR" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister/air{filled = 0.15},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/djstation)
+"dlR" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/djstation)
"dlS" = (/turf/space/transit/east/shuttlespace_ew8,/area/space)
"dlT" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/wall{icon_state = "iron3"},/area/space)
"dlU" = (/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/wall{icon_state = "iron3"},/area/space)
@@ -8762,8 +8762,8 @@
"dmz" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/djstation)
"dmA" = (/obj/machinery/door/poddoor{id = "constructiondriver1"; name = "Construction Driver Door"},/turf/simulated/floor/plating,/area/djstation)
"dmB" = (/obj/structure/stool/bed/chair{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom)
-"dmC" = (/obj/structure/rack,/obj/item/clothing/head/helmet/space/rig/ert/medical,/obj/item/clothing/suit/space/rig/ert/medical,/obj/item/clothing/head/helmet/space/rig/ert/medical,/obj/item/clothing/suit/space/rig/ert/medical,/obj/item/clothing/head/helmet/space/rig/ert/medical,/obj/item/clothing/suit/space/rig/ert/medical,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
-"dmD" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
+"dmC" = (/obj/structure/table/reinforced,/obj/item/mecha_parts/mecha_equipment/teleporter,/obj/item/mecha_parts/mecha_tracking,/obj/item/mecha_parts/mecha_tracking,/obj/item/mecha_parts/mecha_tracking,/obj/item/mecha_parts/mecha_tracking,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
+"dmD" = (/obj/machinery/mech_bay_recharge_port,/turf/unsimulated/floor{icon_state = "bot"},/area/centcom)
"dmE" = (/obj/structure/rack,/obj/item/clothing/suit/armor/vest/ert/engineer,/obj/item/clothing/suit/armor/vest/ert/engineer,/obj/item/clothing/suit/armor/vest/ert/engineer,/obj/item/clothing/suit/armor/vest/ert/engineer,/obj/item/clothing/head/helmet/ert/engineer,/obj/item/clothing/head/helmet/ert/engineer,/obj/item/clothing/head/helmet/ert/engineer,/obj/item/clothing/head/helmet/ert/engineer,/obj/item/weapon/storage/backpack/ert/engineer,/obj/item/weapon/storage/backpack/ert/engineer,/obj/item/weapon/storage/backpack/ert/engineer,/obj/item/weapon/storage/backpack/ert/engineer,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
"dmF" = (/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/east/shuttlespace_ew3,/area/space)
"dmG" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns4,/area/space)
@@ -8771,12 +8771,12 @@
"dmI" = (/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/east/shuttlespace_ew1,/area/space)
"dmJ" = (/obj/machinery/recharge_station,/turf/simulated/floor/plating,/area/djstation)
"dmK" = (/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/floor/plating,/area/djstation)
-"dmL" = (/obj/structure/rack,/obj/item/clothing/suit/armor/vest/ert/security,/obj/item/clothing/suit/armor/vest/ert/security,/obj/item/clothing/suit/armor/vest/ert/security,/obj/item/clothing/suit/armor/vest/ert/security,/obj/item/clothing/head/helmet/ert/security,/obj/item/clothing/head/helmet/ert/security,/obj/item/clothing/head/helmet/ert/security,/obj/item/clothing/head/helmet/ert/security,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
+"dmL" = (/obj/mecha/working/hoverpod,/turf/unsimulated/floor{icon_state = "delivery"; dir = 6},/area/centcom)
"dmM" = (/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/east/shuttlespace_ew7,/area/space)
"dmN" = (/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/east/shuttlespace_ew5,/area/space)
"dmO" = (/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/east/shuttlespace_ew4,/area/space)
"dmP" = (/obj/effect/landmark{name = "Response Team"},/obj/effect/landmark{name = "Commando"},/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
-"dmQ" = (/obj/structure/table/reinforced,/obj/item/device/multitool,/obj/item/device/multitool,/obj/item/device/flash,/obj/item/device/flash,/obj/item/weapon/rcd,/obj/item/weapon/rcd,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom)
+"dmQ" = (/obj/structure/table/reinforced,/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp,/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp,/obj/item/mecha_parts/mecha_equipment/tool/passenger,/obj/item/mecha_parts/mecha_equipment/tool/passenger,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
"dmR" = (/obj/machinery/door/poddoor{id = "constructiondriver0"; name = "Construction Driver Door"},/turf/simulated/floor/plating,/area/djstation)
"dmS" = (/obj/machinery/door/poddoor{icon_state = "pdoor1"; id = "ASSAULT"; name = "Assault Armor Storage"; p_open = 0},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom)
"dmT" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/obj/item/weapon/handcuffs,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom)
@@ -8792,7 +8792,7 @@
"dnd" = (/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/east/shuttlespace_ew8,/area/space)
"dne" = (/obj/machinery/sleeper,/turf/simulated/floor/airless{icon_state = "white"},/area/constructionsite/medical)
"dnf" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/constructionsite/site)
-"dng" = (/obj/structure/table/reinforced,/obj/item/clothing/glasses/meson,/obj/item/clothing/glasses/meson,/obj/item/clothing/glasses/meson,/obj/item/clothing/glasses/meson,/obj/item/weapon/storage/belt/utility/full,/obj/item/weapon/storage/belt/utility/full,/obj/item/weapon/storage/belt/utility/full,/obj/item/weapon/storage/belt/utility/full,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom)
+"dng" = (/obj/structure/rack,/obj/item/clothing/suit/armor/vest/ert/command,/obj/item/clothing/head/helmet/ert/command,/obj/item/weapon/storage/backpack/ert/commander,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops)
"dnh" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/shuttle/constructionsite/site)
"dni" = (/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/constructionsite/site)
"dnj" = (/obj/machinery/computer/atmos_alert,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/constructionsite/site)
@@ -8886,7 +8886,7 @@
"doT" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; stopper = 0; tiles = 0},/turf/space/transit/east/shuttlespace_ew10,/area/space)
"doU" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored)
"doV" = (/obj/structure/rack,/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/wood{amount = 30},/obj/item/stack/sheet/wood{amount = 30},/obj/item/stack/sheet/wood{amount = 30},/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},/turf/simulated/floor/plating,/area/djstation)
-"doW" = (/obj/structure/rack,/obj/item/weapon/storage/backpack/ert/security,/obj/item/weapon/storage/backpack/ert/security,/obj/item/weapon/storage/backpack/ert/security,/obj/item/weapon/storage/backpack/ert/security,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
+"doW" = (/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 32},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom)
"doX" = (/obj/machinery/conveyor_switch{id = "anotempload"; name = "conveyor switch"; pixel_x = 0; pixel_y = 0; req_access_txt = "65"},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored)
"doY" = (/obj/machinery/conveyor_switch{id = "anosample"; req_access_txt = "65"},/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored)
"doZ" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor/plating,/area/research_outpost/maint)
@@ -8899,17 +8899,17 @@
"dpg" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew5,/area/space)
"dph" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdownside"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north/shuttlespace_ns3,/area/space)
"dpi" = (/obj/mecha/medical/odysseus/loaded,/turf/unsimulated/floor{icon_state = "delivery"; dir = 6},/area/centcom/specops)
-"dpj" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/bodybags,/obj/item/weapon/storage/firstaid/o2,/obj/item/weapon/storage/firstaid/regular,/obj/item/device/flash,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/device/flash,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/pill_bottle/antitox,/obj/item/weapon/storage/pill_bottle/kelotane,/obj/item/weapon/storage/pill_bottle/kelotane,/obj/item/weapon/storage/pill_bottle/antitox,/obj/item/weapon/storage/pill_bottle/kelotane,/obj/item/weapon/storage/firstaid/adv,/obj/item/weapon/storage/firstaid/adv,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
+"dpj" = (/obj/structure/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/head/helmet/space/rig/ert/commander,/obj/item/clothing/suit/space/rig/ert/commander,/obj/item/clothing/tie/storage/black_vest,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
"dpk" = (/obj/structure/transit_tube{icon_state = "N-S"},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored)
"dpl" = (/obj/machinery/mass_driver{dir = 4; id = "research"},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored)
"dpm" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 8; name = "thrower_escapeshuttletop(left)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns3,/area/space)
"dpn" = (/obj/machinery/portable_atmospherics/powered/scrubber,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
"dpo" = (/obj/structure/table,/obj/item/device/camera,/obj/item/weapon/stamp,/obj/item/weapon/folder,/turf/simulated/floor/wood,/area/research_outpost/hallway)
"dpp" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "specops_centcom_dock"; name = "docking port controller"; pixel_x = 0; pixel_y = -25; req_access_txt = "0"; req_one_access_txt = "103"; tag_door = "specops_centcom_dock_door"},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom)
-"dpq" = (/obj/structure/rack,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
-"dpr" = (/obj/structure/rack,/obj/item/bodybag,/obj/item/bodybag,/obj/item/bodybag,/obj/item/bodybag,/obj/item/bodybag,/obj/item/bodybag,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
+"dpq" = (/turf/unsimulated/floor{icon_state = "loadingarea"; dir = 8},/area/centcom)
+"dpr" = (/obj/machinery/mass_driver{dir = 8; id = "ASSAULT1"; name = "gravpult"},/turf/unsimulated/floor{icon_state = "bot"},/area/centcom)
"dps" = (/obj/structure/table/holotable,/obj/machinery/readybutton{pixel_y = 0},/turf/simulated/floor/holofloor{dir = 9; icon_state = "red"},/area/holodeck/source_thunderdomecourt)
-"dpt" = (/obj/structure/rack,/obj/item/weapon/storage/backpack/ert/medical,/obj/item/weapon/storage/backpack/ert/medical,/obj/item/weapon/storage/backpack/ert/medical,/obj/item/weapon/storage/backpack/ert/medical,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
+"dpt" = (/obj/machinery/door/poddoor{icon_state = "pdoor1"; id = "ASSAULT1"; name = "Launch Bay #1"; p_open = 0},/turf/unsimulated/floor{name = "plating"},/area/centcom)
"dpu" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew12,/area/space)
"dpv" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/transit_tube{icon_state = "S-NE"},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored)
"dpw" = (/obj/structure/disposaloutlet{dir = 2},/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/transit_tube{icon_state = "D-NW"},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored)
@@ -9294,7 +9294,7 @@
"dwL" = (/obj/structure/mirror{dir = 4; pixel_x = -32; pixel_y = 0},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
"dwM" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/wall/r_wall,/area/research_outpost/power)
"dwN" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/simulated/floor,/area/mine/living_quarters)
-"dwO" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air{filled = 0.15},/turf/simulated/floor/plating,/area/djstation)
+"dwO" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/plating,/area/djstation)
"dwP" = (/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 = 10},/turf/simulated/floor/plating,/area/atmos)
"dwQ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/mine/abandoned)
"dwR" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless,/area/mine/abandoned)
@@ -9454,7 +9454,7 @@
"dzP" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating/airless,/area/djstation/solars)
"dzQ" = (/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/shuttle/constructionsite/site)
"dzR" = (/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "engineering_station_sensor"; pixel_x = -25; pixel_y = 8},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/plating,/area/djstation)
-"dzS" = (/obj/machinery/camera{c_tag = "Research Outpost Expedition Airlock"; dir = 2; network = list("Research","SS13")},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored)
+"dzS" = (/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
"dzT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/research_outpost/gearstore)
"dzU" = (/obj/structure/closet/hydrant{pixel_x = -32},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/plating,/area/research_outpost/maintstore2)
"dzV" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=CHE"; location = "AIE"},/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)
@@ -9647,7 +9647,7 @@
"dDA" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Brig"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start)
"dDB" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/research_outpost/hallway)
"dDC" = (/obj/machinery/door/window{base_state = "left"; dir = 8; icon_state = "left"; name = "Preparation"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start)
-"dDD" = (/obj/structure/rack,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/grenade/smokebomb,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
+"dDD" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/flashbangs,/obj/item/weapon/handcuffs,/obj/item/device/flash,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/storage/belt/security,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom)
"dDE" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/research_outpost/hallway)
"dDF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/research_outpost/hallway)
"dDG" = (/obj/machinery/telecomms/allinone{intercept = 1},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start)
@@ -9734,7 +9734,7 @@
"dFj" = (/obj/structure/transit_tube/station{dir = 8; icon_state = "closed"},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/mine/explored)
"dFk" = (/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/research_outpost/gearstore)
"dFl" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{dir = 1},/turf/simulated/floor,/area/atmos)
-"dFm" = (/obj/structure/table/reinforced,/obj/item/device/aicard,/obj/item/weapon/pinpointer/advpinpointer,/turf/unsimulated/floor{icon_state = "blue"},/area/centcom/specops)
+"dFm" = (/obj/structure/table/reinforced,/obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill,/obj/item/mecha_parts/mecha_equipment/tool/cable_layer,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
"dFn" = (/obj/machinery/optable,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start)
"dFo" = (/obj/machinery/conveyor{dir = 2; id = "anominerals"},/obj/machinery/mineral/output,/turf/simulated/floor{icon_state = "floorgrime"},/area/research_outpost/tempstorage)
"dFp" = (/turf/simulated/floor/airless{dir = 5; icon_state = "asteroidfloor"},/area/mine/explored)
@@ -9748,7 +9748,7 @@
"dFx" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start)
"dFy" = (/obj/structure/table,/obj/item/device/flashlight/lamp,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/research_outpost/iso1)
"dFz" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 0},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/research_outpost/iso2)
-"dFA" = (/obj/structure/table/reinforced,/obj/item/device/megaphone,/obj/item/clothing/glasses/sunglasses/sechud,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops)
+"dFA" = (/obj/structure/table/reinforced,/obj/item/weapon/gun/energy/gun/nuclear,/obj/item/weapon/hand_tele,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom)
"dFB" = (/obj/structure/table,/obj/item/device/flashlight/lamp,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/research_outpost/iso2)
"dFC" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 0},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/research_outpost/iso3)
"dFD" = (/obj/effect/landmark{name = "Nuclear-Bomb"},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start)
@@ -10039,7 +10039,7 @@
"dLc" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/hos,/turf/unsimulated/floor{icon_state = "grimy"},/area/syndicate_mothership)
"dLd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/research_outpost/hallway)
"dLe" = (/turf/simulated/floor,/area/mine/eva)
-"dLf" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/washing_machine,/turf/simulated/floor,/area/research_outpost/hallway)
+"dLf" = (/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/research_outpost/hallway)
"dLg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/research_outpost/power)
"dLh" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 32; pixel_y = 0},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{dir = 4; icon_state = "whitepurple"},/area/research_outpost/hallway)
"dLi" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1379; id_tag = "mining_east_pump"},/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/eva)
@@ -10534,11 +10534,11 @@
"dUD" = (/obj/machinery/door/airlock/atmos{name = "Outpost Atmospherics"; req_access_txt = "0"; req_one_access_txt = "65;10;24"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor/plating,/area/research_outpost/atmos)
"dUE" = (/obj/structure/table,/obj/machinery/bunsen_burner,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/research_outpost/sample)
"dUF" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/filingcabinet/medical{pixel_y = 0},/turf/simulated/floor{icon_state = "blue"; dir = 4},/area/medical/reception)
-"dUG" = (/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyerStar"; name = "Medbay Doors Control"; normaldoorcontrol = 1; pixel_x = 6; pixel_y = 28; range = 6},/obj/structure/stool/bed/chair/office/dark{dir = 1},/obj/effect/landmark/start{name = "Medical Doctor"},/turf/simulated/floor{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/medical/reception)
+"dUG" = (/obj/machinery/door/airlock/hatch{icon_state = "door_locked"; id_tag = "engine_access_hatch"; locked = 1; req_access_txt = "10"},/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor/plating,/area/engine/engine_room)
"dUH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/research_outpost/maintstore1)
"dUI" = (/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/research_outpost/anomaly)
"dUJ" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/computer/crew,/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/medical/reception)
-"dUK" = (/obj/machinery/door_control{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyerPort"; name = "Medbay Doors Control"; normaldoorcontrol = 1; pixel_x = -16; pixel_y = 28; range = 3; req_access_txt = null},/obj/structure/stool/bed/chair/office/dark{dir = 1},/obj/effect/landmark/start{name = "Medical Doctor"},/turf/simulated/floor{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/medical/reception)
+"dUK" = (/obj/machinery/door/airlock/hatch{icon_state = "door_locked"; id_tag = "engine_access_hatch"; locked = 1; req_access_txt = "10"},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/plating,/area/engine/engine_room)
"dUL" = (/obj/structure/table,/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)
"dUM" = (/obj/structure/window/shuttle{icon_state = "window2"},/obj/structure/grille,/turf/simulated/shuttle/plating,/area/centcom/evac)
"dUN" = (/obj/structure/table,/obj/item/weapon/flame/lighter/random,/obj/item/weapon/crowbar,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/research_outpost/anomaly)
@@ -10945,7 +10945,7 @@
"ecy" = (/obj/structure/lattice,/obj/item/weapon/shard{icon_state = "medium"},/turf/space,/area/space)
"ecz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology)
"ecA" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/glass_research{name = "Outpost Primary Access"; req_access_txt = "65"},/turf/simulated/floor,/area/research_outpost/entry)
-"ecB" = (/obj/structure/window/reinforced{dir = 5},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/wood,/area/research_outpost/hallway)
+"ecB" = (/obj/structure/window/reinforced{dir = 5},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/wood,/area/research_outpost/med)
"ecC" = (/turf/simulated/floor/plating/airless,/area/engine/engine_eva_maintenance)
"ecD" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "research_outpost_hatch"; locked = 1; name = "Research Outpost Docking Hatch"; req_access_txt = "13"},/turf/simulated/floor/plating,/area/research_outpost/entry)
"ecE" = (/obj/structure/transit_tube{icon_state = "E-SW"},/obj/structure/lattice,/turf/space,/area/space)
@@ -10985,7 +10985,7 @@
"edm" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "engineering_dock_airlock"; name = "interior access button"; pixel_x = -30; pixel_y = -25; req_access_txt = "0"; req_one_access_txt = "13;11;24"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/engi_shuttle)
"edn" = (/obj/machinery/conveyor{dir = 9; id = "anotempload"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/research_outpost/tempstorage)
"edo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplatecorner"},/area/maintenance/engi_shuttle)
-"edp" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air{filled = 0.15},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplatecorner"},/area/maintenance/engi_shuttle)
+"edp" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air/airlock,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplatecorner"},/area/maintenance/engi_shuttle)
"edq" = (/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/engine/engine_smes)
"edr" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
"eds" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/window/westleft{base_state = "right"; icon_state = "right"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/research_outpost/tempstorage)
@@ -11026,7 +11026,7 @@
"eeb" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 0; external_pressure_bound_default = 0; frequency = 1441; icon_state = "map_vent_in"; initialize_directions = 1; internal_pressure_bound = 4000; internal_pressure_bound_default = 4000; on = 1; pressure_checks = 2; pressure_checks_default = 2; pump_direction = 0},/obj/structure/window/reinforced/tinted{dir = 8; health = 1000; icon_state = "twindow"; name = "hardened window"; opacity = 0},/obj/structure/window/reinforced/tinted{dir = 1; health = 1000; icon_state = "twindow"; name = "hardened window"; opacity = 0},/turf/simulated/floor/engine{name = "Outpost N2"; nitrogen = 20000; oxygen = 0},/area/research_outpost/atmos)
"eec" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/research{name = "Anomalous Materials Sample Preparation"; req_access_txt = "65"},/turf/simulated/floor{icon_state = "white"},/area/research_outpost/anomaly)
"eed" = (/obj/structure/cable/yellow,/turf/simulated/floor/airless/catwalk{icon_state = "catwalk3"},/area/solar/port)
-"eee" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = -32; pixel_y = 0},/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/air{filled = 0.05},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplatecorner"},/area/maintenance/portsolar)
+"eee" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = -32; pixel_y = 0},/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/plating{dir = 1; icon_state = "warnplatecorner"},/area/maintenance/portsolar)
"eef" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; external_pressure_bound_default = 0; frequency = 1441; icon_state = "map_vent_in"; initialize_directions = 1; internal_pressure_bound = 4000; internal_pressure_bound_default = 4000; on = 1; pressure_checks = 2; pressure_checks_default = 2; pump_direction = 0},/obj/structure/window/reinforced/tinted{dir = 4; health = 1000; icon_state = "twindow"; name = "hardened window"; opacity = 0},/obj/structure/window/reinforced/tinted{dir = 1; health = 1000; icon_state = "twindow"; name = "hardened window"; opacity = 0},/turf/simulated/floor/engine{name = "Outpost O2"; nitrogen = 0; oxygen = 5000},/area/research_outpost/atmos)
"eeg" = (/obj/structure/closet/wardrobe/black,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplatecorner"},/area/maintenance/engi_engine)
"eeh" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/airless/catwalk{icon_state = "catwalk12"},/area/solar/port)
@@ -11049,7 +11049,7 @@
"eey" = (/obj/structure/transit_tube{icon_state = "S-NE"},/obj/structure/lattice,/turf/space,/area/space)
"eez" = (/obj/structure/transit_tube{icon_state = "NW-SE"},/obj/structure/lattice,/turf/space,/area/space)
"eeA" = (/obj/structure/lattice,/obj/structure/transit_tube{icon_state = "D-NE"},/turf/space,/area/space)
-"eeB" = (/obj/structure/rack,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/weapon/gun/energy/stunrevolver,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
+"eeB" = (/obj/structure/table/reinforced,/obj/item/device/multitool,/obj/item/device/multitool,/obj/item/device/flash,/obj/item/device/flash,/obj/item/weapon/rcd,/obj/item/weapon/rcd,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd,/obj/item/weapon/rcd,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom)
"eeC" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/maintenance{name = "Auxiliary Storage"; req_access_txt = "0"; req_one_access_txt = "65;12"},/turf/simulated/floor{icon_state = "white"},/area/research_outpost/maintstore1)
"eeD" = (/obj/machinery/power/solar_control{id = "portsolar"; name = "Aft Port Solar Control"; track = 0},/obj/structure/cable/yellow,/turf/simulated/floor/plating{dir = 4; icon_state = "warnplatecorner"},/area/maintenance/portsolar)
"eeE" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating{dir = 4; icon_state = "warnplatecorner"},/area/maintenance/engi_engine)
@@ -11083,7 +11083,7 @@
"efg" = (/obj/structure/closet{name = "Prisoner's Locker"},/obj/random/tech_supply,/obj/item/clothing/head/flatcap,/turf/simulated/floor{icon_state = "floorgrime"},/area/security/prison)
"efh" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/floor/plating,/area/engine/engine_room)
"efi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor{icon_state = "warning"},/area/mine/living_quarters)
-"efj" = (/obj/structure/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/head/helmet/space/rig/ert/commander,/obj/item/clothing/suit/space/rig/ert/commander,/obj/item/clothing/tie/storage/black_vest,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom)
+"efj" = (/obj/machinery/pipedispenser/orderable,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
"efk" = (/obj/machinery/atmospherics/unary/heat_exchanger{dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/engine/engine_waste)
"efl" = (/obj/machinery/atmospherics/pipe/manifold/visible/purple,/turf/simulated/floor/plating,/area/engine/engine_waste)
"efm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/decal/cleanable/blood/oil,/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/meter{frequency = 1443; id = "engine_waste_compressor_two"; name = "Engine Waste - Compressor 2"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engine/engine_waste)
@@ -11104,18 +11104,18 @@
"efB" = (/obj/structure/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)
"efC" = (/obj/structure/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/head/helmet/space/rig/ert/security,/obj/item/clothing/suit/space/rig/ert/security,/obj/item/clothing/tie/storage/black_vest,/obj/item/clothing/shoes/magboots,/obj/item/clothing/head/helmet/space/rig/ert/security,/obj/item/clothing/suit/space/rig/ert/security,/obj/item/clothing/tie/storage/black_vest,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
"efD" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/floor/plating,/area/djstation)
-"efE" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air{filled = 0.05},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/mine/production)
+"efE" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/mine/production)
"efF" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/turf/simulated/floor/plating,/area/djstation)
"efG" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/obj/machinery/meter,/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/turf/simulated/floor/plating,/area/djstation)
"efH" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/djstation)
"efI" = (/obj/structure/toilet{pixel_y = 8},/obj/machinery/light/small{dir = 4},/turf/simulated/floor{icon_state = "freezerfloor"},/area/djstation)
"efJ" = (/obj/structure/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,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom)
"efK" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom)
-"efL" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
-"efM" = (/obj/structure/rack,/obj/item/weapon/storage/backpack/security,/obj/item/clothing/under/syndicate/combat,/obj/item/clothing/shoes/galoshes,/obj/item/clothing/head/bio_hood/janitor,/obj/item/clothing/suit/bio_suit/janitor,/obj/item/clothing/gloves/purple,/obj/item/clothing/glasses/science,/obj/item/weapon/storage/backpack/security,/obj/item/clothing/under/syndicate/combat,/obj/item/clothing/shoes/galoshes,/obj/item/clothing/head/bio_hood/janitor,/obj/item/clothing/suit/bio_suit/janitor,/obj/item/clothing/gloves/purple,/obj/item/clothing/glasses/science,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
-"efN" = (/obj/structure/rack,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
-"efO" = (/obj/structure/table/reinforced,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
-"efP" = (/obj/structure/rack,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
+"efL" = (/obj/machinery/shieldgen,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
+"efM" = (/obj/structure/table/reinforced,/obj/item/mecha_parts/mecha_equipment/weapon/energy/ion,/obj/item/mecha_parts/mecha_equipment/weapon/energy/taser,/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster,/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
+"efN" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/handcuffs,/obj/item/clothing/glasses/sunglasses/sechud{pixel_y = 3},/obj/item/clothing/glasses/sunglasses/sechud{pixel_y = 3},/obj/item/clothing/glasses/sunglasses/sechud{pixel_y = 3},/obj/item/clothing/glasses/sunglasses/sechud{pixel_y = 3},/obj/item/clothing/glasses/thermal,/obj/item/clothing/glasses/thermal,/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,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
+"efO" = (/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/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,/obj/item/weapon/storage/briefcase/inflatable,/obj/item/stack/sheet/rglass{amount = 50},/obj/item/stack/sheet/rglass{amount = 50},/obj/item/stack/sheet/rglass{amount = 50},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom)
+"efP" = (/obj/structure/rack,/obj/item/weapon/storage/box/flashbangs,/obj/item/weapon/storage/box/flashbangs,/obj/item/weapon/storage/box/emps,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/grenade/smokebomb,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
"efQ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; external_pressure_bound = 140; external_pressure_bound_default = 140; icon_state = "map_vent_out"; on = 1; pressure_checks = 0; pressure_checks_default = 0},/turf/simulated/floor/plating/airless,/area/research_outpost/atmos)
"efR" = (/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},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/rnd/docking)
"efS" = (/turf/simulated/floor{icon_state = "white"},/area/rnd/docking)
@@ -11225,6 +11225,44 @@
"ehS" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "mining_west_pump"},/obj/structure/closet/walllocker/emerglocker/west,/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/living_quarters)
"ehT" = (/obj/machinery/camera{c_tag = "Sleeper Room"; dir = 1; network = list("MINE")},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor{icon_state = "white"},/area/mine/living_quarters)
"ehU" = (/obj/structure/disposalpipe/segment,/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/item/device/radio/intercom{freerange = 1; frequency = 1459; name = "Station Intercom (General)"; pixel_x = -27},/turf/simulated/floor,/area/mine/production)
+"ehV" = (/obj/machinery/pipedispenser/disposal/orderable,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
+"ehW" = (/obj/structure/table/reinforced,/obj/item/mecha_parts/mecha_equipment/tool/sleeper,/obj/item/mecha_parts/mecha_equipment/tool/sleeper,/obj/item/mecha_parts/mecha_equipment/tool/syringe_gun,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
+"ehX" = (/obj/structure/rack,/obj/item/clothing/suit/armor/vest/ert/security,/obj/item/clothing/suit/armor/vest/ert/security,/obj/item/clothing/suit/armor/vest/ert/security,/obj/item/clothing/suit/armor/vest/ert/security,/obj/item/clothing/head/helmet/ert/security,/obj/item/clothing/head/helmet/ert/security,/obj/item/clothing/head/helmet/ert/security,/obj/item/clothing/head/helmet/ert/security,/obj/item/weapon/storage/backpack/ert/security,/obj/item/weapon/storage/backpack/ert/security,/obj/item/weapon/storage/backpack/ert/security,/obj/item/weapon/storage/backpack/ert/security,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
+"ehY" = (/obj/structure/rack,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/weapon/tank/jetpack/oxygen,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom)
+"ehZ" = (/obj/structure/table/reinforced,/obj/item/device/flash,/obj/item/device/flash,/obj/item/device/flash,/obj/item/device/flash,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/storage/belt/security,/obj/item/weapon/storage/belt/security,/obj/item/weapon/storage/belt/security,/obj/item/weapon/storage/belt/security,/obj/item/taperoll/police,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
+"eia" = (/obj/machinery/vending/security,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom)
+"eib" = (/obj/structure/table/reinforced,/obj/item/clothing/glasses/meson,/obj/item/clothing/glasses/meson,/obj/item/clothing/glasses/meson,/obj/item/clothing/glasses/meson,/obj/item/weapon/storage/belt/utility/full,/obj/item/weapon/storage/belt/utility/full,/obj/item/weapon/storage/belt/utility/full,/obj/item/weapon/storage/belt/utility/full,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/clothing/gloves/yellow,/obj/item/weapon/grenade/chem_grenade/metalfoam,/obj/item/weapon/grenade/chem_grenade/metalfoam,/obj/item/taperoll/engineering,/obj/item/clothing/glasses/welding/superior,/obj/item/clothing/glasses/welding/superior,/obj/item/clothing/glasses/welding/superior,/obj/item/clothing/glasses/welding/superior,/obj/item/clothing/glasses/welding/superior,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom)
+"eic" = (/obj/machinery/vending/assist,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
+"eid" = (/obj/structure/rack,/obj/item/ammo_magazine/a762,/obj/item/ammo_magazine/a762,/obj/item/ammo_magazine/a762,/obj/item/ammo_magazine/a762,/obj/item/weapon/gun/projectile/automatic/l6_saw,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops)
+"eie" = (/obj/structure/rack,/obj/item/weapon/gun/energy/gun/nuclear,/obj/item/weapon/gun/energy/gun/nuclear,/obj/item/weapon/gun/energy/gun/nuclear,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom)
+"eif" = (/obj/structure/rack,/obj/item/weapon/gun/energy/gun,/obj/item/weapon/gun/energy/gun,/obj/item/weapon/gun/energy/gun,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
+"eig" = (/obj/structure/rack,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
+"eih" = (/obj/structure/rack,/obj/item/ammo_magazine/c9mm,/obj/item/ammo_magazine/c9mm,/obj/item/ammo_magazine/c9mm,/obj/item/ammo_magazine/c9mm,/obj/item/ammo_magazine/c9mm,/obj/item/ammo_magazine/c9mm,/obj/item/ammo_magazine/c9mm,/obj/item/ammo_magazine/c9mm,/obj/item/ammo_magazine/c9mm,/obj/item/weapon/gun/projectile/automatic,/obj/item/weapon/gun/projectile/automatic,/obj/item/weapon/gun/projectile/automatic,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
+"eii" = (/obj/machinery/door/poddoor{icon_state = "pdoor1"; id = "ASSAULT"; name = "Assault Weapon Storage"; p_open = 0},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops)
+"eij" = (/obj/machinery/camera{c_tag = "Spec. Ops. Shuttle"; dir = 2; network = list("ERT")},/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom)
+"eik" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "specops_shuttle_port"; name = "port docking hatch controller"; pixel_x = 0; pixel_y = 25; req_access_txt = "0"; req_one_access_txt = "0"; tag_door = "specops_shuttle_port_hatch"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom)
+"eil" = (/obj/machinery/computer/security/telescreen{desc = ""; name = "Spec. Ops. Monitor"; network = list("ERT"); pixel_y = 30},/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom)
+"eim" = (/obj/machinery/computer/communications,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom)
+"ein" = (/obj/machinery/computer/prisoner{name = "Implant Management"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom)
+"eio" = (/obj/structure/table/reinforced,/obj/item/device/megaphone,/obj/item/device/megaphone,/obj/item/device/megaphone,/obj/item/device/megaphone,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
+"eip" = (/obj/structure/rack,/obj/item/weapon/storage/backpack/security,/obj/item/clothing/under/syndicate/combat,/obj/item/clothing/shoes/galoshes,/obj/item/clothing/head/bio_hood/janitor,/obj/item/clothing/suit/bio_suit/janitor,/obj/item/clothing/gloves/purple,/obj/item/clothing/glasses/science,/obj/item/weapon/storage/backpack/security,/obj/item/clothing/under/syndicate/combat,/obj/item/clothing/shoes/galoshes,/obj/item/clothing/head/bio_hood/janitor,/obj/item/clothing/suit/bio_suit/janitor,/obj/item/clothing/gloves/purple,/obj/item/clothing/glasses/science,/obj/item/weapon/reagent_containers/spray/cleaner{pixel_x = 6; pixel_y = 3},/obj/item/weapon/reagent_containers/spray/cleaner{pixel_x = 6; pixel_y = 3},/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
+"eiq" = (/obj/structure/rack,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/weapon/gun/energy/stunrevolver,/obj/item/weapon/gun/energy/stunrevolver,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
+"eir" = (/obj/structure/table/reinforced,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
+"eis" = (/obj/structure/table/reinforced,/obj/item/roller,/obj/item/roller,/obj/item/roller,/obj/item/roller,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom)
+"eit" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/bodybags,/obj/item/weapon/storage/firstaid/o2,/obj/item/weapon/storage/firstaid/regular,/obj/item/device/flash,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/clothing/glasses/hud/health,/obj/item/device/flash,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/pill_bottle/antitox,/obj/item/weapon/storage/pill_bottle/kelotane,/obj/item/weapon/storage/pill_bottle/kelotane,/obj/item/weapon/storage/pill_bottle/antitox,/obj/item/weapon/storage/pill_bottle/kelotane,/obj/item/weapon/storage/firstaid/adv,/obj/item/weapon/storage/firstaid/adv,/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/storage/firstaid/fire,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
+"eiu" = (/obj/machinery/iv_drip,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
+"eiv" = (/obj/structure/closet/crate/medical,/obj/item/weapon/circular_saw,/obj/item/weapon/surgicaldrill,/obj/item/weapon/bonegel{pixel_x = 4; pixel_y = 3},/obj/item/weapon/bonesetter,/obj/item/weapon/scalpel,/obj/item/weapon/retractor{pixel_x = 0; pixel_y = 6},/obj/item/weapon/hemostat{pixel_y = 4},/obj/item/weapon/cautery{pixel_y = 4},/obj/item/weapon/FixOVein{pixel_x = -6; pixel_y = 1},/obj/item/stack/nanopaste,/obj/item/weapon/tank/anesthetic,/obj/item/clothing/mask/breath/medical,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
+"eiw" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom)
+"eix" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/autoinjectors,/obj/item/weapon/storage/box/beakers,/obj/item/weapon/storage/box/gloves,/obj/item/weapon/storage/box/pillbottles,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom)
+"eiy" = (/obj/structure/rack,/obj/item/clothing/suit/armor/vest/ert/medical,/obj/item/clothing/suit/armor/vest/ert/medical,/obj/item/clothing/suit/armor/vest/ert/medical,/obj/item/clothing/suit/armor/vest/ert/medical,/obj/item/clothing/head/helmet/ert/medical,/obj/item/clothing/head/helmet/ert/medical,/obj/item/clothing/head/helmet/ert/medical,/obj/item/clothing/head/helmet/ert/medical,/obj/item/weapon/storage/backpack/ert/medical,/obj/item/weapon/storage/backpack/ert/medical,/obj/item/weapon/storage/backpack/ert/medical,/obj/item/weapon/storage/backpack/ert/medical,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
+"eiz" = (/obj/machinery/shield_gen,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom)
+"eiA" = (/obj/machinery/shield_capacitor,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
+"eiB" = (/obj/machinery/shieldgen,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom)
+"eiC" = (/obj/machinery/power/emitter,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
+"eiD" = (/obj/structure/table/reinforced,/obj/item/weapon/circuitboard/aiupload,/obj/item/weapon/circuitboard/borgupload,/obj/item/weapon/circuitboard/smes,/obj/item/weapon/aiModule/nanotrasen,/obj/item/weapon/aiModule/reset,/obj/item/weapon/aiModule/freeformcore,/obj/item/weapon/aiModule/protectStation,/obj/item/weapon/aiModule/quarantine,/obj/item/weapon/aiModule/paladin,/obj/item/weapon/aiModule/robocop,/obj/item/weapon/aiModule/safeguard,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
+"eiE" = (/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 32},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom)
+"eiF" = (/obj/structure/window/reinforced{dir = 5},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/wood,/area/research_outpost/entry)
+"eiG" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/camera{c_tag = "Research Outpost Expedition Airlock"; dir = 4; network = list("Research","SS13")},/turf/simulated/floor/plating,/area/research_outpost/gearstore)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -11324,11 +11362,11 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadVoahbdVoaaaaaaaaaaaaaaaaaaaaaaaDaaeanYanRanRanRanRaoaaocaobaofaofaofaofasDaaeaaDaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaagCagBagAagXagyagzagxagwagvaguagtagsagVaaBaaBagWagTagUasEaaBagPaaPagQagSagMagNagOaVHagJasFagLaXcaiaaiaaiaaiaaiaahpasSasGatcatcatfatfatCatlatKatHatHatMaihaihaiRaiiauhatWaiSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaeahcahcahcahcahcaaealUaaeahcahcahcahcahcaaeaaDaaaaaaaaaaaaaaaaaaaaaaaaajiajiajiajiajiajiajiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaRzaWiaRzaaaaaaaaaaaaaaaaaaaaaaaDaaeajJajJajJajJajJaaealXaaeajJajJajJajJajJaaeaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVEagBajSagXaiTajKaeFaVFaVGahrajMaWUahNaVTaVTaVUaZpaaBabxaaBaVYaaPaWdaWcbyUbcKaWgaVHaVIausaVLaXcauJauwauwauKauMauKauRauQavcavcavcavcavcavcavcavcavcasSavdahhaibahnaVPaVQaVOaaeavsavgavgavtavgavgavuaaeaaaaaaaaaaamaaaaaaaaaaaeaaaaaaaaaalUaaaaaaaaaaaeaaaaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaaaajiajiajiajiajiajiajiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasjaPXaslaaaasmaPYasoaaaaaeaSTavzaSTaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaeaaaaaaaaaalXaaaaaaaaaaaeaaaaaaaaaaamaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaakhaWraWsagXagXagXaeFaeFaeFaeFaaPaaPaaPaaPaaPbataaBaaxavJagRaWwaaPaaPaaPaaiaaiaaiaVHaKWavLaWxaXcaVyavcavcavcavcaHravNaHraGVaPHavPavOaNpavQaRQaOParTbgtasPasPasPasPasPasPasPasPaWjasRasRasRasRasRaWjasPaaaaaaaaaaaDaaeaiNaiNaiNaiNaiNaaealUaaeaiNaiNaiNaiNaiNaaeaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaajiajiajiajiajiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavRasTbdJasTavRasVbdPasVavRaaeaSTavSaXfaaaaaaaaaaaaaaaaaaaaaaaDaaeahqahqahqahqahqaaealXaaeahqahqahqahqahqaaeaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaXdaXeakOaXbaRBakhaaeaaeaaPavTbdSabgbbBbbobbCaaBajkaaBabxagRaWXaQFaXaaWYaWWbbNefgaVHatzavUaWQaXcaVyavWawaavZawgaHrawzaAvaGVaPHaPCaXwawPawBaOGaOParTaWLaWKaJsavYaRgaKkaXhaRxasPaWIasRasRasRasRasRaWjasPaaeaaaaaaaamaaeamIamKamKamKamKanlamYanGanAanAanAanAanHaaeaaDaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavRasTbdJasTavRasVbdPasVavRaaeaSTavSaXfaaaaaaaaaaaaaaaaaaaaaaaDaaeahqahqahqahqahqaaealXaaeahqahqahqahqahqaaeaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaXdaXeakOaXbaRBakhaaeaaeaaPavTbdSabgbbBbbobbCaaBajkaaBabxagRaWXaQFaXaaWYaWWbbNefgaVHatzavUaWQaXcaVyavWaAUavZawgaHrawzaAvaGVaPHaPCaXwawPawBaOGaOParTaWLaWKaJsavYaRgaKkaXhaRxasPaWIasRasRasRasRasRaWjasPaaeaaaaaaaamaaeamIamKamKamKamKanlamYanGanAanAanAanAanHaaeaaDaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawXasTatIasTawXasVatJasVawXaPIaXAaXzaXDaXBaXBaXCaPIaPIaaeaaaaaDaaeanYanRanRanRanRaoaaocaobaofaofaofaofasDaaeaaDaaaaaaaaaaaaaaaaaaaaaaaaakhakhakhaXxakhakhajSaRBakhaaaaaaaaPbfPaaPaXybeBbewaaPbegbebaaBaXqaXsaXsaXuaXtaXsaXrbeNbeCaVHawYavUaQBaXcawZavWaxcaxbawgaHraxkauiaGVaPHaPCaXwaOEaXjaxnaOParTaXlaXmaJsavYavYaKkaYjaMmaTsaXiasRasRasRasRasRaXnasPasPasPaaaaamaaaahcahcahcahcahcaaealUaaeahcahcahcahcahcaaaaaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawXauzaWOauBawXauCaWuauEawXaQaaxKaxCaxRaPLaPOaPZaPGaPIaaaaaaaaAaaaajJajJajJajJajJaaeaxSaaeajJajJajJajJajJaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaQlaQeaxTaxUaQuaxVaQnaQcakhaaaaaaaaPaaPaaPaQdaOQaOFaaPaORaOWaQSaQZaQTaQLaQFaQPaQOaQRaOtaOzaVHaxXavUaxYaXcaVyavWayEayvayFaHrayJauiaGVaGVaGVaQxaGWaPzaGVaGVarTaPxaPqaJsavYavYaKkaSBaJCaKiaPBasRasRasRasRasRaGUaVxaVwavraaaaamaaaaaeaaaaaeaaeaaaaaaayUaaaaaaaaeaaaaaaaaeaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawXauzaWOauBawXauCaWuauEawXaQaaxKaxCaxRaPLaPOaPZaPGaPIaaaaaaaaAaaaajJajJajJajJajJaaeaxSaaeajJajJajJajJajJaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaQlaQeaxTaxUaQuaxVaQnaQcakhaaaaaaaaPaaPaaPaQdaOQaOFaaPaORaOWaQSaQZaQTaQLaQFaQPaQOaQRaOtaOzaVHaxXavUaxYaXcaVyavWayEayvawaaHrayJauiaGVaGVaGVaQxaGWaPzaGVaGVarTaPxaPqaJsavYavYaKkaSBaJCaKiaPBasRasRasRasRasRaGUaVxaVwavraaaaamaaaaaeaaaaaeaaeaaaaaaayUaaaaaaaaeaaaaaaaaeaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaawXayVayXayWawXayVayXayWawXaRwazeayYazoazoazoayYazpaRzaaaaaaaaDaaaaaeaaaaaeaaeaaaaaaazqaaaaaaaaeaaaaaaaaeaaaaaDaaeaaaaaaaaeaaeaaaaaaaaeaRDaQeazrazsaQuazxaRBazyakhaaeaaLaQjaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaaiaVHazCavUaSlaXcaVyavWazGazFazIazHazRazQazSatBaSPaSeaRfaReaRfazTavVaRaaRcaKPaviaviaKPaSFaKXaLaawbasRasRasRasRasRawbawcawdaweaaaaamaamaaDaaaaaaaaeaaaaaaaiQaaaaaeaaeaaeaaeaaDaaDaaDaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaavRawXazVazUavRawXazWazUavRawXazXawXawXawXawXawXazYaSTaaaaaaaaDaaDaaDaaaaaaaaeaaaawjaTSawjaaeaaeaaeaaeaaDaaDaaDaaeakhakhakhakhaTQaTJaTJaTKakhakhakhakhazZaRBaRBakhaTCaTFakhakhaTxaTBaAEaAgaAgaAgaAgaAgaAgaAgaAgaTtaAgaAgaAgaAgaAgaAFaAHaAGaAIaAFaAJavWaASaAMaAUaHraAYawLawLawLaBdawMaBgaBeawLaBFaBKaBGaSKaSLayMayMayMaSRaMmaMqawUasRasRasRasRasRawUawVawdaweaaaaaaaaaaaeaaeaaaaaeaaaaaaaBVaaaaaaaaeaaaaaaaaeaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaavRawXazVazUavRawXazWazUavRawXazXawXawXawXawXawXazYaSTaaaaaaaaDaaDaaDaaaaaaaaeaaaawjaTSawjaaeaaeaaeaaeaaDaaDaaDaaeakhakhakhakhaTQaTJaTJaTKakhakhakhakhazZaRBaRBakhaTCaTFakhakhaTxaTBaAEaAgaAgaAgaAgaAgaAgaAgaAgaTtaAgaAgaAgaAgaAgaAFaAHaAGaAIaAFaAJavWaASaAMayFaHraAYawLawLawLaBdawMaBgaBeawLaBFaBKaBGaSKaSLayMayMayMaSRaMmaMqawUasRasRasRasRasRawUawVawdaweaaaaaaaaaaaeaaeaaaaaeaaaaaaaBVaaaaaaaaeaaaaaaaaeaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBXaBWaCAaBWaDHaBWaDKaBWaDOaDLaEdaDVaDVaDVaEeawXaEnaSTaaaaaeaaeaaaaaaaaaaaaaaeaaaaxgaEPaKgaaeaaaaaeaaaaaaaaaaaaaaaakhaEQaFkaEVaFkaFkaFkaFkaFlaFkaFkaFqaFuaEVaYraFOaAgaAgaAgaAgaAgaAgaFQaUwaxraxraxraxraxsaxraxraUpaxraxsaxraxraxraVHaFWaSiayAaVHavcavWaGaaFYaGaaHraGkaSEaHkaHcaTbaHqaTbaHsaSEaHuaTWaHwaUeaUfaUeaUeaUiaUgaMGaMHaJwasRasRasRasRasRaJxaUhaUkaxOaaaaaaaaaaaaaaeaaaaaeaaaaxPaTTaxPaaaaaeaaaaaaaaeaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHQaHxaIfaIeaIpaInaIQaIvaITaIQaJpaJgaIQaIQaJqawXaJMaXAaaeaaeaaaaaaaaaaaaaaaaaeaybaycbezbdBayfaaaaaeaaaaaaaaaaaaaaaakhbeAakhaYabeFbeEbeEbeEbeGbeEbeEbeEbeHaYaasLaylaylaylaylaylaylaylaYibeIaxrayoaypayqayrbeJbeRbeOaPdaywayxaypaztaVHayzaSiayAaVHaJOaJNaKaaJRaKyaHraAYawLawLawLawLawObfoaKBbeDayIavVbdHbfnbfnbfnbfnbeXaMmaMmbavbflasRasRasRasRasRbfqasPasPasPaaaaaaaaaaaeaaeaaeaaeaaaaySaKJaySaaaaaeaaaaaaaaeaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeawXaKMaKRaKMaLeaIfaIfaLnaKMaKRaKMaLoaLqaLpaLrawXaJMaPIaPIbfXaXBaXBaXBaXBaXCaPIazbbggbftaADazbakhakhaTCbfuaTFakhakhakhbeAbfvaYaaaaaaeaaaaaeaaaaaeaaaaaeaaaaYaasLaylazfazgazhaziazjaylaYiaRBaxrazkazkayGbfHaYfbfMbfLaYfbfJbfVaypaztaVHayzaSiayAaVHaLvaLsaLsaLsaLEaLAaLLaLHaMhaMgaMrazzazAazBazBaMxazBasPbgpbgqbglbgmbfwbgobgjasPbgkasRasRasRasRasRbgiasPaaeaaaaaaaaaaaaaaeaaeaaaaaeazLazMbgrazOazPaaeaaaaaaaaeaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -11353,17 +11391,17 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVlaVlaVlaVlaVlaVlaVlaVlaVlaVlaVlaVlaVlbkUbkRbitbkVblbbiuaFfaFwaFsaFyaFeaEpaFsaFjaDPaFcaFdaDBaYyaZYaZZaFvaFxaYyaFXbadaFPaPEaDGaDJaErblcaPEaEtblDbalbalblEbalbalbalbalbanbaobaobaobapbaobaqatFboHbjvbpcasMasMasMbaAbaAbaAbayblLbaybaAbaBbaBbaBbaBbaBaFrbaBbaBbaBbaDbaDblVbaDaPWaPWaPWbqlbqlbqlbffbeiaLYauWbaFbaGaBlaUDaQobaIaFFbaJaFEbaLaZraZrbhWbaObcqbcqbcqaWPbaMbaMbaMbcqbcqbcqaFLaFMaFJaFKavyaKTaKTaKVbcqblWaZFbaYbcqbaZaFAbbbaWmbmabbabbdaFCaHPaEyaIbaQMaFBbbgaQMaQNaIbaIbaEyaFDaSsaEJaSsaKQbblbbmaYmaaeaFpaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVlaVlaVlaVlaVlaVlaVlaVlaVlaVlaVlaVlaCDbmcbmnbmdbmubmqaFfaFhaFgaFfaFeaEpaDUaDTaDPaDDaDCaDBaYyaYyaYybcJaEvaYyaEwbadaEqaPEaDGaDJaErbmyaPEaEtblDbalaEoaBkbbHbbHbbIbalbbJbbKaEkbbMbarbarbaratFaAcaYYbcmasMbbPbbQbbRbmzaEhaEiaEfbbWbaAbaBbbXbmAbmHbmBaEcbmIbcdbaBbaDbceaDZaDYaDXaDWaEbaEabjtbqlbrHbqnbrIauWbcqbcqbcqbcqaEZaEYaFbaFabcqbcqaEXbcqbcqbcqbcqaEUaERaETbcrbcrbcrbcsaKObcqaKKbmJbmMaKNaKIaKIaKIaKhbcqblWaZFaEObcqbcqbcqbcqbcqbcqbcqbcqbcqbcqbcqaEIaJtaEHaExaEAaEIaJtbcqaPtbcBaSsaEJaSsaKQaWAbcDbcEaTMaWDaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmRbmQbnxbnvbitbnAbnAbnAbnAbnAbnAbnOboabnAaDPaDPaDPaDPaDPaJmaDPaDPaDPaHtaHtaFRaYyaZYbcIbcJaHvaYybcLbcMbcLaPEaDGaDJaErbmyaPEaEtblDbalbToaScbcQbbHbcQbalbbJbcRbPhbcSbcTbcUbcVatFbtfbrJbcmbtgbcYbgCbdabdbbdbaHyaHzaHAbaAbaBbdebobbogbdhbbXaNPaHYbaBbaDboiaHNaHMaHXbfhaHGaHFaLgbqlbuFbuDaLYaKlbdubdvaZFaZFaIjaZFaIiaZFaZFaZFaZFbgGaZFaZFaZFaZFaBDaZFaZFaZFaZFaZFaZFbdvaZFaZFaIkaIlaIlaImaIlaIlaIobonaZFaBDaItaJybgGaZFaIxaZFaZFaZFaIyaIzaIAaIBaZFaICaZFaIDaZFaZFbdzaIEaIFaSsaEJaSsaHLaHKaHJaJYaPcaHHaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdQbdQbdQbdQbdQbdQbdQbdQbdQbdQaaaaaeboqbhBbosboOboNboPboPboPboPboPboRboSaFNaFUaFTaFSaFRaYyaYyaYybdXaEvaYyaPEaPEaPEaPEaDGaHhaFZbpfaPEaGbbphbalaJfaJlbpqbcQbeebalbbJbefbPhbcSbcSbcSbehatFbvdaMabcmbvqaGvaGwaGraGsaGpaGqaGlaGmbaAbaBberbprbetbetbetaNPbevbaBbaDbexaGibclbdpbeyaGeaGdaGcbqlbwybwxbwJbwIaGKaGEaGDaGDaGMaGLaGNaGzaGzaGzaGPaGzaGzaGzaGzaGzaGAaGBaGBaGBaGCaGDaGDaGEaGDaGDaGFaGBaGBaHiaGzaHeaHpaHlaGzaHjaGDaGDaGDaGDaGDaGDaGDaGDaGDaGDaGDaGDaGDaGRaGPaGQaGzaGXaGSaGTaHaaHaaGYaGZaKQaStbeLaTMaTMaTNaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdQbdQbdQbdQbdQbdQbdQbdQbdQbdQbdQbijbiebpxbpwbpzbnAbePbePbeQbePbePbePbUVaNlaNlaNlaNlaDBaYyaZYbeSbeTaHvaYybVdbVebVdaPEaPEaPEaPEbpAaPEbVcblDbalbTpcnLbcQbRAbVabalbbJbarbUXbcSbcSbcSbfeatFbwKaMabcmbxHblvbgCbembfibfjbepbVtbhZbaAbpGbpSbpRbetbpTbetbobbqsbqrbaDbfrbVibVjbVgbVgbVgbVhbVfbqlbxJbxIbyybyxcxRdPwdPxdTPbmZcFsbVFcegceibVGbVHctbctbctaaZFaZFaZFaZFaZFbfDbVwbEuaZFctcbVybVxbVBaZFbfDbfybVIbVJbdzaZFaZFbVKaZFaZFcejbfOaZFbfDaZFaZFaZFaZFaZFaZFaZFaZFaZFaBDaZFaZFbdzbfQbfRbfSbfTbfUcGxcGybfWaaeaaaaaeaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdQbdQbdQbdQbdQbdQbdQbdQbdQbdQbdQbqvbqubqzbqwbqEbnAbfYbfZbgabgabgbbgcbqYbqUbrabrabrjbrhaYyaYyaYybcJbUgaYyaNlaNlaNlaNlbUfaEtaEtbrBbUdbUcbrGbUCbMpbYMbUqbUBbUjbalbTKbarbUibcSbKabcSbgzbyzbyAaMabcmasMbUsbUrbUubUtbUobUnbUpbfkbaAbaBbgFbsfbsBbshbsCbsfbgKbaBbaDbaDbUybUDbgObgPbclbUwbUxbqlbyCbyBbyDbqlbTqbTqbTqbTqbTqbTqbcqbcqbUMbUNbUJbUKbUNbUMbcqbcqbcqbcqbcqbcqbcqbcqbcqbcqbUObcqbcqbcqbcqbcqbcqcuObcqaZFaZFbURbhkbhkbTqbTqbTqbTqbTqbhmbhnbhnbhobhnaZFbhnbhobUSbhnbhpbTqcuRcuRcuRcvMaPtcBhaPtaPtaaaaaaaaaaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdQbdQbdQbdQbdQbdQbdQbdQbdQbdQbdQbkUbkRbpxbpwbsLbnAbhtbePbhubhvbePbePbePauUbSSbSRbSRbRuaYyaZYbhzbcJbTzaYybsObsMbtdbsZbtobtebtebtpbtebtebtqbalaFibLsbbHbLwbTtbUCbTibarbTjbcSbcSbTkbhUbyEbyAaMabyHasMbTbbTbbTbbTbbTbbTbbtxbTbbaAbaBbtHbtEbtVbtMbtVbtWbunbaBbaDbaDbimbuCbiobipbclaGdbSVbqlbffaLXaLYbqlcqlcqncqSbTncrDcrGcrMcrFcqUcqVbTTbTUcqVbTOcpscoYcmTbTMbTNcmUcpMckbcrscpNbTRbTPbTScktcktclSbktbSibTqbTqbTJbTqbTLbTLbTqbiVbiWbiXbTqbTEbTFbTEbTqbhmbhnbhpbTqbTDbTIbTDbTqbThbTgbNtbTHbTGbkebhgaaaaaaaaaaaaaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdQbdQbdQbdQbdQbdQbdQbdQbdQbdQaaacbCbuQbuRbmdbvjbnAbjibePbjjbjkbjlbRxbePbRybRobRrbRsbRuaYyaYyaYyaYyaYyaYybSebSdbScbSbbvnbalbalbalbalbalbalbalbShbalbalbalbMVbalbSgbRFbSfbcSbcSbcSbjAbyzbyAaMabyJasMbRPbRObRRbRQbREbLrbRKbRIaaebaBbRMbRLbRUbvrbRWbRYbRZbaBaaebaDbjNbRSbjObjPbclaGdbRTbqlbyLbyKaLYbyMcqOcgPbSwbSxbSKbSLbSGbSIchochocgRcgScjtcjtbSOciEciDbSNbSMciAckcckbcjDbSQbSPcgecjvcjucgecgfbktbSibiSbkwbkxcgdbSlbkAbkBbkCbkDbkCbSjbkFbSsbkHbTqbcqbSrbSmbTqbSzbSEbSDbSvbNHbSAbNtbSubkSbkTbhgaaaaaaaaaaafaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdQbdQbdQbdQbdQbdQbdQbdQbdQbdQbdQbdQaaaaaeboqbhBbosboOboNboPboPboPboPboPboRboSaFNaFUaFTaFSaFRaYyaYyaYybdXaEvaYyaPEaPEaPEaPEaDGaHhaFZbpfaPEaGbbphbalaJfaJlbpqbcQbeebalbbJbefbPhbcSbcSbcSbehatFbvdaMabcmbvqaGvaGwaGraGsaGpaGqaGlaGmbaAbaBberbprbetbetbetaNPbevbaBbaDbexaGibclbdpbeyaGeaGdaGcbqlbwybwxbwJbwIaGKaGEaGDaGDaGMaGLaGNaGzaGzaGzaGPaGzaGzaGzaGzaGzaGAaGBaGBaGBaGCaGDaGDaGEaGDaGDaGFaGBaGBaHiaGzaHeaHpaHlaGzaHjaGDaGDaGDaGDaGDaGDaGDaGDaGDaGDaGDaGDaGDaGRaGPaGQaGzaGXaGSaGTaHaaHaaGYaGZaKQaStbeLaTMaTMaTNaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdQbdQbdQbdQbdQbdQbdQbdQbdQbdQbdQbdQbdQbijbiebpxbpwbpzbnAbePbePbeQbePbePbePbUVaNlaNlaNlaNlaDBaYyaZYbeSbeTaHvaYybVdbVebVdaPEaPEaPEaPEbpAaPEbVcblDbalbTpcnLbcQbRAbVabalbbJbarbUXbcSbcSbcSbfeatFbwKaMabcmbxHblvbgCbembfibfjbepbVtbhZbaAbpGbpSbpRbetbpTbetbobbqsbqrbaDbfrbVibVjbVgbVgbVgbVhbVfbqlbxJbxIbyybyxcxRdPwdPxdTPbmZcFsbVFcegceibVGbVHctbctbctaaZFaZFaZFaZFaZFbfDbVwbEuaZFctcbVybVxbVBaZFbfDbfybVIbVJbdzaZFaZFbVKaZFaZFcejbfOaZFbfDaZFaZFaZFaZFaZFaZFaZFaZFaZFaBDaZFaZFbdzbfQbfRbfSbfTbfUcGxcGybfWaaeaaaaaeaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdQbdQbdQbdQbdQbdQbdQbdQbdQbdQbdQbdQbdQbqvbqubqzbqwbqEbnAbfYbfZbgabgabgbbgcbqYbqUbrabrabrjbrhaYyaYyaYybcJbUgaYyaNlaNlaNlaNlbUfaEtaEtbrBbUdbUcbrGbUCbMpbYMbUqbUBbUjbalbTKbarbUibcSbKabcSbgzbyzbyAaMabcmasMbUsbUrbUubUtbUobUnbUpbfkbaAbaBbgFbsfbsBbshbsCbsfbgKbaBbaDbaDbUybUDbgObgPbclbUwbUxbqlbyCbyBbyDbqlbTqbTqbTqbTqbTqbTqbcqbcqbUMbUNbUJbUKbUNbUMbcqbcqbcqbcqbcqbcqbcqbcqbcqbcqbUObcqbcqbcqbcqbcqbcqcuObcqaZFaZFbURbhkbhkbTqbTqbTqbTqbTqbhmbhnbhnbhobhnaZFbhnbhobUSbhnbhpbTqcuRcuRcuRcvMaPtcBhaPtaPtaaaaaaaaaaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdQbdQbdQbdQbdQbdQbdQbdQbdQbdQbdQbdQbdQbkUbkRbpxbpwbsLbnAbhtbePbhubhvbePbePbePauUbSSbSRbSRbRuaYyaZYbhzbcJbTzaYybsObsMbtdbsZbtobtebtebtpbtebtebtqbalaFibLsbbHbLwbTtbUCbTibarbTjbcSbcSbTkbhUbyEbyAaMabyHasMbTbbTbbTbbTbbTbbTbbtxbTbbaAbaBbtHbtEbtVbtMbtVbtWbunbaBbaDbaDbimbuCbiobipbclaGdbSVbqlbffaLXaLYbqlcqlcqncqSbTncrDcrGcrMcrFcqUcqVbTTbTUcqVbTOcpscoYcmTbTMbTNcmUcpMckbcrscpNbTRbTPbTScktcktclSbktbSibTqbTqbTJbTqbTLbTLbTqbiVbiWbiXbTqbTEbTFbTEbTqbhmbhnbhpbTqbTDbTIbTDbTqbThbTgbNtbTHbTGbkebhgaaaaaaaaaaaaaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdQbdQbdQbdQbdQbdQbdQbdQbdQbdQbdQbdQaaacbCbuQbuRbmdbvjbnAbjibePbjjbjkbjlbRxbePbRybRobRrbRsbRuaYyaYyaYyaYyaYyaYybSebSdbScbSbbvnbalbalbalbalbalbalbalbShbalbalbalbMVbalbSgbRFbSfbcSbcSbcSbjAbyzbyAaMabyJasMbRPbRObRRbRQbREbLrbRKbRIaaebaBbRMbRLbRUbvrbRWbRYbRZbaBaaebaDbjNbRSbjObjPbclaGdbRTbqlbyLbyKaLYbyMcqOcgPbSwbSxbSKbSLbSGbSIchochocgRcgScjtcjtbSOciEciDbSNbSMciAckcckbcjDbSQbSPcgecjvcjucgecgfbktbSibiSbkwbkxcgdbSlbkAbkBbkCbkDbkCbSjbkFbSsbkHbTqbcqbSrbSmbTqbSzbSEbSDbSvbNHbSAbNtbSubkSbkTbhgaaaaaaaaaaafaJGaJGaJGaJGaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmRbmQbnxbnvbkRbvubvubvubvLbvubvWbikbwcbwkbnAbkWbkXbkYbkZblacaHcaGaJaaEtaEtaEtbwmbrabwqbrabrabrabrabwFbZXbZXbZZbwSbalbljblkcrwblmblnbloboAbZVblrblschfckRbTibgAbSfbcSbcSbZWbaratFbyAbztbzubxabxdbxcbxcbxfbxCbxhbxRcazbzmbaBbaBbaBbaBbznbaBbaBbaBbaBaaebaDcaqbRScahcajcaecafcadbqlbzEaLXaLYbqldVHdVIdVJcaXcaVbgUcUZbZscjtcjtcjtcjtcjtcjtbZNcaLcaQbSNcaUcaScaJckbdVwbZDcaKcgecjvcjucgedVLbktbSibiScbtbLZbLZcbpcbqcbmcbncbncbncbrcbncbhcbgbhlcbfcbkcbjbNtcbibNHcbdcbabXbbXfbNtbmPbkSbmsbhgaaaaaaaaaaaaaaaaJGaJGaJGaJGaJGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaateaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabzwbzHbzBbzRbzObzYbzYbAjbAibApbnAbmSbmTbkZbmUbePbePbePaNlbZqbZrbYsbYtbYsbYsbYsbYtbYsaNlaNlbalbalbalbYubalblpblpblpblpblpblpboAbIwbnbbVobndbYwbYJbYLbYHbYIbqfbYFbYxbzFbzWbzVbAAbAzbABcwZbYSbTscDdbUkbRKbRIbAIbACbnybnzbBgbBdbnCbnzbnDbACaaebaDbnFbZobnFbaDbaDbaDbBobqlbzZaLXaLYbyMcqOcgPbZzbZAbZubgUdUSbZsdUXdUYdUVdUWdVnbZObZNbZMcmTdVpbZRbZQbZIckbbZGbZDbSPcgecjvcjucgecgfbktbSibiSdTXbnYdTYbXPbkxbocbodboebofbZSbpDbZTbohbhlbZUbsqchDbNtbVZbVAbVzbXBbVVbVXbNtbmPbkSborbhgaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaabzwbBCbBybBGbBEbBEbBEbBNbBEbBEbnAbotboubovbkZbePaaaaaaaaaaaeaaebowbowbowbowbowbowbowaaaaaaboxbXzbXybXAboBblpblpblpblpblpblpbXobXrbXsbqebXtbXvbPNboFbarbarbXwbarbarbAabAcbAbbAdbOxbXibTbbTbbTbbTbbTbbBQbTbbAIbCfbCUbCSbCXbCWbCXbCSbDbbCZaaebnFboVbXdbXabXcbXebnFbDdauWbAeaXObAfbqlbWmcqnbYlbYnbYjbixdUObYkdUJdUKdULbVWdUGdUFbYibYfcmTckbbYebYcbXYckbdUCbYbbXWbXVdUzdUzbXUdUwbktbSibiSdUubkxbkxbXPbXQbXNbXObXLbXMbXIbXJbXHbpFbhlbXGbXFbXEbNtbUYbUTbUPbXBbNHbUIbNtbSubkSbpMbhgaaaaaaaaaaaaaaebpNbpObMebpObMebpObpQaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaabzwbBCbBybBGbBEbBEbBEbBNbBEbBEbnAbotboubovbkZbePaaaaaaaaaaaeaaebowbowbowbowbowbowbowaaaaaaboxbXzbXybXAboBblpblpblpblpblpblpbXobXrbXsbqebXtbXvbPNboFbarbarbXwbarbarbAabAcbAbbAdbOxbXibTbbTbbTbbTbbTbbBQbTbbAIbCfbCUbCSbCXbCWbCXbCSbDbbCZaaebnFboVbXdbXabXcbXebnFbDdauWbAeaXObAfbqlbWmcqnbYlbYnbYjbixdUObYkdUJcPadULbVWcyYdUFbYibYfcmTckbbYebYcbXYckbdUCbYbbXWbXVdUzdUzbXUdUwbktbSibiSdUubkxbkxbXPbXQbXNbXObXLbXMbXIbXJbXHbpFbhlbXGbXFbXEbNtbUYbUTbUPbXBbNHbUIbNtbSubkSbpMbhgaaaaaaaaaaaaaaebpNbpObMebpObMebpObpQaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceTbmcbDnbDnbDobvubEFbmRbmQbFibEFbnAbpUbpVbpWbpXbePaaaaaaaaaaaaaaabowbowbowbowbowbowbowaaaaaabpYbpZblpbWrbWqbWqbWqbWqbWqbWtbWubWqbWsbWxbWybWvbWwbWzbWAbarbqjbcSbWCbWBbBabBfbFnbCubOxbOxbInbGtbFubGRbGybTrbInbHvbGUbWbbWabWcbHGbWebWgbWhbHObHQbWkbWnbWobqFbaDbqGbnFbHSauWbCzbeibCBbqldUjdUkbWPdUibWObixdUebWNbWLbWMbWKbWKbWVbWUbWTbWSdUpbPZbWRbHJbPZbPZbPZbPZbWQbPZbPZbPZbktbktbktbSibiSdTXbnYdTYbWDbWEbrcbrdbrebrebrebpDbKEbrfbrgbtCbWJbWIbNtbUEbUzbWGbWHbNHbUvbNtbWFbmrbhgbhgaaaaaaaaaaaaaaebrobrpbrqbrrbrrbrsbroaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabowbowbowbowbowbowbowbrubrvbrwbrxblpbIyblpbZKbZKbZKccZbIvbIwblpblpbnbbqgbqTbMlbJXbrCbrDbrEbcSbcSbMkbCCbBfbFnbIibHYbIpbIkbIqbMrbMqbJNbRbbInaaebrQbMnbnzbqybIUbqybnzbMDbrUaaebnFbMBbMCbMvbaDbrZbnFbDdauWbDSbeiaLYbqlbLFbLGbLHbLIbLKbIVbJfbJabIVbLDbPubWfbLDbPZbLNbLMbPZbPZbLPbLObQFbJhbQIbQHbLSbLQbQVbPZbLWbLYbLUbLVbiSbMabLZbLZbMbbMcbkBbsFbrebrebrebpDbKEbsHbtCbStbMfbMdbtCbNEbMibNJbMhbNHbMjbNtbmPbsPbhgaaaaaaaaaaaaaaaaaebsQbsRbrqbrrbrqcfLbMeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabowbowbowbowbowbowbowcfDbsUcfDbsVbsWbIyblpblpblpbJjblpbIvbIwbsXbalbalbsYbcSbndbJXbtabtbbLebSWbSWbKZbFcbFpbFobIhbBabLBbJobJmbJNbDNbCHbHWbInaaebrUbrUbJpbCSbJqbnzbJwbrUbrUaaebtvbtvbtvbtvbtvbtvbtvbJEbqlbKubyBbyDbqlbKvbMmbMmbHMbCGbIVbJWbJPbKfbKcbKBbKCbKebHJbKdbKbbKlbKkbKjbKmbKmbKnbKqbKmbKsbKrbKzbKxbKDbKAbKRbKQcuBbrbbKVbKWbKXbKYbkBbzPbkCbkCbucbpDbKEbuebuqbUAbKHbKGbuqbKIbKMbKLbKObGwbtCbtCbKPbhgbhgbRDbSpbSpbSpbSqbKSbrobrrbrqbrrbrrcfjbroaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabowbowbowbowbowbowbowcfDbsUcfDbsVbsWbIyblpblpblpbJjblpbIvbIwbsXbalbalbsYbcSbndbJXbtabtbbLebSWbSWbKZbFcbFpbFobIhbBabLBbJobJmbJNbDNbCHbHWbInaaebrUbrUbJpbCSbJqbnzbJwbrUbrUaaebtvbtvbtvbtvbtvbtvbtvbJEbqlbKubyBbyDbqlbKvbMmbMmbHMbCGbIVbKbbJPbKfbKcbKBbKCbKebHJbKdbJWbKlbKkbKjbKmbKmbKnbKqbKmbKsbKrbKzbKxbKDbKAbKRbKQcuBbrbbKVbKWbKXbKYbkBbzPbkCbkCbucbpDbKEbuebuqbUAbKHbKGbuqbKIbKMbKLbKObGwbtCbtCbKPbhgbhgbRDbSpbSpbSpbSqbKSbrobrrbrqbrrbrrcfjbroaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtaaaaaaaaaaaaaaaaaaaafaaaaaaaaabowbowbowbowbowbowbowcdKbutcdKbuublpbIyblpbrybrybrybrybIvbIwbuvbuwbalbuxbcSbndbJXbuybuzbJZbcSbKabcSbLbbLubBebLAbLzbLBbKTbJObJNbJNbJNbJMbInbOpbOpbOpbrUbLfbIUbLfbrUcdacdacdabtvbJQbuVbuWbuXbuYbJSbJRbqlbLTaLXaLYbqlbJcbJdbJebJgbJnbLibLkbLjbLpbLobJkbJlbLvbJvbJybJxbJtbJrbJubJtbJFbLxbJHbJGbJCbJBbJDbPZbICbIDbIAbIBbiSbvybIzbMgbvBbvBbkBbvCbvDbvEbkBbIEbIMbvGbSobSnbIKbIIbIHbIFbIFbJbbIZbIXbIWbIPbIObINbJIbJJbJLbXpbXpbZcbZtbvXbpObMeccRbMebpObvZaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabowbowbowbowbowbowbowbwabrvbwbbXSblpbIyblpblpblpblpblpbIvbIwbuvbwdbalbwebcSbIxbIubcSbItbPhbcSbcSbrFbBabBfbBebLAbLzbLBbInbIsbIlbImbIlbIobInbwpbLybIrbOpbrUbLLbrUcdabIjbLXbXubtvbIbbIcbIdbIebIfbIfbIgbNpbLTaLXaLYbqlbSkbLRbLRbHMbvNbIVbMtbMsbIVbMubHNbHNbMPbPZbHxbHrbPZbPZbPZbPZbPZbPZbHKbPZbPZbHJbHIbPZbAqbAqbAqbHobiSbtCbuqbuqbuqbuqbuqbuqbuqbuqbuqbGwbHcbHbbHebSnbGZbGlbHabsabsabsabHibRpbRlbRibHhbHgbHZbRBbRtbRwbRtbIabRCbRDbSpbSqbRHbKSbRJaaaaaeaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtbrtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabowbowbowbowbowbowbowcdKbutcdKbxubxvbQQblpblpblpbxvblpbIvbIwbuvbQSbalbQRbcSbndbJXbcSbgAbQTbcSbcSbxGbCCbBfbBebNqbCCbNsbInbQWbMZbRdbRcbRbbInbRabNfbNjbNhbNlbNkbNobNmbNUbNubRebtvbRnbycbycbydbyebyfbQEbqlbNxbNwbNybqlbymbQhbQibQjcarbOkbOmbOlbKfcbccbebHNbQlbHJbzzbQmbHJceEceJcqebDccckbNbccEbAqbQkbOYcpybRvcbbbAqbQsbQubQwbPGbQtbPwbPwbOobQobQpbQrbOqbQqbQMbQLbQpbQKbQPbGlbQObQNbQxbtCbtCbtCbtCbtCbQJbQDbywbRDbSqbRCefSefTefUefVckkctpdKtefRaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -11386,7 +11424,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeecwecxbsKcrecqfbthcrfbwnbwoblJbwlcrhblJblJbwubwvbwwcribwrbwsbAkblGblFblHbwibwgbgwbgwbwhbwjbgwcrlbgXcrncrmclwcrAclwboJbqZbqZbqZbqZbqZbqZbqZbWpcrQcrHbWpbrAbwfbqJbtDbiDbvTbvUbvVbwUbhebksbhebiKbvObvPbiGbvSbvQbvRbiGbvAbGIcrUcrWbKUbvIbvHbsrbvtbvvbqhcsmcshcsybBFcsBcshctsbvobvpeczctWctScuacuacuacuacuacuacuacuacuacuabvFbvzbvxbvwcucbnfbnfbnfbnfaaaaaeaaaaaaaaaaajaajaajaaeaaaaaaaaeaaaaaaaaeaaaaaabxYbjBbxXbjBbjBbjSbjSbjSbjSbjSbjSbjSbjBbjBaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeecCecCbsKcuHcukbthcuKbqpbqqblJbqtcwzcwacwJcwAcwXcwKcxabqHbqAbqCbqNbqLbqKbqIbqSbqQbqPbqObqVbqXcxdcxccxxcxeczecyRclwboJbqZbpEbqWbqRbpCbpBbpycBpcCKcBycCNbppbpscCTbsmbiDbsnbsobsibwUbhebksbhebiKbpKbpLbiGbrOcCVbpJbiGbqiblxblxbsTblxbqbbqcbqbbqbbqbbqabsSbybbybbxSbqobybbudecGbqkecHbuddfTbyobxsbxqdfTdfTdfTdfTbylbxsbxqdfTdfTblXbsGcDfbsNcDpcDobsEcExcEycEycEycEycEycEycEycEycEycEycEycEycEycEycEycEybpmbpnbpnbpobjBbjBbjSbjSbqmbjSbjSbjBbjBaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaeaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsgbsgbsgbsgbsgbsgbsgbsjbsscvgcvgcvgcvgcvgbstbsubsvbsvbsvbsAbuNblGblFblHbtsblIbttbslbtucECbspbtGbgXcHMcEKclwcHTclwbrNbqZbzxbzsbzsbzsbrMbrLbWpcIncHYbWpbrAbqJbrzbtDbiDbtAbtBbtzbwUbhebksbtJbiKbrmbrnbiGbiGbiGbiGbiGbsecIHblxbsTblxbrYbsdbrYbqdbsbbscbtibybcJabBvbrVctibudbuhbrRbrSbudbrTbADbADbADbAGbzJbzQbAsbAvbzibzabyXdfTcMgcLFcNTbnfbnfbnfbnfaaaaaeaaaaaaaaaaajaajaajaaeaaaaaaaaeaaaaaaaaeaaeaaebtrbtwbtmbtnbtybjBbjBbjSbmLbjSbjBbjBaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaeaaeaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaebsgctYctZcOfctXcRbbsgcufcvZdgkdgjcwYcrCcrrcrrbuKcBVcBVcBUcBZbAkblGblFblHcnCbuKcnzcRScnBcVhcnxcnybgXcWqcWiclwcWtclwboJbqZdZLdZOdZOdZOcyVbqZdYtcyYczmdYtczHdZRczodZHbiDdZGbtBcrVbwUcylcxUbxQbiKcyIcypbiKcONcdnbidcBbcugcuDcRdcRecRdcuSbqccvGbqdcvFcvEbsTbybcBrcAEcAEczIcALcAHcAMcAHcAOcANcCQcCPcCPcCRdfQdfQdgBcCUdgodgodgndfTbYUcxPbYWbYUaaaaaaaaaaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaecrLbEQbEQbFgbtybtybjBbjBbjBbjBbEOaaeaaeaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaeaaeaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaebsgctYctZcOfctXcRbbsgcufcvZdgkdgjcwYcrCcrrcrrbuKcBVcBVcBUcBZbAkblGblFblHcnCbuKcnzcRScnBcVhcnxcnybgXcWqcWiclwcWtclwboJbqZdZLdZOdZOdZOcyVbqZdYtcQHczmdYtczHdZRczodZHbiDdZGbtBcrVbwUcylcxUbxQbiKcyIcypbiKcONcdnbidcBbcugcuDcRdcRecRdcuSbqccvGbqdcvFcvEbsTbybcBrcAEcAEczIcALcAHcAMcAHcAOcANcCQcCPcCPcCRdfQdfQdgBcCUdgodgodgndfTbYUcxPbYWbYUaaaaaaaaaaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaecrLbEQbEQbFgbtybtybjBbjBbjBbjBbEOaaeaaeaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaeaaeaaebTebTebTebTebTebTebTebTebTebTebTebTebTeaaaaaacnmcnjcnjcnjcnlcWxbsgcqqcpdcnWcnQcEzcnnctVctRctIctHctCctBctActzcujcWCcuhcuibCtbgXbgXbgXbgXbgXbgXbgXclwclwclwclwclwboJbqZbqZdZrdZscuobqZbqZcupcutcuxdYtbiDbiDbiDbiDbiDbwUdZydZzbwUcqXcuycqXbiKcuAcuzbiKcJLcNGbiddZVbidearblxbsTblxcWKcuEctubqbcttcvEbsTbybcvKcvLcvLcvPcvOcvNcvUcvTcvRcvQcvWdgWcBDcBzdgicBJdfQdfQdfQdfRdfSdfTculcumcunbYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaabTecnScqacnSbTecnOcpYcnObTecnMcpZcnMbTeaaaaaacBvcnjcnjcnlcnlcWMbsgcDacxbcvgdcVddhcFHcFlcFkcFnbYpbYpcFobYpbAkblGcEUblHcpCcBscEZcpucpEcpucEPbskcBIcCncWrcCEcCJbskboJbEaeaxbMXbMXcNicNkcNEcNFcmCcNDcNmcNscNleaeeaeeaudXBbwUbwUbwUcLscKZcLubiKbiKbiKbiKcNGcNGbidcWPbidcIfblxbsTblxcWUcDxcDxcERcEScFpcUBbybcJCcGecGecFXcGlcGjcFTcFRcFVcFUcGtcGmdfQdfQcWZdhndfQdhpdfQdfRdghdfTcFKcFMcFJbYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaabTecnScnRcnSbTecnOcnPcnObTecnMcnNcnMbTeaaaaaacBvcnjcnlcnlcnlcYCcXdcYGcvYcvgclOcClbpIcsMcsEcBscoycoEcoDdgFbAkblGdaHcuhdaRdcHdcBdeCdeCdeCdeEdeZdeKdfNcBqcBmcBnbskboJbEaeabbMXbOscEpeaaeageahcEscEtcEqeadcEreafeaeeandXBdfXdgadfZcEBdgGcEBdgHdgRdgRdgYdgRdhabidbidbidbidblxcRfblxdhodhdcDzcDJcDybqhcUBbybdgPdgQdgQdgQccQbudcEebuddgTcDKcEfdgMdgMdgXdgWdgWdgVdgMdgMcDndgOdfTdhBdhzdhCbYUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -11419,7 +11457,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactvctvctvctvctvctvctvctvctvctvctvctvctvctvctvctvctvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaacdzedTcdwaaacdzedTcdwaaacdzedTcdwaaeaaeaaeaaeaaaaaacmnaaacjYcaacaacaaclQclMcolcoecRicotcRJcRIcSfcagcdBdyNcagefhcmGcEGcmObZCbZCedUedVcmPcmQbZjeeaaaeaaDaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacmdcmdcmdcmdcmdcmdcmdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactvctvctvctvctvctvctvctvctvctvctvctvctvctvctvctvctvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaecdzedTcdwaaacdzedTcdwaaecdzedTcdwaaeaaaaaaaaeaaecdEaaaaaacmpcaacaacaaclQclMeflefkefnefmefocRIcSfcagcdBefpefrefqefscEJeftcascascnDcnEcmPcQNbZjaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacmdcmdcmdcmdcmdcmdcmdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactvctvctvctvctvctvctvctvctvctvctvctvctvctvctvctvctvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaacdzedTcdwaaecdzedTcdwaaacdzedTcdwaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaecjVclzefucSJefvefwctkcPDbZCdmsdmndmfdlWdlhdlidlbdlcdlxdlHdlqcmPcRDbZjaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacmdcmdcmdcmdcmdcmdcmdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactvctvctvctvctvctvctvctvctvctvctvctvctvctvctvctvctvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaDaaeaaacdzedTcdwaaecdzedTcdwaaacdzedTcdwaaeaaaaaaaaaaaaaaeaaecjMcjNcjNcjNcjNcOGcOGcOGcOGcOGcOxcOGbZjbZCbZCdkRbZjbZjbZjcPacPWcQHbZjbZjbZjdkVcRccPSbZjaaeaaabCVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacmdcmdcmdcmdcmdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactvctvctvctvctvctvctvctvctvctvctvctvctvctvctvctvctvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaDaaeaaacdzedTcdwaaecdzedTcdwaaacdzedTcdwaaeaaaaaaaaaaaaaaeaaecjMcjNcjNcjNcjNcOGcOGcOGcOGcOGcOxcOGbZjbZCbZCdkRbZjbZjbZjdUGcPWdUKbZjbZjbZjdkVcRccPSbZjaaeaaabCVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacmdcmdcmdcmdcmdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactvctvctvctvctvctvctvctvctvctvctvctvctvctvctvctvctvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaeaaaaaeaaeeedaaeaaeaaeeedaaeaaaaaeeedaaeaaaaaaaaaaaaaaackBckCckDeeedktdjecPqeegdgEdigdicdihdpKdicbZjcOWbZCdhrdhidhmcIGcLCcLDcLBcIGdhhdhidhybZCcFabZjaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactvctvctvctvctvctvctvctvctvctvctvctvctvctvctvctvctvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaeeejeeheeleekeemeekeekeekeemeekeekeekeemeekeeoeeheeheeheepdideeqdhNeerdhGdhsclEeesdyKdyKdyKdyMefyefzbZjbZCbZCdhrdhidhmcwIcyWcKrcKQcwIdhhdhidhybZCcyhbZjaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactvctvctvctvctvaaactvctvctvctvctvaaactvctvctvctvctvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaeaaaaaeaaeeetaaeaaaaaeeetaaeaaaaaeeetaaeaaaaaaaaaaaaaaackBckCcmfeeDcmhdhlcjNeeEdyOdicdicdyQdyQdyRbZjbZCbZCdhqdhidhmctocyWcJFctDctodhhdhidhebZCbZCbZjaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -11612,30 +11650,30 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFZcGacGbcGbcHocGdcIocIpcIqcGdcGncGncGncGncGncGdcGdcGdcHfcGbcGbcGrcIrcIscItcIucIkcIkcIkcIkcIvcGrcGXcGXcGXcIccIwcHJcHJcHJcIxcHJcHJcIycGFcHbcHscHtcHtcHtcHtcHtcHscGFcHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLaaacCFdEZdFncNjcCFaaacCFcFycFycFycCFaaacCFdsgdFtdFucCFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqLdqLdqLdqLdqLdqLdqL
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFZcGacGbcGbcGbcHocGdcGdcGdcGdcGdcGdcGdcGdcGdcGdcHfcGbcGbcGbcGbcGrcGrcIzcIAcGrcGrcGrcIzcIBcIAcGrcGXcGXcGXcGrcICcIDcIDcIDcIDcIDcIEcGrcGFcHbcIFcUQcHtcHtcHtcUycIIcHccHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLaaacCFcFycFycFycCFaaadvlcFBcFCcFDdvoaaacCFcFycFycFycCFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqLdqLdqLdqLdqLdqLdqL
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFZcGacGbcGbcGbcGbcGbcGbcGbcGbcGbcGbcGbcGbcGbcGbcGbcGbcGbcGbcGbcGrcIJcIJcIJcIJcIJcIJcIJcIJcIJcGrcGrcIKcGrcGrcIJcIJcIJcIJcIJcIJcIJcGrcGFcHbcILcIMcINcINcINcIMcIOcHccHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadvlcFBcFCcFDdvoaaaaaaaaaaaaaaaaaaaaadvlcFBcFCcFDdvoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqLdqLdqLdqLdqLdqLdqL
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacIPcIPcIPcIPcFYcIPcFYcFYcIQcIQcIQcIQcIQcIQcIQcIQcIQcIQcIQcIQcIQcIQcIQcIQcIQcIQcIQcIQcIQcIQcIRcIRcIRcIRcIRcIRcIRcGrcIScITcIScGrcIRcIRcIRcIRcIRcIRcIRcIRcGFcHbcHbcIUcIVcIVcIVcIWcHbcHccHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqLdqLdqLdqLdqLdqLdqL
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacIXcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIYcIZcJbcFYdoWcJccJccIQcJdcJecIQcJfcJgcJhcJfcJicIQcJfcJjcIQcJfcJkcIQcJlcJmcIQcJfcJjcIQcJncIRdRcdRbdRadQZcJqcGrcIScITcIScGrcJrcJscJtcJucJucIRaaaaaacGFcHbcHbcHbcHbcHbcHbcHbcHbcHccHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqLdqLdqLdqLdqLdqL
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJvcJwcJwcJwcJwcJwcJwcJwcJwcJwcJwcJwcJwcJwcJxcJycJwcJwcJwcJwcJzcJxcJAcJBcJDcFYcLtcJEefPcIQcJGcJHcIQcJGcJjcIQcJGcJHcIQcJGcJmcIQcJGcJgcIQcJGcJjcIQcJGcJicIQcJncIRcJIcJJcJJcJJcJJcGrcIScITcIScGrcJucJucJucJucJucIRaaaaaacJKcJKcJKcJKcJKcJKcJKcJKcJKcJKcJKcIRcIRcIRcIRcIRcIRcIRcIRcIRcIRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqLdqLdqLdqLdqL
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacIXcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIYdpicJDcFYcLtcJEcJMcIQcIQcIQcIQcIQcIQcIQcIQcIQcIQcIQcIQcIQcIQcIQcIQcIQcIQcIQcIQcIQcIQcJncIRcJIcJJcJJcJJcJJcGrcGrcIKcGrcGrcJucJucJucJucJucIRcJKcJKcJKcJKcJKcJKcJNcJOcJPcIRcJQcJQcJQcIRcJQcJQcJQcJQcJQcJQcJQcJQcIRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqLdqLdqLdqL
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJvcJwcJwcJwcJwcJwcJwcJwcJwcJwcJwcJwcJwcJwcJRcJycJwcJwcJwcJwcJzcJRcJScJBcJTdmScLtcJEcJVcIQcJWcJmcIQcJfcJXcIQcJfcJHcIQcJYcJicIQcJfcJicIQcJZcJjcIQcJfcJmcIQcJncIRcKadQYdPKcKccKdcIRcKecKecKecIRcJucJucJucJucJucIRcKfcKgcKfcKhcKicJKcKjcKjcKjcKkcJQcJQcJQcKkcJQcKlcKmcKlcJQcKncKocKpcIRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqLdqLdqL
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacIXcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIYcKqcJDcFYcLtcJEdDDcIQcJGcKscIQcJGcJjcIQcJGcJicIQcJGcJjcJhcJGcJjcIQcJGcJXcIQcJGcKtcIQcJncIRcKucIRcKvcKwcKxcIRcJJcJJcJJcIRcKvcKwcKycIRcKzcIRcKAcKBcKAcKBcKAcJKcIRcIRcIRcIRcJQcJQcJQcIRcKCcKDcKlcKEcKCcKFcKGcKGcIRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqLdqL
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJvcJwcJwcJwcJwcJwcJwcJwcJwcJwcJwcJwcJwcJwcKHcJycJwcJwcJwcJwcJzcKHcKIcJBcJDcFYcLtcJEcKJcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcJncIRcJJcJJcKKcKbcKbcKbcKbcKbcKbcKbcKbcKbcKLcJJcJJcKMcKAcKAcKAcKAcKAcJKcKNcKjcJNcIRcJQcJQcJQcIRcKOcKOcKPcKOcKOcKFcKGcKGcIRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqL
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacIXcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIYcKqcJDcFYcLtcJEeeBefCefCcFYcKScKTcKUdmQdngcFYefJefKcFYdmUdmUdmUdmUdmUdmUdmTcLacLbcIPcJncIRcJJcJJcLccLdcLecLecLecLecLecLecLecLfcJIcJJcJJcJKcLgcLhcLicLjcLkcJKcLlcKjcJOcIRcJQcJQcJQcIRcLmcLmcKjcLmcLmcKFcKGcKGcIRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqL
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJvcJwcJwcJwcJwcJwcJwcJwcJwcJwcJwcJwcJwcJwcLncJycJwcJwcJwcJwcJzcLncLocLpcJDcFYcLtcJEcJEcJEcJEcFYcJEcJEcJEcJEdmQcFYcKXcLrcMxdmPdmPdmPdmPdmPdmPdmBcIPcIPcIPcIPcIPcJJcJJcLccLvcLwcJJcLxcLycLzcJJcLwcLvcJIcJJcJJcJKcJKcJKcJKcJKcJKcJKcLlcKjcJOcIRcJQcJQcJQcIRcLAcLAcKjcLAcLAcKFcKGcKGcIRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqLdqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqL
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacIXcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcFYdmLcOLcOocOwcJEcFYcJEdiPdiPdmEcKVcFYcKXdvmcIPcLHcLIcLIcLIcLJcLIcLKcIPcLLcLLcLLcIPcJJcJJcLMcLNcLOcLPcLQcLRcLScLTcLUcLNcLVcJJcJJcIRcLWcLWcLWcLWcLWcIRcIRcKkcIRcIRcIRcKkcIRcIRcKjcKjcKjcKjcKjcKFcKGcKGcIRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqLdqLdqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqL
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadolcFYcFYcFYcFYcLXcFYcLYcFYcFYcFYcFYcFYcKXcLrcLZcMacMacMacMacMacMacMacMbcMacMacMacMbcJJcJJcJJcMccJJcJJcMdcJJcMdcJJcJJcMccJJcJJcJJcMecJQcJQcJQcJQcJQcMecJQcJQcJQcJQcJQcJQcJQcMecLAcLAcLAcLAcLAcKFcKGcKGcIRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqLdqLdqLdqLdqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqL
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoldFAdFmefjcFYcJEcMhcJEcMicJEcMjcJEcJEcJEcMkcIPcMlcMmcMmcMncMocMpcMqcIPcMrcMrcMrcIPcJJcJJcKKcMscMtcLPcMucJJcMvcLTcMwcMscKLcJJcJJcMecJQcJQcJQcJQcJQcMecJQcJQcJQcJQcJQcJQcJQcMecLAcLAcLAcLAcLAcIRcKkcKkcIRcIRcIRcIRcIRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqLdqLdqLdqLdqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadolcNzcJEcJEcMxcJEcMycJEcKXcKXcKXcMzcMzcKXcMkcIPcMAcMAcMAcMBcMCcMBcMDcIPcIPcIPcIPcIPcJJcJJcLccLNcMEcJJcMdcJJcMdcJJcMEcLNcJIcJJcJJcIRcMFcMGcMGcMGcMHcIRcIRcMIcIRcIRcIRcKkcIRcIRcIRcMJcMJcMJcIRcIRcJQcJQcJQcMKcJQcMLcIRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqLdqLdqLdqLdqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadolcFYcFYcFYcFYcMMcFYcJEcKXcKXcMNcMOcMOcMPcMkcIPcIPcMQcMRcMScMTcMUcMVcMQaaaaaaaaacIRcJJcJJcLccIRcIRcMWcMXcJJcMYcMZcIRcIRcJIcJJcJJcIRaaaaaaaaaaaaaaacIRcNacNbcIRcKjcNccKjcKjcNdcNecNfcNfcNfcNgcIRcJQcJQcKmcKmcJQcJQcNhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFYdmydmCcNIcNIcJEcFYcJEcKXcKXcMNcMOcMOcMPdmDcNJcNKcMQcNpcNqcNrczYcNtcMQaaaaaaaaacIRcJJcJJcLccIRcIRcKvcKwcKwcKwcKycIRcIRcJIcJJcJJcIRaaaaaaaaaaaaaaacIRcNbcNbcIRcNucNucNucKjcNdcNfcNfcNfcNfcNvcIRcJQcNwcKlcKlcNxcJQcNyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFYdmycJEcJEcJEcJEcFYcJEcJEcJEcJEdmBdmBcKXcKXcKXcNHcMQcNAcNrcNrcNrcNrcMQaaaaaaaaacIRcJJcJJcLMcJpcJpcJpcJpcJpcJpcJpcJpcJpcLVcJJcJJcIRaaaaaaaaaaaaaaacIRcNBcNbcIRcNucNCcNucKjcNdcNdcNdcNdcNdcNdcIRcJQcNwcKlcKlcNxcJQcNyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFYdpjdpjdprdpqdptcFYdpndpndpndppcJEcJEefOefNefMefLcMQcNrcNrcNrcNrcNLcMQcIRcIRcIRcIRcIRcIRdaQcIRcIRcJJcJJcJJcJJcJJcIRcIRcIRcIRcIRcIRaaaaaaaaaaaaaaacIRcNNcNbcIRcKNcKjcKjcKjcNdaaaaaaaaaaaaaaacIRcJQcNwcKlcKlcNxcJQcNyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYdpxdpxcFYcFYcFYcFYcMQcNrcNPcNQcNRcNScMQdRydRYdRYdRydRHdRXcJJdRzcIRcIRcIRcOacIRcIRdolaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacIRcIRcIRcIRcIRcIRcIRcIRcNdaaaaaaaaaaaaaaacNUcJQcNwcKlcKlcNxcJQcNyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeSeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeOeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJ
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacNVcNWcNWcNVaaaaaaaaacMQcNrcNXcNYcNZcNYcMQdRydRZdRZdRydRJdRCcJJdRzcIRcJocLVcJJcLMcOhcIRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacObcJQcJQcOccOccJQcJQcObaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOdcOecOecOecOedjfdjfcOecOecOgaaacMQcNrcNrcNrcNrcNrcMQdRydRYdRYdRydRRdRCcJJdRzcIRcJIcJJcJJcJJcLccIRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOBdXUdXTcOFaaaaaaaaaaaaaaaaaaaaaaaaaaacIRcOicJQcJQcJQcJQcOjcIRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOkcOlcOmdiYdiXcOpcOpcOqcOqcOecOgcMQcMQcMQcMQcMQcMQcMQdRydRydRydRydRBdRCcJJdRzcIRdRAcORdRAdRDdRAcIRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOBdaCdiZdROdaFcOFaaaaaaaaaaaaaaaaaaaaaaaacIRcIRcIRcIRcIRcIRcIRcIRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOkcOlcOvcOpcOpcOpcOpcOpcOpdjbdjaaaaaaaaaaaaaaaaaaacIRdREdRydREdRydRHdRCcJJdRFdRGcJIcJJdRIcJJcMvcNdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOVdjccOMcOMdaJcOVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOkcOlcOpcOHcOHcOHcOHcOHcOHcOecOIaaaaaaaaaaaaaaaaaacIRdREdRydREdRydRJdRCcJJdRFdRGcKacJJcLxdRLcMXcNdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadXIcOYcOYcOYcOMdXIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOQcOecOecOecOecOecOecOecOecOIaaaaaaaaaaaaaaaaaaaaacIRdREdRydREdRydRRdRQcMEdRTcOydRAdRSdRVdRWdRAcNdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOVcZpcOYcOZdaNcOVdaMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFYcIPcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcIQcIQcIQcIQcIQcIQcIQcIQcIQcIQcIQcIQcIRcIRcIRcIRcIRcIRcIRcGrcIScITcIScGrcIRcIRcIRcIRcIRcIRcIRcIRcGFcHbcHbcIUcIVcIVcIVcIWcHbcHccHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqLdqLdqLdqLdqLdqLdqL
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFYeidcFYaaaaaaaaaaaacFYeiBeizeiAcJHcJHcFYcJfcJjcIQcJfcJkcIQcJlcJmcIQcJfcJjcIQcJncIRdRcdRbdRadQZcJqcGrcIScITcIScGrcJrcJscJtcJucJucIRaaaaaacGFcHbcHbcHbcHbcHbcHbcHbcHbcHccHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqLdqLdqLdqLdqLdqL
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFYeiicFYcFYcFYcFYcFYcFYefLcJEcJEcJEeiCcFYcJGcJmcIQcJGcJgcIQcJGcJjcIQcJGcJicIQcJncIRcJIcJJcJJcJJcJJcGrcIScITcIScGrcJucJucJucJucJucIRaaaaaacJKcJKcJKcJKcJKcJKcJKcJKcJKcJKcJKcIRcIRcIRcIRcIRcIRcIRcIRcIRcIRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqLdqLdqLdqLdqL
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacIPcIPcIPcIPcIPcFYcLteieeigeihcJceifcFYeiDcJEcJEcJEeiCcFYcIQcIQcIQcIQcIQcIQcIQcIQcIQcIQcIQcIQcJncIRcJIcJJcJJcJJcJJcGrcGrcIKcGrcGrcJucJucJucJucJucIRcJKcJKcJKcJKcJKcJKcJNcJOcJPcIRcJQcJQcJQcIRcJQcJQcJQcJQcJQcJQcJQcJQcIRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqLdqLdqLdqL
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacIXcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIYcIZcJbcJTdmScLtcJEcJEcJEcJEefPcFYefOcJEcJEcJEehVcFYcJYcJicIQcJfcJicIQcJZcJjcIQcJfcJmcIQcJncIRcKadQYdPKcKccKdcIRcKecKecKecIRcJucJucJucJucJucIRcKfcKgcKfcKhcKicJKcKjcKjcKjcKkcJQcJQcJQcKkcJQcKlcKmcKlcJQcKncKocKpcIRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqLdqLdqL
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJvcJwcJwcJwcJwcJwcJwcJwcJwcJwcJwcJwcJwcJwcJxcJycJwcJwcJwcJzcJxcJAcJBcJDefMcFYefNcJEcJEcJEcJEcJVcFYeeBcJEcJEcJEefjcFYcJGcJjcJhcJGcJjcIQcJGcJXcIQcJGcKtcIQcJncIRcKucIRcKvcKwcKxcIRcJJcJJcJJcIRcKvcKwcKycIRcKzcIRcKAcKBcKAcKBcKAcJKcIRcIRcIRcIRcJQcJQcJQcIRcKCcKDcKlcKEcKCcKFcKGcKGcIRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqLdqL
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacIXcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcFYehZcJEcJEcJEcJEeiacFYeibcJEcJEeiccFYcFYcFYcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcJncIRcJJcJJcKKcKbcKbcKbcKbcKbcKbcKbcKbcKbcKLcJJcJJcKMcKAcKAcKAcKAcKAcJKcKNcKjcJNcIRcJQcJQcJQcIRcKOcKOcKPcKOcKOcKFcKGcKGcIRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqL
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacIXcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIYdpicJDehWcFYehXefCefCdvmcJEcFYcFYehYcJEcJEcKScFYefJefKcFYdmUdmUdmUdmUdmUdmUdmTcLacLbcIPcJncIRcJJcJJcLccLdcLecLecLecLecLecLecLecLfcJIcJJcJJcJKcLgcLhcLicLjcLkcJKcLlcKjcJOcIRcJQcJQcJQcIRcLmcLmcKjcLmcLmcKFcKGcKGcIRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqL
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJvcJwcJwcJwcJwcJwcJwcJwcJwcJwcJwcJwcJwcJwcJRcJycJwcJwcJwcJzcJRcJScJBcJDdmCcFYcIPcFYcFYcFYcJEcFYdmEcJEcJEcJEcKTcFYcKXcLrcMxdmPdmPdmPdmPdmPdmPdmBcIPcIPcIPcIPcIPcJJcJJcLccLvcLwcJJcLxcLycLzcJJcLwcLvcJIcJJcJJcJKcJKcJKcJKcJKcJKcJKcLlcKjcJOcIRcJQcJQcJQcIRcLAcLAcKjcLAcLAcKFcKGcKGcIRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqLdqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqL
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacIXcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIYcKqcJDcOwcFYdiXcOLcOvcFYcJEcFYdiPdiPcJEcJEcKUcFYcKXdvmcIPcLHcLIcLIcLIcLJcLIcLKcIPcLLcLLcLLcIPcJJcJJcLMcLNcLOcLPcLQcLRcLScLTcLUcLNcLVcJJcJJcIRcLWcLWcLWcLWcLWcIRcIRcKkcIRcIRcIRcKkcIRcIRcKjcKjcKjcKjcKjcKFcKGcKGcIRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqLdqLdqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqL
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLncGbcGbcGbcGbcGbcGbcGbcGbcGbcGbcGbcGbcGbdptcGacGbcGbcGbcHrdptdprdpqdvmdFmcFYdDDcJEdFAcFYcLXcFYcFYcFYcLYcFYcFYcFYcKXcLrcLZcMacMacMacMacMacMacMacMbcMacMacMacMbcJJcJJcJJcMccJJcJJcMdcJJcMdcJJcJJcMccJJcJJcJJcMecJQcJQcJQcJQcJQcMecJQcJQcJQcJQcJQcJQcJQcMecLAcLAcLAcLAcLAcKFcKGcKGcIRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqLdqLdqLdqLdqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqL
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJMcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYdmDdmLdvmdmQcFYdngcLtdpjcFYcJEcMhcJEcMicJEcMjdoWdoWcJEcMkcIPcMlcMmcMmcMncMocMpcMqcIPcMrcMrcMrcIPcJJcJJcKKcMscMtcLPcMucJJcMvcLTcMwcMscKLcJJcJJcMecJQcJQcJQcJQcJQcMecJQcJQcJQcJQcJQcJQcJQcMecLAcLAcLAcLAcLAcIRcKkcKkcIRcIRcIRcIRcIRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqLdqLdqLdqLdqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacLncGbcGbcGbcGbcGbcGbcGbcGbcGbcGbcGbcGbcGbcKHcGacGbcGbcGbcHrcKHcKVcKJdvmcLrcKIcLtcJEcJEcKscJEcMycJEcKXcKXcMzcMzcKXcKXcMkcIPcMAcMAcMAcMBcMCcMBcMDcIPcIPcIPcIPcIPcJJcJJcLccLNcMEcJJcMdcJJcMdcJJcMEcLNcJIcJJcJJcIRcMFcMGcMGcMGcMHcIRcIRcMIcIRcIRcIRcKkcIRcIRcIRcMJcMJcMJcIRcIRcJQcJQcJQcMKcJQcMLcIRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqLdqLdqLdqLdqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJMcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYdvmcJWcFYcFYcFYcFYcFYcMMcFYcJecKXcMNcJdcMOcMPcKXcMkcIPcIPcMQcMRcMScMTcMUcMVcMQaaaaaaaaacIRcJJcJJcLccIRcIRcMWcMXcJJcMYcMZcIRcIRcJIcJJcJJcIRaaaaaaaaaaaaaaacIRcNacNbcIRcKjcNccKjcKjcNdcNecNfcNfcNfcNgcIRcJQcJQcKmcKmcJQcJQcNhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFYcFYcFYcFYcNHcNzcNIcNIcJEcFYcLocKXcMNcMOcMOcMPcKXcOocNJcNKcMQcNpcNqcNrczYcNtcMQaaaaaaaaacIRcJJcJJcLccIRcIRcKvcKwcKwcKwcKycIRcIRcJIcJJcJJcIRaaaaaaaaaaaaaaacIRcNbcNbcIRcNucNucNucKjcNdcNfcNfcNfcNfcNvcIRcJQcNwcKlcKlcNxcJQcNyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFYdmycJEcJEcJEcJEcJEcJEcFYcLocJEcJEdmBdmBcKXcKXcKXcKXcLpcMQcNAcNrcNrcNrcNrcMQaaaaaaaaacIRcJJcJJcLMcJpcJpcJpcJpcJpcJpcJpcJpcJpcLVcJJcJJcIRaaaaaaaaaaaaaaacIRcNBcNbcIRcNucNCcNucKjcNdcNdcNdcNdcNdcNdcIRcJQcNwcKlcKlcNxcJQcNyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFYdmycJEcJEcJEcJEcJEeiscFYdzScJEcJEdppcJEcJEeireiqeipeiocMQcNrcNrcNrcNrcNLcMQcIRcIRcIRcIRcIRcIRdaQcIRcIRcJJcJJcJJcJJcJJcIRcIRcIRcIRcIRcIRaaaaaaaaaaaaaaacIRcNNcNbcIRcKNcKjcKjcKjcNdaaaaaaaaaaaaaaacIRcJQcNwcKlcKlcNxcJQcNyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFYeiteiteiueiveiyeixeiwcFYdzSdpndpncFYdpxdpxcFYcFYcFYcFYcMQcNrcNPcNQcNRcNScMQdRydRYdRYdRydRHdRXcJJdRzcIRcIRcIRcOacIRcIRdolaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacIRcIRcIRcIRcIRcIRcIRcIRcNdaaaaaaaaaaaaaaacNUcJQcNwcKlcKlcNxcJQcNyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeSeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeOeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJeeJ
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcNVcNWcNWcNVaaaaaaaaacMQcNrcNXcNYcNZcNYcMQdRydRZdRZdRydRJdRCcJJdRzcIRcJocLVcJJcLMcOhcIRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacObcJQcJQcOccOccJQcJQcObaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOdcOecOecOecOecOecOedjfdjfcOecOecOgaaacMQcNrcNrcNrcNrcNrcMQdRydRYdRYdRydRRdRCcJJdRzcIRcJIcJJcJJcJJcLccIRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOBdXUdXTcOFaaaaaaaaaaaaaaaaaaaaaaaaaaacIRcOicJQcJQcJQcJQcOjcIRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOkcOlcOmdiYeijcOqeikcOpcOpeiEeiEcOecOgcMQcMQcMQcMQcMQcMQcMQdRydRydRydRydRBdRCcJJdRzcIRdRAcORdRAdRDdRAcIRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOBdaCdiZdROdaFcOFaaaaaaaaaaaaaaaaaaaaaaaacIRcIRcIRcIRcIRcIRcIRcIRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOkcOleilcOpcOpcOpcOpcOpcOpcOpcOpdjbdjaaaaaaaaaaaaaaaaaaacIRdREdRydREdRydRHdRCcJJdRFdRGcJIcJJdRIcJJcMvcNdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOVdjccOMcOMdaJcOVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOkcOleimeincOHcOHcOHcOHcOHcOpcOpcOecOIaaaaaaaaaaaaaaaaaacIRdREdRydREdRydRJdRCcJJdRFdRGcKacJJcLxdRLcMXcNdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadXIcOYcOYcOYcOMdXIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOQcOecOecOecOecOecOecOecOecOecOecOIaaaaaaaaaaaaaaaaaaaaacIRdREdRydREdRydRRdRQcMEdRTcOydRAdRSdRVdRWdRAcNdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOVcZpcOYcOZdaNcOVdaMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOycOycOycOycOycOycOycOycOycOycOycOycOycOycOycOycOycOycOycOycOycOycOycOycOycOycOydRncJJcJJdRmcLccNdcNdcNdaaaaaaaaaaaaaaaaaaaaacOBdTBcPrdXIcSocPpdTBcPpcOFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacPgcPicPicPicPicPicPicPicPicPicPicPicPicPicPjcPhdiUdiTdRsdRrdRrdRrdRrdRrcOycPkcMscPlcJJcJJcPmcLccMscPkcNdaaaaaaaaaaaaaaaaaaaaacOVdaicOYcZrdYscRPdajcRPcOVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacPgcPicPicPtcPucPvcPtcPucPudYldYhdYmcPucPxcPycPhcPicPidiVdRrdRrdRrdRrdRrcOycPkcLvcPlcJJcJJcJJcLccLvcPkcNdcNdcNdcNdcNdcNdaaaaaacOVcPLcOYcOYdancRWcRWdakcOVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -12317,7 +12355,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeecydwmdwndwodvcdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsaaaaaaaaaaaaaecudvddvddvddvddvddvddvddwpdDFdwrdwsdDHdwudEVdwvdwYdEedrDdEidEgdrDdwAdwBdEddwDdwEdEbdtJdDTdDIdDZdDWdEAdEKegldwMdpvdpwdBvdBvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUdqUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaedwQdwRdwSdvcdwTdwUdvcdvcdvcdvcdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsaaaaaaaaaaaaaaaaaaaecudvddvddvddvddvddvddvddwVdDFdwrdwsdDHdxxdpodwvdwYdwZdrDdDEdDBdrDecrdtJdtJdtJdtJecqdtJdDzdDvdvzdDwdDudxiecodxkdpkdpldCidCiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqUdqUdqUdqUdqUaaadqUdqUdqUdqUdqUaaadqUdqUdqUdqUdqUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeecMdxpdxqdxrdxsdxtdszduBdxudvcdxvdxwdvcdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsaaaaaaaaaaaaaaaaaaaecudvddvddvddvddvddvddvddrTdIQdJGdILdDHdxydpJdwvdxzdxAdrDdKPdKOdLbdKUdLfdLddKcdrDdKAdKsdKIdKBdvzdKJdLgdxPecLdxRdpkdBvdBvdBvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqUdqUdqUdqUdqUaaadqUdqUdqUdqUdqUaaadqUdqUdqUdqUdqUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaedxSdxTdxpdxUdxVdxWdxXdxYdxudxZdxwdyadxvdvcdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsaaaaaaaaaaaaaaaaaaaegmdycdyddyeecDdycdyddygdyhdEWecAecBecBecBdrDdrDdrDdrDdrDdICdwqdIKdxEdrEdxGdGudrDdyqdFRdHidHgdrDdGwdFFdpDdpCdyzdyAdyBdrDdyCecEeaKeaKeaKeaKeaKeaKecFebJaaaaaaaaaaaaaaaaaaaaaaaadqUdqUdqUdqUdqUaaaaaaaaaaaaaaaaaaaaadqUdqUdqUdqUdqUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaedxSdxTdxpdxUdxVdxWdxXdxYdxudxZdxwdyadxvdvcdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsaaaaaaaaaaaaaaaaaaaegmdycdyddyeecDdycdyddygdyhdEWecAeiFecBecBdrDdrDdrDdrDdrDdICdwqdIKdxEdrEdxGdGudrDdyqdFRdHidHgdrDdGwdFFdpDdpCdyzdyAdyBdrDdyCecEeaKeaKeaKeaKeaKeaKecFebJaaaaaaaaaaaaaaaaaaaaaaaadqUdqUdqUdqUdqUaaaaaaaaaaaaaaaaaaaaadqUdqUdqUdqUdqUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaedgdxSdyFdxSdxqdxqdwTdyGdxVdvcdwodyHdvcdxwdyIdvcdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsaaaaaaaaaaaaaaaaaaadyJdOydyLegpegoegndyLdOodOxdOLdyLedhdOFdOCdyUdOAdOBdyVdyUegqdwqdzbdzcdzddNUdOcdrDdzhdOkdObdNXdrDdvzdOndvzdrDdrDdzmdzndzodzpdzqdzrdzrdzsdzrdzrdzrdztecZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaedzudzvdxqdzwdzxdxqdvIdzydxWdzzdzAdzBdvcdvcdvcdvcdvcdvcdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTaaaaaaaaaaaaaaadzCdMWdATdATdATdATdMJdMMdMOdNqdNDdNGdNKegrdyUegsdNldMkdMjdMidMhdMgdMedvLdvLdMHdMudvLdvLdModMndMmdMldLDdLMdLzegtdvLdvLdLhdLndMadMddzrdLZdLRdAodApdzrebBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaedAqdArdAsdxqdzxdAtdxUdAudxVdAvdvcdAwdAxdvcdAydxudAzdAAdvcdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTaaaaaaaaaaaadABdACdyLdyLdPPdyLdPRdAFdyLdPVdyLdPSdPTegudyUdNledsedtdAPdPXdPWdQddQadQhdQedQldQidQvdQndQldQidQidQxdQAdQCdQNdQOdQPdQRdQSdRkdRldRodRpdRPdRUdBmdBndzrebBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -12331,8 +12369,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsadsadsadsadsadsadsadsadsadsadsadsadvcdFddvcdxudAwdGldzydtWdxUdxudvcdxVdwodvcdGmdGndGndGodvcdGpdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdBvdBvdCidCidCidoPdCidCidCidCidCidCidCidCidGqdGraaeaaaaaaaaaaaaaaaaaaaaeaaeaaedDbdDbdGsdGtdDbdDbdGvdxLdGvdDbdoOdGTdCidCidCidCidBMdBMdBMdBOdBOdBOdBOdBRdBRdBRdBRdBUdBUdBUdBUdBUdFHdFHdGydGzdrndrndGAdFbdqTdqTdsadsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsadsadsadsadsadsadsadsadsadsadsadsadvcdFddvcdAwduBdzBdxudxVdwodzBdvcdFddvcdvcdAydtbdGndGBdGCdGpdGpdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdBvdoFdoJdCidoUdoFdoKdCidCidCidCidCidCidCidCidGDdGEaaaaaaaaaaaaaaaaaedGFdGGdGHdGIdGJdoSdoRdoQdDbdGPdFSegIdDbegHdGTdCidCidCidCidGRdGSdGTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdqTdrldGUdFbdGVdqTdqTdqTdqTdqTdsadsadsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsadsadsadsadsadsadsadsadsadsadsadsadsadvcdFddvcdvcdvcdvcdvcdvcdvcdvcdvcdFddvcdAydtbdAzdtbdGodGWdGpdGpdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdBvdoFdCidCidCidoFdoKdCidCidCidCidCidCidCidGXdGYdGZdHadHadHadHadHadHadHbdHcdHddHedHedoLdFrdFrdDbdvPdwWdwzdDbegJdCidCidCidCidCidFidHkdHldqTdqTdsadsadsadsadsadsadqTdqTdqTdqTdqTdrldGUdFbdHmdGpdHmdqTdqTdqTdqTdsadsadsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHnaaaaaaaaaaaaaaadHndsadsadsadsadsadsadsadsadsadsadsadsadsadsadvcdFddFddFddFddFddFddFddFddFddFddFddvcdAydAzdAzdAzdAAdvcdGpdGpdGpdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdBvdCidCidCidCidoMdoNdCidCidCidCidCidCidCidCidHodHpdHpdHpdHpdHpdHpdHpdHpdHodCidCidCidCidCidCidDbdGvdZCdGvdDbegKdCidCidCidCidCidHsdHtdHudrndrndrndrndHvdrndrndrndrndrndHwdHxdHydHzdFbdGpdGpdGpdHmdBwdqTdsadsadsadsadsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadvcdvcdvcdvcdvcdvcdvcdvcdvcdvcdvcdvcdvcdvcdFNdHAdHBdvcdvcdGpdGpdGpdGpdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdBvdCidCidCidCidCidCidCidCidCidCidCidCidCidGXdHddHCdHDdHDdHDdHDdHDdHDdHDdGXdHddCidCidCidCidCidzSdHEegLdHGdHHdHIdHJdCidCidCidCidGTdGTdGTdqTdqTdsadsadsadsadsadsadsadsadHKdHLdHMdHNdGpdHmdGpdGpdHmdqTdqTdqTdsadsadsadsadsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHnaaaaaaaaaaaaaaadHndsadsadsadsadsadsadsadsadsadsadsadsadsadsadvcdFddFddFddFddFddFddFddFddFddFddFddvcdAydAzdAzdAzdAAdvcdGpdGpdGpdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdBvdCidCidCidCidoMdoNdCidCidCidCidCidCidCidCidHodHpdHpdHpdHpdHpdHpdHpdHpdHodCidCidCidCidCidCidDbeiGdZCdGvdDbegKdCidCidCidCidCidHsdHtdHudrndrndrndrndHvdrndrndrndrndrndHwdHxdHydHzdFbdGpdGpdGpdHmdBwdqTdsadsadsadsadsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadvcdvcdvcdvcdvcdvcdvcdvcdvcdvcdvcdvcdvcdvcdFNdHAdHBdvcdvcdGpdGpdGpdGpdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdBvdCidCidCidCidCidCidCidCidCidCidCidCidCidGXdHddHCdHDdHDdHDdHDdHDdHDdHDdGXdHddCidCidCidCidCidCidHEegLdHGdHHdHIdHJdCidCidCidCidGTdGTdGTdqTdqTdsadsadsadsadsadsadsadsadHKdHLdHMdHNdGpdHmdGpdGpdHmdqTdqTdqTdsadsadsadsadsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadGpdGpdGpdvcdGndGndAzdvcdGpdGpdGpdGpdGpdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdBvdoFdoJdCidCidCidCidCidCidCidCidCidCiaaaaaaaaaaaaaaaaaaaaaaaadBvdBvdBvdBvdBvdBvdBvdBvdCidCidCidCidCidCidHEdHOdHGdCidCidCidBvdBvdqTdqTdqTdqTdsadsadsadsadsadsadsadBwdHmdGpdHPdGpdHmdGpdGpdGpdqTdqTdqTdqTdqTdsadsadsadsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadGpdGpdGpdvcdHQdHRdHQdvcdGpdGpdGpdGpdGpdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdBvdoFdCidCidCidCidCidCidCidCidCidCidCiaaaaaaaaaaaaaaaaaaaaaaaadBvdBvdBvdqTdqTdqTdqTdBvdBvdBvdCidCidCidCidCidHSdCidCidCidCidBvdqTdqTdqTdsadsadsadsadsadsadsadsadsadsadsadsadBwdsadGpdGVdsadqTdsadsadqTdqTdqTdqTdsadsadsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndHndsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadGpdGpdvcdHTdHAdFNdvcdGpdGpdGpdGpdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdBvdBvdoIdoGdoHdCidCidCidCidCidBvdBvdBvaaaaaaaaaaaaaaaaaaaaaaaaaaadqTdqTdqTdqTdqTdqTdqTdqTdBvdBvdBvdCidCidCidHSdCidCiduDduDduDdsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadsadqTdsadsadsadqTdqTdqTdqTdsadsadsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa