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 += "SeverityUntil startAdjust 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 += "SeverityName" - for(var/severity = EVENT_LEVEL_MUNDANE to EVENT_LEVEL_MAJOR) - var/datum/event_meta/EM = next_event[severity] + html += "
    " + html += "

    Add Event

    " + html += "" + html += "NameTypeWeightOneShot" html += "" - html += "[severity_to_string[severity]]" - html += "[EM ? EM.name : "Nothing"]" + html += "[new_event.name ? new_event.name : "Enter Event"]" + html += "[new_event.event_type ? new_event.event_type : "Select Type"]" + html += "[new_event.weight ? new_event.weight : 0]" + html += "[new_event.one_shot]" html += "" - html += "" - html += "
    " + html += "" + html += "Add
    " + html += "
    " + else + html += "Round End Report: [report_at_round_end ? "On": "Off"]
    " + html += "
    " + html += "

    Event Start

    " + + html += "" + html += "SeverityStarts AtStarts InAdjust StartPauseInterval 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 += "SeverityNameEvent RotationClear" + 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 += "SeverityNameEnds AtEnds InStop" + 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