Changed helmet lights over to a general system/overlays.

This commit is contained in:
Zuhayr
2014-11-16 13:40:13 +10:30
parent 579ebb84bb
commit 823f01f4bf
46 changed files with 326 additions and 225 deletions

View File

@@ -800,6 +800,7 @@
#include "code\modules\clothing\spacesuits\rig\rig_attackby.dm"
#include "code\modules\clothing\spacesuits\rig\rig_pieces.dm"
#include "code\modules\clothing\spacesuits\rig\rig_verbs.dm"
#include "code\modules\clothing\spacesuits\rig\rig_wiring.dm"
#include "code\modules\clothing\spacesuits\rig\modules\combat.dm"
#include "code\modules\clothing\spacesuits\rig\modules\computer.dm"
#include "code\modules\clothing\spacesuits\rig\modules\modules.dm"

View File

@@ -229,7 +229,7 @@
/mob/living/carbon/human/MiddleClickOn(var/atom/A)
if(back)
var/obj/item/weapon/storage/rig/rig = back
var/obj/item/weapon/rig/rig = back
if(istype(rig) && rig.selected_module)
if(world.time <= next_move) return
next_move = world.time + 8

View File

@@ -294,8 +294,8 @@
tankcheck = list(C.r_hand, C.l_hand, C.back)
// Rigs are a fucking pain since they keep an air tank in nullspace.
if(istype(C.back,/obj/item/weapon/storage/rig))
var/obj/item/weapon/storage/rig/rig = C.back
if(istype(C.back,/obj/item/weapon/rig))
var/obj/item/weapon/rig/rig = C.back
if(rig.air_supply)
from = "in"
nicename |= "hardsuit"

View File

@@ -531,7 +531,7 @@ As such, it's hard-coded for now. No reason for it not to be, really.
else
equip_to_slot_or_del(new /obj/item/clothing/under/color/black(src), slot_w_uniform)
equip_to_slot_or_del(new /obj/item/weapon/storage/rig/light/ninja(src), slot_back)
equip_to_slot_or_del(new /obj/item/weapon/rig/light/ninja(src), slot_back)
equip_to_slot_or_del(new /obj/item/clothing/mask/gas/voice/space_ninja(src), slot_wear_mask)
equip_to_slot_or_del(new /obj/item/device/flashlight(src), slot_belt)
equip_to_slot_or_del(new /obj/item/weapon/tank/oxygen(src), slot_s_store)

View File

@@ -1333,7 +1333,7 @@ datum
return 0
var/current_amount
var/obj/item/weapon/storage/rig/S
var/obj/item/weapon/rig/S
if(istype(owner.current,/mob/living/carbon/human))
var/mob/living/carbon/human/H = owner.current
S = H.back

View File

@@ -614,7 +614,7 @@ datum/objective/download
return 0
var/current_amount
var/obj/item/weapon/storage/rig/S
var/obj/item/weapon/rig/S
if(istype(owner.current,/mob/living/carbon/human))
var/mob/living/carbon/human/H = owner.current
S = H.back

View File

@@ -75,7 +75,7 @@
/obj/item/weapon/storage/lockbox,
/obj/item/weapon/storage/secure,
/obj/item/weapon/circuitboard,
/obj/item/weapon/storage/rig,
/obj/item/weapon/rig,
/obj/item/device/eftpos,
/obj/item/device/lightreplacer,
/obj/item/device/taperecorder,

View File

@@ -118,7 +118,7 @@
/obj/item/weapon/tank/jetpack/rig
name = "jetpack"
var/obj/item/weapon/storage/rig/holder
var/obj/item/weapon/rig/holder
/obj/item/weapon/tank/jetpack/rig/examine()
usr << "It's a jetpack. If you can see this, report it on the bug tracker."

View File

@@ -243,6 +243,64 @@ BLIND // can't see anything
slot_flags = SLOT_HEAD
w_class = 2.0
var/light_overlay = "helmet_light"
var/brightness_on
var/on = 0
/obj/item/clothing/head/New()
..()
if(!icon_action_button && brightness_on)
icon_action_button = "[icon_state]"
/obj/item/clothing/head/attack_self(mob/user)
if(brightness_on)
if(!isturf(user.loc))
user << "You cannot turn the light on while in this [user.loc]" //To prevent some lighting anomalities.
return
on = !on
overlays.Cut()
if(on)
if(!light_overlay_cache["[light_overlay]_icon"])
light_overlay_cache["[light_overlay]_icon"] = image("icon" = 'icons/obj/light_overlays.dmi', "icon_state" = "[light_overlay]")
if(!light_overlay_cache["[light_overlay]"])
light_overlay_cache["[light_overlay]"] = image("icon" = 'icons/mob/light_overlays.dmi', "icon_state" = "[light_overlay]")
overlays |= light_overlay_cache["[light_overlay]_icon"]
user.SetLuminosity(user.luminosity + brightness_on)
else
user.SetLuminosity(user.luminosity - brightness_on)
if(istype(user,/mob/living/carbon/human))
var/mob/living/carbon/human/H = user
H.update_inv_head()
else
return ..(user)
/obj/item/clothing/head/proc/update_light(mob/user)
if(!brightness_on)
return
if(on)
if(light_overlay) overlays |= light_overlay
user.SetLuminosity(user.luminosity - brightness_on)
SetLuminosity(brightness_on)
/obj/item/clothing/head/equipped(mob/user)
..()
update_light(user)
/obj/item/clothing/head/pickup(mob/user)
..()
update_light(user)
/obj/item/clothing/head/dropped(mob/user)
..()
update_light(user)
/obj/item/clothing/head/update_clothing_icon()
if (ismob(src.loc))
var/mob/M = src.loc

View File

@@ -4,38 +4,13 @@
icon_state = "hardhat0_yellow"
flags = FPRINT | TABLEPASS
item_state = "hardhat0_yellow"
var/brightness_on = 4 //luminosity when on
var/on = 0
brightness_on = 4 //luminosity when on
light_overlay = "hardhat_light"
item_color = "yellow" //Determines used sprites: hardhat[on]_[color] and hardhat[on]_[color]2 (lying down sprite)
armor = list(melee = 30, bullet = 5, laser = 20,energy = 10, bomb = 20, bio = 10, rad = 20)
flags_inv = 0
icon_action_button = "action_hardhat"
siemens_coefficient = 0.9
attack_self(mob/user)
if(!isturf(user.loc))
user << "You cannot turn the light on while in this [user.loc]" //To prevent some lighting anomalities.
return
on = !on
icon_state = "hardhat[on]_[item_color]"
item_state = "hardhat[on]_[item_color]"
if(on) user.SetLuminosity(user.luminosity + brightness_on)
else user.SetLuminosity(user.luminosity - brightness_on)
pickup(mob/user)
if(on)
user.SetLuminosity(user.luminosity + brightness_on)
// user.UpdateLuminosity() //TODO: Carn
SetLuminosity(0)
dropped(mob/user)
if(on)
user.SetLuminosity(user.luminosity - brightness_on)
// user.UpdateLuminosity()
SetLuminosity(brightness_on)
/obj/item/clothing/head/hardhat/orange
icon_state = "hardhat0_orange"
item_state = "hardhat0_orange"
@@ -62,4 +37,3 @@
icon_state = "hardhat0_dblue"
item_state = "hardhat0_dblue"
item_color = "dblue"

