diff --git a/baystation12.dme b/baystation12.dme index ca75948dfff..9d315198985 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -759,6 +759,7 @@ #include "code\game\objects\structures\door_assembly.dm" #include "code\game\objects\structures\electricchair.dm" #include "code\game\objects\structures\extinguisher.dm" +#include "code\game\objects\structures\fireaxe_cabinet.dm" #include "code\game\objects\structures\flora.dm" #include "code\game\objects\structures\girders.dm" #include "code\game\objects\structures\grille.dm" @@ -791,7 +792,6 @@ #include "code\game\objects\structures\crates_lockers\largecrate.dm" #include "code\game\objects\structures\crates_lockers\closets\coffin.dm" #include "code\game\objects\structures\crates_lockers\closets\crittercrate.dm" -#include "code\game\objects\structures\crates_lockers\closets\fireaxe.dm" #include "code\game\objects\structures\crates_lockers\closets\fitness.dm" #include "code\game\objects\structures\crates_lockers\closets\gimmick.dm" #include "code\game\objects\structures\crates_lockers\closets\job_closets.dm" @@ -994,6 +994,7 @@ #include "code\modules\client\preference_setup\skills\skills.dm" #include "code\modules\clothing\chameleon.dm" #include "code\modules\clothing\clothing.dm" +#include "code\modules\clothing\clothing_accessories.dm" #include "code\modules\clothing\ears\skrell.dm" #include "code\modules\clothing\glasses\glasses.dm" #include "code\modules\clothing\glasses\hud.dm" diff --git a/code/ATMOSPHERICS/_atmospherics_helpers.dm b/code/ATMOSPHERICS/_atmospherics_helpers.dm index 6fc2b923dd1..26740301ff1 100644 --- a/code/ATMOSPHERICS/_atmospherics_helpers.dm +++ b/code/ATMOSPHERICS/_atmospherics_helpers.dm @@ -15,7 +15,7 @@ /obj/machinery/atmospherics/var/debug = 0 -/client/proc/atmos_toggle_debug(var/obj/machinery/atmospherics/M in view()) +/client/proc/atmos_toggle_debug(var/obj/machinery/atmospherics/M in range(world.view)) set name = "Toggle Debug Messages" set category = "Debug" M.debug = !M.debug diff --git a/code/__defines/gamemode.dm b/code/__defines/gamemode.dm index 827737cf92a..7e2f316cc07 100644 --- a/code/__defines/gamemode.dm +++ b/code/__defines/gamemode.dm @@ -83,7 +83,7 @@ var/list/be_special_flags = list( #define MODE_MALFUNCTION "malf" #define MODE_TRAITOR "traitor" -#define DEFAULT_TELECRYSTAL_AMOUNT 12 +#define DEFAULT_TELECRYSTAL_AMOUNT 25 ///////////////// ////WIZARD ////// diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index d138d581987..2a3c845bb71 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -128,8 +128,19 @@ #define ANIMAL_SPAWN_DELAY round(config.respawn_delay / 6) #define DRONE_SPAWN_DELAY round(config.respawn_delay / 3) +#define ANIMAL_SPAWN_DELAY round(config.respawn_delay / 6) +#define DRONE_SPAWN_DELAY round(config.respawn_delay / 3) + +// Incapacitation flags, used by the mob/proc/incapacitated() proc +#define INCAPACITATION_RESTRAINED 1 +#define INCAPACITATION_BUCKLED_PARTIALLY 2 +#define INCAPACITATION_BUCKLED_FULLY 4 + +#define INCAPACITATION_DEFAULT (INCAPACITATION_RESTRAINED|INCAPACITATION_BUCKLED_FULLY) +#define INCAPACITATION_ALL (INCAPACITATION_RESTRAINED|INCAPACITATION_BUCKLED_PARTIALLY|INCAPACITATION_BUCKLED_FULLY) #define MOB_PULL_NONE 0 #define MOB_PULL_SMALLER 1 #define MOB_PULL_SAME 2 -#define MOB_PULL_LARGER 3 \ No newline at end of file +#define MOB_PULL_LARGER 3 + diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 9dec281ed86..fb00b9e9e68 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -6,6 +6,8 @@ var/list/gamemode_cache = list() var/nudge_script_path = "nudge.py" // where the nudge.py script is located + var/list/lobby_screens = list("title") // Which lobby screens are available + var/log_ooc = 0 // log OOC channel var/log_access = 0 // log login/logout var/log_say = 0 // log client say @@ -699,6 +701,9 @@ var/list/gamemode_cache = list() if(values.len > 0) language_prefixes = values + if ("lobby_screens") + config.lobby_screens = text2list(value, ";") + else log_misc("Unknown setting in configuration: '[name]'") diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 14f032ab9ad..eba0fe047ce 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -170,8 +170,8 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee /obj/item/weapon/storage/toolbox/emergency, /obj/item/clothing/suit/storage/hazardvest, /obj/item/clothing/suit/storage/hazardvest, - /obj/item/clothing/suit/storage/vest, - /obj/item/clothing/suit/storage/vest, + /obj/item/clothing/suit/armor/vest, + /obj/item/clothing/suit/armor/vest, /obj/item/weapon/tank/emergency_oxygen/engi, /obj/item/weapon/tank/emergency_oxygen/engi, /obj/item/weapon/tank/emergency_oxygen/engi, @@ -717,7 +717,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee /obj/item/weapon/gun/projectile/sec, /obj/item/weapon/gun/projectile/sec, /obj/item/weapon/storage/box/flashbangs, - /obj/item/weapon/storage/box/flashbangs) + /obj/item/weapon/storage/box/teargas) cost = 40 containertype = /obj/structure/closet/crate/secure/weapon containername = "Weapons crate" @@ -752,17 +752,14 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee /datum/supply_packs/randomised/armor num_contained = 5 - contains = list(/obj/item/clothing/suit/storage/vest, - /obj/item/clothing/suit/storage/vest/officer, - /obj/item/clothing/suit/storage/vest/warden, + contains = list(/obj/item/clothing/suit/armor/vest, + /obj/item/clothing/suit/armor/vest/security, + /obj/item/clothing/suit/armor/vest/detective, /obj/item/clothing/suit/storage/vest/hos, /obj/item/clothing/suit/storage/vest/pcrc, - /obj/item/clothing/suit/storage/vest/detective, - /obj/item/clothing/suit/storage/vest/heavy, - /obj/item/clothing/suit/storage/vest/heavy/officer, - /obj/item/clothing/suit/storage/vest/heavy/warden, - /obj/item/clothing/suit/storage/vest/heavy/hos, - /obj/item/clothing/suit/storage/vest/heavy/pcrc) + /obj/item/clothing/suit/storage/vest/warden, + /obj/item/clothing/suit/storage/vest/officer, + /obj/item/clothing/suit/storage/vest) name = "Armor crate" cost = 40 @@ -790,6 +787,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee /obj/item/clothing/head/helmet/riot, /obj/item/clothing/suit/armor/riot, /obj/item/weapon/storage/box/flashbangs, + /obj/item/weapon/storage/box/teargas, /obj/item/weapon/storage/box/beanbags, /obj/item/weapon/storage/box/handcuffs) cost = 60 @@ -1286,14 +1284,6 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee group = "Security" access = access_armory contains = list(/obj/item/clothing/under/tactical, - /obj/item/clothing/suit/armor/tactical, - /obj/item/clothing/head/helmet/tactical, - /obj/item/clothing/mask/balaclava/tactical, - /obj/item/clothing/glasses/sunglasses/sechud/tactical, - /obj/item/weapon/storage/belt/security/tactical, - /obj/item/clothing/shoes/jackboots, - /obj/item/clothing/gloves/black, - /obj/item/clothing/under/tactical, /obj/item/clothing/suit/armor/tactical, /obj/item/clothing/head/helmet/tactical, /obj/item/clothing/mask/balaclava/tactical, diff --git a/code/game/antagonist/outsider/mercenary.dm b/code/game/antagonist/outsider/mercenary.dm index 7315eb418ff..2460345a34d 100644 --- a/code/game/antagonist/outsider/mercenary.dm +++ b/code/game/antagonist/outsider/mercenary.dm @@ -45,7 +45,7 @@ var/datum/antagonist/mercenary/mercs player.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/pill/cyanide(player), slot_in_backpack) if (player.mind == leader) - var/obj/item/device/radio/uplink/U = new(player.loc, player.mind, 40) + var/obj/item/device/radio/uplink/U = new(player.loc, player.mind, DEFAULT_TELECRYSTAL_AMOUNT * 4) player.put_in_hands(U) player.update_icons() diff --git a/code/game/machinery/computer/atmos_alert.dm b/code/game/machinery/computer/atmos_alert.dm index f4b06aff1c1..04c4ecc5013 100644 --- a/code/game/machinery/computer/atmos_alert.dm +++ b/code/game/machinery/computer/atmos_alert.dm @@ -12,12 +12,12 @@ var/global/list/minor_air_alarms = list() icon_screen = "alert:0" light_color = "#e6ffff" -/obj/machinery/computer/atmos_alert/New() +/obj/machinery/computer/atmos_alert/initialize() ..() - atmosphere_alarm.register(src, /obj/machinery/computer/station_alert/update_icon) + if(atmosphere_alarm) atmosphere_alarm.register(src, /obj/machinery/computer/station_alert/update_icon) /obj/machinery/computer/atmos_alert/Destroy() - atmosphere_alarm.unregister(src) + if(atmosphere_alarm) atmosphere_alarm.unregister(src) ..() /obj/machinery/computer/atmos_alert/attack_hand(mob/user) diff --git a/code/game/machinery/floor_light.dm b/code/game/machinery/floor_light.dm index 9267f1edbeb..7298b62abf9 100644 --- a/code/game/machinery/floor_light.dm +++ b/code/game/machinery/floor_light.dm @@ -19,6 +19,9 @@ var/list/floor_light_cache = list() var/default_light_power = 2 var/default_light_colour = "#FFFFFF" +/obj/machinery/floor_light/prebuilt + anchored = 1 + /obj/machinery/floor_light/attackby(var/obj/item/W, var/mob/user) if(istype(W, /obj/item/weapon/screwdriver)) anchored = !anchored diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 5f57174074a..d7c037839d8 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -146,22 +146,15 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ /obj/machinery/hologram/holopad/process() for (var/mob/living/silicon/ai/master in masters) - var/active_ai = (master && !master.stat && master.client && master.eyeobj)//If there is an AI attached, it's not incapacitated, it has a client, and the client eye is centered on the projector. + var/active_ai = (master && !master.incapacitated() && master.client && master.eyeobj)//If there is an AI with an eye attached, it's not incapacitated, and it has a client if((stat & NOPOWER) || !active_ai) clear_holo(master) continue - if((HOLOPAD_MODE == RANGE_BASED && (get_dist(master.eyeobj, src) > holo_range))) + if(!(masters[master] in view(src))) clear_holo(master) continue - if(HOLOPAD_MODE == AREA_BASED) - var/area/holo_area = get_area(src) - var/area/eye_area = get_area(master.eyeobj) - if(eye_area != holo_area) - clear_holo(master) - continue - use_power(power_per_hologram) return 1 @@ -169,8 +162,21 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ if(masters[user]) step_to(masters[user], user.eyeobj) // So it turns. var/obj/effect/overlay/H = masters[user] - H.loc = get_turf(user.eyeobj) + H.forceMove(get_turf(user.eyeobj)) masters[user] = H + + if(!(H in view(src))) + clear_holo(user) + return 0 + + if((HOLOPAD_MODE == RANGE_BASED && (get_dist(user.eyeobj, src) > holo_range))) + clear_holo(user) + + if(HOLOPAD_MODE == AREA_BASED) + var/area/holo_area = get_area(src) + var/area/hologram_area = get_area(H) + if(hologram_area != holo_area) + clear_holo(user) return 1 /* diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index ef72e18f0ff..1a686c27d3b 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -828,7 +828,7 @@ icon_state = "sec" icon_deny = "sec-deny" req_access = list(access_security) - products = list(/obj/item/weapon/handcuffs = 8,/obj/item/weapon/grenade/flashbang = 4,/obj/item/device/flash = 5, + products = list(/obj/item/weapon/handcuffs = 8,/obj/item/weapon/grenade/flashbang = 4,/obj/item/weapon/grenade/chem_grenade/teargas = 4,/obj/item/device/flash = 5, /obj/item/weapon/reagent_containers/food/snacks/donut/normal = 12,/obj/item/weapon/storage/box/evidence = 6) contraband = list(/obj/item/clothing/glasses/sunglasses = 2,/obj/item/weapon/storage/box/donut = 2) diff --git a/code/game/mecha/combat/durand.dm b/code/game/mecha/combat/durand.dm index 2d3034573a4..efcd660b615 100644 --- a/code/game/mecha/combat/durand.dm +++ b/code/game/mecha/combat/durand.dm @@ -12,7 +12,7 @@ infra_luminosity = 8 force = 40 var/defence = 0 - var/defence_deflect = 35 + var/def_boost = 15 wreckage = /obj/effect/decal/mecha_wreckage/durand /* @@ -43,10 +43,10 @@ return defence = !defence if(defence) - deflect_chance = defence_deflect + deflect_chance += def_boost src.occupant_message("You enable [src] defence mode.") else - deflect_chance = initial(deflect_chance) + deflect_chance -= def_boost src.occupant_message("You disable [src] defence mode.") src.log_message("Toggled defence mode.") return diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm index eadc96aadd1..ae383d00c47 100644 --- a/code/game/mecha/combat/gygax.dm +++ b/code/game/mecha/combat/gygax.dm @@ -42,15 +42,8 @@ ME.attach(src) return -/obj/mecha/combat/gygax/dark/add_cell(var/obj/item/weapon/cell/C=null) - if(C) - C.forceMove(src) - cell = C - return - cell = new(src) - cell.charge = 30000 - cell.maxcharge = 30000 - +/obj/mecha/combat/gygax/dark/add_cell() + cell = new /obj/item/weapon/cell/hyper(src) /obj/mecha/combat/gygax/verb/overload() set category = "Exosuit Interface" @@ -72,7 +65,7 @@ src.log_message("Toggled leg actuators overload.") return -/obj/mecha/combat/gygax/dyndomove(direction) +/obj/mecha/combat/gygax/do_move(direction) if(!..()) return if(overload) health-- diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm index 5b456e09005..ffbd913b3d5 100644 --- a/code/game/mecha/combat/marauder.dm +++ b/code/game/mecha/combat/marauder.dm @@ -51,7 +51,7 @@ ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src) ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src) + ME = new /obj/item/mecha_parts/mecha_equipment/armor_booster/antiproj_armor_booster(src) ME.attach(src) src.smoke_system.set_up(3, 0, src) src.smoke_system.attach(src) @@ -62,7 +62,7 @@ var/obj/item/mecha_parts/mecha_equipment/ME if(equipment.len)//Now to remove it and equip anew. for(ME in equipment) - equipment -= ME + ME.detach(src) qdel(ME) ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot(src) ME.attach(src) @@ -72,7 +72,7 @@ ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src) ME.attach(src) - ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src) + ME = new /obj/item/mecha_parts/mecha_equipment/armor_booster/antiproj_armor_booster(src) ME.attach(src) return diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index db1cb3d004f..c9974cb76df 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -17,11 +17,11 @@ /obj/item/mecha_parts/mecha_equipment/proc/do_after_cooldown(target=1) - sleep(equip_cooldown) - set_ready_state(1) - if(target && chassis) - return 1 - return 0 + spawn(equip_cooldown) + set_ready_state(1) + if(target && chassis) + return 1 + return 0 /obj/item/mecha_parts/mecha_equipment/New() diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index 7139a52cb39..1695638721f 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -495,123 +495,93 @@ return -/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster //what is that noise? A BAWWW from TK mutants. +/obj/item/mecha_parts/mecha_equipment/armor_booster + name = "armor booster" + desc = "Powered armor-enhancing mech equipment." + icon_state = "mecha_abooster_proj" + equip_cooldown = 10 + energy_drain = 50 + range = 0 + var/deflect_coeff = 1 + var/damage_coeff = 1 + var/melee + + attach(obj/mecha/M as obj) + ..() + activate_boost() + return + + detach() + if(equip_ready) + deactivate_boost() + ..() + return + + get_equip_info() + if(!chassis) return + return "* [src.name]" + + proc/activate_boost() + if(!src.chassis) + return 0 + return 1 + + proc/deactivate_boost() + if(!src.chassis) + return 0 + return 1 + + set_ready_state(state) + if(state && !equip_ready) + activate_boost() + else if(equip_ready) + deactivate_boost() + ..() + + +/obj/item/mecha_parts/mecha_equipment/armor_booster/anticcw_armor_booster //what is that noise? A BAWWW from TK mutants. name = "\improper CCW armor booster" desc = "Close-combat armor booster. Boosts exosuit armor against armed melee attacks. Requires energy to operate." icon_state = "mecha_abooster_ccw" origin_tech = list(TECH_MATERIAL = 3) - equip_cooldown = 10 - energy_drain = 50 - range = 0 - var/deflect_coeff = 1.15 - var/damage_coeff = 0.8 + deflect_coeff = 1.15 + damage_coeff = 0.8 + melee = 1 - can_attach(obj/mecha/M as obj) + activate_boost() if(..()) - if(!M.proc_res["dynattackby"]) - return 1 - return 0 - - attach(obj/mecha/M as obj) - ..() - chassis.proc_res["dynattackby"] = src - return - - detach() - chassis.proc_res["dynattackby"] = null - ..() - return - - get_equip_info() - if(!chassis) return - return "* [src.name]" - - proc/dynattackby(obj/item/weapon/W as obj, mob/user as mob) - if(!action_checks(user)) - return chassis.dynattackby(W,user) - chassis.log_message("Attacked by [W]. Attacker - [user]") - if(prob(chassis.deflect_chance*deflect_coeff)) - user << "\The [W] bounces off [chassis] armor." - chassis.log_append_to_last("Armor saved.") - else - chassis.occupant_message("\The [user] hits [chassis] with [W].") - user.visible_message("\The [user] hits [chassis] with [W].", "You hit [src] with [W].") - chassis.take_damage(round(W.force*damage_coeff),W.damtype) - chassis.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) - set_ready_state(0) - chassis.use_power(energy_drain) - do_after_cooldown() - return + chassis.m_deflect_coeff *= deflect_coeff + chassis.m_damage_coeff *= damage_coeff + chassis.mhit_power_use += energy_drain -/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster + deactivate_boost() + if(..()) + chassis.m_deflect_coeff /= deflect_coeff + chassis.m_damage_coeff /= damage_coeff + chassis.mhit_power_use -= energy_drain + + +/obj/item/mecha_parts/mecha_equipment/armor_booster/antiproj_armor_booster name = "\improper RW armor booster" desc = "Ranged-weaponry armor booster. Boosts exosuit armor against ranged attacks. Completely blocks taser shots, but requires energy to operate." icon_state = "mecha_abooster_proj" origin_tech = list(TECH_MATERIAL = 4) - equip_cooldown = 10 - energy_drain = 50 - range = 0 - var/deflect_coeff = 1.15 - var/damage_coeff = 0.8 + deflect_coeff = 1.15 + damage_coeff = 0.8 + melee = 0 - can_attach(obj/mecha/M as obj) + activate_boost() if(..()) - if(!M.proc_res["dynbulletdamage"] && !M.proc_res["dynhitby"]) - return 1 - return 0 + chassis.r_deflect_coeff *= deflect_coeff + chassis.r_damage_coeff *= damage_coeff + chassis.rhit_power_use += energy_drain - attach(obj/mecha/M as obj) - ..() - chassis.proc_res["dynbulletdamage"] = src - chassis.proc_res["dynhitby"] = src - return - - detach() - chassis.proc_res["dynbulletdamage"] = null - chassis.proc_res["dynhitby"] = null - ..() - return - - get_equip_info() - if(!chassis) return - return "* [src.name]" - - proc/dynbulletdamage(var/obj/item/projectile/Proj) - if(!action_checks(src)) - return chassis.dynbulletdamage(Proj) - if(prob(chassis.deflect_chance*deflect_coeff)) - chassis.occupant_message("The armor deflects incoming projectile.") - chassis.visible_message("The [chassis.name] armor deflects the projectile") - chassis.log_append_to_last("Armor saved.") - else - chassis.take_damage(round(Proj.damage*src.damage_coeff),Proj.check_armour) - chassis.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) - Proj.on_hit(chassis) - set_ready_state(0) - chassis.use_power(energy_drain) - do_after_cooldown() - return - - proc/dynhitby(atom/movable/A) - if(!action_checks(A)) - return chassis.dynhitby(A) - if(prob(chassis.deflect_chance*deflect_coeff) || istype(A, /mob/living) || istype(A, /obj/item/mecha_parts/mecha_tracking)) - chassis.occupant_message("The [A] bounces off the armor.") - chassis.visible_message("The [A] bounces off the [chassis] armor") - chassis.log_append_to_last("Armor saved.") - if(istype(A, /mob/living)) - var/mob/living/M = A - M.take_organ_damage(10) - else if(istype(A, /obj)) - var/obj/O = A - if(O.throwforce) - chassis.take_damage(round(O.throwforce*damage_coeff)) - chassis.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) - set_ready_state(0) - chassis.use_power(energy_drain) - do_after_cooldown() - return + deactivate_boost() + if(..()) + chassis.r_deflect_coeff /= deflect_coeff + chassis.r_damage_coeff /= damage_coeff + chassis.rhit_power_use -= energy_drain /obj/item/mecha_parts/mecha_equipment/repair_droid @@ -733,35 +703,13 @@ detach() pr_energy_relay.stop() -// chassis.proc_res["dynusepower"] = null - chassis.proc_res["dyngetcharge"] = null ..() return attach(obj/mecha/M) ..() - chassis.proc_res["dyngetcharge"] = src -// chassis.proc_res["dynusepower"] = src return - can_attach(obj/mecha/M) - if(..()) - if(!M.proc_res["dyngetcharge"])// && !M.proc_res["dynusepower"]) - return 1 - return 0 - - proc/dyngetcharge() - if(equip_ready) //disabled - return chassis.dyngetcharge() - var/area/A = get_area(chassis) - var/pow_chan = get_power_channel(A) - var/charge = 0 - if(pow_chan) - charge = 1000 //making magic - else - return chassis.dyngetcharge() - return charge - proc/get_power_channel(var/area/A) var/pow_chan if(A) @@ -786,15 +734,6 @@ if(!chassis) return return "* [src.name] - [pr_energy_relay.active()?"Dea":"A"]ctivate" -/* proc/dynusepower(amount) - if(!equip_ready) //enabled - var/area/A = get_area(chassis) - var/pow_chan = get_power_channel(A) - if(pow_chan) - A.master.use_power(amount*coeff, pow_chan) - return 1 - return chassis.dynusepower(amount)*/ - /datum/global_iterator/mecha_energy_relay process(var/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/ER) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index a5f07808e83..ebce14fd5e8 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -25,7 +25,15 @@ var/dir_in = 2//What direction will the mech face when entered/powered on? Defaults to South. var/step_energy_drain = 10 var/health = 300 //health is health - var/deflect_chance = 10 //chance to deflect the incoming projectiles, hits, or lesser the effect of ex_act. + var/deflect_chance = 10 //chance to deflect incoming projectiles, hits, or lesser the effect of ex_act. + var/r_deflect_coeff = 1 + var/m_deflect_coeff = 1 + //ranged and melee damage multipliers + var/r_damage_coeff = 1 + var/m_damage_coeff = 1 + var/rhit_power_use = 0 + var/mhit_power_use = 0 + //the values in this list show how much damage will pass through, not how much will be absorbed. var/list/damage_absorption = list("brute"=0.8,"fire"=1.2,"bullet"=0.9,"laser"=1,"energy"=1,"bomb"=1) var/obj/item/weapon/cell/cell @@ -35,7 +43,6 @@ var/add_req_access = 1 var/maint_access = 1 var/dna //dna-locking the mech - var/list/proc_res = list() //stores proc owners, like proc_res["functionname"] = owner reference var/datum/effect/effect/system/spark_spread/spark_system = new var/lights = 0 var/lights_power = 6 @@ -86,9 +93,7 @@ icon_state += "-open" add_radio() add_cabin() - if(!add_airtank()) //we check this here in case mecha does not have an internal tank available by default - WIP - removeVerb(/obj/mecha/verb/connect_to_port) - removeVerb(/obj/mecha/verb/toggle_internal_tank) + add_airtank() //All mecha currently have airtanks. No need to check unless changes are made. spark_system.set_up(2, 0, src) spark_system.attach(src) add_cell() @@ -166,15 +171,8 @@ internal_tank = new /obj/machinery/portable_atmospherics/canister/air(src) return internal_tank -/obj/mecha/proc/add_cell(var/obj/item/weapon/cell/C=null) - if(C) - C.forceMove(src) - cell = C - return - cell = new(src) - cell.name = "high-capacity power cell" - cell.charge = 15000 - cell.maxcharge = 15000 +/obj/mecha/proc/add_cell() + cell = new /obj/item/weapon/cell/mecha(src) /obj/mecha/proc/add_cabin() cabin_air = new @@ -192,7 +190,7 @@ /obj/mecha/proc/add_iterators() pr_int_temp_processor = new /datum/global_iterator/mecha_preserve_temp(list(src)) - pr_inertial_movement = new /datum/global_iterator/mecha_intertial_movement(null,0) + pr_inertial_movement = new /datum/global_iterator/mecha_inertial_movement(null,0) pr_give_air = new /datum/global_iterator/mecha_tank_give_air(list(src)) pr_internal_damage = new /datum/global_iterator/mecha_internal_damage(list(src),0) @@ -281,12 +279,12 @@ if(!src.occupant || src.occupant != user ) return if(user.stat) return if(state) - occupant_message("Maintenance protocols in effect") + occupant_message("Maintenance protocols in effect.") return if(!get_charge()) return if(src == target) return var/dir_to_target = get_dir(src,target) - if(dir_to_target && !(dir_to_target & src.dir))//wrong direction + if(dir_to_target && !(dir_to_target & src.dir)) return if(hasInternalDamage(MECHA_INT_CONTROL_LOST)) target = safepick(view(3,target)) @@ -352,18 +350,15 @@ return 0 if(connected_port) if(world.time - last_message > 20) - src.occupant_message("Unable to move while connected to the air system port") + src.occupant_message("Unable to move while connected to the air system port.") last_message = world.time return 0 if(state) - occupant_message("Maintenance protocols in effect") + occupant_message("Maintenance protocols in effect.") return - return domove(direction) + return do_move(direction) -/obj/mecha/proc/domove(direction) - return call((proc_res["dyndomove"]||src), "dyndomove")(direction) - -/obj/mecha/proc/dyndomove(direction) +/obj/mecha/proc/do_move(direction) if(!can_move) return 0 if(src.pr_inertial_movement.active()) @@ -479,21 +474,74 @@ /obj/mecha/proc/take_damage(amount, type="brute") if(amount) - var/damage = absorbDamage(amount,type) + var/damage = absorb_damage(amount,type) health -= damage update_health() log_append_to_last("Took [damage] points of damage. Damage type: \"[type]\".",1) return -/obj/mecha/proc/absorbDamage(damage,damage_type) - return call((proc_res["dynabsorbdamage"]||src), "dynabsorbdamage")(damage,damage_type) - -/obj/mecha/proc/dynabsorbdamage(damage,damage_type) +/obj/mecha/proc/absorb_damage(damage,damage_type) return damage*(listgetindex(damage_absorption,damage_type) || 1) +/obj/mecha/proc/hit_damage(damage, type="brute", is_melee=0) + + var/power_to_use + var/damage_coeff_to_use + + if(is_melee) + power_to_use = mhit_power_use + damage_coeff_to_use = m_damage_coeff + else + power_to_use = rhit_power_use + damage_coeff_to_use = r_damage_coeff + + if(power_to_use && use_power(power_to_use)) + take_damage(round(damage*damage_coeff_to_use), type) + start_booster_cooldown(is_melee) + return + else + start_booster_cooldown(is_melee) + take_damage(round(damage*damage_coeff_to_use), type) + + return + +/obj/mecha/proc/deflect_hit(is_melee=0) + + var/power_to_use + var/deflect_coeff_to_use + + if(is_melee) + power_to_use = mhit_power_use + deflect_coeff_to_use = m_damage_coeff + else + power_to_use = rhit_power_use + deflect_coeff_to_use = r_damage_coeff + + if(power_to_use) + if(prob(src.deflect_chance*deflect_coeff_to_use)) + use_power(power_to_use) + start_booster_cooldown(is_melee) + return 1 + else + return 0 + + else + start_booster_cooldown(is_melee) + if(prob(src.deflect_chance*deflect_coeff_to_use)) + return 1 + + return 0 + +/obj/mecha/proc/start_booster_cooldown(is_melee) + + for(var/obj/item/mecha_parts/mecha_equipment/armor_booster/B in equipment) //Ideally this would be done by the armor booster itself; attempts weren't great for performance. + if(B.melee == is_melee && B.equip_ready) + B.set_ready_state(0) + B.do_after_cooldown() + /obj/mecha/airlock_crush(var/crush_damage) ..() - take_damage(crush_damage) + hit_damage(crush_damage, is_melee=1) check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) return 1 @@ -505,14 +553,13 @@ return /obj/mecha/attack_hand(mob/user as mob) - user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) src.log_message("Attack by hand/paw. Attacker - [user].",1) if(istype(user,/mob/living/carbon/human)) var/mob/living/carbon/human/H = user if(H.species.can_shred(user)) - if(!prob(src.deflect_chance)) - src.take_damage(15) + if(!deflect_hit(is_melee=1)) + src.hit_damage(damage=15, is_melee=1) src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) playsound(src.loc, 'sound/weapons/slash.ogg', 50, 1, -1) user << "You slash at the armored suit!" @@ -527,8 +574,8 @@ user.visible_message("\The [user] hits \the [src]. Nothing happensm","You hit \the [src] with no visible effect.") src.log_append_to_last("Armor saved.") return - else if ((HULK in user.mutations) && !prob(src.deflect_chance)) - src.take_damage(15) + else if ((HULK in user.mutations) && !deflect_hit(is_melee=1)) + src.hit_damage(damage=15, is_melee=1) src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) user.visible_message("[user] hits [src.name], doing some damage.", "You hit [src.name] with all your might. The metal creaks and bends.") else @@ -536,20 +583,16 @@ src.log_append_to_last("Armor saved.") return -/obj/mecha/hitby(atom/movable/A as mob|obj) //wrapper +/obj/mecha/hitby(atom/movable/A as mob|obj) ..() src.log_message("Hit by [A].",1) - call((proc_res["dynhitby"]||src), "dynhitby")(A) - return - -/obj/mecha/proc/dynhitby(atom/movable/A) if(istype(A, /obj/item/mecha_parts/mecha_tracking)) A.forceMove(src) src.visible_message("The [A] fastens firmly to [src].") return - if(prob(src.deflect_chance) || istype(A, /mob)) + if(deflect_hit(is_melee=0) || istype(A, /mob)) src.occupant_message("\The [A] bounces off the armor.") - src.visible_message("\The [A] bounces off \the [src] armor") + src.visible_message("\The [A] bounces off \the [src] armor.") src.log_append_to_last("Armor saved.") if(istype(A, /mob/living)) var/mob/living/M = A @@ -557,32 +600,26 @@ else if(istype(A, /obj)) var/obj/O = A if(O.throwforce) - src.take_damage(O.throwforce) + src.hit_damage(O.throwforce, is_melee=0) src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) return +/obj/mecha/bullet_act(var/obj/item/projectile/Proj) + if(Proj.damage_type == HALLOSS && !(src.r_deflect_coeff > 1)) + use_power(Proj.agony * 5) -/obj/mecha/bullet_act(var/obj/item/projectile/Proj) //wrapper src.log_message("Hit by projectile. Type: [Proj.name]([Proj.check_armour]).",1) - call((proc_res["dynbulletdamage"]||src), "dynbulletdamage")(Proj) //calls equipment - ..() - return - -/obj/mecha/proc/dynbulletdamage(var/obj/item/projectile/Proj) - if(prob(src.deflect_chance)) + if(deflect_hit(is_melee=0)) src.occupant_message("The armor deflects incoming projectile.") - src.visible_message("The [src.name] armor deflects the projectile") + src.visible_message("The [src.name] armor deflects the projectile.") src.log_append_to_last("Armor saved.") return - if(Proj.damage_type == HALLOSS) - use_power(Proj.agony * 5) - if(!(Proj.nodamage)) var/ignore_threshold if(istype(Proj, /obj/item/projectile/beam/pulse)) ignore_threshold = 1 - src.take_damage(Proj.damage, Proj.check_armour) + src.hit_damage(Proj.damage, Proj.check_armour, is_melee=0) if(prob(25)) spark_system.start() src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),ignore_threshold) @@ -603,6 +640,7 @@ break //give a chance to exit early Proj.on_hit(src) //on_hit just returns if it's argument is not a living mob so does this actually do anything? + ..() return /obj/mecha/ex_act(severity) @@ -650,8 +688,7 @@ */ /obj/mecha/emp_act(severity) - if(get_charge()) - use_power((cell.charge/2)/severity) + if(use_power((cell.charge/2)/severity)) take_damage(50 / severity,"energy") src.log_message("EMP detected",1) check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),1) @@ -664,23 +701,6 @@ src.check_for_internal_damage(list(MECHA_INT_FIRE, MECHA_INT_TEMP_CONTROL)) return -/obj/mecha/proc/dynattackby(obj/item/weapon/W as obj, mob/user as mob) - user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - src.log_message("Attacked by [W]. Attacker - [user]") - if(prob(src.deflect_chance)) - user << "\The [W] bounces off [src.name]." - src.log_append_to_last("Armor saved.") -/* - for (var/mob/V in viewers(src)) - if(V.client && !(V.blinded)) - V.show_message("The [W] bounces off [src.name] armor.", 1) -*/ - else - src.occupant_message("[user] hits [src] with [W].") - user.visible_message("[user] hits [src] with [W].", "You hit [src] with [W].") - src.take_damage(W.force,W.damtype) - src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) - return ////////////////////// ////// AttackBy ////// @@ -747,10 +767,10 @@ src.cell = null state = 4 user << "You unscrew and pry out the powercell." - src.log_message("Powercell removed") + src.log_message("Powercell removed.") else if(state==4 && src.cell) state=3 - user << "You screw the cell in place" + user << "You screw the cell in place." return else if(istype(W, /obj/item/device/multitool)) @@ -799,27 +819,19 @@ return else - call((proc_res["dynattackby"]||src), "dynattackby")(W,user) -/* src.log_message("Attacked by [W]. Attacker - [user]") - if(prob(src.deflect_chance)) - user << "\The [W] bounces off [src.name] armor." + + if(deflect_hit(is_melee=1)) + user << "\The [W] bounces off [src.name]." src.log_append_to_last("Armor saved.") -/* - for (var/mob/V in viewers(src)) - if(V.client && !(V.blinded)) - V.show_message("The [W] bounces off [src.name] armor.", 1) -*/ else src.occupant_message("[user] hits [src] with [W].") user.visible_message("[user] hits [src] with [W].", "You hit [src] with [W].") - src.take_damage(W.force,W.damtype) + src.hit_damage(W.force, W.damtype, is_melee=1) src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) -*/ + return - - /* /obj/mecha/attack_ai(var/mob/living/silicon/ai/user as mob) if(!istype(user, /mob/living/silicon/ai)) @@ -1247,7 +1259,7 @@ var/integrity = health/initial(health)*100 var/cell_charge = get_charge() var/tank_pressure = internal_tank ? round(internal_tank.return_pressure(),0.01) : "None" - var/tank_temperature = internal_tank ? internal_tank.return_temperature() : "Unknown" + var/tank_temperature = internal_tank ? internal_tank.return_temperature() : "Unknown" //Results in type mismatch if there is no tank. var/cabin_pressure = round(return_pressure(),0.01) var/output = {"[report_internal_damage()] [integrity<30?"DAMAGE LEVEL CRITICAL
":null] @@ -1655,16 +1667,11 @@ return (get_charge()>=amount) /obj/mecha/proc/get_charge() - return call((proc_res["dyngetcharge"]||src), "dyngetcharge")() - -/obj/mecha/proc/dyngetcharge()//returns null if no powercell, else returns cell.charge - if(!src.cell) return + if(!src.cell) + return return max(0, src.cell.charge) /obj/mecha/proc/use_power(amount) - return call((proc_res["dynusepower"]||src), "dynusepower")(amount) - -/obj/mecha/proc/dynusepower(amount) if(get_charge()) cell.use(amount) return 1 @@ -1685,15 +1692,14 @@ /obj/mecha/attack_generic(var/mob/user, var/damage, var/attack_message) - user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if(!damage) return 0 src.log_message("Attacked. Attacker - [user].",1) user.do_attack_animation(src) - if(!prob(src.deflect_chance)) - src.take_damage(damage) + if(!deflect_hit(is_melee=1)) + src.hit_damage(damage, is_melee=1) src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) visible_message("[user] [attack_message] [src]!") user.attack_log += text("\[[time_stamp()]\] attacked [src.name]") @@ -1711,7 +1717,7 @@ ////////////////////////////////////////// -/datum/global_iterator/mecha_preserve_temp //normalizing cabin air temperature to 20 degrees celsium +/datum/global_iterator/mecha_preserve_temp //normalizing cabin air temperature to 20 degrees celsius delay = 20 process(var/obj/mecha/mecha) @@ -1753,7 +1759,7 @@ return stop() return -/datum/global_iterator/mecha_intertial_movement //inertial movement in space +/datum/global_iterator/mecha_inertial_movement //inertial movement in space delay = 7 process(var/obj/mecha/mecha as obj,direction) diff --git a/code/game/objects/items/devices/uplink_items.dm b/code/game/objects/items/devices/uplink_items.dm index cddd87879df..ea9b7802bd1 100644 --- a/code/game/objects/items/devices/uplink_items.dm +++ b/code/game/objects/items/devices/uplink_items.dm @@ -39,8 +39,6 @@ var/datum/uplink/uplink = new() ..() antag_roles = list() - - /datum/uplink_item/proc/buy(var/obj/item/device/uplink/U, var/mob/user) var/extra_args = extra_args(user) if(!extra_args) @@ -144,44 +142,45 @@ datum/uplink_item/dd_SortValue() * Ammunition * *************/ /datum/uplink_item/item/ammo - item_cost = 2 + item_cost = 4 category = /datum/uplink_category/ammunition -/datum/uplink_item/item/ammo/a357 - name = ".357" - path = /obj/item/ammo_magazine/a357 - /datum/uplink_item/item/ammo/mc9mm name = "9mm" + item_cost = 1 path = /obj/item/ammo_magazine/mc9mm -/datum/uplink_item/item/ammo/darts - name = "Darts" - path = /obj/item/ammo_magazine/chemdart - -/datum/uplink_item/item/ammo/sniperammo - name = "14.5mm" - path = /obj/item/weapon/storage/box/sniperammo - /datum/uplink_item/item/ammo/a10mm name = "10mm" + item_cost = 1 path = /obj/item/ammo_magazine/a10mm +/datum/uplink_item/item/ammo/darts + name = "Darts" + item_cost = 1 + path = /obj/item/ammo_magazine/chemdart + +/datum/uplink_item/item/ammo/a357 + name = ".357" + item_cost = 2 + path = /obj/item/ammo_magazine/a357 + /datum/uplink_item/item/ammo/a762 name = "7.62mm" + item_cost = 3 path = /obj/item/ammo_magazine/a762 +/datum/uplink_item/item/ammo/sniperammo + name = "14.5mm" + item_cost = 4 + path = /obj/item/weapon/storage/box/sniperammo + /*************************************** * Highly Visible and Dangerous Weapons * ***************************************/ /datum/uplink_item/item/visible_weapons category = /datum/uplink_category/visible_weapons -/datum/uplink_item/item/visible_weapons/energy_sword - name = "Energy Sword" - item_cost = 4 - path = /obj/item/weapon/melee/energy/sword - /datum/uplink_item/item/visible_weapons/dartgun name = "Dart Gun" item_cost = 5 @@ -189,40 +188,45 @@ datum/uplink_item/dd_SortValue() /datum/uplink_item/item/visible_weapons/crossbow name = "Energy Crossbow" - item_cost = 5 + item_cost = 6 path = /obj/item/weapon/gun/energy/crossbow +/datum/uplink_item/item/visible_weapons/energy_sword + name = "Energy Sword" + item_cost = 8 + path = /obj/item/weapon/melee/energy/sword + /datum/uplink_item/item/visible_weapons/g9mm name = "Silenced 9mm" - item_cost = 5 + item_cost = 8 path = /obj/item/weapon/storage/box/syndie_kit/g9mm /datum/uplink_item/item/visible_weapons/riggedlaser - name = "Exosuit Rigged Laser" - item_cost = 6 + name = "Exosuit (APLU) Rigged Laser" + item_cost = 8 path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/riggedlaser /datum/uplink_item/item/visible_weapons/revolver name = "Revolver" - item_cost = 6 + item_cost = 12 path = /obj/item/weapon/gun/projectile/revolver +//These are for traitors (or other antags, perhaps) to have the option of purchasing some merc gear. +/datum/uplink_item/item/visible_weapons/submachinegun + name = "Submachine Gun" + item_cost = 12 + path = /obj/item/weapon/gun/projectile/automatic/c20r + +/datum/uplink_item/item/visible_weapons/assaultrifle + name = "Assault Rifle" + item_cost = 14 + path = /obj/item/weapon/gun/projectile/automatic/sts35 + /datum/uplink_item/item/visible_weapons/heavysniper name = "Anti-materiel Rifle" item_cost = DEFAULT_TELECRYSTAL_AMOUNT path = /obj/item/weapon/gun/projectile/heavysniper -//These are for traitors (or other antags, perhaps) to have the option of purchasing some merc gear. -/datum/uplink_item/item/visible_weapons/submachinegun - name = "Submachine Gun" - item_cost = 6 - path = /obj/item/weapon/gun/projectile/automatic/c20r - -/datum/uplink_item/item/visible_weapons/assaultrifle - name = "Assault Rifle" - item_cost = 7 - path = /obj/item/weapon/gun/projectile/automatic/sts35 - /************************************* * Stealthy and Inconspicuous Weapons * *************************************/ @@ -234,45 +238,40 @@ datum/uplink_item/dd_SortValue() item_cost = 1 path = /obj/item/weapon/soap/syndie +/datum/uplink_item/item/stealthy_weapons/cigarette_kit + name = "Cigarette Kit" + item_cost = 2 + path = /obj/item/weapon/storage/box/syndie_kit/cigarette + /datum/uplink_item/item/stealthy_weapons/concealed_cane name = "Concealed Cane Sword" - item_cost = 1 + item_cost = 2 path = /obj/item/weapon/cane/concealed +/datum/uplink_item/item/stealthy_weapons/random_toxin + name = "Random Toxin - Beaker" + item_cost = 2 + path = /obj/item/weapon/storage/box/syndie_kit/toxin + /datum/uplink_item/item/stealthy_weapons/detomatix name = "Detomatix PDA Cartridge" - item_cost = 3 + item_cost = 4 path = /obj/item/weapon/cartridge/syndicate /datum/uplink_item/item/stealthy_weapons/parapen name = "Paralysis Pen" - item_cost = 3 + item_cost = 6 path = /obj/item/weapon/pen/reagent/paralysis -/datum/uplink_item/item/stealthy_weapons/cigarette_kit - name = "Cigarette Kit" - item_cost = 3 - path = /obj/item/weapon/storage/box/syndie_kit/cigarette - -/datum/uplink_item/item/stealthy_weapons/random_toxin - name = "Random Toxin - Beaker" - item_cost = 3 - path = /obj/item/weapon/storage/box/syndie_kit/toxin - /******************************* * Stealth and Camouflage Items * *******************************/ /datum/uplink_item/item/stealth_items category = /datum/uplink_category/stealth_items -/datum/uplink_item/item/stealth_items/id - name = "Agent ID card" - item_cost = 2 - path = /obj/item/weapon/card/id/syndicate - /datum/uplink_item/item/stealth_items/syndigaloshes name = "No-Slip Shoes" - item_cost = 2 + item_cost = 1 path = /obj/item/clothing/shoes/syndigaloshes /datum/uplink_item/item/stealth_items/spy @@ -280,24 +279,19 @@ datum/uplink_item/dd_SortValue() item_cost = 2 path = /obj/item/weapon/storage/box/syndie_kit/spy +/datum/uplink_item/item/stealth_items/id + name = "Agent ID card" + item_cost = 3 + path = /obj/item/weapon/card/id/syndicate + /datum/uplink_item/item/stealth_items/chameleon_kit name = "Chameleon Kit" - item_cost = 3 + item_cost = 5 path = /obj/item/weapon/storage/box/syndie_kit/chameleon -/datum/uplink_item/item/stealth_items/chameleon_projector - name = "Chameleon-Projector" - item_cost = 4 - path = /obj/item/device/chameleon - -/datum/uplink_item/item/stealth_items/chameleon_projector - name = "Chameleon-Projector" - item_cost = 4 - path = /obj/item/device/chameleon - /datum/uplink_item/item/stealth_items/voice name = "Voice Changer" - item_cost = 4 + item_cost = 5 path = /obj/item/clothing/mask/gas/voice /datum/uplink_item/item/stealth_items/camera_floppy @@ -305,6 +299,11 @@ datum/uplink_item/dd_SortValue() item_cost = 6 path = /obj/item/weapon/disk/file/cameras/syndicate +/datum/uplink_item/item/stealth_items/chameleon_projector + name = "Chameleon-Projector" + item_cost = 8 + path = /obj/item/device/chameleon + /******************** * Devices and Tools * ********************/ @@ -313,78 +312,78 @@ datum/uplink_item/dd_SortValue() /datum/uplink_item/item/tools/toolbox name = "Fully Loaded Toolbox" - item_cost = 1 + item_cost = 2 path = /obj/item/weapon/storage/toolbox/syndicate -/datum/uplink_item/item/tools/plastique - name = "C-4 (Destroys walls)" +/datum/uplink_item/item/tools/money + name = "Operations Funding" item_cost = 2 - path = /obj/item/weapon/plastique - -/datum/uplink_item/item/tools/encryptionkey_radio - name = "Encrypted Radio Channel Key" - item_cost = 2 - path = /obj/item/device/encryptionkey/syndicate - -/datum/uplink_item/item/tools/encryptionkey_binary - name = "Binary Translator Key" - item_cost = 3 - path = /obj/item/device/encryptionkey/binary - -/datum/uplink_item/item/tools/emag - name = "Cryptographic Sequencer" - item_cost = 3 - path = /obj/item/weapon/card/emag + path = /obj/item/weapon/storage/secure/briefcase/money + desc = "A briefcase with 10,000 untraceable thalers for funding your sneaky activities." /datum/uplink_item/item/tools/clerical name = "Morphic Clerical Kit" item_cost = 3 path = /obj/item/weapon/storage/box/syndie_kit/clerical -/datum/uplink_item/item/tools/space_suit - name = "Space Suit" - item_cost = 3 - path = /obj/item/weapon/storage/box/syndie_kit/space - -/datum/uplink_item/item/tools/thermal - name = "Thermal Imaging Glasses" - item_cost = 3 - path = /obj/item/clothing/glasses/thermal/syndi +/datum/uplink_item/item/tools/plastique + name = "C-4 (Destroys walls)" + item_cost = 4 + path = /obj/item/weapon/plastique /datum/uplink_item/item/tools/heavy_vest name = "Heavy Armor Vest" item_cost = 4 - path = /obj/item/clothing/suit/storage/vest/heavy/merc + path = /obj/item/clothing/suit/storage/vest/merc + +/datum/uplink_item/item/tools/encryptionkey_radio + name = "Encrypted Radio Channel Key" + item_cost = 4 + path = /obj/item/device/encryptionkey/syndicate + +/datum/uplink_item/item/tools/encryptionkey_binary + name = "Binary Translator Key" + item_cost = 5 + path = /obj/item/device/encryptionkey/binary + +/datum/uplink_item/item/tools/emag + name = "Cryptographic Sequencer" + item_cost = 6 + path = /obj/item/weapon/card/emag + +/datum/uplink_item/item/tools/space_suit + name = "Space Suit" + item_cost = 6 + path = /obj/item/weapon/storage/box/syndie_kit/space + +/datum/uplink_item/item/tools/thermal + name = "Thermal Imaging Glasses" + item_cost = 6 + path = /obj/item/clothing/glasses/thermal/syndi /datum/uplink_item/item/tools/powersink name = "Powersink (DANGER!)" - item_cost = 5 + item_cost = 10 path = /obj/item/device/powersink -/datum/uplink_item/item/tools/ai_module - name = "Hacked AI Upload Module" - item_cost = 7 - path = /obj/item/weapon/aiModule/syndicate - -/datum/uplink_item/item/tools/supply_beacon - name = "Hacked Supply Beacon (DANGER!)" - item_cost = 7 - path = /obj/item/supply_beacon - /datum/uplink_item/item/tools/teleporter name = "Teleporter Circuit Board" - item_cost = 20 + item_cost = 10 path = /obj/item/weapon/circuitboard/teleporter /datum/uplink_item/item/tools/teleporter/New() ..() antag_roles = list(MODE_MERCENARY) -/datum/uplink_item/item/tools/money - name = "Operations Funding" - item_cost = 3 - path = /obj/item/weapon/storage/secure/briefcase/money - desc = "A briefcase with 10,000 untraceable thalers for funding your sneaky activities." +/datum/uplink_item/item/tools/ai_module + name = "Hacked AI Upload Module" + item_cost = 14 + path = /obj/item/weapon/aiModule/syndicate + +/datum/uplink_item/item/tools/supply_beacon + name = "Hacked Supply Beacon (DANGER!)" + item_cost = 14 + path = /obj/item/supply_beacon /*********** * Implants * @@ -394,24 +393,28 @@ datum/uplink_item/dd_SortValue() /datum/uplink_item/item/implants/imp_freedom name = "Freedom Implant" - item_cost = 3 + item_cost = 6 path = /obj/item/weapon/storage/box/syndie_kit/imp_freedom /datum/uplink_item/item/implants/imp_compress name = "Compressed Matter Implant" - item_cost = 4 + item_cost = 8 path = /obj/item/weapon/storage/box/syndie_kit/imp_compress /datum/uplink_item/item/implants/imp_explosive name = "Explosive Implant (DANGER!)" - item_cost = 6 + item_cost = 10 path = /obj/item/weapon/storage/box/syndie_kit/imp_explosive /datum/uplink_item/item/implants/imp_uplink - name = "Uplink Implant (Contains 5 Telecrystals)" - item_cost = 10 + name = "Uplink Implant" path = /obj/item/weapon/storage/box/syndie_kit/imp_uplink +/datum/uplink_item/item/implants/imp_uplink/New() + ..() + item_cost = round(DEFAULT_TELECRYSTAL_AMOUNT / 2) + desc = "Contains [round((DEFAULT_TELECRYSTAL_AMOUNT / 2) * 0.8)] Telecrystal\s" + /********** * Medical * **********/ @@ -420,17 +423,17 @@ datum/uplink_item/dd_SortValue() /datum/uplink_item/item/medical/sinpockets name = "Box of Sin-Pockets" - item_cost = 1 + item_cost = 2 path = /obj/item/weapon/storage/box/sinpockets /datum/uplink_item/item/medical/surgery name = "Surgery kit" - item_cost = 6 + item_cost = 10 path = /obj/item/weapon/storage/firstaid/surgery /datum/uplink_item/item/medical/combat name = "Combat medical kit" - item_cost = 6 + item_cost = 12 path = /obj/item/weapon/storage/firstaid/combat /******************* @@ -441,37 +444,37 @@ datum/uplink_item/dd_SortValue() /datum/uplink_item/item/hardsuit_modules/thermal name = "Thermal Scanner" - item_cost = 2 + item_cost = 4 path = /obj/item/rig_module/vision/thermal /datum/uplink_item/item/hardsuit_modules/energy_net name = "Net Projector" - item_cost = 3 + item_cost = 5 path = /obj/item/rig_module/fabricator/energy_net /datum/uplink_item/item/ewar_voice name = "Electrowarfare Suite and Voice Synthesiser" - item_cost = 4 + item_cost = 6 path = /obj/item/weapon/storage/box/syndie_kit/ewar_voice /datum/uplink_item/item/hardsuit_modules/maneuvering_jets name = "Maneuvering Jets" - item_cost = 4 + item_cost = 8 path = /obj/item/rig_module/maneuvering_jets /datum/uplink_item/item/hardsuit_modules/egun name = "Mounted Energy Gun" - item_cost = 6 + item_cost = 12 path = /obj/item/rig_module/mounted/egun /datum/uplink_item/item/hardsuit_modules/power_sink name = "Power Sink" - item_cost = 6 + item_cost = 12 path = /obj/item/rig_module/power_sink /datum/uplink_item/item/hardsuit_modules/laser_canon name = "Mounted Laser Cannon" - item_cost = 8 + item_cost = 16 path = /obj/item/rig_module/mounted /*********** @@ -482,19 +485,19 @@ datum/uplink_item/dd_SortValue() /datum/uplink_item/item/grenades/anti_photon name = "5xPhoton Disruption Grenades" - item_cost = 2 + item_cost = 4 path = /obj/item/weapon/storage/box/anti_photons -/datum/uplink_item/item/grenades/emp - name = "5xEMP Grenades" - item_cost = 3 - path = /obj/item/weapon/storage/box/emps - /datum/uplink_item/item/grenades/smoke name = "5xSmoke Grenades" - item_cost = 2 + item_cost = 4 path = /obj/item/weapon/storage/box/smokes +/datum/uplink_item/item/grenades/emp + name = "5xEMP Grenades" + item_cost = 6 + path = /obj/item/weapon/storage/box/emps + /************ * Badassery * ************/ @@ -550,8 +553,8 @@ datum/uplink_item/dd_SortValue() ****************/ /datum/uplink_item/item/badassery/surplus name = "Surplus Crate" - item_cost = 40 - var/item_worth = 60 + item_cost = DEFAULT_TELECRYSTAL_AMOUNT * 4 + var/item_worth = DEFAULT_TELECRYSTAL_AMOUNT * 6 var/icon /datum/uplink_item/item/badassery/surplus/New() @@ -598,14 +601,11 @@ var/image/default_abstract_uplink_icon if(.) log_and_message_admins("has triggered a falsified [src]", user) -/datum/uplink_item/abstract/announcements/fake_centcom - item_cost = DEFAULT_TELECRYSTAL_AMOUNT / 2 - /datum/uplink_item/abstract/announcements/fake_centcom/New() ..() name = "[command_name()] Update Announcement" + item_cost = round(DEFAULT_TELECRYSTAL_AMOUNT / 2) desc = "Causes a falsified [command_name()] Update. Triggers immediately after supplying additional data." - antag_roles = list(MODE_MERCENARY) /datum/uplink_item/abstract/announcements/fake_centcom/get_goods(var/obj/item/device/uplink/U, var/loc, var/mob/user, var/list/args) command_announcement.Announce(args.["message"], args.["title"]) @@ -614,7 +614,7 @@ var/image/default_abstract_uplink_icon /datum/uplink_item/abstract/announcements/fake_crew_arrival name = "Crew Arrival Announcement/Records" desc = "Creates a fake crew arrival announcement as well as fake crew records, using your current appearance (including held items!) and worn id card. Trigger with care!" - item_cost = 4 + item_cost = 8 /datum/uplink_item/abstract/announcements/fake_crew_arrival/New() ..() @@ -676,7 +676,7 @@ var/image/default_abstract_uplink_icon /datum/uplink_item/abstract/announcements/fake_ion_storm name = "Ion Storm Announcement" desc = "Interferes with the station's ion sensors. Triggers immediately upon investment." - item_cost = 1 + item_cost = 2 /datum/uplink_item/abstract/announcements/fake_ion_storm/get_goods(var/obj/item/device/uplink/U, var/loc) ion_storm_announcement() @@ -685,7 +685,7 @@ var/image/default_abstract_uplink_icon /datum/uplink_item/abstract/announcements/fake_radiation name = "Radiation Storm Announcement" desc = "Interferes with the station's radiation sensors. Triggers immediately upon investment." - item_cost = 3 + item_cost = 6 /datum/uplink_item/abstract/announcements/fake_radiation/get_goods(var/obj/item/device/uplink/U, var/loc) var/datum/event_meta/EM = new(EVENT_LEVEL_MUNDANE, "Fake Radiation Storm", add_to_queue = 0) diff --git a/code/game/objects/items/weapons/cards_ids_syndicate.dm b/code/game/objects/items/weapons/cards_ids_syndicate.dm index f86489c1000..48fb63edadb 100644 --- a/code/game/objects/items/weapons/cards_ids_syndicate.dm +++ b/code/game/objects/items/weapons/cards_ids_syndicate.dm @@ -1,30 +1,19 @@ -var/global/list/syndicate_ids = list() - /obj/item/weapon/card/id/syndicate name = "agent card" icon_state = "syndicate" assignment = "Agent" origin_tech = list(TECH_ILLEGAL = 3) var/electronic_warfare = 1 - var/registered_user = null + var/mob/registered_user = null /obj/item/weapon/card/id/syndicate/New(mob/user as mob) - syndicate_ids += src ..() access = syndicate_access.Copy() /obj/item/weapon/card/id/syndicate/Destroy() - syndicate_ids -= src registered_user = null return ..() -// On mob destruction, ensure any references are cleared -/mob/Destroy() - for(var/obj/item/weapon/card/id/syndicate/SID in syndicate_ids) - if(SID.registered_user == src) - SID.registered_user = null - return ..() - /obj/item/weapon/card/id/syndicate/prevent_tracking() return electronic_warfare @@ -33,13 +22,12 @@ var/global/list/syndicate_ids = list() if(istype(O, /obj/item/weapon/card/id)) var/obj/item/weapon/card/id/I = O src.access |= I.access - if(player_is_antag(user)) + if(player_is_antag(user.mind)) user << "The microscanner activates as you pass it over the ID, copying its access." /obj/item/weapon/card/id/syndicate/attack_self(mob/user as mob) - if(!registered_user) - registered_user = user - user.set_id_info(src) + // We use the fact that registered_name is not unset should the owner be vaporized, to ensure the id doesn't magically become unlocked. + if(!registered_user && !registered_name && register_user(user)) user << "The microscanner marks you as its owner, preventing others from accessing its internals." if(registered_user == user) switch(alert("Would you like edit the ID, or show it?","Show or Edit?", "Edit","Show")) @@ -72,6 +60,21 @@ var/global/list/syndicate_ids = list() ui.set_initial_data(data) ui.open() +/obj/item/weapon/card/id/syndicate/proc/register_user(var/mob/user) + if(!istype(user) || user == registered_user) + return FALSE + unset_registered_user() + registered_user = user + user.set_id_info(src) + user.register(OBSERVER_EVENT_DESTROY, src, /obj/item/weapon/card/id/syndicate/proc/unset_registered_user) + return TRUE + +/obj/item/weapon/card/id/syndicate/proc/unset_registered_user(var/mob/user) + if(!registered_user || (user && user != registered_user)) + return + registered_user.unregister(OBSERVER_EVENT_DESTROY, src) + registered_user = null + /obj/item/weapon/card/id/syndicate/CanUseTopic(mob/user) if(user != registered_user) return STATUS_CLOSE @@ -172,7 +175,7 @@ var/global/list/syndicate_ids = list() icon_state = initial(icon_state) name = initial(name) registered_name = initial(registered_name) - registered_user = null + unset_registered_user() sex = initial(sex) user << "All information has been deleted from \the [src]." . = 1 diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index 610536f4d08..909df93d132 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -278,3 +278,27 @@ beakers += B1 beakers += B2 icon_state = initial(icon_state) +"_locked" + +/obj/item/weapon/grenade/chem_grenade/teargas + name = "tear gas grenade" + desc = "Concentrated Capsaicin. Contents under pressure. Use with caution." + stage = 2 + path = 1 + + New() + ..() + var/obj/item/weapon/reagent_containers/glass/beaker/large/B1 = new(src) + var/obj/item/weapon/reagent_containers/glass/beaker/large/B2 = new(src) + + B1.reagents.add_reagent("phosphorus", 40) + B1.reagents.add_reagent("potassium", 40) + B1.reagents.add_reagent("condensedcapsaicin", 40) + B2.reagents.add_reagent("sugar", 40) + B2.reagents.add_reagent("condensedcapsaicin", 80) + + detonator = new/obj/item/device/assembly_holder/timer_igniter(src) + + beakers += B1 + beakers += B2 + icon_state = initial(icon_state) +"_locked" + diff --git a/code/game/objects/items/weapons/implants/implantuplink.dm b/code/game/objects/items/weapons/implants/implantuplink.dm index 0469cd56d5c..9e30764119a 100644 --- a/code/game/objects/items/weapons/implants/implantuplink.dm +++ b/code/game/objects/items/weapons/implants/implantuplink.dm @@ -6,7 +6,7 @@ /obj/item/weapon/implant/uplink/New() activation_emote = pick("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink") hidden_uplink = new(src) - hidden_uplink.uses = 5 + hidden_uplink.uses = round((DEFAULT_TELECRYSTAL_AMOUNT / 2) * 0.8) ..() return @@ -14,6 +14,7 @@ activation_emote = input("Choose activation emote:") in list("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink") source.mind.store_memory("Uplink implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.", 0, 0) source << "The implanted uplink implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate." + hidden_uplink.uplink_owner = source.mind return 1 diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/game/objects/items/weapons/power_cells.dm index e61875f5ecb..d55e0305cb0 100644 --- a/code/game/objects/items/weapons/power_cells.dm +++ b/code/game/objects/items/weapons/power_cells.dm @@ -71,6 +71,13 @@ maxcharge = 10000 matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 60) +/obj/item/weapon/cell/mecha + name = "exosuit-grade power cell" + origin_tech = list(TECH_POWER = 3) + icon_state = "hcell" + maxcharge = 15000 + matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 70) + /obj/item/weapon/cell/high/empty/New() ..() charge = 0 diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index f37cdb4dc2c..1372270bb91 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -271,8 +271,8 @@ new /obj/item/ammo_casing/a145(src) /obj/item/weapon/storage/box/flashbangs - name = "box of flashbangs (WARNING)" - desc = "WARNING: These devices are extremely dangerous and can cause blindness or deafness in repeated use." + name = "box of flashbangs" + desc = "A box containing 7 antipersonnel flashbang grenades.
WARNING: These devices are extremely dangerous and can cause blindness or deafness in repeated use." icon_state = "flashbang" New() @@ -285,6 +285,22 @@ new /obj/item/weapon/grenade/flashbang(src) new /obj/item/weapon/grenade/flashbang(src) +/obj/item/weapon/storage/box/teargas + name = "box of pepperspray grenades" + desc = "A box containing 7 tear gas grenades. A gas mask is printed on the label.
WARNING: Exposure carries risk of serious injury or death. Keep away from persons with lung conditions." + icon_state = "flashbang" + + New() + ..() + new /obj/item/weapon/grenade/chem_grenade/teargas(src) + new /obj/item/weapon/grenade/chem_grenade/teargas(src) + new /obj/item/weapon/grenade/chem_grenade/teargas(src) + new /obj/item/weapon/grenade/chem_grenade/teargas(src) + new /obj/item/weapon/grenade/chem_grenade/teargas(src) + new /obj/item/weapon/grenade/chem_grenade/teargas(src) + + + /obj/item/weapon/storage/box/emps name = "box of emp grenades" desc = "A box containing 5 military grade EMP grenades.
WARNING: Do not use near unshielded electronics or biomechanical augmentations, death or permanent paralysis may occur." @@ -624,7 +640,7 @@ desc = "This box is shaped on the inside so that only light tubes and bulbs fit." item_state = "syringe_kit" use_to_pickup = 1 // for picking up broken bulbs, not that most people will try - + /obj/item/weapon/storage/box/lights/New() ..() make_exact_fit() diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm index 11c2d6a8539..02ce84f0726 100644 --- a/code/game/objects/items/weapons/storage/toolbox.dm +++ b/code/game/objects/items/weapons/storage/toolbox.dm @@ -72,11 +72,10 @@ New() ..() - var/color = pick("red","yellow","green","blue","pink","orange","cyan","white") + new /obj/item/clothing/gloves/yellow(src) new /obj/item/weapon/screwdriver(src) new /obj/item/weapon/wrench(src) new /obj/item/weapon/weldingtool(src) new /obj/item/weapon/crowbar(src) - new /obj/item/stack/cable_coil(src,30,color) new /obj/item/weapon/wirecutters(src) new /obj/item/device/multitool(src) diff --git a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm deleted file mode 100644 index e93721c53f2..00000000000 --- a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm +++ /dev/null @@ -1,210 +0,0 @@ -//I still dont think this should be a closet but whatever -/obj/structure/closet/fireaxecabinet - name = "fire axe cabinet" - desc = "There is small label that reads \"For Emergency use only\" along with details for safe use of the axe. As if." - var/obj/item/weapon/material/twohanded/fireaxe/fireaxe - icon_state = "fireaxe1000" - icon_closed = "fireaxe1000" - icon_opened = "fireaxe1100" - anchored = 1 - density = 0 - var/localopened = 0 //Setting this to keep it from behaviouring like a normal closet and obstructing movement in the map. -Agouri - opened = 1 - var/hitstaken = 0 - var/locked = 1 - var/smashed = 0 - - New() - ..() - fireaxe = new /obj/item/weapon/material/twohanded/fireaxe(src) - - attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri - //..() //That's very useful, Erro - - var/hasaxe = 0 //gonna come in handy later~ - if(fireaxe) - hasaxe = 1 - - if (isrobot(usr) || src.locked) - if(istype(O, /obj/item/device/multitool)) - user << "Resetting circuitry..." - playsound(user, 'sound/machines/lockreset.ogg', 50, 1) - if(do_after(user, 20)) - src.locked = 0 - user << " You disable the locking modules." - update_icon() - return - else if(istype(O, /obj/item/weapon)) - var/obj/item/weapon/W = O - if(src.smashed || src.localopened) - if(localopened) - localopened = 0 - icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed) - spawn(10) update_icon() - return - else - playsound(user, 'sound/effects/Glasshit.ogg', 100, 1) //We don't want this playing every time - if(W.force < 15) - user << "The cabinet's protective glass glances off the hit." - else - src.hitstaken++ - if(src.hitstaken == 4) - playsound(user, 'sound/effects/Glassbr3.ogg', 100, 1) //Break cabinet, receive goodies. Cabinet's fucked for life after that. - src.smashed = 1 - src.locked = 0 - src.localopened = 1 - update_icon() - return - if (istype(O, /obj/item/weapon/material/twohanded/fireaxe) && src.localopened) - if(!fireaxe) - if(O:wielded) - user << "Unwield the axe first." - return - fireaxe = O - user.remove_from_mob(O) - src.contents += O - user << "You place the fire axe back in the [src.name]." - update_icon() - else - if(src.smashed) - return - else - localopened = !localopened - if(localopened) - icon_state = text("fireaxe[][][][]opening",hasaxe,src.localopened,src.hitstaken,src.smashed) - spawn(10) update_icon() - else - icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed) - spawn(10) update_icon() - else - if(src.smashed) - return - if(istype(O, /obj/item/device/multitool)) - if(localopened) - localopened = 0 - icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed) - spawn(10) update_icon() - return - else - user << "Resetting circuitry..." - sleep(50) - src.locked = 1 - user << "You re-enable the locking modules." - playsound(user, 'sound/machines/lockenable.ogg', 50, 1) - if(do_after(user,20)) - src.locked = 1 - user << " You re-enable the locking modules." - return - else - localopened = !localopened - if(localopened) - icon_state = text("fireaxe[][][][]opening",hasaxe,src.localopened,src.hitstaken,src.smashed) - spawn(10) update_icon() - else - icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed) - spawn(10) update_icon() - - - - - attack_hand(mob/user as mob) - - var/hasaxe = 0 - if(fireaxe) - hasaxe = 1 - - if(src.locked) - user <<"The cabinet won't budge!" - return - if(localopened) - if(fireaxe) - user.put_in_hands(fireaxe) - fireaxe = null - user << "You take the fire axe from the [name]." - src.add_fingerprint(user) - update_icon() - else - if(src.smashed) - return - else - localopened = !localopened - if(localopened) - src.icon_state = text("fireaxe[][][][]opening",hasaxe,src.localopened,src.hitstaken,src.smashed) - spawn(10) update_icon() - else - src.icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed) - spawn(10) update_icon() - - else - localopened = !localopened //I'm pretty sure we don't need an if(src.smashed) in here. In case I'm wrong and it fucks up teh cabinet, **MARKER**. -Agouri - if(localopened) - src.icon_state = text("fireaxe[][][][]opening",hasaxe,src.localopened,src.hitstaken,src.smashed) - spawn(10) update_icon() - else - src.icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed) - spawn(10) update_icon() - - attack_tk(mob/user as mob) - if(localopened && fireaxe) - fireaxe.forceMove(loc) - user << "You telekinetically remove the fire axe." - fireaxe = null - update_icon() - return - attack_hand(user) - - verb/toggle_openness() //nice name, huh? HUH?! -Erro //YEAH -Agouri - set name = "Open/Close" - set category = "Object" - - if (isrobot(usr) || src.locked || src.smashed) - if(src.locked) - usr << "The cabinet won't budge!" - else if(src.smashed) - usr << "The protective glass is broken!" - return - - localopened = !localopened - update_icon() - - verb/remove_fire_axe() - set name = "Remove Fire Axe" - set category = "Object" - - if (isrobot(usr)) - return - - if (localopened) - if(fireaxe) - usr.put_in_hands(fireaxe) - fireaxe = null - usr << "You take the Fire axe from the [name]." - else - usr << "The [src.name] is empty." - else - usr << "The [src.name] is closed." - update_icon() - - attack_ai(mob/user as mob) - if(src.smashed) - user << "The security of the cabinet is compromised." - return - else - locked = !locked - if(locked) - user << "Cabinet locked." - else - user << "Cabinet unlocked." - return - - update_icon() //Template: fireaxe[has fireaxe][is opened][hits taken][is smashed]. If you want the opening or closing animations, add "opening" or "closing" right after the numbers - var/hasaxe = 0 - if(fireaxe) - hasaxe = 1 - icon_state = text("fireaxe[][][][]",hasaxe,src.localopened,src.hitstaken,src.smashed) - - open() - return - - close() - return 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 2348fc434b1..5d76ccc38e9 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -18,9 +18,9 @@ new /obj/item/clothing/suit/captunic/capjacket(src) new /obj/item/clothing/head/caphat/cap(src) new /obj/item/clothing/under/rank/captain(src) - new /obj/item/clothing/suit/storage/vest(src) + new /obj/item/clothing/suit/armor/vest(src) new /obj/item/weapon/cartridge/captain(src) - new /obj/item/clothing/head/helmet/swat(src) + new /obj/item/clothing/head/helmet(src) new /obj/item/clothing/shoes/brown(src) new /obj/item/device/radio/headset/heads/captain(src) new /obj/item/clothing/gloves/captain(src) @@ -47,13 +47,12 @@ New() ..() new /obj/item/clothing/glasses/sunglasses(src) - new /obj/item/clothing/suit/storage/vest(src) + new /obj/item/clothing/suit/armor/vest(src) new /obj/item/clothing/head/helmet(src) new /obj/item/weapon/cartridge/hop(src) new /obj/item/device/radio/headset/heads/hop(src) new /obj/item/weapon/storage/box/ids(src) new /obj/item/weapon/storage/box/ids( src ) - new /obj/item/weapon/gun/energy/gun(src) new /obj/item/weapon/gun/projectile/sec/flash(src) new /obj/item/device/flash(src) return @@ -104,6 +103,7 @@ else new /obj/item/weapon/storage/backpack/satchel_sec(src) new /obj/item/clothing/head/HoS(src) + new /obj/item/clothing/suit/armor/vest/security(src) new /obj/item/clothing/suit/storage/vest/hos(src) new /obj/item/clothing/under/rank/head_of_security/jensen(src) new /obj/item/clothing/under/rank/head_of_security/corp(src) @@ -123,6 +123,7 @@ new /obj/item/clothing/accessory/holster/waist(src) new /obj/item/weapon/melee/telebaton(src) new /obj/item/clothing/head/beret/sec/corporate/hos(src) + new /obj/item/clothing/accessory/badge/hos(src) return @@ -144,6 +145,7 @@ new /obj/item/weapon/storage/backpack/security(src) else new /obj/item/weapon/storage/backpack/satchel_sec(src) + new /obj/item/clothing/suit/armor/vest/security(src) new /obj/item/clothing/suit/storage/vest/warden(src) new /obj/item/clothing/under/rank/warden(src) new /obj/item/clothing/under/rank/warden/corp(src) @@ -154,12 +156,14 @@ new /obj/item/clothing/glasses/sunglasses/sechud(src) new /obj/item/taperoll/police(src) new /obj/item/weapon/storage/box/flashbangs(src) + new /obj/item/weapon/storage/box/teargas(src) new /obj/item/weapon/storage/belt/security(src) new /obj/item/weapon/reagent_containers/spray/pepper(src) new /obj/item/weapon/melee/baton/loaded(src) new /obj/item/weapon/gun/energy/gun(src) new /obj/item/weapon/storage/box/holobadge(src) new /obj/item/clothing/head/beret/sec/corporate/warden(src) + new /obj/item/clothing/accessory/badge/warden(src) return @@ -180,14 +184,14 @@ new /obj/item/weapon/storage/backpack/security(src) else new /obj/item/weapon/storage/backpack/satchel_sec(src) - new /obj/item/clothing/suit/storage/vest/officer(src) + new /obj/item/clothing/suit/armor/vest/security(src) new /obj/item/clothing/head/helmet(src) // new /obj/item/weapon/cartridge/security(src) new /obj/item/device/radio/headset/headset_sec(src) new /obj/item/weapon/storage/belt/security(src) new /obj/item/device/flash(src) new /obj/item/weapon/reagent_containers/spray/pepper(src) - new /obj/item/weapon/grenade/flashbang(src) + new /obj/item/weapon/grenade/chem_grenade/teargas(src) new /obj/item/weapon/melee/baton/loaded(src) new /obj/item/clothing/glasses/sunglasses/sechud(src) new /obj/item/taperoll/police(src) @@ -195,7 +199,6 @@ new /obj/item/clothing/accessory/storage/black_vest(src) new /obj/item/clothing/head/soft/sec/corp(src) new /obj/item/clothing/under/rank/security/corp(src) - new /obj/item/ammo_magazine/c45m/rubber(src) new /obj/item/weapon/gun/energy/taser(src) return @@ -258,9 +261,8 @@ new /obj/item/clothing/shoes/laceup(src) new /obj/item/weapon/storage/box/evidence(src) new /obj/item/device/radio/headset/headset_sec(src) - new /obj/item/clothing/suit/storage/vest/detective(src) - new /obj/item/ammo_magazine/c45m/rubber(src) - new /obj/item/ammo_magazine/c45m/rubber(src) + new /obj/item/clothing/suit/armor/vest/detective(src) + new /obj/item/ammo_magazine/c45m/flash(src) new /obj/item/taperoll/police(src) new /obj/item/weapon/gun/projectile/colt/detective(src) new /obj/item/clothing/accessory/holster/armpit(src) diff --git a/code/game/objects/structures/fireaxe_cabinet.dm b/code/game/objects/structures/fireaxe_cabinet.dm new file mode 100644 index 00000000000..a19693f5ab9 --- /dev/null +++ b/code/game/objects/structures/fireaxe_cabinet.dm @@ -0,0 +1,135 @@ +/obj/structure/fireaxecabinet + name = "fire axe cabinet" + desc = "There is small label that reads \"For Emergency use only\" along with details for safe use of the axe. As if." + icon_state = "fireaxe" + anchored = 1 + density = 0 + + var/damage_threshold = 15 + var/open + var/unlocked + var/shattered + var/obj/item/weapon/material/twohanded/fireaxe/fireaxe + +/obj/structure/fireaxecabinet/attack_generic(var/mob/user, var/damage, var/attack_verb, var/wallbreaker) + user.do_attack_animation(src) + playsound(user, 'sound/effects/Glasshit.ogg', 50, 1) + visible_message("[user] [attack_verb] \the [src]!") + if(damage_threshold > damage) + user << "Your strike is deflected by the reinforced glass!" + return + if(shattered) + return + shattered = 1 + unlocked = 1 + open = 1 + playsound(user, 'sound/effects/Glassbr3.ogg', 100, 1) + update_icon() + +/obj/structure/fireaxecabinet/update_icon() + overlays.Cut() + if(fireaxe) + overlays += image(icon, "fireaxe_item") + if(shattered) + overlays += image(icon, "fireaxe_window_broken") + else if(!open) + overlays += image(icon, "fireaxe_window") + +/obj/structure/fireaxecabinet/New() + ..() + fireaxe = new(src) + update_icon() + +/obj/structure/fireaxecabinet/attack_ai(var/mob/user) + toggle_lock(user) + +/obj/structure/fireaxecabinet/attack_hand(var/mob/user) + if(!unlocked) + user << "\The [src] is locked." + return + toggle_open(user) + +/obj/structure/fireaxecabinet/MouseDrop(over_object, src_location, over_location) + if(over_object == usr) + var/mob/user = over_object + if(!istype(user)) + return + + if(!open) + user << "\The [src] is closed." + return + + if(!fireaxe) + user << "\The [src] is empty." + return + + fireaxe.forceMove(get_turf(user)) + user.put_in_hands(fireaxe) + fireaxe = null + update_icon() + + return + +/obj/structure/fireaxecabinet/Destroy() + if(fireaxe) + fireaxe.forceMove(get_turf(src)) + fireaxe = null + return ..() + +/obj/structure/fireaxecabinet/attackby(var/obj/item/O, var/mob/user) + + if(istype(O, /obj/item/device/multitool)) + toggle_lock(user) + return + + if(istype(O, /obj/item/weapon/material/twohanded/fireaxe)) + if(open) + if(fireaxe) + user << "There is already \a [fireaxe] inside \the [src]." + else if(user.unEquip(O)) + O.forceMove(src) + fireaxe = O + user << "You place \the [fireaxe] into \the [src]." + update_icon() + return + + if(O.force) + user.setClickCooldown(10) + attack_generic(user, O.force, "bashes") + return + + return ..() + +/obj/structure/fireaxecabinet/proc/toggle_open(var/mob/user) + if(shattered) + open = 1 + unlocked = 1 + else + user.setClickCooldown(10) + open = !open + user << "You [open ? "open" : "close"] \the [src]." + update_icon() + +/obj/structure/fireaxecabinet/proc/toggle_lock(var/mob/user) + + + if(open) + return + + if(shattered) + open = 1 + unlocked = 1 + else + user.setClickCooldown(10) + user << "You begin [unlocked ? "enabling" : "disabling"] \the [src]'s maglock." + + if(!do_after(user, 20)) + return + + if(shattered) return + + unlocked = !unlocked + playsound(user, 'sound/machines/lockreset.ogg', 50, 1) + user << "You [unlocked ? "disable" : "enable"] the maglock." + + update_icon() diff --git a/code/game/turfs/flooring/flooring_decals.dm b/code/game/turfs/flooring/flooring_decals.dm index 7989442c902..484491e7d68 100644 --- a/code/game/turfs/flooring/flooring_decals.dm +++ b/code/game/turfs/flooring/flooring_decals.dm @@ -39,6 +39,7 @@ var/list/floor_decals = list() if(T.decals && T.decals.len) T.decals.Cut() T.update_icon() + qdel(src) return /obj/effect/floor_decal/corner diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 595c239ee49..3eb48aa0e79 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -140,7 +140,7 @@ var/const/enterloopsanity = 100 ..() var/objects = 0 if(A && (A.flags & PROXMOVE)) - for(var/atom/thing as mob|obj|turf|area in range(1)) + for(var/atom/movable/thing in range(1)) if(objects > enterloopsanity) break objects++ spawn(0) diff --git a/code/modules/admin/admin_report.dm b/code/modules/admin/admin_report.dm index c5cff737ee1..9bc1c91ef3f 100644 --- a/code/modules/admin/admin_report.dm +++ b/code/modules/admin/admin_report.dm @@ -118,7 +118,7 @@ client/proc/display_admin_reports() usr << browse(output, "window=news;size=600x400") -client/proc/Report(mob/M as mob in world) +client/proc/Report(mob/M as mob in mob_list) set category = "Admin" if(!src.holder) return diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 977e79bd28d..71654c31d25 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -640,7 +640,7 @@ var/list/admin_verbs_mentor = list( log_admin("[key_name(usr)] gave [key_name(T)] a [greater] disease2 with infection chance [D.infectionchance].") message_admins("\blue [key_name_admin(usr)] gave [key_name(T)] a [greater] disease2 with infection chance [D.infectionchance].", 1) -/client/proc/make_sound(var/obj/O in world) // -- TLE +/client/proc/make_sound(var/obj/O in range(world.view)) // -- TLE set category = "Special Verbs" set name = "Make Sound" set desc = "Display a message to everyone who can hear the target" diff --git a/code/modules/admin/callproc/callproc.dm b/code/modules/admin/callproc/callproc.dm index 9b3da2b92fe..41b8998c30a 100644 --- a/code/modules/admin/callproc/callproc.dm +++ b/code/modules/admin/callproc/callproc.dm @@ -33,7 +33,7 @@ callproc_targetpicked(targetselected, target) -/client/proc/callproc_target(atom/A in world) +/client/proc/callproc_target(atom/A in range(world.view)) set category = "Debug" set name = "Advanced ProcCall Target" diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm index e579ca15444..a8d98beaf0d 100644 --- a/code/modules/admin/verbs/adminjump.dm +++ b/code/modules/admin/verbs/adminjump.dm @@ -21,7 +21,7 @@ else alert("Admin jumping disabled") -/client/proc/jumptoturf(var/turf/T in world) +/client/proc/jumptoturf(var/turf/T in turfs) set name = "Jump to Turf" set category = "Admin" if(!check_rights(R_ADMIN|R_MOD|R_DEBUG)) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 9154badcc6b..7c4a74d65d6 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -119,7 +119,7 @@ alert("Invalid mob") /* -/client/proc/cmd_admin_monkeyize(var/mob/M in world) +/client/proc/cmd_admin_monkeyize(var/mob/M in mob_list) set category = "Fun" set name = "Make Monkey" @@ -134,7 +134,7 @@ else alert("Invalid mob") -/client/proc/cmd_admin_changelinginize(var/mob/M in world) +/client/proc/cmd_admin_changelinginize(var/mob/M in mob_list) set category = "Fun" set name = "Make Changeling" @@ -152,7 +152,7 @@ alert("Invalid mob") */ /* -/client/proc/cmd_admin_abominize(var/mob/M in world) +/client/proc/cmd_admin_abominize(var/mob/M in mob_list) set category = null set name = "Make Abomination" @@ -169,7 +169,7 @@ */ /* -/client/proc/make_cultist(var/mob/M in world) // -- TLE, modified by Urist +/client/proc/make_cultist(var/mob/M in mob_list) // -- TLE, modified by Urist set category = "Fun" set name = "Make Cultist" set desc = "Makes target a cultist" diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm index 50ddc81f41b..713b8f6a51d 100644 --- a/code/modules/admin/verbs/modifyvariables.dm +++ b/code/modules/admin/verbs/modifyvariables.dm @@ -9,7 +9,7 @@ var/list/VVicon_edit_lock = list("icon", "icon_state", "overlays", "underlays") var/list/VVckey_edit = list("key", "ckey") /* -/client/proc/cmd_modify_object_variables(obj/O as obj|mob|turf|area in world) +/client/proc/cmd_modify_object_variables(obj/O as obj|mob|turf|area in world) // Acceptable 'in world', as VV would be incredibly hampered otherwise set category = "Debug" set name = "Edit Variables" set desc="(target) Edit a target item's variables" diff --git a/code/modules/admin/verbs/possess.dm b/code/modules/admin/verbs/possess.dm index 6de30853ce6..a9787261004 100644 --- a/code/modules/admin/verbs/possess.dm +++ b/code/modules/admin/verbs/possess.dm @@ -1,4 +1,4 @@ -/proc/possess(obj/O as obj in world) +/proc/possess(obj/O as obj in range(world.view)) set name = "Possess Obj" set category = "Object" @@ -26,7 +26,7 @@ usr.control_object = O feedback_add_details("admin_verb","PO") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/proc/release(obj/O as obj in world) +/proc/release(obj/O as obj in range(world.view)) set name = "Release Obj" set category = "Object" //usr.loc = get_turf(usr) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index ba00a930b39..6924b2b716f 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -536,7 +536,7 @@ Traitors and the like can also be revived with the previous role mostly intact. message_admins("[key_name_admin(src)] has created a command report", 1) feedback_add_details("admin_verb","CCR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/client/proc/cmd_admin_delete(atom/O as obj|mob|turf in view()) +/client/proc/cmd_admin_delete(atom/O as obj|mob|turf in range(world.view)) set category = "Admin" set name = "Delete" @@ -562,7 +562,7 @@ Traitors and the like can also be revived with the previous role mostly intact. src << "[job.title]: [job.total_positions]" feedback_add_details("admin_verb","LFS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/client/proc/cmd_admin_explosion(atom/O as obj|mob|turf in world) +/client/proc/cmd_admin_explosion(atom/O as obj|mob|turf in range(world.view)) set category = "Special Verbs" set name = "Explosion" @@ -590,7 +590,7 @@ Traitors and the like can also be revived with the previous role mostly intact. else return -/client/proc/cmd_admin_emp(atom/O as obj|mob|turf in world) +/client/proc/cmd_admin_emp(atom/O as obj|mob|turf in range(world.view)) set category = "Special Verbs" set name = "EM Pulse" diff --git a/code/modules/admin/view_variables/view_variables.dm b/code/modules/admin/view_variables/view_variables.dm index e624d2df05a..09505ac5771 100644 --- a/code/modules/admin/view_variables/view_variables.dm +++ b/code/modules/admin/view_variables/view_variables.dm @@ -6,6 +6,7 @@ // Variables not to expand the lists of. Vars is pointless to expand, and overlays/underlays cannot be expanded. /var/list/view_variables_dont_expand = list("overlays", "underlays", "vars") +// Acceptable 'in world', as VV would be incredibly hampered otherwise /client/proc/debug_variables(datum/D in world) set category = "Debug" set name = "View Variables" diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index b03c148026c..f448ce35a11 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -187,13 +187,10 @@ return /obj/effect/beam/i_beam/process() - //world << "i_beam \ref[src] : process" - if((loc.density || !(master))) - // world << "beam hit loc [loc] or no master [master], deleting" + if((loc && loc.density) || !master) qdel(src) return - //world << "proccess: [src.left] left" if(left > 0) left-- diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm index cfc46a86a5c..2b71743416e 100644 --- a/code/modules/assembly/proximity.dm +++ b/code/modules/assembly/proximity.dm @@ -40,6 +40,9 @@ HasProximity(atom/movable/AM as mob|obj) + if(!istype(AM)) + log_debug("DEBUG: HasProximity called with [AM] on [src] ([usr]).") + return if (istype(AM, /obj/effect/beam)) return if (AM.move_speed < 12) sense() return diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 681b33d6892..81d9bc4a8c7 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -6,6 +6,10 @@ var/list/species_restricted = null //Only these species can wear this kit. var/gunshot_residue //Used by forensics. + var/list/accessories = list() + var/list/valid_accessory_slots + var/list/restricted_accessory_slots + /* Sprites used when the clothing item is refit. This is done by setting icon_override. For best results, if this is set then sprite_sheets should be null and vice versa, but that is by no means necessary. @@ -509,7 +513,6 @@ BLIND // can't see anything 2 = Report detailed damages 3 = Report location */ - var/list/accessories = list() var/displays_id = 1 var/rolled_down = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled sprite_sheets = list( @@ -520,6 +523,15 @@ BLIND // can't see anything //convenience var for defining the icon state for the overlay used when the clothing is worn. //Also used by rolling/unrolling. var/worn_state = null + valid_accessory_slots = list("utility","armband","decor") + restricted_accessory_slots = list("utility", "armband") + + +/obj/item/clothing/under/attack_hand(var/mob/user) + if(accessories && accessories.len) + ..() + if ((ishuman(usr) || issmall(usr)) && src.loc == user) + return /obj/item/clothing/under/New() ..() @@ -563,69 +575,6 @@ BLIND // can't see anything var/mob/M = src.loc M.update_inv_w_uniform() -/obj/item/clothing/under/proc/can_attach_accessory(obj/item/clothing/accessory/A) - if(istype(A)) - .=1 - else - return 0 - if(accessories.len && (A.slot in list("utility","armband"))) - for(var/obj/item/clothing/accessory/AC in accessories) - if (AC.slot == A.slot) - return 0 - -/obj/item/clothing/under/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/clothing/accessory)) - var/obj/item/clothing/accessory/A = I - if(can_attach_accessory(A)) - user.drop_item() - accessories += A - A.on_attached(src, user) - - if(istype(loc, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = loc - H.update_inv_w_uniform() - - return - else - user << "You cannot attach more accessories of this type to [src]." - - if(accessories.len) - for(var/obj/item/clothing/accessory/A in accessories) - A.attackby(I, user) - return - - ..() - -/obj/item/clothing/under/attack_hand(mob/user as mob) - //only forward to the attached accessory if the clothing is equipped (not in a storage) - if(accessories.len && src.loc == user) - for(var/obj/item/clothing/accessory/A in accessories) - A.attack_hand(user) - return - - if ((ishuman(usr) || issmall(usr)) && src.loc == user) //make it harder to accidentally undress yourself - return - - ..() - -/obj/item/clothing/under/MouseDrop(obj/over_object as obj) - if (ishuman(usr) || issmall(usr)) - //makes sure that the clothing is equipped so that we can't drag it into our hand from miles away. - if (!(src.loc == usr)) - return - - if (( usr.restrained() ) || ( usr.stat )) - return - - if (!usr.unEquip(src)) - return - - switch(over_object.name) - if("r_hand") - usr.put_in_r_hand(src) - if("l_hand") - usr.put_in_l_hand(src) - src.add_fingerprint(usr) /obj/item/clothing/under/examine(mob/user) ..(user) @@ -638,9 +587,6 @@ BLIND // can't see anything user << "Its vital tracker appears to be enabled." if(3) user << "Its vital tracker and tracking beacon appear to be enabled." - if(accessories.len) - for(var/obj/item/clothing/accessory/A in accessories) - user << "\A [A] is attached to it." /obj/item/clothing/under/proc/set_sensors(mob/usr as mob) var/mob/M = usr @@ -713,34 +659,7 @@ BLIND // can't see anything item_state_slots[slot_w_uniform_str] = "[worn_state]" update_clothing_icon() -/obj/item/clothing/under/proc/remove_accessory(mob/user, obj/item/clothing/accessory/A) - if(!(A in accessories)) - return - - A.on_removed(user) - accessories -= A - update_clothing_icon() - -/obj/item/clothing/under/verb/removetie() - set name = "Remove Accessory" - set category = "Object" - set src in usr - if(!istype(usr, /mob/living)) return - if(usr.stat) return - if(!accessories.len) return - var/obj/item/clothing/accessory/A - if(accessories.len > 1) - A = input("Select an accessory to remove from [src]") as null|anything in accessories - else - A = accessories[1] - src.remove_accessory(usr,A) /obj/item/clothing/under/rank/New() sensor_mode = pick(0,1,2,3) ..() - -/obj/item/clothing/under/emp_act(severity) - if(accessories.len) - for(var/obj/item/clothing/accessory/A in accessories) - A.emp_act(severity) - ..() \ No newline at end of file diff --git a/code/modules/clothing/clothing_accessories.dm b/code/modules/clothing/clothing_accessories.dm new file mode 100644 index 00000000000..57e22d6ba04 --- /dev/null +++ b/code/modules/clothing/clothing_accessories.dm @@ -0,0 +1,100 @@ +/obj/item/clothing/proc/can_attach_accessory(obj/item/clothing/accessory/A) + if(valid_accessory_slots && istype(A) && (A.slot in valid_accessory_slots)) + .=1 + else + return 0 + if(accessories.len && restricted_accessory_slots && (A.slot in restricted_accessory_slots)) + for(var/obj/item/clothing/accessory/AC in accessories) + if (AC.slot == A.slot) + return 0 + +/obj/item/clothing/attackby(var/obj/item/I, var/mob/user) + if(istype(I, /obj/item/clothing/accessory)) + + if(!valid_accessory_slots || !valid_accessory_slots.len) + usr << "You cannot attach accessories of any kind to \the [src]." + return + + var/obj/item/clothing/accessory/A = I + if(can_attach_accessory(A)) + user.drop_item() + accessories += A + A.on_attached(src, user) + src.verbs |= /obj/item/clothing/proc/removetie_verb + if(istype(loc, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = loc + H.update_inv_w_uniform() + return + else + user << "You cannot attach more accessories of this type to [src]." + return + + if(accessories.len) + for(var/obj/item/clothing/accessory/A in accessories) + A.attackby(I, user) + return + + ..() + +/obj/item/clothing/attack_hand(var/mob/user) + //only forward to the attached accessory if the clothing is equipped (not in a storage) + if(accessories.len && src.loc == user) + for(var/obj/item/clothing/accessory/A in accessories) + A.attack_hand(user) + return + return ..() + +/obj/item/clothing/MouseDrop(var/obj/over_object) + if (ishuman(usr) || issmall(usr)) + //makes sure that the clothing is equipped so that we can't drag it into our hand from miles away. + if (!(src.loc == usr)) + return + + if (( usr.restrained() ) || ( usr.stat )) + return + + if (!usr.unEquip(src)) + return + + switch(over_object.name) + if("r_hand") + usr.put_in_r_hand(src) + if("l_hand") + usr.put_in_l_hand(src) + src.add_fingerprint(usr) + +/obj/item/clothing/examine(var/mob/user) + ..(user) + if(accessories.len) + for(var/obj/item/clothing/accessory/A in accessories) + user << "\A [A] is attached to it." + +/obj/item/clothing/proc/remove_accessory(mob/user, obj/item/clothing/accessory/A) + if(!(A in accessories)) + return + + A.on_removed(user) + accessories -= A + update_clothing_icon() + +/obj/item/clothing/proc/removetie_verb() + set name = "Remove Accessory" + set category = "Object" + set src in usr + if(!istype(usr, /mob/living)) return + if(usr.stat) return + if(!accessories.len) return + var/obj/item/clothing/accessory/A + if(accessories.len > 1) + A = input("Select an accessory to remove from [src]") as null|anything in accessories + else + A = accessories[1] + src.remove_accessory(usr,A) + if(!accessories.len) + src.verbs -= /obj/item/clothing/proc/removetie_verb + +/obj/item/clothing/emp_act(severity) + if(accessories.len) + for(var/obj/item/clothing/accessory/A in accessories) + A.emp_act(severity) + ..() \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/rig/modules/ninja.dm b/code/modules/clothing/spacesuits/rig/modules/ninja.dm index b8244a0a8a2..9c516009525 100644 --- a/code/modules/clothing/spacesuits/rig/modules/ninja.dm +++ b/code/modules/clothing/spacesuits/rig/modules/ninja.dm @@ -169,6 +169,10 @@ interface_name = "dead man's switch" interface_desc = "An integrated self-destruct module. When the wearer dies, so does the surrounding area. Do not press this button." + var/list/explosion_values = list(1,2,4,5) + +/obj/item/rig_module/self_destruct/small + explosion_values = list(0,0,3,4) /obj/item/rig_module/self_destruct/activate() return @@ -184,17 +188,12 @@ //OH SHIT. if(holder.wearer.stat == 2) - engage() + engage(1) -/obj/item/rig_module/self_destruct/engage() - explosion(get_turf(src), 1, 2, 4, 5) - if(holder && holder.wearer) - holder.wearer.drop_from_inventory(src) - qdel(holder) - qdel(src) - -/obj/item/rig_module/self_destruct/small/engage() - explosion(get_turf(src), 0, 0, 3, 4) +/obj/item/rig_module/self_destruct/engage(var/skip_check) + if(!skip_check && usr && alert(usr, "Are you sure you want to push that button?", "Self-destruct", "No", "Yes") == "No") + return + explosion(get_turf(src), explosion_values[1], explosion_values[2], explosion_values[3], explosion_values[4]) if(holder && holder.wearer) holder.wearer.drop_from_inventory(src) qdel(holder) diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index 13d48df5cce..ba3c9f58b28 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -560,8 +560,8 @@ M.visible_message("[M] starts putting on \the [src]...", "You start putting on \the [src]...") if(!do_after(M,seal_delay)) if(M && M.back == src) - M.back = null - M.drop_from_inventory(src) + if(!M.unEquip(src)) + return src.forceMove(get_turf(src)) return @@ -632,12 +632,9 @@ use_obj.forceMove(src) if(check_slot) H << "You are unable to deploy \the [piece] as \the [check_slot] [check_slot.gender == PLURAL ? "are" : "is"] in the way." + return else - use_obj.forceMove(H) - if(!H.equip_to_slot_if_possible(use_obj, equip_to, 0)) - use_obj.forceMove(src) - else - H << "Your [use_obj.name] [use_obj.gender == PLURAL ? "deploy" : "deploys"] swiftly." + H << "Your [use_obj.name] [use_obj.gender == PLURAL ? "deploy" : "deploys"] swiftly." if(piece == "helmet" && helmet) helmet.update_light(H) diff --git a/code/modules/clothing/spacesuits/rig/rig_attackby.dm b/code/modules/clothing/spacesuits/rig/rig_attackby.dm index 8faff35a296..c9526f16261 100644 --- a/code/modules/clothing/spacesuits/rig/rig_attackby.dm +++ b/code/modules/clothing/spacesuits/rig/rig_attackby.dm @@ -56,7 +56,7 @@ user << "\The [src] already has a tank installed." return - user.drop_from_inventory(W) + if(!user.unEquip(W)) return air_supply = W W.forceMove(src) user << "You slot [W] into [src] and tighten the connecting valve." @@ -84,8 +84,8 @@ return if(!user || !W) return + if(!user.unEquip(mod)) return user << "You install \the [mod] into \the [src]." - user.drop_from_inventory(mod) installed_modules |= mod mod.forceMove(src) mod.installed(src) @@ -94,8 +94,8 @@ else if(!cell && istype(W,/obj/item/weapon/cell)) + if(!user.unEquip(W)) return user << "You jack \the [W] into \the [src]'s battery mount." - user.drop_from_inventory(W) W.forceMove(src) src.cell = W return diff --git a/code/modules/clothing/spacesuits/void/void.dm b/code/modules/clothing/spacesuits/void/void.dm index 2c6d761a7a6..86edeca84dd 100644 --- a/code/modules/clothing/spacesuits/void/void.dm +++ b/code/modules/clothing/spacesuits/void/void.dm @@ -186,8 +186,11 @@ if(!istype(user,/mob/living)) return + if(istype(W,/obj/item/clothing/accessory) || istype(W, /obj/item/weapon/hand_labeler)) + return ..() + if(istype(src.loc,/mob/living)) - user << "How do you propose to modify a voidsuit while it is being worn?" + user << "You cannot modify \the [src] while it is being worn." return if(istype(W,/obj/item/weapon/screwdriver)) diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 300422bc731..49e01de7293 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -1,6 +1,6 @@ /obj/item/clothing/suit/armor - allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs) + allowed = list(/obj/item/weapon/gun/energy,/obj/item/device/radio,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs) body_parts_covered = UPPER_TORSO|LOWER_TORSO item_flags = THICKMATERIAL @@ -66,7 +66,7 @@ /obj/item/clothing/suit/armor/laserproof/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") if(istype(damage_source, /obj/item/projectile/energy) || istype(damage_source, /obj/item/projectile/beam)) var/obj/item/projectile/P = damage_source - + var/reflectchance = 40 - round(damage/3) if(!(def_zone in list("chest", "groin"))) reflectchance /= 2 @@ -146,12 +146,12 @@ if(!turfs.len) turfs += pick(/turf in orange(6)) var/turf/picked = pick(turfs) if(!isturf(picked)) return - + var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, user.loc) spark_system.start() playsound(user.loc, "sparks", 50, 1) - + user.loc = picked return PROJECTILE_FORCE_MISS return 0 @@ -244,102 +244,58 @@ icon_state = "ertarmor_med" //New Vests -/obj/item/clothing/suit/storage/vest +/obj/item/clothing/suit/armor/vest name = "armor vest" - desc = "A simple kevlar plate carrier." + desc = "An armor vest made of synthetic fibers." icon_state = "kvest" - item_state = "kvest" + item_state = "armor" armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0) - allowed = list(/obj/item/weapon/gun,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs) + +/obj/item/clothing/suit/armor/vest/security + name = "security vest" + desc = "A synthetic armor vest. This one is marked with the crest of NanoTrasen." + icon_state = "secvest" + +/obj/item/clothing/suit/armor/vest/detective + name = "detective armor vest" + desc = "An synthetic armor vest colored in a vintage brown." + icon_state = "detvest" + +/obj/item/clothing/suit/storage/vest + name = "webbed armor vest" + desc = "A synthetic armor vest. This one has added webbing and ballistic plates." + icon_state = "webvest" + armor = list(melee = 50, bullet = 40, laser = 50, energy = 25, bomb = 30, bio = 0, rad = 0) + allowed = list(/obj/item/weapon/gun/energy,/obj/item/device/radio,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs) /obj/item/clothing/suit/storage/vest/officer - name = "officer armor vest" - desc = "A simple kevlar plate carrier. This one has a security holobadge clipped to the chest." - icon_state = "officervest_nobadge" - item_state = "officervest_nobadge" - icon_badge = "officervest_badge" - icon_nobadge = "officervest_nobadge" + name = "security armor vest" + desc = "A synthetic armor vest with SECURITY printed in red lettering on the chest. This one has added webbing and ballistic plates." + icon_state = "officervest" /obj/item/clothing/suit/storage/vest/warden name = "warden armor vest" - desc = "A simple kevlar plate carrier. This one has a silver badge clipped to the chest." - icon_state = "wardenvest_nobadge" - item_state = "wardenvest_nobadge" - icon_badge = "wardenvest_badge" - icon_nobadge = "wardenvest_nobadge" + desc = "A synthetic armor vest with WARDEN printed in silver lettering on the chest. This one has added webbing and ballistic plates." + icon_state = "wardenvest" /obj/item/clothing/suit/storage/vest/hos name = "commander armor vest" - desc = "A simple kevlar plate carrier. This one has a gold badge clipped to the chest." - icon_state = "hosvest_nobadge" - item_state = "hosvest_nobadge" - icon_badge = "hosvest_badge" - icon_nobadge = "hosvest_nobadge" + desc = "A synthetic armor vest with COMMANDER printed in gold lettering on the chest. This one has added webbing and ballistic plates." + icon_state = "hosvest" /obj/item/clothing/suit/storage/vest/pcrc name = "PCRC armor vest" - desc = "A simple kevlar plate carrier belonging to Proxima Centauri Risk Control. This one has a PCRC crest clipped to the chest." - icon_state = "pcrcvest_nobadge" - item_state = "pcrcvest_nobadge" - icon_badge = "pcrcvest_badge" - icon_nobadge = "pcrcvest_nobadge" - -/obj/item/clothing/suit/storage/vest/detective - name = "detective armor vest" - desc = "A simple kevlar plate carrier in a vintage brown, it has a badge clipped to the chest that reads, 'Private investigator'." - icon_state = "detectivevest_nobadge" - item_state = "detectivevest_nobadge" - icon_badge = "detectivevest_badge" - icon_nobadge = "detectivevest_nobadge" - -/obj/item/clothing/suit/storage/vest/heavy - name = "heavy armor vest" - desc = "A heavy kevlar plate carrier with webbing attached." - icon_state = "webvest" - item_state = "webvest" - armor = list(melee = 50, bullet = 40, laser = 50, energy = 25, bomb = 30, bio = 0, rad = 0) - slowdown = 1 - -/obj/item/clothing/suit/storage/vest/heavy/officer - name = "officer heavy armor vest" - desc = "A heavy kevlar plate carrier with webbing attached. This one has a security holobadge clipped to the chest." - icon_state = "officerwebvest_nobadge" - item_state = "officerwebvest_nobadge" - icon_badge = "officerwebvest_badge" - icon_nobadge = "officerwebvest_nobadge" - -/obj/item/clothing/suit/storage/vest/heavy/warden - name = "warden heavy armor vest" - desc = "A heavy kevlar plate carrier with webbing attached. This one has a silver badge clipped to the chest." - icon_state = "wardenwebvest_nobadge" - item_state = "wardenwebvest_nobadge" - icon_badge = "wardenwebvest_badge" - icon_nobadge = "wardenwebvest_nobadge" - -/obj/item/clothing/suit/storage/vest/heavy/hos - name = "commander heavy armor vest" - desc = "A heavy kevlar plate carrier with webbing attached. This one has a gold badge clipped to the chest." - icon_state = "hoswebvest_nobadge" - item_state = "hoswebvest_nobadge" - icon_badge = "hoswebvest_badge" - icon_nobadge = "hoswebvest_nobadge" - -/obj/item/clothing/suit/storage/vest/heavy/pcrc - name = "PCRC heavy armor vest" - desc = "A heavy kevlar plate carrier belonging to Proxima Centauri Risk Control with webbing attached. This one has a PCRC crest clipped to the chest." - icon_state = "pcrcwebvest_nobadge" - item_state = "pcrcwebvest_nobadge" - icon_badge = "pcrcwebvest_badge" - icon_nobadge = "pcrcwebvest_nobadge" + desc = "A synthetic armor vest with SECURITY printed in cyan lettering on the chest. This one has added webbing and ballistic plates." + icon_state = "pcrcvest" //Provides the protection of a merc voidsuit, but only covers the chest/groin, and also takes up a suit slot. In exchange it has no slowdown and provides storage. -/obj/item/clothing/suit/storage/vest/heavy/merc +/obj/item/clothing/suit/storage/vest/merc name = "heavy armor vest" - desc = "A high-quality heavy kevlar plate carrier in a fetching tan. The vest is surprisingly flexible, and possibly made of an advanced material." + desc = "A high-quality armor vest in a fetching tan. It is surprisingly flexible and light, even with the added webbing and armor plating." icon_state = "mercwebvest" item_state = "mercwebvest" armor = list(melee = 60, bullet = 60, laser = 60, energy = 40, bomb = 40, bio = 0, rad = 0) - slowdown = 0 + //All of the armor below is mostly unused diff --git a/code/modules/clothing/suits/storage.dm b/code/modules/clothing/suits/storage.dm index 36ece959bfc..eca8fd34ef8 100644 --- a/code/modules/clothing/suits/storage.dm +++ b/code/modules/clothing/suits/storage.dm @@ -52,32 +52,10 @@ update_clothing_icon() //so our overlays update -//New Vest 4 pocket storage and badge toggles, until suit accessories are a thing. -/obj/item/clothing/suit/storage/vest/heavy/New() +/obj/item/clothing/suit/storage/vest/merc/New() ..() pockets = new/obj/item/weapon/storage/internal(src) pockets.storage_slots = 4 pockets.max_w_class = 2 pockets.max_storage_space = 8 -/obj/item/clothing/suit/storage/vest - var/icon_badge - var/icon_nobadge - verb/toggle() - set name ="Adjust Badge" - set category = "Object" - set src in usr - if(!usr.canmove || usr.stat || usr.restrained()) - return 0 - - if(icon_state == icon_badge) - icon_state = icon_nobadge - usr << "You conceal \the [src]'s badge." - else if(icon_state == icon_nobadge) - icon_state = icon_badge - usr << "You reveal \the [src]'s badge." - else - usr << "\The [src] does not have a vest badge." - return - update_clothing_icon() - diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index bdc9f33a2e9..0f4ec46c941 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -7,16 +7,20 @@ slot_flags = SLOT_TIE w_class = 2.0 var/slot = "decor" - var/obj/item/clothing/under/has_suit = null //the suit the tie may be attached to + var/obj/item/clothing/has_suit = null //the suit the tie may be attached to var/image/inv_overlay = null //overlay used when attached to clothing. var/image/mob_overlay = null var/overlay_state = null +/obj/item/clothing/accessory/Destroy() + on_removed() + return ..() + /obj/item/clothing/accessory/proc/get_inv_overlay() if(!inv_overlay) if(!mob_overlay) get_mob_overlay() - + var/tmp_icon_state = "[overlay_state? "[overlay_state]" : "[icon_state]"]" if(icon_override) if("[tmp_icon_state]_tie" in icon_states(icon_override)) @@ -36,23 +40,26 @@ return mob_overlay //when user attached an accessory to S -/obj/item/clothing/accessory/proc/on_attached(obj/item/clothing/under/S, mob/user as mob) +/obj/item/clothing/accessory/proc/on_attached(var/obj/item/clothing/S, var/mob/user) if(!istype(S)) return has_suit = S loc = has_suit has_suit.overlays += get_inv_overlay() - user << "You attach [src] to [has_suit]." + user << "You attach \the [src] to \the [has_suit]." src.add_fingerprint(user) -/obj/item/clothing/accessory/proc/on_removed(mob/user as mob) +/obj/item/clothing/accessory/proc/on_removed(var/mob/user) if(!has_suit) return has_suit.overlays -= get_inv_overlay() has_suit = null - usr.put_in_hands(src) - src.add_fingerprint(user) + if(user) + usr.put_in_hands(src) + src.add_fingerprint(user) + else + src.forceMove(get_turf(src)) //default attackby behaviour /obj/item/clothing/accessory/attackby(obj/item/I, mob/user) diff --git a/code/modules/clothing/under/accessories/badges.dm b/code/modules/clothing/under/accessories/badges.dm index 6b875ce5c8f..c04c899c369 100644 --- a/code/modules/clothing/under/accessories/badges.dm +++ b/code/modules/clothing/under/accessories/badges.dm @@ -6,8 +6,9 @@ /obj/item/clothing/accessory/badge name = "detective's badge" - desc = "Security Department detective's badge, made from gold." + desc = "A corporate security badge, made from gold and set on false leather." icon_state = "badge" + item_state = "marshalbadge" slot_flags = SLOT_BELT | SLOT_TIE var/stored_name @@ -25,7 +26,7 @@ /obj/item/clothing/accessory/badge/attack_self(mob/user as mob) if(!stored_name) - user << "You polish your old badge fondly, shining up the surface." + user << "You polish your badge fondly, shining up the surface." set_name(user.real_name) return @@ -38,14 +39,13 @@ /obj/item/clothing/accessory/badge/attack(mob/living/carbon/human/M, mob/living/user) if(isliving(user)) user.visible_message("[user] invades [M]'s personal space, thrusting [src] into their face insistently.","You invade [M]'s personal space, thrusting [src] into their face insistently.") - user.do_attack_animation(M) - user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) //to prevent spam //.Holobadges. /obj/item/clothing/accessory/badge/holo name = "holobadge" - desc = "This glowing blue badge marks the holder as THE LAW." + desc = "This glowing blue badge marks the holder as a member of corporate security." icon_state = "holobadge" + item_state = "holobadge" var/emagged //Emagging removes Sec check. /obj/item/clothing/accessory/badge/holo/cord @@ -98,3 +98,24 @@ new /obj/item/clothing/accessory/badge/holo/cord(src) ..() return + + +/obj/item/clothing/accessory/badge/warden + name = "warden's badge" + desc = "A silver corporate security badge. Stamped with the words 'Brig Officer.'" + icon_state = "silverbadge" + slot_flags = SLOT_TIE + + +/obj/item/clothing/accessory/badge/hos + name = "commander's badge" + desc = "An immaculately polished gold security badge. Labeled 'Commander.'" + icon_state = "goldbadge" + slot_flags = SLOT_TIE + +/obj/item/clothing/accessory/badge/marshal + name = "marshal's badge" + desc = "A leather-backed gold badge displaying the crest of the Colonial Marshals." + icon_state = "marshalbadge" + badge_string = "Colonial Marshal Bureau" + diff --git a/code/modules/mob/freelook/ai/eye.dm b/code/modules/mob/freelook/ai/eye.dm index 93fda30055e..461f3451379 100644 --- a/code/modules/mob/freelook/ai/eye.dm +++ b/code/modules/mob/freelook/ai/eye.dm @@ -18,7 +18,7 @@ ai.ai_cancel_tracking() //Holopad - if(ai.holo) + if(ai.holo && ai.hologram_follow) ai.holo.move_hologram(ai) return 1 diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 9140428d790..dcd7e06f235 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -770,6 +770,12 @@ var/global/list/damage_icon_parts = list() bloodsies.color = wear_suit.blood_color standing.overlays += bloodsies + // Accessories - copied from uniform, BOILERPLATE because fuck this system. + var/obj/item/clothing/suit/suit = wear_suit + if(istype(suit) && suit.accessories.len) + for(var/obj/item/clothing/accessory/A in suit.accessories) + standing.overlays |= A.get_mob_overlay() + overlays_standing[SUIT_LAYER] = standing update_tail_showing(0) diff --git a/code/modules/mob/living/carbon/resist.dm b/code/modules/mob/living/carbon/resist.dm index a5b4cd20925..7ddbe6bc6eb 100644 --- a/code/modules/mob/living/carbon/resist.dm +++ b/code/modules/mob/living/carbon/resist.dm @@ -29,8 +29,8 @@ /mob/living/carbon/proc/escape_handcuffs() //if(!(last_special <= world.time)) return - //These two lines represent a significant buff to grabs... - if(!canClick()) return + //This line represent a significant buff to grabs... + // We don't have to check the click cooldown because /mob/living/verb/resist() has done it for us, we can simply set the delay setClickCooldown(100) if(can_break_cuffs()) //Don't want to do a lot of logic gating here. @@ -53,7 +53,7 @@ displaytime /= 2 visible_message( - "[src] attempts to remove \the [HC]!", + "\The [src] attempts to remove \the [HC]!", "You attempt to remove \the [HC]. (This will take around [displaytime] minutes and you need to stand still)" ) @@ -61,7 +61,7 @@ if(!handcuffed || buckled) return visible_message( - "[src] manages to remove \the [handcuffed]!", + "\The [src] manages to remove \the [handcuffed]!", "You successfully remove \the [handcuffed]." ) drop_from_inventory(handcuffed) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 5d3cf1a74c7..72ee2ce2318 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -23,7 +23,8 @@ var/list/ai_verbs_default = list( /mob/living/silicon/ai/proc/sensor_mode, /mob/living/silicon/ai/proc/show_laws_verb, /mob/living/silicon/ai/proc/toggle_acceleration, - /mob/living/silicon/ai/proc/toggle_camera_light + /mob/living/silicon/ai/proc/toggle_camera_light, + /mob/living/silicon/ai/proc/toggle_hologram_movement ) //Not sure why this is necessary... @@ -61,6 +62,7 @@ var/list/ai_verbs_default = list( var/control_disabled = 0 var/datum/announcement/priority/announcement var/obj/machinery/ai_powersupply/psupply = null // Backwards reference to AI's powersupply object. + var/hologram_follow = 1 //This is used for the AI eye, to determine if a holopad's hologram should follow it or not //NEWMALF VARIABLES var/malfunctioning = 0 // Master var that determines if AI is malfunctioning. @@ -203,6 +205,7 @@ var/list/ai_verbs_default = list( /mob/living/silicon/ai/Destroy() ai_list -= src qdel(eyeobj) + eyeobj = null ..() /mob/living/silicon/ai/proc/setup_icon() @@ -644,6 +647,14 @@ var/list/ai_verbs_default = list( set desc = "Augment visual feed with internal sensor overlays" toggle_sensor_mode() +/mob/living/silicon/ai/proc/toggle_hologram_movement() + set name = "Toggle Hologram Movement" + set category = "AI Commands" + set desc = "Toggles hologram movement based on moving with your virtual eye." + + hologram_follow = !hologram_follow + usr << "Your hologram will now [hologram_follow ? "follow" : "no longer follow"] you." + /mob/living/silicon/ai/proc/check_unable(var/flags = 0, var/feedback = 1) if(stat == DEAD) if(feedback) src << "You are dead!" diff --git a/code/modules/mob/living/silicon/pai/admin.dm b/code/modules/mob/living/silicon/pai/admin.dm index 069c5d2c684..da136c78f14 100644 --- a/code/modules/mob/living/silicon/pai/admin.dm +++ b/code/modules/mob/living/silicon/pai/admin.dm @@ -1,5 +1,5 @@ // Originally a debug verb, made it a proper adminverb for ~fun~ -/client/proc/makePAI(turf/t in view(), name as text, pai_key as null|text) +/client/proc/makePAI(turf/t in range(world.view), name as text, pai_key as null|text) set name = "Make pAI" set category = "Admin" diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index a9805e78997..b3eb428c43e 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -85,8 +85,7 @@ // blind_message (optional) is what blind people will hear e.g. "You hear something!" /mob/visible_message(var/message, var/self_message, var/blind_message) - - var/list/see = get_mobs_or_objects_in_view(world.view,src) | viewers(get_turf(src), null) + var/list/see = get_mobs_or_objects_in_view(world.view,src) | viewers(world.view,src) for(var/I in see) if(isobj(I)) @@ -152,8 +151,33 @@ //handle_typing_indicator() //You said the typing indicator would be fine. The test determined that was a lie. return -/mob/proc/incapacitated() - return (stat || paralysis || stunned || weakened || restrained()) +#define UNBUCKLED 0 +#define PARTIALLY_BUCKLED 1 +#define FULLY_BUCKLED 2 +/mob/proc/buckled() + // Preliminary work for a future buckle rewrite, + // where one might be fully restrained (like an elecrical chair), or merely secured (shuttle chair, keeping you safe but not otherwise restrained from acting) + return buckled ? FULLY_BUCKLED : UNBUCKLED + +/mob/proc/incapacitated(var/incapacitation_flags = INCAPACITATION_DEFAULT) + if (stat || paralysis || stunned || weakened || resting || sleeping || (status_flags & FAKEDEATH)) + return 1 + + if((incapacitation_flags & INCAPACITATION_RESTRAINED) && restrained()) + return 1 + + if((incapacitation_flags & (INCAPACITATION_BUCKLED_PARTIALLY|INCAPACITATION_BUCKLED_FULLY))) + var/buckling = buckled() + if(buckling >= PARTIALLY_BUCKLED && (incapacitation_flags & INCAPACITATION_BUCKLED_PARTIALLY)) + return 1 + if(buckling == FULLY_BUCKLED && (incapacitation_flags & INCAPACITATION_BUCKLED_FULLY)) + return 1 + + return 0 + +#undef UNBUCKLED +#undef PARTIALLY_BUCKLED +#undef FULLY_BUCKLED /mob/proc/restrained() return @@ -699,7 +723,7 @@ return 0 /mob/proc/cannot_stand() - return incapacitated() || restrained() || resting || sleeping || (status_flags & FAKEDEATH) + return incapacitated(INCAPACITATION_DEFAULT & (~INCAPACITATION_RESTRAINED)) //Updates canmove, lying and icons. Could perhaps do with a rename but I can't think of anything to describe it. /mob/proc/update_canmove() diff --git a/code/modules/mob/new_player/login.dm b/code/modules/mob/new_player/login.dm index da27c1102f7..1686416bcce 100644 --- a/code/modules/mob/new_player/login.dm +++ b/code/modules/mob/new_player/login.dm @@ -1,5 +1,22 @@ +/var/obj/effect/lobby_image = new/obj/effect/lobby_image() -/var/atom/movable/lobby_image = new /atom/movable{icon = 'icons/misc/title.dmi'; icon_state = "title"; screen_loc = "1,1"; name = "Baystation12"} +/obj/effect/lobby_image + name = "Baystation12" + desc = "This shouldn't be read" + icon = 'icons/misc/title.dmi' + screen_loc = "WEST,SOUTH" + +/obj/effect/lobby_image/initialize() + var/list/known_icon_states = icon_states(icon) + for(var/lobby_screen in config.lobby_screens) + if(!(lobby_screen in known_icon_states)) + error("Lobby screen '[lobby_screen]' did not exist in the icon set [icon].") + config.lobby_screens -= lobby_screen + + if(config.lobby_screens.len) + icon_state = pick(config.lobby_screens) + else + icon_state = known_icon_states[1] /mob/new_player var/client/my_client // Need to keep track of this ourselves, since by the time Logout() is called the client has already been nulled diff --git a/code/modules/organs/robolimbs.dm b/code/modules/organs/robolimbs.dm index 52e2bd97dd4..e046422b1bf 100644 --- a/code/modules/organs/robolimbs.dm +++ b/code/modules/organs/robolimbs.dm @@ -7,7 +7,6 @@ var/global/datum/robolimb/basic_robolimb for(var/limb_type in typesof(/datum/robolimb)) var/datum/robolimb/R = new limb_type() all_robolimbs[R.company] = R - world << "Adding [R.company] as [R], [R.type]" if(!R.unavailable_at_chargen) chargen_robolimbs[R.company] = R diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm index fd4b684f5be..6eaf220e059 100644 --- a/code/modules/projectiles/guns/projectile/pistol.dm +++ b/code/modules/projectiles/guns/projectile/pistol.dm @@ -9,7 +9,7 @@ load_method = MAGAZINE /obj/item/weapon/gun/projectile/colt/detective - magazine_type = /obj/item/ammo_magazine/c45m/rubber + magazine_type = /obj/item/ammo_magazine/c45m/flash /obj/item/weapon/gun/projectile/colt/detective/verb/rename_gun() set name = "Name Gun" @@ -33,7 +33,7 @@ name = ".45 pistol" desc = "The NT Mk58 is a cheap, ubiquitous sidearm, produced by a NanoTrasen subsidiary. Found pretty much everywhere humans are. Uses .45 rounds." icon_state = "secguncomp" - magazine_type = /obj/item/ammo_magazine/c45m/rubber + magazine_type = /obj/item/ammo_magazine/c45m/flash caliber = ".45" origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2) fire_sound = 'sound/weapons/Gunshot_light.ogg' @@ -41,7 +41,6 @@ /obj/item/weapon/gun/projectile/sec/flash name = ".45 signal pistol" - magazine_type = /obj/item/ammo_magazine/c45m/flash /obj/item/weapon/gun/projectile/sec/wood desc = "The NT Mk58 is a cheap, ubiquitous sidearm, produced by a NanoTrasen subsidiary. This one has a sweet wooden grip. Uses .45 rounds." diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 0bfc339ce0b..6705f667c1f 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -86,17 +86,17 @@ var/total_pellets = get_pellets(distance) var/spread = max(base_spread - (spread_step*distance), 0) - + //shrapnel explosions miss prone mobs with a chance that increases with distance var/prone_chance = 0 if(!base_spread) prone_chance = max(spread_step*(distance - 2), 0) - + var/hits = 0 for (var/i in 1 to total_pellets) if(target_mob.lying && target_mob != original && prob(prone_chance)) continue - + //pellet hits spread out across different zones, but 'aim at' the targeted zone with higher probability //whether the pellet actually hits the def_zone or a different zone should still be determined by the parent using get_zone_with_miss_chance(). var/old_zone = def_zone @@ -115,7 +115,7 @@ /obj/item/projectile/bullet/pellet/Move() . = ..() - + //If this is a shrapnel explosion, allow mobs that are prone to get hit, too if(. && !base_spread && isturf(loc)) for(var/mob/living/M in loc) @@ -137,8 +137,8 @@ /obj/item/projectile/bullet/pistol/rubber //"rubber" bullets name = "rubber bullet" check_armour = "melee" - damage = 10 - agony = 40 + damage = 5 + agony = 25 embed = 0 sharp = 0 @@ -236,4 +236,4 @@ /obj/item/projectile/bullet/pistol/cap/process() loc = null - qdel(src) + qdel(src) diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index b7a22b560f8..26cdf112810 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -11,6 +11,7 @@ name = "chemical shell" icon_state = "bullet" damage = 5 + agony = 10 kill_count = 15 //if the shell hasn't hit anything after travelling this far it just explodes. var/flash_range = 0 var/brightness = 7 diff --git a/code/modules/random_map/drop/drop_types.dm b/code/modules/random_map/drop/drop_types.dm index df35b7e22d2..94510529c9f 100644 --- a/code/modules/random_map/drop/drop_types.dm +++ b/code/modules/random_map/drop/drop_types.dm @@ -115,10 +115,10 @@ var/global/list/datum/supply_drop_loot/supply_drop /obj/item/clothing/suit/armor/riot, /obj/item/clothing/head/helmet/riot, /obj/item/clothing/suit/armor/riot, + /obj/item/clothing/suit/armor/vest, + /obj/item/clothing/suit/armor/vest, /obj/item/clothing/suit/storage/vest, /obj/item/clothing/suit/storage/vest, - /obj/item/clothing/suit/storage/vest/heavy, - /obj/item/clothing/suit/storage/vest/heavy, /obj/item/clothing/suit/armor/laserproof, /obj/item/clothing/suit/armor/bulletproof) diff --git a/code/modules/random_map/drop/droppod_doors.dm b/code/modules/random_map/drop/droppod_doors.dm index a5e3377f99a..eb5b7c3e17f 100644 --- a/code/modules/random_map/drop/droppod_doors.dm +++ b/code/modules/random_map/drop/droppod_doors.dm @@ -39,7 +39,7 @@ playsound(src.loc, 'sound/effects/bang.ogg', 50, 1, 5) // This is shit but it will do for the sake of testing. - for(var/obj/structure/droppod_door/D in range(5,src)) + for(var/obj/structure/droppod_door/D in orange(1,src)) if(D.deployed) continue D.deploy() diff --git a/code/modules/research/mechfab_designs.dm b/code/modules/research/mechfab_designs.dm index e83774468c5..9d9e10d8f5b 100644 --- a/code/modules/research/mechfab_designs.dm +++ b/code/modules/research/mechfab_designs.dm @@ -561,14 +561,14 @@ id = "mech_ccw_armor" req_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 4) materials = list(DEFAULT_WALL_MATERIAL = 20000, "silver" = 5000) - build_path = /obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster + build_path = /obj/item/mecha_parts/mecha_equipment/armor_booster/anticcw_armor_booster /datum/design/item/mecha/proj_armor desc = "Exosuit projectile armor booster." id = "mech_proj_armor" req_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 5, TECH_ENGINEERING = 3) materials = list(DEFAULT_WALL_MATERIAL = 20000, "gold" = 5000) - build_path = /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster + build_path = /obj/item/mecha_parts/mecha_equipment/armor_booster/antiproj_armor_booster /datum/design/item/mecha/diamond_drill name = "Diamond drill" diff --git a/config/example/config.txt b/config/example/config.txt index 96015272210..01e684a4a67 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -385,3 +385,7 @@ STARLIGHT 0 ## Default language prefix keys, separated with spaces. Only single character keys are supported. If unset, defaults to , # and - # DEFAULT_LANGUAGE_PREFIXES , # - + +## A ; separated list of lobby screens to randomly pick from. The listed screens must exist as icon states in '/icons/misc/title.dmi'. +## Defaults to 'title' if left unset. +# LOBBY_SCREENS title diff --git a/html/changelogs/PsiOmegaDelta-HoloMovement.yml b/html/changelogs/PsiOmegaDelta-HoloMovement.yml new file mode 100644 index 00000000000..69d18448c0b --- /dev/null +++ b/html/changelogs/PsiOmegaDelta-HoloMovement.yml @@ -0,0 +1,4 @@ +author: Neerti +delete-after: True +changes: + - rscadd: "The AI can now toggle whether its hologram will move towards the center of its view using the 'Toggle Hologram Movement' verb." diff --git a/html/changelogs/Raptor1628-Dev.yml b/html/changelogs/Raptor1628-Dev.yml new file mode 100644 index 00000000000..fafd8519f73 --- /dev/null +++ b/html/changelogs/Raptor1628-Dev.yml @@ -0,0 +1,5 @@ +author: Raptor1628 +delete-after: True +changes: + - tweak: "Armory layout changed, weapons returned to static amounts." + - rscadd: "New security armor and helmet sprites added." diff --git a/html/changelogs/Zuhayr-accessorizing.yml b/html/changelogs/Zuhayr-accessorizing.yml new file mode 100644 index 00000000000..88048209879 --- /dev/null +++ b/html/changelogs/Zuhayr-accessorizing.yml @@ -0,0 +1,5 @@ +author: Zuhayr +delete-after: True +changes: + - tweak: "Backend change: allowed accessories to be placed on any clothing item with the appropriate variables set." + diff --git a/html/changelogs/Zuhayr-fireaxes.yml b/html/changelogs/Zuhayr-fireaxes.yml new file mode 100644 index 00000000000..3bb84e570e0 --- /dev/null +++ b/html/changelogs/Zuhayr-fireaxes.yml @@ -0,0 +1,4 @@ +author: Zuhayr +delete-after: True +changes: + - tweak: "Rewrote fireaxe cabinets. Click with a multitool to unlock or loc, click with a hand to open or close, smash with anything that does damage, and drag onto your icon to remove the fireaxe." diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi index 2d06f4e9888..ca4de96eba0 100644 Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index 3eec523b480..951be8509a8 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index 907bc80c5ea..e708a972c21 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/mob/ties.dmi b/icons/mob/ties.dmi index a4d3c386126..6cf5ce80a7d 100644 Binary files a/icons/mob/ties.dmi and b/icons/mob/ties.dmi differ diff --git a/icons/obj/closet.dmi b/icons/obj/closet.dmi index e42f9d97ab9..68fc22f81d1 100644 Binary files a/icons/obj/closet.dmi and b/icons/obj/closet.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index a4093d4ec79..7c61f30d4e9 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index cf854494697..04fe8a3b823 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/clothing/ties.dmi b/icons/obj/clothing/ties.dmi index 7ea52eaf5d8..1eeb8896961 100644 Binary files a/icons/obj/clothing/ties.dmi and b/icons/obj/clothing/ties.dmi differ diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi index 214428603e3..3f4d1406dac 100644 Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ diff --git a/maps/exodus-1.dmm b/maps/exodus-1.dmm index ff8893e80bd..ab9fbd2062c 100644 --- a/maps/exodus-1.dmm +++ b/maps/exodus-1.dmm @@ -52,11 +52,11 @@ "aaZ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/security/range) "aba" = (/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/maintenance/foresolar) "abb" = (/turf/simulated/wall,/area/maintenance/security_starboard) -"abc" = (/obj/structure/closet/wardrobe/tactical,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/tactical) +"abc" = (/obj/structure/lattice,/turf/space{icon_state = "black"},/area/space) "abd" = (/turf/simulated/wall/r_wall,/area/maintenance/foresolar) "abe" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/security_port) "abf" = (/turf/simulated/wall,/area/maintenance/security_port) -"abg" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/table/rack,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/weapon/storage/box/shotgunammo,/obj/item/weapon/storage/box/shotgunammo,/obj/item/weapon/storage/box/shotgunshells,/obj/item/weapon/storage/box/shotgunshells,/obj/machinery/camera/network/security{c_tag = "Armoury - Tactical Equipment"},/obj/machinery/door/window/brigdoor/southleft{name = "Weapons locker"; req_access = list(3)},/turf/simulated/floor/tiled/dark,/area/security/tactical) +"abg" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/window/brigdoor/southleft{name = "Weapons locker"; req_access = list(3)},/obj/effect/floor_decal/industrial/outline/grey,/obj/structure/window/reinforced{dir = 8},/obj/item/clothing/suit/storage/vest/officer,/obj/item/clothing/suit/storage/vest/officer,/obj/item/clothing/suit/storage/vest/officer,/obj/item/clothing/suit/storage/vest/officer,/turf/simulated/floor/tiled/dark,/area/security/tactical) "abh" = (/turf/simulated/wall/r_wall,/area/security/tactical) "abi" = (/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/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/security/range) "abj" = (/obj/structure/table/reinforced,/obj/item/weapon/gun/energy/laser/practice,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/security/range) @@ -71,13 +71,13 @@ "abs" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/foresolar) "abt" = (/obj/structure/closet/emcloset,/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/plating,/area/maintenance/security_port) "abu" = (/obj/machinery/power/terminal{dir = 4},/obj/machinery/light/small{dir = 1},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/maintenance/foresolar) -"abv" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled/dark,/area/security/tactical) +"abv" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/window/brigdoor/southleft{name = "Ammunition locker"; req_access = list(3)},/obj/effect/floor_decal/industrial/outline/grey,/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/storage/box/beanbags,/obj/item/weapon/storage/box/beanbags,/turf/simulated/floor/tiled/dark,/area/security/tactical) "abw" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/foresolar) -"abx" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/tiled/dark,/area/security/tactical) -"aby" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled/dark,/area/security/tactical) +"abx" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/window/brigdoor/southleft{name = "Weapons locker"; req_access = list(3)},/obj/effect/floor_decal/industrial/outline/grey,/obj/machinery/camera/network/security{c_tag = "Armoury - Tactical Equipment"},/obj/item/weapon/gun/projectile/shotgun/pump,/obj/item/weapon/gun/projectile/shotgun/pump,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/dark,/area/security/tactical) +"aby" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled/dark,/area/security/tactical) "abz" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "brig_solar_inner"; locked = 1; name = "Engineering External Access"; req_access = list(11,13)},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/foresolar) "abA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled/dark,/area/security/tactical) -"abB" = (/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/tiled/dark,/area/security/tactical) +"abB" = (/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled/dark,/area/security/tactical) "abC" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/turf/simulated/floor/tiled,/area/security/range) "abD" = (/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,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/security/range) "abE" = (/obj/machinery/camera/network/security{c_tag = "Security - Medical Station"; dir = 1},/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/turf/simulated/floor/tiled,/area/security/range) @@ -108,7 +108,7 @@ "acd" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/main) "ace" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/airless,/area/solar/fore) "acf" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; layer = 3.3; master_tag = "brig_solar_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = 25; req_access = list(11,13)},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/airless,/area/solar/fore) -"acg" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/tactical) +"acg" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/highsecurity{name = "Tactical Equipment"; req_access = list(3)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/dark,/area/security/tactical) "ach" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/security/main) "aci" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "brig_solar_pump"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "brig_solar_airlock"; layer = 3.3; pixel_x = 0; pixel_y = -25; req_access = list(13); tag_airpump = "brig_solar_pump"; tag_chamber_sensor = "brig_solar_sensor"; tag_exterior_door = "brig_solar_outer"; tag_interior_door = "brig_solar_inner"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "brig_solar_sensor"; layer = 3.3; pixel_x = 12; pixel_y = -25},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/industrial/warning/full,/turf/simulated/floor/plating,/area/maintenance/foresolar) "acj" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/maintenance/security_port) @@ -123,20 +123,20 @@ "acs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/security_starboard) "act" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/security_starboard) "acu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/camera/network/engineering{c_tag = "Solar Maintenance Fore Access"; dir = 8},/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/security_port) -"acv" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/highsecurity{name = "Tactical Equipment"; req_access = list(3)},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/dark,/area/security/tactical) +"acv" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/window/brigdoor/southleft{name = "Weapons locker"; req_access = list(3)},/obj/effect/floor_decal/industrial/outline/grey,/obj/item/weapon/gun/energy/laser,/obj/item/weapon/gun/energy/laser,/obj/item/weapon/gun/energy/laser,/obj/item/weapon/gun/energy/laser,/turf/simulated/floor/tiled/dark,/area/security/armoury) "acw" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_security{name = "Firing Range"; req_access = list(1)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/security/main) "acx" = (/turf/simulated/floor/plating,/area/maintenance/foresolar) "acy" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/airless,/area/solar/fore) "acz" = (/obj/structure/cable,/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/machinery/camera/network/engineering{c_tag = "Solar Maintenance Fore"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/foresolar) -"acA" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/tactical) +"acA" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/window/brigdoor/southleft{name = "Weapons locker"; req_access = list(3)},/obj/effect/floor_decal/industrial/outline/grey,/obj/item/weapon/gun/energy/gun,/obj/item/weapon/gun/energy/gun,/obj/item/weapon/gun/energy/gun,/obj/item/weapon/gun/energy/gun,/turf/simulated/floor/tiled/dark,/area/security/armoury) "acB" = (/obj/machinery/power/solar_control{id = "auxsolarnorth"; name = "Fore Solar Control"; track = 0},/obj/structure/cable/yellow,/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/turf/simulated/floor/plating,/area/maintenance/foresolar) "acC" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/foresolar) "acD" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/security_starboard) -"acE" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 1},/obj/random/projectile,/obj/random/projectile,/obj/random/projectile,/obj/machinery/door/window/brigdoor/southleft{name = "Weapons locker"; req_access = list(3)},/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/armoury) -"acF" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/random/energy,/obj/random/energy,/obj/random/energy,/obj/machinery/door/window/brigdoor/southleft{name = "Weapons locker"; req_access = list(3)},/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/armoury) +"acE" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/window/brigdoor/southleft{name = "Weapons locker"; req_access = list(3)},/obj/effect/floor_decal/industrial/outline/grey,/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/gun/projectile/sec,/obj/item/weapon/gun/projectile/sec,/obj/item/weapon/gun/projectile/sec,/obj/item/weapon/gun/projectile/sec,/turf/simulated/floor/tiled/dark,/area/security/armoury) +"acF" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 1},/obj/item/weapon/gun/energy/ionrifle,/obj/machinery/door/window/brigdoor/southleft{name = "Weapons locker"; req_access = list(3)},/obj/effect/floor_decal/industrial/outline/grey,/obj/machinery/light{dir = 1},/obj/item/weapon/gun/energy/ionrifle,/turf/simulated/floor/tiled/dark,/area/security/armoury) "acG" = (/obj/machinery/light/small,/turf/simulated/floor/plating,/area/maintenance/security_starboard) -"acH" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/light{dir = 1},/obj/item/ammo_magazine/c45m/flash,/obj/item/ammo_magazine/c45m/flash,/obj/item/ammo_magazine/c45m/flash,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/weapon/storage/box/beanbags,/obj/item/weapon/storage/box/beanbags,/obj/item/weapon/storage/box/flashshells,/obj/item/weapon/storage/box/stunshells,/obj/item/ammo_magazine/c45m/practice,/obj/item/ammo_magazine/c45m/practice,/obj/item/ammo_magazine/c45m/practice,/obj/item/ammo_magazine/c45m/practice,/obj/item/ammo_magazine/mc9mmt/practice,/obj/item/ammo_magazine/mc9mmt/practice,/obj/item/weapon/storage/box/practiceshells,/obj/item/weapon/storage/box/practiceshells,/obj/machinery/door/window/brigdoor/southleft{name = "Weapons locker"; req_access = list(3)},/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/armoury) -"acI" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 1},/obj/item/weapon/gun/energy/ionrifle,/obj/machinery/door/window/brigdoor/southleft{name = "Weapons locker"; req_access = list(3)},/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/armoury) +"acH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/dark,/area/security/armoury) +"acI" = (/obj/structure/table/rack,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/industrial/outline/grey,/obj/item/weapon/storage/box/teargas{pixel_x = 3; pixel_y = 2},/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/storage/box/flashbangs{pixel_x = -2; pixel_y = -2},/turf/simulated/floor/tiled/dark,/area/security/armoury) "acJ" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/dark,/area/security/armoury) "acK" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/dark,/area/security/armoury) "acL" = (/obj/structure/table/standard,/obj/machinery/recharger,/turf/simulated/floor/tiled,/area/security/main) @@ -178,11 +178,11 @@ "adv" = (/obj/structure/closet/emcloset,/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/plating,/area/maintenance/security_starboard) "adw" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table/rack,/obj/item/clothing/suit/armor/riot,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/shield/riot,/obj/item/clothing/head/helmet/riot,/obj/machinery/light{dir = 8},/obj/machinery/camera/network/security{c_tag = "Armoury - Secure"; dir = 4},/obj/machinery/door/window/brigdoor/eastleft{name = "Weapons locker"; req_access = list(3)},/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/armoury) "adx" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/security/main) -"ady" = (/obj/structure/table/standard,/obj/machinery/recharger,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/dark,/area/security/armoury) +"ady" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/industrial/outline/grey,/obj/structure/table/standard,/obj/machinery/recharger,/turf/simulated/floor/tiled/dark,/area/security/armoury) "adz" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled/dark,/area/security/armoury) -"adA" = (/obj/structure/table/rack,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/weapon/storage/box/emps{pixel_x = 3; pixel_y = 2},/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/storage/box/flashbangs{pixel_x = -2; pixel_y = -2},/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/armoury) +"adA" = (/obj/machinery/flasher/portable,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/armoury) "adB" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/security_starboard) -"adC" = (/obj/structure/table/rack,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/reagent_containers/spray/pepper,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/armoury) +"adC" = (/obj/machinery/flasher/portable,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/effect/floor_decal/industrial/outline/grey,/obj/machinery/light,/turf/simulated/floor/tiled/dark,/area/security/armoury) "adD" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/security_port) "adE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/security_port) "adF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/dark,/area/security/armoury) @@ -197,7 +197,7 @@ "adO" = (/obj/machinery/door/airlock/external{icon_state = "door_locked"; locked = 1; name = "External Construction Airlock"; req_access = list(32)},/obj/item/tape/engineering{icon_state = "engineering_door"; layer = 4},/turf/simulated/floor/plating,/area/maintenance/security_starboard) "adP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/tiled,/area/security/main) "adQ" = (/obj/structure/grille/broken,/obj/item/weapon/material/shard,/turf/simulated/floor/plating,/area/maintenance/security_port) -"adR" = (/obj/structure/closet/crate/secure{name = "FOR DISPOSAL"; req_access = list(58)},/obj/item/clothing/glasses/sunglasses/blindfold,/obj/item/clothing/mask/balaclava,/obj/item/clothing/mask/muzzle,/obj/item/weapon/reagent_containers/syringe/ld50_syringe/choral,/turf/simulated/floor/plating,/area/maintenance/security_port) +"adR" = (/obj/structure/closet/crate/secure{name = "FOR DISPOSAL"; req_access = list(58)},/obj/item/clothing/glasses/sunglasses/blindfold,/obj/item/clothing/mask/balaclava,/obj/item/clothing/mask/muzzle,/obj/item/weapon/reagent_containers/syringe/ld50_syringe/choral,/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/security_port) "adS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/corner/red,/turf/simulated/floor/tiled,/area/security/main) "adT" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/security_port) "adU" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/security/main) @@ -214,8 +214,8 @@ "aef" = (/obj/structure/table/rack,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/item/clothing/suit/armor/laserproof{pixel_x = 2; pixel_y = 2},/obj/item/clothing/suit/armor/laserproof{pixel_x = -2; pixel_y = -2},/obj/machinery/door/window/brigdoor/northleft{name = "Weapons locker"; req_access = list(3)},/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/armoury) "aeg" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/security_port) "aeh" = (/obj/structure/table/rack,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/item/clothing/suit/armor/bulletproof{pixel_x = 2; pixel_y = 2},/obj/item/clothing/suit/armor/bulletproof{pixel_x = -2; pixel_y = -2},/obj/machinery/door/window/brigdoor/northleft{name = "Weapons locker"; req_access = list(3)},/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/armoury) -"aei" = (/obj/machinery/light,/obj/machinery/flasher/portable,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/armoury) -"aej" = (/obj/machinery/flasher/portable,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/armoury) +"aei" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/closet/bombclosetsecurity,/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled,/area/security/warden) +"aej" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/window/reinforced{dir = 1},/obj/machinery/camera/network/security{c_tag = "Security - Equipment North"; dir = 4},/turf/simulated/floor/tiled,/area/security/main) "aek" = (/obj/machinery/light,/obj/machinery/flasher/portable,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/armoury) "ael" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled/dark,/area/security/armoury) "aem" = (/obj/machinery/button/remote/blast_door{id = "Armoury"; name = "Emergency Access"; pixel_x = -28; pixel_y = 4; req_access = list(3)},/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/turf/simulated/floor/tiled,/area/security/main) @@ -247,7 +247,7 @@ "aeM" = (/obj/machinery/deployable/barrier,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/security/warden) "aeN" = (/obj/structure/closet/l3closet/security,/obj/structure/sign/securearea{name = "\improper ARMORY"; pixel_y = 32},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/security/warden) "aeO" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/security/warden) -"aeP" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/closet/bombclosetsecurity,/obj/machinery/firealarm{pixel_y = 27},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/security/warden) +"aeP" = (/obj/structure/table/rack{pixel_y = 6},/obj/machinery/door/window/brigdoor/eastleft{name = "Sub-Armory Storage"; req_access = list(2)},/obj/machinery/door/window/brigdoor/westleft{name = "Sub-Armory Storage"; req_access = list(3)},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/machinery/door/blast/shutters{dir = 2; id = "subarmory"; name = "Sub-Armory Storage"},/turf/simulated/floor/tiled/red,/area/security/warden) "aeQ" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/security_starboard) "aeR" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/simulated/floor/plating,/area/maintenance/security_starboard) "aeS" = (/turf/simulated/wall/r_wall,/area/maintenance/security_starboard) @@ -256,7 +256,7 @@ "aeV" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/security_port) "aeW" = (/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/security_port) "aeX" = (/obj/structure/closet/secure_closet/security,/obj/item/device/flashlight/flare,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/tiled,/area/security/main) -"aeY" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/tiled,/area/security/main) +"aeY" = (/obj/machinery/button/remote/blast_door{id = "subarmory"; name = "Sub-Armory Storage control"; pixel_x = 24; pixel_y = 24; req_access = list(3)},/turf/simulated/floor/tiled,/area/security/warden) "aeZ" = (/obj/structure/disposalpipe/segment,/obj/structure/closet/secure_closet/security,/obj/item/device/flashlight/flare,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/tiled,/area/security/main) "afa" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/effect/floor_decal/corner/red{dir = 8},/turf/simulated/floor/tiled,/area/security/main) "afb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/security/main) @@ -267,15 +267,15 @@ "afg" = (/obj/machinery/deployable/barrier,/obj/effect/floor_decal/industrial/hatch/yellow,/obj/item/device/radio/intercom{dir = 8; pixel_x = -22},/turf/simulated/floor/tiled,/area/security/warden) "afh" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/security/warden) "afi" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/tiled,/area/security/warden) -"afj" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/tiled,/area/security/warden) +"afj" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/security/main) "afk" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/security_starboard) "afl" = (/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/simulated/floor/plating,/area/maintenance/security_starboard) "afm" = (/obj/structure/grille/broken,/obj/structure/lattice,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/turf/space,/area/space) "afn" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/corner/red{dir = 10},/turf/simulated/floor/tiled,/area/security/main) -"afo" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/camera/network/security{c_tag = "Security - Equipment North"; dir = 4},/obj/item/device/radio/intercom{dir = 8; pixel_x = -22},/turf/simulated/floor/tiled,/area/security/main) +"afo" = (/obj/structure/table/rack,/obj/item/weapon/secbot_assembly,/turf/simulated/floor/plating,/area/maintenance/security_port) "afp" = (/obj/effect/floor_decal/corner/red{dir = 10},/turf/simulated/floor/tiled,/area/security/main) "afq" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plating,/area/maintenance/security_port) -"afr" = (/obj/structure/table/rack,/obj/item/weapon/secbot_assembly,/obj/effect/decal/cleanable/dirt,/obj/item/weapon/reagent_containers/spray/sterilizine,/turf/simulated/floor/plating,/area/maintenance/security_port) +"afr" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/security{name = "Sub-Armory"; req_access = list(3)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/dark,/area/security/warden) "afs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/turf/simulated/floor/plating,/area/maintenance/security_starboard) "aft" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 1; name = "Security"; sortType = "Security"},/obj/effect/floor_decal/corner/red{dir = 10},/turf/simulated/floor/tiled,/area/security/main) "afu" = (/obj/structure/table/standard,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/item/weapon/storage/box/donut,/obj/effect/floor_decal/corner/red,/turf/simulated/floor/tiled,/area/security/main) @@ -292,7 +292,7 @@ "afF" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/tiled,/area/security/warden) "afG" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/security/warden) "afH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{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"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled,/area/security/warden) -"afI" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/security{name = "Armoury"; req_access = list(2)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/dark,/area/security/warden) +"afI" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/seccarts{pixel_x = 3; pixel_y = 2},/obj/item/weapon/storage/box/handcuffs{pixel_x = -2; pixel_y = -2},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/security/warden) "afJ" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/meter,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/security_starboard) "afK" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled/red,/area/security/main) "afL" = (/obj/machinery/light/small{dir = 1},/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/security_starboard) @@ -328,13 +328,13 @@ "agp" = (/turf/simulated/wall,/area/crew_quarters/heads/hos) "agq" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_3_berth_hatch"; locked = 1; name = "Escape Pod"; req_access = list(13)},/turf/simulated/floor/plating,/area/maintenance/security_starboard) "agr" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_3_hatch"; locked = 1; name = "Escape Pod Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod3/station) -"ags" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/seccarts{pixel_x = 3; pixel_y = 2},/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/storage/box/flashbangs{pixel_x = -2; pixel_y = -2},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/security/warden) -"agt" = (/obj/structure/table/rack,/obj/item/clothing/mask/gas{pixel_x = 3; pixel_y = 3},/obj/item/clothing/mask/gas{pixel_x = 3; pixel_y = 3},/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/security/warden) +"ags" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/table/rack,/obj/item/weapon/storage/box/teargas{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/box/flashbangs{pixel_x = -2; pixel_y = -2},/turf/simulated/floor/tiled,/area/security/warden) +"agt" = (/obj/structure/table/rack,/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/reagent_containers/spray/pepper,/turf/simulated/floor/tiled,/area/security/warden) "agu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/maintenance/security_port) "agv" = (/turf/simulated/wall/r_wall,/area/crew_quarters/heads/hos) "agw" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/security_starboard) -"agx" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/item/clothing/suit/storage/vest/heavy/officer,/obj/item/clothing/suit/storage/vest/heavy/officer,/obj/item/clothing/suit/storage/vest/heavy/officer,/obj/machinery/door/window/brigdoor/northleft{name = "Weapons locker"; req_access = list(2)},/turf/simulated/floor/tiled,/area/security/warden) -"agy" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/table/rack,/obj/random/handgun,/obj/random/handgun,/obj/random/handgun,/obj/random/handgun,/obj/machinery/door/window/brigdoor/northleft{name = "Weapons locker"; req_access = list(2)},/turf/simulated/floor/tiled,/area/security/warden) +"agx" = (/obj/structure/table/rack,/obj/item/clothing/mask/gas{pixel_x = 3; pixel_y = 3},/obj/item/clothing/mask/gas{pixel_x = 3; pixel_y = 3},/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/device/radio/intercom/department/security{dir = 4; pixel_x = 22},/turf/simulated/floor/tiled,/area/security/warden) +"agy" = (/obj/structure/table/standard,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/camera/network/security{c_tag = "Security - Equipment South"; dir = 4},/obj/effect/floor_decal/corner/red{dir = 8},/obj/item/device/radio/intercom{dir = 8; pixel_x = -22},/turf/simulated/floor/tiled,/area/security/main) "agz" = (/obj/effect/floor_decal/corner/red{dir = 5},/turf/simulated/floor/tiled,/area/security/main) "agA" = (/obj/structure/disposalpipe/segment,/obj/item/trash/raisins,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/security_starboard) "agB" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/security_port) @@ -483,7 +483,7 @@ "ajo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/corner/red{dir = 8},/turf/simulated/floor/tiled,/area/security/main) "ajp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/brig) "ajq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/brig) -"ajr" = (/obj/structure/table/standard,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/camera/network/security{c_tag = "Security - Equipment South"; dir = 4},/obj/effect/floor_decal/corner/red{dir = 8},/turf/simulated/floor/tiled,/area/security/main) +"ajr" = (/obj/structure/disposalpipe/segment,/obj/structure/closet{name = "Evidence Closet"},/obj/item/weapon/handcuffs,/turf/simulated/floor/lino,/area/security/detectives_office) "ajs" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/brig) "ajt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/effect/floor_decal/corner/red,/turf/simulated/floor/tiled,/area/security/main) "aju" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/brig) @@ -546,7 +546,7 @@ "akz" = (/obj/machinery/light{dir = 1},/obj/machinery/firealarm{pixel_y = 24},/obj/effect/floor_decal/corner/red{dir = 5},/turf/simulated/floor/tiled,/area/security/brig) "akA" = (/obj/structure/table/rack,/obj/item/weapon/storage/briefcase{pixel_x = -2; pixel_y = -5},/obj/item/weapon/storage/briefcase{pixel_x = 3; pixel_y = 0},/turf/simulated/floor/lino,/area/security/detectives_office) "akB" = (/obj/structure/noticeboard{pixel_y = 30},/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/papershredder,/turf/simulated/floor/lino,/area/security/detectives_office) -"akC" = (/obj/structure/disposalpipe/segment,/obj/structure/closet{name = "Evidence Closet"},/turf/simulated/floor/lino,/area/security/detectives_office) +"akC" = (/obj/structure/table/woodentable,/obj/machinery/button/remote/airlock{id = "detdoor"; name = "Office Door"},/obj/item/device/flash,/turf/simulated/floor/carpet,/area/security/detectives_office) "akD" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/obj/item/clothing/glasses/sunglasses,/turf/simulated/floor/lino,/area/security/detectives_office) "akE" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/camera/network/security{c_tag = "Security - Forensic Office Fore"; dir = 2},/turf/simulated/floor/lino,/area/security/detectives_office) "akF" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/flora/pottedplant{tag = "icon-plant-21"; icon_state = "plant-21"},/turf/simulated/floor/lino,/area/security/detectives_office) @@ -593,7 +593,7 @@ "alu" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/security/brig) "alv" = (/obj/machinery/light{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = -24},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/red{dir = 9},/turf/simulated/floor/tiled,/area/security/brig) "alw" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/security/brig) -"alx" = (/obj/structure/table/woodentable,/obj/machinery/button/remote/airlock{id = "detdoor"; name = "Office Door"},/obj/item/weapon/handcuffs,/obj/item/device/flash,/turf/simulated/floor/carpet,/area/security/detectives_office) +"alx" = (/obj/structure/table/woodentable,/obj/item/weapon/material/ashtray/bronze,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/obj/item/device/taperecorder{pixel_x = -4; pixel_y = 2},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/weapon/reagent_containers/spray/pepper,/turf/simulated/floor/carpet,/area/security/detectives_office) "aly" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/security/brig) "alz" = (/obj/structure/closet/secure_closet/brig,/turf/simulated/floor/tiled,/area/security/brig) "alA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/security/brig) @@ -641,7 +641,7 @@ "amq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/security/detectives_office) "amr" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/red{dir = 1},/turf/simulated/floor/tiled,/area/security/lobby) "ams" = (/obj/structure/disposalpipe/segment,/obj/item/weapon/stool/padded,/turf/simulated/floor/carpet,/area/security/detectives_office) -"amt" = (/obj/structure/table/woodentable,/obj/item/weapon/material/ashtray/bronze,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/obj/item/device/taperecorder{pixel_x = -4; pixel_y = 2},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/carpet,/area/security/detectives_office) +"amt" = (/obj/structure/table/woodentable,/obj/item/weapon/material/ashtray/bronze,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/obj/item/device/flash,/turf/simulated/floor/carpet,/area/security/detectives_office) "amu" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/security/brig) "amv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/corner/red{dir = 4},/obj/item/device/radio/intercom{dir = 4; pixel_x = 22},/turf/simulated/floor/tiled,/area/security/lobby) "amw" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/substation/security) @@ -662,8 +662,7 @@ "amL" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless,/area/solar/auxport) "amM" = (/obj/machinery/atmospherics/valve{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor,/area/security/brig) "amN" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/camera/network/security{c_tag = "Security - Brig Toxin Control"; dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 10},/turf/simulated/floor,/area/security/brig) -"amO" = (/obj/structure/table/woodentable,/obj/item/weapon/material/ashtray/bronze,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/obj/item/device/flash,/obj/item/weapon/handcuffs,/turf/simulated/floor/carpet,/area/security/detectives_office) -"amP" = (/obj/structure/disposalpipe/segment,/obj/structure/table/woodentable,/obj/machinery/button/remote/airlock{id = "detdoor"; name = "Office Door"},/obj/item/clothing/glasses/sunglasses,/turf/simulated/floor/carpet,/area/security/detectives_office) +"amO" = (/obj/structure/disposalpipe/segment,/obj/structure/table/woodentable,/obj/machinery/button/remote/airlock{id = "detdoor"; name = "Office Door"},/obj/item/clothing/glasses/sunglasses,/obj/item/weapon/reagent_containers/spray/pepper,/turf/simulated/floor/carpet,/area/security/detectives_office) "amQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/security/prison) "amR" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/security/prison) "amS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/floor_decal/corner/red{dir = 9},/turf/simulated/floor/tiled,/area/security/brig) @@ -2647,7 +2646,7 @@ "aYU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/bridge) "aYV" = (/obj/machinery/light,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/newscaster{pixel_y = -28},/obj/effect/floor_decal/corner/blue{dir = 10},/turf/simulated/floor/tiled,/area/bridge) "aYW" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/corner/blue{dir = 10},/turf/simulated/floor/tiled,/area/bridge) -"aYX" = (/obj/structure/closet/fireaxecabinet{pixel_y = -32},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/camera/network/command{c_tag = "Bridge Center"; dir = 1},/obj/effect/floor_decal/corner/blue{dir = 10},/turf/simulated/floor/tiled,/area/bridge) +"aYX" = (/obj/structure/fireaxecabinet{pixel_y = -32},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/camera/network/command{c_tag = "Bridge Center"; dir = 1},/obj/effect/floor_decal/corner/blue{dir = 10},/turf/simulated/floor/tiled,/area/bridge) "aYY" = (/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"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/corner/blue{dir = 10},/turf/simulated/floor/tiled,/area/bridge) "aYZ" = (/obj/machinery/light,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/effect/floor_decal/corner/blue{dir = 10},/turf/simulated/floor/tiled,/area/bridge) "aZa" = (/obj/machinery/button/remote/blast_door{id = "bridge blast"; name = "Bridge Blast Door Control"; pixel_x = 6; pixel_y = -24; req_access = list(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"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light_switch{pixel_x = -5; pixel_y = -23},/obj/effect/floor_decal/corner/blue{dir = 10},/turf/simulated/floor/tiled,/area/bridge) @@ -4704,7 +4703,7 @@ "bMx" = (/obj/effect/landmark/start{name = "Paramedic"},/obj/item/weapon/stool/padded,/obj/item/device/radio/intercom{dir = 2; pixel_y = -22},/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bMy" = (/obj/structure/closet/secure_closet/medical1,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/device/flashlight,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/random/medical,/obj/item/device/radio/intercom/department/medbay{pixel_y = -22},/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bMz" = (/obj/machinery/button/remote/blast_door{id = "acutesep"; name = "Acute Separation Shutters"; pixel_y = -25; req_access = list(5)},/obj/effect/landmark/start{name = "Paramedic"},/obj/machinery/camera/network/medbay{c_tag = "Medbay EMT Storage"; dir = 1},/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled/white,/area/medical/sleeper) -"bMA" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/structure/closet/fireaxecabinet{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/medical/sleeper) +"bMA" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/structure/fireaxecabinet{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bMB" = (/obj/item/device/radio/intercom{dir = 4; pixel_x = 22},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/paleblue{dir = 6},/turf/simulated/floor/tiled/white,/area/medical/medbay) "bMC" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/photocopier/faxmachine{department = "CMO's Office"},/obj/structure/table/glass,/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) "bMD" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) @@ -5696,6 +5695,7 @@ "cfB" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/binary/pump{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room) "cfC" = (/obj/machinery/airlock_sensor/airlock_interior{id_tag = "eng_al_int_snsr"; master_tag = "engine_room_airlock"; pixel_y = 22; req_access = list(10)},/obj/machinery/light{dir = 1},/turf/simulated/floor/plating,/area/engineering/engine_room) "cfD" = (/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/construction) +"cfE" = (/obj/item/clothing/head/welding{pixel_x = -5; pixel_y = 3},/obj/item/clothing/glasses/welding,/obj/structure/fireaxecabinet{pixel_y = 32},/obj/machinery/light{dir = 1},/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/engineering/atmos) "cfF" = (/obj/structure/sign/pods,/turf/simulated/wall/r_wall,/area/engineering/engine_eva) "cfG" = (/obj/random/tech_supply,/obj/random/tech_supply,/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/construction) "cfH" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/maintenance/atmos_control) @@ -6201,7 +6201,6 @@ "cpK" = (/obj/structure/table/standard,/obj/item/device/t_scanner,/obj/item/device/multitool{pixel_x = 5},/obj/item/device/radio/headset/headset_eng,/obj/item/weapon/cartridge/atmos,/obj/item/weapon/cartridge/atmos,/obj/item/device/pipe_painter,/obj/machinery/requests_console{department = "Atmospherics"; departmentType = 3; name = "Atmos RC"; pixel_x = 0; pixel_y = 28},/turf/simulated/floor/tiled,/area/engineering/atmos) "cpL" = (/obj/structure/dispenser,/turf/simulated/floor/tiled,/area/engineering/atmos) "cpM" = (/obj/item/weapon/wrench,/obj/structure/sign/atmosplaque{pixel_x = 0; pixel_y = 32},/obj/machinery/cell_charger,/obj/machinery/camera/network/engineering{c_tag = "Atmospherics Northeast"},/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/engineering/atmos) -"cpN" = (/obj/item/clothing/head/welding{pixel_x = -5; pixel_y = 3},/obj/item/clothing/glasses/welding,/obj/structure/closet/fireaxecabinet{pixel_y = 32},/obj/machinery/light{dir = 1},/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/engineering/atmos) "cpO" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) "cpP" = (/obj/machinery/newscaster{pixel_y = 30},/obj/item/clothing/gloves/black,/obj/item/clothing/gloves/black,/obj/item/weapon/storage/belt/utility/atmostech,/obj/item/weapon/storage/belt/utility/atmostech,/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/engineering/atmos) "cpQ" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 1; sortType = "Atmospherics"; name = "Atmospherics"},/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor/tiled,/area/engineering/atmos) @@ -7379,31 +7378,31 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqaaaaaaaafaaaaaaaaaaaaaalaakaaoaataafaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaaaaaaaauaaaaaaaaaaauaaaaaaaaaaaaaaaaauaaaaaaaaaaauaaaaaaaauaaaaaaaaaaaaaaaaamaaaaasaaraavaaaaasaaraavaaaaasaaraavaafaafaamaaaaaaaaaaaaaaaaafaafaahaaxaataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaayaayaayaayaayaayaayaayaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaaaaaaaaaaauaauaauaauaauaauaauaaaaaaaaaaauaauaauaauaaaaaaaaaaacaaaaamaaaaasaawaavaaaaasaawaavaaaaasaawaavaafaafaafaafaaaaaaaaaaaaaaaaaaaafaaaaaaaafaaAaaBaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaazaaDaaCaaDaaCaaDaaEaayaayaaGaaHaayaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaaaaaaaauaauaauaauaauaauaauaauaauaaaaaaaauaauaauaauaaaaaaaaaaaaaaaaaIaafaasaawaavaaaaasaawaavaafaasaawaavaafaaaaaaaafaafaaJaaaaaaaaaaaaaafaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaKaapaafaayaaFaaLaaLaaLaaLaaLaaMaaOaaNaaQaaPaayaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaaaaaaaauaauaauaauaauaauaauaauaauaaaaaaaauaauaauaauaaaaaaaaaaaaaaaaafaaaaasaawaavaafaasaawaavaaaaasaawaavaaaaaaaaaaaaaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaabhabhabhabhabhabhabhaafaaaaayaaRaaUaaCaaUaaCaaUaaVaaXaaWaaZaaYaayabbabbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaamaamaaIaafaaaaasaawaavaafaasaawaavaaaaasaawaavaafaaaaaaaacaaaaafaafabaabdabdabdabdabeabfaaaaaaabhabcabcabgabcabcabhaaaaafaayabiabjaaXabjaaXabjaaXaayabkaaZablaayabnaboaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaamaaaaafaaaaafaafabmaafaafaafabmaafaaaaafabmaafaaaaaaaaaaaaaaaabqabpabsabrabuaaiabwabtabfaafaaaabhabxabvabAabyabBabhaaaaaaabDabCabFabEabIabHabFabJabLabKabPabMabGabNabOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaIaafabQabWabUacaacaacaacaacaacaacaacaacaacaacaacaaceabWabWacfabXaciabzabZabYabVacbacjacpacpacpabhabhacgacvacAabhabhacdaccachackaclacmacnacmacoackackackacwacqacracsactaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaaaaafaapaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaamaaaaafaaaaafaafacyaafaaaaafacyaafaaaaafacyaafaaaaaaaaaaaaaaaabqabpacCacBacxaczabdacuacpacpacFacEacIacHacKacJacpacpacNacLacPacOacRacQacMacSacVacUacXacWacZacYacracsabbabbabbabbabbabbaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaafaafaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaaaaaaaauaauaauaauaauaauaauaauaauaaaaaaaauaauaauaauaaaaaaaaaaaaaaaaaIaafaasaawaavaaaaasaawaavaafaasaawaavaafaaaaaaaafaafaaJaaaaaaaaaaaaaafaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaapaafaayaaFaaLaaLaaLaaLaaLaaMaaOaaNaaQaaPaayaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaaaaaaaauaauaauaauaauaauaauaauaauaaaaaaaauaauaauaauaaaaaaaaaaaaaaaaafaaaaasaawaavaafaasaawaavaaaaasaawaavaaaaaaaaaaaaaafaafaaaaaaaaaaaaaafaafaafaafaaaaafabcabhabhabhabhabhaafaafaaaaayaaRaaUaaCaaUaaCaaUaaVaaXaaWaaZaaYaayabbabbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaamaamaaIaafaaaaasaawaavaafaasaawaavaaaaasaawaavaafaaaaaaaacaaaaafaafabaabdabdabdabdabeabfaaaaaaaaaabhabgabxabvabhaafaaaaafaayabiabjaaXabjaaXabjaaXaayabkaaZablaayabnaboaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaamaaaaafaaaaafaafabmaafaafaafabmaafaaaaafabmaafaaaaaaaaaaaaaaaabqabpabsabrabuaaiabwabtabfaafaaaaaaabhabyabAabBabhaaKaaaaaaabDabCabFabEabIabHabFabJabLabKabPabMabGabNabOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaIaafabQabWabUacaacaacaacaacaacaacaacaacaacaacaacaaceabWabWacfabXaciabzabZabYabVacbacjacpacpacpabhabhabhacgabhabhabhacdaccachackaclacmacnacmacoackackackacwacqacracsactaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaaaaafaapaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaamaaaaafaaaaafaafacyaafaaaaafacyaafaaaaafacyaafaaaaaaaaaaaaaaaabqabpacCacBacxaczabdacuacpacpacAacvacFacEacKacJacpacpacNacLacPacOacRacQacMacSacVacUacXacWacZacYacracsabbabbabbabbabbabbaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaafaafaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaamaamaaIaafaafaasadaaavaaaaasadaaavaaaaasadaaavaafaaaaaaaaaaaaaafaafadbabdabdabdabdadeacpadcaddaddaddaddacKaddadgadfadkadhadnadmadpadoacMadqadhadhadhadhadtadrackacDadjabbadvaduadsabbaapaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaasadaaavaafaasadaaavaaaaasadaaavaaaaaaaaaaafaaaaafaafaaaaaaaaaaaaabfadeacpadwadzadyadCadAadGadFadHadfadkadhadnadmadpadIadxadJadhadKadKadKadpadLacradBadladOadladladladOaapaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaasadaaavaafaasadaaavaaaaasadaaavaaaaaaaaaaafaaaaafaafaaaaaaaaaaaaabfadeacpadwadzacHadyacIadGadFadHadfadkadhadnadmadpadIadxadJadhadKadKadKadpadLacradBadladOadladladladOaapaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaIaafaasadaaavaaaaasadaaavaaaaasadaaavaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaadDadeacpadMaddaddaddaddacKaddadNadfadkadhadnadPadUadSadWadVadYadXadXadXaebadZacradBadlabbaaSacGadiabbaapaapaafaaaaafaaaaapaafaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaIaafaasadaaavaaaaasadaaavaafaasadaaavaafaafaafaaaaafaafaaaaaaaaaaaaaaaadTadeacpacpaehaefaejaeiaelaekacpacpaemadhadnaenadpaeoaeaadJadYadXaenadXaeqaepacradBaeeabbabbabbabbabbaapaaaaaaaaaaaaaaaaaaaafaafaafaaaaaaaafaafaapaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaIaafaasadaaavaaaaasadaaavaafaasadaaavaafaafaafaaaaafaafaaaaaaaaaaaaaaaadTadeacpacpaehaefadCadAaelaekacpacpaemadhadnaenadpaeoaeaadJadYadXaenadXaeqaepacradBaeeabbabbabbabbabbaapaaaaaaaaaaaaaaaaaaaafaafaafaaaaaaaafaafaapaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaqaafaasaeraavaaaaasaeraavaaaaasaeraavaafaaaaafaafaafaaaaaaaaaaaaaaaaaaadTaegacpacpacpacpacpacpaesacpacpacpaeuaetaezaevaeBaeAaeDaeCaeGaeEaeHaeEaeKaeIacradBaeRabbaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaaaafaaaaaaaaaaafaafaafaaaaaaaafaafaaaaaaaafaafaaaaaaaaaaaaaaaaafaaaaewadeadQaeyadRaaTaeMaeLaeOaeNaePaeFaeYaeXaeZaeXadpaeoaeJafaafbafbafcafbafeafdaexaeQaflabbaeSaeSaeSaeSaeSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaIafmaamaamaamaamaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaafaafabfadeaeUaeVafyaaTafgaeMafiafhafjaeFafoafnaftafpadpafuaffafvadhadhafwadhafzafxacrafkafAabbafLafBafCafCafDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaacaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfabfabfabfabfabfabfabfabfabfabfadeagbafraedaaTafFafEafHafGafGafIafMafKafNafKagdafOadxageagfaeoaggagfagjagiagkafJaglagqadlagragmaghafPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfafQafRafSabfafTafUaeTaeWagBafZafZafZafZafZafZafZafqagnagnaguaaTagtagsaeOagxagyaeFagEagzagLagHagOagMagoagpahaagKagPahbahkagpagvagwafsabbadlagRafCafCagSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaaaafaaaaaaaaaaafaafaafaaaaaaaafaafaaaaaaaafaafaaaaaaaaaaaaaaaaafaaaaewadeadQaeyadRaaTaeMaeLaeOaeNaeiaeFaejaeXaeZaeXadpaeoaeJafaafbafbafcafbafeafdaexaeQaflabbaeSaeSaeSaeSaeSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaIafmaamaamaamaamaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaafaafabfadeaeUaeVafyaaTafgaeMafiafhaeYaePafjafnaftafpadpafuaffafvadhadhafwadhafzafxacrafkafAabbafLafBafCafCafDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaacaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfabfabfabfabfabfabfabfabfabfabfadeagbafoaedaaTafFafEafHafGafGafrafMafKafNafKagdafOadxageagfaeoaggagfagjagiagkafJaglagqadlagragmaghafPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfafQafRafSabfafTafUaeTaeWagBafZafZafZafZafZafZafZafqagnagnaguaaTagsafIaeOagtagxaeFagEagzagLagHagOagMagoagpahaagKagPahbahkagpagvagwafsabbadlagRafCafCagSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaabfafVagBafZafZafZafZafZafZafWagDagDagDagDagDagDagDagDagDagDahmaaTagFagGagXagIagJaeFagZagYagYagYadpahcagNahdaheaheahfaheaheahhagvagTadlabbabbaeSaeSaeSaeSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfagUadEagWagWagWagWagWagWagWagDahiahlahjagWahnahpahoahqahrahsahgahuahtahwahvahCahzahFahDahDahDadpahGahMahHahJahIahNahLahQahOagvahxafXaboaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahPaaaaaaahPaaaaaaaaaahPaaaaaaaaaaaaaaaahPaaaaaaaaaahPaaaaaaahPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfafQafRahAabfaiDadEagWahSahRahEahTahVahUagDahjahWahTahYahXahXahXaiaahZaimaibaigaigaihaigaikaiiadhadhadhaenadpailaioainaipaiRairaiqaitaisagvahxadlabOaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahPahPahPahPaaaaaaaaaahPahPahPahPahPahPahPaaaaaaaaaahPahPahPahPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadDaidaieaiuabfaixadEagWaiwaivaijaiyaiAaizagDahjahWaiEagWaiFahXaiHaiIahXaimaiJaiKaigaiLaigaigaiMaiNadhadhadhadpaiOajdaiPaheaiQajfaiQaheaiSagvahxafYactaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahPahPahPahPaaaaaaahPahPahPahPahPahPahPahPahPaaaaaaahPahPahPahPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaewagbagbaiDabfagbadEagWaiUaiTaiGaiVaiWahTagDaiXaiZaiYagWajaajeajbajgajiaqxajhajkajjaihajmajnaeFajrajoajxajtajJajIajcajKajMajLajOajNajQajPagvahxabbabbabbabbaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaIaaIaamaamaaaaaaaaaaaaaaaaaaaaaaaaahPahPahPahPaaaaaaahPahPahPahPahPahPahPahPahPaaaaaaahPahPahPahPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaewagbagbaiDabfagbadEagWaiUaiTaiGaiVaiWahTagDaiXaiZaiYagWajaajeajbajgajiaqxajhajkajjaihajmajnaeFagyajoajxajtajJajIajcajKajMajLajOajNajQajPagvahxabbabbabbabbaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaIaaIaamaamaaaaaaaaaaaaaaaaaaaaaaaaahPahPahPahPaaaaaaahPahPahPahPahPahPahPahPahPaaaaaaahPahPahPahPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfajAabfabfagbajlagWagWakbagWagWakkagWagWagWakxagWagWajpajsajRantajSajuagWajvajwajTajyajqagWagWajzajVajUagWagWagWagpajCagpagpagpagpagpagvahxabbajDajEaboaaaaafaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaaaafaaaaaqaaaaaaaaaaaaaaaaaaaaaaaaahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfagBafZagaafZagcajHakWajWajYajXakaajZakcajZakeakdakgakfakiakhaklakjakiakmaklaklaksaknaknaktakvakuaifakwakzakyajzakAakCakBakEakDakGakFakoakpalfakZakqabOaaaaaaaaaaaaaaaaaaaaaaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafakHaafaaIaaaaaaaaaaaaaaaaaaaaaaaaahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaamaamaaIaamaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfadEagWagWagWagWagWagWakIakKakJakLakJakNakMakPakOakJakQakSakRakVakJakXakJakJakYalbalaaldalcalgalealialhalaaljallalkakTakUalFalxalCalmakoagAabbalnaloactaaaaaaaaaaafaaaaaaaaaaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaIaaIaaIaaIaaaaaaaaaalpaaaaaaaaaaaIaaIaamaamaamaaaaaaahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaaaaaqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfadEagWalragCagQalPagWalvalyahXalAalzagWacTalBacTagWaecalHajGagWalJalOalNalQagDaltalualRalwalSagWabTabSabSabRagWalTamsalDalEamtalGalUakoagVanQamxanQanQaaaaaaaafaafaaaaaaaaaaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqaaaaaaaafaafaafaaaaaaalVaafaafaaaaafaafaaaaaaaamaaaaaaahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafalXaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafabfadEamyahKahKahBahyaiBaicalyahXamaalzagWambameamcalWamfamhamgamjahXamkahXammamdamnamnamrampamvamiamCamBamEamDakoamFamPamOamqalDalDamGakoadBanQamHamIamwaaaaaaaapaaaaaaaaaaafaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafamJamJamJamJamJaafamKaafamJamJamJamJamJaafaaIaaaaaaahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfagBafZagaafZagcajHakWajWajYajXakaajZakcajZakeakdakgakfakiakhaklakjakiakmaklaklaksaknaknaktakvakuaifakwakzakyajzakAajrakBakEakDakGakFakoakpalfakZakqabOaaaaaaaaaaaaaaaaaaaaaaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafakHaafaaIaaaaaaaaaaaaaaaaaaaaaaaaahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaamaamaaIaamaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfadEagWagWagWagWagWagWakIakKakJakLakJakNakMakPakOakJakQakSakRakVakJakXakJakJakYalbalaaldalcalgalealialhalaaljallalkakTakUalFakCalCalmakoagAabbalnaloactaaaaaaaaaaafaaaaaaaaaaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaIaaIaaIaaIaaaaaaaaaalpaaaaaaaaaaaIaaIaamaamaamaaaaaaahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaaaaaqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfadEagWalragCagQalPagWalvalyahXalAalzagWacTalBacTagWaecalHajGagWalJalOalNalQagDaltalualRalwalSagWabTabSabSabRagWalTamsalDalEalxalGalUakoagVanQamxanQanQaaaaaaaafaafaaaaaaaaaaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqaaaaaaaafaafaafaaaaaaalVaafaafaaaaafaafaaaaaaaamaaaaaaahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafalXaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafabfadEamyahKahKahBahyaiBaicalyahXamaalzagWambameamcalWamfamhamgamjahXamkahXammamdamnamnamrampamvamiamCamBamEamDakoamFamOamtamqalDalDamGakoadBanQamHamIamwaaaaaaaapaaaaaaaaaaafaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafamJamJamJamJamJaafamKaafamJamJamJamJamJaafaaIaaaaaaahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaamaaIaaIaaaaaaaaaamLaaaaaaaaaaaIaaIaamaamaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfadEagWamNamMajBaiCagWamSalyalzamUamTagWamVamXamWalWamYanaamZancanbanfaneaniamlampampanjampanlaoWannanmanpanoakoanqanWalDamqalDalDanrakoansandanuaocangaafaapaafaafaapaafaafaafakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafanBanwanwanwanwanCamKanDanEanEanEanEanFaafaaIaaaaaaahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafaafaaaaaaaaaanHaafaafaaaaafaafaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfanvagWagWagWagWagWagWanIanJagWagWagWagWaobanKaobalWapDanLaqralWaojaosaomanzanAampampanjanManNamianPanOanpanTanGanVaoeaodaogaofaokaohanGaolaoCaonanRanSaaaaaaaafaaaaafaapaafaacakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafaooaooaooaooaooaafamKaafaooaooaooaooaooaafaaIaaaahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafaopaopaopaopaopaafaoqaafaopaopaopaopaopaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanXanYajFamoagDaoMalqagWaoraotalKaovaouaoiaowaoyaoxaozaozaoAaozaoDaoBaoFaoEaoOaoLampampaoQaoPaoRamiaoTaoSanpaoUanGaoVaoYaoXapdaoZapfapeanGapganQanQanQanQaoIaoJaoHaphalsaaaaafaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafaaaaaaaafamKaaaaaaaaaaafaaaaaaaaaaamaaaahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -7484,7 +7483,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafaafcgEclXcmDcmjcgEcmtcmDcEgcgEcmtcmDcEgcgEaaaaafcmQcgUcgUchfchfcmscejcmvcmucmxbRqcmAcmycmBcmBcmEcmCcmBcmFcIycbFcmIcmHcmKcmJcjrcmLcmLcmMclrcmNcmPcmOcmOciAcibcmScoybRRciGcmUciScmVcmXcmWciGcmYcnacmZciUcnbcndcnccjccneciUclLclMclNcnlcnfcnlclNaaaaaaaaabYfbYfbYfcnnclSclSclTbYfbYfaaaaaaaaaaaacdOcdOcdOcdOcdOcdOcdOcdOcdOcnhcnjcnicdScdScnHcntcnNcdScdScdScdScoucntcnNcdScdScnvcnocnvaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbOaafaafaafaaaaafcnxaafcnxaafcKAaafcpfaafcKAaafcpfaafaafaaacejcnqcnpchfchfcnrcnDcowcovcnycnmcnscnzcnzcnAcnzcnGcnBcoxcnGcnJcnFcnCcnIcnMcnOcnOcnOcnOcnLcnKcnRcnRcnRcgscgscgscgsbSgciGcnQcnScmVcnUcnTciGcmYcnacnWciUcnYcnZcnccoccoaciUclLclMclNcoecodcofclNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaacdOcogcojcohcwlcokconcolcomcoocoqcopcdOaapaafaafaafaafaaaaaaaaabSYaaaaaaaaaaafcoscqscosaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafcptcpBcpAcpGcpCcpIcpHcpGcpScpZcpHcqtcqdcqxcqwcnycnycnycnycnycnycnycnycozcotcoBcoAcoCcqycoEcoDcJkcnGcoHcoGcoIcnGcoKcoJcoLcnOcoNcoMcoPcoOcoRcoQcpjcpbcpbcpkcpncpncpjcrvciGciGcpccoSciGciGciGcoTcnacoUciUciUciUcoVcphciUciUclLcpiclNcoXcoWcoXclNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaafcdOcoYcoZcoYcpdcpacpgcpecomcomcplcomcdOcdOaaaaaaaaaaafaafaaaaacaaaaaaaaaaaaaafaaacpmaaaaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaaaaaaaaaafcqDcppcpocprcpqcpucpscpwcpvcpycpxcpDcpzcpEcpucpJcpFcpLcpKcpNcpMcpPcpOcpRcpQcpUcpTcpVcqLcpXcpWcpYcqNcqbcqacqccqOcoKcqecqfcnOcoRcoRcoRcoRcoRcqgcpjcqPcqPcqPcpncpncpjbTFbPxciGcqicqhcqkcqjciGcqlcnacqmciUcqncqpcqocqqciUclMclLcpiclNcqucqrcqzclNaaaaaaaaaaaaaaaaaacqvcqRcrkcrgcqvaafaaaaaaaaaaaacdOcoYcoYcoYcoicqAcqCcqBcqFcqEcqHcqGcqIcdOaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaaacqJaaaaafaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaaaaaaaaaafcqDcppcpocprcpqcpucpscpwcpvcpycpxcpDcpzcpEcpucpJcpFcpLcpKcfEcpMcpPcpOcpRcpQcpUcpTcpVcqLcpXcpWcpYcqNcqbcqacqccqOcoKcqecqfcnOcoRcoRcoRcoRcoRcqgcpjcqPcqPcqPcpncpncpjbTFbPxciGcqicqhcqkcqjciGcqlcnacqmciUcqncqpcqocqqciUclMclLcpiclNcqucqrcqzclNaaaaaaaaaaaaaaaaaacqvcqRcrkcrgcqvaafaaaaaaaaaaaacdOcoYcoYcoYcoicqAcqCcqBcqFcqEcqHcqGcqIcdOaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaaacqJaaaaafaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafcrUcqMcqKcqScqQcpucqTcpucqUcqMcqTcpucqUcqMcpucpucpucpucpucqVcpucpucpucqXcqWcqZcqYcracqLcrccrbcrdcrVcrfcrecrhcsgcoKcqecricnOcrjcoRcoRcrlcoRcrmcpjcrIcrKcrJcrKcrLcpjbTFcrqciGcrocrncrrcrpcrtcrscrwcrucrycrxcrAcrzcrBciUcrEcrFcrGcrHcqvcrCcqvcrHaaaaaaaafaaaaaaaaacqvcrDcrNcrMcqvaafaafaaaaaaaaacdOcomcomcomcomcrOcpgcrQcrQcrQcnjcrQcrRcdOaaaaaaaaaaaaaaacrPcrPcrPcbOaafaafaafaafcrSaafaafaafaafaafaaqcrPcrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaafaafcqDcpucqYcpucqYcpucqTcpucrTcrXcrWcrXcrZcrXcrXcsbcsacpucpucsdcsccsccsccsfcsecshcshcsicqLcskcsjcsmcnGcsocsncspcnGcsscsrcstcsqcsvcsucszcswcoRcsAcpjcsxcrKcsycrKcsBcpjbTFcfxciGcsDcsCcsFcsEciGcfYcufcfYciUcsGcsJcsHcsKbTkcsIcrGcrGcqvcsMcsLcsNcqvcqvcqvcqvcqvcqvcqvcqvcsOcsQcsPcqvcqvcqvcrHaaaaaacdOcogcojcohcslcsRcqCcrQcrQcrQcnjcrQcsScdOaaaaaaaaaaaaaaacrPaaaaafaaaaafaaaaaaaaacsTaaaaafaafaaaaaaaaaaaacrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaafaaaaaacqDcpucqYcpucsUcsWcsVcsZcsYctacrWcrXctbcrXcrXctdctcctfctecticthctkctjctjctlcqYcqYctmctgctnctocnzcnGctscnGcnGcnGctucttcstcvnctxcvtctBctycoRctCcpjcvOcrKcsycrKcvRcpjctvctwciGciGctDciGciGciGciBclMbTlciUciUciUctEciUciUcsIcrGaaacqvctHctGctIctFctKctJctMctLctOctNcqvcuVctPcuVcqvctQctRcqvaafaafcdOcoYcoYcoYctScpactUctTctWctVctXcrQctZcdOcdOcdOcdOaaaaaacrPaaacuacuacuacuacuaaafcsTaafcuacuacuacuacuaaaacrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/maps/exodus-2.dmm b/maps/exodus-2.dmm index 0d4dae316b1..b2923d9e4b4 100644 --- a/maps/exodus-2.dmm +++ b/maps/exodus-2.dmm @@ -884,7 +884,7 @@ "qZ" = (/obj/structure/table/standard,/obj/structure/closet/secure_closet/medical_wall{pixel_y = 32; req_access = list(150)},/obj/item/bodybag,/obj/item/weapon/reagent_containers/glass/bottle/antitoxin{pixel_x = -4; pixel_y = 8},/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline{pixel_x = 4; pixel_y = 7},/obj/item/weapon/reagent_containers/syringe,/obj/machinery/light{dir = 4},/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/syringe/antiviral,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) "ra" = (/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/living) "rb" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 4; start_pressure = 740.5},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"rc" = (/obj/structure/table/rack,/obj/item/clothing/suit/storage/vest/heavy/merc{pixel_x = 2; pixel_y = 2},/obj/item/clothing/suit/storage/vest/heavy/merc{pixel_x = -2; pixel_y = -2},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) +"rc" = (/obj/structure/table/rack,/obj/item/clothing/suit/storage/vest/merc{pixel_x = 2; pixel_y = 2},/obj/item/clothing/suit/storage/vest/merc,/obj/item/clothing/suit/storage/vest/merc{pixel_x = -2; pixel_y = -2},/turf/unsimulated/floor{icon_state = "dark"},/area/space) "rd" = (/obj/structure/table/standard,/obj/item/roller{pixel_y = 8},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/syringe/antiviral,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) "re" = (/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer,/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/living) "rf" = (/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/living) @@ -1092,7 +1092,7 @@ "uZ" = (/obj/machinery/door/window/northleft,/obj/structure/bed/chair,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control) "va" = (/obj/structure/table/woodentable,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/effect/floor_decal/carpet{dir = 8},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control) "vb" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) -"vc" = (/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) +"vc" = (/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/armor_booster/anticcw_armor_booster,/obj/item/mecha_parts/mecha_equipment/armor_booster/antiproj_armor_booster,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "vd" = (/obj/structure/table/rack,/obj/item/clothing/head/beret/centcom/officer,/obj/item/clothing/head/beret/centcom/officer,/obj/item/clothing/head/beret/centcom/officer,/obj/item/clothing/head/beret/centcom/officer,/obj/item/clothing/head/beret/centcom/officer,/obj/item/clothing/head/beret/centcom/officer,/obj/item/clothing/mask/balaclava,/obj/item/clothing/mask/balaclava,/obj/item/clothing/mask/balaclava,/obj/item/clothing/mask/balaclava,/obj/item/clothing/mask/balaclava,/obj/item/clothing/mask/balaclava,/obj/item/clothing/accessory/holster/waist,/obj/item/clothing/accessory/holster/waist,/obj/item/clothing/accessory/holster/waist,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "ve" = (/obj/machinery/vending/assist,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "vf" = (/obj/machinery/shieldgen,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)