diff --git a/baystation12.dme b/baystation12.dme index 29bd3ab3ae..ebdca068e8 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -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" diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 7fc5577fe2..eadc657a9c 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -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 diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index fde5fe2c29..4147c8c5d8 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -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" diff --git a/code/game/gamemodes/events/space_ninja.dm b/code/game/gamemodes/events/space_ninja.dm index e76ec9e4ab..97bb3e2404 100644 --- a/code/game/gamemodes/events/space_ninja.dm +++ b/code/game/gamemodes/events/space_ninja.dm @@ -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) diff --git a/code/game/gamemodes/newobjective.dm b/code/game/gamemodes/newobjective.dm index c5f8a357c3..949e6bfc77 100644 --- a/code/game/gamemodes/newobjective.dm +++ b/code/game/gamemodes/newobjective.dm @@ -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 diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index a327e3b3aa..452fd347d8 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -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 diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index b1c2ccd218..afd33fdf08 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -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, diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm index bc8448eb6e..7b41c1b18b 100644 --- a/code/game/objects/items/weapons/tanks/jetpack.dm +++ b/code/game/objects/items/weapons/tanks/jetpack.dm @@ -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." diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 38da9f04dd..dc242cd23f 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -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 diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index a7c9d2bce6..3fc78b871a 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -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" @@ -61,5 +36,4 @@ /obj/item/clothing/head/hardhat/dblue icon_state = "hardhat0_dblue" item_state = "hardhat0_dblue" - item_color = "dblue" - + item_color = "dblue" \ No newline at end of file diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index af0f5262a3..ba72b92754 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -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 */ diff --git a/code/modules/clothing/spacesuits/rig/modules/computer.dm b/code/modules/clothing/spacesuits/rig/modules/computer.dm index fbcf3b9bab..9dacf5893b 100644 --- a/code/modules/clothing/spacesuits/rig/modules/computer.dm +++ b/code/modules/clothing/spacesuits/rig/modules/computer.dm @@ -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 << "There is no active AI within \the [ai]." else diff --git a/code/modules/clothing/spacesuits/rig/modules/modules.dm b/code/modules/clothing/spacesuits/rig/modules/modules.dm index 132f265745..1da55c57b7 100644 --- a/code/modules/clothing/spacesuits/rig/modules/modules.dm +++ b/code/modules/clothing/spacesuits/rig/modules/modules.dm @@ -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 diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm index 938671cf44..6b3513de1b 100644 --- a/code/modules/clothing/spacesuits/rig/modules/utility.dm +++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm @@ -205,6 +205,7 @@ /obj/item/rig_module/chem_dispenser/combat + /obj/item/rig_module/chem_dispenser/injector name = "mounted chemical injector" diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index a055f527f1..07339a9755 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -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 ? "offline" : "online"]." -/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 \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/rig/rig_attackby.dm b/code/modules/clothing/spacesuits/rig/rig_attackby.dm index 1502aa7b45..a954e9af1e 100644 --- a/code/modules/clothing/spacesuits/rig/rig_attackby.dm +++ b/code/modules/clothing/spacesuits/rig/rig_attackby.dm @@ -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 << "It looks like the locking system has been shorted out." return @@ -17,7 +23,7 @@ req_access = null req_one_access = null locked = 0 - emagged = 1 + subverted = 1 user << "You short out the access protocol for the suit." 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 @@ -166,4 +180,14 @@ for(var/obj/item/rig_module/module in installed_modules) 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 ..() \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/rig/rig_pieces.dm b/code/modules/clothing/spacesuits/rig/rig_pieces.dm index 65a7e3a231..0251a625eb 100644 --- a/code/modules/clothing/spacesuits/rig/rig_pieces.dm +++ b/code/modules/clothing/spacesuits/rig/rig_pieces.dm @@ -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 diff --git a/code/modules/clothing/spacesuits/rig/rig_verbs.dm b/code/modules/clothing/spacesuits/rig/rig_verbs.dm index e898abe7d1..3e3440cfc9 100644 --- a/code/modules/clothing/spacesuits/rig/rig_verbs.dm +++ b/code/modules/clothing/spacesuits/rig/rig_verbs.dm @@ -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 << "Primary system is now: [selected_module.interface_name]." -/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 << "You attempt to activate \the [module.interface_name]." 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." diff --git a/code/modules/clothing/spacesuits/rig/rig_wiring.dm b/code/modules/clothing/spacesuits/rig/rig_wiring.dm new file mode 100644 index 0000000000..aeccc068c3 --- /dev/null +++ b/code/modules/clothing/spacesuits/rig/rig_wiring.dm @@ -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 \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/rig/suits/combat.dm b/code/modules/clothing/spacesuits/rig/suits/combat.dm index 45741dbed5..0ed811e4b4 100644 --- a/code/modules/clothing/spacesuits/rig/suits/combat.dm +++ b/code/modules/clothing/spacesuits/rig/suits/combat.dm @@ -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" diff --git a/code/modules/clothing/spacesuits/rig/suits/ert.dm b/code/modules/clothing/spacesuits/rig/suits/ert.dm index 347ca5dea1..02e59490d6 100644 --- a/code/modules/clothing/spacesuits/rig/suits/ert.dm +++ b/code/modules/clothing/spacesuits/rig/suits/ert.dm @@ -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" diff --git a/code/modules/clothing/spacesuits/rig/suits/light.dm b/code/modules/clothing/spacesuits/rig/suits/light.dm index cfed2951a4..b94d1701e1 100644 --- a/code/modules/clothing/spacesuits/rig/suits/light.dm +++ b/code/modules/clothing/spacesuits/rig/suits/light.dm @@ -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." diff --git a/code/modules/clothing/spacesuits/rig/suits/station.dm b/code/modules/clothing/spacesuits/rig/suits/station.dm index f1b4732f0c..e524afbddf 100644 --- a/code/modules/clothing/spacesuits/rig/suits/station.dm +++ b/code/modules/clothing/spacesuits/rig/suits/station.dm @@ -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" diff --git a/code/modules/clothing/spacesuits/spacesuits.dm b/code/modules/clothing/spacesuits/spacesuits.dm index b54104872b..d3b354fe52 100644 --- a/code/modules/clothing/spacesuits/spacesuits.dm +++ b/code/modules/clothing/spacesuits/spacesuits.dm @@ -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() ..() diff --git a/code/modules/clothing/spacesuits/void/merc.dm b/code/modules/clothing/spacesuits/void/merc.dm index 811fbab28a..849b4761ad 100644 --- a/code/modules/clothing/spacesuits/void/merc.dm +++ b/code/modules/clothing/spacesuits/void/merc.dm @@ -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" diff --git a/code/modules/clothing/spacesuits/void/station.dm b/code/modules/clothing/spacesuits/void/station.dm index dd4094e7ee..f4ef7cb8f8 100644 --- a/code/modules/clothing/spacesuits/void/station.dm +++ b/code/modules/clothing/spacesuits/void/station.dm @@ -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." diff --git a/code/modules/clothing/spacesuits/void/void.dm b/code/modules/clothing/spacesuits/void/void.dm index 8da38caa92..558b719bea 100644 --- a/code/modules/clothing/spacesuits/void/void.dm +++ b/code/modules/clothing/spacesuits/void/void.dm @@ -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" diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index 32af71292b..76a2e97dd2 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -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 //////////////////////// diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index bd9433310d..068eef1cac 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -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)) diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 88cedbe623..8b1f467fde 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -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 diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 1c795ec349..c9c8733a97 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -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 diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index b386fb8370..503e03365a 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -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 diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 02e31f096e..de7f86eb8a 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -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. diff --git a/code/modules/mob/living/carbon/human/whisper.dm b/code/modules/mob/living/carbon/human/whisper.dm index d17e3e6f20..f456f0eba2 100644 --- a/code/modules/mob/living/carbon/human/whisper.dm +++ b/code/modules/mob/living/carbon/human/whisper.dm @@ -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 diff --git a/code/modules/mob/living/living_powers.dm b/code/modules/mob/living/living_powers.dm index 4d388136be..d2a8e35320 100644 --- a/code/modules/mob/living/living_powers.dm +++ b/code/modules/mob/living/living_powers.dm @@ -15,20 +15,4 @@ src << text("\blue You are now hiding.") 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) \ No newline at end of file + src << text("\blue You have stopped hiding.") \ No newline at end of file diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index a7272f7097..9ddfa5c9ff 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -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) diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm index 454e4c0348..9b1203c649 100644 --- a/code/modules/projectiles/guns/energy/nuclear.dm +++ b/code/modules/projectiles/guns/energy/nuclear.dm @@ -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) diff --git a/code/modules/research/xenoarchaeology/artifact/effect.dm b/code/modules/research/xenoarchaeology/artifact/effect.dm index 4da22c0a8d..23bb649ac7 100644 --- a/code/modules/research/xenoarchaeology/artifact/effect.dm +++ b/code/modules/research/xenoarchaeology/artifact/effect.dm @@ -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 diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index 87bde25c5c..bebdca6d5e 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/light_overlays.dmi b/icons/mob/light_overlays.dmi new file mode 100644 index 0000000000..9f1232ff95 Binary files /dev/null and b/icons/mob/light_overlays.dmi differ diff --git a/icons/mob/species/skrell/helmet.dmi b/icons/mob/species/skrell/helmet.dmi index eb65bda8c0..3d24f5f335 100644 Binary files a/icons/mob/species/skrell/helmet.dmi and b/icons/mob/species/skrell/helmet.dmi differ diff --git a/icons/mob/species/tajaran/helmet.dmi b/icons/mob/species/tajaran/helmet.dmi index 81a64acdf4..0851a4576d 100644 Binary files a/icons/mob/species/tajaran/helmet.dmi and b/icons/mob/species/tajaran/helmet.dmi differ diff --git a/icons/mob/species/unathi/helmet.dmi b/icons/mob/species/unathi/helmet.dmi index 0f04946724..975a1a5786 100644 Binary files a/icons/mob/species/unathi/helmet.dmi and b/icons/mob/species/unathi/helmet.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index eceb56a0d6..ed91381774 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/light_overlays.dmi b/icons/obj/light_overlays.dmi new file mode 100644 index 0000000000..c7bb310ce9 Binary files /dev/null and b/icons/obj/light_overlays.dmi differ diff --git a/maps/tgstation2.dmm b/maps/tgstation2.dmm index a90c30dfb5..eb55cb4538 100644 --- a/maps/tgstation2.dmm +++ b/maps/tgstation2.dmm @@ -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