View File

@@ -126,33 +126,10 @@
flags = FPRINT | TABLEPASS | HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
body_parts_covered = HEAD|EYES
var/brightness_on = 2 //luminosity when on
var/on = 0
brightness_on = 2
light_overlay = "helmet_light"
w_class = 3
attack_self(mob/user)
if(!isturf(user.loc))
user << "You cannot turn the light on while in this [user.loc]" //To prevent some lighting anomalities.
return
on = !on
icon_state = "hardhat[on]_[item_color]"
item_state = "hardhat[on]_[item_color]"
if(on) user.SetLuminosity(user.luminosity + brightness_on)
else user.SetLuminosity(user.luminosity - brightness_on)
pickup(mob/user)
if(on)
user.SetLuminosity(user.luminosity + brightness_on)
// user.UpdateLuminosity()
SetLuminosity(0)
dropped(mob/user)
if(on)
user.SetLuminosity(user.luminosity - brightness_on)
// user.UpdateLuminosity()
SetLuminosity(brightness_on)
/*
* Kitty ears
*/

View File

@@ -24,6 +24,11 @@
var/mob/integrated_ai // Direct reference to the actual mob held in the suit.
var/obj/item/ai_card // Reference to the MMI, posibrain, intellicard or pAI card previously holding the AI.
var/list/ai_interface_verbs = list(
//mob/living/proc/hardsuit_interface_ai,
//mob/living/proc/hardsuit_host_bioscan,
//mob/living/proc/hardsuit_hack
)
/obj/item/rig_module/ai_container/accepts_item(var/obj/item/input_device, var/mob/living/user)
@@ -53,6 +58,8 @@
// If the transfer failed we can delete the card.
if(locate(/mob/living/silicon/ai) in card)
ai_card = card
integrated_ai = locate(/mob/living/silicon/ai) in card
integrated_ai.verbs |= ai_interface_verbs
else
eject_ai()
return 1
@@ -119,7 +126,7 @@
ai_card = null
if(integrated_ai)
integrated_ai.verbs -= /mob/living/proc/hardsuit_interface_ai
integrated_ai.verbs -= ai_interface_verbs
integrated_ai = null
/obj/item/rig_module/ai_container/proc/integrate_ai(var/obj/item/ai,var/mob/user)
@@ -159,7 +166,7 @@
integrated_ai = null
eject_ai()
else
integrated_ai.verbs |= /mob/living/proc/hardsuit_interface_ai
integrated_ai.verbs |= ai_interface_verbs
else
user << "<span class='warning'>There is no active AI within \the [ai].</span>"
else

View File

@@ -15,7 +15,7 @@
icon_state = "module"
matter = list("metal" = 20000, "plastic" = 30000, "glass" = 5000)
var/obj/item/weapon/storage/rig/holder
var/obj/item/weapon/rig/holder
var/module_cooldown = 10
var/next_use = 0
@@ -74,7 +74,7 @@
..()
// Called when the module is installed into a suit.
/obj/item/rig_module/proc/installed(var/obj/item/weapon/storage/rig/new_holder)
/obj/item/rig_module/proc/installed(var/obj/item/weapon/rig/new_holder)
holder = new_holder
return

View File

@@ -205,6 +205,7 @@
/obj/item/rig_module/chem_dispenser/combat
/obj/item/rig_module/chem_dispenser/injector
name = "mounted chemical injector"

View File

@@ -6,7 +6,7 @@
* Defines the behavior of hardsuits/rigs/power armour.
*/
/obj/item/weapon/storage/rig
/obj/item/weapon/rig
name = "hardsuit control module"
icon = 'icons/obj/rig_modules.dmi'
@@ -22,8 +22,6 @@
max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE
siemens_coefficient = 0
permeability_coefficient = 0
max_w_class = 3
max_combined_w_class = 35
// Keeps track of what this rig should spawn with.
var/suit_type = "hardsuit"
@@ -52,16 +50,25 @@
// Rig status vars.
var/open = 0 // Access panel status.
var/locked = 1 // Lock status.
var/emagged
var/subverted
var/interface_locked
var/control_overridden
var/ai_override_enabled
var/security_check_enabled
var/malfunctioning
var/malfunction_delay
var/electrified = 0
var/sealing // Keeps track of seal status independantly of canremove.
var/offline = 1 // Should we be applying suit maluses?
var/offline_slowdown = 10 // If the suit is deployed and unpowered, it sets slowdown to this.
var/offline_vision_restriction = 1 // 0 - none, 1 - welder vision, 2 - blind. Maybe move this to helmets.
// Spark system, since we seem to need this a bunch.
// Wiring! How exciting.
var/datum/wires/rig/wires
var/datum/effect/effect/system/spark_spread/spark_system
/obj/item/weapon/storage/rig/examine()
/obj/item/weapon/rig/examine()
..()
if(wearer)
for(var/obj/item/piece in list(helmet,gloves,chest,boots))
@@ -73,9 +80,11 @@
usr << "The maintenance panel is [open ? "open" : "closed"]."
usr << "Hardsuit systems are [offline ? "<font color='red'>offline</font>" : "<font color='green'>online</green>"]."
/obj/item/weapon/storage/rig/New()
/obj/item/weapon/rig/New()
..()
wires = new(src)
if((!req_access || !req_access.len) && (!req_one_access || !req_one_access.len))
locked = 0
@@ -87,27 +96,27 @@
if(initial_modules && initial_modules.len)
for(var/path in initial_modules)
var/obj/item/rig_module/module = new path()
var/obj/item/rig_module/module = new path(src)
installed_modules += module
module.installed(src)
// Create and initialize our various segments.
if(cell_type)
cell = new cell_type()
cell = new cell_type(src)
if(air_type)
air_supply = new air_type()
air_supply = new air_type(src)
if(glove_type)
gloves = new glove_type()
verbs |= /obj/item/weapon/storage/rig/proc/toggle_gauntlets
gloves = new glove_type(src)
verbs |= /obj/item/weapon/rig/proc/toggle_gauntlets
if(helm_type)
helmet = new helm_type()
verbs |= /obj/item/weapon/storage/rig/proc/toggle_helmet
helmet = new helm_type(src)
verbs |= /obj/item/weapon/rig/proc/toggle_helmet
if(boot_type)
boots = new boot_type()
verbs |= /obj/item/weapon/storage/rig/proc/toggle_boots
boots = new boot_type(src)
verbs |= /obj/item/weapon/rig/proc/toggle_boots
if(chest_type)
chest = new chest_type()
verbs |= /obj/item/weapon/storage/rig/proc/toggle_chest
chest = new chest_type(src)
verbs |= /obj/item/weapon/rig/proc/toggle_chest
for(var/obj/item/piece in list(gloves,helmet,boots,chest))
if(!piece)
@@ -128,7 +137,7 @@
toggle_seals(M,1)
update_icon()
/obj/item/weapon/storage/rig/Del()
/obj/item/weapon/rig/Del()
for(var/obj/item/piece in list(gloves,boots,helmet,chest))
var/mob/living/M = piece.loc
if(istype(M))
@@ -137,7 +146,7 @@
processing_objects -= src
..()
/obj/item/weapon/storage/rig/proc/suit_is_deployed()
/obj/item/weapon/rig/proc/suit_is_deployed()
if(!istype(wearer) || src.loc != wearer || wearer.back != src)
return 0
if(helm_type && (!helmet || wearer.head != helmet))
@@ -150,7 +159,7 @@
return 0
return 1
/obj/item/weapon/storage/rig/proc/toggle_seals(var/mob/living/carbon/human/M,var/instant)
/obj/item/weapon/rig/proc/toggle_seals(var/mob/living/carbon/human/M,var/instant)
if(sealing) return
@@ -272,10 +281,12 @@
piece.flags |= AIRTIGHT
update_icon(1)
/obj/item/weapon/storage/rig/process()
/obj/item/weapon/rig/process()
if(!istype(wearer) || loc != wearer || wearer.back != src || canremove || !cell || cell.charge <= 0)
if(!cell || cell.charge <= 0)
if(electrified >0)
electrified = 0
if(!offline)
if(istype(wearer))
if(!canremove)
@@ -302,10 +313,19 @@
slowdown = offline_slowdown
return
if(cell && cell.charge > 0 && electrified > 0)
electrified--
if(malfunction_delay > 0)
malfunction_delay--
else if(malfunctioning)
malfunctioning--
malfunction()
for(var/obj/item/rig_module/module in installed_modules)
cell.use(module.process()*10)
/obj/item/weapon/storage/rig/proc/check_power_cost(var/mob/living/user, var/cost, var/use_unconcious, var/obj/item/rig_module/mod, var/user_is_ai)
/obj/item/weapon/rig/proc/check_power_cost(var/mob/living/user, var/cost, var/use_unconcious, var/obj/item/rig_module/mod, var/user_is_ai)
if(!istype(user))
return 0
@@ -340,7 +360,7 @@
cell.use(cost*10)
return 1
/obj/item/weapon/storage/rig/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
/obj/item/weapon/rig/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
if(!user)
return
@@ -403,7 +423,7 @@
ui.open()
ui.set_auto_update(1)
/obj/item/weapon/storage/rig/update_icon(var/update_mob_icon)
/obj/item/weapon/rig/update_icon(var/update_mob_icon)
//TODO: Maybe consider a cache for this (use mob_icon as blank canvas, use suit icon overlay).
overlays.Cut()
@@ -433,7 +453,7 @@
wearer.update_inv_back()
return
/obj/item/weapon/storage/rig/Topic(href,href_list)
/obj/item/weapon/rig/Topic(href,href_list)
if(..())
return 1
@@ -468,7 +488,7 @@
src.add_fingerprint(usr)
return
/obj/item/weapon/storage/rig/equipped(mob/living/carbon/human/M)
/obj/item/weapon/rig/equipped(mob/living/carbon/human/M)
..()
if(istype(M) && M.back == src)
@@ -486,7 +506,7 @@
wearer = M
update_icon()
/obj/item/weapon/storage/rig/proc/toggle_piece(var/piece, var/mob/living/carbon/human/H, var/deploy_mode)
/obj/item/weapon/rig/proc/toggle_piece(var/piece, var/mob/living/carbon/human/H, var/deploy_mode)
if(sealing)
return
@@ -537,7 +557,7 @@
use_obj.canremove = 1
holder.drop_from_inventory(use_obj)
use_obj.canremove = 0
use_obj.loc = null
use_obj.loc = src
else if (deploy_mode != ONLY_RETRACT)
if(check_slot)
@@ -552,7 +572,7 @@
if(piece == "helmet" && helmet)
helmet.update_light(H)
/obj/item/weapon/storage/rig/proc/deploy(mob/M,var/sealed)
/obj/item/weapon/rig/proc/deploy(mob/M,var/sealed)
var/mob/living/carbon/human/H = M
@@ -589,12 +609,27 @@
for(var/piece in list("helmet","gauntlets","chest","boots"))
toggle_piece(piece, H, ONLY_DEPLOY)
/obj/item/weapon/storage/rig/dropped()
/obj/item/weapon/rig/dropped()
..()
for(var/piece in list("helmet","gauntlets","chest","boots"))
toggle_piece(piece, wearer, ONLY_RETRACT)
wearer = null
//Todo
/obj/item/weapon/rig/proc/malfunction()
return 0
/obj/item/weapon/rig/emp_act(severity)
malfunctioning += severity*10
if(malfunction_delay <= 0)
malfunction_delay = 20
/obj/item/weapon/rig/proc/shock(mob/user)
if (electrocute_mob(user, cell, src))
spark_system.start()
return 1
return 0
#undef ONLY_DEPLOY
#undef ONLY_RETRACT
#undef SEAL_DELAY

View File

@@ -1,7 +1,13 @@
/obj/item/weapon/storage/rig/attackby(obj/item/W as obj, mob/user as mob)
/obj/item/weapon/rig/attackby(obj/item/W as obj, mob/user as mob)
if(!istype(user,/mob/living)) return 0
if(electrified != 0)
if(cell && cell.charge >= 100)
cell.use(100)
if(shock(user, 100))
return
// Pass repair items on to the chestpiece.
if(chest && (istype(W,/obj/item/stack/sheet/mineral/plastic) || istype(W,/obj/item/stack/sheet/metal) || istype(W, /obj/item/weapon/weldingtool)))
return chest.attackby(W,user)
@@ -9,7 +15,7 @@
// Lock or unlock the access panel.
if(istype(W, /obj/item/weapon/card) || istype(W, /obj/item/device/pda))
if(emagged)
if(subverted)
locked = 0
user << "<span class='danger'>It looks like the locking system has been shorted out.</span>"
return
@@ -17,7 +23,7 @@
req_access = null
req_one_access = null
locked = 0
emagged = 1
subverted = 1
user << "<span class='danger'>You short out the access protocol for the suit.</span>"
return
@@ -45,6 +51,14 @@
return
if(open)
// Hacking.
if(istype(W,/obj/item/weapon/wirecutters) || istype(W,/obj/item/device/multitool))
if(open)
wires.Interact(user)
else
user << "You can't reach the wiring."
return
// Air tank.
if(istype(W,/obj/item/weapon/tank)) //Todo, some kind of check for suits without integrated air supplies.
@@ -54,7 +68,7 @@
user.drop_from_inventory(W)
air_supply = W
W.loc = null
W.loc = src
user << "You slot [W] into [src] and tighten the connecting valve."
return
@@ -83,7 +97,7 @@
user << "You install \the [mod] into \the [src]."
user.drop_from_inventory(mod)
installed_modules |= mod
mod.loc = null
mod.loc = src
mod.installed(src)
update_icon()
return 1
@@ -92,7 +106,7 @@
user << "You jack \the [W] into \the [src]'s battery mount."
user.drop_from_inventory(W)
W.loc = null
W.loc = src
src.cell = W
return
@@ -167,3 +181,13 @@
if(module.accepts_item(W,user)) //Item is handled in this proc
return
..()
/obj/item/weapon/rig/attackby(var/mob/user)
if(electrified != 0)
if(cell && cell.charge >= 100)
cell.use(100)
if(shock(user, 100))
return
..()

View File

@@ -54,7 +54,7 @@
if(!istype(H) || !H.back)
return 0
var/obj/item/weapon/storage/rig/suit = H.back
var/obj/item/weapon/rig/suit = H.back
if(!suit || !istype(suit) || !suit.installed_modules.len)
return 0

View File

@@ -1,5 +1,5 @@
// Interface for humans.
/obj/item/weapon/storage/rig/verb/hardsuit_interface()
/obj/item/weapon/rig/verb/hardsuit_interface()
set name = "Open Hardsuit Interface"
set desc = "Open the hardsuit system interface."
@@ -9,7 +9,7 @@
if(wearer && wearer.back == src)
ui_interact(usr)
/obj/item/weapon/storage/rig/verb/toggle_vision()
/obj/item/weapon/rig/verb/toggle_vision()
set name = "Toggle Visor"
set desc = "Turns your rig visor off or on."
@@ -32,7 +32,7 @@
else
visor.deactivate()
/obj/item/weapon/storage/rig/proc/toggle_helmet()
/obj/item/weapon/rig/proc/toggle_helmet()
set name = "Toggle Helmet"
set desc = "Deploys or retracts your helmet."
@@ -41,7 +41,7 @@
toggle_piece("helmet",wearer)
/obj/item/weapon/storage/rig/proc/toggle_chest()
/obj/item/weapon/rig/proc/toggle_chest()
set name = "Toggle Chestpiece"
set desc = "Deploys or retracts your chestpiece."
@@ -50,7 +50,7 @@
toggle_piece("chest",wearer)
/obj/item/weapon/storage/rig/proc/toggle_gauntlets()
/obj/item/weapon/rig/proc/toggle_gauntlets()
set name = "Toggle Gauntlets"
set desc = "Deploys or retracts your gauntlets."
@@ -59,7 +59,7 @@
toggle_piece("gauntlets",wearer)
/obj/item/weapon/storage/rig/proc/toggle_boots()
/obj/item/weapon/rig/proc/toggle_boots()
set name = "Toggle Boots"
set desc = "Deploys or retracts your boots."
@@ -68,7 +68,7 @@
toggle_piece("boots",wearer)
/obj/item/weapon/storage/rig/verb/deploy_suit()
/obj/item/weapon/rig/verb/deploy_suit()
set name = "Deploy Hardsuit"
set desc = "Deploys helmet, gloves and boots."
@@ -84,7 +84,7 @@
deploy(wearer)
/obj/item/weapon/storage/rig/verb/toggle_seals_verb()
/obj/item/weapon/rig/verb/toggle_seals_verb()
set name = "Toggle Seals"
set desc = "Activates or deactivates your rig seals."
@@ -97,7 +97,7 @@
toggle_seals(wearer)
/obj/item/weapon/storage/rig/verb/switch_vision_mode()
/obj/item/weapon/rig/verb/switch_vision_mode()
set name = "Switch Vision Mode"
set desc = "Switches between available vision modes."
@@ -124,7 +124,7 @@
visor.engage()
/obj/item/weapon/storage/rig/verb/alter_voice()
/obj/item/weapon/rig/verb/alter_voice()
set name = "Configure Voice Synthesiser"
set desc = "Toggles or configures your voice synthesizer."
@@ -141,7 +141,7 @@
speech.engage()
/obj/item/weapon/storage/rig/verb/select_module()
/obj/item/weapon/rig/verb/select_module()
set name = "Select Module"
set desc = "Selects a module as your primary system."
@@ -168,7 +168,7 @@
selected_module = module
usr << "<font color='blue'><b>Primary system is now: [selected_module.interface_name].</b></font>"
/obj/item/weapon/storage/rig/verb/toggle_module()
/obj/item/weapon/rig/verb/toggle_module()
set name = "Toggle Module"
set desc = "Toggle a system module."
@@ -199,7 +199,7 @@
usr << "<font color='blue'><b>You attempt to activate \the [module.interface_name].</b></font>"
module.activate()
/obj/item/weapon/storage/rig/verb/engage_module()
/obj/item/weapon/rig/verb/engage_module()
set name = "Engage Module"
set desc = "Engages a system module."

View File

@@ -0,0 +1,51 @@
/datum/wires/rig
random = 1
holder_type = /obj/item/weapon/rig
wire_count = 5
#define RIG_SECURITY 1
#define RIG_AI_OVERRIDE 2
#define RIG_SYSTEM_CONTROL 4
#define RIG_INTERFACE_LOCK 8
#define RIG_INTERFACE_SHOCK 16
/*
* Rig security can be snipped to disable ID access checks on rig.
* Rig AI override can be pulsed to toggle whether or not the AI can take control of the suit.
* System control can be pulsed to toggle some malfunctions.
* Interface lock can be pulsed to toggle whether or not the interface can be accessed.
*/
/datum/wires/rig/UpdateCut(var/index, var/mended)
var/obj/item/weapon/rig/rig = holder
switch(index)
if(RIG_SECURITY)
if(!mended)
rig.req_access = initial(rig.req_access)
rig.req_one_access = initial(rig.req_one_access)
if(RIG_INTERFACE_SHOCK)
rig.electrified = -1
/datum/wires/rig/UpdatePulsed(var/index)
var/obj/item/weapon/rig/rig = holder
switch(index)
if(RIG_SECURITY)
rig.security_check_enabled = !rig.security_check_enabled
if(RIG_AI_OVERRIDE)
rig.ai_override_enabled = !rig.ai_override_enabled
if(RIG_SYSTEM_CONTROL)
rig.malfunctioning += 10
if(rig.malfunction_delay <= 0)
rig.malfunction_delay = 20
if(RIG_INTERFACE_LOCK)
rig.interface_locked = !rig.interface_locked
if(RIG_INTERFACE_SHOCK)
if(rig.electrified != -1)
rig.electrified = 30
/datum/wires/rig/CanUse(var/mob/living/L)
var/obj/item/weapon/rig/rig = holder
if(rig.open)
return 1
return 0

View File

@@ -1,4 +1,7 @@
/obj/item/weapon/storage/rig/combat
/obj/item/clothing/head/helmet/space/rig/combat
light_overlay = "helmet_light_green_dual"
/obj/item/weapon/rig/combat
name = "combat hardsuit control module"
desc = "A sleek and dangerous hardsuit for active combat."
icon_state = "security_rig"
@@ -8,6 +11,8 @@
offline_slowdown = 3
offline_vision_restriction = 1
helm_type = /obj/item/clothing/head/helmet/space/rig/combat
initial_modules = list(
/obj/item/rig_module/mounted,
/obj/item/rig_module/vision/thermal,
@@ -18,7 +23,7 @@
/obj/item/rig_module/chem_dispenser/combat
)
/obj/item/weapon/storage/rig/combat/merc
/obj/item/weapon/rig/combat/merc
name = "crimson hardsuit control module"
desc = "A blood-red hardsuit featuring some fairly illegal technology."
icon_state = "merc_rig"

View File

@@ -1,4 +1,7 @@
/obj/item/weapon/storage/rig/ert
/obj/item/clothing/head/helmet/space/rig/ert
light_overlay = "helmet_light_dual"
/obj/item/weapon/rig/ert
name = "ERT-C hardsuit control module"
desc = "A suit worn by the commander of a NanoTrasen Emergency Response Team. Has blue highlights. Armoured and space ready."
suit_type = "ERT commander"
@@ -6,6 +9,8 @@
siemens_coefficient = 0.6
offline_slowdown = 3
helm_type = /obj/item/clothing/head/helmet/space/rig/ert
req_access = list(access_cent_specops)
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 100)
@@ -21,7 +26,7 @@
/obj/item/rig_module/mounted
)
/obj/item/weapon/storage/rig/ert/engineer
/obj/item/weapon/rig/ert/engineer
name = "ERT-E suit control module"
desc = "A suit worn by the engineering division of a NanoTrasen Emergency Response Team. Has orange highlights. Armoured and space ready."
suit_type = "ERT engineer"
@@ -35,7 +40,7 @@
/obj/item/rig_module/foam_sprayer
)
/obj/item/weapon/storage/rig/ert/medical
/obj/item/weapon/rig/ert/medical
name = "ERT-M suit control module"
desc = "A suit worn by the medical division of a NanoTrasen Emergency Response Team. Has white highlights. Armoured and space ready."
suit_type = "ERT medic"
@@ -48,7 +53,7 @@
/obj/item/rig_module/chem_dispenser/injector
)
/obj/item/weapon/storage/rig/ert/security
/obj/item/weapon/rig/ert/security
name = "ERT-S suit control module"
desc = "A suit worn by the security division of a NanoTrasen Emergency Response Team. Has red highlights. Armoured and space ready."
suit_type = "ERT security"

View File

@@ -1,5 +1,5 @@
// Light rigs are not space-capable, but don't suffer excessive slowdown or sight issues when depowered.
/obj/item/weapon/storage/rig/light
/obj/item/weapon/rig/light
name = "light suit control module"
desc = "A lighter, less armoured rig suit."
icon_state = "ninja_rig"
@@ -28,7 +28,7 @@
/obj/item/clothing/head/helmet/space/rig/light
name = "hood"
/obj/item/weapon/storage/rig/light/hacker
/obj/item/weapon/rig/light/hacker
name = "cybersuit control module"
suit_type = "cyber"
desc = "An advanced powered armour suit with many cyberwarfare enhancements."
@@ -48,7 +48,7 @@
name = "mask"
flags = FPRINT | TABLEPASS | THICKMATERIAL
/obj/item/weapon/storage/rig/light/ninja
/obj/item/weapon/rig/light/ninja
name = "ominous suit control module"
suit_type = "ominous"
desc = "A unique, vaccum-proof suit of nano-enhanced armor designed specifically for Spider Clan assassins."
@@ -76,7 +76,7 @@
..()
/obj/item/weapon/storage/rig/light/stealth
/obj/item/weapon/rig/light/stealth
name = "stealth suit control module"
suit_type = "stealth"
desc = "A highly advanced and expensive suit designed for covert operations."

View File

@@ -1,4 +1,4 @@
/obj/item/weapon/storage/rig/industrial
/obj/item/weapon/rig/industrial
name = "industrial suit control module"
suit_type = "industrial hardsuit"
desc = "A heavy, powerful rig used by construction crews and mining corporations."
@@ -20,7 +20,7 @@
)
//Chief Engineer's rig. This is sort of a halfway point between the old hardsuits (voidsuits) and the rig class.
/obj/item/weapon/storage/rig/ce
/obj/item/weapon/rig/ce
name = "advanced voidsuit control module"
suit_type = "advanced voidsuit"
@@ -44,7 +44,7 @@
boot_type = null
glove_type = null
/obj/item/weapon/storage/rig/hazmat
/obj/item/weapon/rig/hazmat
name = "AMI control module"
suit_type = "hazmat"

View File

@@ -19,12 +19,18 @@
var/obj/machinery/camera/camera
var/list/camera_networks
var/brightness_on
var/on = 0
light_overlay = "helmet_light"
brightness_on = 4
on = 0
/obj/item/clothing/head/helmet/space/attack_self(mob/user)
if(!camera && camera_networks)
if(!icon_action_button)
icon_action_button = "[icon_state]"
camera = new /obj/machinery/camera(src)
camera.network = camera_networks
cameranet.removeCamera(camera)
@@ -32,47 +38,7 @@
user << "\blue User scanned as [camera.c_tag]. Camera activated."
return 1
else if(brightness_on)
if(!isturf(user.loc))
user << "You cannot turn the light on while in this [user.loc]" //To prevent some lighting anomalities.
return
on = !on
icon_state = "rig[on]-[item_color]"
if(on)
user.SetLuminosity(user.luminosity + brightness_on)
else
user.SetLuminosity(user.luminosity - brightness_on)
if(istype(user,/mob/living/carbon/human))
var/mob/living/carbon/human/H = user
H.update_inv_head()
else
return ..(user)
/obj/item/clothing/head/helmet/space/proc/update_light(mob/user)
if(!brightness_on)
return
if(on)
user.SetLuminosity(user.luminosity - brightness_on)
SetLuminosity(brightness_on)
/obj/item/clothing/head/helmet/space/equipped(mob/user)
..()
update_light(user)
/obj/item/clothing/head/helmet/space/pickup(mob/user)
..()
update_light(user)
/obj/item/clothing/head/helmet/space/dropped(mob/user)
..()
update_light(user)
/obj/item/clothing/head/helmet/space/examine()
..()

View File

@@ -9,10 +9,7 @@
siemens_coefficient = 0.6
species_restricted = list("exclude","Unathi","Tajara","Skrell","Vox")
camera_networks = list("NUKE")
/obj/item/clothing/head/helmet/space/void/merc/examine(mob/user)
if(..(user, 1))
user << "This helmet has a built-in camera. It's [camera ? "" : "in"]active."
light_overlay = "helmet_light_green" //todo: species-specific light overlays
/obj/item/clothing/suit/space/void/merc
icon_state = "rig-syndie"

View File

@@ -24,6 +24,7 @@
item_state = "mining_helm"
item_color = "mining"
armor = list(melee = 50, bullet = 5, laser = 20,energy = 5, bomb = 55, bio = 100, rad = 20)
light_overlay = "helmet_light_dual"
/obj/item/clothing/suit/space/void/mining
icon_state = "rig-mining"
@@ -58,6 +59,7 @@
item_color = "sec"
armor = list(melee = 60, bullet = 10, laser = 30, energy = 5, bomb = 45, bio = 100, rad = 10)
siemens_coefficient = 0.7
light_overlay = "helmet_light_dual"
/obj/item/clothing/suit/space/void/security
icon_state = "rig-sec"
@@ -77,6 +79,7 @@
item_color = "atmos"
armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 50)
max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE
light_overlay = "helmet_light_dual"
/obj/item/clothing/suit/space/void/atmos
desc = "A special suit that protects against hazardous, low pressure environments. Has improved thermal protection and minor radiation shielding."

View File

@@ -22,6 +22,8 @@
"Skrell" = 'icons/obj/clothing/species/skrell/hats.dmi',
)
light_overlay = "helmet_light"
/obj/item/clothing/suit/space/void
name = "voidsuit"
icon_state = "void"

View File

@@ -533,19 +533,23 @@
var/suit_icon // Sets suit icon_state and item_state.
var/helmet_color // Sets item_color.
var/uses = 2 // Uses before the kit deletes itself.
var/new_light_overlay
/obj/item/clothing/head/helmet/space/rig/attackby(var/obj/item/O as obj, mob/user as mob)
/obj/item/clothing/head/helmet/space/void/attackby(var/obj/item/O as obj, mob/user as mob)
..()
if(istype(O,/obj/item/device/kit/suit/fluff))
var/obj/item/device/kit/suit/fluff/kit = O
name = "[kit.new_name] hardsuit helmet"
name = "[kit.new_name] suit helmet"
desc = kit.new_helmet_desc
icon_state = kit.helmet_icon
item_state = kit.helmet_icon
item_color = kit.helmet_color
if(kit.new_light_overlay)
light_overlay = kit.new_light_overlay
user << "You set about modifying the helmet into [src]."
playsound(user.loc, 'sound/items/Screwdriver.ogg', 50, 1)
@@ -608,6 +612,7 @@
helmet_icon = "rig0-hazardhardsuit"
suit_icon = "rig-hazardhardsuit"
helmet_color = "hazardhardsuit"
new_light_overlay = "helmet_light_dual"
//////// Meat Hook - Korom Bhararaya - Matthew951 ////////////////////////

View File

@@ -71,8 +71,8 @@
if(P)
stat(null, "Phoron Stored: [P.stored_plasma]/[P.max_plasma]")
if(back && istype(back,/obj/item/weapon/storage/rig))
var/obj/item/weapon/storage/rig/suit = back
if(back && istype(back,/obj/item/weapon/rig))
var/obj/item/weapon/rig/suit = back
var/cell_status = "ERROR"
if(suit.cell) cell_status = "[suit.cell.charge]/[suit.cell.maxcharge]"
stat(null, "Suit charge: [cell_status]")
@@ -681,8 +681,8 @@
if(istype(src.head, /obj/item/clothing/head/welding))
if(!src.head:up)
number += 2
if(istype(back, /obj/item/weapon/storage/rig))
var/obj/item/weapon/storage/rig/O = back
if(istype(back, /obj/item/weapon/rig))
var/obj/item/weapon/rig/O = back
if(O.helmet && O.helmet == head && (O.helmet.body_parts_covered & EYES))
number += 2
if(istype(src.head, /obj/item/clothing/head/helmet/space))

View File

@@ -72,8 +72,8 @@
if(back)
if(istype(back,/obj/item/weapon/tank/jetpack))
thrust = back
else if(istype(back,/obj/item/weapon/storage/rig))
var/obj/item/weapon/storage/rig/rig = back
else if(istype(back,/obj/item/weapon/rig))
var/obj/item/weapon/rig/rig = back
for(var/obj/item/rig_module/maneuvering_jets/module in rig.installed_modules)
thrust = module.jets
break

View File

@@ -424,8 +424,8 @@
if(internal)
var/obj/item/weapon/tank/rig_supply
if(istype(back,/obj/item/weapon/storage/rig))
var/obj/item/weapon/storage/rig/rig = back
if(istype(back,/obj/item/weapon/rig))
var/obj/item/weapon/rig/rig = back
if(!rig.offline && (rig.air_supply && internal == rig.air_supply))
rig_supply = rig.air_supply
@@ -1186,8 +1186,8 @@
//Eyes
//Check rig first because it's two-check and other checks will override it.
if(istype(back,/obj/item/weapon/storage/rig))
var/obj/item/weapon/storage/rig/O = back
if(istype(back,/obj/item/weapon/rig))
var/obj/item/weapon/rig/O = back
if(O.offline && O.offline_vision_restriction == 2 && O.helmet && O.helmet == head && (O.helmet.body_parts_covered & EYES))
blinded = 1
@@ -1369,7 +1369,7 @@
var/tmp/glasses_processed = 0
var/obj/item/weapon/storage/rig/rig = back
var/obj/item/weapon/rig/rig = back
if(istype(rig) && rig.visor)
if(rig.visor.vision && rig.visor.active && rig.visor.vision.glasses)
glasses_processed = 1
@@ -1497,8 +1497,8 @@
client.screen |= global_hud.darkMask
masked = 1
if(!masked && istype(back, /obj/item/weapon/storage/rig))
var/obj/item/weapon/storage/rig/O = back
if(!masked && istype(back, /obj/item/weapon/rig))
var/obj/item/weapon/rig/O = back
// Ugh, why is this done on a case by case basis? Why is there no flag for causing weldervision?
if(O.offline && O.offline_vision_restriction == 1 && O.helmet && O.helmet == head && (O.helmet.body_parts_covered & EYES))
client.screen |= global_hud.darkMask

View File

@@ -204,8 +204,8 @@
/mob/living/carbon/human/GetVoice()
var/voice_sub
if(istype(back,/obj/item/weapon/storage/rig))
var/obj/item/weapon/storage/rig/rig = back
if(istype(back,/obj/item/weapon/rig))
var/obj/item/weapon/rig/rig = back
// todo: fix this shit
if(rig.speech && rig.speech.voice_holder && rig.speech.voice_holder.active && rig.speech.voice_holder.voice)
voice_sub = rig.speech.voice_holder.voice

View File

@@ -5,6 +5,7 @@
icon_key is [species.race_key][g][husk][fat][hulk][skeleton][s_tone]
*/
var/global/list/human_icon_cache = list()
var/global/list/light_overlay_cache = list()
///////////////////////
//UPDATE_ICONS SYSTEM//
@@ -728,6 +729,11 @@ proc/get_damage_icon_part(damage_state, body_part)
bloodsies.color = head.blood_color
standing.overlays += bloodsies
if(istype(head,/obj/item/clothing/head))
var/obj/item/clothing/head/hat = head
if(hat.on && light_overlay_cache["[hat.light_overlay]"])
standing.overlays |= light_overlay_cache["[hat.light_overlay]"]
overlays_standing[HEAD_LAYER] = standing
else
@@ -820,7 +826,7 @@ proc/get_damage_icon_part(damage_state, body_part)
/mob/living/carbon/human/update_inv_back(var/update_icons=1)
if(back)
back.screen_loc = ui_back //TODO
var/obj/item/weapon/storage/rig/rig = back
var/obj/item/weapon/rig/rig = back
if(back.icon_override)
overlays_standing[BACK_LAYER] = image("icon" = back.icon_override, "icon_state" = "[back.icon_state]")
//If this is a rig and a mob_icon is set, it will take species into account in the rig update_icon() proc.

View File

@@ -62,8 +62,8 @@
//looks like this only appears in whisper. Should it be elsewhere as well? Maybe handle_speech_problems?
var/voice_sub
if(istype(back,/obj/item/weapon/storage/rig))
var/obj/item/weapon/storage/rig/rig = back
if(istype(back,/obj/item/weapon/rig))
var/obj/item/weapon/rig/rig = back
// todo: fix this shit
if(rig.speech && rig.speech.voice_holder && rig.speech.voice_holder.active && rig.speech.voice_holder.voice)
voice_sub = rig.speech.voice_holder.voice

View File

@@ -16,19 +16,3 @@
else
layer = MOB_LAYER
src << text("\blue You have stopped hiding.")
// Hardsuit interface proc for AI. Defined here so MMIs can also use it.
/mob/living/proc/hardsuit_interface_ai()
set name = "Open Hardsuit Interface"
set desc = "Open the hardsuit system interface."
set category = "Hardsuit"
var/obj/item/rig_module/module = src.loc
if(!istype(module) || !module.holder)
verbs -= /mob/living/proc/hardsuit_interface_ai
return 0
if(module.holder.check_power_cost(src, 0, 0, 0, 1))
ui_interact(src)

View File

@@ -82,7 +82,7 @@ obj/item/weapon/gun/energy/laser/retro
return 1
var/mob/living/carbon/human/H = loc
if(istype(H) && H.back)
var/obj/item/weapon/storage/rig/suit = H.back
var/obj/item/weapon/rig/suit = H.back
if(istype(suit) && suit.cell && suit.cell.charge >= 250)
suit.cell.use(250)
in_chamber = new /obj/item/projectile/beam/heavylaser(src)

View File

@@ -40,7 +40,7 @@
return 1
var/mob/living/carbon/human/H = loc
if(istype(H) && H.back)
var/obj/item/weapon/storage/rig/suit = H.back
var/obj/item/weapon/rig/suit = H.back
if(istype(suit) && suit.cell && suit.cell.charge >= 250)
suit.cell.use(250)
var/prog_path = text2path(projectile_type)

View File

@@ -90,8 +90,8 @@ proc/GetAnomalySusceptibility(var/mob/living/carbon/human/H)
var/protected = 0
//anomaly suits give best protection, but excavation suits are almost as good
if(istype(H.back,/obj/item/weapon/storage/rig/hazmat))
var/obj/item/weapon/storage/rig/hazmat/rig = H.back
if(istype(H.back,/obj/item/weapon/rig/hazmat))
var/obj/item/weapon/rig/hazmat/rig = H.back
if(rig.suit_is_deployed() && !rig.offline)
protected += 1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 132 KiB

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 920 B

View File

@@ -4714,7 +4714,7 @@
"bMH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bMI" = (/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bMJ" = (/obj/machinery/computer/area_atmos,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bMK" = (/obj/structure/rack,/obj/item/weapon/storage/rig/hazmat,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bMK" = (/obj/structure/rack,/obj/item/weapon/rig/hazmat,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bML" = (/obj/machinery/computer/area_atmos,/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor{icon_state = "bot"},/area/rnd/storage)
"bMM" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "warningcorner"; dir = 2},/area/rnd/storage)
"bMN" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"; tag = "icon-intact-f (SOUTHWEST)"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{icon_state = "dark"},/area/server)
@@ -4855,7 +4855,7 @@
"bPs" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
"bPt" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
"bPu" = (/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/medical/medbay3)
"bPv" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/mask/breath,/obj/item/weapon/storage/rig/ce,/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/heads/chief)
"bPv" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/mask/breath,/obj/item/weapon/rig/ce,/turf/simulated/floor{dir = 8; icon_state = "neutralfull"},/area/crew_quarters/heads/chief)
"bPw" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
"bPx" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
"bPy" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
@@ -8567,7 +8567,7 @@
"diM" = (/obj/item/weapon/inflatable_duck,/turf/unsimulated/beach/sand{tag = "icon-desert"; icon_state = "desert"},/area/centcom/ferry)
"diN" = (/turf/space/transit/east/shuttlespace_ew11,/area/space)
"diO" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "centcom_dock_airlock"; locked = 1; name = "Arrivals Airlock"; req_access_txt = "13"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/evac)
"diP" = (/obj/structure/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/tie/storage/black_vest,/obj/item/clothing/shoes/magboots,/obj/item/clothing/tie/storage/black_vest,/obj/item/weapon/storage/rig/ert/security,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
"diP" = (/obj/structure/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/tie/storage/black_vest,/obj/item/clothing/shoes/magboots,/obj/item/clothing/tie/storage/black_vest,/obj/item/weapon/rig/ert/security,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
"diQ" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "centcom_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access_txt = "13"},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom)
"diR" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "centcom_shuttle"; pixel_x = 0; pixel_y = -25; req_access_txt = "0"; req_one_access_txt = "0"; tag_door = "centcom_shuttle_hatch"},/turf/simulated/shuttle/floor,/area/shuttle/transport1/centcom)
"diS" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "centcom_dock"; name = "docking port controller"; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; req_one_access_txt = "13"; tag_door = "centcom_dock_airlock"},/turf/unsimulated/floor{dir = 6; icon_state = "warning"},/area/centcom/evac)
@@ -9647,7 +9647,7 @@
"dDA" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Brig"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start)
"dDB" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/research_outpost/hallway)
"dDC" = (/obj/machinery/door/window{base_state = "left"; dir = 8; icon_state = "left"; name = "Preparation"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start)
"dDD" = (/obj/structure/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/tie/storage/brown_vest,/obj/item/clothing/shoes/magboots,/obj/item/clothing/tie/storage/brown_vest,/obj/item/weapon/storage/rig/ert/engineer,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
"dDD" = (/obj/structure/rack,/obj/item/clothing/shoes/magboots,/obj/item/weapon/rig/ert/engineer,/obj/item/clothing/tie/storage/brown_vest,/obj/item/clothing/shoes/magboots,/obj/item/clothing/tie/storage/brown_vest,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
"dDE" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/research_outpost/hallway)
"dDF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/research_outpost/hallway)
"dDG" = (/obj/machinery/telecomms/allinone{intercept = 1},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start)
@@ -11102,7 +11102,7 @@
"efz" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plating,/area/maintenance/engi_engine)
"efA" = (/obj/machinery/turretid/stun{ailock = 1; control_area = "\improper Telecoms Foyer"; desc = "A firewall prevents AIs from interacting with this device."; name = "Telecoms Foyer turret control"; pixel_y = 29; req_access = list(61)},/turf/simulated/floor,/area/tcommsat/entrance)
"efB" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/device/analyzer/plant_analyzer,/obj/item/device/healthanalyzer,/obj/item/device/analyzer,/obj/item/device/analyzer,/turf/simulated/floor/plating,/area/storage/tech)
"efC" = (/obj/structure/rack,/obj/item/clothing/shoes/magboots,/obj/item/weapon/storage/rig/ert/engineer,/obj/item/clothing/tie/storage/brown_vest,/obj/item/clothing/shoes/magboots,/obj/item/clothing/tie/storage/brown_vest,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
"efC" = (/obj/structure/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/tie/storage/brown_vest,/obj/item/clothing/shoes/magboots,/obj/item/clothing/tie/storage/brown_vest,/obj/item/weapon/rig/ert/engineer,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
"efD" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/floor/plating,/area/djstation)
"efE" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air{filled = 0.05},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/mine/production)
"efF" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/turf/simulated/floor/plating,/area/djstation)
@@ -11227,7 +11227,7 @@
"ehU" = (/obj/structure/disposalpipe/segment,/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/item/device/radio/intercom{freerange = 1; frequency = 1459; name = "Station Intercom (General)"; pixel_x = -27},/turf/simulated/floor,/area/mine/production)
"ehV" = (/obj/structure/rack,/obj/item/clothing/suit/armor/vest/ert/command,/obj/item/clothing/head/helmet/ert/command,/obj/item/weapon/storage/backpack/ert/commander,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops)
"ehW" = (/obj/structure/table/reinforced,/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp,/obj/item/mecha_parts/mecha_equipment/tool/hydraulic_clamp,/obj/item/mecha_parts/mecha_equipment/tool/passenger,/obj/item/mecha_parts/mecha_equipment/tool/passenger,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
"ehX" = (/obj/structure/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/tie/storage/black_vest,/obj/item/weapon/storage/rig/ert,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
"ehX" = (/obj/structure/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/tie/storage/black_vest,/obj/item/weapon/rig/ert,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
"ehY" = (/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 32},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom)
"ehZ" = (/obj/machinery/door/poddoor{icon_state = "pdoor1"; id = "ASSAULT0"; name = "Launch Bay #0"; p_open = 0},/turf/unsimulated/floor{name = "plating"},/area/centcom)
"eia" = (/obj/machinery/camera{c_tag = "Assault Armor South"; dir = 1; network = list("ERT")},/turf/unsimulated/floor{icon_state = "loadingarea"; dir = 8},/area/centcom)
@@ -11239,7 +11239,7 @@
"eig" = (/obj/machinery/autolathe{desc = "Your typical Autolathe. It appears to have much more options than your regular one, however..."; hacked = 1; name = "Unlocked Autolathe"},/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom)
"eih" = (/obj/machinery/chem_dispenser/meds,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom)
"eii" = (/obj/machinery/chem_master,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom)
"eij" = (/obj/structure/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/tie/storage/black_vest,/obj/item/clothing/shoes/magboots,/obj/item/clothing/tie/storage/black_vest,/obj/item/weapon/storage/rig/ert/medical,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
"eij" = (/obj/structure/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/tie/storage/black_vest,/obj/item/clothing/shoes/magboots,/obj/item/clothing/tie/storage/black_vest,/obj/item/weapon/rig/ert/medical,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
"eik" = (/obj/machinery/porta_turret,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
"eil" = (/obj/structure/rack,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)
"eim" = (/obj/structure/table/reinforced,/obj/item/device/pda/ert,/obj/item/device/pda/ert,/obj/item/device/pda/ert,/obj/item/device/pda/ert,/obj/item/device/pda/ert,/obj/item/device/pda/ert,/obj/item/device/pda/ert,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
@@ -11658,7 +11658,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacIXcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcFYdmwcJEcJEcJEcJEdmCcFYdmDcJEcJEdmLcFYcFYcFYcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcJncIRcJJcJJcKKcKbcKbcKbcKbcKbcKbcKbcKbcKbcKLcJJcJJcKMcKAcKAcKAcKAcKAcJKcKNcKjcJNcIRcJQcJQcJQcIRcKOcKOcKPcKOcKOcKFcKGcKGcIRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqL
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacIXcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIYdpicJDdngcFYdmQdiPdiPdvmcJEcFYcFYdoWcJEcJEcKScFYefJefKcFYdmUdmUdmUdmUdmUdmUdmTcLacLbcIPcJncIRcJJcJJcLccLdcLecLecLecLecLecLecLecLfcJIcJJcJJcJKcLgcLhcLicLjcLkcJKcLlcKjcJOcIRcJQcJQcJQcIRcLmcLmcKjcLmcLmcKFcKGcKGcIRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqL
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJvcJwcJwcJwcJwcJwcJwcJwcJwcJwcJwcJwcJwcJwcJRcJycJwcJwcJwcJzcJRcJScJBcJDdpjcFYcIPcFYcFYcFYcJEcFYdmEcJEcJEcJEcKTcFYcKXcLrcMxdmPdmPdmPdmPdmPdmPdmBcIPcIPcIPcIPcIPcJJcJJcLccLvcLwcJJcLxcLycLzcJJcLwcLvcJIcJJcJJcJKcJKcJKcJKcJKcJKcJKcLlcKjcJOcIRcJQcJQcJQcIRcLAcLAcKjcLAcLAcKFcKGcKGcIRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqLdqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqL
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacIXcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIYcKqcJDdptcFYdpqdprdzOcFYcJEcFYefCdDDcJEcJEcKUcFYcKXdvmcIPcLHcLIcLIcLIcLJcLIcLKcIPcLLcLLcLLcIPcJJcJJcLMcLNcLOcLPcLQcLRcLScLTcLUcLNcLVcJJcJJcIRcLWcLWcLWcLWcLWcIRcIRcKkcIRcIRcIRcKkcIRcIRcKjcKjcKjcKjcKjcKFcKGcKGcIRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqLdqLdqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqL
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacIXcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIPcIYcKqcJDdptcFYdpqdprdzOcFYcJEcFYdDDefCcJEcJEcKUcFYcKXdvmcIPcLHcLIcLIcLIcLJcLIcLKcIPcLLcLLcLLcIPcJJcJJcLMcLNcLOcLPcLQcLRcLScLTcLUcLNcLVcJJcJJcIRcLWcLWcLWcLWcLWcIRcIRcKkcIRcIRcIRcKkcIRcIRcKjcKjcKjcKjcKjcKFcKGcKGcIRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqLdqLdqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqL
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEjcGbcGbcGbcGbcGbcGbcGbcGbcGbcGbcGbcGbcGbdFmcGacGbcGbcGbcHrdFmeeBdFAdvmefLcFYefjcJEefMcFYcLXcFYcFYcFYcLYcFYcFYcFYcKXcLrcLZcMacMacMacMacMacMacMacMbcMacMacMacMbcJJcJJcJJcMccJJcJJcMdcJJcMdcJJcJJcMccJJcJJcJJcMecJQcJQcJQcJQcJQcMecJQcJQcJQcJQcJQcJQcJQcMecLAcLAcLAcLAcLAcKFcKGcKGcIRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqLdqLdqLdqLdqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqL
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefNcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYcFYefPefOdvmehWcFYehVcLtehXcFYcJEcMhcJEcMicJEcMjehYehYcJEcMkcIPcMlcMmcMmcMncMocMpcMqcIPcMrcMrcMrcIPcJJcJJcKKcMscMtcLPcMucJJcMvcLTcMwcMscKLcJJcJJcMecJQcJQcJQcJQcJQcMecJQcJQcJQcJQcJQcJQcJQcMecLAcLAcLAcLAcLAcIRcKkcKkcIRcIRcIRcIRcIRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqLdqLdqLdqLdqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadEjcGbcGbcGbcGbcGbcGbcGbcGbcGbcGbcGbcGbcGbehZcGacGbcGbcGbcHrehZeibeiadvmcLreiccLtcJEcJEeidcJEcMycJEcKXcKXcMzcMzcKXcKXcMkcIPcMAcMAcMAcMBcMCcMBcMDcIPcIPcIPcIPcIPcJJcJJcLccLNcMEcJJcMdcJJcMdcJJcMEcLNcJIcJJcJJcIRcMFcMGcMGcMGcMHcIRcIRcMIcIRcIRcIRcKkcIRcIRcIRcMJcMJcMJcIRcIRcJQcJQcJQcMKcJQcMLcIRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeeJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadqLdqLdqLdqLdqLdqLdqLdqLdqLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa